soustack 0.2.3 → 0.3.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +100 -7
- package/dist/cli/index.js +738 -793
- package/dist/cli/index.js.map +1 -1
- package/dist/index.d.mts +117 -19
- package/dist/index.d.ts +117 -19
- package/dist/index.js +1264 -801
- package/dist/index.js.map +1 -1
- package/dist/index.mjs +1260 -802
- package/dist/index.mjs.map +1 -1
- package/dist/scrape.d.mts +36 -10
- package/dist/scrape.d.ts +36 -10
- package/dist/scrape.js +105 -3
- package/dist/scrape.js.map +1 -1
- package/dist/scrape.mjs +105 -3
- package/dist/scrape.mjs.map +1 -1
- package/package.json +7 -4
- package/src/profiles/base.schema.json +2 -2
- package/src/profiles/cookable.schema.json +4 -4
- package/src/profiles/illustrated.schema.json +4 -4
- package/src/profiles/quantified.schema.json +4 -4
- package/src/profiles/scalable.schema.json +6 -6
- package/src/profiles/schedulable.schema.json +4 -4
- package/src/schema.json +15 -3
- package/src/soustack.schema.json +15 -3
package/dist/index.mjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/parsers/duration.ts","../src/parser.ts","../src/schema.json","../src/soustack.schema.json","../src/profiles/base.schema.json","../src/profiles/cookable.schema.json","../src/profiles/quantified.schema.json","../src/profiles/illustrated.schema.json","../src/profiles/schedulable.schema.json","../src/validator.ts","../src/converters/yield.ts","../src/utils/image.ts","../src/fromSchemaOrg.ts","../src/converters/toSchemaOrg.ts","../src/scraper/extractors/utils.ts","../src/scraper/extractors/browser.ts","../src/scraper/browser.ts","../src/specVersion.ts"],"names":["_a","_b","convertIngredients","value","convertInstructions","trimmed","convertTime","result"],"mappings":";;;;AAAA,IAAM,kBAAA,GACJ,gGAAA;AAEF,IAAM,kBAAkB,CAAA,GAAI,EAAA;AAE5B,SAAS,eAAe,KAAA,EAAiC;AACvD,EAAA,OAAO,OAAO,KAAA,KAAU,QAAA,IAAY,MAAA,CAAO,SAAS,KAAK,CAAA;AAC3D;AAIO,SAAS,cAAc,GAAA,EAAwD;AACpF,EAAA,IAAI,OAAO,GAAA,KAAQ,QAAA,IAAY,MAAA,CAAO,QAAA,CAAS,GAAG,CAAA,EAAG;AACnD,IAAA,OAAO,GAAA;AAAA,EACT;AAEA,EAAA,IAAI,CAAC,GAAA,IAAO,OAAO,GAAA,KAAQ,UAAU,OAAO,IAAA;AAE5C,EAAA,MAAM,OAAA,GAAU,IAAI,IAAA,EAAK;AACzB,EAAA,IAAI,CAAC,SAAS,OAAO,IAAA;AAErB,EAAA,MAAM,KAAA,GAAQ,OAAA,CAAQ,KAAA,CAAM,kBAAkB,CAAA;AAC9C,EAAA,IAAI,CAAC,OAAO,OAAO,IAAA;AAEnB,EAAA,MAAM,GAAG,OAAA,EAAS,QAAA,EAAU,UAAA,EAAY,UAAU,CAAA,GAAI,KAAA;AAEtD,EAAA,IAAI,CAAC,OAAA,IAAW,CAAC,YAAY,CAAC,UAAA,IAAc,CAAC,UAAA,EAAY;AACvD,IAAA,OAAO,IAAA;AAAA,EACT;AAEA,EAAA,IAAI,KAAA,GAAQ,CAAA;AACZ,EAAA,IAAI,OAAA,EAAS,KAAA,IAAS,UAAA,CAAW,OAAO,IAAI,EAAA,GAAK,EAAA;AACjD,EAAA,IAAI,QAAA,EAAU,KAAA,IAAS,UAAA,CAAW,QAAQ,CAAA,GAAI,EAAA;AAC9C,EAAA,IAAI,UAAA,EAAY,KAAA,IAAS,UAAA,CAAW,UAAU,CAAA;AAC9C,EAAA,IAAI,YAAY,KAAA,IAAS,IAAA,CAAK,KAAK,UAAA,CAAW,UAAU,IAAI,EAAE,CAAA;AAE9D,EAAA,OAAO,IAAA,CAAK,MAAM,KAAK,CAAA;AACzB;AAIO,SAAS,eAAe,OAAA,EAA4C;AACzE,EAAA,IAAI,CAAC,cAAA,CAAe,OAAO,CAAA,IAAK,WAAW,CAAA,EAAG;AAC5C,IAAA,OAAO,MAAA;AAAA,EACT;AAEA,EAAA,MAAM,OAAA,GAAU,IAAA,CAAK,KAAA,CAAM,OAAO,CAAA;AAClC,EAAA,MAAM,IAAA,GAAO,IAAA,CAAK,KAAA,CAAM,OAAA,IAAW,KAAK,EAAA,CAAG,CAAA;AAC3C,EAAA,MAAM,SAAA,GAAY,WAAW,EAAA,GAAK,EAAA,CAAA;AAClC,EAAA,MAAM,KAAA,GAAQ,IAAA,CAAK,KAAA,CAAM,SAAA,GAAY,EAAE,CAAA;AACvC,EAAA,MAAM,OAAO,SAAA,GAAY,EAAA;AAEzB,EAAA,IAAI,MAAA,GAAS,GAAA;AAEb,EAAA,IAAI,OAAO,CAAA,EAAG;AACZ,IAAA,MAAA,IAAU,GAAG,IAAI,CAAA,CAAA,CAAA;AAAA,EACnB;AAEA,EAAA,IAAI,KAAA,GAAQ,CAAA,IAAK,IAAA,GAAO,CAAA,EAAG;AACzB,IAAA,MAAA,IAAU,GAAA;AACV,IAAA,IAAI,QAAQ,CAAA,EAAG;AACb,MAAA,MAAA,IAAU,GAAG,KAAK,CAAA,CAAA,CAAA;AAAA,IACpB;AACA,IAAA,IAAI,OAAO,CAAA,EAAG;AACZ,MAAA,MAAA,IAAU,GAAG,IAAI,CAAA,CAAA,CAAA;AAAA,IACnB;AAAA,EACF;AAEA,EAAA,IAAI,WAAW,GAAA,EAAK;AAClB,IAAA,OAAO,MAAA;AAAA,EACT;AAEA,EAAA,OAAO,MAAA;AACT;AAIO,SAAS,mBAAmB,IAAA,EAAgD;AACjF,EAAA,IAAI,CAAC,IAAA,IAAQ,OAAO,IAAA,KAAS,UAAU,OAAO,IAAA;AAE9C,EAAA,MAAM,UAAA,GAAa,IAAA,CAAK,WAAA,EAAY,CAAE,IAAA,EAAK;AAC3C,EAAA,IAAI,CAAC,YAAY,OAAO,IAAA;AAExB,EAAA,IAAI,eAAe,WAAA,EAAa;AAC9B,IAAA,OAAO,eAAA;AAAA,EACT;AAEA,EAAA,IAAI,KAAA,GAAQ,CAAA;AAEZ,EAAA,MAAM,SAAA,GAAY,2CAAA;AAClB,EAAA,IAAI,SAAA;AACJ,EAAA,OAAA,CAAQ,SAAA,GAAY,SAAA,CAAU,IAAA,CAAK,UAAU,OAAO,IAAA,EAAM;AACxD,IAAA,KAAA,IAAS,UAAA,CAAW,SAAA,CAAU,CAAC,CAAC,CAAA,GAAI,EAAA;AAAA,EACtC;AAEA,EAAA,MAAM,WAAA,GAAc,+CAAA;AACpB,EAAA,IAAI,WAAA;AACJ,EAAA,OAAA,CAAQ,WAAA,GAAc,WAAA,CAAY,IAAA,CAAK,UAAU,OAAO,IAAA,EAAM;AAC5D,IAAA,KAAA,IAAS,UAAA,CAAW,WAAA,CAAY,CAAC,CAAC,CAAA;AAAA,EACpC;AAEA,EAAA,IAAI,SAAS,CAAA,EAAG;AACd,IAAA,OAAO,IAAA;AAAA,EACT;AAEA,EAAA,OAAO,IAAA,CAAK,MAAM,KAAK,CAAA;AACzB;AAIO,SAAS,mBAAmB,KAAA,EAAiD;AAClF,EAAA,MAAM,GAAA,GAAM,cAAc,KAAK,CAAA;AAC/B,EAAA,IAAI,QAAQ,IAAA,EAAM;AAChB,IAAA,OAAO,GAAA;AAAA,EACT;AACA,EAAA,OAAO,mBAAmB,KAAK,CAAA;AACjC;;;AC/FO,SAAS,WAAA,CAAY,MAAA,EAAgB,OAAA,GAA8B,EAAC,EAAW;AACpF,EAAA,MAAM,UAAA,GAAa,iBAAA,CAAkB,MAAA,EAAQ,OAAO,CAAA;AACpD,EAAA,MAAM,MAAA,GAAiB,UAAU,MAAM,CAAA;AAEvC,EAAA,iBAAA,CAAkB,MAAA,EAAQ,SAAS,UAAU,CAAA;AAE7C,EAAA,MAAM,WAAA,GAAc,4BAAA,CAA6B,MAAA,CAAO,WAAA,IAAe,EAAE,CAAA;AACzE,EAAA,MAAM,aAAA,uBAAoB,GAAA,EAAoB;AAC9C,EAAA,MAAM,qBAAmC,EAAC;AAE1C,EAAA,kBAAA,CAAmB,MAAA,CAAO,WAAA,IAAe,EAAC,EAAG,kBAAkB,CAAA;AAE/D,EAAA,kBAAA,CACG,OAAO,CAAA,GAAA,KAAI;AAlChB,IAAA,IAAAA,GAAAA;AAkCoB,IAAA,OAAA,CAAA,CAAA,CAAAA,MAAA,GAAA,CAAI,OAAA,KAAJ,IAAA,GAAA,MAAA,GAAAA,GAAAA,CAAa,SAAQ,QAAA,MAAc,mBAAA;AAAA,EAAA,CAAmB,CAAA,CACrE,QAAQ,CAAA,GAAA,KAAO;AACd,IAAA,MAAM,GAAA,GAAM,iBAAiB,GAAG,CAAA;AAChC,IAAA,aAAA,CAAc,GAAA,CAAI,GAAA,EAAK,8BAAA,CAA+B,GAAA,EAAK,UAAU,CAAC,CAAA;AAAA,EACxE,CAAC,CAAA;AAEH,EAAA,kBAAA,CACG,OAAO,CAAA,GAAA,KAAI;AAzChB,IAAA,IAAAA,GAAAA;AAyCmB,IAAA,OAAA,CAAA,CAAAA,GAAAA,GAAA,GAAA,CAAI,OAAA,KAAJ,IAAA,GAAA,MAAA,GAAAA,IAAa,IAAA,MAAS,mBAAA;AAAA,EAAA,CAAmB,CAAA,CACvD,QAAQ,CAAA,GAAA,KAAO;AA1CpB,IAAA,IAAAA,GAAAA,EAAAC,GAAAA;AA2CM,IAAA,MAAM,GAAA,GAAM,iBAAiB,GAAG,CAAA;AAChC,IAAA,MAAM,UAAU,GAAA,CAAI,OAAA;AAEpB,IAAA,IAAI,EAAC,mCAAS,WAAA,CAAA,EAAa;AACzB,MAAA,MAAM,IAAI,KAAA,CAAM,CAAA,+BAAA,EAAkC,GAAG,CAAA,0BAAA,CAA4B,CAAA;AAAA,IACnF;AAEA,IAAA,MAAM,eAAA,GAAkB,aAAA,CAAc,GAAA,CAAI,OAAA,CAAQ,WAAW,CAAA;AAC7D,IAAA,IAAI,oBAAoB,MAAA,EAAW;AACjC,MAAA,MAAM,IAAI,KAAA,CAAM,CAAA,sBAAA,EAAyB,QAAQ,WAAW,CAAA,yCAAA,EAA4C,GAAG,CAAA,CAAA,CAAG,CAAA;AAAA,IAChH;AAEA,IAAA,MAAM,eAAaD,GAAAA,GAAA,GAAA,CAAI,QAAA,KAAJ,IAAA,GAAA,MAAA,GAAAA,IAAc,MAAA,KAAU,CAAA;AAC3C,IAAA,MAAM,aAAA,GAAgB,WAAA,CAAY,GAAA,CAAI,OAAA,CAAQ,WAAW,CAAA;AACzD,IAAA,MAAM,MAAA,GAAA,CAASC,MAAA,OAAA,CAAQ,MAAA,KAAR,OAAAA,GAAAA,GAAmB,aAAA,GAAgB,aAAa,aAAA,GAAgB,MAAA;AAC/E,IAAA,IAAI,WAAW,MAAA,EAAW;AACxB,MAAA,MAAM,IAAI,KAAA,CAAM,CAAA,8DAAA,EAAiE,GAAG,CAAA,CAAA,CAAG,CAAA;AAAA,IACzF;AAEA,IAAA,aAAA,CAAc,GAAA,CAAI,GAAA,EAAK,eAAA,GAAkB,MAAM,CAAA;AAAA,EACjD,CAAC,CAAA;AAEH,EAAA,kBAAA,CAAmB,QAAQ,CAAA,GAAA,KAAO;AAChC,IAAA,MAAM,GAAA,GAAM,iBAAiB,GAAG,CAAA;AAChC,IAAA,MAAM,MAAA,GAAS,aAAA,CAAc,GAAA,CAAI,GAAG,CAAA;AACpC,IAAA,IAAI,WAAW,MAAA,EAAW;AAE1B,IAAA,IAAI,CAAC,IAAI,QAAA,EAAU;AACjB,MAAA,GAAA,CAAI,QAAA,GAAW,EAAE,MAAA,EAAQ,IAAA,EAAM,IAAA,EAAK;AAAA,IACtC,CAAA,MAAO;AACL,MAAA,GAAA,CAAI,SAAS,MAAA,GAAS,MAAA;AAAA,IACxB;AAAA,EACF,CAAC,CAAA;AAED,EAAA,qBAAA,CAAsB,MAAA,CAAO,YAAA,IAAgB,EAAC,EAAG,UAAU,CAAA;AAE3D,EAAA,OAAO,MAAA;AACT;AAIA,SAAS,iBAAA,CAAkB,QAAgB,OAAA,EAAqC;AApFhF,EAAA,IAAAD,GAAAA,EAAAC,GAAAA;AAqFE,EAAA,IAAI,OAAA,CAAQ,UAAA,IAAc,OAAA,CAAQ,UAAA,GAAa,CAAA,EAAG;AAChD,IAAA,OAAO,OAAA,CAAQ,UAAA;AAAA,EACjB;AAEA,EAAA,IAAA,CAAID,GAAAA,GAAA,OAAA,CAAQ,WAAA,KAAR,IAAA,GAAA,MAAA,GAAAA,IAAqB,MAAA,EAAQ;AAC/B,IAAA,MAAM,SAAOC,GAAAA,GAAA,MAAA,CAAO,KAAA,KAAP,IAAA,GAAA,MAAA,GAAAA,IAAc,MAAA,KAAU,CAAA;AACrC,IAAA,OAAO,OAAA,CAAQ,YAAY,MAAA,GAAS,IAAA;AAAA,EACtC;AAEA,EAAA,OAAO,CAAA;AACT;AAEA,SAAS,iBAAA,CAAkB,MAAA,EAAgB,OAAA,EAA6B,UAAA,EAAoB;AAjG5F,EAAA,IAAAD,KAAAC,GAAAA,EAAA,EAAA,EAAA,EAAA,EAAA,EAAA,EAAA,EAAA,EAAA,EAAA;AAkGE,EAAA,MAAM,UAAA,GAAA,CAAaA,OAAAD,GAAAA,GAAA,MAAA,CAAO,UAAP,IAAA,GAAA,MAAA,GAAAA,GAAAA,CAAc,MAAA,KAAd,IAAA,GAAAC,GAAAA,GAAwB,CAAA;AAC3C,EAAA,MAAM,gBAAe,EAAA,GAAA,CAAA,EAAA,GAAA,OAAA,CAAQ,WAAA,KAAR,IAAA,GAAA,MAAA,GAAA,EAAA,CAAqB,MAAA,KAArB,YAA+B,UAAA,GAAa,UAAA;AACjE,EAAA,MAAM,IAAA,GAAA,CAAO,mBAAQ,WAAA,KAAR,IAAA,GAAA,MAAA,GAAA,EAAA,CAAqB,SAArB,IAAA,GAAA,EAAA,GAAA,CAA6B,EAAA,GAAA,MAAA,CAAO,UAAP,IAAA,GAAA,MAAA,GAAA,EAAA,CAAc,IAAA;AAExD,EAAA,IAAI,CAAC,MAAA,CAAO,KAAA,IAAS,CAAC,QAAQ,WAAA,EAAa;AAE3C,EAAA,MAAA,CAAO,KAAA,GAAQ;AAAA,IACb,MAAA,EAAQ,YAAA;AAAA,IACR,MAAM,IAAA,IAAA,IAAA,GAAA,IAAA,GAAQ;AAAA,GAChB;AACF;AAEA,SAAS,iBAAiB,GAAA,EAAyB;AACjD,EAAA,OAAO,GAAA,CAAI,MAAM,GAAA,CAAI,IAAA;AACvB;AAEA,SAAS,8BAAA,CAA+B,KAAiB,UAAA,EAA4B;AAlHrF,EAAA,IAAAD,KAAAC,GAAAA,EAAA,EAAA,EAAA,EAAA,EAAA,EAAA,EAAA,EAAA;AAmHE,EAAA,MAAM,eAAaD,GAAAA,GAAA,GAAA,CAAI,QAAA,KAAJ,IAAA,GAAA,MAAA,GAAAA,IAAc,MAAA,KAAU,CAAA;AAC3C,EAAA,MAAM,SAAOC,GAAAA,GAAA,GAAA,CAAI,OAAA,KAAJ,IAAA,GAAA,MAAA,GAAAA,IAAa,IAAA,KAAQ,QAAA;AAElC,EAAA,QAAQ,IAAA;AAAM,IACZ,KAAK,OAAA;AACH,MAAA,OAAO,UAAA;AAAA,IACT,KAAK,UAAA,EAAY;AACf,MAAA,MAAM,SAAS,UAAA,GAAa,UAAA;AAC5B,MAAA,MAAM,IAAA,GAAA,CAAQ,EAAA,GAAA,CAAA,EAAA,GAAA,GAAA,CAAI,OAAA,KAAJ,IAAA,GAAA,MAAA,GAAA,EAAA,CAAqB,YAArB,IAAA,GAAA,EAAA,GAAgC,CAAA;AAC9C,MAAA,MAAM,OAAA,GAAU,IAAA,CAAK,KAAA,CAAM,MAAA,GAAS,IAAI,CAAA,GAAI,IAAA;AAC5C,MAAA,OAAO,IAAA,CAAK,MAAM,OAAO,CAAA;AAAA,IAC3B;AAAA,IACA,KAAK,cAAA,EAAgB;AACnB,MAAA,MAAM,MAAA,GAAA,CAAU,EAAA,GAAA,CAAA,EAAA,GAAA,GAAA,CAAI,OAAA,KAAJ,IAAA,GAAA,MAAA,GAAA,EAAA,CAAqB,WAArB,IAAA,GAAA,EAAA,GAA+B,CAAA;AAC/C,MAAA,OAAO,aAAa,UAAA,GAAa,MAAA;AAAA,IACnC;AAAA,IACA;AACE,MAAA,OAAO,UAAA,GAAa,UAAA;AAAA;AAE1B;AAEA,SAAS,kBAAA,CAAmB,OAAyB,MAAA,EAAsB;AACzE,EAAA,KAAA,CAAM,QAAQ,CAAA,IAAA,KAAQ;AACpB,IAAA,IAAI,OAAO,SAAS,QAAA,EAAU;AAC9B,IAAA,IAAI,gBAAgB,IAAA,EAAM;AACxB,MAAA,kBAAA,CAAmB,IAAA,CAAK,OAAO,MAAM,CAAA;AAAA,IACvC,CAAA,MAAO;AACL,MAAA,MAAA,CAAO,KAAK,IAAI,CAAA;AAAA,IAClB;AAAA,EACF,CAAC,CAAA;AACH;AAEA,SAAS,4BAAA,CAA6B,KAAA,EAAyB,GAAA,mBAAM,IAAI,KAAoB,EAAG;AAC9F,EAAA,KAAA,CAAM,QAAQ,CAAA,IAAA,KAAQ;AApJxB,IAAA,IAAAD,GAAAA,EAAAC,GAAAA;AAqJI,IAAA,IAAI,OAAO,SAAS,QAAA,EAAU;AAC9B,IAAA,IAAI,gBAAgB,IAAA,EAAM;AACxB,MAAA,4BAAA,CAA6B,IAAA,CAAK,OAAO,GAAG,CAAA;AAAA,IAC9C,CAAA,MAAO;AACL,MAAA,GAAA,CAAI,GAAA,CAAI,gBAAA,CAAiB,IAAI,CAAA,EAAA,CAAGA,GAAAA,GAAAA,CAAAD,GAAAA,GAAA,IAAA,CAAK,QAAA,KAAL,IAAA,GAAA,MAAA,GAAAA,GAAAA,CAAe,MAAA,KAAf,IAAA,GAAAC,MAAyB,CAAC,CAAA;AAAA,IAC5D;AAAA,EACF,CAAC,CAAA;AACD,EAAA,OAAO,GAAA;AACT;AAEA,SAAS,qBAAA,CAAsB,OAA0B,UAAA,EAAoB;AAC3E,EAAA,KAAA,CAAM,QAAQ,CAAA,IAAA,KAAQ;AACpB,IAAA,IAAI,OAAO,SAAS,QAAA,EAAU;AAE9B,IAAA,IAAI,gBAAgB,IAAA,EAAM;AACxB,MAAA,qBAAA,CAAsB,IAAA,CAAK,OAAO,UAAU,CAAA;AAC5C,MAAA;AAAA,IACF;AAEA,IAAA,MAAM,SAAS,IAAA,CAAK,MAAA;AACpB,IAAA,IAAI,CAAC,MAAA,EAAQ;AAEb,IAAA,MAAM,YAAA,GAAe,iBAAA,CAAkB,MAAA,CAAO,QAAQ,CAAA;AACtD,IAAA,MAAM,WAAA,GAAc,OAAO,OAAA,IAAW,OAAA;AACtC,IAAA,IAAI,WAAA,GAAc,YAAA;AAElB,IAAA,IAAI,gBAAgB,QAAA,EAAU;AAC5B,MAAA,WAAA,GAAc,YAAA,GAAe,UAAA;AAAA,IAC/B,CAAA,MAAA,IAAW,gBAAgB,MAAA,EAAQ;AACjC,MAAA,WAAA,GAAc,YAAA,GAAe,IAAA,CAAK,IAAA,CAAK,UAAU,CAAA;AAAA,IACnD;AAEA,IAAA,MAAA,CAAO,QAAA,GAAW,IAAA,CAAK,IAAA,CAAK,WAAW,CAAA;AAAA,EACzC,CAAC,CAAA;AACH;AAEA,SAAS,UAAa,KAAA,EAAa;AACjC,EAAA,OAAO,IAAA,CAAK,KAAA,CAAM,IAAA,CAAK,SAAA,CAAU,KAAK,CAAC,CAAA;AACzC;AAEA,SAAS,kBAAkB,QAAA,EAAoC;AAC7D,EAAA,IAAI,OAAO,QAAA,KAAa,QAAA,IAAY,MAAA,CAAO,QAAA,CAAS,QAAQ,CAAA,EAAG;AAC7D,IAAA,OAAO,QAAA;AAAA,EACT;AAEA,EAAA,IAAI,OAAO,aAAa,QAAA,IAAY,QAAA,CAAS,MAAK,CAAE,UAAA,CAAW,GAAG,CAAA,EAAG;AACnE,IAAA,MAAM,MAAA,GAAS,aAAA,CAAc,QAAA,CAAS,IAAA,EAAM,CAAA;AAC5C,IAAA,IAAI,WAAW,IAAA,EAAM;AACnB,MAAA,OAAO,MAAA;AAAA,IACT;AAAA,EACF;AAEA,EAAA,OAAO,CAAA;AACT;;;AC1MA,IAAA,cAAA,GAAA;AAAA,EACE,OAAA,EAAW,yCAAA;AAAA,EACX,GAAA,EAAO,mCAAA;AAAA,EACP,KAAA,EAAS,+BAAA;AAAA,EACT,WAAA,EAAe,oDAAA;AAAA,EACf,IAAA,EAAQ,QAAA;AAAA,EACR,QAAA,EAAY,CAAC,MAAA,EAAQ,aAAA,EAAe,cAAc,CAAA;AAAA,EAClD,oBAAA,EAAwB,KAAA;AAAA,EACxB,iBAAA,EAAqB;AAAA,IACnB,OAAO;AAAC,GACV;AAAA,EACA,UAAA,EAAc;AAAA,IACZ,OAAA,EAAW;AAAA,MACT,IAAA,EAAQ,QAAA;AAAA,MACR,MAAA,EAAU,KAAA;AAAA,MACV,WAAA,EAAe;AAAA,KACjB;AAAA,IACA,EAAA,EAAM;AAAA,MACJ,IAAA,EAAQ,QAAA;AAAA,MACR,WAAA,EAAe;AAAA,KACjB;AAAA,IACA,IAAA,EAAQ;AAAA,MACN,IAAA,EAAQ,QAAA;AAAA,MACR,WAAA,EAAe;AAAA,KACjB;AAAA,IACA,KAAA,EAAS;AAAA,MACP,IAAA,EAAQ,QAAA;AAAA,MACR,WAAA,EAAe;AAAA,KACjB;AAAA,IACA,OAAA,EAAW;AAAA,MACT,IAAA,EAAQ,QAAA;AAAA,MACR,OAAA,EAAW,sBAAA;AAAA,MACX,WAAA,EAAe;AAAA,KACjB;AAAA,IACA,aAAA,EAAiB;AAAA,MACf,IAAA,EAAQ,QAAA;AAAA,MACR,OAAA,EAAW,sBAAA;AAAA,MACX,WAAA,EAAe;AAAA,KACjB;AAAA,IACA,WAAA,EAAe;AAAA,MACb,IAAA,EAAQ;AAAA,KACV;AAAA,IACA,QAAA,EAAY;AAAA,MACV,IAAA,EAAQ,QAAA;AAAA,MACR,QAAA,EAAY,CAAC,aAAA,EAAe,SAAS;AAAA,KACvC;AAAA,IACA,IAAA,EAAQ;AAAA,MACN,IAAA,EAAQ,OAAA;AAAA,MACR,KAAA,EAAS,EAAE,IAAA,EAAQ,QAAA;AAAS,KAC9B;AAAA,IACA,KAAA,EAAS;AAAA,MACP,WAAA,EAAe,4BAAA;AAAA,MACf,KAAA,EAAS;AAAA,QACP;AAAA,UACE,IAAA,EAAQ,QAAA;AAAA,UACR,MAAA,EAAU;AAAA,SACZ;AAAA,QACA;AAAA,UACE,IAAA,EAAQ,OAAA;AAAA,UACR,QAAA,EAAY,CAAA;AAAA,UACZ,KAAA,EAAS;AAAA,YACP,IAAA,EAAQ,QAAA;AAAA,YACR,MAAA,EAAU;AAAA;AACZ;AACF;AACF,KACF;AAAA,IACA,SAAA,EAAa;AAAA,MACX,IAAA,EAAQ,QAAA;AAAA,MACR,MAAA,EAAU;AAAA,KACZ;AAAA,IACA,QAAA,EAAY;AAAA,MACV,IAAA,EAAQ,QAAA;AAAA,MACR,oBAAA,EAAwB,IAAA;AAAA,MACxB,WAAA,EAAe;AAAA,KACjB;AAAA,IACA,MAAA,EAAU;AAAA,MACR,IAAA,EAAQ,QAAA;AAAA,MACR,UAAA,EAAc;AAAA,QACZ,MAAA,EAAU,EAAE,IAAA,EAAQ,QAAA,EAAS;AAAA,QAC7B,GAAA,EAAO,EAAE,IAAA,EAAQ,QAAA,EAAU,QAAU,KAAA,EAAM;AAAA,QAC3C,IAAA,EAAQ,EAAE,IAAA,EAAQ,QAAA,EAAS;AAAA,QAC3B,OAAA,EAAW,EAAE,IAAA,EAAQ,SAAA;AAAU;AACjC,KACF;AAAA,IACA,KAAA,EAAS;AAAA,MACP,IAAA,EAAQ;AAAA,KACV;AAAA,IACA,IAAA,EAAQ;AAAA,MACN,IAAA,EAAQ;AAAA,KACV;AAAA,IACA,SAAA,EAAa;AAAA,MACX,IAAA,EAAQ,OAAA;AAAA,MACR,KAAA,EAAS,EAAE,IAAA,EAAQ,yBAAA;AAA0B,KAC/C;AAAA,IACA,WAAA,EAAe;AAAA,MACb,IAAA,EAAQ,OAAA;AAAA,MACR,KAAA,EAAS;AAAA,QACP,KAAA,EAAS;AAAA,UACP,EAAE,MAAQ,QAAA,EAAS;AAAA,UACnB,EAAE,MAAQ,0BAAA,EAA2B;AAAA,UACrC,EAAE,MAAQ,oCAAA;AAAqC;AACjD;AACF,KACF;AAAA,IACA,YAAA,EAAgB;AAAA,MACd,IAAA,EAAQ,OAAA;AAAA,MACR,KAAA,EAAS;AAAA,QACP,KAAA,EAAS;AAAA,UACP,EAAE,MAAQ,QAAA,EAAS;AAAA,UACnB,EAAE,MAAQ,2BAAA,EAA4B;AAAA,UACtC,EAAE,MAAQ,qCAAA;AAAsC;AAClD;AACF,KACF;AAAA,IACA,OAAA,EAAW;AAAA,MACT,IAAA,EAAQ;AAAA,KACV;AAAA,IACA,aAAA,EAAiB;AAAA,MACf,IAAA,EAAQ,OAAA;AAAA,MACR,KAAA,EAAS,EAAE,IAAA,EAAQ,4BAAA;AAA6B;AAClD,GACF;AAAA,EACA,WAAA,EAAe;AAAA,IACb,KAAA,EAAS;AAAA,MACP,IAAA,EAAQ,QAAA;AAAA,MACR,QAAA,EAAY,CAAC,QAAA,EAAU,MAAM,CAAA;AAAA,MAC7B,UAAA,EAAc;AAAA,QACZ,MAAA,EAAU,EAAE,IAAA,EAAQ,QAAA,EAAS;AAAA,QAC7B,IAAA,EAAQ,EAAE,IAAA,EAAQ,QAAA,EAAS;AAAA,QAC3B,QAAA,EAAY,EAAE,IAAA,EAAQ,QAAA,EAAS;AAAA,QAC/B,WAAA,EAAe,EAAE,IAAA,EAAQ,QAAA;AAAS;AACpC,KACF;AAAA,IACA,IAAA,EAAQ;AAAA,MACN,IAAA,EAAQ,QAAA;AAAA,MACR,UAAA,EAAc;AAAA,QACZ,IAAA,EAAQ,EAAE,IAAA,EAAQ,QAAA,EAAS;AAAA,QAC3B,MAAA,EAAU,EAAE,IAAA,EAAQ,QAAA,EAAS;AAAA,QAC7B,OAAA,EAAW,EAAE,IAAA,EAAQ,QAAA,EAAS;AAAA,QAC9B,KAAA,EAAS,EAAE,IAAA,EAAQ,QAAA,EAAS;AAAA,QAC5B,QAAA,EAAY,EAAE,IAAA,EAAQ,QAAA,EAAU,QAAU,UAAA,EAAW;AAAA,QACrD,QAAA,EAAY,EAAE,IAAA,EAAQ,QAAA,EAAU,QAAU,UAAA;AAAW,OACvD;AAAA,MACA,aAAA,EAAiB;AAAA,KACnB;AAAA,IACA,QAAA,EAAY;AAAA,MACV,IAAA,EAAQ,QAAA;AAAA,MACR,QAAA,EAAY,CAAC,QAAQ,CAAA;AAAA,MACrB,UAAA,EAAc;AAAA,QACZ,MAAA,EAAU,EAAE,IAAA,EAAQ,QAAA,EAAS;AAAA,QAC7B,MAAQ,EAAE,IAAA,EAAQ,CAAC,QAAA,EAAU,MAAM,CAAA;AAAE;AACvC,KACF;AAAA,IACA,OAAA,EAAW;AAAA,MACT,IAAA,EAAQ,QAAA;AAAA,MACR,QAAA,EAAY,CAAC,MAAM,CAAA;AAAA,MACnB,UAAA,EAAc;AAAA,QACZ,IAAA,EAAQ;AAAA,UACN,IAAA,EAAQ,QAAA;AAAA,UACR,MAAQ,CAAC,QAAA,EAAU,UAAA,EAAY,cAAA,EAAgB,SAAS,mBAAmB;AAAA,SAC7E;AAAA,QACA,MAAA,EAAU,EAAE,IAAA,EAAQ,QAAA,EAAS;AAAA,QAC7B,WAAA,EAAe,EAAE,IAAA,EAAQ,QAAA,EAAS;AAAA,QAClC,OAAA,EAAW,EAAE,IAAA,EAAQ,QAAA,EAAS;AAAA,QAC9B,GAAA,EAAO,EAAE,IAAA,EAAQ,QAAA,EAAS;AAAA,QAC1B,GAAA,EAAO,EAAE,IAAA,EAAQ,QAAA;AAAS,OAC5B;AAAA,MACA,EAAA,EAAM;AAAA,QACJ,YAAc,EAAE,IAAA,EAAQ,EAAE,KAAA,EAAS,qBAAoB;AAAE,OAC3D;AAAA,MACA,IAAA,EAAQ;AAAA,QACN,QAAA,EAAY,CAAC,aAAa;AAAA;AAC5B,KACF;AAAA,IACA,UAAA,EAAc;AAAA,MACZ,IAAA,EAAQ,QAAA;AAAA,MACR,QAAA,EAAY,CAAC,MAAM,CAAA;AAAA,MACnB,UAAA,EAAc;AAAA,QACZ,EAAA,EAAM,EAAE,IAAA,EAAQ,QAAA,EAAS;AAAA,QACzB,IAAA,EAAQ,EAAE,IAAA,EAAQ,QAAA,EAAS;AAAA,QAC3B,QAAA,EAAY,EAAE,IAAA,EAAQ,wBAAA,EAAyB;AAAA,QAC/C,IAAA,EAAQ,EAAE,IAAA,EAAQ,QAAA,EAAS;AAAA,QAC3B,KAAA,EAAS,EAAE,IAAA,EAAQ,QAAA,EAAS;AAAA,QAC5B,IAAA,EAAQ,EAAE,IAAA,EAAQ,QAAA,EAAS;AAAA,QAC3B,UAAA,EAAc,EAAE,IAAA,EAAQ,QAAA,EAAS;AAAA,QACjC,QAAA,EAAY,EAAE,IAAA,EAAQ,QAAA,EAAS;AAAA,QAC/B,WAAA,EAAe,EAAE,IAAA,EAAQ,QAAA,EAAS;AAAA,QAClC,OAAA,EAAW,EAAE,IAAA,EAAQ,uBAAA,EAAwB;AAAA,QAC7C,QAAA,EAAY,EAAE,IAAA,EAAQ,SAAA,EAAU;AAAA,QAChC,QAAA,EAAY,EAAE,IAAA,EAAQ,SAAA,EAAU;AAAA,QAChC,KAAA,EAAS,EAAE,IAAA,EAAQ,QAAA;AAAS;AAC9B,KACF;AAAA,IACA,oBAAA,EAAwB;AAAA,MACtB,IAAA,EAAQ,QAAA;AAAA,MACR,QAAA,EAAY,CAAC,YAAA,EAAc,OAAO,CAAA;AAAA,MAClC,UAAA,EAAc;AAAA,QACZ,UAAA,EAAc,EAAE,IAAA,EAAQ,QAAA,EAAS;AAAA,QACjC,KAAA,EAAS;AAAA,UACP,IAAA,EAAQ,OAAA;AAAA,UACR,KAAA,EAAS,EAAE,IAAA,EAAQ,0BAAA;AAA2B;AAChD;AACF,KACF;AAAA,IACA,SAAA,EAAa;AAAA,MACX,IAAA,EAAQ,QAAA;AAAA,MACR,QAAA,EAAY,CAAC,MAAM,CAAA;AAAA,MACnB,UAAA,EAAc;AAAA,QACZ,EAAA,EAAM,EAAE,IAAA,EAAQ,QAAA,EAAS;AAAA,QACzB,IAAA,EAAQ,EAAE,IAAA,EAAQ,QAAA,EAAS;AAAA,QAC3B,QAAA,EAAY,EAAE,IAAA,EAAQ,SAAA,EAAU;AAAA,QAChC,KAAA,EAAS,EAAE,IAAA,EAAQ,QAAA,EAAS;AAAA,QAC5B,QAAA,EAAY,EAAE,IAAA,EAAQ,wBAAA,EAAyB;AAAA,QAC/C,YAAA,EAAgB,EAAE,IAAA,EAAQ,QAAA,EAAS;AAAA,QACnC,YAAA,EAAgB;AAAA,UACd,IAAA,EAAQ,OAAA;AAAA,UACR,KAAA,EAAS,EAAE,IAAA,EAAQ,QAAA;AAAS;AAC9B;AACF,KACF;AAAA,IACA,WAAA,EAAe;AAAA,MACb,IAAA,EAAQ,QAAA;AAAA,MACR,QAAA,EAAY,CAAC,MAAM,CAAA;AAAA,MACnB,UAAA,EAAc;AAAA,QACZ,EAAA,EAAM,EAAE,IAAA,EAAQ,QAAA,EAAS;AAAA,QACzB,IAAA,EAAQ,EAAE,IAAA,EAAQ,QAAA,EAAS;AAAA,QAC3B,KAAA,EAAS;AAAA,UACP,IAAA,EAAQ,QAAA;AAAA,UACR,MAAA,EAAU,KAAA;AAAA,UACV,WAAA,EAAe;AAAA,SACjB;AAAA,QACA,WAAA,EAAe,EAAE,IAAA,EAAQ,QAAA,EAAS;AAAA,QAClC,SAAA,EAAa;AAAA,UACX,IAAA,EAAQ,OAAA;AAAA,UACR,KAAA,EAAS,EAAE,IAAA,EAAQ,QAAA;AAAS,SAC9B;AAAA,QACA,MAAA,EAAU;AAAA,UACR,IAAA,EAAQ,OAAA;AAAA,UACR,KAAA,EAAS,EAAE,IAAA,EAAQ,QAAA;AAAS,SAC9B;AAAA,QACA,MAAA,EAAU;AAAA,UACR,IAAA,EAAQ,QAAA;AAAA,UACR,QAAA,EAAY,CAAC,UAAA,EAAY,MAAM,CAAA;AAAA,UAC/B,UAAA,EAAc;AAAA,YACZ,QAAA,EAAY;AAAA,cACV,KAAA,EAAS;AAAA,gBACP,EAAE,MAAQ,QAAA,EAAS;AAAA,gBACnB,EAAE,IAAA,EAAQ,QAAA,EAAU,OAAA,EAAW,IAAA;AAAK,eACtC;AAAA,cACA,WAAA,EAAe;AAAA,aACjB;AAAA,YACA,IAAA,EAAQ,EAAE,IAAA,EAAQ,QAAA,EAAU,MAAQ,CAAC,QAAA,EAAU,SAAS,CAAA,EAAE;AAAA,YAC1D,OAAA,EAAW,EAAE,IAAA,EAAQ,QAAA,EAAU,MAAQ,CAAC,QAAA,EAAU,OAAA,EAAS,MAAM,CAAA;AAAE;AACrE;AACF;AACF,KACF;AAAA,IACA,qBAAA,EAAyB;AAAA,MACvB,IAAA,EAAQ,QAAA;AAAA,MACR,QAAA,EAAY,CAAC,YAAA,EAAc,OAAO,CAAA;AAAA,MAClC,UAAA,EAAc;AAAA,QACZ,UAAA,EAAc,EAAE,IAAA,EAAQ,QAAA,EAAS;AAAA,QACjC,KAAA,EAAS;AAAA,UACP,IAAA,EAAQ,OAAA;AAAA,UACR,KAAA,EAAS;AAAA,YACP,KAAA,EAAS;AAAA,cACP,EAAE,MAAQ,QAAA,EAAS;AAAA,cACnB,EAAE,MAAQ,2BAAA;AAA4B;AACxC;AACF;AACF;AACF,KACF;AAAA,IACA,OAAA,EAAW;AAAA,MACT,IAAA,EAAQ,QAAA;AAAA,MACR,UAAA,EAAc;AAAA,QACZ,QAAA,EAAY,EAAE,IAAA,EAAQ,6BAAA,EAA8B;AAAA,QACpD,YAAA,EAAgB,EAAE,IAAA,EAAQ,6BAAA,EAA8B;AAAA,QACxD,MAAA,EAAU;AAAA,UACR,KAAA,EAAS;AAAA,YACP,EAAE,MAAQ,6BAAA,EAA8B;AAAA,YACxC;AAAA,cACE,IAAA,EAAQ,QAAA;AAAA,cACR,YAAc,EAAE,OAAA,EAAW,EAAE,IAAA,EAAQ,UAAS;AAAE;AAClD;AACF,SACF;AAAA,QACA,SAAA,EAAa,EAAE,IAAA,EAAQ,QAAA,EAAS;AAAA,QAChC,SAAA,EAAa;AAAA,UACX,IAAA,EAAQ,OAAA;AAAA,UACR,KAAA,EAAS;AAAA,YACP,KAAA,EAAS;AAAA,cACP,EAAE,MAAQ,6BAAA,EAA8B;AAAA,cACxC;AAAA,gBACE,IAAA,EAAQ,QAAA;AAAA,gBACR,QAAA,EAAY,CAAC,WAAA,EAAa,SAAS,CAAA;AAAA,gBACnC,UAAA,EAAc;AAAA,kBACZ,SAAA,EAAa,EAAE,IAAA,EAAQ,QAAA,EAAS;AAAA,kBAChC,OAAA,EAAW,EAAE,IAAA,EAAQ,QAAA,EAAU,MAAQ,CAAC,UAAA,EAAY,cAAA,EAAgB,QAAQ,CAAA;AAAE;AAChF;AACF;AACF;AACF;AACF;AACF,KACF;AAAA,IACA,aAAA,EAAiB;AAAA,MACf,IAAA,EAAQ,QAAA;AAAA,MACR,QAAA,EAAY,CAAC,UAAU,CAAA;AAAA,MACvB,UAAA,EAAc;AAAA,QACZ,QAAA,EAAY,EAAE,IAAA,EAAQ,QAAA,EAAU,SAAW,IAAA,EAAK;AAAA,QAChD,MAAA,EAAU,EAAE,IAAA,EAAQ,QAAA,EAAS;AAAA,QAC7B,KAAA,EAAS,EAAE,IAAA,EAAQ,QAAA;AAAS;AAC9B,KACF;AAAA,IACA,YAAA,EAAgB;AAAA,MACd,IAAA,EAAQ,QAAA;AAAA,MACR,QAAA,EAAY,CAAC,YAAY,CAAA;AAAA,MACzB,UAAA,EAAc;AAAA,QACZ,UAAA,EAAc,EAAE,IAAA,EAAQ,QAAA,EAAS;AAAA,QACjC,QAAA,EAAY,EAAE,IAAA,EAAQ,SAAA,EAAU;AAAA,QAChC,KAAA,EAAS,EAAE,IAAA,EAAQ,QAAA,EAAS;AAAA,QAC5B,YAAA,EAAgB;AAAA,UACd,IAAA,EAAQ,OAAA;AAAA,UACR,KAAA,EAAS;AAAA,YACP,IAAA,EAAQ,QAAA;AAAA,YACR,QAAA,EAAY,CAAC,MAAA,EAAQ,OAAO,CAAA;AAAA,YAC5B,UAAA,EAAc;AAAA,cACZ,IAAA,EAAQ,EAAE,IAAA,EAAQ,QAAA,EAAS;AAAA,cAC3B,KAAA,EAAS,EAAE,IAAA,EAAQ,QAAA,EAAS;AAAA,cAC5B,KAAA,EAAS,EAAE,IAAA,EAAQ,QAAA,EAAS;AAAA,cAC5B,MAAA,EAAU,EAAE,IAAA,EAAQ,QAAA,EAAS;AAAA,cAC7B,OAAA,EAAW;AAAA,gBACT,IAAA,EAAQ,OAAA;AAAA,gBACR,KAAA,EAAS,EAAE,IAAA,EAAQ,QAAA;AAAS;AAC9B;AACF;AACF;AACF;AACF;AACF;AAEJ,CAAA;;;ACvVA,IAAA,uBAAA,GAAA;AAAA,EACE,OAAA,EAAW,yCAAA;AAAA,EACX,GAAA,EAAO,mCAAA;AAAA,EACP,KAAA,EAAS,+BAAA;AAAA,EACT,WAAA,EAAe,oDAAA;AAAA,EACf,IAAA,EAAQ,QAAA;AAAA,EACR,QAAA,EAAY,CAAC,MAAA,EAAQ,aAAA,EAAe,cAAc,CAAA;AAAA,EAClD,oBAAA,EAAwB,KAAA;AAAA,EACxB,iBAAA,EAAqB;AAAA,IACnB,OAAO;AAAC,GACV;AAAA,EACA,UAAA,EAAc;AAAA,IACZ,OAAA,EAAW;AAAA,MACT,IAAA,EAAQ,QAAA;AAAA,MACR,MAAA,EAAU,KAAA;AAAA,MACV,WAAA,EAAe;AAAA,KACjB;AAAA,IACA,EAAA,EAAM;AAAA,MACJ,IAAA,EAAQ,QAAA;AAAA,MACR,WAAA,EAAe;AAAA,KACjB;AAAA,IACA,IAAA,EAAQ;AAAA,MACN,IAAA,EAAQ,QAAA;AAAA,MACR,WAAA,EAAe;AAAA,KACjB;AAAA,IACA,KAAA,EAAS;AAAA,MACP,IAAA,EAAQ,QAAA;AAAA,MACR,WAAA,EAAe;AAAA,KACjB;AAAA,IACA,OAAA,EAAW;AAAA,MACT,IAAA,EAAQ,QAAA;AAAA,MACR,OAAA,EAAW,sBAAA;AAAA,MACX,WAAA,EAAe;AAAA,KACjB;AAAA,IACA,aAAA,EAAiB;AAAA,MACf,IAAA,EAAQ,QAAA;AAAA,MACR,OAAA,EAAW,sBAAA;AAAA,MACX,WAAA,EAAe;AAAA,KACjB;AAAA,IACA,WAAA,EAAe;AAAA,MACb,IAAA,EAAQ;AAAA,KACV;AAAA,IACA,QAAA,EAAY;AAAA,MACV,IAAA,EAAQ,QAAA;AAAA,MACR,QAAA,EAAY,CAAC,aAAA,EAAe,SAAS;AAAA,KACvC;AAAA,IACA,IAAA,EAAQ;AAAA,MACN,IAAA,EAAQ,OAAA;AAAA,MACR,KAAA,EAAS,EAAE,IAAA,EAAQ,QAAA;AAAS,KAC9B;AAAA,IACA,KAAA,EAAS;AAAA,MACP,WAAA,EAAe,4BAAA;AAAA,MACf,KAAA,EAAS;AAAA,QACP;AAAA,UACE,IAAA,EAAQ,QAAA;AAAA,UACR,MAAA,EAAU;AAAA,SACZ;AAAA,QACA;AAAA,UACE,IAAA,EAAQ,OAAA;AAAA,UACR,QAAA,EAAY,CAAA;AAAA,UACZ,KAAA,EAAS;AAAA,YACP,IAAA,EAAQ,QAAA;AAAA,YACR,MAAA,EAAU;AAAA;AACZ;AACF;AACF,KACF;AAAA,IACA,SAAA,EAAa;AAAA,MACX,IAAA,EAAQ,QAAA;AAAA,MACR,MAAA,EAAU;AAAA,KACZ;AAAA,IACA,QAAA,EAAY;AAAA,MACV,IAAA,EAAQ,QAAA;AAAA,MACR,oBAAA,EAAwB,IAAA;AAAA,MACxB,WAAA,EAAe;AAAA,KACjB;AAAA,IACA,MAAA,EAAU;AAAA,MACR,IAAA,EAAQ,QAAA;AAAA,MACR,UAAA,EAAc;AAAA,QACZ,MAAA,EAAU,EAAE,IAAA,EAAQ,QAAA,EAAS;AAAA,QAC7B,GAAA,EAAO,EAAE,IAAA,EAAQ,QAAA,EAAU,QAAU,KAAA,EAAM;AAAA,QAC3C,IAAA,EAAQ,EAAE,IAAA,EAAQ,QAAA,EAAS;AAAA,QAC3B,OAAA,EAAW,EAAE,IAAA,EAAQ,SAAA;AAAU;AACjC,KACF;AAAA,IACA,KAAA,EAAS;AAAA,MACP,IAAA,EAAQ;AAAA,KACV;AAAA,IACA,IAAA,EAAQ;AAAA,MACN,IAAA,EAAQ;AAAA,KACV;AAAA,IACA,SAAA,EAAa;AAAA,MACX,IAAA,EAAQ,OAAA;AAAA,MACR,KAAA,EAAS,EAAE,IAAA,EAAQ,yBAAA;AAA0B,KAC/C;AAAA,IACA,WAAA,EAAe;AAAA,MACb,IAAA,EAAQ,OAAA;AAAA,MACR,KAAA,EAAS;AAAA,QACP,KAAA,EAAS;AAAA,UACP,EAAE,MAAQ,QAAA,EAAS;AAAA,UACnB,EAAE,MAAQ,0BAAA,EAA2B;AAAA,UACrC,EAAE,MAAQ,oCAAA;AAAqC;AACjD;AACF,KACF;AAAA,IACA,YAAA,EAAgB;AAAA,MACd,IAAA,EAAQ,OAAA;AAAA,MACR,KAAA,EAAS;AAAA,QACP,KAAA,EAAS;AAAA,UACP,EAAE,MAAQ,QAAA,EAAS;AAAA,UACnB,EAAE,MAAQ,2BAAA,EAA4B;AAAA,UACtC,EAAE,MAAQ,qCAAA;AAAsC;AAClD;AACF,KACF;AAAA,IACA,OAAA,EAAW;AAAA,MACT,IAAA,EAAQ;AAAA,KACV;AAAA,IACA,aAAA,EAAiB;AAAA,MACf,IAAA,EAAQ,OAAA;AAAA,MACR,KAAA,EAAS,EAAE,IAAA,EAAQ,4BAAA;AAA6B;AAClD,GACF;AAAA,EACA,WAAA,EAAe;AAAA,IACb,KAAA,EAAS;AAAA,MACP,IAAA,EAAQ,QAAA;AAAA,MACR,QAAA,EAAY,CAAC,QAAA,EAAU,MAAM,CAAA;AAAA,MAC7B,UAAA,EAAc;AAAA,QACZ,MAAA,EAAU,EAAE,IAAA,EAAQ,QAAA,EAAS;AAAA,QAC7B,IAAA,EAAQ,EAAE,IAAA,EAAQ,QAAA,EAAS;AAAA,QAC3B,QAAA,EAAY,EAAE,IAAA,EAAQ,QAAA,EAAS;AAAA,QAC/B,WAAA,EAAe,EAAE,IAAA,EAAQ,QAAA;AAAS;AACpC,KACF;AAAA,IACA,IAAA,EAAQ;AAAA,MACN,IAAA,EAAQ,QAAA;AAAA,MACR,UAAA,EAAc;AAAA,QACZ,IAAA,EAAQ,EAAE,IAAA,EAAQ,QAAA,EAAS;AAAA,QAC3B,MAAA,EAAU,EAAE,IAAA,EAAQ,QAAA,EAAS;AAAA,QAC7B,OAAA,EAAW,EAAE,IAAA,EAAQ,QAAA,EAAS;AAAA,QAC9B,KAAA,EAAS,EAAE,IAAA,EAAQ,QAAA,EAAS;AAAA,QAC5B,QAAA,EAAY,EAAE,IAAA,EAAQ,QAAA,EAAU,QAAU,UAAA,EAAW;AAAA,QACrD,QAAA,EAAY,EAAE,IAAA,EAAQ,QAAA,EAAU,QAAU,UAAA;AAAW,OACvD;AAAA,MACA,aAAA,EAAiB;AAAA,KACnB;AAAA,IACA,QAAA,EAAY;AAAA,MACV,IAAA,EAAQ,QAAA;AAAA,MACR,QAAA,EAAY,CAAC,QAAQ,CAAA;AAAA,MACrB,UAAA,EAAc;AAAA,QACZ,MAAA,EAAU,EAAE,IAAA,EAAQ,QAAA,EAAS;AAAA,QAC7B,MAAQ,EAAE,IAAA,EAAQ,CAAC,QAAA,EAAU,MAAM,CAAA;AAAE;AACvC,KACF;AAAA,IACA,OAAA,EAAW;AAAA,MACT,IAAA,EAAQ,QAAA;AAAA,MACR,QAAA,EAAY,CAAC,MAAM,CAAA;AAAA,MACnB,UAAA,EAAc;AAAA,QACZ,IAAA,EAAQ;AAAA,UACN,IAAA,EAAQ,QAAA;AAAA,UACR,MAAQ,CAAC,QAAA,EAAU,UAAA,EAAY,cAAA,EAAgB,SAAS,mBAAmB;AAAA,SAC7E;AAAA,QACA,MAAA,EAAU,EAAE,IAAA,EAAQ,QAAA,EAAS;AAAA,QAC7B,WAAA,EAAe,EAAE,IAAA,EAAQ,QAAA,EAAS;AAAA,QAClC,OAAA,EAAW,EAAE,IAAA,EAAQ,QAAA,EAAS;AAAA,QAC9B,GAAA,EAAO,EAAE,IAAA,EAAQ,QAAA,EAAS;AAAA,QAC1B,GAAA,EAAO,EAAE,IAAA,EAAQ,QAAA;AAAS,OAC5B;AAAA,MACA,EAAA,EAAM;AAAA,QACJ,YAAc,EAAE,IAAA,EAAQ,EAAE,KAAA,EAAS,qBAAoB;AAAE,OAC3D;AAAA,MACA,IAAA,EAAQ;AAAA,QACN,QAAA,EAAY,CAAC,aAAa;AAAA;AAC5B,KACF;AAAA,IACA,UAAA,EAAc;AAAA,MACZ,IAAA,EAAQ,QAAA;AAAA,MACR,QAAA,EAAY,CAAC,MAAM,CAAA;AAAA,MACnB,UAAA,EAAc;AAAA,QACZ,EAAA,EAAM,EAAE,IAAA,EAAQ,QAAA,EAAS;AAAA,QACzB,IAAA,EAAQ,EAAE,IAAA,EAAQ,QAAA,EAAS;AAAA,QAC3B,QAAA,EAAY,EAAE,IAAA,EAAQ,wBAAA,EAAyB;AAAA,QAC/C,IAAA,EAAQ,EAAE,IAAA,EAAQ,QAAA,EAAS;AAAA,QAC3B,KAAA,EAAS,EAAE,IAAA,EAAQ,QAAA,EAAS;AAAA,QAC5B,IAAA,EAAQ,EAAE,IAAA,EAAQ,QAAA,EAAS;AAAA,QAC3B,UAAA,EAAc,EAAE,IAAA,EAAQ,QAAA,EAAS;AAAA,QACjC,QAAA,EAAY,EAAE,IAAA,EAAQ,QAAA,EAAS;AAAA,QAC/B,WAAA,EAAe,EAAE,IAAA,EAAQ,QAAA,EAAS;AAAA,QAClC,OAAA,EAAW,EAAE,IAAA,EAAQ,uBAAA,EAAwB;AAAA,QAC7C,QAAA,EAAY,EAAE,IAAA,EAAQ,SAAA,EAAU;AAAA,QAChC,QAAA,EAAY,EAAE,IAAA,EAAQ,SAAA,EAAU;AAAA,QAChC,KAAA,EAAS,EAAE,IAAA,EAAQ,QAAA;AAAS;AAC9B,KACF;AAAA,IACA,oBAAA,EAAwB;AAAA,MACtB,IAAA,EAAQ,QAAA;AAAA,MACR,QAAA,EAAY,CAAC,YAAA,EAAc,OAAO,CAAA;AAAA,MAClC,UAAA,EAAc;AAAA,QACZ,UAAA,EAAc,EAAE,IAAA,EAAQ,QAAA,EAAS;AAAA,QACjC,KAAA,EAAS;AAAA,UACP,IAAA,EAAQ,OAAA;AAAA,UACR,KAAA,EAAS,EAAE,IAAA,EAAQ,0BAAA;AAA2B;AAChD;AACF,KACF;AAAA,IACA,SAAA,EAAa;AAAA,MACX,IAAA,EAAQ,QAAA;AAAA,MACR,QAAA,EAAY,CAAC,MAAM,CAAA;AAAA,MACnB,UAAA,EAAc;AAAA,QACZ,EAAA,EAAM,EAAE,IAAA,EAAQ,QAAA,EAAS;AAAA,QACzB,IAAA,EAAQ,EAAE,IAAA,EAAQ,QAAA,EAAS;AAAA,QAC3B,QAAA,EAAY,EAAE,IAAA,EAAQ,SAAA,EAAU;AAAA,QAChC,KAAA,EAAS,EAAE,IAAA,EAAQ,QAAA,EAAS;AAAA,QAC5B,QAAA,EAAY,EAAE,IAAA,EAAQ,wBAAA,EAAyB;AAAA,QAC/C,YAAA,EAAgB,EAAE,IAAA,EAAQ,QAAA,EAAS;AAAA,QACnC,YAAA,EAAgB;AAAA,UACd,IAAA,EAAQ,OAAA;AAAA,UACR,KAAA,EAAS,EAAE,IAAA,EAAQ,QAAA;AAAS;AAC9B;AACF,KACF;AAAA,IACA,WAAA,EAAe;AAAA,MACb,IAAA,EAAQ,QAAA;AAAA,MACR,QAAA,EAAY,CAAC,MAAM,CAAA;AAAA,MACnB,UAAA,EAAc;AAAA,QACZ,EAAA,EAAM,EAAE,IAAA,EAAQ,QAAA,EAAS;AAAA,QACzB,IAAA,EAAQ,EAAE,IAAA,EAAQ,QAAA,EAAS;AAAA,QAC3B,KAAA,EAAS;AAAA,UACP,IAAA,EAAQ,QAAA;AAAA,UACR,MAAA,EAAU,KAAA;AAAA,UACV,WAAA,EAAe;AAAA,SACjB;AAAA,QACA,WAAA,EAAe,EAAE,IAAA,EAAQ,QAAA,EAAS;AAAA,QAClC,SAAA,EAAa;AAAA,UACX,IAAA,EAAQ,OAAA;AAAA,UACR,KAAA,EAAS,EAAE,IAAA,EAAQ,QAAA;AAAS,SAC9B;AAAA,QACA,MAAA,EAAU;AAAA,UACR,IAAA,EAAQ,OAAA;AAAA,UACR,KAAA,EAAS,EAAE,IAAA,EAAQ,QAAA;AAAS,SAC9B;AAAA,QACA,MAAA,EAAU;AAAA,UACR,IAAA,EAAQ,QAAA;AAAA,UACR,QAAA,EAAY,CAAC,UAAA,EAAY,MAAM,CAAA;AAAA,UAC/B,UAAA,EAAc;AAAA,YACZ,QAAA,EAAY;AAAA,cACV,KAAA,EAAS;AAAA,gBACP,EAAE,MAAQ,QAAA,EAAS;AAAA,gBACnB,EAAE,IAAA,EAAQ,QAAA,EAAU,OAAA,EAAW,IAAA;AAAK,eACtC;AAAA,cACA,WAAA,EAAe;AAAA,aACjB;AAAA,YACA,IAAA,EAAQ,EAAE,IAAA,EAAQ,QAAA,EAAU,MAAQ,CAAC,QAAA,EAAU,SAAS,CAAA,EAAE;AAAA,YAC1D,OAAA,EAAW,EAAE,IAAA,EAAQ,QAAA,EAAU,MAAQ,CAAC,QAAA,EAAU,OAAA,EAAS,MAAM,CAAA;AAAE;AACrE;AACF;AACF,KACF;AAAA,IACA,qBAAA,EAAyB;AAAA,MACvB,IAAA,EAAQ,QAAA;AAAA,MACR,QAAA,EAAY,CAAC,YAAA,EAAc,OAAO,CAAA;AAAA,MAClC,UAAA,EAAc;AAAA,QACZ,UAAA,EAAc,EAAE,IAAA,EAAQ,QAAA,EAAS;AAAA,QACjC,KAAA,EAAS;AAAA,UACP,IAAA,EAAQ,OAAA;AAAA,UACR,KAAA,EAAS;AAAA,YACP,KAAA,EAAS;AAAA,cACP,EAAE,MAAQ,QAAA,EAAS;AAAA,cACnB,EAAE,MAAQ,2BAAA;AAA4B;AACxC;AACF;AACF;AACF,KACF;AAAA,IACA,OAAA,EAAW;AAAA,MACT,IAAA,EAAQ,QAAA;AAAA,MACR,UAAA,EAAc;AAAA,QACZ,QAAA,EAAY,EAAE,IAAA,EAAQ,6BAAA,EAA8B;AAAA,QACpD,YAAA,EAAgB,EAAE,IAAA,EAAQ,6BAAA,EAA8B;AAAA,QACxD,MAAA,EAAU;AAAA,UACR,KAAA,EAAS;AAAA,YACP,EAAE,MAAQ,6BAAA,EAA8B;AAAA,YACxC;AAAA,cACE,IAAA,EAAQ,QAAA;AAAA,cACR,YAAc,EAAE,OAAA,EAAW,EAAE,IAAA,EAAQ,UAAS;AAAE;AAClD;AACF,SACF;AAAA,QACA,SAAA,EAAa,EAAE,IAAA,EAAQ,QAAA,EAAS;AAAA,QAChC,SAAA,EAAa;AAAA,UACX,IAAA,EAAQ,OAAA;AAAA,UACR,KAAA,EAAS;AAAA,YACP,KAAA,EAAS;AAAA,cACP,EAAE,MAAQ,6BAAA,EAA8B;AAAA,cACxC;AAAA,gBACE,IAAA,EAAQ,QAAA;AAAA,gBACR,QAAA,EAAY,CAAC,WAAA,EAAa,SAAS,CAAA;AAAA,gBACnC,UAAA,EAAc;AAAA,kBACZ,SAAA,EAAa,EAAE,IAAA,EAAQ,QAAA,EAAS;AAAA,kBAChC,OAAA,EAAW,EAAE,IAAA,EAAQ,QAAA,EAAU,MAAQ,CAAC,UAAA,EAAY,cAAA,EAAgB,QAAQ,CAAA;AAAE;AAChF;AACF;AACF;AACF;AACF;AACF,KACF;AAAA,IACA,aAAA,EAAiB;AAAA,MACf,IAAA,EAAQ,QAAA;AAAA,MACR,QAAA,EAAY,CAAC,UAAU,CAAA;AAAA,MACvB,UAAA,EAAc;AAAA,QACZ,QAAA,EAAY,EAAE,IAAA,EAAQ,QAAA,EAAU,SAAW,IAAA,EAAK;AAAA,QAChD,MAAA,EAAU,EAAE,IAAA,EAAQ,QAAA,EAAS;AAAA,QAC7B,KAAA,EAAS,EAAE,IAAA,EAAQ,QAAA;AAAS;AAC9B,KACF;AAAA,IACA,YAAA,EAAgB;AAAA,MACd,IAAA,EAAQ,QAAA;AAAA,MACR,QAAA,EAAY,CAAC,YAAY,CAAA;AAAA,MACzB,UAAA,EAAc;AAAA,QACZ,UAAA,EAAc,EAAE,IAAA,EAAQ,QAAA,EAAS;AAAA,QACjC,QAAA,EAAY,EAAE,IAAA,EAAQ,SAAA,EAAU;AAAA,QAChC,KAAA,EAAS,EAAE,IAAA,EAAQ,QAAA,EAAS;AAAA,QAC5B,YAAA,EAAgB;AAAA,UACd,IAAA,EAAQ,OAAA;AAAA,UACR,KAAA,EAAS;AAAA,YACP,IAAA,EAAQ,QAAA;AAAA,YACR,QAAA,EAAY,CAAC,MAAA,EAAQ,OAAO,CAAA;AAAA,YAC5B,UAAA,EAAc;AAAA,cACZ,IAAA,EAAQ,EAAE,IAAA,EAAQ,QAAA,EAAS;AAAA,cAC3B,KAAA,EAAS,EAAE,IAAA,EAAQ,QAAA,EAAS;AAAA,cAC5B,KAAA,EAAS,EAAE,IAAA,EAAQ,QAAA,EAAS;AAAA,cAC5B,MAAA,EAAU,EAAE,IAAA,EAAQ,QAAA,EAAS;AAAA,cAC7B,OAAA,EAAW;AAAA,gBACT,IAAA,EAAQ,OAAA;AAAA,gBACR,KAAA,EAAS,EAAE,IAAA,EAAQ,QAAA;AAAS;AAC9B;AACF;AACF;AACF;AACF;AACF;AAEJ,CAAA;;;ACvVA,IAAA,mBAAA,GAAA;AAAA,EACE,OAAA,EAAW,yCAAA;AAAA,EACX,GAAA,EAAO,iDAAA;AAAA,EACP,KAAA,EAAS,8BAAA;AAAA,EACT,WAAA,EAAe,kEAAA;AAAA,EACf,KAAA,EAAS;AAAA,IACP,EAAE,MAAQ,mCAAA;AAAoC;AAElD,CAAA;;;ACRA,IAAA,uBAAA,GAAA;AAAA,EACE,OAAA,EAAW,yCAAA;AAAA,EACX,GAAA,EAAO,qDAAA;AAAA,EACP,KAAA,EAAS,kCAAA;AAAA,EACT,WAAA,EAAe,iHAAA;AAAA,EACf,KAAA,EAAS;AAAA,IACP,EAAE,MAAQ,mCAAA,EAAoC;AAAA,IAC9C;AAAA,MACE,QAAA,EAAY,CAAC,OAAA,EAAS,MAAA,EAAQ,eAAe,cAAc,CAAA;AAAA,MAC3D,UAAA,EAAc;AAAA,QACZ,KAAA,EAAS,EAAE,IAAA,EAAQ,sDAAA,EAAuD;AAAA,QAC1E,IAAA,EAAQ,EAAE,IAAA,EAAQ,qDAAA,EAAsD;AAAA,QACxE,WAAA,EAAe,EAAE,IAAA,EAAQ,OAAA,EAAS,UAAY,CAAA,EAAE;AAAA,QAChD,YAAA,EAAgB,EAAE,IAAA,EAAQ,OAAA,EAAS,UAAY,CAAA;AAAE;AACnD;AACF;AAEJ,CAAA;;;ACjBA,IAAA,yBAAA,GAAA;AAAA,EACE,OAAA,EAAW,yCAAA;AAAA,EACX,GAAA,EAAO,uDAAA;AAAA,EACP,KAAA,EAAS,oCAAA;AAAA,EACT,WAAA,EAAe,mEAAA;AAAA,EACf,KAAA,EAAS;AAAA,IACP,EAAE,MAAQ,mCAAA,EAAoC;AAAA,IAC9C;AAAA,MACE,UAAA,EAAc;AAAA,QACZ,WAAA,EAAe;AAAA,UACb,IAAA,EAAQ,OAAA;AAAA,UACR,KAAA,EAAS;AAAA,YACP,KAAA,EAAS;AAAA,cACP,EAAE,MAAQ,oCAAA,EAAqC;AAAA,cAC/C,EAAE,MAAQ,8CAAA;AAA+C;AAC3D;AACF;AACF;AACF;AACF,GACF;AAAA,EACA,WAAA,EAAe;AAAA,IACb,oBAAA,EAAwB;AAAA,MACtB,KAAA,EAAS;AAAA,QACP,EAAE,MAAQ,2DAAA,EAA4D;AAAA,QACtE,EAAE,QAAA,EAAY,CAAC,MAAA,EAAQ,UAAU,CAAA;AAAE;AACrC,KACF;AAAA,IACA,8BAAA,EAAkC;AAAA,MAChC,KAAA,EAAS;AAAA,QACP,EAAE,MAAQ,qEAAA,EAAsE;AAAA,QAChF;AAAA,UACE,UAAA,EAAc;AAAA,YACZ,KAAA,EAAS;AAAA,cACP,IAAA,EAAQ,OAAA;AAAA,cACR,KAAA,EAAS,EAAE,IAAA,EAAQ,oCAAA;AAAqC;AAC1D;AACF;AACF;AACF;AACF;AAEJ,CAAA;;;AC1CA,IAAA,0BAAA,GAAA;AAAA,EACE,OAAA,EAAW,yCAAA;AAAA,EACX,GAAA,EAAO,wDAAA;AAAA,EACP,KAAA,EAAS,qCAAA;AAAA,EACT,WAAA,EAAe,uEAAA;AAAA,EACf,KAAA,EAAS;AAAA,IACP,EAAE,MAAQ,mCAAA,EAAoC;AAAA,IAC9C;AAAA,MACE,KAAA,EAAS;AAAA,QACP,EAAE,QAAA,EAAY,CAAC,OAAO,CAAA,EAAE;AAAA,QACxB;AAAA,UACE,UAAA,EAAc;AAAA,YACZ,YAAA,EAAgB;AAAA,cACd,IAAA,EAAQ,OAAA;AAAA,cACR,QAAA,EAAY;AAAA,gBACV,KAAA,EAAS;AAAA,kBACP,EAAE,MAAQ,gCAAA,EAAiC;AAAA,kBAC3C,EAAE,MAAQ,8CAAA;AAA+C;AAC3D;AACF;AACF;AACF;AACF;AACF;AACF,GACF;AAAA,EACA,WAAA,EAAe;AAAA,IACb,gBAAA,EAAoB;AAAA,MAClB,KAAA,EAAS;AAAA,QACP,EAAE,MAAQ,4DAAA,EAA6D;AAAA,QACvE,EAAE,QAAA,EAAY,CAAC,OAAO,CAAA;AAAE;AAC1B,KACF;AAAA,IACA,8BAAA,EAAkC;AAAA,MAChC,KAAA,EAAS;AAAA,QACP,EAAE,MAAQ,sEAAA,EAAuE;AAAA,QACjF;AAAA,UACE,UAAA,EAAc;AAAA,YACZ,KAAA,EAAS;AAAA,cACP,IAAA,EAAQ,OAAA;AAAA,cACR,QAAA,EAAY,EAAE,IAAA,EAAQ,gCAAA;AAAiC;AACzD;AACF;AACF;AACF;AACF;AAEJ,CAAA;;;AC/CA,IAAA,0BAAA,GAAA;AAAA,EACE,OAAA,EAAW,yCAAA;AAAA,EACX,GAAA,EAAO,wDAAA;AAAA,EACP,KAAA,EAAS,qCAAA;AAAA,EACT,WAAA,EAAe,yEAAA;AAAA,EACf,KAAA,EAAS;AAAA,IACP,EAAE,MAAQ,mCAAA,EAAoC;AAAA,IAC9C;AAAA,MACE,UAAA,EAAc;AAAA,QACZ,YAAA,EAAgB;AAAA,UACd,IAAA,EAAQ,OAAA;AAAA,UACR,KAAA,EAAS;AAAA,YACP,KAAA,EAAS;AAAA,cACP,EAAE,MAAQ,sCAAA,EAAuC;AAAA,cACjD,EAAE,MAAQ,gDAAA;AAAiD;AAC7D;AACF;AACF;AACF;AACF,GACF;AAAA,EACA,WAAA,EAAe;AAAA,IACb,sBAAA,EAA0B;AAAA,MACxB,KAAA,EAAS;AAAA,QACP,EAAE,MAAQ,4DAAA,EAA6D;AAAA,QACvE,EAAE,QAAA,EAAY,CAAC,IAAA,EAAM,QAAQ,CAAA;AAAE;AACjC,KACF;AAAA,IACA,gCAAA,EAAoC;AAAA,MAClC,KAAA,EAAS;AAAA,QACP,EAAE,MAAQ,sEAAA,EAAuE;AAAA,QACjF;AAAA,UACE,UAAA,EAAc;AAAA,YACZ,KAAA,EAAS;AAAA,cACP,IAAA,EAAQ,OAAA;AAAA,cACR,KAAA,EAAS,EAAE,IAAA,EAAQ,sCAAA;AAAuC;AAC5D;AACF;AACF;AACF;AACF;AAEJ,CAAA;;;ACOA,IAAM,cAAA,GAAoD;AAAA,EACxD,IAAA,EAAM,mBAAA;AAAA,EACN,QAAA,EAAU,uBAAA;AAAA,EACV,QAAA,EAAU,mBAAA;AAAA,EACV,UAAA,EAAY,yBAAA;AAAA,EACZ,WAAA,EAAa,0BAAA;AAAA,EACb,WAAA,EAAa;AACf,CAAA;AAEA,IAAM,kBAAA,uBAA0D,GAAA,EAAI;AAEpE,SAAS,cAAc,gBAAA,EAA8C;AACnE,EAAA,MAAM,GAAA,GAAM,IAAI,GAAA,CAAI,EAAE,QAAQ,KAAA,EAAO,SAAA,EAAW,kBAAkB,CAAA;AAClE,EAAA,UAAA,CAAW,GAAG,CAAA;AAEd,EAAA,MAAM,SAAA,uBAAgB,GAAA,EAAY;AAClC,EAAA,MAAM,cAAA,GAAiB,CAAC,MAAA,KAAgB;AACtC,IAAA,IAAI,CAAC,MAAA,EAAQ;AACb,IAAA,MAAM,WAAY,MAAA,IAAA,IAAA,GAAA,MAAA,GAAA,MAAA,CAAgB,GAAA;AAClC,IAAA,IAAI,QAAA,IAAY,SAAA,CAAU,GAAA,CAAI,QAAQ,CAAA,EAAG;AACzC,IAAA,GAAA,CAAI,UAAU,MAAM,CAAA;AACpB,IAAA,IAAI,QAAA,EAAU,SAAA,CAAU,GAAA,CAAI,QAAQ,CAAA;AAAA,EACtC,CAAA;AAEA,EAAA,cAAA,CAAe,cAAU,CAAA;AACzB,EAAA,cAAA,CAAe,uBAAc,CAAA;AAC7B,EAAA,MAAA,CAAO,MAAA,CAAO,cAAc,CAAA,CAAE,OAAA,CAAQ,cAAc,CAAA;AAEpD,EAAA,OAAO,EAAE,GAAA,EAAK,UAAA,EAAY,EAAC,EAAE;AAC/B;AAEA,SAAS,WAAW,gBAAA,EAA8C;AAChE,EAAA,IAAI,CAAC,kBAAA,CAAmB,GAAA,CAAI,gBAAgB,CAAA,EAAG;AAC7C,IAAA,kBAAA,CAAmB,GAAA,CAAI,gBAAA,EAAkB,aAAA,CAAc,gBAAgB,CAAC,CAAA;AAAA,EAC1E;AACA,EAAA,OAAO,kBAAA,CAAmB,IAAI,gBAAgB,CAAA;AAChD;AAEA,SAAS,YAAe,MAAA,EAAc;AACpC,EAAA,IAAI,OAAO,oBAAoB,UAAA,EAAY;AACzC,IAAA,OAAO,gBAAgB,MAAM,CAAA;AAAA,EAC/B;AACA,EAAA,OAAO,IAAA,CAAK,KAAA,CAAM,IAAA,CAAK,SAAA,CAAU,MAAM,CAAC,CAAA;AAC1C;AAEA,SAAS,wBAAwB,SAAA,EAA6C;AAC5E,EAAA,IAAI,CAAC,WAAW,OAAO,MAAA;AACvB,EAAA,MAAM,KAAA,GAAQ,SAAA,CAAU,KAAA,CAAM,sCAAsC,CAAA;AACpE,EAAA,IAAI,KAAA,EAAO;AACT,IAAA,MAAM,OAAA,GAAU,KAAA,CAAM,CAAC,CAAA,CAAE,WAAA,EAAY;AACrC,IAAA,IAAI,OAAA,IAAW,gBAAgB,OAAO,OAAA;AAAA,EACxC;AACA,EAAA,OAAO,MAAA;AACT;AAEA,SAAS,YAAA,CAAa,SAAsB,OAAA,EAA8C;AACxF,EAAA,IAAI,CAAC,cAAA,CAAe,OAAO,CAAA,EAAG;AAC5B,IAAA,MAAM,IAAI,KAAA,CAAM,CAAA,0BAAA,EAA6B,OAAO,CAAA,CAAE,CAAA;AAAA,EACxD;AAEA,EAAA,IAAI,CAAC,OAAA,CAAQ,UAAA,CAAW,OAAO,CAAA,EAAG;AAChC,IAAA,OAAA,CAAQ,UAAA,CAAW,OAAO,CAAA,GAAI,OAAA,CAAQ,IAAI,OAAA,CAAQ,cAAA,CAAe,OAAO,CAAE,CAAA;AAAA,EAC5E;AACA,EAAA,OAAO,OAAA,CAAQ,WAAW,OAAO,CAAA;AACnC;AAEA,SAAS,gBAAgB,MAAA,EAAuE;AAC9F,EAAA,MAAM,UAAA,GAAa,YAAY,MAAM,CAAA;AACrC,EAAA,MAAM,WAAgC,EAAC;AAEvC,EAAA,aAAA,CAAc,UAAU,CAAA;AAExB,EAAA,IACE,UAAA,IACA,OAAO,UAAA,KAAe,QAAA,IACtB,SAAA,IAAa,UAAA,IACb,CAAE,UAAA,CAAmB,aAAA,IACrB,OAAQ,UAAA,CAAmB,OAAA,KAAY,QAAA,EACvC;AACA,IAAC,UAAA,CAAmB,gBAAiB,UAAA,CAAmB,OAAA;AACxD,IAAA,QAAA,CAAS,KAAK,EAAE,IAAA,EAAM,UAAA,EAAY,OAAA,EAAS,uDAAuD,CAAA;AAAA,EACpG;AAEA,EAAA,OAAO,EAAE,YAAY,QAAA,EAAS;AAChC;AAEA,SAAS,cAAc,MAAA,EAAsB;AAC3C,EAAA,MAAM,OAAQ,MAAA,IAAA,IAAA,GAAA,MAAA,GAAA,MAAA,CAAgB,IAAA;AAC9B,EAAA,IAAI,CAAC,QAAQ,OAAO,IAAA,KAAS,YAAY,KAAA,CAAM,OAAA,CAAQ,IAAI,CAAA,EAAG;AAE9D,EAAA,MAAM,cAAA,GAAiE;AAAA,IACrE,MAAA;AAAA,IACA,QAAA;AAAA,IACA,SAAA;AAAA,IACA;AAAA,GACF;AAEA,EAAA,cAAA,CAAe,OAAA,CAAQ,CAAC,GAAA,KAAQ;AAC9B,IAAA,MAAM,KAAA,GAAS,KAAa,GAAG,CAAA;AAC/B,IAAA,IAAI,OAAO,UAAU,QAAA,EAAU;AAE/B,IAAA,MAAM,MAAA,GAAS,cAAc,KAAY,CAAA;AACzC,IAAA,IAAI,WAAW,IAAA,EAAM;AACnB,MAAC,IAAA,CAAa,GAAG,CAAA,GAAI,MAAA;AAAA,IACvB;AAAA,EACF,CAAC,CAAA;AACH;AA3JA,IAAA,EAAA,EAAA,EAAA;AA6JA,IAAM,oBAAA,uBAA2B,GAAA,CAAY;AAAA,EAC3C,GAAG,MAAA,CAAO,IAAA,CAAA,CAAM,0DAAwB,UAAA,KAAxB,IAAA,GAAA,EAAA,GAAsC,EAAE,CAAA;AAAA,EACxD,UAAA;AAAA,EACA;AACF,CAAC,CAAA;AAED,SAAS,0BAA0B,MAAA,EAAgC;AACjE,EAAA,IAAI,CAAC,MAAA,IAAU,OAAO,MAAA,KAAW,QAAA,SAAiB,EAAC;AACnD,EAAA,MAAM,cAAA,GAAiB,MAAA,CAAO,IAAA,CAAK,MAAM,CAAA,CAAE,MAAA;AAAA,IACzC,CAAC,GAAA,KAAQ,CAAC,oBAAA,CAAqB,GAAA,CAAI,GAAG,CAAA,IAAK,CAAC,GAAA,CAAI,UAAA,CAAW,IAAI;AAAA,GACjE;AAEA,EAAA,OAAO,cAAA,CAAe,GAAA,CAAI,CAAC,GAAA,MAAS;AAAA,IAClC,IAAA,EAAM,IAAI,GAAG,CAAA,CAAA;AAAA,IACb,OAAA,EAAS,sBAAA;AAAA,IACT,OAAA,EAAS,+BAA+B,GAAG,CAAA,qCAAA;AAAA,GAC7C,CAAE,CAAA;AACJ;AAEA,SAAS,eAAe,KAAA,EAAqC;AAhL7D,EAAA,IAAAD,GAAAA;AAiLE,EAAA,IAAI,IAAA,GAAO,MAAM,YAAA,IAAgB,GAAA;AACjC,EAAA,IAAI,KAAA,CAAM,YAAY,sBAAA,KAAA,CAA2BA,GAAAA,GAAA,MAAM,MAAA,KAAN,IAAA,GAAA,MAAA,GAAAA,IAAsB,kBAAA,CAAA,EAAoB;AACzF,IAAA,MAAM,KAAA,GAAS,MAAM,MAAA,CAAe,kBAAA;AACpC,IAAA,IAAA,GAAO,CAAA,EAAG,KAAA,CAAM,YAAA,IAAgB,EAAE,CAAA,CAAA,EAAI,KAAK,CAAA,CAAA,CAAG,OAAA,CAAQ,MAAA,EAAQ,GAAG,CAAA,IAAK,GAAA;AAAA,EACxE;AAEA,EAAA,OAAO;AAAA,IACL,IAAA;AAAA,IACA,SAAS,KAAA,CAAM,OAAA;AAAA,IACf,OAAA,EAAS,MAAM,OAAA,IAAW;AAAA,GAC5B;AACF;AAEA,SAAS,gBAAA,CACP,IAAA,EACA,OAAA,EACA,OAAA,EACA,SAAA,EACmB;AACnB,EAAA,MAAM,YAAY,SAAA,GAAY,OAAA,CAAQ,GAAA,CAAI,SAAA,CAAU,SAAS,CAAA,GAAI,MAAA;AACjE,EAAA,MAAM,UAAA,GAAc,SAAA,IAAA,IAAA,GAAA,SAAA,GAA8C,YAAA,CAAa,OAAA,EAAS,OAAO,CAAA;AAE/F,EAAA,MAAM,OAAA,GAAU,WAAW,IAAI,CAAA;AAC/B,EAAA,OAAO,CAAC,WAAW,UAAA,CAAW,MAAA,GAAS,WAAW,MAAA,CAAO,GAAA,CAAI,cAAc,CAAA,GAAI,EAAC;AAClF;AAEA,SAAS,cAAc,IAAA,EAA0D;AAC/E,EAAA,OAAO,IAAA,IAAQ,OAAO,IAAA,KAAS,QAAA,IAAY,CAAC,KAAA,CAAM,OAAA,CAAQ,IAAI,CAAA,IAAK,MAAA,IAAU,IAAA;AAC/E;AAEA,SAAS,wBAAwB,IAAA,EAAqC;AACpE,EAAA,OAAO,IAAA,IAAQ,OAAO,IAAA,KAAS,QAAA,IAAY,CAAC,KAAA,CAAM,OAAA,CAAQ,IAAI,CAAA,IAAK,OAAA,IAAW,IAAA,IAAQ,YAAA,IAAgB,IAAA;AACxG;AAEO,SAAS,sBAAsB,MAAA,EAAmC;AACvE,EAAA,MAAM,eAAgB,MAAA,IAAA,IAAA,GAAA,MAAA,GAAA,MAAA,CAAgB,YAAA;AACtC,EAAA,IAAI,CAAC,KAAA,CAAM,OAAA,CAAQ,YAAY,CAAA,SAAU,EAAC;AAE1C,EAAA,MAAM,cAAA,uBAAqB,GAAA,EAAY;AACvC,EAAA,MAAM,iBAAoE,EAAC;AAE3E,EAAA,MAAM,OAAA,GAAU,CAAC,KAAA,EAAc,QAAA,KAAqB;AAClD,IAAA,KAAA,CAAM,OAAA,CAAQ,CAAC,IAAA,EAAM,KAAA,KAAU;AAC7B,MAAA,MAAM,WAAA,GAAc,CAAA,EAAG,QAAQ,CAAA,CAAA,EAAI,KAAK,CAAA,CAAA;AAExC,MAAA,IAAI,wBAAwB,IAAI,CAAA,IAAK,MAAM,OAAA,CAAQ,IAAA,CAAK,KAAK,CAAA,EAAG;AAC9D,QAAA,OAAA,CAAQ,IAAA,CAAK,KAAA,EAAO,CAAA,EAAG,WAAW,CAAA,MAAA,CAAQ,CAAA;AAC1C,QAAA;AAAA,MACF;AAEA,MAAA,IAAI,aAAA,CAAc,IAAI,CAAA,EAAG;AACvB,QAAA,MAAM,KAAK,OAAO,IAAA,CAAK,EAAA,KAAO,QAAA,GAAW,KAAK,EAAA,GAAK,MAAA;AACnD,QAAA,IAAI,EAAA,EAAI,cAAA,CAAe,GAAA,CAAI,EAAE,CAAA;AAE7B,QAAA,IAAI,KAAA,CAAM,OAAA,CAAQ,IAAA,CAAK,SAAS,CAAA,EAAG;AACjC,UAAA,IAAA,CAAK,SAAA,CAAU,OAAA,CAAQ,CAAC,KAAA,EAAO,QAAA,KAAa;AAC1C,YAAA,IAAI,OAAO,UAAU,QAAA,EAAU;AAC7B,cAAA,cAAA,CAAe,IAAA,CAAK;AAAA,gBAClB,MAAA,EAAQ,EAAA;AAAA,gBACR,IAAA,EAAM,KAAA;AAAA,gBACN,IAAA,EAAM,CAAA,EAAG,WAAW,CAAA,WAAA,EAAc,QAAQ,CAAA;AAAA,eAC3C,CAAA;AAAA,YACH;AAAA,UACF,CAAC,CAAA;AAAA,QACH;AAAA,MACF;AAAA,IACF,CAAC,CAAA;AAAA,EACH,CAAA;AAEA,EAAA,OAAA,CAAQ,cAAc,eAAe,CAAA;AAErC,EAAA,MAAM,SAA4B,EAAC;AAEnC,EAAA,cAAA,CAAe,OAAA,CAAQ,CAAC,GAAA,KAAQ;AAC9B,IAAA,IAAI,CAAC,cAAA,CAAe,GAAA,CAAI,GAAA,CAAI,IAAI,CAAA,EAAG;AACjC,MAAA,MAAA,CAAO,IAAA,CAAK;AAAA,QACV,MAAM,GAAA,CAAI,IAAA;AAAA,QACV,OAAA,EAAS,CAAA,8CAAA,EAAiD,GAAA,CAAI,IAAI,CAAA,EAAA;AAAA,OACnE,CAAA;AAAA,IACH;AAAA,EACF,CAAC,CAAA;AAED,EAAA,MAAM,SAAA,uBAAgB,GAAA,EAA8C;AACpE,EAAA,cAAA,CAAe,OAAA,CAAQ,CAAC,GAAA,KAAQ;AApQlC,IAAA,IAAAA,GAAAA;AAqQI,IAAA,IAAI,GAAA,CAAI,MAAA,IAAU,cAAA,CAAe,GAAA,CAAI,GAAA,CAAI,MAAM,CAAA,IAAK,cAAA,CAAe,GAAA,CAAI,GAAA,CAAI,IAAI,CAAA,EAAG;AAChF,MAAA,MAAM,IAAA,GAAA,CAAOA,MAAA,SAAA,CAAU,GAAA,CAAI,IAAI,MAAM,CAAA,KAAxB,IAAA,GAAAA,GAAAA,GAA6B,EAAC;AAC3C,MAAA,IAAA,CAAK,IAAA,CAAK,EAAE,IAAA,EAAM,GAAA,CAAI,MAAM,IAAA,EAAM,GAAA,CAAI,MAAM,CAAA;AAC5C,MAAA,SAAA,CAAU,GAAA,CAAI,GAAA,CAAI,MAAA,EAAQ,IAAI,CAAA;AAAA,IAChC;AAAA,EACF,CAAC,CAAA;AAED,EAAA,MAAM,QAAA,uBAAe,GAAA,EAAY;AACjC,EAAA,MAAM,OAAA,uBAAc,GAAA,EAAY;AAEhC,EAAA,MAAM,YAAA,GAAe,CAAC,MAAA,KAAmB;AA/Q3C,IAAA,IAAAA,GAAAA;AAgRI,IAAA,IAAI,QAAA,CAAS,GAAA,CAAI,MAAM,CAAA,EAAG;AAC1B,IAAA,IAAI,OAAA,CAAQ,GAAA,CAAI,MAAM,CAAA,EAAG;AAEzB,IAAA,QAAA,CAAS,IAAI,MAAM,CAAA;AACnB,IAAA,MAAM,SAAA,GAAA,CAAYA,MAAA,SAAA,CAAU,GAAA,CAAI,MAAM,CAAA,KAApB,IAAA,GAAAA,MAAyB,EAAC;AAC5C,IAAA,SAAA,CAAU,OAAA,CAAQ,CAAC,IAAA,KAAS;AAC1B,MAAA,IAAI,QAAA,CAAS,GAAA,CAAI,IAAA,CAAK,IAAI,CAAA,EAAG;AAC3B,QAAA,MAAA,CAAO,IAAA,CAAK;AAAA,UACV,MAAM,IAAA,CAAK,IAAA;AAAA,UACX,OAAA,EAAS,CAAA,uDAAA,EAA0D,IAAA,CAAK,IAAI,CAAA,EAAA;AAAA,SAC7E,CAAA;AACD,QAAA;AAAA,MACF;AACA,MAAA,YAAA,CAAa,KAAK,IAAI,CAAA;AAAA,IACxB,CAAC,CAAA;AACD,IAAA,QAAA,CAAS,OAAO,MAAM,CAAA;AACtB,IAAA,OAAA,CAAQ,IAAI,MAAM,CAAA;AAAA,EACpB,CAAA;AAEA,EAAA,cAAA,CAAe,OAAA,CAAQ,CAAC,EAAA,KAAO,YAAA,CAAa,EAAE,CAAC,CAAA;AAE/C,EAAA,OAAO,MAAA;AACT;AAEO,SAAS,cAAA,CAAe,KAAA,EAAY,OAAA,GAA2B,EAAC,EAAqB;AAxS5F,EAAA,IAAAA,KAAAC,GAAAA,EAAA,EAAA,EAAA,EAAA;AAySE,EAAA,MAAM,gBAAA,GAAA,CAAmBD,GAAAA,GAAA,OAAA,CAAQ,gBAAA,KAAR,OAAAA,GAAAA,GAA4B,IAAA;AACrD,EAAA,MAAM,OAAA,GAAU,WAAW,gBAAgB,CAAA;AAC3C,EAAA,MAAM,SAAA,GAAA,CAAYC,GAAAA,GAAA,OAAA,CAAQ,MAAA,KAAR,IAAA,GAAAA,GAAAA,GAAmB,QAAO,KAAA,IAAA,IAAA,GAAA,MAAA,GAAA,KAAA,CAAO,OAAA,CAAA,KAAY,QAAA,GAAW,KAAA,CAAM,OAAA,GAAU,MAAA;AAC1F,EAAA,MAAM,WACJ,EAAA,GAAA,CAAA,EAAA,GAAA,OAAA,CAAQ,OAAA,KAAR,YAAmB,uBAAA,CAAwB,SAAS,MAApD,IAAA,GAAA,EAAA,GAAyD,MAAA;AAE3D,EAAA,MAAM,EAAE,UAAA,EAAY,QAAA,EAAS,GAAI,gBAAgB,KAAe,CAAA;AAEhE,EAAA,MAAM,gBAAA,GAAmB,0BAA0B,UAAU,CAAA;AAC7D,EAAA,MAAM,gBAAA,GAAmB,gBAAA,CAAiB,UAAA,EAAY,OAAA,EAAS,SAAS,SAAS,CAAA;AACjF,EAAA,MAAM,WAAA,GACJ,YAAY,aAAA,IAAiB,gBAAA,CAAiB,WAAW,CAAA,GAAI,qBAAA,CAAsB,UAAU,CAAA,GAAI,EAAC;AACpG,EAAA,MAAM,SAAS,CAAC,GAAG,kBAAkB,GAAG,gBAAA,EAAkB,GAAG,WAAW,CAAA;AAExE,EAAA,OAAO;AAAA,IACL,KAAA,EAAO,OAAO,MAAA,KAAW,CAAA;AAAA,IACzB,MAAA;AAAA,IACA,QAAA;AAAA,IACA,UAAA,EAAY,MAAA,CAAO,MAAA,KAAW,CAAA,GAAI,UAAA,GAAa;AAAA,GACjD;AACF;AAMO,SAAS,eAAe,MAAA,EAA4B;AAnU3D,EAAA,IAAAD,GAAAA;AAoUE,EAAA,MAAM,MAAA,GAAS,eAAe,MAAA,EAAQ,EAAE,SAAS,MAAA,EAAQ,gBAAA,EAAkB,OAAO,CAAA;AAClF,EAAA,IAAI,CAAC,MAAA,CAAO,KAAA,EAAO,OAAO,EAAC;AAE3B,EAAA,MAAM,gBAAA,GAAA,CAAmBA,GAAAA,GAAA,MAAA,CAAO,UAAA,KAAP,OAAAA,GAAAA,GAAqB,MAAA;AAC9C,EAAA,MAAM,QAAA,GAA0B,CAAC,MAAM,CAAA;AACvC,EAAA,MAAM,OAAA,GAAU,WAAW,KAAK,CAAA;AAEhC,EAAC,OAAO,IAAA,CAAK,cAAc,CAAA,CAAoB,OAAA,CAAQ,CAAC,OAAA,KAAY;AAClE,IAAA,IAAI,YAAY,MAAA,EAAQ;AACxB,IAAA,IAAI,CAAC,cAAA,CAAe,OAAO,CAAA,EAAG;AAC9B,IAAA,MAAM,MAAA,GAAS,gBAAA,CAAiB,gBAAA,EAAkB,OAAA,EAAS,OAAO,CAAA;AAClE,IAAA,IAAI,MAAA,CAAO,WAAW,CAAA,EAAG;AACvB,MAAA,QAAA,CAAS,KAAK,OAAO,CAAA;AAAA,IACvB;AAAA,EACF,CAAC,CAAA;AAED,EAAA,OAAO,QAAA;AACT;;;ACnVO,SAAS,WAAW,KAAA,EAAmC;AAC5D,EAAA,IAAI,KAAA,KAAU,MAAA,IAAa,KAAA,KAAU,IAAA,EAAM;AACzC,IAAA,OAAO,MAAA;AAAA,EACT;AAEA,EAAA,IAAI,OAAO,UAAU,QAAA,EAAU;AAC7B,IAAA,OAAO;AAAA,MACL,MAAA,EAAQ,KAAA;AAAA,MACR,IAAA,EAAM;AAAA,KACR;AAAA,EACF;AAEA,EAAA,IAAI,KAAA,CAAM,OAAA,CAAQ,KAAK,CAAA,EAAG;AACxB,IAAA,OAAO,UAAA,CAAW,KAAA,CAAM,CAAC,CAAC,CAAA;AAAA,EAC5B;AAEA,EAAA,IAAI,OAAO,UAAU,QAAA,EAAU;AAC7B,IAAA,MAAM,UAAA,GAAa,KAAA;AACnB,IAAA,IAAI,OAAO,UAAA,CAAW,MAAA,KAAW,QAAA,EAAU;AACzC,MAAA,OAAO;AAAA,QACL,QAAQ,UAAA,CAAW,MAAA;AAAA,QACnB,MAAM,OAAO,UAAA,CAAW,IAAA,KAAS,QAAA,GAAW,WAAW,IAAA,GAAO,UAAA;AAAA,QAC9D,aACE,OAAO,UAAA,CAAW,WAAA,KAAgB,QAAA,GAC9B,WAAW,WAAA,GACX;AAAA,OACR;AAAA,IACF;AAAA,EACF;AAEA,EAAA,IAAI,OAAO,UAAU,QAAA,EAAU;AAC7B,IAAA,MAAM,OAAA,GAAU,MAAM,IAAA,EAAK;AAC3B,IAAA,MAAM,KAAA,GAAQ,OAAA,CAAQ,KAAA,CAAM,iBAAiB,CAAA;AAC7C,IAAA,IAAI,KAAA,EAAO;AACT,MAAA,MAAM,MAAA,GAAS,UAAA,CAAW,KAAA,CAAM,CAAC,CAAC,CAAA;AAClC,MAAA,MAAM,IAAA,GAAO,OAAA,CAAQ,KAAA,CAAM,KAAA,CAAM,KAAA,GAAS,MAAM,CAAC,CAAA,CAAE,MAAM,CAAA,CAAE,IAAA,EAAK;AAChE,MAAA,OAAO;AAAA,QACL,MAAA;AAAA,QACA,MAAM,IAAA,IAAQ,UAAA;AAAA,QACd,WAAA,EAAa;AAAA,OACf;AAAA,IACF;AAAA,EACF;AAEA,EAAA,OAAO,MAAA;AACT;AAEO,SAAS,YAAY,UAAA,EAAwC;AAjDpE,EAAA,IAAAA,GAAAA;AAkDE,EAAA,IAAI,CAAC,YAAY,OAAO,MAAA;AACxB,EAAA,IAAI,CAAC,UAAA,CAAW,MAAA,IAAU,CAAC,WAAW,IAAA,EAAM;AAC1C,IAAA,OAAO,MAAA;AAAA,EACT;AAEA,EAAA,MAAM,MAAA,GAAA,CAASA,GAAAA,GAAA,UAAA,CAAW,MAAA,KAAX,OAAAA,GAAAA,GAAqB,EAAA;AACpC,EAAA,MAAM,OAAO,UAAA,CAAW,IAAA,GAAO,CAAA,CAAA,EAAI,UAAA,CAAW,IAAI,CAAA,CAAA,GAAK,EAAA;AACvD,EAAA,OAAO,GAAG,MAAM,CAAA,EAAG,IAAI,CAAA,CAAA,CAAG,IAAA,MAAU,UAAA,CAAW,WAAA;AACjD;;;AClDO,SAAS,eACd,KAAA,EAC+B;AAC/B,EAAA,IAAI,CAAC,KAAA,EAAO;AACV,IAAA,OAAO,MAAA;AAAA,EACT;AAEA,EAAA,IAAI,OAAO,UAAU,QAAA,EAAU;AAC7B,IAAA,MAAM,OAAA,GAAU,MAAM,IAAA,EAAK;AAC3B,IAAA,OAAO,OAAA,IAAW,MAAA;AAAA,EACpB;AAEA,EAAA,IAAI,KAAA,CAAM,OAAA,CAAQ,KAAK,CAAA,EAAG;AACxB,IAAA,MAAM,IAAA,GAAO,MACV,GAAA,CAAI,CAAA,KAAA,KAAU,OAAO,KAAA,KAAU,QAAA,GAAW,KAAA,CAAM,IAAA,EAAK,GAAI,UAAA,CAAW,KAAK,CAAE,CAAA,CAC3E,OAAO,CAAC,GAAA,KAAuB,OAAO,GAAA,KAAQ,QAAA,IAAY,OAAA,CAAQ,GAAG,CAAC,CAAA;AAEzE,IAAA,IAAI,IAAA,CAAK,WAAW,CAAA,EAAG;AACrB,MAAA,OAAO,MAAA;AAAA,IACT;AACA,IAAA,IAAI,IAAA,CAAK,WAAW,CAAA,EAAG;AACrB,MAAA,OAAO,KAAK,CAAC,CAAA;AAAA,IACf;AACA,IAAA,OAAO,IAAA;AAAA,EACT;AAEA,EAAA,OAAO,WAAW,KAAK,CAAA;AACzB;AAEA,SAAS,WACP,KAAA,EACoB;AACpB,EAAA,IAAI,CAAC,KAAA,IAAS,OAAO,KAAA,KAAU,QAAA,EAAU;AACvC,IAAA,OAAO,MAAA;AAAA,EACT;AAEA,EAAA,MAAM,MAAA,GAAS,KAAA;AACf,EAAA,MAAM,SAAA,GACJ,OAAO,MAAA,CAAO,GAAA,KAAQ,QAAA,GAClB,MAAA,CAAO,GAAA,GACP,OAAO,MAAA,CAAO,UAAA,KAAe,QAAA,GAC3B,MAAA,CAAO,UAAA,GACP,MAAA;AAER,EAAA,IAAI,CAAC,SAAA,EAAW;AACd,IAAA,OAAO,MAAA;AAAA,EACT;AAEA,EAAA,MAAM,OAAA,GAAU,UAAU,IAAA,EAAK;AAC/B,EAAA,OAAO,OAAA,IAAW,MAAA;AACpB;;;ACvCO,SAAS,cAAc,KAAA,EAA+B;AAnB7D,EAAA,IAAAA,GAAAA;AAoBE,EAAA,MAAM,UAAA,GAAa,kBAAkB,KAAK,CAAA;AAC1C,EAAA,IAAI,CAAC,UAAA,EAAY;AACf,IAAA,OAAO,IAAA;AAAA,EACT;AAEA,EAAA,MAAM,WAAA,GAAc,kBAAA,CAAmB,UAAA,CAAW,gBAAgB,CAAA;AAClE,EAAA,MAAM,YAAA,GAAe,mBAAA,CAAoB,UAAA,CAAW,kBAAkB,CAAA;AACtE,EAAA,MAAM,IAAA,GAAO,YAAY,UAAU,CAAA;AACnC,EAAA,MAAM,WAAA,GAAc,UAAA,CAAW,UAAA,CAAW,WAAW,CAAA;AACrD,EAAA,MAAM,IAAA,GAAO,WAAA,CAAY,UAAA,CAAW,aAAA,EAAe,WAAW,QAAQ,CAAA;AACtE,EAAA,MAAM,QAAA,GAAW,YAAA,CAAa,UAAA,CAAW,cAAc,CAAA;AACvD,EAAA,MAAM,MAAA,GAAS,cAAc,UAAU,CAAA;AACvC,EAAA,MAAM,SAAA,GACJ,WAAW,SAAA,IAAa,OAAO,WAAW,SAAA,KAAc,QAAA,GACpD,WAAW,SAAA,GACX,MAAA;AAEN,EAAA,OAAO;AAAA,IACL,IAAA,EAAM,UAAA,CAAW,IAAA,CAAK,IAAA,EAAK;AAAA,IAC3B,eAAaA,GAAAA,GAAA,UAAA,CAAW,WAAA,KAAX,IAAA,GAAA,MAAA,GAAAA,IAAwB,IAAA,EAAA,KAAU,MAAA;AAAA,IAC/C,KAAA,EAAO,cAAA,CAAe,UAAA,CAAW,KAAK,CAAA;AAAA,IACtC,QAAA;AAAA,IACA,IAAA,EAAM,IAAA,CAAK,MAAA,GAAS,IAAA,GAAO,MAAA;AAAA,IAC3B,MAAA;AAAA,IACA,SAAA,EAAW,WAAW,aAAA,IAAiB,MAAA;AAAA,IACvC,YAAA,EAAc,WAAW,YAAA,IAAgB,MAAA;AAAA,IACzC,KAAA,EAAO,WAAA;AAAA,IACP,IAAA;AAAA,IACA,WAAA;AAAA,IACA,YAAA;AAAA,IACA;AAAA,GACF;AACF;AAEA,SAAS,kBAAkB,KAAA,EAAwC;AACjE,EAAA,IAAI,CAAC,OAAO,OAAO,IAAA;AAEnB,EAAA,IAAI,KAAA,CAAM,OAAA,CAAQ,KAAK,CAAA,EAAG;AACxB,IAAA,KAAA,MAAW,SAAS,KAAA,EAAO;AACzB,MAAA,MAAM,KAAA,GAAQ,kBAAkB,KAAK,CAAA;AACrC,MAAA,IAAI,KAAA,EAAO;AACT,QAAA,OAAO,KAAA;AAAA,MACT;AAAA,IACF;AACA,IAAA,OAAO,IAAA;AAAA,EACT;AAEA,EAAA,IAAI,OAAO,UAAU,QAAA,EAAU;AAC7B,IAAA,OAAO,IAAA;AAAA,EACT;AAEA,EAAA,MAAM,MAAA,GAAS,KAAA;AAEf,EAAA,IAAI,MAAA,CAAO,QAAQ,CAAA,EAAG;AACpB,IAAA,MAAM,SAAA,GAAY,iBAAA,CAAkB,MAAA,CAAO,QAAQ,CAAC,CAAA;AACpD,IAAA,IAAI,SAAA,EAAW;AACb,MAAA,OAAO,SAAA;AAAA,IACT;AAAA,EACF;AAEA,EAAA,IAAI,CAAC,aAAA,CAAc,MAAA,CAAO,OAAO,CAAC,CAAA,EAAG;AACnC,IAAA,OAAO,IAAA;AAAA,EACT;AAEA,EAAA,IAAI,CAAC,WAAA,CAAY,MAAA,CAAO,IAAI,CAAA,EAAG;AAC7B,IAAA,OAAO,IAAA;AAAA,EACT;AAEA,EAAA,OAAO,MAAA;AACT;AAEA,SAAS,cAAc,KAAA,EAA0C;AAC/D,EAAA,IAAI,CAAC,OAAO,OAAO,KAAA;AACnB,EAAA,MAAM,QAAQ,KAAA,CAAM,OAAA,CAAQ,KAAK,CAAA,GAAI,KAAA,GAAQ,CAAC,KAAK,CAAA;AACnD,EAAA,OAAO,KAAA,CAAM,IAAA;AAAA,IACX,WAAS,OAAO,KAAA,KAAU,QAAA,IAAY,KAAA,CAAM,aAAY,KAAM;AAAA,GAChE;AACF;AAEA,SAAS,YAAY,IAAA,EAA+B;AAClD,EAAA,OAAO,OAAO,IAAA,KAAS,QAAA,IAAY,OAAA,CAAQ,IAAA,CAAK,MAAM,CAAA;AACxD;AAEA,SAAS,mBACP,KAAA,EACkB;AAClB,EAAA,IAAI,CAAC,KAAA,EAAO,OAAO,EAAC;AACpB,EAAA,MAAM,aAAa,KAAA,CAAM,OAAA,CAAQ,KAAK,CAAA,GAAI,KAAA,GAAQ,CAAC,KAAK,CAAA;AACxD,EAAA,OAAO,UAAA,CACJ,GAAA,CAAI,CAAA,IAAA,KAAS,OAAO,IAAA,KAAS,QAAA,GAAW,IAAA,CAAK,IAAA,EAAK,GAAI,EAAG,CAAA,CACzD,MAAA,CAAO,OAAO,CAAA;AACnB;AAEA,SAAS,oBACP,KAAA,EACmB;AAnHrB,EAAA,IAAAA,GAAAA;AAoHE,EAAA,IAAI,CAAC,KAAA,EAAO,OAAO,EAAC;AACpB,EAAA,MAAM,aAAa,KAAA,CAAM,OAAA,CAAQ,KAAK,CAAA,GAAI,KAAA,GAAQ,CAAC,KAAK,CAAA;AACxD,EAAA,MAAM,SAA4B,EAAC;AAEnC,EAAA,KAAA,MAAW,SAAS,UAAA,EAAY;AAC9B,IAAA,IAAI,CAAC,KAAA,EAAO;AAEZ,IAAA,IAAI,OAAO,UAAU,QAAA,EAAU;AAC7B,MAAA,MAAM,IAAA,GAAO,MAAM,IAAA,EAAK;AACxB,MAAA,IAAI,IAAA,EAAM;AACR,QAAA,MAAA,CAAO,KAAK,IAAI,CAAA;AAAA,MAClB;AACA,MAAA;AAAA,IACF;AAEA,IAAA,IAAI,cAAA,CAAe,KAAK,CAAA,EAAG;AACzB,MAAA,MAAM,eAAA,GAAkB,mBAAA,CAAoB,KAAA,CAAM,eAAe,CAAA;AACjE,MAAA,IAAI,gBAAgB,MAAA,EAAQ;AAC1B,QAAA,MAAA,CAAO,IAAA,CAAK;AAAA,UACV,cAAYA,GAAAA,GAAA,KAAA,CAAM,IAAA,KAAN,IAAA,GAAA,MAAA,GAAAA,IAAY,IAAA,EAAA,KAAU,SAAA;AAAA,UAClC,KAAA,EAAO;AAAA,SACR,CAAA;AAAA,MACH;AACA,MAAA;AAAA,IACF;AAEA,IAAA,IAAI,WAAA,CAAY,KAAK,CAAA,EAAG;AACtB,MAAA,MAAM,MAAA,GAAS,iBAAiB,KAAK,CAAA;AACrC,MAAA,IAAI,MAAA,EAAQ;AACV,QAAA,MAAA,CAAO,KAAK,MAAM,CAAA;AAAA,MACpB;AAAA,IACF;AAAA,EACF;AAEA,EAAA,OAAO,MAAA;AACT;AAEA,SAAS,mBAAA,CACP,KAAA,GAAkD,EAAC,EACtB;AAC7B,EAAA,MAAM,SAAsC,EAAC;AAE7C,EAAA,KAAA,MAAW,QAAQ,KAAA,EAAO;AACxB,IAAA,IAAI,CAAC,IAAA,EAAM;AAEX,IAAA,IAAI,OAAO,SAAS,QAAA,EAAU;AAC5B,MAAA,MAAM,IAAA,GAAO,KAAK,IAAA,EAAK;AACvB,MAAA,IAAI,IAAA,EAAM;AACR,QAAA,MAAA,CAAO,KAAK,IAAI,CAAA;AAAA,MAClB;AACA,MAAA;AAAA,IACF;AAEA,IAAA,IAAI,WAAA,CAAY,IAAI,CAAA,EAAG;AACrB,MAAA,MAAM,MAAA,GAAS,iBAAiB,IAAI,CAAA;AACpC,MAAA,IAAI,MAAA,EAAQ;AACV,QAAA,MAAA,CAAO,KAAK,MAAM,CAAA;AAAA,MACpB;AACA,MAAA;AAAA,IACF;AAEA,IAAA,IAAI,cAAA,CAAe,IAAI,CAAA,EAAG;AACxB,MAAA,MAAA,CAAO,IAAA,CAAK,GAAG,mBAAA,CAAoB,IAAA,CAAK,eAAe,CAAC,CAAA;AAAA,IAC1D;AAAA,EACF;AAEA,EAAA,OAAO,MAAA;AACT;AAEA,SAAS,uBAAuB,KAAA,EAAsC;AACpE,EAAA,MAAM,OAAO,OAAO,KAAA,CAAM,SAAS,QAAA,GAAW,KAAA,CAAM,OAAO,KAAA,CAAM,IAAA;AACjE,EAAA,OAAO,OAAO,IAAA,KAAS,QAAA,GAAW,IAAA,CAAK,IAAA,MAAU,MAAA,GAAY,MAAA;AAC/D;AAEA,SAAS,iBAAiB,IAAA,EAAmD;AAC3E,EAAA,MAAM,IAAA,GAAO,uBAAuB,IAAI,CAAA;AACxC,EAAA,IAAI,CAAC,IAAA,EAAM;AACT,IAAA,OAAO,MAAA;AAAA,EACT;AAEA,EAAA,MAAM,eAAA,GAAkB,cAAA,CAAe,IAAA,CAAK,KAAK,CAAA;AACjD,EAAA,MAAM,QAAQ,KAAA,CAAM,OAAA,CAAQ,eAAe,CAAA,GACvC,eAAA,CAAgB,CAAC,CAAA,GACjB,eAAA;AACJ,EAAA,MAAM,EAAA,GAAK,qBAAqB,IAAI,CAAA;AACpC,EAAA,MAAM,MAAA,GAAS,yBAAyB,IAAI,CAAA;AAE5C,EAAA,IAAI,CAAC,KAAA,IAAS,CAAC,EAAA,IAAM,CAAC,MAAA,EAAQ;AAC5B,IAAA,OAAO,IAAA;AAAA,EACT;AAEA,EAAA,MAAM,WAAA,GAA2B,EAAE,IAAA,EAAK;AACxC,EAAA,IAAI,EAAA,cAAgB,EAAA,GAAK,EAAA;AACzB,EAAA,IAAI,KAAA,cAAmB,KAAA,GAAQ,KAAA;AAC/B,EAAA,IAAI,MAAA,cAAoB,MAAA,GAAS,MAAA;AAEjC,EAAA,OAAO,WAAA;AACT;AAEA,SAAS,yBAAyB,IAAA,EAAyC;AACzE,EAAA,MAAM,WACJ,IAAA,CAAK,SAAA,IAAa,KAAK,WAAA,IAAe,IAAA,CAAK,YAAa,IAAA,CAAa,QAAA;AAEvE,EAAA,IAAI,CAAC,QAAA,IAAY,OAAO,QAAA,KAAa,QAAA,EAAU;AAC7C,IAAA,OAAO,MAAA;AAAA,EACT;AAEA,EAAA,MAAM,MAAA,GAAS,mBAAmB,QAAQ,CAAA;AAC1C,EAAA,OAAO,EAAE,QAAA,EAAU,MAAA,IAAA,IAAA,GAAA,MAAA,GAAU,QAAA,EAAU,MAAM,QAAA,EAAS;AACxD;AAEA,SAAS,qBAAqB,IAAA,EAAqC;AACjE,EAAA,MAAM,MAAO,IAAA,CAAa,KAAK,CAAA,IAAM,IAAA,CAAa,MAAM,IAAA,CAAK,GAAA;AAC7D,EAAA,IAAI,OAAO,QAAQ,QAAA,EAAU;AAC3B,IAAA,OAAO,MAAA;AAAA,EACT;AACA,EAAA,MAAM,OAAA,GAAU,IAAI,IAAA,EAAK;AACzB,EAAA,OAAO,OAAA,IAAW,MAAA;AACpB;AAEA,SAAS,YAAY,KAAA,EAAoC;AACvD,EAAA,OACE,OAAA,CAAQ,KAAK,CAAA,IACb,OAAO,UAAU,QAAA,IAChB,KAAA,CAAoB,OAAO,CAAA,KAAM,WAAA;AAEtC;AAEA,SAAS,eAAe,KAAA,EAAuC;AAC7D,EAAA,OACE,OAAA,CAAQ,KAAK,CAAA,IACb,OAAO,KAAA,KAAU,QAAA,IAChB,KAAA,CAAuB,OAAO,CAAA,KAAM,cAAA,IACrC,KAAA,CAAM,OAAA,CAAS,MAAuB,eAAe,CAAA;AAEzD;AAEA,SAAS,YAAY,MAAA,EAAqD;AA7P1E,EAAA,IAAAA,KAAAC,GAAAA,EAAA,EAAA;AA8PE,EAAA,MAAM,OAAO,kBAAA,CAAA,CAAmBD,GAAAA,GAAA,OAAO,QAAA,KAAP,IAAA,GAAAA,MAAmB,EAAE,CAAA;AACrD,EAAA,MAAM,OAAO,kBAAA,CAAA,CAAmBC,GAAAA,GAAA,OAAO,QAAA,KAAP,IAAA,GAAAA,MAAmB,EAAE,CAAA;AACrD,EAAA,MAAM,KAAA,GAAQ,kBAAA,CAAA,CAAmB,EAAA,GAAA,MAAA,CAAO,SAAA,KAAP,YAAoB,EAAE,CAAA;AAEvD,EAAA,MAAM,aAA6B,EAAC;AACpC,EAAA,IAAI,IAAA,KAAS,IAAA,IAAQ,IAAA,KAAS,MAAA,aAAsB,IAAA,GAAO,IAAA;AAC3D,EAAA,IAAI,IAAA,KAAS,IAAA,IAAQ,IAAA,KAAS,MAAA,aAAsB,MAAA,GAAS,IAAA;AAC7D,EAAA,IAAI,KAAA,KAAU,IAAA,IAAQ,KAAA,KAAU,MAAA,aAAsB,KAAA,GAAQ,KAAA;AAE9D,EAAA,OAAO,MAAA,CAAO,IAAA,CAAK,UAAU,CAAA,CAAE,SAAS,UAAA,GAAa,MAAA;AACvD;AAEA,SAAS,WAAA,CAAY,SAAkB,QAAA,EAA6B;AAClE,EAAA,MAAM,IAAA,uBAAW,GAAA,EAAY;AAC7B,EAAA,cAAA,CAAe,OAAO,CAAA,CAAE,OAAA,CAAQ,SAAO,IAAA,CAAK,GAAA,CAAI,GAAG,CAAC,CAAA;AACpD,EAAA,IAAI,OAAO,aAAa,QAAA,EAAU;AAChC,IAAA,aAAA,CAAc,QAAQ,CAAA,CAAE,OAAA,CAAQ,SAAO,IAAA,CAAK,GAAA,CAAI,GAAG,CAAC,CAAA;AAAA,EACtD,CAAA,MAAO;AACL,IAAA,cAAA,CAAe,QAAQ,CAAA,CAAE,OAAA,CAAQ,SAAO,IAAA,CAAK,GAAA,CAAI,GAAG,CAAC,CAAA;AAAA,EACvD;AACA,EAAA,OAAO,KAAA,CAAM,KAAK,IAAI,CAAA;AACxB;AAEA,SAAS,cAAc,KAAA,EAAyB;AAC9C,EAAA,OAAO,KAAA,CACJ,KAAA,CAAM,MAAM,CAAA,CACZ,GAAA,CAAI,CAAA,IAAA,KAAQ,IAAA,CAAK,IAAA,EAAM,CAAA,CACvB,MAAA,CAAO,OAAO,CAAA;AACnB;AAEA,SAAS,eAAe,KAAA,EAA0B;AAChD,EAAA,IAAI,CAAC,KAAA,EAAO,OAAO,EAAC;AACpB,EAAA,IAAI,OAAO,KAAA,KAAU,QAAA,EAAU,OAAO,CAAC,MAAM,IAAA,EAAM,CAAA,CAAE,MAAA,CAAO,OAAO,CAAA;AACnE,EAAA,IAAI,KAAA,CAAM,OAAA,CAAQ,KAAK,CAAA,EAAG;AACxB,IAAA,OAAO,KAAA,CACJ,GAAA,CAAI,CAAA,IAAA,KAAS,OAAO,IAAA,KAAS,QAAA,GAAW,IAAA,CAAK,IAAA,EAAK,GAAI,EAAG,CAAA,CACzD,MAAA,CAAO,OAAO,CAAA;AAAA,EACnB;AACA,EAAA,OAAO,EAAC;AACV;AAEA,SAAS,aAAa,KAAA,EAAoC;AACxD,EAAA,MAAM,GAAA,GAAM,eAAe,KAAK,CAAA;AAChC,EAAA,OAAO,GAAA,CAAI,MAAA,GAAS,GAAA,CAAI,CAAC,CAAA,GAAI,MAAA;AAC/B;AAEA,SAAS,cAAc,MAAA,EAA6C;AA5SpE,EAAA,IAAAD,GAAAA;AA6SE,EAAA,MAAM,MAAA,GAAS,iBAAA,CAAkB,MAAA,CAAO,MAAM,CAAA;AAC9C,EAAA,MAAM,SAAA,GAAY,iBAAA,CAAkB,MAAA,CAAO,SAAS,CAAA;AACpD,EAAA,MAAM,OAAOA,GAAAA,GAAA,MAAA,CAAO,OAAO,MAAA,CAAO,gBAAA,KAArB,gBAAAA,GAAAA,CAAwC,IAAA,EAAA;AAErD,EAAA,MAAM,SAAiB,EAAC;AACxB,EAAA,IAAI,MAAA,SAAe,MAAA,GAAS,MAAA;AAC5B,EAAA,IAAI,SAAA,SAAkB,IAAA,GAAO,SAAA;AAC7B,EAAA,IAAI,GAAA,SAAY,GAAA,GAAM,GAAA;AAEtB,EAAA,OAAO,MAAA,CAAO,IAAA,CAAK,MAAM,CAAA,CAAE,SAAS,MAAA,GAAS,MAAA;AAC/C;AAEA,SAAS,kBACP,KAAA,EAMoB;AACpB,EAAA,IAAI,CAAC,OAAO,OAAO,MAAA;AAEnB,EAAA,IAAI,OAAO,UAAU,QAAA,EAAU;AAC7B,IAAA,MAAM,OAAA,GAAU,MAAM,IAAA,EAAK;AAC3B,IAAA,OAAO,OAAA,IAAW,MAAA;AAAA,EACpB;AAEA,EAAA,IAAI,KAAA,CAAM,OAAA,CAAQ,KAAK,CAAA,EAAG;AACxB,IAAA,KAAA,MAAW,SAAS,KAAA,EAAO;AACzB,MAAA,MAAM,IAAA,GAAO,kBAAkB,KAAY,CAAA;AAC3C,MAAA,IAAI,IAAA,EAAM;AACR,QAAA,OAAO,IAAA;AAAA,MACT;AAAA,IACF;AACA,IAAA,OAAO,MAAA;AAAA,EACT;AAEA,EAAA,IAAI,OAAO,KAAA,KAAU,QAAA,IAAY,OAAO,KAAA,CAAM,SAAS,QAAA,EAAU;AAC/D,IAAA,MAAM,OAAA,GAAU,KAAA,CAAM,IAAA,CAAK,IAAA,EAAK;AAChC,IAAA,OAAO,OAAA,IAAW,MAAA;AAAA,EACpB;AAEA,EAAA,OAAO,MAAA;AACT;;;ACvUO,SAAS,qBAAqB,MAAA,EAA0C;AAjB/E,EAAA,IAAAA,GAAAA;AAkBE,EAAA,OAAO,WAAA,CAAY;AAAA,IACjB,UAAA,EAAY,oBAAA;AAAA,IACZ,OAAA,EAAS,QAAA;AAAA,IACT,MAAM,MAAA,CAAO,IAAA;AAAA,IACb,aAAa,MAAA,CAAO,WAAA;AAAA,IACpB,OAAO,MAAA,CAAO,KAAA;AAAA,IACd,GAAA,EAAA,CAAKA,GAAAA,GAAA,MAAA,CAAO,MAAA,KAAP,gBAAAA,GAAAA,CAAe,GAAA;AAAA,IACpB,eAAe,MAAA,CAAO,SAAA;AAAA,IACtB,cAAc,MAAA,CAAO;AAAA,GACtB,CAAA;AACH;AAEO,SAASE,mBAAAA,CAAmB,WAAA,GAAgC,EAAC,EAAa;AAC/E,EAAA,MAAM,SAAmB,EAAC;AAE1B,EAAA,WAAA,CAAY,QAAQ,CAAA,UAAA,KAAc;AAjCpC,IAAA,IAAAF,GAAAA;AAkCI,IAAA,IAAI,CAAC,UAAA,EAAY;AACf,MAAA;AAAA,IACF;AAEA,IAAA,IAAI,OAAO,eAAe,QAAA,EAAU;AAClC,MAAA,MAAMG,MAAAA,GAAQ,WAAW,IAAA,EAAK;AAC9B,MAAA,IAAIA,MAAAA,EAAO;AACT,QAAA,MAAA,CAAO,KAAKA,MAAK,CAAA;AAAA,MACnB;AACA,MAAA;AAAA,IACF;AAEA,IAAA,IAAI,gBAAgB,UAAA,EAAY;AAC9B,MAAA,UAAA,CAAW,KAAA,CAAM,QAAQ,CAAA,IAAA,KAAQ;AAC/B,QAAA,IAAI,CAAC,IAAA,EAAM;AACT,UAAA;AAAA,QACF;AACA,QAAA,IAAI,OAAO,SAAS,QAAA,EAAU;AAC5B,UAAA,MAAMA,MAAAA,GAAQ,KAAK,IAAA,EAAK;AACxB,UAAA,IAAIA,MAAAA,EAAO;AACT,YAAA,MAAA,CAAO,KAAKA,MAAK,CAAA;AAAA,UACnB;AAAA,QACF,CAAA,MAAA,IAAW,KAAK,IAAA,EAAM;AACpB,UAAA,MAAMA,MAAAA,GAAQ,IAAA,CAAK,IAAA,CAAK,IAAA,EAAK;AAC7B,UAAA,IAAIA,MAAAA,EAAO;AACT,YAAA,MAAA,CAAO,KAAKA,MAAK,CAAA;AAAA,UACnB;AAAA,QACF;AAAA,MACF,CAAC,CAAA;AACD,MAAA;AAAA,IACF;AAEA,IAAA,MAAM,KAAA,GAAA,CAAQH,GAAAA,GAAA,UAAA,CAAW,IAAA,KAAX,gBAAAA,GAAAA,CAAiB,IAAA,EAAA;AAC/B,IAAA,IAAI,KAAA,EAAO;AACT,MAAA,MAAA,CAAO,KAAK,KAAK,CAAA;AAAA,IACnB;AAAA,EACF,CAAC,CAAA;AAED,EAAA,OAAO,MAAA;AACT;AAEO,SAASI,oBAAAA,CACd,YAAA,GAAkC,EAAC,EACX;AACxB,EAAA,OAAO,YAAA,CACJ,GAAA,CAAI,CAAA,KAAA,KAAS,kBAAA,CAAmB,KAAK,CAAC,CAAA,CACtC,MAAA,CAAO,CAAC,KAAA,KAAyC,OAAA,CAAQ,KAAK,CAAC,CAAA;AACpE;AAEA,SAAS,mBAAmB,KAAA,EAAqD;AAC/E,EAAA,IAAI,CAAC,KAAA,EAAO;AACV,IAAA,OAAO,IAAA;AAAA,EACT;AAEA,EAAA,IAAI,OAAO,UAAU,QAAA,EAAU;AAC7B,IAAA,MAAM,KAAA,GAAQ,MAAM,IAAA,EAAK;AACzB,IAAA,OAAO,KAAA,IAAS,IAAA;AAAA,EAClB;AAEA,EAAA,IAAI,gBAAgB,KAAA,EAAO;AACzB,IAAA,MAAM,KAAA,GAAQ,KAAA,CAAM,KAAA,CACjB,GAAA,CAAI,UAAQ,kBAAA,CAAmB,IAAI,CAAC,CAAA,CACpC,MAAA,CAAO,CAAC,IAAA,KAAuC,OAAA,CAAQ,IAAI,CAAC,CAAA;AAE/D,IAAA,IAAI,CAAC,MAAM,MAAA,EAAQ;AACjB,MAAA,OAAO,IAAA;AAAA,IACT;AAEA,IAAA,OAAO;AAAA,MACL,OAAA,EAAS,cAAA;AAAA,MACT,MAAM,KAAA,CAAM,UAAA;AAAA,MACZ,eAAA,EAAiB;AAAA,KACnB;AAAA,EACF;AAEA,EAAA,IAAI,UAAU,KAAA,EAAO;AACnB,IAAA,OAAO,gBAAgB,KAAK,CAAA;AAAA,EAC9B;AAEA,EAAA,OAAO,eAAA,CAAgB,MAAA,CAAO,KAAK,CAAC,CAAA;AACtC;AAEA,SAAS,gBACP,KAAA,EAC6B;AAtH/B,EAAA,IAAAJ,GAAAA;AAuHE,EAAA,IAAI,CAAC,OAAO,OAAO,IAAA;AAEnB,EAAA,IAAI,OAAO,UAAU,QAAA,EAAU;AAC7B,IAAA,MAAMK,QAAAA,GAAU,MAAM,IAAA,EAAK;AAC3B,IAAA,OAAOA,QAAAA,IAAW,IAAA;AAAA,EACpB;AAEA,EAAA,MAAM,OAAA,GAAA,CAAUL,GAAAA,GAAA,KAAA,CAAM,IAAA,KAAN,gBAAAA,GAAAA,CAAY,IAAA,EAAA;AAC5B,EAAA,IAAI,CAAC,OAAA,EAAS;AACZ,IAAA,OAAO,IAAA;AAAA,EACT;AAEA,EAAA,MAAM,IAAA,GAAkB;AAAA,IACtB,OAAA,EAAS,WAAA;AAAA,IACT,IAAA,EAAM;AAAA,GACR;AAEA,EAAA,IAAI,MAAM,EAAA,EAAI;AACZ,IAAA,IAAA,CAAK,KAAK,IAAI,KAAA,CAAM,EAAA;AAAA,EACtB;AAEA,EAAA,IAAI,MAAM,MAAA,EAAQ;AAChB,IAAA,IAAI,OAAO,KAAA,CAAM,MAAA,CAAO,QAAA,KAAa,QAAA,EAAU;AAC7C,MAAA,IAAA,CAAK,WAAA,GAAc,cAAA,CAAe,KAAA,CAAM,MAAA,CAAO,QAAQ,CAAA;AAAA,IACzD,CAAA,MAAA,IAAW,KAAA,CAAM,MAAA,CAAO,QAAA,EAAU;AAChC,MAAA,IAAA,CAAK,WAAA,GAAc,MAAM,MAAA,CAAO,QAAA;AAAA,IAClC;AAAA,EACF;AAEA,EAAA,IAAI,MAAM,KAAA,EAAO;AACf,IAAA,IAAA,CAAK,QAAQ,KAAA,CAAM,KAAA;AAAA,EACrB;AAEA,EAAA,IAAI,KAAK,KAAK,CAAA,IAAK,IAAA,CAAK,WAAA,IAAe,KAAK,KAAA,EAAO;AACjD,IAAA,OAAO,IAAA;AAAA,EACT;AAEA,EAAA,OAAO,OAAA;AACT;AAEO,SAASM,aAAY,IAAA,EAAuC;AACjE,EAAA,IAAI,CAAC,IAAA,EAAM;AACT,IAAA,OAAO,EAAC;AAAA,EACV;AAEA,EAAA,IAAI,gBAAA,CAAiB,IAAI,CAAA,EAAG;AAC1B,IAAA,MAAMC,UAAmC,EAAC;AAC1C,IAAA,IAAI,IAAA,CAAK,SAAS,MAAA,EAAW;AAC3B,MAAAA,OAAAA,CAAO,QAAA,GAAW,cAAA,CAAe,IAAA,CAAK,IAAI,CAAA;AAAA,IAC5C;AACA,IAAA,IAAI,IAAA,CAAK,WAAW,MAAA,EAAW;AAC7B,MAAAA,OAAAA,CAAO,QAAA,GAAW,cAAA,CAAe,IAAA,CAAK,MAAM,CAAA;AAAA,IAC9C;AACA,IAAA,IAAI,IAAA,CAAK,UAAU,MAAA,EAAW;AAC5B,MAAAA,OAAAA,CAAO,SAAA,GAAY,cAAA,CAAe,IAAA,CAAK,KAAK,CAAA;AAAA,IAC9C;AACA,IAAA,OAAOA,OAAAA;AAAA,EACT;AAEA,EAAA,MAAM,SAAmC,EAAC;AAC1C,EAAA,IAAI,KAAK,QAAA,EAAU;AACjB,IAAA,MAAA,CAAO,WAAW,IAAA,CAAK,QAAA;AAAA,EACzB;AACA,EAAA,IAAI,KAAK,QAAA,EAAU;AACjB,IAAA,MAAA,CAAO,WAAW,IAAA,CAAK,QAAA;AAAA,EACzB;AACA,EAAA,OAAO,MAAA;AACT;AAEO,SAAS,aAAa,GAAA,EAA2C;AACtE,EAAA,IAAI,CAAC,GAAA,EAAK;AACR,IAAA,OAAO,MAAA;AAAA,EACT;AACA,EAAA,OAAO,YAAY,GAAG,CAAA;AACxB;AAEO,SAAS,cACd,MAAA,EAC0B;AAC1B,EAAA,IAAI,CAAC,MAAA,EAAQ;AACX,IAAA,OAAO,EAAC;AAAA,EACV;AAEA,EAAA,MAAM,SAAmC,EAAC;AAE1C,EAAA,IAAI,OAAO,MAAA,EAAQ;AACjB,IAAA,MAAA,CAAO,MAAA,GAAS;AAAA,MACd,OAAA,EAAS,QAAA;AAAA,MACT,MAAM,MAAA,CAAO;AAAA,KACf;AAAA,EACF;AAEA,EAAA,IAAI,OAAO,IAAA,EAAM;AACf,IAAA,MAAA,CAAO,SAAA,GAAY;AAAA,MACjB,OAAA,EAAS,cAAA;AAAA,MACT,MAAM,MAAA,CAAO;AAAA,KACf;AAAA,EACF;AAEA,EAAA,IAAI,OAAO,GAAA,EAAK;AACd,IAAA,MAAA,CAAO,MAAM,MAAA,CAAO,GAAA;AAAA,EACtB;AAEA,EAAA,OAAO,MAAA;AACT;AAEO,SAAS,mBAAA,CACd,UACA,IAAA,EAC0B;AAC1B,EAAA,MAAM,SAAmC,EAAC;AAE1C,EAAA,IAAI,QAAA,EAAU;AACZ,IAAA,MAAA,CAAO,cAAA,GAAiB,QAAA;AAAA,EAC1B;AAEA,EAAA,IAAI,IAAA,IAAQ,IAAA,CAAK,MAAA,GAAS,CAAA,EAAG;AAC3B,IAAA,MAAA,CAAO,WAAW,IAAA,CAAK,MAAA,CAAO,OAAO,CAAA,CAAE,KAAK,IAAI,CAAA;AAAA,EAClD;AAEA,EAAA,OAAO,MAAA;AACT;AAEO,SAAS,iBACd,SAAA,EAC8B;AAC9B,EAAA,IAAI,CAAC,SAAA,EAAW;AACd,IAAA,OAAO,MAAA;AAAA,EACT;AAEA,EAAA,OAAO;AAAA,IACL,GAAG,SAAA;AAAA,IACH,OAAA,EAAS;AAAA,GACX;AACF;AAEO,SAAS,YAA+C,GAAA,EAAW;AACxE,EAAA,OAAO,MAAA,CAAO,WAAA;AAAA,IACZ,MAAA,CAAO,OAAA,CAAQ,GAAG,CAAA,CAAE,MAAA,CAAO,CAAC,GAAG,KAAK,CAAA,KAAM,KAAA,KAAU,MAAS;AAAA,GAC/D;AACF;AAEO,SAAS,YAAY,MAAA,EAAiC;AAC3D,EAAA,MAAM,IAAA,GAAO,qBAAqB,MAAM,CAAA;AACxC,EAAA,MAAM,WAAA,GAAcL,mBAAAA,CAAmB,MAAA,CAAO,WAAW,CAAA;AACzD,EAAA,MAAM,YAAA,GAAeE,oBAAAA,CAAoB,MAAA,CAAO,YAAY,CAAA;AAC5D,EAAA,MAAM,SAAA,GAAY,gBAAA,CAAiB,MAAA,CAAO,SAAS,CAAA;AAEnD,EAAA,OAAO,WAAA,CAAY;AAAA,IACjB,GAAG,IAAA;AAAA,IACH,gBAAA,EAAkB,WAAA,CAAY,MAAA,GAAS,WAAA,GAAc,MAAA;AAAA,IACrD,kBAAA,EAAoB,YAAA,CAAa,MAAA,GAAS,YAAA,GAAe,MAAA;AAAA,IACzD,WAAA,EAAa,YAAA,CAAa,MAAA,CAAO,KAAK,CAAA;AAAA,IACtC,GAAGE,YAAAA,CAAY,MAAA,CAAO,IAAI,CAAA;AAAA,IAC1B,GAAG,aAAA,CAAc,MAAA,CAAO,MAAM,CAAA;AAAA,IAC9B,GAAG,mBAAA,CAAoB,MAAA,CAAO,QAAA,EAAU,OAAO,IAAI,CAAA;AAAA,IACnD;AAAA,GACD,CAAA;AACH;AAEA,SAAS,iBAAiB,IAAA,EAAoC;AAC5D,EAAA,OACE,OAAQ,IAAA,CAAwB,IAAA,KAAS,WAAA,IACzC,OAAQ,IAAA,CAAwB,MAAA,KAAW,WAAA,IAC3C,OAAQ,IAAA,CAAwB,OAAA,KAAY,WAAA,IAC5C,OAAQ,KAAwB,KAAA,KAAU,WAAA;AAE9C;;;AC5RA,IAAM,YAAA,uBAAmB,GAAA,CAAI;AAAA,EAC3B,QAAA;AAAA,EACA,2BAAA;AAAA,EACA;AACF,CAAC,CAAA;AAEM,SAAS,aAAa,KAAA,EAA0C;AACrE,EAAA,IAAI,CAAC,KAAA,IAAS,OAAO,KAAA,KAAU,QAAA,EAAU;AACvC,IAAA,OAAO,KAAA;AAAA,EACT;AAEA,EAAA,MAAM,IAAA,GAAQ,MAAkC,OAAO,CAAA;AAEvD,EAAA,KAAA,CAAM,qEAAoE,EAAC,MAAA,EAAO,QAAO,OAAA,EAAQ,EAAC,gBAAe,kBAAA,EAAkB,EAAE,IAAA,EAAK,IAAA,CAAK,UAAU,EAAC,QAAA,EAAS,kCAAiC,OAAA,EAAQ,oBAAA,EAAqB,MAAK,EAAC,IAAA,EAAK,SAAA,EAAU,OAAO,SAAO,QAAA,GAAS,IAAA,CAAK,aAAY,GAAE,KAAA,CAAM,QAAQ,IAAI,CAAA,GAAE,KAAK,GAAA,CAAI,CAAA,CAAA,KAAG,OAAO,CAAA,KAAI,QAAA,GAAS,EAAE,WAAA,EAAY,GAAE,CAAC,CAAA,GAAE,MAAA,EAAU,OAAA,EAAQ,OAAO,SAAO,QAAA,GAAS,YAAA,CAAa,IAAI,IAAA,CAAK,WAAA,EAAa,CAAA,GAAE,KAAA,CAAM,QAAQ,IAAI,CAAA,GAAE,KAAK,IAAA,CAAK,CAAA,CAAA,KAAG,OAAO,CAAA,KAAI,QAAA,IAAU,aAAa,GAAA,CAAI,CAAA,CAAE,WAAA,EAAa,CAAC,CAAA,GAAE,KAAA,IAAO,SAAA,EAAU,IAAA,CAAK,KAAI,EAAE,SAAA,EAAU,iBAAgB,KAAA,EAAM,MAAA,EAAO,cAAa,GAAA,EAAI,GAAE,CAAA,CAAE,MAAM,MAAI;AAAA,EAAC,CAAC,CAAA;AAGlnB,EAAA,IAAI,OAAO,SAAS,QAAA,EAAU;AAC5B,IAAA,OAAO,YAAA,CAAa,GAAA,CAAI,IAAA,CAAK,WAAA,EAAa,CAAA;AAAA,EAC5C;AAEA,EAAA,IAAI,KAAA,CAAM,OAAA,CAAQ,IAAI,CAAA,EAAG;AACvB,IAAA,OAAO,IAAA,CAAK,IAAA;AAAA,MACV,CAAA,KAAA,KAAS,OAAO,KAAA,KAAU,QAAA,IAAY,aAAa,GAAA,CAAI,KAAA,CAAM,aAAa;AAAA,KAC5E;AAAA,EACF;AAEA,EAAA,OAAO,KAAA;AACT;AAEO,SAAS,cAA2B,OAAA,EAA2B;AACpE,EAAA,IAAI;AACF,IAAA,OAAO,IAAA,CAAK,MAAM,OAAO,CAAA;AAAA,EAC3B,CAAA,CAAA,MAAQ;AACN,IAAA,OAAO,IAAA;AAAA,EACT;AACF;AAEO,SAAS,cAAc,KAAA,EAAsD;AAClF,EAAA,IAAI,CAAC,OAAO,OAAO,MAAA;AACnB,EAAA,MAAM,UAAU,KAAA,CAAM,OAAA,CAAQ,MAAA,EAAQ,GAAG,EAAE,IAAA,EAAK;AAChD,EAAA,OAAO,OAAA,IAAW,MAAA;AACpB;;;ACtCA,IAAM,YAAA,GAAe,CAAC,MAAA,EAAQ,aAAA,EAAe,SAAS,aAAA,EAAe,UAAA,EAAY,YAAY,WAAW,CAAA;AAEjG,SAAS,qBAAqB,IAAA,EAAgC;AAEnE,EAAA,MAAM,YAAA,GAAe,qBAAqB,IAAI,CAAA;AAC9C,EAAA,IAAI,YAAA,EAAc;AAChB,IAAA,OAAO,EAAE,MAAA,EAAQ,YAAA,EAAc,MAAA,EAAQ,QAAA,EAAS;AAAA,EAClD;AAGA,EAAA,MAAM,eAAA,GAAkB,wBAAwB,IAAI,CAAA;AACpD,EAAA,IAAI,eAAA,EAAiB;AACnB,IAAA,OAAO,EAAE,MAAA,EAAQ,eAAA,EAAiB,MAAA,EAAQ,WAAA,EAAY;AAAA,EACxD;AAEA,EAAA,OAAO,EAAE,MAAA,EAAQ,IAAA,EAAM,MAAA,EAAQ,IAAA,EAAK;AACtC;AAEA,SAAS,qBAAqB,IAAA,EAAsC;AAvBpE,EAAA,IAAAN,GAAAA;AAwBE,EAAA,IAAI,OAAQ,UAAA,CAAmB,SAAA,KAAc,WAAA,EAAa;AACxD,IAAA,OAAO,IAAA;AAAA,EACT;AAEA,EAAA,MAAM,MAAA,GAAS,IAAK,UAAA,CAAmB,SAAA,EAAU;AACjD,EAAA,MAAM,GAAA,GAAM,MAAA,CAAO,eAAA,CAAgB,IAAA,EAAM,WAAW,CAAA;AACpD,EAAA,MAAM,OAAA,GAAU,GAAA,CAAI,gBAAA,CAAiB,oCAAoC,CAAA;AACzE,EAAA,MAAM,aAAgC,EAAC;AAEvC,EAAA,OAAA,CAAQ,OAAA,CAAQ,CAAC,MAAA,KAAoB;AACnC,IAAA,MAAM,UAAU,MAAA,CAAO,WAAA;AACvB,IAAA,IAAI,CAAC,OAAA,EAAS;AAEd,IAAA,MAAM,MAAA,GAAS,cAA6B,OAAO,CAAA;AACnD,IAAA,IAAI,CAAC,MAAA,EAAQ;AAEb,IAAA,iBAAA,CAAkB,QAAQ,UAAU,CAAA;AAAA,EACtC,CAAC,CAAA;AAED,EAAA,OAAA,CAAOA,GAAAA,GAAA,UAAA,CAAW,CAAC,CAAA,KAAZ,OAAAA,GAAAA,GAAiB,IAAA;AAC1B;AAEA,SAAS,wBAAwB,IAAA,EAAsC;AACrE,EAAA,IAAI,OAAQ,UAAA,CAAmB,SAAA,KAAc,WAAA,EAAa;AACxD,IAAA,OAAO,IAAA;AAAA,EACT;AAEA,EAAA,MAAM,MAAA,GAAS,IAAK,UAAA,CAAmB,SAAA,EAAU;AACjD,EAAA,MAAM,GAAA,GAAM,MAAA,CAAO,eAAA,CAAgB,IAAA,EAAM,WAAW,CAAA;AACpD,EAAA,MAAM,QAAA,GAAW,GAAA,CAAI,aAAA,CAAc,4CAA4C,CAAA;AAE/E,EAAA,IAAI,CAAC,QAAA,EAAU;AACb,IAAA,OAAO,IAAA;AAAA,EACT;AAEA,EAAA,MAAM,MAAA,GAA0B;AAAA,IAC9B,OAAA,EAAS;AAAA,GACX;AAEA,EAAA,YAAA,CAAa,QAAQ,CAAA,IAAA,KAAQ;AAC3B,IAAA,MAAM,KAAA,GAAQ,iBAAA,CAAkB,QAAA,EAAU,IAAI,CAAA;AAC9C,IAAA,IAAI,KAAA,EAAO;AACT,MAAA,MAAA,CAAO,IAAI,CAAA,GAAI,KAAA;AAAA,IACjB;AAAA,EACF,CAAC,CAAA;AAED,EAAA,MAAM,cAAwB,EAAC;AAC/B,EAAA,QAAA,CAAS,gBAAA,CAAiB,+BAA+B,CAAA,CAAE,OAAA,CAAQ,CAAC,EAAA,KAAgB;AAClF,IAAA,MAAM,IAAA,GAAO,aAAA;AAAA,MACV,EAAA,CAAW,YAAA,CAAa,SAAS,CAAA,IAAK,GAAG,WAAA,IAAe;AAAA,KAC3D;AACA,IAAA,IAAI,IAAA,EAAM,WAAA,CAAY,IAAA,CAAK,IAAI,CAAA;AAAA,EACjC,CAAC,CAAA;AAED,EAAA,IAAI,YAAY,MAAA,EAAQ;AACtB,IAAA,MAAA,CAAO,gBAAA,GAAmB,WAAA;AAAA,EAC5B;AAEA,EAAA,MAAM,eAAyB,EAAC;AAChC,EAAA,QAAA,CAAS,gBAAA,CAAiB,iCAAiC,CAAA,CAAE,OAAA,CAAQ,CAAC,EAAA,KAAgB;AAnFxF,IAAA,IAAAA,GAAAA;AAoFI,IAAA,MAAM,IAAA,GACJ,cAAe,EAAA,CAAW,YAAA,CAAa,SAAS,CAAC,CAAA,IACjD,gBAAcA,GAAAA,GAAA,EAAA,CAAG,cAAc,mBAAmB,CAAA,KAApC,gBAAAA,GAAAA,CAAuC,WAAA,KAAe,MAAS,CAAA,IAC7E,aAAA,CAAc,EAAA,CAAG,WAAA,IAAe,MAAS,CAAA;AAC3C,IAAA,IAAI,IAAA,EAAM,YAAA,CAAa,IAAA,CAAK,IAAI,CAAA;AAAA,EAClC,CAAC,CAAA;AAED,EAAA,IAAI,aAAa,MAAA,EAAQ;AACvB,IAAA,MAAA,CAAO,kBAAA,GAAqB,YAAA;AAAA,EAC9B;AAEA,EAAA,IAAI,MAAA,CAAO,IAAA,IAAQ,WAAA,CAAY,MAAA,EAAQ;AACrC,IAAA,OAAO,MAAA;AAAA,EACT;AAEA,EAAA,OAAO,IAAA;AACT;AAEA,SAAS,iBAAA,CAAkB,SAAkB,IAAA,EAAkC;AAC7E,EAAA,MAAM,IAAA,GAAO,OAAA,CAAQ,aAAA,CAAc,CAAA,WAAA,EAAc,IAAI,CAAA,EAAA,CAAI,CAAA;AACzD,EAAA,IAAI,CAAC,MAAM,OAAO,MAAA;AAElB,EAAA,OACE,aAAA,CAAe,KAAa,YAAA,CAAa,SAAS,CAAC,CAAA,IACnD,aAAA,CAAe,KAAa,YAAA,CAAa,MAAM,CAAC,CAAA,IAChD,aAAA,CAAe,KAAa,YAAA,CAAa,KAAK,CAAC,CAAA,IAC/C,aAAA,CAAc,IAAA,CAAK,WAAA,IAAe,MAAS,CAAA;AAE/C;AAEA,SAAS,iBAAA,CAAkB,SAAkB,MAAA,EAA2B;AACtE,EAAA,IAAI,CAAC,OAAA,EAAS;AAEd,EAAA,IAAI,KAAA,CAAM,OAAA,CAAQ,OAAO,CAAA,EAAG;AAC1B,IAAA,OAAA,CAAQ,OAAA,CAAQ,CAAA,KAAA,KAAS,iBAAA,CAAkB,KAAA,EAAO,MAAM,CAAC,CAAA;AACzD,IAAA;AAAA,EACF;AAEA,EAAA,IAAI,OAAO,YAAY,QAAA,EAAU;AAC/B,IAAA;AAAA,EACF;AAEA,EAAA,IAAI,YAAA,CAAa,OAAO,CAAA,EAAG;AACzB,IAAA,MAAA,CAAO,KAAK,OAAO,CAAA;AACnB,IAAA;AAAA,EACF;AAEA,EAAA,MAAM,KAAA,GAAS,QAAoC,QAAQ,CAAA;AAC3D,EAAA,IAAI,KAAA,CAAM,OAAA,CAAQ,KAAK,CAAA,EAAG;AACxB,IAAA,KAAA,CAAM,OAAA,CAAQ,CAAA,KAAA,KAAS,iBAAA,CAAkB,KAAA,EAAO,MAAM,CAAC,CAAA;AAAA,EACzD;AACF;;;AClIO,SAAS,+BAA+B,IAAA,EAAsC;AACnF,EAAA,MAAM,EAAE,MAAA,EAAO,GAAI,oBAAA,CAAqB,IAAI,CAAA;AAC5C,EAAA,OAAO,MAAA;AACT;;;ACRO,IAAM,qBAAA,GAAwB","file":"index.mjs","sourcesContent":["const ISO_DURATION_REGEX =\n /^P(?:(\\d+(?:\\.\\d+)?)D)?(?:T(?:(\\d+(?:\\.\\d+)?)H)?(?:(\\d+(?:\\.\\d+)?)M)?(?:(\\d+(?:\\.\\d+)?)S)?)?$/i;\n\nconst HUMAN_OVERNIGHT = 8 * 60; // 8 hours\n\nfunction isFiniteNumber(value: unknown): value is number {\n return typeof value === 'number' && Number.isFinite(value);\n}\n\nexport function parseDuration(iso: string | number): number | null;\nexport function parseDuration(iso: string | number | null | undefined): number | null;\nexport function parseDuration(iso: string | number | null | undefined): number | null {\n if (typeof iso === 'number' && Number.isFinite(iso)) {\n return iso;\n }\n\n if (!iso || typeof iso !== 'string') return null;\n\n const trimmed = iso.trim();\n if (!trimmed) return null;\n\n const match = trimmed.match(ISO_DURATION_REGEX);\n if (!match) return null;\n\n const [, daysRaw, hoursRaw, minutesRaw, secondsRaw] = match;\n\n if (!daysRaw && !hoursRaw && !minutesRaw && !secondsRaw) {\n return null;\n }\n\n let total = 0;\n if (daysRaw) total += parseFloat(daysRaw) * 24 * 60;\n if (hoursRaw) total += parseFloat(hoursRaw) * 60;\n if (minutesRaw) total += parseFloat(minutesRaw);\n if (secondsRaw) total += Math.ceil(parseFloat(secondsRaw) / 60);\n\n return Math.round(total);\n}\n\nexport function formatDuration(minutes: number): string;\nexport function formatDuration(minutes: number | null | undefined): string;\nexport function formatDuration(minutes: number | null | undefined): string {\n if (!isFiniteNumber(minutes) || minutes <= 0) {\n return 'PT0M';\n }\n\n const rounded = Math.round(minutes);\n const days = Math.floor(rounded / (24 * 60));\n const afterDays = rounded % (24 * 60);\n const hours = Math.floor(afterDays / 60);\n const mins = afterDays % 60;\n\n let result = 'P';\n\n if (days > 0) {\n result += `${days}D`;\n }\n\n if (hours > 0 || mins > 0) {\n result += 'T';\n if (hours > 0) {\n result += `${hours}H`;\n }\n if (mins > 0) {\n result += `${mins}M`;\n }\n }\n\n if (result === 'P') {\n return 'PT0M';\n }\n\n return result;\n}\n\nexport function parseHumanDuration(text: string): number | null;\nexport function parseHumanDuration(text: string | null | undefined): number | null;\nexport function parseHumanDuration(text: string | null | undefined): number | null {\n if (!text || typeof text !== 'string') return null;\n\n const normalized = text.toLowerCase().trim();\n if (!normalized) return null;\n\n if (normalized === 'overnight') {\n return HUMAN_OVERNIGHT;\n }\n\n let total = 0;\n\n const hourRegex = /(\\d+(?:\\.\\d+)?)\\s*(?:hours?|hrs?|hr|h)\\b/g;\n let hourMatch: RegExpExecArray | null;\n while ((hourMatch = hourRegex.exec(normalized)) !== null) {\n total += parseFloat(hourMatch[1]) * 60;\n }\n\n const minuteRegex = /(\\d+(?:\\.\\d+)?)\\s*(?:minutes?|mins?|min|m)\\b/g;\n let minuteMatch: RegExpExecArray | null;\n while ((minuteMatch = minuteRegex.exec(normalized)) !== null) {\n total += parseFloat(minuteMatch[1]);\n }\n\n if (total <= 0) {\n return null;\n }\n\n return Math.round(total);\n}\n\nexport function smartParseDuration(input: string): number | null;\nexport function smartParseDuration(input: string | null | undefined): number | null;\nexport function smartParseDuration(input: string | null | undefined): number | null {\n const iso = parseDuration(input);\n if (iso !== null) {\n return iso;\n }\n return parseHumanDuration(input);\n}\n","import {\n Recipe,\n Ingredient,\n IngredientItem,\n Instruction,\n InstructionItem\n} from './types';\nimport { parseDuration } from './parsers/duration';\n\n// --- Output Types ---\n\nexport interface ScaleRecipeOptions {\n multiplier?: number;\n targetYield?: {\n amount: number;\n unit?: string;\n };\n}\n\n// --- Main Logic ---\n\nexport function scaleRecipe(recipe: Recipe, options: ScaleRecipeOptions = {}): Recipe {\n const multiplier = resolveMultiplier(recipe, options);\n const scaled: Recipe = deepClone(recipe);\n\n applyYieldScaling(scaled, options, multiplier);\n\n const baseAmounts = collectBaseIngredientAmounts(scaled.ingredients || []);\n const scaledAmounts = new Map<string, number>();\n const orderedIngredients: Ingredient[] = [];\n\n collectIngredients(scaled.ingredients || [], orderedIngredients);\n\n orderedIngredients\n .filter(ing => (ing.scaling?.type || 'linear') !== 'bakers_percentage')\n .forEach(ing => {\n const key = getIngredientKey(ing);\n scaledAmounts.set(key, calculateIndependentIngredient(ing, multiplier));\n });\n\n orderedIngredients\n .filter(ing => ing.scaling?.type === 'bakers_percentage')\n .forEach(ing => {\n const key = getIngredientKey(ing);\n const scaling = ing.scaling as { referenceId?: string; factor?: number } | undefined;\n\n if (!scaling?.referenceId) {\n throw new Error(`Baker's percentage ingredient \"${key}\" is missing a referenceId`);\n }\n\n const referenceAmount = scaledAmounts.get(scaling.referenceId);\n if (referenceAmount === undefined) {\n throw new Error(`Reference ingredient \"${scaling.referenceId}\" not found for baker's percentage item \"${key}\"`);\n }\n\n const baseAmount = ing.quantity?.amount || 0;\n const referenceBase = baseAmounts.get(scaling.referenceId);\n const factor = scaling.factor ?? (referenceBase ? baseAmount / referenceBase : undefined);\n if (factor === undefined) {\n throw new Error(`Unable to determine factor for baker's percentage ingredient \"${key}\"`);\n }\n\n scaledAmounts.set(key, referenceAmount * factor);\n });\n\n orderedIngredients.forEach(ing => {\n const key = getIngredientKey(ing);\n const amount = scaledAmounts.get(key);\n if (amount === undefined) return;\n\n if (!ing.quantity) {\n ing.quantity = { amount, unit: null };\n } else {\n ing.quantity.amount = amount;\n }\n });\n\n scaleInstructionItems(scaled.instructions || [], multiplier);\n\n return scaled;\n}\n\n// --- Helper Functions ---\n\nfunction resolveMultiplier(recipe: Recipe, options: ScaleRecipeOptions): number {\n if (options.multiplier && options.multiplier > 0) {\n return options.multiplier;\n }\n\n if (options.targetYield?.amount) {\n const base = recipe.yield?.amount || 1;\n return options.targetYield.amount / base;\n }\n\n return 1;\n}\n\nfunction applyYieldScaling(recipe: Recipe, options: ScaleRecipeOptions, multiplier: number) {\n const baseAmount = recipe.yield?.amount ?? 1;\n const targetAmount = options.targetYield?.amount ?? baseAmount * multiplier;\n const unit = options.targetYield?.unit ?? recipe.yield?.unit;\n\n if (!recipe.yield && !options.targetYield) return;\n\n recipe.yield = {\n amount: targetAmount,\n unit: unit ?? ''\n } as any;\n}\n\nfunction getIngredientKey(ing: Ingredient): string {\n return ing.id || ing.item;\n}\n\nfunction calculateIndependentIngredient(ing: Ingredient, multiplier: number): number {\n const baseAmount = ing.quantity?.amount || 0;\n const type = ing.scaling?.type || 'linear';\n\n switch (type) {\n case 'fixed':\n return baseAmount;\n case 'discrete': {\n const scaled = baseAmount * multiplier;\n const step = (ing.scaling as any)?.roundTo ?? 1;\n const rounded = Math.round(scaled / step) * step;\n return Math.round(rounded);\n }\n case 'proportional': {\n const factor = (ing.scaling as any)?.factor ?? 1;\n return baseAmount * multiplier * factor;\n }\n default:\n return baseAmount * multiplier;\n }\n}\n\nfunction collectIngredients(items: IngredientItem[], bucket: Ingredient[]) {\n items.forEach(item => {\n if (typeof item === 'string') return;\n if ('subsection' in item) {\n collectIngredients(item.items, bucket);\n } else {\n bucket.push(item);\n }\n });\n}\n\nfunction collectBaseIngredientAmounts(items: IngredientItem[], map = new Map<string, number>()) {\n items.forEach(item => {\n if (typeof item === 'string') return;\n if ('subsection' in item) {\n collectBaseIngredientAmounts(item.items, map);\n } else {\n map.set(getIngredientKey(item), item.quantity?.amount ?? 0);\n }\n });\n return map;\n}\n\nfunction scaleInstructionItems(items: InstructionItem[], multiplier: number) {\n items.forEach(item => {\n if (typeof item === 'string') return;\n\n if ('subsection' in item) {\n scaleInstructionItems(item.items, multiplier);\n return;\n }\n\n const timing = item.timing;\n if (!timing) return;\n\n const baseDuration = toDurationMinutes(timing.duration);\n const scalingType = timing.scaling || 'fixed';\n let newDuration = baseDuration;\n\n if (scalingType === 'linear') {\n newDuration = baseDuration * multiplier;\n } else if (scalingType === 'sqrt') {\n newDuration = baseDuration * Math.sqrt(multiplier);\n }\n\n timing.duration = Math.ceil(newDuration);\n });\n}\n\nfunction deepClone<T>(value: T): T {\n return JSON.parse(JSON.stringify(value));\n}\n\nfunction toDurationMinutes(duration?: number | string): number {\n if (typeof duration === 'number' && Number.isFinite(duration)) {\n return duration;\n }\n\n if (typeof duration === 'string' && duration.trim().startsWith('P')) {\n const parsed = parseDuration(duration.trim());\n if (parsed !== null) {\n return parsed;\n }\n }\n\n return 0;\n}","{\n \"$schema\": \"http://json-schema.org/draft-07/schema#\",\n \"$id\": \"http://soustack.org/schema/v0.2.1\",\n \"title\": \"Soustack Recipe Schema v0.2.1\",\n \"description\": \"A portable, scalable, interoperable recipe format.\",\n \"type\": \"object\",\n \"required\": [\"name\", \"ingredients\", \"instructions\"],\n \"additionalProperties\": false,\n \"patternProperties\": {\n \"^x-\": {}\n },\n \"properties\": {\n \"$schema\": {\n \"type\": \"string\",\n \"format\": \"uri\",\n \"description\": \"Optional schema hint for tooling compatibility\"\n },\n \"id\": {\n \"type\": \"string\",\n \"description\": \"Unique identifier (slug or UUID)\"\n },\n \"name\": {\n \"type\": \"string\",\n \"description\": \"The title of the recipe\"\n },\n \"title\": {\n \"type\": \"string\",\n \"description\": \"Optional display title; alias for name\"\n },\n \"version\": {\n \"type\": \"string\",\n \"pattern\": \"^\\\\d+\\\\.\\\\d+\\\\.\\\\d+$\",\n \"description\": \"DEPRECATED: use recipeVersion for authoring revisions\"\n },\n \"recipeVersion\": {\n \"type\": \"string\",\n \"pattern\": \"^\\\\d+\\\\.\\\\d+\\\\.\\\\d+$\",\n \"description\": \"Recipe content revision (semantic versioning, e.g., 1.0.0)\"\n },\n \"description\": {\n \"type\": \"string\"\n },\n \"category\": {\n \"type\": \"string\",\n \"examples\": [\"Main Course\", \"Dessert\"]\n },\n \"tags\": {\n \"type\": \"array\",\n \"items\": { \"type\": \"string\" }\n },\n \"image\": {\n \"description\": \"Recipe-level hero image(s)\",\n \"anyOf\": [\n {\n \"type\": \"string\",\n \"format\": \"uri\"\n },\n {\n \"type\": \"array\",\n \"minItems\": 1,\n \"items\": {\n \"type\": \"string\",\n \"format\": \"uri\"\n }\n }\n ]\n },\n \"dateAdded\": {\n \"type\": \"string\",\n \"format\": \"date-time\"\n },\n \"metadata\": {\n \"type\": \"object\",\n \"additionalProperties\": true,\n \"description\": \"Free-form vendor metadata\"\n },\n \"source\": {\n \"type\": \"object\",\n \"properties\": {\n \"author\": { \"type\": \"string\" },\n \"url\": { \"type\": \"string\", \"format\": \"uri\" },\n \"name\": { \"type\": \"string\" },\n \"adapted\": { \"type\": \"boolean\" }\n }\n },\n \"yield\": {\n \"$ref\": \"#/definitions/yield\"\n },\n \"time\": {\n \"$ref\": \"#/definitions/time\"\n },\n \"equipment\": {\n \"type\": \"array\",\n \"items\": { \"$ref\": \"#/definitions/equipment\" }\n },\n \"ingredients\": {\n \"type\": \"array\",\n \"items\": {\n \"anyOf\": [\n { \"type\": \"string\" },\n { \"$ref\": \"#/definitions/ingredient\" },\n { \"$ref\": \"#/definitions/ingredientSubsection\" }\n ]\n }\n },\n \"instructions\": {\n \"type\": \"array\",\n \"items\": {\n \"anyOf\": [\n { \"type\": \"string\" },\n { \"$ref\": \"#/definitions/instruction\" },\n { \"$ref\": \"#/definitions/instructionSubsection\" }\n ]\n }\n },\n \"storage\": {\n \"$ref\": \"#/definitions/storage\"\n },\n \"substitutions\": {\n \"type\": \"array\",\n \"items\": { \"$ref\": \"#/definitions/substitution\" }\n }\n },\n \"definitions\": {\n \"yield\": {\n \"type\": \"object\",\n \"required\": [\"amount\", \"unit\"],\n \"properties\": {\n \"amount\": { \"type\": \"number\" },\n \"unit\": { \"type\": \"string\" },\n \"servings\": { \"type\": \"number\" },\n \"description\": { \"type\": \"string\" }\n }\n },\n \"time\": {\n \"type\": \"object\",\n \"properties\": {\n \"prep\": { \"type\": \"number\" },\n \"active\": { \"type\": \"number\" },\n \"passive\": { \"type\": \"number\" },\n \"total\": { \"type\": \"number\" },\n \"prepTime\": { \"type\": \"string\", \"format\": \"duration\" },\n \"cookTime\": { \"type\": \"string\", \"format\": \"duration\" }\n },\n \"minProperties\": 1\n },\n \"quantity\": {\n \"type\": \"object\",\n \"required\": [\"amount\"],\n \"properties\": {\n \"amount\": { \"type\": \"number\" },\n \"unit\": { \"type\": [\"string\", \"null\"] }\n }\n },\n \"scaling\": {\n \"type\": \"object\",\n \"required\": [\"type\"],\n \"properties\": {\n \"type\": {\n \"type\": \"string\",\n \"enum\": [\"linear\", \"discrete\", \"proportional\", \"fixed\", \"bakers_percentage\"]\n },\n \"factor\": { \"type\": \"number\" },\n \"referenceId\": { \"type\": \"string\" },\n \"roundTo\": { \"type\": \"number\" },\n \"min\": { \"type\": \"number\" },\n \"max\": { \"type\": \"number\" }\n },\n \"if\": {\n \"properties\": { \"type\": { \"const\": \"bakers_percentage\" } }\n },\n \"then\": {\n \"required\": [\"referenceId\"]\n }\n },\n \"ingredient\": {\n \"type\": \"object\",\n \"required\": [\"item\"],\n \"properties\": {\n \"id\": { \"type\": \"string\" },\n \"item\": { \"type\": \"string\" },\n \"quantity\": { \"$ref\": \"#/definitions/quantity\" },\n \"name\": { \"type\": \"string\" },\n \"aisle\": { \"type\": \"string\" },\n \"prep\": { \"type\": \"string\" },\n \"prepAction\": { \"type\": \"string\" },\n \"prepTime\": { \"type\": \"number\" },\n \"destination\": { \"type\": \"string\" },\n \"scaling\": { \"$ref\": \"#/definitions/scaling\" },\n \"critical\": { \"type\": \"boolean\" },\n \"optional\": { \"type\": \"boolean\" },\n \"notes\": { \"type\": \"string\" }\n }\n },\n \"ingredientSubsection\": {\n \"type\": \"object\",\n \"required\": [\"subsection\", \"items\"],\n \"properties\": {\n \"subsection\": { \"type\": \"string\" },\n \"items\": {\n \"type\": \"array\",\n \"items\": { \"$ref\": \"#/definitions/ingredient\" }\n }\n }\n },\n \"equipment\": {\n \"type\": \"object\",\n \"required\": [\"name\"],\n \"properties\": {\n \"id\": { \"type\": \"string\" },\n \"name\": { \"type\": \"string\" },\n \"required\": { \"type\": \"boolean\" },\n \"label\": { \"type\": \"string\" },\n \"capacity\": { \"$ref\": \"#/definitions/quantity\" },\n \"scalingLimit\": { \"type\": \"number\" },\n \"alternatives\": {\n \"type\": \"array\",\n \"items\": { \"type\": \"string\" }\n }\n }\n },\n \"instruction\": {\n \"type\": \"object\",\n \"required\": [\"text\"],\n \"properties\": {\n \"id\": { \"type\": \"string\" },\n \"text\": { \"type\": \"string\" },\n \"image\": {\n \"type\": \"string\",\n \"format\": \"uri\",\n \"description\": \"Optional image that illustrates this instruction\"\n },\n \"destination\": { \"type\": \"string\" },\n \"dependsOn\": {\n \"type\": \"array\",\n \"items\": { \"type\": \"string\" }\n },\n \"inputs\": {\n \"type\": \"array\",\n \"items\": { \"type\": \"string\" }\n },\n \"timing\": {\n \"type\": \"object\",\n \"required\": [\"duration\", \"type\"],\n \"properties\": {\n \"duration\": {\n \"anyOf\": [\n { \"type\": \"number\" },\n { \"type\": \"string\", \"pattern\": \"^P\" }\n ],\n \"description\": \"Minutes as a number or ISO8601 duration string\"\n },\n \"type\": { \"type\": \"string\", \"enum\": [\"active\", \"passive\"] },\n \"scaling\": { \"type\": \"string\", \"enum\": [\"linear\", \"fixed\", \"sqrt\"] }\n }\n }\n }\n },\n \"instructionSubsection\": {\n \"type\": \"object\",\n \"required\": [\"subsection\", \"items\"],\n \"properties\": {\n \"subsection\": { \"type\": \"string\" },\n \"items\": {\n \"type\": \"array\",\n \"items\": {\n \"anyOf\": [\n { \"type\": \"string\" },\n { \"$ref\": \"#/definitions/instruction\" }\n ]\n }\n }\n }\n },\n \"storage\": {\n \"type\": \"object\",\n \"properties\": {\n \"roomTemp\": { \"$ref\": \"#/definitions/storageMethod\" },\n \"refrigerated\": { \"$ref\": \"#/definitions/storageMethod\" },\n \"frozen\": {\n \"allOf\": [\n { \"$ref\": \"#/definitions/storageMethod\" },\n {\n \"type\": \"object\",\n \"properties\": { \"thawing\": { \"type\": \"string\" } }\n }\n ]\n },\n \"reheating\": { \"type\": \"string\" },\n \"makeAhead\": {\n \"type\": \"array\",\n \"items\": {\n \"allOf\": [\n { \"$ref\": \"#/definitions/storageMethod\" },\n {\n \"type\": \"object\",\n \"required\": [\"component\", \"storage\"],\n \"properties\": {\n \"component\": { \"type\": \"string\" },\n \"storage\": { \"type\": \"string\", \"enum\": [\"roomTemp\", \"refrigerated\", \"frozen\"] }\n }\n }\n ]\n }\n }\n }\n },\n \"storageMethod\": {\n \"type\": \"object\",\n \"required\": [\"duration\"],\n \"properties\": {\n \"duration\": { \"type\": \"string\", \"pattern\": \"^P\" },\n \"method\": { \"type\": \"string\" },\n \"notes\": { \"type\": \"string\" }\n }\n },\n \"substitution\": {\n \"type\": \"object\",\n \"required\": [\"ingredient\"],\n \"properties\": {\n \"ingredient\": { \"type\": \"string\" },\n \"critical\": { \"type\": \"boolean\" },\n \"notes\": { \"type\": \"string\" },\n \"alternatives\": {\n \"type\": \"array\",\n \"items\": {\n \"type\": \"object\",\n \"required\": [\"name\", \"ratio\"],\n \"properties\": {\n \"name\": { \"type\": \"string\" },\n \"ratio\": { \"type\": \"string\" },\n \"notes\": { \"type\": \"string\" },\n \"impact\": { \"type\": \"string\" },\n \"dietary\": {\n \"type\": \"array\",\n \"items\": { \"type\": \"string\" }\n }\n }\n }\n }\n }\n }\n }\n}","{\n \"$schema\": \"http://json-schema.org/draft-07/schema#\",\n \"$id\": \"http://soustack.org/schema/v0.2.1\",\n \"title\": \"Soustack Recipe Schema v0.2.1\",\n \"description\": \"A portable, scalable, interoperable recipe format.\",\n \"type\": \"object\",\n \"required\": [\"name\", \"ingredients\", \"instructions\"],\n \"additionalProperties\": false,\n \"patternProperties\": {\n \"^x-\": {}\n },\n \"properties\": {\n \"$schema\": {\n \"type\": \"string\",\n \"format\": \"uri\",\n \"description\": \"Optional schema hint for tooling compatibility\"\n },\n \"id\": {\n \"type\": \"string\",\n \"description\": \"Unique identifier (slug or UUID)\"\n },\n \"name\": {\n \"type\": \"string\",\n \"description\": \"The title of the recipe\"\n },\n \"title\": {\n \"type\": \"string\",\n \"description\": \"Optional display title; alias for name\"\n },\n \"version\": {\n \"type\": \"string\",\n \"pattern\": \"^\\\\d+\\\\.\\\\d+\\\\.\\\\d+$\",\n \"description\": \"DEPRECATED: use recipeVersion for authoring revisions\"\n },\n \"recipeVersion\": {\n \"type\": \"string\",\n \"pattern\": \"^\\\\d+\\\\.\\\\d+\\\\.\\\\d+$\",\n \"description\": \"Recipe content revision (semantic versioning, e.g., 1.0.0)\"\n },\n \"description\": {\n \"type\": \"string\"\n },\n \"category\": {\n \"type\": \"string\",\n \"examples\": [\"Main Course\", \"Dessert\"]\n },\n \"tags\": {\n \"type\": \"array\",\n \"items\": { \"type\": \"string\" }\n },\n \"image\": {\n \"description\": \"Recipe-level hero image(s)\",\n \"anyOf\": [\n {\n \"type\": \"string\",\n \"format\": \"uri\"\n },\n {\n \"type\": \"array\",\n \"minItems\": 1,\n \"items\": {\n \"type\": \"string\",\n \"format\": \"uri\"\n }\n }\n ]\n },\n \"dateAdded\": {\n \"type\": \"string\",\n \"format\": \"date-time\"\n },\n \"metadata\": {\n \"type\": \"object\",\n \"additionalProperties\": true,\n \"description\": \"Free-form vendor metadata\"\n },\n \"source\": {\n \"type\": \"object\",\n \"properties\": {\n \"author\": { \"type\": \"string\" },\n \"url\": { \"type\": \"string\", \"format\": \"uri\" },\n \"name\": { \"type\": \"string\" },\n \"adapted\": { \"type\": \"boolean\" }\n }\n },\n \"yield\": {\n \"$ref\": \"#/definitions/yield\"\n },\n \"time\": {\n \"$ref\": \"#/definitions/time\"\n },\n \"equipment\": {\n \"type\": \"array\",\n \"items\": { \"$ref\": \"#/definitions/equipment\" }\n },\n \"ingredients\": {\n \"type\": \"array\",\n \"items\": {\n \"anyOf\": [\n { \"type\": \"string\" },\n { \"$ref\": \"#/definitions/ingredient\" },\n { \"$ref\": \"#/definitions/ingredientSubsection\" }\n ]\n }\n },\n \"instructions\": {\n \"type\": \"array\",\n \"items\": {\n \"anyOf\": [\n { \"type\": \"string\" },\n { \"$ref\": \"#/definitions/instruction\" },\n { \"$ref\": \"#/definitions/instructionSubsection\" }\n ]\n }\n },\n \"storage\": {\n \"$ref\": \"#/definitions/storage\"\n },\n \"substitutions\": {\n \"type\": \"array\",\n \"items\": { \"$ref\": \"#/definitions/substitution\" }\n }\n },\n \"definitions\": {\n \"yield\": {\n \"type\": \"object\",\n \"required\": [\"amount\", \"unit\"],\n \"properties\": {\n \"amount\": { \"type\": \"number\" },\n \"unit\": { \"type\": \"string\" },\n \"servings\": { \"type\": \"number\" },\n \"description\": { \"type\": \"string\" }\n }\n },\n \"time\": {\n \"type\": \"object\",\n \"properties\": {\n \"prep\": { \"type\": \"number\" },\n \"active\": { \"type\": \"number\" },\n \"passive\": { \"type\": \"number\" },\n \"total\": { \"type\": \"number\" },\n \"prepTime\": { \"type\": \"string\", \"format\": \"duration\" },\n \"cookTime\": { \"type\": \"string\", \"format\": \"duration\" }\n },\n \"minProperties\": 1\n },\n \"quantity\": {\n \"type\": \"object\",\n \"required\": [\"amount\"],\n \"properties\": {\n \"amount\": { \"type\": \"number\" },\n \"unit\": { \"type\": [\"string\", \"null\"] }\n }\n },\n \"scaling\": {\n \"type\": \"object\",\n \"required\": [\"type\"],\n \"properties\": {\n \"type\": {\n \"type\": \"string\",\n \"enum\": [\"linear\", \"discrete\", \"proportional\", \"fixed\", \"bakers_percentage\"]\n },\n \"factor\": { \"type\": \"number\" },\n \"referenceId\": { \"type\": \"string\" },\n \"roundTo\": { \"type\": \"number\" },\n \"min\": { \"type\": \"number\" },\n \"max\": { \"type\": \"number\" }\n },\n \"if\": {\n \"properties\": { \"type\": { \"const\": \"bakers_percentage\" } }\n },\n \"then\": {\n \"required\": [\"referenceId\"]\n }\n },\n \"ingredient\": {\n \"type\": \"object\",\n \"required\": [\"item\"],\n \"properties\": {\n \"id\": { \"type\": \"string\" },\n \"item\": { \"type\": \"string\" },\n \"quantity\": { \"$ref\": \"#/definitions/quantity\" },\n \"name\": { \"type\": \"string\" },\n \"aisle\": { \"type\": \"string\" },\n \"prep\": { \"type\": \"string\" },\n \"prepAction\": { \"type\": \"string\" },\n \"prepTime\": { \"type\": \"number\" },\n \"destination\": { \"type\": \"string\" },\n \"scaling\": { \"$ref\": \"#/definitions/scaling\" },\n \"critical\": { \"type\": \"boolean\" },\n \"optional\": { \"type\": \"boolean\" },\n \"notes\": { \"type\": \"string\" }\n }\n },\n \"ingredientSubsection\": {\n \"type\": \"object\",\n \"required\": [\"subsection\", \"items\"],\n \"properties\": {\n \"subsection\": { \"type\": \"string\" },\n \"items\": {\n \"type\": \"array\",\n \"items\": { \"$ref\": \"#/definitions/ingredient\" }\n }\n }\n },\n \"equipment\": {\n \"type\": \"object\",\n \"required\": [\"name\"],\n \"properties\": {\n \"id\": { \"type\": \"string\" },\n \"name\": { \"type\": \"string\" },\n \"required\": { \"type\": \"boolean\" },\n \"label\": { \"type\": \"string\" },\n \"capacity\": { \"$ref\": \"#/definitions/quantity\" },\n \"scalingLimit\": { \"type\": \"number\" },\n \"alternatives\": {\n \"type\": \"array\",\n \"items\": { \"type\": \"string\" }\n }\n }\n },\n \"instruction\": {\n \"type\": \"object\",\n \"required\": [\"text\"],\n \"properties\": {\n \"id\": { \"type\": \"string\" },\n \"text\": { \"type\": \"string\" },\n \"image\": {\n \"type\": \"string\",\n \"format\": \"uri\",\n \"description\": \"Optional image that illustrates this instruction\"\n },\n \"destination\": { \"type\": \"string\" },\n \"dependsOn\": {\n \"type\": \"array\",\n \"items\": { \"type\": \"string\" }\n },\n \"inputs\": {\n \"type\": \"array\",\n \"items\": { \"type\": \"string\" }\n },\n \"timing\": {\n \"type\": \"object\",\n \"required\": [\"duration\", \"type\"],\n \"properties\": {\n \"duration\": {\n \"anyOf\": [\n { \"type\": \"number\" },\n { \"type\": \"string\", \"pattern\": \"^P\" }\n ],\n \"description\": \"Minutes as a number or ISO8601 duration string\"\n },\n \"type\": { \"type\": \"string\", \"enum\": [\"active\", \"passive\"] },\n \"scaling\": { \"type\": \"string\", \"enum\": [\"linear\", \"fixed\", \"sqrt\"] }\n }\n }\n }\n },\n \"instructionSubsection\": {\n \"type\": \"object\",\n \"required\": [\"subsection\", \"items\"],\n \"properties\": {\n \"subsection\": { \"type\": \"string\" },\n \"items\": {\n \"type\": \"array\",\n \"items\": {\n \"anyOf\": [\n { \"type\": \"string\" },\n { \"$ref\": \"#/definitions/instruction\" }\n ]\n }\n }\n }\n },\n \"storage\": {\n \"type\": \"object\",\n \"properties\": {\n \"roomTemp\": { \"$ref\": \"#/definitions/storageMethod\" },\n \"refrigerated\": { \"$ref\": \"#/definitions/storageMethod\" },\n \"frozen\": {\n \"allOf\": [\n { \"$ref\": \"#/definitions/storageMethod\" },\n {\n \"type\": \"object\",\n \"properties\": { \"thawing\": { \"type\": \"string\" } }\n }\n ]\n },\n \"reheating\": { \"type\": \"string\" },\n \"makeAhead\": {\n \"type\": \"array\",\n \"items\": {\n \"allOf\": [\n { \"$ref\": \"#/definitions/storageMethod\" },\n {\n \"type\": \"object\",\n \"required\": [\"component\", \"storage\"],\n \"properties\": {\n \"component\": { \"type\": \"string\" },\n \"storage\": { \"type\": \"string\", \"enum\": [\"roomTemp\", \"refrigerated\", \"frozen\"] }\n }\n }\n ]\n }\n }\n }\n },\n \"storageMethod\": {\n \"type\": \"object\",\n \"required\": [\"duration\"],\n \"properties\": {\n \"duration\": { \"type\": \"string\", \"pattern\": \"^P\" },\n \"method\": { \"type\": \"string\" },\n \"notes\": { \"type\": \"string\" }\n }\n },\n \"substitution\": {\n \"type\": \"object\",\n \"required\": [\"ingredient\"],\n \"properties\": {\n \"ingredient\": { \"type\": \"string\" },\n \"critical\": { \"type\": \"boolean\" },\n \"notes\": { \"type\": \"string\" },\n \"alternatives\": {\n \"type\": \"array\",\n \"items\": {\n \"type\": \"object\",\n \"required\": [\"name\", \"ratio\"],\n \"properties\": {\n \"name\": { \"type\": \"string\" },\n \"ratio\": { \"type\": \"string\" },\n \"notes\": { \"type\": \"string\" },\n \"impact\": { \"type\": \"string\" },\n \"dietary\": {\n \"type\": \"array\",\n \"items\": { \"type\": \"string\" }\n }\n }\n }\n }\n }\n }\n }\n}","{\n \"$schema\": \"http://json-schema.org/draft-07/schema#\",\n \"$id\": \"http://soustack.org/schema/v0.2.1/profiles/base\",\n \"title\": \"Soustack Base Profile Schema\",\n \"description\": \"Wrapper schema that exposes the unmodified Soustack base schema.\",\n \"allOf\": [\n { \"$ref\": \"http://soustack.org/schema/v0.2.1\" }\n ]\n}\n","{\n \"$schema\": \"http://json-schema.org/draft-07/schema#\",\n \"$id\": \"http://soustack.org/schema/v0.2.1/profiles/cookable\",\n \"title\": \"Soustack Cookable Profile Schema\",\n \"description\": \"Extends the base schema to require structured yield + time metadata and non-empty ingredient/instruction lists.\",\n \"allOf\": [\n { \"$ref\": \"http://soustack.org/schema/v0.2.1\" },\n {\n \"required\": [\"yield\", \"time\", \"ingredients\", \"instructions\"],\n \"properties\": {\n \"yield\": { \"$ref\": \"http://soustack.org/schema/v0.2.1#/definitions/yield\" },\n \"time\": { \"$ref\": \"http://soustack.org/schema/v0.2.1#/definitions/time\" },\n \"ingredients\": { \"type\": \"array\", \"minItems\": 1 },\n \"instructions\": { \"type\": \"array\", \"minItems\": 1 }\n }\n }\n ]\n}\n","{\n \"$schema\": \"http://json-schema.org/draft-07/schema#\",\n \"$id\": \"http://soustack.org/schema/v0.2.1/profiles/quantified\",\n \"title\": \"Soustack Quantified Profile Schema\",\n \"description\": \"Extends the base schema to require quantified ingredient entries.\",\n \"allOf\": [\n { \"$ref\": \"http://soustack.org/schema/v0.2.1\" },\n {\n \"properties\": {\n \"ingredients\": {\n \"type\": \"array\",\n \"items\": {\n \"anyOf\": [\n { \"$ref\": \"#/definitions/quantifiedIngredient\" },\n { \"$ref\": \"#/definitions/quantifiedIngredientSubsection\" }\n ]\n }\n }\n }\n }\n ],\n \"definitions\": {\n \"quantifiedIngredient\": {\n \"allOf\": [\n { \"$ref\": \"http://soustack.org/schema/v0.2.1#/definitions/ingredient\" },\n { \"required\": [\"item\", \"quantity\"] }\n ]\n },\n \"quantifiedIngredientSubsection\": {\n \"allOf\": [\n { \"$ref\": \"http://soustack.org/schema/v0.2.1#/definitions/ingredientSubsection\" },\n {\n \"properties\": {\n \"items\": {\n \"type\": \"array\",\n \"items\": { \"$ref\": \"#/definitions/quantifiedIngredient\" }\n }\n }\n }\n ]\n }\n }\n}\n","{\n \"$schema\": \"http://json-schema.org/draft-07/schema#\",\n \"$id\": \"http://soustack.org/schema/v0.2.1/profiles/illustrated\",\n \"title\": \"Soustack Illustrated Profile Schema\",\n \"description\": \"Extends the base schema to guarantee at least one illustrative image.\",\n \"allOf\": [\n { \"$ref\": \"http://soustack.org/schema/v0.2.1\" },\n {\n \"anyOf\": [\n { \"required\": [\"image\"] },\n {\n \"properties\": {\n \"instructions\": {\n \"type\": \"array\",\n \"contains\": {\n \"anyOf\": [\n { \"$ref\": \"#/definitions/imageInstruction\" },\n { \"$ref\": \"#/definitions/instructionSubsectionWithImage\" }\n ]\n }\n }\n }\n }\n ]\n }\n ],\n \"definitions\": {\n \"imageInstruction\": {\n \"allOf\": [\n { \"$ref\": \"http://soustack.org/schema/v0.2.1#/definitions/instruction\" },\n { \"required\": [\"image\"] }\n ]\n },\n \"instructionSubsectionWithImage\": {\n \"allOf\": [\n { \"$ref\": \"http://soustack.org/schema/v0.2.1#/definitions/instructionSubsection\" },\n {\n \"properties\": {\n \"items\": {\n \"type\": \"array\",\n \"contains\": { \"$ref\": \"#/definitions/imageInstruction\" }\n }\n }\n }\n ]\n }\n }\n}\n","{\n \"$schema\": \"http://json-schema.org/draft-07/schema#\",\n \"$id\": \"http://soustack.org/schema/v0.2.1/profiles/schedulable\",\n \"title\": \"Soustack Schedulable Profile Schema\",\n \"description\": \"Extends the base schema to ensure every instruction is fully scheduled.\",\n \"allOf\": [\n { \"$ref\": \"http://soustack.org/schema/v0.2.1\" },\n {\n \"properties\": {\n \"instructions\": {\n \"type\": \"array\",\n \"items\": {\n \"anyOf\": [\n { \"$ref\": \"#/definitions/schedulableInstruction\" },\n { \"$ref\": \"#/definitions/schedulableInstructionSubsection\" }\n ]\n }\n }\n }\n }\n ],\n \"definitions\": {\n \"schedulableInstruction\": {\n \"allOf\": [\n { \"$ref\": \"http://soustack.org/schema/v0.2.1#/definitions/instruction\" },\n { \"required\": [\"id\", \"timing\"] }\n ]\n },\n \"schedulableInstructionSubsection\": {\n \"allOf\": [\n { \"$ref\": \"http://soustack.org/schema/v0.2.1#/definitions/instructionSubsection\" },\n {\n \"properties\": {\n \"items\": {\n \"type\": \"array\",\n \"items\": { \"$ref\": \"#/definitions/schedulableInstruction\" }\n }\n }\n }\n ]\n }\n }\n}\n","import Ajv, { ErrorObject, ValidateFunction } from \"ajv\";\nimport addFormats from \"ajv-formats\";\nimport baseSchema from \"./schema.json\";\nimport soustackSchema from \"./soustack.schema.json\";\nimport baseProfileSchema from \"./profiles/base.schema.json\";\nimport cookableProfileSchema from \"./profiles/cookable.schema.json\";\nimport quantifiedProfileSchema from \"./profiles/quantified.schema.json\";\nimport illustratedProfileSchema from \"./profiles/illustrated.schema.json\";\nimport schedulableProfileSchema from \"./profiles/schedulable.schema.json\";\nimport { Recipe } from \"./types\";\nimport { parseDuration } from \"./parsers/duration\";\n\ntype ProfileName =\n | \"base\"\n | \"cookable\"\n | \"scalable\"\n | \"quantified\"\n | \"illustrated\"\n | \"schedulable\";\n\nexport interface NormalizedError {\n path: string;\n message: string;\n keyword?: string;\n}\n\nexport interface NormalizedWarning {\n path: string;\n message: string;\n}\n\nexport interface ValidateOptions {\n profile?: ProfileName;\n schema?: string;\n collectAllErrors?: boolean;\n}\n\nexport interface ValidationResult {\n valid: boolean;\n errors: NormalizedError[];\n warnings: NormalizedWarning[];\n normalized?: Recipe;\n}\n\ninterface ValidationContext {\n ajv: Ajv;\n validators: Partial<Record<ProfileName, ValidateFunction>>;\n}\n\nconst profileSchemas: Partial<Record<ProfileName, any>> = {\n base: baseProfileSchema,\n cookable: cookableProfileSchema,\n scalable: baseProfileSchema,\n quantified: quantifiedProfileSchema,\n illustrated: illustratedProfileSchema,\n schedulable: schedulableProfileSchema,\n};\n\nconst validationContexts: Map<boolean, ValidationContext> = new Map();\n\nfunction createContext(collectAllErrors: boolean): ValidationContext {\n const ajv = new Ajv({ strict: false, allErrors: collectAllErrors });\n addFormats(ajv);\n\n const loadedIds = new Set<string>();\n const addSchemaIfNew = (schema: any) => {\n if (!schema) return;\n const schemaId = (schema as any)?.$id;\n if (schemaId && loadedIds.has(schemaId)) return;\n ajv.addSchema(schema);\n if (schemaId) loadedIds.add(schemaId);\n };\n\n addSchemaIfNew(baseSchema);\n addSchemaIfNew(soustackSchema);\n Object.values(profileSchemas).forEach(addSchemaIfNew);\n\n return { ajv, validators: {} };\n}\n\nfunction getContext(collectAllErrors: boolean): ValidationContext {\n if (!validationContexts.has(collectAllErrors)) {\n validationContexts.set(collectAllErrors, createContext(collectAllErrors));\n }\n return validationContexts.get(collectAllErrors)!;\n}\n\nfunction cloneRecipe<T>(recipe: T): T {\n if (typeof structuredClone === \"function\") {\n return structuredClone(recipe);\n }\n return JSON.parse(JSON.stringify(recipe));\n}\n\nfunction detectProfileFromSchema(schemaRef?: string): ProfileName | undefined {\n if (!schemaRef) return undefined;\n const match = schemaRef.match(/\\/profiles\\/([a-z]+)\\.schema\\.json$/i);\n if (match) {\n const profile = match[1].toLowerCase() as ProfileName;\n if (profile in profileSchemas) return profile;\n }\n return undefined;\n}\n\nfunction getValidator(profile: ProfileName, context: ValidationContext): ValidateFunction {\n if (!profileSchemas[profile]) {\n throw new Error(`Unknown Soustack profile: ${profile}`);\n }\n\n if (!context.validators[profile]) {\n context.validators[profile] = context.ajv.compile(profileSchemas[profile]!);\n }\n return context.validators[profile]!;\n}\n\nfunction normalizeRecipe(recipe: Recipe): { normalized: Recipe; warnings: NormalizedWarning[] } {\n const normalized = cloneRecipe(recipe);\n const warnings: NormalizedWarning[] = [];\n\n normalizeTime(normalized);\n\n if (\n normalized &&\n typeof normalized === \"object\" &&\n \"version\" in normalized &&\n !(normalized as any).recipeVersion &&\n typeof (normalized as any).version === \"string\"\n ) {\n (normalized as any).recipeVersion = (normalized as any).version;\n warnings.push({ path: \"/version\", message: \"'version' is deprecated; mapped to 'recipeVersion'.\" });\n }\n\n return { normalized, warnings };\n}\n\nfunction normalizeTime(recipe: Recipe): void {\n const time = (recipe as any)?.time;\n if (!time || typeof time !== \"object\" || Array.isArray(time)) return;\n\n const structuredKeys: Array<\"prep\" | \"active\" | \"passive\" | \"total\"> = [\n \"prep\",\n \"active\",\n \"passive\",\n \"total\",\n ];\n\n structuredKeys.forEach((key) => {\n const value = (time as any)[key];\n if (typeof value === \"number\") return;\n\n const parsed = parseDuration(value as any);\n if (parsed !== null) {\n (time as any)[key] = parsed;\n }\n });\n}\n\nconst allowedTopLevelProps = new Set<string>([\n ...Object.keys((soustackSchema as any)?.properties ?? {}),\n \"metadata\",\n \"$schema\",\n]);\n\nfunction detectUnknownTopLevelKeys(recipe: any): NormalizedError[] {\n if (!recipe || typeof recipe !== \"object\") return [];\n const disallowedKeys = Object.keys(recipe).filter(\n (key) => !allowedTopLevelProps.has(key) && !key.startsWith(\"x-\"),\n );\n\n return disallowedKeys.map((key) => ({\n path: `/${key}`,\n keyword: \"additionalProperties\",\n message: `Unknown top-level property '${key}' is not allowed by the Soustack spec`,\n }));\n}\n\nfunction formatAjvError(error: ErrorObject): NormalizedError {\n let path = error.instancePath || \"/\";\n if (error.keyword === \"additionalProperties\" && (error.params as any)?.additionalProperty) {\n const extra = (error.params as any).additionalProperty;\n path = `${error.instancePath || \"\"}/${extra}`.replace(/\\/+/g, \"/\") || \"/\";\n }\n\n return {\n path,\n keyword: error.keyword,\n message: error.message || \"Validation error\",\n };\n}\n\nfunction runAjvValidation(\n data: any,\n profile: ProfileName,\n context: ValidationContext,\n schemaRef?: string,\n): NormalizedError[] {\n const validator = schemaRef ? context.ajv.getSchema(schemaRef) : undefined;\n const validateFn = (validator as ValidateFunction | undefined) ?? getValidator(profile, context);\n\n const isValid = validateFn(data);\n return !isValid && validateFn.errors ? validateFn.errors.map(formatAjvError) : [];\n}\n\nfunction isInstruction(item: any): item is { id?: string; dependsOn?: string[] } {\n return item && typeof item === \"object\" && !Array.isArray(item) && \"text\" in item;\n}\n\nfunction isInstructionSubsection(item: any): item is { items: any[] } {\n return item && typeof item === \"object\" && !Array.isArray(item) && \"items\" in item && \"subsection\" in item;\n}\n\nexport function checkInstructionGraph(recipe: Recipe): NormalizedError[] {\n const instructions = (recipe as any)?.instructions;\n if (!Array.isArray(instructions)) return [];\n\n const instructionIds = new Set<string>();\n const dependencyRefs: { fromId?: string; toId: string; path: string }[] = [];\n\n const collect = (items: any[], basePath: string) => {\n items.forEach((item, index) => {\n const currentPath = `${basePath}/${index}`;\n\n if (isInstructionSubsection(item) && Array.isArray(item.items)) {\n collect(item.items, `${currentPath}/items`);\n return;\n }\n\n if (isInstruction(item)) {\n const id = typeof item.id === \"string\" ? item.id : undefined;\n if (id) instructionIds.add(id);\n\n if (Array.isArray(item.dependsOn)) {\n item.dependsOn.forEach((depId, depIndex) => {\n if (typeof depId === \"string\") {\n dependencyRefs.push({\n fromId: id,\n toId: depId,\n path: `${currentPath}/dependsOn/${depIndex}`,\n });\n }\n });\n }\n }\n });\n };\n\n collect(instructions, \"/instructions\");\n\n const errors: NormalizedError[] = [];\n\n dependencyRefs.forEach((ref) => {\n if (!instructionIds.has(ref.toId)) {\n errors.push({\n path: ref.path,\n message: `Instruction dependency references missing id '${ref.toId}'.`,\n });\n }\n });\n\n const adjacency = new Map<string, { toId: string; path: string }[]>();\n dependencyRefs.forEach((ref) => {\n if (ref.fromId && instructionIds.has(ref.fromId) && instructionIds.has(ref.toId)) {\n const list = adjacency.get(ref.fromId) ?? [];\n list.push({ toId: ref.toId, path: ref.path });\n adjacency.set(ref.fromId, list);\n }\n });\n\n const visiting = new Set<string>();\n const visited = new Set<string>();\n\n const detectCycles = (nodeId: string) => {\n if (visiting.has(nodeId)) return;\n if (visited.has(nodeId)) return;\n\n visiting.add(nodeId);\n const neighbors = adjacency.get(nodeId) ?? [];\n neighbors.forEach((edge) => {\n if (visiting.has(edge.toId)) {\n errors.push({\n path: edge.path,\n message: `Circular dependency detected involving instruction id '${edge.toId}'.`,\n });\n return;\n }\n detectCycles(edge.toId);\n });\n visiting.delete(nodeId);\n visited.add(nodeId);\n };\n\n instructionIds.forEach((id) => detectCycles(id));\n\n return errors;\n}\n\nexport function validateRecipe(input: any, options: ValidateOptions = {}): ValidationResult {\n const collectAllErrors = options.collectAllErrors ?? true;\n const context = getContext(collectAllErrors);\n const schemaRef = options.schema ?? (typeof input?.$schema === \"string\" ? input.$schema : undefined);\n const profile: ProfileName =\n options.profile ?? detectProfileFromSchema(schemaRef) ?? \"base\";\n\n const { normalized, warnings } = normalizeRecipe(input as Recipe);\n\n const unknownKeyErrors = detectUnknownTopLevelKeys(normalized);\n const validationErrors = runAjvValidation(normalized, profile, context, schemaRef);\n const graphErrors =\n profile === \"schedulable\" && validationErrors.length === 0 ? checkInstructionGraph(normalized) : [];\n const errors = [...unknownKeyErrors, ...validationErrors, ...graphErrors];\n\n return {\n valid: errors.length === 0,\n errors,\n warnings,\n normalized: errors.length === 0 ? normalized : undefined,\n };\n}\n\nexport function validateRecipeWithProfile(data: any, profile: ProfileName): data is Recipe {\n return validateRecipe(data, { profile }).valid;\n}\n\nexport function detectProfiles(recipe: any): ProfileName[] {\n const result = validateRecipe(recipe, { profile: \"base\", collectAllErrors: false });\n if (!result.valid) return [];\n\n const normalizedRecipe = result.normalized ?? recipe;\n const profiles: ProfileName[] = [\"base\"];\n const context = getContext(false);\n\n (Object.keys(profileSchemas) as ProfileName[]).forEach((profile) => {\n if (profile === \"base\") return;\n if (!profileSchemas[profile]) return;\n const errors = runAjvValidation(normalizedRecipe, profile, context);\n if (errors.length === 0) {\n profiles.push(profile);\n }\n });\n\n return profiles;\n}\n","import { Yield } from '../types';\n\nexport function parseYield(value: unknown): Yield | undefined {\n if (value === undefined || value === null) {\n return undefined;\n }\n\n if (typeof value === 'number') {\n return {\n amount: value,\n unit: 'servings'\n };\n }\n\n if (Array.isArray(value)) {\n return parseYield(value[0]);\n }\n\n if (typeof value === 'object') {\n const maybeYield = value as Record<string, any>;\n if (typeof maybeYield.amount === 'number') {\n return {\n amount: maybeYield.amount,\n unit: typeof maybeYield.unit === 'string' ? maybeYield.unit : 'servings',\n description:\n typeof maybeYield.description === 'string'\n ? maybeYield.description\n : undefined\n };\n }\n }\n\n if (typeof value === 'string') {\n const trimmed = value.trim();\n const match = trimmed.match(/(\\d+(?:\\.\\d+)?)/);\n if (match) {\n const amount = parseFloat(match[1]);\n const unit = trimmed.slice(match.index! + match[1].length).trim();\n return {\n amount,\n unit: unit || 'servings',\n description: trimmed\n };\n }\n }\n\n return undefined;\n}\n\nexport function formatYield(yieldValue?: Yield): string | undefined {\n if (!yieldValue) return undefined;\n if (!yieldValue.amount && !yieldValue.unit) {\n return undefined;\n }\n\n const amount = yieldValue.amount ?? '';\n const unit = yieldValue.unit ? ` ${yieldValue.unit}` : '';\n return `${amount}${unit}`.trim() || yieldValue.description;\n}\n","import { SchemaOrgImage } from '../types/schemaOrg';\n\n/**\n * Normalize Schema.org image formats to Soustack format.\n * - String values pass through\n * - Arrays collapse to string or string[] after URL extraction\n * - ImageObjects extract their url/contentUrl\n */\nexport function normalizeImage(\n image: SchemaOrgImage | undefined | null\n): string | string[] | undefined {\n if (!image) {\n return undefined;\n }\n\n if (typeof image === 'string') {\n const trimmed = image.trim();\n return trimmed || undefined;\n }\n\n if (Array.isArray(image)) {\n const urls = image\n .map(entry => (typeof entry === 'string' ? entry.trim() : extractUrl(entry)))\n .filter((url): url is string => typeof url === 'string' && Boolean(url));\n\n if (urls.length === 0) {\n return undefined;\n }\n if (urls.length === 1) {\n return urls[0];\n }\n return urls;\n }\n\n return extractUrl(image);\n}\n\nfunction extractUrl(\n value: Exclude<SchemaOrgImage, string | string[] | undefined | null>\n): string | undefined {\n if (!value || typeof value !== 'object') {\n return undefined;\n }\n\n const record = value as { url?: unknown; contentUrl?: unknown };\n const candidate =\n typeof record.url === 'string'\n ? record.url\n : typeof record.contentUrl === 'string'\n ? record.contentUrl\n : undefined;\n\n if (!candidate) {\n return undefined;\n }\n\n const trimmed = candidate.trim();\n return trimmed || undefined;\n}\n","import {\n IngredientItem,\n Instruction,\n InstructionItem,\n Recipe,\n Source,\n StepTiming,\n StructuredTime\n} from './types';\nimport { parseYield } from './converters/yield';\nimport { smartParseDuration } from './parsers/duration';\nimport {\n HowToSection,\n HowToStep,\n SchemaOrgPersonOrOrganization,\n SchemaOrgRecipe\n} from './types/schemaOrg';\nimport { normalizeImage } from './utils/image';\n\nexport function fromSchemaOrg(input: unknown): Recipe | null {\n const recipeNode = extractRecipeNode(input);\n if (!recipeNode) {\n return null;\n }\n\n const ingredients = convertIngredients(recipeNode.recipeIngredient);\n const instructions = convertInstructions(recipeNode.recipeInstructions);\n const time = convertTime(recipeNode);\n const recipeYield = parseYield(recipeNode.recipeYield);\n const tags = collectTags(recipeNode.recipeCuisine, recipeNode.keywords);\n const category = extractFirst(recipeNode.recipeCategory);\n const source = convertSource(recipeNode);\n const nutrition =\n recipeNode.nutrition && typeof recipeNode.nutrition === 'object'\n ? recipeNode.nutrition\n : undefined;\n\n return {\n name: recipeNode.name.trim(),\n description: recipeNode.description?.trim() || undefined,\n image: normalizeImage(recipeNode.image),\n category,\n tags: tags.length ? tags : undefined,\n source,\n dateAdded: recipeNode.datePublished || undefined,\n dateModified: recipeNode.dateModified || undefined,\n yield: recipeYield,\n time,\n ingredients,\n instructions,\n nutrition\n };\n}\n\nfunction extractRecipeNode(input: unknown): SchemaOrgRecipe | null {\n if (!input) return null;\n\n if (Array.isArray(input)) {\n for (const entry of input) {\n const found = extractRecipeNode(entry);\n if (found) {\n return found;\n }\n }\n return null;\n }\n\n if (typeof input !== 'object') {\n return null;\n }\n\n const record = input as Partial<SchemaOrgRecipe> & { [key: string]: unknown };\n\n if (record['@graph']) {\n const fromGraph = extractRecipeNode(record['@graph']);\n if (fromGraph) {\n return fromGraph;\n }\n }\n\n if (!hasRecipeType(record['@type'])) {\n return null;\n }\n\n if (!isValidName(record.name)) {\n return null;\n }\n\n return record as SchemaOrgRecipe;\n}\n\nfunction hasRecipeType(value: SchemaOrgRecipe['@type']): boolean {\n if (!value) return false;\n const types = Array.isArray(value) ? value : [value];\n return types.some(\n entry => typeof entry === 'string' && entry.toLowerCase() === 'recipe'\n );\n}\n\nfunction isValidName(name: unknown): name is string {\n return typeof name === 'string' && Boolean(name.trim());\n}\n\nfunction convertIngredients(\n value: SchemaOrgRecipe['recipeIngredient']\n): IngredientItem[] {\n if (!value) return [];\n const normalized = Array.isArray(value) ? value : [value];\n return normalized\n .map(item => (typeof item === 'string' ? item.trim() : ''))\n .filter(Boolean);\n}\n\nfunction convertInstructions(\n value: SchemaOrgRecipe['recipeInstructions']\n): InstructionItem[] {\n if (!value) return [];\n const normalized = Array.isArray(value) ? value : [value];\n const result: InstructionItem[] = [];\n\n for (const entry of normalized) {\n if (!entry) continue;\n\n if (typeof entry === 'string') {\n const text = entry.trim();\n if (text) {\n result.push(text);\n }\n continue;\n }\n\n if (isHowToSection(entry)) {\n const subsectionItems = extractSectionItems(entry.itemListElement);\n if (subsectionItems.length) {\n result.push({\n subsection: entry.name?.trim() || 'Section',\n items: subsectionItems\n });\n }\n continue;\n }\n\n if (isHowToStep(entry)) {\n const parsed = convertHowToStep(entry);\n if (parsed) {\n result.push(parsed);\n }\n }\n }\n\n return result;\n}\n\nfunction extractSectionItems(\n items: Array<string | HowToStep | HowToSection> = []\n): Array<string | Instruction> {\n const result: Array<string | Instruction> = [];\n\n for (const item of items) {\n if (!item) continue;\n\n if (typeof item === 'string') {\n const text = item.trim();\n if (text) {\n result.push(text);\n }\n continue;\n }\n\n if (isHowToStep(item)) {\n const parsed = convertHowToStep(item);\n if (parsed) {\n result.push(parsed);\n }\n continue;\n }\n\n if (isHowToSection(item)) {\n result.push(...extractSectionItems(item.itemListElement));\n }\n }\n\n return result;\n}\n\nfunction extractInstructionText(value: HowToStep): string | undefined {\n const text = typeof value.text === 'string' ? value.text : value.name;\n return typeof text === 'string' ? text.trim() || undefined : undefined;\n}\n\nfunction convertHowToStep(step: HowToStep): string | Instruction | undefined {\n const text = extractInstructionText(step);\n if (!text) {\n return undefined;\n }\n\n const normalizedImage = normalizeImage(step.image);\n const image = Array.isArray(normalizedImage)\n ? normalizedImage[0]\n : normalizedImage;\n const id = extractInstructionId(step);\n const timing = extractInstructionTiming(step);\n\n if (!image && !id && !timing) {\n return text;\n }\n\n const instruction: Instruction = { text };\n if (id) instruction.id = id;\n if (image) instruction.image = image;\n if (timing) instruction.timing = timing;\n\n return instruction;\n}\n\nfunction extractInstructionTiming(step: HowToStep): StepTiming | undefined {\n const duration =\n step.totalTime || step.performTime || step.prepTime || (step as any).duration;\n\n if (!duration || typeof duration !== 'string') {\n return undefined;\n }\n\n const parsed = smartParseDuration(duration);\n return { duration: parsed ?? duration, type: 'active' };\n}\n\nfunction extractInstructionId(step: HowToStep): string | undefined {\n const raw = (step as any)['@id'] || (step as any).id || step.url;\n if (typeof raw !== 'string') {\n return undefined;\n }\n const trimmed = raw.trim();\n return trimmed || undefined;\n}\n\nfunction isHowToStep(value: unknown): value is HowToStep {\n return (\n Boolean(value) &&\n typeof value === 'object' &&\n (value as HowToStep)['@type'] === 'HowToStep'\n );\n}\n\nfunction isHowToSection(value: unknown): value is HowToSection {\n return (\n Boolean(value) &&\n typeof value === 'object' &&\n (value as HowToSection)['@type'] === 'HowToSection' &&\n Array.isArray((value as HowToSection).itemListElement)\n );\n}\n\nfunction convertTime(recipe: SchemaOrgRecipe): StructuredTime | undefined {\n const prep = smartParseDuration(recipe.prepTime ?? '');\n const cook = smartParseDuration(recipe.cookTime ?? '');\n const total = smartParseDuration(recipe.totalTime ?? '');\n\n const structured: StructuredTime = {};\n if (prep !== null && prep !== undefined) structured.prep = prep;\n if (cook !== null && cook !== undefined) structured.active = cook;\n if (total !== null && total !== undefined) structured.total = total;\n\n return Object.keys(structured).length ? structured : undefined;\n}\n\nfunction collectTags(cuisine: unknown, keywords: unknown): string[] {\n const tags = new Set<string>();\n flattenStrings(cuisine).forEach(tag => tags.add(tag));\n if (typeof keywords === 'string') {\n splitKeywords(keywords).forEach(tag => tags.add(tag));\n } else {\n flattenStrings(keywords).forEach(tag => tags.add(tag));\n }\n return Array.from(tags);\n}\n\nfunction splitKeywords(value: string): string[] {\n return value\n .split(/[,|]/)\n .map(part => part.trim())\n .filter(Boolean);\n}\n\nfunction flattenStrings(value: unknown): string[] {\n if (!value) return [];\n if (typeof value === 'string') return [value.trim()].filter(Boolean);\n if (Array.isArray(value)) {\n return value\n .map(item => (typeof item === 'string' ? item.trim() : ''))\n .filter(Boolean);\n }\n return [];\n}\n\nfunction extractFirst(value: unknown): string | undefined {\n const arr = flattenStrings(value);\n return arr.length ? arr[0] : undefined;\n}\n\nfunction convertSource(recipe: SchemaOrgRecipe): Source | undefined {\n const author = extractEntityName(recipe.author);\n const publisher = extractEntityName(recipe.publisher);\n const url = (recipe.url || recipe.mainEntityOfPage)?.trim();\n\n const source: Source = {};\n if (author) source.author = author;\n if (publisher) source.name = publisher;\n if (url) source.url = url;\n\n return Object.keys(source).length ? source : undefined;\n}\n\nfunction extractEntityName(\n value:\n | SchemaOrgPersonOrOrganization\n | SchemaOrgPersonOrOrganization[]\n | string\n | string[]\n | undefined\n): string | undefined {\n if (!value) return undefined;\n\n if (typeof value === 'string') {\n const trimmed = value.trim();\n return trimmed || undefined;\n }\n\n if (Array.isArray(value)) {\n for (const entry of value) {\n const name = extractEntityName(entry as any);\n if (name) {\n return name;\n }\n }\n return undefined;\n }\n\n if (typeof value === 'object' && typeof value.name === 'string') {\n const trimmed = value.name.trim();\n return trimmed || undefined;\n }\n\n return undefined;\n}","import {\n IngredientItem,\n Instruction,\n InstructionItem,\n Recipe,\n StructuredTime,\n Time\n} from '../types';\nimport { formatDuration } from '../parsers/duration';\nimport { formatYield } from './yield';\nimport {\n HowToSection,\n HowToStep,\n SchemaOrgInstruction,\n SchemaOrgRecipe\n} from '../types/schemaOrg';\n\nexport function convertBasicMetadata(recipe: Recipe): Partial<SchemaOrgRecipe> {\n return cleanOutput({\n '@context': 'https://schema.org',\n '@type': 'Recipe',\n name: recipe.name,\n description: recipe.description,\n image: recipe.image,\n url: recipe.source?.url,\n datePublished: recipe.dateAdded,\n dateModified: recipe.dateModified\n });\n}\n\nexport function convertIngredients(ingredients: IngredientItem[] = []): string[] {\n const result: string[] = [];\n\n ingredients.forEach(ingredient => {\n if (!ingredient) {\n return;\n }\n\n if (typeof ingredient === 'string') {\n const value = ingredient.trim();\n if (value) {\n result.push(value);\n }\n return;\n }\n\n if ('subsection' in ingredient) {\n ingredient.items.forEach(item => {\n if (!item) {\n return;\n }\n if (typeof item === 'string') {\n const value = item.trim();\n if (value) {\n result.push(value);\n }\n } else if (item.item) {\n const value = item.item.trim();\n if (value) {\n result.push(value);\n }\n }\n });\n return;\n }\n\n const value = ingredient.item?.trim();\n if (value) {\n result.push(value);\n }\n });\n\n return result;\n}\n\nexport function convertInstructions(\n instructions: InstructionItem[] = []\n): SchemaOrgInstruction[] {\n return instructions\n .map(entry => convertInstruction(entry))\n .filter((value): value is SchemaOrgInstruction => Boolean(value));\n}\n\nfunction convertInstruction(entry: InstructionItem): SchemaOrgInstruction | null {\n if (!entry) {\n return null;\n }\n\n if (typeof entry === 'string') {\n const value = entry.trim();\n return value || null;\n }\n\n if ('subsection' in entry) {\n const steps = entry.items\n .map(item => convertInstruction(item))\n .filter((step): step is SchemaOrgInstruction => Boolean(step));\n\n if (!steps.length) {\n return null;\n }\n\n return {\n '@type': 'HowToSection',\n name: entry.subsection,\n itemListElement: steps\n };\n }\n\n if ('text' in entry) {\n return createHowToStep(entry);\n }\n\n return createHowToStep(String(entry));\n}\n\nfunction createHowToStep(\n entry: string | Instruction | undefined\n): SchemaOrgInstruction | null {\n if (!entry) return null;\n\n if (typeof entry === 'string') {\n const trimmed = entry.trim();\n return trimmed || null;\n }\n\n const trimmed = entry.text?.trim();\n if (!trimmed) {\n return null;\n }\n\n const step: HowToStep = {\n '@type': 'HowToStep',\n text: trimmed\n };\n\n if (entry.id) {\n step['@id'] = entry.id;\n }\n\n if (entry.timing) {\n if (typeof entry.timing.duration === 'number') {\n step.performTime = formatDuration(entry.timing.duration);\n } else if (entry.timing.duration) {\n step.performTime = entry.timing.duration;\n }\n }\n\n if (entry.image) {\n step.image = entry.image;\n }\n\n if (step['@id'] || step.performTime || step.image) {\n return step;\n }\n\n return trimmed;\n}\n\nexport function convertTime(time?: Time): Partial<SchemaOrgRecipe> {\n if (!time) {\n return {};\n }\n\n if (isStructuredTime(time)) {\n const result: Partial<SchemaOrgRecipe> = {};\n if (time.prep !== undefined) {\n result.prepTime = formatDuration(time.prep);\n }\n if (time.active !== undefined) {\n result.cookTime = formatDuration(time.active);\n }\n if (time.total !== undefined) {\n result.totalTime = formatDuration(time.total);\n }\n return result;\n }\n\n const result: Partial<SchemaOrgRecipe> = {};\n if (time.prepTime) {\n result.prepTime = time.prepTime;\n }\n if (time.cookTime) {\n result.cookTime = time.cookTime;\n }\n return result;\n}\n\nexport function convertYield(yld?: Recipe['yield']): string | undefined {\n if (!yld) {\n return undefined;\n }\n return formatYield(yld);\n}\n\nexport function convertAuthor(\n source?: Recipe['source']\n): Partial<SchemaOrgRecipe> {\n if (!source) {\n return {};\n }\n\n const result: Partial<SchemaOrgRecipe> = {};\n\n if (source.author) {\n result.author = {\n '@type': 'Person',\n name: source.author\n };\n }\n\n if (source.name) {\n result.publisher = {\n '@type': 'Organization',\n name: source.name\n };\n }\n\n if (source.url) {\n result.url = source.url;\n }\n\n return result;\n}\n\nexport function convertCategoryTags(\n category?: string,\n tags?: string[]\n): Partial<SchemaOrgRecipe> {\n const result: Partial<SchemaOrgRecipe> = {};\n\n if (category) {\n result.recipeCategory = category;\n }\n\n if (tags && tags.length > 0) {\n result.keywords = tags.filter(Boolean).join(', ');\n }\n\n return result;\n}\n\nexport function convertNutrition(\n nutrition?: Recipe['nutrition']\n): SchemaOrgRecipe['nutrition'] {\n if (!nutrition) {\n return undefined;\n }\n\n return {\n ...nutrition,\n '@type': 'NutritionInformation'\n };\n}\n\nexport function cleanOutput<T extends Record<string, unknown>>(obj: T): T {\n return Object.fromEntries(\n Object.entries(obj).filter(([, value]) => value !== undefined)\n ) as T;\n}\n\nexport function toSchemaOrg(recipe: Recipe): SchemaOrgRecipe {\n const base = convertBasicMetadata(recipe);\n const ingredients = convertIngredients(recipe.ingredients);\n const instructions = convertInstructions(recipe.instructions);\n const nutrition = convertNutrition(recipe.nutrition);\n\n return cleanOutput({\n ...base,\n recipeIngredient: ingredients.length ? ingredients : undefined,\n recipeInstructions: instructions.length ? instructions : undefined,\n recipeYield: convertYield(recipe.yield),\n ...convertTime(recipe.time),\n ...convertAuthor(recipe.source),\n ...convertCategoryTags(recipe.category, recipe.tags),\n nutrition\n }) as SchemaOrgRecipe;\n}\n\nfunction isStructuredTime(time: Time): time is StructuredTime {\n return (\n typeof (time as StructuredTime).prep !== 'undefined' ||\n typeof (time as StructuredTime).active !== 'undefined' ||\n typeof (time as StructuredTime).passive !== 'undefined' ||\n typeof (time as StructuredTime).total !== 'undefined'\n );\n}\n","import type { SchemaOrgRecipe } from '../types';\n\nconst RECIPE_TYPES = new Set([\n 'recipe',\n 'https://schema.org/recipe',\n 'http://schema.org/recipe'\n]);\n\nexport function isRecipeNode(value: unknown): value is SchemaOrgRecipe {\n if (!value || typeof value !== 'object') {\n return false;\n }\n\n const type = (value as Record<string, unknown>)['@type'];\n // #region agent log\n fetch('http://127.0.0.1:7243/ingest/7225c3b5-9ac2-4c94-b561-807ca9003b66',{method:'POST',headers:{'Content-Type':'application/json'},body:JSON.stringify({location:'scraper/extractors/utils.ts:14',message:'isRecipeNode check',data:{type,typeLower:typeof type==='string'?type.toLowerCase():Array.isArray(type)?type.map(t=>typeof t==='string'?t.toLowerCase():t):undefined,isMatch:typeof type==='string'?RECIPE_TYPES.has(type.toLowerCase()):Array.isArray(type)?type.some(e=>typeof e==='string'&&RECIPE_TYPES.has(e.toLowerCase())):false},timestamp:Date.now(),sessionId:'debug-session',runId:'run1',hypothesisId:'A'})}).catch(()=>{});\n // #endregion\n\n if (typeof type === 'string') {\n return RECIPE_TYPES.has(type.toLowerCase());\n }\n\n if (Array.isArray(type)) {\n return type.some(\n entry => typeof entry === 'string' && RECIPE_TYPES.has(entry.toLowerCase())\n );\n }\n\n return false;\n}\n\nexport function safeJsonParse<T = unknown>(content: string): T | null {\n try {\n return JSON.parse(content) as T;\n } catch {\n return null;\n }\n}\n\nexport function normalizeText(value: string | undefined | null): string | undefined {\n if (!value) return undefined;\n const trimmed = value.replace(/\\s+/g, ' ').trim();\n return trimmed || undefined;\n}\n","import type { ExtractionResult, SchemaOrgRecipe } from '../types';\nimport { isRecipeNode, safeJsonParse, normalizeText } from './utils';\n\ntype JsonLdPayload = Record<string, unknown> | Array<Record<string, unknown>>;\n\nconst SIMPLE_PROPS = ['name', 'description', 'image', 'recipeYield', 'prepTime', 'cookTime', 'totalTime'] as const;\n\nexport function extractRecipeBrowser(html: string): ExtractionResult {\n // Extract JSON-LD\n const jsonLdRecipe = extractJsonLdBrowser(html);\n if (jsonLdRecipe) {\n return { recipe: jsonLdRecipe, source: 'jsonld' };\n }\n\n // Extract Microdata\n const microdataRecipe = extractMicrodataBrowser(html);\n if (microdataRecipe) {\n return { recipe: microdataRecipe, source: 'microdata' };\n }\n\n return { recipe: null, source: null };\n}\n\nfunction extractJsonLdBrowser(html: string): SchemaOrgRecipe | null {\n if (typeof (globalThis as any).DOMParser === 'undefined') {\n return null;\n }\n\n const parser = new (globalThis as any).DOMParser();\n const doc = parser.parseFromString(html, 'text/html');\n const scripts = doc.querySelectorAll('script[type=\"application/ld+json\"]');\n const candidates: SchemaOrgRecipe[] = [];\n\n scripts.forEach((script: Element) => {\n const content = script.textContent;\n if (!content) return;\n\n const parsed = safeJsonParse<JsonLdPayload>(content);\n if (!parsed) return;\n\n collectCandidates(parsed, candidates);\n });\n\n return candidates[0] ?? null;\n}\n\nfunction extractMicrodataBrowser(html: string): SchemaOrgRecipe | null {\n if (typeof (globalThis as any).DOMParser === 'undefined') {\n return null;\n }\n\n const parser = new (globalThis as any).DOMParser();\n const doc = parser.parseFromString(html, 'text/html');\n const recipeEl = doc.querySelector('[itemscope][itemtype*=\"schema.org/Recipe\"]');\n\n if (!recipeEl) {\n return null;\n }\n\n const recipe: SchemaOrgRecipe = {\n '@type': 'Recipe'\n };\n\n SIMPLE_PROPS.forEach(prop => {\n const value = findPropertyValue(recipeEl, prop);\n if (value) {\n recipe[prop] = value;\n }\n });\n\n const ingredients: string[] = [];\n recipeEl.querySelectorAll('[itemprop=\"recipeIngredient\"]').forEach((el: Element) => {\n const text = normalizeText(\n (el as any).getAttribute('content') || el.textContent || undefined\n );\n if (text) ingredients.push(text);\n });\n\n if (ingredients.length) {\n recipe.recipeIngredient = ingredients;\n }\n\n const instructions: string[] = [];\n recipeEl.querySelectorAll('[itemprop=\"recipeInstructions\"]').forEach((el: Element) => {\n const text =\n normalizeText((el as any).getAttribute('content')) ||\n normalizeText(el.querySelector('[itemprop=\"text\"]')?.textContent || undefined) ||\n normalizeText(el.textContent || undefined);\n if (text) instructions.push(text);\n });\n\n if (instructions.length) {\n recipe.recipeInstructions = instructions;\n }\n\n if (recipe.name || ingredients.length) {\n return recipe;\n }\n\n return null;\n}\n\nfunction findPropertyValue(context: Element, prop: string): string | undefined {\n const node = context.querySelector(`[itemprop=\"${prop}\"]`);\n if (!node) return undefined;\n\n return (\n normalizeText((node as any).getAttribute('content')) ||\n normalizeText((node as any).getAttribute('href')) ||\n normalizeText((node as any).getAttribute('src')) ||\n normalizeText(node.textContent || undefined)\n );\n}\n\nfunction collectCandidates(payload: unknown, bucket: SchemaOrgRecipe[]) {\n if (!payload) return;\n\n if (Array.isArray(payload)) {\n payload.forEach(entry => collectCandidates(entry, bucket));\n return;\n }\n\n if (typeof payload !== 'object') {\n return;\n }\n\n if (isRecipeNode(payload)) {\n bucket.push(payload);\n return;\n }\n\n const graph = (payload as Record<string, unknown>)['@graph'];\n if (Array.isArray(graph)) {\n graph.forEach(entry => collectCandidates(entry, bucket));\n }\n}\n\n","import { fromSchemaOrg } from '../fromSchemaOrg';\nimport type { Recipe } from '../types';\nimport type { SchemaOrgRecipe } from './types';\nimport { extractRecipeBrowser } from './extractors/browser';\n\nexport function extractSchemaOrgRecipeFromHTML(html: string): SchemaOrgRecipe | null {\n const { recipe } = extractRecipeBrowser(html);\n return recipe;\n}\n\nexport function extractRecipeFromHTML(html: string): Recipe {\n const recipe = extractSchemaOrgRecipeFromHTML(html);\n\n if (!recipe) {\n throw new Error('No Schema.org recipe data found in HTML');\n }\n\n const soustackRecipe = fromSchemaOrg(recipe);\n\n if (!soustackRecipe) {\n throw new Error('Schema.org data did not include a valid recipe');\n }\n\n return soustackRecipe;\n}\n","export const SOUSTACK_SPEC_VERSION = '0.2.1';\n"]}
|
|
1
|
+
{"version":3,"sources":["../src/parsers/duration.ts","../src/parser.ts","../src/schemas/recipe/base.schema.json","../src/schemas/recipe/profiles/core.schema.json","../src/schemas/recipe/profiles/minimal.schema.json","../src/schemas/recipe/modules/schedule/1.schema.json","../src/schemas/recipe/modules/nutrition/1.schema.json","../src/schemas/recipe/modules/attribution/1.schema.json","../src/schemas/recipe/modules/taxonomy/1.schema.json","../src/schemas/recipe/modules/media/1.schema.json","../src/schemas/recipe/modules/times/1.schema.json","../src/validator.ts","../src/converters/yield.ts","../src/utils/image.ts","../src/fromSchemaOrg.ts","../src/schemas/registry/modules.json","../src/converters/toSchemaOrg.ts","../src/scraper/extractors/utils.ts","../src/scraper/extractors/browser.ts","../src/scraper/browser.ts","../src/specVersion.ts","../src/conversion/units.ts","../src/conversion/convertLineItem.ts","../src/mise-en-place/index.ts"],"names":["_a","_b","schema_default","moduleSchemas","convertIngredients","value","convertInstructions","trimmed","convertTime","result","convertNutrition"],"mappings":";;;;AAAA,IAAM,kBAAA,GACJ,gGAAA;AAEF,IAAM,kBAAkB,CAAA,GAAI,EAAA;AAE5B,SAAS,eAAe,KAAA,EAAiC;AACvD,EAAA,OAAO,OAAO,KAAA,KAAU,QAAA,IAAY,MAAA,CAAO,SAAS,KAAK,CAAA;AAC3D;AAIO,SAAS,cAAc,GAAA,EAAwD;AACpF,EAAA,IAAI,OAAO,GAAA,KAAQ,QAAA,IAAY,MAAA,CAAO,QAAA,CAAS,GAAG,CAAA,EAAG;AACnD,IAAA,OAAO,GAAA;AAAA,EACT;AAEA,EAAA,IAAI,CAAC,GAAA,IAAO,OAAO,GAAA,KAAQ,UAAU,OAAO,IAAA;AAE5C,EAAA,MAAM,OAAA,GAAU,IAAI,IAAA,EAAK;AACzB,EAAA,IAAI,CAAC,SAAS,OAAO,IAAA;AAErB,EAAA,MAAM,KAAA,GAAQ,OAAA,CAAQ,KAAA,CAAM,kBAAkB,CAAA;AAC9C,EAAA,IAAI,CAAC,OAAO,OAAO,IAAA;AAEnB,EAAA,MAAM,GAAG,OAAA,EAAS,QAAA,EAAU,UAAA,EAAY,UAAU,CAAA,GAAI,KAAA;AAEtD,EAAA,IAAI,CAAC,OAAA,IAAW,CAAC,YAAY,CAAC,UAAA,IAAc,CAAC,UAAA,EAAY;AACvD,IAAA,OAAO,IAAA;AAAA,EACT;AAEA,EAAA,IAAI,KAAA,GAAQ,CAAA;AACZ,EAAA,IAAI,OAAA,EAAS,KAAA,IAAS,UAAA,CAAW,OAAO,IAAI,EAAA,GAAK,EAAA;AACjD,EAAA,IAAI,QAAA,EAAU,KAAA,IAAS,UAAA,CAAW,QAAQ,CAAA,GAAI,EAAA;AAC9C,EAAA,IAAI,UAAA,EAAY,KAAA,IAAS,UAAA,CAAW,UAAU,CAAA;AAC9C,EAAA,IAAI,YAAY,KAAA,IAAS,IAAA,CAAK,KAAK,UAAA,CAAW,UAAU,IAAI,EAAE,CAAA;AAE9D,EAAA,OAAO,IAAA,CAAK,MAAM,KAAK,CAAA;AACzB;AAIO,SAAS,eAAe,OAAA,EAA4C;AACzE,EAAA,IAAI,CAAC,cAAA,CAAe,OAAO,CAAA,IAAK,WAAW,CAAA,EAAG;AAC5C,IAAA,OAAO,MAAA;AAAA,EACT;AAEA,EAAA,MAAM,OAAA,GAAU,IAAA,CAAK,KAAA,CAAM,OAAO,CAAA;AAClC,EAAA,MAAM,IAAA,GAAO,IAAA,CAAK,KAAA,CAAM,OAAA,IAAW,KAAK,EAAA,CAAG,CAAA;AAC3C,EAAA,MAAM,SAAA,GAAY,WAAW,EAAA,GAAK,EAAA,CAAA;AAClC,EAAA,MAAM,KAAA,GAAQ,IAAA,CAAK,KAAA,CAAM,SAAA,GAAY,EAAE,CAAA;AACvC,EAAA,MAAM,OAAO,SAAA,GAAY,EAAA;AAEzB,EAAA,IAAI,MAAA,GAAS,GAAA;AAEb,EAAA,IAAI,OAAO,CAAA,EAAG;AACZ,IAAA,MAAA,IAAU,GAAG,IAAI,CAAA,CAAA,CAAA;AAAA,EACnB;AAEA,EAAA,IAAI,KAAA,GAAQ,CAAA,IAAK,IAAA,GAAO,CAAA,EAAG;AACzB,IAAA,MAAA,IAAU,GAAA;AACV,IAAA,IAAI,QAAQ,CAAA,EAAG;AACb,MAAA,MAAA,IAAU,GAAG,KAAK,CAAA,CAAA,CAAA;AAAA,IACpB;AACA,IAAA,IAAI,OAAO,CAAA,EAAG;AACZ,MAAA,MAAA,IAAU,GAAG,IAAI,CAAA,CAAA,CAAA;AAAA,IACnB;AAAA,EACF;AAEA,EAAA,IAAI,WAAW,GAAA,EAAK;AAClB,IAAA,OAAO,MAAA;AAAA,EACT;AAEA,EAAA,OAAO,MAAA;AACT;AAIO,SAAS,mBAAmB,IAAA,EAAgD;AACjF,EAAA,IAAI,CAAC,IAAA,IAAQ,OAAO,IAAA,KAAS,UAAU,OAAO,IAAA;AAE9C,EAAA,MAAM,UAAA,GAAa,IAAA,CAAK,WAAA,EAAY,CAAE,IAAA,EAAK;AAC3C,EAAA,IAAI,CAAC,YAAY,OAAO,IAAA;AAExB,EAAA,IAAI,eAAe,WAAA,EAAa;AAC9B,IAAA,OAAO,eAAA;AAAA,EACT;AAEA,EAAA,IAAI,KAAA,GAAQ,CAAA;AAEZ,EAAA,MAAM,SAAA,GAAY,2CAAA;AAClB,EAAA,IAAI,SAAA;AACJ,EAAA,OAAA,CAAQ,SAAA,GAAY,SAAA,CAAU,IAAA,CAAK,UAAU,OAAO,IAAA,EAAM;AACxD,IAAA,KAAA,IAAS,UAAA,CAAW,SAAA,CAAU,CAAC,CAAC,CAAA,GAAI,EAAA;AAAA,EACtC;AAEA,EAAA,MAAM,WAAA,GAAc,+CAAA;AACpB,EAAA,IAAI,WAAA;AACJ,EAAA,OAAA,CAAQ,WAAA,GAAc,WAAA,CAAY,IAAA,CAAK,UAAU,OAAO,IAAA,EAAM;AAC5D,IAAA,KAAA,IAAS,UAAA,CAAW,WAAA,CAAY,CAAC,CAAC,CAAA;AAAA,EACpC;AAEA,EAAA,IAAI,SAAS,CAAA,EAAG;AACd,IAAA,OAAO,IAAA;AAAA,EACT;AAEA,EAAA,OAAO,IAAA,CAAK,MAAM,KAAK,CAAA;AACzB;AAIO,SAAS,mBAAmB,KAAA,EAAiD;AAClF,EAAA,MAAM,GAAA,GAAM,cAAc,KAAK,CAAA;AAC/B,EAAA,IAAI,QAAQ,IAAA,EAAM;AAChB,IAAA,OAAO,GAAA;AAAA,EACT;AACA,EAAA,OAAO,mBAAmB,KAAK,CAAA;AACjC;;;AC/FO,SAAS,WAAA,CAAY,MAAA,EAAgB,OAAA,GAA8B,EAAC,EAAW;AACpF,EAAA,MAAM,UAAA,GAAa,iBAAA,CAAkB,MAAA,EAAQ,OAAO,CAAA;AACpD,EAAA,MAAM,MAAA,GAAiB,UAAU,MAAM,CAAA;AAEvC,EAAA,iBAAA,CAAkB,MAAA,EAAQ,SAAS,UAAU,CAAA;AAE7C,EAAA,MAAM,WAAA,GAAc,4BAAA,CAA6B,MAAA,CAAO,WAAA,IAAe,EAAE,CAAA;AACzE,EAAA,MAAM,aAAA,uBAAoB,GAAA,EAAoB;AAC9C,EAAA,MAAM,qBAAmC,EAAC;AAE1C,EAAA,kBAAA,CAAmB,MAAA,CAAO,WAAA,IAAe,EAAC,EAAG,kBAAkB,CAAA;AAE/D,EAAA,kBAAA,CACG,OAAO,CAAA,GAAA,KAAI;AAlChB,IAAA,IAAAA,GAAAA;AAkCoB,IAAA,OAAA,CAAA,CAAA,CAAAA,MAAA,GAAA,CAAI,OAAA,KAAJ,IAAA,GAAA,MAAA,GAAAA,GAAAA,CAAa,SAAQ,QAAA,MAAc,mBAAA;AAAA,EAAA,CAAmB,CAAA,CACrE,QAAQ,CAAA,GAAA,KAAO;AACd,IAAA,MAAM,GAAA,GAAM,iBAAiB,GAAG,CAAA;AAChC,IAAA,aAAA,CAAc,GAAA,CAAI,GAAA,EAAK,8BAAA,CAA+B,GAAA,EAAK,UAAU,CAAC,CAAA;AAAA,EACxE,CAAC,CAAA;AAEH,EAAA,kBAAA,CACG,OAAO,CAAA,GAAA,KAAI;AAzChB,IAAA,IAAAA,GAAAA;AAyCmB,IAAA,OAAA,CAAA,CAAAA,GAAAA,GAAA,GAAA,CAAI,OAAA,KAAJ,IAAA,GAAA,MAAA,GAAAA,IAAa,IAAA,MAAS,mBAAA;AAAA,EAAA,CAAmB,CAAA,CACvD,QAAQ,CAAA,GAAA,KAAO;AA1CpB,IAAA,IAAAA,GAAAA,EAAAC,GAAAA;AA2CM,IAAA,MAAM,GAAA,GAAM,iBAAiB,GAAG,CAAA;AAChC,IAAA,MAAM,UAAU,GAAA,CAAI,OAAA;AAEpB,IAAA,IAAI,EAAC,mCAAS,WAAA,CAAA,EAAa;AACzB,MAAA,MAAM,IAAI,KAAA,CAAM,CAAA,+BAAA,EAAkC,GAAG,CAAA,0BAAA,CAA4B,CAAA;AAAA,IACnF;AAEA,IAAA,MAAM,eAAA,GAAkB,aAAA,CAAc,GAAA,CAAI,OAAA,CAAQ,WAAW,CAAA;AAC7D,IAAA,IAAI,oBAAoB,MAAA,EAAW;AACjC,MAAA,MAAM,IAAI,KAAA,CAAM,CAAA,sBAAA,EAAyB,QAAQ,WAAW,CAAA,yCAAA,EAA4C,GAAG,CAAA,CAAA,CAAG,CAAA;AAAA,IAChH;AAEA,IAAA,MAAM,eAAaD,GAAAA,GAAA,GAAA,CAAI,QAAA,KAAJ,IAAA,GAAA,MAAA,GAAAA,IAAc,MAAA,KAAU,CAAA;AAC3C,IAAA,MAAM,aAAA,GAAgB,WAAA,CAAY,GAAA,CAAI,OAAA,CAAQ,WAAW,CAAA;AACzD,IAAA,MAAM,MAAA,GAAA,CAASC,MAAA,OAAA,CAAQ,MAAA,KAAR,OAAAA,GAAAA,GAAmB,aAAA,GAAgB,aAAa,aAAA,GAAgB,MAAA;AAC/E,IAAA,IAAI,WAAW,MAAA,EAAW;AACxB,MAAA,MAAM,IAAI,KAAA,CAAM,CAAA,8DAAA,EAAiE,GAAG,CAAA,CAAA,CAAG,CAAA;AAAA,IACzF;AAEA,IAAA,aAAA,CAAc,GAAA,CAAI,GAAA,EAAK,eAAA,GAAkB,MAAM,CAAA;AAAA,EACjD,CAAC,CAAA;AAEH,EAAA,kBAAA,CAAmB,QAAQ,CAAA,GAAA,KAAO;AAChC,IAAA,MAAM,GAAA,GAAM,iBAAiB,GAAG,CAAA;AAChC,IAAA,MAAM,MAAA,GAAS,aAAA,CAAc,GAAA,CAAI,GAAG,CAAA;AACpC,IAAA,IAAI,WAAW,MAAA,EAAW;AAE1B,IAAA,IAAI,CAAC,IAAI,QAAA,EAAU;AACjB,MAAA,GAAA,CAAI,QAAA,GAAW,EAAE,MAAA,EAAQ,IAAA,EAAM,IAAA,EAAK;AAAA,IACtC,CAAA,MAAO;AACL,MAAA,GAAA,CAAI,SAAS,MAAA,GAAS,MAAA;AAAA,IACxB;AAAA,EACF,CAAC,CAAA;AAED,EAAA,qBAAA,CAAsB,MAAA,CAAO,YAAA,IAAgB,EAAC,EAAG,UAAU,CAAA;AAE3D,EAAA,OAAO,MAAA;AACT;AAIA,SAAS,iBAAA,CAAkB,QAAgB,OAAA,EAAqC;AApFhF,EAAA,IAAAD,GAAAA,EAAAC,GAAAA;AAqFE,EAAA,IAAI,OAAA,CAAQ,UAAA,IAAc,OAAA,CAAQ,UAAA,GAAa,CAAA,EAAG;AAChD,IAAA,OAAO,OAAA,CAAQ,UAAA;AAAA,EACjB;AAEA,EAAA,IAAA,CAAID,GAAAA,GAAA,OAAA,CAAQ,WAAA,KAAR,IAAA,GAAA,MAAA,GAAAA,IAAqB,MAAA,EAAQ;AAC/B,IAAA,MAAM,SAAOC,GAAAA,GAAA,MAAA,CAAO,KAAA,KAAP,IAAA,GAAA,MAAA,GAAAA,IAAc,MAAA,KAAU,CAAA;AACrC,IAAA,OAAO,OAAA,CAAQ,YAAY,MAAA,GAAS,IAAA;AAAA,EACtC;AAEA,EAAA,OAAO,CAAA;AACT;AAEA,SAAS,iBAAA,CAAkB,MAAA,EAAgB,OAAA,EAA6B,UAAA,EAAoB;AAjG5F,EAAA,IAAAD,KAAAC,GAAAA,EAAA,EAAA,EAAA,EAAA,EAAA,EAAA,EAAA,EAAA,EAAA,EAAA;AAkGE,EAAA,MAAM,UAAA,GAAA,CAAaA,OAAAD,GAAAA,GAAA,MAAA,CAAO,UAAP,IAAA,GAAA,MAAA,GAAAA,GAAAA,CAAc,MAAA,KAAd,IAAA,GAAAC,GAAAA,GAAwB,CAAA;AAC3C,EAAA,MAAM,gBAAe,EAAA,GAAA,CAAA,EAAA,GAAA,OAAA,CAAQ,WAAA,KAAR,IAAA,GAAA,MAAA,GAAA,EAAA,CAAqB,MAAA,KAArB,YAA+B,UAAA,GAAa,UAAA;AACjE,EAAA,MAAM,IAAA,GAAA,CAAO,mBAAQ,WAAA,KAAR,IAAA,GAAA,MAAA,GAAA,EAAA,CAAqB,SAArB,IAAA,GAAA,EAAA,GAAA,CAA6B,EAAA,GAAA,MAAA,CAAO,UAAP,IAAA,GAAA,MAAA,GAAA,EAAA,CAAc,IAAA;AAExD,EAAA,IAAI,CAAC,MAAA,CAAO,KAAA,IAAS,CAAC,QAAQ,WAAA,EAAa;AAE3C,EAAA,MAAA,CAAO,KAAA,GAAQ;AAAA,IACb,MAAA,EAAQ,YAAA;AAAA,IACR,MAAM,IAAA,IAAA,IAAA,GAAA,IAAA,GAAQ;AAAA,GAChB;AACF;AAEA,SAAS,iBAAiB,GAAA,EAAyB;AACjD,EAAA,OAAO,GAAA,CAAI,MAAM,GAAA,CAAI,IAAA;AACvB;AAEA,SAAS,8BAAA,CAA+B,KAAiB,UAAA,EAA4B;AAlHrF,EAAA,IAAAD,KAAAC,GAAAA,EAAA,EAAA,EAAA,EAAA,EAAA,EAAA,EAAA,EAAA;AAmHE,EAAA,MAAM,eAAaD,GAAAA,GAAA,GAAA,CAAI,QAAA,KAAJ,IAAA,GAAA,MAAA,GAAAA,IAAc,MAAA,KAAU,CAAA;AAC3C,EAAA,MAAM,SAAOC,GAAAA,GAAA,GAAA,CAAI,OAAA,KAAJ,IAAA,GAAA,MAAA,GAAAA,IAAa,IAAA,KAAQ,QAAA;AAElC,EAAA,QAAQ,IAAA;AAAM,IACZ,KAAK,OAAA;AACH,MAAA,OAAO,UAAA;AAAA,IACT,KAAK,UAAA,EAAY;AACf,MAAA,MAAM,SAAS,UAAA,GAAa,UAAA;AAC5B,MAAA,MAAM,IAAA,GAAA,CAAQ,EAAA,GAAA,CAAA,EAAA,GAAA,GAAA,CAAI,OAAA,KAAJ,IAAA,GAAA,MAAA,GAAA,EAAA,CAAqB,YAArB,IAAA,GAAA,EAAA,GAAgC,CAAA;AAC9C,MAAA,MAAM,OAAA,GAAU,IAAA,CAAK,KAAA,CAAM,MAAA,GAAS,IAAI,CAAA,GAAI,IAAA;AAC5C,MAAA,OAAO,IAAA,CAAK,MAAM,OAAO,CAAA;AAAA,IAC3B;AAAA,IACA,KAAK,cAAA,EAAgB;AACnB,MAAA,MAAM,MAAA,GAAA,CAAU,EAAA,GAAA,CAAA,EAAA,GAAA,GAAA,CAAI,OAAA,KAAJ,IAAA,GAAA,MAAA,GAAA,EAAA,CAAqB,WAArB,IAAA,GAAA,EAAA,GAA+B,CAAA;AAC/C,MAAA,OAAO,aAAa,UAAA,GAAa,MAAA;AAAA,IACnC;AAAA,IACA;AACE,MAAA,OAAO,UAAA,GAAa,UAAA;AAAA;AAE1B;AAEA,SAAS,kBAAA,CAAmB,OAAyB,MAAA,EAAsB;AACzE,EAAA,KAAA,CAAM,QAAQ,CAAA,IAAA,KAAQ;AACpB,IAAA,IAAI,OAAO,SAAS,QAAA,EAAU;AAC9B,IAAA,IAAI,gBAAgB,IAAA,EAAM;AACxB,MAAA,kBAAA,CAAmB,IAAA,CAAK,OAAO,MAAM,CAAA;AAAA,IACvC,CAAA,MAAO;AACL,MAAA,MAAA,CAAO,KAAK,IAAI,CAAA;AAAA,IAClB;AAAA,EACF,CAAC,CAAA;AACH;AAEA,SAAS,4BAAA,CAA6B,KAAA,EAAyB,GAAA,mBAAM,IAAI,KAAoB,EAAG;AAC9F,EAAA,KAAA,CAAM,QAAQ,CAAA,IAAA,KAAQ;AApJxB,IAAA,IAAAD,GAAAA,EAAAC,GAAAA;AAqJI,IAAA,IAAI,OAAO,SAAS,QAAA,EAAU;AAC9B,IAAA,IAAI,gBAAgB,IAAA,EAAM;AACxB,MAAA,4BAAA,CAA6B,IAAA,CAAK,OAAO,GAAG,CAAA;AAAA,IAC9C,CAAA,MAAO;AACL,MAAA,GAAA,CAAI,GAAA,CAAI,gBAAA,CAAiB,IAAI,CAAA,EAAA,CAAGA,GAAAA,GAAAA,CAAAD,GAAAA,GAAA,IAAA,CAAK,QAAA,KAAL,IAAA,GAAA,MAAA,GAAAA,GAAAA,CAAe,MAAA,KAAf,IAAA,GAAAC,MAAyB,CAAC,CAAA;AAAA,IAC5D;AAAA,EACF,CAAC,CAAA;AACD,EAAA,OAAO,GAAA;AACT;AAEA,SAAS,qBAAA,CAAsB,OAA0B,UAAA,EAAoB;AAC3E,EAAA,KAAA,CAAM,QAAQ,CAAA,IAAA,KAAQ;AACpB,IAAA,IAAI,OAAO,SAAS,QAAA,EAAU;AAE9B,IAAA,IAAI,gBAAgB,IAAA,EAAM;AACxB,MAAA,qBAAA,CAAsB,IAAA,CAAK,OAAO,UAAU,CAAA;AAC5C,MAAA;AAAA,IACF;AAEA,IAAA,MAAM,SAAS,IAAA,CAAK,MAAA;AACpB,IAAA,IAAI,CAAC,MAAA,EAAQ;AAEb,IAAA,MAAM,YAAA,GAAe,iBAAA,CAAkB,MAAA,CAAO,QAAQ,CAAA;AACtD,IAAA,MAAM,WAAA,GAAc,OAAO,OAAA,IAAW,OAAA;AACtC,IAAA,IAAI,WAAA,GAAc,YAAA;AAElB,IAAA,IAAI,gBAAgB,QAAA,EAAU;AAC5B,MAAA,WAAA,GAAc,YAAA,GAAe,UAAA;AAAA,IAC/B,CAAA,MAAA,IAAW,gBAAgB,MAAA,EAAQ;AACjC,MAAA,WAAA,GAAc,YAAA,GAAe,IAAA,CAAK,IAAA,CAAK,UAAU,CAAA;AAAA,IACnD;AAEA,IAAA,MAAA,CAAO,QAAA,GAAW,IAAA,CAAK,IAAA,CAAK,WAAW,CAAA;AAAA,EACzC,CAAC,CAAA;AACH;AAEA,SAAS,UAAa,KAAA,EAAa;AACjC,EAAA,OAAO,IAAA,CAAK,KAAA,CAAM,IAAA,CAAK,SAAA,CAAU,KAAK,CAAC,CAAA;AACzC;AAEA,SAAS,kBAAkB,QAAA,EAAoC;AAC7D,EAAA,IAAI,OAAO,QAAA,KAAa,QAAA,IAAY,MAAA,CAAO,QAAA,CAAS,QAAQ,CAAA,EAAG;AAC7D,IAAA,OAAO,QAAA;AAAA,EACT;AAEA,EAAA,IAAI,OAAO,aAAa,QAAA,IAAY,QAAA,CAAS,MAAK,CAAE,UAAA,CAAW,GAAG,CAAA,EAAG;AACnE,IAAA,MAAM,MAAA,GAAS,aAAA,CAAc,QAAA,CAAS,IAAA,EAAM,CAAA;AAC5C,IAAA,IAAI,WAAW,IAAA,EAAM;AACnB,MAAA,OAAO,MAAA;AAAA,IACT;AAAA,EACF;AAEA,EAAA,OAAO,CAAA;AACT;;;AC1MA,IAAA,mBAAA,GAAA;AAAA,EACE,OAAA,EAAW,yCAAA;AAAA,EACX,GAAA,EAAO,oDAAA;AAAA,EACP,KAAA,EAAS,6BAAA;AAAA,EACT,WAAA,EAAe,iGAAA;AAAA,EACf,IAAA,EAAQ,QAAA;AAAA,EACR,oBAAA,EAAwB,IAAA;AAAA,EACxB,UAAA,EAAc;AAAA,IACZ,OAAA,EAAS;AAAA,MACP,KAAA,EAAS,QAAA;AAAA,MACT,WAAA,EAAe;AAAA,KACjB;AAAA,IACA,OAAA,EAAW;AAAA,MACT,IAAA,EAAQ,QAAA;AAAA,MACR,WAAA,EAAe;AAAA,KACjB;AAAA,IACA,OAAA,EAAW;AAAA,MACT,IAAA,EAAQ,OAAA;AAAA,MACR,WAAA,EAAe,mDAAA;AAAA,MACf,KAAA,EAAS;AAAA,QACP,IAAA,EAAQ;AAAA;AACV,KACF;AAAA,IACA,IAAA,EAAQ;AAAA,MACN,IAAA,EAAQ,QAAA;AAAA,MACR,WAAA,EAAe;AAAA,KACjB;AAAA,IACA,WAAA,EAAe;AAAA,MACb,IAAA,EAAQ,OAAA;AAAA,MACR,WAAA,EAAe;AAAA,KACjB;AAAA,IACA,YAAA,EAAgB;AAAA,MACd,IAAA,EAAQ,OAAA;AAAA,MACR,WAAA,EAAe;AAAA;AACjB,GACF;AAAA,EACA,QAAA,EAAY,CAAC,OAAO;AACtB,CAAA;;;ACrCA,IAAA,mBAAA,GAAA;AAAA,EACE,OAAA,EAAW,yCAAA;AAAA,EACX,GAAA,EAAO,6DAAA;AAAA,EACP,KAAA,EAAS,8BAAA;AAAA,EACT,WAAA,EAAe,qGAAA;AAAA,EACf,KAAA,EAAS;AAAA,IACP,EAAE,MAAQ,oDAAA,EAAqD;AAAA,IAC/D;AAAA,MACE,IAAA,EAAQ,QAAA;AAAA,MACR,UAAA,EAAc;AAAA,QACZ,OAAA,EAAW,EAAE,KAAA,EAAS,MAAA,EAAO;AAAA,QAC7B,OAAA,EAAW;AAAA,UACT,IAAA,EAAQ,OAAA;AAAA,UACR,KAAA,EAAS,EAAE,IAAA,EAAQ,QAAA,EAAS;AAAA,UAC5B,WAAA,EAAe,IAAA;AAAA,UACf,SAAW;AAAC,SACd;AAAA,QACA,IAAA,EAAQ,EAAE,IAAA,EAAQ,QAAA,EAAU,WAAa,CAAA,EAAE;AAAA,QAC3C,WAAA,EAAe,EAAE,IAAA,EAAQ,OAAA,EAAS,UAAY,CAAA,EAAE;AAAA,QAChD,YAAA,EAAgB,EAAE,IAAA,EAAQ,OAAA,EAAS,UAAY,CAAA;AAAE,OACnD;AAAA,MACA,QAAA,EAAY,CAAC,SAAA,EAAW,MAAA,EAAQ,eAAe,cAAc,CAAA;AAAA,MAC7D,oBAAA,EAAwB;AAAA;AAC1B;AAEJ,CAAA;;;ACzBA,IAAA,sBAAA,GAAA;AAAA,EACE,OAAA,EAAW,yCAAA;AAAA,EACX,GAAA,EAAO,gEAAA;AAAA,EACP,KAAA,EAAS,iCAAA;AAAA,EACT,WAAA,EAAe,yGAAA;AAAA,EACf,KAAA,EAAS;AAAA,IACP;AAAA,MACE,IAAA,EAAQ;AAAA,KACV;AAAA,IACA;AAAA,MACE,IAAA,EAAQ,QAAA;AAAA,MACR,UAAA,EAAc;AAAA,QACZ,OAAA,EAAW;AAAA,UACT,KAAA,EAAS;AAAA,SACX;AAAA,QACA,OAAA,EAAW;AAAA,UACT,IAAA,EAAQ,OAAA;AAAA,UACR,KAAA,EAAS;AAAA,YACP,IAAA,EAAQ,QAAA;AAAA,YACR,IAAA,EAAQ;AAAA,cACN,eAAA;AAAA,cACA,YAAA;AAAA,cACA,SAAA;AAAA,cACA,aAAA;AAAA,cACA;AAAA;AACF,WACF;AAAA,UACA,SAAW;AAAC,SACd;AAAA,QACA,IAAA,EAAQ;AAAA,UACN,IAAA,EAAQ,QAAA;AAAA,UACR,SAAA,EAAa;AAAA,SACf;AAAA,QACA,WAAA,EAAe;AAAA,UACb,IAAA,EAAQ,OAAA;AAAA,UACR,QAAA,EAAY;AAAA,SACd;AAAA,QACA,YAAA,EAAgB;AAAA,UACd,IAAA,EAAQ,OAAA;AAAA,UACR,QAAA,EAAY;AAAA;AACd,OACF;AAAA,MACA,QAAA,EAAY;AAAA,QACV,SAAA;AAAA,QACA,MAAA;AAAA,QACA,aAAA;AAAA,QACA;AAAA,OACF;AAAA,MACA,oBAAA,EAAwB;AAAA;AAC1B;AAEJ,CAAA;;;ACnDA,IAAA,cAAA,GAAA;AAAA,EACE,OAAA,EAAW,yCAAA;AAAA,EACX,GAAA,EAAO,oEAAA;AAAA,EACP,KAAA,EAAS,qCAAA;AAAA,EACT,WAAA,EAAe,+GAAA;AAAA,EACf,IAAA,EAAQ,QAAA;AAAA,EACR,UAAA,EAAc;AAAA,IACZ,OAAA,EAAW,EAAE,IAAA,EAAQ,QAAA,EAAS;AAAA,IAC9B,OAAA,EAAW;AAAA,MACT,IAAA,EAAQ,OAAA;AAAA,MACR,KAAA,EAAS,EAAE,IAAA,EAAQ,QAAA;AAAS,KAC9B;AAAA,IACA,QAAA,EAAY;AAAA,MACV,IAAA,EAAQ,QAAA;AAAA,MACR,UAAA,EAAc;AAAA,QACZ,KAAA,EAAS,EAAE,IAAA,EAAQ,OAAA;AAAQ,OAC7B;AAAA,MACA,oBAAA,EAAwB;AAAA;AAC1B,GACF;AAAA,EACA,KAAA,EAAS;AAAA,IACP;AAAA,MACE,EAAA,EAAM;AAAA,QACJ,UAAA,EAAc;AAAA,UACZ,OAAA,EAAW;AAAA,YACT,IAAA,EAAQ,OAAA;AAAA,YACR,QAAA,EAAY,EAAE,KAAA,EAAS,YAAA;AAAa;AACtC;AACF,OACF;AAAA,MACA,IAAA,EAAQ;AAAA,QACN,QAAA,EAAY,CAAC,UAAA,EAAY,SAAS,CAAA;AAAA,QAClC,UAAA,EAAc;AAAA,UACZ,OAAA,EAAW,EAAE,KAAA,EAAS,MAAA;AAAO;AAC/B;AACF,KACF;AAAA,IACA;AAAA,MACE,EAAA,EAAM;AAAA,QACJ,QAAA,EAAY,CAAC,UAAU;AAAA,OACzB;AAAA,MACA,IAAA,EAAQ;AAAA,QACN,QAAA,EAAY,CAAC,SAAA,EAAW,SAAS,CAAA;AAAA,QACjC,UAAA,EAAc;AAAA,UACZ,OAAA,EAAW;AAAA,YACT,IAAA,EAAQ,OAAA;AAAA,YACR,KAAA,EAAS,EAAE,IAAA,EAAQ,QAAA,EAAS;AAAA,YAC5B,QAAA,EAAY,EAAE,KAAA,EAAS,YAAA;AAAa,WACtC;AAAA,UACA,OAAA,EAAW,EAAE,KAAA,EAAS,MAAA;AAAO;AAC/B;AACF;AACF,GACF;AAAA,EACA,oBAAA,EAAwB;AAC1B,CAAA;;;ACvDA,IAAAC,eAAAA,GAAA;AAAA,EACE,OAAA,EAAW,yCAAA;AAAA,EACX,GAAA,EAAO,qEAAA;AAAA,EACP,KAAA,EAAS,sCAAA;AAAA,EACT,WAAA,EAAe,wGAAA;AAAA,EACf,IAAA,EAAQ,QAAA;AAAA,EACR,UAAA,EAAc;AAAA,IACZ,OAAA,EAAW;AAAA,MACT,IAAA,EAAQ,OAAA;AAAA,MACR,KAAA,EAAS,EAAE,IAAA,EAAQ,QAAA;AAAS,KAC9B;AAAA,IACA,SAAA,EAAa;AAAA,MACX,IAAA,EAAQ,QAAA;AAAA,MACR,UAAA,EAAc;AAAA,QACZ,QAAA,EAAY,EAAE,IAAA,EAAQ,QAAA,EAAS;AAAA,QAC/B,SAAA,EAAa,EAAE,IAAA,EAAQ,QAAA;AAAS,OAClC;AAAA,MACA,oBAAA,EAAwB;AAAA;AAC1B,GACF;AAAA,EACA,KAAA,EAAS;AAAA,IACP;AAAA,MACE,EAAA,EAAM;AAAA,QACJ,UAAA,EAAc;AAAA,UACZ,OAAA,EAAW;AAAA,YACT,IAAA,EAAQ,OAAA;AAAA,YACR,QAAA,EAAY,EAAE,KAAA,EAAS,aAAA;AAAc;AACvC;AACF,OACF;AAAA,MACA,IAAA,EAAQ;AAAA,QACN,QAAA,EAAY,CAAC,WAAW;AAAA;AAC1B,KACF;AAAA,IACA;AAAA,MACE,EAAA,EAAM;AAAA,QACJ,QAAA,EAAY,CAAC,WAAW;AAAA,OAC1B;AAAA,MACA,IAAA,EAAQ;AAAA,QACN,QAAA,EAAY,CAAC,SAAS,CAAA;AAAA,QACtB,UAAA,EAAc;AAAA,UACZ,OAAA,EAAW;AAAA,YACT,IAAA,EAAQ,OAAA;AAAA,YACR,KAAA,EAAS,EAAE,IAAA,EAAQ,QAAA,EAAS;AAAA,YAC5B,QAAA,EAAY,EAAE,KAAA,EAAS,aAAA;AAAc;AACvC;AACF;AACF;AACF,GACF;AAAA,EACA,oBAAA,EAAwB;AAC1B,CAAA;;;ACnDA,IAAAA,eAAAA,GAAA;AAAA,EACE,OAAA,EAAW,yCAAA;AAAA,EACX,GAAA,EAAO,uEAAA;AAAA,EACP,KAAA,EAAS,wCAAA;AAAA,EACT,WAAA,EAAe,iHAAA;AAAA,EACf,IAAA,EAAQ,QAAA;AAAA,EACR,UAAA,EAAc;AAAA,IACZ,OAAA,EAAW;AAAA,MACT,IAAA,EAAQ,OAAA;AAAA,MACR,KAAA,EAAS,EAAE,IAAA,EAAQ,QAAA;AAAS,KAC9B;AAAA,IACA,WAAA,EAAe;AAAA,MACb,IAAA,EAAQ,QAAA;AAAA,MACR,UAAA,EAAc;AAAA,QACZ,GAAA,EAAO,EAAE,IAAA,EAAQ,QAAA,EAAS;AAAA,QAC1B,MAAA,EAAU,EAAE,IAAA,EAAQ,QAAA,EAAS;AAAA,QAC7B,aAAA,EAAiB,EAAE,IAAA,EAAQ,QAAA;AAAS,OACtC;AAAA,MACA,oBAAA,EAAwB;AAAA;AAC1B,GACF;AAAA,EACA,KAAA,EAAS;AAAA,IACP;AAAA,MACE,EAAA,EAAM;AAAA,QACJ,UAAA,EAAc;AAAA,UACZ,OAAA,EAAW;AAAA,YACT,IAAA,EAAQ,OAAA;AAAA,YACR,QAAA,EAAY,EAAE,KAAA,EAAS,eAAA;AAAgB;AACzC;AACF,OACF;AAAA,MACA,IAAA,EAAQ;AAAA,QACN,QAAA,EAAY,CAAC,aAAa;AAAA;AAC5B,KACF;AAAA,IACA;AAAA,MACE,EAAA,EAAM;AAAA,QACJ,QAAA,EAAY,CAAC,aAAa;AAAA,OAC5B;AAAA,MACA,IAAA,EAAQ;AAAA,QACN,QAAA,EAAY,CAAC,SAAS,CAAA;AAAA,QACtB,UAAA,EAAc;AAAA,UACZ,OAAA,EAAW;AAAA,YACT,IAAA,EAAQ,OAAA;AAAA,YACR,KAAA,EAAS,EAAE,IAAA,EAAQ,QAAA,EAAS;AAAA,YAC5B,QAAA,EAAY,EAAE,KAAA,EAAS,eAAA;AAAgB;AACzC;AACF;AACF;AACF,GACF;AAAA,EACA,oBAAA,EAAwB;AAC1B,CAAA;;;ACpDA,IAAAA,eAAAA,GAAA;AAAA,EACE,OAAA,EAAW,yCAAA;AAAA,EACX,GAAA,EAAO,oEAAA;AAAA,EACP,KAAA,EAAS,qCAAA;AAAA,EACT,WAAA,EAAe,uJAAA;AAAA,EACf,IAAA,EAAQ,QAAA;AAAA,EACR,UAAA,EAAc;AAAA,IACZ,OAAA,EAAW;AAAA,MACT,IAAA,EAAQ,OAAA;AAAA,MACR,KAAA,EAAS,EAAE,IAAA,EAAQ,QAAA;AAAS,KAC9B;AAAA,IACA,QAAA,EAAY;AAAA,MACV,IAAA,EAAQ,QAAA;AAAA,MACR,UAAA,EAAc;AAAA,QACZ,QAAA,EAAY,EAAE,IAAA,EAAQ,OAAA,EAAS,OAAS,EAAE,IAAA,EAAQ,UAAS,EAAE;AAAA,QAC7D,QAAA,EAAY,EAAE,IAAA,EAAQ,QAAA,EAAS;AAAA,QAC/B,OAAA,EAAW,EAAE,IAAA,EAAQ,QAAA;AAAS,OAChC;AAAA,MACA,oBAAA,EAAwB;AAAA;AAC1B,GACF;AAAA,EACA,KAAA,EAAS;AAAA,IACP;AAAA,MACE,EAAA,EAAM;AAAA,QACJ,UAAA,EAAc;AAAA,UACZ,OAAA,EAAW;AAAA,YACT,IAAA,EAAQ,OAAA;AAAA,YACR,QAAA,EAAY,EAAE,KAAA,EAAS,YAAA;AAAa;AACtC;AACF,OACF;AAAA,MACA,IAAA,EAAQ;AAAA,QACN,QAAA,EAAY,CAAC,UAAU;AAAA;AACzB,KACF;AAAA,IACA;AAAA,MACE,EAAA,EAAM;AAAA,QACJ,QAAA,EAAY,CAAC,UAAU;AAAA,OACzB;AAAA,MACA,IAAA,EAAQ;AAAA,QACN,QAAA,EAAY,CAAC,SAAS,CAAA;AAAA,QACtB,UAAA,EAAc;AAAA,UACZ,OAAA,EAAW;AAAA,YACT,IAAA,EAAQ,OAAA;AAAA,YACR,KAAA,EAAS,EAAE,IAAA,EAAQ,QAAA,EAAS;AAAA,YAC5B,QAAA,EAAY,EAAE,KAAA,EAAS,YAAA;AAAa;AACtC;AACF;AACF;AACF,GACF;AAAA,EACA,oBAAA,EAAwB;AAC1B,CAAA;;;ACpDA,IAAAA,eAAAA,GAAA;AAAA,EACE,OAAA,EAAW,yCAAA;AAAA,EACX,GAAA,EAAO,iEAAA;AAAA,EACP,KAAA,EAAS,kCAAA;AAAA,EACT,WAAA,EAAe,0HAAA;AAAA,EACf,IAAA,EAAQ,QAAA;AAAA,EACR,UAAA,EAAc;AAAA,IACZ,OAAA,EAAW;AAAA,MACT,IAAA,EAAQ,OAAA;AAAA,MACR,KAAA,EAAS,EAAE,IAAA,EAAQ,QAAA;AAAS,KAC9B;AAAA,IACA,KAAA,EAAS;AAAA,MACP,IAAA,EAAQ,QAAA;AAAA,MACR,UAAA,EAAc;AAAA,QACZ,MAAA,EAAU,EAAE,IAAA,EAAQ,OAAA,EAAS,OAAS,EAAE,IAAA,EAAQ,UAAS,EAAE;AAAA,QAC3D,MAAA,EAAU,EAAE,IAAA,EAAQ,OAAA,EAAS,OAAS,EAAE,IAAA,EAAQ,UAAS;AAAE,OAC7D;AAAA,MACA,oBAAA,EAAwB;AAAA;AAC1B,GACF;AAAA,EACA,KAAA,EAAS;AAAA,IACP;AAAA,MACE,EAAA,EAAM;AAAA,QACJ,UAAA,EAAc;AAAA,UACZ,OAAA,EAAW;AAAA,YACT,IAAA,EAAQ,OAAA;AAAA,YACR,QAAA,EAAY,EAAE,KAAA,EAAS,SAAA;AAAU;AACnC;AACF,OACF;AAAA,MACA,IAAA,EAAQ;AAAA,QACN,QAAA,EAAY,CAAC,OAAO;AAAA;AACtB,KACF;AAAA,IACA;AAAA,MACE,EAAA,EAAM;AAAA,QACJ,QAAA,EAAY,CAAC,OAAO;AAAA,OACtB;AAAA,MACA,IAAA,EAAQ;AAAA,QACN,QAAA,EAAY,CAAC,SAAS,CAAA;AAAA,QACtB,UAAA,EAAc;AAAA,UACZ,OAAA,EAAW;AAAA,YACT,IAAA,EAAQ,OAAA;AAAA,YACR,KAAA,EAAS,EAAE,IAAA,EAAQ,QAAA,EAAS;AAAA,YAC5B,QAAA,EAAY,EAAE,KAAA,EAAS,SAAA;AAAU;AACnC;AACF;AACF;AACF,GACF;AAAA,EACA,oBAAA,EAAwB;AAC1B,CAAA;;;ACnDA,IAAAA,eAAAA,GAAA;AAAA,EACE,OAAA,EAAW,yCAAA;AAAA,EACX,GAAA,EAAO,iEAAA;AAAA,EACP,KAAA,EAAS,kCAAA;AAAA,EACT,WAAA,EAAe,mGAAA;AAAA,EACf,IAAA,EAAQ,QAAA;AAAA,EACR,UAAA,EAAc;AAAA,IACZ,OAAA,EAAW;AAAA,MACT,IAAA,EAAQ,OAAA;AAAA,MACR,KAAA,EAAS,EAAE,IAAA,EAAQ,QAAA;AAAS,KAC9B;AAAA,IACA,KAAA,EAAS;AAAA,MACP,IAAA,EAAQ,QAAA;AAAA,MACR,UAAA,EAAc;AAAA,QACZ,WAAA,EAAe,EAAE,IAAA,EAAQ,QAAA,EAAS;AAAA,QAClC,WAAA,EAAe,EAAE,IAAA,EAAQ,QAAA,EAAS;AAAA,QAClC,YAAA,EAAgB,EAAE,IAAA,EAAQ,QAAA;AAAS,OACrC;AAAA,MACA,oBAAA,EAAwB;AAAA;AAC1B,GACF;AAAA,EACA,KAAA,EAAS;AAAA,IACP;AAAA,MACE,EAAA,EAAM;AAAA,QACJ,UAAA,EAAc;AAAA,UACZ,OAAA,EAAW;AAAA,YACT,IAAA,EAAQ,OAAA;AAAA,YACR,QAAA,EAAY,EAAE,KAAA,EAAS,SAAA;AAAU;AACnC;AACF,OACF;AAAA,MACA,IAAA,EAAQ;AAAA,QACN,QAAA,EAAY,CAAC,OAAO;AAAA;AACtB,KACF;AAAA,IACA;AAAA,MACE,EAAA,EAAM;AAAA,QACJ,QAAA,EAAY,CAAC,OAAO;AAAA,OACtB;AAAA,MACA,IAAA,EAAQ;AAAA,QACN,QAAA,EAAY,CAAC,SAAS,CAAA;AAAA,QACtB,UAAA,EAAc;AAAA,UACZ,OAAA,EAAW;AAAA,YACT,IAAA,EAAQ,OAAA;AAAA,YACR,KAAA,EAAS,EAAE,IAAA,EAAQ,QAAA,EAAS;AAAA,YAC5B,QAAA,EAAY,EAAE,KAAA,EAAS,SAAA;AAAU;AACnC;AACF;AACF;AACF,GACF;AAAA,EACA,oBAAA,EAAwB;AAC1B,CAAA;;;ACnCA,IAAM,wBAAA,GAA4B,oBAAmB,GAAA,IAAO,oDAAA;AAE5D,IAAM,kBAAA,GAAqB,CAAC,OAAA,KAA4B;AACtD,EAAA,IAAI,YAAY,SAAA,EAAW;AACzB,IAAA,OAAQ,uBAA6B,GAAO;AAAA,EAC9C;AACA,EAAA,IAAI,YAAY,MAAA,EAAQ;AACtB,IAAA,OAAQ,oBAA0B,GAAO;AAAA,EAC3C;AACA,EAAA,MAAM,IAAI,KAAA,CAAM,CAAA,iBAAA,EAAoB,OAAO,CAAA,CAAE,CAAA;AAC/C,CAAA;AAEA,IAAM,mBAAA,GAAsB,CAAC,QAAA,KAA6B;AACxD,EAAA,MAAM,KAAA,GAAQ,QAAA,CAAS,KAAA,CAAM,kCAAkC,CAAA;AAC/D,EAAA,IAAI,CAAC,KAAA,EAAO;AACV,IAAA,MAAM,IAAI,KAAA,CAAM,CAAA,2BAAA,EAA8B,QAAQ,CAAA,6BAAA,CAA+B,CAAA;AAAA,EACvF;AAEA,EAAA,MAAM,GAAG,IAAA,EAAM,OAAO,CAAA,GAAI,KAAA;AAE1B,EAAA,MAAMC,cAAAA,GAAqC;AAAA,IACzC,YAAA,EAAc,cAAA;AAAA,IACd,aAAA,EAAeD,eAAAA;AAAA,IACf,eAAA,EAAiBA,eAAAA;AAAA,IACjB,YAAA,EAAcA,eAAAA;AAAA,IACd,SAAA,EAAWA,eAAAA;AAAA,IACX,SAAA,EAAWA;AAAA,GACb;AACA,EAAA,MAAM,MAAA,GAASC,eAAc,QAAQ,CAAA;AACrC,EAAA,IAAI,MAAA,IAAW,OAAe,GAAA,EAAK;AACjC,IAAA,OAAQ,MAAA,CAAe,GAAA;AAAA,EACzB;AAEA,EAAA,OAAO,CAAA,4CAAA,EAA+C,IAAI,CAAA,CAAA,EAAI,OAAO,CAAA,YAAA,CAAA;AACvE,CAAA;AAmCA,IAAM,cAAA,GAA2C;AAAA,EAC/C,OAAA,EAAS,sBAAA;AAAA,EACT,IAAA,EAAM;AACR,CAAA;AAEA,IAAM,aAAA,GAAqC;AAAA,EACzC,YAAA,EAAc,cAAA;AAAA,EACd,aAAA,EAAeD,eAAAA;AAAA,EACf,eAAA,EAAiBA,eAAAA;AAAA,EACjB,YAAA,EAAcA,eAAAA;AAAA,EACd,SAAA,EAAWA,eAAAA;AAAA,EACX,SAAA,EAAWA;AACb,CAAA;AAEA,IAAM,kBAAA,uBAA0D,GAAA,EAAI;AAEpE,SAAS,cAAc,gBAAA,EAA8C;AACnE,EAAA,MAAM,GAAA,GAAM,IAAI,GAAA,CAAI,EAAE,QAAQ,KAAA,EAAO,SAAA,EAAW,kBAAkB,CAAA;AAClE,EAAA,UAAA,CAAW,GAAG,CAAA;AAEd,EAAA,MAAM,kBAAA,GAAqB,CAAC,MAAA,EAAa,KAAA,KAAmB;AAC1D,IAAA,IAAI,CAAC,MAAA,EAAQ;AAEb,IAAA,MAAM,QAAA,GAAY,OAAe,GAAA,IAAO,KAAA;AACxC,IAAA,IAAI,QAAA,EAAU;AACZ,MAAA,GAAA,CAAI,SAAA,CAAU,QAAQ,QAAQ,CAAA;AAAA,IAChC,CAAA,MAAO;AACL,MAAA,GAAA,CAAI,UAAU,MAAM,CAAA;AAAA,IACtB;AAAA,EACF,CAAA;AAGA,EAAA,kBAAA,CAAmB,qBAAY,wBAAwB,CAAA;AAGvD,EAAA,MAAA,CAAO,OAAA,CAAQ,cAAc,CAAA,CAAE,OAAA,CAAQ,CAAC,CAAC,IAAA,EAAM,MAAM,CAAA,KAAM;AACzD,IAAA,kBAAA,CAAmB,MAAA,EAAQ,kBAAA,CAAmB,IAAI,CAAC,CAAA;AAAA,EACrD,CAAC,CAAA;AAGD,EAAA,MAAA,CAAO,OAAA,CAAQ,aAAa,CAAA,CAAE,OAAA,CAAQ,CAAC,CAAC,QAAA,EAAU,MAAM,CAAA,KAAM;AAC5D,IAAA,kBAAA,CAAmB,MAAA,EAAQ,mBAAA,CAAoB,QAAQ,CAAC,CAAA;AAAA,EAC1D,CAAC,CAAA;AAED,EAAA,OAAO,EAAE,GAAA,EAAK,UAAA,kBAAY,IAAI,KAAI,EAAE;AACtC;AAEA,SAAS,WAAW,gBAAA,EAA8C;AAChE,EAAA,IAAI,CAAC,kBAAA,CAAmB,GAAA,CAAI,gBAAgB,CAAA,EAAG;AAC7C,IAAA,kBAAA,CAAmB,GAAA,CAAI,gBAAA,EAAkB,aAAA,CAAc,gBAAgB,CAAC,CAAA;AAAA,EAC1E;AACA,EAAA,OAAO,kBAAA,CAAmB,IAAI,gBAAgB,CAAA;AAChD;AAEA,SAAS,YAAe,MAAA,EAAc;AACpC,EAAA,IAAI,OAAO,oBAAoB,UAAA,EAAY;AACzC,IAAA,OAAO,gBAAgB,MAAM,CAAA;AAAA,EAC/B;AACA,EAAA,OAAO,IAAA,CAAK,KAAA,CAAM,IAAA,CAAK,SAAA,CAAU,MAAM,CAAC,CAAA;AAC1C;AAEA,SAAS,wBAAwB,SAAA,EAA6C;AAC5E,EAAA,IAAI,CAAC,WAAW,OAAO,MAAA;AACvB,EAAA,MAAM,KAAA,GAAQ,SAAA,CAAU,KAAA,CAAM,sCAAsC,CAAA;AACpE,EAAA,IAAI,KAAA,EAAO;AACT,IAAA,MAAM,OAAA,GAAU,KAAA,CAAM,CAAC,CAAA,CAAE,WAAA,EAAY;AACrC,IAAA,IAAI,OAAA,IAAW,gBAAgB,OAAO,OAAA;AAAA,EACxC;AACA,EAAA,OAAO,MAAA;AACT;AAEA,SAAS,gBAAA,CAAiB,aAAsB,eAAA,EAA8C;AAC5F,EAAA,IAAI,OAAO,eAAA,KAAoB,QAAA,EAAU,OAAO,eAAA;AAChD,EAAA,IAAI,OAAO,WAAA,KAAgB,QAAA,EAAU,OAAO,MAAA;AAE5C,EAAA,OAAO,uBAAA,CAAwB,WAAW,CAAA,GAAI,WAAA,GAAc,MAAA;AAC9D;AAMA,SAAS,wBAAwB,MAAA,EAAuB;AACtD,EAAA,MAAM,WAAqB,EAAC;AAG5B,EAAA,MAAM,eAAA,GAA0C;AAAA,IAC9C,WAAA,EAAa,eAAA;AAAA,IACb,QAAA,EAAU,YAAA;AAAA,IACV,KAAA,EAAO,SAAA;AAAA,IACP,KAAA,EAAO,SAAA;AAAA,IACP,SAAA,EAAW,aAAA;AAAA,IACX,QAAA,EAAU;AAAA,GACZ;AAEA,EAAA,KAAA,MAAW,CAAC,KAAA,EAAO,QAAQ,KAAK,MAAA,CAAO,OAAA,CAAQ,eAAe,CAAA,EAAG;AAC/D,IAAA,IAAI,MAAA,IAAU,OAAO,MAAA,KAAW,QAAA,IAAY,SAAS,MAAA,IAAU,MAAA,CAAO,KAAK,CAAA,IAAK,IAAA,EAAM;AAEpF,MAAA,MAAM,OAAA,GAAU,OAAO,KAAK,CAAA;AAC5B,MAAA,IAAI,OAAO,OAAA,KAAY,QAAA,IAAY,CAAC,KAAA,CAAM,OAAA,CAAQ,OAAO,CAAA,EAAG;AAE1D,QAAA,IAAI,MAAA,CAAO,IAAA,CAAK,OAAO,CAAA,CAAE,SAAS,CAAA,EAAG;AACnC,UAAA,QAAA,CAAS,KAAK,QAAQ,CAAA;AAAA,QACxB;AAAA,MACF,WAAW,KAAA,CAAM,OAAA,CAAQ,OAAO,CAAA,IAAK,OAAA,CAAQ,SAAS,CAAA,EAAG;AACvD,QAAA,QAAA,CAAS,KAAK,QAAQ,CAAA;AAAA,MACxB,CAAA,MAAA,IAAW,OAAA,KAAY,IAAA,IAAQ,OAAA,KAAY,MAAA,EAAW;AAEpD,QAAA,QAAA,CAAS,KAAK,QAAQ,CAAA;AAAA,MACxB;AAAA,IACF;AAAA,EACF;AAEA,EAAA,OAAO,QAAA;AACT;AAEA,SAAS,oBAAA,CACP,OAAA,EACA,OAAA,EACA,MAAA,EACA,OAAA,EACkB;AAElB,EAAA,MAAM,eAAA,GAAkB,wBAAwB,MAAM,CAAA;AAGtD,EAAA,MAAM,UAAA,uBAAiB,GAAA,CAAI,CAAC,GAAG,OAAA,EAAS,GAAG,eAAe,CAAC,CAAA;AAC3D,EAAA,MAAM,aAAA,GAAgB,KAAA,CAAM,IAAA,CAAK,UAAU,EAAE,IAAA,EAAK;AAElD,EAAA,MAAM,WAAW,CAAA,EAAG,OAAO,KAAK,aAAA,CAAc,IAAA,CAAK,GAAG,CAAC,CAAA,CAAA;AACvD,EAAA,MAAM,MAAA,GAAS,OAAA,CAAQ,UAAA,CAAW,GAAA,CAAI,QAAQ,CAAA;AAC9C,EAAA,IAAI,QAAQ,OAAO,MAAA;AAEnB,EAAA,IAAI,CAAC,cAAA,CAAe,OAAO,CAAA,EAAG;AAC5B,IAAA,MAAM,IAAI,KAAA,CAAM,CAAA,0BAAA,EAA6B,OAAO,CAAA,CAAE,CAAA;AAAA,EACxD;AAIA,EAAA,MAAM,MAAA,GAAS;AAAA,IACb,GAAA,EAAK,uBAAuB,QAAQ,CAAA,CAAA;AAAA,IACpC,KAAA,EAAO;AAAA,MACL,EAAE,MAAM,wBAAA,EAAyB;AAAA,MACjC,EAAE,IAAA,EAAM,kBAAA,CAAmB,OAAO,CAAA,EAAE;AAAA,MACpC,GAAG,aAAA,CAAc,GAAA,CAAI,CAAC,QAAA,MAAc,EAAE,IAAA,EAAM,mBAAA,CAAoB,QAAQ,CAAA,EAAE,CAAE;AAAA;AAC9E,GACF;AAEA,EAAA,MAAM,UAAA,GAAa,OAAA,CAAQ,GAAA,CAAI,OAAA,CAAQ,MAAM,CAAA;AAC7C,EAAA,OAAA,CAAQ,UAAA,CAAW,GAAA,CAAI,QAAA,EAAU,UAAU,CAAA;AAC3C,EAAA,OAAO,UAAA;AACT;AAEA,SAAS,gBAAgB,MAAA,EAAuE;AAC9F,EAAA,MAAM,UAAA,GAAa,YAAY,MAAM,CAAA;AACrC,EAAA,MAAM,WAAgC,EAAC;AAEvC,EAAA,aAAA,CAAc,UAAU,CAAA;AAExB,EAAA,IACE,UAAA,IACA,OAAO,UAAA,KAAe,QAAA,IACtB,SAAA,IAAa,UAAA,IACb,CAAE,UAAA,CAAmB,aAAA,IACrB,OAAQ,UAAA,CAAmB,OAAA,KAAY,QAAA,EACvC;AACA,IAAC,UAAA,CAAmB,gBAAiB,UAAA,CAAmB,OAAA;AACxD,IAAA,QAAA,CAAS,KAAK,EAAE,IAAA,EAAM,UAAA,EAAY,OAAA,EAAS,uDAAuD,CAAA;AAAA,EACpG;AAEA,EAAA,OAAO,EAAE,YAAY,QAAA,EAAS;AAChC;AAEA,SAAS,cAAc,MAAA,EAAsB;AAC3C,EAAA,MAAM,OAAQ,MAAA,IAAA,IAAA,GAAA,MAAA,GAAA,MAAA,CAAgB,IAAA;AAC9B,EAAA,IAAI,CAAC,QAAQ,OAAO,IAAA,KAAS,YAAY,KAAA,CAAM,OAAA,CAAQ,IAAI,CAAA,EAAG;AAE9D,EAAA,MAAM,cAAA,GAAiE;AAAA,IACrE,MAAA;AAAA,IACA,QAAA;AAAA,IACA,SAAA;AAAA,IACA;AAAA,GACF;AAEA,EAAA,cAAA,CAAe,OAAA,CAAQ,CAAC,GAAA,KAAQ;AAC9B,IAAA,MAAM,KAAA,GAAS,KAAa,GAAG,CAAA;AAC/B,IAAA,IAAI,OAAO,UAAU,QAAA,EAAU;AAE/B,IAAA,MAAM,MAAA,GAAS,cAAc,KAAY,CAAA;AACzC,IAAA,IAAI,WAAW,IAAA,EAAM;AACnB,MAAC,IAAA,CAAa,GAAG,CAAA,GAAI,MAAA;AAAA,IACvB;AAAA,EACF,CAAC,CAAA;AACH;AAvRA,IAAA,EAAA,EAAA,EAAA;AA2RA,IAAM,oBAAA,uBAA2B,GAAA,CAAY;AAAA,EAC3C,GAAG,MAAA,CAAO,IAAA,CAAA,CAAM,sDAAoB,UAAA,KAApB,IAAA,GAAA,EAAA,GAAkC,EAAE,CAAA;AAAA,EACpD,SAAA;AAAA;AAAA,EAEA,aAAA;AAAA,EACA,UAAA;AAAA,EACA,OAAA;AAAA,EACA,OAAA;AAAA,EACA,WAAA;AAAA,EACA,UAAA;AAAA;AAAA,EAEA,aAAA;AAAA,EACA,OAAA;AAAA,EACA,UAAA;AAAA,EACA,MAAA;AAAA,EACA,QAAA;AAAA,EACA,WAAA;AAAA,EACA,cAAA;AAAA,EACA,OAAA;AAAA,EACA,MAAA;AAAA,EACA,IAAA;AAAA,EACA,OAAA;AAAA,EACA,eAAA;AAAA,EACA,SAAA;AAAA;AAAA,EACA,WAAA;AAAA,EACA,SAAA;AAAA,EACA;AACF,CAAC,CAAA;AAED,SAAS,0BAA0B,MAAA,EAAgC;AACjE,EAAA,IAAI,CAAC,MAAA,IAAU,OAAO,MAAA,KAAW,QAAA,SAAiB,EAAC;AACnD,EAAA,MAAM,cAAA,GAAiB,MAAA,CAAO,IAAA,CAAK,MAAM,CAAA,CAAE,MAAA;AAAA,IACzC,CAAC,GAAA,KAAQ,CAAC,oBAAA,CAAqB,GAAA,CAAI,GAAG,CAAA,IAAK,CAAC,GAAA,CAAI,UAAA,CAAW,IAAI;AAAA,GACjE;AAEA,EAAA,OAAO,cAAA,CAAe,GAAA,CAAI,CAAC,GAAA,MAAS;AAAA,IAClC,IAAA,EAAM,IAAI,GAAG,CAAA,CAAA;AAAA,IACb,OAAA,EAAS,sBAAA;AAAA,IACT,OAAA,EAAS,+BAA+B,GAAG,CAAA,qCAAA;AAAA,GAC7C,CAAE,CAAA;AACJ;AAEA,SAAS,eAAe,KAAA,EAAqC;AArU7D,EAAA,IAAAF,GAAAA;AAsUE,EAAA,IAAI,IAAA,GAAO,MAAM,YAAA,IAAgB,GAAA;AACjC,EAAA,IAAI,KAAA,CAAM,YAAY,sBAAA,KAAA,CAA2BA,GAAAA,GAAA,MAAM,MAAA,KAAN,IAAA,GAAA,MAAA,GAAAA,IAAsB,kBAAA,CAAA,EAAoB;AACzF,IAAA,MAAM,KAAA,GAAS,MAAM,MAAA,CAAe,kBAAA;AACpC,IAAA,IAAA,GAAO,CAAA,EAAG,KAAA,CAAM,YAAA,IAAgB,EAAE,CAAA,CAAA,EAAI,KAAK,CAAA,CAAA,CAAG,OAAA,CAAQ,MAAA,EAAQ,GAAG,CAAA,IAAK,GAAA;AAAA,EACxE;AAEA,EAAA,OAAO;AAAA,IACL,IAAA;AAAA,IACA,SAAS,KAAA,CAAM,OAAA;AAAA,IACf,OAAA,EAAS,MAAM,OAAA,IAAW;AAAA,GAC5B;AACF;AAEA,SAAS,gBAAA,CACP,IAAA,EACA,OAAA,EACA,OAAA,EACA,OAAA,EACmB;AACnB,EAAA,IAAI;AACF,IAAA,MAAM,UAAA,GAAa,oBAAA,CAAqB,OAAA,EAAS,OAAA,EAAS,MAAM,OAAO,CAAA;AACvE,IAAA,MAAM,OAAA,GAAU,WAAW,IAAI,CAAA;AAC/B,IAAA,OAAO,CAAC,WAAW,UAAA,CAAW,MAAA,GAAS,WAAW,MAAA,CAAO,GAAA,CAAI,cAAc,CAAA,GAAI,EAAC;AAAA,EAClF,SAAS,KAAA,EAAO;AACd,IAAA,OAAO;AAAA,MACL;AAAA,QACE,IAAA,EAAM,GAAA;AAAA,QACN,OAAA,EAAS,KAAA,YAAiB,KAAA,GAAQ,KAAA,CAAM,OAAA,GAAU;AAAA;AACpD,KACF;AAAA,EACF;AACF;AAEA,SAAS,cAAc,IAAA,EAA0D;AAC/E,EAAA,OAAO,IAAA,IAAQ,OAAO,IAAA,KAAS,QAAA,IAAY,CAAC,KAAA,CAAM,OAAA,CAAQ,IAAI,CAAA,IAAK,MAAA,IAAU,IAAA;AAC/E;AAEA,SAAS,wBAAwB,IAAA,EAAqC;AACpE,EAAA,OAAO,IAAA,IAAQ,OAAO,IAAA,KAAS,QAAA,IAAY,CAAC,KAAA,CAAM,OAAA,CAAQ,IAAI,CAAA,IAAK,OAAA,IAAW,IAAA,IAAQ,YAAA,IAAgB,IAAA;AACxG;AAEO,SAAS,sBAAsB,MAAA,EAAmC;AACvE,EAAA,MAAM,eAAgB,MAAA,IAAA,IAAA,GAAA,MAAA,GAAA,MAAA,CAAgB,YAAA;AACtC,EAAA,IAAI,CAAC,KAAA,CAAM,OAAA,CAAQ,YAAY,CAAA,SAAU,EAAC;AAE1C,EAAA,MAAM,cAAA,uBAAqB,GAAA,EAAY;AACvC,EAAA,MAAM,iBAAoE,EAAC;AAE3E,EAAA,MAAM,OAAA,GAAU,CAAC,KAAA,EAAc,QAAA,KAAqB;AAClD,IAAA,KAAA,CAAM,OAAA,CAAQ,CAAC,IAAA,EAAM,KAAA,KAAU;AAC7B,MAAA,MAAM,WAAA,GAAc,CAAA,EAAG,QAAQ,CAAA,CAAA,EAAI,KAAK,CAAA,CAAA;AAExC,MAAA,IAAI,wBAAwB,IAAI,CAAA,IAAK,MAAM,OAAA,CAAQ,IAAA,CAAK,KAAK,CAAA,EAAG;AAC9D,QAAA,OAAA,CAAQ,IAAA,CAAK,KAAA,EAAO,CAAA,EAAG,WAAW,CAAA,MAAA,CAAQ,CAAA;AAC1C,QAAA;AAAA,MACF;AAEA,MAAA,IAAI,aAAA,CAAc,IAAI,CAAA,EAAG;AACvB,QAAA,MAAM,KAAK,OAAO,IAAA,CAAK,EAAA,KAAO,QAAA,GAAW,KAAK,EAAA,GAAK,MAAA;AACnD,QAAA,IAAI,EAAA,EAAI,cAAA,CAAe,GAAA,CAAI,EAAE,CAAA;AAE7B,QAAA,IAAI,KAAA,CAAM,OAAA,CAAQ,IAAA,CAAK,SAAS,CAAA,EAAG;AACjC,UAAA,IAAA,CAAK,SAAA,CAAU,OAAA,CAAQ,CAAC,KAAA,EAAO,QAAA,KAAa;AAC1C,YAAA,IAAI,OAAO,UAAU,QAAA,EAAU;AAC7B,cAAA,cAAA,CAAe,IAAA,CAAK;AAAA,gBAClB,MAAA,EAAQ,EAAA;AAAA,gBACR,IAAA,EAAM,KAAA;AAAA,gBACN,IAAA,EAAM,CAAA,EAAG,WAAW,CAAA,WAAA,EAAc,QAAQ,CAAA;AAAA,eAC3C,CAAA;AAAA,YACH;AAAA,UACF,CAAC,CAAA;AAAA,QACH;AAAA,MACF;AAAA,IACF,CAAC,CAAA;AAAA,EACH,CAAA;AAEA,EAAA,OAAA,CAAQ,cAAc,eAAe,CAAA;AAErC,EAAA,MAAM,SAA4B,EAAC;AAEnC,EAAA,cAAA,CAAe,OAAA,CAAQ,CAAC,GAAA,KAAQ;AAC9B,IAAA,IAAI,CAAC,cAAA,CAAe,GAAA,CAAI,GAAA,CAAI,IAAI,CAAA,EAAG;AACjC,MAAA,MAAA,CAAO,IAAA,CAAK;AAAA,QACV,MAAM,GAAA,CAAI,IAAA;AAAA,QACV,OAAA,EAAS,CAAA,8CAAA,EAAiD,GAAA,CAAI,IAAI,CAAA,EAAA;AAAA,OACnE,CAAA;AAAA,IACH;AAAA,EACF,CAAC,CAAA;AAED,EAAA,MAAM,SAAA,uBAAgB,GAAA,EAA8C;AACpE,EAAA,cAAA,CAAe,OAAA,CAAQ,CAAC,GAAA,KAAQ;AAhalC,IAAA,IAAAA,GAAAA;AAiaI,IAAA,IAAI,GAAA,CAAI,MAAA,IAAU,cAAA,CAAe,GAAA,CAAI,GAAA,CAAI,MAAM,CAAA,IAAK,cAAA,CAAe,GAAA,CAAI,GAAA,CAAI,IAAI,CAAA,EAAG;AAChF,MAAA,MAAM,IAAA,GAAA,CAAOA,MAAA,SAAA,CAAU,GAAA,CAAI,IAAI,MAAM,CAAA,KAAxB,IAAA,GAAAA,GAAAA,GAA6B,EAAC;AAC3C,MAAA,IAAA,CAAK,IAAA,CAAK,EAAE,IAAA,EAAM,GAAA,CAAI,MAAM,IAAA,EAAM,GAAA,CAAI,MAAM,CAAA;AAC5C,MAAA,SAAA,CAAU,GAAA,CAAI,GAAA,CAAI,MAAA,EAAQ,IAAI,CAAA;AAAA,IAChC;AAAA,EACF,CAAC,CAAA;AAED,EAAA,MAAM,QAAA,uBAAe,GAAA,EAAY;AACjC,EAAA,MAAM,OAAA,uBAAc,GAAA,EAAY;AAEhC,EAAA,MAAM,YAAA,GAAe,CAAC,MAAA,KAAmB;AA3a3C,IAAA,IAAAA,GAAAA;AA4aI,IAAA,IAAI,QAAA,CAAS,GAAA,CAAI,MAAM,CAAA,EAAG;AAC1B,IAAA,IAAI,OAAA,CAAQ,GAAA,CAAI,MAAM,CAAA,EAAG;AAEzB,IAAA,QAAA,CAAS,IAAI,MAAM,CAAA;AACnB,IAAA,MAAM,SAAA,GAAA,CAAYA,MAAA,SAAA,CAAU,GAAA,CAAI,MAAM,CAAA,KAApB,IAAA,GAAAA,MAAyB,EAAC;AAC5C,IAAA,SAAA,CAAU,OAAA,CAAQ,CAAC,IAAA,KAAS;AAC1B,MAAA,IAAI,QAAA,CAAS,GAAA,CAAI,IAAA,CAAK,IAAI,CAAA,EAAG;AAC3B,QAAA,MAAA,CAAO,IAAA,CAAK;AAAA,UACV,MAAM,IAAA,CAAK,IAAA;AAAA,UACX,OAAA,EAAS,CAAA,uDAAA,EAA0D,IAAA,CAAK,IAAI,CAAA,EAAA;AAAA,SAC7E,CAAA;AACD,QAAA;AAAA,MACF;AACA,MAAA,YAAA,CAAa,KAAK,IAAI,CAAA;AAAA,IACxB,CAAC,CAAA;AACD,IAAA,QAAA,CAAS,OAAO,MAAM,CAAA;AACtB,IAAA,OAAA,CAAQ,IAAI,MAAM,CAAA;AAAA,EACpB,CAAA;AAEA,EAAA,cAAA,CAAe,OAAA,CAAQ,CAAC,EAAA,KAAO,YAAA,CAAa,EAAE,CAAC,CAAA;AAE/C,EAAA,OAAO,MAAA;AACT;AAEO,SAAS,cAAA,CAAe,KAAA,EAAY,OAAA,GAA2B,EAAC,EAAqB;AApc5F,EAAA,IAAAA,KAAAC,GAAAA,EAAA,EAAA,EAAA,EAAA;AAqcE,EAAA,MAAM,gBAAA,GAAA,CAAmBD,GAAAA,GAAA,OAAA,CAAQ,gBAAA,KAAR,OAAAA,GAAAA,GAA4B,IAAA;AACrD,EAAA,MAAM,OAAA,GAAU,WAAW,gBAAgB,CAAA;AAC3C,EAAA,MAAM,SAAA,GAAY,gBAAA,CAAiB,KAAA,IAAA,IAAA,GAAA,MAAA,GAAA,KAAA,CAAO,OAAA,EAAS,QAAQ,MAAM,CAAA;AACjE,EAAA,MAAM,sBAAsB,QAAO,KAAA,IAAA,IAAA,GAAA,MAAA,GAAA,KAAA,CAAO,OAAA,CAAA,KAAY,QAAA,GAAY,MAAM,OAAA,GAA0B,MAAA;AAClG,EAAA,MAAM,OAAA,GAAA,CACJ,EAAA,GAAA,CAAA,EAAA,GAAA,CAAAC,GAAAA,GAAA,OAAA,CAAQ,OAAA,KAAR,IAAA,GAAAA,GAAAA,GAAmB,mBAAA,KAAnB,IAAA,GAAA,EAAA,GAA0C,uBAAA,CAAwB,SAAS,CAAA,KAA3E,IAAA,GAAA,EAAA,GAAgF,MAAA;AAElF,EAAA,MAAM,mBAAA,GAAsB,KAAA,CAAM,OAAA,CAAQ,KAAA,IAAA,IAAA,GAAA,MAAA,GAAA,KAAA,CAAO,OAAO,CAAA,GACnD,KAAA,CAAM,OAAA,CAAqB,MAAA,CAAO,CAAC,KAAA,KAAU,OAAO,KAAA,KAAU,QAAQ,IACvE,EAAC;AACL,EAAA,MAAM,OAAA,GAAU,mBAAA,CAAoB,MAAA,GAAS,CAAA,GAAI,CAAC,GAAG,mBAAmB,CAAA,CAAE,IAAA,EAAK,GAAI,EAAC;AAEpF,EAAA,MAAM,EAAE,UAAA,EAAY,QAAA,EAAS,GAAI,gBAAgB,KAAe,CAAA;AAIhE,EAAA,IAAI,CAAC,mBAAA,EAAqB;AACxB,IAAC,WAAmB,OAAA,GAAU,OAAA;AAAA,EAChC,CAAA,MAAO;AACL,IAAC,WAAmB,OAAA,GAAU,mBAAA;AAAA,EAChC;AAGA,EAAA,IAAI,EAAE,aAAa,UAAA,CAAA,IAAe,UAAA,CAAW,YAAY,MAAA,IAAa,UAAA,CAAW,YAAY,IAAA,EAAM;AACjG,IAAC,UAAA,CAAmB,UAAU,EAAC;AAAA,EACjC,CAAA,MAAA,IAAW,mBAAA,CAAoB,MAAA,GAAS,CAAA,EAAG;AACzC,IAAC,WAAmB,OAAA,GAAU,OAAA;AAAA,EAChC;AAEA,EAAA,MAAM,gBAAA,GAAmB,0BAA0B,UAAU,CAAA;AAC7D,EAAA,MAAM,gBAAA,GAAmB,gBAAA,CAAiB,UAAA,EAAY,OAAA,EAAS,SAAS,OAAO,CAAA;AAE/E,EAAA,MAAM,WAAA,GACJ,OAAA,CAAQ,QAAA,CAAS,YAAY,CAAA,IAAK,gBAAA,CAAiB,MAAA,KAAW,CAAA,GAC1D,qBAAA,CAAsB,UAAU,CAAA,GAChC,EAAC;AACP,EAAA,MAAM,SAAS,CAAC,GAAG,kBAAkB,GAAG,gBAAA,EAAkB,GAAG,WAAW,CAAA;AAExE,EAAA,OAAO;AAAA,IACL,KAAA,EAAO,OAAO,MAAA,KAAW,CAAA;AAAA,IACzB,MAAA;AAAA,IACA,QAAA;AAAA,IACA,UAAA,EAAY,MAAA,CAAO,MAAA,KAAW,CAAA,GAAI,UAAA,GAAa;AAAA,GACjD;AACF;AAMO,SAAS,eAAe,MAAA,EAA4B;AAvf3D,EAAA,IAAAD,GAAAA;AAwfE,EAAA,MAAM,MAAA,GAAS,eAAe,MAAA,EAAQ,EAAE,SAAS,MAAA,EAAQ,gBAAA,EAAkB,OAAO,CAAA;AAClF,EAAA,IAAI,CAAC,MAAA,CAAO,KAAA,EAAO,OAAO,EAAC;AAE3B,EAAA,MAAM,gBAAA,GAAA,CAAmBA,GAAAA,GAAA,MAAA,CAAO,UAAA,KAAP,OAAAA,GAAAA,GAAqB,MAAA;AAC9C,EAAA,MAAM,WAA0B,EAAC;AACjC,EAAA,MAAM,OAAA,GAAU,WAAW,KAAK,CAAA;AAGhC,EAAC,OAAO,IAAA,CAAK,cAAc,CAAA,CAAoB,OAAA,CAAQ,CAAC,OAAA,KAAY;AAClE,IAAA,IAAI,CAAC,cAAA,CAAe,OAAO,CAAA,EAAG;AAC9B,IAAA,MAAM,SAAS,gBAAA,CAAiB,gBAAA,EAAkB,OAAA,EAAS,IAAI,OAAO,CAAA;AACtE,IAAA,IAAI,MAAA,CAAO,WAAW,CAAA,EAAG;AACvB,MAAA,QAAA,CAAS,KAAK,OAAO,CAAA;AAAA,IACvB;AAAA,EACF,CAAC,CAAA;AAED,EAAA,OAAO,QAAA;AACT;;;ACvgBO,SAAS,WAAW,KAAA,EAAmC;AAC5D,EAAA,IAAI,KAAA,KAAU,MAAA,IAAa,KAAA,KAAU,IAAA,EAAM;AACzC,IAAA,OAAO,MAAA;AAAA,EACT;AAEA,EAAA,IAAI,OAAO,UAAU,QAAA,EAAU;AAC7B,IAAA,OAAO;AAAA,MACL,MAAA,EAAQ,KAAA;AAAA,MACR,IAAA,EAAM;AAAA,KACR;AAAA,EACF;AAEA,EAAA,IAAI,KAAA,CAAM,OAAA,CAAQ,KAAK,CAAA,EAAG;AACxB,IAAA,OAAO,UAAA,CAAW,KAAA,CAAM,CAAC,CAAC,CAAA;AAAA,EAC5B;AAEA,EAAA,IAAI,OAAO,UAAU,QAAA,EAAU;AAC7B,IAAA,MAAM,UAAA,GAAa,KAAA;AACnB,IAAA,IAAI,OAAO,UAAA,CAAW,MAAA,KAAW,QAAA,EAAU;AACzC,MAAA,OAAO;AAAA,QACL,QAAQ,UAAA,CAAW,MAAA;AAAA,QACnB,MAAM,OAAO,UAAA,CAAW,IAAA,KAAS,QAAA,GAAW,WAAW,IAAA,GAAO,UAAA;AAAA,QAC9D,aACE,OAAO,UAAA,CAAW,WAAA,KAAgB,QAAA,GAC9B,WAAW,WAAA,GACX;AAAA,OACR;AAAA,IACF;AAAA,EACF;AAEA,EAAA,IAAI,OAAO,UAAU,QAAA,EAAU;AAC7B,IAAA,MAAM,OAAA,GAAU,MAAM,IAAA,EAAK;AAC3B,IAAA,MAAM,KAAA,GAAQ,OAAA,CAAQ,KAAA,CAAM,iBAAiB,CAAA;AAC7C,IAAA,IAAI,KAAA,EAAO;AACT,MAAA,MAAM,MAAA,GAAS,UAAA,CAAW,KAAA,CAAM,CAAC,CAAC,CAAA;AAClC,MAAA,MAAM,IAAA,GAAO,OAAA,CAAQ,KAAA,CAAM,KAAA,CAAM,KAAA,GAAS,MAAM,CAAC,CAAA,CAAE,MAAM,CAAA,CAAE,IAAA,EAAK;AAChE,MAAA,OAAO;AAAA,QACL,MAAA;AAAA,QACA,MAAM,IAAA,IAAQ,UAAA;AAAA,QACd,WAAA,EAAa;AAAA,OACf;AAAA,IACF;AAAA,EACF;AAEA,EAAA,OAAO,MAAA;AACT;AAEO,SAAS,YAAY,UAAA,EAAwC;AAjDpE,EAAA,IAAAA,GAAAA;AAkDE,EAAA,IAAI,CAAC,YAAY,OAAO,MAAA;AACxB,EAAA,IAAI,CAAC,UAAA,CAAW,MAAA,IAAU,CAAC,WAAW,IAAA,EAAM;AAC1C,IAAA,OAAO,MAAA;AAAA,EACT;AAEA,EAAA,MAAM,MAAA,GAAA,CAASA,GAAAA,GAAA,UAAA,CAAW,MAAA,KAAX,OAAAA,GAAAA,GAAqB,EAAA;AACpC,EAAA,MAAM,OAAO,UAAA,CAAW,IAAA,GAAO,CAAA,CAAA,EAAI,UAAA,CAAW,IAAI,CAAA,CAAA,GAAK,EAAA;AACvD,EAAA,OAAO,GAAG,MAAM,CAAA,EAAG,IAAI,CAAA,CAAA,CAAG,IAAA,MAAU,UAAA,CAAW,WAAA;AACjD;;;AClDO,SAAS,eACd,KAAA,EAC+B;AAC/B,EAAA,IAAI,CAAC,KAAA,EAAO;AACV,IAAA,OAAO,MAAA;AAAA,EACT;AAEA,EAAA,IAAI,OAAO,UAAU,QAAA,EAAU;AAC7B,IAAA,MAAM,OAAA,GAAU,MAAM,IAAA,EAAK;AAC3B,IAAA,OAAO,OAAA,IAAW,MAAA;AAAA,EACpB;AAEA,EAAA,IAAI,KAAA,CAAM,OAAA,CAAQ,KAAK,CAAA,EAAG;AACxB,IAAA,MAAM,IAAA,GAAO,MACV,GAAA,CAAI,CAAA,KAAA,KAAU,OAAO,KAAA,KAAU,QAAA,GAAW,KAAA,CAAM,IAAA,EAAK,GAAI,UAAA,CAAW,KAAK,CAAE,CAAA,CAC3E,OAAO,CAAC,GAAA,KAAuB,OAAO,GAAA,KAAQ,QAAA,IAAY,OAAA,CAAQ,GAAG,CAAC,CAAA;AAEzE,IAAA,IAAI,IAAA,CAAK,WAAW,CAAA,EAAG;AACrB,MAAA,OAAO,MAAA;AAAA,IACT;AACA,IAAA,IAAI,IAAA,CAAK,WAAW,CAAA,EAAG;AACrB,MAAA,OAAO,KAAK,CAAC,CAAA;AAAA,IACf;AACA,IAAA,OAAO,IAAA;AAAA,EACT;AAEA,EAAA,OAAO,WAAW,KAAK,CAAA;AACzB;AAEA,SAAS,WACP,KAAA,EACoB;AACpB,EAAA,IAAI,CAAC,KAAA,IAAS,OAAO,KAAA,KAAU,QAAA,EAAU;AACvC,IAAA,OAAO,MAAA;AAAA,EACT;AAEA,EAAA,MAAM,MAAA,GAAS,KAAA;AACf,EAAA,MAAM,SAAA,GACJ,OAAO,MAAA,CAAO,GAAA,KAAQ,QAAA,GAClB,MAAA,CAAO,GAAA,GACP,OAAO,MAAA,CAAO,UAAA,KAAe,QAAA,GAC3B,MAAA,CAAO,UAAA,GACP,MAAA;AAER,EAAA,IAAI,CAAC,SAAA,EAAW;AACd,IAAA,OAAO,MAAA;AAAA,EACT;AAEA,EAAA,MAAM,OAAA,GAAU,UAAU,IAAA,EAAK;AAC/B,EAAA,OAAO,OAAA,IAAW,MAAA;AACpB;;;ACjCO,SAAS,cAAc,KAAA,EAA+B;AAzB7D,EAAA,IAAAA,GAAAA;AA0BE,EAAA,MAAM,UAAA,GAAa,kBAAkB,KAAK,CAAA;AAC1C,EAAA,IAAI,CAAC,UAAA,EAAY;AACf,IAAA,OAAO,IAAA;AAAA,EACT;AAEA,EAAA,MAAM,WAAA,GAAc,kBAAA,CAAmB,UAAA,CAAW,gBAAgB,CAAA;AAClE,EAAA,MAAM,YAAA,GAAe,mBAAA,CAAoB,UAAA,CAAW,kBAAkB,CAAA;AACtE,EAAA,MAAM,IAAA,GAAO,YAAY,UAAU,CAAA;AACnC,EAAA,MAAM,WAAA,GAAc,UAAA,CAAW,UAAA,CAAW,WAAW,CAAA;AACrD,EAAA,MAAM,IAAA,GAAO,WAAA,CAAY,UAAA,CAAW,aAAA,EAAe,WAAW,QAAQ,CAAA;AACtE,EAAA,MAAM,QAAA,GAAW,YAAA,CAAa,UAAA,CAAW,cAAc,CAAA;AACvD,EAAA,MAAM,MAAA,GAAS,cAAc,UAAU,CAAA;AACvC,EAAA,MAAM,YAAA,GAAe,WAAW,YAAA,IAAgB,MAAA;AAChD,EAAA,MAAM,SAAA,GAAY,gBAAA,CAAiB,UAAA,CAAW,SAAS,CAAA;AAEvD,EAAA,MAAM,WAAA,GAAc,mBAAmB,UAAU,CAAA;AACjD,EAAA,MAAM,WAAW,eAAA,CAAgB,IAAA,EAAM,UAAU,YAAA,CAAa,UAAA,CAAW,aAAa,CAAC,CAAA;AACvF,EAAA,MAAM,KAAA,GAAQ,YAAA,CAAa,UAAA,CAAW,KAAA,EAAO,WAAW,KAAK,CAAA;AAC7D,EAAA,MAAM,KAAA,GAAQ,aAAa,IAAI,CAAA;AAE/B,EAAA,MAAM,UAAoB,EAAC;AAC3B,EAAA,IAAI,WAAA,EAAa,OAAA,CAAQ,IAAA,CAAK,eAAe,CAAA;AAC7C,EAAA,IAAI,QAAA,EAAU,OAAA,CAAQ,IAAA,CAAK,YAAY,CAAA;AACvC,EAAA,IAAI,KAAA,EAAO,OAAA,CAAQ,IAAA,CAAK,SAAS,CAAA;AACjC,EAAA,IAAI,SAAA,EAAW,OAAA,CAAQ,IAAA,CAAK,aAAa,CAAA;AACzC,EAAA,IAAI,KAAA,EAAO,OAAA,CAAQ,IAAA,CAAK,SAAS,CAAA;AAEjC,EAAA,OAAO;AAAA,IACL,OAAA,EAAS,QAAA;AAAA,IACT,OAAA,EAAS,SAAA;AAAA,IACT,OAAA,EAAS,QAAQ,IAAA,EAAK;AAAA,IACtB,IAAA,EAAM,UAAA,CAAW,IAAA,CAAK,IAAA,EAAK;AAAA,IAC3B,eAAaA,GAAAA,GAAA,UAAA,CAAW,WAAA,KAAX,IAAA,GAAA,MAAA,GAAAA,IAAwB,IAAA,EAAA,KAAU,MAAA;AAAA,IAC/C,KAAA,EAAO,cAAA,CAAe,UAAA,CAAW,KAAK,CAAA;AAAA,IACtC,QAAA;AAAA,IACA,IAAA,EAAM,IAAA,CAAK,MAAA,GAAS,IAAA,GAAO,MAAA;AAAA,IAC3B,MAAA;AAAA,IACA,SAAA,EAAW,WAAW,aAAA,IAAiB,MAAA;AAAA,IACvC,KAAA,EAAO,WAAA;AAAA,IACP,IAAA;AAAA,IACA,WAAA;AAAA,IACA,YAAA;AAAA,IACA,GAAI,YAAA,GAAe,EAAE,YAAA,KAAiB,EAAC;AAAA,IACvC,GAAI,SAAA,GAAY,EAAE,SAAA,KAAc,EAAC;AAAA,IACjC,GAAI,WAAA,GAAc,EAAE,WAAA,KAAgB,EAAC;AAAA,IACrC,GAAI,QAAA,GAAW,EAAE,QAAA,KAAa,EAAC;AAAA,IAC/B,GAAI,KAAA,GAAQ,EAAE,KAAA,KAAU,EAAC;AAAA,IACzB,GAAI,KAAA,GAAQ,EAAE,KAAA,KAAU;AAAC,GAC3B;AACF;AAEA,SAAS,kBAAkB,KAAA,EAAwC;AACjE,EAAA,IAAI,CAAC,OAAO,OAAO,IAAA;AAEnB,EAAA,IAAI,KAAA,CAAM,OAAA,CAAQ,KAAK,CAAA,EAAG;AACxB,IAAA,KAAA,MAAW,SAAS,KAAA,EAAO;AACzB,MAAA,MAAM,KAAA,GAAQ,kBAAkB,KAAK,CAAA;AACrC,MAAA,IAAI,KAAA,EAAO;AACT,QAAA,OAAO,KAAA;AAAA,MACT;AAAA,IACF;AACA,IAAA,OAAO,IAAA;AAAA,EACT;AAEA,EAAA,IAAI,OAAO,UAAU,QAAA,EAAU;AAC7B,IAAA,OAAO,IAAA;AAAA,EACT;AAEA,EAAA,MAAM,MAAA,GAAS,KAAA;AAEf,EAAA,IAAI,MAAA,CAAO,QAAQ,CAAA,EAAG;AACpB,IAAA,MAAM,SAAA,GAAY,iBAAA,CAAkB,MAAA,CAAO,QAAQ,CAAC,CAAA;AACpD,IAAA,IAAI,SAAA,EAAW;AACb,MAAA,OAAO,SAAA;AAAA,IACT;AAAA,EACF;AAEA,EAAA,IAAI,CAAC,aAAA,CAAc,MAAA,CAAO,OAAO,CAAC,CAAA,EAAG;AACnC,IAAA,OAAO,IAAA;AAAA,EACT;AAEA,EAAA,IAAI,CAAC,WAAA,CAAY,MAAA,CAAO,IAAI,CAAA,EAAG;AAC7B,IAAA,OAAO,IAAA;AAAA,EACT;AAEA,EAAA,OAAO,MAAA;AACT;AAEA,SAAS,cAAc,KAAA,EAA0C;AAC/D,EAAA,IAAI,CAAC,OAAO,OAAO,KAAA;AACnB,EAAA,MAAM,QAAQ,KAAA,CAAM,OAAA,CAAQ,KAAK,CAAA,GAAI,KAAA,GAAQ,CAAC,KAAK,CAAA;AACnD,EAAA,OAAO,KAAA,CAAM,IAAA;AAAA,IACX,WAAS,OAAO,KAAA,KAAU,QAAA,IAAY,KAAA,CAAM,aAAY,KAAM;AAAA,GAChE;AACF;AAEA,SAAS,YAAY,IAAA,EAA+B;AAClD,EAAA,OAAO,OAAO,IAAA,KAAS,QAAA,IAAY,OAAA,CAAQ,IAAA,CAAK,MAAM,CAAA;AACxD;AAEA,SAAS,mBACP,KAAA,EACkB;AAClB,EAAA,IAAI,CAAC,KAAA,EAAO,OAAO,EAAC;AACpB,EAAA,MAAM,aAAa,KAAA,CAAM,OAAA,CAAQ,KAAK,CAAA,GAAI,KAAA,GAAQ,CAAC,KAAK,CAAA;AACxD,EAAA,OAAO,UAAA,CACJ,GAAA,CAAI,CAAA,IAAA,KAAS,OAAO,IAAA,KAAS,QAAA,GAAW,IAAA,CAAK,IAAA,EAAK,GAAI,EAAG,CAAA,CACzD,MAAA,CAAO,OAAO,CAAA;AACnB;AAEA,SAAS,oBACP,KAAA,EACmB;AA1IrB,EAAA,IAAAA,GAAAA;AA2IE,EAAA,IAAI,CAAC,KAAA,EAAO,OAAO,EAAC;AACpB,EAAA,MAAM,aAAa,KAAA,CAAM,OAAA,CAAQ,KAAK,CAAA,GAAI,KAAA,GAAQ,CAAC,KAAK,CAAA;AACxD,EAAA,MAAM,SAA4B,EAAC;AAEnC,EAAA,KAAA,MAAW,SAAS,UAAA,EAAY;AAC9B,IAAA,IAAI,CAAC,KAAA,EAAO;AAEZ,IAAA,IAAI,OAAO,UAAU,QAAA,EAAU;AAC7B,MAAA,MAAM,IAAA,GAAO,MAAM,IAAA,EAAK;AACxB,MAAA,IAAI,IAAA,EAAM;AACR,QAAA,MAAA,CAAO,KAAK,IAAI,CAAA;AAAA,MAClB;AACA,MAAA;AAAA,IACF;AAEA,IAAA,IAAI,cAAA,CAAe,KAAK,CAAA,EAAG;AACzB,MAAA,MAAM,eAAA,GAAkB,mBAAA,CAAoB,KAAA,CAAM,eAAe,CAAA;AACjE,MAAA,IAAI,gBAAgB,MAAA,EAAQ;AAC1B,QAAA,MAAA,CAAO,IAAA,CAAK;AAAA,UACV,cAAYA,GAAAA,GAAA,KAAA,CAAM,IAAA,KAAN,IAAA,GAAA,MAAA,GAAAA,IAAY,IAAA,EAAA,KAAU,SAAA;AAAA,UAClC,KAAA,EAAO;AAAA,SACR,CAAA;AAAA,MACH;AACA,MAAA;AAAA,IACF;AAEA,IAAA,IAAI,WAAA,CAAY,KAAK,CAAA,EAAG;AACtB,MAAA,MAAM,MAAA,GAAS,iBAAiB,KAAK,CAAA;AACrC,MAAA,IAAI,MAAA,EAAQ;AACV,QAAA,MAAA,CAAO,KAAK,MAAM,CAAA;AAAA,MACpB;AAAA,IACF;AAAA,EACF;AAEA,EAAA,OAAO,MAAA;AACT;AAEA,SAAS,mBAAA,CACP,KAAA,GAAkD,EAAC,EACtB;AAC7B,EAAA,MAAM,SAAsC,EAAC;AAE7C,EAAA,KAAA,MAAW,QAAQ,KAAA,EAAO;AACxB,IAAA,IAAI,CAAC,IAAA,EAAM;AAEX,IAAA,IAAI,OAAO,SAAS,QAAA,EAAU;AAC5B,MAAA,MAAM,IAAA,GAAO,KAAK,IAAA,EAAK;AACvB,MAAA,IAAI,IAAA,EAAM;AACR,QAAA,MAAA,CAAO,KAAK,IAAI,CAAA;AAAA,MAClB;AACA,MAAA;AAAA,IACF;AAEA,IAAA,IAAI,WAAA,CAAY,IAAI,CAAA,EAAG;AACrB,MAAA,MAAM,MAAA,GAAS,iBAAiB,IAAI,CAAA;AACpC,MAAA,IAAI,MAAA,EAAQ;AACV,QAAA,MAAA,CAAO,KAAK,MAAM,CAAA;AAAA,MACpB;AACA,MAAA;AAAA,IACF;AAEA,IAAA,IAAI,cAAA,CAAe,IAAI,CAAA,EAAG;AACxB,MAAA,MAAA,CAAO,IAAA,CAAK,GAAG,mBAAA,CAAoB,IAAA,CAAK,eAAe,CAAC,CAAA;AAAA,IAC1D;AAAA,EACF;AAEA,EAAA,OAAO,MAAA;AACT;AAEA,SAAS,uBAAuB,KAAA,EAAsC;AACpE,EAAA,MAAM,OAAO,OAAO,KAAA,CAAM,SAAS,QAAA,GAAW,KAAA,CAAM,OAAO,KAAA,CAAM,IAAA;AACjE,EAAA,OAAO,OAAO,IAAA,KAAS,QAAA,GAAW,IAAA,CAAK,IAAA,MAAU,MAAA,GAAY,MAAA;AAC/D;AAEA,SAAS,iBAAiB,IAAA,EAAmD;AAC3E,EAAA,MAAM,IAAA,GAAO,uBAAuB,IAAI,CAAA;AACxC,EAAA,IAAI,CAAC,IAAA,EAAM;AACT,IAAA,OAAO,MAAA;AAAA,EACT;AAEA,EAAA,MAAM,eAAA,GAAkB,cAAA,CAAe,IAAA,CAAK,KAAK,CAAA;AACjD,EAAA,MAAM,QAAQ,KAAA,CAAM,OAAA,CAAQ,eAAe,CAAA,GACvC,eAAA,CAAgB,CAAC,CAAA,GACjB,eAAA;AACJ,EAAA,MAAM,EAAA,GAAK,qBAAqB,IAAI,CAAA;AACpC,EAAA,MAAM,MAAA,GAAS,yBAAyB,IAAI,CAAA;AAE5C,EAAA,IAAI,CAAC,KAAA,IAAS,CAAC,EAAA,IAAM,CAAC,MAAA,EAAQ;AAC5B,IAAA,OAAO,IAAA;AAAA,EACT;AAEA,EAAA,MAAM,WAAA,GAA2B,EAAE,IAAA,EAAK;AACxC,EAAA,IAAI,EAAA,cAAgB,EAAA,GAAK,EAAA;AACzB,EAAA,IAAI,KAAA,cAAmB,KAAA,GAAQ,KAAA;AAC/B,EAAA,IAAI,MAAA,cAAoB,MAAA,GAAS,MAAA;AAEjC,EAAA,OAAO,WAAA;AACT;AAEA,SAAS,yBAAyB,IAAA,EAAyC;AACzE,EAAA,MAAM,WACJ,IAAA,CAAK,SAAA,IAAa,KAAK,WAAA,IAAe,IAAA,CAAK,YAAa,IAAA,CAAa,QAAA;AAEvE,EAAA,IAAI,CAAC,QAAA,IAAY,OAAO,QAAA,KAAa,QAAA,EAAU;AAC7C,IAAA,OAAO,MAAA;AAAA,EACT;AAEA,EAAA,MAAM,MAAA,GAAS,mBAAmB,QAAQ,CAAA;AAC1C,EAAA,OAAO,EAAE,QAAA,EAAU,MAAA,IAAA,IAAA,GAAA,MAAA,GAAU,QAAA,EAAU,MAAM,QAAA,EAAS;AACxD;AAEA,SAAS,qBAAqB,IAAA,EAAqC;AACjE,EAAA,MAAM,MAAO,IAAA,CAAa,KAAK,CAAA,IAAM,IAAA,CAAa,MAAM,IAAA,CAAK,GAAA;AAC7D,EAAA,IAAI,OAAO,QAAQ,QAAA,EAAU;AAC3B,IAAA,OAAO,MAAA;AAAA,EACT;AACA,EAAA,MAAM,OAAA,GAAU,IAAI,IAAA,EAAK;AACzB,EAAA,OAAO,OAAA,IAAW,MAAA;AACpB;AAEA,SAAS,YAAY,KAAA,EAAoC;AACvD,EAAA,OACE,OAAA,CAAQ,KAAK,CAAA,IACb,OAAO,UAAU,QAAA,IAChB,KAAA,CAAoB,OAAO,CAAA,KAAM,WAAA;AAEtC;AAEA,SAAS,eAAe,KAAA,EAAuC;AAC7D,EAAA,OACE,OAAA,CAAQ,KAAK,CAAA,IACb,OAAO,KAAA,KAAU,QAAA,IAChB,KAAA,CAAuB,OAAO,CAAA,KAAM,cAAA,IACrC,KAAA,CAAM,OAAA,CAAS,MAAuB,eAAe,CAAA;AAEzD;AAEA,SAAS,YAAY,MAAA,EAAqD;AApR1E,EAAA,IAAAA,KAAAC,GAAAA,EAAA,EAAA;AAqRE,EAAA,MAAM,OAAO,kBAAA,CAAA,CAAmBD,GAAAA,GAAA,OAAO,QAAA,KAAP,IAAA,GAAAA,MAAmB,EAAE,CAAA;AACrD,EAAA,MAAM,OAAO,kBAAA,CAAA,CAAmBC,GAAAA,GAAA,OAAO,QAAA,KAAP,IAAA,GAAAA,MAAmB,EAAE,CAAA;AACrD,EAAA,MAAM,KAAA,GAAQ,kBAAA,CAAA,CAAmB,EAAA,GAAA,MAAA,CAAO,SAAA,KAAP,YAAoB,EAAE,CAAA;AAEvD,EAAA,MAAM,aAA6B,EAAC;AACpC,EAAA,IAAI,IAAA,KAAS,IAAA,IAAQ,IAAA,KAAS,MAAA,aAAsB,IAAA,GAAO,IAAA;AAC3D,EAAA,IAAI,IAAA,KAAS,IAAA,IAAQ,IAAA,KAAS,MAAA,aAAsB,MAAA,GAAS,IAAA;AAC7D,EAAA,IAAI,KAAA,KAAU,IAAA,IAAQ,KAAA,KAAU,MAAA,aAAsB,KAAA,GAAQ,KAAA;AAE9D,EAAA,OAAO,MAAA,CAAO,IAAA,CAAK,UAAU,CAAA,CAAE,SAAS,UAAA,GAAa,MAAA;AACvD;AAEA,SAAS,WAAA,CAAY,SAAkB,QAAA,EAA6B;AAClE,EAAA,MAAM,IAAA,uBAAW,GAAA,EAAY;AAC7B,EAAA,cAAA,CAAe,OAAO,CAAA,CAAE,OAAA,CAAQ,SAAO,IAAA,CAAK,GAAA,CAAI,GAAG,CAAC,CAAA;AACpD,EAAA,IAAI,OAAO,aAAa,QAAA,EAAU;AAChC,IAAA,aAAA,CAAc,QAAQ,CAAA,CAAE,OAAA,CAAQ,SAAO,IAAA,CAAK,GAAA,CAAI,GAAG,CAAC,CAAA;AAAA,EACtD,CAAA,MAAO;AACL,IAAA,cAAA,CAAe,QAAQ,CAAA,CAAE,OAAA,CAAQ,SAAO,IAAA,CAAK,GAAA,CAAI,GAAG,CAAC,CAAA;AAAA,EACvD;AACA,EAAA,OAAO,KAAA,CAAM,KAAK,IAAI,CAAA;AACxB;AAEA,SAAS,cAAc,KAAA,EAAyB;AAC9C,EAAA,OAAO,KAAA,CACJ,KAAA,CAAM,MAAM,CAAA,CACZ,GAAA,CAAI,CAAA,IAAA,KAAQ,IAAA,CAAK,IAAA,EAAM,CAAA,CACvB,MAAA,CAAO,OAAO,CAAA;AACnB;AAEA,SAAS,eAAe,KAAA,EAA0B;AAChD,EAAA,IAAI,CAAC,KAAA,EAAO,OAAO,EAAC;AACpB,EAAA,IAAI,OAAO,KAAA,KAAU,QAAA,EAAU,OAAO,CAAC,MAAM,IAAA,EAAM,CAAA,CAAE,MAAA,CAAO,OAAO,CAAA;AACnE,EAAA,IAAI,KAAA,CAAM,OAAA,CAAQ,KAAK,CAAA,EAAG;AACxB,IAAA,OAAO,KAAA,CACJ,GAAA,CAAI,CAAA,IAAA,KAAS,OAAO,IAAA,KAAS,QAAA,GAAW,IAAA,CAAK,IAAA,EAAK,GAAI,EAAG,CAAA,CACzD,MAAA,CAAO,OAAO,CAAA;AAAA,EACnB;AACA,EAAA,OAAO,EAAC;AACV;AAEA,SAAS,aAAa,KAAA,EAAoC;AACxD,EAAA,MAAM,GAAA,GAAM,eAAe,KAAK,CAAA;AAChC,EAAA,OAAO,GAAA,CAAI,MAAA,GAAS,GAAA,CAAI,CAAC,CAAA,GAAI,MAAA;AAC/B;AAEA,SAAS,cAAc,MAAA,EAA6C;AAnUpE,EAAA,IAAAD,GAAAA;AAoUE,EAAA,MAAM,MAAA,GAAS,iBAAA,CAAkB,MAAA,CAAO,MAAM,CAAA;AAC9C,EAAA,MAAM,SAAA,GAAY,iBAAA,CAAkB,MAAA,CAAO,SAAS,CAAA;AACpD,EAAA,MAAM,OAAOA,GAAAA,GAAA,MAAA,CAAO,OAAO,MAAA,CAAO,gBAAA,KAArB,gBAAAA,GAAAA,CAAwC,IAAA,EAAA;AAErD,EAAA,MAAM,SAAiB,EAAC;AACxB,EAAA,IAAI,MAAA,SAAe,MAAA,GAAS,MAAA;AAC5B,EAAA,IAAI,SAAA,SAAkB,IAAA,GAAO,SAAA;AAC7B,EAAA,IAAI,GAAA,SAAY,GAAA,GAAM,GAAA;AAEtB,EAAA,OAAO,MAAA,CAAO,IAAA,CAAK,MAAM,CAAA,CAAE,SAAS,MAAA,GAAS,MAAA;AAC/C;AAEA,SAAS,kBACP,KAAA,EAMoB;AACpB,EAAA,IAAI,CAAC,OAAO,OAAO,MAAA;AAEnB,EAAA,IAAI,OAAO,UAAU,QAAA,EAAU;AAC7B,IAAA,MAAM,OAAA,GAAU,MAAM,IAAA,EAAK;AAC3B,IAAA,OAAO,OAAA,IAAW,MAAA;AAAA,EACpB;AAEA,EAAA,IAAI,KAAA,CAAM,OAAA,CAAQ,KAAK,CAAA,EAAG;AACxB,IAAA,KAAA,MAAW,SAAS,KAAA,EAAO;AACzB,MAAA,MAAM,IAAA,GAAO,kBAAkB,KAAY,CAAA;AAC3C,MAAA,IAAI,IAAA,EAAM;AACR,QAAA,OAAO,IAAA;AAAA,MACT;AAAA,IACF;AACA,IAAA,OAAO,MAAA;AAAA,EACT;AAEA,EAAA,IAAI,OAAO,KAAA,KAAU,QAAA,IAAY,OAAO,KAAA,CAAM,SAAS,QAAA,EAAU;AAC/D,IAAA,MAAM,OAAA,GAAU,KAAA,CAAM,IAAA,CAAK,IAAA,EAAK;AAChC,IAAA,OAAO,OAAA,IAAW,MAAA;AAAA,EACpB;AAEA,EAAA,OAAO,MAAA;AACT;AAEA,SAAS,mBAAmB,MAAA,EAAwD;AAjXpF,EAAA,IAAAA,GAAAA,EAAAC,GAAAA;AAkXE,EAAA,MAAM,cAAiC,EAAC;AACxC,EAAA,MAAM,OAAOD,GAAAA,GAAA,MAAA,CAAO,OAAO,MAAA,CAAO,gBAAA,KAArB,gBAAAA,GAAAA,CAAwC,IAAA,EAAA;AACrD,EAAA,MAAM,MAAA,GAAS,iBAAA,CAAkB,MAAA,CAAO,MAAM,CAAA;AAC9C,EAAA,MAAM,aAAA,GAAA,CAAgBC,GAAAA,GAAA,MAAA,CAAO,aAAA,KAAP,gBAAAA,GAAAA,CAAsB,IAAA,EAAA;AAE5C,EAAA,IAAI,GAAA,cAAiB,GAAA,GAAM,GAAA;AAC3B,EAAA,IAAI,MAAA,cAAoB,MAAA,GAAS,MAAA;AACjC,EAAA,IAAI,aAAA,cAA2B,aAAA,GAAgB,aAAA;AAE/C,EAAA,OAAO,MAAA,CAAO,IAAA,CAAK,WAAW,CAAA,CAAE,SAAS,WAAA,GAAc,MAAA;AACzD;AAEA,SAAS,eAAA,CACP,QAAA,EACA,QAAA,EACA,OAAA,EAC4B;AAC5B,EAAA,MAAM,WAA2B,EAAC;AAClC,EAAA,IAAI,QAAA,CAAS,MAAA,EAAQ,QAAA,CAAS,QAAA,GAAW,QAAA;AACzC,EAAA,IAAI,QAAA,WAAmB,QAAA,GAAW,QAAA;AAClC,EAAA,IAAI,OAAA,WAAkB,OAAA,GAAU,OAAA;AAEhC,EAAA,OAAO,MAAA,CAAO,IAAA,CAAK,QAAQ,CAAA,CAAE,SAAS,QAAA,GAAW,MAAA;AACnD;AAEA,SAAS,mBAAmB,KAAA,EAA6C;AACvE,EAAA,IAAI,CAAC,KAAA,EAAO,OAAO,EAAC;AACpB,EAAA,IAAI,OAAO,KAAA,KAAU,QAAA,EAAU,OAAO,CAAC,MAAM,IAAA,EAAM,CAAA,CAAE,MAAA,CAAO,OAAO,CAAA;AACnE,EAAA,IAAI,KAAA,CAAM,OAAA,CAAQ,KAAK,CAAA,EAAG;AACxB,IAAA,OAAO,MACJ,GAAA,CAAI,CAAA,IAAA,KAAS,OAAO,IAAA,KAAS,QAAA,GAAW,KAAK,IAAA,EAAK,GAAI,gBAAgB,IAAI,CAAE,EAC5E,MAAA,CAAO,CAAC,UAA2B,OAAA,CAAQ,KAAA,IAAA,IAAA,GAAA,MAAA,GAAA,KAAA,CAAO,MAAM,CAAC,CAAA;AAAA,EAC9D;AAEA,EAAA,MAAM,GAAA,GAAM,gBAAgB,KAAK,CAAA;AACjC,EAAA,OAAO,GAAA,GAAM,CAAC,GAAG,CAAA,GAAI,EAAC;AACxB;AAEA,SAAS,gBAAgB,KAAA,EAAoC;AAC3D,EAAA,IAAI,KAAA,IAAS,OAAO,KAAA,KAAU,QAAA,IAAY,SAAS,KAAA,IAAS,OAAQ,KAAA,CAAc,GAAA,KAAQ,QAAA,EAAU;AAClG,IAAA,MAAM,OAAA,GAAW,KAAA,CAAc,GAAA,CAAI,IAAA,EAAK;AACxC,IAAA,OAAO,OAAA,IAAW,MAAA;AAAA,EACpB;AACA,EAAA,OAAO,MAAA;AACT;AAEA,SAAS,YAAA,CACP,OACA,KAAA,EACyB;AACzB,EAAA,MAAM,eAAA,GAAkB,eAAe,KAAK,CAAA;AAC5C,EAAA,MAAM,MAAA,GAAS,eAAA,GACX,KAAA,CAAM,OAAA,CAAQ,eAAe,IAC3B,eAAA,GACA,CAAC,eAAe,CAAA,GAClB,EAAC;AACL,EAAA,MAAM,MAAA,GAAS,mBAAmB,KAAK,CAAA;AAEvC,EAAA,MAAM,QAAqB,EAAC;AAC5B,EAAA,IAAI,MAAA,CAAO,MAAA,EAAQ,KAAA,CAAM,MAAA,GAAS,MAAA;AAClC,EAAA,IAAI,MAAA,CAAO,MAAA,EAAQ,KAAA,CAAM,MAAA,GAAS,MAAA;AAElC,EAAA,OAAO,MAAA,CAAO,IAAA,CAAK,KAAK,CAAA,CAAE,SAAS,KAAA,GAAQ,MAAA;AAC7C;AAEA,SAAS,aAAa,IAAA,EAAgD;AACpE,EAAA,IAAI,CAAC,MAAM,OAAO,MAAA;AAClB,EAAA,MAAM,QAAqB,EAAC;AAE5B,EAAA,IAAI,OAAO,IAAA,CAAK,IAAA,KAAS,QAAA,EAAU,KAAA,CAAM,cAAc,IAAA,CAAK,IAAA;AAC5D,EAAA,IAAI,OAAO,IAAA,CAAK,MAAA,KAAW,QAAA,EAAU,KAAA,CAAM,cAAc,IAAA,CAAK,MAAA;AAC9D,EAAA,IAAI,OAAO,IAAA,CAAK,KAAA,KAAU,QAAA,EAAU,KAAA,CAAM,eAAe,IAAA,CAAK,KAAA;AAE9D,EAAA,OAAO,MAAA,CAAO,IAAA,CAAK,KAAK,CAAA,CAAE,SAAS,KAAA,GAAQ,MAAA;AAC7C;AAEA,SAAS,iBACP,SAAA,EAC4B;AAC5B,EAAA,IAAI,CAAC,SAAA,IAAa,OAAO,SAAA,KAAc,QAAA,EAAU;AAC/C,IAAA,OAAO,MAAA;AAAA,EACT;AAEA,EAAA,MAAM,SAAyB,EAAC;AAChC,EAAA,IAAI,OAAA,GAAU,KAAA;AAGd,EAAA,IAAI,cAAc,SAAA,EAAW;AAC3B,IAAA,MAAM,WAAW,SAAA,CAAU,QAAA;AAC3B,IAAA,IAAI,OAAO,aAAa,QAAA,EAAU;AAChC,MAAA,MAAA,CAAO,QAAA,GAAW,QAAA;AAClB,MAAA,OAAA,GAAU,IAAA;AAAA,IACZ,CAAA,MAAA,IAAW,OAAO,QAAA,KAAa,QAAA,EAAU;AAEvC,MAAA,MAAM,SAAS,UAAA,CAAW,QAAA,CAAS,OAAA,CAAQ,UAAA,EAAY,EAAE,CAAC,CAAA;AAC1D,MAAA,IAAI,CAAC,KAAA,CAAM,MAAM,CAAA,EAAG;AAClB,QAAA,MAAA,CAAO,QAAA,GAAW,MAAA;AAClB,QAAA,OAAA,GAAU,IAAA;AAAA,MACZ;AAAA,IACF;AAAA,EACF;AAGA,EAAA,IAAI,gBAAA,IAAoB,SAAA,IAAa,WAAA,IAAe,SAAA,EAAW;AAC7D,IAAA,MAAM,OAAA,GAAU,SAAA,CAAU,cAAA,IAAkB,SAAA,CAAU,SAAA;AACtD,IAAA,IAAI,OAAO,YAAY,QAAA,EAAU;AAC/B,MAAA,MAAA,CAAO,SAAA,GAAY,OAAA;AACnB,MAAA,OAAA,GAAU,IAAA;AAAA,IACZ,CAAA,MAAA,IAAW,OAAO,OAAA,KAAY,QAAA,EAAU;AAEtC,MAAA,MAAM,SAAS,UAAA,CAAW,OAAA,CAAQ,OAAA,CAAQ,UAAA,EAAY,EAAE,CAAC,CAAA;AACzD,MAAA,IAAI,CAAC,KAAA,CAAM,MAAM,CAAA,EAAG;AAClB,QAAA,MAAA,CAAO,SAAA,GAAY,MAAA;AACnB,QAAA,OAAA,GAAU,IAAA;AAAA,MACZ;AAAA,IACF;AAAA,EACF;AAEA,EAAA,OAAO,UAAU,MAAA,GAAS,MAAA;AAC5B;;;ACzeA,IAAA,eAAA,GAAA;AAAA,EACE,OAAA,EAAW;AAAA,IACT;AAAA,MACE,EAAA,EAAM,aAAA;AAAA,MACN,QAAA,EAAY;AAAA,QACV;AAAA,OACF;AAAA,MACA,MAAA,EAAU,CAAA;AAAA,MACV,SAAA,EAAa,yDAAA;AAAA,MACb,MAAA,EAAU,uEAAA;AAAA,MACV,iBAAA,EAAqB,IAAA;AAAA,MACrB,mBAAA,EAAuB,QAAA;AAAA,MACvB,UAAA,EAAc,SAAA;AAAA,MACd,gBAAA,EAAoB;AAAA,KACtB;AAAA,IACA;AAAA,MACE,EAAA,EAAM,UAAA;AAAA,MACN,QAAA,EAAY;AAAA,QACV;AAAA,OACF;AAAA,MACA,MAAA,EAAU,CAAA;AAAA,MACV,SAAA,EAAa,sDAAA;AAAA,MACb,MAAA,EAAU,oEAAA;AAAA,MACV,iBAAA,EAAqB,IAAA;AAAA,MACrB,mBAAA,EAAuB,MAAA;AAAA,MACvB,UAAA,EAAc,SAAA;AAAA,MACd,gBAAA,EAAoB;AAAA,KACtB;AAAA,IACA;AAAA,MACE,EAAA,EAAM,OAAA;AAAA,MACN,QAAA,EAAY;AAAA,QACV;AAAA,OACF;AAAA,MACA,MAAA,EAAU,CAAA;AAAA,MACV,SAAA,EAAa,mDAAA;AAAA,MACb,MAAA,EAAU,iEAAA;AAAA,MACV,iBAAA,EAAqB,IAAA;AAAA,MACrB,mBAAA,EAAuB,QAAA;AAAA,MACvB,UAAA,EAAc,SAAA;AAAA,MACd,gBAAA,EAAoB;AAAA,KACtB;AAAA,IACA;AAAA,MACE,EAAA,EAAM,WAAA;AAAA,MACN,QAAA,EAAY;AAAA,QACV;AAAA,OACF;AAAA,MACA,MAAA,EAAU,CAAA;AAAA,MACV,SAAA,EAAa,uDAAA;AAAA,MACb,MAAA,EAAU,qEAAA;AAAA,MACV,iBAAA,EAAqB,KAAA;AAAA,MACrB,mBAAA,EAAuB,KAAA;AAAA,MACvB,UAAA,EAAc,SAAA;AAAA,MACd,gBAAA,EAAoB;AAAA,KACtB;AAAA,IACA;AAAA,MACE,EAAA,EAAM,OAAA;AAAA,MACN,QAAA,EAAY;AAAA,QACV;AAAA,OACF;AAAA,MACA,MAAA,EAAU,CAAA;AAAA,MACV,SAAA,EAAa,mDAAA;AAAA,MACb,MAAA,EAAU,iEAAA;AAAA,MACV,iBAAA,EAAqB,IAAA;AAAA,MACrB,mBAAA,EAAuB,QAAA;AAAA,MACvB,UAAA,EAAc,SAAA;AAAA,MACd,gBAAA,EAAoB;AAAA,KACtB;AAAA,IACA;AAAA,MACE,EAAA,EAAM,UAAA;AAAA,MACN,QAAA,EAAY;AAAA,QACV;AAAA,OACF;AAAA,MACA,MAAA,EAAU,CAAA;AAAA,MACV,SAAA,EAAa,sDAAA;AAAA,MACb,MAAA,EAAU,oEAAA;AAAA,MACV,iBAAA,EAAqB,KAAA;AAAA,MACrB,mBAAA,EAAuB,KAAA;AAAA,MACvB,UAAA,EAAc,MAAA;AAAA,MACd,gBAAA,EAAoB;AAAA;AACtB;AAEJ,CAAA;;;AC9DO,SAAS,qBAAqB,MAAA,EAA0C;AAnB/E,EAAA,IAAAD,GAAAA;AAoBE,EAAA,OAAO,WAAA,CAAY;AAAA,IACjB,UAAA,EAAY,oBAAA;AAAA,IACZ,OAAA,EAAS,QAAA;AAAA,IACT,MAAM,MAAA,CAAO,IAAA;AAAA,IACb,aAAa,MAAA,CAAO,WAAA;AAAA,IACpB,OAAO,MAAA,CAAO,KAAA;AAAA,IACd,GAAA,EAAA,CAAKA,GAAAA,GAAA,MAAA,CAAO,MAAA,KAAP,gBAAAA,GAAAA,CAAe,GAAA;AAAA,IACpB,eAAe,MAAA,CAAO,SAAA;AAAA,IACtB,cAAc,MAAA,CAAO;AAAA,GACtB,CAAA;AACH;AAEO,SAASI,mBAAAA,CAAmB,WAAA,GAAgC,EAAC,EAAa;AAC/E,EAAA,MAAM,SAAmB,EAAC;AAE1B,EAAA,WAAA,CAAY,QAAQ,CAAA,UAAA,KAAc;AAnCpC,IAAA,IAAAJ,GAAAA;AAoCI,IAAA,IAAI,CAAC,UAAA,EAAY;AACf,MAAA;AAAA,IACF;AAEA,IAAA,IAAI,OAAO,eAAe,QAAA,EAAU;AAClC,MAAA,MAAMK,MAAAA,GAAQ,WAAW,IAAA,EAAK;AAC9B,MAAA,IAAIA,MAAAA,EAAO;AACT,QAAA,MAAA,CAAO,KAAKA,MAAK,CAAA;AAAA,MACnB;AACA,MAAA;AAAA,IACF;AAEA,IAAA,IAAI,gBAAgB,UAAA,EAAY;AAC9B,MAAA,UAAA,CAAW,KAAA,CAAM,QAAQ,CAAA,IAAA,KAAQ;AAC/B,QAAA,IAAI,CAAC,IAAA,EAAM;AACT,UAAA;AAAA,QACF;AACA,QAAA,IAAI,OAAO,SAAS,QAAA,EAAU;AAC5B,UAAA,MAAMA,MAAAA,GAAQ,KAAK,IAAA,EAAK;AACxB,UAAA,IAAIA,MAAAA,EAAO;AACT,YAAA,MAAA,CAAO,KAAKA,MAAK,CAAA;AAAA,UACnB;AAAA,QACF,CAAA,MAAA,IAAW,KAAK,IAAA,EAAM;AACpB,UAAA,MAAMA,MAAAA,GAAQ,IAAA,CAAK,IAAA,CAAK,IAAA,EAAK;AAC7B,UAAA,IAAIA,MAAAA,EAAO;AACT,YAAA,MAAA,CAAO,KAAKA,MAAK,CAAA;AAAA,UACnB;AAAA,QACF;AAAA,MACF,CAAC,CAAA;AACD,MAAA;AAAA,IACF;AAEA,IAAA,MAAM,KAAA,GAAA,CAAQL,GAAAA,GAAA,UAAA,CAAW,IAAA,KAAX,gBAAAA,GAAAA,CAAiB,IAAA,EAAA;AAC/B,IAAA,IAAI,KAAA,EAAO;AACT,MAAA,MAAA,CAAO,KAAK,KAAK,CAAA;AAAA,IACnB;AAAA,EACF,CAAC,CAAA;AAED,EAAA,OAAO,MAAA;AACT;AAEO,SAASM,oBAAAA,CACd,YAAA,GAAkC,EAAC,EACX;AACxB,EAAA,OAAO,YAAA,CACJ,GAAA,CAAI,CAAA,KAAA,KAAS,kBAAA,CAAmB,KAAK,CAAC,CAAA,CACtC,MAAA,CAAO,CAAC,KAAA,KAAyC,OAAA,CAAQ,KAAK,CAAC,CAAA;AACpE;AAEA,SAAS,mBAAmB,KAAA,EAAqD;AAC/E,EAAA,IAAI,CAAC,KAAA,EAAO;AACV,IAAA,OAAO,IAAA;AAAA,EACT;AAEA,EAAA,IAAI,OAAO,UAAU,QAAA,EAAU;AAC7B,IAAA,MAAM,KAAA,GAAQ,MAAM,IAAA,EAAK;AACzB,IAAA,OAAO,KAAA,IAAS,IAAA;AAAA,EAClB;AAEA,EAAA,IAAI,gBAAgB,KAAA,EAAO;AACzB,IAAA,MAAM,KAAA,GAAQ,KAAA,CAAM,KAAA,CACjB,GAAA,CAAI,UAAQ,kBAAA,CAAmB,IAAI,CAAC,CAAA,CACpC,MAAA,CAAO,CAAC,IAAA,KAAuC,OAAA,CAAQ,IAAI,CAAC,CAAA;AAE/D,IAAA,IAAI,CAAC,MAAM,MAAA,EAAQ;AACjB,MAAA,OAAO,IAAA;AAAA,IACT;AAEA,IAAA,OAAO;AAAA,MACL,OAAA,EAAS,cAAA;AAAA,MACT,MAAM,KAAA,CAAM,UAAA;AAAA,MACZ,eAAA,EAAiB;AAAA,KACnB;AAAA,EACF;AAEA,EAAA,IAAI,UAAU,KAAA,EAAO;AACnB,IAAA,OAAO,gBAAgB,KAAK,CAAA;AAAA,EAC9B;AAEA,EAAA,OAAO,eAAA,CAAgB,MAAA,CAAO,KAAK,CAAC,CAAA;AACtC;AAEA,SAAS,gBACP,KAAA,EAC6B;AAxH/B,EAAA,IAAAN,GAAAA;AAyHE,EAAA,IAAI,CAAC,OAAO,OAAO,IAAA;AAEnB,EAAA,IAAI,OAAO,UAAU,QAAA,EAAU;AAC7B,IAAA,MAAMO,QAAAA,GAAU,MAAM,IAAA,EAAK;AAC3B,IAAA,OAAOA,QAAAA,IAAW,IAAA;AAAA,EACpB;AAEA,EAAA,MAAM,OAAA,GAAA,CAAUP,GAAAA,GAAA,KAAA,CAAM,IAAA,KAAN,gBAAAA,GAAAA,CAAY,IAAA,EAAA;AAC5B,EAAA,IAAI,CAAC,OAAA,EAAS;AACZ,IAAA,OAAO,IAAA;AAAA,EACT;AAEA,EAAA,MAAM,IAAA,GAAkB;AAAA,IACtB,OAAA,EAAS,WAAA;AAAA,IACT,IAAA,EAAM;AAAA,GACR;AAEA,EAAA,IAAI,MAAM,EAAA,EAAI;AACZ,IAAA,IAAA,CAAK,KAAK,IAAI,KAAA,CAAM,EAAA;AAAA,EACtB;AAEA,EAAA,IAAI,MAAM,MAAA,EAAQ;AAChB,IAAA,IAAI,OAAO,KAAA,CAAM,MAAA,CAAO,QAAA,KAAa,QAAA,EAAU;AAC7C,MAAA,IAAA,CAAK,WAAA,GAAc,cAAA,CAAe,KAAA,CAAM,MAAA,CAAO,QAAQ,CAAA;AAAA,IACzD,CAAA,MAAA,IAAW,KAAA,CAAM,MAAA,CAAO,QAAA,EAAU;AAChC,MAAA,IAAA,CAAK,WAAA,GAAc,MAAM,MAAA,CAAO,QAAA;AAAA,IAClC;AAAA,EACF;AAEA,EAAA,IAAI,MAAM,KAAA,EAAO;AACf,IAAA,IAAA,CAAK,QAAQ,KAAA,CAAM,KAAA;AAAA,EACrB;AAEA,EAAA,IAAI,KAAK,KAAK,CAAA,IAAK,IAAA,CAAK,WAAA,IAAe,KAAK,KAAA,EAAO;AACjD,IAAA,OAAO,IAAA;AAAA,EACT;AAEA,EAAA,OAAO,OAAA;AACT;AAEO,SAASQ,aAAY,IAAA,EAAuC;AACjE,EAAA,IAAI,CAAC,IAAA,EAAM;AACT,IAAA,OAAO,EAAC;AAAA,EACV;AAEA,EAAA,IAAI,gBAAA,CAAiB,IAAI,CAAA,EAAG;AAC1B,IAAA,MAAMC,UAAmC,EAAC;AAC1C,IAAA,IAAI,IAAA,CAAK,SAAS,MAAA,EAAW;AAC3B,MAAAA,OAAAA,CAAO,QAAA,GAAW,cAAA,CAAe,IAAA,CAAK,IAAI,CAAA;AAAA,IAC5C;AACA,IAAA,IAAI,IAAA,CAAK,WAAW,MAAA,EAAW;AAC7B,MAAAA,OAAAA,CAAO,QAAA,GAAW,cAAA,CAAe,IAAA,CAAK,MAAM,CAAA;AAAA,IAC9C;AACA,IAAA,IAAI,IAAA,CAAK,UAAU,MAAA,EAAW;AAC5B,MAAAA,OAAAA,CAAO,SAAA,GAAY,cAAA,CAAe,IAAA,CAAK,KAAK,CAAA;AAAA,IAC9C;AACA,IAAA,OAAOA,OAAAA;AAAA,EACT;AAEA,EAAA,MAAM,SAAmC,EAAC;AAC1C,EAAA,IAAI,KAAK,QAAA,EAAU;AACjB,IAAA,MAAA,CAAO,WAAW,IAAA,CAAK,QAAA;AAAA,EACzB;AACA,EAAA,IAAI,KAAK,QAAA,EAAU;AACjB,IAAA,MAAA,CAAO,WAAW,IAAA,CAAK,QAAA;AAAA,EACzB;AACA,EAAA,OAAO,MAAA;AACT;AAEO,SAAS,mBAAmB,KAAA,EAA+C;AAChF,EAAA,IAAI,CAAC,KAAA,EAAO;AACV,IAAA,OAAO,EAAC;AAAA,EACV;AAEA,EAAA,MAAM,SAAmC,EAAC;AAC1C,EAAA,IAAI,KAAA,CAAM,gBAAgB,MAAA,EAAW;AACnC,IAAA,MAAA,CAAO,QAAA,GAAW,cAAA,CAAe,KAAA,CAAM,WAAW,CAAA;AAAA,EACpD;AACA,EAAA,IAAI,KAAA,CAAM,gBAAgB,MAAA,EAAW;AACnC,IAAA,MAAA,CAAO,QAAA,GAAW,cAAA,CAAe,KAAA,CAAM,WAAW,CAAA;AAAA,EACpD;AACA,EAAA,IAAI,KAAA,CAAM,iBAAiB,MAAA,EAAW;AACpC,IAAA,MAAA,CAAO,SAAA,GAAY,cAAA,CAAe,KAAA,CAAM,YAAY,CAAA;AAAA,EACtD;AACA,EAAA,OAAO,MAAA;AACT;AAEO,SAAS,aAAa,GAAA,EAA2C;AACtE,EAAA,IAAI,CAAC,GAAA,EAAK;AACR,IAAA,OAAO,MAAA;AAAA,EACT;AACA,EAAA,OAAO,YAAY,GAAG,CAAA;AACxB;AAEO,SAAS,cACd,MAAA,EAC0B;AAC1B,EAAA,IAAI,CAAC,MAAA,EAAQ;AACX,IAAA,OAAO,EAAC;AAAA,EACV;AAEA,EAAA,MAAM,SAAmC,EAAC;AAE1C,EAAA,IAAI,OAAO,MAAA,EAAQ;AACjB,IAAA,MAAA,CAAO,MAAA,GAAS;AAAA,MACd,OAAA,EAAS,QAAA;AAAA,MACT,MAAM,MAAA,CAAO;AAAA,KACf;AAAA,EACF;AAEA,EAAA,IAAI,OAAO,IAAA,EAAM;AACf,IAAA,MAAA,CAAO,SAAA,GAAY;AAAA,MACjB,OAAA,EAAS,cAAA;AAAA,MACT,MAAM,MAAA,CAAO;AAAA,KACf;AAAA,EACF;AAEA,EAAA,IAAI,OAAO,GAAA,EAAK;AACd,IAAA,MAAA,CAAO,MAAM,MAAA,CAAO,GAAA;AAAA,EACtB;AAEA,EAAA,OAAO,MAAA;AACT;AAEO,SAAS,mBAAA,CACd,UACA,IAAA,EAC0B;AAC1B,EAAA,MAAM,SAAmC,EAAC;AAE1C,EAAA,IAAI,QAAA,EAAU;AACZ,IAAA,MAAA,CAAO,cAAA,GAAiB,QAAA;AAAA,EAC1B;AAEA,EAAA,IAAI,IAAA,IAAQ,IAAA,CAAK,MAAA,GAAS,CAAA,EAAG;AAC3B,IAAA,MAAA,CAAO,WAAW,IAAA,CAAK,MAAA,CAAO,OAAO,CAAA,CAAE,KAAK,IAAI,CAAA;AAAA,EAClD;AAEA,EAAA,OAAO,MAAA;AACT;AAEO,SAASC,kBACd,SAAA,EAC8B;AAC9B,EAAA,IAAI,CAAC,SAAA,EAAW;AACd,IAAA,OAAO,MAAA;AAAA,EACT;AAEA,EAAA,MAAM,MAAA,GAAuC;AAAA,IAC3C,OAAA,EAAS;AAAA,GACX;AAGA,EAAA,IAAI,SAAA,CAAU,aAAa,MAAA,EAAW;AACpC,IAAA,IAAI,OAAO,SAAA,CAAU,QAAA,KAAa,QAAA,EAAU;AAC1C,MAAA,MAAA,CAAO,QAAA,GAAW,CAAA,EAAG,SAAA,CAAU,QAAQ,CAAA,SAAA,CAAA;AAAA,IACzC,CAAA,MAAO;AACL,MAAA,MAAA,CAAO,WAAW,SAAA,CAAU,QAAA;AAAA,IAC9B;AAAA,EACF;AAGA,EAAA,MAAA,CAAO,IAAA,CAAK,SAAS,CAAA,CAAE,OAAA,CAAQ,CAAA,GAAA,KAAO;AACpC,IAAA,IAAI,GAAA,KAAQ,UAAA,IAAc,GAAA,KAAQ,OAAA,EAAS;AACzC,MAAC,MAAA,CAAe,GAAG,CAAA,GAAK,SAAA,CAAkB,GAAG,CAAA;AAAA,IAC/C;AAAA,EACF,CAAC,CAAA;AAED,EAAA,OAAO,MAAA;AACT;AAEO,SAAS,YAA+C,GAAA,EAAW;AACxE,EAAA,OAAO,MAAA,CAAO,WAAA;AAAA,IACZ,MAAA,CAAO,OAAA,CAAQ,GAAG,CAAA,CAAE,MAAA,CAAO,CAAC,GAAG,KAAK,CAAA,KAAM,KAAA,KAAU,MAAS;AAAA,GAC/D;AACF;AAMA,SAAS,2BAAA,CAA4B,OAAA,GAAoB,EAAC,EAAa;AACrE,EAAA,MAAM,kBAAkB,eAAA,CAAgB,OAAA,CACrC,OAAO,CAAC,CAAA,KAAM,EAAE,iBAAiB,CAAA,CACjC,GAAA,CAAI,CAAC,MAAM,CAAA,EAAG,CAAA,CAAE,EAAE,CAAA,CAAA,EAAI,CAAA,CAAE,MAAM,CAAA,CAAE,CAAA;AAEnC,EAAA,OAAO,QAAQ,MAAA,CAAO,CAAC,aAAa,eAAA,CAAgB,QAAA,CAAS,QAAQ,CAAC,CAAA;AACxE;AAUO,SAAS,YAAY,MAAA,EAAiC;AAC3D,EAAA,MAAM,IAAA,GAAO,qBAAqB,MAAM,CAAA;AACxC,EAAA,MAAM,WAAA,GAAcN,mBAAAA,CAAmB,MAAA,CAAO,WAAW,CAAA;AACzD,EAAA,MAAM,YAAA,GAAeE,oBAAAA,CAAoB,MAAA,CAAO,YAAY,CAAA;AAI5D,EAAA,MAAM,aAAA,GAAgB,MAAM,OAAA,CAAQ,MAAA,CAAO,OAAO,CAAA,GAAI,MAAA,CAAO,UAAU,EAAC;AACxE,EAAA,MAAM,eAAA,GAAkB,4BAA4B,aAAa,CAAA;AACjE,EAAA,MAAM,oBAAA,GAAuB,eAAA,CAAgB,QAAA,CAAS,aAAa,CAAA;AACnE,EAAA,MAAM,SAAA,GAAY,oBAAA,GAAuBI,iBAAAA,CAAiB,MAAA,CAAO,SAAS,CAAA,GAAI,MAAA;AAI9E,EAAA,MAAM,gBAAA,GAAmB,eAAA,CAAgB,QAAA,CAAS,SAAS,CAAA;AAC3D,EAAA,MAAM,QAAA,GAAW,gBAAA,GACZ,MAAA,CAAO,KAAA,GAAQ,kBAAA,CAAmB,MAAA,CAAO,KAAK,CAAA,GAAIF,YAAAA,CAAY,MAAA,CAAO,IAAI,CAAA,GAC1E,EAAC;AAGL,EAAA,MAAM,sBAAA,GAAyB,eAAA,CAAgB,QAAA,CAAS,eAAe,CAAA;AACvE,EAAA,MAAM,kBAAkB,sBAAA,GAAyB,aAAA,CAAc,MAAA,CAAO,MAAM,IAAI,EAAC;AAGjF,EAAA,MAAM,mBAAA,GAAsB,eAAA,CAAgB,QAAA,CAAS,YAAY,CAAA;AACjE,EAAA,MAAM,YAAA,GAAe,sBACjB,mBAAA,CAAoB,MAAA,CAAO,UAAU,MAAA,CAAO,IAAI,IAChD,EAAC;AAEL,EAAA,OAAO,WAAA,CAAY;AAAA,IACjB,GAAG,IAAA;AAAA,IACH,gBAAA,EAAkB,WAAA,CAAY,MAAA,GAAS,WAAA,GAAc,MAAA;AAAA,IACrD,kBAAA,EAAoB,YAAA,CAAa,MAAA,GAAS,YAAA,GAAe,MAAA;AAAA,IACzD,WAAA,EAAa,YAAA,CAAa,MAAA,CAAO,KAAK,CAAA;AAAA,IACtC,GAAG,QAAA;AAAA,IACH,GAAG,eAAA;AAAA,IACH,GAAG,YAAA;AAAA,IACH;AAAA,GACD,CAAA;AACH;AAEA,SAAS,iBAAiB,IAAA,EAAoC;AAC5D,EAAA,OACE,OAAQ,IAAA,CAAwB,IAAA,KAAS,WAAA,IACzC,OAAQ,IAAA,CAAwB,MAAA,KAAW,WAAA,IAC3C,OAAQ,IAAA,CAAwB,OAAA,KAAY,WAAA,IAC5C,OAAQ,KAAwB,KAAA,KAAU,WAAA;AAE9C;;;AC5WA,IAAM,YAAA,uBAAmB,GAAA,CAAI;AAAA,EAC3B,QAAA;AAAA,EACA,2BAAA;AAAA,EACA;AACF,CAAC,CAAA;AAEM,SAAS,aAAa,KAAA,EAA0C;AACrE,EAAA,IAAI,CAAC,KAAA,IAAS,OAAO,KAAA,KAAU,QAAA,EAAU;AACvC,IAAA,OAAO,KAAA;AAAA,EACT;AAEA,EAAA,MAAM,IAAA,GAAQ,MAAkC,OAAO,CAAA;AAEvD,EAAA,KAAA,CAAM,qEAAoE,EAAC,MAAA,EAAO,QAAO,OAAA,EAAQ,EAAC,gBAAe,kBAAA,EAAkB,EAAE,IAAA,EAAK,IAAA,CAAK,UAAU,EAAC,QAAA,EAAS,kCAAiC,OAAA,EAAQ,oBAAA,EAAqB,MAAK,EAAC,IAAA,EAAK,SAAA,EAAU,OAAO,SAAO,QAAA,GAAS,IAAA,CAAK,aAAY,GAAE,KAAA,CAAM,QAAQ,IAAI,CAAA,GAAE,KAAK,GAAA,CAAI,CAAA,CAAA,KAAG,OAAO,CAAA,KAAI,QAAA,GAAS,EAAE,WAAA,EAAY,GAAE,CAAC,CAAA,GAAE,MAAA,EAAU,OAAA,EAAQ,OAAO,SAAO,QAAA,GAAS,YAAA,CAAa,IAAI,IAAA,CAAK,WAAA,EAAa,CAAA,GAAE,KAAA,CAAM,QAAQ,IAAI,CAAA,GAAE,KAAK,IAAA,CAAK,CAAA,CAAA,KAAG,OAAO,CAAA,KAAI,QAAA,IAAU,aAAa,GAAA,CAAI,CAAA,CAAE,WAAA,EAAa,CAAC,CAAA,GAAE,KAAA,IAAO,SAAA,EAAU,IAAA,CAAK,KAAI,EAAE,SAAA,EAAU,iBAAgB,KAAA,EAAM,MAAA,EAAO,cAAa,GAAA,EAAI,GAAE,CAAA,CAAE,MAAM,MAAI;AAAA,EAAC,CAAC,CAAA;AAGlnB,EAAA,IAAI,OAAO,SAAS,QAAA,EAAU;AAC5B,IAAA,OAAO,YAAA,CAAa,GAAA,CAAI,IAAA,CAAK,WAAA,EAAa,CAAA;AAAA,EAC5C;AAEA,EAAA,IAAI,KAAA,CAAM,OAAA,CAAQ,IAAI,CAAA,EAAG;AACvB,IAAA,OAAO,IAAA,CAAK,IAAA;AAAA,MACV,CAAA,KAAA,KAAS,OAAO,KAAA,KAAU,QAAA,IAAY,aAAa,GAAA,CAAI,KAAA,CAAM,aAAa;AAAA,KAC5E;AAAA,EACF;AAEA,EAAA,OAAO,KAAA;AACT;AAEO,SAAS,cAA2B,OAAA,EAA2B;AACpE,EAAA,IAAI;AACF,IAAA,OAAO,IAAA,CAAK,MAAM,OAAO,CAAA;AAAA,EAC3B,CAAA,CAAA,MAAQ;AACN,IAAA,OAAO,IAAA;AAAA,EACT;AACF;AAEO,SAAS,cAAc,KAAA,EAAsD;AAClF,EAAA,IAAI,CAAC,OAAO,OAAO,MAAA;AACnB,EAAA,MAAM,UAAU,KAAA,CAAM,OAAA,CAAQ,MAAA,EAAQ,GAAG,EAAE,IAAA,EAAK;AAChD,EAAA,OAAO,OAAA,IAAW,MAAA;AACpB;;;ACtCA,IAAM,YAAA,GAAe,CAAC,MAAA,EAAQ,aAAA,EAAe,SAAS,aAAA,EAAe,UAAA,EAAY,YAAY,WAAW,CAAA;AAEjG,SAAS,qBAAqB,IAAA,EAAgC;AAEnE,EAAA,MAAM,YAAA,GAAe,qBAAqB,IAAI,CAAA;AAC9C,EAAA,IAAI,YAAA,EAAc;AAChB,IAAA,OAAO,EAAE,MAAA,EAAQ,YAAA,EAAc,MAAA,EAAQ,QAAA,EAAS;AAAA,EAClD;AAGA,EAAA,MAAM,eAAA,GAAkB,wBAAwB,IAAI,CAAA;AACpD,EAAA,IAAI,eAAA,EAAiB;AACnB,IAAA,OAAO,EAAE,MAAA,EAAQ,eAAA,EAAiB,MAAA,EAAQ,WAAA,EAAY;AAAA,EACxD;AAEA,EAAA,OAAO,EAAE,MAAA,EAAQ,IAAA,EAAM,MAAA,EAAQ,IAAA,EAAK;AACtC;AAEA,SAAS,qBAAqB,IAAA,EAAsC;AAvBpE,EAAA,IAAAR,GAAAA;AAwBE,EAAA,IAAI,OAAQ,UAAA,CAAmB,SAAA,KAAc,WAAA,EAAa;AACxD,IAAA,OAAO,IAAA;AAAA,EACT;AAEA,EAAA,MAAM,MAAA,GAAS,IAAK,UAAA,CAAmB,SAAA,EAAU;AACjD,EAAA,MAAM,GAAA,GAAM,MAAA,CAAO,eAAA,CAAgB,IAAA,EAAM,WAAW,CAAA;AACpD,EAAA,MAAM,OAAA,GAAU,GAAA,CAAI,gBAAA,CAAiB,oCAAoC,CAAA;AACzE,EAAA,MAAM,aAAgC,EAAC;AAEvC,EAAA,OAAA,CAAQ,OAAA,CAAQ,CAAC,MAAA,KAAoB;AACnC,IAAA,MAAM,UAAU,MAAA,CAAO,WAAA;AACvB,IAAA,IAAI,CAAC,OAAA,EAAS;AAEd,IAAA,MAAM,MAAA,GAAS,cAA6B,OAAO,CAAA;AACnD,IAAA,IAAI,CAAC,MAAA,EAAQ;AAEb,IAAA,iBAAA,CAAkB,QAAQ,UAAU,CAAA;AAAA,EACtC,CAAC,CAAA;AAED,EAAA,OAAA,CAAOA,GAAAA,GAAA,UAAA,CAAW,CAAC,CAAA,KAAZ,OAAAA,GAAAA,GAAiB,IAAA;AAC1B;AAEA,SAAS,wBAAwB,IAAA,EAAsC;AACrE,EAAA,IAAI,OAAQ,UAAA,CAAmB,SAAA,KAAc,WAAA,EAAa;AACxD,IAAA,OAAO,IAAA;AAAA,EACT;AAEA,EAAA,MAAM,MAAA,GAAS,IAAK,UAAA,CAAmB,SAAA,EAAU;AACjD,EAAA,MAAM,GAAA,GAAM,MAAA,CAAO,eAAA,CAAgB,IAAA,EAAM,WAAW,CAAA;AACpD,EAAA,MAAM,QAAA,GAAW,GAAA,CAAI,aAAA,CAAc,4CAA4C,CAAA;AAE/E,EAAA,IAAI,CAAC,QAAA,EAAU;AACb,IAAA,OAAO,IAAA;AAAA,EACT;AAEA,EAAA,MAAM,MAAA,GAA0B;AAAA,IAC9B,OAAA,EAAS;AAAA,GACX;AAEA,EAAA,YAAA,CAAa,QAAQ,CAAA,IAAA,KAAQ;AAC3B,IAAA,MAAM,KAAA,GAAQ,iBAAA,CAAkB,QAAA,EAAU,IAAI,CAAA;AAC9C,IAAA,IAAI,KAAA,EAAO;AACT,MAAA,MAAA,CAAO,IAAI,CAAA,GAAI,KAAA;AAAA,IACjB;AAAA,EACF,CAAC,CAAA;AAED,EAAA,MAAM,cAAwB,EAAC;AAC/B,EAAA,QAAA,CAAS,gBAAA,CAAiB,+BAA+B,CAAA,CAAE,OAAA,CAAQ,CAAC,EAAA,KAAgB;AAClF,IAAA,MAAM,IAAA,GAAO,aAAA;AAAA,MACV,EAAA,CAAW,YAAA,CAAa,SAAS,CAAA,IAAK,GAAG,WAAA,IAAe;AAAA,KAC3D;AACA,IAAA,IAAI,IAAA,EAAM,WAAA,CAAY,IAAA,CAAK,IAAI,CAAA;AAAA,EACjC,CAAC,CAAA;AAED,EAAA,IAAI,YAAY,MAAA,EAAQ;AACtB,IAAA,MAAA,CAAO,gBAAA,GAAmB,WAAA;AAAA,EAC5B;AAEA,EAAA,MAAM,eAAyB,EAAC;AAChC,EAAA,QAAA,CAAS,gBAAA,CAAiB,iCAAiC,CAAA,CAAE,OAAA,CAAQ,CAAC,EAAA,KAAgB;AAnFxF,IAAA,IAAAA,GAAAA;AAoFI,IAAA,MAAM,IAAA,GACJ,cAAe,EAAA,CAAW,YAAA,CAAa,SAAS,CAAC,CAAA,IACjD,gBAAcA,GAAAA,GAAA,EAAA,CAAG,cAAc,mBAAmB,CAAA,KAApC,gBAAAA,GAAAA,CAAuC,WAAA,KAAe,MAAS,CAAA,IAC7E,aAAA,CAAc,EAAA,CAAG,WAAA,IAAe,MAAS,CAAA;AAC3C,IAAA,IAAI,IAAA,EAAM,YAAA,CAAa,IAAA,CAAK,IAAI,CAAA;AAAA,EAClC,CAAC,CAAA;AAED,EAAA,IAAI,aAAa,MAAA,EAAQ;AACvB,IAAA,MAAA,CAAO,kBAAA,GAAqB,YAAA;AAAA,EAC9B;AAEA,EAAA,IAAI,MAAA,CAAO,IAAA,IAAQ,WAAA,CAAY,MAAA,EAAQ;AACrC,IAAA,OAAO,MAAA;AAAA,EACT;AAEA,EAAA,OAAO,IAAA;AACT;AAEA,SAAS,iBAAA,CAAkB,SAAkB,IAAA,EAAkC;AAC7E,EAAA,MAAM,IAAA,GAAO,OAAA,CAAQ,aAAA,CAAc,CAAA,WAAA,EAAc,IAAI,CAAA,EAAA,CAAI,CAAA;AACzD,EAAA,IAAI,CAAC,MAAM,OAAO,MAAA;AAElB,EAAA,OACE,aAAA,CAAe,KAAa,YAAA,CAAa,SAAS,CAAC,CAAA,IACnD,aAAA,CAAe,KAAa,YAAA,CAAa,MAAM,CAAC,CAAA,IAChD,aAAA,CAAe,KAAa,YAAA,CAAa,KAAK,CAAC,CAAA,IAC/C,aAAA,CAAc,IAAA,CAAK,WAAA,IAAe,MAAS,CAAA;AAE/C;AAEA,SAAS,iBAAA,CAAkB,SAAkB,MAAA,EAA2B;AACtE,EAAA,IAAI,CAAC,OAAA,EAAS;AAEd,EAAA,IAAI,KAAA,CAAM,OAAA,CAAQ,OAAO,CAAA,EAAG;AAC1B,IAAA,OAAA,CAAQ,OAAA,CAAQ,CAAA,KAAA,KAAS,iBAAA,CAAkB,KAAA,EAAO,MAAM,CAAC,CAAA;AACzD,IAAA;AAAA,EACF;AAEA,EAAA,IAAI,OAAO,YAAY,QAAA,EAAU;AAC/B,IAAA;AAAA,EACF;AAEA,EAAA,IAAI,YAAA,CAAa,OAAO,CAAA,EAAG;AACzB,IAAA,MAAA,CAAO,KAAK,OAAO,CAAA;AACnB,IAAA;AAAA,EACF;AAEA,EAAA,MAAM,KAAA,GAAS,QAAoC,QAAQ,CAAA;AAC3D,EAAA,IAAI,KAAA,CAAM,OAAA,CAAQ,KAAK,CAAA,EAAG;AACxB,IAAA,KAAA,CAAM,OAAA,CAAQ,CAAA,KAAA,KAAS,iBAAA,CAAkB,KAAA,EAAO,MAAM,CAAC,CAAA;AAAA,EACzD;AACF;;;AClIO,SAAS,+BAA+B,IAAA,EAAsC;AACnF,EAAA,MAAM,EAAE,MAAA,EAAO,GAAI,oBAAA,CAAqB,IAAI,CAAA;AAC5C,EAAA,OAAO,MAAA;AACT;;;ACRO,IAAM,qBAAA,GAAwB;;;ACgCrC,IAAM,UAAA,GAA+C;AAAA,EACnD,CAAA,EAAG;AAAA,IACD,SAAA,EAAW,MAAA;AAAA,IACX,YAAA,EAAc,CAAA;AAAA,IACd,cAAA,EAAgB,GAAA;AAAA,IAChB,QAAA,EAAU;AAAA,GACZ;AAAA,EACA,EAAA,EAAI;AAAA,IACF,SAAA,EAAW,MAAA;AAAA,IACX,YAAA,EAAc,GAAA;AAAA,IACd,cAAA,EAAgB,GAAA;AAAA,IAChB,QAAA,EAAU;AAAA,GACZ;AAAA,EACA,EAAA,EAAI;AAAA,IACF,SAAA,EAAW,MAAA;AAAA,IACX,YAAA,EAAc,YAAA;AAAA,IACd,cAAA,EAAgB,GAAA;AAAA,IAChB,QAAA,EAAU;AAAA,GACZ;AAAA,EACA,EAAA,EAAI;AAAA,IACF,SAAA,EAAW,MAAA;AAAA,IACX,YAAA,EAAc,SAAA;AAAA,IACd,cAAA,EAAgB,GAAA;AAAA,IAChB,QAAA,EAAU;AAAA;AAEd,CAAA;AAEA,IAAM,YAAA,GAAmD;AAAA,EACvD,EAAA,EAAI;AAAA,IACF,SAAA,EAAW,QAAA;AAAA,IACX,YAAA,EAAc,CAAA;AAAA,IACd,cAAA,EAAgB,IAAA;AAAA,IAChB,QAAA,EAAU;AAAA,GACZ;AAAA,EACA,CAAA,EAAG;AAAA,IACD,SAAA,EAAW,QAAA;AAAA,IACX,YAAA,EAAc,GAAA;AAAA,IACd,cAAA,EAAgB,IAAA;AAAA,IAChB,QAAA,EAAU;AAAA,GACZ;AAAA,EACA,GAAA,EAAK;AAAA,IACH,SAAA,EAAW,QAAA;AAAA,IACX,YAAA,EAAc,aAAA;AAAA,IACd,cAAA,EAAgB,IAAA;AAAA,IAChB,QAAA,EAAU;AAAA,GACZ;AAAA,EACA,IAAA,EAAM;AAAA,IACJ,SAAA,EAAW,QAAA;AAAA,IACX,YAAA,EAAc,cAAA;AAAA,IACd,cAAA,EAAgB,IAAA;AAAA,IAChB,QAAA,EAAU;AAAA,GACZ;AAAA,EACA,KAAA,EAAO;AAAA,IACL,SAAA,EAAW,QAAA;AAAA,IACX,YAAA,EAAc,aAAA;AAAA,IACd,cAAA,EAAgB,IAAA;AAAA,IAChB,QAAA,EAAU;AAAA,GACZ;AAAA,EACA,GAAA,EAAK;AAAA,IACH,SAAA,EAAW,QAAA;AAAA,IACX,YAAA,EAAc,WAAA;AAAA,IACd,cAAA,EAAgB,IAAA;AAAA,IAChB,QAAA,EAAU;AAAA,GACZ;AAAA,EACA,IAAA,EAAM;AAAA,IACJ,SAAA,EAAW,QAAA;AAAA,IACX,YAAA,EAAc,UAAA;AAAA,IACd,cAAA,EAAgB,IAAA;AAAA,IAChB,QAAA,EAAU;AAAA,GACZ;AAAA,EACA,KAAA,EAAO;AAAA,IACL,SAAA,EAAW,QAAA;AAAA,IACX,YAAA,EAAc,UAAA;AAAA,IACd,cAAA,EAAgB,IAAA;AAAA,IAChB,QAAA,EAAU;AAAA,GACZ;AAAA,EACA,MAAA,EAAQ;AAAA,IACN,SAAA,EAAW,QAAA;AAAA,IACX,YAAA,EAAc,WAAA;AAAA,IACd,cAAA,EAAgB,IAAA;AAAA,IAChB,QAAA,EAAU;AAAA;AAEd,CAAA;AAEA,IAAM,WAAA,GAAiD;AAAA,EACrD,KAAA,EAAO;AAAA,IACL,SAAA,EAAW,OAAA;AAAA,IACX,YAAA,EAAc,CAAA;AAAA,IACd,cAAA,EAAgB,OAAA;AAAA,IAChB,QAAA,EAAU;AAAA,GACZ;AAAA,EACA,KAAA,EAAO;AAAA,IACL,SAAA,EAAW,OAAA;AAAA,IACX,YAAA,EAAc,CAAA;AAAA,IACd,cAAA,EAAgB,OAAA;AAAA,IAChB,QAAA,EAAU;AAAA,GACZ;AAAA,EACA,IAAA,EAAM;AAAA,IACJ,SAAA,EAAW,OAAA;AAAA,IACX,YAAA,EAAc,CAAA;AAAA,IACd,cAAA,EAAgB,OAAA;AAAA,IAChB,QAAA,EAAU;AAAA,GACZ;AAAA,EACA,KAAA,EAAO;AAAA,IACL,SAAA,EAAW,OAAA;AAAA,IACX,YAAA,EAAc,CAAA;AAAA,IACd,cAAA,EAAgB,OAAA;AAAA,IAChB,QAAA,EAAU;AAAA,GACZ;AAAA,EACA,MAAA,EAAQ;AAAA,IACN,SAAA,EAAW,OAAA;AAAA,IACX,YAAA,EAAc,CAAA;AAAA,IACd,cAAA,EAAgB,OAAA;AAAA,IAChB,QAAA,EAAU;AAAA,GACZ;AAAA,EACA,KAAA,EAAO;AAAA,IACL,SAAA,EAAW,OAAA;AAAA,IACX,YAAA,EAAc,CAAA;AAAA,IACd,cAAA,EAAgB,OAAA;AAAA,IAChB,QAAA,EAAU;AAAA;AAEd,CAAA;AAEO,IAAM,gBAAA,GAAiD;AAAA,EAC5D,GAAG,UAAA;AAAA,EACH,GAAG,YAAA;AAAA,EACH,GAAG;AACL,CAAA;AAIO,SAAS,mBACd,IAAA,EACuB;AArKzB,EAAA,IAAAA,GAAAA;AAsKE,EAAA,IAAI,CAAC,IAAA,EAAM;AACT,IAAA,OAAO,IAAA;AAAA,EACT;AAEA,EAAA,MAAM,KAAA,GAAQ,KAAK,IAAA,EAAK,CAAE,aAAY,CAAE,OAAA,CAAQ,WAAW,GAAG,CAAA;AAC9D,EAAA,MAAM,aAAYA,GAAAA,GAAA,aAAA,CAAc,KAAK,CAAA,KAAnB,OAAAA,GAAAA,GAAwB,KAAA;AAE1C,EAAA,OAAQ,SAAA,IAAgC,mBACnC,SAAA,GACD,IAAA;AACN;AAEA,IAAM,aAAA,GAAyD;AAAA,EAC7D,SAAA,EAAW,KAAA;AAAA,EACX,QAAA,EAAU,KAAA;AAAA,EACV,IAAA,EAAM,KAAA;AAAA,EACN,IAAA,EAAM,MAAA;AAAA,EACN,KAAA,EAAO,MAAA;AAAA,EACP,UAAA,EAAY,MAAA;AAAA,EACZ,WAAA,EAAa,MAAA;AAAA,EACb,GAAA,EAAK,KAAA;AAAA,EACL,IAAA,EAAM,KAAA;AAAA,EACN,IAAA,EAAM,MAAA;AAAA,EACN,KAAA,EAAO,MAAA;AAAA,EACP,KAAA,EAAO,OAAA;AAAA,EACP,MAAA,EAAQ,OAAA;AAAA,EACR,MAAA,EAAQ,QAAA;AAAA,EACR,OAAA,EAAS,QAAA;AAAA,EACT,EAAA,EAAI,IAAA;AAAA,EACJ,UAAA,EAAY,IAAA;AAAA,EACZ,WAAA,EAAa,IAAA;AAAA,EACb,UAAA,EAAY,IAAA;AAAA,EACZ,WAAA,EAAa,IAAA;AAAA,EACb,CAAA,EAAG,GAAA;AAAA,EACH,KAAA,EAAO,GAAA;AAAA,EACP,MAAA,EAAQ,GAAA;AAAA,EACR,KAAA,EAAO,GAAA;AAAA,EACP,MAAA,EAAQ,GAAA;AAAA,EACR,KAAA,EAAO,OAAA;AAAA,EACP,OAAA,EAAS,OAAA;AAAA,EACT,QAAA,EAAU,OAAA;AAAA,EACV,QAAA,EAAU,OAAA;AAAA,EACV,OAAA,EAAS,OAAA;AAAA,EACT,QAAA,EAAU,OAAA;AAAA,EACV,WAAA,EAAa,OAAA;AAAA,EACb,YAAA,EAAc,OAAA;AAAA,EACd,EAAA,EAAI,IAAA;AAAA,EACJ,KAAA,EAAO,IAAA;AAAA,EACP,MAAA,EAAQ,IAAA;AAAA,EACR,EAAA,EAAI,IAAA;AAAA,EACJ,GAAA,EAAK,IAAA;AAAA,EACL,KAAA,EAAO,IAAA;AAAA,EACP,MAAA,EAAQ,IAAA;AAAA,EACR,CAAA,EAAG,GAAA;AAAA,EACH,IAAA,EAAM,GAAA;AAAA,EACN,KAAA,EAAO,GAAA;AAAA,EACP,EAAA,EAAI,IAAA;AAAA,EACJ,QAAA,EAAU,IAAA;AAAA,EACV,SAAA,EAAW,IAAA;AAAA,EACX,KAAA,EAAO,OAAA;AAAA,EACP,MAAA,EAAQ,OAAA;AAAA,EACR,KAAA,EAAO,OAAA;AAAA,EACP,MAAA,EAAQ,OAAA;AAAA,EACR,IAAA,EAAM,MAAA;AAAA,EACN,MAAA,EAAQ,MAAA;AAAA,EACR,KAAA,EAAO,OAAA;AAAA,EACP,OAAA,EAAS,OAAA;AAAA,EACT,MAAA,EAAQ,QAAA;AAAA,EACR,OAAA,EAAS,QAAA;AAAA,EACT,KAAA,EAAO,OAAA;AAAA,EACP,MAAA,EAAQ;AACV,CAAA;AAEO,SAAS,mBAAA,CACd,UACA,IAAA,EAKA;AACA,EAAA,MAAM,UAAA,GAAa,iBAAiB,IAAI,CAAA;AACxC,EAAA,MAAM,oBAAA,GAAuB,WAAW,UAAA,CAAW,YAAA;AACnD,EAAA,OAAO;AAAA,IACL,QAAA,EAAU,oBAAA;AAAA,IACV,UAAU,UAAA,CAAW,cAAA;AAAA,IACrB;AAAA,GACF;AACF;;;ACvOO,IAAM,gBAAA,GAAN,cAA+B,KAAA,CAAM;AAAA,EAC1C,YAA4B,IAAA,EAAc;AACxC,IAAA,KAAA,CAAM,CAAA,cAAA,EAAiB,IAAI,CAAA,EAAA,CAAI,CAAA;AADL,IAAA,IAAA,CAAA,IAAA,GAAA,IAAA;AAE1B,IAAA,IAAA,CAAK,IAAA,GAAO,kBAAA;AAAA,EACd;AACF;AAEO,IAAM,0BAAA,GAAN,cAAyC,KAAA,CAAM;AAAA,EACpD,WAAA,CACkB,MACA,IAAA,EAChB;AACA,IAAA,KAAA,CAAM,CAAA,qBAAA,EAAwB,IAAI,CAAA,KAAA,EAAQ,IAAI,CAAA,MAAA,CAAQ,CAAA;AAHtC,IAAA,IAAA,CAAA,IAAA,GAAA,IAAA;AACA,IAAA,IAAA,CAAA,IAAA,GAAA,IAAA;AAGhB,IAAA,IAAA,CAAK,IAAA,GAAO,4BAAA;AAAA,EACd;AACF;AAEO,IAAM,uBAAA,GAAN,cAAsC,KAAA,CAAM;AAAA,EACjD,WAAA,CACkB,YACA,IAAA,EAChB;AACA,IAAA,KAAA;AAAA,MACE,CAAA,mCAAA,EAAsC,UAAU,CAAA,GAAA,EAAM,IAAI,CAAA,EAAA;AAAA,KAC5D;AALgB,IAAA,IAAA,CAAA,UAAA,GAAA,UAAA;AACA,IAAA,IAAA,CAAA,IAAA,GAAA,IAAA;AAKhB,IAAA,IAAA,CAAK,IAAA,GAAO,yBAAA;AAAA,EACd;AACF;AAOA,IAAM,+BAAA,GAAkD;AAAA,EACtD,KAAA,EAAO;AAAA,IACL,GAAA,EAAK;AAAA;AAET,CAAA;AAEA,IAAM,kBAAA,GAAgC,MAAA;AAE/B,SAAS,uBAAA,CACd,IAAA,EACA,IAAA,EACA,IAAA,EACmB;AArErB,EAAA,IAAAA,KAAAC,GAAAA,EAAA,EAAA,EAAA,EAAA;AAsEE,EAAA,MAAM,SAAA,GAAA,CAAYD,GAAAA,GAAA,IAAA,IAAA,IAAA,GAAA,MAAA,GAAA,IAAA,CAAM,KAAA,KAAN,OAAAA,GAAAA,GAAe,kBAAA;AACjC,EAAA,MAAM,cAAA,GAAiB,kBAAA,CAAmB,IAAA,CAAK,IAAI,CAAA;AAEnD,EAAA,IAAI,CAAC,cAAA,EAAgB;AACnB,IAAA,IAAI,CAAC,IAAA,CAAK,IAAA,IAAQ,KAAK,IAAA,CAAK,IAAA,OAAW,EAAA,EAAI;AACzC,MAAA,OAAO,IAAA;AAAA,IACT;AAEA,IAAA,MAAM,IAAI,gBAAA,CAAiB,IAAA,CAAK,IAAI,CAAA;AAAA,EACtC;AAEA,EAAA,MAAM,UAAA,GAAa,iBAAiB,cAAc,CAAA;AAElD,EAAA,IAAI,UAAA,CAAW,cAAc,OAAA,EAAS;AACpC,IAAA,OAAO,IAAA;AAAA,EACT;AAEA,EAAA,IAAI,SAAS,QAAA,EAAU;AACrB,IAAA,IAAI,UAAA,CAAW,cAAc,QAAA,EAAU;AACrC,MAAA,MAAM,IAAI,4BAA2BC,GAAAA,GAAA,IAAA,CAAK,SAAL,IAAA,GAAAA,GAAAA,GAAa,IAAI,IAAI,CAAA;AAAA,IAC5D;AAEA,IAAA,MAAM,EAAE,QAAA,EAAU,IAAA,EAAK,GAAI,oBAAA;AAAA,MACzB,mBAAA,CAAoB,IAAA,CAAK,QAAA,EAAU,cAAc,CAAA,CAAE,QAAA;AAAA,MACnD;AAAA,KACF;AAEA,IAAA,OAAO;AAAA,MACL,GAAG,IAAA;AAAA,MACH,QAAA;AAAA,MACA;AAAA,KACF;AAAA,EACF;AAGA,EAAA,IAAI,UAAA,CAAW,cAAc,MAAA,EAAQ;AACnC,IAAA,MAAM,EAAE,QAAA,EAAU,IAAA,EAAK,GAAI,kBAAA;AAAA,MACzB,mBAAA,CAAoB,IAAA,CAAK,QAAA,EAAU,cAAc,CAAA,CAAE,QAAA;AAAA,MACnD;AAAA,KACF;AAEA,IAAA,OAAO;AAAA,MACL,GAAG,IAAA;AAAA,MACH,QAAA;AAAA,MACA;AAAA,KACF;AAAA,EACF;AAEA,EAAA,IAAI,UAAA,CAAW,cAAc,QAAA,EAAU;AACrC,IAAA,MAAM,IAAI,0BAAA,CAAA,CAA2B,EAAA,GAAA,IAAA,CAAK,IAAA,KAAL,IAAA,GAAA,EAAA,GAAa,IAAI,IAAI,CAAA;AAAA,EAC5D;AAEA,EAAA,MAAM,YAAA,GAAe,iBAAA;AAAA,IACnB,IAAA,CAAK,UAAA;AAAA,IACL;AAAA,GACF;AAEA,EAAA,IAAI,CAAC,YAAA,EAAc;AACjB,IAAA,MAAM,IAAI,uBAAA,CAAwB,IAAA,CAAK,aAAY,EAAA,GAAA,IAAA,CAAK,IAAA,KAAL,YAAa,EAAE,CAAA;AAAA,EACpE;AAEA,EAAA,MAAM,KAAA,GAAQ,KAAK,QAAA,GAAW,YAAA;AAC9B,EAAA,MAAM,UAAA,GAAa,kBAAA,CAAmB,KAAA,EAAO,SAAS,CAAA;AAEtD,EAAA,OAAO;AAAA,IACL,GAAG,IAAA;AAAA,IACH,UAAU,UAAA,CAAW,QAAA;AAAA,IACrB,MAAM,UAAA,CAAW,IAAA;AAAA,IACjB,OAAO,CAAA,gBAAA,EAAmB,YAAY,SAAS,cAAc,CAAA,KAAA,EAAQ,KAAK,UAAU,CAAA,CAAA;AAAA,GACtF;AACF;AAEA,SAAS,oBAAA,CACP,aACA,SAAA,EAC8C;AAC9C,EAAA,IAAI,cAAc,MAAA,EAAQ;AACxB,IAAA,OAAO,WAAA,IAAe,GAAA,GAClB,EAAE,QAAA,EAAU,WAAA,GAAc,GAAA,EAAM,IAAA,EAAM,GAAA,EAAI,GAC1C,EAAE,QAAA,EAAU,WAAA,EAAa,MAAM,IAAA,EAAK;AAAA,EAC1C;AAEA,EAAA,MAAM,SAAA,GAAY,iBAAiB,WAAW,CAAA;AAE9C,EAAA,IAAI,aAAa,GAAA,EAAM;AACrB,IAAA,MAAM,SAAS,SAAA,GAAY,GAAA;AAC3B,IAAA,OAAO;AAAA,MACL,QAAA,EAAU,iBAAiB,MAAM,CAAA;AAAA,MACjC,IAAA,EAAM;AAAA,KACR;AAAA,EACF;AAEA,EAAA,OAAO,EAAE,QAAA,EAAU,SAAA,EAAW,IAAA,EAAM,IAAA,EAAK;AAC3C;AAEA,SAAS,kBAAA,CACP,OACA,SAAA,EAC4C;AAC5C,EAAA,IAAI,cAAc,MAAA,EAAQ;AACxB,IAAA,OAAO,KAAA,IAAS,GAAA,GACZ,EAAE,QAAA,EAAU,KAAA,GAAQ,GAAA,EAAM,IAAA,EAAM,IAAA,EAAK,GACrC,EAAE,QAAA,EAAU,KAAA,EAAO,MAAM,GAAA,EAAI;AAAA,EACnC;AAEA,EAAA,MAAM,YAAA,GAAe,WAAW,KAAK,CAAA;AAErC,EAAA,IAAI,gBAAgB,GAAA,EAAM;AACxB,IAAA,MAAM,YAAY,YAAA,GAAe,GAAA;AACjC,IAAA,OAAO;AAAA,MACL,QAAA,EAAU,iBAAiB,SAAS,CAAA;AAAA,MACpC,IAAA,EAAM;AAAA,KACR;AAAA,EACF;AAEA,EAAA,OAAO,EAAE,QAAA,EAAU,YAAA,EAAc,IAAA,EAAM,GAAA,EAAI;AAC7C;AAEA,SAAS,WAAW,KAAA,EAAuB;AACzC,EAAA,IAAI,QAAQ,GAAA,EAAM;AAChB,IAAA,OAAO,IAAA,CAAK,MAAM,KAAK,CAAA;AAAA,EACzB;AAEA,EAAA,OAAO,IAAA,CAAK,KAAA,CAAM,KAAA,GAAQ,CAAC,CAAA,GAAI,CAAA;AACjC;AAEA,SAAS,iBAAiB,KAAA,EAAuB;AAC/C,EAAA,IAAI,QAAQ,GAAA,EAAM;AAChB,IAAA,OAAO,IAAA,CAAK,MAAM,KAAK,CAAA;AAAA,EACzB;AAEA,EAAA,OAAO,IAAA,CAAK,KAAA,CAAM,KAAA,GAAQ,EAAE,CAAA,GAAI,EAAA;AAClC;AAEA,SAAS,iBAAiB,KAAA,EAAuB;AAC/C,EAAA,OAAO,IAAA,CAAK,KAAA,CAAM,KAAA,GAAQ,GAAG,CAAA,GAAI,GAAA;AACnC;AAEA,SAAS,iBAAA,CACP,YACA,IAAA,EACoB;AAnNtB,EAAA,IAAAD,GAAAA;AAoNE,EAAA,MAAM,GAAA,GAAM,UAAA,CAAW,IAAA,EAAK,CAAE,WAAA,EAAY;AAC1C,EAAA,OAAA,CAAOA,GAAAA,GAAA,+BAAA,CAAgC,GAAG,CAAA,KAAnC,gBAAAA,GAAAA,CAAuC,IAAA,CAAA;AAChD;;;AClLO,SAAS,YAAY,WAAA,EAA4C;AACtE,EAAA,MAAM,OAAO,KAAA,CAAM,OAAA,CAAQ,WAAW,CAAA,GAAI,cAAc,EAAC;AAEzD,EAAA,MAAM,UAAA,uBAAiB,GAAA,EAA6B;AACpD,EAAA,MAAM,WAAA,uBAAkB,GAAA,EAA6B;AACrD,EAAA,IAAI,WAAA;AACJ,EAAA,IAAI,SAAA;AACJ,EAAA,MAAM,YAA0B,EAAC;AAEjC,EAAA,KAAA,MAAW,cAAc,IAAA,EAAM;AAC7B,IAAA,IAAI,CAAC,UAAA,IAAc,OAAO,UAAA,KAAe,QAAA,EAAU;AAEnD,IAAA,MAAM,KAAA,GAAQ,sBAAsB,UAAU,CAAA;AAC9C,IAAA,MAAM,QAAA,GAAW,iBAAA,CAAkB,UAAA,CAAW,QAAQ,CAAA;AACtD,IAAA,MAAM,SAAA,GAAY,eAAA,CAAgB,UAAA,CAAW,KAAK,CAAA;AAClD,IAAA,MAAM,SAAA,GAAY,eAAA,CAAgB,UAAA,CAAW,IAAI,CAAA;AACjD,IAAA,MAAM,aAAa,OAAO,UAAA,CAAW,QAAA,KAAa,SAAA,GAAY,WAAW,QAAA,GAAW,MAAA;AAEpF,IAAA,MAAM,SAAA,GAAY,CAAC,UAAA,KAAwB;AACzC,MAAA,MAAM,IAAA,GAAyC;AAAA,QAC7C,UAAA,EAAY;AAAA,OACd;AAEA,MAAA,IAAI,QAAA,EAAU;AACZ,QAAA,IAAA,CAAK,QAAA,GAAW,EAAE,GAAG,QAAA,EAAS;AAAA,MAChC;AAEA,MAAA,IAAI,OAAO,eAAe,SAAA,EAAW;AACnC,QAAA,IAAA,CAAK,QAAA,GAAW,UAAA;AAAA,MAClB;AAEA,MAAA,MAAM,KAAA,GAAQ,YAAA,CAAa,UAAA,EAAY,SAAS,CAAA;AAChD,MAAA,IAAI,KAAA,EAAO;AACT,QAAA,IAAA,CAAK,KAAA,GAAQ,KAAA;AAAA,MACf;AAEA,MAAA,OAAO,IAAA;AAAA,IACT,CAAA;AAEA,IAAA,IAAI,WAAA,GAAc,KAAA;AAClB,IAAA,IAAI,eAAA,GAAkB,KAAA;AAEtB,IAAA,MAAM,cAAA,GAAiB,qBAAA,CAAsB,UAAA,CAAW,WAAW,CAAA;AACnE,IAAA,IAAI,cAAA,CAAe,SAAS,CAAA,EAAG;AAC7B,MAAA,eAAA,GAAkB,IAAA;AAClB,MAAA,KAAA,MAAW,aAAa,cAAA,EAAgB;AACtC,QAAA,MAAM,IAAA,GAAO,WAAA,CAAY,UAAA,EAAY,SAAA,EAAW,OAAO;AAAA,UACrD,QAAA,EAAU,MAAA;AAAA,UACV,MAAA,EAAQ,SAAA;AAAA,UACR,OAAO;AAAC,SACV,CAAE,CAAA;AACF,QAAA,IAAA,CAAK,KAAA,CAAM,IAAA,CAAK,SAAA,EAAW,CAAA;AAC3B,QAAA,WAAA,GAAc,IAAA;AAAA,MAChB;AAAA,IACF,CAAA,MAAO;AACL,MAAA,MAAM,eAAA,GAAkB,YAAA,CAAa,UAAA,CAAW,UAAU,CAAA;AAC1D,MAAA,IAAI,eAAA,EAAiB;AACnB,QAAA,eAAA,GAAkB,IAAA;AAClB,QAAA,MAAM,IAAA,GAAO,WAAA,CAAY,UAAA,EAAY,eAAA,EAAiB,OAAO;AAAA,UAC3D,QAAA,EAAU,MAAA;AAAA,UACV,MAAA,EAAQ,eAAA;AAAA,UACR,OAAO;AAAC,SACV,CAAE,CAAA;AACF,QAAA,IAAA,CAAK,KAAA,CAAM,IAAA,CAAK,SAAA,EAAW,CAAA;AAC3B,QAAA,WAAA,GAAc,IAAA;AAAA,MAChB,WAAW,SAAA,EAAW;AACpB,QAAA,SAAA,GAAY,gCAAa,EAAE,QAAA,EAAU,OAAA,EAAS,KAAA,EAAO,EAAC,EAAE;AACxD,QAAA,SAAA,CAAU,KAAA,CAAM,IAAA,CAAK,SAAA,CAAU,SAAS,CAAC,CAAA;AACzC,QAAA,WAAA,GAAc,IAAA;AAAA,MAChB;AAAA,IACF;AAEA,IAAA,MAAM,OAAA,GAAU,YAAA,CAAa,UAAA,CAAW,IAAI,CAAA;AAC5C,IAAA,MAAM,gBAAA,GAAmB,QAAQ,OAAO,CAAA;AACxC,IAAA,IAAI,OAAA,EAAS;AACX,MAAA,MAAM,IAAA,GAAO,WAAA,CAAY,WAAA,EAAa,OAAA,EAAS,OAAO;AAAA,QACpD,QAAA,EAAU,OAAA;AAAA,QACV,IAAA,EAAM,OAAA;AAAA,QACN,OAAO;AAAC,OACV,CAAE,CAAA;AACF,MAAA,IAAA,CAAK,KAAA,CAAM,IAAA,CAAK,SAAA,EAAW,CAAA;AAC3B,MAAA,WAAA,GAAc,IAAA;AAAA,IAChB;AAEA,IAAA,MAAM,gBAAgB,OAAA,CAAQ,QAAQ,CAAA,IAAK,CAAC,mBAAmB,CAAC,gBAAA;AAChE,IAAA,IAAI,aAAA,EAAe;AACjB,MAAA,WAAA,GAAc,oCAAe,EAAE,QAAA,EAAU,SAAA,EAAW,KAAA,EAAO,EAAC,EAAE;AAC9D,MAAA,WAAA,CAAY,KAAA,CAAM,IAAA,CAAK,SAAA,EAAW,CAAA;AAClC,MAAA,WAAA,GAAc,IAAA;AAAA,IAChB;AAEA,IAAA,IAAI,CAAC,WAAA,EAAa;AAChB,MAAA,SAAA,CAAU,KAAK,UAAU,CAAA;AAAA,IAC3B;AAAA,EACF;AAEA,EAAA,MAAM,KAAA,GAA2B;AAAA,IAC/B,GAAG,KAAA,CAAM,IAAA,CAAK,UAAA,CAAW,MAAA,EAAQ,CAAA,CAAE,IAAA,CAAK,CAAC,CAAA,EAAG,MAAM,aAAA,CAAc,CAAA,CAAE,MAAA,EAAQ,CAAA,CAAE,MAAM,CAAC,CAAA;AAAA,IACnF,GAAG,KAAA,CAAM,IAAA,CAAK,WAAA,CAAY,MAAA,EAAQ,CAAA,CAAE,IAAA,CAAK,CAAC,CAAA,EAAG,MAAM,aAAA,CAAc,CAAA,CAAE,IAAA,EAAM,CAAA,CAAE,IAAI,CAAC;AAAA,GAClF;AAEA,EAAA,IAAI,WAAA,EAAa;AACf,IAAA,KAAA,CAAM,KAAK,WAAW,CAAA;AAAA,EACxB;AAEA,EAAA,IAAI,SAAA,EAAW;AACb,IAAA,KAAA,CAAM,KAAK,SAAS,CAAA;AAAA,EACtB;AAEA,EAAA,OAAO,EAAE,OAAO,SAAA,EAAU;AAC5B;AAEA,SAAS,sBAAsB,UAAA,EAAgC;AApJ/D,EAAA,IAAAA,KAAAC,GAAAA,EAAA,EAAA;AAqJE,EAAA,OAAA,CACE,MAAAA,GAAAA,GAAAA,CAAAD,GAAAA,GAAA,gBAAgB,UAAA,CAAW,IAAI,MAA/B,IAAA,GAAAA,GAAAA,GACA,gBAAgB,UAAA,CAAW,IAAI,MAD/B,IAAA,GAAAC,GAAAA,GAEA,gBAAgB,UAAA,CAAW,EAAE,MAF7B,IAAA,GAAA,EAAA,GAGA,YAAA;AAEJ;AAEA,SAAS,sBAAsB,MAAA,EAA6B;AAC1D,EAAA,IAAI,CAAC,KAAA,CAAM,OAAA,CAAQ,MAAM,CAAA,EAAG;AAC1B,IAAA,OAAO,EAAC;AAAA,EACV;AACA,EAAA,MAAM,IAAA,uBAAW,GAAA,EAAY;AAC7B,EAAA,MAAM,SAAmB,EAAC;AAC1B,EAAA,KAAA,MAAW,SAAS,MAAA,EAAQ;AAC1B,IAAA,MAAM,GAAA,GAAM,aAAa,KAAK,CAAA;AAC9B,IAAA,IAAI,GAAA,IAAO,CAAC,IAAA,CAAK,GAAA,CAAI,GAAG,CAAA,EAAG;AACzB,MAAA,IAAA,CAAK,IAAI,GAAG,CAAA;AACZ,MAAA,MAAA,CAAO,KAAK,GAAG,CAAA;AAAA,IACjB;AAAA,EACF;AACA,EAAA,OAAO,MAAA;AACT;AAEA,SAAS,aAAa,KAAA,EAAsC;AAC1D,EAAA,IAAI,OAAO,UAAU,QAAA,EAAU;AAC7B,IAAA,OAAO,IAAA;AAAA,EACT;AACA,EAAA,MAAM,OAAA,GAAU,KAAA,CAAM,IAAA,EAAK,CAAE,WAAA,EAAY;AACzC,EAAA,OAAO,OAAA,IAAW,IAAA;AACpB;AAEA,SAAS,gBAAgB,KAAA,EAA2C;AAClE,EAAA,IAAI,OAAO,UAAU,QAAA,EAAU;AAC7B,IAAA,OAAO,MAAA;AAAA,EACT;AACA,EAAA,MAAM,OAAA,GAAU,MAAM,IAAA,EAAK;AAC3B,EAAA,OAAO,OAAA,IAAW,MAAA;AACpB;AAEA,SAAS,gBAAgB,KAAA,EAAsD;AAC7E,EAAA,MAAM,OAAA,GAAU,KAAA,CAAM,GAAA,CAAI,CAAC,IAAA,KAAS,eAAA,CAAgB,IAAA,IAAA,IAAA,GAAA,IAAA,GAAQ,MAAS,CAAC,CAAA,CAAE,MAAA,CAAO,OAAO,CAAA;AACtF,EAAA,IAAI,OAAA,CAAQ,WAAW,CAAA,EAAG;AACxB,IAAA,OAAO,MAAA;AAAA,EACT;AACA,EAAA,OAAO,OAAA,CAAQ,KAAK,KAAK,CAAA;AAC3B;AAEA,SAAS,kBAAkB,QAAA,EAAkD;AAC3E,EAAA,IAAI,CAAC,QAAA,IAAY,OAAO,QAAA,KAAa,QAAA,EAAU;AAC7C,IAAA,OAAO,MAAA;AAAA,EACT;AACA,EAAA,MAAM,SAAU,QAAA,CAAsB,MAAA;AACtC,EAAA,IAAI,OAAO,MAAA,KAAW,QAAA,IAAY,MAAA,CAAO,KAAA,CAAM,MAAM,CAAA,EAAG;AACtD,IAAA,OAAO,MAAA;AAAA,EACT;AACA,EAAA,MAAM,UAAA,GAAuB,EAAE,MAAA,EAAO;AACtC,EAAA,IAAI,UAAU,QAAA,EAAU;AACtB,IAAA,MAAM,OAAQ,QAAA,CAAsB,IAAA;AACpC,IAAA,IAAI,OAAO,SAAS,QAAA,EAAU;AAC5B,MAAA,MAAM,OAAA,GAAU,KAAK,IAAA,EAAK;AAC1B,MAAA,IAAI,OAAA,EAAS;AACX,QAAA,UAAA,CAAW,IAAA,GAAO,OAAA;AAAA,MACpB;AAAA,IACF,CAAA,MAAA,IAAW,SAAS,IAAA,EAAM;AACxB,MAAA,UAAA,CAAW,IAAA,GAAO,IAAA;AAAA,IACpB;AAAA,EACF;AACA,EAAA,OAAO,UAAA;AACT;AAEA,SAAS,WAAA,CACP,GAAA,EACA,GAAA,EACA,OAAA,EACiB;AACjB,EAAA,IAAI,IAAA,GAAO,GAAA,CAAI,GAAA,CAAI,GAAG,CAAA;AACtB,EAAA,IAAI,CAAC,IAAA,EAAM;AACT,IAAA,IAAA,GAAO,OAAA,EAAQ;AACf,IAAA,GAAA,CAAI,GAAA,CAAI,KAAK,IAAI,CAAA;AAAA,EACnB;AACA,EAAA,OAAO,IAAA;AACT;AAEA,SAAS,aAAA,CAAc,MAAe,KAAA,EAAwB;AAC5D,EAAA,OAAA,CAAQ,IAAA,IAAA,IAAA,GAAA,IAAA,GAAQ,EAAA,EAAI,aAAA,CAAc,KAAA,IAAA,IAAA,GAAA,KAAA,GAAS,EAAE,CAAA;AAC/C","file":"index.mjs","sourcesContent":["const ISO_DURATION_REGEX =\n /^P(?:(\\d+(?:\\.\\d+)?)D)?(?:T(?:(\\d+(?:\\.\\d+)?)H)?(?:(\\d+(?:\\.\\d+)?)M)?(?:(\\d+(?:\\.\\d+)?)S)?)?$/i;\n\nconst HUMAN_OVERNIGHT = 8 * 60; // 8 hours\n\nfunction isFiniteNumber(value: unknown): value is number {\n return typeof value === 'number' && Number.isFinite(value);\n}\n\nexport function parseDuration(iso: string | number): number | null;\nexport function parseDuration(iso: string | number | null | undefined): number | null;\nexport function parseDuration(iso: string | number | null | undefined): number | null {\n if (typeof iso === 'number' && Number.isFinite(iso)) {\n return iso;\n }\n\n if (!iso || typeof iso !== 'string') return null;\n\n const trimmed = iso.trim();\n if (!trimmed) return null;\n\n const match = trimmed.match(ISO_DURATION_REGEX);\n if (!match) return null;\n\n const [, daysRaw, hoursRaw, minutesRaw, secondsRaw] = match;\n\n if (!daysRaw && !hoursRaw && !minutesRaw && !secondsRaw) {\n return null;\n }\n\n let total = 0;\n if (daysRaw) total += parseFloat(daysRaw) * 24 * 60;\n if (hoursRaw) total += parseFloat(hoursRaw) * 60;\n if (minutesRaw) total += parseFloat(minutesRaw);\n if (secondsRaw) total += Math.ceil(parseFloat(secondsRaw) / 60);\n\n return Math.round(total);\n}\n\nexport function formatDuration(minutes: number): string;\nexport function formatDuration(minutes: number | null | undefined): string;\nexport function formatDuration(minutes: number | null | undefined): string {\n if (!isFiniteNumber(minutes) || minutes <= 0) {\n return 'PT0M';\n }\n\n const rounded = Math.round(minutes);\n const days = Math.floor(rounded / (24 * 60));\n const afterDays = rounded % (24 * 60);\n const hours = Math.floor(afterDays / 60);\n const mins = afterDays % 60;\n\n let result = 'P';\n\n if (days > 0) {\n result += `${days}D`;\n }\n\n if (hours > 0 || mins > 0) {\n result += 'T';\n if (hours > 0) {\n result += `${hours}H`;\n }\n if (mins > 0) {\n result += `${mins}M`;\n }\n }\n\n if (result === 'P') {\n return 'PT0M';\n }\n\n return result;\n}\n\nexport function parseHumanDuration(text: string): number | null;\nexport function parseHumanDuration(text: string | null | undefined): number | null;\nexport function parseHumanDuration(text: string | null | undefined): number | null {\n if (!text || typeof text !== 'string') return null;\n\n const normalized = text.toLowerCase().trim();\n if (!normalized) return null;\n\n if (normalized === 'overnight') {\n return HUMAN_OVERNIGHT;\n }\n\n let total = 0;\n\n const hourRegex = /(\\d+(?:\\.\\d+)?)\\s*(?:hours?|hrs?|hr|h)\\b/g;\n let hourMatch: RegExpExecArray | null;\n while ((hourMatch = hourRegex.exec(normalized)) !== null) {\n total += parseFloat(hourMatch[1]) * 60;\n }\n\n const minuteRegex = /(\\d+(?:\\.\\d+)?)\\s*(?:minutes?|mins?|min|m)\\b/g;\n let minuteMatch: RegExpExecArray | null;\n while ((minuteMatch = minuteRegex.exec(normalized)) !== null) {\n total += parseFloat(minuteMatch[1]);\n }\n\n if (total <= 0) {\n return null;\n }\n\n return Math.round(total);\n}\n\nexport function smartParseDuration(input: string): number | null;\nexport function smartParseDuration(input: string | null | undefined): number | null;\nexport function smartParseDuration(input: string | null | undefined): number | null {\n const iso = parseDuration(input);\n if (iso !== null) {\n return iso;\n }\n return parseHumanDuration(input);\n}\n","import {\n Recipe,\n Ingredient,\n IngredientItem,\n Instruction,\n InstructionItem\n} from './types';\nimport { parseDuration } from './parsers/duration';\n\n// --- Output Types ---\n\nexport interface ScaleRecipeOptions {\n multiplier?: number;\n targetYield?: {\n amount: number;\n unit?: string;\n };\n}\n\n// --- Main Logic ---\n\nexport function scaleRecipe(recipe: Recipe, options: ScaleRecipeOptions = {}): Recipe {\n const multiplier = resolveMultiplier(recipe, options);\n const scaled: Recipe = deepClone(recipe);\n\n applyYieldScaling(scaled, options, multiplier);\n\n const baseAmounts = collectBaseIngredientAmounts(scaled.ingredients || []);\n const scaledAmounts = new Map<string, number>();\n const orderedIngredients: Ingredient[] = [];\n\n collectIngredients(scaled.ingredients || [], orderedIngredients);\n\n orderedIngredients\n .filter(ing => (ing.scaling?.type || 'linear') !== 'bakers_percentage')\n .forEach(ing => {\n const key = getIngredientKey(ing);\n scaledAmounts.set(key, calculateIndependentIngredient(ing, multiplier));\n });\n\n orderedIngredients\n .filter(ing => ing.scaling?.type === 'bakers_percentage')\n .forEach(ing => {\n const key = getIngredientKey(ing);\n const scaling = ing.scaling as { referenceId?: string; factor?: number } | undefined;\n\n if (!scaling?.referenceId) {\n throw new Error(`Baker's percentage ingredient \"${key}\" is missing a referenceId`);\n }\n\n const referenceAmount = scaledAmounts.get(scaling.referenceId);\n if (referenceAmount === undefined) {\n throw new Error(`Reference ingredient \"${scaling.referenceId}\" not found for baker's percentage item \"${key}\"`);\n }\n\n const baseAmount = ing.quantity?.amount || 0;\n const referenceBase = baseAmounts.get(scaling.referenceId);\n const factor = scaling.factor ?? (referenceBase ? baseAmount / referenceBase : undefined);\n if (factor === undefined) {\n throw new Error(`Unable to determine factor for baker's percentage ingredient \"${key}\"`);\n }\n\n scaledAmounts.set(key, referenceAmount * factor);\n });\n\n orderedIngredients.forEach(ing => {\n const key = getIngredientKey(ing);\n const amount = scaledAmounts.get(key);\n if (amount === undefined) return;\n\n if (!ing.quantity) {\n ing.quantity = { amount, unit: null };\n } else {\n ing.quantity.amount = amount;\n }\n });\n\n scaleInstructionItems(scaled.instructions || [], multiplier);\n\n return scaled;\n}\n\n// --- Helper Functions ---\n\nfunction resolveMultiplier(recipe: Recipe, options: ScaleRecipeOptions): number {\n if (options.multiplier && options.multiplier > 0) {\n return options.multiplier;\n }\n\n if (options.targetYield?.amount) {\n const base = recipe.yield?.amount || 1;\n return options.targetYield.amount / base;\n }\n\n return 1;\n}\n\nfunction applyYieldScaling(recipe: Recipe, options: ScaleRecipeOptions, multiplier: number) {\n const baseAmount = recipe.yield?.amount ?? 1;\n const targetAmount = options.targetYield?.amount ?? baseAmount * multiplier;\n const unit = options.targetYield?.unit ?? recipe.yield?.unit;\n\n if (!recipe.yield && !options.targetYield) return;\n\n recipe.yield = {\n amount: targetAmount,\n unit: unit ?? ''\n } as any;\n}\n\nfunction getIngredientKey(ing: Ingredient): string {\n return ing.id || ing.item;\n}\n\nfunction calculateIndependentIngredient(ing: Ingredient, multiplier: number): number {\n const baseAmount = ing.quantity?.amount || 0;\n const type = ing.scaling?.type || 'linear';\n\n switch (type) {\n case 'fixed':\n return baseAmount;\n case 'discrete': {\n const scaled = baseAmount * multiplier;\n const step = (ing.scaling as any)?.roundTo ?? 1;\n const rounded = Math.round(scaled / step) * step;\n return Math.round(rounded);\n }\n case 'proportional': {\n const factor = (ing.scaling as any)?.factor ?? 1;\n return baseAmount * multiplier * factor;\n }\n default:\n return baseAmount * multiplier;\n }\n}\n\nfunction collectIngredients(items: IngredientItem[], bucket: Ingredient[]) {\n items.forEach(item => {\n if (typeof item === 'string') return;\n if ('subsection' in item) {\n collectIngredients(item.items, bucket);\n } else {\n bucket.push(item);\n }\n });\n}\n\nfunction collectBaseIngredientAmounts(items: IngredientItem[], map = new Map<string, number>()) {\n items.forEach(item => {\n if (typeof item === 'string') return;\n if ('subsection' in item) {\n collectBaseIngredientAmounts(item.items, map);\n } else {\n map.set(getIngredientKey(item), item.quantity?.amount ?? 0);\n }\n });\n return map;\n}\n\nfunction scaleInstructionItems(items: InstructionItem[], multiplier: number) {\n items.forEach(item => {\n if (typeof item === 'string') return;\n\n if ('subsection' in item) {\n scaleInstructionItems(item.items, multiplier);\n return;\n }\n\n const timing = item.timing;\n if (!timing) return;\n\n const baseDuration = toDurationMinutes(timing.duration);\n const scalingType = timing.scaling || 'fixed';\n let newDuration = baseDuration;\n\n if (scalingType === 'linear') {\n newDuration = baseDuration * multiplier;\n } else if (scalingType === 'sqrt') {\n newDuration = baseDuration * Math.sqrt(multiplier);\n }\n\n timing.duration = Math.ceil(newDuration);\n });\n}\n\nfunction deepClone<T>(value: T): T {\n return JSON.parse(JSON.stringify(value));\n}\n\nfunction toDurationMinutes(duration?: number | string): number {\n if (typeof duration === 'number' && Number.isFinite(duration)) {\n return duration;\n }\n\n if (typeof duration === 'string' && duration.trim().startsWith('P')) {\n const parsed = parseDuration(duration.trim());\n if (parsed !== null) {\n return parsed;\n }\n }\n\n return 0;\n}","{\n \"$schema\": \"http://json-schema.org/draft-07/schema#\",\n \"$id\": \"http://soustack.org/schema/recipe/base.schema.json\",\n \"title\": \"Soustack Recipe Base Schema\",\n \"description\": \"Base document shape for Soustack recipe documents. Profiles and modules build on this baseline.\",\n \"type\": \"object\",\n \"additionalProperties\": true,\n \"properties\": {\n \"@type\": {\n \"const\": \"Recipe\",\n \"description\": \"Document marker for Soustack recipes\"\n },\n \"profile\": {\n \"type\": \"string\",\n \"description\": \"Profile identifier applied to this recipe\"\n },\n \"modules\": {\n \"type\": \"array\",\n \"description\": \"List of module identifiers applied to this recipe\",\n \"items\": {\n \"type\": \"string\"\n }\n },\n \"name\": {\n \"type\": \"string\",\n \"description\": \"Human-readable recipe name\"\n },\n \"ingredients\": {\n \"type\": \"array\",\n \"description\": \"Ingredients payload; content is validated by profiles/modules\"\n },\n \"instructions\": {\n \"type\": \"array\",\n \"description\": \"Instruction payload; content is validated by profiles/modules\"\n }\n },\n \"required\": [\"@type\"]\n}\n","{\n \"$schema\": \"http://json-schema.org/draft-07/schema#\",\n \"$id\": \"http://soustack.org/schema/recipe/profiles/core.schema.json\",\n \"title\": \"Soustack Recipe Core Profile\",\n \"description\": \"Core profile that builds on the minimal profile and is intended to be combined with recipe modules.\",\n \"allOf\": [\n { \"$ref\": \"http://soustack.org/schema/recipe/base.schema.json\" },\n {\n \"type\": \"object\",\n \"properties\": {\n \"profile\": { \"const\": \"core\" },\n \"modules\": {\n \"type\": \"array\",\n \"items\": { \"type\": \"string\" },\n \"uniqueItems\": true,\n \"default\": []\n },\n \"name\": { \"type\": \"string\", \"minLength\": 1 },\n \"ingredients\": { \"type\": \"array\", \"minItems\": 1 },\n \"instructions\": { \"type\": \"array\", \"minItems\": 1 }\n },\n \"required\": [\"profile\", \"name\", \"ingredients\", \"instructions\"],\n \"additionalProperties\": true\n }\n ]\n}\n","{\n \"$schema\": \"http://json-schema.org/draft-07/schema#\",\n \"$id\": \"http://soustack.org/schema/recipe/profiles/minimal.schema.json\",\n \"title\": \"Soustack Recipe Minimal Profile\",\n \"description\": \"Minimal profile that ensures the basic Recipe structure is present while allowing modules to extend it.\",\n \"allOf\": [\n {\n \"$ref\": \"http://soustack.org/schema/recipe/base.schema.json\"\n },\n {\n \"type\": \"object\",\n \"properties\": {\n \"profile\": {\n \"const\": \"minimal\"\n },\n \"modules\": {\n \"type\": \"array\",\n \"items\": {\n \"type\": \"string\",\n \"enum\": [\n \"attribution@1\",\n \"taxonomy@1\",\n \"media@1\",\n \"nutrition@1\",\n \"times@1\"\n ]\n },\n \"default\": []\n },\n \"name\": {\n \"type\": \"string\",\n \"minLength\": 1\n },\n \"ingredients\": {\n \"type\": \"array\",\n \"minItems\": 1\n },\n \"instructions\": {\n \"type\": \"array\",\n \"minItems\": 1\n }\n },\n \"required\": [\n \"profile\",\n \"name\",\n \"ingredients\",\n \"instructions\"\n ],\n \"additionalProperties\": true\n }\n ]\n}\n","{\n \"$schema\": \"http://json-schema.org/draft-07/schema#\",\n \"$id\": \"https://soustack.org/schemas/recipe/modules/schedule/1.schema.json\",\n \"title\": \"Soustack Recipe Module: schedule v1\",\n \"description\": \"Schema for the schedule module. Enforces bidirectional module gating and restricts usage to the core profile.\",\n \"type\": \"object\",\n \"properties\": {\n \"profile\": { \"type\": \"string\" },\n \"modules\": {\n \"type\": \"array\",\n \"items\": { \"type\": \"string\" }\n },\n \"schedule\": {\n \"type\": \"object\",\n \"properties\": {\n \"tasks\": { \"type\": \"array\" }\n },\n \"additionalProperties\": false\n }\n },\n \"allOf\": [\n {\n \"if\": {\n \"properties\": {\n \"modules\": {\n \"type\": \"array\",\n \"contains\": { \"const\": \"schedule@1\" }\n }\n }\n },\n \"then\": {\n \"required\": [\"schedule\", \"profile\"],\n \"properties\": {\n \"profile\": { \"const\": \"core\" }\n }\n }\n },\n {\n \"if\": {\n \"required\": [\"schedule\"]\n },\n \"then\": {\n \"required\": [\"modules\", \"profile\"],\n \"properties\": {\n \"modules\": {\n \"type\": \"array\",\n \"items\": { \"type\": \"string\" },\n \"contains\": { \"const\": \"schedule@1\" }\n },\n \"profile\": { \"const\": \"core\" }\n }\n }\n }\n ],\n \"additionalProperties\": true\n}\n","{\n \"$schema\": \"http://json-schema.org/draft-07/schema#\",\n \"$id\": \"https://soustack.org/schemas/recipe/modules/nutrition/1.schema.json\",\n \"title\": \"Soustack Recipe Module: nutrition v1\",\n \"description\": \"Schema for the nutrition module. Keeps nutrition data aligned with module declarations and vice versa.\",\n \"type\": \"object\",\n \"properties\": {\n \"modules\": {\n \"type\": \"array\",\n \"items\": { \"type\": \"string\" }\n },\n \"nutrition\": {\n \"type\": \"object\",\n \"properties\": {\n \"calories\": { \"type\": \"number\" },\n \"protein_g\": { \"type\": \"number\" }\n },\n \"additionalProperties\": false\n }\n },\n \"allOf\": [\n {\n \"if\": {\n \"properties\": {\n \"modules\": {\n \"type\": \"array\",\n \"contains\": { \"const\": \"nutrition@1\" }\n }\n }\n },\n \"then\": {\n \"required\": [\"nutrition\"]\n }\n },\n {\n \"if\": {\n \"required\": [\"nutrition\"]\n },\n \"then\": {\n \"required\": [\"modules\"],\n \"properties\": {\n \"modules\": {\n \"type\": \"array\",\n \"items\": { \"type\": \"string\" },\n \"contains\": { \"const\": \"nutrition@1\" }\n }\n }\n }\n }\n ],\n \"additionalProperties\": true\n}\n","{\n \"$schema\": \"http://json-schema.org/draft-07/schema#\",\n \"$id\": \"https://soustack.org/schemas/recipe/modules/attribution/1.schema.json\",\n \"title\": \"Soustack Recipe Module: attribution v1\",\n \"description\": \"Schema for the attribution module. Ensures namespace data is present when the module is enabled and vice versa.\",\n \"type\": \"object\",\n \"properties\": {\n \"modules\": {\n \"type\": \"array\",\n \"items\": { \"type\": \"string\" }\n },\n \"attribution\": {\n \"type\": \"object\",\n \"properties\": {\n \"url\": { \"type\": \"string\" },\n \"author\": { \"type\": \"string\" },\n \"datePublished\": { \"type\": \"string\" }\n },\n \"additionalProperties\": false\n }\n },\n \"allOf\": [\n {\n \"if\": {\n \"properties\": {\n \"modules\": {\n \"type\": \"array\",\n \"contains\": { \"const\": \"attribution@1\" }\n }\n }\n },\n \"then\": {\n \"required\": [\"attribution\"]\n }\n },\n {\n \"if\": {\n \"required\": [\"attribution\"]\n },\n \"then\": {\n \"required\": [\"modules\"],\n \"properties\": {\n \"modules\": {\n \"type\": \"array\",\n \"items\": { \"type\": \"string\" },\n \"contains\": { \"const\": \"attribution@1\" }\n }\n }\n }\n }\n ],\n \"additionalProperties\": true\n}\n","{\n \"$schema\": \"http://json-schema.org/draft-07/schema#\",\n \"$id\": \"https://soustack.org/schemas/recipe/modules/taxonomy/1.schema.json\",\n \"title\": \"Soustack Recipe Module: taxonomy v1\",\n \"description\": \"Schema for the taxonomy module. Enforces keyword and categorization data when enabled and ensures module declaration accompanies the namespace block.\",\n \"type\": \"object\",\n \"properties\": {\n \"modules\": {\n \"type\": \"array\",\n \"items\": { \"type\": \"string\" }\n },\n \"taxonomy\": {\n \"type\": \"object\",\n \"properties\": {\n \"keywords\": { \"type\": \"array\", \"items\": { \"type\": \"string\" } },\n \"category\": { \"type\": \"string\" },\n \"cuisine\": { \"type\": \"string\" }\n },\n \"additionalProperties\": false\n }\n },\n \"allOf\": [\n {\n \"if\": {\n \"properties\": {\n \"modules\": {\n \"type\": \"array\",\n \"contains\": { \"const\": \"taxonomy@1\" }\n }\n }\n },\n \"then\": {\n \"required\": [\"taxonomy\"]\n }\n },\n {\n \"if\": {\n \"required\": [\"taxonomy\"]\n },\n \"then\": {\n \"required\": [\"modules\"],\n \"properties\": {\n \"modules\": {\n \"type\": \"array\",\n \"items\": { \"type\": \"string\" },\n \"contains\": { \"const\": \"taxonomy@1\" }\n }\n }\n }\n }\n ],\n \"additionalProperties\": true\n}\n","{\n \"$schema\": \"http://json-schema.org/draft-07/schema#\",\n \"$id\": \"https://soustack.org/schemas/recipe/modules/media/1.schema.json\",\n \"title\": \"Soustack Recipe Module: media v1\",\n \"description\": \"Schema for the media module. Guards media blocks based on module activation and ensures declarations accompany payloads.\",\n \"type\": \"object\",\n \"properties\": {\n \"modules\": {\n \"type\": \"array\",\n \"items\": { \"type\": \"string\" }\n },\n \"media\": {\n \"type\": \"object\",\n \"properties\": {\n \"images\": { \"type\": \"array\", \"items\": { \"type\": \"string\" } },\n \"videos\": { \"type\": \"array\", \"items\": { \"type\": \"string\" } }\n },\n \"additionalProperties\": false\n }\n },\n \"allOf\": [\n {\n \"if\": {\n \"properties\": {\n \"modules\": {\n \"type\": \"array\",\n \"contains\": { \"const\": \"media@1\" }\n }\n }\n },\n \"then\": {\n \"required\": [\"media\"]\n }\n },\n {\n \"if\": {\n \"required\": [\"media\"]\n },\n \"then\": {\n \"required\": [\"modules\"],\n \"properties\": {\n \"modules\": {\n \"type\": \"array\",\n \"items\": { \"type\": \"string\" },\n \"contains\": { \"const\": \"media@1\" }\n }\n }\n }\n }\n ],\n \"additionalProperties\": true\n}\n","{\n \"$schema\": \"http://json-schema.org/draft-07/schema#\",\n \"$id\": \"https://soustack.org/schemas/recipe/modules/times/1.schema.json\",\n \"title\": \"Soustack Recipe Module: times v1\",\n \"description\": \"Schema for the times module. Maintains alignment between module declarations and timing payloads.\",\n \"type\": \"object\",\n \"properties\": {\n \"modules\": {\n \"type\": \"array\",\n \"items\": { \"type\": \"string\" }\n },\n \"times\": {\n \"type\": \"object\",\n \"properties\": {\n \"prepMinutes\": { \"type\": \"number\" },\n \"cookMinutes\": { \"type\": \"number\" },\n \"totalMinutes\": { \"type\": \"number\" }\n },\n \"additionalProperties\": false\n }\n },\n \"allOf\": [\n {\n \"if\": {\n \"properties\": {\n \"modules\": {\n \"type\": \"array\",\n \"contains\": { \"const\": \"times@1\" }\n }\n }\n },\n \"then\": {\n \"required\": [\"times\"]\n }\n },\n {\n \"if\": {\n \"required\": [\"times\"]\n },\n \"then\": {\n \"required\": [\"modules\"],\n \"properties\": {\n \"modules\": {\n \"type\": \"array\",\n \"items\": { \"type\": \"string\" },\n \"contains\": { \"const\": \"times@1\" }\n }\n }\n }\n }\n ],\n \"additionalProperties\": true\n}\n","import Ajv, { ErrorObject, ValidateFunction } from \"ajv\";\nimport addFormats from \"ajv-formats\";\nimport baseSchema from \"./schemas/recipe/base.schema.json\";\nimport coreProfileSchema from \"./schemas/recipe/profiles/core.schema.json\";\nimport minimalProfileSchema from \"./schemas/recipe/profiles/minimal.schema.json\";\nimport scheduleModuleV1 from \"./schemas/recipe/modules/schedule/1.schema.json\";\nimport nutritionModuleV1 from \"./schemas/recipe/modules/nutrition/1.schema.json\";\nimport attributionModuleV1 from \"./schemas/recipe/modules/attribution/1.schema.json\";\nimport taxonomyModuleV1 from \"./schemas/recipe/modules/taxonomy/1.schema.json\";\nimport mediaModuleV1 from \"./schemas/recipe/modules/media/1.schema.json\";\nimport timesModuleV1 from \"./schemas/recipe/modules/times/1.schema.json\";\nimport { Recipe } from \"./types\";\nimport { parseDuration } from \"./parsers/duration\";\n\ntype ProfileName = \"minimal\" | \"core\";\n\n// Use the actual schema IDs from the schema files\nconst CANONICAL_BASE_SCHEMA_ID = (baseSchema as any).$id || \"http://soustack.org/schema/recipe/base.schema.json\";\n\nconst canonicalProfileId = (profile: string): string => {\n if (profile === \"minimal\") {\n return (minimalProfileSchema as any).$id || \"http://soustack.org/schema/recipe/profiles/minimal.schema.json\";\n }\n if (profile === \"core\") {\n return (coreProfileSchema as any).$id || \"http://soustack.org/schema/recipe/profiles/core.schema.json\";\n }\n throw new Error(`Unknown profile: ${profile}`);\n};\n\nconst moduleIdToSchemaRef = (moduleId: string): string => {\n const match = moduleId.match(/^([a-z0-9_-]+)@(\\d+(?:\\.\\d+)*)$/i);\n if (!match) {\n throw new Error(`Invalid module identifier '${moduleId}'. Expected <name>@<version>.`);\n }\n\n const [, name, version] = match;\n // Use the actual schema ID from the module schema file\n const moduleSchemas: Record<string, any> = {\n \"schedule@1\": scheduleModuleV1,\n \"nutrition@1\": nutritionModuleV1,\n \"attribution@1\": attributionModuleV1,\n \"taxonomy@1\": taxonomyModuleV1,\n \"media@1\": mediaModuleV1,\n \"times@1\": timesModuleV1,\n };\n const schema = moduleSchemas[moduleId];\n if (schema && (schema as any).$id) {\n return (schema as any).$id;\n }\n // Fallback to constructed ID\n return `https://soustack.org/schemas/recipe/modules/${name}/${version}.schema.json`;\n};\n\nexport interface NormalizedError {\n path: string;\n message: string;\n keyword?: string;\n}\n\nexport interface NormalizedWarning {\n path: string;\n message: string;\n}\n\nexport interface ValidateOptions {\n profile?: ProfileName;\n schema?: string;\n collectAllErrors?: boolean;\n}\n\nexport interface ValidationResult {\n valid: boolean;\n errors: NormalizedError[];\n warnings: NormalizedWarning[];\n normalized?: Recipe;\n}\n\ninterface ValidationContext {\n ajv: Ajv;\n validators: Map<string, ValidateFunction>;\n}\n\nfunction deepClone<T>(value: T): T {\n return JSON.parse(JSON.stringify(value));\n}\n\nconst profileSchemas: Record<ProfileName, any> = {\n minimal: minimalProfileSchema,\n core: coreProfileSchema,\n};\n\nconst moduleSchemas: Record<string, any> = {\n \"schedule@1\": scheduleModuleV1,\n \"nutrition@1\": nutritionModuleV1,\n \"attribution@1\": attributionModuleV1,\n \"taxonomy@1\": taxonomyModuleV1,\n \"media@1\": mediaModuleV1,\n \"times@1\": timesModuleV1,\n};\n\nconst validationContexts: Map<boolean, ValidationContext> = new Map();\n\nfunction createContext(collectAllErrors: boolean): ValidationContext {\n const ajv = new Ajv({ strict: false, allErrors: collectAllErrors });\n addFormats(ajv);\n\n const addSchemaWithAlias = (schema: any, alias?: string) => {\n if (!schema) return;\n // Use the schema's $id if available, otherwise use the provided alias\n const schemaId = (schema as any).$id || alias;\n if (schemaId) {\n ajv.addSchema(schema, schemaId);\n } else {\n ajv.addSchema(schema);\n }\n };\n\n // Add base schema\n addSchemaWithAlias(baseSchema, CANONICAL_BASE_SCHEMA_ID);\n\n // Add profile schemas\n Object.entries(profileSchemas).forEach(([name, schema]) => {\n addSchemaWithAlias(schema, canonicalProfileId(name));\n });\n\n // Add module schemas\n Object.entries(moduleSchemas).forEach(([moduleId, schema]) => {\n addSchemaWithAlias(schema, moduleIdToSchemaRef(moduleId));\n });\n\n return { ajv, validators: new Map() };\n}\n\nfunction getContext(collectAllErrors: boolean): ValidationContext {\n if (!validationContexts.has(collectAllErrors)) {\n validationContexts.set(collectAllErrors, createContext(collectAllErrors));\n }\n return validationContexts.get(collectAllErrors)!;\n}\n\nfunction cloneRecipe<T>(recipe: T): T {\n if (typeof structuredClone === \"function\") {\n return structuredClone(recipe);\n }\n return JSON.parse(JSON.stringify(recipe));\n}\n\nfunction detectProfileFromSchema(schemaRef?: string): ProfileName | undefined {\n if (!schemaRef) return undefined;\n const match = schemaRef.match(/\\/profiles\\/([a-z]+)\\.schema\\.json$/i);\n if (match) {\n const profile = match[1].toLowerCase() as ProfileName;\n if (profile in profileSchemas) return profile;\n }\n return undefined;\n}\n\nfunction resolveSchemaRef(inputSchema: unknown, requestedSchema?: string): string | undefined {\n if (typeof requestedSchema === \"string\") return requestedSchema;\n if (typeof inputSchema !== \"string\") return undefined;\n\n return detectProfileFromSchema(inputSchema) ? inputSchema : undefined;\n}\n\n/**\n * Infer module identifiers from payload fields in the recipe.\n * Returns an array of module IDs (e.g., [\"times@1\", \"nutrition@1\"]).\n */\nfunction inferModulesFromPayload(recipe: any): string[] {\n const inferred: string[] = [];\n \n // Map payload field names to module IDs\n const payloadToModule: Record<string, string> = {\n attribution: \"attribution@1\",\n taxonomy: \"taxonomy@1\",\n media: \"media@1\",\n times: \"times@1\",\n nutrition: \"nutrition@1\",\n schedule: \"schedule@1\",\n };\n\n for (const [field, moduleId] of Object.entries(payloadToModule)) {\n if (recipe && typeof recipe === \"object\" && field in recipe && recipe[field] != null) {\n // Check if the payload is a non-empty object/array\n const payload = recipe[field];\n if (typeof payload === \"object\" && !Array.isArray(payload)) {\n // For objects, check if it has any properties\n if (Object.keys(payload).length > 0) {\n inferred.push(moduleId);\n }\n } else if (Array.isArray(payload) && payload.length > 0) {\n inferred.push(moduleId);\n } else if (payload !== null && payload !== undefined) {\n // For primitive values, consider it present\n inferred.push(moduleId);\n }\n }\n }\n\n return inferred;\n}\n\nfunction getCombinedValidator(\n profile: ProfileName,\n modules: string[],\n recipe: any,\n context: ValidationContext,\n): ValidateFunction {\n // Infer modules from payloads\n const inferredModules = inferModulesFromPayload(recipe);\n \n // Union of declared and inferred modules\n const allModules = new Set([...modules, ...inferredModules]);\n const sortedModules = Array.from(allModules).sort();\n \n const cacheKey = `${profile}::${sortedModules.join(\",\")}`;\n const cached = context.validators.get(cacheKey);\n if (cached) return cached;\n\n if (!profileSchemas[profile]) {\n throw new Error(`Unknown Soustack profile: ${profile}`);\n }\n\n // Composed validation: allOf: [base, profile overlay, ...module overlays]\n // Include schemas for both declared AND inferred modules to enforce contract\n const schema = {\n $id: `urn:soustack:recipe:${cacheKey}`,\n allOf: [\n { $ref: CANONICAL_BASE_SCHEMA_ID },\n { $ref: canonicalProfileId(profile) },\n ...sortedModules.map((moduleId) => ({ $ref: moduleIdToSchemaRef(moduleId) })),\n ],\n };\n\n const validateFn = context.ajv.compile(schema);\n context.validators.set(cacheKey, validateFn);\n return validateFn;\n}\n\nfunction normalizeRecipe(recipe: Recipe): { normalized: Recipe; warnings: NormalizedWarning[] } {\n const normalized = cloneRecipe(recipe);\n const warnings: NormalizedWarning[] = [];\n\n normalizeTime(normalized);\n\n if (\n normalized &&\n typeof normalized === \"object\" &&\n \"version\" in normalized &&\n !(normalized as any).recipeVersion &&\n typeof (normalized as any).version === \"string\"\n ) {\n (normalized as any).recipeVersion = (normalized as any).version;\n warnings.push({ path: \"/version\", message: \"'version' is deprecated; mapped to 'recipeVersion'.\" });\n }\n\n return { normalized, warnings };\n}\n\nfunction normalizeTime(recipe: Recipe): void {\n const time = (recipe as any)?.time;\n if (!time || typeof time !== \"object\" || Array.isArray(time)) return;\n\n const structuredKeys: Array<\"prep\" | \"active\" | \"passive\" | \"total\"> = [\n \"prep\",\n \"active\",\n \"passive\",\n \"total\",\n ];\n\n structuredKeys.forEach((key) => {\n const value = (time as any)[key];\n if (typeof value === \"number\") return;\n\n const parsed = parseDuration(value as any);\n if (parsed !== null) {\n (time as any)[key] = parsed;\n }\n });\n}\n\n// Allowed top-level properties from base schema plus common extensions\n// Note: base schema has additionalProperties: true, so we only reject truly unknown fields\nconst allowedTopLevelProps = new Set<string>([\n ...Object.keys((baseSchema as any)?.properties ?? {}),\n \"$schema\",\n // Module fields (validated by module schemas)\n \"attribution\",\n \"taxonomy\",\n \"media\",\n \"times\",\n \"nutrition\",\n \"schedule\",\n // Common recipe fields (allowed by base schema's additionalProperties: true)\n \"description\",\n \"image\",\n \"category\",\n \"tags\",\n \"source\",\n \"dateAdded\",\n \"dateModified\",\n \"yield\",\n \"time\",\n \"id\",\n \"title\",\n \"recipeVersion\",\n \"version\", // deprecated but allowed\n \"equipment\",\n \"storage\",\n \"substitutions\",\n]);\n\nfunction detectUnknownTopLevelKeys(recipe: any): NormalizedError[] {\n if (!recipe || typeof recipe !== \"object\") return [];\n const disallowedKeys = Object.keys(recipe).filter(\n (key) => !allowedTopLevelProps.has(key) && !key.startsWith(\"x-\"),\n );\n\n return disallowedKeys.map((key) => ({\n path: `/${key}`,\n keyword: \"additionalProperties\",\n message: `Unknown top-level property '${key}' is not allowed by the Soustack spec`,\n }));\n}\n\nfunction formatAjvError(error: ErrorObject): NormalizedError {\n let path = error.instancePath || \"/\";\n if (error.keyword === \"additionalProperties\" && (error.params as any)?.additionalProperty) {\n const extra = (error.params as any).additionalProperty;\n path = `${error.instancePath || \"\"}/${extra}`.replace(/\\/+/g, \"/\") || \"/\";\n }\n\n return {\n path,\n keyword: error.keyword,\n message: error.message || \"Validation error\",\n };\n}\n\nfunction runAjvValidation(\n data: any,\n profile: ProfileName,\n modules: string[],\n context: ValidationContext,\n): NormalizedError[] {\n try {\n const validateFn = getCombinedValidator(profile, modules, data, context);\n const isValid = validateFn(data);\n return !isValid && validateFn.errors ? validateFn.errors.map(formatAjvError) : [];\n } catch (error) {\n return [\n {\n path: \"/\",\n message: error instanceof Error ? error.message : \"Validation failed to initialize\",\n },\n ];\n }\n}\n\nfunction isInstruction(item: any): item is { id?: string; dependsOn?: string[] } {\n return item && typeof item === \"object\" && !Array.isArray(item) && \"text\" in item;\n}\n\nfunction isInstructionSubsection(item: any): item is { items: any[] } {\n return item && typeof item === \"object\" && !Array.isArray(item) && \"items\" in item && \"subsection\" in item;\n}\n\nexport function checkInstructionGraph(recipe: Recipe): NormalizedError[] {\n const instructions = (recipe as any)?.instructions;\n if (!Array.isArray(instructions)) return [];\n\n const instructionIds = new Set<string>();\n const dependencyRefs: { fromId?: string; toId: string; path: string }[] = [];\n\n const collect = (items: any[], basePath: string) => {\n items.forEach((item, index) => {\n const currentPath = `${basePath}/${index}`;\n\n if (isInstructionSubsection(item) && Array.isArray(item.items)) {\n collect(item.items, `${currentPath}/items`);\n return;\n }\n\n if (isInstruction(item)) {\n const id = typeof item.id === \"string\" ? item.id : undefined;\n if (id) instructionIds.add(id);\n\n if (Array.isArray(item.dependsOn)) {\n item.dependsOn.forEach((depId, depIndex) => {\n if (typeof depId === \"string\") {\n dependencyRefs.push({\n fromId: id,\n toId: depId,\n path: `${currentPath}/dependsOn/${depIndex}`,\n });\n }\n });\n }\n }\n });\n };\n\n collect(instructions, \"/instructions\");\n\n const errors: NormalizedError[] = [];\n\n dependencyRefs.forEach((ref) => {\n if (!instructionIds.has(ref.toId)) {\n errors.push({\n path: ref.path,\n message: `Instruction dependency references missing id '${ref.toId}'.`,\n });\n }\n });\n\n const adjacency = new Map<string, { toId: string; path: string }[]>();\n dependencyRefs.forEach((ref) => {\n if (ref.fromId && instructionIds.has(ref.fromId) && instructionIds.has(ref.toId)) {\n const list = adjacency.get(ref.fromId) ?? [];\n list.push({ toId: ref.toId, path: ref.path });\n adjacency.set(ref.fromId, list);\n }\n });\n\n const visiting = new Set<string>();\n const visited = new Set<string>();\n\n const detectCycles = (nodeId: string) => {\n if (visiting.has(nodeId)) return;\n if (visited.has(nodeId)) return;\n\n visiting.add(nodeId);\n const neighbors = adjacency.get(nodeId) ?? [];\n neighbors.forEach((edge) => {\n if (visiting.has(edge.toId)) {\n errors.push({\n path: edge.path,\n message: `Circular dependency detected involving instruction id '${edge.toId}'.`,\n });\n return;\n }\n detectCycles(edge.toId);\n });\n visiting.delete(nodeId);\n visited.add(nodeId);\n };\n\n instructionIds.forEach((id) => detectCycles(id));\n\n return errors;\n}\n\nexport function validateRecipe(input: any, options: ValidateOptions = {}): ValidationResult {\n const collectAllErrors = options.collectAllErrors ?? true;\n const context = getContext(collectAllErrors);\n const schemaRef = resolveSchemaRef(input?.$schema, options.schema);\n const profileFromDocument = typeof input?.profile === \"string\" ? (input.profile as ProfileName) : undefined;\n const profile: ProfileName =\n options.profile ?? profileFromDocument ?? detectProfileFromSchema(schemaRef) ?? \"core\";\n // Modules default to [] if missing\n const modulesFromDocument = Array.isArray(input?.modules)\n ? (input.modules as string[]).filter((value) => typeof value === \"string\")\n : [];\n const modules = modulesFromDocument.length > 0 ? [...modulesFromDocument].sort() : [];\n\n const { normalized, warnings } = normalizeRecipe(input as Recipe);\n\n // Apply defaults before validation (required by profile schemas)\n // Profile defaults to \"core\" if missing\n if (!profileFromDocument) {\n (normalized as any).profile = profile;\n } else {\n (normalized as any).profile = profileFromDocument;\n }\n \n // Modules default to [] if missing (as per schema defaults)\n if (!('modules' in normalized) || normalized.modules === undefined || normalized.modules === null) {\n (normalized as any).modules = [];\n } else if (modulesFromDocument.length > 0) {\n (normalized as any).modules = modules;\n }\n\n const unknownKeyErrors = detectUnknownTopLevelKeys(normalized);\n const validationErrors = runAjvValidation(normalized, profile, modules, context);\n // Check instruction graph if schedule module is present\n const graphErrors =\n modules.includes(\"schedule@1\") && validationErrors.length === 0\n ? checkInstructionGraph(normalized)\n : [];\n const errors = [...unknownKeyErrors, ...validationErrors, ...graphErrors];\n\n return {\n valid: errors.length === 0,\n errors,\n warnings,\n normalized: errors.length === 0 ? normalized : undefined,\n };\n}\n\nexport function validateRecipeWithProfile(data: any, profile: ProfileName): data is Recipe {\n return validateRecipe(data, { profile }).valid;\n}\n\nexport function detectProfiles(recipe: any): ProfileName[] {\n const result = validateRecipe(recipe, { profile: \"core\", collectAllErrors: false });\n if (!result.valid) return [];\n\n const normalizedRecipe = result.normalized ?? recipe;\n const profiles: ProfileName[] = [];\n const context = getContext(false);\n\n // Check which profiles the recipe satisfies\n (Object.keys(profileSchemas) as ProfileName[]).forEach((profile) => {\n if (!profileSchemas[profile]) return;\n const errors = runAjvValidation(normalizedRecipe, profile, [], context);\n if (errors.length === 0) {\n profiles.push(profile);\n }\n });\n\n return profiles;\n}\n","import { Yield } from '../types';\n\nexport function parseYield(value: unknown): Yield | undefined {\n if (value === undefined || value === null) {\n return undefined;\n }\n\n if (typeof value === 'number') {\n return {\n amount: value,\n unit: 'servings'\n };\n }\n\n if (Array.isArray(value)) {\n return parseYield(value[0]);\n }\n\n if (typeof value === 'object') {\n const maybeYield = value as Record<string, any>;\n if (typeof maybeYield.amount === 'number') {\n return {\n amount: maybeYield.amount,\n unit: typeof maybeYield.unit === 'string' ? maybeYield.unit : 'servings',\n description:\n typeof maybeYield.description === 'string'\n ? maybeYield.description\n : undefined\n };\n }\n }\n\n if (typeof value === 'string') {\n const trimmed = value.trim();\n const match = trimmed.match(/(\\d+(?:\\.\\d+)?)/);\n if (match) {\n const amount = parseFloat(match[1]);\n const unit = trimmed.slice(match.index! + match[1].length).trim();\n return {\n amount,\n unit: unit || 'servings',\n description: trimmed\n };\n }\n }\n\n return undefined;\n}\n\nexport function formatYield(yieldValue?: Yield): string | undefined {\n if (!yieldValue) return undefined;\n if (!yieldValue.amount && !yieldValue.unit) {\n return undefined;\n }\n\n const amount = yieldValue.amount ?? '';\n const unit = yieldValue.unit ? ` ${yieldValue.unit}` : '';\n return `${amount}${unit}`.trim() || yieldValue.description;\n}\n","import { SchemaOrgImage } from '../types/schemaOrg';\n\n/**\n * Normalize Schema.org image formats to Soustack format.\n * - String values pass through\n * - Arrays collapse to string or string[] after URL extraction\n * - ImageObjects extract their url/contentUrl\n */\nexport function normalizeImage(\n image: SchemaOrgImage | undefined | null\n): string | string[] | undefined {\n if (!image) {\n return undefined;\n }\n\n if (typeof image === 'string') {\n const trimmed = image.trim();\n return trimmed || undefined;\n }\n\n if (Array.isArray(image)) {\n const urls = image\n .map(entry => (typeof entry === 'string' ? entry.trim() : extractUrl(entry)))\n .filter((url): url is string => typeof url === 'string' && Boolean(url));\n\n if (urls.length === 0) {\n return undefined;\n }\n if (urls.length === 1) {\n return urls[0];\n }\n return urls;\n }\n\n return extractUrl(image);\n}\n\nfunction extractUrl(\n value: Exclude<SchemaOrgImage, string | string[] | undefined | null>\n): string | undefined {\n if (!value || typeof value !== 'object') {\n return undefined;\n }\n\n const record = value as { url?: unknown; contentUrl?: unknown };\n const candidate =\n typeof record.url === 'string'\n ? record.url\n : typeof record.contentUrl === 'string'\n ? record.contentUrl\n : undefined;\n\n if (!candidate) {\n return undefined;\n }\n\n const trimmed = candidate.trim();\n return trimmed || undefined;\n}\n","import {\n IngredientItem,\n Instruction,\n InstructionItem,\n Recipe,\n Source,\n AttributionModule,\n TaxonomyModule,\n MediaModule,\n TimesModule,\n NutritionFacts,\n StepTiming,\n StructuredTime\n} from './types';\nimport { parseYield } from './converters/yield';\nimport { smartParseDuration } from './parsers/duration';\nimport {\n HowToSection,\n HowToStep,\n SchemaOrgPersonOrOrganization,\n SchemaOrgRecipe,\n SchemaOrgImage\n} from './types/schemaOrg';\nimport { normalizeImage } from './utils/image';\n\nexport function fromSchemaOrg(input: unknown): Recipe | null {\n const recipeNode = extractRecipeNode(input);\n if (!recipeNode) {\n return null;\n }\n\n const ingredients = convertIngredients(recipeNode.recipeIngredient);\n const instructions = convertInstructions(recipeNode.recipeInstructions);\n const time = convertTime(recipeNode);\n const recipeYield = parseYield(recipeNode.recipeYield);\n const tags = collectTags(recipeNode.recipeCuisine, recipeNode.keywords);\n const category = extractFirst(recipeNode.recipeCategory);\n const source = convertSource(recipeNode);\n const dateModified = recipeNode.dateModified || undefined;\n const nutrition = convertNutrition(recipeNode.nutrition);\n\n const attribution = convertAttribution(recipeNode);\n const taxonomy = convertTaxonomy(tags, category, extractFirst(recipeNode.recipeCuisine));\n const media = convertMedia(recipeNode.image, recipeNode.video);\n const times = convertTimes(time);\n\n const modules: string[] = [];\n if (attribution) modules.push('attribution@1');\n if (taxonomy) modules.push('taxonomy@1');\n if (media) modules.push('media@1');\n if (nutrition) modules.push('nutrition@1');\n if (times) modules.push('times@1');\n\n return {\n '@type': 'Recipe',\n profile: 'minimal',\n modules: modules.sort(),\n name: recipeNode.name.trim(),\n description: recipeNode.description?.trim() || undefined,\n image: normalizeImage(recipeNode.image),\n category,\n tags: tags.length ? tags : undefined,\n source,\n dateAdded: recipeNode.datePublished || undefined,\n yield: recipeYield,\n time,\n ingredients,\n instructions,\n ...(dateModified ? { dateModified } : {}),\n ...(nutrition ? { nutrition } : {}),\n ...(attribution ? { attribution } : {}),\n ...(taxonomy ? { taxonomy } : {}),\n ...(media ? { media } : {}),\n ...(times ? { times } : {})\n };\n}\n\nfunction extractRecipeNode(input: unknown): SchemaOrgRecipe | null {\n if (!input) return null;\n\n if (Array.isArray(input)) {\n for (const entry of input) {\n const found = extractRecipeNode(entry);\n if (found) {\n return found;\n }\n }\n return null;\n }\n\n if (typeof input !== 'object') {\n return null;\n }\n\n const record = input as Partial<SchemaOrgRecipe> & { [key: string]: unknown };\n\n if (record['@graph']) {\n const fromGraph = extractRecipeNode(record['@graph']);\n if (fromGraph) {\n return fromGraph;\n }\n }\n\n if (!hasRecipeType(record['@type'])) {\n return null;\n }\n\n if (!isValidName(record.name)) {\n return null;\n }\n\n return record as SchemaOrgRecipe;\n}\n\nfunction hasRecipeType(value: SchemaOrgRecipe['@type']): boolean {\n if (!value) return false;\n const types = Array.isArray(value) ? value : [value];\n return types.some(\n entry => typeof entry === 'string' && entry.toLowerCase() === 'recipe'\n );\n}\n\nfunction isValidName(name: unknown): name is string {\n return typeof name === 'string' && Boolean(name.trim());\n}\n\nfunction convertIngredients(\n value: SchemaOrgRecipe['recipeIngredient']\n): IngredientItem[] {\n if (!value) return [];\n const normalized = Array.isArray(value) ? value : [value];\n return normalized\n .map(item => (typeof item === 'string' ? item.trim() : ''))\n .filter(Boolean);\n}\n\nfunction convertInstructions(\n value: SchemaOrgRecipe['recipeInstructions']\n): InstructionItem[] {\n if (!value) return [];\n const normalized = Array.isArray(value) ? value : [value];\n const result: InstructionItem[] = [];\n\n for (const entry of normalized) {\n if (!entry) continue;\n\n if (typeof entry === 'string') {\n const text = entry.trim();\n if (text) {\n result.push(text);\n }\n continue;\n }\n\n if (isHowToSection(entry)) {\n const subsectionItems = extractSectionItems(entry.itemListElement);\n if (subsectionItems.length) {\n result.push({\n subsection: entry.name?.trim() || 'Section',\n items: subsectionItems\n });\n }\n continue;\n }\n\n if (isHowToStep(entry)) {\n const parsed = convertHowToStep(entry);\n if (parsed) {\n result.push(parsed);\n }\n }\n }\n\n return result;\n}\n\nfunction extractSectionItems(\n items: Array<string | HowToStep | HowToSection> = []\n): Array<string | Instruction> {\n const result: Array<string | Instruction> = [];\n\n for (const item of items) {\n if (!item) continue;\n\n if (typeof item === 'string') {\n const text = item.trim();\n if (text) {\n result.push(text);\n }\n continue;\n }\n\n if (isHowToStep(item)) {\n const parsed = convertHowToStep(item);\n if (parsed) {\n result.push(parsed);\n }\n continue;\n }\n\n if (isHowToSection(item)) {\n result.push(...extractSectionItems(item.itemListElement));\n }\n }\n\n return result;\n}\n\nfunction extractInstructionText(value: HowToStep): string | undefined {\n const text = typeof value.text === 'string' ? value.text : value.name;\n return typeof text === 'string' ? text.trim() || undefined : undefined;\n}\n\nfunction convertHowToStep(step: HowToStep): string | Instruction | undefined {\n const text = extractInstructionText(step);\n if (!text) {\n return undefined;\n }\n\n const normalizedImage = normalizeImage(step.image);\n const image = Array.isArray(normalizedImage)\n ? normalizedImage[0]\n : normalizedImage;\n const id = extractInstructionId(step);\n const timing = extractInstructionTiming(step);\n\n if (!image && !id && !timing) {\n return text;\n }\n\n const instruction: Instruction = { text };\n if (id) instruction.id = id;\n if (image) instruction.image = image;\n if (timing) instruction.timing = timing;\n\n return instruction;\n}\n\nfunction extractInstructionTiming(step: HowToStep): StepTiming | undefined {\n const duration =\n step.totalTime || step.performTime || step.prepTime || (step as any).duration;\n\n if (!duration || typeof duration !== 'string') {\n return undefined;\n }\n\n const parsed = smartParseDuration(duration);\n return { duration: parsed ?? duration, type: 'active' };\n}\n\nfunction extractInstructionId(step: HowToStep): string | undefined {\n const raw = (step as any)['@id'] || (step as any).id || step.url;\n if (typeof raw !== 'string') {\n return undefined;\n }\n const trimmed = raw.trim();\n return trimmed || undefined;\n}\n\nfunction isHowToStep(value: unknown): value is HowToStep {\n return (\n Boolean(value) &&\n typeof value === 'object' &&\n (value as HowToStep)['@type'] === 'HowToStep'\n );\n}\n\nfunction isHowToSection(value: unknown): value is HowToSection {\n return (\n Boolean(value) &&\n typeof value === 'object' &&\n (value as HowToSection)['@type'] === 'HowToSection' &&\n Array.isArray((value as HowToSection).itemListElement)\n );\n}\n\nfunction convertTime(recipe: SchemaOrgRecipe): StructuredTime | undefined {\n const prep = smartParseDuration(recipe.prepTime ?? '');\n const cook = smartParseDuration(recipe.cookTime ?? '');\n const total = smartParseDuration(recipe.totalTime ?? '');\n\n const structured: StructuredTime = {};\n if (prep !== null && prep !== undefined) structured.prep = prep;\n if (cook !== null && cook !== undefined) structured.active = cook;\n if (total !== null && total !== undefined) structured.total = total;\n\n return Object.keys(structured).length ? structured : undefined;\n}\n\nfunction collectTags(cuisine: unknown, keywords: unknown): string[] {\n const tags = new Set<string>();\n flattenStrings(cuisine).forEach(tag => tags.add(tag));\n if (typeof keywords === 'string') {\n splitKeywords(keywords).forEach(tag => tags.add(tag));\n } else {\n flattenStrings(keywords).forEach(tag => tags.add(tag));\n }\n return Array.from(tags);\n}\n\nfunction splitKeywords(value: string): string[] {\n return value\n .split(/[,|]/)\n .map(part => part.trim())\n .filter(Boolean);\n}\n\nfunction flattenStrings(value: unknown): string[] {\n if (!value) return [];\n if (typeof value === 'string') return [value.trim()].filter(Boolean);\n if (Array.isArray(value)) {\n return value\n .map(item => (typeof item === 'string' ? item.trim() : ''))\n .filter(Boolean);\n }\n return [];\n}\n\nfunction extractFirst(value: unknown): string | undefined {\n const arr = flattenStrings(value);\n return arr.length ? arr[0] : undefined;\n}\n\nfunction convertSource(recipe: SchemaOrgRecipe): Source | undefined {\n const author = extractEntityName(recipe.author);\n const publisher = extractEntityName(recipe.publisher);\n const url = (recipe.url || recipe.mainEntityOfPage)?.trim();\n\n const source: Source = {};\n if (author) source.author = author;\n if (publisher) source.name = publisher;\n if (url) source.url = url;\n\n return Object.keys(source).length ? source : undefined;\n}\n\nfunction extractEntityName(\n value:\n | SchemaOrgPersonOrOrganization\n | SchemaOrgPersonOrOrganization[]\n | string\n | string[]\n | undefined\n): string | undefined {\n if (!value) return undefined;\n\n if (typeof value === 'string') {\n const trimmed = value.trim();\n return trimmed || undefined;\n }\n\n if (Array.isArray(value)) {\n for (const entry of value) {\n const name = extractEntityName(entry as any);\n if (name) {\n return name;\n }\n }\n return undefined;\n }\n\n if (typeof value === 'object' && typeof value.name === 'string') {\n const trimmed = value.name.trim();\n return trimmed || undefined;\n }\n\n return undefined;\n}\n\nfunction convertAttribution(recipe: SchemaOrgRecipe): AttributionModule | undefined {\n const attribution: AttributionModule = {};\n const url = (recipe.url || recipe.mainEntityOfPage)?.trim();\n const author = extractEntityName(recipe.author);\n const datePublished = recipe.datePublished?.trim();\n\n if (url) attribution.url = url;\n if (author) attribution.author = author;\n if (datePublished) attribution.datePublished = datePublished;\n\n return Object.keys(attribution).length ? attribution : undefined;\n}\n\nfunction convertTaxonomy(\n keywords: string[],\n category?: string,\n cuisine?: string\n): TaxonomyModule | undefined {\n const taxonomy: TaxonomyModule = {};\n if (keywords.length) taxonomy.keywords = keywords;\n if (category) taxonomy.category = category;\n if (cuisine) taxonomy.cuisine = cuisine;\n\n return Object.keys(taxonomy).length ? taxonomy : undefined;\n}\n\nfunction normalizeMediaList(value: SchemaOrgImage | undefined): string[] {\n if (!value) return [];\n if (typeof value === 'string') return [value.trim()].filter(Boolean);\n if (Array.isArray(value)) {\n return value\n .map(item => (typeof item === 'string' ? item.trim() : extractMediaUrl(item)))\n .filter((entry): entry is string => Boolean(entry?.length));\n }\n\n const url = extractMediaUrl(value);\n return url ? [url] : [];\n}\n\nfunction extractMediaUrl(value: unknown): string | undefined {\n if (value && typeof value === 'object' && 'url' in value && typeof (value as any).url === 'string') {\n const trimmed = (value as any).url.trim();\n return trimmed || undefined;\n }\n return undefined;\n}\n\nfunction convertMedia(\n image: SchemaOrgImage | undefined,\n video: SchemaOrgImage | undefined\n): MediaModule | undefined {\n const normalizedImage = normalizeImage(image);\n const images = normalizedImage\n ? Array.isArray(normalizedImage)\n ? normalizedImage\n : [normalizedImage]\n : [];\n const videos = normalizeMediaList(video);\n\n const media: MediaModule = {};\n if (images.length) media.images = images;\n if (videos.length) media.videos = videos;\n\n return Object.keys(media).length ? media : undefined;\n}\n\nfunction convertTimes(time?: StructuredTime): TimesModule | undefined {\n if (!time) return undefined;\n const times: TimesModule = {};\n\n if (typeof time.prep === 'number') times.prepMinutes = time.prep;\n if (typeof time.active === 'number') times.cookMinutes = time.active;\n if (typeof time.total === 'number') times.totalMinutes = time.total;\n\n return Object.keys(times).length ? times : undefined;\n}\n\nfunction convertNutrition(\n nutrition: SchemaOrgRecipe['nutrition']\n): NutritionFacts | undefined {\n if (!nutrition || typeof nutrition !== 'object') {\n return undefined;\n }\n\n const result: NutritionFacts = {};\n let hasData = false;\n\n // Parse calories - can be string or number in Schema.org\n if ('calories' in nutrition) {\n const calories = nutrition.calories;\n if (typeof calories === 'number') {\n result.calories = calories;\n hasData = true;\n } else if (typeof calories === 'string') {\n // Try to parse string like \"200 cal\" or \"200\"\n const parsed = parseFloat(calories.replace(/[^\\d.-]/g, ''));\n if (!isNaN(parsed)) {\n result.calories = parsed;\n hasData = true;\n }\n }\n }\n\n // Parse protein - Schema.org uses \"proteinContent\", we need \"protein_g\"\n if ('proteinContent' in nutrition || 'protein_g' in nutrition) {\n const protein = nutrition.proteinContent || nutrition.protein_g;\n if (typeof protein === 'number') {\n result.protein_g = protein;\n hasData = true;\n } else if (typeof protein === 'string') {\n // Try to parse string like \"10 g\" or \"10\"\n const parsed = parseFloat(protein.replace(/[^\\d.-]/g, ''));\n if (!isNaN(parsed)) {\n result.protein_g = parsed;\n hasData = true;\n }\n }\n }\n\n return hasData ? result : undefined;\n}","{\n \"modules\": [\n {\n \"id\": \"attribution\",\n \"versions\": [\n 1\n ],\n \"latest\": 1,\n \"namespace\": \"https://soustack.org/schemas/recipe/modules/attribution\",\n \"schema\": \"https://soustack.org/schemas/recipe/modules/attribution/1.schema.json\",\n \"schemaOrgMappable\": true,\n \"schemaOrgConfidence\": \"medium\",\n \"minProfile\": \"minimal\",\n \"allowedOnMinimal\": true\n },\n {\n \"id\": \"taxonomy\",\n \"versions\": [\n 1\n ],\n \"latest\": 1,\n \"namespace\": \"https://soustack.org/schemas/recipe/modules/taxonomy\",\n \"schema\": \"https://soustack.org/schemas/recipe/modules/taxonomy/1.schema.json\",\n \"schemaOrgMappable\": true,\n \"schemaOrgConfidence\": \"high\",\n \"minProfile\": \"minimal\",\n \"allowedOnMinimal\": true\n },\n {\n \"id\": \"media\",\n \"versions\": [\n 1\n ],\n \"latest\": 1,\n \"namespace\": \"https://soustack.org/schemas/recipe/modules/media\",\n \"schema\": \"https://soustack.org/schemas/recipe/modules/media/1.schema.json\",\n \"schemaOrgMappable\": true,\n \"schemaOrgConfidence\": \"medium\",\n \"minProfile\": \"minimal\",\n \"allowedOnMinimal\": true\n },\n {\n \"id\": \"nutrition\",\n \"versions\": [\n 1\n ],\n \"latest\": 1,\n \"namespace\": \"https://soustack.org/schemas/recipe/modules/nutrition\",\n \"schema\": \"https://soustack.org/schemas/recipe/modules/nutrition/1.schema.json\",\n \"schemaOrgMappable\": false,\n \"schemaOrgConfidence\": \"low\",\n \"minProfile\": \"minimal\",\n \"allowedOnMinimal\": true\n },\n {\n \"id\": \"times\",\n \"versions\": [\n 1\n ],\n \"latest\": 1,\n \"namespace\": \"https://soustack.org/schemas/recipe/modules/times\",\n \"schema\": \"https://soustack.org/schemas/recipe/modules/times/1.schema.json\",\n \"schemaOrgMappable\": true,\n \"schemaOrgConfidence\": \"medium\",\n \"minProfile\": \"minimal\",\n \"allowedOnMinimal\": true\n },\n {\n \"id\": \"schedule\",\n \"versions\": [\n 1\n ],\n \"latest\": 1,\n \"namespace\": \"https://soustack.org/schemas/recipe/modules/schedule\",\n \"schema\": \"https://soustack.org/schemas/recipe/modules/schedule/1.schema.json\",\n \"schemaOrgMappable\": false,\n \"schemaOrgConfidence\": \"low\",\n \"minProfile\": \"core\",\n \"allowedOnMinimal\": false\n }\n ]\n}\n","import {\n IngredientItem,\n Instruction,\n InstructionItem,\n Recipe,\n StructuredTime,\n Time,\n TimesModule\n} from '../types';\nimport { formatDuration } from '../parsers/duration';\nimport { formatYield } from './yield';\nimport {\n HowToSection,\n HowToStep,\n SchemaOrgInstruction,\n SchemaOrgRecipe\n} from '../types/schemaOrg';\nimport modulesRegistry from '../schemas/registry/modules.json';\n\nexport function convertBasicMetadata(recipe: Recipe): Partial<SchemaOrgRecipe> {\n return cleanOutput({\n '@context': 'https://schema.org',\n '@type': 'Recipe',\n name: recipe.name,\n description: recipe.description,\n image: recipe.image,\n url: recipe.source?.url,\n datePublished: recipe.dateAdded,\n dateModified: recipe.dateModified\n });\n}\n\nexport function convertIngredients(ingredients: IngredientItem[] = []): string[] {\n const result: string[] = [];\n\n ingredients.forEach(ingredient => {\n if (!ingredient) {\n return;\n }\n\n if (typeof ingredient === 'string') {\n const value = ingredient.trim();\n if (value) {\n result.push(value);\n }\n return;\n }\n\n if ('subsection' in ingredient) {\n ingredient.items.forEach(item => {\n if (!item) {\n return;\n }\n if (typeof item === 'string') {\n const value = item.trim();\n if (value) {\n result.push(value);\n }\n } else if (item.item) {\n const value = item.item.trim();\n if (value) {\n result.push(value);\n }\n }\n });\n return;\n }\n\n const value = ingredient.item?.trim();\n if (value) {\n result.push(value);\n }\n });\n\n return result;\n}\n\nexport function convertInstructions(\n instructions: InstructionItem[] = []\n): SchemaOrgInstruction[] {\n return instructions\n .map(entry => convertInstruction(entry))\n .filter((value): value is SchemaOrgInstruction => Boolean(value));\n}\n\nfunction convertInstruction(entry: InstructionItem): SchemaOrgInstruction | null {\n if (!entry) {\n return null;\n }\n\n if (typeof entry === 'string') {\n const value = entry.trim();\n return value || null;\n }\n\n if ('subsection' in entry) {\n const steps = entry.items\n .map(item => convertInstruction(item))\n .filter((step): step is SchemaOrgInstruction => Boolean(step));\n\n if (!steps.length) {\n return null;\n }\n\n return {\n '@type': 'HowToSection',\n name: entry.subsection,\n itemListElement: steps\n };\n }\n\n if ('text' in entry) {\n return createHowToStep(entry);\n }\n\n return createHowToStep(String(entry));\n}\n\nfunction createHowToStep(\n entry: string | Instruction | undefined\n): SchemaOrgInstruction | null {\n if (!entry) return null;\n\n if (typeof entry === 'string') {\n const trimmed = entry.trim();\n return trimmed || null;\n }\n\n const trimmed = entry.text?.trim();\n if (!trimmed) {\n return null;\n }\n\n const step: HowToStep = {\n '@type': 'HowToStep',\n text: trimmed\n };\n\n if (entry.id) {\n step['@id'] = entry.id;\n }\n\n if (entry.timing) {\n if (typeof entry.timing.duration === 'number') {\n step.performTime = formatDuration(entry.timing.duration);\n } else if (entry.timing.duration) {\n step.performTime = entry.timing.duration;\n }\n }\n\n if (entry.image) {\n step.image = entry.image;\n }\n\n if (step['@id'] || step.performTime || step.image) {\n return step;\n }\n\n return trimmed;\n}\n\nexport function convertTime(time?: Time): Partial<SchemaOrgRecipe> {\n if (!time) {\n return {};\n }\n\n if (isStructuredTime(time)) {\n const result: Partial<SchemaOrgRecipe> = {};\n if (time.prep !== undefined) {\n result.prepTime = formatDuration(time.prep);\n }\n if (time.active !== undefined) {\n result.cookTime = formatDuration(time.active);\n }\n if (time.total !== undefined) {\n result.totalTime = formatDuration(time.total);\n }\n return result;\n }\n\n const result: Partial<SchemaOrgRecipe> = {};\n if (time.prepTime) {\n result.prepTime = time.prepTime;\n }\n if (time.cookTime) {\n result.cookTime = time.cookTime;\n }\n return result;\n}\n\nexport function convertTimesModule(times?: TimesModule): Partial<SchemaOrgRecipe> {\n if (!times) {\n return {};\n }\n\n const result: Partial<SchemaOrgRecipe> = {};\n if (times.prepMinutes !== undefined) {\n result.prepTime = formatDuration(times.prepMinutes);\n }\n if (times.cookMinutes !== undefined) {\n result.cookTime = formatDuration(times.cookMinutes);\n }\n if (times.totalMinutes !== undefined) {\n result.totalTime = formatDuration(times.totalMinutes);\n }\n return result;\n}\n\nexport function convertYield(yld?: Recipe['yield']): string | undefined {\n if (!yld) {\n return undefined;\n }\n return formatYield(yld);\n}\n\nexport function convertAuthor(\n source?: Recipe['source']\n): Partial<SchemaOrgRecipe> {\n if (!source) {\n return {};\n }\n\n const result: Partial<SchemaOrgRecipe> = {};\n\n if (source.author) {\n result.author = {\n '@type': 'Person',\n name: source.author\n };\n }\n\n if (source.name) {\n result.publisher = {\n '@type': 'Organization',\n name: source.name\n };\n }\n\n if (source.url) {\n result.url = source.url;\n }\n\n return result;\n}\n\nexport function convertCategoryTags(\n category?: string,\n tags?: string[]\n): Partial<SchemaOrgRecipe> {\n const result: Partial<SchemaOrgRecipe> = {};\n\n if (category) {\n result.recipeCategory = category;\n }\n\n if (tags && tags.length > 0) {\n result.keywords = tags.filter(Boolean).join(', ');\n }\n\n return result;\n}\n\nexport function convertNutrition(\n nutrition?: Recipe['nutrition']\n): SchemaOrgRecipe['nutrition'] {\n if (!nutrition) {\n return undefined;\n }\n\n const result: SchemaOrgRecipe['nutrition'] = {\n '@type': 'NutritionInformation'\n };\n\n // Convert numeric calories to Schema.org string format\n if (nutrition.calories !== undefined) {\n if (typeof nutrition.calories === 'number') {\n result.calories = `${nutrition.calories} calories`;\n } else {\n result.calories = nutrition.calories;\n }\n }\n\n // Preserve other nutrition fields as-is (excluding @type which we override)\n Object.keys(nutrition).forEach(key => {\n if (key !== 'calories' && key !== '@type') {\n (result as any)[key] = (nutrition as any)[key];\n }\n });\n\n return result;\n}\n\nexport function cleanOutput<T extends Record<string, unknown>>(obj: T): T {\n return Object.fromEntries(\n Object.entries(obj).filter(([, value]) => value !== undefined)\n ) as T;\n}\n\n/**\n * Get schemaOrgMappable modules from the recipe's modules list.\n * Only modules that are marked as schemaOrgMappable in the registry are included.\n */\nfunction getSchemaOrgMappableModules(modules: string[] = []): string[] {\n const mappableModules = modulesRegistry.modules\n .filter((m) => m.schemaOrgMappable)\n .map((m) => `${m.id}@${m.latest}`);\n \n return modules.filter((moduleId) => mappableModules.includes(moduleId));\n}\n\n/**\n * Convert a Soustack recipe to Schema.org JSON-LD format.\n * \n * BREAKING CHANGE in v0.3.0: This function now targets the \"minimal\" profile\n * and only includes modules that are schemaOrgMappable (as defined in the\n * modules registry). Non-mappable modules (e.g., nutrition@1, schedule@1)\n * are excluded from the conversion.\n */\nexport function toSchemaOrg(recipe: Recipe): SchemaOrgRecipe {\n const base = convertBasicMetadata(recipe);\n const ingredients = convertIngredients(recipe.ingredients);\n const instructions = convertInstructions(recipe.instructions);\n \n // Only include nutrition if the nutrition module is schemaOrgMappable\n // (Currently nutrition@1 is NOT mappable, so this will be undefined)\n const recipeModules = Array.isArray(recipe.modules) ? recipe.modules : [];\n const mappableModules = getSchemaOrgMappableModules(recipeModules);\n const hasMappableNutrition = mappableModules.includes('nutrition@1');\n const nutrition = hasMappableNutrition ? convertNutrition(recipe.nutrition) : undefined;\n\n // Convert time if times module is mappable (times@1 is mappable)\n // Prefer recipe.times (TimesModule) over recipe.time (legacy Time)\n const hasMappableTimes = mappableModules.includes('times@1');\n const timeData = hasMappableTimes\n ? (recipe.times ? convertTimesModule(recipe.times) : convertTime(recipe.time))\n : {};\n\n // Convert attribution if attribution module is mappable (attribution@1 is mappable)\n const hasMappableAttribution = mappableModules.includes('attribution@1');\n const attributionData = hasMappableAttribution ? convertAuthor(recipe.source) : {};\n\n // Convert taxonomy if taxonomy module is mappable (taxonomy@1 is mappable)\n const hasMappableTaxonomy = mappableModules.includes('taxonomy@1');\n const taxonomyData = hasMappableTaxonomy\n ? convertCategoryTags(recipe.category, recipe.tags)\n : {};\n\n return cleanOutput({\n ...base,\n recipeIngredient: ingredients.length ? ingredients : undefined,\n recipeInstructions: instructions.length ? instructions : undefined,\n recipeYield: convertYield(recipe.yield),\n ...timeData,\n ...attributionData,\n ...taxonomyData,\n nutrition\n }) as SchemaOrgRecipe;\n}\n\nfunction isStructuredTime(time: Time): time is StructuredTime {\n return (\n typeof (time as StructuredTime).prep !== 'undefined' ||\n typeof (time as StructuredTime).active !== 'undefined' ||\n typeof (time as StructuredTime).passive !== 'undefined' ||\n typeof (time as StructuredTime).total !== 'undefined'\n );\n}\n","import type { SchemaOrgRecipe } from '../types';\n\nconst RECIPE_TYPES = new Set([\n 'recipe',\n 'https://schema.org/recipe',\n 'http://schema.org/recipe'\n]);\n\nexport function isRecipeNode(value: unknown): value is SchemaOrgRecipe {\n if (!value || typeof value !== 'object') {\n return false;\n }\n\n const type = (value as Record<string, unknown>)['@type'];\n // #region agent log\n fetch('http://127.0.0.1:7243/ingest/7225c3b5-9ac2-4c94-b561-807ca9003b66',{method:'POST',headers:{'Content-Type':'application/json'},body:JSON.stringify({location:'scraper/extractors/utils.ts:14',message:'isRecipeNode check',data:{type,typeLower:typeof type==='string'?type.toLowerCase():Array.isArray(type)?type.map(t=>typeof t==='string'?t.toLowerCase():t):undefined,isMatch:typeof type==='string'?RECIPE_TYPES.has(type.toLowerCase()):Array.isArray(type)?type.some(e=>typeof e==='string'&&RECIPE_TYPES.has(e.toLowerCase())):false},timestamp:Date.now(),sessionId:'debug-session',runId:'run1',hypothesisId:'A'})}).catch(()=>{});\n // #endregion\n\n if (typeof type === 'string') {\n return RECIPE_TYPES.has(type.toLowerCase());\n }\n\n if (Array.isArray(type)) {\n return type.some(\n entry => typeof entry === 'string' && RECIPE_TYPES.has(entry.toLowerCase())\n );\n }\n\n return false;\n}\n\nexport function safeJsonParse<T = unknown>(content: string): T | null {\n try {\n return JSON.parse(content) as T;\n } catch {\n return null;\n }\n}\n\nexport function normalizeText(value: string | undefined | null): string | undefined {\n if (!value) return undefined;\n const trimmed = value.replace(/\\s+/g, ' ').trim();\n return trimmed || undefined;\n}\n","import type { ExtractionResult, SchemaOrgRecipe } from '../types';\nimport { isRecipeNode, safeJsonParse, normalizeText } from './utils';\n\ntype JsonLdPayload = Record<string, unknown> | Array<Record<string, unknown>>;\n\nconst SIMPLE_PROPS = ['name', 'description', 'image', 'recipeYield', 'prepTime', 'cookTime', 'totalTime'] as const;\n\nexport function extractRecipeBrowser(html: string): ExtractionResult {\n // Extract JSON-LD\n const jsonLdRecipe = extractJsonLdBrowser(html);\n if (jsonLdRecipe) {\n return { recipe: jsonLdRecipe, source: 'jsonld' };\n }\n\n // Extract Microdata\n const microdataRecipe = extractMicrodataBrowser(html);\n if (microdataRecipe) {\n return { recipe: microdataRecipe, source: 'microdata' };\n }\n\n return { recipe: null, source: null };\n}\n\nfunction extractJsonLdBrowser(html: string): SchemaOrgRecipe | null {\n if (typeof (globalThis as any).DOMParser === 'undefined') {\n return null;\n }\n\n const parser = new (globalThis as any).DOMParser();\n const doc = parser.parseFromString(html, 'text/html');\n const scripts = doc.querySelectorAll('script[type=\"application/ld+json\"]');\n const candidates: SchemaOrgRecipe[] = [];\n\n scripts.forEach((script: Element) => {\n const content = script.textContent;\n if (!content) return;\n\n const parsed = safeJsonParse<JsonLdPayload>(content);\n if (!parsed) return;\n\n collectCandidates(parsed, candidates);\n });\n\n return candidates[0] ?? null;\n}\n\nfunction extractMicrodataBrowser(html: string): SchemaOrgRecipe | null {\n if (typeof (globalThis as any).DOMParser === 'undefined') {\n return null;\n }\n\n const parser = new (globalThis as any).DOMParser();\n const doc = parser.parseFromString(html, 'text/html');\n const recipeEl = doc.querySelector('[itemscope][itemtype*=\"schema.org/Recipe\"]');\n\n if (!recipeEl) {\n return null;\n }\n\n const recipe: SchemaOrgRecipe = {\n '@type': 'Recipe'\n };\n\n SIMPLE_PROPS.forEach(prop => {\n const value = findPropertyValue(recipeEl, prop);\n if (value) {\n recipe[prop] = value;\n }\n });\n\n const ingredients: string[] = [];\n recipeEl.querySelectorAll('[itemprop=\"recipeIngredient\"]').forEach((el: Element) => {\n const text = normalizeText(\n (el as any).getAttribute('content') || el.textContent || undefined\n );\n if (text) ingredients.push(text);\n });\n\n if (ingredients.length) {\n recipe.recipeIngredient = ingredients;\n }\n\n const instructions: string[] = [];\n recipeEl.querySelectorAll('[itemprop=\"recipeInstructions\"]').forEach((el: Element) => {\n const text =\n normalizeText((el as any).getAttribute('content')) ||\n normalizeText(el.querySelector('[itemprop=\"text\"]')?.textContent || undefined) ||\n normalizeText(el.textContent || undefined);\n if (text) instructions.push(text);\n });\n\n if (instructions.length) {\n recipe.recipeInstructions = instructions;\n }\n\n if (recipe.name || ingredients.length) {\n return recipe;\n }\n\n return null;\n}\n\nfunction findPropertyValue(context: Element, prop: string): string | undefined {\n const node = context.querySelector(`[itemprop=\"${prop}\"]`);\n if (!node) return undefined;\n\n return (\n normalizeText((node as any).getAttribute('content')) ||\n normalizeText((node as any).getAttribute('href')) ||\n normalizeText((node as any).getAttribute('src')) ||\n normalizeText(node.textContent || undefined)\n );\n}\n\nfunction collectCandidates(payload: unknown, bucket: SchemaOrgRecipe[]) {\n if (!payload) return;\n\n if (Array.isArray(payload)) {\n payload.forEach(entry => collectCandidates(entry, bucket));\n return;\n }\n\n if (typeof payload !== 'object') {\n return;\n }\n\n if (isRecipeNode(payload)) {\n bucket.push(payload);\n return;\n }\n\n const graph = (payload as Record<string, unknown>)['@graph'];\n if (Array.isArray(graph)) {\n graph.forEach(entry => collectCandidates(entry, bucket));\n }\n}\n\n","import { fromSchemaOrg } from '../fromSchemaOrg';\nimport type { Recipe } from '../types';\nimport type { SchemaOrgRecipe } from './types';\nimport { extractRecipeBrowser } from './extractors/browser';\n\nexport function extractSchemaOrgRecipeFromHTML(html: string): SchemaOrgRecipe | null {\n const { recipe } = extractRecipeBrowser(html);\n return recipe;\n}\n\nexport function extractRecipeFromHTML(html: string): Recipe {\n const recipe = extractSchemaOrgRecipeFromHTML(html);\n\n if (!recipe) {\n throw new Error('No Schema.org recipe data found in HTML');\n }\n\n const soustackRecipe = fromSchemaOrg(recipe);\n\n if (!soustackRecipe) {\n throw new Error('Schema.org data did not include a valid recipe');\n }\n\n return soustackRecipe;\n}\n","export const SOUSTACK_SPEC_VERSION = '0.3.0';\n","export type UnitDimension = 'mass' | 'volume' | 'count';\n\nexport type MassUnit = 'g' | 'kg' | 'oz' | 'lb';\nexport type VolumeUnit =\n | 'ml'\n | 'l'\n | 'tsp'\n | 'tbsp'\n | 'fl_oz'\n | 'cup'\n | 'pint'\n | 'quart'\n | 'gallon';\nexport type CountUnit = 'clove' | 'sprig' | 'leaf' | 'pinch' | 'bottle' | 'count';\n\nexport type Unit = MassUnit | VolumeUnit | CountUnit;\n\nexport type MetricMassUnit = 'g' | 'kg';\nexport type MetricVolumeUnit = 'ml' | 'l';\nexport type MetricCountUnit = 'count';\nexport type MetricUnit = MetricMassUnit | MetricVolumeUnit | MetricCountUnit;\n\nexport interface UnitDefinition {\n dimension: UnitDimension;\n /**\n * Multiplier that converts from the unit into metric base units (g or ml).\n */\n toMetricBase: number;\n metricBaseUnit: MetricUnit;\n isMetric: boolean;\n}\n\nconst MASS_UNITS: Record<MassUnit, UnitDefinition> = {\n g: {\n dimension: 'mass',\n toMetricBase: 1,\n metricBaseUnit: 'g',\n isMetric: true\n },\n kg: {\n dimension: 'mass',\n toMetricBase: 1000,\n metricBaseUnit: 'g',\n isMetric: true\n },\n oz: {\n dimension: 'mass',\n toMetricBase: 28.349523125,\n metricBaseUnit: 'g',\n isMetric: false\n },\n lb: {\n dimension: 'mass',\n toMetricBase: 453.59237,\n metricBaseUnit: 'g',\n isMetric: false\n }\n};\n\nconst VOLUME_UNITS: Record<VolumeUnit, UnitDefinition> = {\n ml: {\n dimension: 'volume',\n toMetricBase: 1,\n metricBaseUnit: 'ml',\n isMetric: true\n },\n l: {\n dimension: 'volume',\n toMetricBase: 1000,\n metricBaseUnit: 'ml',\n isMetric: true\n },\n tsp: {\n dimension: 'volume',\n toMetricBase: 4.92892159375,\n metricBaseUnit: 'ml',\n isMetric: false\n },\n tbsp: {\n dimension: 'volume',\n toMetricBase: 14.78676478125,\n metricBaseUnit: 'ml',\n isMetric: false\n },\n fl_oz: {\n dimension: 'volume',\n toMetricBase: 29.5735295625,\n metricBaseUnit: 'ml',\n isMetric: false\n },\n cup: {\n dimension: 'volume',\n toMetricBase: 236.5882365,\n metricBaseUnit: 'ml',\n isMetric: false\n },\n pint: {\n dimension: 'volume',\n toMetricBase: 473.176473,\n metricBaseUnit: 'ml',\n isMetric: false\n },\n quart: {\n dimension: 'volume',\n toMetricBase: 946.352946,\n metricBaseUnit: 'ml',\n isMetric: false\n },\n gallon: {\n dimension: 'volume',\n toMetricBase: 3785.411784,\n metricBaseUnit: 'ml',\n isMetric: false\n }\n};\n\nconst COUNT_UNITS: Record<CountUnit, UnitDefinition> = {\n clove: {\n dimension: 'count',\n toMetricBase: 1,\n metricBaseUnit: 'count',\n isMetric: true\n },\n sprig: {\n dimension: 'count',\n toMetricBase: 1,\n metricBaseUnit: 'count',\n isMetric: true\n },\n leaf: {\n dimension: 'count',\n toMetricBase: 1,\n metricBaseUnit: 'count',\n isMetric: true\n },\n pinch: {\n dimension: 'count',\n toMetricBase: 1,\n metricBaseUnit: 'count',\n isMetric: true\n },\n bottle: {\n dimension: 'count',\n toMetricBase: 1,\n metricBaseUnit: 'count',\n isMetric: true\n },\n count: {\n dimension: 'count',\n toMetricBase: 1,\n metricBaseUnit: 'count',\n isMetric: true\n }\n};\n\nexport const UNIT_DEFINITIONS: Record<Unit, UnitDefinition> = {\n ...MASS_UNITS,\n ...VOLUME_UNITS,\n ...COUNT_UNITS\n};\n\nexport type NormalizedUnit = keyof typeof UNIT_DEFINITIONS;\n\nexport function normalizeUnitToken(\n unit?: string | null\n): NormalizedUnit | null {\n if (!unit) {\n return null;\n }\n\n const token = unit.trim().toLowerCase().replace(/[\\s-]+/g, '_');\n const canonical = UNIT_SYNONYMS[token] ?? token;\n\n return (canonical as NormalizedUnit) in UNIT_DEFINITIONS\n ? (canonical as NormalizedUnit)\n : null;\n}\n\nconst UNIT_SYNONYMS: Partial<Record<string, NormalizedUnit>> = {\n teaspoons: 'tsp',\n teaspoon: 'tsp',\n tsps: 'tsp',\n tbsp: 'tbsp',\n tbsps: 'tbsp',\n tablespoon: 'tbsp',\n tablespoons: 'tbsp',\n cup: 'cup',\n cups: 'cup',\n pint: 'pint',\n pints: 'pint',\n quart: 'quart',\n quarts: 'quart',\n gallon: 'gallon',\n gallons: 'gallon',\n ml: 'ml',\n milliliter: 'ml',\n milliliters: 'ml',\n millilitre: 'ml',\n millilitres: 'ml',\n l: 'l',\n liter: 'l',\n liters: 'l',\n litre: 'l',\n litres: 'l',\n fl_oz: 'fl_oz',\n 'fl.oz': 'fl_oz',\n 'fl.oz.': 'fl_oz',\n 'fl_oz.': 'fl_oz',\n 'fl oz': 'fl_oz',\n 'fl oz.': 'fl_oz',\n fluid_ounce: 'fl_oz',\n fluid_ounces: 'fl_oz',\n oz: 'oz',\n ounce: 'oz',\n ounces: 'oz',\n lb: 'lb',\n lbs: 'lb',\n pound: 'lb',\n pounds: 'lb',\n g: 'g',\n gram: 'g',\n grams: 'g',\n kg: 'kg',\n kilogram: 'kg',\n kilograms: 'kg',\n clove: 'clove',\n cloves: 'clove',\n sprig: 'sprig',\n sprigs: 'sprig',\n leaf: 'leaf',\n leaves: 'leaf',\n pinch: 'pinch',\n pinches: 'pinch',\n bottle: 'bottle',\n bottles: 'bottle',\n count: 'count',\n counts: 'count'\n};\n\nexport function convertToMetricBase(\n quantity: number,\n unit: Unit\n): {\n quantity: number;\n baseUnit: MetricUnit;\n definition: UnitDefinition;\n} {\n const definition = UNIT_DEFINITIONS[unit];\n const quantityInMetricBase = quantity * definition.toMetricBase;\n return {\n quantity: quantityInMetricBase,\n baseUnit: definition.metricBaseUnit,\n definition\n };\n}\n","import {\n MetricMassUnit,\n MetricVolumeUnit,\n NormalizedUnit,\n convertToMetricBase,\n normalizeUnitToken,\n UNIT_DEFINITIONS\n} from './units';\n\nexport type ConvertTarget = 'metric';\nexport type ConvertMode = 'volume' | 'mass';\nexport type RoundMode = 'none' | 'sane';\n\nexport interface LineItem {\n ingredient: string;\n quantity: number;\n unit: string | null;\n}\n\nexport interface ConvertedLineItem extends LineItem {\n notes?: string;\n}\n\nexport class UnknownUnitError extends Error {\n constructor(public readonly unit: string) {\n super(`Unknown unit \"${unit}\".`);\n this.name = 'UnknownUnitError';\n }\n}\n\nexport class UnsupportedConversionError extends Error {\n constructor(\n public readonly unit: string,\n public readonly mode: ConvertMode\n ) {\n super(`Cannot convert unit \"${unit}\" in ${mode} mode.`);\n this.name = 'UnsupportedConversionError';\n }\n}\n\nexport class MissingEquivalencyError extends Error {\n constructor(\n public readonly ingredient: string,\n public readonly unit: string\n ) {\n super(\n `No volume to mass equivalency for \"${ingredient}\" (${unit}).`\n );\n this.name = 'MissingEquivalencyError';\n }\n}\n\ntype EquivalencyMap = Record<\n string,\n Partial<Record<NormalizedUnit, number>>\n>;\n\nconst VOLUME_TO_MASS_EQUIV_G_PER_UNIT: EquivalencyMap = {\n flour: {\n cup: 120\n }\n};\n\nconst DEFAULT_ROUND_MODE: RoundMode = 'sane';\n\nexport function convertLineItemToMetric(\n item: LineItem,\n mode: ConvertMode,\n opts?: { round?: RoundMode }\n): ConvertedLineItem {\n const roundMode = opts?.round ?? DEFAULT_ROUND_MODE;\n const normalizedUnit = normalizeUnitToken(item.unit);\n\n if (!normalizedUnit) {\n if (!item.unit || item.unit.trim() === '') {\n return item;\n }\n\n throw new UnknownUnitError(item.unit);\n }\n\n const definition = UNIT_DEFINITIONS[normalizedUnit];\n\n if (definition.dimension === 'count') {\n return item;\n }\n\n if (mode === 'volume') {\n if (definition.dimension !== 'volume') {\n throw new UnsupportedConversionError(item.unit ?? '', mode);\n }\n\n const { quantity, unit } = finalizeMetricVolume(\n convertToMetricBase(item.quantity, normalizedUnit).quantity,\n roundMode\n );\n\n return {\n ...item,\n quantity,\n unit\n };\n }\n\n // mode === 'mass'\n if (definition.dimension === 'mass') {\n const { quantity, unit } = finalizeMetricMass(\n convertToMetricBase(item.quantity, normalizedUnit).quantity,\n roundMode\n );\n\n return {\n ...item,\n quantity,\n unit\n };\n }\n\n if (definition.dimension !== 'volume') {\n throw new UnsupportedConversionError(item.unit ?? '', mode);\n }\n\n const gramsPerUnit = lookupEquivalency(\n item.ingredient,\n normalizedUnit\n );\n\n if (!gramsPerUnit) {\n throw new MissingEquivalencyError(item.ingredient, item.unit ?? '');\n }\n\n const grams = item.quantity * gramsPerUnit;\n const massResult = finalizeMetricMass(grams, roundMode);\n\n return {\n ...item,\n quantity: massResult.quantity,\n unit: massResult.unit,\n notes: `Converted using ${gramsPerUnit}g per ${normalizedUnit} for ${item.ingredient}.`\n };\n}\n\nfunction finalizeMetricVolume(\n milliliters: number,\n roundMode: RoundMode\n): { quantity: number; unit: MetricVolumeUnit } {\n if (roundMode === 'none') {\n return milliliters >= 1000\n ? { quantity: milliliters / 1000, unit: 'l' }\n : { quantity: milliliters, unit: 'ml' };\n }\n\n const roundedMl = roundMilliliters(milliliters);\n\n if (roundedMl >= 1000) {\n const liters = roundedMl / 1000;\n return {\n quantity: roundLargeMetric(liters),\n unit: 'l'\n };\n }\n\n return { quantity: roundedMl, unit: 'ml' };\n}\n\nfunction finalizeMetricMass(\n grams: number,\n roundMode: RoundMode\n): { quantity: number; unit: MetricMassUnit } {\n if (roundMode === 'none') {\n return grams >= 1000\n ? { quantity: grams / 1000, unit: 'kg' }\n : { quantity: grams, unit: 'g' };\n }\n\n const roundedGrams = roundGrams(grams);\n\n if (roundedGrams >= 1000) {\n const kilograms = roundedGrams / 1000;\n return {\n quantity: roundLargeMetric(kilograms),\n unit: 'kg'\n };\n }\n\n return { quantity: roundedGrams, unit: 'g' };\n}\n\nfunction roundGrams(value: number): number {\n if (value < 1000) {\n return Math.round(value);\n }\n\n return Math.round(value / 5) * 5;\n}\n\nfunction roundMilliliters(value: number): number {\n if (value < 1000) {\n return Math.round(value);\n }\n\n return Math.round(value / 10) * 10;\n}\n\nfunction roundLargeMetric(value: number): number {\n return Math.round(value * 100) / 100;\n}\n\nfunction lookupEquivalency(\n ingredient: string,\n unit: NormalizedUnit\n): number | undefined {\n const key = ingredient.trim().toLowerCase();\n return VOLUME_TO_MASS_EQUIV_G_PER_UNIT[key]?.[unit];\n}\n","export interface Quantity {\n amount: number;\n unit?: string | null;\n}\n\nexport interface Ingredient {\n id?: string;\n item: string;\n quantity?: Quantity;\n name?: string;\n prep?: string;\n prepAction?: string;\n prepActions?: string[];\n form?: string;\n prepTime?: number;\n optional?: boolean;\n notes?: string;\n}\n\nexport interface MiseEnPlaceTask {\n category: 'prep' | 'state' | 'measure' | 'other';\n action?: string;\n form?: string;\n items: Array<{\n ingredient: string;\n quantity?: Quantity;\n optional?: boolean;\n notes?: string;\n }>;\n}\n\nexport interface MiseEnPlacePlan {\n tasks: MiseEnPlaceTask[];\n ungrouped: Ingredient[];\n}\n\nexport function miseEnPlace(ingredients: Ingredient[]): MiseEnPlacePlan {\n const list = Array.isArray(ingredients) ? ingredients : [];\n\n const prepGroups = new Map<string, MiseEnPlaceTask>();\n const stateGroups = new Map<string, MiseEnPlaceTask>();\n let measureTask: MiseEnPlaceTask | undefined;\n let otherTask: MiseEnPlaceTask | undefined;\n const ungrouped: Ingredient[] = [];\n\n for (const ingredient of list) {\n if (!ingredient || typeof ingredient !== 'object') continue;\n\n const label = deriveIngredientLabel(ingredient);\n const quantity = normalizeQuantity(ingredient.quantity);\n const baseNotes = toDisplayString(ingredient.notes);\n const prepNotes = toDisplayString(ingredient.prep);\n const isOptional = typeof ingredient.optional === 'boolean' ? ingredient.optional : undefined;\n\n const buildItem = (extraNotes?: string) => {\n const item: MiseEnPlaceTask['items'][number] = {\n ingredient: label\n };\n\n if (quantity) {\n item.quantity = { ...quantity };\n }\n\n if (typeof isOptional === 'boolean') {\n item.optional = isOptional;\n }\n\n const notes = combineNotes(extraNotes, baseNotes);\n if (notes) {\n item.notes = notes;\n }\n\n return item;\n };\n\n let addedToTask = false;\n let hasPrepGrouping = false;\n\n const prepActionKeys = extractNormalizedList(ingredient.prepActions);\n if (prepActionKeys.length > 0) {\n hasPrepGrouping = true;\n for (const actionKey of prepActionKeys) {\n const task = ensureGroup(prepGroups, actionKey, () => ({\n category: 'prep',\n action: actionKey,\n items: []\n }));\n task.items.push(buildItem());\n addedToTask = true;\n }\n } else {\n const singleActionKey = normalizeKey(ingredient.prepAction);\n if (singleActionKey) {\n hasPrepGrouping = true;\n const task = ensureGroup(prepGroups, singleActionKey, () => ({\n category: 'prep',\n action: singleActionKey,\n items: []\n }));\n task.items.push(buildItem());\n addedToTask = true;\n } else if (prepNotes) {\n otherTask = otherTask ?? { category: 'other', items: [] };\n otherTask.items.push(buildItem(prepNotes));\n addedToTask = true;\n }\n }\n\n const formKey = normalizeKey(ingredient.form);\n const hasStateGrouping = Boolean(formKey);\n if (formKey) {\n const task = ensureGroup(stateGroups, formKey, () => ({\n category: 'state',\n form: formKey,\n items: []\n }));\n task.items.push(buildItem());\n addedToTask = true;\n }\n\n const shouldMeasure = Boolean(quantity) && !hasPrepGrouping && !hasStateGrouping;\n if (shouldMeasure) {\n measureTask = measureTask ?? { category: 'measure', items: [] };\n measureTask.items.push(buildItem());\n addedToTask = true;\n }\n\n if (!addedToTask) {\n ungrouped.push(ingredient);\n }\n }\n\n const tasks: MiseEnPlaceTask[] = [\n ...Array.from(prepGroups.values()).sort((a, b) => localeCompare(a.action, b.action)),\n ...Array.from(stateGroups.values()).sort((a, b) => localeCompare(a.form, b.form))\n ];\n\n if (measureTask) {\n tasks.push(measureTask);\n }\n\n if (otherTask) {\n tasks.push(otherTask);\n }\n\n return { tasks, ungrouped };\n}\n\nfunction deriveIngredientLabel(ingredient: Ingredient): string {\n return (\n toDisplayString(ingredient.name) ??\n toDisplayString(ingredient.item) ??\n toDisplayString(ingredient.id) ??\n 'ingredient'\n );\n}\n\nfunction extractNormalizedList(values?: string[]): string[] {\n if (!Array.isArray(values)) {\n return [];\n }\n const seen = new Set<string>();\n const result: string[] = [];\n for (const value of values) {\n const key = normalizeKey(value);\n if (key && !seen.has(key)) {\n seen.add(key);\n result.push(key);\n }\n }\n return result;\n}\n\nfunction normalizeKey(value?: string | null): string | null {\n if (typeof value !== 'string') {\n return null;\n }\n const trimmed = value.trim().toLowerCase();\n return trimmed || null;\n}\n\nfunction toDisplayString(value?: string | null): string | undefined {\n if (typeof value !== 'string') {\n return undefined;\n }\n const trimmed = value.trim();\n return trimmed || undefined;\n}\n\nfunction combineNotes(...notes: Array<string | undefined>): string | undefined {\n const cleaned = notes.map((note) => toDisplayString(note ?? undefined)).filter(Boolean) as string[];\n if (cleaned.length === 0) {\n return undefined;\n }\n return cleaned.join(' | ');\n}\n\nfunction normalizeQuantity(quantity?: Quantity | null): Quantity | undefined {\n if (!quantity || typeof quantity !== 'object') {\n return undefined;\n }\n const amount = (quantity as Quantity).amount;\n if (typeof amount !== 'number' || Number.isNaN(amount)) {\n return undefined;\n }\n const normalized: Quantity = { amount };\n if ('unit' in quantity) {\n const unit = (quantity as Quantity).unit;\n if (typeof unit === 'string') {\n const trimmed = unit.trim();\n if (trimmed) {\n normalized.unit = trimmed;\n }\n } else if (unit === null) {\n normalized.unit = null;\n }\n }\n return normalized;\n}\n\nfunction ensureGroup(\n map: Map<string, MiseEnPlaceTask>,\n key: string,\n factory: () => MiseEnPlaceTask\n): MiseEnPlaceTask {\n let task = map.get(key);\n if (!task) {\n task = factory();\n map.set(key, task);\n }\n return task;\n}\n\nfunction localeCompare(left?: string, right?: string): number {\n return (left ?? '').localeCompare(right ?? '');\n}\n"]}
|