magpie-html 0.1.5 → 0.2.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/content/quality.ts","../src/content/readability.ts","../src/content/extract.ts","../src/content/html-to-text/extract.ts","../src/utils/normalize-url.ts","../src/feed/atom/clean-text.ts","../src/feed/atom/parse-date.ts","../src/feed/atom/extract-entry.ts","../src/feed/atom/xml-parser.ts","../src/feed/atom/extract-feed.ts","../src/feed/atom/parse.ts","../src/feed/detect.ts","../src/feed/json-feed/validate.ts","../src/feed/json-feed/parse.ts","../src/feed/normalize.ts","../src/feed/rss/clean-text.ts","../src/feed/rss/parse-date.ts","../src/feed/rss/xml-parser.ts","../src/feed/rss/extract-channel.ts","../src/feed/rss/extract-item.ts","../src/feed/rss/extract-namespaces.ts","../src/feed/rss/parse.ts","../src/feed/parse.ts","../src/pluck/types.ts","../src/pluck/encoding.ts","../src/pluck/pluck.ts","../src/utils/html-parser.ts","../src/utils/meta-helpers.ts","../src/metadata/opengraph/extract.ts","../src/metadata/schema-org/parse-json-ld.ts","../src/metadata/schema-org/extract.ts","../src/metadata/seo/extract.ts","../src/metadata/twitter-card/extract.ts","../src/gather/website/description.ts","../src/utils/link-helpers.ts","../src/metadata/icons/extract.ts","../src/gather/website/image.ts","../src/metadata/language/extract.ts","../src/gather/website/language.ts","../src/metadata/links/extract.ts","../src/gather/website/links.ts","../src/utils/clean-title.ts","../src/gather/website/title.ts","../src/metadata/canonical/extract.ts","../src/gather/website/url.ts","../src/gather/article/index.ts","../src/gather/feed.ts","../src/metadata/feed-discovery/heuristics.ts","../src/metadata/feed-discovery/extract.ts","../src/gather/website/icon.ts","../src/gather/website/index.ts","../src/metadata/analytics/extract.ts","../src/metadata/assets/extract.ts","../src/metadata/copyright/extract.ts","../src/metadata/dublin-core/extract.ts","../src/metadata/geo/extract.ts","../src/metadata/monetization/extract.ts","../src/metadata/news/extract.ts","../src/metadata/pagination/extract.ts","../src/metadata/robots/parse-directives.ts","../src/metadata/robots/extract.ts","../src/metadata/security/extract.ts","../src/metadata/sitemap-discovery/heuristics.ts","../src/metadata/sitemap-discovery/extract.ts","../src/metadata/social-profiles/extract.ts","../src/metadata/verification/extract.ts","../src/swoop/errors.ts","../src/swoop/console.ts","../src/swoop/env/async.ts","../src/swoop/env/base.ts","../src/swoop/env/browser.ts","../src/swoop/env/cookie.ts","../src/swoop/env/fetch.ts","../src/swoop/env/navigation.ts","../src/swoop/env/permissive.ts","../src/swoop/env/xhr.ts","../src/swoop/lifecycle.ts","../src/swoop/probes.ts","../src/swoop/scripts/loader.ts","../src/swoop/utils.ts","../src/swoop/vm/bootstrap.ts","../src/swoop/vm/modules.ts","../src/swoop/wait.ts","../src/swoop/engines/vm.ts","../src/swoop/scripts/discover.ts","../src/swoop/swoop.ts"],"names":["Readability","countWords","decodeEntities","extractContent","extractAtomDate","extractPerson","extractPersons","extractLink","extractLinks","extractCategory","extractCategories","extractTextContent","normalizeFeedUrls","stripCDATA","normalizeWhitespace","cleanText","parseElement","extractCDATA","restoreCDATA","parseAttributes","findClosingTag","querySelector","querySelectorAll","normalizeItemUrls","validate","normalizeOptions","linkedomParseHTML","getStringProperty","parseSizeString","getEffectiveBaseUrl","extractImages","nodeSetTimeout","nodeClearTimeout","nodeSetInterval","nodeClearInterval","nodeSetImmediate","nodeClearImmediate","init","vm","code"],"mappings":";;;;;;;;;;;;AAiBO,SAAS,WAAW,IAAA,EAAsB;AAE/C,EAAA,MAAM,KAAA,GAAQ,KAAK,IAAA,EAAK,CAAE,MAAM,KAAK,CAAA,CAAE,OAAO,OAAO,CAAA;AACrD,EAAA,OAAO,KAAA,CAAM,MAAA;AACf;AAWO,SAAS,qBAAqB,SAAA,EAA2B;AAC9D,EAAA,MAAM,cAAA,GAAiB,GAAA;AACvB,EAAA,MAAM,UAAU,SAAA,GAAY,cAAA;AAC5B,EAAA,OAAO,KAAK,GAAA,CAAI,CAAA,EAAG,IAAA,CAAK,KAAA,CAAM,OAAO,CAAC,CAAA;AACxC;AAQA,SAAS,gBAAgB,IAAA,EAAsB;AAC7C,EAAA,MAAM,OAAA,GAAU,IAAA,CAAK,KAAA,CAAM,YAAY,CAAA;AACvC,EAAA,OAAO,OAAA,GAAU,QAAQ,MAAA,GAAS,CAAA;AACpC;AAQA,SAAS,YAAY,IAAA,EAAsB;AACzC,EAAA,MAAM,OAAA,GAAU,IAAA,CAAK,KAAA,CAAM,cAAc,CAAA;AACzC,EAAA,OAAO,OAAA,GAAU,QAAQ,MAAA,GAAS,CAAA;AACpC;AAQA,SAAS,WAAW,IAAA,EAAsB;AACxC,EAAA,MAAM,OAAA,GAAU,IAAA,CAAK,KAAA,CAAM,YAAY,CAAA;AACvC,EAAA,OAAO,OAAA,GAAU,QAAQ,MAAA,GAAS,CAAA;AACpC;AAYA,SAAS,oBAAA,CAAqB,MAAc,WAAA,EAA6B;AAEvE,EAAA,MAAM,WAAA,GAAc,IAAA,CAAK,KAAA,CAAM,sBAAsB,CAAA;AACrD,EAAA,IAAI,CAAC,WAAA,EAAa;AAChB,IAAA,OAAO,CAAA;AAAA,EACT;AAEA,EAAA,MAAM,QAAA,GAAW,WAAA,CAAY,GAAA,CAAI,CAAC,KAAA,KAAU,KAAA,CAAM,OAAA,CAAQ,UAAA,EAAY,EAAE,CAAC,CAAA,CAAE,IAAA,CAAK,GAAG,CAAA;AAEnF,EAAA,MAAM,aAAa,QAAA,CAAS,MAAA;AAC5B,EAAA,MAAM,cAAc,WAAA,CAAY,MAAA;AAEhC,EAAA,IAAI,gBAAgB,CAAA,EAAG;AACrB,IAAA,OAAO,CAAA;AAAA,EACT;AAEA,EAAA,OAAO,IAAA,CAAK,GAAA,CAAI,CAAA,EAAG,UAAA,GAAa,WAAW,CAAA;AAC7C;AAQA,SAAS,6BAA6B,IAAA,EAAsB;AAE1D,EAAA,MAAM,SAAA,GAAY,IAAA,CAAK,KAAA,CAAM,QAAQ,CAAA,CAAE,MAAA,CAAO,CAAC,CAAA,KAAM,CAAA,CAAE,IAAA,EAAK,CAAE,MAAA,GAAS,CAAC,CAAA;AAExE,EAAA,IAAI,SAAA,CAAU,WAAW,CAAA,EAAG;AAC1B,IAAA,OAAO,CAAA;AAAA,EACT;AAEA,EAAA,MAAM,UAAA,GAAa,WAAW,IAAI,CAAA;AAClC,EAAA,OAAO,IAAA,CAAK,KAAA,CAAM,UAAA,GAAa,SAAA,CAAU,MAAM,CAAA;AACjD;AAeA,SAAS,sBAAsB,OAAA,EAAuD;AACpF,EAAA,IAAI,KAAA,GAAQ,CAAA;AAIZ,EAAA,IAAI,OAAA,CAAQ,SAAA,IAAa,GAAA,IAAQ,OAAA,CAAQ,aAAa,GAAA,EAAM;AAC1D,IAAA,KAAA,IAAS,EAAA;AAAA,EACX,WAAW,OAAA,CAAQ,SAAA,IAAa,GAAA,IAAO,OAAA,CAAQ,YAAY,GAAA,EAAM;AAC/D,IAAA,KAAA,IAAS,EAAA;AAAA,EACX,CAAA,MAAA,IAAW,OAAA,CAAQ,SAAA,GAAY,GAAA,EAAK;AAClC,IAAA,KAAA,IAAS,EAAA;AAAA,EACX,CAAA,MAAO;AACL,IAAA,KAAA,IAAS,EAAA;AAAA,EACX;AAIA,EAAA,IAAI,OAAA,CAAQ,cAAc,GAAA,EAAK;AAC7B,IAAA,KAAA,IAAS,EAAA;AAAA,EACX,CAAA,MAAA,IAAW,OAAA,CAAQ,WAAA,GAAc,GAAA,EAAK;AACpC,IAAA,KAAA,IAAS,EAAA;AAAA,EACX,CAAA,MAAA,IAAW,OAAA,CAAQ,WAAA,GAAc,GAAA,EAAK;AACpC,IAAA,KAAA,IAAS,CAAA;AAAA,EACX;AAGA,EAAA,IAAI,OAAA,CAAQ,kBAAkB,EAAA,EAAI;AAChC,IAAA,KAAA,IAAS,EAAA;AAAA,EACX,CAAA,MAAA,IAAW,OAAA,CAAQ,cAAA,IAAkB,CAAA,EAAG;AACtC,IAAA,KAAA,IAAS,EAAA;AAAA,EACX,CAAA,MAAA,IAAW,OAAA,CAAQ,cAAA,IAAkB,CAAA,EAAG;AACtC,IAAA,KAAA,IAAS,EAAA;AAAA,EACX;AAIA,EAAA,IAAI,OAAA,CAAQ,UAAA,IAAc,CAAA,IAAK,OAAA,CAAQ,cAAc,EAAA,EAAI;AACvD,IAAA,KAAA,IAAS,EAAA;AAAA,EACX,CAAA,MAAA,IAAW,OAAA,CAAQ,UAAA,KAAe,CAAA,EAAG;AACnC,IAAA,KAAA,IAAS,EAAA;AAAA,EACX,CAAA,MAAO;AACL,IAAA,KAAA,IAAS,CAAA;AAAA,EACX;AAIA,EAAA,IAAI,OAAA,CAAQ,mBAAA,IAAuB,EAAA,IAAM,OAAA,CAAQ,uBAAuB,EAAA,EAAI;AAC1E,IAAA,KAAA,IAAS,EAAA;AAAA,EACX,WAAW,OAAA,CAAQ,mBAAA,IAAuB,EAAA,IAAM,OAAA,CAAQ,uBAAuB,EAAA,EAAI;AACjF,IAAA,KAAA,IAAS,CAAA;AAAA,EACX;AAEA,EAAA,OAAO,IAAA,CAAK,GAAA,CAAI,GAAA,EAAK,KAAK,CAAA;AAC5B;AAqBO,SAAS,qBAAqB,OAAA,EAA2C;AAC9E,EAAA,MAAM,SAAA,GAAY,UAAA,CAAW,OAAA,CAAQ,WAAW,CAAA;AAChD,EAAA,MAAM,SAAA,GAAY,QAAQ,WAAA,CAAY,MAAA;AACtC,EAAA,MAAM,WAAA,GAAc,qBAAqB,SAAS,CAAA;AAClD,EAAA,MAAM,mBAAA,GAAsB,4BAAA,CAA6B,OAAA,CAAQ,WAAW,CAAA;AAC5E,EAAA,MAAM,cAAA,GAAiB,eAAA,CAAgB,OAAA,CAAQ,OAAO,CAAA;AACtD,EAAA,MAAM,UAAA,GAAa,WAAA,CAAY,OAAA,CAAQ,OAAO,CAAA;AAC9C,EAAA,MAAM,SAAA,GAAY,UAAA,CAAW,OAAA,CAAQ,OAAO,CAAA;AAC5C,EAAA,MAAM,WAAA,GAAc,oBAAA,CAAqB,OAAA,CAAQ,OAAA,EAAS,QAAQ,WAAW,CAAA;AAE7E,EAAA,MAAM,OAAA,GAAU;AAAA,IACd,SAAA;AAAA,IACA,SAAA;AAAA,IACA,WAAA;AAAA,IACA,mBAAA;AAAA,IACA,cAAA;AAAA,IACA,UAAA;AAAA,IACA,SAAA;AAAA,IACA;AAAA,GACF;AAEA,EAAA,MAAM,YAAA,GAAe,sBAAsB,OAAO,CAAA;AAElD,EAAA,OAAO;AAAA,IACL,GAAG,OAAA;AAAA,IACH;AAAA,GACF;AACF;ACvLO,SAAS,oBAAA,CACd,KACA,OAAA,EAIS;AACT,EAAA,IAAI;AAEF,IAAA,MAAM,aAAA,GAAgB,CAAC,CAAC,GAAA,CAAI,cAAc,SAAS,CAAA;AACnD,IAAA,MAAM,UAAA,GAAa,CAAC,CAAC,GAAA,CAAI,cAAc,MAAM,CAAA;AAC7C,IAAA,MAAM,cAAA,GAAiB,GAAA,CAAI,gBAAA,CAAiB,oCAAoC,EAAE,MAAA,GAAS,CAAA;AAC3F,IAAA,MAAM,aAAA,GAAgB,GAAA,CAAI,gBAAA,CAAiB,GAAG,EAAE,MAAA,IAAU,CAAA;AAG1D,IAAA,MAAM,WAAA,GAAc,IAAI,WAAA,IAAe,EAAA;AACvC,IAAA,MAAM,aAAA,GAAgB,WAAA,CAAY,IAAA,EAAK,CAAE,MAAA;AACzC,IAAA,MAAM,SAAA,GAAY,SAAS,gBAAA,IAAoB,GAAA;AAE/C,IAAA,OACE,aAAA,IAAiB,SAAA,KAAc,aAAA,IAAiB,UAAA,IAAc,cAAA,IAAkB,aAAA,CAAA;AAAA,EAEpF,CAAA,CAAA,MAAQ;AACN,IAAA,OAAO,KAAA;AAAA,EACT;AACF;AA4BO,SAAS,sBAAA,CACd,GAAA,EACA,OAAA,GAAoC,EAAC,EACX;AAE1B,EAAA,MAAM,aAAA,GAAgB,GAAA,CAAI,SAAA,CAAU,IAAI,CAAA;AAGxC,EAAA,MAAM,MAAA,GAAS,IAAIA,uBAAA,CAAY,aAAA,EAAe;AAAA,IAC5C,KAAA,EAAO,QAAQ,KAAA,IAAS,KAAA;AAAA,IACxB,aAAA,EAAe,QAAQ,aAAA,IAAiB,GAAA;AAAA,IACxC,eAAA,EAAiB,QAAQ,eAAA,IAAmB,CAAA;AAAA,IAC5C,WAAA,EAAa,QAAQ,WAAA,IAAe,KAAA;AAAA,IACpC,iBAAA,EAAmB,OAAA,CAAQ,iBAAA,IAAqB,EAAC;AAAA,IACjD,aAAA,EAAe,QAAQ,aAAA,IAAiB;AAAA,GACzC,CAAA;AAGD,EAAA,MAAM,OAAA,GAAU,OAAO,KAAA,EAAM;AAE7B,EAAA,IAAI,CAAC,OAAA,EAAS;AACZ,IAAA,OAAO,IAAA;AAAA,EACT;AAEA,EAAA,OAAO;AAAA,IACL,KAAA,EAAO,QAAQ,KAAA,IAAS,EAAA;AAAA,IACxB,OAAA,EAAS,QAAQ,OAAA,IAAW,EAAA;AAAA,IAC5B,WAAA,EAAa,QAAQ,WAAA,IAAe,EAAA;AAAA,IACpC,OAAA,EAAS,QAAQ,OAAA,IAAW,EAAA;AAAA,IAC5B,MAAA,EAAQ,QAAQ,MAAA,IAAU,IAAA;AAAA,IAC1B,QAAA,EAAU,QAAQ,QAAA,IAAY,IAAA;AAAA,IAC9B,IAAA,EAAM,QAAQ,IAAA,IAAQ,IAAA;AAAA,IACtB,GAAA,EAAK,QAAQ,GAAA,IAAO,IAAA;AAAA,IACpB,aAAA,EAAe,QAAQ,aAAA,IAAiB,IAAA;AAAA,IACxC,MAAA,EAAQ,QAAQ,MAAA,IAAU;AAAA,GAC5B;AACF;;;AChHA,SAASC,YAAW,IAAA,EAAsB;AACxC,EAAA,MAAM,KAAA,GAAQ,KAAK,IAAA,EAAK,CAAE,MAAM,KAAK,CAAA,CAAE,OAAO,OAAO,CAAA;AACrD,EAAA,OAAO,KAAA,CAAM,MAAA;AACf;AAYA,SAAS,aAAA,CACP,SAAA,EACA,KAAA,EACA,UAAA,EACA,gBACA,OAAA,EACmB;AACnB,EAAA,MAAM,MAAA,GAA4B;AAAA,IAChC,OAAA,EAAS,KAAA;AAAA,IACT,KAAA;AAAA,IACA,SAAA;AAAA,IACA,UAAA;AAAA,IACA;AAAA,GACF;AAEA,EAAA,IAAI,YAAY,MAAA,EAAW;AACzB,IAAA,MAAA,CAAO,OAAA,GAAU,OAAA;AAAA,EACnB;AAEA,EAAA,OAAO,MAAA;AACT;AAwCO,SAAS,cAAA,CACd,GAAA,EACA,OAAA,GAAoC,EAAC,EACtB;AACf,EAAA,MAAM,SAAA,GAAY,KAAK,GAAA,EAAI;AAG3B,EAAA,IAAI,CAAC,GAAA,IAAO,OAAO,QAAQ,QAAA,IAAY,CAAC,IAAI,eAAA,EAAiB;AAC3D,IAAA,OAAO,aAAA;AAAA,MACL,cAAA;AAAA,MACA,uCAAA;AAAA,MACA,KAAA;AAAA,MACA,IAAA,CAAK,KAAI,GAAI;AAAA,KACf;AAAA,EACF;AAGA,EAAA,IAAI,UAAA,GAAa,KAAA;AACjB,EAAA,IAAI,QAAQ,gBAAA,EAAkB;AAC5B,IAAA,IAAI;AACF,MAAA,UAAA,GAAa,qBAAqB,GAAG,CAAA;AACrC,MAAA,IAAI,CAAC,UAAA,EAAY;AACf,QAAA,OAAO,aAAA;AAAA,UACL,gBAAA;AAAA,UACA,kDAAA;AAAA,UACA,KAAA;AAAA,UACA,IAAA,CAAK,KAAI,GAAI;AAAA,SACf;AAAA,MACF;AAAA,IACF,SAAS,KAAA,EAAO;AAEd,MAAA,IAAI,QAAQ,KAAA,EAAO;AACjB,QAAA,OAAA,CAAQ,IAAA,CAAK,6BAA6B,KAAK,CAAA;AAAA,MACjD;AAAA,IACF;AAAA,EACF;AAGA,EAAA,IAAI,OAAA;AACJ,EAAA,IAAI;AACF,IAAA,OAAA,GAAU,sBAAA,CAAuB,KAAK,OAAO,CAAA;AAAA,EAC/C,SAAS,KAAA,EAAO;AACd,IAAA,MAAM,eAAe,KAAA,YAAiB,KAAA,GAAQ,KAAA,CAAM,OAAA,GAAU,OAAO,KAAK,CAAA;AAC1E,IAAA,OAAO,aAAA;AAAA,MACL,aAAA;AAAA,MACA,yBAAyB,YAAY,CAAA,CAAA;AAAA,MACrC,UAAA;AAAA,MACA,IAAA,CAAK,KAAI,GAAI,SAAA;AAAA,MACb;AAAA,KACF;AAAA,EACF;AAGA,EAAA,IAAI,CAAC,OAAA,EAAS;AACZ,IAAA,OAAO,aAAA;AAAA,MACL,mBAAA;AAAA,MACA,sDAAA;AAAA,MACA,UAAA;AAAA,MACA,IAAA,CAAK,KAAI,GAAI;AAAA,KACf;AAAA,EACF;AAGA,EAAA,IAAI,CAAC,OAAA,CAAQ,KAAA,IAAS,CAAC,QAAQ,WAAA,EAAa;AAC1C,IAAA,OAAO,aAAA;AAAA,MACL,mBAAA;AAAA,MACA,wCAAA;AAAA,MACA,UAAA;AAAA,MACA,IAAA,CAAK,KAAI,GAAI;AAAA,KACf;AAAA,EACF;AAGA,EAAA,MAAM,SAAA,GAAYA,WAAAA,CAAW,OAAA,CAAQ,WAAW,CAAA;AAChD,EAAA,MAAM,WAAA,GAAc,qBAAqB,SAAS,CAAA;AAGlD,EAAA,MAAM,MAAA,GAA2B;AAAA,IAC/B,OAAA,EAAS,IAAA;AAAA,IACT,OAAO,OAAA,CAAQ,KAAA;AAAA,IACf,SAAS,OAAA,CAAQ,OAAA;AAAA,IACjB,aAAa,OAAA,CAAQ,WAAA;AAAA,IACrB,SAAS,OAAA,CAAQ,OAAA;AAAA,IACjB,QAAQ,OAAA,CAAQ,MAAA;AAAA,IAChB,SAAA;AAAA,IACA,WAAA;AAAA,IACA,YAAY,UAAA,IAAc,IAAA;AAAA;AAAA,IAC1B,cAAA,EAAgB,IAAA,CAAK,GAAA,EAAI,GAAI;AAAA,GAC/B;AAGA,EAAA,IAAI,QAAQ,MAAA,EAAQ;AAClB,IAAA,MAAA,CAAO,SAAS,OAAA,CAAQ,MAAA;AAAA,EAC1B;AACA,EAAA,IAAI,QAAQ,QAAA,EAAU;AACpB,IAAA,MAAA,CAAO,WAAW,OAAA,CAAQ,QAAA;AAAA,EAC5B;AACA,EAAA,IAAI,QAAQ,IAAA,EAAM;AAChB,IAAA,MAAA,CAAO,OAAO,OAAA,CAAQ,IAAA;AAAA,EACxB;AACA,EAAA,IAAI,QAAQ,GAAA,EAAK;AACf,IAAA,MAAA,CAAO,MAAM,OAAA,CAAQ,GAAA;AAAA,EACvB;AACA,EAAA,IAAI,QAAQ,aAAA,EAAe;AACzB,IAAA,MAAA,CAAO,gBAAgB,OAAA,CAAQ,aAAA;AAAA,EACjC;AAEA,EAAA,OAAO,MAAA;AACT;;;AChKO,SAAS,UAAA,CAAW,IAAA,EAAc,OAAA,GAA6B,EAAC,EAAW;AAChF,EAAA,IAAI,OAAO,SAAS,QAAA,EAAU;AAC5B,IAAA,MAAM,IAAI,UAAU,8BAA8B,CAAA;AAAA,EACpD;AAEA,EAAA,MAAM,QAAA,GAAW,iBAAiB,OAAO,CAAA;AAGzC,EAAA,IAAI,IAAA,CAAK,WAAW,CAAA,EAAG;AACrB,IAAA,OAAO,EAAA;AAAA,EACT;AAGA,EAAA,MAAM,eAAA,GAAkB,KAAA,CAAM,QAAA,CAAS,YAAY,CAAA;AACnD,EAAA,MAAM,cAAA,GAAiB,KAAA;AAAA,IACrB,QAAA,CAAS,WAAA,CAAY,MAAA,CAAO,QAAA,CAAS,IAAA,KAAS,aAAa,CAAC,MAAM,CAAA,GAAI,EAAE;AAAA,GAC1E;AACA,EAAA,MAAM,WAAA,GAAc,aAAA;AAGpB,EAAA,IAAI,WAAA,GAAc,CAAA;AAClB,EAAA,IAAI,aAAuB,EAAC;AAC5B,EAAA,MAAM,OAAA,GAAU,QAAA,CAAS,kBAAA,KAAuB,KAAA,GAAQ,GAAA,GAAO,GAAA;AAG/D,EAAA,MAAM,WAAqB,EAAC;AAC5B,EAAA,IAAI,kBAAA,GAAqB,KAAA;AACzB,EAAA,IAAI,YAAA,GAAe,CAAA;AAGnB,EAAA,IAAI,iBAAA,GAAmC,IAAA;AACvC,EAAA,IAAI,QAAA,GAAW,KAAA;AACf,EAAA,IAAI,aAAA,GAAgB,KAAA;AAGpB,EAAA,MAAM,MAAgB,EAAC;AAGvB,EAAA,MAAM,SAAS,IAAA,CAAK,MAAA;AACpB,EAAA,IAAI,CAAA,GAAI,CAAA;AAER,EAAA,OAAO,IAAI,MAAA,EAAQ;AACjB,IAAA,MAAM,EAAA,GAAK,IAAA,CAAK,UAAA,CAAW,CAAC,CAAA;AAE5B,IAAA,IAAI,OAAO,EAAA,EAAY;AAErB,MAAA,MAAM,QAAA,GAAW,CAAA;AACjB,MAAA,MAAM,GAAA,GAAM,IAAA,CAAK,OAAA,CAAQ,GAAA,EAAK,WAAW,CAAC,CAAA;AAE1C,MAAA,IAAI,QAAQ,EAAA,EAAI;AAEd,QAAA,QAAA,CAAS,KAAK,KAAA,CAAM,CAAC,CAAA,EAAG,GAAA,EAAK,UAAU,kBAAkB,CAAA;AACzD,QAAA;AAAA,MACF;AAEA,MAAA,MAAM,MAAA,GAAS,IAAA,CAAK,KAAA,CAAM,QAAA,GAAW,GAAG,GAAG,CAAA;AAC3C,MAAA,CAAA,GAAI,GAAA,GAAM,CAAA;AAEV,MAAA,MAAM,SAAA,GAAY,MAAA,CAAO,CAAC,CAAA,KAAM,GAAA;AAChC,MAAA,MAAM,OAAA,GAAU,SAAA,GAAY,MAAA,CAAO,KAAA,CAAM,CAAC,CAAA,GAAI,MAAA;AAC9C,MAAA,MAAM,QAAA,GAAW,aAAa,OAAO,CAAA;AACrC,MAAA,IAAI,OAAA,GAAA,CAAW,aAAa,EAAA,GAAK,OAAA,GAAU,QAAQ,KAAA,CAAM,CAAA,EAAG,QAAQ,CAAA,EAAG,WAAA,EAAY;AAGnF,MAAA,IAAI,OAAA,CAAQ,QAAA,CAAS,GAAG,CAAA,EAAG;AACzB,QAAA,OAAA,GAAU,OAAA,CAAQ,KAAA,CAAM,CAAA,EAAG,EAAE,CAAA;AAAA,MAC/B;AAEA,MAAA,IAAI,SAAA,EAAW;AAEb,QAAA,cAAA,CAAe,OAAO,CAAA;AAAA,MACxB,CAAA,MAAO;AAEL,QAAA,MAAM,cAAc,MAAA,CAAO,QAAA,CAAS,GAAG,CAAA,IAAK,oBAAA,CAAqB,IAAI,OAAO,CAAA;AAC5E,QAAA,MAAM,QAAQ,QAAA,KAAa,EAAA,GAAK,KAAK,OAAA,CAAQ,KAAA,CAAM,WAAW,CAAC,CAAA;AAC/D,QAAA,aAAA,CAAc,OAAA,EAAS,OAAO,WAAW,CAAA;AAAA,MAC3C;AACA,MAAA;AAAA,IACF;AAGA,IAAA,MAAM,OAAA,GAAU,IAAA,CAAK,OAAA,CAAQ,GAAA,EAAK,CAAC,CAAA;AACnC,IAAA,MAAM,IAAA,GAAO,OAAA,KAAY,EAAA,GAAK,IAAA,CAAK,KAAA,CAAM,CAAC,CAAA,GAAI,IAAA,CAAK,KAAA,CAAM,CAAA,EAAG,OAAO,CAAA;AACnE,IAAA,CAAA,GAAI,OAAA,KAAY,KAAK,MAAA,GAAS,OAAA;AAE9B,IAAA,IAAI,eAAe,CAAA,EAAG;AACpB,MAAA;AAAA,IACF;AAEA,IAAA,IAAI,cAAc,CAAA,EAAG;AAEnB,MAAA,UAAA,CAAW,KAAK,IAAI,CAAA;AAAA,IACtB,CAAA,MAAO;AAEL,MAAA,IAAI,QAAA,IAAY,IAAA,CAAK,IAAA,CAAK,IAAI,CAAA,EAAG;AAC/B,QAAA,aAAA,GAAgB,IAAA;AAAA,MAClB;AAGA,MAAA,MAAM,kBAAA,GAAqB,QAAA,IAAY,QAAA,CAAS,KAAA,KAAU,QAAA;AAC1D,MAAA,IAAI,CAAC,kBAAA,EAAoB;AACvB,QAAA,QAAA,CAAS,IAAA,EAAM,GAAA,EAAK,QAAA,EAAU,kBAAkB,CAAA;AAAA,MAClD;AAAA,IACF;AAAA,EACF;AAEA,EAAA,IAAI,MAAA,GAAS,GAAA,CAAI,IAAA,CAAK,EAAE,CAAA;AAGxB,EAAA,MAAM,YAAA,GAAe,MAAA,CAAO,KAAA,CAAM,QAAQ,CAAA;AAC1C,EAAA,MAAM,aAAA,GAAgB,MAAA,CAAO,KAAA,CAAM,QAAQ,CAAA;AAC3C,EAAA,MAAM,SAAA,GAAY,YAAA,GAAe,YAAA,CAAa,CAAC,CAAA,GAAI,EAAA;AACnD,EAAA,MAAM,UAAA,GAAa,aAAA,GAAgB,aAAA,CAAc,CAAC,CAAA,GAAI,EAAA;AAEtD,EAAA,IAAI,SAAS,kBAAA,EAAoB;AAC/B,IAAA,MAAA,GAAS,kBAAA,CAAmB,MAAA,EAAQ,QAAA,CAAS,WAAA,EAAa,SAAS,IAAI,CAAA;AAAA,EACzE;AAEA,EAAA,IAAI,QAAA,CAAS,IAAA,IAAQ,IAAA,IAAQ,QAAA,CAAS,OAAO,CAAA,EAAG;AAC9C,IAAA,MAAA,GAAS,QAAA,CAAS,MAAA,EAAQ,QAAA,CAAS,IAAI,CAAA;AAAA,EACzC;AAGA,EAAA,MAAA,GAAS,OAAO,OAAA,CAAQ,IAAI,OAAO,aAAA,EAAe,GAAG,GAAG,EAAE,CAAA;AAC1D,EAAA,MAAA,GAAS,OAAO,OAAA,CAAQ,IAAI,OAAO,cAAA,EAAgB,GAAG,GAAG,EAAE,CAAA;AAE3D,EAAA,IAAI,SAAS,IAAA,EAAM;AACjB,IAAA,MAAA,GAAS,OAAO,IAAA,EAAK;AAAA,EACvB,CAAA,MAAA,IAAW,QAAA,CAAS,kBAAA,KAAuB,SAAA,IAAa,UAAA,CAAA,EAAa;AAGnE,IAAA,IAAI,SAAA,IAAa,CAAC,MAAA,CAAO,UAAA,CAAW,GAAG,KAAK,CAAC,MAAA,CAAO,UAAA,CAAW,IAAI,CAAA,EAAG;AACpE,MAAA,MAAA,GAAS,IAAI,MAAM,CAAA,CAAA;AAAA,IACrB;AACA,IAAA,IAAI,UAAA,IAAc,CAAC,MAAA,CAAO,QAAA,CAAS,GAAG,KAAK,CAAC,MAAA,CAAO,QAAA,CAAS,IAAI,CAAA,EAAG;AACjE,MAAA,MAAA,GAAS,GAAG,MAAM,CAAA,CAAA,CAAA;AAAA,IACpB;AAAA,EACF;AAEA,EAAA,OAAO,MAAA;AAIP,EAAA,SAAS,QAAQ,IAAA,EAAoB;AACnC,IAAA,QAAA,CAAS,KAAK,IAAI,CAAA;AAClB,IAAA,IAAI,eAAA,CAAgB,GAAA,CAAI,IAAI,CAAA,EAAG;AAC7B,MAAA,kBAAA,GAAqB,IAAA;AAAA,IACvB;AACA,IAAA,IAAI,cAAA,CAAe,GAAA,CAAI,IAAI,CAAA,EAAG;AAC5B,MAAA,YAAA,IAAgB,CAAA;AAAA,IAClB;AACA,IAAA,IAAI,SAAS,OAAA,EAAS;AACpB,MAAA,WAAA,IAAe,CAAA;AAAA,IACjB;AAAA,EACF;AAEA,EAAA,SAAS,OAAO,IAAA,EAAoB;AAElC,IAAA,KAAA,IAAS,MAAM,QAAA,CAAS,MAAA,GAAS,GAAG,GAAA,IAAO,CAAA,EAAG,OAAO,CAAA,EAAG;AACtD,MAAA,MAAM,CAAA,GAAI,SAAS,GAAG,CAAA;AACtB,MAAA,QAAA,CAAS,MAAA,GAAS,GAAA;AAElB,MAAA,IAAI,eAAA,CAAgB,GAAA,CAAI,CAAC,CAAA,EAAG;AAC1B,QAAA,kBAAA,GAAqB,KAAA;AAAA,MACvB;AACA,MAAA,IAAI,cAAA,CAAe,GAAA,CAAI,CAAC,CAAA,EAAG;AACzB,QAAA,YAAA,GAAe,IAAA,CAAK,GAAA,CAAI,CAAA,EAAG,YAAA,GAAe,CAAC,CAAA;AAAA,MAC7C;AACA,MAAA,IAAI,MAAM,OAAA,EAAS;AACjB,QAAA,WAAA,GAAc,IAAA,CAAK,GAAA,CAAI,CAAA,EAAG,WAAA,GAAc,CAAC,CAAA;AAAA,MAC3C;AACA,MAAA,IAAI,MAAM,IAAA,EAAM;AACd,QAAA;AAAA,MACF;AAAA,IACF;AAAA,EACF;AAEA,EAAA,SAAS,aAAA,CAAc,OAAA,EAAiB,KAAA,EAAe,WAAA,EAA4B;AACjF,IAAA,IAAI,cAAA,CAAe,GAAA,CAAI,OAAO,CAAA,EAAG;AAC/B,MAAA,OAAA,CAAQ,OAAO,CAAA;AACf,MAAA;AAAA,IACF;AAEA,IAAA,IAAI,YAAY,IAAA,EAAM;AACpB,MAAA,GAAA,CAAI,KAAK,IAAI,CAAA;AACb,MAAA;AAAA,IACF;AAEA,IAAA,IAAI,YAAY,GAAA,EAAK;AACnB,MAAA,iBAAA,GAAoB,WAAA,CAAY,OAAO,MAAM,CAAA;AAC7C,MAAA,QAAA,GAAW,IAAA;AACX,MAAA,aAAA,GAAgB,KAAA;AAChB,MAAA,OAAA,CAAQ,OAAO,CAAA;AACf,MAAA,IAAI,WAAA,EAAa;AACf,QAAA,cAAA,CAAe,OAAO,CAAA;AAAA,MACxB;AACA,MAAA;AAAA,IACF;AAEA,IAAA,IAAI,YAAY,KAAA,EAAO;AACrB,MAAA,IAAI,QAAA,CAAS,WAAW,KAAA,EAAO;AAC7B,QAAA,MAAM,GAAA,GAAM,WAAA,CAAY,KAAA,EAAO,KAAK,CAAA;AACpC,QAAA,IAAI,GAAA,EAAK;AACP,UAAA,QAAA,CAAS,GAAA,EAAK,GAAA,EAAK,QAAA,EAAU,IAAI,CAAA;AAAA,QACnC;AAAA,MACF;AAEA,MAAA,IAAI,QAAA,EAAU;AACZ,QAAA,GAAA,CAAI,KAAK,GAAG,CAAA;AAAA,MACd;AACA,MAAA;AAAA,IACF;AAEA,IAAA,IAAI,OAAA,KAAY,IAAA,IAAQ,OAAA,KAAY,IAAA,EAAM;AACxC,MAAA,IAAI,cAAc,CAAA,EAAG;AACnB,QAAA,UAAA,GAAa,EAAC;AAAA,MAChB;AACA,MAAA,OAAA,CAAQ,OAAO,CAAA;AACf,MAAA,IAAI,WAAA,EAAa;AACf,QAAA,cAAA,CAAe,OAAO,CAAA;AAAA,MACxB;AACA,MAAA;AAAA,IACF;AAEA,IAAA,IAAI,YAAY,IAAA,EAAM;AACpB,MAAA,OAAA,CAAQ,OAAO,CAAA;AACf,MAAA,IAAI,WAAA,EAAa;AACf,QAAA,cAAA,CAAe,OAAO,CAAA;AAAA,MACxB;AACA,MAAA;AAAA,IACF;AAIA,IAAA,IAAI,eAAA,CAAgB,GAAA,CAAI,OAAO,CAAA,IAAK,YAAY,MAAA,EAAQ;AACtD,MAAA,aAAA,CAAc,GAAG,CAAA;AAAA,IACnB;AAEA,IAAA,OAAA,CAAQ,OAAO,CAAA;AACf,IAAA,IAAI,WAAA,EAAa;AACf,MAAA,cAAA,CAAe,OAAO,CAAA;AAAA,IACxB;AAAA,EACF;AAEA,EAAA,SAAS,eAAe,OAAA,EAAuB;AAC7C,IAAA,IAAI,cAAA,CAAe,GAAA,CAAI,OAAO,CAAA,EAAG;AAC/B,MAAA,MAAA,CAAO,OAAO,CAAA;AACd,MAAA;AAAA,IACF;AAEA,IAAA,IAAI,YAAY,GAAA,EAAK;AACnB,MAAA,MAAM,YAAA,GACJ,CAAC,CAAC,iBAAA,KACD,QAAA,CAAS,UAAU,QAAA,IAAa,CAAC,aAAA,IAAiB,QAAA,CAAS,MAAA,KAAW,QAAA,CAAA;AAEzE,MAAA,IAAI,gBAAgB,iBAAA,EAAmB;AACrC,QAAA,MAAM,IAAA,GAAO,IAAI,MAAA,GAAS,CAAA,GAAI,IAAI,GAAA,CAAI,MAAA,GAAS,CAAC,CAAA,GAAI,EAAA;AACpD,QAAA,MAAM,SAAA,GAAY,aAAA,GACd,IAAA,CAAK,MAAA,GAAS,KAAK,CAAC,IAAA,CAAK,QAAA,CAAS,GAAG,CAAA,IAAK,CAAC,IAAA,CAAK,QAAA,CAAS,IAAI,CAAA,GAC7D,IAAA;AAEJ,QAAA,IAAI,SAAA,EAAW;AACb,UAAA,GAAA,CAAI,KAAK,GAAG,CAAA;AAAA,QACd;AACA,QAAA,GAAA,CAAI,IAAA,CAAK,GAAA,EAAK,iBAAA,EAAmB,GAAG,CAAA;AAAA,MACtC;AAEA,MAAA,iBAAA,GAAoB,IAAA;AACpB,MAAA,QAAA,GAAW,KAAA;AACX,MAAA,aAAA,GAAgB,KAAA;AAChB,MAAA,MAAA,CAAO,OAAO,CAAA;AACd,MAAA;AAAA,IACF;AAEA,IAAA,IAAI,OAAA,KAAY,IAAA,IAAQ,OAAA,KAAY,IAAA,EAAM;AACxC,MAAA,IAAI,cAAc,CAAA,EAAG;AACnB,QAAA,MAAM,IAAA,GAAO,UAAA,CAAW,IAAA,CAAK,EAAE,CAAA;AAC/B,QAAA,MAAM,UAAA,GAAa,SAAS,kBAAA,GACxB,kBAAA;AAAA,UACE,WAAA,CAAY,IAAA,EAAM,QAAA,EAAU,kBAAkB,CAAA;AAAA,UAC9C,QAAA,CAAS,WAAA;AAAA,UACT,QAAA,CAAS;AAAA,SACX,GACA,WAAA,CAAY,IAAA,EAAM,QAAA,EAAU,kBAAkB,CAAA;AAGlD,QAAA,GAAA,CAAI,IAAA,CAAK,YAAY,OAAO,CAAA;AAC5B,QAAA,UAAA,GAAa,EAAC;AAAA,MAChB;AACA,MAAA,MAAA,CAAO,OAAO,CAAA;AACd,MAAA;AAAA,IACF;AAEA,IAAA,IAAI,YAAY,IAAA,EAAM;AAEpB,MAAA,IAAI,GAAA,CAAI,SAAS,CAAA,IAAK,GAAA,CAAI,IAAI,MAAA,GAAS,CAAC,MAAM,OAAA,EAAS;AACrD,QAAA,GAAA,CAAI,GAAA,EAAI;AAAA,MACV;AACA,MAAA,aAAA,CAAc,GAAG,CAAA;AACjB,MAAA,MAAA,CAAO,OAAO,CAAA;AACd,MAAA;AAAA,IACF;AAEA,IAAA,IAAI,WAAA,CAAY,GAAA,CAAI,OAAO,CAAA,EAAG;AAE5B,MAAA,aAAA,CAAc,GAAG,CAAA;AAAA,IACnB;AAEA,IAAA,MAAA,CAAO,OAAO,CAAA;AAAA,EAChB;AACF;AAkBA,SAAS,iBAAiB,CAAA,EAAyC;AACjE,EAAA,OAAO;AAAA,IACL,IAAA,EAAM,CAAA,CAAE,IAAA,KAAS,UAAA,GAAa,UAAA,GAAa,UAAA;AAAA,IAC3C,KAAA,EAAO,EAAE,KAAA,KAAU,QAAA,IAAY,EAAE,KAAA,KAAU,QAAA,GAAW,EAAE,KAAA,GAAQ,MAAA;AAAA,IAChE,MAAA,EAAQ,CAAA,CAAE,MAAA,KAAW,QAAA,GAAW,QAAA,GAAW,KAAA;AAAA,IAC3C,kBAAA,EAAoB,EAAE,kBAAA,KAAuB,KAAA;AAAA,IAC7C,WAAA,EAAa,OAAO,CAAA,CAAE,WAAA,KAAgB,YAAY,CAAA,CAAE,WAAA,IAAe,CAAA,GAAI,CAAA,CAAE,WAAA,GAAc,CAAA;AAAA,IACvF,IAAA,EAAM,OAAO,CAAA,CAAE,IAAA,KAAS,QAAA,IAAY,CAAA,CAAE,IAAA,GAAO,CAAA,GAAI,IAAA,CAAK,KAAA,CAAM,CAAA,CAAE,IAAI,CAAA,GAAI,IAAA;AAAA,IACtE,kBAAA,EAAoB,CAAA,CAAE,kBAAA,KAAuB,OAAA,GAAU,OAAA,GAAU,KAAA;AAAA,IACjE,WAAA,EAAa,MAAM,OAAA,CAAQ,CAAA,CAAE,WAAW,CAAA,GACpC,CAAA,CAAE,WAAA,CAAY,GAAA,CAAI,CAAC,CAAA,KAAM,OAAO,CAAC,CAAA,CAAE,WAAA,EAAa,CAAA,GAChD,CAAC,UAAU,OAAA,EAAS,UAAA,EAAY,UAAA,EAAY,KAAA,EAAO,QAAQ,CAAA;AAAA,IAC/D,cAAA,EAAgB,EAAE,cAAA,KAAmB,KAAA;AAAA,IACrC,YAAA,EAAc,MAAM,OAAA,CAAQ,CAAA,CAAE,YAAY,CAAA,GACtC,CAAA,CAAE,aAAa,GAAA,CAAI,CAAC,MAAM,MAAA,CAAO,CAAC,EAAE,WAAA,EAAa,IACjD,CAAC,KAAA,EAAO,QAAQ,UAAU,CAAA;AAAA,IAC9B,IAAA,EAAM,EAAE,IAAA,KAAS;AAAA,GACnB;AACF;AAEA,SAAS,MAAM,GAAA,EAA4B;AACzC,EAAA,OAAO,IAAI,IAAI,GAAG,CAAA;AACpB;AAEA,SAAS,QAAA,CACP,IAAA,EACA,GAAA,EACA,QAAA,EACA,kBAAA,EACM;AACN,EAAA,IAAI,IAAA,CAAK,WAAW,CAAA,EAAG;AACrB,IAAA;AAAA,EACF;AACA,EAAA,MAAM,SAAA,GAAY,WAAA,CAAY,IAAA,EAAM,QAAA,EAAU,kBAAkB,CAAA;AAChE,EAAA,GAAA,CAAI,KAAK,SAAS,CAAA;AACpB;AAEA,SAAS,WAAA,CACP,IAAA,EACA,QAAA,EACA,kBAAA,EACQ;AACR,EAAA,IAAI,CAAA,GAAI,IAAA;AAER,EAAA,IAAI,SAAS,cAAA,EAAgB;AAC3B,IAAA,CAAA,GAAI,eAAe,CAAC,CAAA;AAAA,EACtB;AAEA,EAAA,IAAI,kBAAA,EAAoB;AAEtB,IAAA,OAAO,gBAAgB,CAAA,GAAI,cAAA;AAAA,EAC7B;AAEA,EAAA,IAAI,SAAS,kBAAA,EAAoB;AAE/B,IAAA,CAAA,GAAI,CAAA,CAAE,OAAA,CAAQ,iBAAA,EAAmB,GAAG,CAAA;AAAA,EACtC;AAEA,EAAA,OAAO,CAAA;AACT;AAEA,SAAS,cAAc,GAAA,EAAqB;AAC1C,EAAA,IAAI,GAAA,CAAI,WAAW,CAAA,EAAG;AACpB,IAAA;AAAA,EACF;AACA,EAAA,MAAM,IAAA,GAAO,GAAA,CAAI,GAAA,CAAI,MAAA,GAAS,CAAC,CAAA;AAC/B,EAAA,IAAI,IAAA,CAAK,QAAA,CAAS,IAAI,CAAA,EAAG;AACvB,IAAA;AAAA,EACF;AACA,EAAA,GAAA,CAAI,KAAK,IAAI,CAAA;AACf;AAEA,SAAS,kBAAA,CAAmB,KAAA,EAAe,WAAA,EAAqB,IAAA,EAAuB;AACrF,EAAA,IAAI,KAAA,CAAM,OAAA,CAAQ,aAAa,CAAA,KAAM,EAAA,EAAI;AACvC,IAAA,OAAO,wBAAA,CAAyB,KAAA,EAAO,WAAA,EAAa,IAAI,CAAA;AAAA,EAC1D;AAEA,EAAA,IAAI,MAAA,GAAS,EAAA;AACb,EAAA,IAAI,GAAA,GAAM,CAAA;AAEV,EAAA,OAAO,GAAA,GAAM,MAAM,MAAA,EAAQ;AACzB,IAAA,MAAM,IAAA,GAAO,KAAA,CAAM,OAAA,CAAQ,aAAA,EAAe,GAAG,CAAA;AAC7C,IAAA,IAAI,SAAS,EAAA,EAAI;AACf,MAAA,MAAA,IAAU,yBAAyB,KAAA,CAAM,KAAA,CAAM,GAAG,CAAA,EAAG,aAAa,IAAI,CAAA;AACtE,MAAA;AAAA,IACF;AAEA,IAAA,MAAA,IAAU,yBAAyB,KAAA,CAAM,KAAA,CAAM,KAAK,IAAI,CAAA,EAAG,aAAa,IAAI,CAAA;AAC5E,IAAA,MAAM,KAAA,GAAQ,KAAA,CAAM,OAAA,CAAQ,cAAA,EAAgB,OAAO,CAAC,CAAA;AAEpD,IAAA,IAAI,UAAU,EAAA,EAAI;AAEhB,MAAA,MAAA,IAAU,yBAAyB,KAAA,CAAM,KAAA,CAAM,OAAO,CAAC,CAAA,EAAG,aAAa,IAAI,CAAA;AAC3E,MAAA;AAAA,IACF;AAGA,IAAA,MAAA,IAAU,KAAA,CAAM,KAAA,CAAM,IAAA,EAAM,KAAA,GAAQ,CAAC,CAAA;AACrC,IAAA,GAAA,GAAM,KAAA,GAAQ,CAAA;AAAA,EAChB;AAEA,EAAA,OAAO,MAAA;AACT;AAEA,SAAS,wBAAA,CAAyB,KAAA,EAAe,WAAA,EAAqB,IAAA,EAAuB;AAC3F,EAAA,IAAI,CAAA,GAAI,KAAA,CAAM,OAAA,CAAQ,WAAA,EAAa,GAAG,CAAA;AAEtC,EAAA,CAAA,GAAI,CAAA,CAAE,OAAA,CAAQ,sBAAA,EAAwB,IAAI,CAAA;AAE1C,EAAA,IAAI,IAAA,EAAM;AAER,IAAA,CAAA,GAAI,CAAA,CAAE,OAAA,CAAQ,eAAA,EAAiB,IAAI,CAAA;AACnC,IAAA,CAAA,GAAI,CAAA,CAAE,OAAA,CAAQ,eAAA,EAAiB,IAAI,CAAA;AAAA,EACrC;AAGA,EAAA,MAAM,KAAK,IAAI,MAAA,CAAO,OAAO,WAAA,GAAc,CAAC,MAAM,GAAG,CAAA;AACrD,EAAA,CAAA,GAAI,EAAE,OAAA,CAAQ,EAAA,EAAI,IAAA,CAAK,MAAA,CAAO,WAAW,CAAC,CAAA;AAE1C,EAAA,CAAA,GAAI,CAAA,CAAE,OAAA,CAAQ,gBAAA,EAAkB,GAAG,CAAA;AACnC,EAAA,OAAO,CAAA;AACT;AAEA,SAAS,QAAA,CAAS,OAAe,KAAA,EAAuB;AACtD,EAAA,MAAM,KAAA,GAAQ,KAAA,CAAM,KAAA,CAAM,IAAI,CAAA;AAC9B,EAAA,MAAM,UAAoB,EAAC;AAE3B,EAAA,KAAA,MAAW,QAAQ,KAAA,EAAO;AAExB,IAAA,IAAI,IAAA,CAAK,QAAA,CAAS,aAAa,CAAA,EAAG;AAChC,MAAA,OAAA,CAAQ,KAAK,IAAI,CAAA;AACjB,MAAA;AAAA,IACF;AAEA,IAAA,IAAI,IAAA,CAAK,UAAU,KAAA,EAAO;AACxB,MAAA,OAAA,CAAQ,KAAK,IAAI,CAAA;AACjB,MAAA;AAAA,IACF;AAEA,IAAA,IAAI,KAAA,GAAQ,CAAA;AACZ,IAAA,OAAO,KAAA,GAAQ,KAAK,MAAA,EAAQ;AAC1B,MAAA,MAAM,MAAM,IAAA,CAAK,GAAA,CAAI,KAAA,GAAQ,KAAA,EAAO,KAAK,MAAM,CAAA;AAC/C,MAAA,OAAA,CAAQ,IAAA,CAAK,IAAA,CAAK,KAAA,CAAM,KAAA,EAAO,GAAG,CAAC,CAAA;AACnC,MAAA,KAAA,GAAQ,GAAA;AAAA,IACV;AAAA,EACF;AAEA,EAAA,OAAO,OAAA,CAAQ,KAAK,IAAI,CAAA;AAC1B;AAEA,SAAS,eAAe,CAAA,EAAmB;AAEzC,EAAA,CAAA,GAAI,CAAA,CAAE,OAAA,CAAQ,WAAA,EAAa,CAAC,CAAA,EAAG,MAAM,iBAAA,CAAkB,MAAA,CAAO,CAAC,CAAC,CAAC,CAAA;AACjE,EAAA,CAAA,GAAI,CAAA,CAAE,OAAA,CAAQ,qBAAA,EAAuB,CAAC,CAAA,EAAG,CAAA,KAAM,iBAAA,CAAkB,MAAA,CAAO,QAAA,CAAS,CAAA,EAAG,EAAE,CAAC,CAAC,CAAA;AAExF,EAAA,CAAA,GAAI,CAAA,CAAE,OAAA,CAAQ,gBAAA,EAAkB,CAAC,CAAA,EAAG,IAAA,KAAS,cAAA,CAAe,IAAI,CAAA,IAAK,CAAA,CAAA,EAAI,IAAI,CAAA,CAAA,CAAG,CAAA;AAChF,EAAA,OAAO,CAAA;AACT;AAEA,SAAS,kBAAkB,EAAA,EAAoB;AAC7C,EAAA,IAAI,CAAC,OAAO,QAAA,CAAS,EAAE,KAAK,EAAA,GAAK,CAAA,IAAK,KAAK,OAAA,EAAU;AACnD,IAAA,OAAO,EAAA;AAAA,EACT;AACA,EAAA,IAAI;AACF,IAAA,OAAO,MAAA,CAAO,cAAc,EAAE,CAAA;AAAA,EAChC,CAAA,CAAA,MAAQ;AACN,IAAA,OAAO,EAAA;AAAA,EACT;AACF;AAEA,SAAS,WAAA,CAAY,OAAe,IAAA,EAA6B;AAC/D,EAAA,MAAM,KAAK,IAAI,MAAA,CAAO,CAAA,SAAA,EAAY,IAAI,6CAA6C,GAAG,CAAA;AACtF,EAAA,MAAM,CAAA,GAAI,KAAA,CAAM,KAAA,CAAM,EAAE,CAAA;AACxB,EAAA,IAAI,CAAC,CAAA,EAAG;AACN,IAAA,OAAO,IAAA;AAAA,EACT;AACA,EAAA,MAAM,GAAA,GAAM,EAAE,CAAC,CAAA,IAAK,EAAE,CAAC,CAAA,IAAK,CAAA,CAAE,CAAC,CAAA,IAAK,EAAA;AACpC,EAAA,OAAO,eAAe,GAAG,CAAA;AAC3B;AAEA,SAAS,aAAa,CAAA,EAAmB;AACvC,EAAA,KAAA,IAAS,IAAI,CAAA,EAAG,CAAA,GAAI,CAAA,CAAE,MAAA,EAAQ,KAAK,CAAA,EAAG;AACpC,IAAA,MAAM,CAAA,GAAI,CAAA,CAAE,UAAA,CAAW,CAAC,CAAA;AACxB,IAAA,IAAI,CAAA,KAAM,MAAM,CAAA,KAAM,CAAA,IAAK,MAAM,EAAA,IAAM,CAAA,KAAM,EAAA,IAAM,CAAA,KAAM,EAAA,EAAI;AAC3D,MAAA,OAAO,CAAA;AAAA,IACT;AAAA,EACF;AACA,EAAA,OAAO,EAAA;AACT;AAIA,IAAM,gBAAgB,KAAA,CAAM;AAAA,EAC1B,GAAA;AAAA,EACA,KAAA;AAAA,EACA,SAAA;AAAA,EACA,SAAA;AAAA,EACA,QAAA;AAAA,EACA,QAAA;AAAA,EACA,MAAA;AAAA,EACA,KAAA;AAAA,EACA,OAAA;AAAA,EACA,IAAA;AAAA,EACA,IAAA;AAAA,EACA,IAAA;AAAA,EACA,IAAA;AAAA,EACA,IAAA;AAAA,EACA,IAAA;AAAA,EACA,IAAA;AAAA,EACA,IAAA;AAAA,EACA,IAAA;AAAA,EACA,OAAA;AAAA,EACA,OAAA;AAAA,EACA,OAAA;AAAA,EACA,OAAA;AAAA,EACA,YAAA;AAAA,EACA,QAAA;AAAA,EACA,YAAA;AAAA,EACA;AACF,CAAC,CAAA;AAED,IAAM,uBAAuB,KAAA,CAAM;AAAA,EACjC,IAAA;AAAA,EACA,KAAA;AAAA,EACA,IAAA;AAAA,EACA,MAAA;AAAA,EACA,MAAA;AAAA,EACA,OAAA;AAAA,EACA,QAAA;AAAA,EACA,OAAA;AAAA,EACA;AACF,CAAC,CAAA;AAGD,IAAM,aAAA,GAAgB,QAAA;AACtB,IAAM,cAAA,GAAiB,QAAA;AAEvB,IAAM,cAAA,GAAyC,OAAO,MAAA,CAAO;AAAA,EAC3D,GAAA,EAAK,GAAA;AAAA,EACL,EAAA,EAAI,GAAA;AAAA,EACJ,EAAA,EAAI,GAAA;AAAA,EACJ,IAAA,EAAM,GAAA;AAAA,EACN,IAAA,EAAM,GAAA;AAAA,EACN,IAAA,EAAM,MAAA;AAAA,EACN,KAAA,EAAO,QAAA;AAAA,EACP,KAAA,EAAO,QAAA;AAAA,EACP,MAAA,EAAQ,QAAA;AAAA,EACR,IAAA,EAAM,MAAA;AAAA,EACN,GAAA,EAAK,MAAA;AAAA,EACL,KAAA,EAAO,QAAA;AAAA,EACP,KAAA,EAAO,MAAA;AAAA,EACP,KAAA,EAAO,MAAA;AAAA,EACP,KAAA,EAAO,QAAA;AAAA,EACP,KAAA,EAAO,QAAA;AAAA,EACP,KAAA,EAAO,QAAA;AAAA,EACP,KAAA,EAAO,QAAA;AAAA,EACP,IAAA,EAAM,QAAA;AAAA,EACN,MAAA,EAAQ,MAAA;AAAA,EACR,IAAA,EAAM;AACR,CAAC,CAAA;;;AC3kBM,SAAS,YAAA,CACd,SACA,SAAA,EACQ;AAER,EAAA,IAAI,CAAC,SAAA,IAAa,OAAO,SAAA,KAAc,QAAA,EAAU;AAC/C,IAAA,OAAO,SAAA,IAAa,EAAA;AAAA,EACtB;AAEA,EAAA,MAAM,OAAA,GAAU,UAAU,IAAA,EAAK;AAC/B,EAAA,IAAI,CAAC,OAAA,EAAS;AACZ,IAAA,OAAO,SAAA;AAAA,EACT;AAGA,EAAA,IAAI,CAAC,OAAA,EAAS;AACZ,IAAA,OAAO,yBAAyB,OAAO,CAAA;AAAA,EACzC;AAEA,EAAA,IAAI;AAEF,IAAA,MAAM,OAAO,OAAO,OAAA,KAAY,WAAW,IAAI,GAAA,CAAI,OAAO,CAAA,GAAI,OAAA;AAG9D,IAAA,IAAI,aAAA,CAAc,OAAO,CAAA,EAAG;AAC1B,MAAA,OAAO,yBAAyB,OAAO,CAAA;AAAA,IACzC;AAGA,IAAA,IAAI,OAAA,CAAQ,UAAA,CAAW,IAAI,CAAA,EAAG;AAC5B,MAAA,MAAM,QAAA,GAAW,KAAK,QAAA,IAAY,QAAA;AAClC,MAAA,OAAO,wBAAA,CAAyB,CAAA,EAAG,QAAQ,CAAA,EAAG,OAAO,CAAA,CAAE,CAAA;AAAA,IACzD;AAGA,IAAA,IAAI,OAAA,CAAQ,UAAA,CAAW,GAAG,CAAA,EAAG;AAC3B,MAAA,MAAM,SAAS,IAAA,CAAK,MAAA;AACpB,MAAA,OAAO,wBAAA,CAAyB,CAAA,EAAG,MAAM,CAAA,EAAG,OAAO,CAAA,CAAE,CAAA;AAAA,IACvD;AAIA,IAAA,MAAM,QAAA,GAAW,IAAI,GAAA,CAAI,OAAA,EAAS,IAAI,CAAA;AACtC,IAAA,OAAO,QAAA,CAAS,IAAA;AAAA,EAClB,CAAA,CAAA,MAAQ;AAEN,IAAA,OAAO,SAAA;AAAA,EACT;AACF;AAKA,SAAS,cAAc,GAAA,EAAsB;AAC3C,EAAA,IAAI;AAEF,IAAA,MAAM,MAAA,GAAS,IAAI,GAAA,CAAI,GAAG,CAAA;AAE1B,IAAA,OAAO,OAAA,CAAQ,MAAA,CAAO,QAAA,IAAY,MAAA,CAAO,IAAI,CAAA;AAAA,EAC/C,CAAA,CAAA,MAAQ;AACN,IAAA,OAAO,KAAA;AAAA,EACT;AACF;AAMA,SAAS,yBAAyB,GAAA,EAAqB;AACrD,EAAA,IAAI;AACF,IAAA,MAAM,MAAA,GAAS,IAAI,GAAA,CAAI,GAAG,CAAA;AAC1B,IAAA,OAAO,MAAA,CAAO,IAAA;AAAA,EAChB,CAAA,CAAA,MAAQ;AACN,IAAA,OAAO,GAAA;AAAA,EACT;AACF;AAkCO,SAAS,WAAA,CAAY,SAA0C,GAAA,EAAqB;AACzF,EAAA,IAAI,CAAC,GAAA,IAAO,CAAC,GAAA,CAAI,UAAA,CAAW,SAAS,CAAA,EAAG;AACtC,IAAA,OAAO,GAAA;AAAA,EACT;AAGA,EAAA,IAAI,OAAA,EAAS;AACX,IAAA,IAAI;AACF,MAAA,MAAM,OAAO,OAAO,OAAA,KAAY,WAAW,IAAI,GAAA,CAAI,OAAO,CAAA,GAAI,OAAA;AAC9D,MAAA,IAAI,IAAA,CAAK,aAAa,OAAA,EAAS;AAC7B,QAAA,OAAO,GAAA;AAAA,MACT;AAAA,IACF,CAAA,CAAA,MAAQ;AAAA,IAER;AAAA,EACF;AAGA,EAAA,OAAO,GAAA,CAAI,OAAA,CAAQ,QAAA,EAAU,QAAQ,CAAA;AACvC;AAaO,SAAS,iBAAA,CACd,SACA,SAAA,EACQ;AACR,EAAA,MAAM,UAAA,GAAa,YAAA,CAAa,OAAA,EAAS,SAAS,CAAA;AAClD,EAAA,OAAO,WAAA,CAAY,SAAS,UAAU,CAAA;AACxC;;;AC7LA,SAAS,WAAW,IAAA,EAAsB;AACxC,EAAA,OAAO,IAAA,CAAK,OAAA,CAAQ,6BAAA,EAA+B,IAAI,CAAA;AACzD;AAKA,SAASC,gBAAe,IAAA,EAAsB;AAE5C,EAAA,MAAM,QAAA,GAAmC;AAAA,IACvC,OAAA,EAAS,GAAA;AAAA,IACT,MAAA,EAAQ,GAAA;AAAA,IACR,MAAA,EAAQ,GAAA;AAAA,IACR,QAAA,EAAU,GAAA;AAAA,IACV,QAAA,EAAU,GAAA;AAAA,IACV,OAAA,EAAS;AAAA,GACX;AAEA,EAAA,IAAI,MAAA,GAAS,IAAA;AACb,EAAA,KAAA,MAAW,CAAC,MAAA,EAAQ,IAAI,KAAK,MAAA,CAAO,OAAA,CAAQ,QAAQ,CAAA,EAAG;AACrD,IAAA,MAAA,GAAS,OAAO,OAAA,CAAQ,IAAI,OAAO,MAAA,EAAQ,GAAG,GAAG,IAAI,CAAA;AAAA,EACvD;AAGA,EAAA,MAAA,GAAS,MAAA,CAAO,OAAA,CAAQ,WAAA,EAAa,CAAC,QAAQ,GAAA,KAAQ;AACpD,IAAA,OAAO,OAAO,YAAA,CAAa,MAAA,CAAO,QAAA,CAAS,GAAA,EAAK,EAAE,CAAC,CAAA;AAAA,EACrD,CAAC,CAAA;AACD,EAAA,MAAA,GAAS,MAAA,CAAO,OAAA,CAAQ,qBAAA,EAAuB,CAAC,QAAQ,GAAA,KAAQ;AAC9D,IAAA,OAAO,OAAO,YAAA,CAAa,MAAA,CAAO,QAAA,CAAS,GAAA,EAAK,EAAE,CAAC,CAAA;AAAA,EACrD,CAAC,CAAA;AAED,EAAA,OAAO,MAAA;AACT;AAKA,SAAS,oBAAoB,IAAA,EAAsB;AACjD,EAAA,OAAO,IAAA,CAAK,OAAA,CAAQ,MAAA,EAAQ,GAAG,EAAE,IAAA,EAAK;AACxC;AAKA,SAAS,UAAU,IAAA,EAAyC;AAC1D,EAAA,IAAI,CAAC,IAAA,EAAM;AACT,IAAA,OAAO,EAAA;AAAA,EACT;AACA,EAAA,OAAO,mBAAA,CAAoBA,eAAAA,CAAe,UAAA,CAAW,IAAI,CAAC,CAAC,CAAA;AAC7D;AAQO,SAAS,gBAAA,CACd,IAAA,EACA,IAAA,GAAkC,MAAA,EAC1B;AACR,EAAA,IAAI,CAAC,IAAA,EAAM;AACT,IAAA,OAAO,EAAA;AAAA,EACT;AAEA,EAAA,MAAM,WAAA,GAAA,CAAe,IAAA,IAAQ,MAAA,EAAQ,WAAA,GAAc,IAAA,EAAK;AAGxD,EAAA,IAAI,gBAAgB,MAAA,EAAQ;AAC1B,IAAA,OAAO,UAAU,IAAI,CAAA;AAAA,EACvB;AAIA,EAAA,IAAI,WAAA,KAAgB,MAAA,IAAU,WAAA,KAAgB,OAAA,EAAS;AACrD,IAAA,OAAO,mBAAA,CAAoB,UAAA,CAAW,IAAI,CAAC,CAAA;AAAA,EAC7C;AAGA,EAAA,OAAO,mBAAA,CAAoB,UAAA,CAAW,IAAI,CAAC,CAAA;AAC7C;;;AC7EO,SAAS,iBAAiB,UAAA,EAAsD;AACrF,EAAA,IAAI,CAAC,UAAA,IAAc,OAAO,UAAA,KAAe,QAAA,EAAU;AACjD,IAAA,OAAO,IAAA;AAAA,EACT;AAEA,EAAA,MAAM,OAAA,GAAU,WAAW,IAAA,EAAK;AAChC,EAAA,IAAI,CAAC,OAAA,EAAS;AACZ,IAAA,OAAO,IAAA;AAAA,EACT;AAEA,EAAA,IAAI;AAEF,IAAA,MAAM,IAAA,GAAO,IAAI,IAAA,CAAK,OAAO,CAAA;AAG7B,IAAA,IAAI,MAAA,CAAO,KAAA,CAAM,IAAA,CAAK,OAAA,EAAS,CAAA,EAAG;AAChC,MAAA,OAAO,IAAA;AAAA,IACT;AAGA,IAAA,OAAO,KAAK,WAAA,EAAY;AAAA,EAC1B,CAAA,CAAA,MAAQ;AACN,IAAA,OAAO,IAAA;AAAA,EACT;AACF;AAKO,SAAS,cAAc,UAAA,EAAsD;AAClF,EAAA,OAAO,iBAAiB,UAAU,CAAA;AACpC;;;ACrBA,SAAS,gBAAgB,OAAA,EAAqC;AAE5D,EAAA,IAAI,QAAA,GAAW,OAAA,CAAQ,aAAA,CAAc,SAAS,CAAA,EAAG,WAAA;AACjD,EAAA,IAAI,QAAA,EAAU;AACZ,IAAA,MAAM,MAAA,GAAS,cAAc,QAAQ,CAAA;AACrC,IAAA,IAAI,QAAQ,OAAO,MAAA;AAAA,EACrB;AAGA,EAAA,QAAA,GAAW,OAAA,CAAQ,aAAA,CAAc,UAAU,CAAA,EAAG,WAAA;AAC9C,EAAA,IAAI,QAAA,EAAU;AACZ,IAAA,MAAM,MAAA,GAAS,cAAc,QAAQ,CAAA;AACrC,IAAA,IAAI,QAAQ,OAAO,MAAA;AAAA,EACrB;AAGA,EAAA,QAAA,GAAW,OAAA,CAAQ,aAAA,CAAc,QAAQ,CAAA,EAAG,WAAA;AAC5C,EAAA,IAAI,QAAA,EAAU;AACZ,IAAA,MAAM,MAAA,GAAS,cAAc,QAAQ,CAAA;AACrC,IAAA,IAAI,QAAQ,OAAO,MAAA;AAAA,EACrB;AAGA,EAAA,MAAM,cAAA,GAAiB,QAAQ,QAAA,CAAS,MAAA,CAAO,CAAC,KAAA,KAAU,KAAA,CAAM,YAAY,SAAS,CAAA;AACrF,EAAA,IAAI,cAAA,CAAe,SAAS,CAAA,EAAG;AAC7B,IAAA,QAAA,GAAW,cAAA,CAAe,CAAC,CAAA,CAAE,WAAA;AAC7B,IAAA,IAAI,QAAA,EAAU;AACZ,MAAA,MAAM,MAAA,GAAS,cAAc,QAAQ,CAAA;AACrC,MAAA,IAAI,QAAQ,OAAO,MAAA;AAAA,IACrB;AAAA,EACF;AAEA,EAAA,OAAO,IAAA;AACT;AAKA,SAAS,cAAc,OAAA,EAAyC;AAC9D,EAAA,MAAM,IAAA,GAAO,OAAA,CAAQ,aAAA,CAAc,MAAM,CAAA,EAAG,WAAA;AAC5C,EAAA,IAAI,CAAC,IAAA,EAAM;AACT,IAAA,OAAO,IAAA;AAAA,EACT;AAEA,EAAA,MAAM,MAAA,GAAqB;AAAA,IACzB,IAAA,EAAM,UAAU,IAAI;AAAA,GACtB;AAEA,EAAA,MAAM,KAAA,GAAQ,OAAA,CAAQ,aAAA,CAAc,OAAO,CAAA,EAAG,WAAA;AAC9C,EAAA,IAAI,KAAA,EAAO;AACT,IAAA,MAAA,CAAO,KAAA,GAAQ,UAAU,KAAK,CAAA;AAAA,EAChC;AAEA,EAAA,MAAM,GAAA,GAAM,OAAA,CAAQ,aAAA,CAAc,KAAK,CAAA,EAAG,WAAA;AAC1C,EAAA,IAAI,GAAA,EAAK;AACP,IAAA,MAAA,CAAO,GAAA,GAAM,UAAU,GAAG,CAAA;AAAA,EAC5B;AAEA,EAAA,OAAO,MAAA;AACT;AAKA,SAAS,cAAA,CAAe,MAAmB,OAAA,EAA+B;AACxE,EAAA,MAAM,UAAwB,EAAC;AAC/B,EAAA,MAAM,QAAA,GAAW,IAAA,CAAK,gBAAA,CAAiB,OAAO,CAAA;AAE9C,EAAA,KAAA,MAAW,WAAW,QAAA,EAAU;AAC9B,IAAA,MAAM,MAAA,GAAS,cAAc,OAAO,CAAA;AACpC,IAAA,IAAI,MAAA,EAAQ;AACV,MAAA,OAAA,CAAQ,KAAK,MAAM,CAAA;AAAA,IACrB;AAAA,EACF;AAEA,EAAA,OAAO,OAAA;AACT;AAKA,SAAS,YAAY,OAAA,EAAuC;AAC1D,EAAA,MAAM,IAAA,GAAO,OAAA,CAAQ,YAAA,CAAa,MAAM,CAAA;AACxC,EAAA,IAAI,CAAC,IAAA,EAAM;AACT,IAAA,OAAO,IAAA;AAAA,EACT;AAEA,EAAA,MAAM,IAAA,GAAiB;AAAA,IACrB,IAAA,EAAM,UAAU,IAAI;AAAA,GACtB;AAEA,EAAA,MAAM,GAAA,GAAM,OAAA,CAAQ,YAAA,CAAa,KAAK,CAAA;AACtC,EAAA,IAAI,GAAA,EAAK;AACP,IAAA,IAAA,CAAK,GAAA,GAAM,UAAU,GAAG,CAAA;AAAA,EAC1B;AAEA,EAAA,MAAM,IAAA,GAAO,OAAA,CAAQ,YAAA,CAAa,MAAM,CAAA;AACxC,EAAA,IAAI,IAAA,EAAM;AACR,IAAA,IAAA,CAAK,IAAA,GAAO,UAAU,IAAI,CAAA;AAAA,EAC5B;AAEA,EAAA,MAAM,QAAA,GAAW,OAAA,CAAQ,YAAA,CAAa,UAAU,CAAA;AAChD,EAAA,IAAI,QAAA,EAAU;AACZ,IAAA,IAAA,CAAK,QAAA,GAAW,UAAU,QAAQ,CAAA;AAAA,EACpC;AAEA,EAAA,MAAM,KAAA,GAAQ,OAAA,CAAQ,YAAA,CAAa,OAAO,CAAA;AAC1C,EAAA,IAAI,KAAA,EAAO;AACT,IAAA,IAAA,CAAK,KAAA,GAAQ,UAAU,KAAK,CAAA;AAAA,EAC9B;AAEA,EAAA,MAAM,MAAA,GAAS,OAAA,CAAQ,YAAA,CAAa,QAAQ,CAAA;AAC5C,EAAA,IAAI,MAAA,EAAQ;AACV,IAAA,MAAM,SAAA,GAAY,MAAA,CAAO,QAAA,CAAS,MAAA,EAAQ,EAAE,CAAA;AAC5C,IAAA,IAAI,CAAC,MAAA,CAAO,KAAA,CAAM,SAAS,CAAA,EAAG;AAC5B,MAAA,IAAA,CAAK,MAAA,GAAS,SAAA;AAAA,IAChB;AAAA,EACF;AAEA,EAAA,OAAO,IAAA;AACT;AAKA,SAAS,aAAa,IAAA,EAA+B;AACnD,EAAA,MAAM,QAAoB,EAAC;AAC3B,EAAA,MAAM,QAAA,GAAW,IAAA,CAAK,gBAAA,CAAiB,MAAM,CAAA;AAE7C,EAAA,KAAA,MAAW,WAAW,QAAA,EAAU;AAC9B,IAAA,MAAM,IAAA,GAAO,YAAY,OAAO,CAAA;AAChC,IAAA,IAAI,IAAA,EAAM;AACR,MAAA,KAAA,CAAM,KAAK,IAAI,CAAA;AAAA,IACjB;AAAA,EACF;AAEA,EAAA,OAAO,KAAA;AACT;AAKA,SAAS,gBAAgB,OAAA,EAA2C;AAClE,EAAA,MAAM,IAAA,GAAO,OAAA,CAAQ,YAAA,CAAa,MAAM,CAAA;AACxC,EAAA,IAAI,CAAC,IAAA,EAAM;AACT,IAAA,OAAO,IAAA;AAAA,EACT;AAEA,EAAA,MAAM,QAAA,GAAyB;AAAA,IAC7B,IAAA,EAAM,UAAU,IAAI;AAAA,GACtB;AAEA,EAAA,MAAM,MAAA,GAAS,OAAA,CAAQ,YAAA,CAAa,QAAQ,CAAA;AAC5C,EAAA,IAAI,MAAA,EAAQ;AACV,IAAA,QAAA,CAAS,MAAA,GAAS,UAAU,MAAM,CAAA;AAAA,EACpC;AAEA,EAAA,MAAM,KAAA,GAAQ,OAAA,CAAQ,YAAA,CAAa,OAAO,CAAA;AAC1C,EAAA,IAAI,KAAA,EAAO;AACT,IAAA,QAAA,CAAS,KAAA,GAAQ,UAAU,KAAK,CAAA;AAAA,EAClC;AAEA,EAAA,OAAO,QAAA;AACT;AAKA,SAAS,kBAAkB,IAAA,EAAmC;AAC5D,EAAA,MAAM,aAA6B,EAAC;AACpC,EAAA,MAAM,QAAA,GAAW,IAAA,CAAK,gBAAA,CAAiB,UAAU,CAAA;AAEjD,EAAA,KAAA,MAAW,WAAW,QAAA,EAAU;AAC9B,IAAA,MAAM,QAAA,GAAW,gBAAgB,OAAO,CAAA;AACxC,IAAA,IAAI,QAAA,EAAU;AACZ,MAAA,UAAA,CAAW,KAAK,QAAQ,CAAA;AAAA,IAC1B;AAAA,EACF;AAEA,EAAA,OAAO,UAAA;AACT;AAKA,SAASC,gBAAe,IAAA,EAA4C;AAClE,EAAA,MAAM,OAAA,GAAU,IAAA,CAAK,aAAA,CAAc,SAAS,CAAA;AAC5C,EAAA,IAAI,CAAC,OAAA,EAAS;AACZ,IAAA,OAAO,MAAA;AAAA,EACT;AAEA,EAAA,MAAM,IAAA,GAAO,OAAA,CAAQ,YAAA,CAAa,MAAM,CAAA;AACxC,EAAA,MAAM,GAAA,GAAM,OAAA,CAAQ,YAAA,CAAa,KAAK,CAAA;AACtC,EAAA,MAAM,OAAO,OAAA,CAAQ,WAAA;AAErB,EAAA,IAAI,CAAC,IAAA,IAAQ,CAAC,GAAA,EAAK;AACjB,IAAA,OAAO,MAAA;AAAA,EACT;AAEA,EAAA,MAAM,OAAA,GAAuB;AAAA,IAC3B,KAAA,EAAO,IAAA,GAAO,gBAAA,CAAiB,IAAA,EAAM,IAAI,CAAA,GAAI;AAAA,GAC/C;AAEA,EAAA,IAAI,IAAA,EAAM;AACR,IAAA,OAAA,CAAQ,IAAA,GAAO,UAAU,IAAI,CAAA;AAAA,EAC/B;AAEA,EAAA,IAAI,GAAA,EAAK;AACP,IAAA,OAAA,CAAQ,GAAA,GAAM,UAAU,GAAG,CAAA;AAAA,EAC7B;AAEA,EAAA,OAAO,OAAA;AACT;AAKA,SAAS,kBAAA,CAAmB,MAAmB,OAAA,EAAqC;AAClF,EAAA,MAAM,OAAA,GAAU,IAAA,CAAK,aAAA,CAAc,OAAO,CAAA;AAC1C,EAAA,IAAI,CAAC,OAAA,EAAS;AACZ,IAAA,OAAO,MAAA;AAAA,EACT;AAEA,EAAA,MAAM,OAAO,OAAA,CAAQ,WAAA;AACrB,EAAA,MAAM,IAAA,GAAO,OAAA,CAAQ,YAAA,CAAa,MAAM,CAAA;AAExC,EAAA,OAAO,IAAA,GAAO,gBAAA,CAAiB,IAAA,EAAM,IAAI,CAAA,GAAI,MAAA;AAC/C;AAKO,SAAS,aAAa,YAAA,EAAsC;AAEjE,EAAA,MAAM,EAAA,GAAK,YAAA,CAAa,aAAA,CAAc,IAAI,CAAA,EAAG,WAAA;AAC7C,EAAA,IAAI,CAAC,EAAA,EAAI;AACP,IAAA,MAAM,IAAI,MAAM,mDAAmD,CAAA;AAAA,EACrE;AAEA,EAAA,MAAM,KAAA,GAAQ,kBAAA,CAAmB,YAAA,EAAc,OAAO,CAAA;AACtD,EAAA,IAAI,CAAC,KAAA,EAAO;AACV,IAAA,MAAM,IAAI,MAAM,sDAAsD,CAAA;AAAA,EACxE;AAEA,EAAA,MAAM,OAAA,GAAU,gBAAgB,YAAY,CAAA;AAC5C,EAAA,IAAI,CAAC,OAAA,EAAS;AACZ,IAAA,MAAM,IAAI,KAAA;AAAA,MACR;AAAA,KACF;AAAA,EACF;AAEA,EAAA,MAAM,KAAA,GAAmB;AAAA,IACvB,EAAA,EAAI,UAAU,EAAE,CAAA;AAAA,IAChB,KAAA;AAAA,IACA;AAAA,GACF;AAGA,EAAA,MAAM,OAAA,GAAU,cAAA,CAAe,YAAA,EAAc,QAAQ,CAAA;AACrD,EAAA,IAAI,OAAA,CAAQ,SAAS,CAAA,EAAG;AACtB,IAAA,KAAA,CAAM,OAAA,GAAU,OAAA;AAAA,EAClB;AAEA,EAAA,MAAM,OAAA,GAAUA,gBAAe,YAAY,CAAA;AAC3C,EAAA,IAAI,OAAA,EAAS;AACX,IAAA,KAAA,CAAM,OAAA,GAAU,OAAA;AAAA,EAClB;AAEA,EAAA,MAAM,KAAA,GAAQ,aAAa,YAAY,CAAA;AACvC,EAAA,IAAI,KAAA,CAAM,SAAS,CAAA,EAAG;AACpB,IAAA,KAAA,CAAM,KAAA,GAAQ,KAAA;AAAA,EAChB;AAEA,EAAA,MAAM,OAAA,GAAU,kBAAA,CAAmB,YAAA,EAAc,SAAS,CAAA;AAC1D,EAAA,IAAI,OAAA,EAAS;AACX,IAAA,KAAA,CAAM,OAAA,GAAU,OAAA;AAAA,EAClB;AAEA,EAAA,MAAM,UAAA,GAAa,kBAAkB,YAAY,CAAA;AACjD,EAAA,IAAI,UAAA,CAAW,SAAS,CAAA,EAAG;AACzB,IAAA,KAAA,CAAM,UAAA,GAAa,UAAA;AAAA,EACrB;AAEA,EAAA,MAAM,YAAA,GAAe,cAAA,CAAe,YAAA,EAAc,aAAa,CAAA;AAC/D,EAAA,IAAI,YAAA,CAAa,SAAS,CAAA,EAAG;AAC3B,IAAA,KAAA,CAAM,YAAA,GAAe,YAAA;AAAA,EACvB;AAEA,EAAA,MAAM,YAAA,GAAe,YAAA,CAAa,aAAA,CAAc,WAAW,CAAA,EAAG,WAAA;AAC9D,EAAA,IAAI,YAAA,EAAc;AAChB,IAAA,MAAM,SAAA,GAAY,cAAc,YAAY,CAAA;AAC5C,IAAA,IAAI,SAAA,EAAW;AACb,MAAA,KAAA,CAAM,SAAA,GAAY,SAAA;AAAA,IACpB;AAAA,EACF;AAEA,EAAA,MAAM,MAAA,GAAS,kBAAA,CAAmB,YAAA,EAAc,QAAQ,CAAA;AACxD,EAAA,IAAI,MAAA,EAAQ;AACV,IAAA,KAAA,CAAM,MAAA,GAAS,MAAA;AAAA,EACjB;AAGA,EAAA,MAAM,MAAA,GAAS,YAAA,CAAa,aAAA,CAAc,QAAQ,CAAA;AAClD,EAAA,IAAI,MAAA,EAAQ;AACV,IAAA,MAAM,aAAgC,EAAC;AAEvC,IAAA,MAAM,QAAA,GAAW,MAAA,CAAO,aAAA,CAAc,IAAI,CAAA,EAAG,WAAA;AAC7C,IAAA,IAAI,QAAA,EAAU;AACZ,MAAA,UAAA,CAAW,EAAA,GAAK,UAAU,QAAQ,CAAA;AAAA,IACpC;AAEA,IAAA,MAAM,WAAA,GAAc,kBAAA,CAAmB,MAAA,EAAQ,OAAO,CAAA;AACtD,IAAA,IAAI,WAAA,EAAa;AACf,MAAA,UAAA,CAAW,KAAA,GAAQ,WAAA;AAAA,IACrB;AAEA,IAAA,MAAM,gBAAA,GAAmB,MAAA,CAAO,aAAA,CAAc,SAAS,CAAA,EAAG,WAAA;AAC1D,IAAA,IAAI,gBAAA,EAAkB;AACpB,MAAA,MAAM,aAAA,GAAgB,cAAc,gBAAgB,CAAA;AACpD,MAAA,IAAI,aAAA,EAAe;AACjB,QAAA,UAAA,CAAW,OAAA,GAAU,aAAA;AAAA,MACvB;AAAA,IACF;AAEA,IAAA,IAAI,MAAA,CAAO,IAAA,CAAK,UAAU,CAAA,CAAE,SAAS,CAAA,EAAG;AACtC,MAAA,KAAA,CAAM,MAAA,GAAS,UAAA;AAAA,IACjB;AAAA,EACF;AAEA,EAAA,OAAO,KAAA;AACT;;;AChUA,SAAS,eAAe,GAAA,EAAqB;AAC3C,EAAA,OAAO,GAAA,CAAI,OAAA,CAAQ,kBAAA,EAAoB,EAAE,CAAA;AAC3C;AAKO,SAAS,aAAa,GAAA,EAA0B;AACrD,EAAA,MAAM,eAAA,GAAkB,eAAe,GAAG,CAAA;AAC1C,EAAA,MAAM,EAAE,IAAA,EAAM,UAAA,EAAY,QAAA,EAAS,GAAI,aAAa,eAAe,CAAA;AACnE,EAAA,MAAM,OAAO,YAAA,CAAa,UAAA,EAAY,CAAA,EAAG,IAAA,EAAM,QAAQ,CAAA,CAAE,OAAA;AACzD,EAAA,OAAO,IAAA;AACT;AAKA,SAAS,aAAa,IAAA,EAA+D;AACnF,EAAA,MAAM,QAAA,uBAAe,GAAA,EAAoB;AACzC,EAAA,IAAI,OAAA,GAAU,CAAA;AAEd,EAAA,MAAM,YAAY,IAAA,CAAK,OAAA,CAAQ,6BAAA,EAA+B,CAAC,QAAQ,OAAA,KAAY;AACjF,IAAA,MAAM,WAAA,GAAc,WAAW,OAAO,CAAA,EAAA,CAAA;AACtC,IAAA,QAAA,CAAS,GAAA,CAAI,aAAa,OAAO,CAAA;AACjC,IAAA,OAAA,EAAA;AACA,IAAA,OAAO,WAAA;AAAA,EACT,CAAC,CAAA;AAED,EAAA,OAAO,EAAE,IAAA,EAAM,SAAA,EAAW,QAAA,EAAS;AACrC;AAKA,SAAS,YAAA,CAAa,MAAc,QAAA,EAAuC;AACzE,EAAA,IAAI,MAAA,GAAS,IAAA;AACb,EAAA,KAAA,MAAW,CAAC,WAAA,EAAa,OAAO,CAAA,IAAK,QAAA,CAAS,SAAQ,EAAG;AACvD,IAAA,MAAA,GAAS,MAAA,CAAO,OAAA,CAAQ,WAAA,EAAa,OAAO,CAAA;AAAA,EAC9C;AACA,EAAA,OAAO,MAAA;AACT;AAKA,SAAS,gBAAgB,UAAA,EAA4C;AACnE,EAAA,MAAM,aAAqC,EAAC;AAC5C,EAAA,MAAM,SAAA,GAAY,yBAAA;AAClB,EAAA,IAAI,KAAA,GAAgC,SAAA,CAAU,IAAA,CAAK,UAAU,CAAA;AAE7D,EAAA,OAAO,UAAU,IAAA,EAAM;AACrB,IAAA,UAAA,CAAW,KAAA,CAAM,CAAC,CAAC,CAAA,GAAI,MAAM,CAAC,CAAA;AAC9B,IAAA,KAAA,GAAQ,SAAA,CAAU,KAAK,UAAU,CAAA;AAAA,EACnC;AAEA,EAAA,OAAO,UAAA;AACT;AAKA,SAAS,cAAA,CAAe,GAAA,EAAa,OAAA,EAAiB,QAAA,EAA0B;AAC9E,EAAA,MAAM,OAAA,GAAU,IAAI,OAAO,CAAA,CAAA;AAC3B,EAAA,MAAM,QAAA,GAAW,KAAK,OAAO,CAAA,CAAA,CAAA;AAC7B,EAAA,IAAI,KAAA,GAAQ,CAAA;AACZ,EAAA,IAAI,GAAA,GAAM,QAAA;AAEV,EAAA,OAAO,GAAA,GAAM,GAAA,CAAI,MAAA,IAAU,KAAA,GAAQ,CAAA,EAAG;AACpC,IAAA,MAAM,QAAA,GAAW,GAAA,CAAI,OAAA,CAAQ,OAAA,EAAS,GAAG,CAAA;AACzC,IAAA,MAAM,SAAA,GAAY,GAAA,CAAI,OAAA,CAAQ,QAAA,EAAU,GAAG,CAAA;AAE3C,IAAA,IAAI,cAAc,EAAA,EAAI;AACpB,MAAA,OAAO,EAAA;AAAA,IACT;AAEA,IAAA,IAAI,QAAA,KAAa,EAAA,IAAM,QAAA,GAAW,SAAA,EAAW;AAE3C,MAAA,KAAA,EAAA;AACA,MAAA,GAAA,GAAM,WAAW,OAAA,CAAQ,MAAA;AAAA,IAC3B,CAAA,MAAO;AAEL,MAAA,KAAA,EAAA;AACA,MAAA,IAAI,UAAU,CAAA,EAAG;AACf,QAAA,OAAO,SAAA;AAAA,MACT;AACA,MAAA,GAAA,GAAM,YAAY,QAAA,CAAS,MAAA;AAAA,IAC7B;AAAA,EACF;AAEA,EAAA,OAAO,EAAA;AACT;AAKA,SAAS,YAAA,CACP,GAAA,EACA,QAAA,EACA,MAAA,GAA6B,MAC7B,QAAA,EAC0C;AAE1C,EAAA,MAAM,YAAA,GAAe,GAAA,CAAI,OAAA,CAAQ,GAAA,EAAK,QAAQ,CAAA;AAC9C,EAAA,IAAI,iBAAiB,EAAA,EAAI;AACvB,IAAA,MAAM,IAAI,MAAM,sBAAsB,CAAA;AAAA,EACxC;AAEA,EAAA,MAAM,UAAA,GAAa,GAAA,CAAI,OAAA,CAAQ,GAAA,EAAK,YAAY,CAAA;AAChD,EAAA,IAAI,eAAe,EAAA,EAAI;AACrB,IAAA,MAAM,IAAI,MAAM,sBAAsB,CAAA;AAAA,EACxC;AAEA,EAAA,MAAM,cAAA,GAAiB,GAAA,CAAI,SAAA,CAAU,YAAA,GAAe,GAAG,UAAU,CAAA;AAGjE,EAAA,MAAM,aAAA,GAAgB,cAAA,CAAe,QAAA,CAAS,GAAG,CAAA;AACjD,EAAA,MAAM,UAAA,GAAa,gBAAgB,cAAA,CAAe,KAAA,CAAM,GAAG,EAAE,CAAA,CAAE,MAAK,GAAI,cAAA;AAGxE,EAAA,MAAM,UAAA,GAAa,UAAA,CAAW,OAAA,CAAQ,GAAG,CAAA;AACzC,EAAA,MAAM,UAAU,UAAA,KAAe,EAAA,GAAK,aAAa,UAAA,CAAW,SAAA,CAAU,GAAG,UAAU,CAAA;AACnF,EAAA,MAAM,UAAA,GAAa,eAAe,EAAA,GAAK,KAAK,eAAA,CAAgB,UAAA,CAAW,SAAA,CAAU,UAAU,CAAC,CAAA;AAE5F,EAAA,MAAM,OAAA,GAAuB;AAAA,IAC3B,OAAA;AAAA,IACA,UAAA;AAAA,IACA,IAAA,EAAM,EAAA;AAAA,IACN,UAAU,EAAC;AAAA,IACX,MAAA;AAAA,IACA,aAAA,EAAe,CAAC,QAAA,KAAqB,aAAA,CAAc,SAAwB,QAAQ,CAAA;AAAA,IACnF,gBAAA,EAAkB,CAAC,QAAA,KAAqB,gBAAA,CAAiB,SAAwB,QAAQ,CAAA;AAAA,IACzF,cAAc,CAAC,IAAA,KAAiB,OAAA,CAAQ,UAAA,CAAW,IAAI,CAAA,IAAK,IAAA;AAAA,IAC5D,IAAI,WAAA,GAAc;AAChB,MAAA,OAAO,OAAA,CAAQ,IAAA;AAAA,IACjB;AAAA,GACF;AAGA,EAAA,IAAI,aAAA,EAAe;AACjB,IAAA,OAAO;AAAA,MACL,OAAA;AAAA,MACA,QAAQ,UAAA,GAAa;AAAA,KACvB;AAAA,EACF;AAGA,EAAA,MAAM,eAAA,GAAkB,cAAA,CAAe,GAAA,EAAK,OAAA,EAAS,aAAa,CAAC,CAAA;AACnE,EAAA,IAAI,oBAAoB,EAAA,EAAI;AAC1B,IAAA,MAAM,IAAI,KAAA,CAAM,CAAA,0BAAA,EAA6B,OAAO,CAAA,CAAA,CAAG,CAAA;AAAA,EACzD;AAGA,EAAA,MAAM,eAAe,UAAA,GAAa,CAAA;AAClC,EAAA,MAAM,OAAA,GAAU,GAAA,CAAI,SAAA,CAAU,YAAA,EAAc,eAAe,CAAA;AAG3D,EAAA,MAAM,WAA0B,EAAC;AACjC,EAAA,MAAM,YAAsB,EAAC;AAC7B,EAAA,IAAI,GAAA,GAAM,CAAA;AAEV,EAAA,OAAO,GAAA,GAAM,QAAQ,MAAA,EAAQ;AAC3B,IAAA,MAAM,YAAA,GAAe,OAAA,CAAQ,OAAA,CAAQ,GAAA,EAAK,GAAG,CAAA;AAE7C,IAAA,IAAI,iBAAiB,EAAA,EAAI;AAEvB,MAAA,SAAA,CAAU,IAAA,CAAK,OAAA,CAAQ,SAAA,CAAU,GAAG,CAAC,CAAA;AACrC,MAAA;AAAA,IACF;AAGA,IAAA,IAAI,eAAe,GAAA,EAAK;AACtB,MAAA,SAAA,CAAU,IAAA,CAAK,OAAA,CAAQ,SAAA,CAAU,GAAA,EAAK,YAAY,CAAC,CAAA;AAAA,IACrD;AAGA,IAAA,IAAI,OAAA,CAAQ,eAAe,CAAC,CAAA,KAAM,OAAO,OAAA,CAAQ,YAAA,GAAe,CAAC,CAAA,KAAM,GAAA,EAAK;AAE1E,MAAA,MAAM,MAAA,GAAS,OAAA,CAAQ,OAAA,CAAQ,GAAA,EAAK,YAAY,CAAA;AAChD,MAAA,IAAI,WAAW,EAAA,EAAI;AACjB,QAAA,GAAA,GAAM,MAAA,GAAS,CAAA;AAAA,MACjB,CAAA,MAAO;AACL,QAAA;AAAA,MACF;AACA,MAAA;AAAA,IACF;AAGA,IAAA,IAAI;AACF,MAAA,MAAM,EAAE,OAAA,EAAS,YAAA,EAAc,MAAA,EAAO,GAAI,YAAA;AAAA,QACxC,GAAA;AAAA,QACA,YAAA,GAAe,YAAA;AAAA,QACf,OAAA;AAAA,QACA;AAAA,OACF;AACA,MAAA,QAAA,CAAS,KAAK,YAAY,CAAA;AAC1B,MAAA,GAAA,GAAM,MAAA,GAAS,YAAA;AAAA,IACjB,CAAA,CAAA,MAAQ;AAEN,MAAA,GAAA,GAAM,YAAA,GAAe,CAAA;AAAA,IACvB;AAAA,EACF;AAGA,EAAA,MAAM,OAAA,GAAU,SAAA,CAAU,IAAA,CAAK,EAAE,EAAE,IAAA,EAAK;AACxC,EAAA,MAAM,YAAA,GAAe,YAAA,CAAa,OAAA,EAAS,QAAQ,CAAA;AACnD,EAAA,OAAA,CAAQ,IAAA,GAAO,YAAA;AACf,EAAA,OAAA,CAAQ,QAAA,GAAW,QAAA;AAEnB,EAAA,MAAM,aAAA,GAAgB,eAAA,GAAkB,CAAA,EAAA,EAAK,OAAO,CAAA,CAAA,CAAA,CAAI,MAAA;AAExD,EAAA,OAAO;AAAA,IACL,OAAA;AAAA,IACA,MAAA,EAAQ;AAAA,GACV;AACF;AAKA,SAAS,aAAA,CAAc,SAAsB,QAAA,EAAsC;AAEjF,EAAA,KAAA,MAAW,KAAA,IAAS,QAAQ,QAAA,EAAU;AACpC,IAAA,IAAI,KAAA,CAAM,YAAY,QAAA,EAAU;AAC9B,MAAA,OAAO,KAAA;AAAA,IACT;AAAA,EACF;AAGA,EAAA,KAAA,MAAW,KAAA,IAAS,QAAQ,QAAA,EAAU;AACpC,IAAA,MAAM,MAAA,GAAS,aAAA,CAAc,KAAA,EAAO,QAAQ,CAAA;AAC5C,IAAA,IAAI,MAAA,EAAQ;AACV,MAAA,OAAO,MAAA;AAAA,IACT;AAAA,EACF;AAEA,EAAA,OAAO,IAAA;AACT;AAKA,SAAS,gBAAA,CAAiB,SAAsB,QAAA,EAAiC;AAC/E,EAAA,MAAM,UAAyB,EAAC;AAGhC,EAAA,KAAA,MAAW,KAAA,IAAS,QAAQ,QAAA,EAAU;AACpC,IAAA,IAAI,KAAA,CAAM,YAAY,QAAA,EAAU;AAC9B,MAAA,OAAA,CAAQ,KAAK,KAAK,CAAA;AAAA,IACpB;AAAA,EACF;AAIA,EAAA,KAAA,MAAW,KAAA,IAAS,QAAQ,QAAA,EAAU;AACpC,IAAA,MAAM,YAAA,GAAe,gBAAA,CAAiB,KAAA,EAAO,QAAQ,CAAA;AACrD,IAAA,KAAA,MAAW,eAAe,YAAA,EAAc;AACtC,MAAA,IAAI,CAAC,OAAA,CAAQ,QAAA,CAAS,WAAW,CAAA,EAAG;AAClC,QAAA,OAAA,CAAQ,KAAK,WAAW,CAAA;AAAA,MAC1B;AAAA,IACF;AAAA,EACF;AAEA,EAAA,OAAO,OAAA;AACT;AAKO,SAAS,SAAS,GAAA,EAA0B;AAEjD,EAAA,MAAM,UAAU,GAAA,CAAI,OAAA,CAAQ,cAAA,EAAgB,EAAE,EAAE,IAAA,EAAK;AACrD,EAAA,OAAO,aAAa,OAAO,CAAA;AAC7B;;;ACjSA,SAASC,iBAAgB,OAAA,EAAqD;AAE5E,EAAA,IAAI,QAAA,GAAW,OAAA,CAAQ,aAAA,CAAc,SAAS,CAAA,EAAG,WAAA;AACjD,EAAA,IAAI,QAAA,EAAU;AACZ,IAAA,MAAM,MAAA,GAAS,cAAc,QAAQ,CAAA;AACrC,IAAA,IAAI,QAAQ,OAAO,MAAA;AAAA,EACrB;AAGA,EAAA,QAAA,GAAW,OAAA,CAAQ,aAAA,CAAc,UAAU,CAAA,EAAG,WAAA;AAC9C,EAAA,IAAI,QAAA,EAAU;AACZ,IAAA,MAAM,MAAA,GAAS,cAAc,QAAQ,CAAA;AACrC,IAAA,IAAI,QAAQ,OAAO,MAAA;AAAA,EACrB;AAGA,EAAA,QAAA,GAAW,OAAA,CAAQ,aAAA,CAAc,QAAQ,CAAA,EAAG,WAAA;AAC5C,EAAA,IAAI,QAAA,EAAU;AACZ,IAAA,MAAM,MAAA,GAAS,cAAc,QAAQ,CAAA;AACrC,IAAA,IAAI,QAAQ,OAAO,MAAA;AAAA,EACrB;AAGA,EAAA,MAAM,cAAA,GAAiB,QAAQ,QAAA,CAAS,MAAA,CAAO,CAAC,KAAA,KAAU,KAAA,CAAM,YAAY,SAAS,CAAA;AACrF,EAAA,IAAI,cAAA,CAAe,SAAS,CAAA,EAAG;AAC7B,IAAA,QAAA,GAAW,cAAA,CAAe,CAAC,CAAA,CAAE,WAAA;AAC7B,IAAA,IAAI,QAAA,EAAU;AACZ,MAAA,MAAM,MAAA,GAAS,cAAc,QAAQ,CAAA;AACrC,MAAA,IAAI,QAAQ,OAAO,MAAA;AAAA,IACrB;AAAA,EACF;AAEA,EAAA,OAAO,IAAA;AACT;AAKA,SAASC,eAAc,OAAA,EAAyD;AAC9E,EAAA,MAAM,IAAA,GAAO,OAAA,CAAQ,aAAA,CAAc,MAAM,CAAA,EAAG,WAAA;AAC5C,EAAA,IAAI,CAAC,IAAA,EAAM;AACT,IAAA,OAAO,IAAA;AAAA,EACT;AAEA,EAAA,MAAM,MAAA,GAAqB;AAAA,IACzB,IAAA,EAAM,UAAU,IAAI;AAAA,GACtB;AAEA,EAAA,MAAM,KAAA,GAAQ,OAAA,CAAQ,aAAA,CAAc,OAAO,CAAA,EAAG,WAAA;AAC9C,EAAA,IAAI,KAAA,EAAO;AACT,IAAA,MAAA,CAAO,KAAA,GAAQ,UAAU,KAAK,CAAA;AAAA,EAChC;AAEA,EAAA,MAAM,GAAA,GAAM,OAAA,CAAQ,aAAA,CAAc,KAAK,CAAA,EAAG,WAAA;AAC1C,EAAA,IAAI,GAAA,EAAK;AACP,IAAA,MAAA,CAAO,GAAA,GAAM,UAAU,GAAG,CAAA;AAAA,EAC5B;AAEA,EAAA,OAAO,MAAA;AACT;AAKA,SAASC,eAAAA,CAAe,MAAmC,OAAA,EAA+B;AACxF,EAAA,MAAM,UAAwB,EAAC;AAC/B,EAAA,MAAM,QAAA,GAAW,IAAA,CAAK,gBAAA,CAAiB,OAAO,CAAA;AAE9C,EAAA,KAAA,MAAW,WAAW,QAAA,EAAU;AAC9B,IAAA,MAAM,MAAA,GAASD,eAAc,OAAO,CAAA;AACpC,IAAA,IAAI,MAAA,EAAQ;AACV,MAAA,OAAA,CAAQ,KAAK,MAAM,CAAA;AAAA,IACrB;AAAA,EACF;AAEA,EAAA,OAAO,OAAA;AACT;AAKA,SAASE,aAAY,OAAA,EAAuD;AAC1E,EAAA,MAAM,IAAA,GAAO,OAAA,CAAQ,YAAA,CAAa,MAAM,CAAA;AACxC,EAAA,IAAI,CAAC,IAAA,EAAM;AACT,IAAA,OAAO,IAAA;AAAA,EACT;AAEA,EAAA,MAAM,IAAA,GAAiB;AAAA,IACrB,IAAA,EAAM,UAAU,IAAI;AAAA,GACtB;AAEA,EAAA,MAAM,GAAA,GAAM,OAAA,CAAQ,YAAA,CAAa,KAAK,CAAA;AACtC,EAAA,IAAI,GAAA,EAAK;AACP,IAAA,IAAA,CAAK,GAAA,GAAM,UAAU,GAAG,CAAA;AAAA,EAC1B;AAEA,EAAA,MAAM,IAAA,GAAO,OAAA,CAAQ,YAAA,CAAa,MAAM,CAAA;AACxC,EAAA,IAAI,IAAA,EAAM;AACR,IAAA,IAAA,CAAK,IAAA,GAAO,UAAU,IAAI,CAAA;AAAA,EAC5B;AAEA,EAAA,MAAM,QAAA,GAAW,OAAA,CAAQ,YAAA,CAAa,UAAU,CAAA;AAChD,EAAA,IAAI,QAAA,EAAU;AACZ,IAAA,IAAA,CAAK,QAAA,GAAW,UAAU,QAAQ,CAAA;AAAA,EACpC;AAEA,EAAA,MAAM,KAAA,GAAQ,OAAA,CAAQ,YAAA,CAAa,OAAO,CAAA;AAC1C,EAAA,IAAI,KAAA,EAAO;AACT,IAAA,IAAA,CAAK,KAAA,GAAQ,UAAU,KAAK,CAAA;AAAA,EAC9B;AAEA,EAAA,MAAM,MAAA,GAAS,OAAA,CAAQ,YAAA,CAAa,QAAQ,CAAA;AAC5C,EAAA,IAAI,MAAA,EAAQ;AACV,IAAA,MAAM,SAAA,GAAY,MAAA,CAAO,QAAA,CAAS,MAAA,EAAQ,EAAE,CAAA;AAC5C,IAAA,IAAI,CAAC,MAAA,CAAO,KAAA,CAAM,SAAS,CAAA,EAAG;AAC5B,MAAA,IAAA,CAAK,MAAA,GAAS,SAAA;AAAA,IAChB;AAAA,EACF;AAEA,EAAA,OAAO,IAAA;AACT;AAKA,SAASC,cAAa,IAAA,EAA+C;AACnE,EAAA,MAAM,QAAoB,EAAC;AAC3B,EAAA,MAAM,QAAA,GAAW,IAAA,CAAK,gBAAA,CAAiB,MAAM,CAAA;AAE7C,EAAA,KAAA,MAAW,WAAW,QAAA,EAAU;AAC9B,IAAA,MAAM,IAAA,GAAOD,aAAY,OAAO,CAAA;AAChC,IAAA,IAAI,IAAA,EAAM;AACR,MAAA,KAAA,CAAM,KAAK,IAAI,CAAA;AAAA,IACjB;AAAA,EACF;AAEA,EAAA,OAAO,KAAA;AACT;AAKA,SAASE,iBAAgB,OAAA,EAA2D;AAClF,EAAA,MAAM,IAAA,GAAO,OAAA,CAAQ,YAAA,CAAa,MAAM,CAAA;AACxC,EAAA,IAAI,CAAC,IAAA,EAAM;AACT,IAAA,OAAO,IAAA;AAAA,EACT;AAEA,EAAA,MAAM,QAAA,GAAyB;AAAA,IAC7B,IAAA,EAAM,UAAU,IAAI;AAAA,GACtB;AAEA,EAAA,MAAM,MAAA,GAAS,OAAA,CAAQ,YAAA,CAAa,QAAQ,CAAA;AAC5C,EAAA,IAAI,MAAA,EAAQ;AACV,IAAA,QAAA,CAAS,MAAA,GAAS,UAAU,MAAM,CAAA;AAAA,EACpC;AAEA,EAAA,MAAM,KAAA,GAAQ,OAAA,CAAQ,YAAA,CAAa,OAAO,CAAA;AAC1C,EAAA,IAAI,KAAA,EAAO;AACT,IAAA,QAAA,CAAS,KAAA,GAAQ,UAAU,KAAK,CAAA;AAAA,EAClC;AAEA,EAAA,OAAO,QAAA;AACT;AAKA,SAASC,mBAAkB,IAAA,EAAmD;AAC5E,EAAA,MAAM,aAA6B,EAAC;AACpC,EAAA,MAAM,QAAA,GAAW,IAAA,CAAK,gBAAA,CAAiB,UAAU,CAAA;AAEjD,EAAA,KAAA,MAAW,WAAW,QAAA,EAAU;AAC9B,IAAA,MAAM,QAAA,GAAWD,iBAAgB,OAAO,CAAA;AACxC,IAAA,IAAI,QAAA,EAAU;AACZ,MAAA,UAAA,CAAW,KAAK,QAAQ,CAAA;AAAA,IAC1B;AAAA,EACF;AAEA,EAAA,OAAO,UAAA;AACT;AAKA,SAAS,iBAAiB,IAAA,EAAyD;AACjF,EAAA,MAAM,OAAA,GAAU,IAAA,CAAK,aAAA,CAAc,WAAW,CAAA;AAC9C,EAAA,IAAI,CAAC,OAAA,EAAS;AACZ,IAAA,OAAO,IAAA;AAAA,EACT;AAEA,EAAA,MAAM,QAAQ,OAAA,CAAQ,WAAA;AACtB,EAAA,IAAI,CAAC,KAAA,EAAO;AACV,IAAA,OAAO,IAAA;AAAA,EACT;AAEA,EAAA,MAAM,SAAA,GAA2B;AAAA,IAC/B,KAAA,EAAO,UAAU,KAAK;AAAA,GACxB;AAEA,EAAA,MAAM,GAAA,GAAM,OAAA,CAAQ,YAAA,CAAa,KAAK,CAAA;AACtC,EAAA,IAAI,GAAA,EAAK;AACP,IAAA,SAAA,CAAU,GAAA,GAAM,UAAU,GAAG,CAAA;AAAA,EAC/B;AAEA,EAAA,MAAM,OAAA,GAAU,OAAA,CAAQ,YAAA,CAAa,SAAS,CAAA;AAC9C,EAAA,IAAI,OAAA,EAAS;AACX,IAAA,SAAA,CAAU,OAAA,GAAU,UAAU,OAAO,CAAA;AAAA,EACvC;AAEA,EAAA,OAAO,SAAA;AACT;AAKA,SAASE,mBAAAA,CACP,MACA,OAAA,EACoB;AACpB,EAAA,MAAM,OAAA,GAAU,IAAA,CAAK,aAAA,CAAc,OAAO,CAAA;AAC1C,EAAA,IAAI,CAAC,OAAA,EAAS;AACZ,IAAA,OAAO,MAAA;AAAA,EACT;AAEA,EAAA,MAAM,OAAO,OAAA,CAAQ,WAAA;AACrB,EAAA,MAAM,IAAA,GAAO,OAAA,CAAQ,YAAA,CAAa,MAAM,CAAA;AAExC,EAAA,OAAO,IAAA,GAAO,gBAAA,CAAiB,IAAA,EAAM,IAAI,CAAA,GAAI,MAAA;AAC/C;AAKO,SAAS,YAAY,GAAA,EAAuB;AACjD,EAAA,MAAM,GAAA,GAAM,SAAS,GAAG,CAAA;AAGxB,EAAA,MAAM,OAAO,GAAA,CAAI,OAAA,KAAY,SAAS,GAAA,GAAM,GAAA,CAAI,cAAc,MAAM,CAAA;AAEpE,EAAA,IAAI,CAAC,IAAA,EAAM;AACT,IAAA,MAAM,IAAI,MAAM,2CAA2C,CAAA;AAAA,EAC7D;AAGA,EAAA,MAAM,EAAA,GAAK,IAAA,CAAK,aAAA,CAAc,IAAI,CAAA,EAAG,WAAA;AACrC,EAAA,IAAI,CAAC,EAAA,EAAI;AACP,IAAA,MAAM,IAAI,MAAM,kDAAkD,CAAA;AAAA,EACpE;AAEA,EAAA,MAAM,KAAA,GAAQA,mBAAAA,CAAmB,IAAA,EAAM,OAAO,CAAA;AAC9C,EAAA,IAAI,CAAC,KAAA,EAAO;AACV,IAAA,MAAM,IAAI,MAAM,qDAAqD,CAAA;AAAA,EACvE;AAEA,EAAA,MAAM,OAAA,GAAUP,iBAAgB,IAAI,CAAA;AACpC,EAAA,IAAI,CAAC,OAAA,EAAS;AACZ,IAAA,MAAM,IAAI,KAAA;AAAA,MACR;AAAA,KACF;AAAA,EACF;AAEA,EAAA,MAAM,MAAA,GAAmB;AAAA,IACvB,EAAA,EAAI,UAAU,EAAE,CAAA;AAAA,IAChB,KAAA;AAAA,IACA;AAAA,GACF;AAGA,EAAA,MAAM,OAAA,GAAUE,eAAAA,CAAe,IAAA,EAAM,QAAQ,CAAA;AAC7C,EAAA,IAAI,OAAA,CAAQ,SAAS,CAAA,EAAG;AACtB,IAAA,MAAA,CAAO,OAAA,GAAU,OAAA;AAAA,EACnB;AAEA,EAAA,MAAM,KAAA,GAAQE,cAAa,IAAI,CAAA;AAC/B,EAAA,IAAI,KAAA,CAAM,SAAS,CAAA,EAAG;AACpB,IAAA,MAAA,CAAO,KAAA,GAAQ,KAAA;AAAA,EACjB;AAEA,EAAA,MAAM,UAAA,GAAaE,mBAAkB,IAAI,CAAA;AACzC,EAAA,IAAI,UAAA,CAAW,SAAS,CAAA,EAAG;AACzB,IAAA,MAAA,CAAO,UAAA,GAAa,UAAA;AAAA,EACtB;AAEA,EAAA,MAAM,YAAA,GAAeJ,eAAAA,CAAe,IAAA,EAAM,aAAa,CAAA;AACvD,EAAA,IAAI,YAAA,CAAa,SAAS,CAAA,EAAG;AAC3B,IAAA,MAAA,CAAO,YAAA,GAAe,YAAA;AAAA,EACxB;AAEA,EAAA,MAAM,SAAA,GAAY,iBAAiB,IAAI,CAAA;AACvC,EAAA,IAAI,SAAA,EAAW;AACb,IAAA,MAAA,CAAO,SAAA,GAAY,SAAA;AAAA,EACrB;AAEA,EAAA,MAAM,IAAA,GAAO,IAAA,CAAK,aAAA,CAAc,MAAM,CAAA,EAAG,WAAA;AACzC,EAAA,IAAI,IAAA,EAAM;AACR,IAAA,MAAA,CAAO,IAAA,GAAO,UAAU,IAAI,CAAA;AAAA,EAC9B;AAEA,EAAA,MAAM,IAAA,GAAO,IAAA,CAAK,aAAA,CAAc,MAAM,CAAA,EAAG,WAAA;AACzC,EAAA,IAAI,IAAA,EAAM;AACR,IAAA,MAAA,CAAO,IAAA,GAAO,UAAU,IAAI,CAAA;AAAA,EAC9B;AAEA,EAAA,MAAM,MAAA,GAASK,mBAAAA,CAAmB,IAAA,EAAM,QAAQ,CAAA;AAChD,EAAA,IAAI,MAAA,EAAQ;AACV,IAAA,MAAA,CAAO,MAAA,GAAS,MAAA;AAAA,EAClB;AAEA,EAAA,MAAM,QAAA,GAAWA,mBAAAA,CAAmB,IAAA,EAAM,UAAU,CAAA;AACpD,EAAA,IAAI,QAAA,EAAU;AACZ,IAAA,MAAA,CAAO,QAAA,GAAW,QAAA;AAAA,EACpB;AAEA,EAAA,OAAO,MAAA;AACT;;;ACxTO,SAAS,SAAA,CAAU,KAAa,OAAA,EAAsC;AAC3E,EAAA,MAAM,GAAA,GAAM,SAAS,GAAG,CAAA;AAGxB,EAAA,MAAM,IAAA,GAAO,YAAY,GAAG,CAAA;AAG5B,EAAA,MAAM,aAAA,GAAgB,GAAA,CAAI,gBAAA,CAAiB,OAAO,CAAA;AAClD,EAAA,MAAM,UAAU,aAAA,CAAc,GAAA,CAAI,CAAC,YAAA,KAAiB,YAAA,CAAa,YAAY,CAAC,CAAA;AAG9E,EAAA,MAAM,cAAA,GAAiB,OAAA,GAAU,iBAAA,CAAkB,IAAA,EAAM,OAAO,CAAA,GAAI,IAAA;AACpE,EAAA,MAAM,iBAAA,GAAoB,OAAA,GACtB,OAAA,CAAQ,GAAA,CAAI,CAAC,UAAU,kBAAA,CAAmB,KAAA,EAAO,OAAO,CAAC,CAAA,GACzD,OAAA;AAEJ,EAAA,OAAO;AAAA,IACL,OAAA,EAAS,KAAA;AAAA,IACT,IAAA,EAAM,cAAA;AAAA,IACN,OAAA,EAAS;AAAA,GACX;AACF;AAKA,SAAS,iBAAA,CAAkB,MAAgB,OAAA,EAAiC;AAC1E,EAAA,OAAO;AAAA,IACL,GAAG,IAAA;AAAA,IACH,KAAA,EAAO,IAAA,CAAK,KAAA,GAAQ,IAAA,CAAK,KAAA,CAAM,GAAA,CAAI,CAAC,IAAA,KAAS,iBAAA,CAAkB,IAAA,EAAM,OAAO,CAAC,IAAI,IAAA,CAAK,KAAA;AAAA,IACtF,IAAA,EAAM,KAAK,IAAA,GAAO,iBAAA,CAAkB,SAAS,IAAA,CAAK,IAAI,IAAI,IAAA,CAAK,IAAA;AAAA,IAC/D,IAAA,EAAM,KAAK,IAAA,GAAO,iBAAA,CAAkB,SAAS,IAAA,CAAK,IAAI,IAAI,IAAA,CAAK;AAAA,GACjE;AACF;AAKA,SAAS,kBAAA,CAAmB,OAAkB,OAAA,EAAkC;AAC9E,EAAA,OAAO;AAAA,IACL,GAAG,KAAA;AAAA,IACH,KAAA,EAAO,KAAA,CAAM,KAAA,GAAQ,KAAA,CAAM,KAAA,CAAM,GAAA,CAAI,CAAC,IAAA,KAAS,iBAAA,CAAkB,IAAA,EAAM,OAAO,CAAC,IAAI,KAAA,CAAM;AAAA,GAC3F;AACF;AAKA,SAAS,iBAAA,CAAkB,MAAgB,OAAA,EAAiC;AAC1E,EAAA,OAAO;AAAA,IACL,GAAG,IAAA;AAAA,IACH,IAAA,EAAM,iBAAA,CAAkB,OAAA,EAAS,IAAA,CAAK,IAAI;AAAA,GAC5C;AACF;;;AC5BO,SAAS,aAAa,OAAA,EAA6B;AACxD,EAAA,IAAI,CAAC,OAAA,IAAW,OAAO,OAAA,KAAY,QAAA,EAAU;AAC3C,IAAA,OAAO,SAAA;AAAA,EACT;AAEA,EAAA,MAAM,OAAA,GAAU,QAAQ,IAAA,EAAK;AAG7B,EAAA,IAAI,QAAQ,UAAA,CAAW,GAAG,KAAK,OAAA,CAAQ,UAAA,CAAW,GAAG,CAAA,EAAG;AAEtD,IAAA,IAAI;AACF,MAAA,MAAM,IAAA,GAAO,IAAA,CAAK,KAAA,CAAM,OAAO,CAAA;AAC/B,MAAA,IACE,QACA,OAAO,IAAA,KAAS,YAChB,CAAC,KAAA,CAAM,QAAQ,IAAI,CAAA,IACnB,KAAK,OAAA,IACL,OAAO,KAAK,OAAA,KAAY,QAAA,IACxB,KAAK,OAAA,CAAQ,QAAA,CAAS,cAAc,CAAA,EACpC;AACA,QAAA,OAAO,WAAA;AAAA,MACT;AAAA,IACF,CAAA,CAAA,MAAQ;AAAA,IAER;AACA,IAAA,OAAO,SAAA;AAAA,EACT;AAIA,EAAA,MAAM,OAAA,GAAU,OAAA,CACb,OAAA,CAAQ,kBAAA,EAAoB,EAAE,EAC9B,OAAA,CAAQ,kBAAA,EAAoB,EAAE,CAAA,CAC9B,IAAA,EAAK;AAGR,EAAA,IAAI,OAAA,CAAQ,KAAA,CAAM,YAAY,CAAA,EAAG;AAC/B,IAAA,OAAO,KAAA;AAAA,EACT;AAGA,EAAA,IAAI,OAAA,CAAQ,KAAA,CAAM,aAAa,CAAA,EAAG;AAChC,IAAA,OAAO,MAAA;AAAA,EACT;AAIA,EAAA,IAAI,OAAA,CAAQ,KAAA,CAAM,sDAAsD,CAAA,EAAG;AACzE,IAAA,OAAO,MAAA;AAAA,EACT;AAGA,EAAA,IAAI,QAAQ,KAAA,CAAM,WAAW,KAAK,OAAA,CAAQ,QAAA,CAAS,SAAS,CAAA,EAAG;AAC7D,IAAA,OAAO,KAAA;AAAA,EACT;AAGA,EAAA,IAAI,OAAA,CAAQ,KAAA,CAAM,gBAAgB,CAAA,EAAG;AACnC,IAAA,OAAO,KAAA;AAAA,EACT;AAEA,EAAA,OAAO,SAAA;AACT;AAeO,SAAS,OAAO,OAAA,EAA0B;AAC/C,EAAA,OAAO,YAAA,CAAa,OAAO,CAAA,KAAM,SAAA;AACnC;AAQO,SAAS,MAAM,OAAA,EAA0B;AAC9C,EAAA,OAAO,YAAA,CAAa,OAAO,CAAA,KAAM,KAAA;AACnC;AAQO,SAAS,OAAO,OAAA,EAA0B;AAC/C,EAAA,OAAO,YAAA,CAAa,OAAO,CAAA,KAAM,MAAA;AACnC;AAQO,SAAS,WAAW,OAAA,EAA0B;AACnD,EAAA,OAAO,YAAA,CAAa,OAAO,CAAA,KAAM,WAAA;AACnC;;;ACpIO,SAAS,SAAS,IAAA,EAAkC;AACzD,EAAA,MAAM,SAA4B,EAAC;AAGnC,EAAA,IAAI,CAAC,QAAQ,OAAO,IAAA,KAAS,YAAY,KAAA,CAAM,OAAA,CAAQ,IAAI,CAAA,EAAG;AAC5D,IAAA,MAAA,CAAO,KAAK,EAAE,KAAA,EAAO,MAAA,EAAQ,OAAA,EAAS,8BAA8B,CAAA;AACpE,IAAA,OAAO,MAAA;AAAA,EACT;AAEA,EAAA,MAAM,IAAA,GAAO,IAAA;AAGb,EAAA,IAAI,CAAC,KAAK,OAAA,EAAS;AACjB,IAAA,MAAA,CAAO,KAAK,EAAE,KAAA,EAAO,SAAA,EAAW,OAAA,EAAS,mCAAmC,CAAA;AAAA,EAC9E,CAAA,MAAA,IAAW,OAAO,IAAA,CAAK,OAAA,KAAY,QAAA,EAAU;AAC3C,IAAA,MAAA,CAAO,KAAK,EAAE,KAAA,EAAO,SAAA,EAAW,OAAA,EAAS,oCAAoC,CAAA;AAAA,EAC/E,CAAA,MAAA,IACE,CAAC,IAAA,CAAK,OAAA,CAAQ,QAAA,CAAS,wBAAwB,CAAA,IAC/C,CAAC,IAAA,CAAK,OAAA,CAAQ,UAAA,CAAW,gCAAgC,CAAA,EACzD;AACA,IAAA,MAAA,CAAO,IAAA,CAAK;AAAA,MACV,KAAA,EAAO,SAAA;AAAA,MACP,OAAA,EAAS;AAAA,KACV,CAAA;AAAA,EACH;AAGA,EAAA,IAAI,CAAC,KAAK,KAAA,EAAO;AACf,IAAA,MAAA,CAAO,KAAK,EAAE,KAAA,EAAO,OAAA,EAAS,OAAA,EAAS,iCAAiC,CAAA;AAAA,EAC1E,CAAA,MAAA,IAAW,OAAO,IAAA,CAAK,KAAA,KAAU,QAAA,EAAU;AACzC,IAAA,MAAA,CAAO,KAAK,EAAE,KAAA,EAAO,OAAA,EAAS,OAAA,EAAS,kCAAkC,CAAA;AAAA,EAC3E;AAGA,EAAA,IAAI,CAAC,KAAK,KAAA,EAAO;AACf,IAAA,MAAA,CAAO,KAAK,EAAE,KAAA,EAAO,OAAA,EAAS,OAAA,EAAS,iCAAiC,CAAA;AAAA,EAC1E,WAAW,CAAC,KAAA,CAAM,OAAA,CAAQ,IAAA,CAAK,KAAK,CAAA,EAAG;AACrC,IAAA,MAAA,CAAO,KAAK,EAAE,KAAA,EAAO,OAAA,EAAS,OAAA,EAAS,kCAAkC,CAAA;AAAA,EAC3E,CAAA,MAAO;AAEL,IAAA,KAAA,IAAS,IAAI,CAAA,EAAG,CAAA,GAAI,IAAA,CAAK,KAAA,CAAM,QAAQ,CAAA,EAAA,EAAK;AAC1C,MAAA,MAAM,IAAA,GAAO,IAAA,CAAK,KAAA,CAAM,CAAC,CAAA;AAGzB,MAAA,IAAI,CAAC,IAAA,IAAQ,OAAO,IAAA,KAAS,QAAA,EAAU;AACrC,QAAA,MAAA,CAAO,IAAA,CAAK,EAAE,KAAA,EAAO,CAAA,MAAA,EAAS,CAAC,CAAA,CAAA,CAAA,EAAK,OAAA,EAAS,0BAA0B,CAAA;AACvE,QAAA;AAAA,MACF;AAEA,MAAA,IAAI,CAAC,KAAK,EAAA,EAAI;AACZ,QAAA,MAAA,CAAO,IAAA,CAAK,EAAE,KAAA,EAAO,CAAA,MAAA,EAAS,CAAC,CAAA,IAAA,CAAA,EAAQ,OAAA,EAAS,8BAA8B,CAAA;AAAA,MAChF,CAAA,MAAA,IAAW,OAAO,IAAA,CAAK,EAAA,KAAO,QAAA,EAAU;AACtC,QAAA,MAAA,CAAO,IAAA,CAAK,EAAE,KAAA,EAAO,CAAA,MAAA,EAAS,CAAC,CAAA,IAAA,CAAA,EAAQ,OAAA,EAAS,+BAA+B,CAAA;AAAA,MACjF;AAGA,MAAA,IAAI,CAAC,IAAA,CAAK,YAAA,IAAgB,CAAC,KAAK,YAAA,EAAc;AAG9C,IACF;AAAA,EACF;AAEA,EAAA,OAAO,MAAA;AACT;;;ACnEO,SAAS,aAAA,CAAc,YAAoB,OAAA,EAA0C;AAE1F,EAAA,IAAI,IAAA;AACJ,EAAA,IAAI;AACF,IAAA,IAAA,GAAO,IAAA,CAAK,MAAM,UAAU,CAAA;AAAA,EAC9B,SAAS,KAAA,EAAO;AACd,IAAA,MAAM,IAAI,MAAM,CAAA,cAAA,EAAiB,KAAA,YAAiB,QAAQ,KAAA,CAAM,OAAA,GAAU,eAAe,CAAA,CAAE,CAAA;AAAA,EAC7F;AAGA,EAAA,MAAM,MAAA,GAAS,SAAS,IAAI,CAAA;AAC5B,EAAA,IAAI,MAAA,CAAO,SAAS,CAAA,EAAG;AACrB,IAAA,MAAM,aAAA,GAAgB,MAAA,CAAO,GAAA,CAAI,CAAC,MAAM,CAAA,EAAG,CAAA,CAAE,KAAK,CAAA,EAAA,EAAK,CAAA,CAAE,OAAO,CAAA,CAAE,CAAA,CAAE,KAAK,IAAI,CAAA;AAC7E,IAAA,MAAM,IAAI,KAAA,CAAM,CAAA,mBAAA,EAAsB,aAAa,CAAA,CAAE,CAAA;AAAA,EACvD;AAEA,EAAA,MAAM,IAAA,GAAO,IAAA;AAGb,EAAA,MAAM,OAAA,GAAU,cAAA,CAAe,IAAA,CAAK,OAAO,CAAA;AAG3C,EAAA,MAAM,cAAA,GAAiB,OAAA,GAAUC,kBAAAA,CAAkB,IAAA,EAAM,OAAO,CAAA,GAAI,IAAA;AAEpE,EAAA,OAAO;AAAA,IACL,OAAA;AAAA,IACA,IAAA,EAAM;AAAA,GACR;AACF;AAKA,SAASA,kBAAAA,CAAkB,MAAgB,OAAA,EAAiC;AAC1E,EAAA,OAAO;AAAA,IACL,GAAG,IAAA;AAAA,IACH,aAAA,EAAe,KAAK,aAAA,GAChB,iBAAA,CAAkB,SAAS,IAAA,CAAK,aAAa,IAC7C,IAAA,CAAK,aAAA;AAAA,IACT,QAAA,EAAU,KAAK,QAAA,GAAW,iBAAA,CAAkB,SAAS,IAAA,CAAK,QAAQ,IAAI,IAAA,CAAK,QAAA;AAAA,IAC3E,IAAA,EAAM,KAAK,IAAA,GAAO,iBAAA,CAAkB,SAAS,IAAA,CAAK,IAAI,IAAI,IAAA,CAAK,IAAA;AAAA,IAC/D,OAAA,EAAS,KAAK,OAAA,GAAU,iBAAA,CAAkB,SAAS,IAAA,CAAK,OAAO,IAAI,IAAA,CAAK,OAAA;AAAA,IACxE,KAAA,EAAO,IAAA,CAAK,KAAA,GAAQ,IAAA,CAAK,KAAA,CAAM,GAAA,CAAI,CAAC,IAAA,KAAS,iBAAA,CAAkB,IAAA,EAAM,OAAO,CAAC,IAAI,IAAA,CAAK;AAAA,GACxF;AACF;AAKA,SAAS,iBAAA,CAAkB,MAAoB,OAAA,EAAqC;AAClF,EAAA,OAAO;AAAA,IACL,GAAG,IAAA;AAAA,IACH,GAAA,EAAK,KAAK,GAAA,GAAM,iBAAA,CAAkB,SAAS,IAAA,CAAK,GAAG,IAAI,IAAA,CAAK,GAAA;AAAA,IAC5D,YAAA,EAAc,KAAK,YAAA,GACf,iBAAA,CAAkB,SAAS,IAAA,CAAK,YAAY,IAC5C,IAAA,CAAK,YAAA;AAAA,IACT,KAAA,EAAO,KAAK,KAAA,GAAQ,iBAAA,CAAkB,SAAS,IAAA,CAAK,KAAK,IAAI,IAAA,CAAK,KAAA;AAAA,IAClE,YAAA,EAAc,KAAK,YAAA,GACf,iBAAA,CAAkB,SAAS,IAAA,CAAK,YAAY,IAC5C,IAAA,CAAK,YAAA;AAAA,IACT,WAAA,EAAa,IAAA,CAAK,WAAA,GACd,IAAA,CAAK,WAAA,CAAY,GAAA,CAAI,CAAC,UAAA,KAAe,uBAAA,CAAwB,UAAA,EAAY,OAAO,CAAC,IACjF,IAAA,CAAK;AAAA,GACX;AACF;AAKA,SAAS,uBAAA,CACP,YACA,OAAA,EACoB;AACpB,EAAA,OAAO;AAAA,IACL,GAAG,UAAA;AAAA,IACH,GAAA,EAAK,iBAAA,CAAkB,OAAA,EAAS,UAAA,CAAW,GAAG;AAAA,GAChD;AACF;AAKA,SAAS,eAAe,UAAA,EAA4B;AAIlD,EAAA,MAAM,KAAA,GAAQ,UAAA,CAAW,KAAA,CAAM,mBAAmB,CAAA;AAClD,EAAA,OAAO,KAAA,GAAQ,KAAA,CAAM,CAAC,CAAA,GAAI,UAAA;AAC5B;;;AC3FO,SAAS,aAAa,GAAA,EAA4B;AACvD,EAAA,MAAM,EAAE,OAAA,EAAS,KAAA,EAAM,GAAI,GAAA;AAE3B,EAAA,OAAO;AAAA,IACL,MAAA,EAAQ,KAAA;AAAA,IACR,OAAO,OAAA,CAAQ,KAAA;AAAA,IACf,aAAa,OAAA,CAAQ,WAAA;AAAA,IACrB,KAAK,OAAA,CAAQ,IAAA;AAAA,IACb,OAAA,EAAS,MAAA;AAAA;AAAA,IACT,UAAU,OAAA,CAAQ,QAAA;AAAA,IAClB,KAAA,EAAO,QAAQ,KAAA,EAAO,GAAA;AAAA,IACtB,OAAA,EAAS,OAAA,CAAQ,cAAA,GACb,CAAC,EAAE,IAAA,EAAM,OAAA,CAAQ,cAAA,EAAgB,KAAA,EAAO,OAAA,CAAQ,cAAA,EAAgB,CAAA,GAChE,MAAA;AAAA,IACJ,OAAA,EAAS,OAAA,CAAQ,aAAA,IAAiB,OAAA,CAAQ,OAAA;AAAA,IAC1C,KAAA,EAAO,KAAA,CAAM,GAAA,CAAI,CAAC,IAAA,KAAoC;AACpD,MAAA,OAAO;AAAA,QACL,IAAI,IAAA,CAAK,IAAA,EAAM,SAAS,IAAA,CAAK,IAAA,IAAQ,KAAK,KAAA,IAAS,EAAA;AAAA,QACnD,OAAO,IAAA,CAAK,KAAA;AAAA,QACZ,KAAK,IAAA,CAAK,IAAA;AAAA,QACV,WAAA,EAAa,IAAA,CAAK,UAAA,EAAY,cAAA,IAAkB,IAAA,CAAK,WAAA;AAAA,QACrD,WAAA,EAAa,IAAA,CAAK,UAAA,EAAY,cAAA,GAAiB,SAAY,IAAA,CAAK,WAAA;AAAA,QAChE,SAAS,IAAA,CAAK,WAAA;AAAA,QACd,WAAW,IAAA,CAAK,OAAA;AAAA,QAChB,SACE,IAAA,CAAK,MAAA,IAAU,IAAA,CAAK,UAAA,EAAY,YAC5B,CAAC,EAAE,IAAA,EAAM,IAAA,CAAK,UAAU,IAAA,CAAK,UAAA,EAAY,SAAA,IAAa,EAAA,EAAI,CAAA,GAC1D,MAAA;AAAA,QACN,MAAM,IAAA,CAAK,QAAA;AAAA,QACX,KAAA,EAAO,IAAA,CAAK,UAAA,EAAY,cAAA,GAAiB,CAAC,CAAA,EAAG,GAAA;AAAA,QAC7C,UAAA,EAAY,KAAK,SAAA,GACb;AAAA,UACE;AAAA,YACE,GAAA,EAAK,KAAK,SAAA,CAAU,GAAA;AAAA,YACpB,IAAA,EAAM,KAAK,SAAA,CAAU,IAAA;AAAA,YACrB,MAAA,EAAQ,KAAK,SAAA,CAAU;AAAA;AACzB,SACF,GACA;AAAA,OACN;AAAA,IACF,CAAC;AAAA,GACH;AACF;AAKO,SAAS,cAAc,IAAA,EAA0B;AACtD,EAAA,MAAM,EAAE,IAAA,EAAM,OAAA,EAAQ,GAAI,IAAA;AAG1B,EAAA,MAAM,QAAA,GAAW,KAAK,KAAA,EAAO,IAAA,CAAK,CAAC,CAAA,KAAM,CAAA,CAAE,QAAQ,MAAM,CAAA;AACzD,EAAA,MAAM,aAAA,GAAgB,IAAA,CAAK,KAAA,EAAO,IAAA,CAAK,CAAC,CAAA,KAAM,CAAA,CAAE,GAAA,KAAQ,WAAA,IAAe,CAAC,CAAA,CAAE,GAAG,CAAA;AAE7E,EAAA,OAAO;AAAA,IACL,MAAA,EAAQ,MAAA;AAAA,IACR,OAAO,IAAA,CAAK,KAAA;AAAA,IACZ,aAAa,IAAA,CAAK,QAAA;AAAA,IAClB,KAAK,aAAA,EAAe,IAAA;AAAA,IACpB,SAAS,QAAA,EAAU,IAAA;AAAA,IACnB,QAAA,EAAU,MAAA;AAAA;AAAA,IACV,KAAA,EAAO,IAAA,CAAK,IAAA,IAAQ,IAAA,CAAK,IAAA;AAAA,IACzB,OAAA,EAAS,KAAK,OAAA,EAAS,GAAA;AAAA,MACrB,CAAC,CAAA,MAAmB;AAAA,QAClB,MAAM,CAAA,CAAE,IAAA;AAAA,QACR,OAAO,CAAA,CAAE,KAAA;AAAA,QACT,KAAK,CAAA,CAAE;AAAA,OACT;AAAA,KACF;AAAA,IACA,SAAS,IAAA,CAAK,OAAA;AAAA,IACd,KAAA,EAAO,OAAA,CAAQ,GAAA,CAAI,CAAC,KAAA,KAAoB;AACtC,MAAA,MAAM,kBAAA,GAAqB,KAAA,CAAM,KAAA,EAAO,IAAA,CAAK,CAAC,CAAA,KAAM,CAAA,CAAE,GAAA,KAAQ,WAAA,IAAe,CAAC,CAAA,CAAE,GAAG,CAAA;AACnF,MAAA,MAAM,gBAAA,GAAmB,MAAM,KAAA,EAAO,IAAA,CAAK,CAAC,CAAA,KAAM,CAAA,CAAE,QAAQ,SAAS,CAAA;AAErE,MAAA,OAAO;AAAA,QACL,IAAI,KAAA,CAAM,EAAA;AAAA,QACV,OAAO,KAAA,CAAM,KAAA;AAAA,QACb,KAAK,kBAAA,EAAoB,IAAA;AAAA,QACzB,aAAa,gBAAA,EAAkB,IAAA;AAAA,QAC/B,aAAa,KAAA,CAAM,OAAA,EAAS,SAAS,MAAA,GAAS,KAAA,CAAM,QAAQ,KAAA,GAAQ,MAAA;AAAA,QACpE,aAAa,KAAA,CAAM,OAAA,EAAS,SAAS,MAAA,GAAS,KAAA,CAAM,QAAQ,KAAA,GAAQ,MAAA;AAAA,QACpE,SAAS,KAAA,CAAM,OAAA;AAAA,QACf,WAAW,KAAA,CAAM,SAAA;AAAA,QACjB,UAAU,KAAA,CAAM,OAAA;AAAA,QAChB,OAAA,EAAS,MAAM,OAAA,EAAS,GAAA;AAAA,UACtB,CAAC,CAAA,MAAmB;AAAA,YAClB,MAAM,CAAA,CAAE,IAAA;AAAA,YACR,OAAO,CAAA,CAAE,KAAA;AAAA,YACT,KAAK,CAAA,CAAE;AAAA,WACT;AAAA,SACF;AAAA,QACA,MAAM,KAAA,CAAM,UAAA,EAAY,IAAI,CAAC,CAAA,KAAM,EAAE,IAAI,CAAA;AAAA,QACzC,KAAA,EAAO;AAAA;AAAA,OACT;AAAA,IACF,CAAC;AAAA,GACH;AACF;AAKO,SAAS,kBAAkB,QAAA,EAAkC;AAClE,EAAA,MAAM,EAAE,MAAK,GAAI,QAAA;AAEjB,EAAA,OAAO;AAAA,IACL,MAAA,EAAQ,WAAA;AAAA,IACR,OAAO,IAAA,CAAK,KAAA;AAAA,IACZ,aAAa,IAAA,CAAK,WAAA;AAAA,IAClB,KAAK,IAAA,CAAK,aAAA;AAAA,IACV,SAAS,IAAA,CAAK,QAAA;AAAA,IACd,UAAU,IAAA,CAAK,QAAA;AAAA,IACf,KAAA,EAAO,IAAA,CAAK,IAAA,IAAQ,IAAA,CAAK,OAAA;AAAA,IACzB,OAAA,EAAS,KAAK,OAAA,EAAS,GAAA;AAAA,MACrB,CAAC,CAAA,MAAmB;AAAA,QAClB,MAAM,CAAA,CAAE,IAAA;AAAA,QACR,KAAA,EAAO,MAAA;AAAA,QACP,KAAK,CAAA,CAAE;AAAA,OACT;AAAA,KACF;AAAA,IACA,OAAA,EAAS,MAAA;AAAA;AAAA,IACT,KAAA,EAAO,IAAA,CAAK,KAAA,CAAM,GAAA,CAAI,CAAC,IAAA,KAAmB;AACxC,MAAA,OAAO;AAAA,QACL,IAAI,IAAA,CAAK,EAAA;AAAA,QACT,OAAO,IAAA,CAAK,KAAA;AAAA,QACZ,KAAK,IAAA,CAAK,GAAA;AAAA,QACV,aAAa,IAAA,CAAK,YAAA;AAAA,QAClB,aAAa,IAAA,CAAK,YAAA;AAAA,QAClB,aAAa,IAAA,CAAK,YAAA;AAAA,QAClB,SAAS,IAAA,CAAK,OAAA;AAAA,QACd,WAAW,IAAA,CAAK,cAAA;AAAA,QAChB,UAAU,IAAA,CAAK,aAAA;AAAA,QACf,OAAA,EAAS,KAAK,OAAA,EAAS,GAAA;AAAA,UACrB,CAAC,CAAA,MAAmB;AAAA,YAClB,MAAM,CAAA,CAAE,IAAA;AAAA,YACR,KAAA,EAAO,MAAA;AAAA,YACP,KAAK,CAAA,CAAE;AAAA,WACT;AAAA,SACF;AAAA,QACA,MAAM,IAAA,CAAK,IAAA;AAAA,QACX,KAAA,EAAO,IAAA,CAAK,KAAA,IAAS,IAAA,CAAK,YAAA;AAAA,QAC1B,UAAA,EAAY,KAAK,WAAA,EAAa,GAAA;AAAA,UAC5B,CAAC,CAAA,MAAsB;AAAA,YACrB,KAAK,CAAA,CAAE,GAAA;AAAA,YACP,MAAM,CAAA,CAAE,SAAA;AAAA,YACR,QAAQ,CAAA,CAAE;AAAA,WACZ;AAAA;AACF,OACF;AAAA,IACF,CAAC;AAAA,GACH;AACF;;;ACxJO,SAASC,YAAW,IAAA,EAAsB;AAC/C,EAAA,IAAI,CAAC,MAAM,OAAO,IAAA;AAClB,EAAA,OAAO,KAAK,OAAA,CAAQ,iBAAA,EAAmB,EAAE,CAAA,CAAE,OAAA,CAAQ,aAAa,EAAE,CAAA;AACpE;AAMO,SAASX,gBAAe,IAAA,EAAsB;AACnD,EAAA,IAAI,CAAC,MAAM,OAAO,IAAA;AAElB,EAAA,MAAM,QAAA,GAAmC;AAAA,IACvC,OAAA,EAAS,GAAA;AAAA,IACT,MAAA,EAAQ,GAAA;AAAA,IACR,MAAA,EAAQ,GAAA;AAAA,IACR,QAAA,EAAU,GAAA;AAAA,IACV,QAAA,EAAU,GAAA;AAAA,IACV,QAAA,EAAU,GAAA;AAAA,IACV,OAAA,EAAS,GAAA;AAAA,IACT,QAAA,EAAU;AAAA,GACZ;AAEA,EAAA,IAAI,MAAA,GAAS,IAAA;AACb,EAAA,KAAA,MAAW,CAAC,MAAA,EAAQ,IAAI,KAAK,MAAA,CAAO,OAAA,CAAQ,QAAQ,CAAA,EAAG;AACrD,IAAA,MAAA,GAAS,MAAA,CAAO,UAAA,CAAW,MAAA,EAAQ,IAAI,CAAA;AAAA,EACzC;AAGA,EAAA,MAAA,GAAS,MAAA,CAAO,OAAA,CAAQ,WAAA,EAAa,CAAC,GAAG,GAAA,KAAQ;AAC/C,IAAA,OAAO,OAAO,YAAA,CAAa,MAAA,CAAO,QAAA,CAAS,GAAA,EAAK,EAAE,CAAC,CAAA;AAAA,EACrD,CAAC,CAAA;AAED,EAAA,MAAA,GAAS,MAAA,CAAO,OAAA,CAAQ,qBAAA,EAAuB,CAAC,GAAG,GAAA,KAAQ;AACzD,IAAA,OAAO,OAAO,YAAA,CAAa,MAAA,CAAO,QAAA,CAAS,GAAA,EAAK,EAAE,CAAC,CAAA;AAAA,EACrD,CAAC,CAAA;AAED,EAAA,OAAO,MAAA;AACT;AAMO,SAASY,oBAAAA,CAAoB,IAAA,EAAc,kBAAA,GAAqB,KAAA,EAAe;AACpF,EAAA,IAAI,CAAC,MAAM,OAAO,IAAA;AAElB,EAAA,IAAI,MAAA,GAAS,KAAK,IAAA,EAAK;AAEvB,EAAA,IAAI,kBAAA,EAAoB;AAEtB,IAAA,MAAA,GAAS,MAAA,CAAO,OAAA,CAAQ,KAAA,EAAO,GAAG,CAAA;AAClC,IAAA,MAAA,GAAS,MAAA,CAAO,OAAA,CAAQ,OAAA,EAAS,IAAI,CAAA;AACrC,IAAA,MAAA,GAAS,MAAA,CAAO,OAAA,CAAQ,OAAA,EAAS,IAAI,CAAA;AAAA,EACvC,CAAA,MAAO;AAEL,IAAA,MAAA,GAAS,MAAA,CAAO,OAAA,CAAQ,MAAA,EAAQ,GAAG,CAAA;AAAA,EACrC;AAEA,EAAA,OAAO,MAAA;AACT;AAMO,SAASC,UAAAA,CACd,IAAA,EACA,OAAA,GAKI,EAAC,EACG;AACR,EAAA,IAAI,IAAA,KAAS,IAAA,IAAQ,IAAA,KAAS,MAAA,EAAW,OAAO,EAAA;AAChD,EAAA,IAAI,OAAO,IAAA,KAAS,QAAA,EAAU,OAAO,EAAA;AAErC,EAAA,MAAM;AAAA,IACJ,UAAA,GAAa,IAAA;AAAA,IACb,gBAAgB,oBAAA,GAAuB,IAAA;AAAA,IACvC,qBAAqB,yBAAA,GAA4B,IAAA;AAAA,IACjD,kBAAA,GAAqB;AAAA,GACvB,GAAI,OAAA;AAEJ,EAAA,IAAI,MAAA,GAAS,IAAA;AAEb,EAAA,IAAI,UAAA,EAAY;AACd,IAAA,MAAA,GAASF,YAAW,MAAM,CAAA;AAAA,EAC5B;AAEA,EAAA,IAAI,oBAAA,EAAsB;AACxB,IAAA,MAAA,GAASX,gBAAe,MAAM,CAAA;AAAA,EAChC;AAEA,EAAA,IAAI,yBAAA,EAA2B;AAC7B,IAAA,MAAA,GAASY,oBAAAA,CAAoB,QAAQ,kBAAkB,CAAA;AAAA,EACzD;AAEA,EAAA,OAAO,MAAA;AACT;;;ACpGO,SAAS,gBAAgB,UAAA,EAAsD;AACpF,EAAA,IAAI,CAAC,UAAA,IAAc,OAAO,UAAA,KAAe,QAAA,EAAU;AACjD,IAAA,OAAO,IAAA;AAAA,EACT;AAEA,EAAA,MAAM,OAAA,GAAU,WAAW,IAAA,EAAK;AAChC,EAAA,IAAI,CAAC,OAAA,EAAS;AACZ,IAAA,OAAO,IAAA;AAAA,EACT;AAEA,EAAA,IAAI;AAEF,IAAA,MAAM,IAAA,GAAO,IAAI,IAAA,CAAK,OAAO,CAAA;AAG7B,IAAA,IAAI,MAAA,CAAO,KAAA,CAAM,IAAA,CAAK,OAAA,EAAS,CAAA,EAAG;AAChC,MAAA,OAAO,IAAA;AAAA,IACT;AAGA,IAAA,OAAO,KAAK,WAAA,EAAY;AAAA,EAC1B,CAAA,CAAA,MAAQ;AACN,IAAA,OAAO,IAAA;AAAA,EACT;AACF;AAMO,SAAS,aAAa,UAAA,EAAsD;AACjF,EAAA,OAAO,gBAAgB,UAAU,CAAA;AACnC;;;ACrBO,SAAS,YAAY,GAAA,EAAyB;AACnD,EAAA,MAAM,OAAA,GAAU,oBAAoB,GAAG,CAAA;AACvC,EAAA,MAAM,IAAA,GAAOE,aAAAA,CAAa,OAAA,EAAS,CAAC,CAAA,CAAE,OAAA;AACtC,EAAA,OAAO,IAAA;AACT;AAKA,SAAS,oBAAoB,GAAA,EAAqB;AAChD,EAAA,OAAO,GAAA,CAAI,OAAA,CAAQ,iBAAA,EAAmB,EAAE,EAAE,IAAA,EAAK;AACjD;AAKA,SAASC,cAAa,IAAA,EAA+D;AACnF,EAAA,MAAM,QAAA,uBAAe,GAAA,EAAoB;AACzC,EAAA,IAAI,OAAA,GAAU,CAAA;AAEd,EAAA,MAAM,YAAY,IAAA,CAAK,OAAA,CAAQ,6BAAA,EAA+B,CAAC,QAAQ,OAAA,KAAY;AACjF,IAAA,MAAM,WAAA,GAAc,WAAW,OAAO,CAAA,EAAA,CAAA;AACtC,IAAA,QAAA,CAAS,GAAA,CAAI,aAAa,OAAO,CAAA;AACjC,IAAA,OAAA,EAAA;AACA,IAAA,OAAO,WAAA;AAAA,EACT,CAAC,CAAA;AAED,EAAA,OAAO,EAAE,IAAA,EAAM,SAAA,EAAW,QAAA,EAAS;AACrC;AAKA,SAASC,aAAAA,CAAa,MAAc,QAAA,EAAuC;AACzE,EAAA,IAAI,MAAA,GAAS,IAAA;AACb,EAAA,KAAA,MAAW,CAAC,WAAA,EAAa,OAAO,CAAA,IAAK,QAAA,CAAS,SAAQ,EAAG;AACvD,IAAA,MAAA,GAAS,MAAA,CAAO,OAAA,CAAQ,WAAA,EAAa,OAAO,CAAA;AAAA,EAC9C;AACA,EAAA,OAAO,MAAA;AACT;AAKA,SAASC,iBAAgB,UAAA,EAA4C;AACnE,EAAA,MAAM,aAAqC,EAAC;AAC5C,EAAA,MAAM,SAAA,GAAY,yBAAA;AAClB,EAAA,IAAI,KAAA,GAAgC,SAAA,CAAU,IAAA,CAAK,UAAU,CAAA;AAE7D,EAAA,OAAO,UAAU,IAAA,EAAM;AACrB,IAAA,UAAA,CAAW,KAAA,CAAM,CAAC,CAAC,CAAA,GAAI,MAAM,CAAC,CAAA;AAC9B,IAAA,KAAA,GAAQ,SAAA,CAAU,KAAK,UAAU,CAAA;AAAA,EACnC;AAEA,EAAA,OAAO,UAAA;AACT;AAKA,SAASC,eAAAA,CAAe,GAAA,EAAa,OAAA,EAAiB,QAAA,EAA0B;AAC9E,EAAA,MAAM,OAAA,GAAU,IAAI,OAAO,CAAA,CAAA;AAC3B,EAAA,MAAM,QAAA,GAAW,KAAK,OAAO,CAAA,CAAA,CAAA;AAC7B,EAAA,IAAI,KAAA,GAAQ,CAAA;AACZ,EAAA,IAAI,GAAA,GAAM,QAAA;AAEV,EAAA,OAAO,GAAA,GAAM,GAAA,CAAI,MAAA,IAAU,KAAA,GAAQ,CAAA,EAAG;AACpC,IAAA,MAAM,QAAA,GAAW,GAAA,CAAI,OAAA,CAAQ,OAAA,EAAS,GAAG,CAAA;AACzC,IAAA,MAAM,SAAA,GAAY,GAAA,CAAI,OAAA,CAAQ,QAAA,EAAU,GAAG,CAAA;AAE3C,IAAA,IAAI,cAAc,EAAA,EAAI;AACpB,MAAA,OAAO,EAAA;AAAA,IACT;AAEA,IAAA,IAAI,QAAA,KAAa,EAAA,IAAM,QAAA,GAAW,SAAA,EAAW;AAE3C,MAAA,KAAA,EAAA;AACA,MAAA,GAAA,GAAM,WAAW,OAAA,CAAQ,MAAA;AAAA,IAC3B,CAAA,MAAO;AAEL,MAAA,KAAA,EAAA;AACA,MAAA,IAAI,UAAU,CAAA,EAAG;AACf,QAAA,OAAO,SAAA;AAAA,MACT;AACA,MAAA,GAAA,GAAM,YAAY,QAAA,CAAS,MAAA;AAAA,IAC7B;AAAA,EACF;AAEA,EAAA,OAAO,EAAA;AACT;AAKA,SAASJ,aAAAA,CACP,GAAA,EACA,QAAA,EACA,MAAA,GAA4B,MAC5B,QAAA,EACwE;AAExE,EAAA,MAAM,SAAA,GAAY,WAAW,EAAE,IAAA,EAAM,KAAK,QAAA,EAAS,GAAIC,cAAa,GAAG,CAAA;AACvE,EAAA,MAAM,aAAa,SAAA,CAAU,IAAA;AAC7B,EAAA,MAAM,kBAAkB,SAAA,CAAU,QAAA;AAGlC,EAAA,MAAM,YAAA,GAAe,UAAA,CAAW,OAAA,CAAQ,GAAA,EAAK,QAAQ,CAAA;AACrD,EAAA,IAAI,iBAAiB,EAAA,EAAI;AACvB,IAAA,MAAM,IAAI,MAAM,sBAAsB,CAAA;AAAA,EACxC;AAEA,EAAA,MAAM,UAAA,GAAa,UAAA,CAAW,OAAA,CAAQ,GAAA,EAAK,YAAY,CAAA;AACvD,EAAA,IAAI,eAAe,EAAA,EAAI;AACrB,IAAA,MAAM,IAAI,MAAM,sBAAsB,CAAA;AAAA,EACxC;AAEA,EAAA,MAAM,cAAA,GAAiB,UAAA,CAAW,SAAA,CAAU,YAAA,GAAe,GAAG,UAAU,CAAA;AAGxE,EAAA,MAAM,aAAA,GAAgB,cAAA,CAAe,QAAA,CAAS,GAAG,CAAA;AACjD,EAAA,MAAM,UAAA,GAAa,gBAAgB,cAAA,CAAe,KAAA,CAAM,GAAG,EAAE,CAAA,CAAE,MAAK,GAAI,cAAA;AAGxE,EAAA,MAAM,UAAA,GAAa,UAAA,CAAW,OAAA,CAAQ,GAAG,CAAA;AACzC,EAAA,MAAM,UAAU,UAAA,KAAe,EAAA,GAAK,aAAa,UAAA,CAAW,SAAA,CAAU,GAAG,UAAU,CAAA;AACnF,EAAA,MAAM,UAAA,GAAa,eAAe,EAAA,GAAK,KAAKE,gBAAAA,CAAgB,UAAA,CAAW,SAAA,CAAU,UAAU,CAAC,CAAA;AAE5F,EAAA,MAAM,OAAA,GAAsB;AAAA,IAC1B,OAAA;AAAA,IACA,UAAA;AAAA,IACA,IAAA,EAAM,EAAA;AAAA,IACN,UAAU,EAAC;AAAA,IACX;AAAA,GACF;AAGA,EAAA,IAAI,aAAA,EAAe;AACjB,IAAA,OAAO,EAAE,OAAA,EAAS,MAAA,EAAQ,UAAA,GAAa,CAAA,EAAG,UAAU,eAAA,EAAgB;AAAA,EACtE;AAGA,EAAA,MAAM,aAAA,GAAgBC,eAAAA,CAAe,UAAA,EAAY,OAAA,EAAS,aAAa,CAAC,CAAA;AACxE,EAAA,IAAI,kBAAkB,EAAA,EAAI;AACxB,IAAA,MAAM,IAAI,KAAA,CAAM,CAAA,0BAAA,EAA6B,OAAO,CAAA,CAAA,CAAG,CAAA;AAAA,EACzD;AAGA,EAAA,MAAM,OAAA,GAAU,UAAA,CAAW,SAAA,CAAU,UAAA,GAAa,GAAG,aAAa,CAAA;AAGlE,EAAA,IAAI,OAAA,CAAQ,QAAA,CAAS,GAAG,CAAA,EAAG;AAEzB,IAAA,IAAI,GAAA,GAAM,CAAA;AACV,IAAA,MAAM,cAAA,GAAiB,QAAQ,IAAA,EAAK;AAEpC,IAAA,OAAO,GAAA,GAAM,eAAe,MAAA,EAAQ;AAClC,MAAA,MAAM,OAAA,GAAU,cAAA,CAAe,OAAA,CAAQ,GAAA,EAAK,GAAG,CAAA;AAC/C,MAAA,IAAI,YAAY,EAAA,EAAI;AAGpB,MAAA,IAAI,cAAA,CAAe,UAAU,CAAC,CAAA,KAAM,OAAO,cAAA,CAAe,OAAA,GAAU,CAAC,CAAA,KAAM,GAAA,EAAK;AAC9E,QAAA,GAAA,GAAM,OAAA,GAAU,CAAA;AAChB,QAAA;AAAA,MACF;AAEA,MAAA,IAAI;AACF,QAAA,MAAM,EAAE,OAAA,EAAS,KAAA,EAAO,MAAA,EAAO,GAAIJ,aAAAA;AAAA,UACjC,cAAA;AAAA,UACA,OAAA;AAAA,UACA,OAAA;AAAA,UACA;AAAA,SACF;AACA,QAAA,OAAA,CAAQ,QAAA,CAAS,KAAK,KAAK,CAAA;AAC3B,QAAA,GAAA,GAAM,MAAA;AAAA,MACR,CAAA,CAAA,MAAQ;AACN,QAAA,GAAA,GAAM,OAAA,GAAU,CAAA;AAAA,MAClB;AAAA,IACF;AAGA,IAAA,IAAI,cAAc,OAAA,CAAQ,OAAA,CAAQ,UAAA,EAAY,EAAE,EAAE,IAAA,EAAK;AACvD,IAAA,WAAA,GAAcE,aAAAA,CAAa,aAAa,eAAe,CAAA;AACvD,IAAA,OAAA,CAAQ,IAAA,GAAO,WAAA;AAAA,EACjB,CAAA,MAAO;AAEL,IAAA,IAAI,WAAA,GAAc,QAAQ,IAAA,EAAK;AAC/B,IAAA,WAAA,GAAcA,aAAAA,CAAa,aAAa,eAAe,CAAA;AACvD,IAAA,OAAA,CAAQ,IAAA,GAAO,WAAA;AAAA,EACjB;AAEA,EAAA,MAAM,aAAA,GAAgB,aAAA,GAAgB,CAAA,EAAA,EAAK,OAAO,CAAA,CAAA,CAAA,CAAI,MAAA;AACtD,EAAA,OAAO,EAAE,OAAA,EAAS,MAAA,EAAQ,aAAA,EAAe,UAAU,eAAA,EAAgB;AACrE;AAMO,SAASG,cAAAA,CACd,OAAA,EACA,QAAA,EACA,aAAA,GAAgB,KAAA,EACG;AACnB,EAAA,MAAM,OAAA,GAAU,aAAA,GAAgB,QAAA,GAAW,QAAA,CAAS,WAAA,EAAY;AAChE,EAAA,MAAM,aAAa,aAAA,GAAgB,OAAA,CAAQ,OAAA,GAAU,OAAA,CAAQ,QAAQ,WAAA,EAAY;AAEjF,EAAA,IAAI,eAAe,OAAA,EAAS;AAC1B,IAAA,OAAO,OAAA;AAAA,EACT;AAEA,EAAA,KAAA,MAAW,KAAA,IAAS,QAAQ,QAAA,EAAU;AACpC,IAAA,MAAM,KAAA,GAAQA,cAAAA,CAAc,KAAA,EAAO,QAAA,EAAU,aAAa,CAAA;AAC1D,IAAA,IAAI,OAAO,OAAO,KAAA;AAAA,EACpB;AAEA,EAAA,OAAO,IAAA;AACT;AAKO,SAASC,iBAAAA,CACd,OAAA,EACA,QAAA,EACA,aAAA,GAAgB,KAAA,EACF;AACd,EAAA,MAAM,UAAwB,EAAC;AAC/B,EAAA,MAAM,OAAA,GAAU,aAAA,GAAgB,QAAA,GAAW,QAAA,CAAS,WAAA,EAAY;AAChE,EAAA,MAAM,aAAa,aAAA,GAAgB,OAAA,CAAQ,OAAA,GAAU,OAAA,CAAQ,QAAQ,WAAA,EAAY;AAEjF,EAAA,IAAI,eAAe,OAAA,EAAS;AAC1B,IAAA,OAAA,CAAQ,KAAK,OAAO,CAAA;AAAA,EACtB;AAEA,EAAA,KAAA,MAAW,KAAA,IAAS,QAAQ,QAAA,EAAU;AACpC,IAAA,OAAA,CAAQ,KAAK,GAAGA,iBAAAA,CAAiB,KAAA,EAAO,QAAA,EAAU,aAAa,CAAC,CAAA;AAAA,EAClE;AAEA,EAAA,OAAO,OAAA;AACT;AAKO,SAAS,QAAQ,OAAA,EAAgD;AACtE,EAAA,OAAO,SAAS,IAAA,IAAQ,EAAA;AAC1B;AAKO,SAAS,YAAA,CAAa,SAAwC,IAAA,EAA6B;AAChG,EAAA,OAAO,OAAA,EAAS,UAAA,CAAW,IAAI,CAAA,IAAK,IAAA;AACtC;;;ACrQO,SAAS,eAAe,cAAA,EAAwC;AACrE,EAAA,MAAM,YAAA,GAAe,CAAC,QAAA,KAA6B;AACjD,IAAA,MAAM,OAAA,GAAUD,cAAAA,CAAc,cAAA,EAAgB,QAAQ,CAAA;AACtD,IAAA,OAAON,UAAAA,CAAU,OAAA,CAAQ,OAAO,CAAC,CAAA;AAAA,EACnC,CAAA;AAEA,EAAA,MAAM,SAAA,GAAY,CAAC,QAAA,KAAyC;AAC1D,IAAA,MAAM,IAAA,GAAO,aAAa,QAAQ,CAAA;AAClC,IAAA,IAAI,CAAC,MAAM,OAAO,MAAA;AAClB,IAAA,MAAM,GAAA,GAAM,MAAA,CAAO,QAAA,CAAS,IAAA,EAAM,EAAE,CAAA;AACpC,IAAA,OAAO,MAAA,CAAO,KAAA,CAAM,GAAG,CAAA,GAAI,MAAA,GAAY,GAAA;AAAA,EACzC,CAAA;AAEA,EAAA,MAAM,OAAA,GAAU,CAAC,QAAA,KAAyC;AACxD,IAAA,MAAM,IAAA,GAAO,aAAa,QAAQ,CAAA;AAClC,IAAA,OAAO,YAAA,CAAa,IAAI,CAAA,IAAK,MAAA;AAAA,EAC/B,CAAA;AAEA,EAAA,MAAM,QAAA,GAAW,CAAC,QAAA,KAA2C;AAC3D,IAAA,MAAM,QAAA,GAAWO,iBAAAA,CAAiB,cAAA,EAAgB,QAAQ,CAAA;AAC1D,IAAA,IAAI,QAAA,CAAS,MAAA,KAAW,CAAA,EAAG,OAAO,MAAA;AAClC,IAAA,MAAM,UAAU,QAAA,CAAS,GAAA,CAAI,CAAC,EAAA,KAAOP,WAAU,OAAA,CAAQ,EAAE,CAAC,CAAC,EAAE,MAAA,CAAO,CAAC,IAAA,KAAS,IAAA,CAAK,SAAS,CAAC,CAAA;AAC7F,IAAA,OAAO,OAAA,CAAQ,MAAA,GAAS,CAAA,GAAI,OAAA,GAAU,MAAA;AAAA,EACxC,CAAA;AAGA,EAAA,MAAM,KAAA,GAAQ,aAAa,OAAO,CAAA;AAClC,EAAA,MAAM,IAAA,GAAO,aAAa,MAAM,CAAA;AAChC,EAAA,MAAM,WAAA,GAAc,aAAa,aAAa,CAAA;AAG9C,EAAA,MAAM,QAAA,GAAW,YAAA,CAAa,UAAU,CAAA,IAAK,MAAA;AAC7C,EAAA,MAAM,SAAA,GAAY,YAAA,CAAa,WAAW,CAAA,IAAK,MAAA;AAC/C,EAAA,MAAM,cAAA,GAAiB,YAAA,CAAa,gBAAgB,CAAA,IAAK,MAAA;AACzD,EAAA,MAAM,SAAA,GAAY,YAAA,CAAa,WAAW,CAAA,IAAK,MAAA;AAC/C,EAAA,MAAM,OAAA,GAAU,QAAQ,SAAS,CAAA;AACjC,EAAA,MAAM,aAAA,GAAgB,QAAQ,eAAe,CAAA;AAC7C,EAAA,MAAM,QAAA,GAAW,SAAS,UAAU,CAAA;AACpC,EAAA,MAAM,SAAA,GAAY,YAAA,CAAa,WAAW,CAAA,IAAK,MAAA;AAC/C,EAAA,MAAM,IAAA,GAAO,YAAA,CAAa,MAAM,CAAA,IAAK,MAAA;AACrC,EAAA,MAAM,GAAA,GAAM,UAAU,KAAK,CAAA;AAG3B,EAAA,MAAM,OAAA,GAAUM,cAAAA,CAAc,cAAA,EAAgB,OAAO,CAAA;AACrD,EAAA,MAAM,QAAQ,OAAA,GACV;AAAA,IACE,KAAKN,UAAAA,CAAU,OAAA,CAAQM,eAAc,OAAA,EAAS,KAAK,CAAC,CAAC,CAAA;AAAA,IACrD,OAAON,UAAAA,CAAU,OAAA,CAAQM,eAAc,OAAA,EAAS,OAAO,CAAC,CAAC,CAAA;AAAA,IACzD,MAAMN,UAAAA,CAAU,OAAA,CAAQM,eAAc,OAAA,EAAS,MAAM,CAAC,CAAC,CAAA;AAAA,IACvD,QAAQ,MAAM;AACZ,MAAA,MAAM,IAAIN,UAAAA,CAAU,OAAA,CAAQM,eAAc,OAAA,EAAS,OAAO,CAAC,CAAC,CAAA;AAC5D,MAAA,OAAO,CAAA,GAAI,MAAA,CAAO,QAAA,CAAS,CAAA,EAAG,EAAE,CAAA,GAAI,MAAA;AAAA,IACtC,CAAA,GAAG;AAAA,IACH,SAAS,MAAM;AACb,MAAA,MAAM,IAAIN,UAAAA,CAAU,OAAA,CAAQM,eAAc,OAAA,EAAS,QAAQ,CAAC,CAAC,CAAA;AAC7D,MAAA,OAAO,CAAA,GAAI,MAAA,CAAO,QAAA,CAAS,CAAA,EAAG,EAAE,CAAA,GAAI,MAAA;AAAA,IACtC,CAAA,GAAG;AAAA,IACH,WAAA,EAAaN,WAAU,OAAA,CAAQM,cAAAA,CAAc,SAAS,aAAa,CAAC,CAAC,CAAA,IAAK;AAAA,GAC5E,GACA,MAAA;AAGJ,EAAA,MAAM,OAAA,GAAUA,cAAAA,CAAc,cAAA,EAAgB,OAAO,CAAA;AACrD,EAAA,MAAM,QAAQ,OAAA,GACV;AAAA,IACE,MAAA,EAAQ,YAAA,CAAa,OAAA,EAAS,QAAQ,CAAA,IAAK,EAAA;AAAA,IAC3C,IAAA,EAAM,OAAO,QAAA,CAAS,YAAA,CAAa,SAAS,MAAM,CAAA,IAAK,KAAK,EAAE,CAAA;AAAA,IAC9D,IAAA,EAAM,YAAA,CAAa,OAAA,EAAS,MAAM,CAAA,IAAK,EAAA;AAAA,IACvC,iBAAA,EAAmB,YAAA,CAAa,OAAA,EAAS,mBAAmB,CAAA,IAAK,EAAA;AAAA,IACjE,QAAA,EAAU,YAAA,CAAa,OAAA,EAAS,UAAU,CAAA,IAAK;AAAA,GACjD,GACA,MAAA;AAGJ,EAAA,MAAM,WAAA,GAAcA,cAAAA,CAAc,cAAA,EAAgB,WAAW,CAAA;AAC7D,EAAA,MAAM,SAAA,GAAY,WAAA,GACdC,iBAAAA,CAAiB,WAAA,EAAa,MAAM,EACjC,GAAA,CAAI,CAAC,EAAA,KAAO,MAAA,CAAO,QAAA,CAAS,OAAA,CAAQ,EAAE,CAAA,EAAG,EAAE,CAAC,CAAA,CAC5C,MAAA,CAAO,CAAC,CAAA,KAAM,CAAC,MAAA,CAAO,KAAA,CAAM,CAAC,CAAC,CAAA,GACjC,MAAA;AAEJ,EAAA,MAAM,UAAA,GAAaD,cAAAA,CAAc,cAAA,EAAgB,UAAU,CAAA;AAC3D,EAAA,MAAM,QAAA,GAAW,aACbC,iBAAAA,CAAiB,UAAA,EAAY,KAAK,CAAA,CAC/B,GAAA,CAAI,CAAC,EAAA,KAAOP,UAAAA,CAAU,QAAQ,EAAE,CAAC,CAAC,CAAA,CAClC,MAAA,CAAO,CAAC,CAAA,KAAM,CAAA,CAAE,MAAA,GAAS,CAAC,CAAA,GAC7B,MAAA;AAEJ,EAAA,MAAM,OAAA,GAAsB;AAAA,IAC1B,KAAA;AAAA,IACA,IAAA;AAAA,IACA;AAAA,GACF;AAGA,EAAA,IAAI,QAAA,UAAkB,QAAA,GAAW,QAAA;AACjC,EAAA,IAAI,SAAA,UAAmB,SAAA,GAAY,SAAA;AACnC,EAAA,IAAI,cAAA,UAAwB,cAAA,GAAiB,cAAA;AAC7C,EAAA,IAAI,SAAA,UAAmB,SAAA,GAAY,SAAA;AACnC,EAAA,IAAI,OAAA,UAAiB,OAAA,GAAU,OAAA;AAC/B,EAAA,IAAI,aAAA,UAAuB,aAAA,GAAgB,aAAA;AAC3C,EAAA,IAAI,QAAA,UAAkB,QAAA,GAAW,QAAA;AACjC,EAAA,IAAI,SAAA,UAAmB,SAAA,GAAY,SAAA;AACnC,EAAA,IAAI,IAAA,UAAc,IAAA,GAAO,IAAA;AACzB,EAAA,IAAI,KAAA,UAAe,KAAA,GAAQ,KAAA;AAC3B,EAAA,IAAI,GAAA,UAAa,GAAA,GAAM,GAAA;AACvB,EAAA,IAAI,KAAA,UAAe,KAAA,GAAQ,KAAA;AAC3B,EAAA,IAAI,SAAA,IAAa,SAAA,CAAU,MAAA,GAAS,CAAA,UAAW,SAAA,GAAY,SAAA;AAC3D,EAAA,IAAI,QAAA,IAAY,QAAA,CAAS,MAAA,GAAS,CAAA,UAAW,QAAA,GAAW,QAAA;AAExD,EAAA,OAAO,OAAA;AACT;;;AC/GO,SAAS,YAAY,WAAA,EAAkC;AAC5D,EAAA,MAAM,YAAA,GAAe,CAAC,QAAA,KAAyC;AAC7D,IAAA,MAAM,OAAA,GAAUM,cAAAA,CAAc,WAAA,EAAa,QAAQ,CAAA;AACnD,IAAA,MAAM,IAAA,GAAON,UAAAA,CAAU,OAAA,CAAQ,OAAO,CAAC,CAAA;AACvC,IAAA,OAAO,IAAA,IAAQ,MAAA;AAAA,EACjB,CAAA;AAEA,EAAA,MAAM,OAAA,GAAU,CAAC,QAAA,KAAyC;AACxD,IAAA,MAAM,IAAA,GAAO,aAAa,QAAQ,CAAA;AAClC,IAAA,OAAO,IAAA,GAAO,YAAA,CAAa,IAAI,CAAA,IAAK,MAAA,GAAY,MAAA;AAAA,EAClD,CAAA;AAEA,EAAA,MAAM,QAAA,GAAW,CAAC,QAAA,KAA2C;AAC3D,IAAA,MAAM,QAAA,GAAWO,iBAAAA,CAAiB,WAAA,EAAa,QAAQ,CAAA;AACvD,IAAA,IAAI,QAAA,CAAS,MAAA,KAAW,CAAA,EAAG,OAAO,MAAA;AAClC,IAAA,MAAM,UAAU,QAAA,CAAS,GAAA,CAAI,CAAC,EAAA,KAAOP,WAAU,OAAA,CAAQ,EAAE,CAAC,CAAC,EAAE,MAAA,CAAO,CAAC,IAAA,KAAS,IAAA,CAAK,SAAS,CAAC,CAAA;AAC7F,IAAA,OAAO,OAAA,CAAQ,MAAA,GAAS,CAAA,GAAI,OAAA,GAAU,MAAA;AAAA,EACxC,CAAA;AAGA,EAAA,MAAM,KAAA,GAAQ,aAAa,OAAO,CAAA;AAClC,EAAA,MAAM,IAAA,GAAO,aAAa,MAAM,CAAA;AAChC,EAAA,MAAM,WAAA,GAAc,aAAa,aAAa,CAAA;AAC9C,EAAA,MAAM,MAAA,GAAS,aAAa,QAAQ,CAAA;AACpC,EAAA,MAAM,QAAA,GAAW,SAAS,UAAU,CAAA;AACpC,EAAA,MAAM,QAAA,GAAW,aAAa,UAAU,CAAA;AACxC,EAAA,MAAM,OAAA,GAAU,QAAQ,SAAS,CAAA;AAGjC,EAAA,MAAM,WAAA,GAAcM,cAAAA,CAAc,WAAA,EAAa,WAAW,CAAA;AAC1D,EAAA,MAAM,YAAsC,WAAA,GACxC;AAAA,IACE,GAAA,EAAK,YAAA,CAAa,WAAA,EAAa,KAAK,CAAA,IAAK,EAAA;AAAA,IACzC,MAAA,EAAQ,OAAO,QAAA,CAAS,YAAA,CAAa,aAAa,QAAQ,CAAA,IAAK,KAAK,EAAE,CAAA;AAAA,IACtE,IAAA,EAAM,YAAA,CAAa,WAAA,EAAa,MAAM,CAAA,IAAK;AAAA,GAC7C,GACA,MAAA;AAGJ,EAAA,MAAM,MAAA,GAASA,cAAAA,CAAc,WAAA,EAAa,MAAM,CAAA;AAChD,EAAA,MAAM,OAA4B,MAAA,GAC9B;AAAA,IACE,KAAA,EAAON,UAAAA,CAAU,OAAA,CAAQ,MAAM,CAAC,CAAA;AAAA,IAChC,aAAa,YAAA,CAAa,MAAA,EAAQ,aAAa,CAAA,EAAG,aAAY,KAAM;AAAA,GACtE,GACA,MAAA;AAGJ,EAAA,MAAM,QAAA,GAAWM,cAAAA,CAAc,WAAA,EAAa,QAAQ,CAAA;AACpD,EAAA,MAAM,SAAgC,QAAA,GAClC;AAAA,IACE,KAAA,EAAON,UAAAA,CAAU,OAAA,CAAQ,QAAQ,CAAC,CAAA;AAAA,IAClC,GAAA,EAAK,YAAA,CAAa,QAAA,EAAU,KAAK,CAAA,IAAK;AAAA,GACxC,GACA,MAAA;AAEJ,EAAA,MAAM,OAAgB,EAAC;AAGvB,EAAA,IAAI,KAAA,OAAY,KAAA,GAAQ,KAAA;AACxB,EAAA,IAAI,IAAA,OAAW,IAAA,GAAO,IAAA;AACtB,EAAA,IAAI,WAAA,OAAkB,WAAA,GAAc,WAAA;AACpC,EAAA,IAAI,MAAA,OAAa,MAAA,GAAS,MAAA;AAC1B,EAAA,IAAI,QAAA,OAAe,QAAA,GAAW,QAAA;AAC9B,EAAA,IAAI,QAAA,OAAe,QAAA,GAAW,QAAA;AAC9B,EAAA,IAAI,SAAA,OAAgB,SAAA,GAAY,SAAA;AAChC,EAAA,IAAI,IAAA,OAAW,IAAA,GAAO,IAAA;AACtB,EAAA,IAAI,OAAA,OAAc,OAAA,GAAU,OAAA;AAC5B,EAAA,IAAI,MAAA,OAAa,MAAA,GAAS,MAAA;AAE1B,EAAA,OAAO,IAAA;AACT;;;ACrEO,SAAS,kBAAkB,WAAA,EAAwC;AACxE,EAAA,MAAM,aAA4B,EAAC;AAGnC,EAAA,MAAM,cAAA,GAAiBM,cAAAA,CAAc,WAAA,EAAa,iBAAiB,CAAA;AACnE,EAAA,IAAI,cAAA,EAAgB;AAClB,IAAA,UAAA,CAAW,cAAA,GAAiBN,UAAAA,CAAU,OAAA,CAAQ,cAAc,CAAA,EAAG;AAAA,MAC7D,kBAAA,EAAoB;AAAA,KACrB,CAAA;AAAA,EACH;AAGA,EAAA,MAAM,SAAA,GAAYM,cAAAA,CAAc,WAAA,EAAa,YAAY,CAAA;AACzD,EAAA,IAAI,SAAA,EAAW;AACb,IAAA,UAAA,CAAW,SAAA,GAAYN,UAAAA,CAAU,OAAA,CAAQ,SAAS,CAAC,CAAA;AAAA,EACrD;AAGA,EAAA,MAAM,MAAA,GAASM,cAAAA,CAAc,WAAA,EAAa,SAAS,CAAA;AACnD,EAAA,IAAI,MAAA,EAAQ;AACV,IAAA,MAAM,QAAA,GAAWN,UAAAA,CAAU,OAAA,CAAQ,MAAM,CAAC,CAAA;AAE1C,IAAA,MAAM,MAAA,GAAS,aAAa,QAAQ,CAAA;AACpC,IAAA,IAAI,MAAA,EAAQ;AACV,MAAA,UAAA,CAAW,MAAA,GAAS,MAAA;AAAA,IACtB;AAAA,EACF;AAGA,EAAA,MAAM,UAAA,GAAaO,iBAAAA,CAAiB,WAAA,EAAa,YAAY,CAAA;AAC7D,EAAA,IAAI,UAAA,CAAW,SAAS,CAAA,EAAG;AACzB,IAAA,MAAM,WAAW,UAAA,CACd,GAAA,CAAI,CAAC,EAAA,KAAOP,WAAU,OAAA,CAAQ,EAAE,CAAC,CAAC,EAClC,MAAA,CAAO,CAAC,IAAA,KAAS,IAAA,CAAK,SAAS,CAAC,CAAA;AACnC,IAAA,IAAI,QAAA,CAAS,SAAS,CAAA,EAAG;AACvB,MAAA,UAAA,CAAW,SAAA,GAAY,QAAA;AAAA,IACzB;AAAA,EACF;AAGA,EAAA,MAAM,aAAA,GAAgBO,iBAAAA,CAAiB,WAAA,EAAa,eAAe,CAAA;AACnE,EAAA,IAAI,aAAA,CAAc,SAAS,CAAA,EAAG;AAC5B,IAAA,UAAA,CAAW,YAAA,GAAe,aAAA,CAAc,GAAA,CAAI,CAAC,EAAA,MAAQ;AAAA,MACnD,GAAA,EAAK,YAAA,CAAa,EAAA,EAAI,KAAK,CAAA,IAAK,EAAA;AAAA,MAChC,IAAA,EAAM,YAAA,CAAa,EAAA,EAAI,MAAM,CAAA,IAAK,MAAA;AAAA,MAClC,MAAA,EAAQ,YAAA,CAAa,EAAA,EAAI,QAAQ,CAAA,IAAK,MAAA;AAAA,MACtC,QAAQ,MAAM;AACZ,QAAA,MAAM,CAAA,GAAI,YAAA,CAAa,EAAA,EAAI,OAAO,CAAA;AAClC,QAAA,OAAO,CAAA,GAAI,MAAA,CAAO,QAAA,CAAS,CAAA,EAAG,EAAE,CAAA,GAAI,MAAA;AAAA,MACtC,CAAA,GAAG;AAAA,MACH,SAAS,MAAM;AACb,QAAA,MAAM,CAAA,GAAI,YAAA,CAAa,EAAA,EAAI,QAAQ,CAAA;AACnC,QAAA,OAAO,CAAA,GAAI,MAAA,CAAO,QAAA,CAAS,CAAA,EAAG,EAAE,CAAA,GAAI,MAAA;AAAA,MACtC,CAAA;AAAG,KACL,CAAE,CAAA;AAAA,EACJ;AAGA,EAAA,MAAM,eAAA,GAAkBA,iBAAAA,CAAiB,WAAA,EAAa,iBAAiB,CAAA;AACvE,EAAA,IAAI,eAAA,CAAgB,SAAS,CAAA,EAAG;AAC9B,IAAA,UAAA,CAAW,cAAA,GAAiB,eAAA,CAAgB,GAAA,CAAI,CAAC,EAAA,MAAQ;AAAA,MACvD,GAAA,EAAK,YAAA,CAAa,EAAA,EAAI,KAAK,CAAA,IAAK,EAAA;AAAA,MAChC,QAAQ,MAAM;AACZ,QAAA,MAAM,CAAA,GAAI,YAAA,CAAa,EAAA,EAAI,OAAO,CAAA;AAClC,QAAA,OAAO,CAAA,GAAI,MAAA,CAAO,QAAA,CAAS,CAAA,EAAG,EAAE,CAAA,GAAI,MAAA;AAAA,MACtC,CAAA,GAAG;AAAA,MACH,SAAS,MAAM;AACb,QAAA,MAAM,CAAA,GAAI,YAAA,CAAa,EAAA,EAAI,QAAQ,CAAA;AACnC,QAAA,OAAO,CAAA,GAAI,MAAA,CAAO,QAAA,CAAS,CAAA,EAAG,EAAE,CAAA,GAAI,MAAA;AAAA,MACtC,CAAA;AAAG,KACL,CAAE,CAAA;AAAA,EACJ;AAEA,EAAA,OAAO,UAAA;AACT;;;ACvEO,SAAS,QAAA,CAAS,KAAa,OAAA,EAAyC;AAE7E,EAAA,MAAM,GAAA,GAAM,YAAY,GAAG,CAAA;AAG3B,EAAA,MAAM,KAAA,GAAQD,cAAAA,CAAc,GAAA,EAAK,KAAK,CAAA;AACtC,EAAA,IAAI,CAAC,KAAA,EAAO;AACV,IAAA,MAAM,IAAI,MAAM,yCAAyC,CAAA;AAAA,EAC3D;AAGA,EAAA,MAAM,OAAA,GAAU,KAAA,CAAM,UAAA,CAAW,OAAA,IAAW,KAAA;AAG5C,EAAA,MAAM,SAAA,GAAYA,cAAAA,CAAc,KAAA,EAAO,SAAS,CAAA;AAChD,EAAA,IAAI,CAAC,SAAA,EAAW;AACd,IAAA,MAAM,IAAI,MAAM,wCAAwC,CAAA;AAAA,EAC1D;AAGA,EAAA,MAAM,OAAA,GAAU,eAAe,SAAS,CAAA;AAGxC,EAAA,MAAM,YAAA,GAAeC,iBAAAA,CAAiB,SAAA,EAAW,MAAM,CAAA;AACvD,EAAA,MAAM,KAAA,GAA2B,YAAA,CAAa,GAAA,CAAI,CAAC,MAAA,KAAW;AAC5D,IAAA,MAAM,IAAA,GAAO,YAAY,MAAM,CAAA;AAC/B,IAAA,MAAM,UAAA,GAAa,kBAAkB,MAAM,CAAA;AAG3C,IAAA,IAAI,MAAA,CAAO,IAAA,CAAK,UAAU,CAAA,CAAE,SAAS,CAAA,EAAG;AACtC,MAAA,OAAO,EAAE,GAAG,IAAA,EAAM,UAAA,EAAW;AAAA,IAC/B;AAEA,IAAA,OAAO,IAAA;AAAA,EACT,CAAC,CAAA;AAGD,EAAA,MAAM,iBAAA,GAAoB,OAAA,GAAU,oBAAA,CAAqB,OAAA,EAAS,OAAO,CAAA,GAAI,OAAA;AAC7E,EAAA,MAAM,eAAA,GAAkB,OAAA,GAAU,KAAA,CAAM,GAAA,CAAI,CAAC,SAASC,kBAAAA,CAAkB,IAAA,EAAM,OAAO,CAAC,CAAA,GAAI,KAAA;AAE1F,EAAA,OAAO;AAAA,IACL,OAAA;AAAA,IACA,OAAA,EAAS,iBAAA;AAAA,IACT,KAAA,EAAO;AAAA,GACT;AACF;AAKA,SAAS,oBAAA,CAAqB,SAAqB,OAAA,EAAmC;AACpF,EAAA,OAAO;AAAA,IACL,GAAG,OAAA;AAAA,IACH,IAAA,EAAM,QAAQ,IAAA,GAAO,iBAAA,CAAkB,SAAS,OAAA,CAAQ,IAAI,IAAI,OAAA,CAAQ,IAAA;AAAA,IACxE,KAAA,EAAO,QAAQ,KAAA,GACX;AAAA,MACE,GAAG,OAAA,CAAQ,KAAA;AAAA,MACX,GAAA,EAAK,iBAAA,CAAkB,OAAA,EAAS,OAAA,CAAQ,MAAM,GAAG,CAAA;AAAA,MACjD,IAAA,EAAM,OAAA,CAAQ,KAAA,CAAM,IAAA,GAChB,iBAAA,CAAkB,OAAA,EAAS,OAAA,CAAQ,KAAA,CAAM,IAAI,CAAA,GAC7C,OAAA,CAAQ,KAAA,CAAM;AAAA,QAEpB,OAAA,CAAQ,KAAA;AAAA,IACZ,IAAA,EAAM,QAAQ,IAAA,GAAO,iBAAA,CAAkB,SAAS,OAAA,CAAQ,IAAI,IAAI,OAAA,CAAQ;AAAA,GAC1E;AACF;AAKA,SAASA,kBAAAA,CAAkB,MAAe,OAAA,EAAgC;AACxE,EAAA,OAAO;AAAA,IACL,GAAG,IAAA;AAAA,IACH,IAAA,EAAM,KAAK,IAAA,GAAO,iBAAA,CAAkB,SAAS,IAAA,CAAK,IAAI,IAAI,IAAA,CAAK,IAAA;AAAA,IAC/D,QAAA,EAAU,KAAK,QAAA,GAAW,iBAAA,CAAkB,SAAS,IAAA,CAAK,QAAQ,IAAI,IAAA,CAAK,QAAA;AAAA,IAC3E,SAAA,EAAW,KAAK,SAAA,GACZ;AAAA,MACE,GAAG,IAAA,CAAK,SAAA;AAAA,MACR,GAAA,EAAK,iBAAA,CAAkB,OAAA,EAAS,IAAA,CAAK,UAAU,GAAG;AAAA,QAEpD,IAAA,CAAK;AAAA,GACX;AACF;;;AC7DO,SAAS,SAAA,CAAU,SAAiB,OAAA,EAAqC;AAC9E,EAAA,MAAM,MAAA,GAAS,aAAa,OAAO,CAAA;AAEnC,EAAA,IAAI,WAAW,SAAA,EAAW;AACxB,IAAA,MAAM,IAAI,MAAM,wEAAwE,CAAA;AAAA,EAC1F;AAEA,EAAA,OAAO,WAAA,CAAY,OAAA,EAAS,MAAA,EAAQ,OAAO,CAAA;AAC7C;AAsBO,SAAS,WAAA,CACd,OAAA,EACA,MAAA,EACA,OAAA,EACa;AACb,EAAA,IAAI,WAAW,SAAA,EAAW;AACxB,IAAA,MAAM,IAAI,MAAM,yCAAyC,CAAA;AAAA,EAC3D;AAEA,EAAA,QAAQ,MAAA;AAAQ,IACd,KAAK,KAAA,EAAO;AACV,MAAA,MAAM,GAAA,GAAM,QAAA,CAAS,OAAA,EAAS,OAAO,CAAA;AACrC,MAAA,OAAO;AAAA,QACL,IAAA,EAAM,aAAa,GAAG,CAAA;AAAA,QACtB,QAAA,EAAU;AAAA,OACZ;AAAA,IACF;AAAA,IAEA,KAAK,MAAA,EAAQ;AACX,MAAA,MAAM,IAAA,GAAO,SAAA,CAAU,OAAA,EAAS,OAAO,CAAA;AACvC,MAAA,OAAO;AAAA,QACL,IAAA,EAAM,cAAc,IAAI,CAAA;AAAA,QACxB,QAAA,EAAU;AAAA,OACZ;AAAA,IACF;AAAA,IAEA,KAAK,WAAA,EAAa;AAChB,MAAA,MAAM,QAAA,GAAW,aAAA,CAAc,OAAA,EAAS,OAAO,CAAA;AAC/C,MAAA,OAAO;AAAA,QACL,IAAA,EAAM,kBAAkB,QAAQ,CAAA;AAAA,QAChC,QAAA,EAAU;AAAA,OACZ;AAAA,IACF;AAAA;AAEJ;;;ACsDO,IAAM,UAAA,GAAN,cAAyB,KAAA,CAAM;AAAA,EACpC,YAAY,OAAA,EAAiB;AAC3B,IAAA,KAAA,CAAM,OAAO,CAAA;AACb,IAAA,IAAA,CAAK,IAAA,GAAO,YAAA;AACZ,IAAA,KAAA,CAAM,iBAAA,GAAoB,IAAA,EAAM,IAAA,CAAK,WAAW,CAAA;AAAA,EAClD;AACF;AAKO,IAAM,iBAAA,GAAN,cAAgC,UAAA,CAAW;AAAA,EAChD,WAAA,CACE,SACgB,KAAA,EAChB;AACA,IAAA,KAAA,CAAM,OAAO,CAAA;AAFG,IAAA,IAAA,CAAA,KAAA,GAAA,KAAA;AAGhB,IAAA,IAAA,CAAK,IAAA,GAAO,mBAAA;AAAA,EACd;AACF;AAKO,IAAM,iBAAA,GAAN,cAAgC,UAAA,CAAW;AAAA,EAChD,WAAA,CACE,SACgB,SAAA,EAChB;AACA,IAAA,KAAA,CAAM,OAAO,CAAA;AAFG,IAAA,IAAA,CAAA,SAAA,GAAA,SAAA;AAGhB,IAAA,IAAA,CAAK,IAAA,GAAO,mBAAA;AAAA,EACd;AACF;AAKO,IAAM,cAAA,GAAN,cAA6B,UAAA,CAAW;AAAA,EAC7C,WAAA,CACE,OAAA,EACgB,UAAA,EACA,UAAA,EACA,QAAA,EAChB;AACA,IAAA,KAAA,CAAM,OAAO,CAAA;AAJG,IAAA,IAAA,CAAA,UAAA,GAAA,UAAA;AACA,IAAA,IAAA,CAAA,UAAA,GAAA,UAAA;AACA,IAAA,IAAA,CAAA,QAAA,GAAA,QAAA;AAGhB,IAAA,IAAA,CAAK,IAAA,GAAO,gBAAA;AAAA,EACd;AACF;AAKO,IAAM,cAAA,GAAN,cAA6B,UAAA,CAAW;AAAA,EAC7C,WAAA,CACE,OAAA,EACgB,OAAA,EACA,UAAA,EAChB;AACA,IAAA,KAAA,CAAM,OAAO,CAAA;AAHG,IAAA,IAAA,CAAA,OAAA,GAAA,OAAA;AACA,IAAA,IAAA,CAAA,UAAA,GAAA,UAAA;AAGhB,IAAA,IAAA,CAAK,IAAA,GAAO,gBAAA;AAAA,EACd;AACF;AAKO,IAAM,kBAAA,GAAN,cAAiC,UAAA,CAAW;AAAA,EACjD,WAAA,CACE,OAAA,EACgB,QAAA,EACA,KAAA,EAChB;AACA,IAAA,KAAA,CAAM,OAAO,CAAA;AAHG,IAAA,IAAA,CAAA,QAAA,GAAA,QAAA;AACA,IAAA,IAAA,CAAA,KAAA,GAAA,KAAA;AAGhB,IAAA,IAAA,CAAK,IAAA,GAAO,oBAAA;AAAA,EACd;AACF;AAKO,IAAM,kBAAA,GAAN,cAAiC,UAAA,CAAW;AAAA,EACjD,WAAA,CACE,OAAA,EACgB,aAAA,EACA,YAAA,EAChB;AACA,IAAA,KAAA,CAAM,OAAO,CAAA;AAHG,IAAA,IAAA,CAAA,aAAA,GAAA,aAAA;AACA,IAAA,IAAA,CAAA,YAAA,GAAA,YAAA;AAGhB,IAAA,IAAA,CAAK,IAAA,GAAO,oBAAA;AAAA,EACd;AACF;AAKO,IAAM,qBAAA,GAAN,cAAoC,UAAA,CAAW;AAAA,EACpD,WAAA,CACE,OAAA,EACgB,WAAA,EACA,YAAA,EAChB;AACA,IAAA,KAAA,CAAM,OAAO,CAAA;AAHG,IAAA,IAAA,CAAA,WAAA,GAAA,WAAA;AACA,IAAA,IAAA,CAAA,YAAA,GAAA,YAAA;AAGhB,IAAA,IAAA,CAAK,IAAA,GAAO,uBAAA;AAAA,EACd;AACF;;;ACtOO,SAAS,cAAA,CAAe,QAAqB,WAAA,EAAqC;AAEvF,EAAA,MAAM,WAAA,GAAc,UAAU,MAAM,CAAA;AACpC,EAAA,IAAI,WAAA,EAAa;AACf,IAAA,OAAO,WAAA;AAAA,EACT;AAGA,EAAA,IAAI,WAAA,EAAa;AACf,IAAA,MAAM,cAAA,GAAiB,4BAA4B,WAAW,CAAA;AAC9D,IAAA,IAAI,cAAA,EAAgB;AAClB,MAAA,OAAO,cAAA;AAAA,IACT;AAAA,EACF;AAGA,EAAA,MAAM,UAAU,IAAI,UAAA,CAAW,OAAO,KAAA,CAAM,CAAA,EAAG,IAAI,CAAC,CAAA;AACpD,EAAA,MAAM,WAAA,GAAc,IAAI,WAAA,CAAY,OAAA,EAAS,EAAE,OAAO,KAAA,EAAO,CAAA,CAAE,MAAA,CAAO,OAAO,CAAA;AAC7E,EAAA,MAAM,YAAA,GAAe,qBAAqB,WAAW,CAAA;AACrD,EAAA,IAAI,YAAA,EAAc;AAChB,IAAA,OAAO,YAAA;AAAA,EACT;AAGA,EAAA,OAAO,OAAA;AACT;AAQA,SAAS,UAAU,MAAA,EAAoC;AACrD,EAAA,MAAM,KAAA,GAAQ,IAAI,UAAA,CAAW,MAAM,CAAA;AAGnC,EAAA,IAAI,KAAA,CAAM,MAAA,IAAU,CAAA,IAAK,KAAA,CAAM,CAAC,CAAA,KAAM,GAAA,IAAQ,KAAA,CAAM,CAAC,CAAA,KAAM,GAAA,IAAQ,KAAA,CAAM,CAAC,MAAM,GAAA,EAAM;AACpF,IAAA,OAAO,OAAA;AAAA,EACT;AAGA,EAAA,IAAI,KAAA,CAAM,MAAA,IAAU,CAAA,IAAK,KAAA,CAAM,CAAC,MAAM,GAAA,IAAQ,KAAA,CAAM,CAAC,CAAA,KAAM,GAAA,EAAM;AAC/D,IAAA,OAAO,UAAA;AAAA,EACT;AAGA,EAAA,IAAI,KAAA,CAAM,MAAA,IAAU,CAAA,IAAK,KAAA,CAAM,CAAC,MAAM,GAAA,IAAQ,KAAA,CAAM,CAAC,CAAA,KAAM,GAAA,EAAM;AAC/D,IAAA,OAAO,UAAA;AAAA,EACT;AAEA,EAAA,OAAO,IAAA;AACT;AAYO,SAAS,4BAA4B,WAAA,EAAoC;AAC9E,EAAA,MAAM,KAAA,GAAQ,iCAAA,CAAkC,IAAA,CAAK,WAAW,CAAA;AAChE,EAAA,IAAI,KAAA,EAAO;AACT,IAAA,OAAO,iBAAA,CAAkB,KAAA,CAAM,CAAC,CAAC,CAAA;AAAA,EACnC;AACA,EAAA,OAAO,IAAA;AACT;AAeO,SAAS,qBAAqB,IAAA,EAA6B;AAEhE,EAAA,MAAM,YAAA,GAAe,2CAAA,CAA4C,IAAA,CAAK,IAAI,CAAA;AAC1E,EAAA,IAAI,YAAA,EAAc;AAChB,IAAA,OAAO,iBAAA,CAAkB,YAAA,CAAa,CAAC,CAAC,CAAA;AAAA,EAC1C;AAGA,EAAA,MAAM,cAAA,GACJ,mFAAA,CAAoF,IAAA,CAAK,IAAI,CAAA;AAC/F,EAAA,IAAI,cAAA,EAAgB;AAClB,IAAA,MAAM,OAAA,GAAU,2BAAA,CAA4B,cAAA,CAAe,CAAC,CAAC,CAAA;AAC7D,IAAA,IAAI,OAAA,EAAS;AACX,MAAA,OAAO,OAAA;AAAA,IACT;AAAA,EACF;AAEA,EAAA,OAAO,IAAA;AACT;AAWA,SAAS,kBAAkB,QAAA,EAA0B;AACnD,EAAA,MAAM,UAAA,GAAa,QAAA,CAAS,WAAA,EAAY,CAAE,IAAA,EAAK;AAG/C,EAAA,MAAM,OAAA,GAAkC;AAAA,IACtC,IAAA,EAAM,OAAA;AAAA,IACN,YAAA,EAAc,QAAA;AAAA,IACd,WAAA,EAAa,QAAA;AAAA,IACb,WAAA,EAAa,QAAA;AAAA,IACb,cAAA,EAAgB,cAAA;AAAA,IAChB,MAAA,EAAQ,cAAA;AAAA,IACR,IAAA,EAAM;AAAA,GACR;AAEA,EAAA,OAAO,OAAA,CAAQ,UAAU,CAAA,IAAK,UAAA;AAChC;AAeO,SAAS,YAAA,CAAa,MAAA,EAAqB,QAAA,EAAkBC,SAAAA,GAAW,IAAA,EAAc;AAC3F,EAAA,IAAI;AACF,IAAA,MAAM,UAAU,IAAI,WAAA,CAAY,UAAU,EAAE,KAAA,EAAOA,WAAU,CAAA;AAC7D,IAAA,OAAO,OAAA,CAAQ,OAAO,MAAM,CAAA;AAAA,EAC9B,SAAS,KAAA,EAAO;AACd,IAAA,IAAIA,SAAAA,EAAU;AACZ,MAAA,MAAM,IAAI,kBAAA;AAAA,QACR,CAAA,wCAAA,EAA2C,QAAQ,CAAA,GAAA,EAAM,KAAK,CAAA,CAAA;AAAA,QAC9D,QAAA;AAAA,QACA;AAAA,OACF;AAAA,IACF;AAGA,IAAA,MAAM,UAAU,IAAI,WAAA,CAAY,SAAS,EAAE,KAAA,EAAO,OAAO,CAAA;AACzD,IAAA,OAAO,OAAA,CAAQ,OAAO,MAAM,CAAA;AAAA,EAC9B;AACF;;;ACpKA,IAAM,eAAA,GAAkB,GAAA;AACxB,IAAM,qBAAA,GAAwB,EAAA;AAC9B,IAAM,gBAAA,GAAmB,KAAK,IAAA,GAAO,IAAA;AACrC,IAAM,kBAAA,GACJ,qFAAA;AACF,IAAM,6BAAA,GAAgC;AAAA,EACpC,WAAA;AAAA,EACA,UAAA;AAAA,EACA,iBAAA;AAAA,EACA,uBAAA;AAAA,EACA,qBAAA;AAAA,EACA,sBAAA;AAAA,EACA;AACF,CAAA;AAmDA,eAAsB,KAAA,CACpB,OACA,IAAA,EACwB;AACxB,EAAA,MAAM,SAAA,GAAY,KAAK,GAAA,EAAI;AAG3B,EAAA,MAAM,OAAA,GAAUC,kBAAiB,IAAI,CAAA;AACrC,EAAA,MAAM,WAAA,GAAc,OAAO,KAAA,KAAU,QAAA,IAAY,iBAAiB,GAAA,GAAM,MAAA,CAAO,KAAK,CAAA,GAAI,KAAA,CAAM,GAAA;AAG9F,EAAA,MAAM,MAAA,GAAS,WAAA,CAAY,OAAA,CAAQ,OAAA,CAAQ,OAAO,CAAA;AAElD,EAAA,IAAI;AAEF,IAAA,MAAM,EAAE,QAAA,EAAU,aAAA,EAAe,gBAAA,KAAqB,MAAM,eAAA;AAAA,MAC1D,KAAA;AAAA,MACA,OAAA;AAAA,MACA;AAAA,KACF;AAEA,IAAA,MAAM,WAAW,QAAA,CAAS,GAAA;AAG1B,IAAA,IAAI,OAAA,CAAQ,gBAAA,IAAoB,CAAC,QAAA,CAAS,EAAA,EAAI;AAC5C,MAAA,MAAM,IAAI,cAAA;AAAA,QACR,CAAA,KAAA,EAAQ,QAAA,CAAS,MAAM,CAAA,EAAA,EAAK,SAAS,UAAU,CAAA,CAAA;AAAA,QAC/C,QAAA,CAAS,MAAA;AAAA,QACT,QAAA,CAAS,UAAA;AAAA,QACT;AAAA,OACF;AAAA,IACF;AAGA,IAAA,IAAI,QAAQ,iBAAA,EAAmB;AAC7B,MAAA,mBAAA,CAAoB,QAAA,EAAU,QAAQ,mBAAmB,CAAA;AAAA,IAC3D;AAGA,IAAA,MAAM,MAAA,GAAS,MAAM,yBAAA,CAA0B,QAAA,EAAU,QAAQ,OAAO,CAAA;AAGxE,IAAA,MAAM,WAAA,GAAc,QAAA,CAAS,OAAA,CAAQ,GAAA,CAAI,cAAc,CAAA;AACvD,IAAA,MAAM,gBAAA,GAAmB,cAAA,CAAe,MAAA,EAAQ,WAAW,CAAA;AAG3D,IAAA,MAAM,WAAA,GAAc,YAAA,CAAa,MAAA,EAAQ,gBAAA,EAAkB,QAAQ,gBAAgB,CAAA;AAGnF,IAAA,MAAM,OAAA,GAAU,KAAK,GAAA,EAAI;AACzB,IAAA,MAAM,gBAAA,GAAmB,oBAAoB,QAAA,EAAU;AAAA,MACrD,WAAA;AAAA,MACA,QAAA;AAAA,MACA,aAAA;AAAA,MACA,gBAAA;AAAA,MACA,WAAA;AAAA,MACA,MAAA,EAAQ;AAAA,QACN,KAAA,EAAO,SAAA;AAAA,QACP,GAAA,EAAK,OAAA;AAAA,QACL,UAAU,OAAA,GAAU,SAAA;AAAA,QACpB;AAAA;AACF,KACD,CAAA;AAED,IAAA,OAAO,gBAAA;AAAA,EACT,SAAS,KAAA,EAAO;AAEd,IAAA,IAAI,KAAA,YAAiB,iBAAA,IAAqB,KAAA,YAAiB,iBAAA,EAAmB;AAC5E,MAAA,MAAM,KAAA;AAAA,IACR;AAEA,IAAA,IAAK,KAAA,CAAgB,SAAS,cAAA,EAAgB;AAC5C,MAAA,MAAM,IAAI,iBAAA,CAAkB,CAAA,sBAAA,EAAyB,QAAQ,OAAO,CAAA,EAAA,CAAA,EAAM,QAAQ,OAAO,CAAA;AAAA,IAC3F;AAEA,IAAA,IAAI,iBAAiB,SAAA,EAAW;AAE9B,MAAA,MAAM,IAAI,iBAAA,CAAkB,CAAA,eAAA,EAAkB,KAAA,CAAM,OAAO,IAAI,KAAK,CAAA;AAAA,IACtE;AAGA,IAAA,MAAM,KAAA;AAAA,EACR;AACF;AAKA,SAASA,kBACP,IAAA,EAC4D;AAC5D,EAAA,OAAO;AAAA,IACL,GAAG,IAAA;AAAA,IACH,OAAA,EAAS,MAAM,OAAA,IAAW,eAAA;AAAA,IAC1B,YAAA,EAAc,MAAM,YAAA,IAAgB,qBAAA;AAAA,IACpC,OAAA,EAAS,MAAM,OAAA,IAAW,gBAAA;AAAA,IAC1B,SAAA,EAAW,MAAM,SAAA,IAAa,kBAAA;AAAA,IAC9B,gBAAA,EAAkB,MAAM,gBAAA,IAAoB,IAAA;AAAA,IAC5C,iBAAA,EAAmB,MAAM,iBAAA,IAAqB,KAAA;AAAA,IAC9C,mBAAA,EAAqB,MAAM,mBAAA,IAAuB,6BAAA;AAAA,IAClD,eAAA,EAAiB,MAAM,eAAA,IAAmB,IAAA;AAAA,IAC1C,gBAAA,EAAkB,MAAM,gBAAA,IAAoB;AAAA,GAC9C;AACF;AAKA,eAAe,eAAA,CACb,KAAA,EACA,OAAA,EACA,MAAA,EACoF;AACpF,EAAA,IAAI,GAAA,GAAM,OAAO,KAAA,KAAU,QAAA,IAAY,iBAAiB,GAAA,GAAM,MAAA,CAAO,KAAK,CAAA,GAAI,KAAA,CAAM,GAAA;AACpF,EAAA,MAAM,gBAA0B,EAAC;AACjC,EAAA,MAAM,aAAA,GAAgB,KAAK,GAAA,EAAI;AAC/B,EAAA,MAAM,QAAA,uBAAe,GAAA,EAAY;AAGjC,EAAA,IAAI,CAAC,QAAQ,eAAA,EAAiB;AAC5B,IAAA,MAAM,WAAW,MAAM,gBAAA,CAAiB,GAAA,EAAK,OAAA,EAAS,QAAQ,KAAK,CAAA;AACnE,IAAA,OAAO,EAAE,QAAA,EAAU,aAAA,EAAe,EAAC,EAAG,kBAAkB,CAAA,EAAE;AAAA,EAC5D;AAEA,EAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,IAAK,OAAA,CAAQ,cAAc,CAAA,EAAA,EAAK;AAE9C,IAAA,IAAI,QAAA,CAAS,GAAA,CAAI,GAAG,CAAA,EAAG;AACrB,MAAA,MAAM,IAAI,kBAAA;AAAA,QACR,2BAA2B,GAAG,CAAA,CAAA;AAAA,QAC9B,aAAA;AAAA,QACA,OAAA,CAAQ;AAAA,OACV;AAAA,IACF;AACA,IAAA,QAAA,CAAS,IAAI,GAAG,CAAA;AAGhB,IAAA,MAAM,WAAW,MAAM,gBAAA,CAAiB,GAAA,EAAK,OAAA,EAAS,QAAQ,IAAI,CAAA;AAGlE,IAAA,IAAI,QAAA,CAAS,MAAA,IAAU,GAAA,IAAO,QAAA,CAAS,SAAS,GAAA,EAAK;AACnD,MAAA,MAAM,QAAA,GAAW,QAAA,CAAS,OAAA,CAAQ,GAAA,CAAI,UAAU,CAAA;AAChD,MAAA,IAAI,CAAC,QAAA,EAAU;AACb,QAAA,MAAM,IAAI,kBAAA,CAAmB,2CAAA,EAA6C,aAAa,CAAA;AAAA,MACzF;AAGA,MAAA,aAAA,CAAc,KAAK,GAAG,CAAA;AAGtB,MAAA,IAAI;AACF,QAAA,GAAA,GAAM,IAAI,GAAA,CAAI,QAAA,EAAU,GAAG,CAAA,CAAE,IAAA;AAAA,MAC/B,CAAA,CAAA,MAAQ;AACN,QAAA,MAAM,IAAI,kBAAA;AAAA,UACR,8BAA8B,QAAQ,CAAA,CAAA;AAAA,UACtC,aAAA;AAAA,UACA,OAAA,CAAQ;AAAA,SACV;AAAA,MACF;AAGA,MAAA,IAAI,CAAC,IAAI,UAAA,CAAW,SAAS,KAAK,CAAC,GAAA,CAAI,UAAA,CAAW,UAAU,CAAA,EAAG;AAC7D,QAAA,MAAM,IAAI,kBAAA;AAAA,UACR,4BAA4B,GAAG,CAAA,CAAA;AAAA,UAC/B,aAAA;AAAA,UACA,OAAA,CAAQ;AAAA,SACV;AAAA,MACF;AAEA,MAAA;AAAA,IACF;AAGA,IAAA,MAAM,gBAAA,GAAmB,IAAA,CAAK,GAAA,EAAI,GAAI,aAAA;AACtC,IAAA,OAAO,EAAE,QAAA,EAAU,aAAA,EAAe,gBAAA,EAAiB;AAAA,EACrD;AAGA,EAAA,MAAM,IAAI,kBAAA;AAAA,IACR,CAAA,qBAAA,EAAwB,QAAQ,YAAY,CAAA,CAAA,CAAA;AAAA,IAC5C,aAAA;AAAA,IACA,OAAA,CAAQ;AAAA,GACV;AACF;AAKA,eAAe,gBAAA,CACb,GAAA,EACA,OAAA,EACA,MAAA,EACA,cAAA,EACmB;AACnB,EAAA,MAAM,OAAA,GAAU,IAAI,OAAA,CAAQ,OAAA,CAAQ,OAAO,CAAA;AAG3C,EAAA,IAAI,CAAC,OAAA,CAAQ,GAAA,CAAI,YAAY,CAAA,EAAG;AAC9B,IAAA,OAAA,CAAQ,GAAA,CAAI,YAAA,EAAc,OAAA,CAAQ,SAAS,CAAA;AAAA,EAC7C;AAGA,EAAA,IAAI,CAAC,OAAA,CAAQ,GAAA,CAAI,QAAQ,CAAA,EAAG;AAC1B,IAAA,OAAA,CAAQ,GAAA,CAAI,UAAU,iEAAiE,CAAA;AAAA,EACzF;AAGA,EAAA,IAAI,CAAC,OAAA,CAAQ,GAAA,CAAI,iBAAiB,CAAA,EAAG;AACnC,IAAA,OAAA,CAAQ,GAAA,CAAI,mBAAmB,gBAAgB,CAAA;AAAA,EACjD;AAEA,EAAA,OAAO,MAAM,GAAA,EAAK;AAAA,IAChB,GAAG,OAAA;AAAA,IACH,OAAA;AAAA,IACA,MAAA;AAAA,IACA,QAAA,EAAU,iBAAiB,QAAA,GAAW;AAAA,GACvC,CAAA;AACH;AAKA,eAAe,yBAAA,CACb,UACA,OAAA,EACsB;AACtB,EAAA,MAAM,aAAA,GAAgB,QAAA,CAAS,OAAA,CAAQ,GAAA,CAAI,gBAAgB,CAAA;AAC3D,EAAA,IAAI,aAAA,EAAe;AACjB,IAAA,MAAM,IAAA,GAAO,MAAA,CAAO,QAAA,CAAS,aAAA,EAAe,EAAE,CAAA;AAC9C,IAAA,IAAI,OAAO,OAAA,EAAS;AAClB,MAAA,MAAM,IAAI,cAAA;AAAA,QACR,CAAA,cAAA,EAAiB,IAAI,CAAA,uBAAA,EAA0B,OAAO,CAAA,MAAA,CAAA;AAAA,QACtD,OAAA;AAAA,QACA;AAAA,OACF;AAAA,IACF;AAAA,EACF;AAGA,EAAA,MAAM,MAAA,GAAS,MAAM,QAAA,CAAS,WAAA,EAAY;AAG1C,EAAA,IAAI,MAAA,CAAO,aAAa,OAAA,EAAS;AAC/B,IAAA,MAAM,IAAI,cAAA;AAAA,MACR,CAAA,cAAA,EAAiB,MAAA,CAAO,UAAU,CAAA,uBAAA,EAA0B,OAAO,CAAA,MAAA,CAAA;AAAA,MACnE,OAAA;AAAA,MACA,MAAA,CAAO;AAAA,KACT;AAAA,EACF;AAEA,EAAA,OAAO,MAAA;AACT;AAKA,SAAS,mBAAA,CAAoB,UAAoB,YAAA,EAA8B;AAC7E,EAAA,MAAM,WAAA,GAAc,QAAA,CAAS,OAAA,CAAQ,GAAA,CAAI,cAAc,CAAA;AACvD,EAAA,IAAI,CAAC,WAAA,EAAa;AAChB,IAAA,MAAM,IAAI,qBAAA,CAAsB,6BAAA,EAA+B,WAAA,EAAa,YAAY,CAAA;AAAA,EAC1F;AAGA,EAAA,MAAM,QAAA,GAAW,YAAY,KAAA,CAAM,GAAG,EAAE,CAAC,CAAA,CAAE,IAAA,EAAK,CAAE,WAAA,EAAY;AAG9D,EAAA,MAAM,SAAA,GAAY,YAAA,CAAa,IAAA,CAAK,CAAC,OAAA,KAAY;AAC/C,IAAA,MAAM,UAAU,OAAA,CAAQ,WAAA,EAAY,CAAE,OAAA,CAAQ,KAAK,IAAI,CAAA;AACvD,IAAA,OAAO,IAAI,MAAA,CAAO,CAAA,CAAA,EAAI,OAAO,CAAA,CAAA,CAAG,CAAA,CAAE,KAAK,QAAQ,CAAA;AAAA,EACjD,CAAC,CAAA;AAED,EAAA,IAAI,CAAC,SAAA,EAAW;AACd,IAAA,MAAM,IAAI,qBAAA;AAAA,MACR,iBAAiB,QAAQ,CAAA,aAAA,CAAA;AAAA,MACzB,QAAA;AAAA,MACA;AAAA,KACF;AAAA,EACF;AACF;AAKA,SAAS,mBAAA,CACP,UACA,QAAA,EAQe;AAEf,EAAA,IAAI,mBAAkC,QAAA,CAAS,WAAA;AAG/C,EAAA,MAAM,gBAAA,GAAmB,QAAA;AAGzB,EAAA,gBAAA,CAAiB,cAAc,QAAA,CAAS,WAAA;AACxC,EAAA,gBAAA,CAAiB,WAAW,QAAA,CAAS,QAAA;AACrC,EAAA,gBAAA,CAAiB,gBAAgB,QAAA,CAAS,aAAA;AAC1C,EAAA,gBAAA,CAAiB,mBAAmB,QAAA,CAAS,gBAAA;AAC7C,EAAA,gBAAA,CAAiB,SAAS,QAAA,CAAS,MAAA;AAGnC,EAAA,gBAAA,CAAiB,WAAW,YAAY;AACtC,IAAA,IAAI,qBAAqB,IAAA,EAAM;AAC7B,MAAA,MAAM,IAAI,MAAM,gCAAgC,CAAA;AAAA,IAClD;AACA,IAAA,MAAM,OAAA,GAAU,gBAAA;AAChB,IAAA,gBAAA,GAAmB,IAAA;AACnB,IAAA,OAAO,OAAA;AAAA,EACT,CAAA;AAEA,EAAA,OAAO,gBAAA;AACT;ACvXO,SAAS,SAAA,CAAU,MAAc,OAAA,EAA4B;AAClE,EAAA,MAAM,EAAE,QAAA,EAAS,GAAIC,kBAAA,CAAkB,IAAA,EAAM;AAAA,IAC3C,KAAK,OAAA,IAAW;AAAA,GACjB,CAAA;AACD,EAAA,OAAO,QAAA;AACT;;;ACTO,SAAS,cAAA,CAAe,KAAe,IAAA,EAAkC;AAC9E,EAAA,MAAM,OAAA,GAAU,GAAA,CAAI,aAAA,CAAc,CAAA,WAAA,EAAc,IAAI,CAAA,EAAA,CAAI,CAAA;AACxD,EAAA,OAAO,OAAA,EAAS,YAAA,CAAa,SAAS,CAAA,IAAK,MAAA;AAC7C;AAmBO,SAAS,eAAA,CAAgB,KAAe,QAAA,EAAsC;AACnF,EAAA,MAAM,OAAA,GAAU,GAAA,CAAI,aAAA,CAAc,CAAA,eAAA,EAAkB,QAAQ,CAAA,EAAA,CAAI,CAAA;AAChE,EAAA,OAAO,OAAA,EAAS,YAAA,CAAa,SAAS,CAAA,IAAK,MAAA;AAC7C;AAuFO,SAAS,wBAAA,CAAyB,KAAe,QAAA,EAA4B;AAClF,EAAA,MAAM,QAAA,GAAW,GAAA,CAAI,gBAAA,CAAiB,CAAA,eAAA,EAAkB,QAAQ,CAAA,EAAA,CAAI,CAAA;AACpE,EAAA,MAAM,SAAmB,EAAC;AAE1B,EAAA,KAAA,MAAW,OAAA,IAAW,KAAA,CAAM,IAAA,CAAK,QAAQ,CAAA,EAAG;AAC1C,IAAA,MAAM,OAAA,GAAU,OAAA,CAAQ,YAAA,CAAa,SAAS,CAAA;AAC9C,IAAA,IAAI,OAAA,EAAS;AACX,MAAA,MAAA,CAAO,KAAK,OAAO,CAAA;AAAA,IACrB;AAAA,EACF;AAEA,EAAA,OAAO,MAAA;AACT;AAmBO,SAAS,gBAAA,CAAiB,KAAe,SAAA,EAAuC;AACrF,EAAA,MAAM,OAAA,GAAU,GAAA,CAAI,aAAA,CAAc,CAAA,iBAAA,EAAoB,SAAS,CAAA,IAAA,CAAM,CAAA;AACrE,EAAA,OAAO,OAAA,EAAS,YAAA,CAAa,SAAS,CAAA,IAAK,MAAA;AAC7C;;;ACvIO,SAAS,iBAAiB,GAAA,EAAkC;AACjE,EAAA,MAAM,WAA8B,EAAC;AAGrC,EAAA,QAAA,CAAS,KAAA,GAAQ,eAAA,CAAgB,GAAA,EAAK,UAAU,CAAA;AAChD,EAAA,QAAA,CAAS,IAAA,GAAO,eAAA,CAAgB,GAAA,EAAK,SAAS,CAAA;AAC9C,EAAA,QAAA,CAAS,KAAA,GAAQ,eAAA,CAAgB,GAAA,EAAK,UAAU,CAAA;AAChD,EAAA,QAAA,CAAS,GAAA,GAAM,eAAA,CAAgB,GAAA,EAAK,QAAQ,CAAA;AAC5C,EAAA,QAAA,CAAS,WAAA,GAAc,eAAA,CAAgB,GAAA,EAAK,gBAAgB,CAAA;AAC5D,EAAA,QAAA,CAAS,QAAA,GAAW,eAAA,CAAgB,GAAA,EAAK,cAAc,CAAA;AACvD,EAAA,QAAA,CAAS,MAAA,GAAS,eAAA,CAAgB,GAAA,EAAK,WAAW,CAAA;AAGlD,EAAA,MAAM,gBAAA,GAAmB,wBAAA,CAAyB,GAAA,EAAK,qBAAqB,CAAA;AAC5E,EAAA,IAAI,gBAAA,CAAiB,SAAS,CAAA,EAAG;AAC/B,IAAA,QAAA,CAAS,eAAA,GAAkB,gBAAA;AAAA,EAC7B;AAGA,EAAA,MAAM,OAAA,GAAU,eAAe,GAAG,CAAA;AAClC,EAAA,IAAI,MAAA,CAAO,IAAA,CAAK,OAAO,CAAA,CAAE,SAAS,CAAA,EAAG;AACnC,IAAA,QAAA,CAAS,OAAA,GAAU,OAAA;AAAA,EACrB;AAGA,EAAA,MAAM,KAAA,GAAQ,aAAa,GAAG,CAAA;AAC9B,EAAA,IAAI,MAAA,CAAO,IAAA,CAAK,KAAK,CAAA,CAAE,SAAS,CAAA,EAAG;AACjC,IAAA,QAAA,CAAS,KAAA,GAAQ,KAAA;AAAA,EACnB;AAGA,EAAA,MAAM,KAAA,GAAQ,aAAa,GAAG,CAAA;AAC9B,EAAA,IAAI,MAAA,CAAO,IAAA,CAAK,KAAK,CAAA,CAAE,SAAS,CAAA,EAAG;AACjC,IAAA,QAAA,CAAS,KAAA,GAAQ,KAAA;AAAA,EACnB;AAGA,EAAA,MAAM,MAAA,GAAS,cAAc,GAAG,CAAA;AAChC,EAAA,IAAI,MAAA,CAAO,SAAS,CAAA,EAAG;AACrB,IAAA,QAAA,CAAS,MAAA,GAAS,MAAA;AAAA,EACpB;AAGA,EAAA,MAAM,IAAA,GAAO,YAAY,GAAG,CAAA;AAC5B,EAAA,IAAI,MAAA,CAAO,IAAA,CAAK,IAAI,CAAA,CAAE,SAAS,CAAA,EAAG;AAChC,IAAA,QAAA,CAAS,IAAA,GAAO,IAAA;AAAA,EAClB;AAGA,EAAA,MAAM,OAAA,GAAU,eAAe,GAAG,CAAA;AAClC,EAAA,IAAI,MAAA,CAAO,IAAA,CAAK,OAAO,CAAA,CAAE,SAAS,CAAA,EAAG;AACnC,IAAA,QAAA,CAAS,OAAA,GAAU,OAAA;AAAA,EACrB;AAGA,EAAA,OAAO,MAAA,CAAO,WAAA;AAAA,IACZ,MAAA,CAAO,OAAA,CAAQ,QAAQ,CAAA,CAAE,MAAA,CAAO,CAAC,CAAC,CAAA,EAAG,KAAK,CAAA,KAAM,KAAA,KAAU,MAAS;AAAA,GACrE;AACF;AAKA,SAAS,eAAe,GAAA,EAAiC;AACvD,EAAA,MAAM,UAA4B,EAAC;AAEnC,EAAA,OAAA,CAAQ,aAAA,GAAgB,eAAA,CAAgB,GAAA,EAAK,wBAAwB,CAAA;AACrE,EAAA,OAAA,CAAQ,YAAA,GAAe,eAAA,CAAgB,GAAA,EAAK,uBAAuB,CAAA;AACnE,EAAA,OAAA,CAAQ,cAAA,GAAiB,eAAA,CAAgB,GAAA,EAAK,yBAAyB,CAAA;AACvE,EAAA,OAAA,CAAQ,OAAA,GAAU,eAAA,CAAgB,GAAA,EAAK,iBAAiB,CAAA;AAGxD,EAAA,MAAM,OAAA,GAAU,wBAAA,CAAyB,GAAA,EAAK,gBAAgB,CAAA;AAC9D,EAAA,IAAI,OAAA,CAAQ,SAAS,CAAA,EAAG;AACtB,IAAA,OAAA,CAAQ,OAAA,GAAU,OAAA;AAAA,EACpB;AAGA,EAAA,MAAM,IAAA,GAAO,wBAAA,CAAyB,GAAA,EAAK,aAAa,CAAA;AACxD,EAAA,IAAI,IAAA,CAAK,SAAS,CAAA,EAAG;AACnB,IAAA,OAAA,CAAQ,IAAA,GAAO,IAAA;AAAA,EACjB;AAEA,EAAA,OAAO,MAAA,CAAO,WAAA;AAAA,IACZ,MAAA,CAAO,OAAA,CAAQ,OAAO,CAAA,CAAE,MAAA,CAAO,CAAC,CAAC,CAAA,EAAG,KAAK,CAAA,KAAM,KAAA,KAAU,MAAS;AAAA,GACpE;AACF;AAKA,SAAS,aAAa,GAAA,EAA+B;AACnD,EAAA,MAAM,QAAwB,EAAC;AAE/B,EAAA,KAAA,CAAM,MAAM,eAAA,CAAgB,GAAA,EAAK,UAAU,CAAA,IAAK,eAAA,CAAgB,KAAK,cAAc,CAAA;AACnF,EAAA,KAAA,CAAM,SAAA,GAAY,eAAA,CAAgB,GAAA,EAAK,qBAAqB,CAAA;AAC5D,EAAA,KAAA,CAAM,IAAA,GAAO,eAAA,CAAgB,GAAA,EAAK,eAAe,CAAA;AACjD,EAAA,KAAA,CAAM,WAAA,GAAc,eAAA,CAAgB,GAAA,EAAK,uBAAuB,CAAA;AAGhE,EAAA,MAAM,KAAA,GAAQ,eAAA,CAAgB,GAAA,EAAK,gBAAgB,CAAA;AACnD,EAAA,IAAI,KAAA,EAAO;AACT,IAAA,KAAA,CAAM,KAAA,GAAQ,MAAA,CAAO,QAAA,CAAS,KAAA,EAAO,EAAE,CAAA;AAAA,EACzC;AAEA,EAAA,MAAM,MAAA,GAAS,eAAA,CAAgB,GAAA,EAAK,iBAAiB,CAAA;AACrD,EAAA,IAAI,MAAA,EAAQ;AACV,IAAA,KAAA,CAAM,MAAA,GAAS,MAAA,CAAO,QAAA,CAAS,MAAA,EAAQ,EAAE,CAAA;AAAA,EAC3C;AAEA,EAAA,MAAM,QAAA,GAAW,eAAA,CAAgB,GAAA,EAAK,mBAAmB,CAAA;AACzD,EAAA,IAAI,QAAA,EAAU;AACZ,IAAA,KAAA,CAAM,QAAA,GAAW,MAAA,CAAO,QAAA,CAAS,QAAA,EAAU,EAAE,CAAA;AAAA,EAC/C;AAGA,EAAA,MAAM,IAAA,GAAO,wBAAA,CAAyB,GAAA,EAAK,cAAc,CAAA;AACzD,EAAA,IAAI,IAAA,CAAK,SAAS,CAAA,EAAG;AACnB,IAAA,KAAA,CAAM,IAAA,GAAO,IAAA;AAAA,EACf;AAEA,EAAA,OAAO,MAAA,CAAO,WAAA;AAAA,IACZ,MAAA,CAAO,OAAA,CAAQ,KAAK,CAAA,CAAE,MAAA,CAAO,CAAC,CAAC,CAAA,EAAG,KAAK,CAAA,KAAM,KAAA,KAAU,MAAS;AAAA,GAClE;AACF;AAKA,SAAS,aAAa,GAAA,EAA+B;AACnD,EAAA,MAAM,QAAwB,EAAC;AAE/B,EAAA,KAAA,CAAM,MAAM,eAAA,CAAgB,GAAA,EAAK,UAAU,CAAA,IAAK,eAAA,CAAgB,KAAK,cAAc,CAAA;AACnF,EAAA,KAAA,CAAM,SAAA,GAAY,eAAA,CAAgB,GAAA,EAAK,qBAAqB,CAAA;AAC5D,EAAA,KAAA,CAAM,IAAA,GAAO,eAAA,CAAgB,GAAA,EAAK,eAAe,CAAA;AAEjD,EAAA,OAAO,MAAA,CAAO,WAAA;AAAA,IACZ,MAAA,CAAO,OAAA,CAAQ,KAAK,CAAA,CAAE,MAAA,CAAO,CAAC,CAAC,CAAA,EAAG,KAAK,CAAA,KAAM,KAAA,KAAU,MAAS;AAAA,GAClE;AACF;AAKA,SAAS,cAAc,GAAA,EAAiC;AACtD,EAAA,MAAM,SAA2B,EAAC;AAGlC,EAAA,MAAM,SAAA,GAAY,wBAAA,CAAyB,GAAA,EAAK,UAAU,CAAA;AAC1D,EAAA,MAAM,eAAA,GAAkB,wBAAA,CAAyB,GAAA,EAAK,qBAAqB,CAAA;AAC3E,EAAA,MAAM,UAAA,GAAa,wBAAA,CAAyB,GAAA,EAAK,eAAe,CAAA;AAChE,EAAA,MAAM,WAAA,GAAc,wBAAA,CAAyB,GAAA,EAAK,gBAAgB,CAAA;AAClE,EAAA,MAAM,YAAA,GAAe,wBAAA,CAAyB,GAAA,EAAK,iBAAiB,CAAA;AACpE,EAAA,MAAM,SAAA,GAAY,wBAAA,CAAyB,GAAA,EAAK,cAAc,CAAA;AAG9D,EAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,SAAA,CAAU,QAAQ,CAAA,EAAA,EAAK;AACzC,IAAA,MAAM,KAAA,GAAwB;AAAA,MAC5B,GAAA,EAAK,UAAU,CAAC,CAAA;AAAA,MAChB,SAAA,EAAW,gBAAgB,CAAC,CAAA;AAAA,MAC5B,IAAA,EAAM,WAAW,CAAC,CAAA;AAAA,MAClB,GAAA,EAAK,UAAU,CAAC;AAAA,KAClB;AAGA,IAAA,IAAI,WAAA,CAAY,CAAC,CAAA,EAAG;AAClB,MAAA,KAAA,CAAM,QAAQ,MAAA,CAAO,QAAA,CAAS,WAAA,CAAY,CAAC,GAAG,EAAE,CAAA;AAAA,IAClD;AACA,IAAA,IAAI,YAAA,CAAa,CAAC,CAAA,EAAG;AACnB,MAAA,KAAA,CAAM,SAAS,MAAA,CAAO,QAAA,CAAS,YAAA,CAAa,CAAC,GAAG,EAAE,CAAA;AAAA,IACpD;AAGA,IAAA,MAAA,CAAO,IAAA;AAAA,MACL,MAAA,CAAO,WAAA;AAAA,QACL,MAAA,CAAO,OAAA,CAAQ,KAAK,CAAA,CAAE,MAAA,CAAO,CAAC,CAAC,CAAA,EAAG,KAAK,CAAA,KAAM,KAAA,KAAU,MAAS;AAAA;AAClE,KACF;AAAA,EACF;AAEA,EAAA,OAAO,MAAA;AACT;AAKA,SAAS,YAAY,GAAA,EAA8B;AACjD,EAAA,MAAM,OAAsB,EAAC;AAE7B,EAAA,IAAA,CAAK,IAAA,GAAO,eAAA,CAAgB,GAAA,EAAK,WAAW,CAAA;AAC5C,EAAA,IAAA,CAAK,WAAA,GAAc,eAAA,CAAgB,GAAA,EAAK,mBAAmB,CAAA;AAG3D,EAAA,MAAM,OAAA,GAAU,wBAAA,CAAyB,GAAA,EAAK,aAAa,CAAA;AAC3D,EAAA,IAAI,OAAA,CAAQ,SAAS,CAAA,EAAG;AACtB,IAAA,IAAA,CAAK,OAAA,GAAU,OAAA;AAAA,EACjB;AAGA,EAAA,MAAM,IAAA,GAAO,wBAAA,CAAyB,GAAA,EAAK,UAAU,CAAA;AACrD,EAAA,IAAI,IAAA,CAAK,SAAS,CAAA,EAAG;AACnB,IAAA,IAAA,CAAK,IAAA,GAAO,IAAA;AAAA,EACd;AAEA,EAAA,OAAO,MAAA,CAAO,WAAA;AAAA,IACZ,MAAA,CAAO,OAAA,CAAQ,IAAI,CAAA,CAAE,MAAA,CAAO,CAAC,CAAC,CAAA,EAAG,KAAK,CAAA,KAAM,KAAA,KAAU,MAAS;AAAA,GACjE;AACF;AAKA,SAAS,eAAe,GAAA,EAAiC;AACvD,EAAA,MAAM,UAA4B,EAAC;AAEnC,EAAA,OAAA,CAAQ,SAAA,GAAY,eAAA,CAAgB,GAAA,EAAK,oBAAoB,CAAA;AAC7D,EAAA,OAAA,CAAQ,QAAA,GAAW,eAAA,CAAgB,GAAA,EAAK,mBAAmB,CAAA;AAC3D,EAAA,OAAA,CAAQ,QAAA,GAAW,eAAA,CAAgB,GAAA,EAAK,kBAAkB,CAAA;AAC1D,EAAA,OAAA,CAAQ,MAAA,GAAS,eAAA,CAAgB,GAAA,EAAK,gBAAgB,CAAA;AAEtD,EAAA,OAAO,MAAA,CAAO,WAAA;AAAA,IACZ,MAAA,CAAO,OAAA,CAAQ,OAAO,CAAA,CAAE,MAAA,CAAO,CAAC,CAAC,CAAA,EAAG,KAAK,CAAA,KAAM,KAAA,KAAU,MAAS;AAAA,GACpE;AACF;;;AClPO,SAAS,YAAY,UAAA,EAAwC;AAClE,EAAA,IAAI,CAAC,UAAA,IAAc,OAAO,UAAA,KAAe,QAAA,EAAU;AACjD,IAAA,OAAO,IAAA;AAAA,EACT;AAEA,EAAA,MAAM,OAAA,GAAU,WAAW,IAAA,EAAK;AAChC,EAAA,IAAI,CAAC,OAAA,EAAS;AACZ,IAAA,OAAO,IAAA;AAAA,EACT;AAEA,EAAA,IAAI;AACF,IAAA,MAAM,MAAA,GAAS,IAAA,CAAK,KAAA,CAAM,OAAO,CAAA;AAGjC,IAAA,IAAI,IAAA;AACJ,IAAA,IAAI,MAAA,CAAO,OAAO,CAAA,EAAG;AACnB,MAAA,IAAA,GAAO,OAAO,OAAO,CAAA;AAAA,IACvB;AAGA,IAAA,MAAM,OAAA,GAAU,OAAO,UAAU,CAAA;AAEjC,IAAA,OAAO;AAAA,MACL,GAAA,EAAK,OAAA;AAAA,MACL,MAAA;AAAA,MACA,IAAA;AAAA,MACA;AAAA,KACF;AAAA,EACF,CAAA,CAAA,MAAQ;AAEN,IAAA,OAAO,IAAA;AAAA,EACT;AACF;AAaO,SAAS,MAAA,CAAO,MAAqC,UAAA,EAA6B;AACvF,EAAA,IAAI,CAAC,IAAA,EAAM;AACT,IAAA,OAAO,KAAA;AAAA,EACT;AAEA,EAAA,MAAM,MAAA,GAAS,WAAW,WAAA,EAAY;AAEtC,EAAA,IAAI,KAAA,CAAM,OAAA,CAAQ,IAAI,CAAA,EAAG;AACvB,IAAA,OAAO,KAAK,IAAA,CAAK,CAAC,MAAM,CAAA,CAAE,WAAA,OAAkB,MAAM,CAAA;AAAA,EACpD;AAEA,EAAA,OAAO,IAAA,CAAK,aAAY,KAAM,MAAA;AAChC;AAYO,SAAS,kBAAkB,MAAA,EAA4B;AAC5D,EAAA,IAAI,CAAC,MAAA,IAAU,OAAO,MAAA,KAAW,QAAA,EAAU;AACzC,IAAA,OAAO,EAAC;AAAA,EACV;AAEA,EAAA,MAAM,GAAA,GAAM,MAAA;AAGZ,EAAA,IAAI,KAAA,CAAM,OAAA,CAAQ,GAAA,CAAI,QAAQ,CAAC,CAAA,EAAG;AAChC,IAAA,OAAO,IAAI,QAAQ,CAAA;AAAA,EACrB;AAGA,EAAA,OAAO,CAAC,MAAM,CAAA;AAChB;AAQO,SAAS,QAAQ,GAAA,EAA6C;AACnE,EAAA,IAAI,CAAC,GAAA,IAAO,OAAO,GAAA,KAAQ,QAAA,EAAU;AACnC,IAAA,OAAO,MAAA;AAAA,EACT;AAEA,EAAA,MAAM,MAAA,GAAS,GAAA;AACf,EAAA,MAAM,IAAA,GAAO,OAAO,OAAO,CAAA;AAE3B,EAAA,IAAI,OAAO,IAAA,KAAS,QAAA,IAAY,KAAA,CAAM,OAAA,CAAQ,IAAI,CAAA,EAAG;AACnD,IAAA,OAAO,IAAA;AAAA,EACT;AAEA,EAAA,OAAO,MAAA;AACT;AASO,SAAS,cAAA,CAAe,KAAc,WAAA,EAAgC;AAC3E,EAAA,MAAM,IAAA,GAAO,QAAQ,GAAG,CAAA;AACxB,EAAA,OAAO,YAAY,IAAA,CAAK,CAAC,WAAW,MAAA,CAAO,IAAA,EAAM,MAAM,CAAC,CAAA;AAC1D;;;AC1GO,SAAS,iBAAiB,GAAA,EAAkC;AACjE,EAAA,MAAM,QAAA,GAA8B;AAAA,IAClC,QAAQ;AAAC,GACX;AAGA,EAAA,MAAM,OAAA,GAAU,GAAA,CAAI,gBAAA,CAAiB,oCAAoC,CAAA;AAGzE,EAAA,KAAA,MAAW,MAAA,IAAU,KAAA,CAAM,IAAA,CAAK,OAAO,CAAA,EAAG;AAExC,IAAA,MAAM,OAAA,GAAU,MAAA,CAAO,WAAA,IAAe,MAAA,CAAO,SAAA;AAC7C,IAAA,IAAI,CAAC,OAAA,EAAS;AAEd,IAAA,MAAM,KAAA,GAAQ,YAAY,OAAO,CAAA;AACjC,IAAA,IAAI,KAAA,EAAO;AACT,MAAA,QAAA,CAAS,MAAA,CAAO,KAAK,KAAK,CAAA;AAAA,IAC5B;AAAA,EACF;AAGA,EAAA,IAAI,QAAA,CAAS,MAAA,CAAO,MAAA,GAAS,CAAA,EAAG;AAC9B,IAAA,cAAA,CAAe,QAAQ,CAAA;AAAA,EACzB;AAEA,EAAA,OAAO,QAAA;AACT;AAKA,SAAS,eAAe,QAAA,EAAmC;AACzD,EAAA,MAAM,WAAsB,EAAC;AAC7B,EAAA,MAAM,WAAsB,EAAC;AAC7B,EAAA,MAAM,cAAyB,EAAC;AAChC,EAAA,MAAM,WAAsB,EAAC;AAC7B,EAAA,MAAM,SAAoB,EAAC;AAC3B,EAAA,MAAM,UAAqB,EAAC;AAC5B,EAAA,MAAM,SAAoB,EAAC;AAC3B,EAAA,MAAM,SAAoB,EAAC;AAC3B,EAAA,IAAI,YAAA;AACJ,EAAA,IAAI,MAAA;AAGJ,EAAA,KAAA,MAAW,KAAA,IAAS,SAAS,MAAA,EAAQ;AAEnC,IAAA,MAAM,KAAA,GAAQ,iBAAA,CAAkB,KAAA,CAAM,MAAM,CAAA;AAE5C,IAAA,KAAA,MAAW,QAAQ,KAAA,EAAO;AAExB,MAAA,IAAI,cAAA,CAAe,MAAM,CAAC,SAAA,EAAW,eAAe,aAAA,EAAe,aAAa,CAAC,CAAA,EAAG;AAClF,QAAA,QAAA,CAAS,KAAK,IAAI,CAAA;AAAA,MACpB;AAGA,MAAA,IAAI,cAAA,CAAe,MAAM,CAAC,SAAA,EAAW,WAAW,WAAA,EAAa,aAAa,CAAC,CAAA,EAAG;AAC5E,QAAA,QAAA,CAAS,KAAK,IAAI,CAAA;AAAA,MACpB;AAGA,MAAA,IAAI,cAAA,CAAe,IAAA,EAAM,CAAC,gBAAgB,CAAC,CAAA,EAAG;AAC5C,QAAA,WAAA,CAAY,KAAK,IAAI,CAAA;AAAA,MACvB;AAGA,MAAA,IAAI,cAAA,CAAe,IAAA,EAAM,CAAC,SAAS,CAAC,CAAA,EAAG;AACrC,QAAA,QAAA,CAAS,KAAK,IAAI,CAAA;AAAA,MACpB;AAGA,MAAA,IAAI,cAAA,CAAe,IAAA,EAAM,CAAC,OAAO,CAAC,CAAA,EAAG;AACnC,QAAA,MAAA,CAAO,KAAK,IAAI,CAAA;AAAA,MAClB;AAGA,MAAA,IAAI,cAAA,CAAe,IAAA,EAAM,CAAC,QAAQ,CAAC,CAAA,EAAG;AACpC,QAAA,OAAA,CAAQ,KAAK,IAAI,CAAA;AAAA,MACnB;AAGA,MAAA,IAAI,cAAA,CAAe,IAAA,EAAM,CAAC,aAAa,CAAC,CAAA,EAAG;AACzC,QAAA,MAAA,CAAO,KAAK,IAAI,CAAA;AAAA,MAClB;AAGA,MAAA,IAAI,cAAA,CAAe,IAAA,EAAM,CAAC,aAAa,CAAC,CAAA,EAAG;AACzC,QAAA,MAAA,CAAO,KAAK,IAAI,CAAA;AAAA,MAClB;AAGA,MAAA,IAAI,CAAC,gBAAgB,cAAA,CAAe,IAAA,EAAM,CAAC,cAAA,EAAgB,aAAa,CAAC,CAAA,EAAG;AAC1E,QAAA,YAAA,GAAe,IAAA;AAAA,MACjB;AAGA,MAAA,IAAI,CAAC,MAAA,IAAU,cAAA,CAAe,MAAM,CAAC,QAAQ,CAAC,CAAA,EAAG;AAC/C,QAAA,MAAA,GAAS,IAAA;AAAA,MACX;AAAA,IACF;AAAA,EACF;AAGA,EAAA,IAAI,QAAA,CAAS,MAAA,GAAS,CAAA,EAAG,QAAA,CAAS,QAAA,GAAW,QAAA;AAC7C,EAAA,IAAI,QAAA,CAAS,MAAA,GAAS,CAAA,EAAG,QAAA,CAAS,QAAA,GAAW,QAAA;AAC7C,EAAA,IAAI,WAAA,CAAY,MAAA,GAAS,CAAA,EAAG,QAAA,CAAS,WAAA,GAAc,WAAA;AACnD,EAAA,IAAI,QAAA,CAAS,MAAA,GAAS,CAAA,EAAG,QAAA,CAAS,QAAA,GAAW,QAAA;AAC7C,EAAA,IAAI,MAAA,CAAO,MAAA,GAAS,CAAA,EAAG,QAAA,CAAS,MAAA,GAAS,MAAA;AACzC,EAAA,IAAI,OAAA,CAAQ,MAAA,GAAS,CAAA,EAAG,QAAA,CAAS,OAAA,GAAU,OAAA;AAC3C,EAAA,IAAI,MAAA,CAAO,MAAA,GAAS,CAAA,EAAG,QAAA,CAAS,MAAA,GAAS,MAAA;AACzC,EAAA,IAAI,MAAA,CAAO,MAAA,GAAS,CAAA,EAAG,QAAA,CAAS,MAAA,GAAS,MAAA;AACzC,EAAA,IAAI,YAAA,WAAuB,YAAA,GAAe,YAAA;AAC1C,EAAA,IAAI,MAAA,WAAiB,MAAA,GAAS,MAAA;AAChC;;;AChHO,SAAS,WAAW,GAAA,EAA4B;AACrD,EAAA,MAAM,WAAwB,EAAC;AAG/B,EAAA,MAAM,YAAA,GAAe,GAAA,CAAI,aAAA,CAAc,OAAO,CAAA;AAC9C,EAAA,IAAI,cAAc,WAAA,EAAa;AAC7B,IAAA,QAAA,CAAS,KAAA,GAAQ,YAAA,CAAa,WAAA,CAAY,IAAA,EAAK;AAAA,EACjD;AAGA,EAAA,QAAA,CAAS,WAAA,GAAc,cAAA,CAAe,GAAA,EAAK,aAAa,CAAA;AACxD,EAAA,QAAA,CAAS,MAAA,GAAS,cAAA,CAAe,GAAA,EAAK,QAAQ,CAAA;AAC9C,EAAA,QAAA,CAAS,SAAA,GAAY,cAAA,CAAe,GAAA,EAAK,WAAW,CAAA;AACpD,EAAA,QAAA,CAAS,QAAA,GAAW,cAAA,CAAe,GAAA,EAAK,UAAU,CAAA;AAClD,EAAA,QAAA,CAAS,UAAA,GAAa,cAAA,CAAe,GAAA,EAAK,aAAa,CAAA;AACvD,EAAA,QAAA,CAAS,WAAA,GAAc,cAAA,CAAe,GAAA,EAAK,cAAc,CAAA;AACzD,EAAA,QAAA,CAAS,eAAA,GAAkB,cAAA,CAAe,GAAA,EAAK,kBAAkB,CAAA;AACjE,EAAA,QAAA,CAAS,sBAAA,GAAyB,cAAA,CAAe,GAAA,EAAK,4BAA4B,CAAA;AAClF,EAAA,QAAA,CAAS,+BAAA,GAAkC,cAAA;AAAA,IACzC,GAAA;AAAA,IACA;AAAA,GACF;AAGA,EAAA,MAAM,cAAA,GAAiB,cAAA,CAAe,GAAA,EAAK,UAAU,CAAA;AACrD,EAAA,IAAI,cAAA,EAAgB;AAClB,IAAA,QAAA,CAAS,WAAW,cAAA,CACjB,KAAA,CAAM,GAAG,CAAA,CACT,IAAI,CAAC,CAAA,KAAM,CAAA,CAAE,IAAA,EAAM,CAAA,CACnB,MAAA,CAAO,CAAC,CAAA,KAAM,CAAA,CAAE,SAAS,CAAC,CAAA;AAAA,EAC/B;AAGA,EAAA,MAAM,OAAA,GAAU,cAAA,CAAe,GAAA,EAAK,8BAA8B,CAAA;AAClE,EAAA,IAAI,OAAA,EAAS;AACX,IAAA,QAAA,CAAS,wBAAA,GAA2B,OAAA,CAAQ,WAAA,EAAY,KAAM,KAAA;AAAA,EAChE;AAGA,EAAA,OAAO,MAAA,CAAO,WAAA;AAAA,IACZ,MAAA,CAAO,OAAA,CAAQ,QAAQ,CAAA,CAAE,MAAA,CAAO,CAAC,CAAC,CAAA,EAAG,KAAK,CAAA,KAAM,KAAA,KAAU,MAAS;AAAA,GACrE;AACF;;;AC1CO,SAAS,mBAAmB,GAAA,EAAoC;AACrE,EAAA,MAAM,WAAgC,EAAC;AAGvC,EAAA,QAAA,CAAS,IAAA,GAAO,cAAA,CAAe,GAAA,EAAK,cAAc,CAAA;AAClD,EAAA,QAAA,CAAS,IAAA,GAAO,cAAA,CAAe,GAAA,EAAK,cAAc,CAAA;AAClD,EAAA,QAAA,CAAS,OAAA,GAAU,cAAA,CAAe,GAAA,EAAK,iBAAiB,CAAA;AACxD,EAAA,QAAA,CAAS,KAAA,GAAQ,cAAA,CAAe,GAAA,EAAK,eAAe,CAAA;AACpD,EAAA,QAAA,CAAS,WAAA,GAAc,cAAA,CAAe,GAAA,EAAK,qBAAqB,CAAA;AAChE,EAAA,QAAA,CAAS,KAAA,GAAQ,cAAA,CAAe,GAAA,EAAK,eAAe,CAAA;AACpD,EAAA,QAAA,CAAS,QAAA,GAAW,cAAA,CAAe,GAAA,EAAK,mBAAmB,CAAA;AAG3D,EAAA,MAAM,GAAA,GAAM,WAAW,GAAG,CAAA;AAC1B,EAAA,IAAI,MAAA,CAAO,IAAA,CAAK,GAAG,CAAA,CAAE,SAAS,CAAA,EAAG;AAC/B,IAAA,QAAA,CAAS,GAAA,GAAM,GAAA;AAAA,EACjB;AAGA,EAAA,MAAM,MAAA,GAAS,cAAc,GAAG,CAAA;AAChC,EAAA,IAAI,MAAA,CAAO,IAAA,CAAK,MAAM,CAAA,CAAE,SAAS,CAAA,EAAG;AAClC,IAAA,QAAA,CAAS,MAAA,GAAS,MAAA;AAAA,EACpB;AAGA,EAAA,OAAO,MAAA,CAAO,WAAA;AAAA,IACZ,MAAA,CAAO,OAAA,CAAQ,QAAQ,CAAA,CAAE,MAAA,CAAO,CAAC,CAAC,CAAA,EAAG,KAAK,CAAA,KAAM,KAAA,KAAU,MAAS;AAAA,GACrE;AACF;AAKA,SAAS,WAAW,GAAA,EAA2B;AAC7C,EAAA,MAAM,MAAkB,EAAC;AAGzB,EAAA,MAAM,UAAA,GAAa,cAAA,CAAe,GAAA,EAAK,yBAAyB,CAAA;AAChE,EAAA,MAAM,QAAA,GAAW,cAAA,CAAe,GAAA,EAAK,uBAAuB,CAAA;AAC5D,EAAA,MAAM,SAAA,GAAY,cAAA,CAAe,GAAA,EAAK,wBAAwB,CAAA;AAC9D,EAAA,IAAI,UAAA,IAAc,YAAY,SAAA,EAAW;AACvC,IAAA,GAAA,CAAI,SAAS,EAAE,IAAA,EAAM,YAAY,EAAA,EAAI,QAAA,EAAU,KAAK,SAAA,EAAU;AAE9D,IAAA,GAAA,CAAI,SAAS,MAAA,CAAO,WAAA;AAAA,MAClB,MAAA,CAAO,OAAA,CAAQ,GAAA,CAAI,MAAM,CAAA,CAAE,MAAA,CAAO,CAAC,CAAC,CAAA,EAAG,KAAK,CAAA,KAAM,KAAA,KAAU,MAAS;AAAA,KACvE;AAAA,EACF;AAGA,EAAA,MAAM,QAAA,GAAW,cAAA,CAAe,GAAA,EAAK,uBAAuB,CAAA;AAC5D,EAAA,MAAM,MAAA,GAAS,cAAA,CAAe,GAAA,EAAK,qBAAqB,CAAA;AACxD,EAAA,MAAM,OAAA,GAAU,cAAA,CAAe,GAAA,EAAK,sBAAsB,CAAA;AAC1D,EAAA,IAAI,QAAA,IAAY,UAAU,OAAA,EAAS;AACjC,IAAA,GAAA,CAAI,OAAO,EAAE,IAAA,EAAM,UAAU,EAAA,EAAI,MAAA,EAAQ,KAAK,OAAA,EAAQ;AACtD,IAAA,GAAA,CAAI,OAAO,MAAA,CAAO,WAAA;AAAA,MAChB,MAAA,CAAO,OAAA,CAAQ,GAAA,CAAI,IAAI,CAAA,CAAE,MAAA,CAAO,CAAC,CAAC,CAAA,EAAG,KAAK,CAAA,KAAM,KAAA,KAAU,MAAS;AAAA,KACrE;AAAA,EACF;AAGA,EAAA,MAAM,cAAA,GAAiB,cAAA,CAAe,GAAA,EAAK,6BAA6B,CAAA;AACxE,EAAA,MAAM,YAAA,GAAe,cAAA,CAAe,GAAA,EAAK,2BAA2B,CAAA;AACpE,EAAA,MAAM,aAAA,GAAgB,cAAA,CAAe,GAAA,EAAK,4BAA4B,CAAA;AACtE,EAAA,IAAI,cAAA,IAAkB,gBAAgB,aAAA,EAAe;AACnD,IAAA,GAAA,CAAI,aAAa,EAAE,IAAA,EAAM,gBAAgB,EAAA,EAAI,YAAA,EAAc,KAAK,aAAA,EAAc;AAC9E,IAAA,GAAA,CAAI,aAAa,MAAA,CAAO,WAAA;AAAA,MACtB,MAAA,CAAO,OAAA,CAAQ,GAAA,CAAI,UAAU,CAAA,CAAE,MAAA,CAAO,CAAC,CAAC,CAAA,EAAG,KAAK,CAAA,KAAM,KAAA,KAAU,MAAS;AAAA,KAC3E;AAAA,EACF;AAEA,EAAA,OAAO,GAAA;AACT;AAKA,SAAS,cAAc,GAAA,EAA8B;AACnD,EAAA,MAAM,SAAwB,EAAC;AAE/B,EAAA,MAAA,CAAO,GAAA,GAAM,cAAA,CAAe,GAAA,EAAK,gBAAgB,CAAA;AACjD,EAAA,MAAA,CAAO,MAAA,GAAS,cAAA,CAAe,GAAA,EAAK,uBAAuB,CAAA;AAG3D,EAAA,MAAM,KAAA,GAAQ,cAAA,CAAe,GAAA,EAAK,sBAAsB,CAAA;AACxD,EAAA,IAAI,KAAA,EAAO;AACT,IAAA,MAAA,CAAO,KAAA,GAAQ,MAAA,CAAO,QAAA,CAAS,KAAA,EAAO,EAAE,CAAA;AAAA,EAC1C;AAEA,EAAA,MAAM,MAAA,GAAS,cAAA,CAAe,GAAA,EAAK,uBAAuB,CAAA;AAC1D,EAAA,IAAI,MAAA,EAAQ;AACV,IAAA,MAAA,CAAO,MAAA,GAAS,MAAA,CAAO,QAAA,CAAS,MAAA,EAAQ,EAAE,CAAA;AAAA,EAC5C;AAEA,EAAA,OAAO,MAAA,CAAO,WAAA;AAAA,IACZ,MAAA,CAAO,OAAA,CAAQ,MAAM,CAAA,CAAE,MAAA,CAAO,CAAC,CAAC,CAAA,EAAG,KAAK,CAAA,KAAM,KAAA,KAAU,MAAS;AAAA,GACnE;AACF;;;AC1FO,SAAS,uBAAuB,GAAA,EAAmC;AACxE,EAAA,MAAM,aAAuB,EAAC;AAG9B,EAAA,MAAM,MAAA,GAAS,iBAAiB,GAAG,CAAA;AACnC,EAAA,IAAI,MAAA,CAAO,QAAA,IAAY,MAAA,CAAO,QAAA,CAAS,SAAS,CAAA,EAAG;AACjD,IAAA,KAAA,MAAW,OAAA,IAAW,OAAO,QAAA,EAAU;AACrC,MAAA,MAAM,WAAA,GAAc,iBAAA,CAAkB,OAAA,EAAS,aAAa,CAAA;AAC5D,MAAA,IAAI,WAAA,EAAa,MAAK,EAAG;AACvB,QAAA,UAAA,CAAW,IAAA,CAAK,WAAA,CAAY,IAAA,EAAM,CAAA;AAAA,MACpC;AAAA,IACF;AAAA,EACF;AAGA,EAAA,MAAM,EAAA,GAAK,iBAAiB,GAAG,CAAA;AAC/B,EAAA,IAAI,EAAA,CAAG,WAAA,EAAa,IAAA,EAAK,EAAG;AAC1B,IAAA,UAAA,CAAW,IAAA,CAAK,EAAA,CAAG,WAAA,CAAY,IAAA,EAAM,CAAA;AAAA,EACvC;AAGA,EAAA,MAAM,OAAA,GAAU,mBAAmB,GAAG,CAAA;AACtC,EAAA,IAAI,OAAA,CAAQ,WAAA,EAAa,IAAA,EAAK,EAAG;AAC/B,IAAA,UAAA,CAAW,IAAA,CAAK,OAAA,CAAQ,WAAA,CAAY,IAAA,EAAM,CAAA;AAAA,EAC5C;AAGA,EAAA,MAAM,GAAA,GAAM,WAAW,GAAG,CAAA;AAC1B,EAAA,IAAI,GAAA,CAAI,WAAA,EAAa,IAAA,EAAK,EAAG;AAC3B,IAAA,UAAA,CAAW,IAAA,CAAK,GAAA,CAAI,WAAA,CAAY,IAAA,EAAM,CAAA;AAAA,EACxC;AAGA,EAAA,IAAI,UAAA,CAAW,WAAW,CAAA,EAAG;AAC3B,IAAA,OAAO,MAAA;AAAA,EACT;AAGA,EAAA,UAAA,CAAW,KAAK,CAAC,CAAA,EAAG,MAAM,CAAA,CAAE,MAAA,GAAS,EAAE,MAAM,CAAA;AAE7C,EAAA,OAAO,WAAW,CAAC,CAAA;AACrB;AAKA,SAAS,iBAAA,CAAkB,KAAc,IAAA,EAAkC;AACzE,EAAA,IAAI,CAAC,GAAA,IAAO,OAAO,GAAA,KAAQ,UAAU,OAAO,MAAA;AAC5C,EAAA,MAAM,KAAA,GAAS,IAAgC,IAAI,CAAA;AACnD,EAAA,OAAO,OAAO,KAAA,KAAU,QAAA,GAAW,KAAA,GAAQ,MAAA;AAC7C;;;ACpCO,SAAS,WAAA,CAAY,KAAe,GAAA,EAAiC;AAC1E,EAAA,MAAM,OAAA,GAAU,GAAA,CAAI,aAAA,CAAc,CAAA,UAAA,EAAa,GAAG,CAAA,EAAA,CAAI,CAAA;AACtD,EAAA,OAAO,OAAA,EAAS,YAAA,CAAa,MAAM,CAAA,IAAK,MAAA;AAC1C;AAwBO,SAAS,WAAA,CAAY,KAAe,GAAA,EAAyB;AAClE,EAAA,MAAM,QAAA,GAAW,GAAA,CAAI,gBAAA,CAAiB,CAAA,UAAA,EAAa,GAAG,CAAA,EAAA,CAAI,CAAA;AAC1D,EAAA,MAAM,QAAoB,EAAC;AAE3B,EAAA,KAAA,MAAW,OAAA,IAAW,KAAA,CAAM,IAAA,CAAK,QAAQ,CAAA,EAAG;AAC1C,IAAA,MAAM,IAAA,GAAO,OAAA,CAAQ,YAAA,CAAa,MAAM,CAAA;AACxC,IAAA,IAAI,CAAC,IAAA,EAAM;AAEX,IAAA,KAAA,CAAM,IAAA,CAAK;AAAA,MACT,IAAA;AAAA,MACA,GAAA,EAAK,OAAA,CAAQ,YAAA,CAAa,KAAK,CAAA,IAAK,MAAA;AAAA,MACpC,IAAA,EAAM,OAAA,CAAQ,YAAA,CAAa,MAAM,CAAA,IAAK,MAAA;AAAA,MACtC,QAAA,EAAU,OAAA,CAAQ,YAAA,CAAa,UAAU,CAAA,IAAK,MAAA;AAAA,MAC9C,KAAA,EAAO,OAAA,CAAQ,YAAA,CAAa,OAAO,CAAA,IAAK,MAAA;AAAA,MACxC,KAAA,EAAO,OAAA,CAAQ,YAAA,CAAa,OAAO,CAAA,IAAK,MAAA;AAAA,MACxC,KAAA,EAAO,OAAA,CAAQ,YAAA,CAAa,OAAO,CAAA,IAAK,MAAA;AAAA,MACxC,KAAA,EAAO,OAAA,CAAQ,YAAA,CAAa,OAAO,CAAA,IAAK;AAAA,KACzC,CAAA;AAAA,EACH;AAEA,EAAA,OAAO,KAAA;AACT;AAkBO,SAAS,iBAAA,CAAkB,KAAe,IAAA,EAA4B;AAC3E,EAAA,MAAM,QAAoB,EAAC;AAE3B,EAAA,KAAA,MAAW,OAAO,IAAA,EAAM;AACtB,IAAA,KAAA,CAAM,IAAA,CAAK,GAAG,WAAA,CAAY,GAAA,EAAK,GAAG,CAAC,CAAA;AAAA,EACrC;AAEA,EAAA,OAAO,KAAA;AACT;AAkBO,SAAS,mBAAA,CAAoB,KAAe,SAAA,EAA+B;AAChF,EAAA,MAAM,QAAA,GAAW,GAAA,CAAI,gBAAA,CAAiB,CAAA,WAAA,EAAc,SAAS,CAAA,EAAA,CAAI,CAAA;AACjE,EAAA,MAAM,QAAoB,EAAC;AAE3B,EAAA,KAAA,MAAW,OAAA,IAAW,KAAA,CAAM,IAAA,CAAK,QAAQ,CAAA,EAAG;AAC1C,IAAA,MAAM,IAAA,GAAO,OAAA,CAAQ,YAAA,CAAa,MAAM,CAAA;AACxC,IAAA,IAAI,CAAC,IAAA,EAAM;AAEX,IAAA,KAAA,CAAM,IAAA,CAAK;AAAA,MACT,IAAA;AAAA,MACA,GAAA,EAAK,OAAA,CAAQ,YAAA,CAAa,KAAK,CAAA,IAAK,MAAA;AAAA,MACpC,IAAA,EAAM,OAAA,CAAQ,YAAA,CAAa,MAAM,CAAA,IAAK,MAAA;AAAA,MACtC,QAAA,EAAU,OAAA,CAAQ,YAAA,CAAa,UAAU,CAAA,IAAK,MAAA;AAAA,MAC9C,KAAA,EAAO,OAAA,CAAQ,YAAA,CAAa,OAAO,CAAA,IAAK,MAAA;AAAA,MACxC,KAAA,EAAO,OAAA,CAAQ,YAAA,CAAa,OAAO,CAAA,IAAK,MAAA;AAAA,MACxC,KAAA,EAAO,OAAA,CAAQ,YAAA,CAAa,OAAO,CAAA,IAAK,MAAA;AAAA,MACxC,KAAA,EAAO,OAAA,CAAQ,YAAA,CAAa,OAAO,CAAA,IAAK;AAAA,KACzC,CAAA;AAAA,EACH;AAEA,EAAA,OAAO,KAAA;AACT;;;ACpIO,SAAS,aAAa,GAAA,EAA8B;AACzD,EAAA,MAAM,WAA0B,EAAC;AAGjC,EAAA,MAAM,YAAY,iBAAA,CAAkB,GAAA,EAAK,CAAC,MAAA,EAAQ,eAAe,CAAC,CAAA;AAClE,EAAA,KAAA,MAAW,QAAQ,SAAA,EAAW;AAC5B,IAAA,IAAI,IAAA,CAAK,GAAA,KAAQ,MAAA,IAAU,CAAC,SAAS,OAAA,EAAS;AAC5C,MAAA,QAAA,CAAS,UAAU,IAAA,CAAK,IAAA;AAAA,IAC1B;AACA,IAAA,IAAI,IAAA,CAAK,GAAA,KAAQ,eAAA,IAAmB,CAAC,SAAS,YAAA,EAAc;AAC1D,MAAA,QAAA,CAAS,eAAe,IAAA,CAAK,IAAA;AAAA,IAC/B;AAAA,EACF;AAGA,EAAA,MAAM,eAAA,GAAkB,uBAAuB,GAAG,CAAA;AAClD,EAAA,IAAI,eAAA,CAAgB,SAAS,CAAA,EAAG;AAC9B,IAAA,QAAA,CAAS,eAAA,GAAkB,eAAA;AAAA,EAC7B;AAGA,EAAA,MAAM,QAAA,GAAW,gBAAgB,GAAG,CAAA;AACpC,EAAA,IAAI,QAAA,EAAU;AACZ,IAAA,QAAA,CAAS,QAAA,GAAW,QAAA;AAAA,EACtB;AAGA,EAAA,MAAM,MAAA,GAAS,cAAc,GAAG,CAAA;AAChC,EAAA,IAAI,MAAA,CAAO,IAAA,CAAK,MAAM,CAAA,CAAE,SAAS,CAAA,EAAG;AAClC,IAAA,QAAA,CAAS,MAAA,GAAS,MAAA;AAAA,EACpB;AAGA,EAAA,QAAA,CAAS,SAAA,GAAY,WAAA,CAAY,GAAA,EAAK,YAAY,CAAA;AAGlD,EAAA,OAAO,MAAA,CAAO,WAAA;AAAA,IACZ,MAAA,CAAO,OAAA,CAAQ,QAAQ,CAAA,CAAE,MAAA,CAAO,CAAC,CAAC,CAAA,EAAG,KAAK,CAAA,KAAM,KAAA,KAAU,MAAS;AAAA,GACrE;AACF;AAKA,SAAS,uBAAuB,GAAA,EAAiC;AAC/D,EAAA,MAAM,QAA0B,EAAC;AAGjC,EAAA,MAAM,KAAA,GAAQ,mBAAA,CAAoB,GAAA,EAAK,kBAAkB,CAAA;AAEzD,EAAA,KAAA,MAAW,QAAQ,KAAA,EAAO;AACxB,IAAA,MAAM,IAAA,GAAuB;AAAA,MAC3B,KAAK,IAAA,CAAK,IAAA;AAAA,MACV,OAAO,IAAA,CAAK;AAAA,KACd;AAGA,IAAA,IAAI,IAAA,CAAK,QAAQ,8BAAA,EAAgC;AAC/C,MAAA,IAAA,CAAK,WAAA,GAAc,IAAA;AAAA,IACrB;AAGA,IAAA,KAAA,CAAM,IAAA;AAAA,MACJ,MAAA,CAAO,WAAA;AAAA,QACL,MAAA,CAAO,OAAA,CAAQ,IAAI,CAAA,CAAE,MAAA,CAAO,CAAC,CAAC,CAAA,EAAG,KAAK,CAAA,KAAM,KAAA,KAAU,MAAS;AAAA;AACjE,KACF;AAAA,EACF;AAEA,EAAA,OAAO,KAAA;AACT;AAKA,SAAS,gBAAgB,GAAA,EAAqC;AAC5D,EAAA,MAAM,GAAA,GAAM,WAAA,CAAY,GAAA,EAAK,WAAW,CAAA;AACxC,EAAA,IAAI,CAAC,GAAA,EAAK;AACR,IAAA,OAAO,MAAA;AAAA,EACT;AAGA,EAAA,MAAM,WAAA,GAAc,GAAA,CAAI,aAAA,CAAc,uBAAuB,CAAA;AAC7D,EAAA,MAAM,KAAA,GAAQ,WAAA,EAAa,YAAA,CAAa,OAAO,CAAA,IAAK,MAAA;AAEpD,EAAA,MAAM,QAAA,GAAqB,EAAE,GAAA,EAAK,KAAA,EAAM;AAExC,EAAA,OAAO,MAAA,CAAO,WAAA;AAAA,IACZ,MAAA,CAAO,OAAA,CAAQ,QAAQ,CAAA,CAAE,MAAA,CAAO,CAAC,CAAC,CAAA,EAAG,KAAK,CAAA,KAAM,KAAA,KAAU,MAAS;AAAA,GACrE;AACF;AAKA,SAAS,cAAc,GAAA,EAAuB;AAC5C,EAAA,MAAM,OAAe,EAAC;AAEtB,EAAA,IAAA,CAAK,KAAA,GAAQ,cAAA,CAAe,GAAA,EAAK,yBAAyB,CAAA;AAC1D,EAAA,IAAA,CAAK,KAAA,GAAQ,cAAA,CAAe,GAAA,EAAK,yBAAyB,CAAA;AAC1D,EAAA,IAAA,CAAK,MAAA,GAAS,cAAA,CAAe,GAAA,EAAK,sBAAsB,CAAA;AAExD,EAAA,OAAO,MAAA,CAAO,WAAA;AAAA,IACZ,MAAA,CAAO,OAAA,CAAQ,IAAI,CAAA,CAAE,MAAA,CAAO,CAAC,CAAC,CAAA,EAAG,KAAK,CAAA,KAAM,KAAA,KAAU,MAAS;AAAA,GACjE;AACF;;;ACnGO,SAAS,gBAAA,CAAiB,KAAe,OAAA,EAAqC;AAEnF,EAAA,MAAM,MAAA,GAAS,iBAAiB,GAAG,CAAA;AACnC,EAAA,IAAI,MAAA,CAAO,QAAA,IAAY,MAAA,CAAO,QAAA,CAAS,SAAS,CAAA,EAAG;AACjD,IAAA,KAAA,MAAW,OAAA,IAAW,OAAO,QAAA,EAAU;AACrC,MAAA,MAAM,QAAA,GAAW,mBAAmB,OAAO,CAAA;AAC3C,MAAA,IAAI,QAAA,EAAU,MAAK,EAAG;AACpB,QAAA,OAAO,YAAA,CAAa,OAAA,EAAS,QAAA,CAAS,IAAA,EAAM,CAAA;AAAA,MAC9C;AAAA,IACF;AAAA,EACF;AAGA,EAAA,MAAM,EAAA,GAAK,iBAAiB,GAAG,CAAA;AAC/B,EAAA,IAAI,EAAA,CAAG,KAAA,EAAO,IAAA,EAAK,EAAG;AACpB,IAAA,OAAO,YAAA,CAAa,OAAA,EAAS,EAAA,CAAG,KAAA,CAAM,MAAM,CAAA;AAAA,EAC9C;AAGA,EAAA,MAAM,OAAA,GAAU,mBAAmB,GAAG,CAAA;AACtC,EAAA,IAAI,OAAA,CAAQ,KAAA,EAAO,IAAA,EAAK,EAAG;AACzB,IAAA,OAAO,YAAA,CAAa,OAAA,EAAS,OAAA,CAAQ,KAAA,CAAM,MAAM,CAAA;AAAA,EACnD;AAGA,EAAA,MAAM,KAAA,GAAQ,aAAa,GAAG,CAAA;AAC9B,EAAA,IAAI,KAAA,CAAM,eAAA,IAAmB,KAAA,CAAM,eAAA,CAAgB,SAAS,CAAA,EAAG;AAE7D,IAAA,MAAM,OAAA,GAAU,eAAA,CAAgB,KAAA,CAAM,eAAe,CAAA;AACrD,IAAA,IAAI,SAAS,GAAA,EAAK;AAChB,MAAA,OAAO,YAAA,CAAa,OAAA,EAAS,OAAA,CAAQ,GAAG,CAAA;AAAA,IAC1C;AAAA,EACF;AAGA,EAAA,IAAI,KAAA,CAAM,OAAA,EAAS,IAAA,EAAK,EAAG;AACzB,IAAA,OAAO,YAAA,CAAa,OAAA,EAAS,KAAA,CAAM,OAAA,CAAQ,MAAM,CAAA;AAAA,EACnD;AAGA,EAAA,OAAO,MAAA;AACT;AAcA,SAAS,mBAAmB,OAAA,EAAsC;AAChE,EAAA,IAAI,CAAC,OAAA,IAAW,OAAO,OAAA,KAAY,UAAU,OAAO,MAAA;AAEpD,EAAA,MAAM,QAAS,OAAA,CAAoC,KAAA;AACnD,EAAA,IAAI,CAAC,OAAO,OAAO,MAAA;AAGnB,EAAA,IAAI,OAAO,UAAU,QAAA,EAAU;AAC7B,IAAA,OAAO,KAAA;AAAA,EACT;AAGA,EAAA,IAAI,OAAO,KAAA,KAAU,QAAA,IAAY,CAAC,KAAA,CAAM,OAAA,CAAQ,KAAK,CAAA,EAAG;AACtD,IAAA,MAAM,GAAA,GAAM,YAAY,KAAK,CAAA;AAC7B,IAAA,IAAI,KAAK,OAAO,GAAA;AAAA,EAClB;AAGA,EAAA,IAAI,KAAA,CAAM,OAAA,CAAQ,KAAK,CAAA,EAAG;AACxB,IAAA,IAAI,OAAA;AAEJ,IAAA,KAAA,MAAW,OAAO,KAAA,EAAO;AACvB,MAAA,IAAI,OAAO,QAAQ,QAAA,EAAU;AAE3B,QAAA,OAAO,GAAA;AAAA,MACT;AAEA,MAAA,MAAM,GAAA,GAAM,YAAY,GAAG,CAAA;AAC3B,MAAA,IAAI,CAAC,GAAA,EAAK;AAEV,MAAA,MAAM,KAAA,GAAQ,iBAAA,CAAkB,GAAA,EAAK,OAAO,CAAA,IAAK,CAAA;AACjD,MAAA,MAAM,MAAA,GAAS,iBAAA,CAAkB,GAAA,EAAK,QAAQ,CAAA,IAAK,CAAA;AACnD,MAAA,MAAM,OAAO,KAAA,GAAQ,MAAA;AAErB,MAAA,IAAI,CAAC,OAAA,IAAW,IAAA,GAAO,OAAA,CAAQ,IAAA,EAAM;AACnC,QAAA,OAAA,GAAU,EAAE,KAAK,IAAA,EAAK;AAAA,MACxB;AAAA,IACF;AAEA,IAAA,OAAO,OAAA,EAAS,GAAA;AAAA,EAClB;AAEA,EAAA,OAAO,MAAA;AACT;AAKA,SAAS,YAAY,GAAA,EAAkC;AACrD,EAAA,IAAI,CAAC,GAAA,IAAO,OAAO,GAAA,KAAQ,UAAU,OAAO,MAAA;AAC5C,EAAA,MAAM,GAAA,GAAM,GAAA;AAGZ,EAAA,OACEC,kBAAAA,CAAkB,GAAA,EAAK,KAAK,CAAA,IAC5BA,kBAAAA,CAAkB,KAAK,YAAY,CAAA,IACnCA,kBAAAA,CAAkB,GAAA,EAAK,KAAK,CAAA;AAEhC;AAKA,SAASA,kBAAAA,CAAkB,KAA8B,IAAA,EAAkC;AACzF,EAAA,MAAM,KAAA,GAAQ,IAAI,IAAI,CAAA;AACtB,EAAA,OAAO,OAAO,KAAA,KAAU,QAAA,GAAW,KAAA,GAAQ,MAAA;AAC7C;AAKA,SAAS,iBAAA,CAAkB,KAAc,IAAA,EAAkC;AACzE,EAAA,IAAI,CAAC,GAAA,IAAO,OAAO,GAAA,KAAQ,UAAU,OAAO,MAAA;AAC5C,EAAA,MAAM,KAAA,GAAS,IAAgC,IAAI,CAAA;AAEnD,EAAA,IAAI,OAAO,KAAA,KAAU,QAAA,EAAU,OAAO,KAAA;AACtC,EAAA,IAAI,OAAO,UAAU,QAAA,EAAU;AAC7B,IAAA,MAAM,MAAA,GAAS,MAAA,CAAO,QAAA,CAAS,KAAA,EAAO,EAAE,CAAA;AACxC,IAAA,OAAO,MAAA,CAAO,KAAA,CAAM,MAAM,CAAA,GAAI,MAAA,GAAY,MAAA;AAAA,EAC5C;AACA,EAAA,OAAO,MAAA;AACT;AAQA,SAAS,gBACP,KAAA,EACoE;AACpE,EAAA,IAAI,KAAA,CAAM,WAAW,CAAA,EAAG;AACtB,IAAA,OAAO,MAAA;AAAA,EACT;AAEA,EAAA,IAAI,OAAA,GAAU,MAAM,CAAC,CAAA;AACrB,EAAA,IAAI,WAAA,GAAc,eAAA,CAAgB,KAAA,CAAM,CAAC,EAAE,KAAK,CAAA;AAEhD,EAAA,KAAA,MAAW,QAAQ,KAAA,EAAO;AACxB,IAAA,MAAM,IAAA,GAAO,eAAA,CAAgB,IAAA,CAAK,KAAK,CAAA;AACvC,IAAA,IAAI,OAAO,WAAA,EAAa;AACtB,MAAA,OAAA,GAAU,IAAA;AACV,MAAA,WAAA,GAAc,IAAA;AAAA,IAChB;AAAA,EACF;AAEA,EAAA,OAAO,OAAA;AACT;AAQA,SAAS,gBAAgB,OAAA,EAA0B;AACjD,EAAA,IAAI,CAAC,OAAA,EAAS;AACZ,IAAA,OAAO,CAAA;AAAA,EACT;AAGA,EAAA,IAAI,OAAA,CAAQ,WAAA,EAAY,KAAM,KAAA,EAAO;AACnC,IAAA,OAAO,MAAA,CAAO,iBAAA;AAAA,EAChB;AAGA,EAAA,MAAM,KAAA,GAAQ,gBAAA,CAAiB,IAAA,CAAK,OAAO,CAAA;AAC3C,EAAA,IAAI,KAAA,EAAO;AACT,IAAA,MAAM,QAAQ,MAAA,CAAO,QAAA,CAAS,KAAA,CAAM,CAAC,GAAG,EAAE,CAAA;AAC1C,IAAA,MAAM,SAAS,MAAA,CAAO,QAAA,CAAS,KAAA,CAAM,CAAC,GAAG,EAAE,CAAA;AAE3C,IAAA,OAAO,KAAA,GAAQ,MAAA;AAAA,EACjB;AAEA,EAAA,OAAO,CAAA;AACT;;;ACjMO,SAAS,gBAAgB,GAAA,EAAiC;AAC/D,EAAA,MAAM,WAA6B,EAAC;AAGpC,EAAA,MAAM,WAAA,GAAc,GAAA,CAAI,aAAA,CAAc,MAAM,CAAA;AAC5C,EAAA,IAAI,WAAA,EAAa;AACf,IAAA,MAAM,IAAA,GAAO,WAAA,CAAY,YAAA,CAAa,MAAM,CAAA;AAC5C,IAAA,IAAI,IAAA,EAAM;AACR,MAAA,QAAA,CAAS,QAAA,GAAW,IAAA;AAAA,IACtB;AAAA,EACF;AAGA,EAAA,QAAA,CAAS,kBACP,gBAAA,CAAiB,GAAA,EAAK,kBAAkB,CAAA,IAAK,cAAA,CAAe,KAAK,kBAAkB,CAAA;AAGrF,EAAA,QAAA,CAAS,QAAA,GAAW,eAAA,CAAgB,GAAA,EAAK,WAAW,CAAA;AAGpD,EAAA,MAAM,gBAAA,GAAmB,wBAAA,CAAyB,GAAA,EAAK,qBAAqB,CAAA;AAC5E,EAAA,IAAI,gBAAA,CAAiB,SAAS,CAAA,EAAG;AAC/B,IAAA,QAAA,CAAS,gBAAA,GAAmB,gBAAA;AAAA,EAC9B;AAGA,EAAA,MAAM,EAAE,OAAA,EAAS,MAAA,EAAO,GAAI,iBAAA;AAAA,IAC1B,QAAA,CAAS,QAAA,IAAY,QAAA,CAAS,eAAA,IAAmB,QAAA,CAAS;AAAA,GAC5D;AAEA,EAAA,IAAI,OAAA,EAAS;AACX,IAAA,QAAA,CAAS,OAAA,GAAU,OAAA;AAAA,EACrB;AACA,EAAA,IAAI,MAAA,EAAQ;AACV,IAAA,QAAA,CAAS,MAAA,GAAS,MAAA;AAAA,EACpB;AAGA,EAAA,OAAO,MAAA,CAAO,WAAA;AAAA,IACZ,MAAA,CAAO,OAAA,CAAQ,QAAQ,CAAA,CAAE,MAAA,CAAO,CAAC,CAAC,CAAA,EAAG,KAAK,CAAA,KAAM,KAAA,KAAU,MAAS;AAAA,GACrE;AACF;AAeA,SAAS,kBAAkB,IAAA,EAAsD;AAC/E,EAAA,IAAI,CAAC,IAAA,EAAM;AACT,IAAA,OAAO,EAAC;AAAA,EACV;AAGA,EAAA,MAAM,aAAa,IAAA,CAAK,IAAA,EAAK,CAAE,OAAA,CAAQ,MAAM,GAAG,CAAA;AAGhD,EAAA,MAAM,KAAA,GAAQ,UAAA,CAAW,KAAA,CAAM,OAAO,CAAA;AAEtC,EAAA,IAAI,KAAA,CAAM,WAAW,CAAA,EAAG;AACtB,IAAA,OAAO,EAAC;AAAA,EACV;AAGA,EAAA,MAAM,OAAA,GAAU,KAAA,CAAM,CAAC,CAAA,CAAE,WAAA,EAAY;AAGrC,EAAA,MAAM,MAAA,GAAS,MAAM,MAAA,GAAS,CAAA,GAAI,MAAM,CAAC,CAAA,CAAE,aAAY,GAAI,MAAA;AAE3D,EAAA,OAAO,EAAE,SAAS,MAAA,EAAO;AAC3B;;;ACzEO,SAAS,oBAAoB,GAAA,EAAgC;AAClE,EAAA,MAAM,QAAA,GAAW,gBAAgB,GAAG,CAAA;AAEpC,EAAA,OAAO;AAAA,IACL,UAAU,QAAA,CAAS,OAAA;AAAA,IACnB,QAAQ,QAAA,CAAS;AAAA,GACnB;AACF;;;ACiBO,SAASnB,aAAAA,CACd,GAAA,EACA,OAAA,EACA,OAAA,GAAkC,EAAC,EACpB;AACf,EAAA,MAAM,IAAA,GAAOiB,kBAAiB,OAAO,CAAA;AAGrC,EAAA,MAAM,gBAAA,GAAmB,mBAAA,CAAoB,GAAA,EAAK,OAAO,CAAA;AACzD,EAAA,MAAM,UAAA,GAAa,gBAAA,GAAmB,SAAA,CAAU,gBAAgB,CAAA,GAAI,IAAA;AAGpE,EAAA,MAAM,QAAA,GAAW,eAAA,CAAgB,GAAA,EAAK,gBAAA,EAAkB,YAAY,IAAI,CAAA;AAGxE,EAAA,MAAM,WAA4B,EAAC;AACnC,EAAA,MAAM,WAA4B,EAAC;AACnC,EAAA,MAAM,WAA4B,EAAC;AAEnC,EAAA,KAAA,MAAW,QAAQ,QAAA,EAAU;AAC3B,IAAA,IAAI,IAAA,CAAK,QAAA,EAAU,QAAA,CAAS,IAAA,CAAK,IAAI,CAAA;AACrC,IAAA,IAAI,IAAA,CAAK,QAAA,EAAU,QAAA,CAAS,IAAA,CAAK,IAAI,CAAA;AACrC,IAAA,IAAI,IAAA,CAAK,QAAA,EAAU,QAAA,CAAS,IAAA,CAAK,IAAI,CAAA;AAAA,EACvC;AAGA,EAAA,MAAM,QAAA,GAA0B;AAAA,IAC9B,GAAA,EAAK,QAAA,CAAS,MAAA,GAAS,CAAA,GAAI,QAAA,GAAW,MAAA;AAAA,IACtC,QAAA,EAAU,QAAA,CAAS,MAAA,GAAS,CAAA,GAAI,QAAA,GAAW,MAAA;AAAA,IAC3C,QAAA,EAAU,QAAA,CAAS,MAAA,GAAS,CAAA,GAAI,QAAA,GAAW,MAAA;AAAA,IAC3C,QAAA,EAAU,QAAA,CAAS,MAAA,GAAS,CAAA,GAAI,QAAA,GAAW,MAAA;AAAA,IAC3C,YAAY,QAAA,CAAS,MAAA;AAAA,IACrB,eAAe,QAAA,CAAS,MAAA;AAAA,IACxB,eAAe,QAAA,CAAS,MAAA;AAAA,IACxB,eAAe,QAAA,CAAS;AAAA,GAC1B;AAGA,EAAA,OAAO,MAAA,CAAO,WAAA;AAAA,IACZ,MAAA,CAAO,OAAA,CAAQ,QAAQ,CAAA,CAAE,MAAA,CAAO,CAAC,CAAC,CAAA,EAAG,KAAK,CAAA,KAAM,KAAA,KAAU,MAAS;AAAA,GACrE;AACF;AAKA,SAASA,kBAAiB,OAAA,EAAmE;AAC3F,EAAA,OAAO;AAAA,IACL,KAAA,EAAO,QAAQ,KAAA,IAAS,KAAA;AAAA,IACxB,UAAA,EAAY,OAAA,CAAQ,UAAA,IAAc,EAAC;AAAA,IACnC,UAAA,EAAY,OAAA,CAAQ,UAAA,IAAc,EAAC;AAAA,IACnC,gBAAA,EAAkB,QAAQ,gBAAA,IAAoB,KAAA;AAAA,IAC9C,WAAA,EAAa,QAAQ,WAAA,IAAe,IAAA;AAAA,IACpC,KAAA,EAAO,OAAA,CAAQ,KAAA,IAAS,MAAA,CAAO;AAAA,GACjC;AACF;AAKA,SAAS,mBAAA,CAAoB,KAAe,OAAA,EAA8C;AAExF,EAAA,MAAM,WAAA,GAAc,GAAA,CAAI,aAAA,CAAc,YAAY,CAAA;AAClD,EAAA,IAAI,WAAA,EAAa;AACf,IAAA,MAAM,QAAA,GAAW,WAAA,CAAY,YAAA,CAAa,MAAM,CAAA;AAChD,IAAA,IAAI,QAAA,EAAU;AACZ,MAAA,IAAI;AAEF,QAAA,IAAI,OAAA,EAAS;AACX,UAAA,MAAM,YAAA,GAAe,YAAA,CAAa,OAAA,EAAS,QAAQ,CAAA;AACnD,UAAA,OAAO,YAAA,IAAgB,IAAA;AAAA,QACzB;AACA,QAAA,OAAO,QAAA;AAAA,MACT,CAAA,CAAA,MAAQ;AAAA,MAER;AAAA,IACF;AAAA,EACF;AAGA,EAAA,IAAI,OAAA,EAAS;AACX,IAAA,OAAO,OAAO,OAAA,KAAY,QAAA,GAAW,OAAA,GAAU,OAAA,CAAQ,IAAA;AAAA,EACzD;AAEA,EAAA,OAAO,IAAA;AACT;AAKA,SAAS,UAAU,GAAA,EAA4B;AAC7C,EAAA,IAAI;AACF,IAAA,MAAM,MAAA,GAAS,IAAI,GAAA,CAAI,GAAG,CAAA;AAC1B,IAAA,OAAO,MAAA,CAAO,MAAA;AAAA,EAChB,CAAA,CAAA,MAAQ;AACN,IAAA,OAAO,IAAA;AAAA,EACT;AACF;AAKA,SAAS,eAAA,CACP,GAAA,EACA,OAAA,EACA,UAAA,EACA,OAAA,EACiB;AACjB,EAAA,MAAM,QAAyB,EAAC;AAChC,EAAA,MAAM,QAAA,uBAAe,GAAA,EAAY;AAGjC,EAAA,MAAM,cAAA,GAAiB,GAAA,CAAI,gBAAA,CAAiB,SAAS,CAAA;AAErD,EAAA,KAAA,MAAW,MAAA,IAAU,KAAA,CAAM,IAAA,CAAK,cAAc,CAAA,EAAG;AAC/C,IAAA,MAAM,IAAA,GAAO,MAAA,CAAO,YAAA,CAAa,MAAM,CAAA;AACvC,IAAA,IAAI,CAAC,IAAA,EAAM;AAEX,IAAA,MAAM,WAAA,GAAc,KAAK,IAAA,EAAK;AAC9B,IAAA,IAAI,CAAC,WAAA,EAAa;AAGlB,IAAA,IAAI,CAAC,OAAA,CAAQ,gBAAA,IAAoB,WAAA,CAAY,UAAA,CAAW,GAAG,CAAA,EAAG;AAC5D,MAAA;AAAA,IACF;AAGA,IAAA,MAAM,MAAA,GAAS,UAAU,WAAW,CAAA;AACpC,IAAA,IAAI,MAAA,IAAU,CAAC,UAAA,CAAW,MAAM,CAAA,EAAG;AACjC,MAAA;AAAA,IACF;AAGA,IAAA,MAAM,MAAM,MAAA,CAAO,YAAA,CAAa,KAAK,CAAA,EAAG,MAAK,IAAK,MAAA;AAClD,IAAA,MAAM,QAAA,GAAW,GAAA,GAAM,GAAA,CAAI,WAAA,EAAY,CAAE,KAAA,CAAM,KAAK,CAAA,CAAE,MAAA,CAAO,OAAO,CAAA,GAAI,EAAC;AAGzE,IAAA,IAAI,OAAA,CAAQ,UAAA,CAAW,MAAA,GAAS,CAAA,EAAG;AACjC,MAAA,MAAM,cAAc,QAAA,CAAS,IAAA;AAAA,QAAK,CAAC,CAAA,KACjC,OAAA,CAAQ,UAAA,CAAW,QAAA;AAAA,UACjB;AAAA;AACF,OACF;AACA,MAAA,IAAI,WAAA,EAAa;AAAA,IACnB;AAGA,IAAA,IAAI,OAAA,CAAQ,UAAA,CAAW,MAAA,GAAS,CAAA,EAAG;AACjC,MAAA,MAAM,cAAc,QAAA,CAAS,IAAA;AAAA,QAAK,CAAC,CAAA,KACjC,OAAA,CAAQ,UAAA,CAAW,QAAA;AAAA,UACjB;AAAA;AACF,OACF;AACA,MAAA,IAAI,CAAC,WAAA,EAAa;AAAA,IACpB;AAGA,IAAA,IAAI,aAAA;AACJ,IAAA,IAAI;AACF,MAAA,aAAA,GAAgB,YAAA,CAAa,OAAA,EAAS,WAAW,CAAA,IAAK,WAAA;AAAA,IACxD,CAAA,CAAA,MAAQ;AACN,MAAA;AAAA,IACF;AAGA,IAAA,IAAI,QAAQ,WAAA,EAAa;AACvB,MAAA,IAAI,QAAA,CAAS,GAAA,CAAI,aAAa,CAAA,EAAG;AACjC,MAAA,QAAA,CAAS,IAAI,aAAa,CAAA;AAAA,IAC5B;AAGA,IAAA,IAAI,UAAA,GAAa,KAAA;AACjB,IAAA,IAAI,UAAA,GAAa,KAAA;AAEjB,IAAA,IAAI,UAAA,EAAY;AACd,MAAA,IAAI;AACF,QAAA,MAAM,UAAA,GAAa,UAAU,aAAa,CAAA;AAC1C,QAAA,IAAI,UAAA,EAAY;AACd,UAAA,UAAA,GAAa,UAAA,KAAe,UAAA;AAC5B,UAAA,UAAA,GAAa,UAAA,KAAe,UAAA;AAAA,QAC9B;AAAA,MACF,CAAA,CAAA,MAAQ;AAAA,MAER;AAAA,IACF;AAGA,IAAA,IAAI,OAAA,CAAQ,KAAA,KAAU,UAAA,IAAc,CAAC,UAAA,EAAY;AACjD,IAAA,IAAI,OAAA,CAAQ,KAAA,KAAU,UAAA,IAAc,CAAC,UAAA,EAAY;AAGjD,IAAA,MAAM,IAAA,GAAsB;AAAA,MAC1B,GAAA,EAAK,aAAA;AAAA,MACL,IAAA,EAAM,MAAA,CAAO,WAAA,EAAa,IAAA,EAAK,IAAK,MAAA;AAAA,MACpC,OAAO,MAAA,CAAO,YAAA,CAAa,OAAO,CAAA,EAAG,MAAK,IAAK,MAAA;AAAA,MAC/C,KAAK,GAAA,IAAO,MAAA;AAAA,MACZ,QAAQ,MAAA,CAAO,YAAA,CAAa,QAAQ,CAAA,EAAG,MAAK,IAAK,MAAA;AAAA,MACjD,UAAU,UAAA,IAAc,MAAA;AAAA,MACxB,UAAU,UAAA,IAAc,MAAA;AAAA,MACxB,QAAA,EAAU,QAAA,CAAS,QAAA,CAAS,UAAU,CAAA,IAAK,MAAA;AAAA,MAC3C,GAAA,EAAK,QAAA,CAAS,QAAA,CAAS,KAAK,CAAA,IAAK,MAAA;AAAA,MACjC,SAAA,EAAW,QAAA,CAAS,QAAA,CAAS,WAAW,CAAA,IAAK,MAAA;AAAA,MAC7C,QAAA,EAAU,QAAA,CAAS,QAAA,CAAS,UAAU,CAAA,IAAK,MAAA;AAAA,MAC3C,UAAA,EAAY,QAAA,CAAS,QAAA,CAAS,YAAY,CAAA,IAAK;AAAA,KACjD;AAGA,IAAA,KAAA,CAAM,IAAA;AAAA,MACJ,MAAA,CAAO,WAAA;AAAA,QACL,MAAA,CAAO,OAAA,CAAQ,IAAI,CAAA,CAAE,MAAA,CAAO,CAAC,CAAC,CAAA,EAAG,KAAK,CAAA,KAAM,KAAA,KAAU,MAAS;AAAA;AACjE,KACF;AAGA,IAAA,IAAI,KAAA,CAAM,MAAA,IAAU,OAAA,CAAQ,KAAA,EAAO;AACjC,MAAA;AAAA,IACF;AAAA,EACF;AAEA,EAAA,OAAO,KAAA;AACT;AAKA,SAAS,UAAU,GAAA,EAAqB;AACtC,EAAA,MAAM,KAAA,GAAQ,6BAAA,CAA8B,IAAA,CAAK,GAAG,CAAA;AACpD,EAAA,OAAO,KAAA,GAAQ,KAAA,CAAM,CAAC,CAAA,CAAE,aAAY,GAAI,EAAA;AAC1C;AAKA,SAAS,WAAW,MAAA,EAAyB;AAC3C,EAAA,OAAO,MAAA,KAAW,MAAA,IAAU,MAAA,KAAW,OAAA,IAAW,MAAA,KAAW,EAAA;AAC/D;;;ACnQO,SAAS,gBAAA,CAAiB,KAAe,OAAA,EAAuC;AAErF,EAAA,MAAM,aAAA,GAAgBjB,aAAAA,CAAa,GAAA,EAAK,OAAA,EAAS;AAAA,IAC/C,WAAA,EAAa,IAAA;AAAA,IACb,gBAAA,EAAkB;AAAA;AAAA,GACnB,CAAA;AAGD,EAAA,MAAM,UAAA,GAAa,iBAAiB,OAAO,CAAA;AAG3C,EAAA,MAAM,WAAqB,EAAC;AAC5B,EAAA,IAAI,cAAc,QAAA,EAAU;AAC1B,IAAA,KAAA,MAAW,IAAA,IAAQ,cAAc,QAAA,EAAU;AACzC,MAAA,MAAM,cAAA,GAAiB,gBAAA,CAAiB,IAAA,CAAK,GAAG,CAAA;AAEhD,MAAA,IAAI,mBAAmB,UAAA,EAAY;AACjC,QAAA,QAAA,CAAS,IAAA,CAAK,KAAK,GAAG,CAAA;AAAA,MACxB;AAAA,IACF;AAAA,EACF;AAGA,EAAA,MAAM,WAAqB,EAAC;AAC5B,EAAA,IAAI,cAAc,QAAA,EAAU;AAC1B,IAAA,KAAA,MAAW,IAAA,IAAQ,cAAc,QAAA,EAAU;AACzC,MAAA,QAAA,CAAS,IAAA,CAAK,KAAK,GAAG,CAAA;AAAA,IACxB;AAAA,EACF;AAEA,EAAA,OAAO;AAAA,IACL,QAAA;AAAA,IACA;AAAA,GACF;AACF;AAYA,SAAS,iBAAiB,GAAA,EAAqB;AAC7C,EAAA,IAAI;AACF,IAAA,MAAM,MAAA,GAAS,IAAI,GAAA,CAAI,GAAG,CAAA;AAE1B,IAAA,OAAO,MAAA,CAAO,SAAS,MAAA,CAAO,QAAA;AAAA,EAChC,CAAA,CAAA,MAAQ;AACN,IAAA,OAAO,GAAA;AAAA,EACT;AACF;;;ACnFA,IAAM,gBAAA,GAAmB;AAAA,EACvB,GAAA;AAAA,EACA,GAAA;AAAA,EACA,MAAA;AAAA,EACA,QAAA;AAAA,EACA,GAAA;AAAA,EACA,QAAA;AAAA;AAAA,EACA,QAAA;AAAA;AAAA,EACA,QAAA;AAAA,EACA,MAAA;AAAA,EACA;AACF,CAAA;AA2BO,SAAS,WAAW,KAAA,EAAuB;AAChD,EAAA,IAAI,CAAC,KAAA,EAAO,IAAA,EAAK,EAAG;AAClB,IAAA,OAAO,KAAA;AAAA,EACT;AAEA,EAAA,MAAM,OAAA,GAAU,MAAM,IAAA,EAAK;AAG3B,EAAA,KAAA,MAAW,aAAa,gBAAA,EAAkB;AACxC,IAAA,IAAI,CAAC,OAAA,CAAQ,QAAA,CAAS,SAAS,CAAA,EAAG;AAChC,MAAA;AAAA,IACF;AAGA,IAAA,MAAM,QAAA,GAAW,OAAA,CAAQ,OAAA,CAAQ,SAAS,CAAA;AAC1C,IAAA,MAAM,iBAAiB,QAAA,GAAW,CAAA,IAAK,OAAA,CAAQ,QAAA,GAAW,CAAC,CAAA,KAAM,GAAA;AACjE,IAAA,MAAM,aAAA,GAAgB,WAAW,OAAA,CAAQ,MAAA,GAAS,KAAK,OAAA,CAAQ,QAAA,GAAW,CAAC,CAAA,KAAM,GAAA;AAGjF,IAAA,IAAI,OAAA,GAAU,SAAA;AACd,IAAA,IAAI,cAAA,EAAgB,OAAA,GAAU,CAAA,CAAA,EAAI,OAAO,CAAA,CAAA;AACzC,IAAA,IAAI,aAAA,EAAe,OAAA,GAAU,CAAA,EAAG,OAAO,CAAA,CAAA,CAAA;AAGvC,IAAA,MAAM,QAAQ,OAAA,CACX,KAAA,CAAM,SAAS,CAAA,CACf,IAAI,CAAC,IAAA,KAAS,IAAA,CAAK,IAAA,EAAM,CAAA,CACzB,MAAA,CAAO,CAAC,IAAA,KAAS,IAAA,CAAK,SAAS,CAAC,CAAA;AAGnC,IAAA,IAAI,KAAA,CAAM,SAAS,CAAA,EAAG;AACpB,MAAA;AAAA,IACF;AAIA,IAAA,IAAI,KAAA,CAAM,WAAW,CAAA,EAAG;AACtB,MAAA,MAAM,CAAC,KAAA,EAAO,MAAM,CAAA,GAAI,KAAA;AACxB,MAAA,MAAM,UAAA,GAAa,kBAAA,CAAmB,CAAC,KAAA,EAAO,MAAM,CAAC,CAAA;AAGrD,MAAA,OAAO,UAAA,KAAe,IAAI,MAAA,GAAS,KAAA;AAAA,IACrC;AAIA,IAAA,MAAM,YAAA,GAAe,QAAQ,KAAA,CAAM,CAAC,GAAG,KAAA,CAAM,KAAA,CAAM,CAAC,CAAC,CAAA;AACrD,IAAA,MAAM,WAAA,GAAc,OAAA,CAAQ,KAAA,CAAM,KAAA,CAAM,MAAA,GAAS,CAAC,CAAA,EAAG,KAAA,CAAM,KAAA,CAAM,CAAA,EAAG,EAAE,CAAC,CAAA;AAEvE,IAAA,IAAI,YAAA,IAAgB,CAAC,WAAA,EAAa;AAChC,MAAA,OAAO,KAAA,CAAM,KAAA,CAAM,CAAC,CAAA,CAAE,KAAK,OAAO,CAAA;AAAA,IACpC;AACA,IAAA,IAAI,WAAA,IAAe,CAAC,YAAA,EAAc;AAChC,MAAA,OAAO,MAAM,KAAA,CAAM,CAAA,EAAG,EAAE,CAAA,CAAE,KAAK,OAAO,CAAA;AAAA,IACxC;AAGA,IAAA,OAAO,OAAA;AAAA,EACT;AAGA,EAAA,OAAO,OAAA;AACT;AAQA,SAAS,mBAAmB,KAAA,EAAgC;AAC1D,EAAA,MAAM,CAAC,KAAA,EAAO,MAAM,CAAA,GAAI,KAAA;AAGxB,EAAA,MAAM,YAAA,GAAe,UAAA,CAAW,IAAA,CAAK,KAAK,CAAA;AAC1C,EAAA,MAAM,aAAA,GAAgB,UAAA,CAAW,IAAA,CAAK,MAAM,CAAA;AAE5C,EAAA,IAAI,YAAA,IAAgB,CAAC,aAAA,EAAe;AAClC,IAAA,OAAO,CAAA;AAAA,EACT;AACA,EAAA,IAAI,aAAA,IAAiB,CAAC,YAAA,EAAc;AAClC,IAAA,OAAO,CAAA;AAAA,EACT;AAGA,EAAA,MAAM,eAAe,KAAA,KAAU,KAAA,CAAM,aAAY,IAAK,OAAA,CAAQ,KAAK,KAAK,CAAA;AACxE,EAAA,MAAM,gBAAgB,MAAA,KAAW,MAAA,CAAO,aAAY,IAAK,OAAA,CAAQ,KAAK,MAAM,CAAA;AAE5E,EAAA,IAAI,YAAA,IAAgB,CAAC,aAAA,IAAiB,KAAA,CAAM,SAAS,EAAA,EAAI;AACvD,IAAA,OAAO,CAAA;AAAA,EACT;AACA,EAAA,IAAI,aAAA,IAAiB,CAAC,YAAA,IAAgB,MAAA,CAAO,SAAS,EAAA,EAAI;AACxD,IAAA,OAAO,CAAA;AAAA,EACT;AAGA,EAAA,OAAO,KAAA,CAAM,MAAA,GAAS,MAAA,CAAO,MAAA,GAAS,CAAA,GAAI,CAAA;AAC5C;AASA,SAAS,OAAA,CAAQ,WAAmB,MAAA,EAA2B;AAE7D,EAAA,IAAI,UAAA,CAAW,IAAA,CAAK,SAAS,CAAA,EAAG;AAC9B,IAAA,OAAO,IAAA;AAAA,EACT;AAGA,EAAA,MAAM,SAAA,GAAY,MAAA,CAAO,MAAA,CAAO,CAAC,GAAA,EAAK,CAAA,KAAM,GAAA,GAAM,CAAA,CAAE,MAAA,EAAQ,CAAC,CAAA,GAAI,MAAA,CAAO,MAAA;AACxE,EAAA,IAAI,UAAU,MAAA,GAAS,SAAA,GAAY,GAAA,IAAO,SAAA,CAAU,SAAS,EAAA,EAAI;AAC/D,IAAA,OAAO,IAAA;AAAA,EACT;AAGA,EAAA,IAAI,SAAA,KAAc,SAAA,CAAU,WAAA,EAAY,IAAK,OAAA,CAAQ,KAAK,SAAS,CAAA,IAAK,SAAA,CAAU,MAAA,GAAS,EAAA,EAAI;AAC7F,IAAA,OAAO,IAAA;AAAA,EACT;AAEA,EAAA,OAAO,KAAA;AACT;;;ACvIO,SAAS,iBAAiB,GAAA,EAAmC;AAClE,EAAA,MAAM,aAAuB,EAAC;AAG9B,EAAA,MAAM,MAAA,GAAS,iBAAiB,GAAG,CAAA;AACnC,EAAA,IAAI,MAAA,CAAO,QAAA,IAAY,MAAA,CAAO,QAAA,CAAS,SAAS,CAAA,EAAG;AACjD,IAAA,KAAA,MAAW,OAAA,IAAW,OAAO,QAAA,EAAU;AACrC,MAAA,MAAM,QAAA,GAAWmB,kBAAAA,CAAkB,OAAA,EAAS,UAAU,CAAA;AACtD,MAAA,IAAI,QAAA,EAAU,MAAK,EAAG;AACpB,QAAA,UAAA,CAAW,IAAA,CAAK,QAAA,CAAS,IAAA,EAAM,CAAA;AAAA,MACjC;AAAA,IACF;AAAA,EACF;AAGA,EAAA,MAAM,EAAA,GAAK,iBAAiB,GAAG,CAAA;AAC/B,EAAA,IAAI,EAAA,CAAG,KAAA,EAAO,IAAA,EAAK,EAAG;AACpB,IAAA,UAAA,CAAW,IAAA,CAAK,EAAA,CAAG,KAAA,CAAM,IAAA,EAAM,CAAA;AAAA,EACjC;AAGA,EAAA,MAAM,OAAA,GAAU,mBAAmB,GAAG,CAAA;AACtC,EAAA,IAAI,OAAA,CAAQ,KAAA,EAAO,IAAA,EAAK,EAAG;AACzB,IAAA,UAAA,CAAW,IAAA,CAAK,OAAA,CAAQ,KAAA,CAAM,IAAA,EAAM,CAAA;AAAA,EACtC;AAGA,EAAA,IAAI,MAAA,CAAO,QAAA,IAAY,MAAA,CAAO,QAAA,CAAS,SAAS,CAAA,EAAG;AACjD,IAAA,KAAA,MAAW,IAAA,IAAQ,OAAO,QAAA,EAAU;AAClC,MAAA,MAAM,IAAA,GAAOA,kBAAAA,CAAkB,IAAA,EAAM,MAAM,CAAA;AAC3C,MAAA,IAAI,IAAA,EAAM,MAAK,EAAG;AAChB,QAAA,UAAA,CAAW,IAAA,CAAK,IAAA,CAAK,IAAA,EAAM,CAAA;AAAA,MAC7B;AAAA,IACF;AAAA,EACF;AAGA,EAAA,MAAM,GAAA,GAAM,WAAW,GAAG,CAAA;AAC1B,EAAA,IAAI,GAAA,CAAI,KAAA,EAAO,IAAA,EAAK,EAAG;AACrB,IAAA,UAAA,CAAW,IAAA,CAAK,GAAA,CAAI,KAAA,CAAM,IAAA,EAAM,CAAA;AAAA,EAClC;AAGA,EAAA,MAAM,EAAA,GAAK,GAAA,CAAI,aAAA,CAAc,IAAI,CAAA;AACjC,EAAA,IAAI,EAAA,EAAI,WAAA,EAAa,IAAA,EAAK,EAAG;AAC3B,IAAA,UAAA,CAAW,IAAA,CAAK,EAAA,CAAG,WAAA,CAAY,IAAA,EAAM,CAAA;AAAA,EACvC;AAGA,EAAA,IAAI,UAAA,CAAW,WAAW,CAAA,EAAG;AAC3B,IAAA,OAAO,MAAA;AAAA,EACT;AAGA,EAAA,MAAM,OAAA,GAAU,UAAA,CAAW,GAAA,CAAI,CAAC,KAAA,MAAW;AAAA,IACzC,QAAA,EAAU,KAAA;AAAA,IACV,OAAA,EAAS,WAAW,KAAK;AAAA,GAC3B,CAAE,CAAA;AAGF,EAAA,OAAA,CAAQ,IAAA,CAAK,CAAC,CAAA,EAAG,CAAA,KAAM,EAAE,OAAA,CAAQ,MAAA,GAAS,CAAA,CAAE,OAAA,CAAQ,MAAM,CAAA;AAE1D,EAAA,OAAO,OAAA,CAAQ,CAAC,CAAA,CAAE,OAAA;AACpB;AAKA,SAASA,kBAAAA,CAAkB,KAAc,IAAA,EAAkC;AACzE,EAAA,IAAI,CAAC,GAAA,IAAO,OAAO,GAAA,KAAQ,UAAU,OAAO,MAAA;AAC5C,EAAA,MAAM,KAAA,GAAS,IAAgC,IAAI,CAAA;AACnD,EAAA,OAAO,OAAO,KAAA,KAAU,QAAA,GAAW,KAAA,GAAQ,MAAA;AAC7C;;;AC/EO,SAAS,iBAAiB,GAAA,EAAkC;AACjE,EAAA,MAAM,WAA8B,EAAC;AAGrC,EAAA,QAAA,CAAS,SAAA,GAAY,WAAA,CAAY,GAAA,EAAK,WAAW,CAAA;AAGjD,EAAA,MAAM,cAAA,GAAiB,WAAA,CAAY,GAAA,EAAK,WAAW,CAAA;AACnD,EAAA,IAAI,cAAA,CAAe,SAAS,CAAA,EAAG;AAC7B,IAAA,QAAA,CAAS,UAAA,GAAa,cAAA,CAAe,GAAA,CAAI,CAAC,IAAA,KAAwB;AAChE,MAAA,MAAM,GAAA,GAAqB;AAAA,QACzB,MAAM,IAAA,CAAK;AAAA,OACb;AAEA,MAAA,IAAI,IAAA,CAAK,QAAA,EAAU,GAAA,CAAI,QAAA,GAAW,IAAA,CAAK,QAAA;AACvC,MAAA,IAAI,IAAA,CAAK,IAAA,EAAM,GAAA,CAAI,IAAA,GAAO,IAAA,CAAK,IAAA;AAC/B,MAAA,IAAI,IAAA,CAAK,KAAA,EAAO,GAAA,CAAI,KAAA,GAAQ,IAAA,CAAK,KAAA;AAEjC,MAAA,OAAO,GAAA;AAAA,IACT,CAAC,CAAA;AAAA,EACH;AAGA,EAAA,QAAA,CAAS,OAAA,GAAU,WAAA,CAAY,GAAA,EAAK,SAAS,CAAA;AAG7C,EAAA,QAAA,CAAS,QAAA,GAAW,WAAA,CAAY,GAAA,EAAK,UAAU,CAAA;AAG/C,EAAA,MAAM,QAAA,GAAW,gBAAgB,GAAG,CAAA;AACpC,EAAA,IAAI,MAAA,CAAO,IAAA,CAAK,QAAQ,CAAA,CAAE,SAAS,CAAA,EAAG;AACpC,IAAA,QAAA,CAAS,QAAA,GAAW,QAAA;AAAA,EACtB;AAGA,EAAA,OAAO,MAAA,CAAO,WAAA;AAAA,IACZ,MAAA,CAAO,OAAA,CAAQ,QAAQ,CAAA,CAAE,MAAA,CAAO,CAAC,CAAC,CAAA,EAAG,KAAK,CAAA,KAAM,KAAA,KAAU,MAAS;AAAA,GACrE;AACF;AAKA,SAAS,gBAAgB,GAAA,EAAyB;AAChD,EAAA,MAAM,WAAqB,EAAC;AAG5B,EAAA,QAAA,CAAS,GAAA,GAAM,eAAA,CAAgB,GAAA,EAAK,YAAY,CAAA;AAChD,EAAA,QAAA,CAAS,OAAA,GAAU,eAAA,CAAgB,GAAA,EAAK,gBAAgB,CAAA;AACxD,EAAA,QAAA,CAAS,GAAA,GAAM,eAAA,CAAgB,GAAA,EAAK,YAAY,CAAA;AAEhD,EAAA,OAAO,MAAA,CAAO,WAAA;AAAA,IACZ,MAAA,CAAO,OAAA,CAAQ,QAAQ,CAAA,CAAE,MAAA,CAAO,CAAC,CAAC,CAAA,EAAG,KAAK,CAAA,KAAM,KAAA,KAAU,MAAS;AAAA,GACrE;AACF;;;ACvDO,SAAS,cAAA,CAAe,KAAe,QAAA,EAA0B;AAEtE,EAAA,MAAM,SAAA,GAAY,iBAAiB,GAAG,CAAA;AACtC,EAAA,IAAI,SAAA,CAAU,SAAA,EAAW,IAAA,EAAK,EAAG;AAC/B,IAAA,OAAO,SAAA,CAAU,UAAU,IAAA,EAAK;AAAA,EAClC;AAGA,EAAA,OAAO,QAAA;AACT;;;ACYA,eAAsB,cAAc,GAAA,EAAqC;AAEvE,EAAA,IAAI,UAAA;AACJ,EAAA,IAAI;AACF,IAAA,UAAA,GAAa,OAAO,GAAA,KAAQ,QAAA,GAAW,IAAI,GAAA,CAAI,GAAG,CAAA,GAAI,GAAA;AAAA,EACxD,SAAS,KAAA,EAAO;AACd,IAAA,MAAM,IAAI,KAAA,CAAM,CAAA,qBAAA,EAAwB,OAAO,GAAA,KAAQ,WAAW,GAAA,GAAM,GAAA,CAAI,QAAA,EAAU,CAAA,CAAA,EAAI;AAAA,MACxF,KAAA,EAAO;AAAA,KACR,CAAA;AAAA,EACH;AAGA,EAAA,IAAI,CAAC,UAAA,CAAW,QAAA,IAAY,CAAC,WAAW,IAAA,EAAM;AAC5C,IAAA,MAAM,IAAI,KAAA,CAAM,CAAA,kDAAA,EAAqD,UAAA,CAAW,QAAA,EAAU,CAAA,CAAA,CAAG,CAAA;AAAA,EAC/F;AAGA,EAAA,MAAM,QAAA,GAAW,MAAM,KAAA,CAAM,UAAU,CAAA;AACvC,EAAA,MAAM,IAAA,GAAO,MAAM,QAAA,CAAS,QAAA,EAAS;AAGrC,EAAA,MAAM,GAAA,GAAM,UAAU,IAAI,CAAA;AAG1B,EAAA,MAAM,IAAA,GAAO,WAAW,IAAI,CAAA;AAG5B,EAAA,MAAM,OAAA,GAAU,cAAA,CAAe,GAAA,EAAK,QAAA,CAAS,QAAQ,CAAA;AAGrD,EAAA,IAAI,KAAA;AACJ,EAAA,IAAI,WAAA;AACJ,EAAA,IAAI,OAAA;AAEJ,EAAA,IAAI;AAEF,IAAA,MAAM,gBAAgB,cAAA,CAAe,GAAA,EAAK,EAAE,OAAA,EAAS,SAAS,CAAA;AAE9D,IAAA,IAAI,cAAc,OAAA,EAAS;AAEzB,MAAA,IAAI,aAAA,CAAc,KAAA,EAAO,IAAA,EAAK,EAAG;AAC/B,QAAA,KAAA,GAAQ,aAAA,CAAc,MAAM,IAAA,EAAK;AAAA,MACnC;AAGA,MAAA,IAAI,aAAA,CAAc,OAAA,EAAS,IAAA,EAAK,EAAG;AACjC,QAAA,WAAA,GAAc,aAAA,CAAc,QAAQ,IAAA,EAAK;AAAA,MAC3C;AAGA,MAAA,IAAI,aAAA,CAAc,OAAA,EAAS,IAAA,EAAK,EAAG;AACjC,QAAA,OAAA,GAAU,UAAA,CAAW,cAAc,OAAO,CAAA;AAAA,MAC5C;AAAA,IACF;AAAA,EACF,CAAA,CAAA,MAAQ;AAAA,EAER;AAGA,EAAA,IAAI,CAAC,KAAA,EAAO;AACV,IAAA,KAAA,GAAQ,iBAAiB,GAAG,CAAA;AAAA,EAC9B;AAGA,EAAA,IAAI,CAAC,WAAA,EAAa;AAChB,IAAA,WAAA,GAAc,uBAAuB,GAAG,CAAA;AAAA,EAC1C;AAGA,EAAA,MAAM,QAAA,GAAW,gBAAA,CAAiB,GAAA,EAAK,OAAO,CAAA;AAC9C,EAAA,IAAI,KAAA;AACJ,EAAA,IAAI,QAAA,EAAU;AACZ,IAAA,IAAI;AACF,MAAA,KAAA,GAAQ,IAAI,IAAI,QAAQ,CAAA;AAAA,IAC1B,CAAA,CAAA,MAAQ;AAAA,IAER;AAAA,EACF;AAGA,EAAA,MAAM,EAAE,QAAA,EAAU,MAAA,EAAO,GAAI,oBAAoB,GAAG,CAAA;AAGpD,EAAA,MAAM,EAAE,QAAA,EAAU,QAAA,EAAS,GAAI,gBAAA,CAAiB,KAAK,OAAO,CAAA;AAC5D,EAAA,MAAM,gBAAuB,EAAC;AAC9B,EAAA,KAAA,MAAW,QAAQ,QAAA,EAAU;AAC3B,IAAA,IAAI;AACF,MAAA,aAAA,CAAc,IAAA,CAAK,IAAI,GAAA,CAAI,IAAI,CAAC,CAAA;AAAA,IAClC,CAAA,CAAA,MAAQ;AAAA,IAER;AAAA,EACF;AACA,EAAA,MAAM,gBAAuB,EAAC;AAC9B,EAAA,KAAA,MAAW,QAAQ,QAAA,EAAU;AAC3B,IAAA,IAAI;AACF,MAAA,aAAA,CAAc,IAAA,CAAK,IAAI,GAAA,CAAI,IAAI,CAAC,CAAA;AAAA,IAClC,CAAA,CAAA,MAAQ;AAAA,IAER;AAAA,EACF;AAIA,EAAA,MAAM,eAAA,GAAkB,OAAA,EAAS,IAAA,EAAK,GAAI,OAAA,GAAU,IAAA;AACpD,EAAA,MAAM,SAAA,GAAY,WAAW,eAAe,CAAA;AAC5C,EAAA,MAAM,WAAA,GAAc,qBAAqB,SAAS,CAAA;AAGlD,EAAA,OAAO;AAAA,IACL,GAAA,EAAK,IAAI,GAAA,CAAI,OAAO,CAAA;AAAA,IACpB,IAAA;AAAA,IACA,IAAA;AAAA,IACA,OAAA;AAAA,IACA,KAAA;AAAA,IACA,WAAA;AAAA,IACA,KAAA;AAAA,IACA,QAAA;AAAA,IACA,MAAA;AAAA,IACA,aAAA;AAAA,IACA,aAAA;AAAA,IACA,SAAA;AAAA,IACA;AAAA,GACF;AACF;;;AChJA,eAAsB,WAAW,GAAA,EAAkC;AAEjE,EAAA,IAAI,OAAA;AACJ,EAAA,IAAI;AACF,IAAA,OAAA,GAAU,OAAO,GAAA,KAAQ,QAAA,GAAW,IAAI,GAAA,CAAI,GAAG,CAAA,GAAI,GAAA;AAAA,EACrD,SAAS,KAAA,EAAO;AACd,IAAA,MAAM,IAAI,KAAA,CAAM,CAAA,kBAAA,EAAqB,OAAO,GAAA,KAAQ,WAAW,GAAA,GAAM,GAAA,CAAI,QAAA,EAAU,CAAA,CAAA,EAAI;AAAA,MACrF,KAAA,EAAO;AAAA,KACR,CAAA;AAAA,EACH;AAGA,EAAA,IAAI,CAAC,OAAA,CAAQ,QAAA,IAAY,CAAC,QAAQ,IAAA,EAAM;AACtC,IAAA,MAAM,IAAI,KAAA,CAAM,CAAA,+CAAA,EAAkD,OAAA,CAAQ,QAAA,EAAU,CAAA,CAAA,CAAG,CAAA;AAAA,EACzF;AAGA,EAAA,MAAM,QAAA,GAAW,MAAM,KAAA,CAAM,OAAO,CAAA;AACpC,EAAA,MAAM,OAAA,GAAU,MAAM,QAAA,CAAS,QAAA,EAAS;AAGxC,EAAA,MAAM,MAAA,GAAS,SAAA,CAAU,OAAA,EAAS,QAAA,CAAS,QAAQ,CAAA;AAEnD,EAAA,OAAO,MAAA,CAAO,IAAA;AAChB;;;ACvCO,IAAM,iBAAA,GAAoB;AAAA,EAC/B,OAAA;AAAA,EACA,QAAA;AAAA,EACA,QAAA;AAAA,EACA,SAAA;AAAA,EACA,MAAA;AAAA,EACA,OAAA;AAAA,EACA,UAAA;AAAA,EACA,WAAA;AAAA,EACA,WAAA;AAAA,EACA,YAAA;AAAA,EACA,YAAA;AAAA,EACA,WAAA;AAAA,EACA,YAAA;AAAA,EACA,WAAA;AAAA,EACA,YAAA;AAAA,EACA;AACF,CAAA;AAYO,SAAS,wBAAwB,WAAA,EAAsC;AAC5E,EAAA,IAAI,CAAC,WAAA,EAAa;AAChB,IAAA,OAAO,iBAAA;AAAA,EACT;AAEA,EAAA,IAAI;AACF,IAAA,MAAM,MAAM,OAAO,WAAA,KAAgB,WAAW,IAAI,GAAA,CAAI,WAAW,CAAA,GAAI,WAAA;AACrE,IAAA,MAAM,SAAS,GAAA,CAAI,MAAA;AAGnB,IAAA,OAAO,iBAAA,CAAkB,IAAI,CAAC,IAAA,KAAS,GAAG,MAAM,CAAA,EAAG,IAAI,CAAA,CAAE,CAAA;AAAA,EAC3D,CAAA,CAAA,MAAQ;AAEN,IAAA,OAAO,iBAAA;AAAA,EACT;AACF;;;AC3BO,SAAS,oBAAA,CACd,KACA,WAAA,EACuB;AACvB,EAAA,MAAM,QAAA,GAAkC;AAAA,IACtC,OAAO;AAAC,GACV;AAGA,EAAA,MAAM,cAAA,GAAiB,WAAA,CAAY,GAAA,EAAK,WAAW,CAAA;AAGnD,EAAA,KAAA,MAAW,QAAQ,cAAA,EAAgB;AACjC,IAAA,MAAM,QAAA,GAAW,iBAAA,CAAkB,IAAA,CAAK,IAAI,CAAA;AAC5C,IAAA,IAAI,QAAA,EAAU;AACZ,MAAA,QAAA,CAAS,MAAM,IAAA,CAAK;AAAA,QAClB,KAAK,IAAA,CAAK,IAAA;AAAA,QACV,IAAA,EAAM,QAAA;AAAA,QACN,OAAO,IAAA,CAAK;AAAA,OACb,CAAA;AAAA,IACH;AAAA,EACF;AAGA,EAAA,QAAA,CAAS,KAAA,GAAQ,SAAS,KAAA,CAAM,GAAA;AAAA,IAAI,CAAC,IAAA,KACnC,MAAA,CAAO,WAAA,CAAY,MAAA,CAAO,QAAQ,IAAI,CAAA,CAAE,MAAA,CAAO,CAAC,CAAC,CAAA,EAAG,KAAK,CAAA,KAAM,KAAA,KAAU,MAAS,CAAC;AAAA,GACrF;AAGA,EAAA,IAAI,WAAA,EAAa;AACf,IAAA,QAAA,CAAS,WAAA,GAAc,wBAAwB,WAAW,CAAA;AAAA,EAC5D;AAEA,EAAA,OAAO,QAAA;AACT;AAKA,SAAS,kBAAkB,QAAA,EAA+D;AACxF,EAAA,IAAI,CAAC,QAAA,EAAU;AACb,IAAA,OAAO,IAAA;AAAA,EACT;AAEA,EAAA,MAAM,IAAA,GAAO,SAAS,WAAA,EAAY;AAElC,EAAA,IAAI,IAAA,CAAK,QAAA,CAAS,KAAK,CAAA,IAAK,SAAS,qBAAA,EAAuB;AAC1D,IAAA,OAAO,KAAA;AAAA,EACT;AAEA,EAAA,IAAI,IAAA,CAAK,QAAA,CAAS,MAAM,CAAA,IAAK,SAAS,sBAAA,EAAwB;AAC5D,IAAA,OAAO,MAAA;AAAA,EACT;AAEA,EAAA,IAAI,KAAK,QAAA,CAAS,MAAM,KAAK,IAAA,KAAS,uBAAA,IAA2B,SAAS,kBAAA,EAAoB;AAC5F,IAAA,OAAO,MAAA;AAAA,EACT;AAGA,EAAA,IAAI,KAAK,QAAA,CAAS,KAAK,KAAK,IAAA,CAAK,QAAA,CAAS,MAAM,CAAA,EAAG;AACjD,IAAA,OAAO,SAAA;AAAA,EACT;AAEA,EAAA,OAAO,IAAA;AACT;;;AC9DO,SAAS,gBAAgB,GAAA,EAAmC;AACjE,EAAA,MAAM,KAAA,GAAQ,aAAa,GAAG,CAAA;AAG9B,EAAA,IAAI,KAAA,CAAM,eAAA,IAAmB,KAAA,CAAM,eAAA,CAAgB,SAAS,CAAA,EAAG;AAC7D,IAAA,MAAM,OAAA,GAAU,yBAAA,CAA0B,KAAA,CAAM,eAAe,CAAA;AAC/D,IAAA,IAAI,SAAS,GAAA,EAAK;AAChB,MAAA,OAAO,OAAA,CAAQ,GAAA;AAAA,IACjB;AAAA,EACF;AAGA,EAAA,IAAI,KAAA,CAAM,UAAU,GAAA,EAAK;AACvB,IAAA,OAAO,MAAM,QAAA,CAAS,GAAA;AAAA,EACxB;AAGA,EAAA,IAAI,KAAA,CAAM,OAAA,EAAS,IAAA,EAAK,EAAG;AACzB,IAAA,OAAO,KAAA,CAAM,QAAQ,IAAA,EAAK;AAAA,EAC5B;AAGA,EAAA,IAAI,KAAA,CAAM,YAAA,EAAc,IAAA,EAAK,EAAG;AAC9B,IAAA,OAAO,KAAA,CAAM,aAAa,IAAA,EAAK;AAAA,EACjC;AAGA,EAAA,IAAI,KAAA,CAAM,MAAA,EAAQ,KAAA,EAAO,IAAA,EAAK,EAAG;AAC/B,IAAA,OAAO,KAAA,CAAM,MAAA,CAAO,KAAA,CAAM,IAAA,EAAK;AAAA,EACjC;AAGA,EAAA,IAAI,KAAA,CAAM,SAAA,EAAW,IAAA,EAAK,EAAG;AAC3B,IAAA,OAAO,KAAA,CAAM,UAAU,IAAA,EAAK;AAAA,EAC9B;AAEA,EAAA,OAAO,MAAA;AACT;AAYA,SAAS,0BAA0B,KAAA,EAAqD;AACtF,EAAA,IAAI,KAAA,CAAM,WAAW,CAAA,EAAG;AACtB,IAAA,OAAO,MAAA;AAAA,EACT;AAEA,EAAA,IAAI,OAAA,GAAU,MAAM,CAAC,CAAA;AACrB,EAAA,IAAI,WAAA,GAAcC,gBAAAA,CAAgB,KAAA,CAAM,CAAC,EAAE,KAAK,CAAA;AAEhD,EAAA,KAAA,MAAW,QAAQ,KAAA,EAAO;AACxB,IAAA,MAAM,IAAA,GAAOA,gBAAAA,CAAgB,IAAA,CAAK,KAAK,CAAA;AACvC,IAAA,IAAI,OAAO,WAAA,EAAa;AACtB,MAAA,OAAA,GAAU,IAAA;AACV,MAAA,WAAA,GAAc,IAAA;AAAA,IAChB;AAAA,EACF;AAEA,EAAA,OAAO,OAAA;AACT;AAQA,SAASA,iBAAgB,OAAA,EAA0B;AACjD,EAAA,IAAI,CAAC,OAAA,EAAS;AACZ,IAAA,OAAO,CAAA;AAAA,EACT;AAGA,EAAA,IAAI,OAAA,CAAQ,WAAA,EAAY,KAAM,KAAA,EAAO;AACnC,IAAA,OAAO,MAAA,CAAO,iBAAA;AAAA,EAChB;AAGA,EAAA,MAAM,KAAA,GAAQ,gBAAA,CAAiB,IAAA,CAAK,OAAO,CAAA;AAC3C,EAAA,IAAI,KAAA,EAAO;AACT,IAAA,MAAM,QAAQ,MAAA,CAAO,QAAA,CAAS,KAAA,CAAM,CAAC,GAAG,EAAE,CAAA;AAC1C,IAAA,MAAM,SAAS,MAAA,CAAO,QAAA,CAAS,KAAA,CAAM,CAAC,GAAG,EAAE,CAAA;AAE3C,IAAA,OAAO,KAAA,GAAQ,MAAA;AAAA,EACjB;AAEA,EAAA,OAAO,CAAA;AACT;;;AC7EA,eAAsB,cAAc,GAAA,EAAqC;AAEvE,EAAA,IAAI,OAAA;AACJ,EAAA,IAAI;AACF,IAAA,OAAA,GAAU,OAAO,GAAA,KAAQ,QAAA,GAAW,IAAI,GAAA,CAAI,GAAG,CAAA,GAAI,GAAA;AAAA,EACrD,SAAS,KAAA,EAAO;AACd,IAAA,MAAM,IAAI,KAAA,CAAM,CAAA,qBAAA,EAAwB,OAAO,GAAA,KAAQ,WAAW,GAAA,GAAM,GAAA,CAAI,QAAA,EAAU,CAAA,CAAA,EAAI;AAAA,MACxF,KAAA,EAAO;AAAA,KACR,CAAA;AAAA,EACH;AAGA,EAAA,IAAI,CAAC,OAAA,CAAQ,QAAA,IAAY,CAAC,QAAQ,IAAA,EAAM;AACtC,IAAA,MAAM,IAAI,KAAA,CAAM,CAAA,kDAAA,EAAqD,OAAA,CAAQ,QAAA,EAAU,CAAA,CAAA,CAAG,CAAA;AAAA,EAC5F;AAGA,EAAA,MAAM,QAAA,GAAW,MAAM,KAAA,CAAM,OAAO,CAAA;AACpC,EAAA,MAAM,IAAA,GAAO,MAAM,QAAA,CAAS,QAAA,EAAS;AAGrC,EAAA,MAAM,GAAA,GAAM,UAAU,IAAI,CAAA;AAG1B,EAAA,MAAM,IAAA,GAAO,WAAW,IAAI,CAAA;AAG5B,EAAA,MAAM,OAAA,GAAU,cAAA,CAAe,GAAA,EAAK,QAAA,CAAS,QAAQ,CAAA;AAGrD,EAAA,MAAM,aAAA,GAAgB,oBAAA,CAAqB,GAAA,EAAK,OAAO,CAAA;AAGvD,EAAA,MAAM,QAAe,EAAC;AACtB,EAAA,KAAA,MAAW,IAAA,IAAQ,cAAc,KAAA,EAAO;AACtC,IAAA,IAAI;AACF,MAAA,KAAA,CAAM,IAAA,CAAK,IAAI,GAAA,CAAI,IAAA,CAAK,GAAG,CAAC,CAAA;AAAA,IAC9B,CAAA,CAAA,MAAQ;AAAA,IAER;AAAA,EACF;AAGA,EAAA,MAAM,KAAA,GAAQ,iBAAiB,GAAG,CAAA;AAClC,EAAA,MAAM,WAAA,GAAc,uBAAuB,GAAG,CAAA;AAC9C,EAAA,MAAM,QAAA,GAAW,gBAAA,CAAiB,GAAA,EAAK,OAAO,CAAA;AAC9C,EAAA,MAAM,OAAA,GAAU,gBAAgB,GAAG,CAAA;AACnC,EAAA,MAAM,EAAE,QAAA,EAAU,MAAA,EAAO,GAAI,oBAAoB,GAAG,CAAA;AAGpD,EAAA,IAAI,KAAA;AACJ,EAAA,IAAI,QAAA,EAAU;AACZ,IAAA,IAAI;AACF,MAAA,KAAA,GAAQ,IAAI,IAAI,QAAQ,CAAA;AAAA,IAC1B,CAAA,CAAA,MAAQ;AAAA,IAER;AAAA,EACF;AAGA,EAAA,IAAI,IAAA;AACJ,EAAA,IAAI,OAAA,EAAS;AACX,IAAA,IAAI;AACF,MAAA,IAAA,GAAO,IAAI,IAAI,OAAO,CAAA;AAAA,IACxB,CAAA,CAAA,MAAQ;AAAA,IAER;AAAA,EACF;AAGA,EAAA,MAAM,EAAE,QAAA,EAAU,QAAA,EAAS,GAAI,gBAAA,CAAiB,KAAK,OAAO,CAAA;AAG5D,EAAA,MAAM,gBAAuB,EAAC;AAC9B,EAAA,KAAA,MAAW,QAAQ,QAAA,EAAU;AAC3B,IAAA,IAAI;AACF,MAAA,aAAA,CAAc,IAAA,CAAK,IAAI,GAAA,CAAI,IAAI,CAAC,CAAA;AAAA,IAClC,CAAA,CAAA,MAAQ;AAAA,IAER;AAAA,EACF;AAEA,EAAA,MAAM,gBAAuB,EAAC;AAC9B,EAAA,KAAA,MAAW,QAAQ,QAAA,EAAU;AAC3B,IAAA,IAAI;AACF,MAAA,aAAA,CAAc,IAAA,CAAK,IAAI,GAAA,CAAI,IAAI,CAAC,CAAA;AAAA,IAClC,CAAA,CAAA,MAAQ;AAAA,IAER;AAAA,EACF;AAGA,EAAA,OAAO;AAAA,IACL,GAAA,EAAK,IAAI,GAAA,CAAI,OAAO,CAAA;AAAA,IACpB,KAAA;AAAA,IACA,KAAA;AAAA,IACA,WAAA;AAAA,IACA,KAAA;AAAA,IACA,IAAA;AAAA,IACA,QAAA;AAAA,IACA,MAAA;AAAA,IACA,IAAA;AAAA,IACA,IAAA;AAAA,IACA,aAAA;AAAA,IACA;AAAA,GACF;AACF;;;AC/HO,SAAS,iBAAiB,GAAA,EAAkC;AACjE,EAAA,MAAM,WAA8B,EAAC;AAGrC,EAAA,MAAM,OAAA,GAAU,GAAA,CAAI,gBAAA,CAAiB,QAAQ,CAAA;AAE7C,EAAA,MAAM,eAAA,uBAAsB,GAAA,EAAY;AACxC,EAAA,MAAM,gBAAA,uBAAuB,GAAA,EAAY;AACzC,EAAA,MAAM,aAAA,uBAAoB,GAAA,EAAY;AACtC,EAAA,MAAM,MAAA,uBAAa,GAAA,EAAY;AAC/B,EAAA,MAAM,SAAA,uBAAgB,GAAA,EAAY;AAClC,EAAA,MAAM,KAAA,uBAAY,GAAA,EAAY;AAC9B,EAAA,MAAM,UAAA,uBAAiB,GAAA,EAAY;AACnC,EAAA,MAAM,MAAA,uBAAa,GAAA,EAAY;AAE/B,EAAA,KAAA,MAAW,MAAA,IAAU,KAAA,CAAM,IAAA,CAAK,OAAO,CAAA,EAAG;AACxC,IAAA,MAAM,GAAA,GAAM,MAAA,CAAO,YAAA,CAAa,KAAK,CAAA,IAAK,EAAA;AAC1C,IAAA,MAAM,OAAA,GAAU,OAAO,WAAA,IAAe,EAAA;AACtC,IAAA,MAAM,QAAA,GAAW,CAAA,EAAG,GAAG,CAAA,CAAA,EAAI,OAAO,CAAA,CAAA;AAGlC,IAAA,MAAM,SAAA,GAAY,QAAA,CAAS,QAAA,CAAS,4CAA4C,CAAA;AAChF,IAAA,KAAA,MAAW,SAAS,SAAA,EAAW;AAC7B,MAAA,eAAA,CAAgB,GAAA,CAAI,KAAA,CAAM,CAAC,CAAC,CAAA;AAAA,IAC9B;AAGA,IAAA,MAAM,UAAA,GAAa,QAAA,CAAS,QAAA,CAAS,sBAAsB,CAAA;AAC3D,IAAA,KAAA,MAAW,SAAS,UAAA,EAAY;AAC9B,MAAA,gBAAA,CAAiB,GAAA,CAAI,KAAA,CAAM,CAAC,CAAC,CAAA;AAAA,IAC/B;AAGA,IAAA,MAAM,SAAA,GAAY,QAAA,CAAS,QAAA,CAAS,8CAA8C,CAAA;AAClF,IAAA,KAAA,MAAW,SAAS,SAAA,EAAW;AAC7B,MAAA,aAAA,CAAc,GAAA,CAAI,KAAA,CAAM,CAAC,CAAC,CAAA;AAAA,IAC5B;AAGA,IAAA,IAAI,GAAA,CAAI,QAAA,CAAS,QAAQ,CAAA,IAAK,GAAA,CAAI,QAAA,CAAS,OAAO,CAAA,IAAK,OAAA,CAAQ,QAAA,CAAS,MAAM,CAAA,EAAG;AAC/E,MAAA,MAAM,gBACJ,OAAA,CAAQ,KAAA,CAAM,2CAA2C,CAAA,IACzD,OAAA,CAAQ,MAAM,uCAAuC,CAAA;AACvD,MAAA,IAAI,aAAA,EAAe;AACjB,QAAA,MAAA,CAAO,GAAA,CAAI,aAAA,CAAc,CAAC,CAAC,CAAA;AAAA,MAC7B;AAAA,IACF;AAGA,IAAA,IAAI,GAAA,CAAI,QAAA,CAAS,kBAAkB,CAAA,EAAG;AACpC,MAAA,MAAM,MAAA,GAAS,MAAA,CAAO,YAAA,CAAa,aAAa,CAAA;AAChD,MAAA,IAAI,MAAA,EAAQ;AACV,QAAA,SAAA,CAAU,IAAI,MAAM,CAAA;AAAA,MACtB;AAAA,IACF;AAGA,IAAA,IAAI,GAAA,CAAI,QAAA,CAAS,UAAU,CAAA,IAAK,GAAA,CAAI,QAAA,CAAS,SAAS,CAAA,IAAK,OAAA,CAAQ,QAAA,CAAS,OAAO,CAAA,EAAG;AACpF,MAAA,MAAM,YAAA,GAAe,OAAA,CAAQ,KAAA,CAAM,kCAAkC,CAAA;AACrE,MAAA,IAAI,YAAA,EAAc;AAChB,QAAA,KAAA,CAAM,GAAA,CAAI,YAAA,CAAa,CAAC,CAAC,CAAA;AAAA,MAC3B;AAAA,IACF;AAGA,IAAA,IAAI,GAAA,CAAI,QAAA,CAAS,wBAAwB,CAAA,EAAG;AAC1C,MAAA,MAAM,QAAA,GAAW,MAAA,CAAO,YAAA,CAAa,gBAAgB,CAAA;AACrD,MAAA,IAAI,QAAA,EAAU;AACZ,QAAA,IAAI;AACF,UAAA,MAAM,MAAA,GAAS,IAAA,CAAK,KAAA,CAAM,QAAQ,CAAA;AAClC,UAAA,IAAI,OAAO,KAAA,EAAO;AAChB,YAAA,UAAA,CAAW,GAAA,CAAI,OAAO,KAAK,CAAA;AAAA,UAC7B;AAAA,QACF,CAAA,CAAA,MAAQ;AAAA,QAER;AAAA,MACF;AAAA,IACF;AAGA,IAAA,IAAI,GAAA,CAAI,QAAA,CAAS,mBAAmB,CAAA,EAAG;AACrC,MAAA,MAAM,SAAS,MAAA,CAAO,YAAA,CAAa,WAAW,CAAA,IAAK,MAAA,CAAO,aAAa,MAAM,CAAA;AAC7E,MAAA,IAAI,MAAA,EAAQ;AACV,QAAA,MAAA,CAAO,IAAI,MAAM,CAAA;AAAA,MACnB;AAAA,IACF;AAAA,EACF;AAGA,EAAA,IAAI,eAAA,CAAgB,OAAO,CAAA,EAAG;AAC5B,IAAA,QAAA,CAAS,eAAA,GAAkB,KAAA,CAAM,IAAA,CAAK,eAAe,CAAA;AAAA,EACvD;AACA,EAAA,IAAI,gBAAA,CAAiB,OAAO,CAAA,EAAG;AAC7B,IAAA,QAAA,CAAS,gBAAA,GAAmB,KAAA,CAAM,IAAA,CAAK,gBAAgB,CAAA;AAAA,EACzD;AACA,EAAA,IAAI,aAAA,CAAc,OAAO,CAAA,EAAG;AAC1B,IAAA,QAAA,CAAS,aAAA,GAAgB,KAAA,CAAM,IAAA,CAAK,aAAa,CAAA;AAAA,EACnD;AACA,EAAA,IAAI,MAAA,CAAO,OAAO,CAAA,EAAG;AACnB,IAAA,QAAA,CAAS,MAAA,GAAS,KAAA,CAAM,IAAA,CAAK,MAAM,CAAA;AAAA,EACrC;AACA,EAAA,IAAI,SAAA,CAAU,OAAO,CAAA,EAAG;AACtB,IAAA,QAAA,CAAS,SAAA,GAAY,KAAA,CAAM,IAAA,CAAK,SAAS,CAAA;AAAA,EAC3C;AACA,EAAA,IAAI,KAAA,CAAM,OAAO,CAAA,EAAG;AAClB,IAAA,QAAA,CAAS,KAAA,GAAQ,KAAA,CAAM,IAAA,CAAK,KAAK,CAAA;AAAA,EACnC;AACA,EAAA,IAAI,UAAA,CAAW,OAAO,CAAA,EAAG;AACvB,IAAA,QAAA,CAAS,UAAA,GAAa,KAAA,CAAM,IAAA,CAAK,UAAU,CAAA;AAAA,EAC7C;AACA,EAAA,IAAI,MAAA,CAAO,OAAO,CAAA,EAAG;AACnB,IAAA,QAAA,CAAS,MAAA,GAAS,KAAA,CAAM,IAAA,CAAK,MAAM,CAAA;AAAA,EACrC;AAEA,EAAA,OAAO,QAAA;AACT;;;ACjGO,SAAS,aAAA,CAAc,KAAe,OAAA,EAA+C;AAC1F,EAAA,MAAM,WAA2B,EAAC;AAGlC,EAAA,MAAM,gBAAA,GAAmBC,oBAAAA,CAAoB,GAAA,EAAK,OAAO,CAAA;AAGzD,EAAA,MAAM,MAAA,GAASC,cAAAA,CAAc,GAAA,EAAK,gBAAgB,CAAA;AAClD,EAAA,IAAI,MAAA,CAAO,SAAS,CAAA,EAAG;AACrB,IAAA,QAAA,CAAS,MAAA,GAAS,MAAA;AAAA,EACpB;AAGA,EAAA,MAAM,WAAA,GAAc,kBAAA,CAAmB,GAAA,EAAK,gBAAgB,CAAA;AAC5D,EAAA,IAAI,WAAA,CAAY,SAAS,CAAA,EAAG;AAC1B,IAAA,QAAA,CAAS,WAAA,GAAc,WAAA;AAAA,EACzB;AAGA,EAAA,MAAM,OAAA,GAAU,cAAA,CAAe,GAAA,EAAK,gBAAgB,CAAA;AACpD,EAAA,IAAI,OAAA,CAAQ,SAAS,CAAA,EAAG;AACtB,IAAA,QAAA,CAAS,OAAA,GAAU,OAAA;AAAA,EACrB;AAGA,EAAA,MAAM,KAAA,GAAQ,YAAA,CAAa,GAAA,EAAK,gBAAgB,CAAA;AAChD,EAAA,IAAI,KAAA,CAAM,SAAS,CAAA,EAAG;AACpB,IAAA,QAAA,CAAS,KAAA,GAAQ,KAAA;AAAA,EACnB;AAGA,EAAA,MAAM,KAAA,GAAQ,YAAA,CAAa,GAAA,EAAK,gBAAgB,CAAA;AAChD,EAAA,IAAI,KAAA,CAAM,SAAS,CAAA,EAAG;AACpB,IAAA,QAAA,CAAS,KAAA,GAAQ,KAAA;AAAA,EACnB;AAGA,EAAA,MAAM,SAAA,GAAY,gBAAA,CAAiB,GAAA,EAAK,gBAAgB,CAAA;AACxD,EAAA,IAAI,SAAA,CAAU,SAAS,CAAA,EAAG;AACxB,IAAA,QAAA,CAAS,SAAA,GAAY,SAAA;AAAA,EACvB;AAGA,EAAA,MAAM,QAAA,GAAW,eAAA,CAAgB,GAAA,EAAK,gBAAgB,CAAA;AACtD,EAAA,IAAI,QAAA,CAAS,SAAS,CAAA,EAAG;AACvB,IAAA,QAAA,CAAS,QAAA,GAAW,QAAA;AAAA,EACtB;AAGA,EAAA,MAAM,eAAA,GAAkB,sBAAA,CAAuB,GAAA,EAAK,gBAAgB,CAAA;AACpE,EAAA,IAAI,eAAA,CAAgB,SAAS,CAAA,EAAG;AAC9B,IAAA,QAAA,CAAS,eAAA,GAAkB,eAAA;AAAA,EAC7B;AAEA,EAAA,OAAO,QAAA;AACT;AAKA,SAASD,oBAAAA,CAAoB,KAAe,OAAA,EAA8C;AAExF,EAAA,MAAM,WAAA,GAAc,GAAA,CAAI,aAAA,CAAc,YAAY,CAAA;AAClD,EAAA,IAAI,WAAA,EAAa;AACf,IAAA,MAAM,QAAA,GAAW,WAAA,CAAY,YAAA,CAAa,MAAM,CAAA;AAChD,IAAA,IAAI,QAAA,EAAU;AACZ,MAAA,IAAI;AAEF,QAAA,IAAI,OAAA,EAAS;AACX,UAAA,MAAM,YAAA,GAAe,YAAA,CAAa,OAAA,EAAS,QAAQ,CAAA;AACnD,UAAA,OAAO,YAAA,IAAgB,IAAA;AAAA,QACzB;AACA,QAAA,OAAO,QAAA;AAAA,MACT,CAAA,CAAA,MAAQ;AAAA,MAER;AAAA,IACF;AAAA,EACF;AAGA,EAAA,IAAI,OAAA,EAAS;AACX,IAAA,OAAO,OAAO,OAAA,KAAY,QAAA,GAAW,OAAA,GAAU,OAAA,CAAQ,IAAA;AAAA,EACzD;AAEA,EAAA,OAAO,IAAA;AACT;AAKA,SAASC,cAAAA,CAAc,KAAe,OAAA,EAAkC;AACtE,EAAA,MAAM,IAAA,uBAAW,GAAA,EAAY;AAG7B,EAAA,MAAM,WAAA,GAAc,GAAA,CAAI,gBAAA,CAAiB,UAAU,CAAA;AACnD,EAAA,KAAA,MAAW,GAAA,IAAO,KAAA,CAAM,IAAA,CAAK,WAAW,CAAA,EAAG;AACzC,IAAA,MAAM,GAAA,GAAM,GAAA,CAAI,YAAA,CAAa,KAAK,CAAA;AAClC,IAAA,IAAI,GAAA,EAAK;AACP,MAAA,MAAM,UAAA,GAAa,YAAA,CAAa,OAAA,EAAS,GAAG,CAAA;AAC5C,MAAA,IAAI,UAAA,EAAY,IAAA,CAAK,GAAA,CAAI,UAAU,CAAA;AAAA,IACrC;AAAA,EACF;AAGA,EAAA,MAAM,cAAA,GAAiB,GAAA,CAAI,gBAAA,CAAiB,6BAA6B,CAAA;AACzE,EAAA,KAAA,MAAW,OAAA,IAAW,KAAA,CAAM,IAAA,CAAK,cAAc,CAAA,EAAG;AAChD,IAAA,MAAM,MAAA,GAAS,OAAA,CAAQ,YAAA,CAAa,QAAQ,CAAA;AAC5C,IAAA,IAAI,MAAA,EAAQ;AACV,MAAA,MAAM,UAAA,GAAa,YAAY,MAAM,CAAA;AACrC,MAAA,KAAA,MAAW,OAAO,UAAA,EAAY;AAC5B,QAAA,MAAM,UAAA,GAAa,YAAA,CAAa,OAAA,EAAS,GAAG,CAAA;AAC5C,QAAA,IAAI,UAAA,EAAY,IAAA,CAAK,GAAA,CAAI,UAAU,CAAA;AAAA,MACrC;AAAA,IACF;AAAA,EACF;AAGA,EAAA,MAAM,qBAAA,GAAwB,GAAA,CAAI,gBAAA,CAAiB,wBAAwB,CAAA;AAC3E,EAAA,KAAA,MAAW,MAAA,IAAU,KAAA,CAAM,IAAA,CAAK,qBAAqB,CAAA,EAAG;AACtD,IAAA,MAAM,MAAA,GAAS,MAAA,CAAO,YAAA,CAAa,QAAQ,CAAA;AAC3C,IAAA,IAAI,MAAA,EAAQ;AACV,MAAA,MAAM,UAAA,GAAa,YAAY,MAAM,CAAA;AACrC,MAAA,KAAA,MAAW,OAAO,UAAA,EAAY;AAC5B,QAAA,MAAM,UAAA,GAAa,YAAA,CAAa,OAAA,EAAS,GAAG,CAAA;AAC5C,QAAA,IAAI,UAAA,EAAY,IAAA,CAAK,GAAA,CAAI,UAAU,CAAA;AAAA,MACrC;AAAA,IACF;AAAA,EACF;AAGA,EAAA,MAAM,QAAA,GAAW,GAAA,CAAI,gBAAA,CAAiB,0DAA0D,CAAA;AAChG,EAAA,KAAA,MAAW,IAAA,IAAQ,KAAA,CAAM,IAAA,CAAK,QAAQ,CAAA,EAAG;AACvC,IAAA,MAAM,OAAA,GAAU,IAAA,CAAK,YAAA,CAAa,SAAS,CAAA;AAC3C,IAAA,IAAI,OAAA,EAAS;AACX,MAAA,MAAM,UAAA,GAAa,YAAA,CAAa,OAAA,EAAS,OAAO,CAAA;AAChD,MAAA,IAAI,UAAA,EAAY,IAAA,CAAK,GAAA,CAAI,UAAU,CAAA;AAAA,IACrC;AAAA,EACF;AAGA,EAAA,MAAM,gBAAgB,GAAA,CAAI,gBAAA;AAAA,IACxB;AAAA,GACF;AACA,EAAA,KAAA,MAAW,IAAA,IAAQ,KAAA,CAAM,IAAA,CAAK,aAAa,CAAA,EAAG;AAC5C,IAAA,MAAM,OAAA,GAAU,IAAA,CAAK,YAAA,CAAa,SAAS,CAAA;AAC3C,IAAA,IAAI,OAAA,EAAS;AACX,MAAA,MAAM,UAAA,GAAa,YAAA,CAAa,OAAA,EAAS,OAAO,CAAA;AAChD,MAAA,IAAI,UAAA,EAAY,IAAA,CAAK,GAAA,CAAI,UAAU,CAAA;AAAA,IACrC;AAAA,EACF;AAEA,EAAA,OAAO,KAAA,CAAM,KAAK,IAAI,CAAA;AACxB;AAKA,SAAS,YAAY,MAAA,EAA0B;AAC7C,EAAA,MAAM,OAAiB,EAAC;AACxB,EAAA,MAAM,UAAA,GAAa,MAAA,CAAO,KAAA,CAAM,GAAG,CAAA,CAAE,IAAI,CAAC,CAAA,KAAM,CAAA,CAAE,IAAA,EAAM,CAAA;AAExD,EAAA,KAAA,MAAW,aAAa,UAAA,EAAY;AAElC,IAAA,MAAM,KAAA,GAAQ,SAAA,CAAU,KAAA,CAAM,KAAK,CAAA;AACnC,IAAA,IAAI,KAAA,CAAM,CAAC,CAAA,EAAG;AACZ,MAAA,IAAA,CAAK,IAAA,CAAK,KAAA,CAAM,CAAC,CAAC,CAAA;AAAA,IACpB;AAAA,EACF;AAEA,EAAA,OAAO,IAAA;AACT;AAKA,SAAS,kBAAA,CAAmB,KAAe,OAAA,EAAkC;AAC3E,EAAA,MAAM,IAAA,uBAAW,GAAA,EAAY;AAE7B,EAAA,MAAM,YAAA,GAAe,GAAA,CAAI,gBAAA,CAAiB,8BAA8B,CAAA;AACxE,EAAA,KAAA,MAAW,IAAA,IAAQ,KAAA,CAAM,IAAA,CAAK,YAAY,CAAA,EAAG;AAC3C,IAAA,MAAM,IAAA,GAAO,IAAA,CAAK,YAAA,CAAa,MAAM,CAAA;AACrC,IAAA,IAAI,IAAA,EAAM;AACR,MAAA,MAAM,UAAA,GAAa,YAAA,CAAa,OAAA,EAAS,IAAI,CAAA;AAC7C,MAAA,IAAI,UAAA,EAAY,IAAA,CAAK,GAAA,CAAI,UAAU,CAAA;AAAA,IACrC;AAAA,EACF;AAEA,EAAA,OAAO,KAAA,CAAM,KAAK,IAAI,CAAA;AACxB;AAKA,SAAS,cAAA,CAAe,KAAe,OAAA,EAAkC;AACvE,EAAA,MAAM,IAAA,uBAAW,GAAA,EAAY;AAE7B,EAAA,MAAM,cAAA,GAAiB,GAAA,CAAI,gBAAA,CAAiB,aAAa,CAAA;AACzD,EAAA,KAAA,MAAW,MAAA,IAAU,KAAA,CAAM,IAAA,CAAK,cAAc,CAAA,EAAG;AAC/C,IAAA,MAAM,GAAA,GAAM,MAAA,CAAO,YAAA,CAAa,KAAK,CAAA;AACrC,IAAA,IAAI,GAAA,EAAK;AACP,MAAA,MAAM,UAAA,GAAa,YAAA,CAAa,OAAA,EAAS,GAAG,CAAA;AAC5C,MAAA,IAAI,UAAA,EAAY,IAAA,CAAK,GAAA,CAAI,UAAU,CAAA;AAAA,IACrC;AAAA,EACF;AAEA,EAAA,OAAO,KAAA,CAAM,KAAK,IAAI,CAAA;AACxB;AAKA,SAAS,YAAA,CAAa,KAAe,OAAA,EAAkC;AACrE,EAAA,MAAM,IAAA,uBAAW,GAAA,EAAY;AAG7B,EAAA,MAAM,aAAA,GAAgB,GAAA,CAAI,gBAAA,CAAiB,OAAO,CAAA;AAClD,EAAA,KAAA,MAAW,KAAA,IAAS,KAAA,CAAM,IAAA,CAAK,aAAa,CAAA,EAAG;AAC7C,IAAA,MAAM,GAAA,GAAM,MAAM,WAAA,IAAe,EAAA;AACjC,IAAA,MAAM,QAAA,GAAW,uBAAuB,GAAG,CAAA;AAC3C,IAAA,KAAA,MAAW,OAAO,QAAA,EAAU;AAC1B,MAAA,MAAM,UAAA,GAAa,YAAA,CAAa,OAAA,EAAS,GAAG,CAAA;AAC5C,MAAA,IAAI,UAAA,EAAY,IAAA,CAAK,GAAA,CAAI,UAAU,CAAA;AAAA,IACrC;AAAA,EACF;AAGA,EAAA,MAAM,iBAAA,GAAoB,GAAA,CAAI,gBAAA,CAAiB,SAAS,CAAA;AACxD,EAAA,KAAA,MAAW,OAAA,IAAW,KAAA,CAAM,IAAA,CAAK,iBAAiB,CAAA,EAAG;AACnD,IAAA,MAAM,KAAA,GAAQ,OAAA,CAAQ,YAAA,CAAa,OAAO,CAAA,IAAK,EAAA;AAC/C,IAAA,MAAM,QAAA,GAAW,uBAAuB,KAAK,CAAA;AAC7C,IAAA,KAAA,MAAW,OAAO,QAAA,EAAU;AAC1B,MAAA,MAAM,UAAA,GAAa,YAAA,CAAa,OAAA,EAAS,GAAG,CAAA;AAC5C,MAAA,IAAI,UAAA,EAAY,IAAA,CAAK,GAAA,CAAI,UAAU,CAAA;AAAA,IACrC;AAAA,EACF;AAGA,EAAA,MAAM,YAAA,GAAe,GAAA,CAAI,gBAAA,CAAiB,sCAAsC,CAAA;AAChF,EAAA,KAAA,MAAW,IAAA,IAAQ,KAAA,CAAM,IAAA,CAAK,YAAY,CAAA,EAAG;AAC3C,IAAA,MAAM,IAAA,GAAO,IAAA,CAAK,YAAA,CAAa,MAAM,CAAA;AACrC,IAAA,IAAI,IAAA,EAAM;AACR,MAAA,MAAM,UAAA,GAAa,YAAA,CAAa,OAAA,EAAS,IAAI,CAAA;AAC7C,MAAA,IAAI,UAAA,EAAY,IAAA,CAAK,GAAA,CAAI,UAAU,CAAA;AAAA,IACrC;AAAA,EACF;AAEA,EAAA,OAAO,KAAA,CAAM,KAAK,IAAI,CAAA;AACxB;AAKA,SAAS,uBAAuB,GAAA,EAAuB;AACrD,EAAA,MAAM,OAAiB,EAAC;AAGxB,EAAA,MAAM,QAAA,GAAW,oCAAA;AACjB,EAAA,MAAM,cAAA,GAAiB,iCAAA;AAEvB,EAAA,IAAI,KAAA;AAEJ,EAAA,OAAA,CAAQ,KAAA,GAAQ,QAAA,CAAS,IAAA,CAAK,GAAG,OAAO,IAAA,EAAM;AAC5C,IAAA,MAAM,GAAA,GAAM,MAAM,CAAC,CAAA;AACnB,IAAA,IAAI,GAAA,IAAO,cAAA,CAAe,IAAA,CAAK,GAAG,CAAA,EAAG;AACnC,MAAA,IAAA,CAAK,KAAK,GAAG,CAAA;AAAA,IACf;AAAA,EACF;AAEA,EAAA,OAAO,IAAA;AACT;AAKA,SAAS,YAAA,CAAa,KAAe,OAAA,EAAkC;AACrE,EAAA,MAAM,IAAA,uBAAW,GAAA,EAAY;AAG7B,EAAA,MAAM,aAAA,GAAgB,GAAA,CAAI,gBAAA,CAAiB,wBAAwB,CAAA;AACnE,EAAA,KAAA,MAAW,KAAA,IAAS,KAAA,CAAM,IAAA,CAAK,aAAa,CAAA,EAAG;AAC7C,IAAA,MAAM,GAAA,GAAM,KAAA,CAAM,YAAA,CAAa,KAAK,CAAA;AACpC,IAAA,IAAI,GAAA,EAAK;AACP,MAAA,MAAM,UAAA,GAAa,YAAA,CAAa,OAAA,EAAS,GAAG,CAAA;AAC5C,MAAA,IAAI,UAAA,EAAY,IAAA,CAAK,GAAA,CAAI,UAAU,CAAA;AAAA,IACrC;AAAA,EACF;AAGA,EAAA,MAAM,cAAA,GAAiB,GAAA,CAAI,gBAAA,CAAiB,mDAAmD,CAAA;AAC/F,EAAA,KAAA,MAAW,MAAA,IAAU,KAAA,CAAM,IAAA,CAAK,cAAc,CAAA,EAAG;AAC/C,IAAA,MAAM,GAAA,GAAM,MAAA,CAAO,YAAA,CAAa,KAAK,CAAA;AACrC,IAAA,IAAI,GAAA,EAAK;AACP,MAAA,MAAM,UAAA,GAAa,YAAA,CAAa,OAAA,EAAS,GAAG,CAAA;AAC5C,MAAA,IAAI,UAAA,EAAY,IAAA,CAAK,GAAA,CAAI,UAAU,CAAA;AAAA,IACrC;AAAA,EACF;AAGA,EAAA,MAAM,aAAA,GAAgB,GAAA,CAAI,gBAAA,CAAiB,YAAY,CAAA;AACvD,EAAA,KAAA,MAAW,KAAA,IAAS,KAAA,CAAM,IAAA,CAAK,aAAa,CAAA,EAAG;AAC7C,IAAA,MAAM,GAAA,GAAM,KAAA,CAAM,YAAA,CAAa,KAAK,CAAA;AACpC,IAAA,IAAI,GAAA,EAAK;AACP,MAAA,MAAM,UAAA,GAAa,YAAA,CAAa,OAAA,EAAS,GAAG,CAAA;AAC5C,MAAA,IAAI,UAAA,EAAY,IAAA,CAAK,GAAA,CAAI,UAAU,CAAA;AAAA,IACrC;AAAA,EACF;AAGA,EAAA,MAAM,QAAA,GAAW,GAAA,CAAI,gBAAA,CAAiB,0DAA0D,CAAA;AAChG,EAAA,KAAA,MAAW,IAAA,IAAQ,KAAA,CAAM,IAAA,CAAK,QAAQ,CAAA,EAAG;AACvC,IAAA,MAAM,OAAA,GAAU,IAAA,CAAK,YAAA,CAAa,SAAS,CAAA;AAC3C,IAAA,IAAI,OAAA,EAAS;AACX,MAAA,MAAM,UAAA,GAAa,YAAA,CAAa,OAAA,EAAS,OAAO,CAAA;AAChD,MAAA,IAAI,UAAA,EAAY,IAAA,CAAK,GAAA,CAAI,UAAU,CAAA;AAAA,IACrC;AAAA,EACF;AAGA,EAAA,MAAM,QAAA,GAAW,GAAA,CAAI,gBAAA,CAAiB,0DAA0D,CAAA;AAChG,EAAA,KAAA,MAAW,IAAA,IAAQ,KAAA,CAAM,IAAA,CAAK,QAAQ,CAAA,EAAG;AACvC,IAAA,MAAM,OAAA,GAAU,IAAA,CAAK,YAAA,CAAa,SAAS,CAAA;AAC3C,IAAA,IAAI,OAAA,EAAS;AACX,MAAA,MAAM,UAAA,GAAa,YAAA,CAAa,OAAA,EAAS,OAAO,CAAA;AAChD,MAAA,IAAI,UAAA,EAAY,IAAA,CAAK,GAAA,CAAI,UAAU,CAAA;AAAA,IACrC;AAAA,EACF;AAEA,EAAA,OAAO,KAAA,CAAM,KAAK,IAAI,CAAA;AACxB;AAKA,SAAS,gBAAA,CAAiB,KAAe,OAAA,EAAkC;AACzE,EAAA,MAAM,IAAA,uBAAW,GAAA,EAAY;AAE7B,EAAA,MAAM,YAAA,GAAe,GAAA,CAAI,gBAAA,CAAiB,4BAA4B,CAAA;AACtE,EAAA,KAAA,MAAW,IAAA,IAAQ,KAAA,CAAM,IAAA,CAAK,YAAY,CAAA,EAAG;AAC3C,IAAA,MAAM,IAAA,GAAO,IAAA,CAAK,YAAA,CAAa,MAAM,CAAA;AACrC,IAAA,IAAI,IAAA,EAAM;AACR,MAAA,MAAM,UAAA,GAAa,YAAA,CAAa,OAAA,EAAS,IAAI,CAAA;AAC7C,MAAA,IAAI,UAAA,EAAY,IAAA,CAAK,GAAA,CAAI,UAAU,CAAA;AAAA,IACrC;AAAA,EACF;AAEA,EAAA,OAAO,KAAA,CAAM,KAAK,IAAI,CAAA;AACxB;AAKA,SAAS,eAAA,CAAgB,KAAe,OAAA,EAA2C;AACjF,EAAA,MAAM,YAA+B,EAAC;AAGtC,EAAA,MAAM,eAAA,GAAkB,GAAA,CAAI,gBAAA,CAAiB,2BAA2B,CAAA;AACxE,EAAA,KAAA,MAAW,IAAA,IAAQ,KAAA,CAAM,IAAA,CAAK,eAAe,CAAA,EAAG;AAC9C,IAAA,MAAM,IAAA,GAAO,IAAA,CAAK,YAAA,CAAa,MAAM,CAAA;AACrC,IAAA,IAAI,IAAA,EAAM;AACR,MAAA,MAAM,UAAA,GAAa,YAAA,CAAa,OAAA,EAAS,IAAI,CAAA;AAC7C,MAAA,IAAI,UAAA,EAAY;AACd,QAAA,MAAM,MAAA,GAAS,IAAA,CAAK,YAAA,CAAa,IAAI,CAAA;AACrC,QAAA,MAAM,QAAA,GAAW,IAAA,CAAK,YAAA,CAAa,MAAM,CAAA;AACzC,QAAA,MAAM,eAAA,GAAkB,IAAA,CAAK,YAAA,CAAa,aAAa,CAAA;AAEvD,QAAA,SAAA,CAAU,IAAA,CAAK;AAAA,UACb,GAAA,EAAK,UAAA;AAAA,UACL,IAAI,MAAA,IAAU,MAAA;AAAA,UACd,MAAM,QAAA,IAAY,MAAA;AAAA,UAClB,WAAA,EAAa,eAAA,KAAoB,IAAA,GAAO,eAAA,IAAmB,EAAA,GAAK,MAAA;AAAA,UAChE,QAAA,EAAU;AAAA,SACX,CAAA;AAAA,MACH;AAAA,IACF;AAAA,EACF;AAGA,EAAA,MAAM,gBAAA,GAAmB,GAAA,CAAI,gBAAA,CAAiB,4BAA4B,CAAA;AAC1E,EAAA,KAAA,MAAW,IAAA,IAAQ,KAAA,CAAM,IAAA,CAAK,gBAAgB,CAAA,EAAG;AAC/C,IAAA,MAAM,IAAA,GAAO,IAAA,CAAK,YAAA,CAAa,MAAM,CAAA;AACrC,IAAA,IAAI,IAAA,EAAM;AACR,MAAA,MAAM,UAAA,GAAa,YAAA,CAAa,OAAA,EAAS,IAAI,CAAA;AAC7C,MAAA,IAAI,UAAA,EAAY;AACd,QAAA,MAAM,MAAA,GAAS,IAAA,CAAK,YAAA,CAAa,IAAI,CAAA;AACrC,QAAA,MAAM,QAAA,GAAW,IAAA,CAAK,YAAA,CAAa,MAAM,CAAA;AACzC,QAAA,MAAM,eAAA,GAAkB,IAAA,CAAK,YAAA,CAAa,aAAa,CAAA;AAEvD,QAAA,SAAA,CAAU,IAAA,CAAK;AAAA,UACb,GAAA,EAAK,UAAA;AAAA,UACL,IAAI,MAAA,IAAU,MAAA;AAAA,UACd,MAAM,QAAA,IAAY,MAAA;AAAA,UAClB,WAAA,EAAa,eAAA,KAAoB,IAAA,GAAO,eAAA,IAAmB,EAAA,GAAK,MAAA;AAAA,UAChE,QAAA,EAAU;AAAA,SACX,CAAA;AAAA,MACH;AAAA,IACF;AAAA,EACF;AAGA,EAAA,OAAO,SAAA,CAAU,GAAA;AAAA,IAAI,CAAC,aACpB,MAAA,CAAO,WAAA;AAAA,MACL,MAAA,CAAO,OAAA,CAAQ,QAAQ,CAAA,CAAE,MAAA,CAAO,CAAC,CAAC,CAAA,EAAG,KAAK,CAAA,KAAM,KAAA,KAAU,MAAA,IAAa,UAAU,IAAI;AAAA;AACvF,GACF;AACF;AAKA,SAAS,sBAAA,CAAuB,KAAe,OAAA,EAA0C;AACvF,EAAA,MAAM,QAA0B,EAAC;AAGjC,EAAA,MAAM,mBAAA,GAAsB,GAAA,CAAI,gBAAA,CAAiB,gCAAgC,CAAA;AACjF,EAAA,KAAA,MAAW,IAAA,IAAQ,KAAA,CAAM,IAAA,CAAK,mBAAmB,CAAA,EAAG;AAClD,IAAA,MAAM,IAAA,GAAO,IAAA,CAAK,YAAA,CAAa,MAAM,CAAA;AACrC,IAAA,IAAI,IAAA,EAAM;AACR,MAAA,MAAM,UAAA,GAAa,YAAA,CAAa,OAAA,EAAS,IAAI,CAAA;AAC7C,MAAA,IAAI,UAAA,EAAY;AACd,QAAA,KAAA,CAAM,IAAA,CAAK;AAAA,UACT,GAAA,EAAK,UAAA;AAAA,UACL,UAAA,EAAY;AAAA,SACb,CAAA;AAAA,MACH;AAAA,IACF;AAAA,EACF;AAGA,EAAA,MAAM,kBAAA,GAAqB,GAAA,CAAI,gBAAA,CAAiB,8BAA8B,CAAA;AAC9E,EAAA,KAAA,MAAW,IAAA,IAAQ,KAAA,CAAM,IAAA,CAAK,kBAAkB,CAAA,EAAG;AACjD,IAAA,MAAM,IAAA,GAAO,IAAA,CAAK,YAAA,CAAa,MAAM,CAAA;AACrC,IAAA,IAAI,IAAA,EAAM;AACR,MAAA,MAAM,UAAA,GAAa,YAAA,CAAa,OAAA,EAAS,IAAI,CAAA;AAC7C,MAAA,IAAI,UAAA,EAAY;AACd,QAAA,MAAM,eAAA,GAAkB,IAAA,CAAK,YAAA,CAAa,aAAa,CAAA;AAEvD,QAAA,KAAA,CAAM,IAAA,CAAK;AAAA,UACT,GAAA,EAAK,UAAA;AAAA,UACL,UAAA,EAAY,IAAA;AAAA,UACZ,WAAA,EAAa,eAAA,KAAoB,IAAA,GAAO,eAAA,IAAmB,EAAA,GAAK;AAAA,SACjE,CAAA;AAAA,MACH;AAAA,IACF;AAAA,EACF;AAGA,EAAA,OAAO,KAAA,CAAM,GAAA;AAAA,IAAI,CAAC,SAChB,MAAA,CAAO,WAAA;AAAA,MACL,MAAA,CAAO,OAAA,CAAQ,IAAI,CAAA,CAAE,MAAA,CAAO,CAAC,CAAC,CAAA,EAAG,KAAK,CAAA,KAAM,KAAA,KAAU,MAAA,IAAa,UAAU,IAAI;AAAA;AACnF,GACF;AACF;;;ACpdO,SAAS,iBAAiB,GAAA,EAAkC;AACjE,EAAA,MAAM,WAA8B,EAAC;AAGrC,EAAA,QAAA,CAAS,SAAA,GAAY,cAAA,CAAe,GAAA,EAAK,WAAW,CAAA;AAGpD,EAAA,QAAA,CAAS,OAAA,GAAU,WAAA,CAAY,GAAA,EAAK,SAAS,CAAA;AAG7C,EAAA,IAAI,CAAC,SAAS,SAAA,EAAW;AACvB,IAAA,QAAA,CAAS,YAAY,cAAA,CAAe,GAAA,EAAK,WAAW,CAAA,IAAK,cAAA,CAAe,KAAK,gBAAgB,CAAA;AAAA,EAC/F;AAGA,EAAA,IAAI,SAAS,SAAA,EAAW;AACtB,IAAA,MAAM,MAAA,GAAS,cAAA,CAAe,QAAA,CAAS,SAAS,CAAA;AAChD,IAAA,IAAI,MAAA,CAAO,MAAA,IAAU,CAAC,QAAA,CAAS,MAAA,EAAQ;AACrC,MAAA,QAAA,CAAS,SAAS,MAAA,CAAO,MAAA;AAAA,IAC3B;AACA,IAAA,IAAI,MAAA,CAAO,IAAA,IAAQ,CAAC,QAAA,CAAS,IAAA,EAAM;AACjC,MAAA,QAAA,CAAS,OAAO,MAAA,CAAO,IAAA;AAAA,IACzB;AAAA,EACF;AAGA,EAAA,OAAO,MAAA,CAAO,WAAA;AAAA,IACZ,MAAA,CAAO,OAAA,CAAQ,QAAQ,CAAA,CAAE,MAAA,CAAO,CAAC,CAAC,CAAA,EAAG,KAAK,CAAA,KAAM,KAAA,KAAU,MAAS;AAAA,GACrE;AACF;AAcA,SAAS,eAAe,eAAA,EAA6D;AACnF,EAAA,MAAM,SAA6C,EAAC;AAGpD,EAAA,MAAM,SAAA,GAAY,eAAA,CAAgB,KAAA,CAAM,kBAAkB,CAAA;AAC1D,EAAA,IAAI,SAAA,EAAW;AACb,IAAA,MAAA,CAAO,IAAA,GAAO,UAAU,CAAC,CAAA;AAAA,EAC3B;AAGA,EAAA,IAAI,SAAS,eAAA,CACV,OAAA,CAAQ,MAAM,EAAE,CAAA,CAChB,QAAQ,SAAA,EAAW,EAAE,CAAA,CACrB,OAAA,CAAQ,mBAAmB,EAAE,CAAA,CAC7B,QAAQ,4BAAA,EAA8B,EAAE,EACxC,IAAA,EAAK;AAGR,EAAA,MAAA,GAAS,OAAO,OAAA,CAAQ,MAAA,EAAQ,GAAG,CAAA,CAAE,OAAA,CAAQ,eAAe,EAAE,CAAA;AAG9D,EAAA,MAAA,GAAS,MAAA,CAAO,OAAA,CAAQ,gCAAA,EAAkC,EAAE,CAAA;AAE5D,EAAA,IAAI,UAAU,MAAA,CAAO,MAAA,GAAS,CAAA,IAAK,MAAA,CAAO,SAAS,GAAA,EAAK;AACtD,IAAA,MAAA,CAAO,MAAA,GAAS,MAAA;AAAA,EAClB;AAEA,EAAA,OAAO,MAAA;AACT;;;ACvEO,SAAS,kBAAkB,GAAA,EAAmC;AACnE,EAAA,MAAM,WAA+B,EAAC;AAGtC,EAAA,QAAA,CAAS,QAAQ,cAAA,CAAe,GAAA,EAAK,UAAU,CAAA,IAAK,cAAA,CAAe,KAAK,eAAe,CAAA;AACvF,EAAA,QAAA,CAAS,cACP,cAAA,CAAe,GAAA,EAAK,gBAAgB,CAAA,IAAK,cAAA,CAAe,KAAK,qBAAqB,CAAA;AACpF,EAAA,QAAA,CAAS,YACP,cAAA,CAAe,GAAA,EAAK,cAAc,CAAA,IAAK,cAAA,CAAe,KAAK,mBAAmB,CAAA;AAChF,EAAA,QAAA,CAAS,OAAO,cAAA,CAAe,GAAA,EAAK,SAAS,CAAA,IAAK,cAAA,CAAe,KAAK,cAAc,CAAA;AACpF,EAAA,QAAA,CAAS,OAAO,cAAA,CAAe,GAAA,EAAK,SAAS,CAAA,IAAK,cAAA,CAAe,KAAK,cAAc,CAAA;AACpF,EAAA,QAAA,CAAS,SAAS,cAAA,CAAe,GAAA,EAAK,WAAW,CAAA,IAAK,cAAA,CAAe,KAAK,gBAAgB,CAAA;AAC1F,EAAA,QAAA,CAAS,aACP,cAAA,CAAe,GAAA,EAAK,eAAe,CAAA,IAAK,cAAA,CAAe,KAAK,oBAAoB,CAAA;AAClF,EAAA,QAAA,CAAS,SAAS,cAAA,CAAe,GAAA,EAAK,WAAW,CAAA,IAAK,cAAA,CAAe,KAAK,gBAAgB,CAAA;AAC1F,EAAA,QAAA,CAAS,WAAW,cAAA,CAAe,GAAA,EAAK,aAAa,CAAA,IAAK,cAAA,CAAe,KAAK,kBAAkB,CAAA;AAChG,EAAA,QAAA,CAAS,WAAW,cAAA,CAAe,GAAA,EAAK,aAAa,CAAA,IAAK,cAAA,CAAe,KAAK,kBAAkB,CAAA;AAChG,EAAA,QAAA,CAAS,WAAW,cAAA,CAAe,GAAA,EAAK,aAAa,CAAA,IAAK,cAAA,CAAe,KAAK,kBAAkB,CAAA;AAChG,EAAA,QAAA,CAAS,SAAS,cAAA,CAAe,GAAA,EAAK,WAAW,CAAA,IAAK,cAAA,CAAe,KAAK,gBAAgB,CAAA;AAG1F,EAAA,QAAA,CAAS,OAAA,GAAU,iBAAA,CAAkB,GAAA,EAAK,SAAS,CAAA;AACnD,EAAA,QAAA,CAAS,OAAA,GAAU,iBAAA,CAAkB,GAAA,EAAK,SAAS,CAAA;AACnD,EAAA,QAAA,CAAS,WAAA,GAAc,iBAAA,CAAkB,GAAA,EAAK,aAAa,CAAA;AAG3D,EAAA,OAAO,MAAA,CAAO,WAAA;AAAA,IACZ,MAAA,CAAO,OAAA,CAAQ,QAAQ,CAAA,CAAE,MAAA,CAAO,CAAC,CAAC,CAAA,EAAG,KAAK,CAAA,KAAM,KAAA,KAAU,MAAS;AAAA,GACrE;AACF;AASA,SAAS,iBAAA,CAAkB,KAAe,KAAA,EAAqC;AAC7E,EAAA,MAAM,SAAmB,EAAC;AAG1B,EAAA,MAAM,UAAA,GAAa,GAAA,CAAI,gBAAA,CAAiB,CAAA,cAAA,EAAiB,KAAK,CAAA,EAAA,CAAI,CAAA;AAClE,EAAA,KAAA,MAAW,OAAA,IAAW,KAAA,CAAM,IAAA,CAAK,UAAU,CAAA,EAAG;AAC5C,IAAA,MAAM,OAAA,GAAU,OAAA,CAAQ,YAAA,CAAa,SAAS,CAAA;AAC9C,IAAA,IAAI,OAAA,EAAS;AACX,MAAA,MAAA,CAAO,KAAK,OAAO,CAAA;AAAA,IACrB;AAAA,EACF;AAGA,EAAA,MAAM,eAAA,GAAkB,GAAA,CAAI,gBAAA,CAAiB,CAAA,mBAAA,EAAsB,KAAK,CAAA,EAAA,CAAI,CAAA;AAC5E,EAAA,KAAA,MAAW,OAAA,IAAW,KAAA,CAAM,IAAA,CAAK,eAAe,CAAA,EAAG;AACjD,IAAA,MAAM,OAAA,GAAU,OAAA,CAAQ,YAAA,CAAa,SAAS,CAAA;AAC9C,IAAA,IAAI,OAAA,EAAS;AACX,MAAA,MAAA,CAAO,KAAK,OAAO,CAAA;AAAA,IACrB;AAAA,EACF;AAEA,EAAA,OAAO,MAAA,CAAO,MAAA,GAAS,CAAA,GAAI,MAAA,GAAS,MAAA;AACtC;;;AC7DO,SAAS,WAAW,GAAA,EAA4B;AACrD,EAAA,MAAM,WAAwB,EAAC;AAG/B,EAAA,MAAM,WAAA,GAAc,cAAA,CAAe,GAAA,EAAK,cAAc,CAAA;AACtD,EAAA,IAAI,WAAA,EAAa;AACf,IAAA,MAAM,QAAA,GAAW,iBAAiB,WAAW,CAAA;AAC7C,IAAA,IAAI,QAAA,EAAU;AACZ,MAAA,QAAA,CAAS,QAAA,GAAW,QAAA;AAAA,IACtB;AAAA,EACF;AAGA,EAAA,IAAI,CAAC,SAAS,QAAA,EAAU;AACtB,IAAA,MAAM,OAAO,cAAA,CAAe,GAAA,EAAK,MAAM,CAAA,IAAK,cAAA,CAAe,KAAK,MAAM,CAAA;AACtE,IAAA,IAAI,IAAA,EAAM;AACR,MAAA,MAAM,QAAA,GAAW,UAAU,IAAI,CAAA;AAC/B,MAAA,IAAI,QAAA,EAAU;AACZ,QAAA,QAAA,CAAS,QAAA,GAAW,QAAA;AAAA,MACtB;AAAA,IACF;AAAA,EACF;AAGA,EAAA,QAAA,CAAS,SAAA,GAAY,cAAA,CAAe,GAAA,EAAK,eAAe,CAAA;AAGxD,EAAA,QAAA,CAAS,MAAA,GAAS,cAAA,CAAe,GAAA,EAAK,YAAY,CAAA;AAGlD,EAAA,QAAA,CAAS,OAAA,GAAU,cAAA,CAAe,GAAA,EAAK,aAAa,CAAA;AAGpD,EAAA,OAAO,MAAA,CAAO,WAAA;AAAA,IACZ,MAAA,CAAO,OAAA,CAAQ,QAAQ,CAAA,CAAE,MAAA,CAAO,CAAC,CAAC,CAAA,EAAG,KAAK,CAAA,KAAM,KAAA,KAAU,MAAS;AAAA,GACrE;AACF;AAQA,SAAS,iBAAiB,QAAA,EAA2C;AACnE,EAAA,MAAM,KAAA,GAAQ,QAAA,CAAS,KAAA,CAAM,GAAG,CAAA,CAAE,IAAI,CAAC,CAAA,KAAM,CAAA,CAAE,IAAA,EAAM,CAAA;AACrD,EAAA,IAAI,KAAA,CAAM,WAAW,CAAA,EAAG;AACtB,IAAA,OAAO,MAAA;AAAA,EACT;AAEA,EAAA,MAAM,QAAA,GAAW,MAAA,CAAO,UAAA,CAAW,KAAA,CAAM,CAAC,CAAC,CAAA;AAC3C,EAAA,MAAM,SAAA,GAAY,MAAA,CAAO,UAAA,CAAW,KAAA,CAAM,CAAC,CAAC,CAAA;AAE5C,EAAA,IAAI,OAAO,KAAA,CAAM,QAAQ,KAAK,MAAA,CAAO,KAAA,CAAM,SAAS,CAAA,EAAG;AACrD,IAAA,OAAO,MAAA;AAAA,EACT;AAEA,EAAA,IAAI,WAAW,GAAA,IAAO,QAAA,GAAW,MAAM,SAAA,GAAY,IAAA,IAAQ,YAAY,GAAA,EAAK;AAC1E,IAAA,OAAO,MAAA;AAAA,EACT;AAEA,EAAA,OAAO,EAAE,UAAU,SAAA,EAAU;AAC/B;AAQA,SAAS,UAAU,IAAA,EAAuC;AACxD,EAAA,MAAM,KAAA,GAAQ,IAAA,CAAK,KAAA,CAAM,GAAG,CAAA,CAAE,IAAI,CAAC,CAAA,KAAM,CAAA,CAAE,IAAA,EAAM,CAAA;AACjD,EAAA,IAAI,KAAA,CAAM,WAAW,CAAA,EAAG;AACtB,IAAA,OAAO,MAAA;AAAA,EACT;AAEA,EAAA,MAAM,QAAA,GAAW,MAAA,CAAO,UAAA,CAAW,KAAA,CAAM,CAAC,CAAC,CAAA;AAC3C,EAAA,MAAM,SAAA,GAAY,MAAA,CAAO,UAAA,CAAW,KAAA,CAAM,CAAC,CAAC,CAAA;AAE5C,EAAA,IAAI,OAAO,KAAA,CAAM,QAAQ,KAAK,MAAA,CAAO,KAAA,CAAM,SAAS,CAAA,EAAG;AACrD,IAAA,OAAO,MAAA;AAAA,EACT;AAEA,EAAA,IAAI,WAAW,GAAA,IAAO,QAAA,GAAW,MAAM,SAAA,GAAY,IAAA,IAAQ,YAAY,GAAA,EAAK;AAC1E,IAAA,OAAO,MAAA;AAAA,EACT;AAEA,EAAA,OAAO,EAAE,UAAU,SAAA,EAAU;AAC/B;;;ACxFO,SAAS,oBAAoB,GAAA,EAAqC;AACvE,EAAA,MAAM,WAAiC,EAAC;AAGxC,EAAA,QAAA,CAAS,eAAA,GAAkB,cAAA,CAAe,GAAA,EAAK,cAAc,CAAA;AAG7D,EAAA,QAAA,CAAS,kBAAA,GAAqB,cAAA,CAAe,GAAA,EAAK,0BAA0B,CAAA;AAG5E,EAAA,QAAA,CAAS,eACP,cAAA,CAAe,GAAA,EAAK,4BAA4B,CAAA,IAChD,cAAA,CAAe,KAAK,4BAA4B,CAAA;AAGlD,EAAA,QAAA,CAAS,IAAA,GAAO,cAAA,CAAe,GAAA,EAAK,sBAAsB,CAAA;AAG1D,EAAA,QAAA,CAAS,UAAU,cAAA,CAAe,GAAA,EAAK,SAAS,CAAA,IAAK,cAAA,CAAe,KAAK,aAAa,CAAA;AAGtF,EAAA,QAAA,CAAS,WAAW,cAAA,CAAe,GAAA,EAAK,UAAU,CAAA,IAAK,cAAA,CAAe,KAAK,aAAa,CAAA;AAGxF,EAAA,OAAO,MAAA,CAAO,WAAA;AAAA,IACZ,MAAA,CAAO,OAAA,CAAQ,QAAQ,CAAA,CAAE,MAAA,CAAO,CAAC,CAAC,CAAA,EAAG,KAAK,CAAA,KAAM,KAAA,KAAU,MAAS;AAAA,GACrE;AACF;;;AC3BO,SAAS,YAAY,GAAA,EAA6B;AACvD,EAAA,MAAM,WAAyB,EAAC;AAGhC,EAAA,MAAM,YAAA,GAAe,cAAA,CAAe,GAAA,EAAK,eAAe,CAAA;AACxD,EAAA,IAAI,YAAA,EAAc;AAChB,IAAA,MAAM,QAAA,GAAW,YAAA,CACd,KAAA,CAAM,GAAG,CAAA,CACT,GAAA,CAAI,CAAC,CAAA,KAAM,CAAA,CAAE,IAAA,EAAM,CAAA,CACnB,OAAO,OAAO,CAAA;AACjB,IAAA,IAAI,QAAA,CAAS,SAAS,CAAA,EAAG;AACvB,MAAA,QAAA,CAAS,QAAA,GAAW,QAAA;AAAA,IACtB;AAAA,EACF;AAGA,EAAA,QAAA,CAAS,QAAA,GAAW,cAAA,CAAe,GAAA,EAAK,UAAU,CAAA;AAGlD,EAAA,QAAA,CAAS,iBAAA,GAAoB,cAAA,CAAe,GAAA,EAAK,oBAAoB,CAAA;AAGrE,EAAA,QAAA,CAAS,cAAA,GAAiB,cAAA,CAAe,GAAA,EAAK,iBAAiB,CAAA;AAG/D,EAAA,OAAO,MAAA,CAAO,WAAA;AAAA,IACZ,MAAA,CAAO,OAAA,CAAQ,QAAQ,CAAA,CAAE,MAAA,CAAO,CAAC,CAAC,CAAA,EAAG,KAAK,CAAA,KAAM,KAAA,KAAU,MAAS;AAAA,GACrE;AACF;;;AC5BO,SAAS,kBAAkB,GAAA,EAAmC;AACnE,EAAA,MAAM,WAA+B,EAAC;AAGtC,EAAA,QAAA,CAAS,OAAO,WAAA,CAAY,GAAA,EAAK,MAAM,CAAA,IAAK,WAAA,CAAY,KAAK,UAAU,CAAA;AAGvE,EAAA,QAAA,CAAS,IAAA,GAAO,WAAA,CAAY,GAAA,EAAK,MAAM,CAAA;AAGvC,EAAA,QAAA,CAAS,KAAA,GAAQ,WAAA,CAAY,GAAA,EAAK,OAAO,CAAA;AAGzC,EAAA,QAAA,CAAS,IAAA,GAAO,WAAA,CAAY,GAAA,EAAK,MAAM,CAAA;AAGvC,EAAA,QAAA,CAAS,EAAA,GAAK,WAAA,CAAY,GAAA,EAAK,IAAI,CAAA;AAGnC,EAAA,QAAA,CAAS,KAAA,GAAQ,WAAA,CAAY,GAAA,EAAK,OAAO,CAAA;AAGzC,EAAA,OAAO,MAAA,CAAO,WAAA;AAAA,IACZ,MAAA,CAAO,OAAA,CAAQ,QAAQ,CAAA,CAAE,MAAA,CAAO,CAAC,CAAC,CAAA,EAAG,KAAK,CAAA,KAAM,KAAA,KAAU,MAAS;AAAA,GACrE;AACF;;;AC1BO,SAAS,gBAAgB,OAAA,EAAmC;AACjE,EAAA,IAAI,CAAC,OAAA,EAAS;AACZ,IAAA,OAAO,EAAC;AAAA,EACV;AAEA,EAAA,MAAM,aAA8B,EAAC;AAGrC,EAAA,MAAM,KAAA,GAAQ,OAAA,CAAQ,KAAA,CAAM,GAAG,CAAA,CAAE,GAAA,CAAI,CAAC,CAAA,KAAM,CAAA,CAAE,IAAA,EAAK,CAAE,WAAA,EAAa,CAAA;AAElE,EAAA,KAAA,MAAW,QAAQ,KAAA,EAAO;AACxB,IAAA,IAAI,CAAC,IAAA,EAAM;AAGX,IAAA,IAAI,IAAA,CAAK,QAAA,CAAS,GAAG,CAAA,EAAG;AACtB,MAAA,MAAM,CAAC,GAAA,EAAK,KAAK,CAAA,GAAI,IAAA,CAAK,KAAA,CAAM,GAAG,CAAA,CAAE,GAAA,CAAI,CAAC,CAAA,KAAM,CAAA,CAAE,MAAM,CAAA;AACxD,MAAA,sBAAA,CAAuB,GAAA,EAAK,OAAO,UAAU,CAAA;AAAA,IAC/C,CAAA,MAAO;AAEL,MAAA,kBAAA,CAAmB,MAAM,UAAU,CAAA;AAAA,IACrC;AAAA,EACF;AAEA,EAAA,OAAO,UAAA;AACT;AAKA,SAAS,kBAAA,CAAmB,WAAmB,MAAA,EAA+B;AAC5E,EAAA,QAAQ,SAAA;AAAW,IACjB,KAAK,OAAA;AACH,MAAA,MAAA,CAAO,KAAA,GAAQ,IAAA;AACf,MAAA;AAAA,IACF,KAAK,SAAA;AACH,MAAA,MAAA,CAAO,KAAA,GAAQ,KAAA;AACf,MAAA;AAAA,IACF,KAAK,QAAA;AACH,MAAA,MAAA,CAAO,MAAA,GAAS,IAAA;AAChB,MAAA;AAAA,IACF,KAAK,UAAA;AACH,MAAA,MAAA,CAAO,MAAA,GAAS,KAAA;AAChB,MAAA;AAAA,IACF,KAAK,WAAA;AACH,MAAA,MAAA,CAAO,SAAA,GAAY,IAAA;AACnB,MAAA;AAAA,IACF,KAAK,WAAA;AACH,MAAA,MAAA,CAAO,SAAA,GAAY,IAAA;AACnB,MAAA;AAAA,IACF,KAAK,cAAA;AACH,MAAA,MAAA,CAAO,YAAA,GAAe,IAAA;AACtB,MAAA;AAAA,IACF,KAAK,aAAA;AACH,MAAA,MAAA,CAAO,WAAA,GAAc,IAAA;AACrB,MAAA;AAAA,IACF,KAAK,KAAA;AAEH,MAAA,MAAA,CAAO,KAAA,GAAQ,IAAA;AACf,MAAA,MAAA,CAAO,MAAA,GAAS,IAAA;AAChB,MAAA;AAAA,IACF,KAAK,MAAA;AAEH,MAAA,MAAA,CAAO,KAAA,GAAQ,KAAA;AACf,MAAA,MAAA,CAAO,MAAA,GAAS,KAAA;AAChB,MAAA;AAAA;AAEN;AAKA,SAAS,sBAAA,CAAuB,GAAA,EAAa,KAAA,EAAe,MAAA,EAA+B;AACzF,EAAA,QAAQ,GAAA;AAAK,IACX,KAAK,aAAA;AAEH,MAAA,IAAI,UAAU,IAAA,EAAM;AAClB,QAAA,MAAA,CAAO,UAAA,GAAa,EAAA;AAAA,MACtB,CAAA,MAAO;AACL,QAAA,MAAM,GAAA,GAAM,MAAA,CAAO,QAAA,CAAS,KAAA,EAAO,EAAE,CAAA;AACrC,QAAA,IAAI,CAAC,MAAA,CAAO,KAAA,CAAM,GAAG,CAAA,EAAG;AACtB,UAAA,MAAA,CAAO,UAAA,GAAa,GAAA;AAAA,QACtB;AAAA,MACF;AACA,MAAA;AAAA,IAEF,KAAK,mBAAA;AAEH,MAAA,MAAA,CAAO,eAAA,GAAkB,KAAA;AACzB,MAAA;AAAA,IAEF,KAAK,mBAAA;AAEH,MAAA,IAAI,UAAU,IAAA,EAAM;AAClB,QAAA,MAAA,CAAO,eAAA,GAAkB,EAAA;AAAA,MAC3B,CAAA,MAAO;AACL,QAAA,MAAM,GAAA,GAAM,MAAA,CAAO,QAAA,CAAS,KAAA,EAAO,EAAE,CAAA;AACrC,QAAA,IAAI,CAAC,MAAA,CAAO,KAAA,CAAM,GAAG,CAAA,EAAG;AACtB,UAAA,MAAA,CAAO,eAAA,GAAkB,GAAA;AAAA,QAC3B;AAAA,MACF;AACA,MAAA;AAAA,IAEF,KAAK,mBAAA;AAEH,MAAA,MAAA,CAAO,gBAAA,GAAmB,KAAA;AAC1B,MAAA;AAAA;AAEN;;;ACzGO,SAAS,cAAc,GAAA,EAA+B;AAC3D,EAAA,MAAM,WAA2B,EAAC;AAGlC,EAAA,MAAM,aAAA,GAAgB,cAAA,CAAe,GAAA,EAAK,QAAQ,CAAA;AAClD,EAAA,IAAI,aAAA,EAAe;AACjB,IAAA,MAAM,UAAA,GAAa,gBAAgB,aAAa,CAAA;AAChD,IAAA,IAAI,MAAA,CAAO,IAAA,CAAK,UAAU,CAAA,CAAE,SAAS,CAAA,EAAG;AACtC,MAAA,QAAA,CAAS,MAAA,GAAS,UAAA;AAAA,IACpB;AAAA,EACF;AAGA,EAAA,MAAM,gBAAA,GAAmB,cAAA,CAAe,GAAA,EAAK,WAAW,CAAA;AACxD,EAAA,IAAI,gBAAA,EAAkB;AACpB,IAAA,MAAM,UAAA,GAAa,gBAAgB,gBAAgB,CAAA;AACnD,IAAA,IAAI,MAAA,CAAO,IAAA,CAAK,UAAU,CAAA,CAAE,SAAS,CAAA,EAAG;AACtC,MAAA,QAAA,CAAS,SAAA,GAAY,UAAA;AAAA,IACvB;AAAA,EACF;AAGA,EAAA,MAAM,cAAA,GAAiB,cAAA,CAAe,GAAA,EAAK,SAAS,CAAA;AACpD,EAAA,IAAI,cAAA,EAAgB;AAClB,IAAA,MAAM,UAAA,GAAa,gBAAgB,cAAc,CAAA;AACjD,IAAA,IAAI,MAAA,CAAO,IAAA,CAAK,UAAU,CAAA,CAAE,SAAS,CAAA,EAAG;AACtC,MAAA,QAAA,CAAS,OAAA,GAAU,UAAA;AAAA,IACrB;AAAA,EACF;AAGA,EAAA,MAAM,oBAAA,GAAuB,cAAA,CAAe,GAAA,EAAK,gBAAgB,CAAA;AACjE,EAAA,IAAI,oBAAA,EAAsB;AACxB,IAAA,MAAM,UAAA,GAAa,gBAAgB,oBAAoB,CAAA;AACvD,IAAA,IAAI,MAAA,CAAO,IAAA,CAAK,UAAU,CAAA,CAAE,SAAS,CAAA,EAAG;AACtC,MAAA,QAAA,CAAS,aAAA,GAAgB,UAAA;AAAA,IAC3B;AAAA,EACF;AAEA,EAAA,OAAO,QAAA;AACT;;;ACzCO,SAAS,gBAAgB,GAAA,EAAiC;AAC/D,EAAA,MAAM,WAA6B,EAAC;AAGpC,EAAA,QAAA,CAAS,cAAA,GAAiB,cAAA,CAAe,GAAA,EAAK,UAAU,CAAA;AAGxD,EAAA,QAAA,CAAS,qBAAA,GAAwB,gBAAA,CAAiB,GAAA,EAAK,yBAAyB,CAAA;AAGhF,EAAA,QAAA,CAAS,aAAA,GAAgB,gBAAA,CAAiB,GAAA,EAAK,iBAAiB,CAAA;AAGhE,EAAA,QAAA,CAAS,eAAA,GAAkB,cAAA,CAAe,GAAA,EAAK,kBAAkB,CAAA;AAGjE,EAAA,OAAO,MAAA,CAAO,WAAA;AAAA,IACZ,MAAA,CAAO,OAAA,CAAQ,QAAQ,CAAA,CAAE,MAAA,CAAO,CAAC,CAAC,CAAA,EAAG,KAAK,CAAA,KAAM,KAAA,KAAU,MAAS;AAAA,GACrE;AACF;;;AClCO,IAAM,oBAAA,GAAuB;AAAA,EAClC,cAAA;AAAA,EACA,oBAAA;AAAA,EACA,oBAAA;AAAA,EACA,mBAAA;AAAA,EACA,eAAA;AAAA,EACA,iBAAA;AAAA,EACA,uBAAA;AAAA,EACA,cAAA;AAAA,EACA,WAAA;AAAA,EACA,eAAA;AAAA,EACA,uBAAA;AAAA,EACA,sBAAA;AAAA,EACA,iBAAA;AAAA;AAAA,EACA,mBAAA;AAAA;AAAA,EACA;AAAA;AACF,CAAA;AAcO,SAAS,2BAA2B,WAAA,EAAsC;AAC/E,EAAA,IAAI,CAAC,WAAA,EAAa;AAEhB,IAAA,OAAO,CAAC,aAAA,EAAe,GAAG,oBAAoB,CAAA;AAAA,EAChD;AAEA,EAAA,IAAI;AACF,IAAA,MAAM,MAAM,OAAO,WAAA,KAAgB,WAAW,IAAI,GAAA,CAAI,WAAW,CAAA,GAAI,WAAA;AACrE,IAAA,MAAM,SAAS,GAAA,CAAI,MAAA;AAGnB,IAAA,MAAM,WAAA,GAAc;AAAA,MAClB,GAAG,MAAM,CAAA,WAAA,CAAA;AAAA;AAAA,MACT,GAAG,qBAAqB,GAAA,CAAI,CAAC,SAAS,CAAA,EAAG,MAAM,CAAA,EAAG,IAAI,CAAA,CAAE;AAAA,KAC1D;AAEA,IAAA,OAAO,WAAA;AAAA,EACT,CAAA,CAAA,MAAQ;AAEN,IAAA,OAAO,CAAC,aAAA,EAAe,GAAG,oBAAoB,CAAA;AAAA,EAChD;AACF;;;AClCO,SAAS,uBAAA,CACd,KACA,WAAA,EAC0B;AAC1B,EAAA,MAAM,QAAA,GAAqC;AAAA,IACzC,UAAU;AAAC,GACb;AAGA,EAAA,MAAM,YAAA,GAAe,WAAA,CAAY,GAAA,EAAK,SAAS,CAAA;AAG/C,EAAA,QAAA,CAAS,WAAW,YAAA,CAAa,GAAA,CAAI,CAAC,IAAA,KAAS,KAAK,IAAI,CAAA;AAGxD,EAAA,IAAI,WAAA,EAAa;AACf,IAAA,QAAA,CAAS,WAAA,GAAc,2BAA2B,WAAW,CAAA;AAAA,EAC/D;AAEA,EAAA,OAAO,QAAA;AACT;;;ACvBO,SAAS,sBAAsB,GAAA,EAAuC;AAC3E,EAAA,MAAM,WAAmC,EAAC;AAG1C,EAAA,QAAA,CAAS,OAAA,GACP,cAAA,CAAe,GAAA,EAAK,cAAc,KAClC,cAAA,CAAe,GAAA,EAAK,iBAAiB,CAAA,IACrC,oBAAoB,GAAA,EAAK,cAAc,CAAA,IACvC,mBAAA,CAAoB,KAAK,iBAAiB,CAAA;AAG5C,EAAA,IAAI,SAAS,OAAA,EAAS;AACpB,IAAA,QAAA,CAAS,OAAA,GAAU,QAAA,CAAS,OAAA,CAAQ,OAAA,CAAQ,MAAM,EAAE,CAAA;AAAA,EACtD;AAGA,EAAA,QAAA,CAAS,QAAA,GACP,mBAAA,CAAoB,GAAA,EAAK,QAAA,EAAU,cAAc,CAAA,IACjD,mBAAA,CAAoB,GAAA,EAAK,eAAe,CAAA,IACxC,mBAAA,CAAoB,GAAA,EAAK,YAAY,CAAA;AAGvC,EAAA,QAAA,CAAS,YACP,cAAA,CAAe,GAAA,EAAK,gBAAgB,CAAA,IAAK,mBAAA,CAAoB,KAAK,gBAAgB,CAAA;AAGpF,EAAA,QAAA,CAAS,QAAA,GAAW,mBAAA,CAAoB,GAAA,EAAK,gBAAgB,CAAA;AAG7D,EAAA,QAAA,CAAS,UACP,cAAA,CAAe,GAAA,EAAK,iBAAiB,CAAA,IAAK,mBAAA,CAAoB,KAAK,iBAAiB,CAAA;AAGtF,EAAA,QAAA,CAAS,MAAA,GAAS,cAAA,CAAe,GAAA,EAAK,aAAa,CAAA;AAGnD,EAAA,QAAA,CAAS,MAAA,GAAS,cAAA,CAAe,GAAA,EAAK,aAAa,CAAA;AAGnD,EAAA,QAAA,CAAS,SAAA,GAAY,cAAA,CAAe,GAAA,EAAK,mBAAmB,CAAA;AAG5D,EAAA,QAAA,CAAS,QAAA,GAAW,mBAAA,CAAoB,GAAA,EAAK,mBAAmB,CAAA;AAGhE,EAAA,QAAA,CAAS,MAAA,GAAS,cAAA,CAAe,GAAA,EAAK,aAAa,CAAA;AAGnD,EAAA,MAAM,cAAA,GAAiB,uBAAuB,GAAG,CAAA;AACjD,EAAA,IAAI,cAAA,CAAe,SAAS,CAAA,EAAG;AAC7B,IAAA,KAAA,MAAW,OAAO,cAAA,EAAgB;AAChC,MAAA,uBAAA,CAAwB,KAAK,QAAQ,CAAA;AAAA,IACvC;AAAA,EACF;AAGA,EAAA,MAAM,gBAAwC,EAAC;AAG/C,EAAA,MAAM,cAAA,GAAiB;AAAA,IACrB,SAAA;AAAA;AAAA,IACA,eAAA;AAAA;AAAA,IACA,eAAA;AAAA;AAAA,IACA,iBAAA;AAAA;AAAA,IACA;AAAA;AAAA,GACF;AAEA,EAAA,KAAA,MAAW,WAAW,cAAA,EAAgB;AACpC,IAAA,MAAM,KAAA,GAAQ,cAAA,CAAe,GAAA,EAAK,OAAO,CAAA;AACzC,IAAA,IAAI,KAAA,EAAO;AACT,MAAA,aAAA,CAAc,OAAO,CAAA,GAAI,KAAA;AAAA,IAC3B;AAAA,EACF;AAGA,EAAA,IAAI,MAAA,CAAO,IAAA,CAAK,aAAa,CAAA,CAAE,SAAS,CAAA,EAAG;AACzC,IAAA,QAAA,CAAS,KAAA,GAAQ,aAAA;AAAA,EACnB;AAGA,EAAA,OAAO,MAAA,CAAO,WAAA;AAAA,IACZ,MAAA,CAAO,OAAA,CAAQ,QAAQ,CAAA,CAAE,MAAA,CAAO,CAAC,CAAC,CAAA,EAAG,KAAK,CAAA,KAAM,KAAA,KAAU,MAAS;AAAA,GACrE;AACF;AAUA,SAAS,mBAAA,CACP,GAAA,EACA,QAAA,EACA,WAAA,EACoB;AACpB,EAAA,MAAM,IAAA,GAAO,GAAA,CAAI,aAAA,CAAc,CAAA,eAAA,EAAkB,QAAQ,CAAA,EAAA,CAAI,CAAA;AAC7D,EAAA,IAAI,CAAC,IAAA,EAAM;AACT,IAAA,OAAO,MAAA;AAAA,EACT;AAEA,EAAA,MAAM,OAAA,GAAU,IAAA,CAAK,YAAA,CAAa,SAAS,CAAA;AAC3C,EAAA,IAAI,CAAC,OAAA,EAAS;AACZ,IAAA,OAAO,MAAA;AAAA,EACT;AAEA,EAAA,IAAI,WAAA,IAAe,CAAC,OAAA,CAAQ,QAAA,CAAS,WAAW,CAAA,EAAG;AACjD,IAAA,OAAO,MAAA;AAAA,EACT;AAEA,EAAA,OAAO,OAAA;AACT;AAWA,SAAS,uBAAuB,GAAA,EAAyB;AACvD,EAAA,MAAM,WAAqB,EAAC;AAG5B,EAAA,MAAM,OAAA,GAAU,GAAA,CAAI,gBAAA,CAAiB,oCAAoC,CAAA;AAEzE,EAAA,KAAA,MAAW,MAAA,IAAU,KAAA,CAAM,IAAA,CAAK,OAAO,CAAA,EAAG;AACxC,IAAA,IAAI;AACF,MAAA,MAAM,IAAA,GAAO,IAAA,CAAK,KAAA,CAAM,MAAA,CAAO,eAAe,IAAI,CAAA;AAGlD,MAAA,MAAM,QAAQ,KAAA,CAAM,OAAA,CAAQ,IAAI,CAAA,GAAI,IAAA,GAAO,CAAC,IAAI,CAAA;AAEhD,MAAA,KAAA,MAAW,QAAQ,KAAA,EAAO;AAExB,QAAA,IAAI,KAAK,MAAA,EAAQ;AACf,UAAA,IAAI,KAAA,CAAM,OAAA,CAAQ,IAAA,CAAK,MAAM,CAAA,EAAG;AAC9B,YAAA,QAAA,CAAS,IAAA,CAAK,GAAG,IAAA,CAAK,MAAM,CAAA;AAAA,UAC9B,CAAA,MAAA,IAAW,OAAO,IAAA,CAAK,MAAA,KAAW,QAAA,EAAU;AAC1C,YAAA,QAAA,CAAS,IAAA,CAAK,KAAK,MAAM,CAAA;AAAA,UAC3B;AAAA,QACF;AAGA,QAAA,IAAI,IAAA,CAAK,QAAQ,CAAA,EAAG;AAClB,UAAA,KAAA,MAAW,IAAA,IAAQ,IAAA,CAAK,QAAQ,CAAA,EAAG;AACjC,YAAA,IAAI,KAAK,MAAA,EAAQ;AACf,cAAA,IAAI,KAAA,CAAM,OAAA,CAAQ,IAAA,CAAK,MAAM,CAAA,EAAG;AAC9B,gBAAA,QAAA,CAAS,IAAA,CAAK,GAAG,IAAA,CAAK,MAAM,CAAA;AAAA,cAC9B,CAAA,MAAA,IAAW,OAAO,IAAA,CAAK,MAAA,KAAW,QAAA,EAAU;AAC1C,gBAAA,QAAA,CAAS,IAAA,CAAK,KAAK,MAAM,CAAA;AAAA,cAC3B;AAAA,YACF;AAAA,UACF;AAAA,QACF;AAAA,MACF;AAAA,IACF,CAAA,CAAA,MAAQ;AAAA,IAER;AAAA,EACF;AAEA,EAAA,OAAO,QAAA;AACT;AAQA,SAAS,uBAAA,CAAwB,KAAa,QAAA,EAAwC;AACpF,EAAA,MAAM,QAAA,GAAW,IAAI,WAAA,EAAY;AAEjC,EAAA,IAAI,SAAS,QAAA,CAAS,aAAa,KAAK,QAAA,CAAS,QAAA,CAAS,OAAO,CAAA,EAAG;AAClE,IAAA,IAAI,CAAC,SAAS,OAAA,EAAS;AAErB,MAAA,MAAM,KAAA,GAAQ,GAAA,CAAI,KAAA,CAAM,oCAAoC,CAAA;AAC5D,MAAA,IAAI,KAAA,EAAO;AACT,QAAA,QAAA,CAAS,OAAA,GAAU,MAAM,CAAC,CAAA;AAAA,MAC5B;AAAA,IACF;AAAA,EACF,CAAA,MAAA,IAAW,QAAA,CAAS,QAAA,CAAS,cAAc,CAAA,EAAG;AAC5C,IAAA,IAAI,CAAC,SAAS,QAAA,EAAU;AACtB,MAAA,QAAA,CAAS,QAAA,GAAW,GAAA;AAAA,IACtB;AAAA,EACF,CAAA,MAAA,IAAW,QAAA,CAAS,QAAA,CAAS,eAAe,CAAA,EAAG;AAC7C,IAAA,IAAI,CAAC,SAAS,SAAA,EAAW;AACvB,MAAA,MAAM,KAAA,GAAQ,GAAA,CAAI,KAAA,CAAM,2BAA2B,CAAA;AACnD,MAAA,IAAI,KAAA,EAAO;AACT,QAAA,QAAA,CAAS,SAAA,GAAY,MAAM,CAAC,CAAA;AAAA,MAC9B;AAAA,IACF;AAAA,EACF,CAAA,MAAA,IAAW,QAAA,CAAS,QAAA,CAAS,cAAc,CAAA,EAAG;AAC5C,IAAA,IAAI,CAAC,SAAS,QAAA,EAAU;AACtB,MAAA,QAAA,CAAS,QAAA,GAAW,GAAA;AAAA,IACtB;AAAA,EACF,CAAA,MAAA,IAAW,QAAA,CAAS,QAAA,CAAS,aAAa,CAAA,EAAG;AAC3C,IAAA,IAAI,CAAC,SAAS,OAAA,EAAS;AACrB,MAAA,QAAA,CAAS,OAAA,GAAU,GAAA;AAAA,IACrB;AAAA,EACF,CAAA,MAAA,IAAW,QAAA,CAAS,QAAA,CAAS,YAAY,CAAA,EAAG;AAC1C,IAAA,IAAI,CAAC,SAAS,MAAA,EAAQ;AACpB,MAAA,MAAM,KAAA,GAAQ,GAAA,CAAI,KAAA,CAAM,wBAAwB,CAAA;AAChD,MAAA,IAAI,KAAA,EAAO;AACT,QAAA,QAAA,CAAS,MAAA,GAAS,MAAM,CAAC,CAAA;AAAA,MAC3B;AAAA,IACF;AAAA,EACF,CAAA,MAAA,IAAW,QAAA,CAAS,QAAA,CAAS,YAAY,CAAA,EAAG;AAC1C,IAAA,IAAI,CAAC,SAAS,MAAA,EAAQ;AACpB,MAAA,MAAM,KAAA,GAAQ,GAAA,CAAI,KAAA,CAAM,0BAA0B,CAAA;AAClD,MAAA,IAAI,KAAA,EAAO;AACT,QAAA,QAAA,CAAS,MAAA,GAAS,MAAM,CAAC,CAAA;AAAA,MAC3B;AAAA,IACF;AAAA,EACF,CAAA,MAAA,IAAW,QAAA,CAAS,QAAA,CAAS,eAAe,CAAA,EAAG;AAC7C,IAAA,IAAI,CAAC,SAAS,SAAA,EAAW;AACvB,MAAA,MAAM,KAAA,GAAQ,GAAA,CAAI,KAAA,CAAM,2BAA2B,CAAA;AACnD,MAAA,IAAI,KAAA,EAAO;AACT,QAAA,QAAA,CAAS,SAAA,GAAY,MAAM,CAAC,CAAA;AAAA,MAC9B;AAAA,IACF;AAAA,EACF,CAAA,MAAA,IAAW,QAAA,CAAS,QAAA,CAAS,YAAY,CAAA,EAAG;AAC1C,IAAA,IAAI,CAAC,SAAS,MAAA,EAAQ;AACpB,MAAA,MAAM,KAAA,GAAQ,GAAA,CAAI,KAAA,CAAM,oCAAoC,CAAA;AAC5D,MAAA,IAAI,KAAA,EAAO;AACT,QAAA,QAAA,CAAS,MAAA,GAAS,MAAM,CAAC,CAAA;AAAA,MAC3B;AAAA,IACF;AAAA,EACF;AACF;;;ACzOO,SAAS,oBAAoB,GAAA,EAAqC;AACvE,EAAA,MAAM,WAAiC,EAAC;AAGxC,EAAA,QAAA,CAAS,sBAAA,GAAyB,cAAA,CAAe,GAAA,EAAK,0BAA0B,CAAA;AAGhF,EAAA,QAAA,CAAS,UAAA,GAAa,cAAA,CAAe,GAAA,EAAK,eAAe,CAAA;AAGzD,EAAA,QAAA,CAAS,kBAAA,GAAqB,cAAA,CAAe,GAAA,EAAK,qBAAqB,CAAA;AAGvE,EAAA,QAAA,CAAS,0BAAA,GAA6B,cAAA,CAAe,GAAA,EAAK,8BAA8B,CAAA;AAGxF,EAAA,QAAA,CAAS,qBAAA,GAAwB,cAAA,CAAe,GAAA,EAAK,iBAAiB,CAAA;AAGtE,EAAA,QAAA,CAAS,iBAAA,GAAoB,cAAA,CAAe,GAAA,EAAK,eAAe,CAAA;AAGhE,EAAA,QAAA,CAAS,aAAA,GAAgB,cAAA,CAAe,GAAA,EAAK,kCAAkC,CAAA;AAG/E,EAAA,MAAM,qBAA6C,EAAC;AAGpD,EAAA,MAAM,oBAAA,GAAuB;AAAA,IAC3B,WAAA;AAAA;AAAA,IACA,UAAA;AAAA;AAAA,IACA,QAAA;AAAA;AAAA,IACA,cAAA;AAAA;AAAA,IACA,qBAAA;AAAA;AAAA,IACA;AAAA;AAAA,GACF;AAEA,EAAA,KAAA,MAAW,WAAW,oBAAA,EAAsB;AAC1C,IAAA,MAAM,KAAA,GAAQ,cAAA,CAAe,GAAA,EAAK,OAAO,CAAA;AACzC,IAAA,IAAI,KAAA,EAAO;AACT,MAAA,kBAAA,CAAmB,OAAO,CAAA,GAAI,KAAA;AAAA,IAChC;AAAA,EACF;AAGA,EAAA,IAAI,MAAA,CAAO,IAAA,CAAK,kBAAkB,CAAA,CAAE,SAAS,CAAA,EAAG;AAC9C,IAAA,QAAA,CAAS,KAAA,GAAQ,kBAAA;AAAA,EACnB;AAGA,EAAA,OAAO,MAAA,CAAO,WAAA;AAAA,IACZ,MAAA,CAAO,OAAA,CAAQ,QAAQ,CAAA,CAAE,MAAA,CAAO,CAAC,CAAC,CAAA,EAAG,KAAK,CAAA,KAAM,KAAA,KAAU,MAAS;AAAA,GACrE;AACF;;;AChFO,IAAM,UAAA,GAAN,cAAyB,KAAA,CAAM;AAAA,EAC3B,IAAA,GAAO,YAAA;AAClB;AAKO,IAAM,qBAAA,GAAN,cAAoC,UAAA,CAAW;AAAA,EAC3C,IAAA,GAAO,uBAAA;AAClB;AAKO,IAAM,iBAAA,GAAN,cAAgC,UAAA,CAAW;AAAA,EACvC,IAAA,GAAO,mBAAA;AAClB;AAKO,IAAM,mBAAA,GAAN,cAAkC,UAAA,CAAW;AAAA,EACzC,IAAA,GAAO,qBAAA;AAClB;AAMO,IAAM,kBAAA,GAAN,cAAiC,UAAA,CAAW;AAAA,EACxC,IAAA,GAAO,oBAAA;AAClB;;;AC3BO,SAAS,oBAAA,CAAqB,GAAA,GAAoB,MAAM,IAAA,CAAK,KAAI,EAAmB;AACzF,EAAA,MAAM,UAA+B,EAAC;AAEtC,EAAA,MAAM,WAAA,GAAc,CAAC,GAAA,KAAe;AAClC,IAAA,MAAM,QAAkB,EAAC;AACzB,IAAA,KAAA,CAAM,IAAA,CAAK,GAAG,GAAA,CAAI,IAAI,KAAK,GAAA,CAAI,OAAO,CAAA,EAAG,GAAA,CAAI,KAAA,GAAQ;AAAA,EAAK,IAAI,KAAK,CAAA,CAAA,GAAK,EAAE,CAAA,CAAA,CAAG,MAAM,CAAA;AACnF,IAAA,IAAI;AACF,MAAA,MAAM,QAAiC,EAAC;AACxC,MAAA,KAAA,MAAW,GAAA,IAAO,MAAA,CAAO,mBAAA,CAAoB,GAAG,CAAA,EAAG;AACjD,QAAA,IAAI,GAAA,KAAQ,MAAA,IAAU,GAAA,KAAQ,SAAA,IAAa,QAAQ,OAAA,EAAS;AAC5D,QAAA,KAAA,CAAM,GAAG,CAAA,GAAK,GAAA,CAAY,GAAG,CAAA;AAAA,MAC/B;AACA,MAAA,IAAI,MAAA,CAAO,IAAA,CAAK,KAAK,CAAA,CAAE,SAAS,CAAA,EAAG;AACjC,QAAA,KAAA,CAAM,KAAK,CAAA,OAAA,EAAU,IAAA,CAAK,SAAA,CAAU,KAAK,CAAC,CAAA,CAAE,CAAA;AAAA,MAC9C;AAAA,IACF,CAAA,CAAA,MAAQ;AAAA,IAER;AACA,IAAA,OAAO,KAAA,CAAM,KAAK,IAAI,CAAA;AAAA,EACxB,CAAA;AAEA,EAAA,MAAM,MAAA,GAAmC,CAAC,KAAA,EAAO,IAAA,KAAS;AACxD,IAAA,MAAM,GAAA,GAAM,IAAA,CACT,GAAA,CAAI,CAAC,CAAA,KAAM;AACV,MAAA,IAAI;AACF,QAAA,IAAI,CAAA,YAAa,KAAA,EAAO,OAAO,WAAA,CAAY,CAAC,CAAA;AAC5C,QAAA,IAAI,OAAO,CAAA,KAAM,QAAA,EAAU,OAAO,CAAA;AAClC,QAAA,OAAO,OAAO,CAAC,CAAA;AAAA,MACjB,CAAA,CAAA,MAAQ;AACN,QAAA,OAAO,mBAAA;AAAA,MACT;AAAA,IACF,CAAC,CAAA,CACA,IAAA,CAAK,GAAG,CAAA;AAEX,IAAA,MAAM,UAAA,GAAa,IAAA,CAAK,GAAA,CAAI,CAAC,CAAA,KAAM;AACjC,MAAA,IAAI;AACF,QAAA,IAAI,CAAA,YAAa,KAAA,EAAO,OAAO,WAAA,CAAY,CAAC,CAAA;AAC5C,QAAA,IAAI,OAAO,CAAA,KAAM,QAAA,EAAU,OAAO,CAAA;AAClC,QAAA,OAAO,OAAO,CAAC,CAAA;AAAA,MACjB,CAAA,CAAA,MAAQ;AACN,QAAA,OAAO,mBAAA;AAAA,MACT;AAAA,IACF,CAAC,CAAA;AAED,IAAA,OAAA,CAAQ,IAAA,CAAK,EAAE,KAAA,EAAO,OAAA,EAAS,GAAA,EAAK,MAAM,UAAA,EAAY,IAAA,EAAM,GAAA,EAAI,EAAG,CAAA;AAAA,EACrE,CAAA;AAEA,EAAA,OAAO,EAAE,SAAS,MAAA,EAAO;AAC3B;AC7BO,SAAS,gBAAgB,IAAA,EAA8B;AAC5D,EAAA,MAAM,EAAE,WAAU,GAAI,IAAA;AAEtB,EAAA,MAAM,cAAA,GAAiBC,iBAAA;AACvB,EAAA,MAAM,gBAAA,GAAmBC,mBAAA;AACzB,EAAA,MAAM,eAAA,GAAkBC,kBAAA;AACxB,EAAA,MAAM,iBAAA,GAAoBC,oBAAA;AAC1B,EAAA,MAAM,gBAAA,GAAmBC,mBAAA;AACzB,EAAA,MAAM,kBAAA,GAAqBC,qBAAA;AAE3B,EAAA,MAAM,cAAA,uBAAqB,GAAA,EAAuC;AAClE,EAAA,MAAM,eAAA,uBAAsB,GAAA,EAAwC;AACpE,EAAA,MAAM,gBAAA,uBAAuB,GAAA,EAAyC;AAEtE,EAAA,IAAI,mBAAA,GAAsB,KAAK,GAAA,EAAI;AACnC,EAAA,MAAM,oBAAoB,MAAM;AAC9B,IAAA,mBAAA,GAAsB,KAAK,GAAA,EAAI;AAC/B,IAAA,IAAI,KAAK,WAAA,EAAa;AACpB,MAAA,IAAI;AACF,QAAA,SAAA,CAAU,aAAa,mBAAA,GAAsB,mBAAA;AAAA,MAC/C,CAAA,CAAA,MAAQ;AAAA,MAER;AAAA,IACF;AAAA,EACF,CAAA;AAEA,EAAA,SAAA,CAAU,2BAAA,GAA8B,CAAC,EAAA,EAAS,KAAA,KAAgB;AAChE,IAAA,OAAO,eAAe,MAAM;AAC1B,MAAA,IAAI;AACF,QAAA,iBAAA,EAAkB;AAClB,QAAA,EAAA,CAAG;AAAA,UACD,UAAA,EAAY,KAAA;AAAA,UACZ,eAAe,MAAM;AAAA,SACtB,CAAA;AAAA,MACH,CAAA,CAAA,MAAQ;AAAA,MAER;AAAA,IACF,GAAG,CAAC,CAAA;AAAA,EACN,CAAA;AACA,EAAA,SAAA,CAAU,0BAAA,GAA6B,CAAC,MAAA,KAAgB,gBAAA,CAAiB,MAAM,CAAA;AAE/E,EAAA,SAAA,CAAU,kBAAA,GAAqB,IAAI,IAAA,KAAwC;AACzE,IAAA,MAAM,MAAA,GAAS,eAAe,MAAM;AAClC,MAAA,cAAA,CAAe,OAAO,MAAM,CAAA;AAC5B,MAAA,iBAAA,EAAkB;AAClB,MAAA,IAAI,KAAK,WAAA,EAAa;AACpB,QAAA,IAAI;AACF,UAAA,SAAA,CAAU,aAAa,MAAA,CAAO,YAAA,EAAA;AAAA,QAChC,CAAA,CAAA,MAAQ;AAAA,QAAC;AAAA,MACX;AACA,MAAC,IAAA,CAAK,CAAC,CAAA,EAAW,IAAA,GAAO,SAAS,CAAA;AAAA,IACpC,CAAA,EAAG,IAAA,CAAK,CAAC,CAAW,CAAA;AACpB,IAAA,cAAA,CAAe,IAAI,MAAM,CAAA;AACzB,IAAA,IAAI,KAAK,WAAA,EAAa;AACpB,MAAA,IAAI;AACF,QAAA,SAAA,CAAU,aAAa,MAAA,CAAO,gBAAA,EAAA;AAAA,MAChC,CAAA,CAAA,MAAQ;AAAA,MAAC;AAAA,IACX;AACA,IAAA,OAAO,MAAA;AAAA,EACT,CAAA;AACA,EAAA,SAAA,CAAU,oBAAA,GAAuB,CAAC,MAAA,KAA0C;AAC1E,IAAA,cAAA,CAAe,OAAO,MAAa,CAAA;AACnC,IAAA,gBAAA,CAAiB,MAAa,CAAA;AAAA,EAChC,CAAA;AAEA,EAAA,SAAA,CAAU,mBAAA,GAAsB,IAAI,IAAA,KAAyC;AAC3E,IAAA,MAAM,MAAA,GAAS,gBAAgB,MAAM;AACnC,MAAA,iBAAA,EAAkB;AAClB,MAAA,IAAI,KAAK,WAAA,EAAa;AACpB,QAAA,IAAI;AACF,UAAA,SAAA,CAAU,aAAa,MAAA,CAAO,aAAA,EAAA;AAAA,QAChC,CAAA,CAAA,MAAQ;AAAA,QAAC;AAAA,MACX;AACA,MAAC,IAAA,CAAK,CAAC,CAAA,EAAW,IAAA,GAAO,SAAS,CAAA;AAAA,IACpC,CAAA,EAAG,IAAA,CAAK,CAAC,CAAW,CAAA;AACpB,IAAA,eAAA,CAAgB,IAAI,MAAM,CAAA;AAC1B,IAAA,IAAI,KAAK,WAAA,EAAa;AACpB,MAAA,IAAI;AACF,QAAA,SAAA,CAAU,aAAa,MAAA,CAAO,iBAAA,EAAA;AAAA,MAChC,CAAA,CAAA,MAAQ;AAAA,MAAC;AAAA,IACX;AACA,IAAA,OAAO,MAAA;AAAA,EACT,CAAA;AACA,EAAA,SAAA,CAAU,qBAAA,GAAwB,CAAC,MAAA,KAA2C;AAC5E,IAAA,eAAA,CAAgB,OAAO,MAAa,CAAA;AACpC,IAAA,iBAAA,CAAkB,MAAa,CAAA;AAAA,EACjC,CAAA;AAEA,EAAA,SAAA,CAAU,sBAAA,GAAyB,CAAC,EAAA,KAAmB;AACrD,IAAA,IAAI;AACF,MAAA,OAAA,CAAQ,SAAS,MAAM;AACrB,QAAA,iBAAA,EAAkB;AAClB,QAAA,EAAA,CAAG,KAAK,SAAS,CAAA;AAAA,MACnB,CAAC,CAAA;AAAA,IACH,CAAA,CAAA,MAAQ;AACN,MAAA,cAAA,CAAe,MAAM;AACnB,QAAA,iBAAA,EAAkB;AAClB,QAAA,EAAA,CAAG,KAAK,SAAS,CAAA;AAAA,MACnB,GAAG,CAAC,CAAA;AAAA,IACN;AAAA,EACF,CAAA;AAEA,EAAA,SAAA,CAAU,oBAAA,GAAuB,CAAC,EAAA,EAAA,GAA8B,IAAA,KAAgB;AAC9E,IAAA,MAAM,MAAA,GAAS,iBAAiB,MAAM;AACpC,MAAA,gBAAA,CAAiB,OAAO,MAAM,CAAA;AAC9B,MAAA,IAAI;AACF,QAAA,iBAAA,EAAkB;AAClB,QAAA,EAAA,CAAG,IAAA,CAAK,SAAA,EAAW,GAAG,IAAI,CAAA;AAAA,MAC5B,CAAA,CAAA,MAAQ;AAAA,MAER;AAAA,IACF,CAAC,CAAA;AACD,IAAA,gBAAA,CAAiB,IAAI,MAAM,CAAA;AAC3B,IAAA,OAAO,MAAA;AAAA,EACT,CAAA;AACA,EAAA,SAAA,CAAU,sBAAA,GAAyB,CAAC,MAAA,KAAgD;AAClF,IAAA,gBAAA,CAAiB,OAAO,MAAM,CAAA;AAC9B,IAAA,kBAAA,CAAmB,MAAM,CAAA;AAAA,EAC3B,CAAA;AAEA,EAAA,SAAA,CAAU,6BAAA,GAAgC,CAAC,EAAA,KAA6B;AACtE,IAAA,IAAI,KAAK,WAAA,EAAa;AACpB,MAAA,IAAI;AACF,QAAA,SAAA,CAAU,aAAa,MAAA,CAAO,YAAA,EAAA;AAAA,MAChC,CAAA,CAAA,MAAQ;AAAA,MAAC;AAAA,IACX;AACA,IAAA,MAAM,EAAA,GAAK,eAAe,MAAM;AAC9B,MAAA,IAAI,KAAK,WAAA,EAAa;AACpB,QAAA,IAAI;AACF,UAAA,SAAA,CAAU,aAAa,MAAA,CAAO,QAAA,EAAA;AAAA,QAChC,CAAA,CAAA,MAAQ;AAAA,QAAC;AAAA,MACX;AACA,MAAA,iBAAA,EAAkB;AAClB,MAAA,EAAA,CAAG,IAAA,CAAK,SAAA,EAAW,IAAA,CAAK,GAAA,EAAK,CAAA;AAAA,IAC/B,GAAG,EAAE,CAAA;AACL,IAAA,OAAO,EAAA;AAAA,EACT,CAAA;AACA,EAAA,SAAA,CAAU,4BAAA,GAA+B,CAAC,EAAA,KAAe,gBAAA,CAAiB,EAAS,CAAA;AAEnF,EAAA,MAAM,UAAU,MAAM;AACpB,IAAA,KAAA,MAAW,CAAA,IAAK,cAAA,EAAgB,gBAAA,CAAiB,CAAC,CAAA;AAClD,IAAA,KAAA,MAAW,CAAA,IAAK,eAAA,EAAiB,iBAAA,CAAkB,CAAQ,CAAA;AAC3D,IAAA,KAAA,MAAW,CAAA,IAAK,gBAAA,EAAkB,kBAAA,CAAmB,CAAC,CAAA;AAAA,EACxD,CAAA;AAEA,EAAA,OAAO;AAAA,IACL,cAAA;AAAA,IACA,gBAAA;AAAA,IACA,eAAA;AAAA,IACA,iBAAA;AAAA,IACA,gBAAA;AAAA,IACA,kBAAA;AAAA,IACA,iBAAA;AAAA,IACA,wBAAwB,MAAM,mBAAA;AAAA,IAC9B;AAAA,GACF;AACF;;;AC1KO,SAAS,qBAAA,CAAsB,UAAkB,QAAA,EAA4B;AAClF,EAAA,MAAM,OAAA,GAAU,IAAI,GAAA,CAAI,QAAQ,CAAA;AAChC,EAAA,MAAM,MAAA,GAAU,QAAA,EAAkB,aAAA,GAAgB,MAAM,CAAA,IAAK,IAAA;AAC7D,EAAA,MAAM,WAAA,GAA6B,MAAA,EAAQ,YAAA,GAAe,MAAM,CAAA,IAAK,IAAA;AAErE,EAAA,MAAM,kBAAkB,MAAM;AAC5B,IAAA,IAAI;AACF,MAAA,OAAO,cAAc,IAAI,GAAA,CAAI,OAAO,WAAW,CAAA,EAAG,QAAQ,CAAA,GAAI,OAAA;AAAA,IAChE,CAAA,CAAA,MAAQ;AACN,MAAA,OAAO,OAAA;AAAA,IACT;AAAA,EACF,CAAA,GAAG;AAEH,EAAA,OAAO,EAAE,cAAA,EAAgB,WAAA,EAAa,MAAA,EAAO;AAC/C;AAKO,SAAS,oBAAA,CAAqB,UAAe,cAAA,EAA2B;AAC7E,EAAA,IAAI;AACF,IAAA,MAAA,CAAO,cAAA,CAAe,UAAiB,SAAA,EAAW;AAAA,MAChD,YAAA,EAAc,IAAA;AAAA,MACd,GAAA,EAAK,MAAM,cAAA,CAAe;AAAA,KAC3B,CAAA;AAAA,EACH,CAAA,CAAA,MAAQ;AAAA,EAER;AACF;AAKO,SAAS,oBAAA,CAAqB,QAAoB,cAAA,EAA2B;AAClF,EAAA,IAAI;AACF,IAAA,IAAI,MAAA,EAAQ;AACV,MAAA,MAAA,CAAO,cAAA,CAAe,QAAQ,MAAA,EAAQ;AAAA,QACpC,YAAA,EAAc,IAAA;AAAA,QACd,GAAA,EAAK,MAAM,cAAA,CAAe,IAAA;AAAA,QAC1B,GAAA,EAAK,CAAC,EAAA,KAAe;AAAA,QAAC;AAAA,OACvB,CAAA;AAAA,IACH;AAAA,EACF,CAAA,CAAA,MAAQ;AAAA,EAER;AACF;;;AClDO,SAAS,oBAAoB,IAAA,EAA8B;AAChE,EAAA,MAAM,EAAE,SAAA,EAAW,SAAA,EAAW,qBAAA,EAAsB,GAAI,IAAA;AACxD,EAAA,MAAM,GAAA,GAAM,IAAA,CAAK,QAAA,IAAa,SAAA,CAAkB,QAAA;AAGhD,EAAA,IAAI;AACF,IAAA,IAAI,OAAQ,GAAA,CAAY,WAAA,IAAe,IAAA,EAAO,IAAY,WAAA,GAAc,SAAA;AAAA,EAC1E,CAAA,CAAA,MAAQ;AAAA,EAER;AAEA,EAAA,IAAI;AACF,IAAA,IAAI,OAAQ,GAAA,CAAY,OAAA,IAAW,IAAA,EAAO,IAAY,OAAA,GAAU,qBAAA;AAAA,EAClE,CAAA,CAAA,MAAQ;AAAA,EAER;AAGA,EAAA,SAAA,CAAU,cAAc,EAAC;AACzB,EAAA,SAAA,CAAU,UAAU,QAAA,KAAa,IAAA;AACjC,EAAA,SAAA,CAAU,SAAA,CAAU,SAAA,KAAc,CAAC,SAAA,CAAU,UAAU,QAAQ,CAAA;AAC/D,EAAA,SAAA,CAAU,UAAU,MAAA,KAAW,IAAA;AAG/B,EAAA,SAAA,CAAU,MAAA,KAAW;AAAA,IACnB,KAAA,EAAO,IAAA;AAAA,IACP,MAAA,EAAQ,GAAA;AAAA,IACR,UAAA,EAAY,IAAA;AAAA,IACZ,WAAA,EAAa,GAAA;AAAA,IACb,UAAA,EAAY;AAAA,GACd;AACA,EAAA,SAAA,CAAU,gBAAA,KAAqB,CAAA;AAC/B,EAAA,SAAA,CAAU,UAAA,KAAe,SAAA,CAAU,MAAA,CAAO,KAAA,IAAS,IAAA;AACnD,EAAA,SAAA,CAAU,WAAA,KAAgB,SAAA,CAAU,MAAA,CAAO,MAAA,IAAU,GAAA;AAGrD,EAAA,SAAA,CAAU,mBAAoB,UAAA,CAAmB,cAAA;AACjD,EAAA,SAAA,CAAU,gBAAiB,UAAA,CAAmB,WAAA;AAC9C,EAAA,SAAA,CAAU,iBAAkB,UAAA,CAAmB,YAAA;AAC/C,EAAA,SAAA,CAAU,qBAAsB,UAAA,CAAmB,gBAAA;AAGnD,EAAA,SAAA,CAAU,gBAAA,KAAqB,CAAC,EAAA,KAAY;AAC1C,IAAA,MAAM,KAAA,GAAQ,EAAA,EAAI,KAAA,IAAS,EAAC;AAC5B,IAAA,OAAO,IAAI,MAAM,KAAA,EAAO;AAAA,MACtB,GAAA,CAAI,QAAQ,IAAA,EAAM;AAChB,QAAA,IAAI,SAAS,kBAAA,EAAoB,OAAO,CAAC,IAAA,KAAiB,MAAA,GAAS,IAAI,CAAA,IAAK,EAAA;AAC5E,QAAA,OAAQ,MAAA,CAAe,IAAW,CAAA,IAAK,EAAA;AAAA,MACzC;AAAA,KACD,CAAA;AAAA,EACH,CAAA;AAGA,EAAA,SAAA,CAAU,aAAA,KAAkB,MAAM,aAAA,UAAuB,SAAA,CAAU,SAAS,KAAA,EAAO;AAAA,IACjF,KAAA;AAAA,IACA,WAAA,CAAY,MAAcC,KAAAA,EAAY;AACpC,MAAA,KAAA,CAAM,MAAMA,KAAI,CAAA;AAChB,MAAA,IAAA,CAAK,QAAQA,KAAAA,EAAM,KAAA;AAAA,IACrB;AAAA,GACF;AACA,EAAA,SAAA,CAAU,eAAA,KAAoB,MAAM,eAAA,UAAyB,SAAA,CAAU,SAAS,KAAA,EAAO;AAAA,IACrF,MAAA;AAAA,IACA,MAAA;AAAA,IACA,WAAA,CAAY,MAAcA,KAAAA,EAAY;AACpC,MAAA,KAAA,CAAM,MAAMA,KAAI,CAAA;AAChB,MAAA,IAAA,CAAK,MAAA,GAASA,OAAM,MAAA,IAAU,EAAA;AAC9B,MAAA,IAAA,CAAK,MAAA,GAASA,OAAM,MAAA,IAAU,EAAA;AAAA,IAChC;AAAA,GACF;AAGA,EAAA,SAAA,CAAU,UAAA,KAAe,CAAC,KAAA,KAAkB;AAC1C,IAAA,MAAM,SAAA,uBAAgB,GAAA,EAAS;AAC/B,IAAA,MAAM,GAAA,GAAW;AAAA,MACf,OAAA,EAAS,KAAA;AAAA,MACT,KAAA,EAAO,MAAA,CAAO,KAAA,IAAS,EAAE,CAAA;AAAA,MACzB,QAAA,EAAU,IAAA;AAAA,MACV,WAAA,EAAa,CAAC,EAAA,KAAY;AACxB,QAAA,IAAI,OAAO,EAAA,KAAO,UAAA,EAAY,SAAA,CAAU,IAAI,EAAE,CAAA;AAAA,MAChD,CAAA;AAAA,MACA,cAAA,EAAgB,CAAC,EAAA,KAAY;AAC3B,QAAA,SAAA,CAAU,OAAO,EAAE,CAAA;AAAA,MACrB,CAAA;AAAA,MACA,gBAAA,EAAkB,CAAC,IAAA,EAAc,EAAA,KAAY;AAC3C,QAAA,IAAI,MAAA,CAAO,IAAI,CAAA,KAAM,QAAA,IAAY,OAAO,EAAA,KAAO,UAAA,EAAY,SAAA,CAAU,GAAA,CAAI,EAAE,CAAA;AAAA,MAC7E,CAAA;AAAA,MACA,mBAAA,EAAqB,CAAC,IAAA,EAAc,EAAA,KAAY;AAC9C,QAAA,IAAI,OAAO,IAAI,CAAA,KAAM,QAAA,EAAU,SAAA,CAAU,OAAO,EAAE,CAAA;AAAA,MACpD,CAAA;AAAA,MACA,aAAA,EAAe,CAAC,GAAA,KAAa;AAC3B,QAAA,IAAI;AACF,UAAA,KAAA,MAAW,EAAA,IAAM,SAAA,EAAW,EAAA,CAAG,IAAA,CAAK,KAAK,GAAG,CAAA;AAC5C,UAAA,IAAI,OAAO,IAAI,QAAA,KAAa,UAAA,MAAgB,QAAA,CAAS,IAAA,CAAK,KAAK,GAAG,CAAA;AAAA,QACpE,CAAA,CAAA,MAAQ;AAAA,QAER;AACA,QAAA,OAAO,IAAA;AAAA,MACT;AAAA,KACF;AACA,IAAA,OAAO,GAAA;AAAA,EACT,CAAA;AAGA,EAAA,SAAA,CAAU,oBAAA,KAAyB,MAAM,oBAAA,CAAqB;AAAA,IAC5D,QAAQ,GAAA,EAAU;AAAA,IAAC;AAAA,IACnB,UAAU,GAAA,EAAU;AAAA,IAAC;AAAA,IACrB,UAAA,GAAa;AAAA,IAAC;AAAA,IACd,WAAA,GAAc;AACZ,MAAA,OAAO,EAAC;AAAA,IACV;AAAA,GACF;AACA,EAAA,SAAA,CAAU,cAAA,KAAmB,MAAM,cAAA,CAAe;AAAA,IAChD,QAAQ,GAAA,EAAU;AAAA,IAAC;AAAA,IACnB,UAAU,GAAA,EAAU;AAAA,IAAC;AAAA,IACrB,UAAA,GAAa;AAAA,IAAC;AAAA,GAChB;AACA,EAAA,SAAA,CAAU,gBAAA,KAAqB,MAAM,gBAAA,CAAiB;AAAA,IACpD,OAAA,CAAQ,SAAc,QAAA,EAAgB;AAAA,IAAC;AAAA,IACvC,UAAA,GAAa;AAAA,IAAC;AAAA,IACd,WAAA,GAAc;AACZ,MAAA,OAAO,EAAC;AAAA,IACV;AAAA,GACF;AAEA,EAAA,SAAA,CAAU,GAAA,KAAQ,GAAA;AAClB,EAAA,SAAA,CAAU,eAAA,KAAoB,eAAA;AAC9B,EAAA,SAAA,CAAU,WAAA,KAAgB,WAAA;AAC1B,EAAA,SAAA,CAAU,WAAA,KAAgB,WAAA;AAC1B,EAAA,SAAA,CAAU,WAAA,KAAgB,WAAA;AAC1B,EAAA,SAAA,CAAU,YAAY,UAAA,CAAW,OAAA;AACjC,EAAA,SAAA,CAAU,YAAY,UAAA,CAAW,OAAA;AACjC,EAAA,SAAA,CAAU,aAAa,UAAA,CAAW,QAAA;AAClC,EAAA,SAAA,CAAU,WAAW,UAAA,CAAW,MAAA;AAChC,EAAA,SAAA,CAAU,gBAAgB,UAAA,CAAW,WAAA;AACrC,EAAA,SAAA,CAAU,oBAAoB,UAAA,CAAW,eAAA;AACzC,EAAA,SAAA,CAAU,SAAS,UAAA,CAAW,IAAA;AAC9B,EAAA,SAAA,CAAU,aAAa,UAAA,CAAW,QAAA;AAClC,EAAA,SAAA,CAAU,SAAU,UAAA,CAAmB,IAAA;AACvC,EAAA,SAAA,CAAU,mBAAoB,UAAA,CAAmB,cAAA;AACjD,EAAA,SAAA,CAAU,IAAA,KAAS,CAAC,IAAA,KAAiB,MAAA,CAAO,KAAK,IAAA,EAAM,QAAQ,CAAA,CAAE,QAAA,CAAS,QAAQ,CAAA;AAClF,EAAA,SAAA,CAAU,IAAA,KAAS,CAAC,IAAA,KAAiB,MAAA,CAAO,KAAK,IAAA,EAAM,QAAQ,CAAA,CAAE,QAAA,CAAS,QAAQ,CAAA;AAGlF,EAAA,SAAA,CAAU,SAAA,KAAc,MAAM,SAAA,CAAU;AAAA,IACtC,WAAA,GAAc;AACZ,MAAA,MAAM,IAAI,MAAM,qCAAqC,CAAA;AAAA,IACvD;AAAA,GACF;AACA,EAAA,SAAA,CAAU,WAAA,KAAgB,MAAM,WAAA,CAAY;AAAA,IAC1C,WAAA,GAAc;AACZ,MAAA,MAAM,IAAI,MAAM,uCAAuC,CAAA;AAAA,IACzD;AAAA,GACF;AACA,EAAA,SAAA,CAAU,MAAA,KAAW,MAAM,MAAA,CAAO;AAAA,IAChC,WAAA,GAAc;AACZ,MAAA,MAAM,IAAI,MAAM,kCAAkC,CAAA;AAAA,IACpD;AAAA,GACF;AACA,EAAA,SAAA,CAAU,YAAA,KAAiB,MAAM,YAAA,CAAa;AAAA,IAC5C,WAAA,GAAc;AACZ,MAAA,MAAM,IAAI,MAAM,wCAAwC,CAAA;AAAA,IAC1D;AAAA,GACF;AACA,EAAA,SAAA,CAAU,SAAA,KAAc,MAAA;AACxB,EAAA,SAAA,CAAU,MAAA,KAAW,MAAA;AACrB,EAAA,SAAA,CAAU,YAAA,KAAiB,MAAA;AAG3B,EAAA,SAAA,CAAU,aAAa,SAAA,CAAU,QAAA;AACjC,EAAA,SAAA,CAAU,YAAA,KAAiB,SAAA,CAAU,YAAA,IAAgB,IAAA,CAAK,QAAA,EAAU,WAAA;AACpE,EAAA,SAAA,CAAU,YAAY,SAAA,CAAU,OAAA;AAChC,EAAA,SAAA,CAAU,gBAAgB,SAAA,CAAU,WAAA;AACpC,EAAA,SAAA,CAAU,SAAS,SAAA,CAAU,IAAA;AAG7B,EAAA,SAAA,CAAU,UAAA,KAAe,UAAU,UAAA,IAAc;AAAA,IAC/C,aAAA,EAAe,CAAA;AAAA,IACf,aAAA,EAAe,CAAA;AAAA,IACf,WAAA,EAAa,CAAA;AAAA,IACb,QAAA,EAAU,UAAA;AAAA,IACV,YAAA,EAAc,CAAA;AAAA,IACd,cAAA,EAAgB,CAAA;AAAA,IAChB,SAAA,EAAW,CAAA;AAAA,IACX,kBAAA,EAAoB,CAAA;AAAA,IACpB,qBAAA,EAAuB,EAAA;AAAA,IACvB,WAAA,EAAa,EAAA;AAAA,IACb,2BAAA,EAA6B,EAAA;AAAA,IAC7B,YAAA,EAAc,GAAA;AAAA,IACd,aAAA,EAAe,GAAA;AAAA,IACf,kBAAA,EAAoB,GAAA;AAAA,IACpB,sBAAA,EAAwB,IAAA;AAAA,IACxB,aAAA,EAAe;AAAA,GACjB;AACF;;;ACxMO,SAAS,iBAAiB,QAAA,EAAqB;AACpD,EAAA,IAAI,SAAA,GAAY,EAAA;AAChB,EAAA,IAAI;AACF,IAAA,MAAA,CAAO,cAAA,CAAe,UAAU,QAAA,EAAU;AAAA,MACxC,YAAA,EAAc,IAAA;AAAA,MACd,GAAA,GAAM;AACJ,QAAA,OAAO,SAAA;AAAA,MACT,CAAA;AAAA,MACA,IAAI,KAAA,EAAe;AAEjB,QAAA,IAAI,OAAO,KAAA,KAAU,QAAA,IAAY,KAAA,CAAM,SAAS,CAAA,EAAG;AACjD,UAAA,SAAA,GAAY,SAAA,GAAY,CAAA,EAAG,SAAS,CAAA,EAAA,EAAK,KAAK,CAAA,CAAA,GAAK,KAAA;AAAA,QACrD;AAAA,MACF;AAAA,KACD,CAAA;AAAA,EACH,CAAA,CAAA,MAAQ;AAAA,EAER;AACF;;;ACDO,SAAS,iBAAiB,IAAA,EAAgC;AAC/D,EAAA,IAAI,cAAA,GAAiB,CAAA;AAErB,EAAA,IAAA,CAAK,UAAU,aAAA,GACb,OAAO,KAAK,SAAA,KAAc,UAAA,GACtB,IAAI,IAAA,KAAmC;AACrC,IAAA,IAAA,CAAK,iBAAA,EAAkB;AACvB,IAAA,cAAA,EAAA;AACA,IAAA,IAAI;AACF,MAAA,MAAM,KAAA,GAAQ,KAAK,CAAC,CAAA;AACpB,MAAA,MAAM,OAAA,GAAU,KAAK,CAAC,CAAA;AAItB,MAAA,IAAI,aAAA,GAA8B,KAAA;AAClC,MAAA,IAAI,OAAO,UAAU,QAAA,EAAU;AAC7B,QAAA,aAAA,GAAgB,IAAI,GAAA,CAAI,KAAA,EAAO,IAAA,CAAK,kBAAkB,CAAA,CAAE,IAAA;AAAA,MAC1D,CAAA,MAAA,IAAW,iBAAiB,GAAA,EAAK;AAC/B,QAAA,aAAA,GAAgB,KAAA,CAAM,IAAA;AAAA,MACxB,CAAA,MAAA,IAAW,OAAQ,KAAA,CAAkB,GAAA,KAAQ,QAAA,EAAU;AACrD,QAAA,IAAI;AACF,UAAA,aAAA,GAAgB,IAAI,GAAA,CAAK,KAAA,CAAkB,GAAA,EAAK,IAAA,CAAK,kBAAkB,CAAA,CAAE,IAAA;AAAA,QAC3E,CAAA,CAAA,MAAQ;AAAA,QAER;AAAA,MACF;AAEA,MAAA,IAAI,KAAK,UAAA,EAAY;AACnB,QAAA,IAAA,CAAK,WAAA,CAAY,CAAC,SAAA,EAAW,aAAa,CAAC,CAAA;AAAA,MAC7C;AAEA,MAAA,MAAM,UAAA,GAAa,IAAI,eAAA,EAAgB;AACvC,MAAA,MAAM,aAAA,GAAgB,KAAK,cAAA,CAAe,MAAM,WAAW,KAAA,EAAM,EAAG,IAAA,CAAK,WAAA,EAAa,CAAA;AACtF,MAAA,MAAM,aAAa,EAAE,GAAI,OAAA,EAAiB,MAAA,EAAQ,WAAW,MAAA,EAAO;AAEpE,MAAA,MAAM,IAAI,IAAA,CAAK,SAAA,CAAW,eAAsB,UAAiB,CAAA,CAAE,QAAQ,MAAM;AAC/E,QAAA,IAAA,CAAK,iBAAiB,aAAa,CAAA;AAAA,MACrC,CAAC,CAAA;AAED,MAAA,OAAO,CAAA,CAAE,QAAQ,MAAM;AACrB,QAAA,IAAI;AACF,UAAA,IAAA,CAAK,eAAe,MAAM;AACxB,YAAA,cAAA,EAAA;AACA,YAAA,IAAA,CAAK,iBAAA,EAAkB;AAAA,UACzB,CAAC,CAAA;AAAA,QACH,CAAA,CAAA,MAAQ;AACN,UAAA,cAAA,EAAA;AACA,UAAA,IAAA,CAAK,iBAAA,EAAkB;AAAA,QACzB;AAAA,MACF,CAAC,CAAA;AAAA,IACH,SAAS,GAAA,EAAK;AACZ,MAAA,cAAA,EAAA;AACA,MAAA,IAAA,CAAK,iBAAA,EAAkB;AACvB,MAAA,MAAM,GAAA;AAAA,IACR;AAAA,EACF,CAAA,GACA,MAAA;AAEN,EAAA,OAAO;AAAA,IACL,mBAAmB,MAAM;AAAA,GAC3B;AACF;;;ACnEO,SAAS,sBAAsB,IAAA,EAA6C;AACjF,EAAA,MAAM,EAAE,SAAQ,GAAI,IAAA;AAEpB,EAAA,MAAM,iBAAA,GAAoB,CAAC,IAAA,KAAiB;AAC1C,IAAA,IAAI;AACF,MAAA,MAAM,IAAA,GAAO,IAAI,GAAA,CAAI,IAAA,EAAM,QAAQ,IAAI,CAAA;AACvC,MAAA,OAAA,CAAQ,OAAO,IAAA,CAAK,IAAA;AACpB,MAAA,IAAA,CAAK,UAAA,GAAa,QAAQ,IAAI,CAAA;AAAA,IAChC,CAAA,CAAA,MAAQ;AAAA,IAER;AAAA,EACF,CAAA;AAEA,EAAA,MAAM,WAAgB,EAAC;AACvB,EAAA,IAAI;AACF,IAAA,MAAA,CAAO,iBAAiB,QAAA,EAAU;AAAA,MAChC,IAAA,EAAM,EAAE,GAAA,EAAK,MAAM,OAAA,CAAQ,IAAA,EAAM,GAAA,EAAK,CAAC,CAAA,KAAc,iBAAA,CAAkB,MAAA,CAAO,CAAC,CAAC,CAAA,EAAE;AAAA,MAClF,MAAA,EAAQ,EAAE,GAAA,EAAK,MAAM,QAAQ,MAAA,EAAO;AAAA,MACpC,QAAA,EAAU;AAAA,QACR,GAAA,EAAK,MAAM,OAAA,CAAQ,QAAA;AAAA,QACnB,GAAA,EAAK,CAAC,CAAA,KAAc;AAClB,UAAA,OAAA,CAAQ,QAAA,GAAW,OAAO,CAAC,CAAA;AAAA,QAC7B;AAAA,OACF;AAAA,MACA,IAAA,EAAM;AAAA,QACJ,GAAA,EAAK,MAAM,OAAA,CAAQ,IAAA;AAAA,QACnB,GAAA,EAAK,CAAC,CAAA,KAAc;AAClB,UAAA,OAAA,CAAQ,IAAA,GAAO,OAAO,CAAC,CAAA;AAAA,QACzB;AAAA,OACF;AAAA,MACA,QAAA,EAAU;AAAA,QACR,GAAA,EAAK,MAAM,OAAA,CAAQ,QAAA;AAAA,QACnB,GAAA,EAAK,CAAC,CAAA,KAAc;AAClB,UAAA,OAAA,CAAQ,QAAA,GAAW,OAAO,CAAC,CAAA;AAAA,QAC7B;AAAA,OACF;AAAA,MACA,IAAA,EAAM;AAAA,QACJ,GAAA,EAAK,MAAM,OAAA,CAAQ,IAAA;AAAA,QACnB,GAAA,EAAK,CAAC,CAAA,KAAc;AAClB,UAAA,OAAA,CAAQ,IAAA,GAAO,OAAO,CAAC,CAAA;AAAA,QACzB;AAAA,OACF;AAAA,MACA,QAAA,EAAU,EAAE,GAAA,EAAK,MAAM,OAAA,CAAQ,QAAA,EAAU,GAAA,EAAK,CAAC,CAAA,KAAc,iBAAA,CAAkB,MAAA,CAAO,CAAC,CAAC,CAAA,EAAE;AAAA,MAC1F,MAAA,EAAQ;AAAA,QACN,GAAA,EAAK,MAAM,OAAA,CAAQ,MAAA;AAAA,QACnB,GAAA,EAAK,CAAC,CAAA,KAAc;AAClB,UAAA,OAAA,CAAQ,MAAA,GAAS,OAAO,CAAC,CAAA;AAAA,QAC3B;AAAA,OACF;AAAA,MACA,IAAA,EAAM;AAAA,QACJ,GAAA,EAAK,MAAM,OAAA,CAAQ,IAAA;AAAA,QACnB,GAAA,EAAK,CAAC,CAAA,KAAc;AAClB,UAAA,OAAA,CAAQ,IAAA,GAAO,OAAO,CAAC,CAAA;AAAA,QACzB;AAAA;AACF,KACD,CAAA;AAAA,EACH,CAAA,CAAA,MAAQ;AAAA,EAER;AACA,EAAA,QAAA,CAAS,QAAA,GAAW,MAAM,OAAA,CAAQ,IAAA;AAClC,EAAA,QAAA,CAAS,MAAA,GAAS,CAAC,IAAA,KAAiB,iBAAA,CAAkB,IAAI,CAAA;AAC1D,EAAA,QAAA,CAAS,OAAA,GAAU,CAAC,IAAA,KAAiB,iBAAA,CAAkB,IAAI,CAAA;AAC3D,EAAA,QAAA,CAAS,SAAS,MAAM;AAAA,EAAC,CAAA;AAEzB,EAAA,IAAI,YAAA,GAAwB,IAAA;AAC5B,EAAA,MAAM,OAAA,GAAe;AAAA,IACnB,IAAI,KAAA,GAAQ;AACV,MAAA,OAAO,YAAA;AAAA,IACT,CAAA;AAAA,IACA,SAAA,EAAW,CAAC,KAAA,EAAgB,MAAA,EAAgB,GAAA,KAA8B;AACxE,MAAA,YAAA,GAAe,KAAA;AACf,MAAA,IAAI,GAAA,IAAO,IAAA,EAAM,iBAAA,CAAkB,MAAA,CAAO,GAAG,CAAC,CAAA;AAC9C,MAAA,IAAI;AACF,QAAA,IAAA,CAAK,aAAa,KAAK,CAAA;AAAA,MACzB,CAAA,CAAA,MAAQ;AAAA,MAER;AAAA,IACF,CAAA;AAAA,IACA,YAAA,EAAc,CAAC,KAAA,EAAgB,MAAA,EAAgB,GAAA,KAA8B;AAC3E,MAAA,YAAA,GAAe,KAAA;AACf,MAAA,IAAI,GAAA,IAAO,IAAA,EAAM,iBAAA,CAAkB,MAAA,CAAO,GAAG,CAAC,CAAA;AAAA,IAChD,CAAA;AAAA,IACA,MAAM,MAAM;AAAA,IAAC,CAAA;AAAA,IACb,SAAS,MAAM;AAAA,IAAC,CAAA;AAAA,IAChB,EAAA,EAAI,CAAC,MAAA,KAAoB;AAAA,IAAC;AAAA,GAC5B;AAEA,EAAA,OAAO,EAAE,UAAU,OAAA,EAAQ;AAC7B;;;ACnGO,SAAS,uBAAuB,SAAA,EAAsB;AAC3D,EAAA,MAAM,cAAc,MAAM;AACxB,IAAA,MAAM,KAAA,uBAAY,GAAA,EAAoB;AACtC,IAAA,OAAO;AAAA,MACL,IAAI,MAAA,GAAS;AACX,QAAA,OAAO,KAAA,CAAM,IAAA;AAAA,MACf,CAAA;AAAA,MACA,KAAA,GAAQ;AACN,QAAA,KAAA,CAAM,KAAA,EAAM;AAAA,MACd,CAAA;AAAA,MACA,QAAQ,GAAA,EAAa;AACnB,QAAA,OAAO,KAAA,CAAM,GAAA,CAAI,MAAA,CAAO,GAAG,CAAC,CAAA,GAAI,KAAA,CAAM,GAAA,CAAI,MAAA,CAAO,GAAG,CAAC,CAAA,GAAK,IAAA;AAAA,MAC5D,CAAA;AAAA,MACA,IAAI,KAAA,EAAe;AACjB,QAAA,OAAO,MAAM,IAAA,CAAK,KAAA,CAAM,MAAM,CAAA,CAAE,KAAK,CAAA,IAAK,IAAA;AAAA,MAC5C,CAAA;AAAA,MACA,WAAW,GAAA,EAAa;AACtB,QAAA,KAAA,CAAM,MAAA,CAAO,MAAA,CAAO,GAAG,CAAC,CAAA;AAAA,MAC1B,CAAA;AAAA,MACA,OAAA,CAAQ,KAAa,KAAA,EAAe;AAClC,QAAA,KAAA,CAAM,IAAI,MAAA,CAAO,GAAG,CAAA,EAAG,MAAA,CAAO,KAAK,CAAC,CAAA;AAAA,MACtC;AAAA,KACF;AAAA,EACF,CAAA;AAEA,EAAA,SAAA,CAAU,iBAAiB,WAAA,EAAY;AACvC,EAAA,SAAA,CAAU,mBAAmB,WAAA,EAAY;AAIzC,EAAA,SAAA,CAAU,aAAa,MAAM;AAAA,EAAC,CAAA;AAE9B,EAAA,IAAI;AACF,IAAA,IACE,UAAU,WAAA,EAAa,SAAA,IACvB,CAAC,SAAA,CAAU,WAAA,CAAY,UAAU,qBAAA,EACjC;AACA,MAAA,SAAA,CAAU,WAAA,CAAY,SAAA,CAAU,qBAAA,GAAwB,OAAO;AAAA,QAC7D,CAAA,EAAG,CAAA;AAAA,QACH,CAAA,EAAG,CAAA;AAAA,QACH,KAAA,EAAO,CAAA;AAAA,QACP,MAAA,EAAQ,CAAA;AAAA,QACR,GAAA,EAAK,CAAA;AAAA,QACL,IAAA,EAAM,CAAA;AAAA,QACN,KAAA,EAAO,CAAA;AAAA,QACP,MAAA,EAAQ,CAAA;AAAA,QACR,MAAA,GAAS;AAAA,QAAC;AAAA,OACZ,CAAA;AAAA,IACF;AAAA,EACF,CAAA,CAAA,MAAQ;AAAA,EAER;AAEA,EAAA,SAAA,CAAU,YAAY,EAAE,GAAA,EAAK,EAAE,QAAA,EAAU,cAAa,EAAE;AAC1D;;;ACpCO,SAAS,sBAAsB,IAAA,EAA4B;AAChE,EAAA,MAAM,IAAI,IAAA,CAAK,SAAA;AACf,EAAA,IAAI,EAAE,cAAA,EAAgB;AAAA,EAEtB,MAAM,GAAA,CAAI;AAAA;AAAA,IAER,OAAO,MAAA,GAAS,CAAA;AAAA,IAChB,OAAO,MAAA,GAAS,CAAA;AAAA,IAChB,OAAO,gBAAA,GAAmB,CAAA;AAAA,IAC1B,OAAO,OAAA,GAAU,CAAA;AAAA,IACjB,OAAO,IAAA,GAAO,CAAA;AAAA,IACd,MAAA,GAAS,CAAA;AAAA,IACT,MAAA,GAAS,CAAA;AAAA,IACT,gBAAA,GAAmB,CAAA;AAAA,IACnB,OAAA,GAAU,CAAA;AAAA,IACV,IAAA,GAAO,CAAA;AAAA,IAEP,UAAA,GAAa,CAAA;AAAA,IACb,MAAA,GAAS,CAAA;AAAA,IACT,UAAA,GAAa,EAAA;AAAA,IACb,YAAA,GAA8D,EAAA;AAAA,IAC9D,QAAA,GAAgB,IAAA;AAAA,IAChB,YAAA,GAAe,EAAA;AAAA,IACf,OAAA,GAAU,CAAA;AAAA,IACV,eAAA,GAAkB,KAAA;AAAA,IAElB,kBAAA,GAA0C,IAAA;AAAA,IAC1C,MAAA,GAA8B,IAAA;AAAA,IAC9B,OAAA,GAA+B,IAAA;AAAA,IAC/B,SAAA,GAAiC,IAAA;AAAA,IACjC,OAAA,GAA+B,IAAA;AAAA,IAEvB,OAAA,GAAU,KAAA;AAAA,IACV,IAAA,GAAO,EAAA;AAAA,IACP,QAAA,uBAAe,GAAA,EAAoB;AAAA,IACnC,YAAA,GAA+B,IAAA;AAAA,IAC/B,UAAA,uBAAiB,GAAA,EAA2B;AAAA,IAC5C,WAAA,GAAsC,IAAA;AAAA,IAE9C,gBAAA,CAAiB,MAAc,EAAA,EAAc;AAC3C,MAAA,MAAM,CAAA,GAAI,OAAO,IAAI,CAAA;AACrB,MAAA,MAAM,MAAM,IAAA,CAAK,UAAA,CAAW,IAAI,CAAC,CAAA,wBAAS,GAAA,EAAc;AACxD,MAAA,GAAA,CAAI,IAAI,EAAE,CAAA;AACV,MAAA,IAAA,CAAK,UAAA,CAAW,GAAA,CAAI,CAAA,EAAG,GAAG,CAAA;AAAA,IAC5B;AAAA,IACA,mBAAA,CAAoB,MAAc,EAAA,EAAc;AAC9C,MAAA,MAAM,CAAA,GAAI,OAAO,IAAI,CAAA;AACrB,MAAA,IAAA,CAAK,UAAA,CAAW,GAAA,CAAI,CAAC,CAAA,EAAG,OAAO,EAAE,CAAA;AAAA,IACnC;AAAA,IACQ,UAAU,IAAA,EAAc;AAC9B,MAAA,MAAM,KAAK,EAAE,IAAA,EAAM,MAAA,EAAQ,IAAA,EAAM,eAAe,IAAA,EAAK;AACrD,MAAA,IAAA,CAAK,WAAW,GAAA,CAAI,IAAI,CAAA,EAAG,OAAA,CAAQ,CAAC,EAAA,KAAO;AACzC,QAAA,IAAI;AACF,UAAA,EAAA,CAAG,EAAE,CAAA;AAAA,QACP,CAAA,CAAA,MAAQ;AAAA,QAER;AAAA,MACF,CAAC,CAAA;AAAA,IACH;AAAA,IACQ,eAAe,CAAA,EAAW;AAChC,MAAA,IAAA,CAAK,UAAA,GAAa,CAAA;AAClB,MAAA,IAAI;AACF,QAAA,IAAA,CAAK,kBAAA,IAAqB;AAAA,MAC5B,CAAA,CAAA,MAAQ;AAAA,MAER;AACA,MAAA,IAAA,CAAK,UAAU,kBAAkB,CAAA;AAAA,IACnC;AAAA,IAEA,IAAA,CAAK,MAAA,EAAgB,GAAA,EAAa,KAAA,GAAiB,IAAA,EAAM;AACvD,MAAA,IAAA,CAAK,OAAA,GAAU,MAAA,CAAO,MAAA,IAAU,KAAK,EAAE,WAAA,EAAY;AACnD,MAAA,IAAA,CAAK,IAAA,GAAO,MAAA,CAAO,GAAA,IAAO,EAAE,CAAA;AAE5B,MAAA,IAAA,CAAK,SAAS,KAAA,EAAM;AACpB,MAAA,IAAA,CAAK,YAAA,GAAe,IAAA;AACpB,MAAA,IAAA,CAAK,WAAA,GAAc,IAAA;AACnB,MAAA,IAAA,CAAK,eAAe,CAAC,CAAA;AAAA,IACvB;AAAA,IAEA,gBAAA,CAAiB,MAAc,KAAA,EAAe;AAC5C,MAAA,IAAA,CAAK,SAAS,GAAA,CAAI,MAAA,CAAO,IAAI,CAAA,EAAG,MAAA,CAAO,KAAK,CAAC,CAAA;AAAA,IAC/C;AAAA,IAEA,kBAAkB,IAAA,EAAc;AAC9B,MAAA,IAAI;AACF,QAAA,OAAO,KAAK,YAAA,EAAc,GAAA,CAAI,MAAA,CAAO,IAAI,CAAC,CAAA,IAAK,IAAA;AAAA,MACjD,CAAA,CAAA,MAAQ;AACN,QAAA,OAAO,IAAA;AAAA,MACT;AAAA,IACF;AAAA,IAEA,qBAAA,GAAwB;AACtB,MAAA,IAAI;AACF,QAAA,IAAI,CAAC,IAAA,CAAK,YAAA,EAAc,OAAO,EAAA;AAC/B,QAAA,IAAI,GAAA,GAAM,EAAA;AACV,QAAA,IAAA,CAAK,YAAA,CAAa,OAAA,CAAQ,CAAC,CAAA,EAAG,CAAA,KAAM;AAClC,UAAA,GAAA,IAAO,CAAA,EAAG,CAAC,CAAA,EAAA,EAAK,CAAC,CAAA;AAAA,CAAA;AAAA,QACnB,CAAC,CAAA;AACD,QAAA,OAAO,GAAA;AAAA,MACT,CAAA,CAAA,MAAQ;AACN,QAAA,OAAO,EAAA;AAAA,MACT;AAAA,IACF;AAAA,IAEA,iBAAiB,KAAA,EAAe;AAAA,IAAC;AAAA,IAEjC,KAAA,GAAQ;AACN,MAAA,IAAI;AACF,QAAA,IAAA,CAAK,aAAa,KAAA,EAAM;AAAA,MAC1B,CAAA,CAAA,MAAQ;AAAA,MAER;AACA,MAAA,IAAI;AACF,QAAA,IAAA,CAAK,OAAA,IAAU;AAAA,MACjB,CAAA,CAAA,MAAQ;AAAA,MAER;AACA,MAAA,IAAA,CAAK,UAAU,OAAO,CAAA;AAAA,IACxB;AAAA,IAEA,KAAK,IAAA,EAAY;AACf,MAAA,MAAM,UAAU,YAAY;AAC1B,QAAA,MAAM,GAAA,GAAM,IAAA,CAAK,UAAA,CAAW,IAAA,CAAK,IAAI,CAAA;AACrC,QAAA,MAAM,UAAA,GAAa,IAAI,eAAA,EAAgB;AACvC,QAAA,IAAA,CAAK,WAAA,GAAc,UAAA;AAEnB,QAAA,IAAI,aAAA;AACJ,QAAA,MAAM,EAAA,GAAK,KAAK,GAAA,CAAI,IAAA,CAAK,WAAW,CAAA,EAAG,IAAA,CAAK,aAAa,CAAA;AACzD,QAAA,IAAI,KAAK,CAAA,EAAG;AACV,UAAA,aAAA,GAAgB,KAAK,cAAA,CAAe,MAAM,UAAA,CAAW,KAAA,IAAS,EAAE,CAAA;AAAA,QAClE;AAEA,QAAA,IAAI;AACF,UAAA,MAAM,UAAkC,EAAC;AACzC,UAAA,KAAA,MAAW,CAAC,CAAA,EAAG,CAAC,CAAA,IAAK,IAAA,CAAK,SAAS,OAAA,EAAQ,EAAG,OAAA,CAAQ,CAAC,CAAA,GAAI,CAAA;AAE3D,UAAA,IAAI,CAAC,IAAA,CAAK,KAAA,EAAO,MAAM,IAAI,MAAM,uDAAuD,CAAA;AAExF,UAAA,MAAM,IAAA,GAAO,MAAM,IAAA,CAAK,KAAA,CAAM,GAAA,EAAK;AAAA,YACjC,QAAQ,IAAA,CAAK,OAAA;AAAA,YACb,OAAA;AAAA,YACA,IAAA;AAAA,YACA,QAAQ,UAAA,CAAW;AAAA;AAAA,WAEb,CAAA;AAER,UAAA,IAAA,CAAK,eAAe,IAAA,CAAK,OAAA;AACzB,UAAA,IAAA,CAAK,SAAS,IAAA,CAAK,MAAA;AACnB,UAAA,IAAA,CAAK,UAAA,GAAc,KAAa,UAAA,IAAc,EAAA;AAC9C,UAAA,IAAA,CAAK,eAAe,CAAC,CAAA;AAGrB,UAAA,IAAA,CAAK,eAAe,CAAC,CAAA;AACrB,UAAA,IAAI,IAAA,CAAK,iBAAiB,aAAA,EAAe;AACvC,YAAA,IAAA,CAAK,QAAA,GAAW,MAAM,IAAA,CAAK,WAAA,EAAY;AACvC,YAAA,IAAA,CAAK,YAAA,GAAe,EAAA;AAAA,UACtB,CAAA,MAAA,IAAW,IAAA,CAAK,YAAA,KAAiB,MAAA,EAAQ;AACvC,YAAA,IAAA,CAAK,QAAA,GAAY,KAAa,IAAA,GAC1B,MAAO,KAAa,IAAA,EAAK,GACzB,MAAM,IAAA,CAAK,WAAA,EAAY;AAC3B,YAAA,IAAA,CAAK,YAAA,GAAe,EAAA;AAAA,UACtB,CAAA,MAAO;AACL,YAAA,MAAM,IAAA,GAAO,MAAM,IAAA,CAAK,IAAA,EAAK;AAC7B,YAAA,IAAA,CAAK,YAAA,GAAe,IAAA;AACpB,YAAA,IAAI,IAAA,CAAK,iBAAiB,MAAA,EAAQ;AAChC,cAAA,IAAI;AACF,gBAAA,IAAA,CAAK,QAAA,GAAW,IAAA,CAAK,KAAA,CAAM,IAAI,CAAA;AAAA,cACjC,CAAA,CAAA,MAAQ;AACN,gBAAA,IAAA,CAAK,QAAA,GAAW,IAAA;AAAA,cAClB;AAAA,YACF,CAAA,MAAO;AACL,cAAA,IAAA,CAAK,QAAA,GAAW,IAAA;AAAA,YAClB;AAAA,UACF;AAEA,UAAA,IAAA,CAAK,eAAe,CAAC,CAAA;AACrB,UAAA,IAAI;AACF,YAAA,IAAA,CAAK,MAAA,IAAS;AAAA,UAChB,CAAA,CAAA,MAAQ;AAAA,UAER;AACA,UAAA,IAAA,CAAK,UAAU,MAAM,CAAA;AACrB,UAAA,IAAA,CAAK,UAAU,SAAS,CAAA;AAAA,QAC1B,CAAA,CAAA,MAAQ;AACN,UAAA,IAAA,CAAK,eAAe,CAAC,CAAA;AACrB,UAAA,MAAM,OAAA,GAAU,IAAA,CAAK,WAAA,EAAa,MAAA,EAAQ,OAAA;AAC1C,UAAA,IAAI,OAAA,EAAS;AACX,YAAA,IAAI;AACF,cAAA,IAAA,CAAK,SAAA,IAAY;AAAA,YACnB,CAAA,CAAA,MAAQ;AAAA,YAAC;AACT,YAAA,IAAA,CAAK,UAAU,SAAS,CAAA;AAAA,UAC1B,CAAA,MAAO;AACL,YAAA,IAAI;AACF,cAAA,IAAA,CAAK,OAAA,IAAU;AAAA,YACjB,CAAA,CAAA,MAAQ;AAAA,YAAC;AACT,YAAA,IAAA,CAAK,UAAU,OAAO,CAAA;AAAA,UACxB;AACA,UAAA,IAAA,CAAK,UAAU,SAAS,CAAA;AAAA,QAC1B,CAAA,SAAE;AACA,UAAA,IAAI,aAAA,EAAe,IAAA,CAAK,gBAAA,CAAiB,aAAa,CAAA;AAAA,QACxD;AAAA,MACF,CAAA;AAGA,MAAA,KAAK,OAAA,EAAQ;AAAA,IACf;AAAA;AAGF,EAAA,CAAA,CAAE,cAAA,GAAiB,GAAA;AACrB;AC1NO,SAAS,mBAAA,CAAoB,OAAA,EAAqB,SAAA,GAAoB,EAAA,EAAU;AACrF,EAAAC,oBAAA,CAAG,YAAA;AAAA,IACD;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,IAAA,CAAA;AAAA,IAkCA,OAAA;AAAA,IACA,EAAE,SAAS,SAAA;AAAU,GACvB;AACF;;;AC3CO,SAAS,mBAAmB,IAAA,EAA6B;AAC9D,EAAA,MAAM,EAAE,SAAA,EAAW,cAAA,EAAe,GAAI,IAAA;AAEtC,EAAA,SAAA,CAAU,YAAA,GAAe;AAAA,IACvB,SAAA,EAAW,KAAK,GAAA,EAAI;AAAA,IACpB,MAAA,kBAAQ,MAAA,CAAO,MAAA,CAAO,IAAI,CAAA;AAAA,IAC1B,SAAA,EAAW,CAAA;AAAA,IACX,iBAAA,EAAmB,CAAA;AAAA,IACnB,SAAA,kBAAW,MAAA,CAAO,MAAA,CAAO,IAAI,CAAA;AAAA,IAC7B,MAAA,EAAQ;AAAA,MACN,gBAAA,EAAkB,CAAA;AAAA,MAClB,YAAA,EAAc,CAAA;AAAA,MACd,iBAAA,EAAmB,CAAA;AAAA,MACnB,aAAA,EAAe,CAAA;AAAA,MACf,YAAA,EAAc,CAAA;AAAA,MACd,QAAA,EAAU;AAAA,KACZ;AAAA,IACA,GAAA,EAAK;AAAA,MACH,SAAA,EAAW,CAAA;AAAA,MACX,YAAA,EAAc,CAAA;AAAA,MACd,QAAA,EAAU;AAAA,KACZ;AAAA,IACA,gBAAgB;AAAC,GACnB;AAEA,EAAA,MAAM,IAAA,GAAO,CAAC,IAAA,KAAiB;AAC7B,IAAA,MAAM,IAAI,SAAA,CAAU,YAAA;AACpB,IAAA,CAAA,CAAE,OAAO,IAAI,CAAA,GAAA,CAAK,EAAE,MAAA,CAAO,IAAI,KAAK,CAAA,IAAK,CAAA;AACzC,IAAA,CAAA,CAAE,iBAAA,GAAoB,KAAK,GAAA,EAAI;AAAA,EACjC,CAAA;AAEA,EAAA,MAAM,YAAA,GAAe,CAAC,IAAA,KAAiB;AACrC,IAAA,MAAM,IAAI,SAAA,CAAU,YAAA;AACpB,IAAA,CAAA,CAAE,UAAU,IAAI,CAAA,GAAA,CAAK,EAAE,SAAA,CAAU,IAAI,KAAK,CAAA,IAAK,CAAA;AAAA,EACjD,CAAA;AAEA,EAAA,MAAM,SAAA,GAAY,CAAC,KAAA,EAAY,EAAA,KAAe;AAC5C,IAAA,MAAM,IAAA,GAAO,QAAQ,EAAE,CAAA;AACvB,IAAA,IAAI,OAAO,SAAS,UAAA,EAAY;AAChC,IAAA,KAAA,CAAM,EAAE,CAAA,GAAI,SAAA,GAAa,IAAA,EAAa;AACpC,MAAA,IAAA,CAAK,EAAE,CAAA;AACP,MAAA,OAAO,IAAA,CAAK,KAAA,CAAM,IAAA,EAAM,IAAI,CAAA;AAAA,IAC9B,CAAA;AAAA,EACF,CAAA;AAGA,EAAA,SAAA,CAAU,SAAA,CAAU,IAAA,EAAM,SAAA,EAAW,aAAa,CAAA;AAClD,EAAA,SAAA,CAAU,SAAA,CAAU,IAAA,EAAM,SAAA,EAAW,cAAc,CAAA;AACnD,EAAA,SAAA,CAAU,SAAA,CAAU,IAAA,EAAM,SAAA,EAAW,aAAa,CAAA;AAClD,EAAA,SAAA,CAAU,SAAA,CAAU,OAAA,EAAS,SAAA,EAAW,cAAc,CAAA;AACtD,EAAA,SAAA,CAAU,SAAA,CAAU,OAAA,EAAS,SAAA,EAAW,iBAAiB,CAAA;AACzD,EAAA,SAAA,CAAU,SAAA,CAAU,OAAA,EAAS,SAAA,EAAW,QAAQ,CAAA;AAChD,EAAA,SAAA,CAAU,SAAA,CAAU,OAAA,EAAS,SAAA,EAAW,SAAS,CAAA;AAGjD,EAAA,MAAM,eAAA,GAAkB,CAAC,MAAA,EAAa,KAAA,KAAkB;AACtD,IAAA,MAAM,OAAO,MAAA,EAAQ,gBAAA;AACrB,IAAA,IAAI,OAAO,SAAS,UAAA,EAAY;AAChC,IAAA,MAAA,CAAO,gBAAA,GAAmB,SAAU,IAAA,EAAW,QAAA,EAAe,OAAA,EAAc;AAC1E,MAAA,IAAI;AACF,QAAA,YAAA,CAAa,GAAG,KAAK,CAAA,CAAA,EAAI,MAAA,CAAO,IAAI,CAAC,CAAA,CAAE,CAAA;AAAA,MACzC,CAAA,CAAA,MAAQ;AAAA,MAER;AACA,MAAA,OAAO,IAAA,CAAK,IAAA,CAAK,IAAA,EAAM,IAAA,EAAM,UAAU,OAAO,CAAA;AAAA,IAChD,CAAA;AAAA,EACF,CAAA;AACA,EAAA,eAAA,CAAgB,WAAW,QAAQ,CAAA;AACnC,EAAA,eAAA,CAAgB,SAAA,CAAU,UAAU,UAAU,CAAA;AAE9C,EAAA,MAAM,KAAK,SAAA,CAAU,gBAAA;AACrB,EAAA,IAAI,OAAO,OAAO,UAAA,EAAY;AAC5B,IAAA,MAAM,EAAA,GAAK,IAAI,EAAA,CAAG,MAAM;AACtB,MAAA,SAAA,CAAU,YAAA,CAAa,SAAA,EAAA;AACvB,MAAA,SAAA,CAAU,YAAA,CAAa,iBAAA,GAAoB,IAAA,CAAK,GAAA,EAAI;AAAA,IACtD,CAAC,CAAA;AACD,IAAA,IAAI;AACF,MAAA,EAAA,CAAG,OAAA,CAAQ,SAAA,CAAU,QAAA,EAAU,eAAA,EAAiB;AAAA,QAC9C,OAAA,EAAS,IAAA;AAAA,QACT,SAAA,EAAW,IAAA;AAAA,QACX,UAAA,EAAY,IAAA;AAAA,QACZ,aAAA,EAAe;AAAA,OAChB,CAAA;AAAA,IACH,CAAA,CAAA,MAAQ;AAAA,IAER;AAAA,EACF;AAGA,EAAA,MAAM,SAAS,MAAM;AACnB,IAAA,IAAI;AACF,MAAA,MAAM,EAAA,GAAK,SAAA,CAAU,QAAA,EAAU,aAAA,GAAgB,UAAU,CAAA;AACzD,MAAA,MAAM,GAAA,GAAM,EAAA,EAAI,SAAA,EAAW,MAAA,IAAU,CAAA;AACrC,MAAA,MAAM,OAAA,GAAU,EAAA,EAAI,YAAA,GAAe,OAAO,CAAA,EAAG,QAAA,CAAS,SAAS,CAAA,GAC3D,MAAA,CAAO,EAAA,CAAG,YAAA,CAAa,OAAO,CAAC,CAAA,GAC/B,IAAA;AACJ,MAAA,SAAA,CAAU,YAAA,CAAa,cAAA,CAAe,IAAA,CAAK,EAAE,CAAA,EAAG,KAAK,GAAA,EAAI,EAAG,GAAA,EAAK,OAAA,EAAS,CAAA;AAAA,IAC5E,CAAA,CAAA,MAAQ;AAAA,IAER;AAAA,EACF,CAAA;AACA,EAAA,MAAA,EAAO;AACP,EAAA,cAAA,CAAe,QAAQ,GAAG,CAAA;AAC1B,EAAA,cAAA,CAAe,QAAQ,GAAI,CAAA;AAC3B,EAAA,cAAA,CAAe,QAAQ,IAAI,CAAA;AAC3B,EAAA,cAAA,CAAe,QAAQ,IAAI,CAAA;AAC7B;AAEO,SAAS,gBACd,SAAA,EACA,WAAA,EACA,MAAoB,MAAM,IAAA,CAAK,KAAI,EAC7B;AACN,EAAA,MAAM,QAAQ,SAAA,CAAU,YAAA;AACxB,EAAA,IAAI,CAAC,KAAA,EAAO;AAEZ,EAAA,MAAM,eAAe,MAAM;AACzB,IAAA,IAAI;AACF,MAAA,MAAM,EAAA,GAAK,SAAA,CAAU,QAAA,EAAU,aAAA,GAAgB,UAAU,CAAA;AACzD,MAAA,MAAM,GAAA,GAAM,IAAI,SAAA,IAAa,EAAA;AAC7B,MAAA,OAAO,MAAA,CAAO,GAAG,CAAA,CAAE,KAAA,CAAM,GAAG,GAAG,CAAA;AAAA,IACjC,CAAA,CAAA,MAAQ;AACN,MAAA,OAAO,IAAA;AAAA,IACT;AAAA,EACF,CAAA,GAAG;AAEH,EAAA,WAAA,CAAY;AAAA,IACV,gBAAA;AAAA,IACA,KAAK,SAAA,CAAU;AAAA,MACb,SAAA,EAAW,MAAM,SAAA,IAAa,CAAA;AAAA,MAC9B,oBAAA,EACE,KAAA,CAAM,iBAAA,IAAqB,OAAO,KAAA,CAAM,sBAAsB,QAAA,GAC1D,GAAA,EAAI,GAAI,KAAA,CAAM,iBAAA,GACd,IAAA;AAAA,MACN,SAAA,EAAW,OAAO,OAAA,CAAQ,KAAA,CAAM,UAAU,EAAE,EACzC,IAAA,CAAK,CAAC,GAAG,CAAA,KAAO,CAAA,CAAE,CAAC,CAAA,GAAgB,CAAA,CAAE,CAAC,CAAY,CAAA,CAClD,KAAA,CAAM,CAAA,EAAG,EAAE,CAAA;AAAA,MACd,YAAA,EAAc,OAAO,OAAA,CAAQ,KAAA,CAAM,aAAa,EAAE,EAC/C,IAAA,CAAK,CAAC,GAAG,CAAA,KAAO,CAAA,CAAE,CAAC,CAAA,GAAgB,CAAA,CAAE,CAAC,CAAY,CAAA,CAClD,KAAA,CAAM,CAAA,EAAG,EAAE,CAAA;AAAA,MACd,MAAA,EAAQ,MAAM,MAAA,IAAU,IAAA;AAAA,MACxB,sBAAA,EACE,KAAA,CAAM,mBAAA,IAAuB,OAAO,KAAA,CAAM,wBAAwB,QAAA,GAC9D,GAAA,EAAI,GAAI,KAAA,CAAM,mBAAA,GACd,IAAA;AAAA,MACN,GAAA,EAAK,MAAM,GAAA,IAAO,IAAA;AAAA,MAClB,WAAW,MAAM;AACf,QAAA,IAAI;AACF,UAAA,OAAO;AAAA,YACL,IAAA,EAAM,MAAA,CAAO,SAAA,CAAU,QAAA,EAAU,QAAQ,EAAE,CAAA;AAAA,YAC3C,QAAA,EAAU,MAAA,CAAO,SAAA,CAAU,QAAA,EAAU,YAAY,EAAE,CAAA;AAAA,YACnD,MAAA,EAAQ,MAAA,CAAO,SAAA,CAAU,QAAA,EAAU,UAAU,EAAE,CAAA;AAAA,YAC/C,IAAA,EAAM,MAAA,CAAO,SAAA,CAAU,QAAA,EAAU,QAAQ,EAAE,CAAA;AAAA,YAC3C,OAAA,EAAS,MAAA,CAAO,SAAA,CAAU,QAAA,EAAU,WAAW,EAAE;AAAA,WACnD;AAAA,QACF,CAAA,CAAA,MAAQ;AACN,UAAA,OAAO,IAAA;AAAA,QACT;AAAA,MACF,CAAA,GAAG;AAAA,MACH,cAAA,EAAgB,KAAA,CAAM,cAAA,IAAkB,EAAC;AAAA,MACzC,eAAA,EAAiB;AAAA,KAClB;AAAA,GACF,CAAA;AACH;;;AClJA,SAAS,WAAW,IAAA,EAAoB;AACtC,EAAA,OAAO,IAAA,EAAM,OAAA,EAAS,WAAA,IAAc,KAAM,QAAA;AAC5C;AAEO,SAAS,mBAAmB,IAAA,EAAsC;AACvE,EAAA,MAAM,gBAAA,uBAAuB,GAAA,EAAY;AACzC,EAAA,IAAI,kBAAA,GAAqB,CAAA;AACzB,EAAA,IAAI,iBAAA,GAAoB,CAAA;AAExB,EAAA,MAAM,WAAA,GAAc,IAAI,IAAA,KAAoB;AAC1C,IAAA,IAAI,iBAAA,EAAA,GAAsB,KAAK,cAAA,EAAgB;AAC/C,IAAA,IAAA,CAAK,MAAM,IAAI,CAAA;AAAA,EACjB,CAAA;AAEA,EAAA,MAAM,iBAAA,GAAoB,OAAO,QAAA,EAAe,mBAAA,KAA+C;AAC7F,IAAA,MAAM,MAAA,GAAS,QAAA,EAAU,GAAA,IAAO,QAAA,EAAU,eAAe,KAAK,CAAA;AAC9D,IAAA,IAAI,CAAC,MAAA,EAAQ;AAEb,IAAA,IAAI,WAAA;AACJ,IAAA,IAAI;AACF,MAAA,WAAA,GAAc,IAAI,GAAA,CAAI,MAAA,CAAO,MAAM,CAAA,EAAG,IAAA,CAAK,kBAAkB,CAAA,CAAE,IAAA;AAAA,IACjE,CAAA,CAAA,MAAQ;AACN,MAAA;AAAA,IACF;AACA,IAAA,IAAI,gBAAA,CAAiB,GAAA,CAAI,WAAW,CAAA,EAAG;AACvC,IAAA,gBAAA,CAAiB,IAAI,WAAW,CAAA;AAChC,IAAA,IAAA,CAAK,iBAAA,EAAkB;AACvB,IAAA,kBAAA,EAAA;AAEA,IAAA,MAAM,IAAA,GAAA,CAAQ,QAAA,EAAU,IAAA,IAAQ,QAAA,EAAU,YAAA,GAAe,MAAM,CAAA,IAAK,EAAA,EACjE,QAAA,EAAS,CACT,IAAA,EAAK,CACL,WAAA,EAAY;AACf,IAAA,MAAM,WAAW,IAAA,KAAS,QAAA;AAC1B,IAAA,WAAA,CAAY,uBAAA,EAAyB,WAAA,EAAa,QAAA,GAAW,QAAA,GAAW,SAAS,CAAA;AAEjF,IAAA,IAAI;AACF,MAAA,IAAI,QAAA,EAAU;AACZ,QAAA,MAAM,IAAA,CAAK,eAAA,CAAgB,WAAA,EAAa,mBAAmB,CAAA;AAAA,MAC7D,CAAA,MAAO;AACL,QAAA,MAAM,IAAA,GAAO,MAAM,IAAA,CAAK,SAAA,CAAU,WAAW,CAAA;AAC7C,QAAA,IAAA,CAAK,gBAAA,CAAiB,MAAM,WAAW,CAAA;AAAA,MACzC;AAGA,MAAA,IAAI;AACF,QAAA,IAAI,OAAO,UAAU,MAAA,KAAW,UAAA;AAC9B,UAAA,QAAA,CAAS,OAAO,KAAK,IAAA,CAAK,UAAU,KAAA,IAAS,KAAA,EAAO,MAAM,CAAC,CAAA;AAAA,MAC/D,CAAA,CAAA,MAAQ;AACN,QAAA,IAAI;AACF,UAAA,QAAA,CAAS,MAAA,IAAS;AAAA,QACpB,CAAA,CAAA,MAAQ;AAAA,QAAC;AAAA,MACX;AACA,MAAA,IAAI;AACF,QAAA,QAAA,EAAU,gBAAgB,KAAK,IAAA,CAAK,UAAU,KAAA,IAAS,KAAA,EAAO,MAAM,CAAC,CAAA;AAAA,MACvE,CAAA,CAAA,MAAQ;AAAA,MAAC;AAAA,IACX,SAAS,CAAA,EAAG;AACV,MAAA,IAAI;AACF,QAAA,IAAA,CAAK,OAAA,GAAU,aAAa,CAAC,CAAA;AAAA,MAC/B,CAAA,CAAA,MAAQ;AAAA,MAER;AACA,MAAA,IAAI;AACF,QAAA,IAAI,OAAO,QAAA,EAAU,OAAA,KAAY,UAAA,EAAY,QAAA,CAAS,QAAQ,CAAC,CAAA;AAAA,MACjE,CAAA,CAAA,MAAQ;AACN,QAAA,IAAI;AACF,UAAA,QAAA,CAAS,OAAA,IAAU;AAAA,QACrB,CAAA,CAAA,MAAQ;AAAA,QAAC;AAAA,MACX;AACA,MAAA,IAAI;AACF,QAAA,QAAA,EAAU,gBAAgB,KAAK,IAAA,CAAK,UAAU,KAAA,IAAS,KAAA,EAAO,OAAO,CAAC,CAAA;AAAA,MACxE,CAAA,CAAA,MAAQ;AAAA,MAAC;AAAA,IACX,CAAA,SAAE;AACA,MAAA,kBAAA,EAAA;AACA,MAAA,IAAA,CAAK,iBAAA,EAAkB;AAAA,IACzB;AAAA,EACF,CAAA;AAEA,EAAA,MAAM,kBAAA,GAAqB,CAAC,IAAA,EAAW,KAAA,KAAkB;AAEvD,IAAA,IAAA,CAAK,eAAe,MAAM;AACxB,MAAA,KAAK,kBAAkB,IAAA,EAAM,CAAA,EAAG,KAAK,WAAW,CAAA,CAAA,EAAI,KAAK,CAAA,CAAE,CAAA;AAAA,IAC7D,GAAG,CAAC,CAAA;AAAA,EACN,CAAA;AAEA,EAAA,MAAM,oBAAA,GAAuB,CAAC,SAAA,EAAgB,KAAA,KAAkB;AAC9D,IAAA,IAAI,CAAC,SAAA,EAAW;AAChB,IAAA,MAAM,eAAA,GAAkB,SAAA,CAAU,WAAA,EAAa,IAAA,CAAK,SAAS,CAAA;AAC7D,IAAA,MAAM,gBAAA,GAAmB,SAAA,CAAU,YAAA,EAAc,IAAA,CAAK,SAAS,CAAA;AAC/D,IAAA,MAAM,UAAA,GAAa,SAAA,CAAU,MAAA,EAAQ,IAAA,CAAK,SAAS,CAAA;AACnD,IAAA,MAAM,WAAA,GAAc,SAAA,CAAU,OAAA,EAAS,IAAA,CAAK,SAAS,CAAA;AACrD,IAAA,IAAI,OAAO,oBAAoB,UAAA,EAAY;AACzC,MAAA,SAAA,CAAU,WAAA,GAAc,CAAC,IAAA,KAAc;AACrC,QAAA,MAAM,GAAA,GAAM,gBAAgB,IAAI,CAAA;AAChC,QAAA,IAAI,WAAW,IAAI,CAAA,qBAAsB,IAAA,EAAM,CAAA,EAAG,KAAK,CAAA,YAAA,CAAc,CAAA;AACrE,QAAA,OAAO,GAAA;AAAA,MACT,CAAA;AAAA,IACF;AACA,IAAA,IAAI,OAAO,qBAAqB,UAAA,EAAY;AAC1C,MAAA,SAAA,CAAU,YAAA,GAAe,CAAC,IAAA,EAAW,GAAA,KAAa;AAChD,QAAA,MAAM,GAAA,GAAM,gBAAA,CAAiB,IAAA,EAAM,GAAG,CAAA;AACtC,QAAA,IAAI,WAAW,IAAI,CAAA,qBAAsB,IAAA,EAAM,CAAA,EAAG,KAAK,CAAA,aAAA,CAAe,CAAA;AACtE,QAAA,OAAO,GAAA;AAAA,MACT,CAAA;AAAA,IACF;AACA,IAAA,IAAI,OAAO,eAAe,UAAA,EAAY;AACpC,MAAA,SAAA,CAAU,MAAA,GAAS,IAAI,KAAA,KAAiB;AACtC,QAAA,MAAM,GAAA,GAAM,UAAA,CAAW,GAAG,KAAK,CAAA;AAC/B,QAAA,KAAA,MAAW,CAAA,IAAK,KAAA,EAAO,IAAI,UAAA,CAAW,CAAC,GAAG,kBAAA,CAAmB,CAAA,EAAG,CAAA,EAAG,KAAK,CAAA,OAAA,CAAS,CAAA;AACjF,QAAA,OAAO,GAAA;AAAA,MACT,CAAA;AAAA,IACF;AACA,IAAA,IAAI,OAAO,gBAAgB,UAAA,EAAY;AACrC,MAAA,SAAA,CAAU,OAAA,GAAU,IAAI,KAAA,KAAiB;AACvC,QAAA,MAAM,GAAA,GAAM,WAAA,CAAY,GAAG,KAAK,CAAA;AAChC,QAAA,KAAA,MAAW,CAAA,IAAK,KAAA,EAAO,IAAI,UAAA,CAAW,CAAC,GAAG,kBAAA,CAAmB,CAAA,EAAG,CAAA,EAAG,KAAK,CAAA,QAAA,CAAU,CAAA;AAClF,QAAA,OAAO,GAAA;AAAA,MACT,CAAA;AAAA,IACF;AAAA,EACF,CAAA;AAEA,EAAA,MAAM,UAAU,MAAM;AACpB,IAAA,oBAAA,CAAqB,IAAA,CAAK,SAAA,CAAU,QAAA,EAAU,IAAA,EAAM,MAAM,CAAA;AAC1D,IAAA,oBAAA,CAAqB,IAAA,CAAK,SAAA,CAAU,QAAA,EAAU,IAAA,EAAM,MAAM,CAAA;AAI1D,IAAA,IAAI;AACF,MAAA,MAAM,OAAA,GAAU,IAAA,CAAK,SAAA,CAAU,OAAA,EAAS,SAAA;AACxC,MAAA,MAAM,cAAc,OAAA,EAAS,YAAA;AAC7B,MAAA,IAAI,OAAO,gBAAgB,UAAA,EAAY;AACrC,QAAA,OAAA,CAAQ,YAAA,GAAe,SAAU,IAAA,EAAc,KAAA,EAAe;AAC5D,UAAA,MAAM,GAAA,GAAM,WAAA,CAAY,IAAA,CAAK,IAAA,EAAM,MAAM,KAAK,CAAA;AAC9C,UAAA,IAAI;AACF,YAAA,IACE,IAAA,EAAM,OAAA,EAAS,WAAA,IAAc,KAAM,QAAA,IACnC,OAAO,IAAA,KAAS,QAAA,IAChB,IAAA,CAAK,WAAA,EAAY,KAAM,KAAA,EACvB;AACA,cAAA,kBAAA,CAAmB,MAAM,0BAA0B,CAAA;AAAA,YACrD;AAAA,UACF,CAAA,CAAA,MAAQ;AAAA,UAER;AACA,UAAA,OAAO,GAAA;AAAA,QACT,CAAA;AAAA,MACF;AAAA,IACF,CAAA,CAAA,MAAQ;AAAA,IAER;AAGA,IAAA,IAAI;AACF,MAAA,MAAM,GAAA,GAAM,KAAK,SAAA,CAAU,QAAA;AAC3B,MAAA,MAAM,iBAAA,GAAoB,GAAA,EAAK,aAAA,EAAe,IAAA,CAAK,GAAG,CAAA;AACtD,MAAA,IAAI,OAAO,sBAAsB,UAAA,EAAY;AAC3C,QAAA,GAAA,CAAI,aAAA,GAAgB,CAAC,OAAA,EAAA,GAAoB,IAAA,KAAgB;AACvD,UAAA,MAAM,EAAA,GAAK,iBAAA,CAAkB,OAAA,EAAS,GAAG,IAAI,CAAA;AAC7C,UAAA,IAAI;AACF,YAAA,IAAI,OAAO,OAAA,KAAY,QAAA,IAAY,OAAA,CAAQ,WAAA,OAAkB,QAAA,EAAU;AACrE,cAAA,MAAM,IAAA,GAAO,MAAA,CAAO,wBAAA,CAAyB,EAAA,EAAI,KAAK,CAAA;AAEtD,cAAA,IAAI,CAAC,IAAA,IAAQ,IAAA,CAAK,YAAA,EAAc;AAC9B,gBAAA,IAAI,IAAA,GAAO,EAAA,CAAG,YAAA,GAAe,KAAK,CAAA,IAAK,EAAA;AACvC,gBAAA,MAAA,CAAO,cAAA,CAAe,IAAI,KAAA,EAAO;AAAA,kBAC/B,YAAA,EAAc,IAAA;AAAA,kBACd,UAAA,EAAY,IAAA;AAAA,kBACZ,KAAK,MAAM,IAAA;AAAA,kBACX,GAAA,EAAK,CAAC,CAAA,KAAc;AAClB,oBAAA,IAAA,GAAO,OAAO,CAAC,CAAA;AACf,oBAAA,IAAI;AACF,sBAAA,EAAA,CAAG,YAAA,GAAe,OAAO,IAAI,CAAA;AAAA,oBAC/B,CAAA,CAAA,MAAQ;AAAA,oBAER;AACA,oBAAA,kBAAA,CAAmB,IAAI,aAAa,CAAA;AAAA,kBACtC;AAAA,iBACD,CAAA;AAAA,cACH;AAAA,YACF;AAAA,UACF,CAAA,CAAA,MAAQ;AAAA,UAER;AACA,UAAA,OAAO,EAAA;AAAA,QACT,CAAA;AAAA,MACF;AAAA,IACF,CAAA,CAAA,MAAQ;AAAA,IAER;AAAA,EACF,CAAA;AAEA,EAAA,OAAO;AAAA,IACL,uBAAuB,MAAM,kBAAA;AAAA,IAC7B;AAAA,GACF;AACF;ACrNO,SAAS,aAAA,GAAyB;AACvC,EAAA,OACE,OAAO,OAAA,KAAY,WAAA,IACnB,OAAO,OAAA,CAAQ,aAAa,QAAA,IAC5B,OAAO,OAAA,CAAQ,QAAA,CAAS,IAAA,KAAS,QAAA;AAErC;AAEO,SAAS,MAAM,EAAA,EAA2B;AAC/C,EAAA,OAAO,IAAI,OAAA,CAAQ,CAAC,YAAYP,iBAAAA,CAAe,OAAA,EAAS,EAAE,CAAC,CAAA;AAC7D;AAEO,SAAS,cAAc,IAAA,EAAuC;AACnE,EAAA,OAAO;AAAA,IACL,MAAA,EAAQ,MAAM,MAAA,IAAU,IAAA;AAAA,IACxB,KAAA,EAAO,IAAA,EAAM,KAAA,IAAS,EAAC;AAAA,IACvB,cAAA,EAAgB,MAAM,cAAA,IAAkB,IAAA;AAAA,IACxC,OAAA,EAAS,MAAM,OAAA,IAAW,GAAA;AAAA,IAC1B,YAAA,EAAc,MAAM,YAAA,IAAgB,aAAA;AAAA,IACpC,QAAA,EAAU,MAAM,QAAA,IAAY,GAAA;AAAA,IAC5B,YAAA,EAAc,MAAM,YAAA,IAAgB,EAAA;AAAA,IACpC,UAAA,EAAY,MAAM,UAAA,IAAc,EAAA;AAAA,IAChC,cAAA,EAAgB,MAAM,cAAA,IAAkB,KAAA;AAAA,IACxC,eAAA,EAAiB,MAAM,eAAA,IAAmB,IAAA;AAAA,IAC1C,UAAA,EAAY,MAAM,UAAA,IAAc,KAAA;AAAA,IAChC,WAAA,EAAa,MAAM,WAAA,IAAe;AAAA,GACpC;AACF;AC7BO,SAAS,qBAAA,CAAsB,OAAA,EAAqB,SAAA,GAAoB,EAAA,EAAU;AACvF,EAAAO,oBAAAA,CAAG,YAAA;AAAA,IACD;AAAA;AAAA;AAAA,IAAA,CAAA;AAAA,IAIA,OAAA;AAAA,IACA,EAAE,SAAS,SAAA;AAAU,GACvB;AACF;AAEO,SAAS,4BAAA,CAA6B,OAAA,EAAqB,SAAA,GAAoB,EAAA,EAAU;AAC9F,EAAAA,oBAAAA,CAAG,YAAA;AAAA,IACD;AAAA;AAAA,IAAA,CAAA;AAAA,IAGA,OAAA;AAAA,IACA,EAAE,SAAS,SAAA;AAAU,GACvB;AACF;AAEO,SAAS,oBAAA,CAAqB,OAAA,EAAqB,SAAA,GAAoB,EAAA,EAAU;AACtF,EAAAA,oBAAAA,CAAG,YAAA;AAAA,IACD;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA,IAAA,CAAA;AAAA,IA2CA,OAAA;AAAA,IACA,EAAE,SAAS,SAAA;AAAU,GACvB;AACF;ACrDO,SAAS,mBAAmB,IAAA,EAAsC;AACvE,EAAA,MAAM,mBAAoBA,oBAAAA,CAAW,gBAAA;AAOrC,EAAA,MAAM,WAAA,uBAAkB,GAAA,EAAuB;AAC/C,EAAA,MAAM,OAAA,GAAU,KAAK,OAAA,IAAW,KAAA;AAEhC,EAAA,MAAM,UAAA,GAAa,OAAO,SAAA,EAAmB,cAAA,KAA+C;AAC1F,IAAA,IAAI,IAAA,CAAK,aAAY,IAAK,CAAA;AACxB,MAAA,MAAM,IAAI,MAAM,qDAAqD,CAAA;AACvE,IAAA,MAAM,QAAA,GAAW,IAAI,GAAA,CAAI,SAAA,EAAW,cAAc,CAAA,CAAE,IAAA;AACpD,IAAA,MAAM,MAAA,GAAS,WAAA,CAAY,GAAA,CAAI,QAAQ,CAAA;AACvC,IAAA,IAAI,QAAQ,OAAO,MAAA;AAEnB,IAAA,IAAI,CAAC,gBAAA,EAAkB;AACrB,MAAA,MAAM,IAAI,KAAA;AAAA,QACR;AAAA,OACF;AAAA,IACF;AAEA,IAAA,MAAM,MAAA,GAAS,MAAM,OAAA,CAAQ,QAAA,EAAU;AAAA,MACrC,GAAG,IAAA,CAAK,SAAA;AAAA,MACR,OAAA,EAAS,KAAK,GAAA,CAAI,IAAA,CAAK,UAAU,OAAA,IAAW,GAAA,EAAO,IAAA,CAAK,WAAA,EAAa,CAAA;AAAA,MACrE,iBAAA,EAAmB,KAAA;AAAA,MACnB,gBAAA,EAAkB;AAAA,KACnB,CAAA;AACD,IAAA,MAAM,SAAA,GAAY,MAAM,MAAA,CAAO,QAAA,EAAS;AAExC,IAAA,MAAM,GAAA,GAAM,IAAI,gBAAA,CAAiB,SAAA,EAAW;AAAA,MAC1C,SAAS,IAAA,CAAK,OAAA;AAAA,MACd,UAAA,EAAY,QAAA;AAAA,MACZ,oBAAA,EAAsB,CAAC,IAAA,KAAc;AACnC,QAAA,IAAA,CAAK,GAAA,GAAM,QAAA;AAAA,MACb,CAAA;AAAA,MACA,uBAAA,EAAyB,OAAO,IAAA,KAAiB;AAC/C,QAAA,MAAM,KAAA,GAAQ,MAAM,UAAA,CAAW,IAAA,EAAM,QAAQ,CAAA;AAC7C,QAAA,MAAM,KAAA,CAAM,IAAA,CAAK,SAAA,CAAU,QAAQ,CAAC,CAAA;AACpC,QAAA,MAAM,MAAM,QAAA,EAAS;AACrB,QAAA,OAAO,KAAA;AAAA,MACT;AAAA,KACD,CAAA;AAED,IAAA,WAAA,CAAY,GAAA,CAAI,UAAU,GAAG,CAAA;AAC7B,IAAA,OAAO,GAAA;AAAA,EACT,CAAA;AAEA,EAAA,MAAM,SAAA,GACJ,CAAC,cAAA,KACD,OAAO,SAAA,KAA0C;AAC/C,IAAA,OAAO,MAAM,UAAA,CAAW,SAAA,EAAW,cAAc,CAAA;AAAA,EACnD,CAAA;AAEF,EAAA,OAAO,EAAE,YAAY,SAAA,EAAU;AACjC;;;AC7DA,eAAsB,cAAc,IAAA,EAAyD;AAC3F,EAAA,IAAI,IAAA,CAAK,aAAa,SAAA,EAAW;AAC/B,IAAA,MAAM,IAAA,CAAK,KAAA,CAAM,IAAA,CAAK,GAAA,CAAI,CAAA,EAAG,KAAK,UAAA,GAAa,IAAA,CAAK,GAAA,EAAK,CAAC,CAAA;AAC1D,IAAA,OAAO,EAAE,QAAA,EAAU,IAAA,CAAK,GAAA,EAAI,IAAK,KAAK,UAAA,EAAW;AAAA,EACnD;AAEA,EAAA,OAAO,IAAA,CAAK,GAAA,EAAI,GAAI,IAAA,CAAK,UAAA,EAAY;AACnC,IAAA,IACE,IAAA,CAAK,iBAAA,EAAkB,KAAM,CAAA,IAC7B,KAAK,qBAAA,EAAsB,KAAM,CAAA,IACjC,IAAA,CAAK,KAAI,GAAI,IAAA,CAAK,sBAAA,EAAuB,IAAK,KAAK,UAAA,EACnD;AACA,MAAA,OAAO,EAAE,UAAU,KAAA,EAAM;AAAA,IAC3B;AACA,IAAA,MAAM,IAAA,CAAK,KAAA,CAAM,IAAA,CAAK,cAAc,CAAA;AAAA,EACtC;AAEA,EAAA,OAAO,EAAE,UAAU,IAAA,EAAK;AAC1B;;;ACJA,eAAsB,YAAY,IAAA,EAQL;AAC3B,EAAA,MAAM,EAAE,OAAA,EAAS,YAAA,EAAc,MAAA,KAAW,oBAAA,EAAqB;AAE/D,EAAA,MAAM,WAAA,GAAc,MAAM,IAAA,CAAK,GAAA,CAAI,GAAG,IAAA,CAAK,QAAA,GAAW,IAAA,CAAK,GAAA,EAAK,CAAA;AAEhE,EAAA,MAAM,EAAE,MAAA,EAAQ,QAAA,EAAS,GAAIZ,kBAAAA,CAAkB,IAAA,CAAK,IAAA,EAAM,EAAE,GAAA,EAAK,IAAA,CAAK,QAAA,EAAU,CAAA;AAEhF,EAAA,MAAM,OAAA,GAAU,IAAI,GAAA,CAAI,IAAA,CAAK,QAAQ,CAAA;AAIrC,EAAA,MAAM,EAAE,cAAA,EAAgB,MAAA,KAAW,qBAAA,CAAsB,IAAA,CAAK,UAAU,QAAQ,CAAA;AAChF,EAAA,oBAAA,CAAqB,UAAU,cAAc,CAAA;AAC7C,EAAA,oBAAA,CAAqB,QAAQ,cAAc,CAAA;AAE3C,EAAA,MAAM,wBAAwB,cAAA,CAAe,IAAA;AAG7C,EAAA,IAAI;AACF,IAAC,SAAiB,UAAA,KAAe,SAAA;AAAA,EACnC,CAAA,CAAA,MAAQ;AAAA,EAER;AAGA,EAAA,MAAM,SAAA,GAAY,MAAA;AAClB,EAAA,MAAM,SAAA,GAAiB,MAAA,CAAO,MAAA,CAAO,SAAS,CAAA;AAG9C,EAAA,SAAA,CAAU,MAAA,GAAS,SAAA;AACnB,EAAA,SAAA,CAAU,IAAA,GAAO,SAAA;AACjB,EAAA,SAAA,CAAU,UAAA,GAAa,SAAA;AACvB,EAAA,SAAA,CAAU,QAAA,GAAW,QAAA;AACrB,EAAA,IAAI;AACF,IAAA,MAAA,CAAO,cAAA,CAAe,UAAU,aAAA,EAAe,EAAE,OAAO,SAAA,EAAW,YAAA,EAAc,MAAM,CAAA;AAAA,EACzF,CAAA,CAAA,MAAQ;AAAA,EAER;AAEA,EAAA,MAAM,EAAE,QAAA,EAAU,YAAA,EAAc,OAAA,EAAS,WAAA,KAAgB,qBAAA,CAAsB;AAAA,IAC7E,OAAA;AAAA,IACA,UAAA,EAAY,CAAC,IAAA,KAAS;AACpB,MAAA,IAAI,CAAC,IAAA,CAAK,OAAA,CAAQ,WAAA,EAAa;AAC/B,MAAA,IAAI;AACF,QAAA,SAAA,CAAU,YAAA,CAAa,GAAA,CAAI,QAAA,GAAW,MAAA,CAAO,IAAI,CAAA;AAAA,MACnD,CAAA,CAAA,MAAQ;AAAA,MAAC;AAAA,IACX,CAAA;AAAA,IACA,UAAA,EAAY,CAAC,KAAA,KAAU;AACrB,MAAA,IAAI,IAAA,CAAK,QAAQ,WAAA,EAAa;AAC5B,QAAA,IAAI;AACF,UAAA,SAAA,CAAU,aAAa,GAAA,CAAI,SAAA,EAAA;AAAA,QAC7B,CAAA,CAAA,MAAQ;AAAA,QAAC;AAAA,MACX;AACA,MAAA,IAAI;AACF,QAAA,SAAA,CAAU,aAAA,GAAgB,KAAK,SAAA,CAAU,aAAA,IAAiB,OAAO,UAAA,EAAY,EAAE,KAAA,EAAO,CAAC,CAAA;AAAA,MACzF,CAAA,CAAA,MAAQ;AAAA,MAAC;AAAA,IACX;AAAA,GACD,CAAA;AAED,EAAA,IAAI;AACF,IAAA,MAAA,CAAO,cAAA,CAAe,UAAU,UAAA,EAAY;AAAA,MAC1C,YAAA,EAAc,IAAA;AAAA,MACd,KAAK,MAAM,YAAA;AAAA,MACX,GAAA,EAAK,CAAC,CAAA,KAAc;AAClB,QAAA,IAAI;AACF,UAAA,YAAA,CAAa,IAAA,GAAO,OAAO,CAAC,CAAA;AAAA,QAC9B,CAAA,CAAA,MAAQ;AAAA,QAAC;AAAA,MACX;AAAA,KACD,CAAA;AAAA,EACH,CAAA,CAAA,MAAQ;AAAA,EAER;AAEA,EAAA,SAAA,CAAU,QAAA,GAAW,YAAA;AACrB,EAAA,SAAA,CAAU,OAAA,GAAU,WAAA;AAEpB,EAAA,mBAAA,CAAoB,EAAE,SAAA,EAAW,SAAA,EAAW,QAAA,EAAU,uBAAuB,CAAA;AAC7E,EAAA,gBAAA,CAAiB,QAAQ,CAAA;AAEzB,EAAA,MAAM,QAAA,GAAW,gBAAgB,EAAE,SAAA,EAAW,aAAa,IAAA,CAAK,OAAA,CAAQ,aAAa,CAAA;AACrF,EAAA,MAAM,oBAAoB,QAAA,CAAS,iBAAA;AACnC,EAAA,MAAM,iBAAiB,QAAA,CAAS,cAAA;AAChC,EAAA,MAAM,mBAAmB,QAAA,CAAS,gBAAA;AAElC,EAAA,IAAI,IAAA,CAAK,QAAQ,WAAA,EAAa;AAC5B,IAAA,IAAI;AACF,MAAA,kBAAA,CAAmB,EAAE,SAAA,EAAW,cAAA,EAAgB,CAAA;AAAA,IAClD,CAAA,CAAA,MAAQ;AAAA,IAER;AAAA,EACF;AAEA,EAAA,MAAM,YAAY,gBAAA,CAAiB;AAAA,IACjC,SAAA;AAAA,IACA,WAAW,IAAA,CAAK,SAAA;AAAA,IAChB,oBAAoB,cAAA,CAAe,IAAA;AAAA,IACnC,WAAA;AAAA,IACA,cAAA;AAAA,IACA,gBAAA;AAAA,IACA,iBAAA;AAAA,IACA,UAAA,EAAY,KAAK,OAAA,CAAQ,UAAA;AAAA,IACzB,WAAA,EAAa,CAAC,CAAA,KAAM,MAAA,CAAO,SAAS,CAAC,CAAA;AAAA,IACrC,cAAA,EAAgB,CAAC,EAAA,KAAO,SAAA,CAAU,uBAAuB,EAAE;AAAA,GAC5D,CAAA;AAGD,EAAA,MAAM,gBAAA,GAAmB,SAAA,CAAU,gBAAA,EAAkB,IAAA,CAAK,SAAS,CAAA;AACnE,EAAA,MAAM,mBAAA,GAAsB,SAAA,CAAU,mBAAA,EAAqB,IAAA,CAAK,SAAS,CAAA;AACzE,EAAA,MAAM,aAAA,GAAgB,SAAA,CAAU,aAAA,EAAe,IAAA,CAAK,SAAS,CAAA;AAC7D,EAAA,IAAI,OAAO,gBAAA,KAAqB,UAAA,EAAY,SAAA,CAAU,gBAAA,GAAmB,gBAAA;AACzE,EAAA,IAAI,OAAO,mBAAA,KAAwB,UAAA;AACjC,IAAA,SAAA,CAAU,mBAAA,GAAsB,mBAAA;AAClC,EAAA,IAAI,OAAO,aAAA,KAAkB,UAAA,EAAY,SAAA,CAAU,aAAA,GAAgB,aAAA;AAGnE,EAAA,SAAA,CAAU,OAAA,GAAU;AAAA,IAClB,KAAA,EAAO,CAAA,GAAI,CAAA,KAAiB,MAAA,CAAO,SAAS,CAAC,CAAA;AAAA,IAC7C,IAAA,EAAM,CAAA,GAAI,CAAA,KAAiB,MAAA,CAAO,QAAQ,CAAC,CAAA;AAAA,IAC3C,IAAA,EAAM,CAAA,GAAI,CAAA,KAAiB,MAAA,CAAO,QAAQ,CAAC,CAAA;AAAA,IAC3C,KAAA,EAAO,CAAA,GAAI,CAAA,KAAiB,MAAA,CAAO,SAAS,CAAC,CAAA;AAAA,IAC7C,GAAA,EAAK,CAAA,GAAI,CAAA,KAAiB,MAAA,CAAO,OAAO,CAAC;AAAA,GAC3C;AACA,EAAA,IAAI,IAAA,CAAK,QAAQ,cAAA,EAAgB;AAC/B,IAAA,KAAA,MAAW,SAAS,CAAC,OAAA,EAAS,QAAQ,MAAA,EAAQ,OAAA,EAAS,KAAK,CAAA,EAAY;AACtE,MAAA,MAAM,QAAA,GAAY,OAAA,CAAgB,KAAK,CAAA,EAAG,KAAK,OAAO,CAAA;AACtD,MAAA,IAAI,OAAO,aAAa,UAAA,EAAY;AAClC,QAAA,MAAM,OAAA,GAAU,SAAA,CAAU,OAAA,CAAQ,KAAK,CAAA;AACvC,QAAA,SAAA,CAAU,OAAA,CAAQ,KAAK,CAAA,GAAI,CAAA,GAAI,CAAA,KAAiB;AAC9C,UAAA,OAAA,CAAQ,GAAG,CAAC,CAAA;AACZ,UAAA,QAAA,CAAS,GAAG,CAAC,CAAA;AAAA,QACf,CAAA;AAAA,MACF;AAAA,IACF;AAAA,EACF;AAGA,EAAA,IAAI;AACF,IAAA,SAAA,CAAU,UAAU,CAClB,OAAA,EACA,MAAA,EACA,IAAA,EACA,KACA,KAAA,KACG;AACH,MAAA,MAAA,CAAO,OAAA,EAAS,CAAC,kBAAA,EAAoB,OAAA,EAAS,QAAQ,IAAA,EAAM,GAAA,EAAK,KAAK,CAAC,CAAA;AAAA,IACzE,CAAA;AAAA,EACF,CAAA,CAAA,MAAQ;AAAA,EAAC;AACT,EAAA,IAAI;AACF,IAAA,SAAA,CAAU,oBAAA,GAAuB,CAAC,KAAA,KAAe;AAC/C,MAAA,MAAA,CAAO,OAAA,EAAS,CAAC,sBAAA,EAAwB,KAAA,EAAO,MAAM,CAAC,CAAA;AAAA,IACzD,CAAA;AAAA,EACF,CAAA,CAAA,MAAQ;AAAA,EAAC;AACT,EAAA,IAAI;AACF,IAAA,SAAA,CAAU,gBAAA,GAAmB,OAAA,EAAS,CAAC,KAAA,KAAe;AACpD,MAAA,MAAA,CAAO,OAAA,EAAS;AAAA,QACd,eAAA;AAAA,QACA,KAAA,EAAO,OAAA;AAAA,QACP,KAAA,EAAO,QAAA;AAAA,QACP,KAAA,EAAO,MAAA;AAAA,QACP,KAAA,EAAO,KAAA;AAAA,QACP,KAAA,EAAO,KAAA,YAAiB,KAAA,GACpB,CAAA,EAAG,KAAA,CAAM,MAAM,IAAI,CAAA,EAAA,EAAK,KAAA,CAAM,KAAA,CAAM,OAAO;AAAA,EAAK,MAAM,KAAA,CAAM,KAAA,IAAS,EAAE,CAAA,CAAA,CAAG,IAAA,KAC1E,KAAA,EAAO;AAAA,OACZ,CAAA;AAAA,IACH,CAAC,CAAA;AAAA,EACH,CAAA,CAAA,MAAQ;AAAA,EAAC;AAET,EAAA,IAAI,IAAA,CAAK,QAAQ,eAAA,EAAiB;AAChC,IAAA,sBAAA,CAAuB,SAAS,CAAA;AAChC,IAAA,IAAI,CAAC,UAAU,cAAA,EAAgB;AAC7B,MAAA,qBAAA,CAAsB;AAAA,QACpB,SAAA;AAAA,QACA,UAAA,EAAY,CAAC,CAAA,KAAc;AACzB,UAAA,IAAI;AACF,YAAA,OAAO,IAAI,GAAA,CAAI,CAAA,EAAG,cAAA,CAAe,IAAI,CAAA,CAAE,IAAA;AAAA,UACzC,CAAA,CAAA,MAAQ;AACN,YAAA,OAAO,CAAA;AAAA,UACT;AAAA,QACF,CAAA;AAAA,QACA,WAAA;AAAA,QACA,cAAA;AAAA,QACA,gBAAA;AAAA,QACA,OAAO,IAAA,CAAK;AAAA,OACb,CAAA;AAAA,IACH;AAAA,EACF;AAEA,EAAA,MAAM,UAAUY,oBAAAA,CAAG,aAAA,CAAc,WAAW,EAAE,IAAA,EAAM,qBAAqB,CAAA;AACzE,EAAA,qBAAA,CAAsB,OAAO,CAAA;AAC7B,EAAA,4BAAA,CAA6B,OAAO,CAAA;AACpC,EAAA,oBAAA,CAAqB,OAAO,CAAA;AAE5B,EAAA,MAAM,EAAE,UAAA,EAAY,SAAA,EAAU,GAAI,kBAAA,CAAmB;AAAA,IACnD,OAAA;AAAA,IACA,WAAA;AAAA,IACA,SAAA,EAAW,KAAK,OAAA,CAAQ;AAAA,GACzB,CAAA;AAED,EAAA,MAAM,eAAe,kBAAA,CAAmB;AAAA,IACtC,SAAA;AAAA,IACA,aAAa,OAAA,CAAQ,IAAA;AAAA,IACrB,oBAAoB,cAAA,CAAe,IAAA;AAAA,IACnC,WAAA;AAAA,IACA,cAAA;AAAA,IACA,eAAe,IAAA,CAAK,aAAA;AAAA,IACpB,cAAA,EAAgB,IAAA,CAAK,OAAA,CAAQ,WAAA,GAAc,EAAA,GAAK,CAAA;AAAA,IAChD,KAAA,EAAO,CAAC,CAAA,KAAM;AACZ,MAAA,IAAI,CAAC,IAAA,CAAK,OAAA,CAAQ,WAAA,EAAa;AAC/B,MAAA,MAAA,CAAO,SAAS,CAAC,CAAA;AAAA,IACnB,CAAA;AAAA,IACA,OAAA,EAAS,CAAC,WAAA,EAAa,GAAA,KAAQ;AAC7B,MAAA,MAAM,CAAA,GAAI,GAAA;AACV,MAAA,MAAA,CAAO,OAAA,EAAS,CAAC,4BAAA,EAA8B,WAAA,EAAa,GAAG,OAAA,IAAW,MAAA,CAAO,CAAC,CAAC,CAAC,CAAA;AAAA,IACtF,CAAA;AAAA,IACA,iBAAA;AAAA,IACA,SAAA,EAAW,OAAO,GAAA,KAAgB;AAChC,MAAA,MAAM,IAAA,GAAO,MAAM,KAAA,CAAM,GAAA,EAAK;AAAA,QAC5B,GAAG,KAAK,OAAA,CAAQ,KAAA;AAAA,QAChB,OAAA,EAAS,KAAK,GAAA,CAAI,IAAA,CAAK,QAAQ,KAAA,CAAM,OAAA,IAAW,GAAA,EAAO,WAAA,EAAa,CAAA;AAAA,QACpE,iBAAA,EAAmB,KAAA;AAAA,QACnB,gBAAA,EAAkB;AAAA,OACnB,CAAA;AACD,MAAA,OAAO,MAAM,KAAK,QAAA,EAAS;AAAA,IAC7B,CAAA;AAAA,IACA,gBAAA,EAAkB,CAAC,IAAA,EAAc,QAAA,KAAqB;AACpD,MAAA,MAAM,SAAS,IAAIA,oBAAAA,CAAG,OAAO,IAAA,EAAM,EAAE,UAAU,CAAA;AAC/C,MAAA,MAAA,CAAO,aAAa,OAAA,EAAS,EAAE,OAAA,EAAS,IAAA,CAAK,eAAe,CAAA;AAAA,IAC9D,CAAA;AAAA,IACA,eAAA,EAAiB,OAAO,WAAA,EAAqB,mBAAA,KAAgC;AAC3E,MAAA,MAAM,GAAA,GAAM,MAAM,UAAA,CAAW,WAAA,EAAa,mBAAmB,CAAA;AAC7D,MAAA,MAAM,GAAA,CAAI,IAAA,CAAK,SAAA,CAAU,WAAW,CAAC,CAAA;AACrC,MAAA,MAAM,IAAI,QAAA,EAAS;AAAA,IACrB;AAAA,GACD,CAAA;AACD,EAAA,YAAA,CAAa,OAAA,EAAQ;AACrB,EAAA,MAAM,qBAAA,GAAwB,MAAM,YAAA,CAAa,qBAAA,EAAsB;AAEvE,EAAA,MAAM,eAAmC,EAAC;AAG1C,EAAA,MAAM,cAAA,GAAiB,KAAK,OAAA,CAAQ,MAAA,CAAO,CAAC,CAAA,KAAM,CAAC,EAAE,QAAQ,CAAA;AAC7D,EAAA,MAAM,uBAAuB,IAAA,CAAK,OAAA,CAAQ,OAAO,CAAC,CAAA,KAAM,EAAE,QAAQ,CAAA;AAElE,EAAA,KAAA,MAAW,KAAK,CAAC,GAAG,cAAA,EAAgB,GAAG,oBAAoB,CAAA,EAAG;AAC5D,IAAA,IAAI,WAAA,MAAiB,CAAA,EAAG;AACtB,MAAA,YAAA,CAAa,IAAA,CAAK;AAAA,QAChB,KAAA,EAAO,MAAA;AAAA,QACP,OAAA,EAAS,CAAA,kBAAA,EAAqB,IAAA,CAAK,aAAa,CAAA,yDAAA;AAAA,OACjD,CAAA;AACD,MAAA;AAAA,IACF;AAEA,IAAA,MAAM,SAAA,GAAY,EAAE,IAAA,KAAS,UAAA,GAAa,EAAE,GAAA,GAAM,CAAA,EAAG,KAAK,QAAQ,CAAA,OAAA,CAAA;AAClE,IAAA,IAAI;AACF,MAAA,IAAI,EAAE,QAAA,EAAU;AACd,QAAA,MAAM,UAAU,CAAA,CAAE,IAAA;AAClB,QAAA,MAAM,mBAAoBA,oBAAAA,CAAW,gBAAA;AACrC,QAAA,IAAI,CAAC,gBAAA,EAAkB;AACrB,UAAA,MAAM,IAAI,KAAA;AAAA,YACR;AAAA,WACF;AAAA,QACF;AACA,QAAA,MAAM,GAAA,GAAM,IAAI,gBAAA,CAAiB,OAAA,EAAS;AAAA,UACxC,OAAA;AAAA,UACA,UAAA,EAAY,SAAA;AAAA,UACZ,oBAAA,EAAsB,CAAC,IAAA,KAAc;AACnC,YAAA,IAAA,CAAK,GAAA,GAAM,SAAA;AAAA,UACb,CAAA;AAAA,UACA,uBAAA,EAAyB,OAAO,IAAA,KAAiB;AAC/C,YAAA,MAAM,KAAA,GAAQ,MAAM,UAAA,CAAW,IAAA,EAAM,SAAS,CAAA;AAC9C,YAAA,MAAM,KAAA,CAAM,IAAA,CAAK,SAAA,CAAU,SAAS,CAAC,CAAA;AACrC,YAAA,MAAM,MAAM,QAAA,EAAS;AACrB,YAAA,OAAO,KAAA;AAAA,UACT;AAAA,SACD,CAAA;AAED,QAAA,MAAM,QAAA,GAAW,CAAC,KAAA,KAChB,KAAA,CAAM,aAAa,CAAA,CAAE,KAAK,MAAM;AAC9B,UAAA,MAAM,IAAI,KAAA,CAAM,CAAA,qCAAA,EAAwC,KAAK,CAAA,CAAE,CAAA;AAAA,QACjE,CAAC,CAAA;AAEH,QAAA,MAAM,KAAA,GAAQ,GAAA,CAAI,IAAA,CAAK,SAAA,CAAU,SAAS,CAAC,CAAA;AAC3C,QAAA,IAAI;AACF,UAAA,MAAM,QAAQ,IAAA,CAAK,CAAC,OAAO,QAAA,CAAS,aAAa,CAAC,CAAC,CAAA;AAAA,QACrD,SAAS,CAAA,EAAG;AACV,UAAA,KAAM,KAAA,CAAc,QAAQ,MAAM;AAAA,UAAC,CAAC,CAAA;AACpC,UAAA,MAAM,CAAA;AAAA,QACR;AAEA,QAAA,MAAM,KAAA,GAAQ,IAAI,QAAA,EAAS;AAC3B,QAAA,IAAI;AACF,UAAA,MAAM,QAAQ,IAAA,CAAK,CAAC,OAAc,QAAA,CAAS,iBAAiB,CAAC,CAAC,CAAA;AAAA,QAChE,SAAS,CAAA,EAAG;AACV,UAAA,KAAM,KAAA,CAAc,QAAQ,MAAM;AAAA,UAAC,CAAC,CAAA;AACpC,UAAA,MAAM,CAAA;AAAA,QACR;AAAA,MACF,CAAA,MAAO;AACL,QAAA,MAAM,MAAA,GAAS,IAAIA,oBAAAA,CAAG,MAAA,CAAO,EAAE,IAAA,EAAM,EAAE,QAAA,EAAU,SAAA,EAAW,CAAA;AAC5D,QAAA,MAAA,CAAO,aAAa,OAAA,EAAS,EAAE,OAAA,EAAS,IAAA,CAAK,eAAe,CAAA;AAAA,MAC9D;AAAA,IACF,SAAS,GAAA,EAAK;AACZ,MAAA,MAAM,CAAA,GAAI,GAAA;AACV,MAAA,YAAA,CAAa,IAAA,CAAK;AAAA,QAChB,KAAA,EAAO,QAAA;AAAA,QACP,SAAA,EAAW,CAAA,CAAE,IAAA,KAAS,UAAA,GAAa,EAAE,GAAA,GAAM,MAAA;AAAA,QAC3C,OAAA,EAAS,CAAA,CAAE,OAAA,IAAW,MAAA,CAAO,CAAC,CAAA;AAAA,QAC9B,OAAO,CAAA,CAAE;AAAA,OACV,CAAA;AAAA,IACH;AAAA,EACF;AAGA,EAAA,IAAI;AACF,IAAA,mBAAA,CAAoB,SAAS,IAAA,CAAK,GAAA,CAAI,EAAA,EAAI,WAAA,EAAa,CAAC,CAAA;AAAA,EAC1D,CAAA,CAAA,MAAQ;AAAA,EAER;AAEA,EAAA,MAAM,MAAA,GAAS,MAAM,aAAA,CAAc;AAAA,IACjC,QAAA,EACE,KAAK,OAAA,CAAQ,YAAA,KAAiB,aAAa,OAAO,SAAA,CAAU,KAAA,KAAU,UAAA,GAClE,SAAA,GACA,aAAA;AAAA,IACN,YAAY,IAAA,CAAK,QAAA;AAAA,IACjB,UAAA,EAAY,KAAK,OAAA,CAAQ,QAAA;AAAA,IACzB,cAAA,EAAgB,KAAK,OAAA,CAAQ,YAAA;AAAA,IAC7B,KAAA;AAAA,IACA,GAAA,EAAK,MAAM,IAAA,CAAK,GAAA,EAAI;AAAA,IACpB,iBAAA,EAAmB,MAAM,SAAA,CAAU,iBAAA,EAAkB;AAAA,IACrD,qBAAA;AAAA,IACA,sBAAA,EAAwB,MAAM,QAAA,CAAS,sBAAA;AAAuB,GAC/D,CAAA;AAED,EAAA,IACE,MAAA,CAAO,YACP,IAAA,CAAK,OAAA,CAAQ,iBAAiB,aAAA,IAC9B,OAAO,SAAA,CAAU,KAAA,KAAU,UAAA,EAC3B;AACA,IAAA,YAAA,CAAa,IAAA,CAAK;AAAA,MAChB,KAAA,EAAO,MAAA;AAAA,MACP,OAAA,EAAS,CAAA,kBAAA,EAAqB,IAAA,CAAK,aAAa,CAAA,0DAAA;AAAA,KACjD,CAAA;AAAA,EACH;AAEA,EAAA,MAAM,QAAA,GAAW,QAAA,CAAS,eAAA,EAAiB,SAAA,IAAa,EAAA;AAExD,EAAA,IAAI,IAAA,CAAK,QAAQ,WAAA,EAAa;AAC5B,IAAA,IAAI;AACF,MAAA,eAAA,CAAgB,WAAW,CAAC,CAAA,KAAM,MAAA,CAAO,OAAA,EAAS,CAAC,CAAC,CAAA;AAAA,IACtD,CAAA,CAAA,MAAQ;AAAA,IAAC;AAAA,EACX;AAEA,EAAA,QAAA,CAAS,OAAA,EAAQ;AAEjB,EAAA,OAAO,EAAE,QAAA,EAAU,cAAA,EAAgB,YAAA,EAAc,YAAA,EAAa;AAChE;;;AC/XA,SAAS,uBAAuB,IAAA,EAA8B;AAC5D,EAAA,IAAI,CAAC,MAAM,OAAO,IAAA;AAClB,EAAA,MAAM,CAAA,GAAI,IAAA,CAAK,IAAA,EAAK,CAAE,WAAA,EAAY;AAClC,EAAA,IAAI,CAAA,KAAM,IAAI,OAAO,IAAA;AACrB,EAAA,IAAI,CAAA,KAAM,mBAAmB,OAAO,IAAA;AACpC,EAAA,IAAI,CAAA,KAAM,0BAA0B,OAAO,IAAA;AAC3C,EAAA,IAAI,CAAA,KAAM,0BAA0B,OAAO,IAAA;AAC3C,EAAA,IAAI,CAAA,KAAM,mBAAmB,OAAO,IAAA;AACpC,EAAA,OAAO,KAAA;AACT;AAEA,SAAS,eAAe,IAAA,EAA8B;AACpD,EAAA,OAAA,CAAQ,IAAA,IAAQ,EAAA,EAAI,IAAA,EAAK,CAAE,aAAY,KAAM,QAAA;AAC/C;AAIA,eAAsB,uBAAA,CACpB,IAAA,EACA,QAAA,EACA,IAAA,EACA,UAAqB,KAAA,EACiD;AACtE,EAAA,MAAM,SAA6B,EAAC;AACpC,EAAA,MAAM,UAA8B,EAAC;AAErC,EAAA,IAAI,CAAC,IAAA,CAAK,cAAA,EAAgB,OAAO,EAAE,SAAS,MAAA,EAAO;AAEnD,EAAA,MAAM,GAAA,GAAM,SAAA,CAAU,IAAA,EAAM,QAAQ,CAAA;AACpC,EAAA,MAAM,WAAW,GAAA,CAAI,aAAA,CAAc,YAAY,CAAA,EAAG,YAAA,CAAa,MAAM,CAAA,IAAK,IAAA;AAC1E,EAAA,MAAM,UAAU,QAAA,GAAW,IAAI,IAAI,QAAA,EAAU,QAAQ,EAAE,IAAA,GAAO,QAAA;AAE9D,EAAA,MAAM,YAAY,KAAA,CAAM,IAAA,CAAK,GAAA,CAAI,gBAAA,CAAiB,QAAQ,CAAC,CAAA;AAC3D,EAAA,KAAA,MAAW,MAAM,SAAA,CAAU,KAAA,CAAM,CAAA,EAAG,IAAA,CAAK,UAAU,CAAA,EAAG;AACpD,IAAA,MAAM,IAAA,GAAO,EAAA,CAAG,YAAA,CAAa,MAAM,CAAA;AACnC,IAAA,MAAM,QAAA,GAAW,eAAe,IAAI,CAAA;AACpC,IAAA,IAAI,CAAC,QAAA,IAAY,CAAC,sBAAA,CAAuB,IAAI,CAAA,EAAG;AAEhD,IAAA,MAAM,GAAA,GAAM,EAAA,CAAG,YAAA,CAAa,KAAK,CAAA;AACjC,IAAA,IAAI,GAAA,EAAK;AACP,MAAA,MAAM,SAAA,GAAY,IAAI,GAAA,CAAI,GAAA,EAAK,OAAO,CAAA,CAAE,IAAA;AACxC,MAAA,IAAI;AACF,QAAA,MAAM,GAAA,GAAM,MAAM,OAAA,CAAQ,SAAA,EAAW;AAAA,UACnC,GAAG,IAAA,CAAK,KAAA;AAAA,UACR,iBAAA,EAAmB,KAAA;AAAA,UACnB,gBAAA,EAAkB;AAAA,SACnB,CAAA;AACD,QAAA,MAAMC,KAAAA,GAAO,MAAM,GAAA,CAAI,QAAA,EAAS;AAChC,QAAA,OAAA,CAAQ,IAAA,CAAK,EAAE,IAAA,EAAM,UAAA,EAAY,KAAK,SAAA,EAAW,IAAA,EAAAA,KAAAA,EAAM,QAAA,EAAU,CAAA;AAAA,MACnE,SAAS,GAAA,EAAK;AACZ,QAAA,MAAM,CAAA,GAAI,GAAA;AACV,QAAA,MAAA,CAAO,IAAA,CAAK;AAAA,UACV,KAAA,EAAO,QAAA;AAAA,UACP,SAAA;AAAA,UACA,SAAS,CAAA,iCAAA,EAAoC,CAAA,CAAE,OAAA,IAAW,MAAA,CAAO,CAAC,CAAC,CAAA,CAAA;AAAA,UACnE,OAAO,CAAA,CAAE;AAAA,SACV,CAAA;AAAA,MACH;AACA,MAAA;AAAA,IACF;AAEA,IAAA,MAAM,IAAA,GAAO,GAAG,WAAA,IAAe,EAAA;AAC/B,IAAA,IAAI,IAAA,CAAK,IAAA,EAAK,CAAE,MAAA,KAAW,CAAA,EAAG;AAC9B,IAAA,OAAA,CAAQ,KAAK,EAAE,IAAA,EAAM,QAAA,EAAU,IAAA,EAAM,UAAU,CAAA;AAAA,EACjD;AAEA,EAAA,OAAO,EAAE,SAAS,MAAA,EAAO;AAC3B;;;AClEA,IAAM,UAAA,GACJ,OAAO,UAAA,CAAW,KAAA,KAAU,aAAa,UAAA,CAAW,KAAA,CAAM,IAAA,CAAK,UAAU,CAAA,GAAI,MAAA;AAkB/E,eAAsB,KAAA,CAAM,KAAmB,IAAA,EAAwC;AACrF,EAAA,MAAM,KAAA,GAAQ,KAAK,GAAA,EAAI;AACvB,EAAA,MAAM,OAAA,GAAU,cAAc,IAAI,CAAA;AAClC,EAAA,MAAM,aAAA,GAAgB,IAAA,CAAK,GAAA,CAAI,OAAA,CAAQ,SAAS,GAAI,CAAA;AACpD,EAAA,MAAM,WAAW,KAAA,GAAQ,aAAA;AAEzB,EAAA,IAAI,CAAC,eAAc,EAAG;AACpB,IAAA,MAAM,IAAI,sBAAsB,oCAAoC,CAAA;AAAA,EACtE;AAGA,EAAA,MAAM,GAAA,GAAM,MAAM,KAAA,CAAM,MAAA,CAAO,GAAG,CAAA,EAAG;AAAA,IACnC,GAAG,OAAA,CAAQ,KAAA;AAAA,IACX,SAAS,IAAA,CAAK,GAAA,CAAI,QAAQ,KAAA,CAAM,OAAA,IAAW,KAAO,aAAa,CAAA;AAAA,IAC/D,iBAAA,EAAmB,KAAA;AAAA,IACnB,gBAAA,EAAkB;AAAA,GACnB,CAAA;AACD,EAAA,MAAM,IAAA,GAAO,MAAM,GAAA,CAAI,QAAA,EAAS;AAChC,EAAA,MAAM,WAAW,GAAA,CAAI,QAAA;AAErB,EAAA,MAAM,EAAE,SAAS,MAAA,EAAQ,SAAA,KAAc,MAAM,uBAAA,CAAwB,IAAA,EAAM,QAAA,EAAU,OAAO,CAAA;AAG5F,EAAA,IAAI,QAAA,GAAW,EAAA;AACf,EAAA,IAAI,iBAAsC,EAAC;AAC3C,EAAA,IAAI,eAAmC,EAAC;AAExC,EAAA,MAAM,CAAA,GAAI,MAAM,WAAA,CAAY;AAAA,IAC1B,QAAA;AAAA,IACA,IAAA;AAAA,IACA,OAAA;AAAA,IACA,OAAA;AAAA,IACA,aAAA;AAAA,IACA,QAAA;AAAA,IACA,SAAA,EAAW;AAAA,GACZ,CAAA;AACD,EAAA,QAAA,GAAW,CAAA,CAAE,QAAA;AACb,EAAA,cAAA,GAAiB,CAAA,CAAE,cAAA;AACnB,EAAA,YAAA,GAAe,CAAA,CAAE,YAAA;AAEjB,EAAA,MAAM,GAAA,GAAM,KAAK,GAAA,EAAI;AACrB,EAAA,OAAO;AAAA,IACL,GAAA,EAAK,QAAA;AAAA,IACL,IAAA,EAAM,QAAA;AAAA,IACN,OAAA,EAAS,cAAA;AAAA,IACT,MAAA,EAAQ,CAAC,GAAG,SAAA,EAAW,GAAG,YAAY,CAAA;AAAA,IACtC,MAAA,EAAQ;AAAA,MACN,KAAA;AAAA,MACA,GAAA;AAAA,MACA,UAAU,GAAA,GAAM;AAAA;AAClB,GACF;AACF","file":"index.cjs","sourcesContent":["/**\n * Content quality assessment.\n *\n * @remarks\n * Analyzes extracted content to provide quality metrics.\n *\n * @packageDocumentation\n */\n\nimport type { ContentQuality, ExtractedContent } from './types.js';\n\n/**\n * Calculate word count from text.\n *\n * @param text - Text to count words in\n * @returns Number of words\n */\nexport function countWords(text: string): number {\n // Remove extra whitespace and split on word boundaries\n const words = text.trim().split(/\\s+/).filter(Boolean);\n return words.length;\n}\n\n/**\n * Calculate reading time in minutes.\n *\n * @remarks\n * Uses average reading speed of 200 words per minute.\n *\n * @param wordCount - Number of words\n * @returns Estimated reading time in minutes\n */\nexport function calculateReadingTime(wordCount: number): number {\n const wordsPerMinute = 200;\n const minutes = wordCount / wordsPerMinute;\n return Math.max(1, Math.round(minutes));\n}\n\n/**\n * Count paragraphs in HTML content.\n *\n * @param html - HTML content\n * @returns Number of paragraph tags\n */\nfunction countParagraphs(html: string): number {\n const matches = html.match(/<p[^>]*>/gi);\n return matches ? matches.length : 0;\n}\n\n/**\n * Count images in HTML content.\n *\n * @param html - HTML content\n * @returns Number of image tags\n */\nfunction countImages(html: string): number {\n const matches = html.match(/<img[^>]*>/gi);\n return matches ? matches.length : 0;\n}\n\n/**\n * Count links in HTML content.\n *\n * @param html - HTML content\n * @returns Number of anchor tags\n */\nfunction countLinks(html: string): number {\n const matches = html.match(/<a[^>]*>/gi);\n return matches ? matches.length : 0;\n}\n\n/**\n * Calculate link density.\n *\n * @remarks\n * Ratio of link text to total text. Lower is generally better for articles.\n *\n * @param html - HTML content\n * @param textContent - Plain text content\n * @returns Link density (0-1)\n */\nfunction calculateLinkDensity(html: string, textContent: string): number {\n // Extract all link text\n const linkMatches = html.match(/<a[^>]*>(.*?)<\\/a>/gi);\n if (!linkMatches) {\n return 0;\n }\n\n const linkText = linkMatches.map((match) => match.replace(/<[^>]*>/g, '')).join(' ');\n\n const linkLength = linkText.length;\n const totalLength = textContent.length;\n\n if (totalLength === 0) {\n return 0;\n }\n\n return Math.min(1, linkLength / totalLength);\n}\n\n/**\n * Calculate average words per sentence.\n *\n * @param text - Text content\n * @returns Average words per sentence\n */\nfunction calculateAvgWordsPerSentence(text: string): number {\n // Split on sentence boundaries (., !, ?)\n const sentences = text.split(/[.!?]+/).filter((s) => s.trim().length > 0);\n\n if (sentences.length === 0) {\n return 0;\n }\n\n const totalWords = countWords(text);\n return Math.round(totalWords / sentences.length);\n}\n\n/**\n * Calculate quality score.\n *\n * @remarks\n * Composite score based on multiple factors:\n * - Length (longer is better, up to a point)\n * - Link density (lower is better)\n * - Paragraph count (more is better)\n * - Images (some is good, too many is bad)\n *\n * @param metrics - Quality metrics\n * @returns Score from 0-100\n */\nfunction calculateQualityScore(metrics: Omit<ContentQuality, 'qualityScore'>): number {\n let score = 0;\n\n // Length score (0-30 points)\n // Optimal: 1000-5000 words\n if (metrics.wordCount >= 1000 && metrics.wordCount <= 5000) {\n score += 30;\n } else if (metrics.wordCount >= 500 && metrics.wordCount < 1000) {\n score += 20;\n } else if (metrics.wordCount < 500) {\n score += 10;\n } else {\n score += 15; // Very long articles\n }\n\n // Link density score (0-25 points)\n // Lower is better for articles\n if (metrics.linkDensity < 0.1) {\n score += 25;\n } else if (metrics.linkDensity < 0.2) {\n score += 15;\n } else if (metrics.linkDensity < 0.3) {\n score += 5;\n }\n\n // Paragraph score (0-20 points)\n if (metrics.paragraphCount >= 10) {\n score += 20;\n } else if (metrics.paragraphCount >= 5) {\n score += 15;\n } else if (metrics.paragraphCount >= 3) {\n score += 10;\n }\n\n // Image score (0-15 points)\n // Some images are good, too many is suspicious\n if (metrics.imageCount >= 1 && metrics.imageCount <= 10) {\n score += 15;\n } else if (metrics.imageCount === 0) {\n score += 10;\n } else {\n score += 5;\n }\n\n // Readability score (0-10 points)\n // Optimal: 15-20 words per sentence\n if (metrics.avgWordsPerSentence >= 15 && metrics.avgWordsPerSentence <= 25) {\n score += 10;\n } else if (metrics.avgWordsPerSentence >= 10 && metrics.avgWordsPerSentence <= 30) {\n score += 5;\n }\n\n return Math.min(100, score);\n}\n\n/**\n * Assess content quality.\n *\n * @remarks\n * Analyzes extracted content and returns comprehensive quality metrics.\n *\n * @param content - Extracted content\n * @returns Quality assessment\n *\n * @example\n * ```typescript\n * const content = extractContent(html);\n * if (content.success) {\n * const quality = assessContentQuality(content);\n * console.log(`Quality score: ${quality.qualityScore}/100`);\n * console.log(`Reading time: ${quality.readingTime} minutes`);\n * }\n * ```\n */\nexport function assessContentQuality(content: ExtractedContent): ContentQuality {\n const wordCount = countWords(content.textContent);\n const charCount = content.textContent.length;\n const readingTime = calculateReadingTime(wordCount);\n const avgWordsPerSentence = calculateAvgWordsPerSentence(content.textContent);\n const paragraphCount = countParagraphs(content.content);\n const imageCount = countImages(content.content);\n const linkCount = countLinks(content.content);\n const linkDensity = calculateLinkDensity(content.content, content.textContent);\n\n const metrics = {\n wordCount,\n charCount,\n readingTime,\n avgWordsPerSentence,\n paragraphCount,\n imageCount,\n linkCount,\n linkDensity,\n };\n\n const qualityScore = calculateQualityScore(metrics);\n\n return {\n ...metrics,\n qualityScore,\n };\n}\n","/**\n * Mozilla Readability wrapper with linkedom.\n *\n * @remarks\n * Provides a clean interface to Mozilla Readability using linkedom as the DOM implementation.\n *\n * @packageDocumentation\n */\n\nimport { Readability } from '@mozilla/readability';\nimport type { ContentExtractionOptions } from './types.js';\n\n/**\n * Readability result from Mozilla's library.\n */\nexport interface ReadabilityResult {\n title: string;\n content: string;\n textContent: string;\n excerpt: string;\n byline: string | null;\n siteName: string | null;\n lang: string | null;\n dir: string | null;\n publishedTime: string | null;\n length: number;\n}\n\n/**\n * Check if HTML content is probably readerable.\n *\n * @remarks\n * Quick check to determine if content extraction is likely to succeed.\n * This is a heuristic check and may produce false positives/negatives.\n *\n * @param doc - Pre-parsed Document to check\n * @param options - Readability check options\n * @returns True if content appears to be an article\n *\n * @example\n * ```typescript\n * import { parseHTML } from '../utils/html-parser.js';\n *\n * const doc = parseHTML(html);\n * if (isProbablyReaderable(doc)) {\n * const result = extractContent(doc);\n * }\n * ```\n */\nexport function isProbablyReaderable(\n doc: Document,\n options?: {\n minContentLength?: number;\n minScore?: number;\n },\n): boolean {\n try {\n // Simple heuristic: check for common article indicators\n const hasArticleTag = !!doc.querySelector('article');\n const hasMainTag = !!doc.querySelector('main');\n const hasContentDivs = doc.querySelectorAll('div.content, div.article, div.post').length > 0;\n const hasParagraphs = doc.querySelectorAll('p').length >= 3;\n\n // Calculate rough content length\n const textContent = doc.textContent || '';\n const contentLength = textContent.trim().length;\n const minLength = options?.minContentLength || 140;\n\n return (\n contentLength >= minLength && (hasArticleTag || hasMainTag || hasContentDivs || hasParagraphs)\n );\n } catch {\n return false;\n }\n}\n\n/**\n * Extract article content using Mozilla Readability.\n *\n * @remarks\n * Runs Readability extraction on a pre-parsed Document.\n * The original document is not modified (uses cloned document).\n *\n * @param doc - Pre-parsed Document to extract from\n * @param options - Extraction options\n * @returns Readability result or null if extraction failed\n *\n * @example\n * ```typescript\n * import { parseHTML } from '../utils/html-parser.js';\n * import { extractSEO } from '../metadata/index.js';\n *\n * const doc = parseHTML(html);\n * const metadata = extractSEO(doc);\n * const content = extractWithReadability(doc, { baseUrl: 'https://example.com' });\n *\n * if (content) {\n * console.log(content.title);\n * console.log(content.textContent);\n * }\n * ```\n */\nexport function extractWithReadability(\n doc: Document,\n options: ContentExtractionOptions = {},\n): ReadabilityResult | null {\n // Clone document to avoid mutations\n const documentClone = doc.cloneNode(true) as Document;\n\n // Create Readability instance with options\n const reader = new Readability(documentClone, {\n debug: options.debug || false,\n charThreshold: options.charThreshold || 500,\n maxElemsToParse: options.maxElemsToParse || 0,\n keepClasses: options.keepClasses || false,\n classesToPreserve: options.classesToPreserve || [],\n disableJSONLD: options.disableJSONLD || false,\n });\n\n // Parse and return result\n const article = reader.parse();\n\n if (!article) {\n return null;\n }\n\n return {\n title: article.title || '',\n content: article.content || '',\n textContent: article.textContent || '',\n excerpt: article.excerpt || '',\n byline: article.byline || null,\n siteName: article.siteName || null,\n lang: article.lang || null,\n dir: article.dir || null,\n publishedTime: article.publishedTime || null,\n length: article.length || 0,\n };\n}\n","/**\n * Main content extraction module.\n *\n * @remarks\n * Extracts article content from HTML using Mozilla Readability.\n * Never throws exceptions - always returns a ContentResult.\n *\n * @packageDocumentation\n */\n\nimport { calculateReadingTime } from './quality.js';\nimport { extractWithReadability, isProbablyReaderable } from './readability.js';\nimport type {\n ContentExtractionOptions,\n ContentResult,\n ExtractedContent,\n ExtractionErrorType,\n ExtractionFailure,\n} from './types.js';\n\n/**\n * Count words in text.\n *\n * @param text - Text to count words in\n * @returns Number of words\n */\nfunction countWords(text: string): number {\n const words = text.trim().split(/\\s+/).filter(Boolean);\n return words.length;\n}\n\n/**\n * Create an extraction failure result.\n *\n * @param errorType - Type of error\n * @param error - Error message\n * @param readerable - Whether content passed readability check\n * @param extractionTime - Time spent attempting extraction\n * @param details - Additional error details\n * @returns Extraction failure object\n */\nfunction createFailure(\n errorType: ExtractionErrorType,\n error: string,\n readerable: boolean,\n extractionTime: number,\n details?: unknown,\n): ExtractionFailure {\n const result: ExtractionFailure = {\n success: false,\n error,\n errorType,\n readerable,\n extractionTime,\n };\n\n if (details !== undefined) {\n result.details = details;\n }\n\n return result;\n}\n\n/**\n * Extract article content from HTML.\n *\n * @remarks\n * Uses Mozilla Readability to extract clean article content from a pre-parsed Document.\n * This function never throws exceptions - always returns a ContentResult.\n *\n * Error handling:\n * - Returns success: false for any extraction failure\n * - Categorizes errors by type for better handling\n * - Includes extraction time even for failures\n *\n * @param doc - Pre-parsed Document to extract content from\n * @param options - Extraction options\n * @returns Extraction result (success or failure)\n *\n * @example\n * ```typescript\n * import { parseHTML } from '../utils/html-parser.js';\n * import { extractSEO } from '../metadata/index.js';\n *\n * const doc = parseHTML(html);\n * const metadata = extractSEO(doc);\n * const content = extractContent(doc, {\n * baseUrl: 'https://example.com/article',\n * charThreshold: 300,\n * checkReadability: true,\n * });\n *\n * if (content.success) {\n * console.log(content.title);\n * console.log(content.wordCount);\n * console.log(`${content.readingTime} min read`);\n * } else {\n * console.error(content.error);\n * }\n * ```\n */\nexport function extractContent(\n doc: Document,\n options: ContentExtractionOptions = {},\n): ContentResult {\n const startTime = Date.now();\n\n // Validate input\n if (!doc || typeof doc !== 'object' || !doc.documentElement) {\n return createFailure(\n 'INVALID_HTML',\n 'Input must be a valid Document object',\n false,\n Date.now() - startTime,\n );\n }\n\n // Check readability if requested\n let readerable = false;\n if (options.checkReadability) {\n try {\n readerable = isProbablyReaderable(doc);\n if (!readerable) {\n return createFailure(\n 'NOT_READERABLE',\n 'Content does not appear to be a readable article',\n false,\n Date.now() - startTime,\n );\n }\n } catch (error) {\n // Readability check failed, but continue anyway\n if (options.debug) {\n console.warn('Readability check failed:', error);\n }\n }\n }\n\n // Extract content with Readability\n let article: ReturnType<typeof extractWithReadability> | null;\n try {\n article = extractWithReadability(doc, options);\n } catch (error) {\n const errorMessage = error instanceof Error ? error.message : String(error);\n return createFailure(\n 'PARSE_ERROR',\n `Failed to parse HTML: ${errorMessage}`,\n readerable,\n Date.now() - startTime,\n error,\n );\n }\n\n // Check if extraction succeeded\n if (!article) {\n return createFailure(\n 'EXTRACTION_FAILED',\n 'Readability could not extract content from this page',\n readerable,\n Date.now() - startTime,\n );\n }\n\n // Check if content meets minimum requirements\n if (!article.title && !article.textContent) {\n return createFailure(\n 'EXTRACTION_FAILED',\n 'Extracted content has no title or text',\n readerable,\n Date.now() - startTime,\n );\n }\n\n // Calculate metrics\n const wordCount = countWords(article.textContent);\n const readingTime = calculateReadingTime(wordCount);\n\n // Build success result\n const result: ExtractedContent = {\n success: true,\n title: article.title,\n content: article.content,\n textContent: article.textContent,\n excerpt: article.excerpt,\n length: article.length,\n wordCount,\n readingTime,\n readerable: readerable || true, // If we got here, it was readable enough\n extractionTime: Date.now() - startTime,\n };\n\n // Add optional fields if present\n if (article.byline) {\n result.byline = article.byline;\n }\n if (article.siteName) {\n result.siteName = article.siteName;\n }\n if (article.lang) {\n result.lang = article.lang;\n }\n if (article.dir) {\n result.dir = article.dir as 'ltr' | 'rtl';\n }\n if (article.publishedTime) {\n result.publishedTime = article.publishedTime;\n }\n\n return result;\n}\n","/**\n * HTML to text conversion.\n *\n * @remarks\n * Convert HTML to plain text using a zero-dependency streaming tokenizer.\n * Pure, deterministic transformation suitable for logs, previews, classification,\n * and search indexing. Preserves essential structure by inserting newlines at\n * block boundaries, handles entities, and provides configurable options.\n *\n * @packageDocumentation\n */\n\nimport type { HtmlToTextOptions } from './types.js';\n\n/**\n * Convert an HTML string to plain text.\n *\n * @remarks\n * This function uses a streaming tokenizer to parse HTML and extract text content.\n * It handles block elements, whitespace preservation, HTML entities, tables, and more.\n *\n * Features:\n * - Preserves document structure with appropriate line breaks\n * - Handles HTML entities (numeric and common named entities)\n * - Configurable link and image handling\n * - Table rendering with configurable cell separators\n * - Whitespace preservation for code/pre blocks\n * - Optional hard-wrapping at column width\n *\n * @param html - HTML string (fragment or full document)\n * @param options - Conversion options\n * @returns Plain text string\n *\n * @throws {TypeError} If html is not a string\n *\n * @example\n * ```typescript\n * const html = '<div><h1>Hello</h1><p>World!</p></div>';\n * const text = htmlToText(html);\n * console.log(text); // \"Hello\\n\\nWorld!\"\n * ```\n *\n * @example\n * ```typescript\n * const html = '<a href=\"https://example.com\">Visit</a>';\n * const text = htmlToText(html, { links: 'inline' });\n * console.log(text); // \"Visit (https://example.com)\"\n * ```\n */\nexport function htmlToText(html: string, options: HtmlToTextOptions = {}): string {\n if (typeof html !== 'string') {\n throw new TypeError('Expected html to be a string');\n }\n\n const settings = normalizeOptions(options);\n\n // Fast path: empty input\n if (html.length === 0) {\n return '';\n }\n\n // Sets and constants for classification\n const preservedTagSet = toSet(settings.preserveTags);\n const excludedTagSet = toSet(\n settings.excludeTags.concat(settings.mode === 'document' ? ['head'] : []),\n );\n const blockTagSet = BLOCK_TAG_SET;\n\n // Table state\n let insideTable = 0;\n let cellBuffer: string[] = [];\n const cellSep = settings.tableCellSeparator === 'tab' ? '\\t' : ' ';\n\n // Stack state\n const tagStack: string[] = [];\n let preserveWhitespace = false;\n let excludeDepth = 0;\n\n // Link/image context\n let currentAnchorHref: string | null = null;\n let inAnchor = false;\n let anchorHasText = false;\n\n // Output buffer\n const out: string[] = [];\n\n // Simple streaming tokenizer\n const length = html.length;\n let i = 0;\n\n while (i < length) {\n const ch = html.charCodeAt(i);\n\n if (ch === 60 /* < */) {\n // Parse tag\n const tagStart = i;\n const end = html.indexOf('>', tagStart + 1);\n\n if (end === -1) {\n // Malformed tail: treat as text\n emitText(html.slice(i), out, settings, preserveWhitespace);\n break;\n }\n\n const rawTag = html.slice(tagStart + 1, end);\n i = end + 1;\n\n const isClosing = rawTag[0] === '/';\n const tagBody = isClosing ? rawTag.slice(1) : rawTag;\n const spaceIdx = indexOfSpace(tagBody);\n let tagName = (spaceIdx === -1 ? tagBody : tagBody.slice(0, spaceIdx)).toLowerCase();\n\n // Remove trailing slash for self-closing tags without space (e.g., <br/>)\n if (tagName.endsWith('/')) {\n tagName = tagName.slice(0, -1);\n }\n\n if (isClosing) {\n // Closing tag\n handleTagClose(tagName);\n } else {\n // Opening or self-closing tag\n const selfClosing = rawTag.endsWith('/') || SELF_CLOSING_TAG_SET.has(tagName);\n const attrs = spaceIdx === -1 ? '' : tagBody.slice(spaceIdx + 1);\n handleTagOpen(tagName, attrs, selfClosing);\n }\n continue;\n }\n\n // Text node\n const nextTag = html.indexOf('<', i);\n const text = nextTag === -1 ? html.slice(i) : html.slice(i, nextTag);\n i = nextTag === -1 ? length : nextTag;\n\n if (excludeDepth > 0) {\n continue;\n }\n\n if (insideTable > 0) {\n // Accumulate raw text for the current cell\n cellBuffer.push(text);\n } else {\n // Track if anchor has text before potentially suppressing it\n if (inAnchor && /\\S/.test(text)) {\n anchorHasText = true;\n }\n\n // Suppress text content when inside a link that should be removed\n const shouldSuppressText = inAnchor && settings.links === 'remove';\n if (!shouldSuppressText) {\n emitText(text, out, settings, preserveWhitespace);\n }\n }\n }\n\n let result = out.join('');\n\n // Capture leading/trailing whitespace before collapse (for trim: false)\n const leadingMatch = result.match(/^(\\s*)/);\n const trailingMatch = result.match(/(\\s*)$/);\n const leadingWs = leadingMatch ? leadingMatch[1] : '';\n const trailingWs = trailingMatch ? trailingMatch[1] : '';\n\n if (settings.collapseWhitespace) {\n result = collapseWhitespace(result, settings.maxNewlines, settings.trim);\n }\n\n if (settings.wrap != null && settings.wrap > 0) {\n result = hardWrap(result, settings.wrap);\n }\n\n // Remove preserve markers (they were used during collapse and wrap)\n result = result.replace(new RegExp(PRESERVE_OPEN, 'g'), '');\n result = result.replace(new RegExp(PRESERVE_CLOSE, 'g'), '');\n\n if (settings.trim) {\n result = result.trim();\n } else if (settings.collapseWhitespace && (leadingWs || trailingWs)) {\n // Restore some whitespace when trim: false but collapse removed it\n // At least preserve one space if there was any leading/trailing whitespace\n if (leadingWs && !result.startsWith(' ') && !result.startsWith('\\n')) {\n result = ` ${result}`;\n }\n if (trailingWs && !result.endsWith(' ') && !result.endsWith('\\n')) {\n result = `${result} `;\n }\n }\n\n return result;\n\n // --- Helper functions ---\n\n function pushTag(name: string): void {\n tagStack.push(name);\n if (preservedTagSet.has(name)) {\n preserveWhitespace = true;\n }\n if (excludedTagSet.has(name)) {\n excludeDepth += 1;\n }\n if (name === 'table') {\n insideTable += 1;\n }\n }\n\n function popTag(name: string): void {\n // Pop until matching name (best-effort against malformed HTML)\n for (let idx = tagStack.length - 1; idx >= 0; idx -= 1) {\n const t = tagStack[idx];\n tagStack.length = idx;\n\n if (preservedTagSet.has(t)) {\n preserveWhitespace = false;\n }\n if (excludedTagSet.has(t)) {\n excludeDepth = Math.max(0, excludeDepth - 1);\n }\n if (t === 'table') {\n insideTable = Math.max(0, insideTable - 1);\n }\n if (t === name) {\n break;\n }\n }\n }\n\n function handleTagOpen(tagName: string, attrs: string, selfClosing: boolean): void {\n if (excludedTagSet.has(tagName)) {\n pushTag(tagName);\n return;\n }\n\n if (tagName === 'br') {\n out.push('\\n');\n return;\n }\n\n if (tagName === 'a') {\n currentAnchorHref = extractAttr(attrs, 'href');\n inAnchor = true;\n anchorHasText = false;\n pushTag(tagName);\n if (selfClosing) {\n handleTagClose(tagName);\n }\n return;\n }\n\n if (tagName === 'img') {\n if (settings.images === 'alt') {\n const alt = extractAttr(attrs, 'alt');\n if (alt) {\n emitText(alt, out, settings, true);\n }\n }\n // If we are between anchors, keep a separating space to avoid collapsing words\n if (inAnchor) {\n out.push(' ');\n }\n return;\n }\n\n if (tagName === 'td' || tagName === 'th') {\n if (insideTable > 0) {\n cellBuffer = [];\n }\n pushTag(tagName);\n if (selfClosing) {\n handleTagClose(tagName);\n }\n return;\n }\n\n if (tagName === 'tr') {\n pushTag(tagName);\n if (selfClosing) {\n handleTagClose(tagName);\n }\n return;\n }\n\n // If entering a whitespace-preserved tag and previous output isn't at line start,\n // insert a newline to separate block context from pre/code content.\n if (preservedTagSet.has(tagName) && tagName !== 'code') {\n ensureNewline(out);\n }\n\n pushTag(tagName);\n if (selfClosing) {\n handleTagClose(tagName);\n }\n }\n\n function handleTagClose(tagName: string): void {\n if (excludedTagSet.has(tagName)) {\n popTag(tagName);\n return;\n }\n\n if (tagName === 'a') {\n const shouldInline =\n !!currentAnchorHref &&\n (settings.links === 'inline' || (!anchorHasText && settings.images === 'remove'));\n\n if (shouldInline && currentAnchorHref) {\n const prev = out.length > 0 ? out[out.length - 1] : '';\n const needSpace = anchorHasText\n ? prev.length > 0 && !prev.endsWith(' ') && !prev.endsWith('\\n')\n : true;\n\n if (needSpace) {\n out.push(' ');\n }\n out.push('(', currentAnchorHref, ')');\n }\n\n currentAnchorHref = null;\n inAnchor = false;\n anchorHasText = false;\n popTag(tagName);\n return;\n }\n\n if (tagName === 'td' || tagName === 'th') {\n if (insideTable > 0) {\n const text = cellBuffer.join('');\n const normalized = settings.collapseWhitespace\n ? collapseWhitespace(\n processText(text, settings, preserveWhitespace),\n settings.maxNewlines,\n settings.trim,\n )\n : processText(text, settings, preserveWhitespace);\n\n // Append separator (we'll remove trailing separator on row close)\n out.push(normalized, cellSep);\n cellBuffer = [];\n }\n popTag(tagName);\n return;\n }\n\n if (tagName === 'tr') {\n // Remove trailing cell separator if present\n if (out.length > 0 && out[out.length - 1] === cellSep) {\n out.pop();\n }\n ensureNewline(out);\n popTag(tagName);\n return;\n }\n\n if (blockTagSet.has(tagName)) {\n // Block elements end with a newline\n ensureNewline(out);\n }\n\n popTag(tagName);\n }\n}\n\n// --- Normalization and helpers ---\n\ninterface NormalizedOptions {\n mode: 'fragment' | 'document';\n links: 'text' | 'inline' | 'remove';\n images: 'alt' | 'remove';\n collapseWhitespace: boolean;\n maxNewlines: number;\n wrap: number | null;\n tableCellSeparator: 'tab' | 'space';\n excludeTags: string[];\n decodeEntities: boolean;\n preserveTags: string[];\n trim: boolean;\n}\n\nfunction normalizeOptions(o: HtmlToTextOptions): NormalizedOptions {\n return {\n mode: o.mode === 'document' ? 'document' : 'fragment',\n links: o.links === 'inline' || o.links === 'remove' ? o.links : 'text',\n images: o.images === 'remove' ? 'remove' : 'alt',\n collapseWhitespace: o.collapseWhitespace !== false,\n maxNewlines: typeof o.maxNewlines === 'number' && o.maxNewlines >= 1 ? o.maxNewlines : 2,\n wrap: typeof o.wrap === 'number' && o.wrap > 0 ? Math.floor(o.wrap) : null,\n tableCellSeparator: o.tableCellSeparator === 'space' ? 'space' : 'tab',\n excludeTags: Array.isArray(o.excludeTags)\n ? o.excludeTags.map((x) => String(x).toLowerCase())\n : ['script', 'style', 'noscript', 'template', 'svg', 'canvas'],\n decodeEntities: o.decodeEntities !== false,\n preserveTags: Array.isArray(o.preserveTags)\n ? o.preserveTags.map((x) => String(x).toLowerCase())\n : ['pre', 'code', 'textarea'],\n trim: o.trim !== false,\n };\n}\n\nfunction toSet(arr: string[]): Set<string> {\n return new Set(arr);\n}\n\nfunction emitText(\n text: string,\n out: string[],\n settings: NormalizedOptions,\n preserveWhitespace: boolean,\n): void {\n if (text.length === 0) {\n return;\n }\n const processed = processText(text, settings, preserveWhitespace);\n out.push(processed);\n}\n\nfunction processText(\n text: string,\n settings: NormalizedOptions,\n preserveWhitespace: boolean,\n): string {\n let t = text;\n\n if (settings.decodeEntities) {\n t = decodeEntities(t);\n }\n\n if (preserveWhitespace) {\n // Mark region to bypass global collapse\n return PRESERVE_OPEN + t + PRESERVE_CLOSE;\n }\n\n if (settings.collapseWhitespace) {\n // Collapse all whitespace (including newlines) to single spaces\n t = t.replace(/[\\t\\f\\v\\r\\n ]+/g, ' ');\n }\n\n return t;\n}\n\nfunction ensureNewline(out: string[]): void {\n if (out.length === 0) {\n return;\n }\n const last = out[out.length - 1];\n if (last.endsWith('\\n')) {\n return;\n }\n out.push('\\n');\n}\n\nfunction collapseWhitespace(input: string, maxNewlines: number, trim: boolean): string {\n if (input.indexOf(PRESERVE_OPEN) === -1) {\n return collapseWhitespaceGlobal(input, maxNewlines, trim);\n }\n\n let result = '';\n let idx = 0;\n\n while (idx < input.length) {\n const open = input.indexOf(PRESERVE_OPEN, idx);\n if (open === -1) {\n result += collapseWhitespaceGlobal(input.slice(idx), maxNewlines, trim);\n break;\n }\n\n result += collapseWhitespaceGlobal(input.slice(idx, open), maxNewlines, trim);\n const close = input.indexOf(PRESERVE_CLOSE, open + 1);\n\n if (close === -1) {\n // Unmatched: treat rest as normal\n result += collapseWhitespaceGlobal(input.slice(open + 1), maxNewlines, trim);\n break;\n }\n\n // Keep preserved content with markers (for hardWrap to respect)\n result += input.slice(open, close + 1);\n idx = close + 1;\n }\n\n return result;\n}\n\nfunction collapseWhitespaceGlobal(input: string, maxNewlines: number, trim: boolean): string {\n let s = input.replace(/[\\u00A0]/g, ' '); // nbsp → space early\n // Normalize CRLF/CR to LF\n s = s.replace(/\\r\\n?|\\u2028|\\u2029/g, '\\n');\n\n if (trim) {\n // Aggressive collapse: remove spaces around newlines\n s = s.replace(/[ \\t\\f\\v]+\\n/g, '\\n');\n s = s.replace(/\\n[ \\t\\f\\v]+/g, '\\n');\n }\n\n // Limit newline runs\n const re = new RegExp(`\\\\n{${maxNewlines + 1},}`, 'g');\n s = s.replace(re, '\\n'.repeat(maxNewlines));\n // Collapse remaining horizontal whitespace\n s = s.replace(/[ \\t\\f\\v]{2,}/g, ' ');\n return s;\n}\n\nfunction hardWrap(input: string, width: number): string {\n const lines = input.split('\\n');\n const wrapped: string[] = [];\n\n for (const line of lines) {\n // Don't wrap lines that contain preserved content\n if (line.includes(PRESERVE_OPEN)) {\n wrapped.push(line);\n continue;\n }\n\n if (line.length <= width) {\n wrapped.push(line);\n continue;\n }\n\n let start = 0;\n while (start < line.length) {\n const end = Math.min(start + width, line.length);\n wrapped.push(line.slice(start, end));\n start = end;\n }\n }\n\n return wrapped.join('\\n');\n}\n\nfunction decodeEntities(s: string): string {\n // Numeric (decimal and hex)\n s = s.replace(/&#(\\d+);/g, (_, d) => safeFromCodePoint(Number(d)));\n s = s.replace(/&#x([0-9a-fA-F]+);/g, (_, h) => safeFromCodePoint(Number.parseInt(h, 16)));\n // Common named entities\n s = s.replace(/&([a-zA-Z]+);/g, (_, name) => NAMED_ENTITIES[name] || `&${name};`);\n return s;\n}\n\nfunction safeFromCodePoint(cp: number): string {\n if (!Number.isFinite(cp) || cp < 0 || cp > 0x10ffff) {\n return '';\n }\n try {\n return String.fromCodePoint(cp);\n } catch {\n return '';\n }\n}\n\nfunction extractAttr(attrs: string, name: string): string | null {\n const re = new RegExp(`(?:^|\\\\s)${name}\\\\s*=\\\\s*(\"([^\"]*)\"|'([^']*)'|([^\\\\s>]+))`, 'i');\n const m = attrs.match(re);\n if (!m) {\n return null;\n }\n const val = m[2] ?? m[3] ?? m[4] ?? '';\n return decodeEntities(val);\n}\n\nfunction indexOfSpace(s: string): number {\n for (let i = 0; i < s.length; i += 1) {\n const c = s.charCodeAt(i);\n if (c === 32 || c === 9 || c === 10 || c === 12 || c === 13) {\n return i;\n }\n }\n return -1;\n}\n\n// --- Classification sets ---\n\nconst BLOCK_TAG_SET = toSet([\n 'p',\n 'div',\n 'section',\n 'article',\n 'header',\n 'footer',\n 'main',\n 'nav',\n 'aside',\n 'h1',\n 'h2',\n 'h3',\n 'h4',\n 'h5',\n 'h6',\n 'ul',\n 'ol',\n 'li',\n 'table',\n 'thead',\n 'tbody',\n 'tfoot',\n 'blockquote',\n 'figure',\n 'figcaption',\n 'hr',\n]);\n\nconst SELF_CLOSING_TAG_SET = toSet([\n 'br',\n 'img',\n 'hr',\n 'meta',\n 'link',\n 'input',\n 'source',\n 'track',\n 'wbr',\n]);\n\n// Markers for preserved regions in collapse pass\nconst PRESERVE_OPEN = '\\u2418'; // symbol for record separator visualization (any rare char)\nconst PRESERVE_CLOSE = '\\u2419';\n\nconst NAMED_ENTITIES: Record<string, string> = Object.freeze({\n amp: '&',\n lt: '<',\n gt: '>',\n quot: '\"',\n apos: \"'\",\n nbsp: '\\u00A0',\n mdash: '\\u2014',\n ndash: '\\u2013',\n hellip: '\\u2026',\n copy: '\\u00A9',\n reg: '\\u00AE',\n trade: '\\u2122',\n laquo: '\\u00AB',\n raquo: '\\u00BB',\n lsquo: '\\u2018',\n rsquo: '\\u2019',\n ldquo: '\\u201C',\n rdquo: '\\u201D',\n euro: '\\u20AC',\n middot: '\\u00B7',\n bull: '\\u2022',\n});\n","/**\n * URL normalization utilities for resolving relative URLs to absolute URLs.\n *\n * @remarks\n * This module provides utilities for converting relative URLs to absolute URLs with\n * best-effort error handling. All functions are designed to never throw errors - if\n * normalization fails, the original string is returned unchanged.\n *\n * Supports all common relative URL formats:\n * - Absolute paths: `/path` → `https://example.com/path`\n * - Relative paths: `./path`, `../path`, `path`\n * - Protocol-relative: `//cdn.com/file` → `https://cdn.com/file`\n *\n * Features HTTP to HTTPS upgrade by default (unless base URL is explicitly HTTP).\n *\n * @packageDocumentation\n */\n\n/**\n * Normalize a URL to absolute form using a base URL.\n *\n * @remarks\n * This function converts relative URLs to absolute URLs. It handles all common\n * relative URL formats and never throws errors. If normalization fails for any\n * reason, the original string is returned unchanged.\n *\n * @example\n * ```typescript\n * // Absolute path\n * normalizeUrl('https://example.com/feed.xml', '/blog/post')\n * // Returns: \"https://example.com/blog/post\"\n *\n * // Relative path\n * normalizeUrl('https://example.com/feeds/rss.xml', '../images/logo.png')\n * // Returns: \"https://example.com/images/logo.png\"\n *\n * // Protocol-relative\n * normalizeUrl('https://example.com/feed.xml', '//cdn.example.com/file.mp3')\n * // Returns: \"https://cdn.example.com/file.mp3\"\n *\n * // No base URL - returns as-is\n * normalizeUrl(null, '/blog/post')\n * // Returns: \"/blog/post\"\n * ```\n *\n * @param baseUrl - Base URL for resolving relative URLs (string or URL object)\n * @param urlString - URL to normalize (can be relative, absolute, protocol-relative, etc.)\n * @returns Normalized absolute URL, or original string if normalization fails\n */\nexport function normalizeUrl(\n baseUrl: string | URL | null | undefined,\n urlString: string | null | undefined,\n): string {\n // Return original if no URL string provided\n if (!urlString || typeof urlString !== 'string') {\n return urlString || '';\n }\n\n const trimmed = urlString.trim();\n if (!trimmed) {\n return urlString;\n }\n\n // No base URL - try to validate as absolute or return as-is\n if (!baseUrl) {\n return validateOrReturnOriginal(trimmed);\n }\n\n try {\n // Parse base URL\n const base = typeof baseUrl === 'string' ? new URL(baseUrl) : baseUrl;\n\n // Check if URL is already absolute\n if (isAbsoluteUrl(trimmed)) {\n return validateOrReturnOriginal(trimmed);\n }\n\n // Handle protocol-relative URLs (//example.com/path)\n if (trimmed.startsWith('//')) {\n const protocol = base.protocol || 'https:';\n return validateOrReturnOriginal(`${protocol}${trimmed}`);\n }\n\n // Handle absolute paths (/path)\n if (trimmed.startsWith('/')) {\n const origin = base.origin;\n return validateOrReturnOriginal(`${origin}${trimmed}`);\n }\n\n // Handle relative paths (./path, ../path, or just path)\n // Use URL constructor to resolve relative to base\n const resolved = new URL(trimmed, base);\n return resolved.href;\n } catch {\n // If anything fails, return original\n return urlString;\n }\n}\n\n/**\n * Check if URL is absolute (has protocol)\n */\nfunction isAbsoluteUrl(url: string): boolean {\n try {\n // Try to parse as URL\n const parsed = new URL(url);\n // Must have protocol and host\n return Boolean(parsed.protocol && parsed.host);\n } catch {\n return false;\n }\n}\n\n/**\n * Validate URL or return original\n * Attempts to parse and clean up the URL\n */\nfunction validateOrReturnOriginal(url: string): string {\n try {\n const parsed = new URL(url);\n return parsed.href;\n } catch {\n return url;\n }\n}\n\n/**\n * Normalize multiple URLs at once.\n *\n * @remarks\n * Convenience function for batch URL normalization. Filters out null/undefined values.\n *\n * @param baseUrl - Base URL for resolving relative URLs\n * @param urls - Array of URLs to normalize\n * @returns Array of normalized URLs (nulls/undefined filtered out)\n */\nexport function normalizeUrls(\n baseUrl: string | URL | null | undefined,\n urls: (string | null | undefined)[] | null | undefined,\n): string[] {\n if (!urls || !Array.isArray(urls)) {\n return [];\n }\n\n return urls.map((url) => normalizeUrl(baseUrl, url)).filter((url): url is string => Boolean(url));\n}\n\n/**\n * Upgrade HTTP URLs to HTTPS (unless base URL is explicitly HTTP).\n *\n * @remarks\n * This function implements the HTTPS-by-default policy. HTTP URLs are automatically\n * upgraded to HTTPS unless the base URL itself is HTTP, indicating an HTTP-only site.\n *\n * @param baseUrl - Base URL (determines if HTTP should be kept)\n * @param url - URL to potentially upgrade\n * @returns URL with HTTPS protocol if appropriate, otherwise unchanged\n */\nexport function preferHttps(baseUrl: string | URL | null | undefined, url: string): string {\n if (!url || !url.startsWith('http://')) {\n return url;\n }\n\n // If base URL is explicitly HTTP, keep HTTP\n if (baseUrl) {\n try {\n const base = typeof baseUrl === 'string' ? new URL(baseUrl) : baseUrl;\n if (base.protocol === 'http:') {\n return url;\n }\n } catch {\n // Ignore errors\n }\n }\n\n // Try to upgrade to HTTPS\n return url.replace(/^http:/, 'https:');\n}\n\n/**\n * Normalize URL and prefer HTTPS protocol.\n *\n * @remarks\n * Convenience function combining {@link normalizeUrl} with {@link preferHttps}.\n * This is the recommended function for most use cases.\n *\n * @param baseUrl - Base URL for resolving relative URLs\n * @param urlString - URL to normalize\n * @returns Normalized absolute URL with HTTPS preference\n */\nexport function normalizeUrlHttps(\n baseUrl: string | URL | null | undefined,\n urlString: string | null | undefined,\n): string {\n const normalized = normalizeUrl(baseUrl, urlString);\n return preferHttps(baseUrl, normalized);\n}\n","/**\n * Text cleaning utilities for Atom feeds\n */\n\n/**\n * Strip CDATA tags from text\n */\nfunction stripCDATA(text: string): string {\n return text.replace(/<!\\[CDATA\\[([\\s\\S]*?)\\]\\]>/g, '$1');\n}\n\n/**\n * Decode HTML entities\n */\nfunction decodeEntities(text: string): string {\n // Common HTML entities\n const entities: Record<string, string> = {\n '&amp;': '&',\n '&lt;': '<',\n '&gt;': '>',\n '&quot;': '\"',\n '&apos;': \"'\",\n '&#39;': \"'\",\n };\n\n let result = text;\n for (const [entity, char] of Object.entries(entities)) {\n result = result.replace(new RegExp(entity, 'g'), char);\n }\n\n // Decode numeric entities (&#123; or &#xAB;)\n result = result.replace(/&#(\\d+);/g, (_match, dec) => {\n return String.fromCharCode(Number.parseInt(dec, 10));\n });\n result = result.replace(/&#x([0-9A-Fa-f]+);/g, (_match, hex) => {\n return String.fromCharCode(Number.parseInt(hex, 16));\n });\n\n return result;\n}\n\n/**\n * Normalize whitespace (collapse multiple spaces, trim)\n */\nfunction normalizeWhitespace(text: string): string {\n return text.replace(/\\s+/g, ' ').trim();\n}\n\n/**\n * Clean text by applying all transformations\n */\nfunction cleanText(text: string | null | undefined): string {\n if (!text) {\n return '';\n }\n return normalizeWhitespace(decodeEntities(stripCDATA(text)));\n}\n\n/**\n * Clean text content based on Atom content type\n * @param text - Raw text\n * @param type - Atom content type (text, html, xhtml, or mime type)\n * @returns Cleaned text\n */\nexport function cleanAtomContent(\n text: string | null | undefined,\n type: string | null | undefined = 'text',\n): string {\n if (!text) {\n return '';\n }\n\n const contentType = (type || 'text').toLowerCase().trim();\n\n // For text type, decode entities and clean whitespace\n if (contentType === 'text') {\n return cleanText(text);\n }\n\n // For HTML/XHTML, we keep HTML entities and structure\n // Only normalize whitespace and strip CDATA\n if (contentType === 'html' || contentType === 'xhtml') {\n return normalizeWhitespace(stripCDATA(text));\n }\n\n // For other mime types (e.g., application/xml), preserve as-is after basic cleaning\n return normalizeWhitespace(stripCDATA(text));\n}\n\n// Export individual utilities for internal use\nexport { stripCDATA, decodeEntities, normalizeWhitespace, cleanText };\n","/**\n * Atom date parsing utilities\n * Atom uses RFC 3339 / ISO 8601 date format\n * Examples: \"2025-12-17T10:00:00Z\", \"2025-12-17T10:00:00+01:00\"\n */\n\n/**\n * Parse RFC 3339 / ISO 8601 date to ISO 8601 string\n * Atom dates are already in ISO 8601 format, just validate and normalize\n */\nexport function parseRFC3339Date(dateString: string | null | undefined): string | null {\n if (!dateString || typeof dateString !== 'string') {\n return null;\n }\n\n const trimmed = dateString.trim();\n if (!trimmed) {\n return null;\n }\n\n try {\n // JavaScript's Date constructor handles ISO 8601 / RFC 3339 well\n const date = new Date(trimmed);\n\n // Check if date is valid\n if (Number.isNaN(date.getTime())) {\n return null;\n }\n\n // Return as ISO 8601 string\n return date.toISOString();\n } catch {\n return null;\n }\n}\n\n/**\n * Parse Atom date (alias for clarity)\n */\nexport function parseAtomDate(dateString: string | null | undefined): string | null {\n return parseRFC3339Date(dateString);\n}\n\n/**\n * Check if a date string is valid\n */\nexport function isValidAtomDate(dateString: string | null | undefined): boolean {\n return parseRFC3339Date(dateString) !== null;\n}\n","/**\n * Extract Atom entry metadata\n */\n\nimport { cleanAtomContent, cleanText } from './clean-text.js';\nimport { parseAtomDate } from './parse-date.js';\nimport type {\n AtomCategory,\n AtomContent,\n AtomEntry,\n AtomFeed,\n AtomLink,\n AtomPerson,\n} from './types.js';\nimport type { AtomElement } from './xml-parser.js';\n\n/**\n * Extract date from element with fallbacks for different Atom versions and extensions\n * Tries selectors in order: updated (Atom 1.0), modified (Atom 0.3), issued (Atom 0.3), dc:date (Dublin Core)\n */\nfunction extractAtomDate(element: AtomElement): string | null {\n // Try Atom 1.0 <updated>\n let dateText = element.querySelector('updated')?.textContent;\n if (dateText) {\n const parsed = parseAtomDate(dateText);\n if (parsed) return parsed;\n }\n\n // Try Atom 0.3 <modified>\n dateText = element.querySelector('modified')?.textContent;\n if (dateText) {\n const parsed = parseAtomDate(dateText);\n if (parsed) return parsed;\n }\n\n // Try Atom 0.3 <issued>\n dateText = element.querySelector('issued')?.textContent;\n if (dateText) {\n const parsed = parseAtomDate(dateText);\n if (parsed) return parsed;\n }\n\n // Try Dublin Core <dc:date>\n const dcDateElements = element.children.filter((child) => child.tagName === 'dc:date');\n if (dcDateElements.length > 0) {\n dateText = dcDateElements[0].textContent;\n if (dateText) {\n const parsed = parseAtomDate(dateText);\n if (parsed) return parsed;\n }\n }\n\n return null;\n}\n\n/**\n * Extract person (author, contributor)\n */\nfunction extractPerson(element: AtomElement): AtomPerson | null {\n const name = element.querySelector('name')?.textContent;\n if (!name) {\n return null; // Name is required for person construct\n }\n\n const person: AtomPerson = {\n name: cleanText(name),\n };\n\n const email = element.querySelector('email')?.textContent;\n if (email) {\n person.email = cleanText(email);\n }\n\n const uri = element.querySelector('uri')?.textContent;\n if (uri) {\n person.uri = cleanText(uri);\n }\n\n return person;\n}\n\n/**\n * Extract all persons of a given tag name\n */\nfunction extractPersons(root: AtomElement, tagName: string): AtomPerson[] {\n const persons: AtomPerson[] = [];\n const elements = root.querySelectorAll(tagName);\n\n for (const element of elements) {\n const person = extractPerson(element);\n if (person) {\n persons.push(person);\n }\n }\n\n return persons;\n}\n\n/**\n * Extract link\n */\nfunction extractLink(element: AtomElement): AtomLink | null {\n const href = element.getAttribute('href');\n if (!href) {\n return null; // href is required\n }\n\n const link: AtomLink = {\n href: cleanText(href),\n };\n\n const rel = element.getAttribute('rel');\n if (rel) {\n link.rel = cleanText(rel);\n }\n\n const type = element.getAttribute('type');\n if (type) {\n link.type = cleanText(type);\n }\n\n const hreflang = element.getAttribute('hreflang');\n if (hreflang) {\n link.hreflang = cleanText(hreflang);\n }\n\n const title = element.getAttribute('title');\n if (title) {\n link.title = cleanText(title);\n }\n\n const length = element.getAttribute('length');\n if (length) {\n const lengthNum = Number.parseInt(length, 10);\n if (!Number.isNaN(lengthNum)) {\n link.length = lengthNum;\n }\n }\n\n return link;\n}\n\n/**\n * Extract all links\n */\nfunction extractLinks(root: AtomElement): AtomLink[] {\n const links: AtomLink[] = [];\n const elements = root.querySelectorAll('link');\n\n for (const element of elements) {\n const link = extractLink(element);\n if (link) {\n links.push(link);\n }\n }\n\n return links;\n}\n\n/**\n * Extract category\n */\nfunction extractCategory(element: AtomElement): AtomCategory | null {\n const term = element.getAttribute('term');\n if (!term) {\n return null; // term is required\n }\n\n const category: AtomCategory = {\n term: cleanText(term),\n };\n\n const scheme = element.getAttribute('scheme');\n if (scheme) {\n category.scheme = cleanText(scheme);\n }\n\n const label = element.getAttribute('label');\n if (label) {\n category.label = cleanText(label);\n }\n\n return category;\n}\n\n/**\n * Extract all categories\n */\nfunction extractCategories(root: AtomElement): AtomCategory[] {\n const categories: AtomCategory[] = [];\n const elements = root.querySelectorAll('category');\n\n for (const element of elements) {\n const category = extractCategory(element);\n if (category) {\n categories.push(category);\n }\n }\n\n return categories;\n}\n\n/**\n * Extract content\n */\nfunction extractContent(root: AtomElement): AtomContent | undefined {\n const element = root.querySelector('content');\n if (!element) {\n return undefined;\n }\n\n const type = element.getAttribute('type');\n const src = element.getAttribute('src');\n const text = element.textContent;\n\n if (!text && !src) {\n return undefined;\n }\n\n const content: AtomContent = {\n value: text ? cleanAtomContent(text, type) : '',\n };\n\n if (type) {\n content.type = cleanText(type);\n }\n\n if (src) {\n content.src = cleanText(src);\n }\n\n return content;\n}\n\n/**\n * Extract text content with type attribute\n */\nfunction extractTextContent(root: AtomElement, tagName: string): string | undefined {\n const element = root.querySelector(tagName);\n if (!element) {\n return undefined;\n }\n\n const text = element.textContent;\n const type = element.getAttribute('type');\n\n return text ? cleanAtomContent(text, type) : undefined;\n}\n\n/**\n * Extract Atom entry\n */\nexport function extractEntry(entryElement: AtomElement): AtomEntry {\n // Required fields\n const id = entryElement.querySelector('id')?.textContent;\n if (!id) {\n throw new Error('Invalid Atom entry: missing required <id> element');\n }\n\n const title = extractTextContent(entryElement, 'title');\n if (!title) {\n throw new Error('Invalid Atom entry: missing required <title> element');\n }\n\n const updated = extractAtomDate(entryElement);\n if (!updated) {\n throw new Error(\n 'Invalid Atom entry: missing or invalid date (tried <updated>, <modified>, <issued>, <dc:date>)',\n );\n }\n\n const entry: AtomEntry = {\n id: cleanText(id),\n title,\n updated,\n };\n\n // Optional fields\n const authors = extractPersons(entryElement, 'author');\n if (authors.length > 0) {\n entry.authors = authors;\n }\n\n const content = extractContent(entryElement);\n if (content) {\n entry.content = content;\n }\n\n const links = extractLinks(entryElement);\n if (links.length > 0) {\n entry.links = links;\n }\n\n const summary = extractTextContent(entryElement, 'summary');\n if (summary) {\n entry.summary = summary;\n }\n\n const categories = extractCategories(entryElement);\n if (categories.length > 0) {\n entry.categories = categories;\n }\n\n const contributors = extractPersons(entryElement, 'contributor');\n if (contributors.length > 0) {\n entry.contributors = contributors;\n }\n\n const publishedRaw = entryElement.querySelector('published')?.textContent;\n if (publishedRaw) {\n const published = parseAtomDate(publishedRaw);\n if (published) {\n entry.published = published;\n }\n }\n\n const rights = extractTextContent(entryElement, 'rights');\n if (rights) {\n entry.rights = rights;\n }\n\n // Source is a partial feed\n const source = entryElement.querySelector('source');\n if (source) {\n const sourceData: Partial<AtomFeed> = {};\n\n const sourceId = source.querySelector('id')?.textContent;\n if (sourceId) {\n sourceData.id = cleanText(sourceId);\n }\n\n const sourceTitle = extractTextContent(source, 'title');\n if (sourceTitle) {\n sourceData.title = sourceTitle;\n }\n\n const sourceUpdatedRaw = source.querySelector('updated')?.textContent;\n if (sourceUpdatedRaw) {\n const sourceUpdated = parseAtomDate(sourceUpdatedRaw);\n if (sourceUpdated) {\n sourceData.updated = sourceUpdated;\n }\n }\n\n if (Object.keys(sourceData).length > 0) {\n entry.source = sourceData;\n }\n }\n\n return entry;\n}\n","/**\n * Minimal Atom-specific XML parser\n * Built specifically for Atom 1.0 feeds with their specific quirks\n */\n\nexport interface AtomElement {\n /** Tag name (e.g., 'feed', 'entry', 'title') */\n tagName: string;\n /** Element attributes */\n attributes: Record<string, string>;\n /** Text content (with CDATA stripped) */\n text: string;\n /** Child elements */\n children: AtomElement[];\n /** Parent element (for traversal) */\n parent: AtomElement | null;\n\n /** Query selector - find first matching child */\n querySelector: (selector: string) => AtomElement | null;\n /** Query selector all - find all matching children */\n querySelectorAll: (selector: string) => AtomElement[];\n /** Get attribute value */\n getAttribute: (name: string) => string | null;\n /** Get text content */\n get textContent(): string;\n}\n\n/**\n * Remove XML comments\n */\nfunction removeComments(xml: string): string {\n return xml.replace(/<!--[\\s\\S]*?-->/g, '');\n}\n\n/**\n * Parse Atom XML string into element tree\n */\nexport function parseAtomXML(xml: string): AtomElement {\n const withoutComments = removeComments(xml);\n const { text: cleanedXML, cdataMap } = extractCDATA(withoutComments);\n const root = parseElement(cleanedXML, 0, null, cdataMap).element;\n return root;\n}\n\n/**\n * Extract CDATA content and replace with placeholder\n */\nfunction extractCDATA(text: string): { text: string; cdataMap: Map<string, string> } {\n const cdataMap = new Map<string, string>();\n let counter = 0;\n\n const processed = text.replace(/<!\\[CDATA\\[([\\s\\S]*?)\\]\\]>/g, (_match, content) => {\n const placeholder = `__CDATA_${counter}__`;\n cdataMap.set(placeholder, content);\n counter++;\n return placeholder;\n });\n\n return { text: processed, cdataMap };\n}\n\n/**\n * Restore CDATA content from placeholders\n */\nfunction restoreCDATA(text: string, cdataMap: Map<string, string>): string {\n let result = text;\n for (const [placeholder, content] of cdataMap.entries()) {\n result = result.replace(placeholder, content);\n }\n return result;\n}\n\n/**\n * Parse attributes from opening tag\n */\nfunction parseAttributes(tagContent: string): Record<string, string> {\n const attributes: Record<string, string> = {};\n const attrRegex = /(\\S+)=[\"']([^\"']*)[\"']/g;\n let match: RegExpExecArray | null = attrRegex.exec(tagContent);\n\n while (match !== null) {\n attributes[match[1]] = match[2];\n match = attrRegex.exec(tagContent);\n }\n\n return attributes;\n}\n\n/**\n * Find matching closing tag position\n */\nfunction findClosingTag(xml: string, tagName: string, startPos: number): number {\n const openTag = `<${tagName}`;\n const closeTag = `</${tagName}>`;\n let depth = 1;\n let pos = startPos;\n\n while (pos < xml.length && depth > 0) {\n const nextOpen = xml.indexOf(openTag, pos);\n const nextClose = xml.indexOf(closeTag, pos);\n\n if (nextClose === -1) {\n return -1; // No closing tag found\n }\n\n if (nextOpen !== -1 && nextOpen < nextClose) {\n // Found nested opening tag\n depth++;\n pos = nextOpen + openTag.length;\n } else {\n // Found closing tag\n depth--;\n if (depth === 0) {\n return nextClose;\n }\n pos = nextClose + closeTag.length;\n }\n }\n\n return -1;\n}\n\n/**\n * Parse a single element and its children\n */\nfunction parseElement(\n xml: string,\n startPos: number,\n parent: AtomElement | null = null,\n cdataMap: Map<string, string>,\n): { element: AtomElement; endPos: number } {\n // Find opening tag\n const openTagStart = xml.indexOf('<', startPos);\n if (openTagStart === -1) {\n throw new Error('No opening tag found');\n }\n\n const openTagEnd = xml.indexOf('>', openTagStart);\n if (openTagEnd === -1) {\n throw new Error('Unclosed opening tag');\n }\n\n const openTagContent = xml.substring(openTagStart + 1, openTagEnd);\n\n // Check for self-closing tag\n const isSelfClosing = openTagContent.endsWith('/');\n const tagContent = isSelfClosing ? openTagContent.slice(0, -1).trim() : openTagContent;\n\n // Extract tag name and attributes\n const spaceIndex = tagContent.indexOf(' ');\n const tagName = spaceIndex === -1 ? tagContent : tagContent.substring(0, spaceIndex);\n const attributes = spaceIndex === -1 ? {} : parseAttributes(tagContent.substring(spaceIndex));\n\n const element: AtomElement = {\n tagName,\n attributes,\n text: '',\n children: [],\n parent,\n querySelector: (selector: string) => querySelector(element as AtomElement, selector),\n querySelectorAll: (selector: string) => querySelectorAll(element as AtomElement, selector),\n getAttribute: (name: string) => element.attributes[name] ?? null,\n get textContent() {\n return element.text;\n },\n };\n\n // Handle self-closing tags\n if (isSelfClosing) {\n return {\n element,\n endPos: openTagEnd + 1,\n };\n }\n\n // Find closing tag\n const closingTagStart = findClosingTag(xml, tagName, openTagEnd + 1);\n if (closingTagStart === -1) {\n throw new Error(`No closing tag found for <${tagName}>`);\n }\n\n // Extract content between opening and closing tags\n const contentStart = openTagEnd + 1;\n const content = xml.substring(contentStart, closingTagStart);\n\n // Parse children and text\n const children: AtomElement[] = [];\n const textParts: string[] = [];\n let pos = 0;\n\n while (pos < content.length) {\n const nextTagStart = content.indexOf('<', pos);\n\n if (nextTagStart === -1) {\n // No more tags, rest is text\n textParts.push(content.substring(pos));\n break;\n }\n\n // Text before next tag\n if (nextTagStart > pos) {\n textParts.push(content.substring(pos, nextTagStart));\n }\n\n // Check if it's a closing tag or comment\n if (content[nextTagStart + 1] === '/' || content[nextTagStart + 1] === '!') {\n // Skip closing tags and comments\n const tagEnd = content.indexOf('>', nextTagStart);\n if (tagEnd !== -1) {\n pos = tagEnd + 1;\n } else {\n break;\n }\n continue;\n }\n\n // Parse child element\n try {\n const { element: childElement, endPos } = parseElement(\n xml,\n contentStart + nextTagStart,\n element,\n cdataMap,\n );\n children.push(childElement);\n pos = endPos - contentStart;\n } catch {\n // If parsing fails, treat as text\n pos = nextTagStart + 1;\n }\n }\n\n // Combine and clean text\n const rawText = textParts.join('').trim();\n const restoredText = restoreCDATA(rawText, cdataMap);\n element.text = restoredText;\n element.children = children;\n\n const closingTagEnd = closingTagStart + `</${tagName}>`.length;\n\n return {\n element,\n endPos: closingTagEnd,\n };\n}\n\n/**\n * Query selector - find first matching element\n */\nfunction querySelector(element: AtomElement, selector: string): AtomElement | null {\n // Search in direct children first\n for (const child of element.children) {\n if (child.tagName === selector) {\n return child;\n }\n }\n\n // Deep search\n for (const child of element.children) {\n const result = querySelector(child, selector);\n if (result) {\n return result;\n }\n }\n\n return null;\n}\n\n/**\n * Query selector all - find all matching elements\n */\nfunction querySelectorAll(element: AtomElement, selector: string): AtomElement[] {\n const results: AtomElement[] = [];\n\n // Search direct children\n for (const child of element.children) {\n if (child.tagName === selector) {\n results.push(child);\n }\n }\n\n // Deep search in children (but don't add duplicates)\n // const directChildrenTags = new Set(results.map((r) => r.tagName));\n for (const child of element.children) {\n const childResults = querySelectorAll(child, selector);\n for (const childResult of childResults) {\n if (!results.includes(childResult)) {\n results.push(childResult);\n }\n }\n }\n\n return results;\n}\n\n/**\n * Parse XML and return root element\n */\nexport function parseXML(xml: string): AtomElement {\n // Remove XML declaration and processing instructions\n const cleaned = xml.replace(/<\\?[^?]*\\?>/g, '').trim();\n return parseAtomXML(cleaned);\n}\n","/**\n * Extract Atom feed metadata\n */\n\nimport { cleanAtomContent, cleanText } from './clean-text.js';\nimport { parseAtomDate } from './parse-date.js';\nimport type { AtomCategory, AtomFeed, AtomGenerator, AtomLink, AtomPerson } from './types.js';\nimport { parseXML } from './xml-parser.js';\n\n/**\n * Extract date from element with fallbacks for different Atom versions and extensions\n * Tries selectors in order: updated (Atom 1.0), modified (Atom 0.3), issued (Atom 0.3), dc:date (Dublin Core)\n */\nfunction extractAtomDate(element: ReturnType<typeof parseXML>): string | null {\n // Try Atom 1.0 <updated>\n let dateText = element.querySelector('updated')?.textContent;\n if (dateText) {\n const parsed = parseAtomDate(dateText);\n if (parsed) return parsed;\n }\n\n // Try Atom 0.3 <modified>\n dateText = element.querySelector('modified')?.textContent;\n if (dateText) {\n const parsed = parseAtomDate(dateText);\n if (parsed) return parsed;\n }\n\n // Try Atom 0.3 <issued>\n dateText = element.querySelector('issued')?.textContent;\n if (dateText) {\n const parsed = parseAtomDate(dateText);\n if (parsed) return parsed;\n }\n\n // Try Dublin Core <dc:date>\n const dcDateElements = element.children.filter((child) => child.tagName === 'dc:date');\n if (dcDateElements.length > 0) {\n dateText = dcDateElements[0].textContent;\n if (dateText) {\n const parsed = parseAtomDate(dateText);\n if (parsed) return parsed;\n }\n }\n\n return null;\n}\n\n/**\n * Extract person (author, contributor)\n */\nfunction extractPerson(element: ReturnType<typeof parseXML>): AtomPerson | null {\n const name = element.querySelector('name')?.textContent;\n if (!name) {\n return null; // Name is required for person construct\n }\n\n const person: AtomPerson = {\n name: cleanText(name),\n };\n\n const email = element.querySelector('email')?.textContent;\n if (email) {\n person.email = cleanText(email);\n }\n\n const uri = element.querySelector('uri')?.textContent;\n if (uri) {\n person.uri = cleanText(uri);\n }\n\n return person;\n}\n\n/**\n * Extract all persons of a given tag name\n */\nfunction extractPersons(root: ReturnType<typeof parseXML>, tagName: string): AtomPerson[] {\n const persons: AtomPerson[] = [];\n const elements = root.querySelectorAll(tagName);\n\n for (const element of elements) {\n const person = extractPerson(element);\n if (person) {\n persons.push(person);\n }\n }\n\n return persons;\n}\n\n/**\n * Extract link\n */\nfunction extractLink(element: ReturnType<typeof parseXML>): AtomLink | null {\n const href = element.getAttribute('href');\n if (!href) {\n return null; // href is required\n }\n\n const link: AtomLink = {\n href: cleanText(href),\n };\n\n const rel = element.getAttribute('rel');\n if (rel) {\n link.rel = cleanText(rel);\n }\n\n const type = element.getAttribute('type');\n if (type) {\n link.type = cleanText(type);\n }\n\n const hreflang = element.getAttribute('hreflang');\n if (hreflang) {\n link.hreflang = cleanText(hreflang);\n }\n\n const title = element.getAttribute('title');\n if (title) {\n link.title = cleanText(title);\n }\n\n const length = element.getAttribute('length');\n if (length) {\n const lengthNum = Number.parseInt(length, 10);\n if (!Number.isNaN(lengthNum)) {\n link.length = lengthNum;\n }\n }\n\n return link;\n}\n\n/**\n * Extract all links\n */\nfunction extractLinks(root: ReturnType<typeof parseXML>): AtomLink[] {\n const links: AtomLink[] = [];\n const elements = root.querySelectorAll('link');\n\n for (const element of elements) {\n const link = extractLink(element);\n if (link) {\n links.push(link);\n }\n }\n\n return links;\n}\n\n/**\n * Extract category\n */\nfunction extractCategory(element: ReturnType<typeof parseXML>): AtomCategory | null {\n const term = element.getAttribute('term');\n if (!term) {\n return null; // term is required\n }\n\n const category: AtomCategory = {\n term: cleanText(term),\n };\n\n const scheme = element.getAttribute('scheme');\n if (scheme) {\n category.scheme = cleanText(scheme);\n }\n\n const label = element.getAttribute('label');\n if (label) {\n category.label = cleanText(label);\n }\n\n return category;\n}\n\n/**\n * Extract all categories\n */\nfunction extractCategories(root: ReturnType<typeof parseXML>): AtomCategory[] {\n const categories: AtomCategory[] = [];\n const elements = root.querySelectorAll('category');\n\n for (const element of elements) {\n const category = extractCategory(element);\n if (category) {\n categories.push(category);\n }\n }\n\n return categories;\n}\n\n/**\n * Extract generator\n */\nfunction extractGenerator(root: ReturnType<typeof parseXML>): AtomGenerator | null {\n const element = root.querySelector('generator');\n if (!element) {\n return null;\n }\n\n const value = element.textContent;\n if (!value) {\n return null;\n }\n\n const generator: AtomGenerator = {\n value: cleanText(value),\n };\n\n const uri = element.getAttribute('uri');\n if (uri) {\n generator.uri = cleanText(uri);\n }\n\n const version = element.getAttribute('version');\n if (version) {\n generator.version = cleanText(version);\n }\n\n return generator;\n}\n\n/**\n * Extract text content with type attribute\n */\nfunction extractTextContent(\n root: ReturnType<typeof parseXML>,\n tagName: string,\n): string | undefined {\n const element = root.querySelector(tagName);\n if (!element) {\n return undefined;\n }\n\n const text = element.textContent;\n const type = element.getAttribute('type');\n\n return text ? cleanAtomContent(text, type) : undefined;\n}\n\n/**\n * Extract Atom feed-level metadata\n */\nexport function extractFeed(xml: string): AtomFeed {\n const doc = parseXML(xml);\n\n // The root element should be the feed\n const feed = doc.tagName === 'feed' ? doc : doc.querySelector('feed');\n\n if (!feed) {\n throw new Error('Invalid Atom feed: missing <feed> element');\n }\n\n // Required fields\n const id = feed.querySelector('id')?.textContent;\n if (!id) {\n throw new Error('Invalid Atom feed: missing required <id> element');\n }\n\n const title = extractTextContent(feed, 'title');\n if (!title) {\n throw new Error('Invalid Atom feed: missing required <title> element');\n }\n\n const updated = extractAtomDate(feed);\n if (!updated) {\n throw new Error(\n 'Invalid Atom feed: missing or invalid date (tried <updated>, <modified>, <issued>, <dc:date>)',\n );\n }\n\n const result: AtomFeed = {\n id: cleanText(id),\n title,\n updated,\n };\n\n // Optional fields\n const authors = extractPersons(feed, 'author');\n if (authors.length > 0) {\n result.authors = authors;\n }\n\n const links = extractLinks(feed);\n if (links.length > 0) {\n result.links = links;\n }\n\n const categories = extractCategories(feed);\n if (categories.length > 0) {\n result.categories = categories;\n }\n\n const contributors = extractPersons(feed, 'contributor');\n if (contributors.length > 0) {\n result.contributors = contributors;\n }\n\n const generator = extractGenerator(feed);\n if (generator) {\n result.generator = generator;\n }\n\n const icon = feed.querySelector('icon')?.textContent;\n if (icon) {\n result.icon = cleanText(icon);\n }\n\n const logo = feed.querySelector('logo')?.textContent;\n if (logo) {\n result.logo = cleanText(logo);\n }\n\n const rights = extractTextContent(feed, 'rights');\n if (rights) {\n result.rights = rights;\n }\n\n const subtitle = extractTextContent(feed, 'subtitle');\n if (subtitle) {\n result.subtitle = subtitle;\n }\n\n return result;\n}\n","/**\n * Main Atom feed parser\n * Orchestrates feed and entry extraction\n */\n\nimport { normalizeUrlHttps } from '../../utils/normalize-url.js';\nimport { extractEntry } from './extract-entry.js';\nimport { extractFeed } from './extract-feed.js';\nimport type { AtomDocument, AtomEntry, AtomFeed, AtomLink } from './types.js';\nimport { parseXML } from './xml-parser.js';\n\n/**\n * Parse complete Atom feed\n * @param xml - Atom XML string\n * @param baseUrl - Optional base URL for resolving relative URLs\n */\nexport function parseAtom(xml: string, baseUrl?: string | URL): AtomDocument {\n const doc = parseXML(xml);\n\n // Extract feed metadata\n const feed = extractFeed(xml);\n\n // Extract all entries\n const entryElements = doc.querySelectorAll('entry');\n const entries = entryElements.map((entryElement) => extractEntry(entryElement));\n\n // Apply URL normalization if base URL provided\n const normalizedFeed = baseUrl ? normalizeFeedUrls(feed, baseUrl) : feed;\n const normalizedEntries = baseUrl\n ? entries.map((entry) => normalizeEntryUrls(entry, baseUrl))\n : entries;\n\n return {\n version: '1.0',\n feed: normalizedFeed,\n entries: normalizedEntries,\n };\n}\n\n/**\n * Normalize all URLs in feed\n */\nfunction normalizeFeedUrls(feed: AtomFeed, baseUrl: string | URL): AtomFeed {\n return {\n ...feed,\n links: feed.links ? feed.links.map((link) => normalizeLinkUrls(link, baseUrl)) : feed.links,\n icon: feed.icon ? normalizeUrlHttps(baseUrl, feed.icon) : feed.icon,\n logo: feed.logo ? normalizeUrlHttps(baseUrl, feed.logo) : feed.logo,\n };\n}\n\n/**\n * Normalize all URLs in entry\n */\nfunction normalizeEntryUrls(entry: AtomEntry, baseUrl: string | URL): AtomEntry {\n return {\n ...entry,\n links: entry.links ? entry.links.map((link) => normalizeLinkUrls(link, baseUrl)) : entry.links,\n };\n}\n\n/**\n * Normalize URLs in link\n */\nfunction normalizeLinkUrls(link: AtomLink, baseUrl: string | URL): AtomLink {\n return {\n ...link,\n href: normalizeUrlHttps(baseUrl, link.href),\n };\n}\n","/**\n * Feed format detection utilities.\n *\n * @packageDocumentation\n */\n\n/**\n * Feed format type.\n *\n * @remarks\n * Represents the detected or expected format of a feed.\n * - `'rss'` - RSS 2.0, 0.9x, or RSS 1.0 (RDF)\n * - `'atom'` - Atom 1.0\n * - `'json-feed'` - JSON Feed 1.0 or 1.1\n * - `'unknown'` - Format could not be determined\n */\nexport type FeedFormat = 'rss' | 'atom' | 'json-feed' | 'unknown';\n\n/**\n * Detect feed format from content string.\n *\n * @remarks\n * Analyzes the content to determine if it's RSS, Atom, or JSON Feed.\n * Detection is based on root elements, namespaces, and structure.\n *\n * Detection priority:\n * 1. JSON Feed (checks for JSON with jsonfeed.org version)\n * 2. RSS (checks for `<rss>` or `<rdf:RDF>` root elements)\n * 3. Atom (checks for `<feed>` root element with Atom namespace)\n *\n * @param content - Feed content as string\n * @returns Detected format or 'unknown' if format cannot be determined\n *\n * @example\n * ```typescript\n * const format = detectFormat(feedContent);\n * if (format === 'rss') {\n * console.log('This is an RSS feed');\n * }\n * ```\n */\nexport function detectFormat(content: string): FeedFormat {\n if (!content || typeof content !== 'string') {\n return 'unknown';\n }\n\n const trimmed = content.trim();\n\n // Check for JSON Feed (starts with { or [)\n if (trimmed.startsWith('{') || trimmed.startsWith('[')) {\n // Try to parse as JSON\n try {\n const data = JSON.parse(trimmed);\n if (\n data &&\n typeof data === 'object' &&\n !Array.isArray(data) &&\n data.version &&\n typeof data.version === 'string' &&\n data.version.includes('jsonfeed.org')\n ) {\n return 'json-feed';\n }\n } catch {\n // Not valid JSON\n }\n return 'unknown';\n }\n\n // Must be XML-based (RSS or Atom)\n // Remove XML declaration and comments for easier parsing\n const cleaned = trimmed\n .replace(/<\\?xml[^?]*\\?>/gi, '')\n .replace(/<!--[\\s\\S]*?-->/g, '')\n .trim();\n\n // Check for RSS root element first (most reliable)\n if (cleaned.match(/<rss[\\s>]/i)) {\n return 'rss';\n }\n\n // Check for Atom root element\n if (cleaned.match(/<feed[\\s>]/i)) {\n return 'atom';\n }\n\n // Check for Atom as root namespace (not just xmlns:atom extension)\n // Only if feed is the root element\n if (cleaned.match(/<feed[^>]*xmlns=\"http:\\/\\/www\\.w3\\.org\\/2005\\/Atom\"/i)) {\n return 'atom';\n }\n\n // Check for RDF-based RSS 1.0\n if (cleaned.match(/<rdf:RDF/i) && cleaned.includes('rss/1.0')) {\n return 'rss';\n }\n\n // Check for channel element (common in RSS)\n if (cleaned.match(/<channel[\\s>]/i)) {\n return 'rss';\n }\n\n return 'unknown';\n}\n\n/**\n * Check if content is a valid feed (any format).\n *\n * @param content - Feed content as string\n * @returns `true` if content is RSS, Atom, or JSON Feed\n *\n * @example\n * ```typescript\n * if (isFeed(content)) {\n * const result = parseFeed(content);\n * }\n * ```\n */\nexport function isFeed(content: string): boolean {\n return detectFormat(content) !== 'unknown';\n}\n\n/**\n * Check if content is RSS format.\n *\n * @param content - Feed content as string\n * @returns `true` if content is RSS (any version)\n */\nexport function isRSS(content: string): boolean {\n return detectFormat(content) === 'rss';\n}\n\n/**\n * Check if content is Atom format.\n *\n * @param content - Feed content as string\n * @returns `true` if content is Atom 1.0\n */\nexport function isAtom(content: string): boolean {\n return detectFormat(content) === 'atom';\n}\n\n/**\n * Check if content is JSON Feed format.\n *\n * @param content - Feed content as string\n * @returns `true` if content is JSON Feed (1.0 or 1.1)\n */\nexport function isJSONFeed(content: string): boolean {\n return detectFormat(content) === 'json-feed';\n}\n","/**\n * JSON Feed validation utilities\n */\n\nimport type { JSONFeed } from './types.js';\n\n/**\n * Validation error\n */\nexport interface ValidationError {\n field: string;\n message: string;\n}\n\n/**\n * Validate JSON Feed structure\n * Returns array of errors (empty if valid)\n */\nexport function validate(data: unknown): ValidationError[] {\n const errors: ValidationError[] = [];\n\n // Must be an object\n if (!data || typeof data !== 'object' || Array.isArray(data)) {\n errors.push({ field: 'root', message: 'Feed must be a JSON object' });\n return errors;\n }\n\n const feed = data as Partial<JSONFeed>;\n\n // Required: version\n if (!feed.version) {\n errors.push({ field: 'version', message: 'Missing required field: version' });\n } else if (typeof feed.version !== 'string') {\n errors.push({ field: 'version', message: 'Field \"version\" must be a string' });\n } else if (\n !feed.version.includes('jsonfeed.org/version/1') &&\n !feed.version.startsWith('https://jsonfeed.org/version/1')\n ) {\n errors.push({\n field: 'version',\n message: 'Unsupported version (expected JSON Feed 1.0 or 1.1)',\n });\n }\n\n // Required: title\n if (!feed.title) {\n errors.push({ field: 'title', message: 'Missing required field: title' });\n } else if (typeof feed.title !== 'string') {\n errors.push({ field: 'title', message: 'Field \"title\" must be a string' });\n }\n\n // Required: items\n if (!feed.items) {\n errors.push({ field: 'items', message: 'Missing required field: items' });\n } else if (!Array.isArray(feed.items)) {\n errors.push({ field: 'items', message: 'Field \"items\" must be an array' });\n } else {\n // Validate each item\n for (let i = 0; i < feed.items.length; i++) {\n const item = feed.items[i];\n\n // Each item must have an id\n if (!item || typeof item !== 'object') {\n errors.push({ field: `items[${i}]`, message: 'Item must be an object' });\n continue;\n }\n\n if (!item.id) {\n errors.push({ field: `items[${i}].id`, message: 'Missing required field: id' });\n } else if (typeof item.id !== 'string') {\n errors.push({ field: `items[${i}].id`, message: 'Field \"id\" must be a string' });\n }\n\n // Must have content_html or content_text\n if (!item.content_html && !item.content_text) {\n // This is a warning, not an error (some feeds only have title)\n // But according to spec, at least one should be present\n }\n }\n }\n\n return errors;\n}\n\n/**\n * Check if data is valid JSON Feed\n */\nexport function isValid(data: unknown): boolean {\n return validate(data).length === 0;\n}\n","/**\n * JSON Feed parser\n */\n\nimport { normalizeUrlHttps } from '../../utils/normalize-url.js';\nimport type { JSONFeed, JSONFeedAttachment, JSONFeedDocument, JSONFeedItem } from './types.js';\nimport { validate } from './validate.js';\n\n/**\n * Parse JSON Feed from string\n * @param jsonString - Raw JSON string\n * @param baseUrl - Optional base URL for resolving relative URLs\n * @returns Parsed JSON Feed document\n * @throws Error if JSON is invalid or feed validation fails\n */\nexport function parseJSONFeed(jsonString: string, baseUrl?: string | URL): JSONFeedDocument {\n // Parse JSON\n let data: unknown;\n try {\n data = JSON.parse(jsonString);\n } catch (error) {\n throw new Error(`Invalid JSON: ${error instanceof Error ? error.message : 'Unknown error'}`);\n }\n\n // Validate feed structure\n const errors = validate(data);\n if (errors.length > 0) {\n const errorMessages = errors.map((e) => `${e.field}: ${e.message}`).join('; ');\n throw new Error(`Invalid JSON Feed: ${errorMessages}`);\n }\n\n const feed = data as JSONFeed;\n\n // Extract version\n const version = extractVersion(feed.version);\n\n // Apply URL normalization if base URL provided\n const normalizedFeed = baseUrl ? normalizeFeedUrls(feed, baseUrl) : feed;\n\n return {\n version,\n feed: normalizedFeed,\n };\n}\n\n/**\n * Normalize all URLs in JSON Feed\n */\nfunction normalizeFeedUrls(feed: JSONFeed, baseUrl: string | URL): JSONFeed {\n return {\n ...feed,\n home_page_url: feed.home_page_url\n ? normalizeUrlHttps(baseUrl, feed.home_page_url)\n : feed.home_page_url,\n feed_url: feed.feed_url ? normalizeUrlHttps(baseUrl, feed.feed_url) : feed.feed_url,\n icon: feed.icon ? normalizeUrlHttps(baseUrl, feed.icon) : feed.icon,\n favicon: feed.favicon ? normalizeUrlHttps(baseUrl, feed.favicon) : feed.favicon,\n items: feed.items ? feed.items.map((item) => normalizeItemUrls(item, baseUrl)) : feed.items,\n };\n}\n\n/**\n * Normalize all URLs in item\n */\nfunction normalizeItemUrls(item: JSONFeedItem, baseUrl: string | URL): JSONFeedItem {\n return {\n ...item,\n url: item.url ? normalizeUrlHttps(baseUrl, item.url) : item.url,\n external_url: item.external_url\n ? normalizeUrlHttps(baseUrl, item.external_url)\n : item.external_url,\n image: item.image ? normalizeUrlHttps(baseUrl, item.image) : item.image,\n banner_image: item.banner_image\n ? normalizeUrlHttps(baseUrl, item.banner_image)\n : item.banner_image,\n attachments: item.attachments\n ? item.attachments.map((attachment) => normalizeAttachmentUrls(attachment, baseUrl))\n : item.attachments,\n };\n}\n\n/**\n * Normalize URLs in attachment\n */\nfunction normalizeAttachmentUrls(\n attachment: JSONFeedAttachment,\n baseUrl: string | URL,\n): JSONFeedAttachment {\n return {\n ...attachment,\n url: normalizeUrlHttps(baseUrl, attachment.url),\n };\n}\n\n/**\n * Extract version number from version URL\n */\nfunction extractVersion(versionUrl: string): string {\n // Extract version from URLs like:\n // \"https://jsonfeed.org/version/1.1\"\n // \"https://jsonfeed.org/version/1\"\n const match = versionUrl.match(/version\\/([\\d.]+)/);\n return match ? match[1] : versionUrl;\n}\n","/**\n * Normalize format-specific feeds to unified interface\n */\n\nimport type { AtomDocument } from './atom/types.js';\nimport type { JSONFeedDocument } from './json-feed/types.js';\nimport type { RssFeedExtended, RssItemExtended } from './rss/types.js';\nimport type { Feed, FeedAuthor, FeedEnclosure, FeedItem } from './types.js';\n\n/**\n * Normalize RSS feed to unified format\n */\nexport function normalizeRSS(rss: RssFeedExtended): Feed {\n const { channel, items } = rss;\n\n return {\n format: 'rss',\n title: channel.title,\n description: channel.description,\n url: channel.link,\n feedUrl: undefined, // RSS doesn't have self-link in standard fields\n language: channel.language,\n image: channel.image?.url,\n authors: channel.managingEditor\n ? [{ name: channel.managingEditor, email: channel.managingEditor }]\n : undefined,\n updated: channel.lastBuildDate || channel.pubDate,\n items: items.map((item: RssItemExtended): FeedItem => {\n return {\n id: item.guid?.value || item.link || item.title || '',\n title: item.title,\n url: item.link,\n contentHtml: item.namespaces?.contentEncoded || item.description,\n contentText: item.namespaces?.contentEncoded ? undefined : item.description,\n summary: item.description,\n published: item.pubDate,\n authors:\n item.author || item.namespaces?.dcCreator\n ? [{ name: item.author || item.namespaces?.dcCreator || '' }]\n : undefined,\n tags: item.category,\n image: item.namespaces?.mediaThumbnail?.[0]?.url,\n enclosures: item.enclosure\n ? [\n {\n url: item.enclosure.url,\n type: item.enclosure.type,\n length: item.enclosure.length,\n },\n ]\n : undefined,\n };\n }),\n };\n}\n\n/**\n * Normalize Atom feed to unified format\n */\nexport function normalizeAtom(atom: AtomDocument): Feed {\n const { feed, entries } = atom;\n\n // Find self link\n const selfLink = feed.links?.find((l) => l.rel === 'self');\n const alternateLink = feed.links?.find((l) => l.rel === 'alternate' || !l.rel);\n\n return {\n format: 'atom',\n title: feed.title,\n description: feed.subtitle,\n url: alternateLink?.href,\n feedUrl: selfLink?.href,\n language: undefined, // Atom doesn't have top-level language\n image: feed.logo || feed.icon,\n authors: feed.authors?.map(\n (a): FeedAuthor => ({\n name: a.name,\n email: a.email,\n url: a.uri,\n }),\n ),\n updated: feed.updated,\n items: entries.map((entry): FeedItem => {\n const entryAlternateLink = entry.links?.find((l) => l.rel === 'alternate' || !l.rel);\n const entryRelatedLink = entry.links?.find((l) => l.rel === 'related');\n\n return {\n id: entry.id,\n title: entry.title,\n url: entryAlternateLink?.href,\n externalUrl: entryRelatedLink?.href,\n contentHtml: entry.content?.type === 'html' ? entry.content.value : undefined,\n contentText: entry.content?.type === 'text' ? entry.content.value : undefined,\n summary: entry.summary,\n published: entry.published,\n modified: entry.updated,\n authors: entry.authors?.map(\n (a): FeedAuthor => ({\n name: a.name,\n email: a.email,\n url: a.uri,\n }),\n ),\n tags: entry.categories?.map((c) => c.term),\n image: undefined, // Atom doesn't have item images in standard\n };\n }),\n };\n}\n\n/**\n * Normalize JSON Feed to unified format\n */\nexport function normalizeJSONFeed(jsonFeed: JSONFeedDocument): Feed {\n const { feed } = jsonFeed;\n\n return {\n format: 'json-feed',\n title: feed.title,\n description: feed.description,\n url: feed.home_page_url,\n feedUrl: feed.feed_url,\n language: feed.language,\n image: feed.icon || feed.favicon,\n authors: feed.authors?.map(\n (a): FeedAuthor => ({\n name: a.name,\n email: undefined,\n url: a.url,\n }),\n ),\n updated: undefined, // JSON Feed doesn't have feed-level updated\n items: feed.items.map((item): FeedItem => {\n return {\n id: item.id,\n title: item.title,\n url: item.url,\n externalUrl: item.external_url,\n contentHtml: item.content_html,\n contentText: item.content_text,\n summary: item.summary,\n published: item.date_published,\n modified: item.date_modified,\n authors: item.authors?.map(\n (a): FeedAuthor => ({\n name: a.name,\n email: undefined,\n url: a.url,\n }),\n ),\n tags: item.tags,\n image: item.image || item.banner_image,\n enclosures: item.attachments?.map(\n (a): FeedEnclosure => ({\n url: a.url,\n type: a.mime_type,\n length: a.size_in_bytes,\n }),\n ),\n };\n }),\n };\n}\n","/**\n * Text cleaning utilities for RSS feeds\n * Handles CDATA, HTML entities, and whitespace normalization\n */\n\n/**\n * Strip CDATA tags from text\n * RSS feeds often wrap content in CDATA sections\n * Handles leading/trailing whitespace before CDATA markers\n */\nexport function stripCDATA(text: string): string {\n if (!text) return text;\n return text.replace(/^\\s*<!\\[CDATA\\[/, '').replace(/\\]\\]>\\s*$/, '');\n}\n\n/**\n * Decode common HTML entities\n * Basic entity decoding for feed content\n */\nexport function decodeEntities(text: string): string {\n if (!text) return text;\n\n const entities: Record<string, string> = {\n '&amp;': '&',\n '&lt;': '<',\n '&gt;': '>',\n '&quot;': '\"',\n '&apos;': \"'\",\n '&nbsp;': ' ',\n '&#39;': \"'\",\n '&#x27;': \"'\",\n };\n\n let result = text;\n for (const [entity, char] of Object.entries(entities)) {\n result = result.replaceAll(entity, char);\n }\n\n // Handle numeric entities\n result = result.replace(/&#(\\d+);/g, (_, dec) => {\n return String.fromCharCode(Number.parseInt(dec, 10));\n });\n\n result = result.replace(/&#x([0-9a-fA-F]+);/g, (_, hex) => {\n return String.fromCharCode(Number.parseInt(hex, 16));\n });\n\n return result;\n}\n\n/**\n * Normalize whitespace\n * Trim and collapse multiple spaces\n */\nexport function normalizeWhitespace(text: string, preserveLineBreaks = false): string {\n if (!text) return text;\n\n let result = text.trim();\n\n if (preserveLineBreaks) {\n // Collapse spaces but keep line breaks\n result = result.replace(/ +/g, ' ');\n result = result.replace(/\\n +/g, '\\n');\n result = result.replace(/ +\\n/g, '\\n');\n } else {\n // Collapse all whitespace\n result = result.replace(/\\s+/g, ' ');\n }\n\n return result;\n}\n\n/**\n * Clean text from RSS feed\n * Combines CDATA stripping, entity decoding, and whitespace normalization\n */\nexport function cleanText(\n text: string | null | undefined,\n options: {\n stripCdata?: boolean;\n decodeEntities?: boolean;\n normalizeWhitespace?: boolean;\n preserveLineBreaks?: boolean;\n } = {},\n): string {\n if (text === null || text === undefined) return '';\n if (typeof text !== 'string') return '';\n\n const {\n stripCdata = true,\n decodeEntities: shouldDecodeEntities = true,\n normalizeWhitespace: shouldNormalizeWhitespace = true,\n preserveLineBreaks = false,\n } = options;\n\n let result = text;\n\n if (stripCdata) {\n result = stripCDATA(result);\n }\n\n if (shouldDecodeEntities) {\n result = decodeEntities(result);\n }\n\n if (shouldNormalizeWhitespace) {\n result = normalizeWhitespace(result, preserveLineBreaks);\n }\n\n return result;\n}\n","/**\n * RSS date parsing utilities\n * RSS 2.0 uses RFC 822 date format\n * Examples: \"Wed, 02 Oct 2002 13:00:00 GMT\", \"Wed, 02 Oct 2002 15:00:00 +0200\"\n */\n\n/**\n * Parse RFC 822 date to ISO 8601 string\n * Returns null if date is invalid or cannot be parsed\n */\nexport function parseRFC822Date(dateString: string | null | undefined): string | null {\n if (!dateString || typeof dateString !== 'string') {\n return null;\n }\n\n const trimmed = dateString.trim();\n if (!trimmed) {\n return null;\n }\n\n try {\n // JavaScript's Date constructor handles RFC 822 format\n const date = new Date(trimmed);\n\n // Check if date is valid\n if (Number.isNaN(date.getTime())) {\n return null;\n }\n\n // Return as ISO 8601 string\n return date.toISOString();\n } catch {\n return null;\n }\n}\n\n/**\n * Parse RSS pubDate or lastBuildDate\n * Alias for parseRFC822Date for clarity\n */\nexport function parseRSSDate(dateString: string | null | undefined): string | null {\n return parseRFC822Date(dateString);\n}\n\n/**\n * Check if a date string is valid\n */\nexport function isValidDate(dateString: string | null | undefined): boolean {\n return parseRFC822Date(dateString) !== null;\n}\n","/**\n * Minimal RSS-specific XML parser\n * Built specifically for RSS feeds without HTML parsing quirks\n */\n\nexport interface RSSElement {\n /** Tag name (e.g., 'channel', 'item', 'title') */\n tagName: string;\n /** Element attributes */\n attributes: Record<string, string>;\n /** Text content (with CDATA stripped) */\n text: string;\n /** Child elements */\n children: RSSElement[];\n /** Parent element (for traversal) */\n parent: RSSElement | null;\n}\n\n/**\n * Parse RSS XML string into element tree\n */\nexport function parseRSSXML(xml: string): RSSElement {\n const cleaned = cleanXMLDeclaration(xml);\n const root = parseElement(cleaned, 0).element;\n return root;\n}\n\n/**\n * Remove XML declaration and clean whitespace\n */\nfunction cleanXMLDeclaration(xml: string): string {\n return xml.replace(/<\\?xml[^?]*\\?>/g, '').trim();\n}\n\n/**\n * Extract CDATA content and replace with placeholder\n */\nfunction extractCDATA(text: string): { text: string; cdataMap: Map<string, string> } {\n const cdataMap = new Map<string, string>();\n let counter = 0;\n\n const processed = text.replace(/<!\\[CDATA\\[([\\s\\S]*?)\\]\\]>/g, (_match, content) => {\n const placeholder = `__CDATA_${counter}__`;\n cdataMap.set(placeholder, content);\n counter++;\n return placeholder;\n });\n\n return { text: processed, cdataMap };\n}\n\n/**\n * Restore CDATA content from placeholders\n */\nfunction restoreCDATA(text: string, cdataMap: Map<string, string>): string {\n let result = text;\n for (const [placeholder, content] of cdataMap.entries()) {\n result = result.replace(placeholder, content);\n }\n return result;\n}\n\n/**\n * Parse attributes from opening tag\n */\nfunction parseAttributes(tagContent: string): Record<string, string> {\n const attributes: Record<string, string> = {};\n const attrRegex = /(\\S+)=[\"']([^\"']*)[\"']/g;\n let match: RegExpExecArray | null = attrRegex.exec(tagContent);\n\n while (match !== null) {\n attributes[match[1]] = match[2];\n match = attrRegex.exec(tagContent);\n }\n\n return attributes;\n}\n\n/**\n * Find matching closing tag position\n */\nfunction findClosingTag(xml: string, tagName: string, startPos: number): number {\n const openTag = `<${tagName}`;\n const closeTag = `</${tagName}>`;\n let depth = 1;\n let pos = startPos;\n\n while (pos < xml.length && depth > 0) {\n const nextOpen = xml.indexOf(openTag, pos);\n const nextClose = xml.indexOf(closeTag, pos);\n\n if (nextClose === -1) {\n return -1; // No closing tag found\n }\n\n if (nextOpen !== -1 && nextOpen < nextClose) {\n // Found nested opening tag\n depth++;\n pos = nextOpen + openTag.length;\n } else {\n // Found closing tag\n depth--;\n if (depth === 0) {\n return nextClose;\n }\n pos = nextClose + closeTag.length;\n }\n }\n\n return -1;\n}\n\n/**\n * Parse a single element and its children\n */\nfunction parseElement(\n xml: string,\n startPos: number,\n parent: RSSElement | null = null,\n cdataMap?: Map<string, string>,\n): { element: RSSElement; endPos: number; cdataMap: Map<string, string> } {\n // Extract CDATA first (only at top level)\n const extracted = cdataMap ? { text: xml, cdataMap } : extractCDATA(xml);\n const cleanedXML = extracted.text;\n const currentCdataMap = extracted.cdataMap;\n\n // Find opening tag\n const openTagStart = cleanedXML.indexOf('<', startPos);\n if (openTagStart === -1) {\n throw new Error('No opening tag found');\n }\n\n const openTagEnd = cleanedXML.indexOf('>', openTagStart);\n if (openTagEnd === -1) {\n throw new Error('Unclosed opening tag');\n }\n\n const openTagContent = cleanedXML.substring(openTagStart + 1, openTagEnd);\n\n // Check for self-closing tag\n const isSelfClosing = openTagContent.endsWith('/');\n const tagContent = isSelfClosing ? openTagContent.slice(0, -1).trim() : openTagContent;\n\n // Extract tag name and attributes\n const spaceIndex = tagContent.indexOf(' ');\n const tagName = spaceIndex === -1 ? tagContent : tagContent.substring(0, spaceIndex);\n const attributes = spaceIndex === -1 ? {} : parseAttributes(tagContent.substring(spaceIndex));\n\n const element: RSSElement = {\n tagName,\n attributes,\n text: '',\n children: [],\n parent,\n };\n\n // Handle self-closing tags\n if (isSelfClosing) {\n return { element, endPos: openTagEnd + 1, cdataMap: currentCdataMap };\n }\n\n // Find closing tag\n const closingTagPos = findClosingTag(cleanedXML, tagName, openTagEnd + 1);\n if (closingTagPos === -1) {\n throw new Error(`No closing tag found for <${tagName}>`);\n }\n\n // Extract content between tags\n const content = cleanedXML.substring(openTagEnd + 1, closingTagPos);\n\n // Parse children or text content\n if (content.includes('<')) {\n // Has child elements\n let pos = 0;\n const trimmedContent = content.trim();\n\n while (pos < trimmedContent.length) {\n const nextTag = trimmedContent.indexOf('<', pos);\n if (nextTag === -1) break;\n\n // Check if it's a closing tag or comment\n if (trimmedContent[nextTag + 1] === '/' || trimmedContent[nextTag + 1] === '!') {\n pos = nextTag + 1;\n continue;\n }\n\n try {\n const { element: child, endPos } = parseElement(\n trimmedContent,\n nextTag,\n element,\n currentCdataMap,\n );\n element.children.push(child);\n pos = endPos;\n } catch {\n pos = nextTag + 1;\n }\n }\n\n // Extract text content (without child elements)\n let textContent = content.replace(/<[^>]+>/g, '').trim();\n textContent = restoreCDATA(textContent, currentCdataMap);\n element.text = textContent;\n } else {\n // Pure text content\n let textContent = content.trim();\n textContent = restoreCDATA(textContent, currentCdataMap);\n element.text = textContent;\n }\n\n const closingTagEnd = closingTagPos + `</${tagName}>`.length;\n return { element, endPos: closingTagEnd, cdataMap: currentCdataMap };\n}\n\n/**\n * Query selector - find first matching element\n * XML is case-sensitive, but we'll support case-insensitive matching for convenience\n */\nexport function querySelector(\n element: RSSElement,\n selector: string,\n caseSensitive = false,\n): RSSElement | null {\n const tagName = caseSensitive ? selector : selector.toLowerCase();\n const elementTag = caseSensitive ? element.tagName : element.tagName.toLowerCase();\n\n if (elementTag === tagName) {\n return element;\n }\n\n for (const child of element.children) {\n const found = querySelector(child, selector, caseSensitive);\n if (found) return found;\n }\n\n return null;\n}\n\n/**\n * Query selector all - find all matching elements\n */\nexport function querySelectorAll(\n element: RSSElement,\n selector: string,\n caseSensitive = false,\n): RSSElement[] {\n const results: RSSElement[] = [];\n const tagName = caseSensitive ? selector : selector.toLowerCase();\n const elementTag = caseSensitive ? element.tagName : element.tagName.toLowerCase();\n\n if (elementTag === tagName) {\n results.push(element);\n }\n\n for (const child of element.children) {\n results.push(...querySelectorAll(child, selector, caseSensitive));\n }\n\n return results;\n}\n\n/**\n * Get text content of element\n */\nexport function getText(element: RSSElement | null | undefined): string {\n return element?.text || '';\n}\n\n/**\n * Get attribute value\n */\nexport function getAttribute(element: RSSElement | null | undefined, name: string): string | null {\n return element?.attributes[name] || null;\n}\n","/**\n * Extract RSS channel (feed-level) metadata\n */\n\nimport { cleanText } from './clean-text.js';\nimport { parseRSSDate } from './parse-date.js';\nimport type { RssChannel } from './types.js';\nimport type { RSSElement } from './xml-parser.js';\nimport { getAttribute, getText, querySelector, querySelectorAll } from './xml-parser.js';\n\n/**\n * Extract channel metadata from RSS feed\n */\nexport function extractChannel(channelElement: RSSElement): RssChannel {\n const getTextClean = (selector: string): string => {\n const element = querySelector(channelElement, selector);\n return cleanText(getText(element));\n };\n\n const getNumber = (selector: string): number | undefined => {\n const text = getTextClean(selector);\n if (!text) return undefined;\n const num = Number.parseInt(text, 10);\n return Number.isNaN(num) ? undefined : num;\n };\n\n const getDate = (selector: string): string | undefined => {\n const text = getTextClean(selector);\n return parseRSSDate(text) || undefined;\n };\n\n const getArray = (selector: string): string[] | undefined => {\n const elements = querySelectorAll(channelElement, selector);\n if (elements.length === 0) return undefined;\n const cleaned = elements.map((el) => cleanText(getText(el))).filter((text) => text.length > 0);\n return cleaned.length > 0 ? cleaned : undefined;\n };\n\n // Required fields\n const title = getTextClean('title');\n const link = getTextClean('link');\n const description = getTextClean('description');\n\n // Optional fields\n const language = getTextClean('language') || undefined;\n const copyright = getTextClean('copyright') || undefined;\n const managingEditor = getTextClean('managingEditor') || undefined;\n const webMaster = getTextClean('webMaster') || undefined;\n const pubDate = getDate('pubDate');\n const lastBuildDate = getDate('lastBuildDate');\n const category = getArray('category');\n const generator = getTextClean('generator') || undefined;\n const docs = getTextClean('docs') || undefined;\n const ttl = getNumber('ttl');\n\n // Image\n const imageEl = querySelector(channelElement, 'image');\n const image = imageEl\n ? {\n url: cleanText(getText(querySelector(imageEl, 'url'))),\n title: cleanText(getText(querySelector(imageEl, 'title'))),\n link: cleanText(getText(querySelector(imageEl, 'link'))),\n width: (() => {\n const w = cleanText(getText(querySelector(imageEl, 'width')));\n return w ? Number.parseInt(w, 10) : undefined;\n })(),\n height: (() => {\n const h = cleanText(getText(querySelector(imageEl, 'height')));\n return h ? Number.parseInt(h, 10) : undefined;\n })(),\n description: cleanText(getText(querySelector(imageEl, 'description'))) || undefined,\n }\n : undefined;\n\n // Cloud\n const cloudEl = querySelector(channelElement, 'cloud');\n const cloud = cloudEl\n ? {\n domain: getAttribute(cloudEl, 'domain') || '',\n port: Number.parseInt(getAttribute(cloudEl, 'port') || '0', 10),\n path: getAttribute(cloudEl, 'path') || '',\n registerProcedure: getAttribute(cloudEl, 'registerProcedure') || '',\n protocol: getAttribute(cloudEl, 'protocol') || '',\n }\n : undefined;\n\n // Skip hours and days\n const skipHoursEl = querySelector(channelElement, 'skipHours');\n const skipHours = skipHoursEl\n ? querySelectorAll(skipHoursEl, 'hour')\n .map((el) => Number.parseInt(getText(el), 10))\n .filter((n) => !Number.isNaN(n))\n : undefined;\n\n const skipDaysEl = querySelector(channelElement, 'skipDays');\n const skipDays = skipDaysEl\n ? querySelectorAll(skipDaysEl, 'day')\n .map((el) => cleanText(getText(el)))\n .filter((t) => t.length > 0)\n : undefined;\n\n const channel: RssChannel = {\n title,\n link,\n description,\n };\n\n // Add optional fields only if they exist\n if (language) channel.language = language;\n if (copyright) channel.copyright = copyright;\n if (managingEditor) channel.managingEditor = managingEditor;\n if (webMaster) channel.webMaster = webMaster;\n if (pubDate) channel.pubDate = pubDate;\n if (lastBuildDate) channel.lastBuildDate = lastBuildDate;\n if (category) channel.category = category;\n if (generator) channel.generator = generator;\n if (docs) channel.docs = docs;\n if (cloud) channel.cloud = cloud;\n if (ttl) channel.ttl = ttl;\n if (image) channel.image = image;\n if (skipHours && skipHours.length > 0) channel.skipHours = skipHours;\n if (skipDays && skipDays.length > 0) channel.skipDays = skipDays;\n\n return channel;\n}\n","/**\n * Extract RSS item (article/entry) data\n */\n\nimport { cleanText } from './clean-text.js';\nimport { parseRSSDate } from './parse-date.js';\nimport type { RssEnclosure, RssGuid, RssItem, RssSource } from './types.js';\nimport type { RSSElement } from './xml-parser.js';\nimport { getAttribute, getText, querySelector, querySelectorAll } from './xml-parser.js';\n\n/**\n * Extract item data from RSS feed\n */\nexport function extractItem(itemElement: RSSElement): RssItem {\n const getTextClean = (selector: string): string | undefined => {\n const element = querySelector(itemElement, selector);\n const text = cleanText(getText(element));\n return text || undefined;\n };\n\n const getDate = (selector: string): string | undefined => {\n const text = getTextClean(selector);\n return text ? parseRSSDate(text) || undefined : undefined;\n };\n\n const getArray = (selector: string): string[] | undefined => {\n const elements = querySelectorAll(itemElement, selector);\n if (elements.length === 0) return undefined;\n const cleaned = elements.map((el) => cleanText(getText(el))).filter((text) => text.length > 0);\n return cleaned.length > 0 ? cleaned : undefined;\n };\n\n // RSS 2.0 spec: An item must have either title or description (or both)\n const title = getTextClean('title');\n const link = getTextClean('link');\n const description = getTextClean('description');\n const author = getTextClean('author');\n const category = getArray('category');\n const comments = getTextClean('comments');\n const pubDate = getDate('pubDate');\n\n // Enclosure\n const enclosureEl = querySelector(itemElement, 'enclosure');\n const enclosure: RssEnclosure | undefined = enclosureEl\n ? {\n url: getAttribute(enclosureEl, 'url') || '',\n length: Number.parseInt(getAttribute(enclosureEl, 'length') || '0', 10),\n type: getAttribute(enclosureEl, 'type') || '',\n }\n : undefined;\n\n // GUID\n const guidEl = querySelector(itemElement, 'guid');\n const guid: RssGuid | undefined = guidEl\n ? {\n value: cleanText(getText(guidEl)),\n isPermaLink: getAttribute(guidEl, 'isPermaLink')?.toLowerCase() !== 'false',\n }\n : undefined;\n\n // Source\n const sourceEl = querySelector(itemElement, 'source');\n const source: RssSource | undefined = sourceEl\n ? {\n value: cleanText(getText(sourceEl)),\n url: getAttribute(sourceEl, 'url') || '',\n }\n : undefined;\n\n const item: RssItem = {};\n\n // Add fields only if they exist (RSS spec allows items with minimal data)\n if (title) item.title = title;\n if (link) item.link = link;\n if (description) item.description = description;\n if (author) item.author = author;\n if (category) item.category = category;\n if (comments) item.comments = comments;\n if (enclosure) item.enclosure = enclosure;\n if (guid) item.guid = guid;\n if (pubDate) item.pubDate = pubDate;\n if (source) item.source = source;\n\n return item;\n}\n\n/**\n * Extract all items from channel\n */\nexport function extractItems(channelElement: RSSElement): RssItem[] {\n const itemElements = querySelectorAll(channelElement, 'item');\n return itemElements.map((itemEl) => extractItem(itemEl));\n}\n","/**\n * Extract RSS namespace extensions\n * Common namespaces: content:encoded, dc:creator, media:*, atom:link\n */\n\n// import type { RssMediaContent, RssMediaThumbnail } from './types.js';\nimport { cleanText } from './clean-text.js';\nimport { parseRSSDate } from './parse-date.js';\nimport type { RssNamespaces } from './types.js';\nimport type { RSSElement } from './xml-parser.js';\nimport { getAttribute, getText, querySelector, querySelectorAll } from './xml-parser.js';\n\n/**\n * Extract namespace extensions from item\n */\nexport function extractNamespaces(itemElement: RSSElement): RssNamespaces {\n const namespaces: RssNamespaces = {};\n\n // content:encoded - Full content (often HTML)\n const contentEncoded = querySelector(itemElement, 'content:encoded');\n if (contentEncoded) {\n namespaces.contentEncoded = cleanText(getText(contentEncoded), {\n preserveLineBreaks: true,\n });\n }\n\n // dc:creator - Dublin Core creator (author)\n const dcCreator = querySelector(itemElement, 'dc:creator');\n if (dcCreator) {\n namespaces.dcCreator = cleanText(getText(dcCreator));\n }\n\n // dc:date - Dublin Core date (alternative to pubDate)\n const dcDate = querySelector(itemElement, 'dc:date');\n if (dcDate) {\n const dateText = cleanText(getText(dcDate));\n // dc:date uses ISO 8601, not RFC 822\n const parsed = parseRSSDate(dateText);\n if (parsed) {\n namespaces.dcDate = parsed;\n }\n }\n\n // dc:subject - Dublin Core subject (categories)\n const dcSubjects = querySelectorAll(itemElement, 'dc:subject');\n if (dcSubjects.length > 0) {\n const subjects = dcSubjects\n .map((el) => cleanText(getText(el)))\n .filter((text) => text.length > 0);\n if (subjects.length > 0) {\n namespaces.dcSubject = subjects;\n }\n }\n\n // media:content - Media RSS content\n const mediaContents = querySelectorAll(itemElement, 'media:content');\n if (mediaContents.length > 0) {\n namespaces.mediaContent = mediaContents.map((el) => ({\n url: getAttribute(el, 'url') || '',\n type: getAttribute(el, 'type') || undefined,\n medium: getAttribute(el, 'medium') || undefined,\n width: (() => {\n const w = getAttribute(el, 'width');\n return w ? Number.parseInt(w, 10) : undefined;\n })(),\n height: (() => {\n const h = getAttribute(el, 'height');\n return h ? Number.parseInt(h, 10) : undefined;\n })(),\n }));\n }\n\n // media:thumbnail - Media RSS thumbnail\n const mediaThumbnails = querySelectorAll(itemElement, 'media:thumbnail');\n if (mediaThumbnails.length > 0) {\n namespaces.mediaThumbnail = mediaThumbnails.map((el) => ({\n url: getAttribute(el, 'url') || '',\n width: (() => {\n const w = getAttribute(el, 'width');\n return w ? Number.parseInt(w, 10) : undefined;\n })(),\n height: (() => {\n const h = getAttribute(el, 'height');\n return h ? Number.parseInt(h, 10) : undefined;\n })(),\n }));\n }\n\n return namespaces;\n}\n","/**\n * Main RSS feed parser\n * Orchestrates parsing of RSS 2.0, 0.9x feeds\n */\n\nimport { normalizeUrlHttps } from '../../utils/normalize-url.js';\nimport { extractChannel } from './extract-channel.js';\nimport { extractItem } from './extract-item.js';\nimport { extractNamespaces } from './extract-namespaces.js';\nimport type { RssChannel, RssFeedExtended, RssItem, RssItemExtended } from './types.js';\nimport { parseRSSXML, querySelector, querySelectorAll } from './xml-parser.js';\n\n/**\n * Parse RSS feed from XML string\n * Supports RSS 2.0, 0.92, 0.91, 0.9\n * @param xml - RSS XML string\n * @param baseUrl - Optional base URL for resolving relative URLs\n */\nexport function parseRSS(xml: string, baseUrl?: string | URL): RssFeedExtended {\n // Parse XML\n const doc = parseRSSXML(xml);\n\n // Find RSS root element\n const rssEl = querySelector(doc, 'rss');\n if (!rssEl) {\n throw new Error('Invalid RSS: Missing <rss> root element');\n }\n\n // Get RSS version\n const version = rssEl.attributes.version || '2.0';\n\n // Find channel element\n const channelEl = querySelector(rssEl, 'channel');\n if (!channelEl) {\n throw new Error('Invalid RSS: Missing <channel> element');\n }\n\n // Extract channel metadata\n const channel = extractChannel(channelEl);\n\n // Extract items with namespaces\n const itemElements = querySelectorAll(channelEl, 'item');\n const items: RssItemExtended[] = itemElements.map((itemEl) => {\n const item = extractItem(itemEl);\n const namespaces = extractNamespaces(itemEl);\n\n // Only add namespaces if any exist\n if (Object.keys(namespaces).length > 0) {\n return { ...item, namespaces };\n }\n\n return item;\n });\n\n // Apply URL normalization if base URL provided\n const normalizedChannel = baseUrl ? normalizeChannelUrls(channel, baseUrl) : channel;\n const normalizedItems = baseUrl ? items.map((item) => normalizeItemUrls(item, baseUrl)) : items;\n\n return {\n version,\n channel: normalizedChannel,\n items: normalizedItems,\n };\n}\n\n/**\n * Normalize all URLs in channel\n */\nfunction normalizeChannelUrls(channel: RssChannel, baseUrl: string | URL): RssChannel {\n return {\n ...channel,\n link: channel.link ? normalizeUrlHttps(baseUrl, channel.link) : channel.link,\n image: channel.image\n ? {\n ...channel.image,\n url: normalizeUrlHttps(baseUrl, channel.image.url),\n link: channel.image.link\n ? normalizeUrlHttps(baseUrl, channel.image.link)\n : channel.image.link,\n }\n : channel.image,\n docs: channel.docs ? normalizeUrlHttps(baseUrl, channel.docs) : channel.docs,\n };\n}\n\n/**\n * Normalize all URLs in item\n */\nfunction normalizeItemUrls(item: RssItem, baseUrl: string | URL): RssItem {\n return {\n ...item,\n link: item.link ? normalizeUrlHttps(baseUrl, item.link) : item.link,\n comments: item.comments ? normalizeUrlHttps(baseUrl, item.comments) : item.comments,\n enclosure: item.enclosure\n ? {\n ...item.enclosure,\n url: normalizeUrlHttps(baseUrl, item.enclosure.url),\n }\n : item.enclosure,\n };\n}\n\n/**\n * Detect if content is RSS format\n */\nexport function isRSS(xml: string): boolean {\n try {\n const trimmed = xml.trim();\n // Quick check for RSS markers\n return (\n trimmed.includes('<rss') &&\n (trimmed.includes('version=\"2.0\"') ||\n trimmed.includes(\"version='2.0'\") ||\n trimmed.includes('version=\"0.9') ||\n trimmed.includes(\"version='0.9\"))\n );\n } catch {\n return false;\n }\n}\n","/**\n * Unified feed parser with automatic format detection.\n *\n * @packageDocumentation\n */\n\nimport { parseAtom } from './atom/index.js';\nimport { detectFormat, type FeedFormat } from './detect.js';\nimport { parseJSONFeed } from './json-feed/index.js';\nimport { normalizeAtom, normalizeJSONFeed, normalizeRSS } from './normalize.js';\nimport { parseRSS } from './rss/index.js';\nimport type { Feed, ParseResult } from './types.js';\n\n/**\n * Parse any feed format with automatic format detection.\n *\n * @remarks\n * This is the main entry point for feed parsing. It automatically detects whether\n * the content is RSS, Atom, or JSON Feed, parses it, and returns a normalized\n * output structure along with the original format-specific data.\n *\n * All relative URLs in the feed are converted to absolute URLs if a base URL is provided.\n * This is essential for feed readers that need to fetch images, enclosures, or follow links.\n *\n * @param content - Feed content as string (XML or JSON)\n * @param baseUrl - Optional base URL for resolving relative URLs (string or URL object)\n * @returns Object containing normalized feed data and original format-specific data\n * @throws Error if format cannot be detected or parsing fails\n *\n * @example\n * ```typescript\n * const feedContent = await fetch('https://example.com/feed.xml').then(r => r.text());\n * const result = parseFeed(feedContent, 'https://example.com/feed.xml');\n *\n * console.log(result.feed.title);\n * console.log(result.feed.items[0].title);\n * console.log(result.feed.items[0].url); // Absolute URL\n * ```\n */\nexport function parseFeed(content: string, baseUrl?: string | URL): ParseResult {\n const format = detectFormat(content);\n\n if (format === 'unknown') {\n throw new Error('Unable to detect feed format. Content must be RSS, Atom, or JSON Feed.');\n }\n\n return parseFeedAs(content, format, baseUrl);\n}\n\n/**\n * Parse feed with explicit format specification.\n *\n * @remarks\n * Use this function when you already know the feed format and want to skip\n * automatic detection. This can be slightly faster than {@link parseFeed}\n * and provides more control over the parsing process.\n *\n * @param content - Feed content as string (XML or JSON)\n * @param format - Explicit format to parse as ('rss', 'atom', or 'json-feed')\n * @param baseUrl - Optional base URL for resolving relative URLs\n * @returns Object containing normalized feed data and original format-specific data\n * @throws Error if parsing fails or format is 'unknown'\n *\n * @example\n * ```typescript\n * // Parse known RSS feed\n * const result = parseFeedAs(rssContent, 'rss', 'https://example.com/feed.xml');\n * ```\n */\nexport function parseFeedAs(\n content: string,\n format: FeedFormat,\n baseUrl?: string | URL,\n): ParseResult {\n if (format === 'unknown') {\n throw new Error('Cannot parse feed with format \"unknown\"');\n }\n\n switch (format) {\n case 'rss': {\n const rss = parseRSS(content, baseUrl);\n return {\n feed: normalizeRSS(rss),\n original: rss,\n };\n }\n\n case 'atom': {\n const atom = parseAtom(content, baseUrl);\n return {\n feed: normalizeAtom(atom),\n original: atom,\n };\n }\n\n case 'json-feed': {\n const jsonFeed = parseJSONFeed(content, baseUrl);\n return {\n feed: normalizeJSONFeed(jsonFeed),\n original: jsonFeed,\n };\n }\n }\n}\n\n/**\n * Parse feed and return only normalized data.\n *\n * @remarks\n * Convenience wrapper around {@link parseFeed} that returns only the normalized\n * feed data without the original format-specific data. Use this when you don't\n * need access to format-specific fields.\n *\n * @param content - Feed content as string (XML or JSON)\n * @param baseUrl - Optional base URL for resolving relative URLs\n * @returns Normalized feed data only\n * @throws Error if format cannot be detected or parsing fails\n *\n * @example\n * ```typescript\n * const feed = parseFeedNormalized(content, 'https://example.com/feed.xml');\n * console.log(feed.title);\n * console.log(feed.items.length);\n * ```\n */\nexport function parseFeedNormalized(content: string, baseUrl?: string | URL): Feed {\n return parseFeed(content, baseUrl).feed;\n}\n","/**\n * Enhanced fetch types for web scraping.\n *\n * @remarks\n * Types for pluck() - fetch-compatible enhanced HTTP client.\n *\n * @author Anonyfox <max@anonyfox.com>\n * @license MIT\n * @see {@link https://github.com/Anonyfox/ravenjs}\n * @see {@link https://ravenjs.dev}\n * @see {@link https://anonyfox.com}\n *\n * @packageDocumentation\n */\n\n/**\n * Extended RequestInit with pluck-specific options.\n *\n * @remarks\n * Extends standard fetch RequestInit with additional options for\n * robust web scraping. All standard fetch options are supported.\n */\nexport interface PluckInit extends RequestInit {\n /**\n * Request timeout in milliseconds.\n *\n * @default 30000 (30 seconds)\n */\n timeout?: number;\n\n /**\n * Maximum number of redirects to follow.\n *\n * @default 10\n */\n maxRedirects?: number;\n\n /**\n * Maximum response size in bytes.\n *\n * @default 10485760 (10MB)\n */\n maxSize?: number;\n\n /**\n * User-Agent header shortcut.\n *\n * @remarks\n * Convenience property that sets the User-Agent header.\n * Overrides any User-Agent in the headers object.\n */\n userAgent?: string;\n\n /**\n * Throw error on HTTP error status (4xx, 5xx).\n *\n * @default true\n */\n throwOnHttpError?: boolean;\n\n /**\n * Validate Content-Type header.\n *\n * @remarks\n * If true, throws error if Content-Type is not in allowedContentTypes.\n *\n * @default false\n */\n strictContentType?: boolean;\n\n /**\n * Allowed Content-Type values for strictContentType.\n *\n * @default ['text/html', 'text/xml', 'application/xml', 'application/xhtml+xml', 'application/rss+xml', 'application/atom+xml', 'application/json']\n */\n allowedContentTypes?: string[];\n\n /**\n * Follow redirects automatically.\n *\n * @remarks\n * If false, returns the 3xx response directly without following.\n *\n * @default true\n */\n followRedirects?: boolean;\n\n /**\n * Validate detected encoding.\n *\n * @remarks\n * If true, throws error if detected encoding is invalid or unsupported.\n *\n * @default true\n */\n validateEncoding?: boolean;\n}\n\n/**\n * Enhanced Response with pluck-specific properties.\n *\n * @remarks\n * Extends standard Response with additional metadata about the request.\n * All standard Response properties and methods are available.\n */\nexport interface PluckResponse extends Response {\n /**\n * Final URL after following redirects.\n */\n finalUrl: string;\n\n /**\n * Original request URL.\n */\n originalUrl: string;\n\n /**\n * Array of redirect URLs (excluding original and final).\n */\n redirectChain: string[];\n\n /**\n * Detected character encoding.\n *\n * @example 'utf-8', 'windows-1252', 'iso-8859-1'\n */\n detectedEncoding: string;\n\n /**\n * Request timing information.\n */\n timing: {\n /** Request start timestamp (milliseconds since epoch) */\n start: number;\n /** Request end timestamp (milliseconds since epoch) */\n end: number;\n /** Total duration in milliseconds */\n duration: number;\n /** Time spent in redirects (milliseconds) */\n redirectDuration?: number;\n };\n\n /**\n * Get response body as UTF-8 text.\n *\n * @remarks\n * Unlike standard text(), this guarantees UTF-8 output regardless\n * of the source encoding. Uses detected encoding to decode properly.\n *\n * @returns UTF-8 decoded text\n */\n textUtf8(): Promise<string>;\n}\n\n/**\n * Base error class for pluck errors.\n */\nexport class PluckError extends Error {\n constructor(message: string) {\n super(message);\n this.name = 'PluckError';\n Error.captureStackTrace?.(this, this.constructor);\n }\n}\n\n/**\n * Network error (connection failed, DNS, etc.).\n */\nexport class PluckNetworkError extends PluckError {\n constructor(\n message: string,\n public readonly cause?: Error,\n ) {\n super(message);\n this.name = 'PluckNetworkError';\n }\n}\n\n/**\n * Request timeout error.\n */\nexport class PluckTimeoutError extends PluckError {\n constructor(\n message: string,\n public readonly timeoutMs: number,\n ) {\n super(message);\n this.name = 'PluckTimeoutError';\n }\n}\n\n/**\n * HTTP error (4xx, 5xx status codes).\n */\nexport class PluckHttpError extends PluckError {\n constructor(\n message: string,\n public readonly statusCode: number,\n public readonly statusText: string,\n public readonly response: Response,\n ) {\n super(message);\n this.name = 'PluckHttpError';\n }\n}\n\n/**\n * Response size exceeded maximum.\n */\nexport class PluckSizeError extends PluckError {\n constructor(\n message: string,\n public readonly maxSize: number,\n public readonly actualSize?: number,\n ) {\n super(message);\n this.name = 'PluckSizeError';\n }\n}\n\n/**\n * Encoding detection or conversion error.\n */\nexport class PluckEncodingError extends PluckError {\n constructor(\n message: string,\n public readonly encoding?: string,\n public readonly cause?: Error,\n ) {\n super(message);\n this.name = 'PluckEncodingError';\n }\n}\n\n/**\n * Too many redirects or redirect loop detected.\n */\nexport class PluckRedirectError extends PluckError {\n constructor(\n message: string,\n public readonly redirectChain: string[],\n public readonly maxRedirects?: number,\n ) {\n super(message);\n this.name = 'PluckRedirectError';\n }\n}\n\n/**\n * Invalid or disallowed Content-Type.\n */\nexport class PluckContentTypeError extends PluckError {\n constructor(\n message: string,\n public readonly contentType: string,\n public readonly allowedTypes?: string[],\n ) {\n super(message);\n this.name = 'PluckContentTypeError';\n }\n}\n","/**\n * Character encoding detection and conversion.\n *\n * @remarks\n * Detects character encoding from BOM, HTTP headers, and HTML meta tags.\n * Converts all content to UTF-8 using native TextDecoder.\n *\n * @author Anonyfox <max@anonyfox.com>\n * @license MIT\n *\n * @packageDocumentation\n */\n\nimport { PluckEncodingError } from './types.js';\n\n/**\n * Detect character encoding from various sources.\n *\n * @remarks\n * Priority order:\n * 1. BOM (Byte Order Mark) in content\n * 2. charset in Content-Type header\n * 3. <meta charset> in HTML (first 1KB)\n * 4. <meta http-equiv=\"Content-Type\"> in HTML\n * 5. Default to UTF-8\n *\n * @param buffer - Response body as ArrayBuffer\n * @param contentType - Content-Type header value\n * @returns Detected encoding (e.g., 'utf-8', 'windows-1252')\n */\nexport function detectEncoding(buffer: ArrayBuffer, contentType?: string | null): string {\n // Check BOM first (most reliable)\n const bomEncoding = detectBOM(buffer);\n if (bomEncoding) {\n return bomEncoding;\n }\n\n // Check Content-Type header\n if (contentType) {\n const headerEncoding = parseCharsetFromContentType(contentType);\n if (headerEncoding) {\n return headerEncoding;\n }\n }\n\n // Check HTML meta tags (first 1KB only)\n const preview = new Uint8Array(buffer.slice(0, 1024));\n const previewText = new TextDecoder('utf-8', { fatal: false }).decode(preview);\n const metaEncoding = parseCharsetFromHtml(previewText);\n if (metaEncoding) {\n return metaEncoding;\n }\n\n // Default to UTF-8\n return 'utf-8';\n}\n\n/**\n * Detect encoding from Byte Order Mark (BOM).\n *\n * @param buffer - Response body as ArrayBuffer\n * @returns Encoding if BOM detected, null otherwise\n */\nfunction detectBOM(buffer: ArrayBuffer): string | null {\n const bytes = new Uint8Array(buffer);\n\n // UTF-8 BOM: EF BB BF\n if (bytes.length >= 3 && bytes[0] === 0xef && bytes[1] === 0xbb && bytes[2] === 0xbf) {\n return 'utf-8';\n }\n\n // UTF-16 LE BOM: FF FE\n if (bytes.length >= 2 && bytes[0] === 0xff && bytes[1] === 0xfe) {\n return 'utf-16le';\n }\n\n // UTF-16 BE BOM: FE FF\n if (bytes.length >= 2 && bytes[0] === 0xfe && bytes[1] === 0xff) {\n return 'utf-16be';\n }\n\n return null;\n}\n\n/**\n * Parse charset from Content-Type header.\n *\n * @param contentType - Content-Type header value\n * @returns Encoding if found, null otherwise\n *\n * @example\n * parseCharsetFromContentType('text/html; charset=utf-8') // 'utf-8'\n * parseCharsetFromContentType('text/html; charset=windows-1252') // 'windows-1252'\n */\nexport function parseCharsetFromContentType(contentType: string): string | null {\n const match = /charset\\s*=\\s*[\"']?([^\"'\\s;]+)/i.exec(contentType);\n if (match) {\n return normalizeEncoding(match[1]);\n }\n return null;\n}\n\n/**\n * Parse charset from HTML meta tags.\n *\n * @remarks\n * Checks for:\n * - `<meta charset=\"XXX\">`\n * - `<meta http-equiv=\"Content-Type\" content=\"text/html; charset=XXX\">`\n *\n * Uses light regex scanning, not full HTML parsing.\n *\n * @param html - HTML content (typically first 1KB)\n * @returns Encoding if found, null otherwise\n */\nexport function parseCharsetFromHtml(html: string): string | null {\n // Check <meta charset=\"XXX\">\n const charsetMatch = /<meta[^>]+charset\\s*=\\s*[\"']?([^\"'\\s>]+)/i.exec(html);\n if (charsetMatch) {\n return normalizeEncoding(charsetMatch[1]);\n }\n\n // Check <meta http-equiv=\"Content-Type\" content=\"...; charset=XXX\">\n const httpEquivMatch =\n /<meta[^>]+http-equiv\\s*=\\s*[\"']?content-type[\"']?[^>]+content\\s*=\\s*[\"']([^\"']+)/i.exec(html);\n if (httpEquivMatch) {\n const charset = parseCharsetFromContentType(httpEquivMatch[1]);\n if (charset) {\n return charset;\n }\n }\n\n return null;\n}\n\n/**\n * Normalize encoding name to standard form.\n *\n * @remarks\n * Handles common aliases and variations.\n *\n * @param encoding - Raw encoding name\n * @returns Normalized encoding name\n */\nfunction normalizeEncoding(encoding: string): string {\n const normalized = encoding.toLowerCase().trim();\n\n // Common aliases\n const aliases: Record<string, string> = {\n utf8: 'utf-8',\n 'iso-8859-1': 'latin1',\n 'iso-88591': 'latin1',\n 'iso8859-1': 'latin1',\n 'windows-1252': 'windows-1252',\n cp1252: 'windows-1252',\n ansi: 'windows-1252',\n };\n\n return aliases[normalized] || normalized;\n}\n\n/**\n * Decode buffer to UTF-8 string.\n *\n * @remarks\n * Uses native TextDecoder with the detected encoding.\n * Always returns UTF-8 string, regardless of source encoding.\n *\n * @param buffer - Response body as ArrayBuffer\n * @param encoding - Character encoding (e.g., 'utf-8', 'windows-1252')\n * @param validate - Whether to throw on invalid encoding\n * @returns UTF-8 decoded string\n * @throws PluckEncodingError if encoding is invalid and validate=true\n */\nexport function decodeToUtf8(buffer: ArrayBuffer, encoding: string, validate = true): string {\n try {\n const decoder = new TextDecoder(encoding, { fatal: validate });\n return decoder.decode(buffer);\n } catch (error) {\n if (validate) {\n throw new PluckEncodingError(\n `Failed to decode content with encoding '${encoding}': ${error}`,\n encoding,\n error as Error,\n );\n }\n\n // Fallback to UTF-8 with error replacement\n const decoder = new TextDecoder('utf-8', { fatal: false });\n return decoder.decode(buffer);\n }\n}\n\n/**\n * Check if encoding is supported by TextDecoder.\n *\n * @param encoding - Encoding name to check\n * @returns True if encoding is supported\n */\nexport function isEncodingSupported(encoding: string): boolean {\n try {\n new TextDecoder(encoding);\n return true;\n } catch {\n return false;\n }\n}\n","/**\n * Enhanced fetch for web scraping.\n *\n * @remarks\n * fetch-compatible HTTP client with robust handling of real-world web content.\n *\n * @author Anonyfox <max@anonyfox.com>\n * @license MIT\n * @see {@link https://github.com/Anonyfox/ravenjs}\n * @see {@link https://ravenjs.dev}\n * @see {@link https://anonyfox.com}\n *\n * @packageDocumentation\n */\n\nimport { decodeToUtf8, detectEncoding } from './encoding.js';\nimport type { PluckInit, PluckResponse } from './types.js';\nimport {\n PluckContentTypeError,\n PluckHttpError,\n PluckNetworkError,\n PluckRedirectError,\n PluckSizeError,\n PluckTimeoutError,\n} from './types.js';\n\n// Default options\nconst DEFAULT_TIMEOUT = 30000; // 30 seconds\nconst DEFAULT_MAX_REDIRECTS = 10;\nconst DEFAULT_MAX_SIZE = 10 * 1024 * 1024; // 10MB\nconst DEFAULT_USER_AGENT =\n 'Mozilla/5.0 (compatible; Magpie-HTML/1.0; +https://github.com/Anonyfox/magpie-html)';\nconst DEFAULT_ALLOWED_CONTENT_TYPES = [\n 'text/html',\n 'text/xml',\n 'application/xml',\n 'application/xhtml+xml',\n 'application/rss+xml',\n 'application/atom+xml',\n 'application/json',\n];\n\n/**\n * Enhanced fetch for web scraping.\n *\n * @remarks\n * Drop-in replacement for fetch() with enhanced error handling, encoding detection,\n * redirect tracking, and size limits. Perfect for scraping HTML, feeds, and APIs.\n *\n * Features:\n * - Manual redirect tracking with full chain\n * - Automatic encoding detection and UTF-8 conversion\n * - Configurable timeouts and size limits\n * - Smart default headers for web scraping\n * - Content-Type validation\n * - Comprehensive error types\n *\n * @param input - URL string or Request object\n * @param init - Request options (extends standard RequestInit)\n * @returns Enhanced Response with additional metadata\n * @throws {PluckTimeoutError} Request timeout\n * @throws {PluckNetworkError} Network or DNS error\n * @throws {PluckHttpError} HTTP error status (4xx, 5xx)\n * @throws {PluckRedirectError} Too many redirects or loop\n * @throws {PluckSizeError} Response too large\n * @throws {PluckEncodingError} Invalid encoding\n * @throws {PluckContentTypeError} Invalid content type\n *\n * @example\n * ```typescript\n * // Basic usage (works like fetch)\n * const response = await pluck('https://example.com');\n * const html = await response.text();\n *\n * // With enhancements\n * console.log(response.redirectChain);\n * console.log(response.detectedEncoding);\n * console.log(response.timing);\n * ```\n *\n * @example\n * ```typescript\n * // With options\n * const response = await pluck('https://example.com', {\n * timeout: 60000,\n * maxRedirects: 5,\n * userAgent: 'MyBot/1.0',\n * throwOnHttpError: true\n * });\n * ```\n */\nexport async function pluck(\n input: string | URL | Request,\n init?: PluckInit,\n): Promise<PluckResponse> {\n const startTime = Date.now();\n\n // Parse options\n const options = normalizeOptions(init);\n const originalUrl = typeof input === 'string' || input instanceof URL ? String(input) : input.url;\n\n // Setup timeout signal\n const signal = AbortSignal.timeout(options.timeout);\n\n try {\n // Follow redirects manually to capture chain\n const { response, redirectChain, redirectDuration } = await followRedirects(\n input,\n options,\n signal,\n );\n\n const finalUrl = response.url;\n\n // Check HTTP status\n if (options.throwOnHttpError && !response.ok) {\n throw new PluckHttpError(\n `HTTP ${response.status}: ${response.statusText}`,\n response.status,\n response.statusText,\n response,\n );\n }\n\n // Validate Content-Type\n if (options.strictContentType) {\n validateContentType(response, options.allowedContentTypes);\n }\n\n // Read response with size limit\n const buffer = await readResponseWithSizeLimit(response, options.maxSize);\n\n // Detect encoding\n const contentType = response.headers.get('content-type');\n const detectedEncoding = detectEncoding(buffer, contentType);\n\n // Decode to UTF-8\n const utf8Content = decodeToUtf8(buffer, detectedEncoding, options.validateEncoding);\n\n // Create enhanced response\n const endTime = Date.now();\n const enhancedResponse = createPluckResponse(response, {\n originalUrl,\n finalUrl,\n redirectChain,\n detectedEncoding,\n utf8Content,\n timing: {\n start: startTime,\n end: endTime,\n duration: endTime - startTime,\n redirectDuration,\n },\n });\n\n return enhancedResponse;\n } catch (error) {\n // Convert errors to pluck error types\n if (error instanceof PluckTimeoutError || error instanceof PluckNetworkError) {\n throw error;\n }\n\n if ((error as Error).name === 'TimeoutError') {\n throw new PluckTimeoutError(`Request timeout after ${options.timeout}ms`, options.timeout);\n }\n\n if (error instanceof TypeError) {\n // Network errors from fetch are TypeErrors\n throw new PluckNetworkError(`Network error: ${error.message}`, error);\n }\n\n // Re-throw pluck errors as-is\n throw error;\n }\n}\n\n/**\n * Normalize pluck options with defaults.\n */\nfunction normalizeOptions(\n init?: PluckInit,\n): Required<Omit<PluckInit, keyof RequestInit>> & RequestInit {\n return {\n ...init,\n timeout: init?.timeout ?? DEFAULT_TIMEOUT,\n maxRedirects: init?.maxRedirects ?? DEFAULT_MAX_REDIRECTS,\n maxSize: init?.maxSize ?? DEFAULT_MAX_SIZE,\n userAgent: init?.userAgent ?? DEFAULT_USER_AGENT,\n throwOnHttpError: init?.throwOnHttpError ?? true,\n strictContentType: init?.strictContentType ?? false,\n allowedContentTypes: init?.allowedContentTypes ?? DEFAULT_ALLOWED_CONTENT_TYPES,\n followRedirects: init?.followRedirects ?? true,\n validateEncoding: init?.validateEncoding ?? true,\n };\n}\n\n/**\n * Follow redirects manually to capture the chain.\n */\nasync function followRedirects(\n input: string | URL | Request,\n options: ReturnType<typeof normalizeOptions>,\n signal: AbortSignal,\n): Promise<{ response: Response; redirectChain: string[]; redirectDuration: number }> {\n let url = typeof input === 'string' || input instanceof URL ? String(input) : input.url;\n const redirectChain: string[] = [];\n const redirectStart = Date.now();\n const seenUrls = new Set<string>();\n\n // If not following redirects, just do one request\n if (!options.followRedirects) {\n const response = await fetchWithHeaders(url, options, signal, false);\n return { response, redirectChain: [], redirectDuration: 0 };\n }\n\n for (let i = 0; i <= options.maxRedirects; i++) {\n // Detect redirect loops\n if (seenUrls.has(url)) {\n throw new PluckRedirectError(\n `Redirect loop detected: ${url}`,\n redirectChain,\n options.maxRedirects,\n );\n }\n seenUrls.add(url);\n\n // Fetch with manual redirect handling\n const response = await fetchWithHeaders(url, options, signal, true);\n\n // Check if it's a redirect\n if (response.status >= 300 && response.status < 400) {\n const location = response.headers.get('location');\n if (!location) {\n throw new PluckRedirectError('Redirect response missing Location header', redirectChain);\n }\n\n // Add current URL to chain\n redirectChain.push(url);\n\n // Resolve relative/absolute location\n try {\n url = new URL(location, url).href;\n } catch {\n throw new PluckRedirectError(\n `Invalid redirect location: ${location}`,\n redirectChain,\n options.maxRedirects,\n );\n }\n\n // Validate redirect URL scheme\n if (!url.startsWith('http://') && !url.startsWith('https://')) {\n throw new PluckRedirectError(\n `Invalid redirect scheme: ${url}`,\n redirectChain,\n options.maxRedirects,\n );\n }\n\n continue;\n }\n\n // Not a redirect, return response\n const redirectDuration = Date.now() - redirectStart;\n return { response, redirectChain, redirectDuration };\n }\n\n // Too many redirects\n throw new PluckRedirectError(\n `Too many redirects (>${options.maxRedirects})`,\n redirectChain,\n options.maxRedirects,\n );\n}\n\n/**\n * Fetch with smart default headers.\n */\nasync function fetchWithHeaders(\n url: string,\n options: ReturnType<typeof normalizeOptions>,\n signal: AbortSignal,\n manualRedirect: boolean,\n): Promise<Response> {\n const headers = new Headers(options.headers);\n\n // Set User-Agent\n if (!headers.has('user-agent')) {\n headers.set('user-agent', options.userAgent);\n }\n\n // Set Accept\n if (!headers.has('accept')) {\n headers.set('accept', 'text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8');\n }\n\n // Set Accept-Language\n if (!headers.has('accept-language')) {\n headers.set('accept-language', 'en-US,en;q=0.9');\n }\n\n return fetch(url, {\n ...options,\n headers,\n signal,\n redirect: manualRedirect ? 'manual' : 'follow',\n });\n}\n\n/**\n * Read response body with size limit.\n */\nasync function readResponseWithSizeLimit(\n response: Response,\n maxSize: number,\n): Promise<ArrayBuffer> {\n const contentLength = response.headers.get('content-length');\n if (contentLength) {\n const size = Number.parseInt(contentLength, 10);\n if (size > maxSize) {\n throw new PluckSizeError(\n `Response size ${size} bytes exceeds maximum ${maxSize} bytes`,\n maxSize,\n size,\n );\n }\n }\n\n // Read response\n const buffer = await response.arrayBuffer();\n\n // Check actual size\n if (buffer.byteLength > maxSize) {\n throw new PluckSizeError(\n `Response size ${buffer.byteLength} bytes exceeds maximum ${maxSize} bytes`,\n maxSize,\n buffer.byteLength,\n );\n }\n\n return buffer;\n}\n\n/**\n * Validate Content-Type header.\n */\nfunction validateContentType(response: Response, allowedTypes: string[]): void {\n const contentType = response.headers.get('content-type');\n if (!contentType) {\n throw new PluckContentTypeError('Missing Content-Type header', '(missing)', allowedTypes);\n }\n\n // Parse Content-Type (ignore charset and other parameters)\n const mimeType = contentType.split(';')[0].trim().toLowerCase();\n\n // Check if allowed\n const isAllowed = allowedTypes.some((allowed) => {\n const pattern = allowed.toLowerCase().replace('*', '.*');\n return new RegExp(`^${pattern}$`).test(mimeType);\n });\n\n if (!isAllowed) {\n throw new PluckContentTypeError(\n `Content-Type '${mimeType}' not allowed`,\n mimeType,\n allowedTypes,\n );\n }\n}\n\n/**\n * Create enhanced PluckResponse from standard Response.\n */\nfunction createPluckResponse(\n response: Response,\n metadata: {\n originalUrl: string;\n finalUrl: string;\n redirectChain: string[];\n detectedEncoding: string;\n utf8Content: string;\n timing: PluckResponse['timing'];\n },\n): PluckResponse {\n // Store UTF-8 content for textUtf8() method\n let utf8ContentCache: string | null = metadata.utf8Content;\n\n // Create enhanced response object\n const enhancedResponse = response as PluckResponse;\n\n // Add our enhancements\n enhancedResponse.originalUrl = metadata.originalUrl;\n enhancedResponse.finalUrl = metadata.finalUrl;\n enhancedResponse.redirectChain = metadata.redirectChain;\n enhancedResponse.detectedEncoding = metadata.detectedEncoding;\n enhancedResponse.timing = metadata.timing;\n\n // Add textUtf8() method\n enhancedResponse.textUtf8 = async () => {\n if (utf8ContentCache === null) {\n throw new Error('Response body already consumed');\n }\n const content = utf8ContentCache;\n utf8ContentCache = null; // Consume once\n return content;\n };\n\n return enhancedResponse;\n}\n","/**\n * HTML parsing utilities using linkedom.\n *\n * @remarks\n * This module provides a simple wrapper around linkedom for consistent\n * HTML parsing across all metadata extraction modules. Parsing should happen\n * once at the top level and the parsed document passed to all extractors.\n *\n * @packageDocumentation\n */\n\nimport { parseHTML as linkedomParseHTML } from 'linkedom';\n\n/**\n * Parse HTML string into a DOM document.\n *\n * @remarks\n * Parses HTML using linkedom, providing a standards-compliant DOM implementation.\n * This should be called once per document, with the result passed to all metadata\n * extractors for performance.\n *\n * Never throws - returns a document even for malformed HTML.\n *\n * @param html - HTML string to parse\n * @param baseUrl - Optional base URL for resolving relative URLs\n * @returns Parsed DOM document\n *\n * @example\n * ```typescript\n * const doc = parseHTML('<html><head><title>Test</title></head></html>');\n * const title = doc.querySelector('title')?.textContent;\n * ```\n */\nexport function parseHTML(html: string, baseUrl?: string): Document {\n const { document } = linkedomParseHTML(html, {\n url: baseUrl || 'https://example.com',\n });\n return document;\n}\n\n// Export Document type alias for convenience\n// Note: This is the standard DOM Document type from linkedom\nexport type HTMLDocument = Document;\n","/**\n * Meta tag extraction helpers.\n *\n * @remarks\n * Generic utilities for extracting content from <meta> tags in parsed HTML documents.\n * These helpers work with parsed HTMLElement from linkedom.\n *\n * @packageDocumentation\n */\n\nimport type { HTMLDocument as Document } from '../utils/html-parser.js';\n\n/**\n * Get content from a meta tag by name attribute.\n *\n * @remarks\n * Extracts the content attribute from a meta tag matching the specified name.\n * Returns undefined if not found.\n *\n * @param doc - Parsed HTML document\n * @param name - Value of the name attribute to search for\n * @returns Content attribute value, or undefined if not found\n *\n * @example\n * ```typescript\n * const description = getMetaContent(doc, 'description');\n * const keywords = getMetaContent(doc, 'keywords');\n * ```\n */\nexport function getMetaContent(doc: Document, name: string): string | undefined {\n const element = doc.querySelector(`meta[name=\"${name}\"]`);\n return element?.getAttribute('content') || undefined;\n}\n\n/**\n * Get content from a meta tag by property attribute (OpenGraph, etc.).\n *\n * @remarks\n * Extracts the content attribute from a meta tag matching the specified property.\n * Used primarily for OpenGraph (og:*) and Facebook (fb:*) tags.\n *\n * @param doc - Parsed HTML document\n * @param property - Value of the property attribute to search for\n * @returns Content attribute value, or undefined if not found\n *\n * @example\n * ```typescript\n * const ogTitle = getMetaProperty(doc, 'og:title');\n * const ogImage = getMetaProperty(doc, 'og:image');\n * ```\n */\nexport function getMetaProperty(doc: Document, property: string): string | undefined {\n const element = doc.querySelector(`meta[property=\"${property}\"]`);\n return element?.getAttribute('content') || undefined;\n}\n\n/**\n * Get all meta tag contents matching a name pattern.\n *\n * @remarks\n * Finds all meta tags where the name attribute starts with the given prefix.\n * Returns a Map of name → content for all matches.\n *\n * Useful for extracting groups of related meta tags (e.g., all \"twitter:*\" tags).\n *\n * @param doc - Parsed HTML document\n * @param namePrefix - Prefix to match against name attributes\n * @returns Map of name to content values\n *\n * @example\n * ```typescript\n * const twitterTags = getAllMetaByName(doc, 'twitter:');\n * // Map { 'twitter:card' => 'summary', 'twitter:site' => '@example', ... }\n * ```\n */\nexport function getAllMetaByName(doc: Document, namePrefix: string): Map<string, string> {\n const result = new Map<string, string>();\n const elements = doc.querySelectorAll(`meta[name^=\"${namePrefix}\"]`);\n\n for (const element of Array.from(elements)) {\n const name = element.getAttribute('name');\n const content = element.getAttribute('content');\n if (name && content) {\n result.set(name, content);\n }\n }\n\n return result;\n}\n\n/**\n * Get all meta tag contents matching a property pattern.\n *\n * @remarks\n * Finds all meta tags where the property attribute starts with the given prefix.\n * Returns a Map of property → content for all matches.\n *\n * Useful for extracting groups of related property tags (e.g., all \"og:*\" tags).\n *\n * @param doc - Parsed HTML document\n * @param propertyPrefix - Prefix to match against property attributes\n * @returns Map of property to content values\n *\n * @example\n * ```typescript\n * const ogTags = getAllMetaByProperty(doc, 'og:');\n * // Map { 'og:title' => 'Page Title', 'og:image' => 'https://...', ... }\n * ```\n */\nexport function getAllMetaByProperty(doc: Document, propertyPrefix: string): Map<string, string> {\n const result = new Map<string, string>();\n const elements = doc.querySelectorAll(`meta[property^=\"${propertyPrefix}\"]`);\n\n for (const element of Array.from(elements)) {\n const property = element.getAttribute('property');\n const content = element.getAttribute('content');\n if (property && content) {\n result.set(property, content);\n }\n }\n\n return result;\n}\n\n/**\n * Get all values for a specific meta property that can appear multiple times.\n *\n * @remarks\n * Some meta tags can appear multiple times (e.g., og:image, article:author).\n * This function collects all values into an array.\n *\n * @param doc - Parsed HTML document\n * @param property - Property attribute value to search for\n * @returns Array of all content values (empty if none found)\n *\n * @example\n * ```typescript\n * const images = getAllMetaPropertyValues(doc, 'og:image');\n * // ['https://example.com/image1.jpg', 'https://example.com/image2.jpg']\n * ```\n */\nexport function getAllMetaPropertyValues(doc: Document, property: string): string[] {\n const elements = doc.querySelectorAll(`meta[property=\"${property}\"]`);\n const values: string[] = [];\n\n for (const element of Array.from(elements)) {\n const content = element.getAttribute('content');\n if (content) {\n values.push(content);\n }\n }\n\n return values;\n}\n\n/**\n * Get content from meta tag by http-equiv attribute.\n *\n * @remarks\n * Extracts the content attribute from a meta tag matching the specified http-equiv value.\n * Used for HTTP header equivalents like Content-Security-Policy, X-UA-Compatible, etc.\n *\n * @param doc - Parsed HTML document\n * @param httpEquiv - Value of the http-equiv attribute to search for\n * @returns Content attribute value, or undefined if not found\n *\n * @example\n * ```typescript\n * const csp = getMetaHttpEquiv(doc, 'Content-Security-Policy');\n * const compat = getMetaHttpEquiv(doc, 'X-UA-Compatible');\n * ```\n */\nexport function getMetaHttpEquiv(doc: Document, httpEquiv: string): string | undefined {\n const element = doc.querySelector(`meta[http-equiv=\"${httpEquiv}\" i]`);\n return element?.getAttribute('content') || undefined;\n}\n","/**\n * OpenGraph metadata extraction.\n *\n * @remarks\n * Extracts Open Graph protocol metadata from HTML documents.\n *\n * @packageDocumentation\n */\n\nimport type { HTMLDocument as Document } from '../../utils/html-parser.js';\nimport { getAllMetaPropertyValues, getMetaProperty } from '../../utils/meta-helpers.js';\nimport type {\n OpenGraphArticle,\n OpenGraphAudio,\n OpenGraphBook,\n OpenGraphImage,\n OpenGraphMetadata,\n OpenGraphProfile,\n OpenGraphVideo,\n} from './types.js';\n\n/**\n * Extract OpenGraph metadata from parsed HTML document.\n *\n * @remarks\n * Extracts Open Graph protocol metadata including basic metadata,\n * article data, video/audio, images, books, and profiles.\n *\n * @param doc - Parsed HTML document\n * @returns OpenGraph metadata object\n *\n * @example\n * ```typescript\n * const doc = parseHTML(htmlString);\n * const og = extractOpenGraph(doc);\n * console.log(og.title);\n * console.log(og.image);\n * console.log(og.article?.publishedTime);\n * ```\n */\nexport function extractOpenGraph(doc: Document): OpenGraphMetadata {\n const metadata: OpenGraphMetadata = {};\n\n // Extract basic OpenGraph properties\n metadata.title = getMetaProperty(doc, 'og:title');\n metadata.type = getMetaProperty(doc, 'og:type');\n metadata.image = getMetaProperty(doc, 'og:image');\n metadata.url = getMetaProperty(doc, 'og:url');\n metadata.description = getMetaProperty(doc, 'og:description');\n metadata.siteName = getMetaProperty(doc, 'og:site_name');\n metadata.locale = getMetaProperty(doc, 'og:locale');\n\n // Alternate locales (can be multiple)\n const alternateLocales = getAllMetaPropertyValues(doc, 'og:locale:alternate');\n if (alternateLocales.length > 0) {\n metadata.localeAlternate = alternateLocales;\n }\n\n // Extract article metadata\n const article = extractArticle(doc);\n if (Object.keys(article).length > 0) {\n metadata.article = article;\n }\n\n // Extract video metadata\n const video = extractVideo(doc);\n if (Object.keys(video).length > 0) {\n metadata.video = video;\n }\n\n // Extract audio metadata\n const audio = extractAudio(doc);\n if (Object.keys(audio).length > 0) {\n metadata.audio = audio;\n }\n\n // Extract all images with metadata\n const images = extractImages(doc);\n if (images.length > 0) {\n metadata.images = images;\n }\n\n // Extract book metadata\n const book = extractBook(doc);\n if (Object.keys(book).length > 0) {\n metadata.book = book;\n }\n\n // Extract profile metadata\n const profile = extractProfile(doc);\n if (Object.keys(profile).length > 0) {\n metadata.profile = profile;\n }\n\n // Remove undefined values\n return Object.fromEntries(\n Object.entries(metadata).filter(([_, value]) => value !== undefined),\n ) as OpenGraphMetadata;\n}\n\n/**\n * Extract article-specific metadata.\n */\nfunction extractArticle(doc: Document): OpenGraphArticle {\n const article: OpenGraphArticle = {};\n\n article.publishedTime = getMetaProperty(doc, 'article:published_time');\n article.modifiedTime = getMetaProperty(doc, 'article:modified_time');\n article.expirationTime = getMetaProperty(doc, 'article:expiration_time');\n article.section = getMetaProperty(doc, 'article:section');\n\n // Multiple authors\n const authors = getAllMetaPropertyValues(doc, 'article:author');\n if (authors.length > 0) {\n article.authors = authors;\n }\n\n // Multiple tags\n const tags = getAllMetaPropertyValues(doc, 'article:tag');\n if (tags.length > 0) {\n article.tags = tags;\n }\n\n return Object.fromEntries(\n Object.entries(article).filter(([_, value]) => value !== undefined),\n ) as OpenGraphArticle;\n}\n\n/**\n * Extract video metadata.\n */\nfunction extractVideo(doc: Document): OpenGraphVideo {\n const video: OpenGraphVideo = {};\n\n video.url = getMetaProperty(doc, 'og:video') || getMetaProperty(doc, 'og:video:url');\n video.secureUrl = getMetaProperty(doc, 'og:video:secure_url');\n video.type = getMetaProperty(doc, 'og:video:type');\n video.releaseDate = getMetaProperty(doc, 'og:video:release_date');\n\n // Parse numeric values\n const width = getMetaProperty(doc, 'og:video:width');\n if (width) {\n video.width = Number.parseInt(width, 10);\n }\n\n const height = getMetaProperty(doc, 'og:video:height');\n if (height) {\n video.height = Number.parseInt(height, 10);\n }\n\n const duration = getMetaProperty(doc, 'og:video:duration');\n if (duration) {\n video.duration = Number.parseInt(duration, 10);\n }\n\n // Multiple tags\n const tags = getAllMetaPropertyValues(doc, 'og:video:tag');\n if (tags.length > 0) {\n video.tags = tags;\n }\n\n return Object.fromEntries(\n Object.entries(video).filter(([_, value]) => value !== undefined),\n ) as OpenGraphVideo;\n}\n\n/**\n * Extract audio metadata.\n */\nfunction extractAudio(doc: Document): OpenGraphAudio {\n const audio: OpenGraphAudio = {};\n\n audio.url = getMetaProperty(doc, 'og:audio') || getMetaProperty(doc, 'og:audio:url');\n audio.secureUrl = getMetaProperty(doc, 'og:audio:secure_url');\n audio.type = getMetaProperty(doc, 'og:audio:type');\n\n return Object.fromEntries(\n Object.entries(audio).filter(([_, value]) => value !== undefined),\n ) as OpenGraphAudio;\n}\n\n/**\n * Extract all images with full metadata.\n */\nfunction extractImages(doc: Document): OpenGraphImage[] {\n const images: OpenGraphImage[] = [];\n\n // Get all og:image values (can be multiple)\n const imageUrls = getAllMetaPropertyValues(doc, 'og:image');\n const imageSecureUrls = getAllMetaPropertyValues(doc, 'og:image:secure_url');\n const imageTypes = getAllMetaPropertyValues(doc, 'og:image:type');\n const imageWidths = getAllMetaPropertyValues(doc, 'og:image:width');\n const imageHeights = getAllMetaPropertyValues(doc, 'og:image:height');\n const imageAlts = getAllMetaPropertyValues(doc, 'og:image:alt');\n\n // Build image objects\n for (let i = 0; i < imageUrls.length; i++) {\n const image: OpenGraphImage = {\n url: imageUrls[i],\n secureUrl: imageSecureUrls[i],\n type: imageTypes[i],\n alt: imageAlts[i],\n };\n\n // Parse numeric dimensions\n if (imageWidths[i]) {\n image.width = Number.parseInt(imageWidths[i], 10);\n }\n if (imageHeights[i]) {\n image.height = Number.parseInt(imageHeights[i], 10);\n }\n\n // Remove undefined values\n images.push(\n Object.fromEntries(\n Object.entries(image).filter(([_, value]) => value !== undefined),\n ) as OpenGraphImage,\n );\n }\n\n return images;\n}\n\n/**\n * Extract book metadata.\n */\nfunction extractBook(doc: Document): OpenGraphBook {\n const book: OpenGraphBook = {};\n\n book.isbn = getMetaProperty(doc, 'book:isbn');\n book.releaseDate = getMetaProperty(doc, 'book:release_date');\n\n // Multiple authors\n const authors = getAllMetaPropertyValues(doc, 'book:author');\n if (authors.length > 0) {\n book.authors = authors;\n }\n\n // Multiple tags\n const tags = getAllMetaPropertyValues(doc, 'book:tag');\n if (tags.length > 0) {\n book.tags = tags;\n }\n\n return Object.fromEntries(\n Object.entries(book).filter(([_, value]) => value !== undefined),\n ) as OpenGraphBook;\n}\n\n/**\n * Extract profile metadata.\n */\nfunction extractProfile(doc: Document): OpenGraphProfile {\n const profile: OpenGraphProfile = {};\n\n profile.firstName = getMetaProperty(doc, 'profile:first_name');\n profile.lastName = getMetaProperty(doc, 'profile:last_name');\n profile.username = getMetaProperty(doc, 'profile:username');\n profile.gender = getMetaProperty(doc, 'profile:gender');\n\n return Object.fromEntries(\n Object.entries(profile).filter(([_, value]) => value !== undefined),\n ) as OpenGraphProfile;\n}\n","/**\n * JSON-LD parsing utilities.\n *\n * @remarks\n * Utilities for parsing and validating JSON-LD structured data.\n *\n * @packageDocumentation\n */\n\nimport type { JsonLdBlock } from './types.js';\n\n/**\n * Parse JSON-LD string into structured block.\n *\n * @remarks\n * Attempts to parse JSON-LD content and extract @type and @context.\n * Returns null if parsing fails.\n *\n * @param jsonString - Raw JSON-LD string\n * @returns Parsed JSON-LD block or null if invalid\n */\nexport function parseJsonLd(jsonString: string): JsonLdBlock | null {\n if (!jsonString || typeof jsonString !== 'string') {\n return null;\n }\n\n const trimmed = jsonString.trim();\n if (!trimmed) {\n return null;\n }\n\n try {\n const parsed = JSON.parse(trimmed);\n\n // Extract @type\n let type: string | string[] | undefined;\n if (parsed['@type']) {\n type = parsed['@type'];\n }\n\n // Extract @context\n const context = parsed['@context'];\n\n return {\n raw: trimmed,\n parsed,\n type,\n context,\n };\n } catch {\n // Invalid JSON - return null\n return null;\n }\n}\n\n/**\n * Check if a type matches a target type (case-insensitive, handles arrays).\n *\n * @remarks\n * Handles both string and array @type values.\n * Case-insensitive comparison.\n *\n * @param type - The @type value from JSON-LD\n * @param targetType - The type to match against\n * @returns True if type matches target\n */\nexport function isType(type: string | string[] | undefined, targetType: string): boolean {\n if (!type) {\n return false;\n }\n\n const target = targetType.toLowerCase();\n\n if (Array.isArray(type)) {\n return type.some((t) => t.toLowerCase() === target);\n }\n\n return type.toLowerCase() === target;\n}\n\n/**\n * Extract items from @graph array if present.\n *\n * @remarks\n * JSON-LD can contain a @graph array with multiple items.\n * This function extracts those items or returns the object itself if no @graph.\n *\n * @param parsed - Parsed JSON-LD object\n * @returns Array of items\n */\nexport function extractGraphItems(parsed: unknown): unknown[] {\n if (!parsed || typeof parsed !== 'object') {\n return [];\n }\n\n const obj = parsed as Record<string, unknown>;\n\n // Check for @graph array\n if (Array.isArray(obj['@graph'])) {\n return obj['@graph'];\n }\n\n // No @graph - return the object itself\n return [parsed];\n}\n\n/**\n * Get @type from an object (handles both string and array).\n *\n * @param obj - Object to extract @type from\n * @returns @type value or undefined\n */\nexport function getType(obj: unknown): string | string[] | undefined {\n if (!obj || typeof obj !== 'object') {\n return undefined;\n }\n\n const record = obj as Record<string, unknown>;\n const type = record['@type'];\n\n if (typeof type === 'string' || Array.isArray(type)) {\n return type as string | string[];\n }\n\n return undefined;\n}\n\n/**\n * Check if object matches any of the target types.\n *\n * @param obj - Object to check\n * @param targetTypes - Array of type names to match\n * @returns True if object matches any target type\n */\nexport function matchesAnyType(obj: unknown, targetTypes: string[]): boolean {\n const type = getType(obj);\n return targetTypes.some((target) => isType(type, target));\n}\n","/**\n * Schema.org / JSON-LD extraction.\n *\n * @remarks\n * Extracts structured data from JSON-LD script tags.\n *\n * @packageDocumentation\n */\n\nimport type { HTMLDocument as Document } from '../../utils/html-parser.js';\nimport { extractGraphItems, matchesAnyType, parseJsonLd } from './parse-json-ld.js';\nimport type { SchemaOrgMetadata } from './types.js';\n\n/**\n * Extract Schema.org metadata from parsed HTML document.\n *\n * @remarks\n * Finds all <script type=\"application/ld+json\"> tags, parses the JSON-LD,\n * and organizes by type for easy access.\n *\n * @param doc - Parsed HTML document\n * @returns Schema.org metadata object\n *\n * @example\n * ```typescript\n * const doc = parseHTML(htmlString);\n * const schema = extractSchemaOrg(doc);\n * console.log(schema.jsonLd.length);\n * console.log(schema.articles);\n * ```\n */\nexport function extractSchemaOrg(doc: Document): SchemaOrgMetadata {\n const metadata: SchemaOrgMetadata = {\n jsonLd: [],\n };\n\n // Find all JSON-LD script tags\n const scripts = doc.querySelectorAll('script[type=\"application/ld+json\"]');\n\n // Parse each script\n for (const script of Array.from(scripts)) {\n // Try different ways to get script content\n const content = script.textContent || script.innerHTML;\n if (!content) continue;\n\n const block = parseJsonLd(content);\n if (block) {\n metadata.jsonLd.push(block);\n }\n }\n\n // Organize by type for convenience\n if (metadata.jsonLd.length > 0) {\n organizeByType(metadata);\n }\n\n return metadata;\n}\n\n/**\n * Organize JSON-LD blocks by type for convenience accessors.\n */\nfunction organizeByType(metadata: SchemaOrgMetadata): void {\n const articles: unknown[] = [];\n const webPages: unknown[] = [];\n const breadcrumbs: unknown[] = [];\n const products: unknown[] = [];\n const events: unknown[] = [];\n const recipes: unknown[] = [];\n const videos: unknown[] = [];\n const images: unknown[] = [];\n let organization: unknown | undefined;\n let person: unknown | undefined;\n\n // Process each JSON-LD block\n for (const block of metadata.jsonLd) {\n // Extract items from @graph if present\n const items = extractGraphItems(block.parsed);\n\n for (const item of items) {\n // Articles (Article, NewsArticle, BlogPosting, etc.)\n if (matchesAnyType(item, ['Article', 'NewsArticle', 'BlogPosting', 'TechArticle'])) {\n articles.push(item);\n }\n\n // Web pages (WebPage, WebSite)\n if (matchesAnyType(item, ['WebPage', 'WebSite', 'AboutPage', 'ContactPage'])) {\n webPages.push(item);\n }\n\n // Breadcrumbs\n if (matchesAnyType(item, ['BreadcrumbList'])) {\n breadcrumbs.push(item);\n }\n\n // Products\n if (matchesAnyType(item, ['Product'])) {\n products.push(item);\n }\n\n // Events\n if (matchesAnyType(item, ['Event'])) {\n events.push(item);\n }\n\n // Recipes\n if (matchesAnyType(item, ['Recipe'])) {\n recipes.push(item);\n }\n\n // Videos\n if (matchesAnyType(item, ['VideoObject'])) {\n videos.push(item);\n }\n\n // Images\n if (matchesAnyType(item, ['ImageObject'])) {\n images.push(item);\n }\n\n // Organization (take first one)\n if (!organization && matchesAnyType(item, ['Organization', 'Corporation'])) {\n organization = item;\n }\n\n // Person (take first one)\n if (!person && matchesAnyType(item, ['Person'])) {\n person = item;\n }\n }\n }\n\n // Add to metadata if found\n if (articles.length > 0) metadata.articles = articles;\n if (webPages.length > 0) metadata.webPages = webPages;\n if (breadcrumbs.length > 0) metadata.breadcrumbs = breadcrumbs;\n if (products.length > 0) metadata.products = products;\n if (events.length > 0) metadata.events = events;\n if (recipes.length > 0) metadata.recipes = recipes;\n if (videos.length > 0) metadata.videos = videos;\n if (images.length > 0) metadata.images = images;\n if (organization) metadata.organization = organization;\n if (person) metadata.person = person;\n}\n","/**\n * SEO metadata extraction.\n *\n * @remarks\n * Extracts standard SEO meta tags from HTML documents.\n *\n * @packageDocumentation\n */\n\nimport type { HTMLDocument as Document } from '../../utils/html-parser.js';\nimport { getMetaContent } from '../../utils/meta-helpers.js';\nimport type { SEOMetadata } from './types.js';\n\n/**\n * Extract SEO metadata from parsed HTML document.\n *\n * @remarks\n * Extracts standard SEO meta tags including title, description, keywords,\n * and browser-specific configuration. All fields are optional.\n *\n * @param doc - Parsed HTML document\n * @returns SEO metadata object\n *\n * @example\n * ```typescript\n * const doc = parseHTML(htmlString);\n * const seo = extractSEO(doc);\n * console.log(seo.title); // Page title\n * console.log(seo.description); // Meta description\n * ```\n */\nexport function extractSEO(doc: Document): SEOMetadata {\n const metadata: SEOMetadata = {};\n\n // Extract <title> tag\n const titleElement = doc.querySelector('title');\n if (titleElement?.textContent) {\n metadata.title = titleElement.textContent.trim();\n }\n\n // Extract meta tags\n metadata.description = getMetaContent(doc, 'description');\n metadata.author = getMetaContent(doc, 'author');\n metadata.generator = getMetaContent(doc, 'generator');\n metadata.viewport = getMetaContent(doc, 'viewport');\n metadata.themeColor = getMetaContent(doc, 'theme-color');\n metadata.colorScheme = getMetaContent(doc, 'color-scheme');\n metadata.applicationName = getMetaContent(doc, 'application-name');\n metadata.appleMobileWebAppTitle = getMetaContent(doc, 'apple-mobile-web-app-title');\n metadata.appleMobileWebAppStatusBarStyle = getMetaContent(\n doc,\n 'apple-mobile-web-app-status-bar-style',\n );\n\n // Extract keywords as array\n const keywordsString = getMetaContent(doc, 'keywords');\n if (keywordsString) {\n metadata.keywords = keywordsString\n .split(',')\n .map((k) => k.trim())\n .filter((k) => k.length > 0);\n }\n\n // Parse apple-mobile-web-app-capable as boolean\n const capable = getMetaContent(doc, 'apple-mobile-web-app-capable');\n if (capable) {\n metadata.appleMobileWebAppCapable = capable.toLowerCase() === 'yes';\n }\n\n // Remove undefined values to keep the object clean\n return Object.fromEntries(\n Object.entries(metadata).filter(([_, value]) => value !== undefined),\n ) as SEOMetadata;\n}\n","/**\n * Twitter Card metadata extraction.\n *\n * @remarks\n * Extracts Twitter Card metadata from HTML documents.\n *\n * @packageDocumentation\n */\n\nimport type { HTMLDocument as Document } from '../../utils/html-parser.js';\nimport { getMetaContent } from '../../utils/meta-helpers.js';\nimport type { TwitterApp, TwitterCardMetadata, TwitterPlayer } from './types.js';\n\n/**\n * Extract Twitter Card metadata from parsed HTML document.\n *\n * @remarks\n * Extracts Twitter Card metadata including card type, site/creator info,\n * title/description, images, app cards, and player cards.\n *\n * @param doc - Parsed HTML document\n * @returns Twitter Card metadata object\n *\n * @example\n * ```typescript\n * const doc = parseHTML(htmlString);\n * const twitter = extractTwitterCard(doc);\n * console.log(twitter.card);\n * console.log(twitter.title);\n * ```\n */\nexport function extractTwitterCard(doc: Document): TwitterCardMetadata {\n const metadata: TwitterCardMetadata = {};\n\n // Basic Twitter Card properties\n metadata.card = getMetaContent(doc, 'twitter:card') as TwitterCardMetadata['card'];\n metadata.site = getMetaContent(doc, 'twitter:site');\n metadata.creator = getMetaContent(doc, 'twitter:creator');\n metadata.title = getMetaContent(doc, 'twitter:title');\n metadata.description = getMetaContent(doc, 'twitter:description');\n metadata.image = getMetaContent(doc, 'twitter:image');\n metadata.imageAlt = getMetaContent(doc, 'twitter:image:alt');\n\n // Extract app card data\n const app = extractApp(doc);\n if (Object.keys(app).length > 0) {\n metadata.app = app;\n }\n\n // Extract player card data\n const player = extractPlayer(doc);\n if (Object.keys(player).length > 0) {\n metadata.player = player;\n }\n\n // Remove undefined values\n return Object.fromEntries(\n Object.entries(metadata).filter(([_, value]) => value !== undefined),\n ) as TwitterCardMetadata;\n}\n\n/**\n * Extract app card metadata.\n */\nfunction extractApp(doc: Document): TwitterApp {\n const app: TwitterApp = {};\n\n // iPhone\n const iphoneName = getMetaContent(doc, 'twitter:app:name:iphone');\n const iphoneId = getMetaContent(doc, 'twitter:app:id:iphone');\n const iphoneUrl = getMetaContent(doc, 'twitter:app:url:iphone');\n if (iphoneName || iphoneId || iphoneUrl) {\n app.iphone = { name: iphoneName, id: iphoneId, url: iphoneUrl };\n // Clean up undefined values\n app.iphone = Object.fromEntries(\n Object.entries(app.iphone).filter(([_, value]) => value !== undefined),\n ) as typeof app.iphone;\n }\n\n // iPad\n const ipadName = getMetaContent(doc, 'twitter:app:name:ipad');\n const ipadId = getMetaContent(doc, 'twitter:app:id:ipad');\n const ipadUrl = getMetaContent(doc, 'twitter:app:url:ipad');\n if (ipadName || ipadId || ipadUrl) {\n app.ipad = { name: ipadName, id: ipadId, url: ipadUrl };\n app.ipad = Object.fromEntries(\n Object.entries(app.ipad).filter(([_, value]) => value !== undefined),\n ) as typeof app.ipad;\n }\n\n // Google Play\n const googleplayName = getMetaContent(doc, 'twitter:app:name:googleplay');\n const googleplayId = getMetaContent(doc, 'twitter:app:id:googleplay');\n const googleplayUrl = getMetaContent(doc, 'twitter:app:url:googleplay');\n if (googleplayName || googleplayId || googleplayUrl) {\n app.googleplay = { name: googleplayName, id: googleplayId, url: googleplayUrl };\n app.googleplay = Object.fromEntries(\n Object.entries(app.googleplay).filter(([_, value]) => value !== undefined),\n ) as typeof app.googleplay;\n }\n\n return app;\n}\n\n/**\n * Extract player card metadata.\n */\nfunction extractPlayer(doc: Document): TwitterPlayer {\n const player: TwitterPlayer = {};\n\n player.url = getMetaContent(doc, 'twitter:player');\n player.stream = getMetaContent(doc, 'twitter:player:stream');\n\n // Parse numeric values\n const width = getMetaContent(doc, 'twitter:player:width');\n if (width) {\n player.width = Number.parseInt(width, 10);\n }\n\n const height = getMetaContent(doc, 'twitter:player:height');\n if (height) {\n player.height = Number.parseInt(height, 10);\n }\n\n return Object.fromEntries(\n Object.entries(player).filter(([_, value]) => value !== undefined),\n ) as TwitterPlayer;\n}\n","/**\n * Description extraction and aggregation for websites.\n *\n * @packageDocumentation\n */\n\nimport { extractOpenGraph } from '../../metadata/opengraph/index.js';\nimport { extractSchemaOrg } from '../../metadata/schema-org/index.js';\nimport { extractSEO } from '../../metadata/seo/index.js';\nimport { extractTwitterCard } from '../../metadata/twitter-card/index.js';\nimport type { HTMLDocument as Document } from '../../utils/html-parser.js';\n\n/**\n * Extract page description from multiple sources and pick the longest.\n *\n * @remarks\n * Strategy:\n * 1. Collect all possible descriptions from metadata sources (priority order):\n * - Schema.org NewsArticle/Article description\n * - OpenGraph og:description\n * - Twitter twitter:description\n * - HTML meta description tag\n * 2. Pick the longest description (no cleaning needed)\n * 3. This ensures we get the most detailed/descriptive summary\n *\n * Note: Does not look in the body content, only metadata tags.\n *\n * @param doc - Parsed HTML document\n * @returns Best available description or undefined if none found\n *\n * @example\n * ```typescript\n * const doc = parseHTML(html);\n * const description = extractBestDescription(doc);\n * console.log(description); // Most detailed description from metadata\n * ```\n */\nexport function extractBestDescription(doc: Document): string | undefined {\n const candidates: string[] = [];\n\n // 1. Schema.org Article/NewsArticle description\n const schema = extractSchemaOrg(doc);\n if (schema.articles && schema.articles.length > 0) {\n for (const article of schema.articles) {\n const description = getStringProperty(article, 'description');\n if (description?.trim()) {\n candidates.push(description.trim());\n }\n }\n }\n\n // 2. OpenGraph description\n const og = extractOpenGraph(doc);\n if (og.description?.trim()) {\n candidates.push(og.description.trim());\n }\n\n // 3. Twitter Card description\n const twitter = extractTwitterCard(doc);\n if (twitter.description?.trim()) {\n candidates.push(twitter.description.trim());\n }\n\n // 4. HTML meta description tag\n const seo = extractSEO(doc);\n if (seo.description?.trim()) {\n candidates.push(seo.description.trim());\n }\n\n // No candidates found\n if (candidates.length === 0) {\n return undefined;\n }\n\n // Pick the longest description (more detail is better)\n candidates.sort((a, b) => b.length - a.length);\n\n return candidates[0];\n}\n\n/**\n * Safely extract a string property from an unknown object.\n */\nfunction getStringProperty(obj: unknown, prop: string): string | undefined {\n if (!obj || typeof obj !== 'object') return undefined;\n const value = (obj as Record<string, unknown>)[prop];\n return typeof value === 'string' ? value : undefined;\n}\n","/**\n * Link tag extraction helpers.\n *\n * @remarks\n * Generic utilities for extracting data from <link> tags in parsed HTML documents.\n * These helpers work with parsed HTMLElement from linkedom.\n *\n * @packageDocumentation\n */\n\nimport type { HTMLDocument as Document } from '../utils/html-parser.js';\n\n/**\n * Link element data extracted from a <link> tag.\n */\nexport interface LinkData {\n /** The href attribute value */\n href: string;\n /** The rel attribute value (optional) */\n rel?: string;\n /** The type attribute value (optional) */\n type?: string;\n /** The hreflang attribute value (optional) */\n hreflang?: string;\n /** The title attribute value (optional) */\n title?: string;\n /** The sizes attribute value (optional) */\n sizes?: string;\n /** The media attribute value (optional) */\n media?: string;\n /** The color attribute value (optional, used for mask-icon) */\n color?: string;\n}\n\n/**\n * Get href from a link tag by rel attribute.\n *\n * @remarks\n * Finds the first link tag matching the specified rel attribute and returns its href.\n * Returns undefined if not found.\n *\n * @param doc - Parsed HTML document\n * @param rel - Value of the rel attribute to search for\n * @returns Href attribute value, or undefined if not found\n *\n * @example\n * ```typescript\n * const canonical = getLinkHref(doc, 'canonical');\n * const icon = getLinkHref(doc, 'icon');\n * ```\n */\nexport function getLinkHref(doc: Document, rel: string): string | undefined {\n const element = doc.querySelector(`link[rel=\"${rel}\"]`);\n return element?.getAttribute('href') || undefined;\n}\n\n/**\n * Get all link tags matching a rel attribute.\n *\n * @remarks\n * Finds all link tags with the specified rel attribute and extracts\n * their data (href, type, hreflang, etc.).\n *\n * Useful when multiple links can have the same rel (e.g., alternate, icon).\n *\n * @param doc - Parsed HTML document\n * @param rel - Value of the rel attribute to search for\n * @returns Array of link data objects (empty if none found)\n *\n * @example\n * ```typescript\n * const alternates = getAllLinks(doc, 'alternate');\n * // [\n * // { href: '/fr', hreflang: 'fr', rel: 'alternate' },\n * // { href: '/de', hreflang: 'de', rel: 'alternate' }\n * // ]\n * ```\n */\nexport function getAllLinks(doc: Document, rel: string): LinkData[] {\n const elements = doc.querySelectorAll(`link[rel=\"${rel}\"]`);\n const links: LinkData[] = [];\n\n for (const element of Array.from(elements)) {\n const href = element.getAttribute('href');\n if (!href) continue;\n\n links.push({\n href,\n rel: element.getAttribute('rel') || undefined,\n type: element.getAttribute('type') || undefined,\n hreflang: element.getAttribute('hreflang') || undefined,\n title: element.getAttribute('title') || undefined,\n sizes: element.getAttribute('sizes') || undefined,\n media: element.getAttribute('media') || undefined,\n color: element.getAttribute('color') || undefined,\n });\n }\n\n return links;\n}\n\n/**\n * Get all link tags matching multiple rel values.\n *\n * @remarks\n * Finds all link tags where the rel attribute matches any of the provided values.\n * Useful for finding related link types (e.g., \"icon\" or \"shortcut icon\").\n *\n * @param doc - Parsed HTML document\n * @param rels - Array of rel values to search for\n * @returns Array of link data objects (empty if none found)\n *\n * @example\n * ```typescript\n * const icons = getAllLinksByRels(doc, ['icon', 'shortcut icon']);\n * ```\n */\nexport function getAllLinksByRels(doc: Document, rels: string[]): LinkData[] {\n const links: LinkData[] = [];\n\n for (const rel of rels) {\n links.push(...getAllLinks(doc, rel));\n }\n\n return links;\n}\n\n/**\n * Get all link tags matching a rel pattern (prefix).\n *\n * @remarks\n * Finds all link tags where the rel attribute starts with the given prefix.\n * Less common but useful for custom rel types.\n *\n * @param doc - Parsed HTML document\n * @param relPrefix - Prefix to match against rel attributes\n * @returns Array of link data objects (empty if none found)\n *\n * @example\n * ```typescript\n * const appLinks = getAllLinksByPrefix(doc, 'apple-');\n * ```\n */\nexport function getAllLinksByPrefix(doc: Document, relPrefix: string): LinkData[] {\n const elements = doc.querySelectorAll(`link[rel^=\"${relPrefix}\"]`);\n const links: LinkData[] = [];\n\n for (const element of Array.from(elements)) {\n const href = element.getAttribute('href');\n if (!href) continue;\n\n links.push({\n href,\n rel: element.getAttribute('rel') || undefined,\n type: element.getAttribute('type') || undefined,\n hreflang: element.getAttribute('hreflang') || undefined,\n title: element.getAttribute('title') || undefined,\n sizes: element.getAttribute('sizes') || undefined,\n media: element.getAttribute('media') || undefined,\n color: element.getAttribute('color') || undefined,\n });\n }\n\n return links;\n}\n","/**\n * Icons and visual assets extraction.\n *\n * @remarks\n * Extracts icon metadata from HTML documents.\n *\n * @packageDocumentation\n */\n\nimport type { HTMLDocument as Document } from '../../utils/html-parser.js';\nimport { getAllLinksByPrefix, getAllLinksByRels, getLinkHref } from '../../utils/link-helpers.js';\nimport { getMetaContent } from '../../utils/meta-helpers.js';\nimport type { AppleTouchIcon, IconsMetadata, MaskIcon, MSTile } from './types.js';\n\n/**\n * Extract icons metadata from parsed HTML document.\n *\n * @remarks\n * Extracts all icon-related metadata including favicons, Apple touch icons,\n * Safari mask icons, and Microsoft tile configuration.\n *\n * @param doc - Parsed HTML document\n * @returns Icons metadata\n *\n * @example\n * ```typescript\n * const doc = parseHTML(htmlString);\n * const icons = extractIcons(doc);\n * console.log(icons.favicon);\n * console.log(icons.appleTouchIcons);\n * ```\n */\nexport function extractIcons(doc: Document): IconsMetadata {\n const metadata: IconsMetadata = {};\n\n // Extract standard favicons\n const iconLinks = getAllLinksByRels(doc, ['icon', 'shortcut icon']);\n for (const link of iconLinks) {\n if (link.rel === 'icon' && !metadata.favicon) {\n metadata.favicon = link.href;\n }\n if (link.rel === 'shortcut icon' && !metadata.shortcutIcon) {\n metadata.shortcutIcon = link.href;\n }\n }\n\n // Extract Apple touch icons\n const appleTouchIcons = extractAppleTouchIcons(doc);\n if (appleTouchIcons.length > 0) {\n metadata.appleTouchIcons = appleTouchIcons;\n }\n\n // Extract Safari mask icon\n const maskIcon = extractMaskIcon(doc);\n if (maskIcon) {\n metadata.maskIcon = maskIcon;\n }\n\n // Extract Microsoft tile\n const msTile = extractMSTile(doc);\n if (Object.keys(msTile).length > 0) {\n metadata.msTile = msTile;\n }\n\n // Extract fluid icon (legacy)\n metadata.fluidIcon = getLinkHref(doc, 'fluid-icon');\n\n // Remove undefined values\n return Object.fromEntries(\n Object.entries(metadata).filter(([_, value]) => value !== undefined),\n ) as IconsMetadata;\n}\n\n/**\n * Extract Apple touch icons.\n */\nfunction extractAppleTouchIcons(doc: Document): AppleTouchIcon[] {\n const icons: AppleTouchIcon[] = [];\n\n // Get all apple-touch-icon related links\n const links = getAllLinksByPrefix(doc, 'apple-touch-icon');\n\n for (const link of links) {\n const icon: AppleTouchIcon = {\n url: link.href,\n sizes: link.sizes,\n };\n\n // Add precomposed flag only if true\n if (link.rel === 'apple-touch-icon-precomposed') {\n icon.precomposed = true;\n }\n\n // Clean up undefined values\n icons.push(\n Object.fromEntries(\n Object.entries(icon).filter(([_, value]) => value !== undefined),\n ) as AppleTouchIcon,\n );\n }\n\n return icons;\n}\n\n/**\n * Extract Safari mask icon.\n */\nfunction extractMaskIcon(doc: Document): MaskIcon | undefined {\n const url = getLinkHref(doc, 'mask-icon');\n if (!url) {\n return undefined;\n }\n\n // Get color attribute\n const linkElement = doc.querySelector('link[rel=\"mask-icon\"]');\n const color = linkElement?.getAttribute('color') || undefined;\n\n const maskIcon: MaskIcon = { url, color };\n\n return Object.fromEntries(\n Object.entries(maskIcon).filter(([_, value]) => value !== undefined),\n ) as MaskIcon;\n}\n\n/**\n * Extract Microsoft tile metadata.\n */\nfunction extractMSTile(doc: Document): MSTile {\n const tile: MSTile = {};\n\n tile.image = getMetaContent(doc, 'msapplication-TileImage');\n tile.color = getMetaContent(doc, 'msapplication-TileColor');\n tile.config = getMetaContent(doc, 'msapplication-config');\n\n return Object.fromEntries(\n Object.entries(tile).filter(([_, value]) => value !== undefined),\n ) as MSTile;\n}\n","/**\n * Image/keyvisual extraction and aggregation for websites.\n *\n * @packageDocumentation\n */\n\nimport { extractIcons } from '../../metadata/icons/index.js';\nimport { extractOpenGraph } from '../../metadata/opengraph/index.js';\nimport { extractSchemaOrg } from '../../metadata/schema-org/index.js';\nimport { extractTwitterCard } from '../../metadata/twitter-card/index.js';\nimport type { HTMLDocument as Document } from '../../utils/html-parser.js';\nimport { normalizeUrl } from '../../utils/normalize-url.js';\n\n/**\n * Extract best keyvisual/image from multiple sources with smart fallbacks.\n *\n * @remarks\n * Strategy (priority order):\n * 1. Schema.org NewsArticle/Article image (largest if array with size metadata)\n * 2. OpenGraph image (optimized for social sharing, often high quality)\n * 3. Twitter Card image (fallback social image)\n * 4. Largest Apple Touch Icon (often high quality app/site icons)\n * 5. Standard favicon (last resort)\n *\n * This ensures we get the best visual representation of the site,\n * prioritizing social media images over generic icons.\n *\n * @param doc - Parsed HTML document\n * @param baseUrl - Base URL for resolving relative URLs\n * @returns Best available image URL (absolute) or undefined if none found\n *\n * @example\n * ```typescript\n * const doc = parseHTML(html);\n * const image = extractBestImage(doc, 'https://example.com/page');\n * console.log(image); // Absolute URL of best available image\n * ```\n */\nexport function extractBestImage(doc: Document, baseUrl: string): string | undefined {\n // 1. Try Schema.org Article/NewsArticle image (largest if array)\n const schema = extractSchemaOrg(doc);\n if (schema.articles && schema.articles.length > 0) {\n for (const article of schema.articles) {\n const imageUrl = extractSchemaImage(article);\n if (imageUrl?.trim()) {\n return normalizeUrl(baseUrl, imageUrl.trim());\n }\n }\n }\n\n // 2. Try OpenGraph image (social media optimized)\n const og = extractOpenGraph(doc);\n if (og.image?.trim()) {\n return normalizeUrl(baseUrl, og.image.trim());\n }\n\n // 3. Try Twitter Card image\n const twitter = extractTwitterCard(doc);\n if (twitter.image?.trim()) {\n return normalizeUrl(baseUrl, twitter.image.trim());\n }\n\n // 4. Fall back to largest Apple Touch Icon\n const icons = extractIcons(doc);\n if (icons.appleTouchIcons && icons.appleTouchIcons.length > 0) {\n // Find the largest icon by parsing sizes\n const largest = findLargestIcon(icons.appleTouchIcons);\n if (largest?.url) {\n return normalizeUrl(baseUrl, largest.url);\n }\n }\n\n // 5. Fall back to standard favicon\n if (icons.favicon?.trim()) {\n return normalizeUrl(baseUrl, icons.favicon.trim());\n }\n\n // No image found\n return undefined;\n}\n\n/**\n * Extract image URL from Schema.org article object.\n *\n * @remarks\n * Handles multiple formats:\n * - String URL\n * - Single ImageObject with url property\n * - Array of ImageObjects (picks largest by width * height)\n *\n * @param article - Schema.org article object\n * @returns Image URL or undefined\n */\nfunction extractSchemaImage(article: unknown): string | undefined {\n if (!article || typeof article !== 'object') return undefined;\n\n const image = (article as Record<string, unknown>).image;\n if (!image) return undefined;\n\n // Case 1: Direct string URL\n if (typeof image === 'string') {\n return image;\n }\n\n // Case 2: Single ImageObject\n if (typeof image === 'object' && !Array.isArray(image)) {\n const url = getImageUrl(image);\n if (url) return url;\n }\n\n // Case 3: Array of ImageObjects (pick largest)\n if (Array.isArray(image)) {\n let largest: { url: string; size: number } | undefined;\n\n for (const img of image) {\n if (typeof img === 'string') {\n // Direct URL in array - return first one\n return img;\n }\n\n const url = getImageUrl(img);\n if (!url) continue;\n\n const width = getNumberProperty(img, 'width') || 0;\n const height = getNumberProperty(img, 'height') || 0;\n const size = width * height;\n\n if (!largest || size > largest.size) {\n largest = { url, size };\n }\n }\n\n return largest?.url;\n }\n\n return undefined;\n}\n\n/**\n * Extract URL from ImageObject.\n */\nfunction getImageUrl(img: unknown): string | undefined {\n if (!img || typeof img !== 'object') return undefined;\n const obj = img as Record<string, unknown>;\n\n // Try multiple properties\n return (\n getStringProperty(obj, 'url') ||\n getStringProperty(obj, 'contentUrl') ||\n getStringProperty(obj, '@id')\n );\n}\n\n/**\n * Safely extract a string property from an object.\n */\nfunction getStringProperty(obj: Record<string, unknown>, prop: string): string | undefined {\n const value = obj[prop];\n return typeof value === 'string' ? value : undefined;\n}\n\n/**\n * Safely extract a number property from an object.\n */\nfunction getNumberProperty(obj: unknown, prop: string): number | undefined {\n if (!obj || typeof obj !== 'object') return undefined;\n const value = (obj as Record<string, unknown>)[prop];\n\n if (typeof value === 'number') return value;\n if (typeof value === 'string') {\n const parsed = Number.parseInt(value, 10);\n return Number.isNaN(parsed) ? undefined : parsed;\n }\n return undefined;\n}\n\n/**\n * Find the largest Apple Touch Icon by size.\n *\n * @param icons - Array of Apple Touch Icons\n * @returns Largest icon or first icon if sizes not specified\n */\nfunction findLargestIcon(\n icons: Array<{ url: string; sizes?: string; precomposed?: boolean }>,\n): { url: string; sizes?: string; precomposed?: boolean } | undefined {\n if (icons.length === 0) {\n return undefined;\n }\n\n let largest = icons[0];\n let largestSize = parseSizeString(icons[0].sizes);\n\n for (const icon of icons) {\n const size = parseSizeString(icon.sizes);\n if (size > largestSize) {\n largest = icon;\n largestSize = size;\n }\n }\n\n return largest;\n}\n\n/**\n * Parse size string (e.g., \"180x180\", \"any\") to numeric value.\n *\n * @param sizeStr - Size string from sizes attribute\n * @returns Numeric size value for comparison (0 if invalid)\n */\nfunction parseSizeString(sizeStr?: string): number {\n if (!sizeStr) {\n return 0;\n }\n\n // Handle \"any\" as very large\n if (sizeStr.toLowerCase() === 'any') {\n return Number.POSITIVE_INFINITY;\n }\n\n // Parse \"WxH\" format (e.g., \"180x180\")\n const match = /^(\\d+)x(\\d+)$/i.exec(sizeStr);\n if (match) {\n const width = Number.parseInt(match[1], 10);\n const height = Number.parseInt(match[2], 10);\n // Use area (width * height) for comparison\n return width * height;\n }\n\n return 0;\n}\n","/**\n * Language and localization extraction.\n *\n * @remarks\n * Extracts language and locale metadata from HTML documents.\n *\n * @packageDocumentation\n */\n\nimport type { HTMLDocument as Document } from '../../utils/html-parser.js';\nimport {\n getAllMetaPropertyValues,\n getMetaContent,\n getMetaHttpEquiv,\n getMetaProperty,\n} from '../../utils/meta-helpers.js';\nimport type { LanguageMetadata } from './types.js';\n\n/**\n * Extract language and localization metadata from parsed HTML document.\n *\n * @remarks\n * Extracts language information from HTML lang attribute, meta tags,\n * and OpenGraph locale. Normalizes to provide a primary language and region.\n *\n * @param doc - Parsed HTML document\n * @returns Language metadata\n *\n * @example\n * ```typescript\n * const doc = parseHTML(htmlString);\n * const lang = extractLanguage(doc);\n * console.log(lang.primary); // 'en'\n * console.log(lang.region); // 'US'\n * ```\n */\nexport function extractLanguage(doc: Document): LanguageMetadata {\n const metadata: LanguageMetadata = {};\n\n // Extract HTML lang attribute\n const htmlElement = doc.querySelector('html');\n if (htmlElement) {\n const lang = htmlElement.getAttribute('lang');\n if (lang) {\n metadata.htmlLang = lang;\n }\n }\n\n // Extract content-language meta tag (can be http-equiv or name)\n metadata.contentLanguage =\n getMetaHttpEquiv(doc, 'content-language') || getMetaContent(doc, 'content-language');\n\n // Extract OpenGraph locale\n metadata.ogLocale = getMetaProperty(doc, 'og:locale');\n\n // Extract OpenGraph alternate locales\n const alternateLocales = getAllMetaPropertyValues(doc, 'og:locale:alternate');\n if (alternateLocales.length > 0) {\n metadata.alternateLocales = alternateLocales;\n }\n\n // Determine primary language and region\n const { primary, region } = parseLanguageCode(\n metadata.htmlLang || metadata.contentLanguage || metadata.ogLocale,\n );\n\n if (primary) {\n metadata.primary = primary;\n }\n if (region) {\n metadata.region = region;\n }\n\n // Remove undefined values\n return Object.fromEntries(\n Object.entries(metadata).filter(([_, value]) => value !== undefined),\n ) as LanguageMetadata;\n}\n\n/**\n * Parse language code to extract language and region.\n *\n * @remarks\n * Handles various formats:\n * - en → { primary: 'en' }\n * - en-US → { primary: 'en', region: 'US' }\n * - en_US → { primary: 'en', region: 'US' }\n * - en-us → { primary: 'en', region: 'US' }\n *\n * @param code - Language code to parse\n * @returns Normalized primary language and region\n */\nfunction parseLanguageCode(code?: string): { primary?: string; region?: string } {\n if (!code) {\n return {};\n }\n\n // Normalize separators (both - and _ are used)\n const normalized = code.trim().replace(/_/g, '-');\n\n // Split on - or space\n const parts = normalized.split(/[-\\s]/);\n\n if (parts.length === 0) {\n return {};\n }\n\n // First part is the language code (lowercase)\n const primary = parts[0].toLowerCase();\n\n // Second part (if exists) is the region code (uppercase)\n const region = parts.length > 1 ? parts[1].toUpperCase() : undefined;\n\n return { primary, region };\n}\n","/**\n * Language extraction and aggregation for websites.\n *\n * @packageDocumentation\n */\n\nimport { extractLanguage } from '../../metadata/language/index.js';\nimport type { HTMLDocument as Document } from '../../utils/html-parser.js';\n\n/**\n * Language information for a website.\n */\nexport interface WebsiteLanguage {\n /** Primary language code (ISO 639-1, e.g., 'en', 'de', 'fr') */\n language?: string;\n /** Region code (ISO 3166-1 alpha-2, e.g., 'US', 'GB', 'DE') */\n region?: string;\n}\n\n/**\n * Extract best available language information from the document.\n *\n * @remarks\n * Uses the language metadata extractor to determine the primary language\n * and region of the page. Prioritizes HTML lang attribute, then content-language\n * meta tag, then OpenGraph locale.\n *\n * The returned language code is normalized to ISO 639-1 format (e.g., 'en')\n * and the region code (if available) to ISO 3166-1 alpha-2 (e.g., 'US').\n *\n * @param doc - Parsed HTML document\n * @returns Language information with ISO codes\n *\n * @example\n * ```typescript\n * const doc = parseHTML(html);\n * const lang = extractBestLanguage(doc);\n * console.log(lang.language); // 'en'\n * console.log(lang.region); // 'US'\n * ```\n */\nexport function extractBestLanguage(doc: Document): WebsiteLanguage {\n const metadata = extractLanguage(doc);\n\n return {\n language: metadata.primary,\n region: metadata.region,\n };\n}\n","/**\n * Links extraction.\n *\n * @remarks\n * Extract navigational links from HTML documents with advanced filtering\n * and categorization for crawler and SEO use cases.\n *\n * @author Anonyfox <max@anonyfox.com>\n * @license MIT\n * @see {@link https://github.com/Anonyfox/ravenjs}\n * @see {@link https://ravenjs.dev}\n * @see {@link https://anonyfox.com}\n *\n * @packageDocumentation\n */\n\nimport type { HTMLDocument as Document } from '../../utils/html-parser.js';\nimport { normalizeUrl } from '../../utils/normalize-url.js';\nimport type { ExtractedLink, LinksExtractionOptions, LinksMetadata } from './types.js';\n\n/**\n * Extract links from parsed HTML document.\n *\n * @remarks\n * Extracts all `<a href>` links with comprehensive metadata and filtering options.\n * Perfect for crawlers, SEO analysis, and link discovery.\n *\n * Features:\n * - Internal/external link categorization\n * - Rel attribute filtering (nofollow, ugc, sponsored, etc.)\n * - Automatic URL normalization\n * - Hash link filtering\n * - Scheme filtering (only http/https)\n * - Deduplication\n * - Link text extraction\n *\n * @param doc - Parsed HTML document\n * @param baseUrl - Base URL for resolving relative links and determining internal/external\n * @param options - Extraction options for filtering and categorization\n * @returns Links metadata with categorized links\n *\n * @example\n * ```typescript\n * const doc = parseHTML(htmlString);\n * const links = extractLinks(doc, 'https://example.com');\n *\n * // Get all internal links (same origin)\n * console.log(links.internal);\n *\n * // Get external links excluding nofollow\n * const linksNoFollow = extractLinks(doc, 'https://example.com', {\n * scope: 'external',\n * excludeRel: ['nofollow']\n * });\n * ```\n *\n * @example\n * ```typescript\n * // Crawler use case - get follow-able links\n * const links = extractLinks(doc, baseUrl, {\n * excludeRel: ['nofollow', 'ugc', 'sponsored'],\n * includeHashLinks: false\n * });\n * ```\n */\nexport function extractLinks(\n doc: Document,\n baseUrl?: string | URL | null,\n options: LinksExtractionOptions = {},\n): LinksMetadata {\n const opts = normalizeOptions(options);\n\n // Determine effective base URL (from <base> tag or parameter)\n const effectiveBaseUrl = getEffectiveBaseUrl(doc, baseUrl);\n const baseOrigin = effectiveBaseUrl ? getOrigin(effectiveBaseUrl) : null;\n\n // Extract all links\n const allLinks = extractAllLinks(doc, effectiveBaseUrl, baseOrigin, opts);\n\n // Categorize links\n const internal: ExtractedLink[] = [];\n const external: ExtractedLink[] = [];\n const nofollow: ExtractedLink[] = [];\n\n for (const link of allLinks) {\n if (link.internal) internal.push(link);\n if (link.external) external.push(link);\n if (link.nofollow) nofollow.push(link);\n }\n\n // Build metadata\n const metadata: LinksMetadata = {\n all: allLinks.length > 0 ? allLinks : undefined,\n internal: internal.length > 0 ? internal : undefined,\n external: external.length > 0 ? external : undefined,\n nofollow: nofollow.length > 0 ? nofollow : undefined,\n totalCount: allLinks.length,\n internalCount: internal.length,\n externalCount: external.length,\n nofollowCount: nofollow.length,\n };\n\n // Remove undefined values\n return Object.fromEntries(\n Object.entries(metadata).filter(([_, value]) => value !== undefined),\n ) as LinksMetadata;\n}\n\n/**\n * Normalize extraction options.\n */\nfunction normalizeOptions(options: LinksExtractionOptions): Required<LinksExtractionOptions> {\n return {\n scope: options.scope || 'all',\n excludeRel: options.excludeRel || [],\n includeRel: options.includeRel || [],\n includeHashLinks: options.includeHashLinks ?? false,\n deduplicate: options.deduplicate ?? true,\n limit: options.limit || Number.POSITIVE_INFINITY,\n };\n}\n\n/**\n * Get effective base URL from <base> tag or parameter.\n */\nfunction getEffectiveBaseUrl(doc: Document, baseUrl?: string | URL | null): string | null {\n // Check for <base> tag first\n const baseElement = doc.querySelector('base[href]');\n if (baseElement) {\n const baseHref = baseElement.getAttribute('href');\n if (baseHref) {\n try {\n // If baseUrl is provided, resolve relative base href against it\n if (baseUrl) {\n const resolvedBase = normalizeUrl(baseUrl, baseHref);\n return resolvedBase || null;\n }\n return baseHref;\n } catch {\n // Fall through to use provided baseUrl\n }\n }\n }\n\n // Use provided base URL\n if (baseUrl) {\n return typeof baseUrl === 'string' ? baseUrl : baseUrl.href;\n }\n\n return null;\n}\n\n/**\n * Get origin from URL string.\n */\nfunction getOrigin(url: string): string | null {\n try {\n const parsed = new URL(url);\n return parsed.origin;\n } catch {\n return null;\n }\n}\n\n/**\n * Extract all links from document.\n */\nfunction extractAllLinks(\n doc: Document,\n baseUrl: string | null,\n baseOrigin: string | null,\n options: Required<LinksExtractionOptions>,\n): ExtractedLink[] {\n const links: ExtractedLink[] = [];\n const seenUrls = new Set<string>();\n\n // Get all anchor elements\n const anchorElements = doc.querySelectorAll('a[href]');\n\n for (const anchor of Array.from(anchorElements)) {\n const href = anchor.getAttribute('href');\n if (!href) continue;\n\n const trimmedHref = href.trim();\n if (!trimmedHref) continue;\n\n // Skip hash-only links if not allowed\n if (!options.includeHashLinks && trimmedHref.startsWith('#')) {\n continue;\n }\n\n // Check scheme - only allow http/https or relative URLs\n const scheme = getScheme(trimmedHref);\n if (scheme && !isHttpLike(scheme)) {\n continue;\n }\n\n // Parse rel attribute\n const rel = anchor.getAttribute('rel')?.trim() || undefined;\n const relParts = rel ? rel.toLowerCase().split(/\\s+/).filter(Boolean) : [];\n\n // Check rel exclusions\n if (options.excludeRel.length > 0) {\n const hasExcluded = relParts.some((r) =>\n options.excludeRel.includes(\n r as 'nofollow' | 'noopener' | 'noreferrer' | 'ugc' | 'sponsored',\n ),\n );\n if (hasExcluded) continue;\n }\n\n // Check rel inclusions\n if (options.includeRel.length > 0) {\n const hasIncluded = relParts.some((r) =>\n options.includeRel.includes(\n r as 'nofollow' | 'noopener' | 'noreferrer' | 'ugc' | 'sponsored',\n ),\n );\n if (!hasIncluded) continue;\n }\n\n // Normalize URL\n let normalizedUrl: string;\n try {\n normalizedUrl = normalizeUrl(baseUrl, trimmedHref) || trimmedHref;\n } catch {\n continue;\n }\n\n // Deduplicate if enabled\n if (options.deduplicate) {\n if (seenUrls.has(normalizedUrl)) continue;\n seenUrls.add(normalizedUrl);\n }\n\n // Determine if internal/external\n let isInternal = false;\n let isExternal = false;\n\n if (baseOrigin) {\n try {\n const linkOrigin = getOrigin(normalizedUrl);\n if (linkOrigin) {\n isInternal = linkOrigin === baseOrigin;\n isExternal = linkOrigin !== baseOrigin;\n }\n } catch {\n // Unable to determine, skip classification\n }\n }\n\n // Apply scope filter\n if (options.scope === 'internal' && !isInternal) continue;\n if (options.scope === 'external' && !isExternal) continue;\n\n // Extract link metadata\n const link: ExtractedLink = {\n url: normalizedUrl,\n text: anchor.textContent?.trim() || undefined,\n title: anchor.getAttribute('title')?.trim() || undefined,\n rel: rel || undefined,\n target: anchor.getAttribute('target')?.trim() || undefined,\n internal: isInternal || undefined,\n external: isExternal || undefined,\n nofollow: relParts.includes('nofollow') || undefined,\n ugc: relParts.includes('ugc') || undefined,\n sponsored: relParts.includes('sponsored') || undefined,\n noopener: relParts.includes('noopener') || undefined,\n noreferrer: relParts.includes('noreferrer') || undefined,\n };\n\n // Clean up undefined values\n links.push(\n Object.fromEntries(\n Object.entries(link).filter(([_, value]) => value !== undefined),\n ) as ExtractedLink,\n );\n\n // Check limit\n if (links.length >= options.limit) {\n break;\n }\n }\n\n return links;\n}\n\n/**\n * Get URL scheme.\n */\nfunction getScheme(url: string): string {\n const match = /^([a-zA-Z][a-zA-Z0-9+.-]*):/.exec(url);\n return match ? match[1].toLowerCase() : '';\n}\n\n/**\n * Check if scheme is HTTP-like.\n */\nfunction isHttpLike(scheme: string): boolean {\n return scheme === 'http' || scheme === 'https' || scheme === '';\n}\n","/**\n * Links extraction and aggregation for websites.\n *\n * @packageDocumentation\n */\n\nimport { extractLinks } from '../../metadata/links/index.js';\nimport type { HTMLDocument as Document } from '../../utils/html-parser.js';\n\n/**\n * Result of link extraction with internal and external links separated.\n */\nexport interface ExtractedLinksResult {\n /** Internal links (same domain, excluding current page URL) */\n internal: string[];\n /** External links (different domains) */\n external: string[];\n}\n\n/**\n * Extract and categorize links from a page.\n *\n * @remarks\n * Strategy:\n * 1. Extract all links using the links metadata extractor\n * 2. Separate into internal (same domain) and external (different domains)\n * 3. Exclude the current page URL from internal links (self-reference)\n * 4. Return arrays of unique URL strings\n *\n * @param doc - Parsed HTML document\n * @param pageUrl - Current page URL (for categorization and self-exclusion)\n * @returns Object with internal and external link arrays\n *\n * @example\n * ```typescript\n * const doc = parseHTML(html);\n * const { internal, external } = extractPageLinks(doc, 'https://example.com/page');\n * console.log(internal); // ['https://example.com/about', 'https://example.com/contact']\n * console.log(external); // ['https://other.com', 'https://twitter.com/...']\n * ```\n */\nexport function extractPageLinks(doc: Document, pageUrl: string): ExtractedLinksResult {\n // Extract all links with categorization\n const linksMetadata = extractLinks(doc, pageUrl, {\n deduplicate: true,\n includeHashLinks: false, // Exclude #anchor links\n });\n\n // Normalize current page URL for comparison (remove hash/query if present)\n const currentUrl = normalizePageUrl(pageUrl);\n\n // Extract internal links (exclude self-reference)\n const internal: string[] = [];\n if (linksMetadata.internal) {\n for (const link of linksMetadata.internal) {\n const normalizedLink = normalizePageUrl(link.url);\n // Exclude the current page itself\n if (normalizedLink !== currentUrl) {\n internal.push(link.url);\n }\n }\n }\n\n // Extract external links\n const external: string[] = [];\n if (linksMetadata.external) {\n for (const link of linksMetadata.external) {\n external.push(link.url);\n }\n }\n\n return {\n internal,\n external,\n };\n}\n\n/**\n * Normalize a page URL for comparison (remove hash and query params).\n *\n * @remarks\n * This ensures we can properly detect self-references even if the link\n * includes query parameters or hash fragments.\n *\n * @param url - URL to normalize\n * @returns Normalized URL (origin + pathname)\n */\nfunction normalizePageUrl(url: string): string {\n try {\n const parsed = new URL(url);\n // Return origin + pathname (no query, no hash)\n return parsed.origin + parsed.pathname;\n } catch {\n return url;\n }\n}\n","/**\n * Title cleaning utilities.\n *\n * @remarks\n * Utilities for cleaning page titles by removing brand names and other noise.\n *\n * @packageDocumentation\n */\n\n/**\n * Common title separators used between content title and brand name.\n */\nconst TITLE_SEPARATORS = [\n '|',\n '-',\n '·',\n '•',\n ':',\n '—', // em dash\n '–', // en dash\n '›',\n '»',\n '//',\n];\n\n/**\n * Clean a page title by removing brand names and separators.\n *\n * @remarks\n * Many websites use patterns like \"Page Title | Brand Name\" or \"Article - Site Name\".\n * This function applies heuristics to detect and remove the brand portion:\n *\n * 1. Splits on common separators (|, -, ·, :, etc.)\n * 2. Identifies brand by length (usually shorter)\n * 3. Detects domain-like patterns (contains dots)\n * 4. Returns the more meaningful content title\n *\n * If no clear brand pattern is detected, returns the original title.\n *\n * @param title - Raw page title string\n * @returns Cleaned title without brand suffix/prefix\n *\n * @example\n * ```typescript\n * cleanTitle('Breaking News | CNN'); // 'Breaking News'\n * cleanTitle('GitHub - Where the world builds software'); // 'Where the world builds software'\n * cleanTitle('Article Title · example.com'); // 'Article Title'\n * cleanTitle('Simple Title'); // 'Simple Title' (no change)\n * ```\n */\nexport function cleanTitle(title: string): string {\n if (!title?.trim()) {\n return title;\n }\n\n const trimmed = title.trim();\n\n // Try each separator\n for (const separator of TITLE_SEPARATORS) {\n if (!trimmed.includes(separator)) {\n continue;\n }\n\n // Detect spacing pattern around separator (check first occurrence)\n const sepIndex = trimmed.indexOf(separator);\n const hasSpaceBefore = sepIndex > 0 && trimmed[sepIndex - 1] === ' ';\n const hasSpaceAfter = sepIndex < trimmed.length - 1 && trimmed[sepIndex + 1] === ' ';\n\n // Build join string that preserves original spacing\n let joinStr = separator;\n if (hasSpaceBefore) joinStr = ` ${joinStr}`;\n if (hasSpaceAfter) joinStr = `${joinStr} `;\n\n // Split by separator and clean up parts\n const parts = trimmed\n .split(separator)\n .map((part) => part.trim())\n .filter((part) => part.length > 0);\n\n // If only one part after split, continue to next separator\n if (parts.length < 2) {\n continue;\n }\n\n // For exactly 2 parts, try to identify brand\n // Common patterns: \"Title | Brand\" or \"Brand | Title\"\n if (parts.length === 2) {\n const [first, second] = parts;\n const brandIndex = identifyBrandIndex([first, second]);\n\n // Return the non-brand part\n return brandIndex === 0 ? second : first;\n }\n\n // For 3+ parts, heuristic: brand is usually first or last\n // Keep the middle/longer parts\n const firstIsBrand = isBrand(parts[0], parts.slice(1));\n const lastIsBrand = isBrand(parts[parts.length - 1], parts.slice(0, -1));\n\n if (firstIsBrand && !lastIsBrand) {\n return parts.slice(1).join(joinStr);\n }\n if (lastIsBrand && !firstIsBrand) {\n return parts.slice(0, -1).join(joinStr);\n }\n\n // If both or neither seem like brand, return original (no brand detected)\n return trimmed;\n }\n\n // No brand pattern detected, return original\n return trimmed;\n}\n\n/**\n * Identify which part is likely the brand (0 or 1).\n *\n * @param parts - Array of exactly 2 title parts\n * @returns Index of the brand part (0 or 1)\n */\nfunction identifyBrandIndex(parts: [string, string]): 0 | 1 {\n const [first, second] = parts;\n\n // Check for domain-like pattern (contains dots)\n const firstHasDots = /\\w+\\.\\w+/.test(first);\n const secondHasDots = /\\w+\\.\\w+/.test(second);\n\n if (firstHasDots && !secondHasDots) {\n return 0; // First is brand (domain)\n }\n if (secondHasDots && !firstHasDots) {\n return 1; // Second is brand (domain)\n }\n\n // Check for all-caps pattern (often brands/sites)\n const firstAllCaps = first === first.toUpperCase() && /[A-Z]/.test(first);\n const secondAllCaps = second === second.toUpperCase() && /[A-Z]/.test(second);\n\n if (firstAllCaps && !secondAllCaps && first.length < 20) {\n return 0; // First is brand (short all-caps)\n }\n if (secondAllCaps && !firstAllCaps && second.length < 20) {\n return 1; // Second is brand (short all-caps)\n }\n\n // Default: shorter part is likely the brand\n return first.length < second.length ? 0 : 1;\n}\n\n/**\n * Check if a part is likely a brand name.\n *\n * @param candidate - Potential brand string\n * @param others - Other parts to compare against\n * @returns True if candidate is likely a brand\n */\nfunction isBrand(candidate: string, others: string[]): boolean {\n // Domain-like pattern\n if (/\\w+\\.\\w+/.test(candidate)) {\n return true;\n }\n\n // Very short compared to others\n const avgLength = others.reduce((sum, s) => sum + s.length, 0) / others.length;\n if (candidate.length < avgLength * 0.5 && candidate.length < 30) {\n return true;\n }\n\n // All caps and short\n if (candidate === candidate.toUpperCase() && /[A-Z]/.test(candidate) && candidate.length < 20) {\n return true;\n }\n\n return false;\n}\n","/**\n * Title extraction and aggregation for websites.\n *\n * @packageDocumentation\n */\n\nimport { extractOpenGraph } from '../../metadata/opengraph/index.js';\nimport { extractSchemaOrg } from '../../metadata/schema-org/index.js';\nimport { extractSEO } from '../../metadata/seo/index.js';\nimport { extractTwitterCard } from '../../metadata/twitter-card/index.js';\nimport { cleanTitle } from '../../utils/clean-title.js';\nimport type { HTMLDocument as Document } from '../../utils/html-parser.js';\n\n/**\n * Extract page title from multiple sources, clean them, and pick the longest.\n *\n * @remarks\n * Strategy:\n * 1. Collect all possible titles from multiple sources (priority order):\n * - Schema.org NewsArticle/Article headline (cleanest, no brand)\n * - OpenGraph og:title\n * - Twitter twitter:title\n * - Schema.org WebPage name (may include brand)\n * - HTML <title> tag\n * - First <h1> element\n * 2. Clean each title to remove brand suffixes\n * 3. Pick the longest cleaned title\n * 4. This ensures we get the most substantial/descriptive title\n *\n * @param doc - Parsed HTML document\n * @returns Best available title or undefined if none found\n *\n * @example\n * ```typescript\n * const doc = parseHTML(html);\n * const title = extractBestTitle(doc);\n * console.log(title); // Most descriptive title without brand\n * ```\n */\nexport function extractBestTitle(doc: Document): string | undefined {\n const candidates: string[] = [];\n\n // 1. Schema.org Article/NewsArticle headline (cleanest, no brand)\n const schema = extractSchemaOrg(doc);\n if (schema.articles && schema.articles.length > 0) {\n for (const article of schema.articles) {\n const headline = getStringProperty(article, 'headline');\n if (headline?.trim()) {\n candidates.push(headline.trim());\n }\n }\n }\n\n // 2. OpenGraph title\n const og = extractOpenGraph(doc);\n if (og.title?.trim()) {\n candidates.push(og.title.trim());\n }\n\n // 3. Twitter Card title\n const twitter = extractTwitterCard(doc);\n if (twitter.title?.trim()) {\n candidates.push(twitter.title.trim());\n }\n\n // 4. Schema.org WebPage name (may include brand)\n if (schema.webPages && schema.webPages.length > 0) {\n for (const page of schema.webPages) {\n const name = getStringProperty(page, 'name');\n if (name?.trim()) {\n candidates.push(name.trim());\n }\n }\n }\n\n // 5. HTML <title> tag\n const seo = extractSEO(doc);\n if (seo.title?.trim()) {\n candidates.push(seo.title.trim());\n }\n\n // 6. First <h1> element\n const h1 = doc.querySelector('h1');\n if (h1?.textContent?.trim()) {\n candidates.push(h1.textContent.trim());\n }\n\n // No candidates found\n if (candidates.length === 0) {\n return undefined;\n }\n\n // Clean all candidates and pick the longest\n const cleaned = candidates.map((title) => ({\n original: title,\n cleaned: cleanTitle(title),\n }));\n\n // Sort by cleaned length (descending) and return the longest\n cleaned.sort((a, b) => b.cleaned.length - a.cleaned.length);\n\n return cleaned[0].cleaned;\n}\n\n/**\n * Safely extract a string property from an unknown object.\n */\nfunction getStringProperty(obj: unknown, prop: string): string | undefined {\n if (!obj || typeof obj !== 'object') return undefined;\n const value = (obj as Record<string, unknown>)[prop];\n return typeof value === 'string' ? value : undefined;\n}\n","/**\n * Canonical and alternate URL extraction.\n *\n * @remarks\n * Extracts canonical URLs, alternates, and special versions from HTML documents.\n *\n * @packageDocumentation\n */\n\nimport type { HTMLDocument as Document } from '../../utils/html-parser.js';\nimport { getAllLinks, getLinkHref } from '../../utils/link-helpers.js';\nimport { getMetaProperty } from '../../utils/meta-helpers.js';\nimport type { AlternateLink, AppLinks, CanonicalMetadata } from './types.js';\n\n/**\n * Extract canonical and alternate URL metadata from parsed HTML document.\n *\n * @remarks\n * Extracts canonical URLs, language alternates, AMP versions, manifests,\n * and app linking metadata.\n *\n * @param doc - Parsed HTML document\n * @returns Canonical metadata object\n *\n * @example\n * ```typescript\n * const doc = parseHTML(htmlString);\n * const canonical = extractCanonical(doc);\n * console.log(canonical.canonical);\n * console.log(canonical.alternates);\n * ```\n */\nexport function extractCanonical(doc: Document): CanonicalMetadata {\n const metadata: CanonicalMetadata = {};\n\n // Extract canonical URL\n metadata.canonical = getLinkHref(doc, 'canonical');\n\n // Extract alternate links (language versions, feeds, etc.)\n const alternateLinks = getAllLinks(doc, 'alternate');\n if (alternateLinks.length > 0) {\n metadata.alternates = alternateLinks.map((link): AlternateLink => {\n const alt: AlternateLink = {\n href: link.href,\n };\n\n if (link.hreflang) alt.hreflang = link.hreflang;\n if (link.type) alt.type = link.type;\n if (link.title) alt.title = link.title;\n\n return alt;\n });\n }\n\n // Extract AMP version\n metadata.amphtml = getLinkHref(doc, 'amphtml');\n\n // Extract manifest\n metadata.manifest = getLinkHref(doc, 'manifest');\n\n // Extract app links\n const appLinks = extractAppLinks(doc);\n if (Object.keys(appLinks).length > 0) {\n metadata.appLinks = appLinks;\n }\n\n // Remove undefined values\n return Object.fromEntries(\n Object.entries(metadata).filter(([_, value]) => value !== undefined),\n ) as CanonicalMetadata;\n}\n\n/**\n * Extract app linking metadata.\n */\nfunction extractAppLinks(doc: Document): AppLinks {\n const appLinks: AppLinks = {};\n\n // App Links (Facebook standard)\n appLinks.ios = getMetaProperty(doc, 'al:ios:url');\n appLinks.android = getMetaProperty(doc, 'al:android:url');\n appLinks.web = getMetaProperty(doc, 'al:web:url');\n\n return Object.fromEntries(\n Object.entries(appLinks).filter(([_, value]) => value !== undefined),\n ) as AppLinks;\n}\n","/**\n * URL determination for websites.\n *\n * @packageDocumentation\n */\n\nimport { extractCanonical } from '../../metadata/canonical/index.js';\nimport type { HTMLDocument as Document } from '../../utils/html-parser.js';\n\n/**\n * Extract the best/authoritative URL for a page.\n *\n * @remarks\n * Strategy:\n * 1. Check for canonical URL in <link rel=\"canonical\"> tag (authoritative)\n * 2. Fall back to the final URL after redirects (from fetch)\n *\n * The canonical URL is preferred as it represents the publisher's intended\n * URL for the content, even if accessed via a different URL or redirect chain.\n *\n * @param doc - Parsed HTML document\n * @param finalUrl - Final URL after following redirects (from pluck)\n * @returns Best available URL (canonical or final URL)\n *\n * @example\n * ```typescript\n * const doc = parseHTML(html);\n * const url = extractBestUrl(doc, 'https://example.com/page');\n * console.log(url); // Canonical URL if present, otherwise finalUrl\n * ```\n */\nexport function extractBestUrl(doc: Document, finalUrl: string): string {\n // 1. Try canonical URL (authoritative)\n const canonical = extractCanonical(doc);\n if (canonical.canonical?.trim()) {\n return canonical.canonical.trim();\n }\n\n // 2. Fall back to final URL after redirects\n return finalUrl;\n}\n","/**\n * High-level article gathering functionality.\n *\n * @packageDocumentation\n */\n\nimport { htmlToText } from '../../content/html-to-text/index.js';\nimport { calculateReadingTime, countWords, extractContent } from '../../content/index.js';\nimport { pluck } from '../../pluck/index.js';\nimport { parseHTML } from '../../utils/html-parser.js';\nimport type { Article } from '../types.js';\nimport { extractBestDescription } from '../website/description.js';\nimport { extractBestImage } from '../website/image.js';\nimport { extractBestLanguage } from '../website/language.js';\nimport { extractPageLinks } from '../website/links.js';\nimport { extractBestTitle } from '../website/title.js';\nimport { extractBestUrl } from '../website/url.js';\n\n/**\n * Gather article data from a URL in one convenient call.\n *\n * @remarks\n * This is a high-level convenience method that fetches an article page and extracts\n * relevant data. It handles encoding detection, redirects, and provides\n * a unified interface for all article data.\n *\n * This method will be extended incrementally to include metadata extraction,\n * content extraction, and more.\n *\n * @param url - Article URL as string or URL object\n * @returns Gathered article data including URL, content, metadata, language, and links\n * @throws Error if URL is invalid or fetch fails\n *\n * @example\n * ```typescript\n * // Fetch an article and get its data\n * const article = await gatherArticle('https://example.com/article');\n * console.log(article.url); // Final URL after redirects\n * console.log(article.html); // Raw HTML content (UTF-8)\n * console.log(article.text); // Plain text (full page HTML converted)\n * console.log(article.content); // Cleaned article content (Readability + htmlToText)\n * console.log(article.title); // Article title (from Readability or metadata)\n * console.log(article.description); // Article excerpt or description\n * console.log(article.image); // Article keyvisual/image (from best source)\n * console.log(article.language); // Language code (ISO 639-1, e.g., 'en')\n * console.log(article.region); // Region code (ISO 3166-1 alpha-2, e.g., 'US')\n * console.log(article.internalLinks); // Array of internal link URLs\n * console.log(article.externalLinks); // Array of external link URLs\n * console.log(article.wordCount); // Word count (from content or text)\n * console.log(article.readingTime); // Estimated reading time in minutes\n * ```\n */\nexport async function gatherArticle(url: string | URL): Promise<Article> {\n // Convert string to URL and validate\n let articleUrl: URL;\n try {\n articleUrl = typeof url === 'string' ? new URL(url) : url;\n } catch (error) {\n throw new Error(`Invalid article URL: ${typeof url === 'string' ? url : url.toString()}`, {\n cause: error,\n });\n }\n\n // Ensure URL is valid (has protocol and host)\n if (!articleUrl.protocol || !articleUrl.host) {\n throw new Error(`Invalid article URL: must have protocol and host (${articleUrl.toString()})`);\n }\n\n // Fetch the article\n const response = await pluck(articleUrl);\n const html = await response.textUtf8();\n\n // Parse HTML document\n const doc = parseHTML(html);\n\n // Extract plain text from HTML\n const text = htmlToText(html);\n\n // Extract best URL (canonical or final redirect URL)\n const pageUrl = extractBestUrl(doc, response.finalUrl);\n\n // Extract title, description, and content: try Readability first, fall back to metadata\n let title: string | undefined;\n let description: string | undefined;\n let content: string | undefined;\n\n try {\n // Try to extract article content with Mozilla Readability\n const contentResult = extractContent(doc, { baseUrl: pageUrl });\n\n if (contentResult.success) {\n // Extract title if available\n if (contentResult.title?.trim()) {\n title = contentResult.title.trim();\n }\n\n // Extract excerpt/description if available\n if (contentResult.excerpt?.trim()) {\n description = contentResult.excerpt.trim();\n }\n\n // Extract cleaned HTML content and convert to plain text\n if (contentResult.content?.trim()) {\n content = htmlToText(contentResult.content);\n }\n }\n } catch {\n // Readability extraction failed, will fall back to metadata\n }\n\n // If no title from Readability, fall back to metadata title\n if (!title) {\n title = extractBestTitle(doc);\n }\n\n // If no excerpt from Readability, fall back to metadata description\n if (!description) {\n description = extractBestDescription(doc);\n }\n\n // Extract best image from metadata\n const imageUrl = extractBestImage(doc, pageUrl);\n let image: URL | undefined;\n if (imageUrl) {\n try {\n image = new URL(imageUrl);\n } catch {\n // Skip invalid image URL\n }\n }\n\n // Extract language and region\n const { language, region } = extractBestLanguage(doc);\n\n // Extract internal and external links\n const { internal, external } = extractPageLinks(doc, pageUrl);\n const internalLinks: URL[] = [];\n for (const link of internal) {\n try {\n internalLinks.push(new URL(link));\n } catch {\n // Skip invalid URLs\n }\n }\n const externalLinks: URL[] = [];\n for (const link of external) {\n try {\n externalLinks.push(new URL(link));\n } catch {\n // Skip invalid URLs\n }\n }\n\n // Calculate word count and reading time\n // Prefer content (Readability-cleaned) over text (full page)\n const textForCounting = content?.trim() ? content : text;\n const wordCount = countWords(textForCounting);\n const readingTime = calculateReadingTime(wordCount);\n\n // Return the gathered article data\n return {\n url: new URL(pageUrl),\n html,\n text,\n content,\n title,\n description,\n image,\n language,\n region,\n internalLinks,\n externalLinks,\n wordCount,\n readingTime,\n };\n}\n","/**\n * High-level feed gathering functionality.\n *\n * @packageDocumentation\n */\n\nimport { parseFeed } from '../feed/parse.js';\nimport type { Feed } from '../feed/types.js';\nimport { pluck } from '../pluck/index.js';\n\n/**\n * Gather and parse a feed from a URL in one convenient call.\n *\n * @remarks\n * This is a high-level convenience method that combines fetching and parsing.\n * It handles encoding detection, redirects, and feed format detection automatically.\n *\n * @param url - Feed URL as string or URL object\n * @returns Normalized feed data\n * @throws Error if URL is invalid, fetch fails, or feed cannot be parsed\n *\n * @example\n * ```typescript\n * // Fetch and parse a feed\n * const feed = await gatherFeed('https://example.com/feed.xml');\n *\n * console.log(feed.title);\n * console.log(feed.items[0].title);\n * console.log(feed.items[0].url);\n * ```\n */\nexport async function gatherFeed(url: string | URL): Promise<Feed> {\n // Convert string to URL and validate\n let feedUrl: URL;\n try {\n feedUrl = typeof url === 'string' ? new URL(url) : url;\n } catch (error) {\n throw new Error(`Invalid feed URL: ${typeof url === 'string' ? url : url.toString()}`, {\n cause: error,\n });\n }\n\n // Ensure URL is valid (has protocol and host)\n if (!feedUrl.protocol || !feedUrl.host) {\n throw new Error(`Invalid feed URL: must have protocol and host (${feedUrl.toString()})`);\n }\n\n // Fetch the feed content\n const response = await pluck(feedUrl);\n const content = await response.textUtf8();\n\n // Parse the feed using the final URL (after redirects)\n const result = parseFeed(content, response.finalUrl);\n\n return result.feed;\n}\n","/**\n * Feed discovery heuristics.\n *\n * @remarks\n * Common feed URL patterns and heuristics for feed discovery.\n *\n * @packageDocumentation\n */\n\n/**\n * Common feed URL patterns to check.\n *\n * @remarks\n * These are common patterns for feed URLs. They should be checked relative\n * to the site's base URL.\n */\nexport const COMMON_FEED_PATHS = [\n '/feed',\n '/feed/',\n '/feeds',\n '/feeds/',\n '/rss',\n '/rss/',\n '/rss.xml',\n '/feed.xml',\n '/atom.xml',\n '/index.xml',\n '/feed.json',\n '/feed.rss',\n '/blog/feed',\n '/blog/rss',\n '/news/feed',\n '/news/rss',\n];\n\n/**\n * Generate feed URL suggestions based on the document URL.\n *\n * @remarks\n * Returns common feed URLs that might exist, relative to the document URL.\n * These are just suggestions - not verified to actually exist.\n *\n * @param documentUrl - The URL of the current document\n * @returns Array of suggested feed URLs\n */\nexport function generateFeedSuggestions(documentUrl?: string | URL): string[] {\n if (!documentUrl) {\n return COMMON_FEED_PATHS;\n }\n\n try {\n const url = typeof documentUrl === 'string' ? new URL(documentUrl) : documentUrl;\n const origin = url.origin;\n\n // Generate full URLs by combining origin with common paths\n return COMMON_FEED_PATHS.map((path) => `${origin}${path}`);\n } catch {\n // If URL parsing fails, return relative paths\n return COMMON_FEED_PATHS;\n }\n}\n","/**\n * Feed discovery extraction.\n *\n * @remarks\n * Discovers RSS, Atom, and JSON feeds in HTML documents.\n *\n * @packageDocumentation\n */\n\nimport type { HTMLDocument as Document } from '../../utils/html-parser.js';\nimport { getAllLinks } from '../../utils/link-helpers.js';\nimport { generateFeedSuggestions } from './heuristics.js';\nimport type { DiscoveredFeed, FeedDiscoveryMetadata } from './types.js';\n\n/**\n * Extract feed discovery metadata from parsed HTML document.\n *\n * @remarks\n * Finds all feeds declared in <link rel=\"alternate\"> tags and generates\n * suggestions for common feed URL patterns.\n *\n * @param doc - Parsed HTML document\n * @param documentUrl - Optional document URL for generating absolute feed suggestions\n * @returns Feed discovery metadata\n *\n * @example\n * ```typescript\n * const doc = parseHTML(htmlString);\n * const feeds = extractFeedDiscovery(doc, 'https://example.com');\n * console.log(feeds.feeds); // Discovered feeds\n * console.log(feeds.suggestions); // Suggested feed URLs\n * ```\n */\nexport function extractFeedDiscovery(\n doc: Document,\n documentUrl?: string | URL,\n): FeedDiscoveryMetadata {\n const metadata: FeedDiscoveryMetadata = {\n feeds: [],\n };\n\n // Find all alternate links\n const alternateLinks = getAllLinks(doc, 'alternate');\n\n // Filter for feed types and map to DiscoveredFeed format\n for (const link of alternateLinks) {\n const feedType = determineFeedType(link.type);\n if (feedType) {\n metadata.feeds.push({\n url: link.href,\n type: feedType,\n title: link.title,\n });\n }\n }\n\n // Clean up undefined titles\n metadata.feeds = metadata.feeds.map((feed) =>\n Object.fromEntries(Object.entries(feed).filter(([_, value]) => value !== undefined)),\n ) as DiscoveredFeed[];\n\n // Generate suggestions if document URL provided\n if (documentUrl) {\n metadata.suggestions = generateFeedSuggestions(documentUrl);\n }\n\n return metadata;\n}\n\n/**\n * Determine feed type from MIME type.\n */\nfunction determineFeedType(mimeType?: string): 'rss' | 'atom' | 'json' | 'unknown' | null {\n if (!mimeType) {\n return null;\n }\n\n const type = mimeType.toLowerCase();\n\n if (type.includes('rss') || type === 'application/rss+xml') {\n return 'rss';\n }\n\n if (type.includes('atom') || type === 'application/atom+xml') {\n return 'atom';\n }\n\n if (type.includes('json') || type === 'application/feed+json' || type === 'application/json') {\n return 'json';\n }\n\n // If it has xml or json in the type but doesn't match above, it might still be a feed\n if (type.includes('xml') || type.includes('json')) {\n return 'unknown';\n }\n\n return null;\n}\n","/**\n * Icon extraction and aggregation for websites.\n *\n * @packageDocumentation\n */\n\nimport { extractIcons } from '../../metadata/icons/index.js';\nimport type { AppleTouchIcon } from '../../metadata/icons/types.js';\nimport type { HTMLDocument as Document } from '../../utils/html-parser.js';\n\n/**\n * Extract best icon/favicon from multiple sources with smart fallbacks.\n *\n * @remarks\n * Strategy (priority order):\n * 1. Largest Apple Touch Icon (often high quality, 180x180+)\n * 2. Safari mask icon (SVG, scalable, modern)\n * 3. Standard favicon (most common)\n * 4. Shortcut icon (legacy fallback)\n * 5. Microsoft tile image (Windows)\n * 6. Fluid icon (legacy, rare)\n *\n * This ensures we get the highest quality icon available,\n * prioritizing modern, high-resolution icons over legacy formats.\n *\n * @param doc - Parsed HTML document\n * @returns Best available icon URL or undefined if none found\n *\n * @example\n * ```typescript\n * const doc = parseHTML(html);\n * const icon = extractBestIcon(doc);\n * console.log(icon); // URL of best available icon\n * ```\n */\nexport function extractBestIcon(doc: Document): string | undefined {\n const icons = extractIcons(doc);\n\n // Priority 1: Largest Apple Touch Icon (high quality)\n if (icons.appleTouchIcons && icons.appleTouchIcons.length > 0) {\n const largest = findLargestAppleTouchIcon(icons.appleTouchIcons);\n if (largest?.url) {\n return largest.url;\n }\n }\n\n // Priority 2: Safari mask icon (SVG, scalable)\n if (icons.maskIcon?.url) {\n return icons.maskIcon.url;\n }\n\n // Priority 3: Standard favicon (most common)\n if (icons.favicon?.trim()) {\n return icons.favicon.trim();\n }\n\n // Priority 4: Shortcut icon (legacy)\n if (icons.shortcutIcon?.trim()) {\n return icons.shortcutIcon.trim();\n }\n\n // Priority 5: Microsoft tile image\n if (icons.msTile?.image?.trim()) {\n return icons.msTile.image.trim();\n }\n\n // Priority 6: Fluid icon (legacy, rare)\n if (icons.fluidIcon?.trim()) {\n return icons.fluidIcon.trim();\n }\n\n return undefined;\n}\n\n/**\n * Find the largest Apple Touch Icon by size.\n *\n * @remarks\n * Parses size strings like \"180x180\" and compares by area (width * height).\n * Special handling for \"any\" size (treated as largest, typically SVG).\n *\n * @param icons - Array of Apple Touch Icons\n * @returns Largest icon or first icon if sizes not specified\n */\nfunction findLargestAppleTouchIcon(icons: AppleTouchIcon[]): AppleTouchIcon | undefined {\n if (icons.length === 0) {\n return undefined;\n }\n\n let largest = icons[0];\n let largestSize = parseSizeString(icons[0].sizes);\n\n for (const icon of icons) {\n const size = parseSizeString(icon.sizes);\n if (size > largestSize) {\n largest = icon;\n largestSize = size;\n }\n }\n\n return largest;\n}\n\n/**\n * Parse size string (e.g., \"180x180\", \"any\") to numeric value for comparison.\n *\n * @param sizeStr - Size string from sizes attribute\n * @returns Numeric size value (area = width * height), or 0 if invalid\n */\nfunction parseSizeString(sizeStr?: string): number {\n if (!sizeStr) {\n return 0;\n }\n\n // Handle \"any\" as very large (typically SVG, scalable)\n if (sizeStr.toLowerCase() === 'any') {\n return Number.POSITIVE_INFINITY;\n }\n\n // Parse \"WxH\" format (e.g., \"180x180\")\n const match = /^(\\d+)x(\\d+)$/i.exec(sizeStr);\n if (match) {\n const width = Number.parseInt(match[1], 10);\n const height = Number.parseInt(match[2], 10);\n // Use area (width * height) for comparison\n return width * height;\n }\n\n return 0;\n}\n","/**\n * High-level website gathering functionality.\n *\n * @packageDocumentation\n */\n\nimport { htmlToText } from '../../content/html-to-text/index.js';\nimport { extractFeedDiscovery } from '../../metadata/feed-discovery/index.js';\nimport { pluck } from '../../pluck/index.js';\nimport { parseHTML } from '../../utils/html-parser.js';\nimport type { Website } from '../types.js';\nimport { extractBestDescription } from './description.js';\nimport { extractBestIcon } from './icon.js';\nimport { extractBestImage } from './image.js';\nimport { extractBestLanguage } from './language.js';\nimport { extractPageLinks } from './links.js';\nimport { extractBestTitle } from './title.js';\nimport { extractBestUrl } from './url.js';\n\n/**\n * Gather website data from a URL in one convenient call.\n *\n * @remarks\n * This is a high-level convenience method that fetches a website and extracts\n * all relevant data. It handles encoding detection, redirects, and provides\n * a unified interface for all website data.\n *\n * This method will be extended incrementally to include metadata extraction,\n * content extraction, and more.\n *\n * @param url - Website URL as string or URL object\n * @returns Gathered website data including final URL, title, description, image, icon, language, html, text, feeds, and links\n * @throws Error if URL is invalid or fetch fails\n *\n * @example\n * ```typescript\n * // Fetch a website and get its data\n * const site = await gatherWebsite('https://example.com');\n * console.log(site.url); // Final URL after redirects\n * console.log(site.title); // Page title (cleaned, from best source)\n * console.log(site.description); // Page description (from best source)\n * console.log(site.image); // Page image/keyvisual (from best source)\n * console.log(site.icon); // Best available icon/favicon\n * console.log(site.language); // Primary language code (ISO 639-1)\n * console.log(site.region); // Region code (ISO 3166-1 alpha-2)\n * console.log(site.html); // Raw HTML content (UTF-8)\n * console.log(site.text); // Plain text content (extracted from HTML)\n * console.log(site.feeds); // Array of feed URL objects\n * console.log(site.internalLinks); // Array of internal link URL objects\n * console.log(site.externalLinks); // Array of external link URL objects\n * ```\n */\nexport async function gatherWebsite(url: string | URL): Promise<Website> {\n // Convert string to URL and validate\n let siteUrl: URL;\n try {\n siteUrl = typeof url === 'string' ? new URL(url) : url;\n } catch (error) {\n throw new Error(`Invalid website URL: ${typeof url === 'string' ? url : url.toString()}`, {\n cause: error,\n });\n }\n\n // Ensure URL is valid (has protocol and host)\n if (!siteUrl.protocol || !siteUrl.host) {\n throw new Error(`Invalid website URL: must have protocol and host (${siteUrl.toString()})`);\n }\n\n // Fetch the website\n const response = await pluck(siteUrl);\n const html = await response.textUtf8();\n\n // Parse HTML document\n const doc = parseHTML(html);\n\n // Extract plain text from HTML\n const text = htmlToText(html);\n\n // Extract best URL (canonical or final redirect URL)\n const pageUrl = extractBestUrl(doc, response.finalUrl);\n\n // Extract feed discovery metadata\n const feedDiscovery = extractFeedDiscovery(doc, pageUrl);\n\n // Convert feed URLs to URL objects (filter out invalid URLs)\n const feeds: URL[] = [];\n for (const feed of feedDiscovery.feeds) {\n try {\n feeds.push(new URL(feed.url));\n } catch {\n // Skip invalid feed URLs\n }\n }\n\n // Extract best title, description, image, icon, and language from multiple sources\n const title = extractBestTitle(doc);\n const description = extractBestDescription(doc);\n const imageUrl = extractBestImage(doc, pageUrl);\n const iconUrl = extractBestIcon(doc);\n const { language, region } = extractBestLanguage(doc);\n\n // Convert image URL string to URL object\n let image: URL | undefined;\n if (imageUrl) {\n try {\n image = new URL(imageUrl);\n } catch {\n // Skip invalid image URL\n }\n }\n\n // Convert icon URL string to URL object\n let icon: URL | undefined;\n if (iconUrl) {\n try {\n icon = new URL(iconUrl);\n } catch {\n // Skip invalid icon URL\n }\n }\n\n // Extract internal and external links\n const { internal, external } = extractPageLinks(doc, pageUrl);\n\n // Convert link strings to URL objects\n const internalLinks: URL[] = [];\n for (const link of internal) {\n try {\n internalLinks.push(new URL(link));\n } catch {\n // Skip invalid URLs\n }\n }\n\n const externalLinks: URL[] = [];\n for (const link of external) {\n try {\n externalLinks.push(new URL(link));\n } catch {\n // Skip invalid URLs\n }\n }\n\n // Return the gathered website data\n return {\n url: new URL(pageUrl),\n feeds,\n title,\n description,\n image,\n icon,\n language,\n region,\n html,\n text,\n internalLinks,\n externalLinks,\n };\n}\n","/**\n * Analytics and tracking extraction.\n *\n * @remarks\n * Detects analytics service IDs from HTML documents.\n * Privacy-conscious - only extracts IDs, doesn't perform any tracking.\n *\n * @packageDocumentation\n */\n\nimport type { HTMLDocument as Document } from '../../utils/html-parser.js';\nimport type { AnalyticsMetadata } from './types.js';\n\n/**\n * Extract analytics metadata from parsed HTML document.\n *\n * @remarks\n * Detects analytics service IDs by examining script tags and their content.\n * Only extracts identifiers, does not track or collect user data.\n *\n * @param doc - Parsed HTML document\n * @returns Analytics metadata\n *\n * @example\n * ```typescript\n * const doc = parseHTML(htmlString);\n * const analytics = extractAnalytics(doc);\n * console.log(analytics.googleAnalytics);\n * console.log(analytics.googleTagManager);\n * ```\n */\nexport function extractAnalytics(doc: Document): AnalyticsMetadata {\n const metadata: AnalyticsMetadata = {};\n\n // Get all script tags\n const scripts = doc.querySelectorAll('script');\n\n const googleAnalytics = new Set<string>();\n const googleTagManager = new Set<string>();\n const facebookPixel = new Set<string>();\n const matomo = new Set<string>();\n const plausible = new Set<string>();\n const adobe = new Set<string>();\n const cloudflare = new Set<string>();\n const fathom = new Set<string>();\n\n for (const script of Array.from(scripts)) {\n const src = script.getAttribute('src') || '';\n const content = script.textContent || '';\n const combined = `${src} ${content}`;\n\n // Google Analytics (GA4: G-, Universal: UA-, Tag Manager: GT-)\n const gaMatches = combined.matchAll(/\\b(UA-\\d+-\\d+|G-[A-Z0-9]+|GT-[A-Z0-9]+)\\b/g);\n for (const match of gaMatches) {\n googleAnalytics.add(match[1]);\n }\n\n // Google Tag Manager (GTM-)\n const gtmMatches = combined.matchAll(/\\b(GTM-[A-Z0-9]+)\\b/g);\n for (const match of gtmMatches) {\n googleTagManager.add(match[1]);\n }\n\n // Facebook Pixel (numeric IDs in fbq or _fbq)\n const fbMatches = combined.matchAll(/fbq\\s*\\(\\s*['\"]init['\"]\\s*,\\s*['\"](\\d+)['\"]/g);\n for (const match of fbMatches) {\n facebookPixel.add(match[1]);\n }\n\n // Matomo/Piwik\n if (src.includes('matomo') || src.includes('piwik') || content.includes('_paq')) {\n const matomoIdMatch =\n content.match(/setSiteId['\"]?\\s*,\\s*['\"]?(\\d+)['\"]?\\s*\\]/) ||\n content.match(/setSiteId\\s*\\(\\s*['\"]?(\\d+)['\"]?\\s*\\)/);\n if (matomoIdMatch) {\n matomo.add(matomoIdMatch[1]);\n }\n }\n\n // Plausible Analytics\n if (src.includes('plausible.io/js/')) {\n const domain = script.getAttribute('data-domain');\n if (domain) {\n plausible.add(domain);\n }\n }\n\n // Adobe Analytics (Omniture)\n if (src.includes('omniture') || src.includes('2o7.net') || content.includes('s.t()')) {\n const adobeIdMatch = content.match(/s_account\\s*=\\s*['\"]([^'\"]+)['\"]/);\n if (adobeIdMatch) {\n adobe.add(adobeIdMatch[1]);\n }\n }\n\n // Cloudflare Web Analytics\n if (src.includes('cloudflareinsights.com')) {\n const cfBeacon = script.getAttribute('data-cf-beacon');\n if (cfBeacon) {\n try {\n const beacon = JSON.parse(cfBeacon);\n if (beacon.token) {\n cloudflare.add(beacon.token);\n }\n } catch {\n // Ignore invalid JSON\n }\n }\n }\n\n // Fathom Analytics\n if (src.includes('cdn.usefathom.com')) {\n const siteId = script.getAttribute('data-site') || script.getAttribute('site');\n if (siteId) {\n fathom.add(siteId);\n }\n }\n }\n\n // Convert Sets to arrays if not empty\n if (googleAnalytics.size > 0) {\n metadata.googleAnalytics = Array.from(googleAnalytics);\n }\n if (googleTagManager.size > 0) {\n metadata.googleTagManager = Array.from(googleTagManager);\n }\n if (facebookPixel.size > 0) {\n metadata.facebookPixel = Array.from(facebookPixel);\n }\n if (matomo.size > 0) {\n metadata.matomo = Array.from(matomo);\n }\n if (plausible.size > 0) {\n metadata.plausible = Array.from(plausible);\n }\n if (adobe.size > 0) {\n metadata.adobe = Array.from(adobe);\n }\n if (cloudflare.size > 0) {\n metadata.cloudflare = Array.from(cloudflare);\n }\n if (fathom.size > 0) {\n metadata.fathom = Array.from(fathom);\n }\n\n return metadata;\n}\n","/**\n * Assets extraction.\n *\n * @remarks\n * Extracts categorized asset URLs from HTML documents.\n *\n * @author Anonyfox <max@anonyfox.com>\n * @license MIT\n * @see {@link https://github.com/Anonyfox/ravenjs}\n * @see {@link https://ravenjs.dev}\n * @see {@link https://anonyfox.com}\n *\n * @packageDocumentation\n */\n\nimport type { HTMLDocument as Document } from '../../utils/html-parser.js';\nimport { normalizeUrl } from '../../utils/normalize-url.js';\nimport type { AssetsMetadata, ConnectionHint, PreloadResource } from './types.js';\n\n/**\n * Extract assets metadata from parsed HTML document.\n *\n * @remarks\n * Extracts all external assets referenced in the document, organized by type.\n * All URLs are normalized to absolute format based on the document's base URL.\n *\n * The extractor finds assets from:\n * - Images: `<img>`, `<picture>`, `srcset`, OpenGraph meta tags\n * - Stylesheets: `<link rel=\"stylesheet\">`\n * - Scripts: `<script src>`\n * - Fonts: CSS `@font-face` and `url()` with font extensions\n * - Media: `<video>`, `<audio>`, `<source>`, `<track>`\n * - Manifests: `<link rel=\"manifest\">`\n * - Preloads: `<link rel=\"preload\">` and `<link rel=\"prefetch\">`\n * - Connection hints: `<link rel=\"dns-prefetch\">` and `<link rel=\"preconnect\">`\n *\n * @param doc - Parsed HTML document\n * @param baseUrl - Optional base URL for resolving relative URLs\n * @returns Assets metadata object with categorized URLs\n *\n * @example\n * ```typescript\n * const doc = parseHTML(htmlString);\n * const assets = extractAssets(doc, 'https://example.com');\n * console.log(assets.images);\n * console.log(assets.stylesheets);\n * console.log(assets.scripts);\n * ```\n */\nexport function extractAssets(doc: Document, baseUrl?: string | URL | null): AssetsMetadata {\n const metadata: AssetsMetadata = {};\n\n // Determine effective base URL (from <base> tag or parameter)\n const effectiveBaseUrl = getEffectiveBaseUrl(doc, baseUrl);\n\n // Extract images\n const images = extractImages(doc, effectiveBaseUrl);\n if (images.length > 0) {\n metadata.images = images;\n }\n\n // Extract stylesheets\n const stylesheets = extractStylesheets(doc, effectiveBaseUrl);\n if (stylesheets.length > 0) {\n metadata.stylesheets = stylesheets;\n }\n\n // Extract scripts\n const scripts = extractScripts(doc, effectiveBaseUrl);\n if (scripts.length > 0) {\n metadata.scripts = scripts;\n }\n\n // Extract fonts from CSS\n const fonts = extractFonts(doc, effectiveBaseUrl);\n if (fonts.length > 0) {\n metadata.fonts = fonts;\n }\n\n // Extract media\n const media = extractMedia(doc, effectiveBaseUrl);\n if (media.length > 0) {\n metadata.media = media;\n }\n\n // Extract manifests\n const manifests = extractManifests(doc, effectiveBaseUrl);\n if (manifests.length > 0) {\n metadata.manifests = manifests;\n }\n\n // Extract preload/prefetch hints\n const preloads = extractPreloads(doc, effectiveBaseUrl);\n if (preloads.length > 0) {\n metadata.preloads = preloads;\n }\n\n // Extract connection hints\n const connectionHints = extractConnectionHints(doc, effectiveBaseUrl);\n if (connectionHints.length > 0) {\n metadata.connectionHints = connectionHints;\n }\n\n return metadata;\n}\n\n/**\n * Get effective base URL from <base> tag or parameter.\n */\nfunction getEffectiveBaseUrl(doc: Document, baseUrl?: string | URL | null): string | null {\n // Check for <base> tag first\n const baseElement = doc.querySelector('base[href]');\n if (baseElement) {\n const baseHref = baseElement.getAttribute('href');\n if (baseHref) {\n try {\n // If baseUrl is provided, resolve relative base href against it\n if (baseUrl) {\n const resolvedBase = normalizeUrl(baseUrl, baseHref);\n return resolvedBase || null;\n }\n return baseHref;\n } catch {\n // Fall through to use provided baseUrl\n }\n }\n }\n\n // Use provided base URL\n if (baseUrl) {\n return typeof baseUrl === 'string' ? baseUrl : baseUrl.href;\n }\n\n return null;\n}\n\n/**\n * Extract image URLs.\n */\nfunction extractImages(doc: Document, baseUrl: string | null): string[] {\n const urls = new Set<string>();\n\n // Extract from <img src>\n const imgElements = doc.querySelectorAll('img[src]');\n for (const img of Array.from(imgElements)) {\n const src = img.getAttribute('src');\n if (src) {\n const normalized = normalizeUrl(baseUrl, src);\n if (normalized) urls.add(normalized);\n }\n }\n\n // Extract from srcset (img and source elements)\n const srcsetElements = doc.querySelectorAll('img[srcset], source[srcset]');\n for (const element of Array.from(srcsetElements)) {\n const srcset = element.getAttribute('srcset');\n if (srcset) {\n const srcsetUrls = parseSrcset(srcset);\n for (const url of srcsetUrls) {\n const normalized = normalizeUrl(baseUrl, url);\n if (normalized) urls.add(normalized);\n }\n }\n }\n\n // Extract from <picture><source srcset>\n const pictureSourceElements = doc.querySelectorAll('picture source[srcset]');\n for (const source of Array.from(pictureSourceElements)) {\n const srcset = source.getAttribute('srcset');\n if (srcset) {\n const srcsetUrls = parseSrcset(srcset);\n for (const url of srcsetUrls) {\n const normalized = normalizeUrl(baseUrl, url);\n if (normalized) urls.add(normalized);\n }\n }\n }\n\n // Extract from OpenGraph meta tags\n const ogImages = doc.querySelectorAll('meta[property=\"og:image\"], meta[property=\"og:image:url\"]');\n for (const meta of Array.from(ogImages)) {\n const content = meta.getAttribute('content');\n if (content) {\n const normalized = normalizeUrl(baseUrl, content);\n if (normalized) urls.add(normalized);\n }\n }\n\n // Extract from Twitter Card meta tags\n const twitterImages = doc.querySelectorAll(\n 'meta[name=\"twitter:image\"], meta[name=\"twitter:image:src\"]',\n );\n for (const meta of Array.from(twitterImages)) {\n const content = meta.getAttribute('content');\n if (content) {\n const normalized = normalizeUrl(baseUrl, content);\n if (normalized) urls.add(normalized);\n }\n }\n\n return Array.from(urls);\n}\n\n/**\n * Parse srcset attribute into individual URLs.\n */\nfunction parseSrcset(srcset: string): string[] {\n const urls: string[] = [];\n const candidates = srcset.split(',').map((s) => s.trim());\n\n for (const candidate of candidates) {\n // srcset format: \"url 1x\" or \"url 100w\" or just \"url\"\n const parts = candidate.split(/\\s+/);\n if (parts[0]) {\n urls.push(parts[0]);\n }\n }\n\n return urls;\n}\n\n/**\n * Extract stylesheet URLs.\n */\nfunction extractStylesheets(doc: Document, baseUrl: string | null): string[] {\n const urls = new Set<string>();\n\n const linkElements = doc.querySelectorAll('link[rel=\"stylesheet\"][href]');\n for (const link of Array.from(linkElements)) {\n const href = link.getAttribute('href');\n if (href) {\n const normalized = normalizeUrl(baseUrl, href);\n if (normalized) urls.add(normalized);\n }\n }\n\n return Array.from(urls);\n}\n\n/**\n * Extract script URLs.\n */\nfunction extractScripts(doc: Document, baseUrl: string | null): string[] {\n const urls = new Set<string>();\n\n const scriptElements = doc.querySelectorAll('script[src]');\n for (const script of Array.from(scriptElements)) {\n const src = script.getAttribute('src');\n if (src) {\n const normalized = normalizeUrl(baseUrl, src);\n if (normalized) urls.add(normalized);\n }\n }\n\n return Array.from(urls);\n}\n\n/**\n * Extract font URLs from CSS (inline styles and style tags).\n */\nfunction extractFonts(doc: Document, baseUrl: string | null): string[] {\n const urls = new Set<string>();\n\n // Extract from <style> tags\n const styleElements = doc.querySelectorAll('style');\n for (const style of Array.from(styleElements)) {\n const css = style.textContent || '';\n const fontUrls = extractFontUrlsFromCss(css);\n for (const url of fontUrls) {\n const normalized = normalizeUrl(baseUrl, url);\n if (normalized) urls.add(normalized);\n }\n }\n\n // Extract from inline style attributes\n const elementsWithStyle = doc.querySelectorAll('[style]');\n for (const element of Array.from(elementsWithStyle)) {\n const style = element.getAttribute('style') || '';\n const fontUrls = extractFontUrlsFromCss(style);\n for (const url of fontUrls) {\n const normalized = normalizeUrl(baseUrl, url);\n if (normalized) urls.add(normalized);\n }\n }\n\n // Also check for preload hints for fonts\n const fontPreloads = doc.querySelectorAll('link[rel=\"preload\"][as=\"font\"][href]');\n for (const link of Array.from(fontPreloads)) {\n const href = link.getAttribute('href');\n if (href) {\n const normalized = normalizeUrl(baseUrl, href);\n if (normalized) urls.add(normalized);\n }\n }\n\n return Array.from(urls);\n}\n\n/**\n * Extract font URLs from CSS content.\n */\nfunction extractFontUrlsFromCss(css: string): string[] {\n const urls: string[] = [];\n\n // Match url(...) with font extensions\n const urlRegex = /url\\(\\s*['\"]?([^'\")]+)['\"]?\\s*\\)/gi;\n const fontExtensions = /\\.(woff2?|ttf|otf|eot)(\\?.*)?$/i;\n\n let match: RegExpExecArray | null;\n // biome-ignore lint/suspicious/noAssignInExpressions: Standard regex pattern matching\n while ((match = urlRegex.exec(css)) !== null) {\n const url = match[1];\n if (url && fontExtensions.test(url)) {\n urls.push(url);\n }\n }\n\n return urls;\n}\n\n/**\n * Extract media URLs (video, audio, source, track).\n */\nfunction extractMedia(doc: Document, baseUrl: string | null): string[] {\n const urls = new Set<string>();\n\n // Video and audio elements with src\n const mediaElements = doc.querySelectorAll('video[src], audio[src]');\n for (const media of Array.from(mediaElements)) {\n const src = media.getAttribute('src');\n if (src) {\n const normalized = normalizeUrl(baseUrl, src);\n if (normalized) urls.add(normalized);\n }\n }\n\n // Source elements (inside video/audio)\n const sourceElements = doc.querySelectorAll('video source[src], audio source[src], source[src]');\n for (const source of Array.from(sourceElements)) {\n const src = source.getAttribute('src');\n if (src) {\n const normalized = normalizeUrl(baseUrl, src);\n if (normalized) urls.add(normalized);\n }\n }\n\n // Track elements (subtitles, captions)\n const trackElements = doc.querySelectorAll('track[src]');\n for (const track of Array.from(trackElements)) {\n const src = track.getAttribute('src');\n if (src) {\n const normalized = normalizeUrl(baseUrl, src);\n if (normalized) urls.add(normalized);\n }\n }\n\n // OpenGraph video\n const ogVideos = doc.querySelectorAll('meta[property=\"og:video\"], meta[property=\"og:video:url\"]');\n for (const meta of Array.from(ogVideos)) {\n const content = meta.getAttribute('content');\n if (content) {\n const normalized = normalizeUrl(baseUrl, content);\n if (normalized) urls.add(normalized);\n }\n }\n\n // OpenGraph audio\n const ogAudios = doc.querySelectorAll('meta[property=\"og:audio\"], meta[property=\"og:audio:url\"]');\n for (const meta of Array.from(ogAudios)) {\n const content = meta.getAttribute('content');\n if (content) {\n const normalized = normalizeUrl(baseUrl, content);\n if (normalized) urls.add(normalized);\n }\n }\n\n return Array.from(urls);\n}\n\n/**\n * Extract manifest URLs.\n */\nfunction extractManifests(doc: Document, baseUrl: string | null): string[] {\n const urls = new Set<string>();\n\n const linkElements = doc.querySelectorAll('link[rel=\"manifest\"][href]');\n for (const link of Array.from(linkElements)) {\n const href = link.getAttribute('href');\n if (href) {\n const normalized = normalizeUrl(baseUrl, href);\n if (normalized) urls.add(normalized);\n }\n }\n\n return Array.from(urls);\n}\n\n/**\n * Extract preload and prefetch resource hints.\n */\nfunction extractPreloads(doc: Document, baseUrl: string | null): PreloadResource[] {\n const resources: PreloadResource[] = [];\n\n // Preload links\n const preloadElements = doc.querySelectorAll('link[rel=\"preload\"][href]');\n for (const link of Array.from(preloadElements)) {\n const href = link.getAttribute('href');\n if (href) {\n const normalized = normalizeUrl(baseUrl, href);\n if (normalized) {\n const asAttr = link.getAttribute('as');\n const typeAttr = link.getAttribute('type');\n const crossoriginAttr = link.getAttribute('crossorigin');\n\n resources.push({\n url: normalized,\n as: asAttr || undefined,\n type: typeAttr || undefined,\n crossorigin: crossoriginAttr !== null ? crossoriginAttr || '' : undefined,\n prefetch: false,\n });\n }\n }\n }\n\n // Prefetch links\n const prefetchElements = doc.querySelectorAll('link[rel=\"prefetch\"][href]');\n for (const link of Array.from(prefetchElements)) {\n const href = link.getAttribute('href');\n if (href) {\n const normalized = normalizeUrl(baseUrl, href);\n if (normalized) {\n const asAttr = link.getAttribute('as');\n const typeAttr = link.getAttribute('type');\n const crossoriginAttr = link.getAttribute('crossorigin');\n\n resources.push({\n url: normalized,\n as: asAttr || undefined,\n type: typeAttr || undefined,\n crossorigin: crossoriginAttr !== null ? crossoriginAttr || '' : undefined,\n prefetch: true,\n });\n }\n }\n }\n\n // Clean up undefined values (but keep empty strings for boolean attributes like crossorigin)\n return resources.map((resource) =>\n Object.fromEntries(\n Object.entries(resource).filter(([_, value]) => value !== undefined && value !== null),\n ),\n ) as PreloadResource[];\n}\n\n/**\n * Extract DNS prefetch and preconnect hints.\n */\nfunction extractConnectionHints(doc: Document, baseUrl: string | null): ConnectionHint[] {\n const hints: ConnectionHint[] = [];\n\n // DNS prefetch\n const dnsPrefetchElements = doc.querySelectorAll('link[rel=\"dns-prefetch\"][href]');\n for (const link of Array.from(dnsPrefetchElements)) {\n const href = link.getAttribute('href');\n if (href) {\n const normalized = normalizeUrl(baseUrl, href);\n if (normalized) {\n hints.push({\n url: normalized,\n preconnect: false,\n });\n }\n }\n }\n\n // Preconnect\n const preconnectElements = doc.querySelectorAll('link[rel=\"preconnect\"][href]');\n for (const link of Array.from(preconnectElements)) {\n const href = link.getAttribute('href');\n if (href) {\n const normalized = normalizeUrl(baseUrl, href);\n if (normalized) {\n const crossoriginAttr = link.getAttribute('crossorigin');\n\n hints.push({\n url: normalized,\n preconnect: true,\n crossorigin: crossoriginAttr !== null ? crossoriginAttr || '' : undefined,\n });\n }\n }\n }\n\n // Clean up undefined values (but keep empty strings for boolean attributes like crossorigin)\n return hints.map((hint) =>\n Object.fromEntries(\n Object.entries(hint).filter(([_, value]) => value !== undefined && value !== null),\n ),\n ) as ConnectionHint[];\n}\n","/**\n * Copyright and licensing extraction.\n *\n * @remarks\n * Extracts copyright and license metadata from HTML documents.\n *\n * @packageDocumentation\n */\n\nimport type { HTMLDocument as Document } from '../../utils/html-parser.js';\nimport { getLinkHref } from '../../utils/link-helpers.js';\nimport { getMetaContent } from '../../utils/meta-helpers.js';\nimport type { CopyrightMetadata } from './types.js';\n\n/**\n * Extract copyright metadata from parsed HTML document.\n *\n * @remarks\n * Extracts copyright and licensing information from meta tags, link tags,\n * and Schema.org structured data.\n *\n * @param doc - Parsed HTML document\n * @returns Copyright metadata\n *\n * @example\n * ```typescript\n * const doc = parseHTML(htmlString);\n * const copyright = extractCopyright(doc);\n * console.log(copyright.copyright);\n * console.log(copyright.license);\n * ```\n */\nexport function extractCopyright(doc: Document): CopyrightMetadata {\n const metadata: CopyrightMetadata = {};\n\n // Extract copyright from meta tag\n metadata.copyright = getMetaContent(doc, 'copyright');\n\n // Extract license from link tag\n metadata.license = getLinkHref(doc, 'license');\n\n // Extract Dublin Core rights (if no copyright yet)\n if (!metadata.copyright) {\n metadata.copyright = getMetaContent(doc, 'DC.rights') || getMetaContent(doc, 'dcterms.rights');\n }\n\n // Try to parse copyright holder and year from copyright string\n if (metadata.copyright) {\n const parsed = parseCopyright(metadata.copyright);\n if (parsed.holder && !metadata.holder) {\n metadata.holder = parsed.holder;\n }\n if (parsed.year && !metadata.year) {\n metadata.year = parsed.year;\n }\n }\n\n // Remove undefined values\n return Object.fromEntries(\n Object.entries(metadata).filter(([_, value]) => value !== undefined),\n ) as CopyrightMetadata;\n}\n\n/**\n * Parse copyright string to extract holder and year.\n *\n * @remarks\n * Attempts to extract copyright holder and year from common copyright formats:\n * - \"© 2024 Company Name\"\n * - \"Copyright 2024 Company Name\"\n * - \"(c) 2024 Company Name\"\n *\n * @param copyrightString - Copyright string to parse\n * @returns Parsed holder and year\n */\nfunction parseCopyright(copyrightString: string): { holder?: string; year?: string } {\n const result: { holder?: string; year?: string } = {};\n\n // Match year (4 digits)\n const yearMatch = copyrightString.match(/\\b(19|20)\\d{2}\\b/);\n if (yearMatch) {\n result.year = yearMatch[0];\n }\n\n // Try to extract holder by removing copyright symbols and year\n let holder = copyrightString\n .replace(/©/g, '')\n .replace(/\\(c\\)/gi, '')\n .replace(/^copyright\\s+/gi, '') // Only remove \"copyright\" at the start\n .replace(/\\b(19|20)\\d{2}(-\\d{4})?\\b/g, '') // Remove year or year range\n .trim();\n\n // Clean up multiple spaces and leading punctuation\n holder = holder.replace(/\\s+/g, ' ').replace(/^[,\\-:\\s]+/g, '');\n\n // Remove trailing \"All rights reserved\" and similar phrases\n holder = holder.replace(/\\.\\s*all rights reserved\\.?$/gi, '');\n\n if (holder && holder.length > 0 && holder.length < 200) {\n result.holder = holder;\n }\n\n return result;\n}\n","/**\n * Dublin Core metadata extraction.\n *\n * @remarks\n * Extracts Dublin Core metadata from HTML documents.\n *\n * @packageDocumentation\n */\n\nimport type { HTMLDocument as Document } from '../../utils/html-parser.js';\nimport { getMetaContent } from '../../utils/meta-helpers.js';\nimport type { DublinCoreMetadata } from './types.js';\n\n/**\n * Extract Dublin Core metadata from parsed HTML document.\n *\n * @remarks\n * Extracts Dublin Core metadata using both DC. and dcterms. prefixes.\n * Fields that can have multiple values (creator, subject, contributor)\n * are extracted as arrays.\n *\n * @param doc - Parsed HTML document\n * @returns Dublin Core metadata object\n *\n * @example\n * ```typescript\n * const doc = parseHTML(htmlString);\n * const dc = extractDublinCore(doc);\n * console.log(dc.title);\n * console.log(dc.creator);\n * ```\n */\nexport function extractDublinCore(doc: Document): DublinCoreMetadata {\n const metadata: DublinCoreMetadata = {};\n\n // Extract single-value fields (try DC. first, then dcterms.)\n metadata.title = getMetaContent(doc, 'DC.title') || getMetaContent(doc, 'dcterms.title');\n metadata.description =\n getMetaContent(doc, 'DC.description') || getMetaContent(doc, 'dcterms.description');\n metadata.publisher =\n getMetaContent(doc, 'DC.publisher') || getMetaContent(doc, 'dcterms.publisher');\n metadata.date = getMetaContent(doc, 'DC.date') || getMetaContent(doc, 'dcterms.date');\n metadata.type = getMetaContent(doc, 'DC.type') || getMetaContent(doc, 'dcterms.type');\n metadata.format = getMetaContent(doc, 'DC.format') || getMetaContent(doc, 'dcterms.format');\n metadata.identifier =\n getMetaContent(doc, 'DC.identifier') || getMetaContent(doc, 'dcterms.identifier');\n metadata.source = getMetaContent(doc, 'DC.source') || getMetaContent(doc, 'dcterms.source');\n metadata.language = getMetaContent(doc, 'DC.language') || getMetaContent(doc, 'dcterms.language');\n metadata.relation = getMetaContent(doc, 'DC.relation') || getMetaContent(doc, 'dcterms.relation');\n metadata.coverage = getMetaContent(doc, 'DC.coverage') || getMetaContent(doc, 'dcterms.coverage');\n metadata.rights = getMetaContent(doc, 'DC.rights') || getMetaContent(doc, 'dcterms.rights');\n\n // Extract multi-value fields as arrays\n metadata.creator = extractMultiValue(doc, 'creator');\n metadata.subject = extractMultiValue(doc, 'subject');\n metadata.contributor = extractMultiValue(doc, 'contributor');\n\n // Remove undefined values\n return Object.fromEntries(\n Object.entries(metadata).filter(([_, value]) => value !== undefined),\n ) as DublinCoreMetadata;\n}\n\n/**\n * Extract multiple values for a Dublin Core field.\n *\n * @remarks\n * Dublin Core fields can appear multiple times. This function collects all values.\n * Tries both DC. and dcterms. prefixes.\n */\nfunction extractMultiValue(doc: Document, field: string): string[] | undefined {\n const values: string[] = [];\n\n // Try DC. prefix\n const dcElements = doc.querySelectorAll(`meta[name=\"DC.${field}\"]`);\n for (const element of Array.from(dcElements)) {\n const content = element.getAttribute('content');\n if (content) {\n values.push(content);\n }\n }\n\n // Try dcterms. prefix\n const dctermsElements = doc.querySelectorAll(`meta[name=\"dcterms.${field}\"]`);\n for (const element of Array.from(dctermsElements)) {\n const content = element.getAttribute('content');\n if (content) {\n values.push(content);\n }\n }\n\n return values.length > 0 ? values : undefined;\n}\n","/**\n * Geographic location extraction.\n *\n * @remarks\n * Extracts geographic location metadata from HTML documents.\n *\n * @packageDocumentation\n */\n\nimport type { HTMLDocument as Document } from '../../utils/html-parser.js';\nimport { getMetaContent } from '../../utils/meta-helpers.js';\nimport type { GeoMetadata, GeoPosition } from './types.js';\n\n/**\n * Extract geographic metadata from parsed HTML document.\n *\n * @remarks\n * Extracts geographic location information including coordinates,\n * place names, and region codes from meta tags.\n *\n * @param doc - Parsed HTML document\n * @returns Geographic metadata\n *\n * @example\n * ```typescript\n * const doc = parseHTML(htmlString);\n * const geo = extractGeo(doc);\n * console.log(geo.position?.latitude);\n * console.log(geo.placename);\n * ```\n */\nexport function extractGeo(doc: Document): GeoMetadata {\n const metadata: GeoMetadata = {};\n\n // Extract position from geo.position (semicolon-separated lat;long)\n const geoPosition = getMetaContent(doc, 'geo.position');\n if (geoPosition) {\n const position = parseGeoPosition(geoPosition);\n if (position) {\n metadata.position = position;\n }\n }\n\n // Extract from ICBM (legacy format, comma-separated lat,long)\n if (!metadata.position) {\n const icbm = getMetaContent(doc, 'ICBM') || getMetaContent(doc, 'icbm');\n if (icbm) {\n const position = parseICBM(icbm);\n if (position) {\n metadata.position = position;\n }\n }\n }\n\n // Extract place name\n metadata.placename = getMetaContent(doc, 'geo.placename');\n\n // Extract region\n metadata.region = getMetaContent(doc, 'geo.region');\n\n // Extract country\n metadata.country = getMetaContent(doc, 'geo.country');\n\n // Remove undefined values\n return Object.fromEntries(\n Object.entries(metadata).filter(([_, value]) => value !== undefined),\n ) as GeoMetadata;\n}\n\n/**\n * Parse geo.position format (lat;long).\n *\n * @param position - Position string in \"lat;long\" format\n * @returns Parsed position or undefined if invalid\n */\nfunction parseGeoPosition(position: string): GeoPosition | undefined {\n const parts = position.split(';').map((p) => p.trim());\n if (parts.length !== 2) {\n return undefined;\n }\n\n const latitude = Number.parseFloat(parts[0]);\n const longitude = Number.parseFloat(parts[1]);\n\n if (Number.isNaN(latitude) || Number.isNaN(longitude)) {\n return undefined;\n }\n\n if (latitude < -90 || latitude > 90 || longitude < -180 || longitude > 180) {\n return undefined;\n }\n\n return { latitude, longitude };\n}\n\n/**\n * Parse ICBM format (lat,long or lat, long).\n *\n * @param icbm - Position string in \"lat,long\" format\n * @returns Parsed position or undefined if invalid\n */\nfunction parseICBM(icbm: string): GeoPosition | undefined {\n const parts = icbm.split(',').map((p) => p.trim());\n if (parts.length !== 2) {\n return undefined;\n }\n\n const latitude = Number.parseFloat(parts[0]);\n const longitude = Number.parseFloat(parts[1]);\n\n if (Number.isNaN(latitude) || Number.isNaN(longitude)) {\n return undefined;\n }\n\n if (latitude < -90 || latitude > 90 || longitude < -180 || longitude > 180) {\n return undefined;\n }\n\n return { latitude, longitude };\n}\n","/**\n * Monetization and payment extraction.\n *\n * @remarks\n * Extracts web monetization and payment metadata from HTML documents.\n *\n * @packageDocumentation\n */\n\nimport type { HTMLDocument as Document } from '../../utils/html-parser.js';\nimport { getMetaContent } from '../../utils/meta-helpers.js';\nimport type { MonetizationMetadata } from './types.js';\n\n/**\n * Extract monetization metadata from parsed HTML document.\n *\n * @remarks\n * Extracts web monetization, payment verification, and cryptocurrency\n * addresses from meta tags and link tags.\n *\n * @param doc - Parsed HTML document\n * @returns Monetization metadata\n *\n * @example\n * ```typescript\n * const doc = parseHTML(htmlString);\n * const monetization = extractMonetization(doc);\n * console.log(monetization.webMonetization);\n * console.log(monetization.bitcoin);\n * ```\n */\nexport function extractMonetization(doc: Document): MonetizationMetadata {\n const metadata: MonetizationMetadata = {};\n\n // Web Monetization API (payment pointer)\n metadata.webMonetization = getMetaContent(doc, 'monetization');\n\n // PayPal site verification\n metadata.paypalVerification = getMetaContent(doc, 'paypal-site-verification');\n\n // Brave Creator verification\n metadata.braveCreator =\n getMetaContent(doc, 'brave-rewards-verification') ||\n getMetaContent(doc, 'brave-creator-verification');\n\n // Coil payment pointer (legacy)\n metadata.coil = getMetaContent(doc, 'coil:payment_pointer');\n\n // Bitcoin address\n metadata.bitcoin = getMetaContent(doc, 'bitcoin') || getMetaContent(doc, 'btc:address');\n\n // Ethereum address\n metadata.ethereum = getMetaContent(doc, 'ethereum') || getMetaContent(doc, 'eth:address');\n\n // Remove undefined values\n return Object.fromEntries(\n Object.entries(metadata).filter(([_, value]) => value !== undefined),\n ) as MonetizationMetadata;\n}\n","/**\n * News and press extraction.\n *\n * @remarks\n * Extracts news-specific metadata from HTML documents.\n *\n * @packageDocumentation\n */\n\nimport type { HTMLDocument as Document } from '../../utils/html-parser.js';\nimport { getMetaContent } from '../../utils/meta-helpers.js';\nimport type { NewsMetadata } from './types.js';\n\n/**\n * Extract news metadata from parsed HTML document.\n *\n * @remarks\n * Extracts news-specific metadata including keywords, standout tags,\n * and syndication information.\n *\n * @param doc - Parsed HTML document\n * @returns News metadata\n *\n * @example\n * ```typescript\n * const doc = parseHTML(htmlString);\n * const news = extractNews(doc);\n * console.log(news.keywords);\n * console.log(news.standout);\n * ```\n */\nexport function extractNews(doc: Document): NewsMetadata {\n const metadata: NewsMetadata = {};\n\n // News keywords (distinct from regular keywords)\n const newsKeywords = getMetaContent(doc, 'news_keywords');\n if (newsKeywords) {\n const keywords = newsKeywords\n .split(',')\n .map((k) => k.trim())\n .filter(Boolean);\n if (keywords.length > 0) {\n metadata.keywords = keywords;\n }\n }\n\n // Google News standout tag\n metadata.standout = getMetaContent(doc, 'standout');\n\n // Syndication source\n metadata.syndicationSource = getMetaContent(doc, 'syndication-source');\n\n // Original source\n metadata.originalSource = getMetaContent(doc, 'original-source');\n\n // Remove undefined values\n return Object.fromEntries(\n Object.entries(metadata).filter(([_, value]) => value !== undefined),\n ) as NewsMetadata;\n}\n","/**\n * Pagination metadata extraction.\n *\n * @remarks\n * Extracts pagination navigation links from HTML documents.\n *\n * @packageDocumentation\n */\n\nimport type { HTMLDocument as Document } from '../../utils/html-parser.js';\nimport { getLinkHref } from '../../utils/link-helpers.js';\nimport type { PaginationMetadata } from './types.js';\n\n/**\n * Extract pagination metadata from parsed HTML document.\n *\n * @remarks\n * Extracts pagination navigation links including prev, next, first, last,\n * up (parent), and index links.\n *\n * @param doc - Parsed HTML document\n * @returns Pagination metadata\n *\n * @example\n * ```typescript\n * const doc = parseHTML(htmlString);\n * const pagination = extractPagination(doc);\n * console.log(pagination.prev); // Previous page URL\n * console.log(pagination.next); // Next page URL\n * ```\n */\nexport function extractPagination(doc: Document): PaginationMetadata {\n const metadata: PaginationMetadata = {};\n\n // Extract prev/previous (both rel values are valid)\n metadata.prev = getLinkHref(doc, 'prev') || getLinkHref(doc, 'previous');\n\n // Extract next\n metadata.next = getLinkHref(doc, 'next');\n\n // Extract first\n metadata.first = getLinkHref(doc, 'first');\n\n // Extract last\n metadata.last = getLinkHref(doc, 'last');\n\n // Extract up (parent level)\n metadata.up = getLinkHref(doc, 'up');\n\n // Extract index\n metadata.index = getLinkHref(doc, 'index');\n\n // Remove undefined values\n return Object.fromEntries(\n Object.entries(metadata).filter(([_, value]) => value !== undefined),\n ) as PaginationMetadata;\n}\n","/**\n * Robot directives parsing utilities.\n *\n * @remarks\n * Utilities for parsing robot meta tag content into structured directives.\n *\n * @packageDocumentation\n */\n\nimport type { RobotDirectives } from './types.js';\n\n/**\n * Parse robot directives from meta content string.\n *\n * @remarks\n * Parses comma-separated directives like \"noindex, nofollow\" or \"max-snippet:20\".\n * Handles both simple flags and key:value pairs.\n *\n * @param content - Meta tag content string\n * @returns Parsed directives object\n *\n * @example\n * ```typescript\n * parseDirectives('noindex, nofollow');\n * // { index: false, follow: false }\n *\n * parseDirectives('max-snippet:150, noarchive');\n * // { maxSnippet: 150, noarchive: true }\n * ```\n */\nexport function parseDirectives(content?: string): RobotDirectives {\n if (!content) {\n return {};\n }\n\n const directives: RobotDirectives = {};\n\n // Split by comma and process each directive\n const parts = content.split(',').map((p) => p.trim().toLowerCase());\n\n for (const part of parts) {\n if (!part) continue;\n\n // Check for key:value format\n if (part.includes(':')) {\n const [key, value] = part.split(':').map((s) => s.trim());\n parseKeyValueDirective(key, value, directives);\n } else {\n // Simple flag directive\n parseFlagDirective(part, directives);\n }\n }\n\n return directives;\n}\n\n/**\n * Parse flag-based directive (e.g., \"noindex\", \"nofollow\").\n */\nfunction parseFlagDirective(directive: string, result: RobotDirectives): void {\n switch (directive) {\n case 'index':\n result.index = true;\n break;\n case 'noindex':\n result.index = false;\n break;\n case 'follow':\n result.follow = true;\n break;\n case 'nofollow':\n result.follow = false;\n break;\n case 'noarchive':\n result.noarchive = true;\n break;\n case 'nosnippet':\n result.nosnippet = true;\n break;\n case 'noimageindex':\n result.noimageindex = true;\n break;\n case 'notranslate':\n result.notranslate = true;\n break;\n case 'all':\n // \"all\" means index and follow\n result.index = true;\n result.follow = true;\n break;\n case 'none':\n // \"none\" means noindex and nofollow\n result.index = false;\n result.follow = false;\n break;\n }\n}\n\n/**\n * Parse key:value directive (e.g., \"max-snippet:150\").\n */\nfunction parseKeyValueDirective(key: string, value: string, result: RobotDirectives): void {\n switch (key) {\n case 'max-snippet':\n // Parse as number, or -1 for unlimited\n if (value === '-1') {\n result.maxSnippet = -1;\n } else {\n const num = Number.parseInt(value, 10);\n if (!Number.isNaN(num)) {\n result.maxSnippet = num;\n }\n }\n break;\n\n case 'max-image-preview':\n // Values: none, standard, large\n result.maxImagePreview = value;\n break;\n\n case 'max-video-preview':\n // Parse as number (seconds), or -1 for unlimited\n if (value === '-1') {\n result.maxVideoPreview = -1;\n } else {\n const num = Number.parseInt(value, 10);\n if (!Number.isNaN(num)) {\n result.maxVideoPreview = num;\n }\n }\n break;\n\n case 'unavailable_after':\n // Date string (RFC 850 format typically)\n result.unavailableAfter = value;\n break;\n }\n}\n","/**\n * Robots and crawling directives extraction.\n *\n * @remarks\n * Extracts robot crawling and indexing directives from HTML documents.\n *\n * @packageDocumentation\n */\n\nimport type { HTMLDocument as Document } from '../../utils/html-parser.js';\nimport { getMetaContent } from '../../utils/meta-helpers.js';\nimport { parseDirectives } from './parse-directives.js';\nimport type { RobotsMetadata } from './types.js';\n\n/**\n * Extract robots metadata from parsed HTML document.\n *\n * @remarks\n * Extracts robot directives from meta tags for general robots,\n * Googlebot, Bingbot, and Google News bot.\n *\n * @param doc - Parsed HTML document\n * @returns Robots metadata\n *\n * @example\n * ```typescript\n * const doc = parseHTML(htmlString);\n * const robots = extractRobots(doc);\n * console.log(robots.robots?.index); // true/false\n * console.log(robots.robots?.follow); // true/false\n * ```\n */\nexport function extractRobots(doc: Document): RobotsMetadata {\n const metadata: RobotsMetadata = {};\n\n // Extract general robots directives\n const robotsContent = getMetaContent(doc, 'robots');\n if (robotsContent) {\n const directives = parseDirectives(robotsContent);\n if (Object.keys(directives).length > 0) {\n metadata.robots = directives;\n }\n }\n\n // Extract Googlebot directives\n const googlebotContent = getMetaContent(doc, 'googlebot');\n if (googlebotContent) {\n const directives = parseDirectives(googlebotContent);\n if (Object.keys(directives).length > 0) {\n metadata.googlebot = directives;\n }\n }\n\n // Extract Bingbot directives\n const bingbotContent = getMetaContent(doc, 'bingbot');\n if (bingbotContent) {\n const directives = parseDirectives(bingbotContent);\n if (Object.keys(directives).length > 0) {\n metadata.bingbot = directives;\n }\n }\n\n // Extract Google News bot directives\n const googlebotNewsContent = getMetaContent(doc, 'googlebot-news');\n if (googlebotNewsContent) {\n const directives = parseDirectives(googlebotNewsContent);\n if (Object.keys(directives).length > 0) {\n metadata.googlebotNews = directives;\n }\n }\n\n return metadata;\n}\n","/**\n * Security and privacy extraction.\n *\n * @remarks\n * Extracts security and privacy-related metadata from HTML documents.\n *\n * @packageDocumentation\n */\n\nimport type { HTMLDocument as Document } from '../../utils/html-parser.js';\nimport { getMetaContent, getMetaHttpEquiv } from '../../utils/meta-helpers.js';\nimport type { SecurityMetadata } from './types.js';\n\n/**\n * Extract security metadata from parsed HTML document.\n *\n * @remarks\n * Extracts security and privacy-related meta tags including referrer policy,\n * content security policy, and browser compatibility directives.\n *\n * @param doc - Parsed HTML document\n * @returns Security metadata\n *\n * @example\n * ```typescript\n * const doc = parseHTML(htmlString);\n * const security = extractSecurity(doc);\n * console.log(security.referrerPolicy);\n * console.log(security.contentSecurityPolicy);\n * ```\n */\nexport function extractSecurity(doc: Document): SecurityMetadata {\n const metadata: SecurityMetadata = {};\n\n // Referrer policy\n metadata.referrerPolicy = getMetaContent(doc, 'referrer');\n\n // Content Security Policy\n metadata.contentSecurityPolicy = getMetaHttpEquiv(doc, 'Content-Security-Policy');\n\n // X-UA-Compatible (IE compatibility mode)\n metadata.xUaCompatible = getMetaHttpEquiv(doc, 'X-UA-Compatible');\n\n // Format detection (iOS Safari)\n metadata.formatDetection = getMetaContent(doc, 'format-detection');\n\n // Remove undefined values\n return Object.fromEntries(\n Object.entries(metadata).filter(([_, value]) => value !== undefined),\n ) as SecurityMetadata;\n}\n","/**\n * Sitemap discovery heuristics.\n *\n * @remarks\n * Common sitemap URL patterns and heuristics.\n *\n * @packageDocumentation\n */\n\n/**\n * Common sitemap URL patterns to check.\n *\n * @remarks\n * These are standard locations where sitemaps are typically found.\n * Should be checked relative to the site's base URL.\n */\nexport const COMMON_SITEMAP_PATHS = [\n '/sitemap.xml',\n '/sitemap_index.xml',\n '/sitemap-index.xml',\n '/sitemapindex.xml',\n '/sitemap1.xml',\n '/sitemap.xml.gz',\n '/sitemap_index.xml.gz',\n '/sitemap.php',\n '/sitemap/',\n '/sitemaps.xml',\n '/sitemaps/sitemap.xml',\n '/sitemap/sitemap.xml',\n '/wp-sitemap.xml', // WordPress\n '/page-sitemap.xml', // WordPress\n '/post-sitemap.xml', // WordPress\n];\n\n/**\n * Generate sitemap URL suggestions based on the document URL.\n *\n * @remarks\n * Returns common sitemap URLs that might exist, relative to the document URL.\n * These are just suggestions - not verified to actually exist.\n *\n * Also includes robots.txt location which typically references sitemaps.\n *\n * @param documentUrl - The URL of the current document\n * @returns Array of suggested sitemap URLs\n */\nexport function generateSitemapSuggestions(documentUrl?: string | URL): string[] {\n if (!documentUrl) {\n // Return paths with robots.txt included\n return ['/robots.txt', ...COMMON_SITEMAP_PATHS];\n }\n\n try {\n const url = typeof documentUrl === 'string' ? new URL(documentUrl) : documentUrl;\n const origin = url.origin;\n\n // Generate full URLs by combining origin with common paths\n const suggestions = [\n `${origin}/robots.txt`, // robots.txt often references sitemaps\n ...COMMON_SITEMAP_PATHS.map((path) => `${origin}${path}`),\n ];\n\n return suggestions;\n } catch {\n // If URL parsing fails, return relative paths\n return ['/robots.txt', ...COMMON_SITEMAP_PATHS];\n }\n}\n","/**\n * Sitemap discovery extraction.\n *\n * @remarks\n * Discovers XML sitemaps in HTML documents.\n *\n * @packageDocumentation\n */\n\nimport type { HTMLDocument as Document } from '../../utils/html-parser.js';\nimport { getAllLinks } from '../../utils/link-helpers.js';\nimport { generateSitemapSuggestions } from './heuristics.js';\nimport type { SitemapDiscoveryMetadata } from './types.js';\n\n/**\n * Extract sitemap discovery metadata from parsed HTML document.\n *\n * @remarks\n * Finds all sitemaps declared in <link rel=\"sitemap\"> tags and generates\n * suggestions for common sitemap URL patterns.\n *\n * @param doc - Parsed HTML document\n * @param documentUrl - Optional document URL for generating absolute sitemap suggestions\n * @returns Sitemap discovery metadata\n *\n * @example\n * ```typescript\n * const doc = parseHTML(htmlString);\n * const sitemaps = extractSitemapDiscovery(doc, 'https://example.com');\n * console.log(sitemaps.sitemaps); // Discovered sitemaps\n * console.log(sitemaps.suggestions); // Suggested sitemap URLs\n * ```\n */\nexport function extractSitemapDiscovery(\n doc: Document,\n documentUrl?: string | URL,\n): SitemapDiscoveryMetadata {\n const metadata: SitemapDiscoveryMetadata = {\n sitemaps: [],\n };\n\n // Find all sitemap links\n const sitemapLinks = getAllLinks(doc, 'sitemap');\n\n // Extract URLs\n metadata.sitemaps = sitemapLinks.map((link) => link.href);\n\n // Generate suggestions if document URL provided\n if (documentUrl) {\n metadata.suggestions = generateSitemapSuggestions(documentUrl);\n }\n\n return metadata;\n}\n","/**\n * Social profiles extraction.\n *\n * @remarks\n * Extracts social media profile links from HTML documents.\n *\n * @packageDocumentation\n */\n\nimport type { HTMLDocument as Document } from '../../utils/html-parser.js';\nimport { getMetaContent } from '../../utils/meta-helpers.js';\nimport type { SocialProfilesMetadata } from './types.js';\n\n/**\n * Extract social profiles metadata from parsed HTML document.\n *\n * @remarks\n * Extracts social media profile URLs and handles from meta tags and structured data.\n *\n * @param doc - Parsed HTML document\n * @returns Social profiles metadata\n *\n * @example\n * ```typescript\n * const doc = parseHTML(htmlString);\n * const profiles = extractSocialProfiles(doc);\n * console.log(profiles.twitter);\n * console.log(profiles.facebook);\n * ```\n */\nexport function extractSocialProfiles(doc: Document): SocialProfilesMetadata {\n const metadata: SocialProfilesMetadata = {};\n\n // Twitter - extract from multiple sources\n metadata.twitter =\n getMetaContent(doc, 'twitter:site') ||\n getMetaContent(doc, 'twitter:creator') ||\n extractFromProperty(doc, 'twitter:site') ||\n extractFromProperty(doc, 'twitter:creator');\n\n // Clean Twitter handle (remove @ if present)\n if (metadata.twitter) {\n metadata.twitter = metadata.twitter.replace(/^@/, '');\n }\n\n // Facebook - from OpenGraph\n metadata.facebook =\n extractFromProperty(doc, 'og:url', 'facebook.com') ||\n extractFromProperty(doc, 'fb:profile_id') ||\n extractFromProperty(doc, 'fb:page_id');\n\n // Instagram\n metadata.instagram =\n getMetaContent(doc, 'instagram:site') || extractFromProperty(doc, 'instagram:site');\n\n // LinkedIn\n metadata.linkedin = extractFromProperty(doc, 'linkedin:owner');\n\n // YouTube\n metadata.youtube =\n getMetaContent(doc, 'youtube:channel') || extractFromProperty(doc, 'youtube:channel');\n\n // GitHub\n metadata.github = getMetaContent(doc, 'github:user');\n\n // TikTok\n metadata.tiktok = getMetaContent(doc, 'tiktok:site');\n\n // Pinterest\n metadata.pinterest = getMetaContent(doc, 'pinterest:profile');\n\n // Mastodon\n metadata.mastodon = extractFromProperty(doc, 'fediverse:creator');\n\n // Reddit\n metadata.reddit = getMetaContent(doc, 'reddit:user');\n\n // Look for Schema.org sameAs links (common for social profiles)\n const schemaProfiles = extractSchemaOrgSameAs(doc);\n if (schemaProfiles.length > 0) {\n for (const url of schemaProfiles) {\n categorizeSchemaProfile(url, metadata);\n }\n }\n\n // Collect other social profiles\n const otherProfiles: Record<string, string> = {};\n\n // Look for other common social meta tags\n const socialPatterns = [\n 'vk:site', // VKontakte\n 'telegram:site', // Telegram\n 'snapchat:site', // Snapchat\n 'whatsapp:number', // WhatsApp\n 'discord:server', // Discord\n ];\n\n for (const pattern of socialPatterns) {\n const value = getMetaContent(doc, pattern);\n if (value) {\n otherProfiles[pattern] = value;\n }\n }\n\n // Add other profiles if any found\n if (Object.keys(otherProfiles).length > 0) {\n metadata.other = otherProfiles;\n }\n\n // Remove undefined values\n return Object.fromEntries(\n Object.entries(metadata).filter(([_, value]) => value !== undefined),\n ) as SocialProfilesMetadata;\n}\n\n/**\n * Extract content from meta tag with property attribute.\n *\n * @param doc - Parsed HTML document\n * @param property - Property name to search for\n * @param mustContain - Optional string that the content must contain\n * @returns Meta content or undefined\n */\nfunction extractFromProperty(\n doc: Document,\n property: string,\n mustContain?: string,\n): string | undefined {\n const meta = doc.querySelector(`meta[property=\"${property}\"]`);\n if (!meta) {\n return undefined;\n }\n\n const content = meta.getAttribute('content');\n if (!content) {\n return undefined;\n }\n\n if (mustContain && !content.includes(mustContain)) {\n return undefined;\n }\n\n return content;\n}\n\n/**\n * Extract Schema.org sameAs links.\n *\n * @remarks\n * Schema.org often uses sameAs property to list social media profiles.\n *\n * @param doc - Parsed HTML document\n * @returns Array of profile URLs\n */\nfunction extractSchemaOrgSameAs(doc: Document): string[] {\n const profiles: string[] = [];\n\n // Look for JSON-LD scripts\n const scripts = doc.querySelectorAll('script[type=\"application/ld+json\"]');\n\n for (const script of Array.from(scripts)) {\n try {\n const data = JSON.parse(script.textContent || '{}');\n\n // Handle array or single object\n const items = Array.isArray(data) ? data : [data];\n\n for (const item of items) {\n // Check for sameAs property\n if (item.sameAs) {\n if (Array.isArray(item.sameAs)) {\n profiles.push(...item.sameAs);\n } else if (typeof item.sameAs === 'string') {\n profiles.push(item.sameAs);\n }\n }\n\n // Check @graph\n if (item['@graph']) {\n for (const node of item['@graph']) {\n if (node.sameAs) {\n if (Array.isArray(node.sameAs)) {\n profiles.push(...node.sameAs);\n } else if (typeof node.sameAs === 'string') {\n profiles.push(node.sameAs);\n }\n }\n }\n }\n }\n } catch {\n // Ignore invalid JSON\n }\n }\n\n return profiles;\n}\n\n/**\n * Categorize Schema.org profile URL into appropriate social platform.\n *\n * @param url - Profile URL\n * @param metadata - Metadata object to update\n */\nfunction categorizeSchemaProfile(url: string, metadata: SocialProfilesMetadata): void {\n const lowerUrl = url.toLowerCase();\n\n if (lowerUrl.includes('twitter.com') || lowerUrl.includes('x.com')) {\n if (!metadata.twitter) {\n // Extract username from URL\n const match = url.match(/(?:twitter\\.com|x\\.com)\\/([^/?]+)/i);\n if (match) {\n metadata.twitter = match[1];\n }\n }\n } else if (lowerUrl.includes('facebook.com')) {\n if (!metadata.facebook) {\n metadata.facebook = url;\n }\n } else if (lowerUrl.includes('instagram.com')) {\n if (!metadata.instagram) {\n const match = url.match(/instagram\\.com\\/([^/?]+)/i);\n if (match) {\n metadata.instagram = match[1];\n }\n }\n } else if (lowerUrl.includes('linkedin.com')) {\n if (!metadata.linkedin) {\n metadata.linkedin = url;\n }\n } else if (lowerUrl.includes('youtube.com')) {\n if (!metadata.youtube) {\n metadata.youtube = url;\n }\n } else if (lowerUrl.includes('github.com')) {\n if (!metadata.github) {\n const match = url.match(/github\\.com\\/([^/?]+)/i);\n if (match) {\n metadata.github = match[1];\n }\n }\n } else if (lowerUrl.includes('tiktok.com')) {\n if (!metadata.tiktok) {\n const match = url.match(/tiktok\\.com\\/@?([^/?]+)/i);\n if (match) {\n metadata.tiktok = match[1];\n }\n }\n } else if (lowerUrl.includes('pinterest.com')) {\n if (!metadata.pinterest) {\n const match = url.match(/pinterest\\.com\\/([^/?]+)/i);\n if (match) {\n metadata.pinterest = match[1];\n }\n }\n } else if (lowerUrl.includes('reddit.com')) {\n if (!metadata.reddit) {\n const match = url.match(/reddit\\.com\\/(?:u|user)\\/([^/?]+)/i);\n if (match) {\n metadata.reddit = match[1];\n }\n }\n }\n}\n","/**\n * Verification tags extraction.\n *\n * @remarks\n * Extracts domain and ownership verification tags from HTML documents.\n *\n * @packageDocumentation\n */\n\nimport type { HTMLDocument as Document } from '../../utils/html-parser.js';\nimport { getMetaContent } from '../../utils/meta-helpers.js';\nimport type { VerificationMetadata } from './types.js';\n\n/**\n * Extract verification metadata from parsed HTML document.\n *\n * @remarks\n * Extracts verification tags used by various platforms for domain and ownership verification.\n *\n * @param doc - Parsed HTML document\n * @returns Verification metadata\n *\n * @example\n * ```typescript\n * const doc = parseHTML(htmlString);\n * const verification = extractVerification(doc);\n * console.log(verification.googleSiteVerification);\n * console.log(verification.facebookDomainVerification);\n * ```\n */\nexport function extractVerification(doc: Document): VerificationMetadata {\n const metadata: VerificationMetadata = {};\n\n // Google Site Verification\n metadata.googleSiteVerification = getMetaContent(doc, 'google-site-verification');\n\n // Microsoft/Bing validation\n metadata.msvalidate = getMetaContent(doc, 'msvalidate.01');\n\n // Yandex verification\n metadata.yandexVerification = getMetaContent(doc, 'yandex-verification');\n\n // Facebook domain verification\n metadata.facebookDomainVerification = getMetaContent(doc, 'facebook-domain-verification');\n\n // Pinterest verification\n metadata.pinterestVerification = getMetaContent(doc, 'p:domain_verify');\n\n // Alexa verification\n metadata.alexaVerification = getMetaContent(doc, 'alexaVerifyID');\n\n // Norton Safe Web\n metadata.nortonSafeWeb = getMetaContent(doc, 'norton-safeweb-site-verification');\n\n // Collect other verification tags\n const otherVerifications: Record<string, string> = {};\n\n // Look for other common verification patterns\n const verificationPatterns = [\n 'verify-v1', // Google legacy\n 'verify-a', // Google legacy\n 'verify', // Generic\n 'verification', // Generic\n 'domain-verification', // Generic\n 'site-verification', // Generic\n ];\n\n for (const pattern of verificationPatterns) {\n const value = getMetaContent(doc, pattern);\n if (value) {\n otherVerifications[pattern] = value;\n }\n }\n\n // Add other verifications if any found\n if (Object.keys(otherVerifications).length > 0) {\n metadata.other = otherVerifications;\n }\n\n // Remove undefined values\n return Object.fromEntries(\n Object.entries(metadata).filter(([_, value]) => value !== undefined),\n ) as VerificationMetadata;\n}\n","/**\n * Base error type for `swoop()`.\n */\nexport class SwoopError extends Error {\n override name = 'SwoopError';\n}\n\n/**\n * Thrown when the current runtime cannot execute `swoop()`.\n */\nexport class SwoopEnvironmentError extends SwoopError {\n override name = 'SwoopEnvironmentError';\n}\n\n/**\n * Thrown when `swoop()` exceeds its configured timeout.\n */\nexport class SwoopTimeoutError extends SwoopError {\n override name = 'SwoopTimeoutError';\n}\n\n/**\n * Thrown when script execution fails in a non-recoverable way.\n */\nexport class SwoopExecutionError extends SwoopError {\n override name = 'SwoopExecutionError';\n}\n\n/**\n * Thrown when `swoop()` is asked to execute potentially unsafe scripts\n * in a context where the caller should explicitly acknowledge the risk.\n */\nexport class SwoopSecurityError extends SwoopError {\n override name = 'SwoopSecurityError';\n}\n","import type { SwoopConsoleEntry } from './types.js';\n\nexport interface ConsoleCapture {\n entries: SwoopConsoleEntry[];\n record: (level: SwoopConsoleEntry['level'], args: unknown[]) => void;\n}\n\nexport function createConsoleCapture(now: () => number = () => Date.now()): ConsoleCapture {\n const entries: SwoopConsoleEntry[] = [];\n\n const formatError = (err: Error) => {\n const parts: string[] = [];\n parts.push(`${err.name}: ${err.message}${err.stack ? `\\n${err.stack}` : ''}`.trim());\n try {\n const props: Record<string, unknown> = {};\n for (const key of Object.getOwnPropertyNames(err)) {\n if (key === 'name' || key === 'message' || key === 'stack') continue;\n props[key] = (err as any)[key];\n }\n if (Object.keys(props).length > 0) {\n parts.push(`props: ${JSON.stringify(props)}`);\n }\n } catch {\n // ignore\n }\n return parts.join('\\n');\n };\n\n const record: ConsoleCapture['record'] = (level, args) => {\n const msg = args\n .map((a) => {\n try {\n if (a instanceof Error) return formatError(a);\n if (typeof a === 'string') return a;\n return String(a);\n } catch {\n return '[unstringifiable]';\n }\n })\n .join(' ');\n\n const argStrings = args.map((a) => {\n try {\n if (a instanceof Error) return formatError(a);\n if (typeof a === 'string') return a;\n return String(a);\n } catch {\n return '[unstringifiable]';\n }\n });\n\n entries.push({ level, message: msg, args: argStrings, time: now() });\n };\n\n return { entries, record };\n}\n","import {\n clearImmediate as nodeClearImmediate,\n clearInterval as nodeClearInterval,\n clearTimeout as nodeClearTimeout,\n setImmediate as nodeSetImmediate,\n setInterval as nodeSetInterval,\n setTimeout as nodeSetTimeout,\n} from 'node:timers';\n\nexport interface AsyncEnvInit {\n globalObj: any;\n debugProbes: boolean;\n}\n\nexport interface AsyncEnv {\n hostSetTimeout: typeof nodeSetTimeout;\n hostClearTimeout: typeof nodeClearTimeout;\n hostSetInterval: typeof nodeSetInterval;\n hostClearInterval: typeof nodeClearInterval;\n hostSetImmediate: typeof nodeSetImmediate;\n hostClearImmediate: typeof nodeClearImmediate;\n noteAsyncActivity: () => void;\n getLastAsyncActivityAt: () => number;\n cleanup: () => void;\n}\n\nexport function installAsyncEnv(init: AsyncEnvInit): AsyncEnv {\n const { globalObj } = init;\n\n const hostSetTimeout = nodeSetTimeout;\n const hostClearTimeout = nodeClearTimeout;\n const hostSetInterval = nodeSetInterval;\n const hostClearInterval = nodeClearInterval;\n const hostSetImmediate = nodeSetImmediate;\n const hostClearImmediate = nodeClearImmediate;\n\n const activeTimeouts = new Set<ReturnType<typeof nodeSetTimeout>>();\n const activeIntervals = new Set<ReturnType<typeof nodeSetInterval>>();\n const activeImmediates = new Set<ReturnType<typeof nodeSetImmediate>>();\n\n let lastAsyncActivityAt = Date.now();\n const noteAsyncActivity = () => {\n lastAsyncActivityAt = Date.now();\n if (init.debugProbes) {\n try {\n globalObj.__swoopStats.lastAsyncActivityAt = lastAsyncActivityAt;\n } catch {\n // ignore\n }\n }\n };\n\n globalObj.__swoop_requestIdleCallback = (cb: any, _opts?: any) => {\n return hostSetTimeout(() => {\n try {\n noteAsyncActivity();\n cb({\n didTimeout: false,\n timeRemaining: () => 0,\n });\n } catch {\n // ignore\n }\n }, 0) as any;\n };\n globalObj.__swoop_cancelIdleCallback = (handle: any) => hostClearTimeout(handle);\n\n globalObj.__swoop_setTimeout = (...args: Parameters<typeof setTimeout>) => {\n const handle = hostSetTimeout(() => {\n activeTimeouts.delete(handle);\n noteAsyncActivity();\n if (init.debugProbes) {\n try {\n globalObj.__swoopStats.timers.timeoutFired++;\n } catch {}\n }\n (args[0] as any)?.call?.(globalObj);\n }, args[1] as number);\n activeTimeouts.add(handle);\n if (init.debugProbes) {\n try {\n globalObj.__swoopStats.timers.timeoutScheduled++;\n } catch {}\n }\n return handle;\n };\n globalObj.__swoop_clearTimeout = (handle: ReturnType<typeof setTimeout>) => {\n activeTimeouts.delete(handle as any);\n hostClearTimeout(handle as any);\n };\n\n globalObj.__swoop_setInterval = (...args: Parameters<typeof setInterval>) => {\n const handle = hostSetInterval(() => {\n noteAsyncActivity();\n if (init.debugProbes) {\n try {\n globalObj.__swoopStats.timers.intervalFired++;\n } catch {}\n }\n (args[0] as any)?.call?.(globalObj);\n }, args[1] as number);\n activeIntervals.add(handle);\n if (init.debugProbes) {\n try {\n globalObj.__swoopStats.timers.intervalScheduled++;\n } catch {}\n }\n return handle;\n };\n globalObj.__swoop_clearInterval = (handle: ReturnType<typeof setInterval>) => {\n activeIntervals.delete(handle as any);\n hostClearInterval(handle as any);\n };\n\n globalObj.__swoop_queueMicrotask = (cb: () => void) => {\n try {\n process.nextTick(() => {\n noteAsyncActivity();\n cb.call(globalObj);\n });\n } catch {\n hostSetTimeout(() => {\n noteAsyncActivity();\n cb.call(globalObj);\n }, 0);\n }\n };\n\n globalObj.__swoop_setImmediate = (cb: (...a: any[]) => void, ...args: any[]) => {\n const handle = hostSetImmediate(() => {\n activeImmediates.delete(handle);\n try {\n noteAsyncActivity();\n cb.call(globalObj, ...args);\n } catch {\n // ignore\n }\n });\n activeImmediates.add(handle);\n return handle;\n };\n globalObj.__swoop_clearImmediate = (handle: ReturnType<typeof nodeSetImmediate>) => {\n activeImmediates.delete(handle);\n hostClearImmediate(handle);\n };\n\n globalObj.__swoop_requestAnimationFrame = (cb: FrameRequestCallback) => {\n if (init.debugProbes) {\n try {\n globalObj.__swoopStats.timers.rafScheduled++;\n } catch {}\n }\n const id = hostSetTimeout(() => {\n if (init.debugProbes) {\n try {\n globalObj.__swoopStats.timers.rafFired++;\n } catch {}\n }\n noteAsyncActivity();\n cb.call(globalObj, Date.now());\n }, 16) as any;\n return id;\n };\n globalObj.__swoop_cancelAnimationFrame = (id: number) => hostClearTimeout(id as any);\n\n const cleanup = () => {\n for (const h of activeTimeouts) hostClearTimeout(h);\n for (const h of activeIntervals) hostClearInterval(h as any);\n for (const h of activeImmediates) hostClearImmediate(h);\n };\n\n return {\n hostSetTimeout,\n hostClearTimeout,\n hostSetInterval,\n hostClearInterval,\n hostSetImmediate,\n hostClearImmediate,\n noteAsyncActivity,\n getLastAsyncActivityAt: () => lastAsyncActivityAt,\n cleanup,\n };\n}\n","export interface BaseResolve {\n baseForResolve: URL;\n baseTagHref: string | null;\n baseEl: any | null;\n}\n\n/**\n * Computes the base URL used for resolving relative resources.\n *\n * @remarks\n * Uses `<base href=\"...\">` if present; otherwise falls back to the page URL.\n */\nexport function computeBaseForResolve(finalUrl: string, document: any): BaseResolve {\n const pageUrl = new URL(finalUrl);\n const baseEl = (document as any)?.querySelector?.('base') ?? null;\n const baseTagHref: string | null = baseEl?.getAttribute?.('href') ?? null;\n\n const baseForResolve = (() => {\n try {\n return baseTagHref ? new URL(String(baseTagHref), finalUrl) : pageUrl;\n } catch {\n return pageUrl;\n }\n })();\n\n return { baseForResolve, baseTagHref, baseEl };\n}\n\n/**\n * Enforces the browser invariant that `document.baseURI` is an absolute URL.\n */\nexport function patchDocumentBaseURI(document: any, baseForResolve: URL): void {\n try {\n Object.defineProperty(document as any, 'baseURI', {\n configurable: true,\n get: () => baseForResolve.href,\n });\n } catch {\n // ignore\n }\n}\n\n/**\n * Enforces the browser invariant that `<base>.href` is an absolute URL.\n */\nexport function patchBaseElementHref(baseEl: any | null, baseForResolve: URL): void {\n try {\n if (baseEl) {\n Object.defineProperty(baseEl, 'href', {\n configurable: true,\n get: () => baseForResolve.href,\n set: (_v: string) => {},\n });\n }\n } catch {\n // ignore\n }\n}\n","export interface BrowserShimsInit {\n globalObj: any;\n domWindow: any;\n document: any;\n documentBaseUriForDom: string;\n}\n\nexport function installBrowserShims(init: BrowserShimsInit): void {\n const { globalObj, domWindow, documentBaseUriForDom } = init;\n const doc = init.document ?? (globalObj as any).document;\n\n // Ensure DOM APIs that rely on defaultView behave consistently.\n try {\n if (doc && (doc as any).defaultView == null) (doc as any).defaultView = globalObj;\n } catch {\n // ignore\n }\n // Some frameworks read document.baseURI for router/baseHref resolution.\n try {\n if (doc && (doc as any).baseURI == null) (doc as any).baseURI = documentBaseUriForDom;\n } catch {\n // ignore\n }\n\n // Prefer a minimally-faked navigator; avoid hard-coding vendor/UA brands.\n globalObj.navigator ??= {};\n globalObj.navigator.language ??= 'en';\n globalObj.navigator.languages ??= [globalObj.navigator.language];\n globalObj.navigator.onLine ??= true;\n\n // Basic viewport defaults (avoid baking in a specific browser fingerprint).\n globalObj.screen ??= {\n width: 1280,\n height: 720,\n availWidth: 1280,\n availHeight: 720,\n colorDepth: 24,\n };\n globalObj.devicePixelRatio ??= 1;\n globalObj.innerWidth ??= globalObj.screen.width ?? 1280;\n globalObj.innerHeight ??= globalObj.screen.height ?? 720;\n\n // Node (>=18+) usually has these web globals; expose them into the sandbox.\n globalObj.MessageChannel ??= (globalThis as any).MessageChannel;\n globalObj.MessagePort ??= (globalThis as any).MessagePort;\n globalObj.MessageEvent ??= (globalThis as any).MessageEvent;\n globalObj.BroadcastChannel ??= (globalThis as any).BroadcastChannel;\n\n // Minimal getComputedStyle: enough to keep frameworks from bailing.\n globalObj.getComputedStyle ??= (el: any) => {\n const style = el?.style ?? {};\n return new Proxy(style, {\n get(target, prop) {\n if (prop === 'getPropertyValue') return (name: string) => target?.[name] ?? '';\n return (target as any)[prop as any] ?? '';\n },\n });\n };\n\n // Navigation-related events.\n globalObj.PopStateEvent ??= class PopStateEvent extends (globalObj.Event ?? Event) {\n state: unknown;\n constructor(type: string, init?: any) {\n super(type, init);\n this.state = init?.state;\n }\n };\n globalObj.HashChangeEvent ??= class HashChangeEvent extends (globalObj.Event ?? Event) {\n oldURL: string;\n newURL: string;\n constructor(type: string, init?: any) {\n super(type, init);\n this.oldURL = init?.oldURL ?? '';\n this.newURL = init?.newURL ?? '';\n }\n };\n\n // Media queries are often used for breakpoint selection. Return a stable default.\n globalObj.matchMedia ??= (query: string) => {\n const listeners = new Set<any>();\n const mql: any = {\n matches: false,\n media: String(query ?? ''),\n onchange: null,\n addListener: (cb: any) => {\n if (typeof cb === 'function') listeners.add(cb);\n },\n removeListener: (cb: any) => {\n listeners.delete(cb);\n },\n addEventListener: (type: string, cb: any) => {\n if (String(type) === 'change' && typeof cb === 'function') listeners.add(cb);\n },\n removeEventListener: (type: string, cb: any) => {\n if (String(type) === 'change') listeners.delete(cb);\n },\n dispatchEvent: (evt: any) => {\n try {\n for (const cb of listeners) cb.call(mql, evt);\n if (typeof mql.onchange === 'function') mql.onchange.call(mql, evt);\n } catch {\n // ignore\n }\n return true;\n },\n };\n return mql;\n };\n\n // Observers are frequently used for lazy rendering; provide no-op implementations.\n globalObj.IntersectionObserver ??= class IntersectionObserver {\n observe(_el: any) {}\n unobserve(_el: any) {}\n disconnect() {}\n takeRecords() {\n return [];\n }\n };\n globalObj.ResizeObserver ??= class ResizeObserver {\n observe(_el: any) {}\n unobserve(_el: any) {}\n disconnect() {}\n };\n globalObj.MutationObserver ??= class MutationObserver {\n observe(_target: any, _options?: any) {}\n disconnect() {}\n takeRecords() {\n return [];\n }\n };\n\n globalObj.URL ??= URL;\n globalObj.URLSearchParams ??= URLSearchParams;\n globalObj.WebAssembly ??= WebAssembly;\n globalObj.TextEncoder ??= TextEncoder;\n globalObj.TextDecoder ??= TextDecoder;\n globalObj.Headers ??= globalThis.Headers;\n globalObj.Request ??= globalThis.Request;\n globalObj.Response ??= globalThis.Response;\n globalObj.crypto ??= globalThis.crypto;\n globalObj.performance ??= globalThis.performance;\n globalObj.structuredClone ??= globalThis.structuredClone;\n globalObj.Blob ??= globalThis.Blob;\n globalObj.FormData ??= globalThis.FormData;\n globalObj.File ??= (globalThis as any).File;\n globalObj.ReadableStream ??= (globalThis as any).ReadableStream;\n globalObj.atob ??= (data: string) => Buffer.from(data, 'base64').toString('binary');\n globalObj.btoa ??= (data: string) => Buffer.from(data, 'binary').toString('base64');\n\n // Big-ticket web platform APIs not yet implemented in `swoop`.\n globalObj.WebSocket ??= class WebSocket {\n constructor() {\n throw new Error('swoop: WebSocket is not implemented');\n }\n };\n globalObj.EventSource ??= class EventSource {\n constructor() {\n throw new Error('swoop: EventSource is not implemented');\n }\n };\n globalObj.Worker ??= class Worker {\n constructor() {\n throw new Error('swoop: Worker is not implemented');\n }\n };\n globalObj.SharedWorker ??= class SharedWorker {\n constructor() {\n throw new Error('swoop: SharedWorker is not implemented');\n }\n };\n globalObj.indexedDB ??= undefined;\n globalObj.caches ??= undefined;\n globalObj.Notification ??= undefined;\n\n // Common DOM globals frequently used as runtime tokens (and sometimes as DI tokens).\n globalObj.Document ??= domWindow.Document;\n globalObj.HTMLDocument ??= domWindow.HTMLDocument ?? init.document?.constructor;\n globalObj.Element ??= domWindow.Element;\n globalObj.HTMLElement ??= domWindow.HTMLElement;\n globalObj.Node ??= domWindow.Node;\n\n // TreeWalker / NodeIterator constants.\n globalObj.NodeFilter ??= domWindow.NodeFilter ?? {\n FILTER_ACCEPT: 1,\n FILTER_REJECT: 2,\n FILTER_SKIP: 3,\n SHOW_ALL: 0xffffffff,\n SHOW_ELEMENT: 0x1,\n SHOW_ATTRIBUTE: 0x2,\n SHOW_TEXT: 0x4,\n SHOW_CDATA_SECTION: 0x8,\n SHOW_ENTITY_REFERENCE: 0x10,\n SHOW_ENTITY: 0x20,\n SHOW_PROCESSING_INSTRUCTION: 0x40,\n SHOW_COMMENT: 0x80,\n SHOW_DOCUMENT: 0x100,\n SHOW_DOCUMENT_TYPE: 0x200,\n SHOW_DOCUMENT_FRAGMENT: 0x400,\n SHOW_NOTATION: 0x800,\n };\n}\n","export function installCookieJar(document: any): void {\n let cookieJar = '';\n try {\n Object.defineProperty(document, 'cookie', {\n configurable: true,\n get() {\n return cookieJar;\n },\n set(value: string) {\n // Best-effort: append; do not implement full RFC.\n if (typeof value === 'string' && value.length > 0) {\n cookieJar = cookieJar ? `${cookieJar}; ${value}` : value;\n }\n },\n });\n } catch {\n // ignore\n }\n}\n","export interface FetchShimInit {\n globalObj: any;\n hostFetch: typeof fetch | undefined;\n baseForResolveHref: string;\n remainingMs: () => number;\n hostSetTimeout: (cb: () => void, ms: number) => any;\n hostClearTimeout: (h: any) => void;\n noteAsyncActivity: () => void;\n debugFetch: boolean;\n recordDebug: (args: unknown[]) => void;\n queueMicrotask: (cb: () => void) => void;\n}\n\nexport interface FetchShim {\n getPendingFetches: () => number;\n}\n\nexport function installFetchShim(init: FetchShimInit): FetchShim {\n let pendingFetches = 0;\n\n init.globalObj.__swoop_fetch =\n typeof init.hostFetch === 'function'\n ? (...args: Parameters<typeof fetch>) => {\n init.noteAsyncActivity();\n pendingFetches++;\n try {\n const input = args[0];\n const initReq = args[1];\n\n // Browser fetch resolves relative URLs against document/base URL.\n // Node fetch rejects them. Emulate browser resolution here.\n let resolvedInput: typeof input = input;\n if (typeof input === 'string') {\n resolvedInput = new URL(input, init.baseForResolveHref).href;\n } else if (input instanceof URL) {\n resolvedInput = input.href;\n } else if (typeof (input as Request).url === 'string') {\n try {\n resolvedInput = new URL((input as Request).url, init.baseForResolveHref).href;\n } catch {\n // keep as-is\n }\n }\n\n if (init.debugFetch) {\n init.recordDebug(['[fetch]', resolvedInput]);\n }\n\n const controller = new AbortController();\n const timeoutHandle = init.hostSetTimeout(() => controller.abort(), init.remainingMs());\n const mergedInit = { ...(initReq as any), signal: controller.signal };\n\n const p = init.hostFetch!(resolvedInput as any, mergedInit as any).finally(() => {\n init.hostClearTimeout(timeoutHandle);\n });\n\n return p.finally(() => {\n try {\n init.queueMicrotask(() => {\n pendingFetches--;\n init.noteAsyncActivity();\n });\n } catch {\n pendingFetches--;\n init.noteAsyncActivity();\n }\n });\n } catch (err) {\n pendingFetches--;\n init.noteAsyncActivity();\n throw err;\n }\n }\n : undefined;\n\n return {\n getPendingFetches: () => pendingFetches,\n };\n}\n","export interface CreateNavigationInit {\n pageUrl: URL;\n onNavigate?: (href: string) => void;\n onPopState?: (state: unknown) => void;\n}\n\nexport interface NavigationShims {\n location: any;\n history: any;\n}\n\nexport function createNavigationShims(init: CreateNavigationInit): NavigationShims {\n const { pageUrl } = init;\n\n const resolveAndSetHref = (href: string) => {\n try {\n const next = new URL(href, pageUrl.href);\n pageUrl.href = next.href;\n init.onNavigate?.(pageUrl.href);\n } catch {\n // ignore\n }\n };\n\n const location: any = {};\n try {\n Object.defineProperties(location, {\n href: { get: () => pageUrl.href, set: (v: string) => resolveAndSetHref(String(v)) },\n origin: { get: () => pageUrl.origin },\n protocol: {\n get: () => pageUrl.protocol,\n set: (v: string) => {\n pageUrl.protocol = String(v);\n },\n },\n host: {\n get: () => pageUrl.host,\n set: (v: string) => {\n pageUrl.host = String(v);\n },\n },\n hostname: {\n get: () => pageUrl.hostname,\n set: (v: string) => {\n pageUrl.hostname = String(v);\n },\n },\n port: {\n get: () => pageUrl.port,\n set: (v: string) => {\n pageUrl.port = String(v);\n },\n },\n pathname: { get: () => pageUrl.pathname, set: (v: string) => resolveAndSetHref(String(v)) },\n search: {\n get: () => pageUrl.search,\n set: (v: string) => {\n pageUrl.search = String(v);\n },\n },\n hash: {\n get: () => pageUrl.hash,\n set: (v: string) => {\n pageUrl.hash = String(v);\n },\n },\n });\n } catch {\n // ignore\n }\n location.toString = () => pageUrl.href;\n location.assign = (href: string) => resolveAndSetHref(href);\n location.replace = (href: string) => resolveAndSetHref(href);\n location.reload = () => {};\n\n let historyState: unknown = null;\n const history: any = {\n get state() {\n return historyState;\n },\n pushState: (state: unknown, _title: string, url?: string | URL | null) => {\n historyState = state;\n if (url != null) resolveAndSetHref(String(url));\n try {\n init.onPopState?.(state);\n } catch {\n // ignore\n }\n },\n replaceState: (state: unknown, _title: string, url?: string | URL | null) => {\n historyState = state;\n if (url != null) resolveAndSetHref(String(url));\n },\n back: () => {},\n forward: () => {},\n go: (_delta?: number) => {},\n };\n\n return { location, history };\n}\n","export function installPermissiveShims(globalObj: any): void {\n const makeStorage = () => {\n const store = new Map<string, string>();\n return {\n get length() {\n return store.size;\n },\n clear() {\n store.clear();\n },\n getItem(key: string) {\n return store.has(String(key)) ? store.get(String(key))! : null;\n },\n key(index: number) {\n return Array.from(store.keys())[index] ?? null;\n },\n removeItem(key: string) {\n store.delete(String(key));\n },\n setItem(key: string, value: string) {\n store.set(String(key), String(value));\n },\n };\n };\n\n globalObj.localStorage ??= makeStorage();\n globalObj.sessionStorage ??= makeStorage();\n\n // Do NOT downgrade shims here. `permissiveShims` is meant to *fill gaps*,\n // not replace richer implementations installed earlier.\n globalObj.scrollTo ??= () => {};\n\n try {\n if (\n globalObj.HTMLElement?.prototype &&\n !globalObj.HTMLElement.prototype.getBoundingClientRect\n ) {\n globalObj.HTMLElement.prototype.getBoundingClientRect = () => ({\n x: 0,\n y: 0,\n width: 0,\n height: 0,\n top: 0,\n left: 0,\n right: 0,\n bottom: 0,\n toJSON() {},\n });\n }\n } catch {\n // ignore\n }\n\n globalObj.process ??= { env: { NODE_ENV: 'production' } };\n}\n","export interface InstallXhrInit {\n globalObj: any;\n resolveUrl: (u: string) => string;\n remainingMs: () => number;\n hostSetTimeout: (cb: () => void, ms: number) => any;\n hostClearTimeout: (handle: any) => void;\n fetch: typeof globalThis.fetch | undefined;\n}\n\ntype Listener = (ev: any) => void;\n\n/**\n * Minimal XMLHttpRequest shim over fetch (best-effort).\n *\n * @remarks\n * - Always async (sync XHR is emulated as async)\n * - Time-budgeted via `remainingMs()`\n */\nexport function installXMLHttpRequest(init: InstallXhrInit): void {\n const g = init.globalObj;\n if (g.XMLHttpRequest) return;\n\n class Xhr {\n // readyState constants\n static UNSENT = 0;\n static OPENED = 1;\n static HEADERS_RECEIVED = 2;\n static LOADING = 3;\n static DONE = 4;\n UNSENT = 0;\n OPENED = 1;\n HEADERS_RECEIVED = 2;\n LOADING = 3;\n DONE = 4;\n\n readyState = 0;\n status = 0;\n statusText = '';\n responseType: '' | 'text' | 'json' | 'arraybuffer' | 'blob' = '';\n response: any = null;\n responseText = '';\n timeout = 0;\n withCredentials = false;\n\n onreadystatechange: null | (() => void) = null;\n onload: null | (() => void) = null;\n onerror: null | (() => void) = null;\n ontimeout: null | (() => void) = null;\n onabort: null | (() => void) = null;\n\n private _method = 'GET';\n private _url = '';\n private _headers = new Map<string, string>();\n private _respHeaders: Headers | null = null;\n private _listeners = new Map<string, Set<Listener>>();\n private _controller: AbortController | null = null;\n\n addEventListener(type: string, cb: Listener) {\n const t = String(type);\n const set = this._listeners.get(t) ?? new Set<Listener>();\n set.add(cb);\n this._listeners.set(t, set);\n }\n removeEventListener(type: string, cb: Listener) {\n const t = String(type);\n this._listeners.get(t)?.delete(cb);\n }\n private _dispatch(type: string) {\n const ev = { type, target: this, currentTarget: this };\n this._listeners.get(type)?.forEach((cb) => {\n try {\n cb(ev);\n } catch {\n // ignore\n }\n });\n }\n private _setReadyState(n: number) {\n this.readyState = n;\n try {\n this.onreadystatechange?.();\n } catch {\n // ignore\n }\n this._dispatch('readystatechange');\n }\n\n open(method: string, url: string, async: boolean = true) {\n this._method = String(method ?? 'GET').toUpperCase();\n this._url = String(url ?? '');\n void async; // sync XHR is not supported; treat as async.\n this._headers.clear();\n this._respHeaders = null;\n this._controller = null;\n this._setReadyState(1);\n }\n\n setRequestHeader(name: string, value: string) {\n this._headers.set(String(name), String(value));\n }\n\n getResponseHeader(name: string) {\n try {\n return this._respHeaders?.get(String(name)) ?? null;\n } catch {\n return null;\n }\n }\n\n getAllResponseHeaders() {\n try {\n if (!this._respHeaders) return '';\n let out = '';\n this._respHeaders.forEach((v, k) => {\n out += `${k}: ${v}\\r\\n`;\n });\n return out;\n } catch {\n return '';\n }\n }\n\n overrideMimeType(_mime: string) {}\n\n abort() {\n try {\n this._controller?.abort();\n } catch {\n // ignore\n }\n try {\n this.onabort?.();\n } catch {\n // ignore\n }\n this._dispatch('abort');\n }\n\n send(body?: any) {\n const doFetch = async () => {\n const url = init.resolveUrl(this._url);\n const controller = new AbortController();\n this._controller = controller;\n\n let timeoutHandle: any;\n const ms = Math.min(this.timeout || 0, init.remainingMs());\n if (ms > 0) {\n timeoutHandle = init.hostSetTimeout(() => controller.abort(), ms);\n }\n\n try {\n const headers: Record<string, string> = {};\n for (const [k, v] of this._headers.entries()) headers[k] = v;\n\n if (!init.fetch) throw new Error('swoop: host fetch is unavailable in this Node runtime');\n\n const resp = await init.fetch(url, {\n method: this._method,\n headers,\n body: body as any,\n signal: controller.signal,\n // credentials/withCredentials ignored (Node fetch differs); best-effort.\n } as any);\n\n this._respHeaders = resp.headers;\n this.status = resp.status;\n this.statusText = (resp as any).statusText ?? '';\n this._setReadyState(2);\n\n // load body\n this._setReadyState(3);\n if (this.responseType === 'arraybuffer') {\n this.response = await resp.arrayBuffer();\n this.responseText = '';\n } else if (this.responseType === 'blob') {\n this.response = (resp as any).blob\n ? await (resp as any).blob()\n : await resp.arrayBuffer();\n this.responseText = '';\n } else {\n const text = await resp.text();\n this.responseText = text;\n if (this.responseType === 'json') {\n try {\n this.response = JSON.parse(text);\n } catch {\n this.response = null;\n }\n } else {\n this.response = text;\n }\n }\n\n this._setReadyState(4);\n try {\n this.onload?.();\n } catch {\n // ignore\n }\n this._dispatch('load');\n this._dispatch('loadend');\n } catch {\n this._setReadyState(4);\n const aborted = this._controller?.signal?.aborted;\n if (aborted) {\n try {\n this.ontimeout?.();\n } catch {}\n this._dispatch('timeout');\n } else {\n try {\n this.onerror?.();\n } catch {}\n this._dispatch('error');\n }\n this._dispatch('loadend');\n } finally {\n if (timeoutHandle) init.hostClearTimeout(timeoutHandle);\n }\n };\n\n // Always async.\n void doFetch();\n }\n }\n\n g.XMLHttpRequest = Xhr;\n}\n","import vm from 'node:vm';\n\n/**\n * Synthesize a browser-ish document lifecycle after scripts executed.\n *\n * @remarks\n * Best-effort. No layout/paint; this is only to unblock CSR bundles that wait\n * for DOMContentLoaded/load and related lifecycle events.\n */\nexport function synthesizeLifecycle(context: vm.Context, timeoutMs: number = 50): void {\n vm.runInContext(\n `\n try {\n const EventCtor = (globalThis.Event || (globalThis.window && globalThis.window.Event));\n const dispatchDoc = (type) => { try { document.dispatchEvent(new EventCtor(type)); } catch {} };\n const dispatchWin = (type) => { try { window.dispatchEvent(new EventCtor(type)); } catch {} };\n\n if (typeof document.readyState !== \"string\") {\n try { document.readyState = \"loading\"; } catch {}\n }\n\n dispatchDoc(\"readystatechange\");\n try { document.readyState = \"interactive\"; } catch {}\n dispatchDoc(\"readystatechange\");\n dispatchDoc(\"DOMContentLoaded\");\n try { document.readyState = \"complete\"; } catch {}\n dispatchDoc(\"readystatechange\");\n\n try {\n if (typeof document.visibilityState !== \"string\") document.visibilityState = \"visible\";\n if (typeof document.hidden !== \"boolean\") document.hidden = false;\n if (typeof document.hasFocus !== \"function\") document.hasFocus = () => true;\n } catch {}\n dispatchDoc(\"visibilitychange\");\n\n dispatchWin(\"pageshow\");\n dispatchWin(\"load\");\n\n try { window.dispatchEvent(new PopStateEvent(\"popstate\", { state: (history && history.state) })); } catch {}\n try {\n const href = String((location && location.href) || \"\");\n window.dispatchEvent(new HashChangeEvent(\"hashchange\", { oldURL: href, newURL: href }));\n } catch {}\n } catch {}\n `,\n context,\n { timeout: timeoutMs },\n );\n}\n","export interface DebugProbesInit {\n globalObj: any;\n hostSetTimeout: (cb: () => void, ms: number) => any;\n}\n\nexport function installDebugProbes(init: DebugProbesInit): void {\n const { globalObj, hostSetTimeout } = init;\n\n globalObj.__swoopStats = {\n startedAt: Date.now(),\n domOps: Object.create(null) as Record<string, number>,\n mutations: 0,\n lastDomActivityAt: 0,\n listeners: Object.create(null) as Record<string, number>,\n timers: {\n timeoutScheduled: 0,\n timeoutFired: 0,\n intervalScheduled: 0,\n intervalFired: 0,\n rafScheduled: 0,\n rafFired: 0,\n },\n nav: {\n pushState: 0,\n replaceState: 0,\n lastHref: null as string | null,\n },\n appRootSamples: [] as Array<{ t: number; len: number; opacity: string | null }>,\n };\n\n const bump = (name: string) => {\n const s = globalObj.__swoopStats;\n s.domOps[name] = (s.domOps[name] ?? 0) + 1;\n s.lastDomActivityAt = Date.now();\n };\n\n const bumpListener = (type: string) => {\n const s = globalObj.__swoopStats;\n s.listeners[type] = (s.listeners[type] ?? 0) + 1;\n };\n\n const wrapProto = (proto: any, fn: string) => {\n const orig = proto?.[fn];\n if (typeof orig !== 'function') return;\n proto[fn] = function (...args: any[]) {\n bump(fn);\n return orig.apply(this, args);\n };\n };\n\n // best-effort: cover the most common DOM mutation surfaces\n wrapProto(globalObj.Node?.prototype, 'appendChild');\n wrapProto(globalObj.Node?.prototype, 'insertBefore');\n wrapProto(globalObj.Node?.prototype, 'removeChild');\n wrapProto(globalObj.Element?.prototype, 'setAttribute');\n wrapProto(globalObj.Element?.prototype, 'removeAttribute');\n wrapProto(globalObj.Element?.prototype, 'append');\n wrapProto(globalObj.Element?.prototype, 'prepend');\n\n // Track event listener registrations (router, visibility, etc.)\n const wrapAddListener = (target: any, label: string) => {\n const orig = target?.addEventListener;\n if (typeof orig !== 'function') return;\n target.addEventListener = function (type: any, listener: any, options: any) {\n try {\n bumpListener(`${label}:${String(type)}`);\n } catch {\n // ignore\n }\n return orig.call(this, type, listener, options);\n };\n };\n wrapAddListener(globalObj, 'window');\n wrapAddListener(globalObj.document, 'document');\n\n const MO = globalObj.MutationObserver;\n if (typeof MO === 'function') {\n const mo = new MO(() => {\n globalObj.__swoopStats.mutations++;\n globalObj.__swoopStats.lastDomActivityAt = Date.now();\n });\n try {\n mo.observe(globalObj.document?.documentElement, {\n subtree: true,\n childList: true,\n attributes: true,\n characterData: true,\n });\n } catch {\n // ignore\n }\n }\n\n // sample app-root size over time\n const sample = () => {\n try {\n const el = globalObj.document?.querySelector?.('app-root');\n const len = el?.innerHTML?.length ?? 0;\n const opacity = el?.getAttribute?.('style')?.includes('opacity')\n ? String(el.getAttribute('style'))\n : null;\n globalObj.__swoopStats.appRootSamples.push({ t: Date.now(), len, opacity });\n } catch {\n // ignore\n }\n };\n sample();\n hostSetTimeout(sample, 250);\n hostSetTimeout(sample, 1000);\n hostSetTimeout(sample, 2500);\n hostSetTimeout(sample, 4500);\n}\n\nexport function emitDebugProbes(\n globalObj: any,\n recordDebug: (args: unknown[]) => void,\n now: () => number = () => Date.now(),\n): void {\n const stats = globalObj.__swoopStats;\n if (!stats) return;\n\n const appRootHtml = (() => {\n try {\n const el = globalObj.document?.querySelector?.('app-root');\n const raw = el?.innerHTML ?? '';\n return String(raw).slice(0, 400);\n } catch {\n return null;\n }\n })();\n\n recordDebug([\n '[swoop probes]',\n JSON.stringify({\n mutations: stats.mutations ?? 0,\n lastDomActivityMsAgo:\n stats.lastDomActivityAt && typeof stats.lastDomActivityAt === 'number'\n ? now() - stats.lastDomActivityAt\n : null,\n topDomOps: Object.entries(stats.domOps ?? {})\n .sort((a, b) => (b[1] as number) - (a[1] as number))\n .slice(0, 15),\n topListeners: Object.entries(stats.listeners ?? {})\n .sort((a, b) => (b[1] as number) - (a[1] as number))\n .slice(0, 20),\n timers: stats.timers ?? null,\n lastAsyncActivityMsAgo:\n stats.lastAsyncActivityAt && typeof stats.lastAsyncActivityAt === 'number'\n ? now() - stats.lastAsyncActivityAt\n : null,\n nav: stats.nav ?? null,\n location: (() => {\n try {\n return {\n href: String(globalObj.location?.href ?? ''),\n pathname: String(globalObj.location?.pathname ?? ''),\n search: String(globalObj.location?.search ?? ''),\n hash: String(globalObj.location?.hash ?? ''),\n baseURI: String(globalObj.document?.baseURI ?? ''),\n };\n } catch {\n return null;\n }\n })(),\n appRootSamples: stats.appRootSamples ?? [],\n appRootHtmlHead: appRootHtml,\n }),\n ]);\n}\n","export interface ScriptLoaderInit {\n globalObj: any;\n pageUrlHref: string;\n baseForResolveHref: string;\n remainingMs: () => number;\n hostSetTimeout: (cb: () => void, ms: number) => any;\n totalBudgetMs: number;\n maxDebugEvents: number;\n debug: (args: unknown[]) => void;\n onError?: (resolvedSrc: string, err: unknown) => void;\n noteAsyncActivity: () => void;\n\n fetchText: (url: string) => Promise<string>;\n runClassicScript: (code: string, filename: string) => void;\n runModuleScript: (resolvedSrc: string, parentUrlForResolve: string) => Promise<void>;\n}\n\nexport interface ScriptLoader {\n getPendingScriptLoads: () => number;\n install: () => void;\n}\n\nfunction isScriptEl(node: any): boolean {\n return node?.tagName?.toLowerCase?.() === 'script';\n}\n\nexport function createScriptLoader(init: ScriptLoaderInit): ScriptLoader {\n const loadedScriptSrcs = new Set<string>();\n let pendingScriptLoads = 0;\n let debugScriptEvents = 0;\n\n const debugScript = (...args: unknown[]) => {\n if (debugScriptEvents++ > init.maxDebugEvents) return;\n init.debug(args);\n };\n\n const loadScriptElement = async (scriptEl: any, parentUrlForResolve: string): Promise<void> => {\n const rawSrc = scriptEl?.src || scriptEl?.getAttribute?.('src');\n if (!rawSrc) return;\n\n let resolvedSrc: string;\n try {\n resolvedSrc = new URL(String(rawSrc), init.baseForResolveHref).href;\n } catch {\n return;\n }\n if (loadedScriptSrcs.has(resolvedSrc)) return;\n loadedScriptSrcs.add(resolvedSrc);\n init.noteAsyncActivity();\n pendingScriptLoads++;\n\n const type = (scriptEl?.type || scriptEl?.getAttribute?.('type') || '')\n .toString()\n .trim()\n .toLowerCase();\n const isModule = type === 'module';\n debugScript('[swoop] load <script>', resolvedSrc, isModule ? 'module' : 'classic');\n\n try {\n if (isModule) {\n await init.runModuleScript(resolvedSrc, parentUrlForResolve);\n } else {\n const code = await init.fetchText(resolvedSrc);\n init.runClassicScript(code, resolvedSrc);\n }\n\n // Fire load events/callbacks (webpack waits for these).\n try {\n if (typeof scriptEl?.onload === 'function')\n scriptEl.onload(new (init.globalObj.Event ?? Event)('load'));\n } catch {\n try {\n scriptEl.onload?.();\n } catch {}\n }\n try {\n scriptEl?.dispatchEvent?.(new (init.globalObj.Event ?? Event)('load'));\n } catch {}\n } catch (e) {\n try {\n init.onError?.(resolvedSrc, e);\n } catch {\n // ignore\n }\n try {\n if (typeof scriptEl?.onerror === 'function') scriptEl.onerror(e);\n } catch {\n try {\n scriptEl.onerror?.();\n } catch {}\n }\n try {\n scriptEl?.dispatchEvent?.(new (init.globalObj.Event ?? Event)('error'));\n } catch {}\n } finally {\n pendingScriptLoads--;\n init.noteAsyncActivity();\n }\n };\n\n const scheduleScriptLoad = (node: any, label: string) => {\n // Give page code a chance to set `src`, `type`, and event handlers after insertion.\n init.hostSetTimeout(() => {\n void loadScriptElement(node, `${init.pageUrlHref}#${label}`);\n }, 0);\n };\n\n const patchScriptInsertion = (container: any, label: string) => {\n if (!container) return;\n const origAppendChild = container.appendChild?.bind(container);\n const origInsertBefore = container.insertBefore?.bind(container);\n const origAppend = container.append?.bind(container);\n const origPrepend = container.prepend?.bind(container);\n if (typeof origAppendChild === 'function') {\n container.appendChild = (node: any) => {\n const ret = origAppendChild(node);\n if (isScriptEl(node)) scheduleScriptLoad(node, `${label}.appendChild`);\n return ret;\n };\n }\n if (typeof origInsertBefore === 'function') {\n container.insertBefore = (node: any, ref: any) => {\n const ret = origInsertBefore(node, ref);\n if (isScriptEl(node)) scheduleScriptLoad(node, `${label}.insertBefore`);\n return ret;\n };\n }\n if (typeof origAppend === 'function') {\n container.append = (...nodes: any[]) => {\n const ret = origAppend(...nodes);\n for (const n of nodes) if (isScriptEl(n)) scheduleScriptLoad(n, `${label}.append`);\n return ret;\n };\n }\n if (typeof origPrepend === 'function') {\n container.prepend = (...nodes: any[]) => {\n const ret = origPrepend(...nodes);\n for (const n of nodes) if (isScriptEl(n)) scheduleScriptLoad(n, `${label}.prepend`);\n return ret;\n };\n }\n };\n\n const install = () => {\n patchScriptInsertion(init.globalObj.document?.head, 'head');\n patchScriptInsertion(init.globalObj.document?.body, 'body');\n\n // If a script is inserted without `src` and `src` is set later, we still want to load it.\n // Hook setAttribute for script elements.\n try {\n const elProto = init.globalObj.Element?.prototype;\n const origSetAttr = elProto?.setAttribute;\n if (typeof origSetAttr === 'function') {\n elProto.setAttribute = function (name: string, value: string) {\n const ret = origSetAttr.call(this, name, value);\n try {\n if (\n this?.tagName?.toLowerCase?.() === 'script' &&\n typeof name === 'string' &&\n name.toLowerCase() === 'src'\n ) {\n scheduleScriptLoad(this, 'script.setAttribute(src)');\n }\n } catch {\n // ignore\n }\n return ret;\n };\n }\n } catch {\n // ignore\n }\n\n // Also patch document.createElement('script') to attempt hooking a `src` setter.\n try {\n const doc = init.globalObj.document;\n const origCreateElement = doc?.createElement?.bind(doc);\n if (typeof origCreateElement === 'function') {\n doc.createElement = (tagName: string, ...rest: any[]) => {\n const el = origCreateElement(tagName, ...rest);\n try {\n if (typeof tagName === 'string' && tagName.toLowerCase() === 'script') {\n const desc = Object.getOwnPropertyDescriptor(el, 'src');\n // If it's configurable, wrap it; otherwise setAttribute hook will still cover most cases.\n if (!desc || desc.configurable) {\n let _src = el.getAttribute?.('src') ?? '';\n Object.defineProperty(el, 'src', {\n configurable: true,\n enumerable: true,\n get: () => _src,\n set: (v: string) => {\n _src = String(v);\n try {\n el.setAttribute?.('src', _src);\n } catch {\n // ignore\n }\n scheduleScriptLoad(el, 'script.src=');\n },\n });\n }\n }\n } catch {\n // ignore\n }\n return el;\n };\n }\n } catch {\n // ignore\n }\n };\n\n return {\n getPendingScriptLoads: () => pendingScriptLoads,\n install,\n };\n}\n","import { setTimeout as nodeSetTimeout } from 'node:timers';\n\nimport type { SwoopInit } from './types.js';\n\nexport function isNodeRuntime(): boolean {\n return (\n typeof process !== 'undefined' &&\n typeof process.versions === 'object' &&\n typeof process.versions.node === 'string'\n );\n}\n\nexport function sleep(ms: number): Promise<void> {\n return new Promise((resolve) => nodeSetTimeout(resolve, ms));\n}\n\nexport function normalizeInit(init?: SwoopInit): Required<SwoopInit> {\n return {\n engine: init?.engine ?? 'vm',\n pluck: init?.pluck ?? {},\n executeScripts: init?.executeScripts ?? true,\n timeout: init?.timeout ?? 3000,\n waitStrategy: init?.waitStrategy ?? 'networkidle',\n idleTime: init?.idleTime ?? 250,\n pollInterval: init?.pollInterval ?? 25,\n maxScripts: init?.maxScripts ?? 64,\n forwardConsole: init?.forwardConsole ?? false,\n permissiveShims: init?.permissiveShims ?? true,\n debugFetch: init?.debugFetch ?? false,\n debugProbes: init?.debugProbes ?? false,\n };\n}\n","import vm from 'node:vm';\n\nexport function defineWindowInContext(context: vm.Context, timeoutMs: number = 50): void {\n vm.runInContext(\n `\n globalThis.Window ??= function Window() {};\n try { globalThis.Window.prototype = Object.getPrototypeOf(globalThis); } catch {}\n `,\n context,\n { timeout: timeoutMs },\n );\n}\n\nexport function ensureRealmFunctionIntrinsic(context: vm.Context, timeoutMs: number = 50): void {\n vm.runInContext(\n `\n try { globalThis.Function = (function(){}).constructor; } catch {}\n `,\n context,\n { timeout: timeoutMs },\n );\n}\n\nexport function installRealmWrappers(context: vm.Context, timeoutMs: number = 50): void {\n vm.runInContext(\n `\n // timers\n if (typeof globalThis.__swoop_setTimeout === \"function\") {\n globalThis.setTimeout = (...args) => globalThis.__swoop_setTimeout(...args);\n }\n if (typeof globalThis.__swoop_clearTimeout === \"function\") {\n globalThis.clearTimeout = (...args) => globalThis.__swoop_clearTimeout(...args);\n }\n if (typeof globalThis.__swoop_setInterval === \"function\") {\n globalThis.setInterval = (...args) => globalThis.__swoop_setInterval(...args);\n }\n if (typeof globalThis.__swoop_clearInterval === \"function\") {\n globalThis.clearInterval = (...args) => globalThis.__swoop_clearInterval(...args);\n }\n if (typeof globalThis.__swoop_setImmediate === \"function\") {\n globalThis.setImmediate = (...args) => globalThis.__swoop_setImmediate(...args);\n }\n if (typeof globalThis.__swoop_clearImmediate === \"function\") {\n globalThis.clearImmediate = (...args) => globalThis.__swoop_clearImmediate(...args);\n }\n\n // microtasks / raf / idle\n if (typeof globalThis.__swoop_queueMicrotask === \"function\") {\n globalThis.queueMicrotask = (...args) => globalThis.__swoop_queueMicrotask(...args);\n }\n if (typeof globalThis.__swoop_requestAnimationFrame === \"function\") {\n globalThis.requestAnimationFrame = (...args) => globalThis.__swoop_requestAnimationFrame(...args);\n }\n if (typeof globalThis.__swoop_cancelAnimationFrame === \"function\") {\n globalThis.cancelAnimationFrame = (...args) => globalThis.__swoop_cancelAnimationFrame(...args);\n }\n if (typeof globalThis.__swoop_requestIdleCallback === \"function\") {\n globalThis.requestIdleCallback = (...args) => globalThis.__swoop_requestIdleCallback(...args);\n }\n if (typeof globalThis.__swoop_cancelIdleCallback === \"function\") {\n globalThis.cancelIdleCallback = (...args) => globalThis.__swoop_cancelIdleCallback(...args);\n }\n\n // fetch\n if (typeof globalThis.__swoop_fetch === \"function\") {\n globalThis.fetch = (...args) => globalThis.__swoop_fetch(...args);\n }\n `,\n context,\n { timeout: timeoutMs },\n );\n}\n","import vm from 'node:vm';\nimport type { PluckInit } from '../../pluck/index.js';\nimport { pluck } from '../../pluck/index.js';\n\ntype PluckLike = typeof pluck;\n\nexport interface ModuleLoaderInit {\n context: vm.Context;\n remainingMs: () => number;\n pluckInit: PluckInit;\n pluckFn?: PluckLike;\n}\n\nexport interface ModuleLoader {\n loadModule: (specifier: string, referencingUrl: string) => Promise<vm.Module>;\n linkerFor: (referencingUrl: string) => (specifier: string) => Promise<vm.Module>;\n}\n\nexport function createModuleLoader(init: ModuleLoaderInit): ModuleLoader {\n const SourceTextModule = (vm as any).SourceTextModule as\n | (new (\n code: string,\n options: any,\n ) => vm.Module)\n | undefined;\n\n const moduleCache = new Map<string, vm.Module>();\n const pluckFn = init.pluckFn ?? pluck;\n\n const loadModule = async (specifier: string, referencingUrl: string): Promise<vm.Module> => {\n if (init.remainingMs() <= 0)\n throw new Error('swoop() time budget exhausted while loading modules');\n const resolved = new URL(specifier, referencingUrl).href;\n const cached = moduleCache.get(resolved);\n if (cached) return cached;\n\n if (!SourceTextModule) {\n throw new Error(\n 'Module scripts require Node `--experimental-vm-modules` (vm.SourceTextModule is unavailable).',\n );\n }\n\n const modRes = await pluckFn(resolved, {\n ...init.pluckInit,\n timeout: Math.min(init.pluckInit.timeout ?? 30000, init.remainingMs()),\n strictContentType: false,\n throwOnHttpError: true,\n });\n const rawSource = await modRes.textUtf8();\n\n const mod = new SourceTextModule(rawSource, {\n context: init.context,\n identifier: resolved,\n initializeImportMeta: (meta: any) => {\n meta.url = resolved;\n },\n importModuleDynamically: async (spec: string) => {\n const child = await loadModule(spec, resolved);\n await child.link(linkerFor(resolved));\n await child.evaluate();\n return child;\n },\n });\n\n moduleCache.set(resolved, mod);\n return mod;\n };\n\n const linkerFor =\n (referencingUrl: string) =>\n async (specifier: string): Promise<vm.Module> => {\n return await loadModule(specifier, referencingUrl);\n };\n\n return { loadModule, linkerFor };\n}\n","export type WaitStrategy = 'timeout' | 'networkidle';\n\nexport interface WaitForSettleInit {\n strategy: WaitStrategy;\n deadlineMs: number;\n idleTimeMs: number;\n pollIntervalMs: number;\n sleep: (ms: number) => Promise<void>;\n now: () => number;\n getPendingFetches: () => number;\n getPendingScriptLoads: () => number;\n getLastAsyncActivityAt: () => number;\n}\n\nexport async function waitForSettle(init: WaitForSettleInit): Promise<{ timedOut: boolean }> {\n if (init.strategy === 'timeout') {\n await init.sleep(Math.max(0, init.deadlineMs - init.now()));\n return { timedOut: init.now() >= init.deadlineMs };\n }\n\n while (init.now() < init.deadlineMs) {\n if (\n init.getPendingFetches() === 0 &&\n init.getPendingScriptLoads() === 0 &&\n init.now() - init.getLastAsyncActivityAt() >= init.idleTimeMs\n ) {\n return { timedOut: false };\n }\n await init.sleep(init.pollIntervalMs);\n }\n\n return { timedOut: true };\n}\n","import vm from 'node:vm';\nimport { parseHTML as linkedomParseHTML } from 'linkedom';\n\nimport { pluck } from '../../pluck/index.js';\nimport { createConsoleCapture } from '../console.js';\nimport { installAsyncEnv } from '../env/async.js';\nimport { computeBaseForResolve, patchBaseElementHref, patchDocumentBaseURI } from '../env/base.js';\nimport { installBrowserShims } from '../env/browser.js';\nimport { installCookieJar } from '../env/cookie.js';\nimport { installFetchShim } from '../env/fetch.js';\nimport { createNavigationShims } from '../env/navigation.js';\nimport { installPermissiveShims } from '../env/permissive.js';\nimport { installXMLHttpRequest } from '../env/xhr.js';\nimport { synthesizeLifecycle } from '../lifecycle.js';\nimport { emitDebugProbes, installDebugProbes } from '../probes.js';\nimport type { DiscoveredScript } from '../scripts/discover.js';\nimport { createScriptLoader } from '../scripts/loader.js';\nimport type { SwoopInit, SwoopScriptError } from '../types.js';\nimport { sleep } from '../utils.js';\nimport {\n defineWindowInContext,\n ensureRealmFunctionIntrinsic,\n installRealmWrappers,\n} from '../vm/bootstrap.js';\nimport { createModuleLoader } from '../vm/modules.js';\nimport { waitForSettle } from '../wait.js';\nimport type { EngineRunResult } from './types.js';\n\nexport async function runVmEngine(args: {\n finalUrl: string;\n html: string;\n scripts: DiscoveredScript[];\n options: Required<SwoopInit>;\n totalBudgetMs: number;\n deadline: number;\n hostFetch: typeof fetch | undefined;\n}): Promise<EngineRunResult> {\n const { entries: realmConsole, record } = createConsoleCapture();\n\n const remainingMs = () => Math.max(0, args.deadline - Date.now());\n\n const { window, document } = linkedomParseHTML(args.html, { url: args.finalUrl });\n\n const pageUrl = new URL(args.finalUrl);\n\n // For resolving relative URLs, respect the document's <base href=\"...\"> if present.\n // Also enforce browser invariants for `document.baseURI` / `<base>.href` to be absolute.\n const { baseForResolve, baseEl } = computeBaseForResolve(args.finalUrl, document);\n patchDocumentBaseURI(document, baseForResolve);\n patchBaseElementHref(baseEl, baseForResolve);\n\n const documentBaseUriForDom = baseForResolve.href;\n\n // Start with a browser-ish initial document lifecycle state.\n try {\n (document as any).readyState ??= 'loading';\n } catch {\n // ignore\n }\n\n // Use a dedicated sandbox global object whose prototype is the DOM window.\n const domWindow = window as any;\n const globalObj: any = Object.create(domWindow);\n\n // Browser-ish globals\n globalObj.window = globalObj;\n globalObj.self = globalObj;\n globalObj.globalThis = globalObj;\n globalObj.document = document;\n try {\n Object.defineProperty(document, 'defaultView', { value: globalObj, configurable: true });\n } catch {\n // ignore\n }\n\n const { location: locationShim, history: historyShim } = createNavigationShims({\n pageUrl,\n onNavigate: (href) => {\n if (!args.options.debugProbes) return;\n try {\n globalObj.__swoopStats.nav.lastHref = String(href);\n } catch {}\n },\n onPopState: (state) => {\n if (args.options.debugProbes) {\n try {\n globalObj.__swoopStats.nav.pushState++;\n } catch {}\n }\n try {\n globalObj.dispatchEvent?.(new (globalObj.PopStateEvent ?? Event)('popstate', { state }));\n } catch {}\n },\n });\n\n try {\n Object.defineProperty(document, 'location', {\n configurable: true,\n get: () => locationShim,\n set: (v: string) => {\n try {\n locationShim.href = String(v);\n } catch {}\n },\n });\n } catch {\n // ignore\n }\n\n globalObj.location = locationShim;\n globalObj.history = historyShim;\n\n installBrowserShims({ globalObj, domWindow, document, documentBaseUriForDom });\n installCookieJar(document);\n\n const asyncEnv = installAsyncEnv({ globalObj, debugProbes: args.options.debugProbes });\n const noteAsyncActivity = asyncEnv.noteAsyncActivity;\n const hostSetTimeout = asyncEnv.hostSetTimeout;\n const hostClearTimeout = asyncEnv.hostClearTimeout;\n\n if (args.options.debugProbes) {\n try {\n installDebugProbes({ globalObj, hostSetTimeout });\n } catch {\n // ignore\n }\n }\n\n const fetchShim = installFetchShim({\n globalObj,\n hostFetch: args.hostFetch,\n baseForResolveHref: baseForResolve.href,\n remainingMs,\n hostSetTimeout,\n hostClearTimeout,\n noteAsyncActivity,\n debugFetch: args.options.debugFetch,\n recordDebug: (a) => record('debug', a),\n queueMicrotask: (cb) => globalObj.__swoop_queueMicrotask(cb),\n });\n\n // Browser-style event helpers on globalThis.\n const addEventListener = domWindow.addEventListener?.bind(domWindow);\n const removeEventListener = domWindow.removeEventListener?.bind(domWindow);\n const dispatchEvent = domWindow.dispatchEvent?.bind(domWindow);\n if (typeof addEventListener === 'function') globalObj.addEventListener = addEventListener;\n if (typeof removeEventListener === 'function')\n globalObj.removeEventListener = removeEventListener;\n if (typeof dispatchEvent === 'function') globalObj.dispatchEvent = dispatchEvent;\n\n // Console capture\n globalObj.console = {\n debug: (...a: unknown[]) => record('debug', a),\n info: (...a: unknown[]) => record('info', a),\n warn: (...a: unknown[]) => record('warn', a),\n error: (...a: unknown[]) => record('error', a),\n log: (...a: unknown[]) => record('log', a),\n };\n if (args.options.forwardConsole) {\n for (const level of ['debug', 'info', 'warn', 'error', 'log'] as const) {\n const original = (console as any)[level]?.bind(console);\n if (typeof original === 'function') {\n const wrapped = globalObj.console[level];\n globalObj.console[level] = (...a: unknown[]) => {\n wrapped(...a);\n original(...a);\n };\n }\n }\n }\n\n // Capture global error hooks used by browsers/frameworks.\n try {\n globalObj.onerror = (\n message: unknown,\n source?: unknown,\n line?: unknown,\n col?: unknown,\n error?: unknown,\n ) => {\n record('error', ['[window.onerror]', message, source, line, col, error]);\n };\n } catch {}\n try {\n globalObj.onunhandledrejection = (event: any) => {\n record('error', ['[unhandledrejection]', event?.reason]);\n };\n } catch {}\n try {\n globalObj.addEventListener?.('error', (event: any) => {\n record('error', [\n '[error event]',\n event?.message,\n event?.filename,\n event?.lineno,\n event?.colno,\n event?.error instanceof Error\n ? `${event.error.name}: ${event.error.message}\\n${event.error.stack ?? ''}`.trim()\n : event?.error,\n ]);\n });\n } catch {}\n\n if (args.options.permissiveShims) {\n installPermissiveShims(globalObj);\n if (!globalObj.XMLHttpRequest) {\n installXMLHttpRequest({\n globalObj,\n resolveUrl: (u: string) => {\n try {\n return new URL(u, baseForResolve.href).href;\n } catch {\n return u;\n }\n },\n remainingMs,\n hostSetTimeout,\n hostClearTimeout,\n fetch: args.hostFetch,\n });\n }\n }\n\n const context = vm.createContext(globalObj, { name: 'magpie-html/swoop' });\n defineWindowInContext(context);\n ensureRealmFunctionIntrinsic(context);\n installRealmWrappers(context);\n\n const { loadModule, linkerFor } = createModuleLoader({\n context,\n remainingMs,\n pluckInit: args.options.pluck,\n });\n\n const scriptLoader = createScriptLoader({\n globalObj,\n pageUrlHref: pageUrl.href,\n baseForResolveHref: baseForResolve.href,\n remainingMs,\n hostSetTimeout,\n totalBudgetMs: args.totalBudgetMs,\n maxDebugEvents: args.options.debugProbes ? 80 : 0,\n debug: (a) => {\n if (!args.options.debugProbes) return;\n record('debug', a);\n },\n onError: (resolvedSrc, err) => {\n const e = err as Error;\n record('error', ['[swoop] script load failed', resolvedSrc, e?.message || String(e)]);\n },\n noteAsyncActivity,\n fetchText: async (url: string) => {\n const sres = await pluck(url, {\n ...args.options.pluck,\n timeout: Math.min(args.options.pluck.timeout ?? 30000, remainingMs()),\n strictContentType: false,\n throwOnHttpError: true,\n });\n return await sres.textUtf8();\n },\n runClassicScript: (code: string, filename: string) => {\n const script = new vm.Script(code, { filename });\n script.runInContext(context, { timeout: args.totalBudgetMs });\n },\n runModuleScript: async (resolvedSrc: string, parentUrlForResolve: string) => {\n const mod = await loadModule(resolvedSrc, parentUrlForResolve);\n await mod.link(linkerFor(resolvedSrc));\n await mod.evaluate();\n },\n });\n scriptLoader.install();\n const getPendingScriptLoads = () => scriptLoader.getPendingScriptLoads();\n\n const engineErrors: SwoopScriptError[] = [];\n\n // Execute discovered scripts\n const classicScripts = args.scripts.filter((s) => !s.isModule);\n const moduleScriptsInOrder = args.scripts.filter((s) => s.isModule);\n\n for (const s of [...classicScripts, ...moduleScriptsInOrder]) {\n if (remainingMs() <= 0) {\n engineErrors.push({\n stage: 'wait',\n message: `Hard time budget (${args.totalBudgetMs}ms) exceeded while executing scripts; returning snapshot.`,\n });\n break;\n }\n\n const scriptUrl = s.kind === 'external' ? s.url : `${args.finalUrl}#inline`;\n try {\n if (s.isModule) {\n const modCode = s.code;\n const SourceTextModule = (vm as any).SourceTextModule as any;\n if (!SourceTextModule) {\n throw new Error(\n 'Module scripts require Node `--experimental-vm-modules` (vm.SourceTextModule is unavailable).',\n );\n }\n const mod = new SourceTextModule(modCode, {\n context,\n identifier: scriptUrl,\n initializeImportMeta: (meta: any) => {\n meta.url = scriptUrl;\n },\n importModuleDynamically: async (spec: string) => {\n const child = await loadModule(spec, scriptUrl);\n await child.link(linkerFor(scriptUrl));\n await child.evaluate();\n return child;\n },\n });\n\n const timeoutP = (label: string) =>\n sleep(remainingMs()).then(() => {\n throw new Error(`swoop() time budget exhausted during ${label}`);\n });\n\n const linkP = mod.link(linkerFor(scriptUrl));\n try {\n await Promise.race([linkP, timeoutP('module link')]);\n } catch (e) {\n void (linkP as any).catch?.(() => {});\n throw e;\n }\n\n const evalP = mod.evaluate();\n try {\n await Promise.race([evalP as any, timeoutP('module evaluate')]);\n } catch (e) {\n void (evalP as any).catch?.(() => {});\n throw e;\n }\n } else {\n const script = new vm.Script(s.code, { filename: scriptUrl });\n script.runInContext(context, { timeout: args.totalBudgetMs });\n }\n } catch (err) {\n const e = err as Error;\n engineErrors.push({\n stage: 'script',\n scriptUrl: s.kind === 'external' ? s.url : undefined,\n message: e.message || String(e),\n stack: e.stack,\n });\n }\n }\n\n // Fire DOM lifecycle events\n try {\n synthesizeLifecycle(context, Math.min(50, remainingMs()));\n } catch {\n // ignore\n }\n\n const settle = await waitForSettle({\n strategy:\n args.options.waitStrategy === 'timeout' || typeof globalObj.fetch !== 'function'\n ? 'timeout'\n : 'networkidle',\n deadlineMs: args.deadline,\n idleTimeMs: args.options.idleTime,\n pollIntervalMs: args.options.pollInterval,\n sleep,\n now: () => Date.now(),\n getPendingFetches: () => fetchShim.getPendingFetches(),\n getPendingScriptLoads,\n getLastAsyncActivityAt: () => asyncEnv.getLastAsyncActivityAt(),\n });\n\n if (\n settle.timedOut &&\n args.options.waitStrategy === 'networkidle' &&\n typeof globalObj.fetch === 'function'\n ) {\n engineErrors.push({\n stage: 'wait',\n message: `Hard time budget (${args.totalBudgetMs}ms) exceeded waiting for network idle; returning snapshot.`,\n });\n }\n\n const snapshot = document.documentElement?.outerHTML ?? '';\n\n if (args.options.debugProbes) {\n try {\n emitDebugProbes(globalObj, (a) => record('debug', a));\n } catch {}\n }\n\n asyncEnv.cleanup();\n\n return { snapshot, consoleEntries: realmConsole, engineErrors };\n}\n","import { pluck } from '../../pluck/index.js';\nimport { parseHTML } from '../../utils/html-parser.js';\nimport type { SwoopInit, SwoopScriptError } from '../types.js';\n\nexport type DiscoveredScript =\n | { kind: 'inline'; code: string; isModule: boolean }\n | { kind: 'external'; url: string; code: string; isModule: boolean };\n\nfunction isExecutableScriptType(type: string | null): boolean {\n if (!type) return true; // default JS\n const t = type.trim().toLowerCase();\n if (t === '') return true;\n if (t === 'text/javascript') return true;\n if (t === 'application/javascript') return true;\n if (t === 'application/ecmascript') return true;\n if (t === 'text/ecmascript') return true;\n return false;\n}\n\nfunction isModuleScript(type: string | null): boolean {\n return (type ?? '').trim().toLowerCase() === 'module';\n}\n\ntype PluckLike = typeof pluck;\n\nexport async function discoverAndFetchScripts(\n html: string,\n finalUrl: string,\n init: Required<SwoopInit>,\n pluckFn: PluckLike = pluck,\n): Promise<{ scripts: DiscoveredScript[]; errors: SwoopScriptError[] }> {\n const errors: SwoopScriptError[] = [];\n const scripts: DiscoveredScript[] = [];\n\n if (!init.executeScripts) return { scripts, errors };\n\n const doc = parseHTML(html, finalUrl);\n const baseHref = doc.querySelector('base[href]')?.getAttribute('href') ?? null;\n const baseUrl = baseHref ? new URL(baseHref, finalUrl).href : finalUrl;\n\n const scriptEls = Array.from(doc.querySelectorAll('script'));\n for (const el of scriptEls.slice(0, init.maxScripts)) {\n const type = el.getAttribute('type');\n const isModule = isModuleScript(type);\n if (!isModule && !isExecutableScriptType(type)) continue;\n\n const src = el.getAttribute('src');\n if (src) {\n const scriptUrl = new URL(src, baseUrl).href;\n try {\n const res = await pluckFn(scriptUrl, {\n ...init.pluck,\n strictContentType: false,\n throwOnHttpError: true,\n });\n const code = await res.textUtf8();\n scripts.push({ kind: 'external', url: scriptUrl, code, isModule });\n } catch (err) {\n const e = err as Error;\n errors.push({\n stage: 'script',\n scriptUrl,\n message: `Failed to fetch external script: ${e.message || String(e)}`,\n stack: e.stack,\n });\n }\n continue;\n }\n\n const code = el.textContent ?? '';\n if (code.trim().length === 0) continue;\n scripts.push({ kind: 'inline', code, isModule });\n }\n\n return { scripts, errors };\n}\n","import { pluck } from '../pluck/index.js';\nimport { runVmEngine } from './engines/vm.js';\nimport { SwoopEnvironmentError } from './errors.js';\nimport { discoverAndFetchScripts } from './scripts/discover.js';\nimport type { SwoopConsoleEntry, SwoopInit, SwoopResult, SwoopScriptError } from './types.js';\nimport { isNodeRuntime, normalizeInit } from './utils.js';\n\n// Capture host web primordials once, so sandbox/window proxies can't accidentally\n// overwrite them and cause recursion (especially in tests).\nconst HOST_FETCH: typeof fetch | undefined =\n typeof globalThis.fetch === 'function' ? globalThis.fetch.bind(globalThis) : undefined;\n\n/**\n * Execute client-side JavaScript against a DOM-only environment and snapshot the resulting HTML.\n *\n * @remarks\n * **Experimental feature**.\n *\n * @remarks\n * - Default engine (`vm`) works on regular Node.js.\n *\n * This is *not* a real browser engine:\n * - No layout/paint/CSS correctness\n * - No true navigation lifecycle\n * - Best-effort shims for browser APIs\n *\n * ⚠️ **Security**: This executes third-party JavaScript. Only use on trusted sources or in an OS sandbox.\n */\nexport async function swoop(url: string | URL, init?: SwoopInit): Promise<SwoopResult> {\n const start = Date.now();\n const options = normalizeInit(init);\n const totalBudgetMs = Math.min(options.timeout, 5000);\n const deadline = start + totalBudgetMs;\n\n if (!isNodeRuntime()) {\n throw new SwoopEnvironmentError('swoop() is currently Node.js-only.');\n }\n\n // Fetch initial HTML (use pluck for robust encoding + redirects)\n const res = await pluck(String(url), {\n ...options.pluck,\n timeout: Math.min(options.pluck.timeout ?? 30000, totalBudgetMs),\n strictContentType: false,\n throwOnHttpError: true,\n });\n const html = await res.textUtf8();\n const finalUrl = res.finalUrl;\n\n const { scripts, errors: preErrors } = await discoverAndFetchScripts(html, finalUrl, options);\n\n // Engine: vm\n let snapshot = '';\n let consoleEntries: SwoopConsoleEntry[] = [];\n let engineErrors: SwoopScriptError[] = [];\n\n const r = await runVmEngine({\n finalUrl,\n html,\n scripts,\n options,\n totalBudgetMs,\n deadline,\n hostFetch: HOST_FETCH,\n });\n snapshot = r.snapshot;\n consoleEntries = r.consoleEntries;\n engineErrors = r.engineErrors;\n\n const end = Date.now();\n return {\n url: finalUrl,\n html: snapshot,\n console: consoleEntries,\n errors: [...preErrors, ...engineErrors],\n timing: {\n start,\n end,\n duration: end - start,\n },\n };\n}\n"]}
1
+ {"version":3,"sources":["../src/content/quality.ts","../src/content/readability.ts","../src/content/extract.ts","../src/content/html-to-text/extract.ts","../src/utils/normalize-url.ts","../src/feed/atom/clean-text.ts","../src/feed/atom/parse-date.ts","../src/feed/atom/extract-entry.ts","../src/feed/atom/xml-parser.ts","../src/feed/atom/extract-feed.ts","../src/feed/atom/parse.ts","../src/feed/detect.ts","../src/feed/json-feed/validate.ts","../src/feed/json-feed/parse.ts","../src/feed/normalize.ts","../src/feed/rss/clean-text.ts","../src/feed/rss/parse-date.ts","../src/feed/rss/xml-parser.ts","../src/feed/rss/extract-channel.ts","../src/feed/rss/extract-item.ts","../src/feed/rss/extract-namespaces.ts","../src/feed/rss/parse.ts","../src/feed/parse.ts","../src/pluck/types.ts","../src/pluck/encoding.ts","../src/pluck/pluck.ts","../src/utils/html-parser.ts","../src/utils/meta-helpers.ts","../src/metadata/opengraph/extract.ts","../src/metadata/schema-org/parse-json-ld.ts","../src/metadata/schema-org/extract.ts","../src/metadata/seo/extract.ts","../src/metadata/twitter-card/extract.ts","../src/gather/website/description.ts","../src/utils/link-helpers.ts","../src/metadata/icons/extract.ts","../src/gather/website/image.ts","../src/metadata/language/extract.ts","../src/gather/website/language.ts","../src/metadata/links/extract.ts","../src/gather/website/links.ts","../src/utils/clean-title.ts","../src/gather/website/title.ts","../src/metadata/canonical/extract.ts","../src/gather/website/url.ts","../src/gather/article/index.ts","../src/gather/feed.ts","../src/metadata/feed-discovery/heuristics.ts","../src/metadata/feed-discovery/extract.ts","../src/gather/website/icon.ts","../src/gather/website/index.ts","../src/metadata/analytics/extract.ts","../src/metadata/assets/extract.ts","../src/metadata/copyright/extract.ts","../src/metadata/dublin-core/extract.ts","../src/metadata/geo/extract.ts","../src/metadata/monetization/extract.ts","../src/metadata/news/extract.ts","../src/metadata/pagination/extract.ts","../src/metadata/robots/parse-directives.ts","../src/metadata/robots/extract.ts","../src/metadata/security/extract.ts","../src/metadata/sitemap-discovery/heuristics.ts","../src/metadata/sitemap-discovery/extract.ts","../src/metadata/social-profiles/extract.ts","../src/metadata/verification/extract.ts","../src/swoop/errors.ts","../src/swoop/console.ts","../src/swoop/env/async.ts","../src/swoop/env/base.ts","../src/swoop/env/browser.ts","../src/swoop/env/cookie.ts","../src/swoop/env/fetch.ts","../src/swoop/env/navigation.ts","../src/swoop/env/permissive.ts","../src/swoop/env/xhr.ts","../src/swoop/lifecycle.ts","../src/swoop/probes.ts","../src/swoop/scripts/loader.ts","../src/swoop/utils.ts","../src/swoop/vm/bootstrap.ts","../src/swoop/vm/modules.ts","../src/swoop/wait.ts","../src/swoop/engines/vm.ts","../src/swoop/scripts/discover.ts","../src/swoop/swoop.ts"],"names":["Readability","countWords","decodeEntities","extractContent","extractAtomDate","extractPerson","extractPersons","extractLink","extractLinks","extractCategory","extractCategories","extractTextContent","normalizeFeedUrls","stripCDATA","normalizeWhitespace","cleanText","removeDoctype","removeComments","parseElement","extractCDATA","restoreCDATA","parseAttributes","findClosingTag","querySelector","querySelectorAll","normalizeItemUrls","validate","normalizeOptions","linkedomParseHTML","getStringProperty","parseSizeString","getEffectiveBaseUrl","extractImages","nodeSetTimeout","nodeClearTimeout","nodeSetInterval","nodeClearInterval","nodeSetImmediate","nodeClearImmediate","init","vm","code"],"mappings":"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","file":"index.cjs","sourcesContent":["/**\n * Content quality assessment.\n *\n * @remarks\n * Analyzes extracted content to provide quality metrics.\n *\n * @packageDocumentation\n */\n\nimport type { ContentQuality, ExtractedContent } from './types.js';\n\n/**\n * Calculate word count from text.\n *\n * @param text - Text to count words in\n * @returns Number of words\n */\nexport function countWords(text: string): number {\n // Remove extra whitespace and split on word boundaries\n const words = text.trim().split(/\\s+/).filter(Boolean);\n return words.length;\n}\n\n/**\n * Calculate reading time in minutes.\n *\n * @remarks\n * Uses average reading speed of 200 words per minute.\n *\n * @param wordCount - Number of words\n * @returns Estimated reading time in minutes\n */\nexport function calculateReadingTime(wordCount: number): number {\n const wordsPerMinute = 200;\n const minutes = wordCount / wordsPerMinute;\n return Math.max(1, Math.round(minutes));\n}\n\n/**\n * Count paragraphs in HTML content.\n *\n * @param html - HTML content\n * @returns Number of paragraph tags\n */\nfunction countParagraphs(html: string): number {\n const matches = html.match(/<p[^>]*>/gi);\n return matches ? matches.length : 0;\n}\n\n/**\n * Count images in HTML content.\n *\n * @param html - HTML content\n * @returns Number of image tags\n */\nfunction countImages(html: string): number {\n const matches = html.match(/<img[^>]*>/gi);\n return matches ? matches.length : 0;\n}\n\n/**\n * Count links in HTML content.\n *\n * @param html - HTML content\n * @returns Number of anchor tags\n */\nfunction countLinks(html: string): number {\n const matches = html.match(/<a[^>]*>/gi);\n return matches ? matches.length : 0;\n}\n\n/**\n * Calculate link density.\n *\n * @remarks\n * Ratio of link text to total text. Lower is generally better for articles.\n *\n * @param html - HTML content\n * @param textContent - Plain text content\n * @returns Link density (0-1)\n */\nfunction calculateLinkDensity(html: string, textContent: string): number {\n // Extract all link text\n const linkMatches = html.match(/<a[^>]*>(.*?)<\\/a>/gi);\n if (!linkMatches) {\n return 0;\n }\n\n const linkText = linkMatches.map((match) => match.replace(/<[^>]*>/g, '')).join(' ');\n\n const linkLength = linkText.length;\n const totalLength = textContent.length;\n\n if (totalLength === 0) {\n return 0;\n }\n\n return Math.min(1, linkLength / totalLength);\n}\n\n/**\n * Calculate average words per sentence.\n *\n * @param text - Text content\n * @returns Average words per sentence\n */\nfunction calculateAvgWordsPerSentence(text: string): number {\n // Split on sentence boundaries (., !, ?)\n const sentences = text.split(/[.!?]+/).filter((s) => s.trim().length > 0);\n\n if (sentences.length === 0) {\n return 0;\n }\n\n const totalWords = countWords(text);\n return Math.round(totalWords / sentences.length);\n}\n\n/**\n * Calculate quality score.\n *\n * @remarks\n * Composite score based on multiple factors:\n * - Length (longer is better, up to a point)\n * - Link density (lower is better)\n * - Paragraph count (more is better)\n * - Images (some is good, too many is bad)\n *\n * @param metrics - Quality metrics\n * @returns Score from 0-100\n */\nfunction calculateQualityScore(metrics: Omit<ContentQuality, 'qualityScore'>): number {\n let score = 0;\n\n // Length score (0-30 points)\n // Optimal: 1000-5000 words\n if (metrics.wordCount >= 1000 && metrics.wordCount <= 5000) {\n score += 30;\n } else if (metrics.wordCount >= 500 && metrics.wordCount < 1000) {\n score += 20;\n } else if (metrics.wordCount < 500) {\n score += 10;\n } else {\n score += 15; // Very long articles\n }\n\n // Link density score (0-25 points)\n // Lower is better for articles\n if (metrics.linkDensity < 0.1) {\n score += 25;\n } else if (metrics.linkDensity < 0.2) {\n score += 15;\n } else if (metrics.linkDensity < 0.3) {\n score += 5;\n }\n\n // Paragraph score (0-20 points)\n if (metrics.paragraphCount >= 10) {\n score += 20;\n } else if (metrics.paragraphCount >= 5) {\n score += 15;\n } else if (metrics.paragraphCount >= 3) {\n score += 10;\n }\n\n // Image score (0-15 points)\n // Some images are good, too many is suspicious\n if (metrics.imageCount >= 1 && metrics.imageCount <= 10) {\n score += 15;\n } else if (metrics.imageCount === 0) {\n score += 10;\n } else {\n score += 5;\n }\n\n // Readability score (0-10 points)\n // Optimal: 15-20 words per sentence\n if (metrics.avgWordsPerSentence >= 15 && metrics.avgWordsPerSentence <= 25) {\n score += 10;\n } else if (metrics.avgWordsPerSentence >= 10 && metrics.avgWordsPerSentence <= 30) {\n score += 5;\n }\n\n return Math.min(100, score);\n}\n\n/**\n * Assess content quality.\n *\n * @remarks\n * Analyzes extracted content and returns comprehensive quality metrics.\n *\n * @param content - Extracted content\n * @returns Quality assessment\n *\n * @example\n * ```typescript\n * const content = extractContent(html);\n * if (content.success) {\n * const quality = assessContentQuality(content);\n * console.log(`Quality score: ${quality.qualityScore}/100`);\n * console.log(`Reading time: ${quality.readingTime} minutes`);\n * }\n * ```\n */\nexport function assessContentQuality(content: ExtractedContent): ContentQuality {\n const wordCount = countWords(content.textContent);\n const charCount = content.textContent.length;\n const readingTime = calculateReadingTime(wordCount);\n const avgWordsPerSentence = calculateAvgWordsPerSentence(content.textContent);\n const paragraphCount = countParagraphs(content.content);\n const imageCount = countImages(content.content);\n const linkCount = countLinks(content.content);\n const linkDensity = calculateLinkDensity(content.content, content.textContent);\n\n const metrics = {\n wordCount,\n charCount,\n readingTime,\n avgWordsPerSentence,\n paragraphCount,\n imageCount,\n linkCount,\n linkDensity,\n };\n\n const qualityScore = calculateQualityScore(metrics);\n\n return {\n ...metrics,\n qualityScore,\n };\n}\n","/**\n * Mozilla Readability wrapper with linkedom.\n *\n * @remarks\n * Provides a clean interface to Mozilla Readability using linkedom as the DOM implementation.\n *\n * @packageDocumentation\n */\n\nimport { Readability } from '@mozilla/readability';\nimport type { ContentExtractionOptions } from './types.js';\n\n/**\n * Readability result from Mozilla's library.\n */\nexport interface ReadabilityResult {\n title: string;\n content: string;\n textContent: string;\n excerpt: string;\n byline: string | null;\n siteName: string | null;\n lang: string | null;\n dir: string | null;\n publishedTime: string | null;\n length: number;\n}\n\n/**\n * Check if HTML content is probably readerable.\n *\n * @remarks\n * Quick check to determine if content extraction is likely to succeed.\n * This is a heuristic check and may produce false positives/negatives.\n *\n * @param doc - Pre-parsed Document to check\n * @param options - Readability check options\n * @returns True if content appears to be an article\n *\n * @example\n * ```typescript\n * import { parseHTML } from '../utils/html-parser.js';\n *\n * const doc = parseHTML(html);\n * if (isProbablyReaderable(doc)) {\n * const result = extractContent(doc);\n * }\n * ```\n */\nexport function isProbablyReaderable(\n doc: Document,\n options?: {\n minContentLength?: number;\n minScore?: number;\n },\n): boolean {\n try {\n // Simple heuristic: check for common article indicators\n const hasArticleTag = !!doc.querySelector('article');\n const hasMainTag = !!doc.querySelector('main');\n const hasContentDivs = doc.querySelectorAll('div.content, div.article, div.post').length > 0;\n const hasParagraphs = doc.querySelectorAll('p').length >= 3;\n\n // Calculate rough content length\n const textContent = doc.textContent || '';\n const contentLength = textContent.trim().length;\n const minLength = options?.minContentLength || 140;\n\n return (\n contentLength >= minLength && (hasArticleTag || hasMainTag || hasContentDivs || hasParagraphs)\n );\n } catch {\n return false;\n }\n}\n\n/**\n * Extract article content using Mozilla Readability.\n *\n * @remarks\n * Runs Readability extraction on a pre-parsed Document.\n * The original document is not modified (uses cloned document).\n *\n * @param doc - Pre-parsed Document to extract from\n * @param options - Extraction options\n * @returns Readability result or null if extraction failed\n *\n * @example\n * ```typescript\n * import { parseHTML } from '../utils/html-parser.js';\n * import { extractSEO } from '../metadata/index.js';\n *\n * const doc = parseHTML(html);\n * const metadata = extractSEO(doc);\n * const content = extractWithReadability(doc, { baseUrl: 'https://example.com' });\n *\n * if (content) {\n * console.log(content.title);\n * console.log(content.textContent);\n * }\n * ```\n */\nexport function extractWithReadability(\n doc: Document,\n options: ContentExtractionOptions = {},\n): ReadabilityResult | null {\n // Clone document to avoid mutations\n const documentClone = doc.cloneNode(true) as Document;\n\n // Create Readability instance with options\n const reader = new Readability(documentClone, {\n debug: options.debug || false,\n charThreshold: options.charThreshold || 500,\n maxElemsToParse: options.maxElemsToParse || 0,\n keepClasses: options.keepClasses || false,\n classesToPreserve: options.classesToPreserve || [],\n disableJSONLD: options.disableJSONLD || false,\n });\n\n // Parse and return result\n const article = reader.parse();\n\n if (!article) {\n return null;\n }\n\n return {\n title: article.title || '',\n content: article.content || '',\n textContent: article.textContent || '',\n excerpt: article.excerpt || '',\n byline: article.byline || null,\n siteName: article.siteName || null,\n lang: article.lang || null,\n dir: article.dir || null,\n publishedTime: article.publishedTime || null,\n length: article.length || 0,\n };\n}\n","/**\n * Main content extraction module.\n *\n * @remarks\n * Extracts article content from HTML using Mozilla Readability.\n * Never throws exceptions - always returns a ContentResult.\n *\n * @packageDocumentation\n */\n\nimport { calculateReadingTime } from './quality.js';\nimport { extractWithReadability, isProbablyReaderable } from './readability.js';\nimport type {\n ContentExtractionOptions,\n ContentResult,\n ExtractedContent,\n ExtractionErrorType,\n ExtractionFailure,\n} from './types.js';\n\n/**\n * Count words in text.\n *\n * @param text - Text to count words in\n * @returns Number of words\n */\nfunction countWords(text: string): number {\n const words = text.trim().split(/\\s+/).filter(Boolean);\n return words.length;\n}\n\n/**\n * Create an extraction failure result.\n *\n * @param errorType - Type of error\n * @param error - Error message\n * @param readerable - Whether content passed readability check\n * @param extractionTime - Time spent attempting extraction\n * @param details - Additional error details\n * @returns Extraction failure object\n */\nfunction createFailure(\n errorType: ExtractionErrorType,\n error: string,\n readerable: boolean,\n extractionTime: number,\n details?: unknown,\n): ExtractionFailure {\n const result: ExtractionFailure = {\n success: false,\n error,\n errorType,\n readerable,\n extractionTime,\n };\n\n if (details !== undefined) {\n result.details = details;\n }\n\n return result;\n}\n\n/**\n * Extract article content from HTML.\n *\n * @remarks\n * Uses Mozilla Readability to extract clean article content from a pre-parsed Document.\n * This function never throws exceptions - always returns a ContentResult.\n *\n * Error handling:\n * - Returns success: false for any extraction failure\n * - Categorizes errors by type for better handling\n * - Includes extraction time even for failures\n *\n * @param doc - Pre-parsed Document to extract content from\n * @param options - Extraction options\n * @returns Extraction result (success or failure)\n *\n * @example\n * ```typescript\n * import { parseHTML } from '../utils/html-parser.js';\n * import { extractSEO } from '../metadata/index.js';\n *\n * const doc = parseHTML(html);\n * const metadata = extractSEO(doc);\n * const content = extractContent(doc, {\n * baseUrl: 'https://example.com/article',\n * charThreshold: 300,\n * checkReadability: true,\n * });\n *\n * if (content.success) {\n * console.log(content.title);\n * console.log(content.wordCount);\n * console.log(`${content.readingTime} min read`);\n * } else {\n * console.error(content.error);\n * }\n * ```\n */\nexport function extractContent(\n doc: Document,\n options: ContentExtractionOptions = {},\n): ContentResult {\n const startTime = Date.now();\n\n // Validate input\n if (!doc || typeof doc !== 'object' || !doc.documentElement) {\n return createFailure(\n 'INVALID_HTML',\n 'Input must be a valid Document object',\n false,\n Date.now() - startTime,\n );\n }\n\n // Check readability if requested\n let readerable = false;\n if (options.checkReadability) {\n try {\n readerable = isProbablyReaderable(doc);\n if (!readerable) {\n return createFailure(\n 'NOT_READERABLE',\n 'Content does not appear to be a readable article',\n false,\n Date.now() - startTime,\n );\n }\n } catch (error) {\n // Readability check failed, but continue anyway\n if (options.debug) {\n console.warn('Readability check failed:', error);\n }\n }\n }\n\n // Extract content with Readability\n let article: ReturnType<typeof extractWithReadability> | null;\n try {\n article = extractWithReadability(doc, options);\n } catch (error) {\n const errorMessage = error instanceof Error ? error.message : String(error);\n return createFailure(\n 'PARSE_ERROR',\n `Failed to parse HTML: ${errorMessage}`,\n readerable,\n Date.now() - startTime,\n error,\n );\n }\n\n // Check if extraction succeeded\n if (!article) {\n return createFailure(\n 'EXTRACTION_FAILED',\n 'Readability could not extract content from this page',\n readerable,\n Date.now() - startTime,\n );\n }\n\n // Check if content meets minimum requirements\n if (!article.title && !article.textContent) {\n return createFailure(\n 'EXTRACTION_FAILED',\n 'Extracted content has no title or text',\n readerable,\n Date.now() - startTime,\n );\n }\n\n // Calculate metrics\n const wordCount = countWords(article.textContent);\n const readingTime = calculateReadingTime(wordCount);\n\n // Build success result\n const result: ExtractedContent = {\n success: true,\n title: article.title,\n content: article.content,\n textContent: article.textContent,\n excerpt: article.excerpt,\n length: article.length,\n wordCount,\n readingTime,\n readerable: readerable || true, // If we got here, it was readable enough\n extractionTime: Date.now() - startTime,\n };\n\n // Add optional fields if present\n if (article.byline) {\n result.byline = article.byline;\n }\n if (article.siteName) {\n result.siteName = article.siteName;\n }\n if (article.lang) {\n result.lang = article.lang;\n }\n if (article.dir) {\n result.dir = article.dir as 'ltr' | 'rtl';\n }\n if (article.publishedTime) {\n result.publishedTime = article.publishedTime;\n }\n\n return result;\n}\n","/**\n * HTML to text conversion.\n *\n * @remarks\n * Convert HTML to plain text using a zero-dependency streaming tokenizer.\n * Pure, deterministic transformation suitable for logs, previews, classification,\n * and search indexing. Preserves essential structure by inserting newlines at\n * block boundaries, handles entities, and provides configurable options.\n *\n * @packageDocumentation\n */\n\nimport type { HtmlToTextOptions } from './types.js';\n\n/**\n * Convert an HTML string to plain text.\n *\n * @remarks\n * This function uses a streaming tokenizer to parse HTML and extract text content.\n * It handles block elements, whitespace preservation, HTML entities, tables, and more.\n *\n * Features:\n * - Preserves document structure with appropriate line breaks\n * - Handles HTML entities (numeric and common named entities)\n * - Configurable link and image handling\n * - Table rendering with configurable cell separators\n * - Whitespace preservation for code/pre blocks\n * - Optional hard-wrapping at column width\n *\n * @param html - HTML string (fragment or full document)\n * @param options - Conversion options\n * @returns Plain text string\n *\n * @throws {TypeError} If html is not a string\n *\n * @example\n * ```typescript\n * const html = '<div><h1>Hello</h1><p>World!</p></div>';\n * const text = htmlToText(html);\n * console.log(text); // \"Hello\\n\\nWorld!\"\n * ```\n *\n * @example\n * ```typescript\n * const html = '<a href=\"https://example.com\">Visit</a>';\n * const text = htmlToText(html, { links: 'inline' });\n * console.log(text); // \"Visit (https://example.com)\"\n * ```\n */\nexport function htmlToText(html: string, options: HtmlToTextOptions = {}): string {\n if (typeof html !== 'string') {\n throw new TypeError('Expected html to be a string');\n }\n\n const settings = normalizeOptions(options);\n\n // Fast path: empty input\n if (html.length === 0) {\n return '';\n }\n\n // Sets and constants for classification\n const preservedTagSet = toSet(settings.preserveTags);\n const excludedTagSet = toSet(\n settings.excludeTags.concat(settings.mode === 'document' ? ['head'] : []),\n );\n const blockTagSet = BLOCK_TAG_SET;\n\n // Table state\n let insideTable = 0;\n let cellBuffer: string[] = [];\n const cellSep = settings.tableCellSeparator === 'tab' ? '\\t' : ' ';\n\n // Stack state\n const tagStack: string[] = [];\n let preserveWhitespace = false;\n let excludeDepth = 0;\n\n // Link/image context\n let currentAnchorHref: string | null = null;\n let inAnchor = false;\n let anchorHasText = false;\n\n // Output buffer\n const out: string[] = [];\n\n // Simple streaming tokenizer\n const length = html.length;\n let i = 0;\n\n while (i < length) {\n const ch = html.charCodeAt(i);\n\n if (ch === 60 /* < */) {\n // Parse tag\n const tagStart = i;\n const end = html.indexOf('>', tagStart + 1);\n\n if (end === -1) {\n // Malformed tail: treat as text\n emitText(html.slice(i), out, settings, preserveWhitespace);\n break;\n }\n\n const rawTag = html.slice(tagStart + 1, end);\n i = end + 1;\n\n const isClosing = rawTag[0] === '/';\n const tagBody = isClosing ? rawTag.slice(1) : rawTag;\n const spaceIdx = indexOfSpace(tagBody);\n let tagName = (spaceIdx === -1 ? tagBody : tagBody.slice(0, spaceIdx)).toLowerCase();\n\n // Remove trailing slash for self-closing tags without space (e.g., <br/>)\n if (tagName.endsWith('/')) {\n tagName = tagName.slice(0, -1);\n }\n\n if (isClosing) {\n // Closing tag\n handleTagClose(tagName);\n } else {\n // Opening or self-closing tag\n const selfClosing = rawTag.endsWith('/') || SELF_CLOSING_TAG_SET.has(tagName);\n const attrs = spaceIdx === -1 ? '' : tagBody.slice(spaceIdx + 1);\n handleTagOpen(tagName, attrs, selfClosing);\n }\n continue;\n }\n\n // Text node\n const nextTag = html.indexOf('<', i);\n const text = nextTag === -1 ? html.slice(i) : html.slice(i, nextTag);\n i = nextTag === -1 ? length : nextTag;\n\n if (excludeDepth > 0) {\n continue;\n }\n\n if (insideTable > 0) {\n // Accumulate raw text for the current cell\n cellBuffer.push(text);\n } else {\n // Track if anchor has text before potentially suppressing it\n if (inAnchor && /\\S/.test(text)) {\n anchorHasText = true;\n }\n\n // Suppress text content when inside a link that should be removed\n const shouldSuppressText = inAnchor && settings.links === 'remove';\n if (!shouldSuppressText) {\n emitText(text, out, settings, preserveWhitespace);\n }\n }\n }\n\n let result = out.join('');\n\n // Capture leading/trailing whitespace before collapse (for trim: false)\n const leadingMatch = result.match(/^(\\s*)/);\n const trailingMatch = result.match(/(\\s*)$/);\n const leadingWs = leadingMatch ? leadingMatch[1] : '';\n const trailingWs = trailingMatch ? trailingMatch[1] : '';\n\n if (settings.collapseWhitespace) {\n result = collapseWhitespace(result, settings.maxNewlines, settings.trim);\n }\n\n if (settings.wrap != null && settings.wrap > 0) {\n result = hardWrap(result, settings.wrap);\n }\n\n // Remove preserve markers (they were used during collapse and wrap)\n result = result.replace(new RegExp(PRESERVE_OPEN, 'g'), '');\n result = result.replace(new RegExp(PRESERVE_CLOSE, 'g'), '');\n\n if (settings.trim) {\n result = result.trim();\n } else if (settings.collapseWhitespace && (leadingWs || trailingWs)) {\n // Restore some whitespace when trim: false but collapse removed it\n // At least preserve one space if there was any leading/trailing whitespace\n if (leadingWs && !result.startsWith(' ') && !result.startsWith('\\n')) {\n result = ` ${result}`;\n }\n if (trailingWs && !result.endsWith(' ') && !result.endsWith('\\n')) {\n result = `${result} `;\n }\n }\n\n return result;\n\n // --- Helper functions ---\n\n function pushTag(name: string): void {\n tagStack.push(name);\n if (preservedTagSet.has(name)) {\n preserveWhitespace = true;\n }\n if (excludedTagSet.has(name)) {\n excludeDepth += 1;\n }\n if (name === 'table') {\n insideTable += 1;\n }\n }\n\n function popTag(name: string): void {\n // Pop until matching name (best-effort against malformed HTML)\n for (let idx = tagStack.length - 1; idx >= 0; idx -= 1) {\n const t = tagStack[idx];\n tagStack.length = idx;\n\n if (preservedTagSet.has(t)) {\n preserveWhitespace = false;\n }\n if (excludedTagSet.has(t)) {\n excludeDepth = Math.max(0, excludeDepth - 1);\n }\n if (t === 'table') {\n insideTable = Math.max(0, insideTable - 1);\n }\n if (t === name) {\n break;\n }\n }\n }\n\n function handleTagOpen(tagName: string, attrs: string, selfClosing: boolean): void {\n if (excludedTagSet.has(tagName)) {\n pushTag(tagName);\n return;\n }\n\n if (tagName === 'br') {\n out.push('\\n');\n return;\n }\n\n if (tagName === 'a') {\n currentAnchorHref = extractAttr(attrs, 'href');\n inAnchor = true;\n anchorHasText = false;\n pushTag(tagName);\n if (selfClosing) {\n handleTagClose(tagName);\n }\n return;\n }\n\n if (tagName === 'img') {\n if (settings.images === 'alt') {\n const alt = extractAttr(attrs, 'alt');\n if (alt) {\n emitText(alt, out, settings, true);\n }\n }\n // If we are between anchors, keep a separating space to avoid collapsing words\n if (inAnchor) {\n out.push(' ');\n }\n return;\n }\n\n if (tagName === 'td' || tagName === 'th') {\n if (insideTable > 0) {\n cellBuffer = [];\n }\n pushTag(tagName);\n if (selfClosing) {\n handleTagClose(tagName);\n }\n return;\n }\n\n if (tagName === 'tr') {\n pushTag(tagName);\n if (selfClosing) {\n handleTagClose(tagName);\n }\n return;\n }\n\n // If entering a whitespace-preserved tag and previous output isn't at line start,\n // insert a newline to separate block context from pre/code content.\n if (preservedTagSet.has(tagName) && tagName !== 'code') {\n ensureNewline(out);\n }\n\n pushTag(tagName);\n if (selfClosing) {\n handleTagClose(tagName);\n }\n }\n\n function handleTagClose(tagName: string): void {\n if (excludedTagSet.has(tagName)) {\n popTag(tagName);\n return;\n }\n\n if (tagName === 'a') {\n const shouldInline =\n !!currentAnchorHref &&\n (settings.links === 'inline' || (!anchorHasText && settings.images === 'remove'));\n\n if (shouldInline && currentAnchorHref) {\n const prev = out.length > 0 ? out[out.length - 1] : '';\n const needSpace = anchorHasText\n ? prev.length > 0 && !prev.endsWith(' ') && !prev.endsWith('\\n')\n : true;\n\n if (needSpace) {\n out.push(' ');\n }\n out.push('(', currentAnchorHref, ')');\n }\n\n currentAnchorHref = null;\n inAnchor = false;\n anchorHasText = false;\n popTag(tagName);\n return;\n }\n\n if (tagName === 'td' || tagName === 'th') {\n if (insideTable > 0) {\n const text = cellBuffer.join('');\n const normalized = settings.collapseWhitespace\n ? collapseWhitespace(\n processText(text, settings, preserveWhitespace),\n settings.maxNewlines,\n settings.trim,\n )\n : processText(text, settings, preserveWhitespace);\n\n // Append separator (we'll remove trailing separator on row close)\n out.push(normalized, cellSep);\n cellBuffer = [];\n }\n popTag(tagName);\n return;\n }\n\n if (tagName === 'tr') {\n // Remove trailing cell separator if present\n if (out.length > 0 && out[out.length - 1] === cellSep) {\n out.pop();\n }\n ensureNewline(out);\n popTag(tagName);\n return;\n }\n\n if (blockTagSet.has(tagName)) {\n // Block elements end with a newline\n ensureNewline(out);\n }\n\n popTag(tagName);\n }\n}\n\n// --- Normalization and helpers ---\n\ninterface NormalizedOptions {\n mode: 'fragment' | 'document';\n links: 'text' | 'inline' | 'remove';\n images: 'alt' | 'remove';\n collapseWhitespace: boolean;\n maxNewlines: number;\n wrap: number | null;\n tableCellSeparator: 'tab' | 'space';\n excludeTags: string[];\n decodeEntities: boolean;\n preserveTags: string[];\n trim: boolean;\n}\n\nfunction normalizeOptions(o: HtmlToTextOptions): NormalizedOptions {\n return {\n mode: o.mode === 'document' ? 'document' : 'fragment',\n links: o.links === 'inline' || o.links === 'remove' ? o.links : 'text',\n images: o.images === 'remove' ? 'remove' : 'alt',\n collapseWhitespace: o.collapseWhitespace !== false,\n maxNewlines: typeof o.maxNewlines === 'number' && o.maxNewlines >= 1 ? o.maxNewlines : 2,\n wrap: typeof o.wrap === 'number' && o.wrap > 0 ? Math.floor(o.wrap) : null,\n tableCellSeparator: o.tableCellSeparator === 'space' ? 'space' : 'tab',\n excludeTags: Array.isArray(o.excludeTags)\n ? o.excludeTags.map((x) => String(x).toLowerCase())\n : ['script', 'style', 'noscript', 'template', 'svg', 'canvas'],\n decodeEntities: o.decodeEntities !== false,\n preserveTags: Array.isArray(o.preserveTags)\n ? o.preserveTags.map((x) => String(x).toLowerCase())\n : ['pre', 'code', 'textarea'],\n trim: o.trim !== false,\n };\n}\n\nfunction toSet(arr: string[]): Set<string> {\n return new Set(arr);\n}\n\nfunction emitText(\n text: string,\n out: string[],\n settings: NormalizedOptions,\n preserveWhitespace: boolean,\n): void {\n if (text.length === 0) {\n return;\n }\n const processed = processText(text, settings, preserveWhitespace);\n out.push(processed);\n}\n\nfunction processText(\n text: string,\n settings: NormalizedOptions,\n preserveWhitespace: boolean,\n): string {\n let t = text;\n\n if (settings.decodeEntities) {\n t = decodeEntities(t);\n }\n\n if (preserveWhitespace) {\n // Mark region to bypass global collapse\n return PRESERVE_OPEN + t + PRESERVE_CLOSE;\n }\n\n if (settings.collapseWhitespace) {\n // Collapse all whitespace (including newlines) to single spaces\n t = t.replace(/[\\t\\f\\v\\r\\n ]+/g, ' ');\n }\n\n return t;\n}\n\nfunction ensureNewline(out: string[]): void {\n if (out.length === 0) {\n return;\n }\n const last = out[out.length - 1];\n if (last.endsWith('\\n')) {\n return;\n }\n out.push('\\n');\n}\n\nfunction collapseWhitespace(input: string, maxNewlines: number, trim: boolean): string {\n if (input.indexOf(PRESERVE_OPEN) === -1) {\n return collapseWhitespaceGlobal(input, maxNewlines, trim);\n }\n\n let result = '';\n let idx = 0;\n\n while (idx < input.length) {\n const open = input.indexOf(PRESERVE_OPEN, idx);\n if (open === -1) {\n result += collapseWhitespaceGlobal(input.slice(idx), maxNewlines, trim);\n break;\n }\n\n result += collapseWhitespaceGlobal(input.slice(idx, open), maxNewlines, trim);\n const close = input.indexOf(PRESERVE_CLOSE, open + 1);\n\n if (close === -1) {\n // Unmatched: treat rest as normal\n result += collapseWhitespaceGlobal(input.slice(open + 1), maxNewlines, trim);\n break;\n }\n\n // Keep preserved content with markers (for hardWrap to respect)\n result += input.slice(open, close + 1);\n idx = close + 1;\n }\n\n return result;\n}\n\nfunction collapseWhitespaceGlobal(input: string, maxNewlines: number, trim: boolean): string {\n let s = input.replace(/[\\u00A0]/g, ' '); // nbsp → space early\n // Normalize CRLF/CR to LF\n s = s.replace(/\\r\\n?|\\u2028|\\u2029/g, '\\n');\n\n if (trim) {\n // Aggressive collapse: remove spaces around newlines\n s = s.replace(/[ \\t\\f\\v]+\\n/g, '\\n');\n s = s.replace(/\\n[ \\t\\f\\v]+/g, '\\n');\n }\n\n // Limit newline runs\n const re = new RegExp(`\\\\n{${maxNewlines + 1},}`, 'g');\n s = s.replace(re, '\\n'.repeat(maxNewlines));\n // Collapse remaining horizontal whitespace\n s = s.replace(/[ \\t\\f\\v]{2,}/g, ' ');\n return s;\n}\n\nfunction hardWrap(input: string, width: number): string {\n const lines = input.split('\\n');\n const wrapped: string[] = [];\n\n for (const line of lines) {\n // Don't wrap lines that contain preserved content\n if (line.includes(PRESERVE_OPEN)) {\n wrapped.push(line);\n continue;\n }\n\n if (line.length <= width) {\n wrapped.push(line);\n continue;\n }\n\n let start = 0;\n while (start < line.length) {\n const end = Math.min(start + width, line.length);\n wrapped.push(line.slice(start, end));\n start = end;\n }\n }\n\n return wrapped.join('\\n');\n}\n\nfunction decodeEntities(s: string): string {\n // Numeric (decimal and hex)\n s = s.replace(/&#(\\d+);/g, (_, d) => safeFromCodePoint(Number(d)));\n s = s.replace(/&#x([0-9a-fA-F]+);/g, (_, h) => safeFromCodePoint(Number.parseInt(h, 16)));\n // Common named entities\n s = s.replace(/&([a-zA-Z]+);/g, (_, name) => NAMED_ENTITIES[name] || `&${name};`);\n return s;\n}\n\nfunction safeFromCodePoint(cp: number): string {\n if (!Number.isFinite(cp) || cp < 0 || cp > 0x10ffff) {\n return '';\n }\n try {\n return String.fromCodePoint(cp);\n } catch {\n return '';\n }\n}\n\nfunction extractAttr(attrs: string, name: string): string | null {\n const re = new RegExp(`(?:^|\\\\s)${name}\\\\s*=\\\\s*(\"([^\"]*)\"|'([^']*)'|([^\\\\s>]+))`, 'i');\n const m = attrs.match(re);\n if (!m) {\n return null;\n }\n const val = m[2] ?? m[3] ?? m[4] ?? '';\n return decodeEntities(val);\n}\n\nfunction indexOfSpace(s: string): number {\n for (let i = 0; i < s.length; i += 1) {\n const c = s.charCodeAt(i);\n if (c === 32 || c === 9 || c === 10 || c === 12 || c === 13) {\n return i;\n }\n }\n return -1;\n}\n\n// --- Classification sets ---\n\nconst BLOCK_TAG_SET = toSet([\n 'p',\n 'div',\n 'section',\n 'article',\n 'header',\n 'footer',\n 'main',\n 'nav',\n 'aside',\n 'h1',\n 'h2',\n 'h3',\n 'h4',\n 'h5',\n 'h6',\n 'ul',\n 'ol',\n 'li',\n 'table',\n 'thead',\n 'tbody',\n 'tfoot',\n 'blockquote',\n 'figure',\n 'figcaption',\n 'hr',\n]);\n\nconst SELF_CLOSING_TAG_SET = toSet([\n 'br',\n 'img',\n 'hr',\n 'meta',\n 'link',\n 'input',\n 'source',\n 'track',\n 'wbr',\n]);\n\n// Markers for preserved regions in collapse pass\nconst PRESERVE_OPEN = '\\u2418'; // symbol for record separator visualization (any rare char)\nconst PRESERVE_CLOSE = '\\u2419';\n\nconst NAMED_ENTITIES: Record<string, string> = Object.freeze({\n amp: '&',\n lt: '<',\n gt: '>',\n quot: '\"',\n apos: \"'\",\n nbsp: '\\u00A0',\n mdash: '\\u2014',\n ndash: '\\u2013',\n hellip: '\\u2026',\n copy: '\\u00A9',\n reg: '\\u00AE',\n trade: '\\u2122',\n laquo: '\\u00AB',\n raquo: '\\u00BB',\n lsquo: '\\u2018',\n rsquo: '\\u2019',\n ldquo: '\\u201C',\n rdquo: '\\u201D',\n euro: '\\u20AC',\n middot: '\\u00B7',\n bull: '\\u2022',\n});\n","/**\n * URL normalization utilities for resolving relative URLs to absolute URLs.\n *\n * @remarks\n * This module provides utilities for converting relative URLs to absolute URLs with\n * best-effort error handling. All functions are designed to never throw errors - if\n * normalization fails, the original string is returned unchanged.\n *\n * Supports all common relative URL formats:\n * - Absolute paths: `/path` → `https://example.com/path`\n * - Relative paths: `./path`, `../path`, `path`\n * - Protocol-relative: `//cdn.com/file` → `https://cdn.com/file`\n *\n * Features HTTP to HTTPS upgrade by default (unless base URL is explicitly HTTP).\n *\n * @packageDocumentation\n */\n\n/**\n * Normalize a URL to absolute form using a base URL.\n *\n * @remarks\n * This function converts relative URLs to absolute URLs. It handles all common\n * relative URL formats and never throws errors. If normalization fails for any\n * reason, the original string is returned unchanged.\n *\n * @example\n * ```typescript\n * // Absolute path\n * normalizeUrl('https://example.com/feed.xml', '/blog/post')\n * // Returns: \"https://example.com/blog/post\"\n *\n * // Relative path\n * normalizeUrl('https://example.com/feeds/rss.xml', '../images/logo.png')\n * // Returns: \"https://example.com/images/logo.png\"\n *\n * // Protocol-relative\n * normalizeUrl('https://example.com/feed.xml', '//cdn.example.com/file.mp3')\n * // Returns: \"https://cdn.example.com/file.mp3\"\n *\n * // No base URL - returns as-is\n * normalizeUrl(null, '/blog/post')\n * // Returns: \"/blog/post\"\n * ```\n *\n * @param baseUrl - Base URL for resolving relative URLs (string or URL object)\n * @param urlString - URL to normalize (can be relative, absolute, protocol-relative, etc.)\n * @returns Normalized absolute URL, or original string if normalization fails\n */\nexport function normalizeUrl(\n baseUrl: string | URL | null | undefined,\n urlString: string | null | undefined,\n): string {\n // Return original if no URL string provided\n if (!urlString || typeof urlString !== 'string') {\n return urlString || '';\n }\n\n const trimmed = urlString.trim();\n if (!trimmed) {\n return urlString;\n }\n\n // No base URL - try to validate as absolute or return as-is\n if (!baseUrl) {\n return validateOrReturnOriginal(trimmed);\n }\n\n try {\n // Parse base URL\n const base = typeof baseUrl === 'string' ? new URL(baseUrl) : baseUrl;\n\n // Check if URL is already absolute\n if (isAbsoluteUrl(trimmed)) {\n return validateOrReturnOriginal(trimmed);\n }\n\n // Handle protocol-relative URLs (//example.com/path)\n if (trimmed.startsWith('//')) {\n const protocol = base.protocol || 'https:';\n return validateOrReturnOriginal(`${protocol}${trimmed}`);\n }\n\n // Handle absolute paths (/path)\n if (trimmed.startsWith('/')) {\n const origin = base.origin;\n return validateOrReturnOriginal(`${origin}${trimmed}`);\n }\n\n // Handle relative paths (./path, ../path, or just path)\n // Use URL constructor to resolve relative to base\n const resolved = new URL(trimmed, base);\n return resolved.href;\n } catch {\n // If anything fails, return original\n return urlString;\n }\n}\n\n/**\n * Check if URL is absolute (has protocol)\n */\nfunction isAbsoluteUrl(url: string): boolean {\n try {\n // Try to parse as URL\n const parsed = new URL(url);\n // Must have protocol and host\n return Boolean(parsed.protocol && parsed.host);\n } catch {\n return false;\n }\n}\n\n/**\n * Validate URL or return original\n * Attempts to parse and clean up the URL\n */\nfunction validateOrReturnOriginal(url: string): string {\n try {\n const parsed = new URL(url);\n return parsed.href;\n } catch {\n return url;\n }\n}\n\n/**\n * Normalize multiple URLs at once.\n *\n * @remarks\n * Convenience function for batch URL normalization. Filters out null/undefined values.\n *\n * @param baseUrl - Base URL for resolving relative URLs\n * @param urls - Array of URLs to normalize\n * @returns Array of normalized URLs (nulls/undefined filtered out)\n */\nexport function normalizeUrls(\n baseUrl: string | URL | null | undefined,\n urls: (string | null | undefined)[] | null | undefined,\n): string[] {\n if (!urls || !Array.isArray(urls)) {\n return [];\n }\n\n return urls.map((url) => normalizeUrl(baseUrl, url)).filter((url): url is string => Boolean(url));\n}\n\n/**\n * Upgrade HTTP URLs to HTTPS (unless base URL is explicitly HTTP).\n *\n * @remarks\n * This function implements the HTTPS-by-default policy. HTTP URLs are automatically\n * upgraded to HTTPS unless the base URL itself is HTTP, indicating an HTTP-only site.\n *\n * @param baseUrl - Base URL (determines if HTTP should be kept)\n * @param url - URL to potentially upgrade\n * @returns URL with HTTPS protocol if appropriate, otherwise unchanged\n */\nexport function preferHttps(baseUrl: string | URL | null | undefined, url: string): string {\n if (!url || !url.startsWith('http://')) {\n return url;\n }\n\n // If base URL is explicitly HTTP, keep HTTP\n if (baseUrl) {\n try {\n const base = typeof baseUrl === 'string' ? new URL(baseUrl) : baseUrl;\n if (base.protocol === 'http:') {\n return url;\n }\n } catch {\n // Ignore errors\n }\n }\n\n // Try to upgrade to HTTPS\n return url.replace(/^http:/, 'https:');\n}\n\n/**\n * Normalize URL and prefer HTTPS protocol.\n *\n * @remarks\n * Convenience function combining {@link normalizeUrl} with {@link preferHttps}.\n * This is the recommended function for most use cases.\n *\n * @param baseUrl - Base URL for resolving relative URLs\n * @param urlString - URL to normalize\n * @returns Normalized absolute URL with HTTPS preference\n */\nexport function normalizeUrlHttps(\n baseUrl: string | URL | null | undefined,\n urlString: string | null | undefined,\n): string {\n const normalized = normalizeUrl(baseUrl, urlString);\n return preferHttps(baseUrl, normalized);\n}\n","/**\n * Text cleaning utilities for Atom feeds\n */\n\n/**\n * Strip CDATA tags from text\n */\nfunction stripCDATA(text: string): string {\n return text.replace(/<!\\[CDATA\\[([\\s\\S]*?)\\]\\]>/g, '$1');\n}\n\n/**\n * Decode HTML entities\n */\nfunction decodeEntities(text: string): string {\n // Common HTML entities\n const entities: Record<string, string> = {\n '&amp;': '&',\n '&lt;': '<',\n '&gt;': '>',\n '&quot;': '\"',\n '&apos;': \"'\",\n '&#39;': \"'\",\n };\n\n let result = text;\n for (const [entity, char] of Object.entries(entities)) {\n result = result.replace(new RegExp(entity, 'g'), char);\n }\n\n // Decode numeric entities (&#123; or &#xAB;)\n result = result.replace(/&#(\\d+);/g, (_match, dec) => {\n return String.fromCharCode(Number.parseInt(dec, 10));\n });\n result = result.replace(/&#x([0-9A-Fa-f]+);/g, (_match, hex) => {\n return String.fromCharCode(Number.parseInt(hex, 16));\n });\n\n return result;\n}\n\n/**\n * Normalize whitespace (collapse multiple spaces, trim)\n */\nfunction normalizeWhitespace(text: string): string {\n return text.replace(/\\s+/g, ' ').trim();\n}\n\n/**\n * Clean text by applying all transformations\n */\nfunction cleanText(text: string | null | undefined): string {\n if (!text) {\n return '';\n }\n return normalizeWhitespace(decodeEntities(stripCDATA(text)));\n}\n\n/**\n * Clean text content based on Atom content type\n * @param text - Raw text\n * @param type - Atom content type (text, html, xhtml, or mime type)\n * @returns Cleaned text\n */\nexport function cleanAtomContent(\n text: string | null | undefined,\n type: string | null | undefined = 'text',\n): string {\n if (!text) {\n return '';\n }\n\n const contentType = (type || 'text').toLowerCase().trim();\n\n // For text type, decode entities and clean whitespace\n if (contentType === 'text') {\n return cleanText(text);\n }\n\n // For HTML/XHTML, we keep HTML entities and structure\n // Only normalize whitespace and strip CDATA\n if (contentType === 'html' || contentType === 'xhtml') {\n return normalizeWhitespace(stripCDATA(text));\n }\n\n // For other mime types (e.g., application/xml), preserve as-is after basic cleaning\n return normalizeWhitespace(stripCDATA(text));\n}\n\n// Export individual utilities for internal use\nexport { stripCDATA, decodeEntities, normalizeWhitespace, cleanText };\n","/**\n * Atom date parsing utilities\n * Atom uses RFC 3339 / ISO 8601 date format\n * Examples: \"2025-12-17T10:00:00Z\", \"2025-12-17T10:00:00+01:00\"\n */\n\n/**\n * Parse RFC 3339 / ISO 8601 date to ISO 8601 string\n * Atom dates are already in ISO 8601 format, just validate and normalize\n */\nexport function parseRFC3339Date(dateString: string | null | undefined): string | null {\n if (!dateString || typeof dateString !== 'string') {\n return null;\n }\n\n const trimmed = dateString.trim();\n if (!trimmed) {\n return null;\n }\n\n try {\n // JavaScript's Date constructor handles ISO 8601 / RFC 3339 well\n const date = new Date(trimmed);\n\n // Check if date is valid\n if (Number.isNaN(date.getTime())) {\n return null;\n }\n\n // Return as ISO 8601 string\n return date.toISOString();\n } catch {\n return null;\n }\n}\n\n/**\n * Parse Atom date (alias for clarity)\n */\nexport function parseAtomDate(dateString: string | null | undefined): string | null {\n return parseRFC3339Date(dateString);\n}\n\n/**\n * Check if a date string is valid\n */\nexport function isValidAtomDate(dateString: string | null | undefined): boolean {\n return parseRFC3339Date(dateString) !== null;\n}\n","/**\n * Extract Atom entry metadata\n */\n\nimport { cleanAtomContent, cleanText } from './clean-text.js';\nimport { parseAtomDate } from './parse-date.js';\nimport type {\n AtomCategory,\n AtomContent,\n AtomEntry,\n AtomFeed,\n AtomLink,\n AtomPerson,\n} from './types.js';\nimport type { AtomElement } from './xml-parser.js';\n\n/**\n * Extract date from element with fallbacks for different Atom versions and extensions\n * Tries selectors in order: updated (Atom 1.0), modified (Atom 0.3), issued (Atom 0.3), dc:date (Dublin Core)\n */\nfunction extractAtomDate(element: AtomElement): string | null {\n // Try Atom 1.0 <updated>\n let dateText = element.querySelector('updated')?.textContent;\n if (dateText) {\n const parsed = parseAtomDate(dateText);\n if (parsed) return parsed;\n }\n\n // Try Atom 0.3 <modified>\n dateText = element.querySelector('modified')?.textContent;\n if (dateText) {\n const parsed = parseAtomDate(dateText);\n if (parsed) return parsed;\n }\n\n // Try Atom 0.3 <issued>\n dateText = element.querySelector('issued')?.textContent;\n if (dateText) {\n const parsed = parseAtomDate(dateText);\n if (parsed) return parsed;\n }\n\n // Try Dublin Core <dc:date>\n const dcDateElements = element.children.filter((child) => child.tagName === 'dc:date');\n if (dcDateElements.length > 0) {\n dateText = dcDateElements[0].textContent;\n if (dateText) {\n const parsed = parseAtomDate(dateText);\n if (parsed) return parsed;\n }\n }\n\n return null;\n}\n\n/**\n * Extract person (author, contributor)\n */\nfunction extractPerson(element: AtomElement): AtomPerson | null {\n const name = element.querySelector('name')?.textContent;\n if (!name) {\n return null; // Name is required for person construct\n }\n\n const person: AtomPerson = {\n name: cleanText(name),\n };\n\n const email = element.querySelector('email')?.textContent;\n if (email) {\n person.email = cleanText(email);\n }\n\n const uri = element.querySelector('uri')?.textContent;\n if (uri) {\n person.uri = cleanText(uri);\n }\n\n return person;\n}\n\n/**\n * Extract all persons of a given tag name\n */\nfunction extractPersons(root: AtomElement, tagName: string): AtomPerson[] {\n const persons: AtomPerson[] = [];\n const elements = root.querySelectorAll(tagName);\n\n for (const element of elements) {\n const person = extractPerson(element);\n if (person) {\n persons.push(person);\n }\n }\n\n return persons;\n}\n\n/**\n * Extract link\n */\nfunction extractLink(element: AtomElement): AtomLink | null {\n const href = element.getAttribute('href');\n if (!href) {\n return null; // href is required\n }\n\n const link: AtomLink = {\n href: cleanText(href),\n };\n\n const rel = element.getAttribute('rel');\n if (rel) {\n link.rel = cleanText(rel);\n }\n\n const type = element.getAttribute('type');\n if (type) {\n link.type = cleanText(type);\n }\n\n const hreflang = element.getAttribute('hreflang');\n if (hreflang) {\n link.hreflang = cleanText(hreflang);\n }\n\n const title = element.getAttribute('title');\n if (title) {\n link.title = cleanText(title);\n }\n\n const length = element.getAttribute('length');\n if (length) {\n const lengthNum = Number.parseInt(length, 10);\n if (!Number.isNaN(lengthNum)) {\n link.length = lengthNum;\n }\n }\n\n return link;\n}\n\n/**\n * Extract all links\n */\nfunction extractLinks(root: AtomElement): AtomLink[] {\n const links: AtomLink[] = [];\n const elements = root.querySelectorAll('link');\n\n for (const element of elements) {\n const link = extractLink(element);\n if (link) {\n links.push(link);\n }\n }\n\n return links;\n}\n\n/**\n * Extract category\n */\nfunction extractCategory(element: AtomElement): AtomCategory | null {\n const term = element.getAttribute('term');\n if (!term) {\n return null; // term is required\n }\n\n const category: AtomCategory = {\n term: cleanText(term),\n };\n\n const scheme = element.getAttribute('scheme');\n if (scheme) {\n category.scheme = cleanText(scheme);\n }\n\n const label = element.getAttribute('label');\n if (label) {\n category.label = cleanText(label);\n }\n\n return category;\n}\n\n/**\n * Extract all categories\n */\nfunction extractCategories(root: AtomElement): AtomCategory[] {\n const categories: AtomCategory[] = [];\n const elements = root.querySelectorAll('category');\n\n for (const element of elements) {\n const category = extractCategory(element);\n if (category) {\n categories.push(category);\n }\n }\n\n return categories;\n}\n\n/**\n * Extract content\n */\nfunction extractContent(root: AtomElement): AtomContent | undefined {\n const element = root.querySelector('content');\n if (!element) {\n return undefined;\n }\n\n const type = element.getAttribute('type');\n const src = element.getAttribute('src');\n const text = element.textContent;\n\n if (!text && !src) {\n return undefined;\n }\n\n const content: AtomContent = {\n value: text ? cleanAtomContent(text, type) : '',\n };\n\n if (type) {\n content.type = cleanText(type);\n }\n\n if (src) {\n content.src = cleanText(src);\n }\n\n return content;\n}\n\n/**\n * Extract text content with type attribute\n */\nfunction extractTextContent(root: AtomElement, tagName: string): string | undefined {\n const element = root.querySelector(tagName);\n if (!element) {\n return undefined;\n }\n\n const text = element.textContent;\n const type = element.getAttribute('type');\n\n return text ? cleanAtomContent(text, type) : undefined;\n}\n\n/**\n * Extract Atom entry\n */\nexport function extractEntry(entryElement: AtomElement): AtomEntry {\n // Required fields\n const id = entryElement.querySelector('id')?.textContent;\n if (!id) {\n throw new Error('Invalid Atom entry: missing required <id> element');\n }\n\n const title = extractTextContent(entryElement, 'title');\n if (!title) {\n throw new Error('Invalid Atom entry: missing required <title> element');\n }\n\n const updated = extractAtomDate(entryElement);\n if (!updated) {\n throw new Error(\n 'Invalid Atom entry: missing or invalid date (tried <updated>, <modified>, <issued>, <dc:date>)',\n );\n }\n\n const entry: AtomEntry = {\n id: cleanText(id),\n title,\n updated,\n };\n\n // Optional fields\n const authors = extractPersons(entryElement, 'author');\n if (authors.length > 0) {\n entry.authors = authors;\n }\n\n const content = extractContent(entryElement);\n if (content) {\n entry.content = content;\n }\n\n const links = extractLinks(entryElement);\n if (links.length > 0) {\n entry.links = links;\n }\n\n const summary = extractTextContent(entryElement, 'summary');\n if (summary) {\n entry.summary = summary;\n }\n\n const categories = extractCategories(entryElement);\n if (categories.length > 0) {\n entry.categories = categories;\n }\n\n const contributors = extractPersons(entryElement, 'contributor');\n if (contributors.length > 0) {\n entry.contributors = contributors;\n }\n\n const publishedRaw = entryElement.querySelector('published')?.textContent;\n if (publishedRaw) {\n const published = parseAtomDate(publishedRaw);\n if (published) {\n entry.published = published;\n }\n }\n\n const rights = extractTextContent(entryElement, 'rights');\n if (rights) {\n entry.rights = rights;\n }\n\n // Source is a partial feed\n const source = entryElement.querySelector('source');\n if (source) {\n const sourceData: Partial<AtomFeed> = {};\n\n const sourceId = source.querySelector('id')?.textContent;\n if (sourceId) {\n sourceData.id = cleanText(sourceId);\n }\n\n const sourceTitle = extractTextContent(source, 'title');\n if (sourceTitle) {\n sourceData.title = sourceTitle;\n }\n\n const sourceUpdatedRaw = source.querySelector('updated')?.textContent;\n if (sourceUpdatedRaw) {\n const sourceUpdated = parseAtomDate(sourceUpdatedRaw);\n if (sourceUpdated) {\n sourceData.updated = sourceUpdated;\n }\n }\n\n if (Object.keys(sourceData).length > 0) {\n entry.source = sourceData;\n }\n }\n\n return entry;\n}\n","/**\n * Minimal Atom-specific XML parser\n * Built specifically for Atom 1.0 feeds with their specific quirks\n */\n\nexport interface AtomElement {\n /** Tag name (e.g., 'feed', 'entry', 'title') */\n tagName: string;\n /** Element attributes */\n attributes: Record<string, string>;\n /** Text content (with CDATA stripped) */\n text: string;\n /** Child elements */\n children: AtomElement[];\n /** Parent element (for traversal) */\n parent: AtomElement | null;\n\n /** Query selector - find first matching child */\n querySelector: (selector: string) => AtomElement | null;\n /** Query selector all - find all matching children */\n querySelectorAll: (selector: string) => AtomElement[];\n /** Get attribute value */\n getAttribute: (name: string) => string | null;\n /** Get text content */\n get textContent(): string;\n}\n\n/**\n * Remove XML comments\n */\nfunction removeComments(xml: string): string {\n return xml.replace(/<!--[\\s\\S]*?-->/g, '');\n}\n\n/**\n * Remove DOCTYPE declarations\n */\nfunction removeDoctype(xml: string): string {\n return xml.replace(/<!DOCTYPE[^>]*>/gi, '');\n}\n\n/**\n * Parse Atom XML string into element tree\n */\nexport function parseAtomXML(xml: string): AtomElement {\n const withoutDoctype = removeDoctype(xml);\n const withoutComments = removeComments(withoutDoctype);\n const { text: cleanedXML, cdataMap } = extractCDATA(withoutComments);\n const root = parseElement(cleanedXML, 0, null, cdataMap).element;\n return root;\n}\n\n/**\n * Extract CDATA content and replace with placeholder\n */\nfunction extractCDATA(text: string): { text: string; cdataMap: Map<string, string> } {\n const cdataMap = new Map<string, string>();\n let counter = 0;\n\n const processed = text.replace(/<!\\[CDATA\\[([\\s\\S]*?)\\]\\]>/g, (_match, content) => {\n const placeholder = `__CDATA_${counter}__`;\n cdataMap.set(placeholder, content);\n counter++;\n return placeholder;\n });\n\n return { text: processed, cdataMap };\n}\n\n/**\n * Restore CDATA content from placeholders\n */\nfunction restoreCDATA(text: string, cdataMap: Map<string, string>): string {\n let result = text;\n for (const [placeholder, content] of cdataMap.entries()) {\n result = result.replace(placeholder, content);\n }\n return result;\n}\n\n/**\n * Parse attributes from opening tag\n */\nfunction parseAttributes(tagContent: string): Record<string, string> {\n const attributes: Record<string, string> = {};\n const attrRegex = /(\\S+)=[\"']([^\"']*)[\"']/g;\n let match: RegExpExecArray | null = attrRegex.exec(tagContent);\n\n while (match !== null) {\n attributes[match[1]] = match[2];\n match = attrRegex.exec(tagContent);\n }\n\n return attributes;\n}\n\n/**\n * Find matching closing tag position\n */\nfunction findClosingTag(xml: string, tagName: string, startPos: number): number {\n const openTag = `<${tagName}`;\n const closeTag = `</${tagName}>`;\n let depth = 1;\n let pos = startPos;\n\n while (pos < xml.length && depth > 0) {\n const nextOpen = xml.indexOf(openTag, pos);\n const nextClose = xml.indexOf(closeTag, pos);\n\n if (nextClose === -1) {\n return -1; // No closing tag found\n }\n\n if (nextOpen !== -1 && nextOpen < nextClose) {\n // Found nested opening tag\n depth++;\n pos = nextOpen + openTag.length;\n } else {\n // Found closing tag\n depth--;\n if (depth === 0) {\n return nextClose;\n }\n pos = nextClose + closeTag.length;\n }\n }\n\n return -1;\n}\n\n/**\n * Parse a single element and its children\n */\nfunction parseElement(\n xml: string,\n startPos: number,\n parent: AtomElement | null = null,\n cdataMap: Map<string, string>,\n): { element: AtomElement; endPos: number } {\n // Find opening tag\n const openTagStart = xml.indexOf('<', startPos);\n if (openTagStart === -1) {\n throw new Error('No opening tag found');\n }\n\n const openTagEnd = xml.indexOf('>', openTagStart);\n if (openTagEnd === -1) {\n throw new Error('Unclosed opening tag');\n }\n\n const openTagContent = xml.substring(openTagStart + 1, openTagEnd);\n\n // Check for self-closing tag\n const isSelfClosing = openTagContent.endsWith('/');\n const tagContent = isSelfClosing ? openTagContent.slice(0, -1).trim() : openTagContent;\n\n // Extract tag name and attributes\n const spaceIndex = tagContent.indexOf(' ');\n const tagName = spaceIndex === -1 ? tagContent : tagContent.substring(0, spaceIndex);\n const attributes = spaceIndex === -1 ? {} : parseAttributes(tagContent.substring(spaceIndex));\n\n const element: AtomElement = {\n tagName,\n attributes,\n text: '',\n children: [],\n parent,\n querySelector: (selector: string) => querySelector(element as AtomElement, selector),\n querySelectorAll: (selector: string) => querySelectorAll(element as AtomElement, selector),\n getAttribute: (name: string) => element.attributes[name] ?? null,\n get textContent() {\n return element.text;\n },\n };\n\n // Handle self-closing tags\n if (isSelfClosing) {\n return {\n element,\n endPos: openTagEnd + 1,\n };\n }\n\n // Find closing tag\n const closingTagStart = findClosingTag(xml, tagName, openTagEnd + 1);\n if (closingTagStart === -1) {\n throw new Error(`No closing tag found for <${tagName}>`);\n }\n\n // Extract content between opening and closing tags\n const contentStart = openTagEnd + 1;\n const content = xml.substring(contentStart, closingTagStart);\n\n // Parse children and text\n const children: AtomElement[] = [];\n const textParts: string[] = [];\n let pos = 0;\n\n while (pos < content.length) {\n const nextTagStart = content.indexOf('<', pos);\n\n if (nextTagStart === -1) {\n // No more tags, rest is text\n textParts.push(content.substring(pos));\n break;\n }\n\n // Text before next tag\n if (nextTagStart > pos) {\n textParts.push(content.substring(pos, nextTagStart));\n }\n\n // Check if it's a closing tag or comment\n if (content[nextTagStart + 1] === '/' || content[nextTagStart + 1] === '!') {\n // Skip closing tags and comments\n const tagEnd = content.indexOf('>', nextTagStart);\n if (tagEnd !== -1) {\n pos = tagEnd + 1;\n } else {\n break;\n }\n continue;\n }\n\n // Parse child element\n try {\n const { element: childElement, endPos } = parseElement(\n xml,\n contentStart + nextTagStart,\n element,\n cdataMap,\n );\n children.push(childElement);\n pos = endPos - contentStart;\n } catch {\n // If parsing fails, treat as text\n pos = nextTagStart + 1;\n }\n }\n\n // Combine and clean text\n const rawText = textParts.join('').trim();\n const restoredText = restoreCDATA(rawText, cdataMap);\n element.text = restoredText;\n element.children = children;\n\n const closingTagEnd = closingTagStart + `</${tagName}>`.length;\n\n return {\n element,\n endPos: closingTagEnd,\n };\n}\n\n/**\n * Query selector - find first matching element\n */\nfunction querySelector(element: AtomElement, selector: string): AtomElement | null {\n // Search in direct children first\n for (const child of element.children) {\n if (child.tagName === selector) {\n return child;\n }\n }\n\n // Deep search\n for (const child of element.children) {\n const result = querySelector(child, selector);\n if (result) {\n return result;\n }\n }\n\n return null;\n}\n\n/**\n * Query selector all - find all matching elements\n */\nfunction querySelectorAll(element: AtomElement, selector: string): AtomElement[] {\n const results: AtomElement[] = [];\n\n // Search direct children\n for (const child of element.children) {\n if (child.tagName === selector) {\n results.push(child);\n }\n }\n\n // Deep search in children (but don't add duplicates)\n // const directChildrenTags = new Set(results.map((r) => r.tagName));\n for (const child of element.children) {\n const childResults = querySelectorAll(child, selector);\n for (const childResult of childResults) {\n if (!results.includes(childResult)) {\n results.push(childResult);\n }\n }\n }\n\n return results;\n}\n\n/**\n * Parse XML and return root element\n */\nexport function parseXML(xml: string): AtomElement {\n // Remove XML declaration and processing instructions\n const cleaned = xml.replace(/<\\?[^?]*\\?>/g, '').trim();\n return parseAtomXML(cleaned);\n}\n","/**\n * Extract Atom feed metadata\n */\n\nimport { cleanAtomContent, cleanText } from './clean-text.js';\nimport { parseAtomDate } from './parse-date.js';\nimport type { AtomCategory, AtomFeed, AtomGenerator, AtomLink, AtomPerson } from './types.js';\nimport { parseXML } from './xml-parser.js';\n\n/**\n * Extract date from element with fallbacks for different Atom versions and extensions\n * Tries selectors in order: updated (Atom 1.0), modified (Atom 0.3), issued (Atom 0.3), dc:date (Dublin Core)\n */\nfunction extractAtomDate(element: ReturnType<typeof parseXML>): string | null {\n // Try Atom 1.0 <updated>\n let dateText = element.querySelector('updated')?.textContent;\n if (dateText) {\n const parsed = parseAtomDate(dateText);\n if (parsed) return parsed;\n }\n\n // Try Atom 0.3 <modified>\n dateText = element.querySelector('modified')?.textContent;\n if (dateText) {\n const parsed = parseAtomDate(dateText);\n if (parsed) return parsed;\n }\n\n // Try Atom 0.3 <issued>\n dateText = element.querySelector('issued')?.textContent;\n if (dateText) {\n const parsed = parseAtomDate(dateText);\n if (parsed) return parsed;\n }\n\n // Try Dublin Core <dc:date>\n const dcDateElements = element.children.filter((child) => child.tagName === 'dc:date');\n if (dcDateElements.length > 0) {\n dateText = dcDateElements[0].textContent;\n if (dateText) {\n const parsed = parseAtomDate(dateText);\n if (parsed) return parsed;\n }\n }\n\n return null;\n}\n\n/**\n * Extract person (author, contributor)\n */\nfunction extractPerson(element: ReturnType<typeof parseXML>): AtomPerson | null {\n const name = element.querySelector('name')?.textContent;\n if (!name) {\n return null; // Name is required for person construct\n }\n\n const person: AtomPerson = {\n name: cleanText(name),\n };\n\n const email = element.querySelector('email')?.textContent;\n if (email) {\n person.email = cleanText(email);\n }\n\n const uri = element.querySelector('uri')?.textContent;\n if (uri) {\n person.uri = cleanText(uri);\n }\n\n return person;\n}\n\n/**\n * Extract all persons of a given tag name\n */\nfunction extractPersons(root: ReturnType<typeof parseXML>, tagName: string): AtomPerson[] {\n const persons: AtomPerson[] = [];\n const elements = root.querySelectorAll(tagName);\n\n for (const element of elements) {\n const person = extractPerson(element);\n if (person) {\n persons.push(person);\n }\n }\n\n return persons;\n}\n\n/**\n * Extract link\n */\nfunction extractLink(element: ReturnType<typeof parseXML>): AtomLink | null {\n const href = element.getAttribute('href');\n if (!href) {\n return null; // href is required\n }\n\n const link: AtomLink = {\n href: cleanText(href),\n };\n\n const rel = element.getAttribute('rel');\n if (rel) {\n link.rel = cleanText(rel);\n }\n\n const type = element.getAttribute('type');\n if (type) {\n link.type = cleanText(type);\n }\n\n const hreflang = element.getAttribute('hreflang');\n if (hreflang) {\n link.hreflang = cleanText(hreflang);\n }\n\n const title = element.getAttribute('title');\n if (title) {\n link.title = cleanText(title);\n }\n\n const length = element.getAttribute('length');\n if (length) {\n const lengthNum = Number.parseInt(length, 10);\n if (!Number.isNaN(lengthNum)) {\n link.length = lengthNum;\n }\n }\n\n return link;\n}\n\n/**\n * Extract all links\n */\nfunction extractLinks(root: ReturnType<typeof parseXML>): AtomLink[] {\n const links: AtomLink[] = [];\n const elements = root.querySelectorAll('link');\n\n for (const element of elements) {\n const link = extractLink(element);\n if (link) {\n links.push(link);\n }\n }\n\n return links;\n}\n\n/**\n * Extract category\n */\nfunction extractCategory(element: ReturnType<typeof parseXML>): AtomCategory | null {\n const term = element.getAttribute('term');\n if (!term) {\n return null; // term is required\n }\n\n const category: AtomCategory = {\n term: cleanText(term),\n };\n\n const scheme = element.getAttribute('scheme');\n if (scheme) {\n category.scheme = cleanText(scheme);\n }\n\n const label = element.getAttribute('label');\n if (label) {\n category.label = cleanText(label);\n }\n\n return category;\n}\n\n/**\n * Extract all categories\n */\nfunction extractCategories(root: ReturnType<typeof parseXML>): AtomCategory[] {\n const categories: AtomCategory[] = [];\n const elements = root.querySelectorAll('category');\n\n for (const element of elements) {\n const category = extractCategory(element);\n if (category) {\n categories.push(category);\n }\n }\n\n return categories;\n}\n\n/**\n * Extract generator\n */\nfunction extractGenerator(root: ReturnType<typeof parseXML>): AtomGenerator | null {\n const element = root.querySelector('generator');\n if (!element) {\n return null;\n }\n\n const value = element.textContent;\n if (!value) {\n return null;\n }\n\n const generator: AtomGenerator = {\n value: cleanText(value),\n };\n\n const uri = element.getAttribute('uri');\n if (uri) {\n generator.uri = cleanText(uri);\n }\n\n const version = element.getAttribute('version');\n if (version) {\n generator.version = cleanText(version);\n }\n\n return generator;\n}\n\n/**\n * Extract text content with type attribute\n */\nfunction extractTextContent(\n root: ReturnType<typeof parseXML>,\n tagName: string,\n): string | undefined {\n const element = root.querySelector(tagName);\n if (!element) {\n return undefined;\n }\n\n const text = element.textContent;\n const type = element.getAttribute('type');\n\n return text ? cleanAtomContent(text, type) : undefined;\n}\n\n/**\n * Extract Atom feed-level metadata\n */\nexport function extractFeed(xml: string): AtomFeed {\n const doc = parseXML(xml);\n\n // The root element should be the feed\n const feed = doc.tagName === 'feed' ? doc : doc.querySelector('feed');\n\n if (!feed) {\n throw new Error('Invalid Atom feed: missing <feed> element');\n }\n\n // Required fields\n const id = feed.querySelector('id')?.textContent;\n if (!id) {\n throw new Error('Invalid Atom feed: missing required <id> element');\n }\n\n const title = extractTextContent(feed, 'title');\n if (!title) {\n throw new Error('Invalid Atom feed: missing required <title> element');\n }\n\n const updated = extractAtomDate(feed);\n if (!updated) {\n throw new Error(\n 'Invalid Atom feed: missing or invalid date (tried <updated>, <modified>, <issued>, <dc:date>)',\n );\n }\n\n const result: AtomFeed = {\n id: cleanText(id),\n title,\n updated,\n };\n\n // Optional fields\n const authors = extractPersons(feed, 'author');\n if (authors.length > 0) {\n result.authors = authors;\n }\n\n const links = extractLinks(feed);\n if (links.length > 0) {\n result.links = links;\n }\n\n const categories = extractCategories(feed);\n if (categories.length > 0) {\n result.categories = categories;\n }\n\n const contributors = extractPersons(feed, 'contributor');\n if (contributors.length > 0) {\n result.contributors = contributors;\n }\n\n const generator = extractGenerator(feed);\n if (generator) {\n result.generator = generator;\n }\n\n const icon = feed.querySelector('icon')?.textContent;\n if (icon) {\n result.icon = cleanText(icon);\n }\n\n const logo = feed.querySelector('logo')?.textContent;\n if (logo) {\n result.logo = cleanText(logo);\n }\n\n const rights = extractTextContent(feed, 'rights');\n if (rights) {\n result.rights = rights;\n }\n\n const subtitle = extractTextContent(feed, 'subtitle');\n if (subtitle) {\n result.subtitle = subtitle;\n }\n\n return result;\n}\n","/**\n * Main Atom feed parser\n * Orchestrates feed and entry extraction\n */\n\nimport { normalizeUrlHttps } from '../../utils/normalize-url.js';\nimport { extractEntry } from './extract-entry.js';\nimport { extractFeed } from './extract-feed.js';\nimport type { AtomDocument, AtomEntry, AtomFeed, AtomLink } from './types.js';\nimport { parseXML } from './xml-parser.js';\n\n/**\n * Parse complete Atom feed\n * @param xml - Atom XML string\n * @param baseUrl - Optional base URL for resolving relative URLs\n */\nexport function parseAtom(xml: string, baseUrl?: string | URL): AtomDocument {\n const doc = parseXML(xml);\n\n // Extract feed metadata\n const feed = extractFeed(xml);\n\n // Extract all entries\n const entryElements = doc.querySelectorAll('entry');\n const entries = entryElements.map((entryElement) => extractEntry(entryElement));\n\n // Apply URL normalization if base URL provided\n const normalizedFeed = baseUrl ? normalizeFeedUrls(feed, baseUrl) : feed;\n const normalizedEntries = baseUrl\n ? entries.map((entry) => normalizeEntryUrls(entry, baseUrl))\n : entries;\n\n return {\n version: '1.0',\n feed: normalizedFeed,\n entries: normalizedEntries,\n };\n}\n\n/**\n * Normalize all URLs in feed\n */\nfunction normalizeFeedUrls(feed: AtomFeed, baseUrl: string | URL): AtomFeed {\n return {\n ...feed,\n links: feed.links ? feed.links.map((link) => normalizeLinkUrls(link, baseUrl)) : feed.links,\n icon: feed.icon ? normalizeUrlHttps(baseUrl, feed.icon) : feed.icon,\n logo: feed.logo ? normalizeUrlHttps(baseUrl, feed.logo) : feed.logo,\n };\n}\n\n/**\n * Normalize all URLs in entry\n */\nfunction normalizeEntryUrls(entry: AtomEntry, baseUrl: string | URL): AtomEntry {\n return {\n ...entry,\n links: entry.links ? entry.links.map((link) => normalizeLinkUrls(link, baseUrl)) : entry.links,\n };\n}\n\n/**\n * Normalize URLs in link\n */\nfunction normalizeLinkUrls(link: AtomLink, baseUrl: string | URL): AtomLink {\n return {\n ...link,\n href: normalizeUrlHttps(baseUrl, link.href),\n };\n}\n","/**\n * Feed format detection utilities.\n *\n * @packageDocumentation\n */\n\n/**\n * Feed format type.\n *\n * @remarks\n * Represents the detected or expected format of a feed.\n * - `'rss'` - RSS 2.0, 0.9x, or RSS 1.0 (RDF)\n * - `'atom'` - Atom 1.0\n * - `'json-feed'` - JSON Feed 1.0 or 1.1\n * - `'sitemap'` - XML Sitemap (urlset or sitemapindex)\n * - `'unknown'` - Format could not be determined\n */\nexport type FeedFormat = 'rss' | 'atom' | 'json-feed' | 'sitemap' | 'unknown';\n\n/**\n * Detect feed format from content string.\n *\n * @remarks\n * Analyzes the content to determine if it's RSS, Atom, or JSON Feed.\n * Detection is based on root elements, namespaces, and structure.\n *\n * Detection priority:\n * 1. JSON Feed (checks for JSON with jsonfeed.org version)\n * 2. RSS (checks for `<rss>` or `<rdf:RDF>` root elements)\n * 3. Atom (checks for `<feed>` root element with Atom namespace)\n *\n * @param content - Feed content as string\n * @returns Detected format or 'unknown' if format cannot be determined\n *\n * @example\n * ```typescript\n * const format = detectFormat(feedContent);\n * if (format === 'rss') {\n * console.log('This is an RSS feed');\n * }\n * ```\n */\nexport function detectFormat(content: string): FeedFormat {\n if (!content || typeof content !== 'string') {\n return 'unknown';\n }\n\n const trimmed = content.trim();\n\n // Check for JSON Feed (starts with { or [)\n if (trimmed.startsWith('{') || trimmed.startsWith('[')) {\n // Try to parse as JSON\n try {\n const data = JSON.parse(trimmed);\n if (\n data &&\n typeof data === 'object' &&\n !Array.isArray(data) &&\n data.version &&\n typeof data.version === 'string' &&\n data.version.includes('jsonfeed.org')\n ) {\n return 'json-feed';\n }\n } catch {\n // Not valid JSON\n }\n return 'unknown';\n }\n\n // Must be XML-based (RSS or Atom)\n // Remove XML declaration and comments for easier parsing\n const cleaned = trimmed\n .replace(/<\\?xml[^?]*\\?>/gi, '')\n .replace(/<!--[\\s\\S]*?-->/g, '')\n .trim();\n\n // Check for RSS root element first (most reliable)\n if (cleaned.match(/<rss[\\s>]/i)) {\n return 'rss';\n }\n\n // Check for Atom root element\n if (cleaned.match(/<feed[\\s>]/i)) {\n return 'atom';\n }\n\n // Check for Atom as root namespace (not just xmlns:atom extension)\n // Only if feed is the root element\n if (cleaned.match(/<feed[^>]*xmlns=\"http:\\/\\/www\\.w3\\.org\\/2005\\/Atom\"/i)) {\n return 'atom';\n }\n\n // Check for RDF-based RSS 1.0\n if (cleaned.match(/<rdf:RDF/i) && cleaned.includes('rss/1.0')) {\n return 'rss';\n }\n\n // Check for channel element (common in RSS)\n if (cleaned.match(/<channel[\\s>]/i)) {\n return 'rss';\n }\n\n // Check for Sitemap (urlset or sitemapindex)\n if (\n (cleaned.match(/<urlset[\\s>]/i) || cleaned.match(/<sitemapindex[\\s>]/i)) &&\n cleaned.includes('sitemaps.org')\n ) {\n return 'sitemap';\n }\n\n return 'unknown';\n}\n\n/**\n * Check if content is a valid feed (any format).\n *\n * @param content - Feed content as string\n * @returns `true` if content is RSS, Atom, or JSON Feed\n *\n * @example\n * ```typescript\n * if (isFeed(content)) {\n * const result = parseFeed(content);\n * }\n * ```\n */\nexport function isFeed(content: string): boolean {\n return detectFormat(content) !== 'unknown';\n}\n\n/**\n * Check if content is RSS format.\n *\n * @param content - Feed content as string\n * @returns `true` if content is RSS (any version)\n */\nexport function isRSS(content: string): boolean {\n return detectFormat(content) === 'rss';\n}\n\n/**\n * Check if content is Atom format.\n *\n * @param content - Feed content as string\n * @returns `true` if content is Atom 1.0\n */\nexport function isAtom(content: string): boolean {\n return detectFormat(content) === 'atom';\n}\n\n/**\n * Check if content is JSON Feed format.\n *\n * @param content - Feed content as string\n * @returns `true` if content is JSON Feed (1.0 or 1.1)\n */\nexport function isJSONFeed(content: string): boolean {\n return detectFormat(content) === 'json-feed';\n}\n\n/**\n * Check if content is XML Sitemap format.\n *\n * @param content - Feed content as string\n * @returns `true` if content is a sitemap (urlset or sitemapindex)\n */\nexport function isSitemapFormat(content: string): boolean {\n return detectFormat(content) === 'sitemap';\n}\n","/**\n * JSON Feed validation utilities\n */\n\nimport type { JSONFeed } from './types.js';\n\n/**\n * Validation error\n */\nexport interface ValidationError {\n field: string;\n message: string;\n}\n\n/**\n * Validate JSON Feed structure\n * Returns array of errors (empty if valid)\n */\nexport function validate(data: unknown): ValidationError[] {\n const errors: ValidationError[] = [];\n\n // Must be an object\n if (!data || typeof data !== 'object' || Array.isArray(data)) {\n errors.push({ field: 'root', message: 'Feed must be a JSON object' });\n return errors;\n }\n\n const feed = data as Partial<JSONFeed>;\n\n // Required: version\n if (!feed.version) {\n errors.push({ field: 'version', message: 'Missing required field: version' });\n } else if (typeof feed.version !== 'string') {\n errors.push({ field: 'version', message: 'Field \"version\" must be a string' });\n } else if (\n !feed.version.includes('jsonfeed.org/version/1') &&\n !feed.version.startsWith('https://jsonfeed.org/version/1')\n ) {\n errors.push({\n field: 'version',\n message: 'Unsupported version (expected JSON Feed 1.0 or 1.1)',\n });\n }\n\n // Required: title\n if (!feed.title) {\n errors.push({ field: 'title', message: 'Missing required field: title' });\n } else if (typeof feed.title !== 'string') {\n errors.push({ field: 'title', message: 'Field \"title\" must be a string' });\n }\n\n // Required: items\n if (!feed.items) {\n errors.push({ field: 'items', message: 'Missing required field: items' });\n } else if (!Array.isArray(feed.items)) {\n errors.push({ field: 'items', message: 'Field \"items\" must be an array' });\n } else {\n // Validate each item\n for (let i = 0; i < feed.items.length; i++) {\n const item = feed.items[i];\n\n // Each item must have an id\n if (!item || typeof item !== 'object') {\n errors.push({ field: `items[${i}]`, message: 'Item must be an object' });\n continue;\n }\n\n if (!item.id) {\n errors.push({ field: `items[${i}].id`, message: 'Missing required field: id' });\n } else if (typeof item.id !== 'string') {\n errors.push({ field: `items[${i}].id`, message: 'Field \"id\" must be a string' });\n }\n\n // Must have content_html or content_text\n if (!item.content_html && !item.content_text) {\n // This is a warning, not an error (some feeds only have title)\n // But according to spec, at least one should be present\n }\n }\n }\n\n return errors;\n}\n\n/**\n * Check if data is valid JSON Feed\n */\nexport function isValid(data: unknown): boolean {\n return validate(data).length === 0;\n}\n","/**\n * JSON Feed parser\n */\n\nimport { normalizeUrlHttps } from '../../utils/normalize-url.js';\nimport type { JSONFeed, JSONFeedAttachment, JSONFeedDocument, JSONFeedItem } from './types.js';\nimport { validate } from './validate.js';\n\n/**\n * Parse JSON Feed from string\n * @param jsonString - Raw JSON string\n * @param baseUrl - Optional base URL for resolving relative URLs\n * @returns Parsed JSON Feed document\n * @throws Error if JSON is invalid or feed validation fails\n */\nexport function parseJSONFeed(jsonString: string, baseUrl?: string | URL): JSONFeedDocument {\n // Parse JSON\n let data: unknown;\n try {\n data = JSON.parse(jsonString);\n } catch (error) {\n throw new Error(`Invalid JSON: ${error instanceof Error ? error.message : 'Unknown error'}`);\n }\n\n // Validate feed structure\n const errors = validate(data);\n if (errors.length > 0) {\n const errorMessages = errors.map((e) => `${e.field}: ${e.message}`).join('; ');\n throw new Error(`Invalid JSON Feed: ${errorMessages}`);\n }\n\n const feed = data as JSONFeed;\n\n // Extract version\n const version = extractVersion(feed.version);\n\n // Apply URL normalization if base URL provided\n const normalizedFeed = baseUrl ? normalizeFeedUrls(feed, baseUrl) : feed;\n\n return {\n version,\n feed: normalizedFeed,\n };\n}\n\n/**\n * Normalize all URLs in JSON Feed\n */\nfunction normalizeFeedUrls(feed: JSONFeed, baseUrl: string | URL): JSONFeed {\n return {\n ...feed,\n home_page_url: feed.home_page_url\n ? normalizeUrlHttps(baseUrl, feed.home_page_url)\n : feed.home_page_url,\n feed_url: feed.feed_url ? normalizeUrlHttps(baseUrl, feed.feed_url) : feed.feed_url,\n icon: feed.icon ? normalizeUrlHttps(baseUrl, feed.icon) : feed.icon,\n favicon: feed.favicon ? normalizeUrlHttps(baseUrl, feed.favicon) : feed.favicon,\n items: feed.items ? feed.items.map((item) => normalizeItemUrls(item, baseUrl)) : feed.items,\n };\n}\n\n/**\n * Normalize all URLs in item\n */\nfunction normalizeItemUrls(item: JSONFeedItem, baseUrl: string | URL): JSONFeedItem {\n return {\n ...item,\n url: item.url ? normalizeUrlHttps(baseUrl, item.url) : item.url,\n external_url: item.external_url\n ? normalizeUrlHttps(baseUrl, item.external_url)\n : item.external_url,\n image: item.image ? normalizeUrlHttps(baseUrl, item.image) : item.image,\n banner_image: item.banner_image\n ? normalizeUrlHttps(baseUrl, item.banner_image)\n : item.banner_image,\n attachments: item.attachments\n ? item.attachments.map((attachment) => normalizeAttachmentUrls(attachment, baseUrl))\n : item.attachments,\n };\n}\n\n/**\n * Normalize URLs in attachment\n */\nfunction normalizeAttachmentUrls(\n attachment: JSONFeedAttachment,\n baseUrl: string | URL,\n): JSONFeedAttachment {\n return {\n ...attachment,\n url: normalizeUrlHttps(baseUrl, attachment.url),\n };\n}\n\n/**\n * Extract version number from version URL\n */\nfunction extractVersion(versionUrl: string): string {\n // Extract version from URLs like:\n // \"https://jsonfeed.org/version/1.1\"\n // \"https://jsonfeed.org/version/1\"\n const match = versionUrl.match(/version\\/([\\d.]+)/);\n return match ? match[1] : versionUrl;\n}\n","/**\n * Normalize format-specific feeds to unified interface\n */\n\nimport type { AtomDocument } from './atom/types.js';\nimport type { JSONFeedDocument } from './json-feed/types.js';\nimport type { RssFeedExtended, RssItemExtended } from './rss/types.js';\nimport type { Feed, FeedAuthor, FeedEnclosure, FeedItem } from './types.js';\n\n/**\n * Normalize RSS feed to unified format\n */\nexport function normalizeRSS(rss: RssFeedExtended): Feed {\n const { channel, items } = rss;\n\n return {\n format: 'rss',\n title: channel.title,\n description: channel.description,\n url: channel.link,\n feedUrl: undefined, // RSS doesn't have self-link in standard fields\n language: channel.language,\n image: channel.image?.url,\n authors: channel.managingEditor\n ? [{ name: channel.managingEditor, email: channel.managingEditor }]\n : undefined,\n updated: channel.lastBuildDate || channel.pubDate,\n items: items.map((item: RssItemExtended): FeedItem => {\n return {\n id: item.guid?.value || item.link || item.title || '',\n title: item.title,\n url: item.link,\n contentHtml: item.namespaces?.contentEncoded || item.description,\n contentText: item.namespaces?.contentEncoded ? undefined : item.description,\n summary: item.description,\n published: item.pubDate,\n authors:\n item.author || item.namespaces?.dcCreator\n ? [{ name: item.author || item.namespaces?.dcCreator || '' }]\n : undefined,\n tags: item.category,\n image: item.namespaces?.mediaThumbnail?.[0]?.url,\n enclosures: item.enclosure\n ? [\n {\n url: item.enclosure.url,\n type: item.enclosure.type,\n length: item.enclosure.length,\n },\n ]\n : undefined,\n };\n }),\n };\n}\n\n/**\n * Normalize Atom feed to unified format\n */\nexport function normalizeAtom(atom: AtomDocument): Feed {\n const { feed, entries } = atom;\n\n // Find self link\n const selfLink = feed.links?.find((l) => l.rel === 'self');\n const alternateLink = feed.links?.find((l) => l.rel === 'alternate' || !l.rel);\n\n return {\n format: 'atom',\n title: feed.title,\n description: feed.subtitle,\n url: alternateLink?.href,\n feedUrl: selfLink?.href,\n language: undefined, // Atom doesn't have top-level language\n image: feed.logo || feed.icon,\n authors: feed.authors?.map(\n (a): FeedAuthor => ({\n name: a.name,\n email: a.email,\n url: a.uri,\n }),\n ),\n updated: feed.updated,\n items: entries.map((entry): FeedItem => {\n const entryAlternateLink = entry.links?.find((l) => l.rel === 'alternate' || !l.rel);\n const entryRelatedLink = entry.links?.find((l) => l.rel === 'related');\n\n return {\n id: entry.id,\n title: entry.title,\n url: entryAlternateLink?.href,\n externalUrl: entryRelatedLink?.href,\n contentHtml: entry.content?.type === 'html' ? entry.content.value : undefined,\n contentText: entry.content?.type === 'text' ? entry.content.value : undefined,\n summary: entry.summary,\n published: entry.published,\n modified: entry.updated,\n authors: entry.authors?.map(\n (a): FeedAuthor => ({\n name: a.name,\n email: a.email,\n url: a.uri,\n }),\n ),\n tags: entry.categories?.map((c) => c.term),\n image: undefined, // Atom doesn't have item images in standard\n };\n }),\n };\n}\n\n/**\n * Normalize JSON Feed to unified format\n */\nexport function normalizeJSONFeed(jsonFeed: JSONFeedDocument): Feed {\n const { feed } = jsonFeed;\n\n return {\n format: 'json-feed',\n title: feed.title,\n description: feed.description,\n url: feed.home_page_url,\n feedUrl: feed.feed_url,\n language: feed.language,\n image: feed.icon || feed.favicon,\n authors: feed.authors?.map(\n (a): FeedAuthor => ({\n name: a.name,\n email: undefined,\n url: a.url,\n }),\n ),\n updated: undefined, // JSON Feed doesn't have feed-level updated\n items: feed.items.map((item): FeedItem => {\n return {\n id: item.id,\n title: item.title,\n url: item.url,\n externalUrl: item.external_url,\n contentHtml: item.content_html,\n contentText: item.content_text,\n summary: item.summary,\n published: item.date_published,\n modified: item.date_modified,\n authors: item.authors?.map(\n (a): FeedAuthor => ({\n name: a.name,\n email: undefined,\n url: a.url,\n }),\n ),\n tags: item.tags,\n image: item.image || item.banner_image,\n enclosures: item.attachments?.map(\n (a): FeedEnclosure => ({\n url: a.url,\n type: a.mime_type,\n length: a.size_in_bytes,\n }),\n ),\n };\n }),\n };\n}\n","/**\n * Text cleaning utilities for RSS feeds\n * Handles CDATA, HTML entities, and whitespace normalization\n */\n\n/**\n * Strip CDATA tags from text\n * RSS feeds often wrap content in CDATA sections\n * Handles leading/trailing whitespace before CDATA markers\n */\nexport function stripCDATA(text: string): string {\n if (!text) return text;\n return text.replace(/^\\s*<!\\[CDATA\\[/, '').replace(/\\]\\]>\\s*$/, '');\n}\n\n/**\n * Decode common HTML entities\n * Basic entity decoding for feed content\n */\nexport function decodeEntities(text: string): string {\n if (!text) return text;\n\n const entities: Record<string, string> = {\n '&amp;': '&',\n '&lt;': '<',\n '&gt;': '>',\n '&quot;': '\"',\n '&apos;': \"'\",\n '&nbsp;': ' ',\n '&#39;': \"'\",\n '&#x27;': \"'\",\n };\n\n let result = text;\n for (const [entity, char] of Object.entries(entities)) {\n result = result.replaceAll(entity, char);\n }\n\n // Handle numeric entities\n result = result.replace(/&#(\\d+);/g, (_, dec) => {\n return String.fromCharCode(Number.parseInt(dec, 10));\n });\n\n result = result.replace(/&#x([0-9a-fA-F]+);/g, (_, hex) => {\n return String.fromCharCode(Number.parseInt(hex, 16));\n });\n\n return result;\n}\n\n/**\n * Normalize whitespace\n * Trim and collapse multiple spaces\n */\nexport function normalizeWhitespace(text: string, preserveLineBreaks = false): string {\n if (!text) return text;\n\n let result = text.trim();\n\n if (preserveLineBreaks) {\n // Collapse spaces but keep line breaks\n result = result.replace(/ +/g, ' ');\n result = result.replace(/\\n +/g, '\\n');\n result = result.replace(/ +\\n/g, '\\n');\n } else {\n // Collapse all whitespace\n result = result.replace(/\\s+/g, ' ');\n }\n\n return result;\n}\n\n/**\n * Clean text from RSS feed\n * Combines CDATA stripping, entity decoding, and whitespace normalization\n */\nexport function cleanText(\n text: string | null | undefined,\n options: {\n stripCdata?: boolean;\n decodeEntities?: boolean;\n normalizeWhitespace?: boolean;\n preserveLineBreaks?: boolean;\n } = {},\n): string {\n if (text === null || text === undefined) return '';\n if (typeof text !== 'string') return '';\n\n const {\n stripCdata = true,\n decodeEntities: shouldDecodeEntities = true,\n normalizeWhitespace: shouldNormalizeWhitespace = true,\n preserveLineBreaks = false,\n } = options;\n\n let result = text;\n\n if (stripCdata) {\n result = stripCDATA(result);\n }\n\n if (shouldDecodeEntities) {\n result = decodeEntities(result);\n }\n\n if (shouldNormalizeWhitespace) {\n result = normalizeWhitespace(result, preserveLineBreaks);\n }\n\n return result;\n}\n","/**\n * RSS date parsing utilities\n * RSS 2.0 uses RFC 822 date format\n * Examples: \"Wed, 02 Oct 2002 13:00:00 GMT\", \"Wed, 02 Oct 2002 15:00:00 +0200\"\n */\n\n/**\n * Parse RFC 822 date to ISO 8601 string\n * Returns null if date is invalid or cannot be parsed\n */\nexport function parseRFC822Date(dateString: string | null | undefined): string | null {\n if (!dateString || typeof dateString !== 'string') {\n return null;\n }\n\n const trimmed = dateString.trim();\n if (!trimmed) {\n return null;\n }\n\n try {\n // JavaScript's Date constructor handles RFC 822 format\n const date = new Date(trimmed);\n\n // Check if date is valid\n if (Number.isNaN(date.getTime())) {\n return null;\n }\n\n // Return as ISO 8601 string\n return date.toISOString();\n } catch {\n return null;\n }\n}\n\n/**\n * Parse RSS pubDate or lastBuildDate\n * Alias for parseRFC822Date for clarity\n */\nexport function parseRSSDate(dateString: string | null | undefined): string | null {\n return parseRFC822Date(dateString);\n}\n\n/**\n * Check if a date string is valid\n */\nexport function isValidDate(dateString: string | null | undefined): boolean {\n return parseRFC822Date(dateString) !== null;\n}\n","/**\n * Minimal RSS-specific XML parser\n * Built specifically for RSS feeds without HTML parsing quirks\n */\n\nexport interface RSSElement {\n /** Tag name (e.g., 'channel', 'item', 'title') */\n tagName: string;\n /** Element attributes */\n attributes: Record<string, string>;\n /** Text content (with CDATA stripped) */\n text: string;\n /** Child elements */\n children: RSSElement[];\n /** Parent element (for traversal) */\n parent: RSSElement | null;\n}\n\n/**\n * Parse RSS XML string into element tree\n */\nexport function parseRSSXML(xml: string): RSSElement {\n const cleaned = cleanXMLDeclaration(xml);\n const withoutDoctype = removeDoctype(cleaned);\n const withoutComments = removeComments(withoutDoctype);\n const root = parseElement(withoutComments, 0).element;\n return root;\n}\n\n/**\n * Remove XML declaration and clean whitespace\n */\nfunction cleanXMLDeclaration(xml: string): string {\n return xml.replace(/<\\?xml[^?]*\\?>/g, '').trim();\n}\n\n/**\n * Remove DOCTYPE declarations\n */\nfunction removeDoctype(xml: string): string {\n return xml.replace(/<!DOCTYPE[^>]*>/gi, '');\n}\n\n/**\n * Remove XML comments\n */\nfunction removeComments(xml: string): string {\n return xml.replace(/<!--[\\s\\S]*?-->/g, '');\n}\n\n/**\n * Extract CDATA content and replace with placeholder\n */\nfunction extractCDATA(text: string): { text: string; cdataMap: Map<string, string> } {\n const cdataMap = new Map<string, string>();\n let counter = 0;\n\n const processed = text.replace(/<!\\[CDATA\\[([\\s\\S]*?)\\]\\]>/g, (_match, content) => {\n const placeholder = `__CDATA_${counter}__`;\n cdataMap.set(placeholder, content);\n counter++;\n return placeholder;\n });\n\n return { text: processed, cdataMap };\n}\n\n/**\n * Restore CDATA content from placeholders\n */\nfunction restoreCDATA(text: string, cdataMap: Map<string, string>): string {\n let result = text;\n for (const [placeholder, content] of cdataMap.entries()) {\n result = result.replace(placeholder, content);\n }\n return result;\n}\n\n/**\n * Parse attributes from opening tag\n */\nfunction parseAttributes(tagContent: string): Record<string, string> {\n const attributes: Record<string, string> = {};\n const attrRegex = /(\\S+)=[\"']([^\"']*)[\"']/g;\n let match: RegExpExecArray | null = attrRegex.exec(tagContent);\n\n while (match !== null) {\n attributes[match[1]] = match[2];\n match = attrRegex.exec(tagContent);\n }\n\n return attributes;\n}\n\n/**\n * Find matching closing tag position\n */\nfunction findClosingTag(xml: string, tagName: string, startPos: number): number {\n const openTag = `<${tagName}`;\n const closeTag = `</${tagName}>`;\n let depth = 1;\n let pos = startPos;\n\n while (pos < xml.length && depth > 0) {\n const nextOpen = xml.indexOf(openTag, pos);\n const nextClose = xml.indexOf(closeTag, pos);\n\n if (nextClose === -1) {\n return -1; // No closing tag found\n }\n\n if (nextOpen !== -1 && nextOpen < nextClose) {\n // Found nested opening tag\n depth++;\n pos = nextOpen + openTag.length;\n } else {\n // Found closing tag\n depth--;\n if (depth === 0) {\n return nextClose;\n }\n pos = nextClose + closeTag.length;\n }\n }\n\n return -1;\n}\n\n/**\n * Parse a single element and its children\n */\nfunction parseElement(\n xml: string,\n startPos: number,\n parent: RSSElement | null = null,\n cdataMap?: Map<string, string>,\n): { element: RSSElement; endPos: number; cdataMap: Map<string, string> } {\n // Extract CDATA first (only at top level)\n const extracted = cdataMap ? { text: xml, cdataMap } : extractCDATA(xml);\n const cleanedXML = extracted.text;\n const currentCdataMap = extracted.cdataMap;\n\n // Find opening tag\n const openTagStart = cleanedXML.indexOf('<', startPos);\n if (openTagStart === -1) {\n throw new Error('No opening tag found');\n }\n\n const openTagEnd = cleanedXML.indexOf('>', openTagStart);\n if (openTagEnd === -1) {\n throw new Error('Unclosed opening tag');\n }\n\n const openTagContent = cleanedXML.substring(openTagStart + 1, openTagEnd);\n\n // Check for self-closing tag\n const isSelfClosing = openTagContent.endsWith('/');\n const tagContent = isSelfClosing ? openTagContent.slice(0, -1).trim() : openTagContent;\n\n // Extract tag name and attributes\n const spaceIndex = tagContent.indexOf(' ');\n const tagName = spaceIndex === -1 ? tagContent : tagContent.substring(0, spaceIndex);\n const attributes = spaceIndex === -1 ? {} : parseAttributes(tagContent.substring(spaceIndex));\n\n const element: RSSElement = {\n tagName,\n attributes,\n text: '',\n children: [],\n parent,\n };\n\n // Handle self-closing tags\n if (isSelfClosing) {\n return { element, endPos: openTagEnd + 1, cdataMap: currentCdataMap };\n }\n\n // Find closing tag\n const closingTagPos = findClosingTag(cleanedXML, tagName, openTagEnd + 1);\n if (closingTagPos === -1) {\n throw new Error(`No closing tag found for <${tagName}>`);\n }\n\n // Extract content between tags\n const content = cleanedXML.substring(openTagEnd + 1, closingTagPos);\n\n // Parse children or text content\n if (content.includes('<')) {\n // Has child elements\n let pos = 0;\n const trimmedContent = content.trim();\n\n while (pos < trimmedContent.length) {\n const nextTag = trimmedContent.indexOf('<', pos);\n if (nextTag === -1) break;\n\n // Check if it's a closing tag or comment\n if (trimmedContent[nextTag + 1] === '/' || trimmedContent[nextTag + 1] === '!') {\n pos = nextTag + 1;\n continue;\n }\n\n try {\n const { element: child, endPos } = parseElement(\n trimmedContent,\n nextTag,\n element,\n currentCdataMap,\n );\n element.children.push(child);\n pos = endPos;\n } catch {\n pos = nextTag + 1;\n }\n }\n\n // Extract text content (without child elements)\n let textContent = content.replace(/<[^>]+>/g, '').trim();\n textContent = restoreCDATA(textContent, currentCdataMap);\n element.text = textContent;\n } else {\n // Pure text content\n let textContent = content.trim();\n textContent = restoreCDATA(textContent, currentCdataMap);\n element.text = textContent;\n }\n\n const closingTagEnd = closingTagPos + `</${tagName}>`.length;\n return { element, endPos: closingTagEnd, cdataMap: currentCdataMap };\n}\n\n/**\n * Query selector - find first matching element\n * XML is case-sensitive, but we'll support case-insensitive matching for convenience\n */\nexport function querySelector(\n element: RSSElement,\n selector: string,\n caseSensitive = false,\n): RSSElement | null {\n const tagName = caseSensitive ? selector : selector.toLowerCase();\n const elementTag = caseSensitive ? element.tagName : element.tagName.toLowerCase();\n\n if (elementTag === tagName) {\n return element;\n }\n\n for (const child of element.children) {\n const found = querySelector(child, selector, caseSensitive);\n if (found) return found;\n }\n\n return null;\n}\n\n/**\n * Query selector all - find all matching elements\n */\nexport function querySelectorAll(\n element: RSSElement,\n selector: string,\n caseSensitive = false,\n): RSSElement[] {\n const results: RSSElement[] = [];\n const tagName = caseSensitive ? selector : selector.toLowerCase();\n const elementTag = caseSensitive ? element.tagName : element.tagName.toLowerCase();\n\n if (elementTag === tagName) {\n results.push(element);\n }\n\n for (const child of element.children) {\n results.push(...querySelectorAll(child, selector, caseSensitive));\n }\n\n return results;\n}\n\n/**\n * Get text content of element\n */\nexport function getText(element: RSSElement | null | undefined): string {\n return element?.text || '';\n}\n\n/**\n * Get attribute value\n */\nexport function getAttribute(element: RSSElement | null | undefined, name: string): string | null {\n return element?.attributes[name] || null;\n}\n","/**\n * Extract RSS channel (feed-level) metadata\n */\n\nimport { cleanText } from './clean-text.js';\nimport { parseRSSDate } from './parse-date.js';\nimport type { RssChannel } from './types.js';\nimport type { RSSElement } from './xml-parser.js';\nimport { getAttribute, getText, querySelector, querySelectorAll } from './xml-parser.js';\n\n/**\n * Extract channel metadata from RSS feed\n */\nexport function extractChannel(channelElement: RSSElement): RssChannel {\n const getTextClean = (selector: string): string => {\n const element = querySelector(channelElement, selector);\n return cleanText(getText(element));\n };\n\n const getNumber = (selector: string): number | undefined => {\n const text = getTextClean(selector);\n if (!text) return undefined;\n const num = Number.parseInt(text, 10);\n return Number.isNaN(num) ? undefined : num;\n };\n\n const getDate = (selector: string): string | undefined => {\n const text = getTextClean(selector);\n return parseRSSDate(text) || undefined;\n };\n\n const getArray = (selector: string): string[] | undefined => {\n const elements = querySelectorAll(channelElement, selector);\n if (elements.length === 0) return undefined;\n const cleaned = elements.map((el) => cleanText(getText(el))).filter((text) => text.length > 0);\n return cleaned.length > 0 ? cleaned : undefined;\n };\n\n // Required fields\n const title = getTextClean('title');\n const link = getTextClean('link');\n const description = getTextClean('description');\n\n // Optional fields\n const language = getTextClean('language') || undefined;\n const copyright = getTextClean('copyright') || undefined;\n const managingEditor = getTextClean('managingEditor') || undefined;\n const webMaster = getTextClean('webMaster') || undefined;\n const pubDate = getDate('pubDate');\n const lastBuildDate = getDate('lastBuildDate');\n const category = getArray('category');\n const generator = getTextClean('generator') || undefined;\n const docs = getTextClean('docs') || undefined;\n const ttl = getNumber('ttl');\n\n // Image\n const imageEl = querySelector(channelElement, 'image');\n const image = imageEl\n ? {\n url: cleanText(getText(querySelector(imageEl, 'url'))),\n title: cleanText(getText(querySelector(imageEl, 'title'))),\n link: cleanText(getText(querySelector(imageEl, 'link'))),\n width: (() => {\n const w = cleanText(getText(querySelector(imageEl, 'width')));\n return w ? Number.parseInt(w, 10) : undefined;\n })(),\n height: (() => {\n const h = cleanText(getText(querySelector(imageEl, 'height')));\n return h ? Number.parseInt(h, 10) : undefined;\n })(),\n description: cleanText(getText(querySelector(imageEl, 'description'))) || undefined,\n }\n : undefined;\n\n // Cloud\n const cloudEl = querySelector(channelElement, 'cloud');\n const cloud = cloudEl\n ? {\n domain: getAttribute(cloudEl, 'domain') || '',\n port: Number.parseInt(getAttribute(cloudEl, 'port') || '0', 10),\n path: getAttribute(cloudEl, 'path') || '',\n registerProcedure: getAttribute(cloudEl, 'registerProcedure') || '',\n protocol: getAttribute(cloudEl, 'protocol') || '',\n }\n : undefined;\n\n // Skip hours and days\n const skipHoursEl = querySelector(channelElement, 'skipHours');\n const skipHours = skipHoursEl\n ? querySelectorAll(skipHoursEl, 'hour')\n .map((el) => Number.parseInt(getText(el), 10))\n .filter((n) => !Number.isNaN(n))\n : undefined;\n\n const skipDaysEl = querySelector(channelElement, 'skipDays');\n const skipDays = skipDaysEl\n ? querySelectorAll(skipDaysEl, 'day')\n .map((el) => cleanText(getText(el)))\n .filter((t) => t.length > 0)\n : undefined;\n\n const channel: RssChannel = {\n title,\n link,\n description,\n };\n\n // Add optional fields only if they exist\n if (language) channel.language = language;\n if (copyright) channel.copyright = copyright;\n if (managingEditor) channel.managingEditor = managingEditor;\n if (webMaster) channel.webMaster = webMaster;\n if (pubDate) channel.pubDate = pubDate;\n if (lastBuildDate) channel.lastBuildDate = lastBuildDate;\n if (category) channel.category = category;\n if (generator) channel.generator = generator;\n if (docs) channel.docs = docs;\n if (cloud) channel.cloud = cloud;\n if (ttl) channel.ttl = ttl;\n if (image) channel.image = image;\n if (skipHours && skipHours.length > 0) channel.skipHours = skipHours;\n if (skipDays && skipDays.length > 0) channel.skipDays = skipDays;\n\n return channel;\n}\n","/**\n * Extract RSS item (article/entry) data\n */\n\nimport { cleanText } from './clean-text.js';\nimport { parseRSSDate } from './parse-date.js';\nimport type { RssEnclosure, RssGuid, RssItem, RssSource } from './types.js';\nimport type { RSSElement } from './xml-parser.js';\nimport { getAttribute, getText, querySelector, querySelectorAll } from './xml-parser.js';\n\n/**\n * Extract item data from RSS feed\n */\nexport function extractItem(itemElement: RSSElement): RssItem {\n const getTextClean = (selector: string): string | undefined => {\n const element = querySelector(itemElement, selector);\n const text = cleanText(getText(element));\n return text || undefined;\n };\n\n const getDate = (selector: string): string | undefined => {\n const text = getTextClean(selector);\n return text ? parseRSSDate(text) || undefined : undefined;\n };\n\n const getArray = (selector: string): string[] | undefined => {\n const elements = querySelectorAll(itemElement, selector);\n if (elements.length === 0) return undefined;\n const cleaned = elements.map((el) => cleanText(getText(el))).filter((text) => text.length > 0);\n return cleaned.length > 0 ? cleaned : undefined;\n };\n\n // RSS 2.0 spec: An item must have either title or description (or both)\n const title = getTextClean('title');\n const link = getTextClean('link');\n const description = getTextClean('description');\n const author = getTextClean('author');\n const category = getArray('category');\n const comments = getTextClean('comments');\n const pubDate = getDate('pubDate');\n\n // Enclosure\n const enclosureEl = querySelector(itemElement, 'enclosure');\n const enclosure: RssEnclosure | undefined = enclosureEl\n ? {\n url: getAttribute(enclosureEl, 'url') || '',\n length: Number.parseInt(getAttribute(enclosureEl, 'length') || '0', 10),\n type: getAttribute(enclosureEl, 'type') || '',\n }\n : undefined;\n\n // GUID\n const guidEl = querySelector(itemElement, 'guid');\n const guid: RssGuid | undefined = guidEl\n ? {\n value: cleanText(getText(guidEl)),\n isPermaLink: getAttribute(guidEl, 'isPermaLink')?.toLowerCase() !== 'false',\n }\n : undefined;\n\n // Source\n const sourceEl = querySelector(itemElement, 'source');\n const source: RssSource | undefined = sourceEl\n ? {\n value: cleanText(getText(sourceEl)),\n url: getAttribute(sourceEl, 'url') || '',\n }\n : undefined;\n\n const item: RssItem = {};\n\n // Add fields only if they exist (RSS spec allows items with minimal data)\n if (title) item.title = title;\n if (link) item.link = link;\n if (description) item.description = description;\n if (author) item.author = author;\n if (category) item.category = category;\n if (comments) item.comments = comments;\n if (enclosure) item.enclosure = enclosure;\n if (guid) item.guid = guid;\n if (pubDate) item.pubDate = pubDate;\n if (source) item.source = source;\n\n return item;\n}\n\n/**\n * Extract all items from channel\n */\nexport function extractItems(channelElement: RSSElement): RssItem[] {\n const itemElements = querySelectorAll(channelElement, 'item');\n return itemElements.map((itemEl) => extractItem(itemEl));\n}\n","/**\n * Extract RSS namespace extensions\n * Common namespaces: content:encoded, dc:creator, media:*, atom:link\n */\n\n// import type { RssMediaContent, RssMediaThumbnail } from './types.js';\nimport { cleanText } from './clean-text.js';\nimport { parseRSSDate } from './parse-date.js';\nimport type { RssNamespaces } from './types.js';\nimport type { RSSElement } from './xml-parser.js';\nimport { getAttribute, getText, querySelector, querySelectorAll } from './xml-parser.js';\n\n/**\n * Extract namespace extensions from item\n */\nexport function extractNamespaces(itemElement: RSSElement): RssNamespaces {\n const namespaces: RssNamespaces = {};\n\n // content:encoded - Full content (often HTML)\n const contentEncoded = querySelector(itemElement, 'content:encoded');\n if (contentEncoded) {\n namespaces.contentEncoded = cleanText(getText(contentEncoded), {\n preserveLineBreaks: true,\n });\n }\n\n // dc:creator - Dublin Core creator (author)\n const dcCreator = querySelector(itemElement, 'dc:creator');\n if (dcCreator) {\n namespaces.dcCreator = cleanText(getText(dcCreator));\n }\n\n // dc:date - Dublin Core date (alternative to pubDate)\n const dcDate = querySelector(itemElement, 'dc:date');\n if (dcDate) {\n const dateText = cleanText(getText(dcDate));\n // dc:date uses ISO 8601, not RFC 822\n const parsed = parseRSSDate(dateText);\n if (parsed) {\n namespaces.dcDate = parsed;\n }\n }\n\n // dc:subject - Dublin Core subject (categories)\n const dcSubjects = querySelectorAll(itemElement, 'dc:subject');\n if (dcSubjects.length > 0) {\n const subjects = dcSubjects\n .map((el) => cleanText(getText(el)))\n .filter((text) => text.length > 0);\n if (subjects.length > 0) {\n namespaces.dcSubject = subjects;\n }\n }\n\n // media:content - Media RSS content\n const mediaContents = querySelectorAll(itemElement, 'media:content');\n if (mediaContents.length > 0) {\n namespaces.mediaContent = mediaContents.map((el) => ({\n url: getAttribute(el, 'url') || '',\n type: getAttribute(el, 'type') || undefined,\n medium: getAttribute(el, 'medium') || undefined,\n width: (() => {\n const w = getAttribute(el, 'width');\n return w ? Number.parseInt(w, 10) : undefined;\n })(),\n height: (() => {\n const h = getAttribute(el, 'height');\n return h ? Number.parseInt(h, 10) : undefined;\n })(),\n }));\n }\n\n // media:thumbnail - Media RSS thumbnail\n const mediaThumbnails = querySelectorAll(itemElement, 'media:thumbnail');\n if (mediaThumbnails.length > 0) {\n namespaces.mediaThumbnail = mediaThumbnails.map((el) => ({\n url: getAttribute(el, 'url') || '',\n width: (() => {\n const w = getAttribute(el, 'width');\n return w ? Number.parseInt(w, 10) : undefined;\n })(),\n height: (() => {\n const h = getAttribute(el, 'height');\n return h ? Number.parseInt(h, 10) : undefined;\n })(),\n }));\n }\n\n return namespaces;\n}\n","/**\n * Main RSS feed parser\n * Orchestrates parsing of RSS 2.0, 0.9x feeds\n */\n\nimport { normalizeUrlHttps } from '../../utils/normalize-url.js';\nimport { extractChannel } from './extract-channel.js';\nimport { extractItem } from './extract-item.js';\nimport { extractNamespaces } from './extract-namespaces.js';\nimport type { RssChannel, RssFeedExtended, RssItem, RssItemExtended } from './types.js';\nimport { parseRSSXML, querySelector, querySelectorAll } from './xml-parser.js';\n\n/**\n * Parse RSS feed from XML string\n * Supports RSS 2.0, 0.92, 0.91, 0.9\n * @param xml - RSS XML string\n * @param baseUrl - Optional base URL for resolving relative URLs\n */\nexport function parseRSS(xml: string, baseUrl?: string | URL): RssFeedExtended {\n // Parse XML\n const doc = parseRSSXML(xml);\n\n // Find RSS root element\n const rssEl = querySelector(doc, 'rss');\n if (!rssEl) {\n throw new Error('Invalid RSS: Missing <rss> root element');\n }\n\n // Get RSS version\n const version = rssEl.attributes.version || '2.0';\n\n // Find channel element\n const channelEl = querySelector(rssEl, 'channel');\n if (!channelEl) {\n throw new Error('Invalid RSS: Missing <channel> element');\n }\n\n // Extract channel metadata\n const channel = extractChannel(channelEl);\n\n // Extract items with namespaces\n const itemElements = querySelectorAll(channelEl, 'item');\n const items: RssItemExtended[] = itemElements.map((itemEl) => {\n const item = extractItem(itemEl);\n const namespaces = extractNamespaces(itemEl);\n\n // Only add namespaces if any exist\n if (Object.keys(namespaces).length > 0) {\n return { ...item, namespaces };\n }\n\n return item;\n });\n\n // Apply URL normalization if base URL provided\n const normalizedChannel = baseUrl ? normalizeChannelUrls(channel, baseUrl) : channel;\n const normalizedItems = baseUrl ? items.map((item) => normalizeItemUrls(item, baseUrl)) : items;\n\n return {\n version,\n channel: normalizedChannel,\n items: normalizedItems,\n };\n}\n\n/**\n * Normalize all URLs in channel\n */\nfunction normalizeChannelUrls(channel: RssChannel, baseUrl: string | URL): RssChannel {\n return {\n ...channel,\n link: channel.link ? normalizeUrlHttps(baseUrl, channel.link) : channel.link,\n image: channel.image\n ? {\n ...channel.image,\n url: normalizeUrlHttps(baseUrl, channel.image.url),\n link: channel.image.link\n ? normalizeUrlHttps(baseUrl, channel.image.link)\n : channel.image.link,\n }\n : channel.image,\n docs: channel.docs ? normalizeUrlHttps(baseUrl, channel.docs) : channel.docs,\n };\n}\n\n/**\n * Normalize all URLs in item\n */\nfunction normalizeItemUrls(item: RssItem, baseUrl: string | URL): RssItem {\n return {\n ...item,\n link: item.link ? normalizeUrlHttps(baseUrl, item.link) : item.link,\n comments: item.comments ? normalizeUrlHttps(baseUrl, item.comments) : item.comments,\n enclosure: item.enclosure\n ? {\n ...item.enclosure,\n url: normalizeUrlHttps(baseUrl, item.enclosure.url),\n }\n : item.enclosure,\n };\n}\n\n/**\n * Detect if content is RSS format\n */\nexport function isRSS(xml: string): boolean {\n try {\n const trimmed = xml.trim();\n // Quick check for RSS markers\n return (\n trimmed.includes('<rss') &&\n (trimmed.includes('version=\"2.0\"') ||\n trimmed.includes(\"version='2.0'\") ||\n trimmed.includes('version=\"0.9') ||\n trimmed.includes(\"version='0.9\"))\n );\n } catch {\n return false;\n }\n}\n","/**\n * Unified feed parser with automatic format detection.\n *\n * @packageDocumentation\n */\n\nimport { parseAtom } from './atom/index.js';\nimport { detectFormat, type FeedFormat } from './detect.js';\nimport { parseJSONFeed } from './json-feed/index.js';\nimport { normalizeAtom, normalizeJSONFeed, normalizeRSS } from './normalize.js';\nimport { parseRSS } from './rss/index.js';\nimport type { Feed, ParseResult } from './types.js';\n\n/**\n * Parse any feed format with automatic format detection.\n *\n * @remarks\n * This is the main entry point for feed parsing. It automatically detects whether\n * the content is RSS, Atom, or JSON Feed, parses it, and returns a normalized\n * output structure along with the original format-specific data.\n *\n * All relative URLs in the feed are converted to absolute URLs if a base URL is provided.\n * This is essential for feed readers that need to fetch images, enclosures, or follow links.\n *\n * @param content - Feed content as string (XML or JSON)\n * @param baseUrl - Optional base URL for resolving relative URLs (string or URL object)\n * @returns Object containing normalized feed data and original format-specific data\n * @throws Error if format cannot be detected or parsing fails\n *\n * @example\n * ```typescript\n * const feedContent = await fetch('https://example.com/feed.xml').then(r => r.text());\n * const result = parseFeed(feedContent, 'https://example.com/feed.xml');\n *\n * console.log(result.feed.title);\n * console.log(result.feed.items[0].title);\n * console.log(result.feed.items[0].url); // Absolute URL\n * ```\n */\nexport function parseFeed(content: string, baseUrl?: string | URL): ParseResult {\n const format = detectFormat(content);\n\n if (format === 'unknown') {\n throw new Error('Unable to detect feed format. Content must be RSS, Atom, or JSON Feed.');\n }\n\n return parseFeedAs(content, format, baseUrl);\n}\n\n/**\n * Parse feed with explicit format specification.\n *\n * @remarks\n * Use this function when you already know the feed format and want to skip\n * automatic detection. This can be slightly faster than {@link parseFeed}\n * and provides more control over the parsing process.\n *\n * @param content - Feed content as string (XML or JSON)\n * @param format - Explicit format to parse as ('rss', 'atom', or 'json-feed')\n * @param baseUrl - Optional base URL for resolving relative URLs\n * @returns Object containing normalized feed data and original format-specific data\n * @throws Error if parsing fails or format is 'unknown'\n *\n * @example\n * ```typescript\n * // Parse known RSS feed\n * const result = parseFeedAs(rssContent, 'rss', 'https://example.com/feed.xml');\n * ```\n */\nexport function parseFeedAs(\n content: string,\n format: FeedFormat,\n baseUrl?: string | URL,\n): ParseResult {\n if (format === 'unknown') {\n throw new Error('Cannot parse feed with format \"unknown\"');\n }\n\n switch (format) {\n case 'rss': {\n const rss = parseRSS(content, baseUrl);\n return {\n feed: normalizeRSS(rss),\n original: rss,\n };\n }\n\n case 'atom': {\n const atom = parseAtom(content, baseUrl);\n return {\n feed: normalizeAtom(atom),\n original: atom,\n };\n }\n\n case 'json-feed': {\n const jsonFeed = parseJSONFeed(content, baseUrl);\n return {\n feed: normalizeJSONFeed(jsonFeed),\n original: jsonFeed,\n };\n }\n\n case 'sitemap': {\n throw new Error(\n 'Sitemaps cannot be parsed with parseFeed(). Use parseSitemap() from the sitemap module instead.',\n );\n }\n }\n}\n\n/**\n * Parse feed and return only normalized data.\n *\n * @remarks\n * Convenience wrapper around {@link parseFeed} that returns only the normalized\n * feed data without the original format-specific data. Use this when you don't\n * need access to format-specific fields.\n *\n * @param content - Feed content as string (XML or JSON)\n * @param baseUrl - Optional base URL for resolving relative URLs\n * @returns Normalized feed data only\n * @throws Error if format cannot be detected or parsing fails\n *\n * @example\n * ```typescript\n * const feed = parseFeedNormalized(content, 'https://example.com/feed.xml');\n * console.log(feed.title);\n * console.log(feed.items.length);\n * ```\n */\nexport function parseFeedNormalized(content: string, baseUrl?: string | URL): Feed {\n return parseFeed(content, baseUrl).feed;\n}\n","/**\n * Enhanced fetch types for web scraping.\n *\n * @remarks\n * Types for pluck() - fetch-compatible enhanced HTTP client.\n *\n * @author Anonyfox <max@anonyfox.com>\n * @license MIT\n * @see {@link https://github.com/Anonyfox/ravenjs}\n * @see {@link https://ravenjs.dev}\n * @see {@link https://anonyfox.com}\n *\n * @packageDocumentation\n */\n\n/**\n * Extended RequestInit with pluck-specific options.\n *\n * @remarks\n * Extends standard fetch RequestInit with additional options for\n * robust web scraping. All standard fetch options are supported.\n */\nexport interface PluckInit extends RequestInit {\n /**\n * Request timeout in milliseconds.\n *\n * @default 30000 (30 seconds)\n */\n timeout?: number;\n\n /**\n * Maximum number of redirects to follow.\n *\n * @default 10\n */\n maxRedirects?: number;\n\n /**\n * Maximum response size in bytes.\n *\n * @default 10485760 (10MB)\n */\n maxSize?: number;\n\n /**\n * User-Agent header shortcut.\n *\n * @remarks\n * Convenience property that sets the User-Agent header.\n * Overrides any User-Agent in the headers object.\n */\n userAgent?: string;\n\n /**\n * Throw error on HTTP error status (4xx, 5xx).\n *\n * @default true\n */\n throwOnHttpError?: boolean;\n\n /**\n * Validate Content-Type header.\n *\n * @remarks\n * If true, throws error if Content-Type is not in allowedContentTypes.\n *\n * @default false\n */\n strictContentType?: boolean;\n\n /**\n * Allowed Content-Type values for strictContentType.\n *\n * @default ['text/html', 'text/xml', 'application/xml', 'application/xhtml+xml', 'application/rss+xml', 'application/atom+xml', 'application/json']\n */\n allowedContentTypes?: string[];\n\n /**\n * Follow redirects automatically.\n *\n * @remarks\n * If false, returns the 3xx response directly without following.\n *\n * @default true\n */\n followRedirects?: boolean;\n\n /**\n * Validate detected encoding.\n *\n * @remarks\n * If true, throws error if detected encoding is invalid or unsupported.\n *\n * @default true\n */\n validateEncoding?: boolean;\n}\n\n/**\n * Enhanced Response with pluck-specific properties.\n *\n * @remarks\n * Extends standard Response with additional metadata about the request.\n * All standard Response properties and methods are available.\n */\nexport interface PluckResponse extends Response {\n /**\n * Final URL after following redirects.\n */\n finalUrl: string;\n\n /**\n * Original request URL.\n */\n originalUrl: string;\n\n /**\n * Array of redirect URLs (excluding original and final).\n */\n redirectChain: string[];\n\n /**\n * Detected character encoding.\n *\n * @example 'utf-8', 'windows-1252', 'iso-8859-1'\n */\n detectedEncoding: string;\n\n /**\n * Request timing information.\n */\n timing: {\n /** Request start timestamp (milliseconds since epoch) */\n start: number;\n /** Request end timestamp (milliseconds since epoch) */\n end: number;\n /** Total duration in milliseconds */\n duration: number;\n /** Time spent in redirects (milliseconds) */\n redirectDuration?: number;\n };\n\n /**\n * Get response body as UTF-8 text.\n *\n * @remarks\n * Unlike standard text(), this guarantees UTF-8 output regardless\n * of the source encoding. Uses detected encoding to decode properly.\n *\n * @returns UTF-8 decoded text\n */\n textUtf8(): Promise<string>;\n}\n\n/**\n * Base error class for pluck errors.\n */\nexport class PluckError extends Error {\n constructor(message: string) {\n super(message);\n this.name = 'PluckError';\n Error.captureStackTrace?.(this, this.constructor);\n }\n}\n\n/**\n * Network error (connection failed, DNS, etc.).\n */\nexport class PluckNetworkError extends PluckError {\n constructor(\n message: string,\n public readonly cause?: Error,\n ) {\n super(message);\n this.name = 'PluckNetworkError';\n }\n}\n\n/**\n * Request timeout error.\n */\nexport class PluckTimeoutError extends PluckError {\n constructor(\n message: string,\n public readonly timeoutMs: number,\n ) {\n super(message);\n this.name = 'PluckTimeoutError';\n }\n}\n\n/**\n * HTTP error (4xx, 5xx status codes).\n */\nexport class PluckHttpError extends PluckError {\n constructor(\n message: string,\n public readonly statusCode: number,\n public readonly statusText: string,\n public readonly response: Response,\n ) {\n super(message);\n this.name = 'PluckHttpError';\n }\n}\n\n/**\n * Response size exceeded maximum.\n */\nexport class PluckSizeError extends PluckError {\n constructor(\n message: string,\n public readonly maxSize: number,\n public readonly actualSize?: number,\n ) {\n super(message);\n this.name = 'PluckSizeError';\n }\n}\n\n/**\n * Encoding detection or conversion error.\n */\nexport class PluckEncodingError extends PluckError {\n constructor(\n message: string,\n public readonly encoding?: string,\n public readonly cause?: Error,\n ) {\n super(message);\n this.name = 'PluckEncodingError';\n }\n}\n\n/**\n * Too many redirects or redirect loop detected.\n */\nexport class PluckRedirectError extends PluckError {\n constructor(\n message: string,\n public readonly redirectChain: string[],\n public readonly maxRedirects?: number,\n ) {\n super(message);\n this.name = 'PluckRedirectError';\n }\n}\n\n/**\n * Invalid or disallowed Content-Type.\n */\nexport class PluckContentTypeError extends PluckError {\n constructor(\n message: string,\n public readonly contentType: string,\n public readonly allowedTypes?: string[],\n ) {\n super(message);\n this.name = 'PluckContentTypeError';\n }\n}\n","/**\n * Character encoding detection and conversion.\n *\n * @remarks\n * Detects character encoding from BOM, HTTP headers, and HTML meta tags.\n * Converts all content to UTF-8 using native TextDecoder.\n *\n * @author Anonyfox <max@anonyfox.com>\n * @license MIT\n *\n * @packageDocumentation\n */\n\nimport { PluckEncodingError } from './types.js';\n\n/**\n * Detect character encoding from various sources.\n *\n * @remarks\n * Priority order:\n * 1. BOM (Byte Order Mark) in content\n * 2. charset in Content-Type header\n * 3. <meta charset> in HTML (first 1KB)\n * 4. <meta http-equiv=\"Content-Type\"> in HTML\n * 5. Default to UTF-8\n *\n * @param buffer - Response body as ArrayBuffer\n * @param contentType - Content-Type header value\n * @returns Detected encoding (e.g., 'utf-8', 'windows-1252')\n */\nexport function detectEncoding(buffer: ArrayBuffer, contentType?: string | null): string {\n // Check BOM first (most reliable)\n const bomEncoding = detectBOM(buffer);\n if (bomEncoding) {\n return bomEncoding;\n }\n\n // Check Content-Type header\n if (contentType) {\n const headerEncoding = parseCharsetFromContentType(contentType);\n if (headerEncoding) {\n return headerEncoding;\n }\n }\n\n // Check first 1KB for meta declarations\n const preview = new Uint8Array(buffer.slice(0, 1024));\n const previewText = new TextDecoder('utf-8', { fatal: false }).decode(preview);\n\n // Check XML declaration first (for RSS/Atom feeds)\n const xmlEncoding = parseCharsetFromXml(previewText);\n if (xmlEncoding) {\n return xmlEncoding;\n }\n\n // Check HTML meta tags\n const metaEncoding = parseCharsetFromHtml(previewText);\n if (metaEncoding) {\n return metaEncoding;\n }\n\n // Default to UTF-8\n return 'utf-8';\n}\n\n/**\n * Detect encoding from Byte Order Mark (BOM).\n *\n * @param buffer - Response body as ArrayBuffer\n * @returns Encoding if BOM detected, null otherwise\n */\nfunction detectBOM(buffer: ArrayBuffer): string | null {\n const bytes = new Uint8Array(buffer);\n\n // UTF-8 BOM: EF BB BF\n if (bytes.length >= 3 && bytes[0] === 0xef && bytes[1] === 0xbb && bytes[2] === 0xbf) {\n return 'utf-8';\n }\n\n // UTF-16 LE BOM: FF FE\n if (bytes.length >= 2 && bytes[0] === 0xff && bytes[1] === 0xfe) {\n return 'utf-16le';\n }\n\n // UTF-16 BE BOM: FE FF\n if (bytes.length >= 2 && bytes[0] === 0xfe && bytes[1] === 0xff) {\n return 'utf-16be';\n }\n\n return null;\n}\n\n/**\n * Parse charset from Content-Type header.\n *\n * @param contentType - Content-Type header value\n * @returns Encoding if found, null otherwise\n *\n * @example\n * parseCharsetFromContentType('text/html; charset=utf-8') // 'utf-8'\n * parseCharsetFromContentType('text/html; charset=windows-1252') // 'windows-1252'\n */\nexport function parseCharsetFromContentType(contentType: string): string | null {\n const match = /charset\\s*=\\s*[\"']?([^\"'\\s;]+)/i.exec(contentType);\n if (match) {\n return normalizeEncoding(match[1]);\n }\n return null;\n}\n\n/**\n * Parse charset from HTML meta tags.\n *\n * @remarks\n * Checks for:\n * - `<meta charset=\"XXX\">`\n * - `<meta http-equiv=\"Content-Type\" content=\"text/html; charset=XXX\">`\n *\n * Uses light regex scanning, not full HTML parsing.\n *\n * @param html - HTML content (typically first 1KB)\n * @returns Encoding if found, null otherwise\n */\nexport function parseCharsetFromHtml(html: string): string | null {\n // Check <meta charset=\"XXX\">\n const charsetMatch = /<meta[^>]+charset\\s*=\\s*[\"']?([^\"'\\s>]+)/i.exec(html);\n if (charsetMatch) {\n return normalizeEncoding(charsetMatch[1]);\n }\n\n // Check <meta http-equiv=\"Content-Type\" content=\"...; charset=XXX\">\n const httpEquivMatch =\n /<meta[^>]+http-equiv\\s*=\\s*[\"']?content-type[\"']?[^>]+content\\s*=\\s*[\"']([^\"']+)/i.exec(html);\n if (httpEquivMatch) {\n const charset = parseCharsetFromContentType(httpEquivMatch[1]);\n if (charset) {\n return charset;\n }\n }\n\n return null;\n}\n\n/**\n * Parse charset from XML declaration.\n *\n * @remarks\n * Checks for: `<?xml version=\"1.0\" encoding=\"XXX\"?>`\n *\n * @param xml - XML content (typically first 1KB)\n * @returns Encoding if found, null otherwise\n */\nexport function parseCharsetFromXml(xml: string): string | null {\n // Check <?xml ... encoding=\"XXX\"?>\n const xmlDeclMatch = /<\\?xml[^?]*encoding\\s*=\\s*[\"']([^\"']+)[\"'][^?]*\\?>/i.exec(xml);\n if (xmlDeclMatch) {\n return normalizeEncoding(xmlDeclMatch[1]);\n }\n\n return null;\n}\n\n/**\n * Normalize encoding name to standard form.\n *\n * @remarks\n * Handles common aliases and variations.\n *\n * @param encoding - Raw encoding name\n * @returns Normalized encoding name\n */\nfunction normalizeEncoding(encoding: string): string {\n const normalized = encoding.toLowerCase().trim();\n\n // Common aliases\n const aliases: Record<string, string> = {\n utf8: 'utf-8',\n 'iso-8859-1': 'latin1',\n 'iso-88591': 'latin1',\n 'iso8859-1': 'latin1',\n 'windows-1252': 'windows-1252',\n cp1252: 'windows-1252',\n ansi: 'windows-1252',\n };\n\n return aliases[normalized] || normalized;\n}\n\n/**\n * Decode buffer to UTF-8 string.\n *\n * @remarks\n * Uses native TextDecoder with the detected encoding.\n * Always returns UTF-8 string, regardless of source encoding.\n *\n * @param buffer - Response body as ArrayBuffer\n * @param encoding - Character encoding (e.g., 'utf-8', 'windows-1252')\n * @param validate - Whether to throw on invalid encoding\n * @returns UTF-8 decoded string\n * @throws PluckEncodingError if encoding is invalid and validate=true\n */\nexport function decodeToUtf8(buffer: ArrayBuffer, encoding: string, validate = true): string {\n try {\n const decoder = new TextDecoder(encoding, { fatal: validate });\n return decoder.decode(buffer);\n } catch (error) {\n if (validate) {\n throw new PluckEncodingError(\n `Failed to decode content with encoding '${encoding}': ${error}`,\n encoding,\n error as Error,\n );\n }\n\n // Fallback to UTF-8 with error replacement\n const decoder = new TextDecoder('utf-8', { fatal: false });\n return decoder.decode(buffer);\n }\n}\n\n/**\n * Check if encoding is supported by TextDecoder.\n *\n * @param encoding - Encoding name to check\n * @returns True if encoding is supported\n */\nexport function isEncodingSupported(encoding: string): boolean {\n try {\n new TextDecoder(encoding);\n return true;\n } catch {\n return false;\n }\n}\n","/**\n * Enhanced fetch for web scraping.\n *\n * @remarks\n * fetch-compatible HTTP client with robust handling of real-world web content.\n *\n * @author Anonyfox <max@anonyfox.com>\n * @license MIT\n * @see {@link https://github.com/Anonyfox/ravenjs}\n * @see {@link https://ravenjs.dev}\n * @see {@link https://anonyfox.com}\n *\n * @packageDocumentation\n */\n\nimport { decodeToUtf8, detectEncoding } from './encoding.js';\nimport type { PluckInit, PluckResponse } from './types.js';\nimport {\n PluckContentTypeError,\n PluckHttpError,\n PluckNetworkError,\n PluckRedirectError,\n PluckSizeError,\n PluckTimeoutError,\n} from './types.js';\n\n// Default options\nconst DEFAULT_TIMEOUT = 30000; // 30 seconds\nconst DEFAULT_MAX_REDIRECTS = 10;\nconst DEFAULT_MAX_SIZE = 10 * 1024 * 1024; // 10MB\nconst DEFAULT_USER_AGENT =\n 'Mozilla/5.0 (compatible; Magpie-HTML/1.0; +https://github.com/Anonyfox/magpie-html)';\nconst DEFAULT_ALLOWED_CONTENT_TYPES = [\n 'text/html',\n 'text/xml',\n 'application/xml',\n 'application/xhtml+xml',\n 'application/rss+xml',\n 'application/atom+xml',\n 'application/json',\n];\n\n/**\n * Enhanced fetch for web scraping.\n *\n * @remarks\n * Drop-in replacement for fetch() with enhanced error handling, encoding detection,\n * redirect tracking, and size limits. Perfect for scraping HTML, feeds, and APIs.\n *\n * Features:\n * - Manual redirect tracking with full chain\n * - Automatic encoding detection and UTF-8 conversion\n * - Configurable timeouts and size limits\n * - Smart default headers for web scraping\n * - Content-Type validation\n * - Comprehensive error types\n *\n * @param input - URL string or Request object\n * @param init - Request options (extends standard RequestInit)\n * @returns Enhanced Response with additional metadata\n * @throws {PluckTimeoutError} Request timeout\n * @throws {PluckNetworkError} Network or DNS error\n * @throws {PluckHttpError} HTTP error status (4xx, 5xx)\n * @throws {PluckRedirectError} Too many redirects or loop\n * @throws {PluckSizeError} Response too large\n * @throws {PluckEncodingError} Invalid encoding\n * @throws {PluckContentTypeError} Invalid content type\n *\n * @example\n * ```typescript\n * // Basic usage (works like fetch)\n * const response = await pluck('https://example.com');\n * const html = await response.text();\n *\n * // With enhancements\n * console.log(response.redirectChain);\n * console.log(response.detectedEncoding);\n * console.log(response.timing);\n * ```\n *\n * @example\n * ```typescript\n * // With options\n * const response = await pluck('https://example.com', {\n * timeout: 60000,\n * maxRedirects: 5,\n * userAgent: 'MyBot/1.0',\n * throwOnHttpError: true\n * });\n * ```\n */\nexport async function pluck(\n input: string | URL | Request,\n init?: PluckInit,\n): Promise<PluckResponse> {\n const startTime = Date.now();\n\n // Parse options\n const options = normalizeOptions(init);\n const originalUrl = typeof input === 'string' || input instanceof URL ? String(input) : input.url;\n\n // Setup timeout signal\n const signal = AbortSignal.timeout(options.timeout);\n\n try {\n // Follow redirects manually to capture chain\n const { response, redirectChain, redirectDuration } = await followRedirects(\n input,\n options,\n signal,\n );\n\n const finalUrl = response.url;\n\n // Check HTTP status\n if (options.throwOnHttpError && !response.ok) {\n throw new PluckHttpError(\n `HTTP ${response.status}: ${response.statusText}`,\n response.status,\n response.statusText,\n response,\n );\n }\n\n // Validate Content-Type\n if (options.strictContentType) {\n validateContentType(response, options.allowedContentTypes);\n }\n\n // Read response with size limit\n const buffer = await readResponseWithSizeLimit(response, options.maxSize);\n\n // Detect encoding\n const contentType = response.headers.get('content-type');\n const detectedEncoding = detectEncoding(buffer, contentType);\n\n // Decode to UTF-8\n const utf8Content = decodeToUtf8(buffer, detectedEncoding, options.validateEncoding);\n\n // Create enhanced response\n const endTime = Date.now();\n const enhancedResponse = createPluckResponse(response, {\n originalUrl,\n finalUrl,\n redirectChain,\n detectedEncoding,\n utf8Content,\n timing: {\n start: startTime,\n end: endTime,\n duration: endTime - startTime,\n redirectDuration,\n },\n });\n\n return enhancedResponse;\n } catch (error) {\n // Convert errors to pluck error types\n if (error instanceof PluckTimeoutError || error instanceof PluckNetworkError) {\n throw error;\n }\n\n if ((error as Error).name === 'TimeoutError') {\n throw new PluckTimeoutError(`Request timeout after ${options.timeout}ms`, options.timeout);\n }\n\n if (error instanceof TypeError) {\n // Network errors from fetch are TypeErrors\n throw new PluckNetworkError(`Network error: ${error.message}`, error);\n }\n\n // Re-throw pluck errors as-is\n throw error;\n }\n}\n\n/**\n * Normalize pluck options with defaults.\n */\nfunction normalizeOptions(\n init?: PluckInit,\n): Required<Omit<PluckInit, keyof RequestInit>> & RequestInit {\n return {\n ...init,\n timeout: init?.timeout ?? DEFAULT_TIMEOUT,\n maxRedirects: init?.maxRedirects ?? DEFAULT_MAX_REDIRECTS,\n maxSize: init?.maxSize ?? DEFAULT_MAX_SIZE,\n userAgent: init?.userAgent ?? DEFAULT_USER_AGENT,\n throwOnHttpError: init?.throwOnHttpError ?? true,\n strictContentType: init?.strictContentType ?? false,\n allowedContentTypes: init?.allowedContentTypes ?? DEFAULT_ALLOWED_CONTENT_TYPES,\n followRedirects: init?.followRedirects ?? true,\n validateEncoding: init?.validateEncoding ?? true,\n };\n}\n\n/**\n * Follow redirects manually to capture the chain.\n */\nasync function followRedirects(\n input: string | URL | Request,\n options: ReturnType<typeof normalizeOptions>,\n signal: AbortSignal,\n): Promise<{ response: Response; redirectChain: string[]; redirectDuration: number }> {\n let url = typeof input === 'string' || input instanceof URL ? String(input) : input.url;\n const redirectChain: string[] = [];\n const redirectStart = Date.now();\n const seenUrls = new Set<string>();\n\n // If not following redirects, just do one request\n if (!options.followRedirects) {\n const response = await fetchWithHeaders(url, options, signal, false);\n return { response, redirectChain: [], redirectDuration: 0 };\n }\n\n for (let i = 0; i <= options.maxRedirects; i++) {\n // Detect redirect loops\n if (seenUrls.has(url)) {\n throw new PluckRedirectError(\n `Redirect loop detected: ${url}`,\n redirectChain,\n options.maxRedirects,\n );\n }\n seenUrls.add(url);\n\n // Fetch with manual redirect handling\n const response = await fetchWithHeaders(url, options, signal, true);\n\n // Check if it's a redirect\n if (response.status >= 300 && response.status < 400) {\n const location = response.headers.get('location');\n if (!location) {\n throw new PluckRedirectError('Redirect response missing Location header', redirectChain);\n }\n\n // Add current URL to chain\n redirectChain.push(url);\n\n // Resolve relative/absolute location\n try {\n url = new URL(location, url).href;\n } catch {\n throw new PluckRedirectError(\n `Invalid redirect location: ${location}`,\n redirectChain,\n options.maxRedirects,\n );\n }\n\n // Validate redirect URL scheme\n if (!url.startsWith('http://') && !url.startsWith('https://')) {\n throw new PluckRedirectError(\n `Invalid redirect scheme: ${url}`,\n redirectChain,\n options.maxRedirects,\n );\n }\n\n continue;\n }\n\n // Not a redirect, return response\n const redirectDuration = Date.now() - redirectStart;\n return { response, redirectChain, redirectDuration };\n }\n\n // Too many redirects\n throw new PluckRedirectError(\n `Too many redirects (>${options.maxRedirects})`,\n redirectChain,\n options.maxRedirects,\n );\n}\n\n/**\n * Fetch with smart default headers.\n */\nasync function fetchWithHeaders(\n url: string,\n options: ReturnType<typeof normalizeOptions>,\n signal: AbortSignal,\n manualRedirect: boolean,\n): Promise<Response> {\n const headers = new Headers(options.headers);\n\n // Set User-Agent\n if (!headers.has('user-agent')) {\n headers.set('user-agent', options.userAgent);\n }\n\n // Set Accept\n if (!headers.has('accept')) {\n headers.set('accept', 'text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8');\n }\n\n // Set Accept-Language\n if (!headers.has('accept-language')) {\n headers.set('accept-language', 'en-US,en;q=0.9');\n }\n\n return fetch(url, {\n ...options,\n headers,\n signal,\n redirect: manualRedirect ? 'manual' : 'follow',\n });\n}\n\n/**\n * Read response body with size limit.\n */\nasync function readResponseWithSizeLimit(\n response: Response,\n maxSize: number,\n): Promise<ArrayBuffer> {\n const contentLength = response.headers.get('content-length');\n if (contentLength) {\n const size = Number.parseInt(contentLength, 10);\n if (size > maxSize) {\n throw new PluckSizeError(\n `Response size ${size} bytes exceeds maximum ${maxSize} bytes`,\n maxSize,\n size,\n );\n }\n }\n\n // Read response\n const buffer = await response.arrayBuffer();\n\n // Check actual size\n if (buffer.byteLength > maxSize) {\n throw new PluckSizeError(\n `Response size ${buffer.byteLength} bytes exceeds maximum ${maxSize} bytes`,\n maxSize,\n buffer.byteLength,\n );\n }\n\n return buffer;\n}\n\n/**\n * Validate Content-Type header.\n */\nfunction validateContentType(response: Response, allowedTypes: string[]): void {\n const contentType = response.headers.get('content-type');\n if (!contentType) {\n throw new PluckContentTypeError('Missing Content-Type header', '(missing)', allowedTypes);\n }\n\n // Parse Content-Type (ignore charset and other parameters)\n const mimeType = contentType.split(';')[0].trim().toLowerCase();\n\n // Check if allowed\n const isAllowed = allowedTypes.some((allowed) => {\n const pattern = allowed.toLowerCase().replace('*', '.*');\n return new RegExp(`^${pattern}$`).test(mimeType);\n });\n\n if (!isAllowed) {\n throw new PluckContentTypeError(\n `Content-Type '${mimeType}' not allowed`,\n mimeType,\n allowedTypes,\n );\n }\n}\n\n/**\n * Create enhanced PluckResponse from standard Response.\n */\nfunction createPluckResponse(\n response: Response,\n metadata: {\n originalUrl: string;\n finalUrl: string;\n redirectChain: string[];\n detectedEncoding: string;\n utf8Content: string;\n timing: PluckResponse['timing'];\n },\n): PluckResponse {\n // Store UTF-8 content for textUtf8() method\n let utf8ContentCache: string | null = metadata.utf8Content;\n\n // Create enhanced response object\n const enhancedResponse = response as PluckResponse;\n\n // Add our enhancements\n enhancedResponse.originalUrl = metadata.originalUrl;\n enhancedResponse.finalUrl = metadata.finalUrl;\n enhancedResponse.redirectChain = metadata.redirectChain;\n enhancedResponse.detectedEncoding = metadata.detectedEncoding;\n enhancedResponse.timing = metadata.timing;\n\n // Add textUtf8() method\n enhancedResponse.textUtf8 = async () => {\n if (utf8ContentCache === null) {\n throw new Error('Response body already consumed');\n }\n const content = utf8ContentCache;\n utf8ContentCache = null; // Consume once\n return content;\n };\n\n return enhancedResponse;\n}\n","/**\n * HTML parsing utilities using linkedom.\n *\n * @remarks\n * This module provides a simple wrapper around linkedom for consistent\n * HTML parsing across all metadata extraction modules. Parsing should happen\n * once at the top level and the parsed document passed to all extractors.\n *\n * @packageDocumentation\n */\n\nimport { parseHTML as linkedomParseHTML } from 'linkedom';\n\n/**\n * Parse HTML string into a DOM document.\n *\n * @remarks\n * Parses HTML using linkedom, providing a standards-compliant DOM implementation.\n * This should be called once per document, with the result passed to all metadata\n * extractors for performance.\n *\n * Never throws - returns a document even for malformed HTML.\n *\n * @param html - HTML string to parse\n * @param baseUrl - Optional base URL for resolving relative URLs\n * @returns Parsed DOM document\n *\n * @example\n * ```typescript\n * const doc = parseHTML('<html><head><title>Test</title></head></html>');\n * const title = doc.querySelector('title')?.textContent;\n * ```\n */\nexport function parseHTML(html: string, baseUrl?: string): Document {\n const { document } = linkedomParseHTML(html, {\n url: baseUrl || 'https://example.com',\n });\n return document;\n}\n\n// Export Document type alias for convenience\n// Note: This is the standard DOM Document type from linkedom\nexport type HTMLDocument = Document;\n","/**\n * Meta tag extraction helpers.\n *\n * @remarks\n * Generic utilities for extracting content from <meta> tags in parsed HTML documents.\n * These helpers work with parsed HTMLElement from linkedom.\n *\n * @packageDocumentation\n */\n\nimport type { HTMLDocument as Document } from '../utils/html-parser.js';\n\n/**\n * Get content from a meta tag by name attribute.\n *\n * @remarks\n * Extracts the content attribute from a meta tag matching the specified name.\n * Returns undefined if not found.\n *\n * @param doc - Parsed HTML document\n * @param name - Value of the name attribute to search for\n * @returns Content attribute value, or undefined if not found\n *\n * @example\n * ```typescript\n * const description = getMetaContent(doc, 'description');\n * const keywords = getMetaContent(doc, 'keywords');\n * ```\n */\nexport function getMetaContent(doc: Document, name: string): string | undefined {\n const element = doc.querySelector(`meta[name=\"${name}\"]`);\n return element?.getAttribute('content') || undefined;\n}\n\n/**\n * Get content from a meta tag by property attribute (OpenGraph, etc.).\n *\n * @remarks\n * Extracts the content attribute from a meta tag matching the specified property.\n * Used primarily for OpenGraph (og:*) and Facebook (fb:*) tags.\n *\n * @param doc - Parsed HTML document\n * @param property - Value of the property attribute to search for\n * @returns Content attribute value, or undefined if not found\n *\n * @example\n * ```typescript\n * const ogTitle = getMetaProperty(doc, 'og:title');\n * const ogImage = getMetaProperty(doc, 'og:image');\n * ```\n */\nexport function getMetaProperty(doc: Document, property: string): string | undefined {\n const element = doc.querySelector(`meta[property=\"${property}\"]`);\n return element?.getAttribute('content') || undefined;\n}\n\n/**\n * Get all meta tag contents matching a name pattern.\n *\n * @remarks\n * Finds all meta tags where the name attribute starts with the given prefix.\n * Returns a Map of name → content for all matches.\n *\n * Useful for extracting groups of related meta tags (e.g., all \"twitter:*\" tags).\n *\n * @param doc - Parsed HTML document\n * @param namePrefix - Prefix to match against name attributes\n * @returns Map of name to content values\n *\n * @example\n * ```typescript\n * const twitterTags = getAllMetaByName(doc, 'twitter:');\n * // Map { 'twitter:card' => 'summary', 'twitter:site' => '@example', ... }\n * ```\n */\nexport function getAllMetaByName(doc: Document, namePrefix: string): Map<string, string> {\n const result = new Map<string, string>();\n const elements = doc.querySelectorAll(`meta[name^=\"${namePrefix}\"]`);\n\n for (const element of Array.from(elements)) {\n const name = element.getAttribute('name');\n const content = element.getAttribute('content');\n if (name && content) {\n result.set(name, content);\n }\n }\n\n return result;\n}\n\n/**\n * Get all meta tag contents matching a property pattern.\n *\n * @remarks\n * Finds all meta tags where the property attribute starts with the given prefix.\n * Returns a Map of property → content for all matches.\n *\n * Useful for extracting groups of related property tags (e.g., all \"og:*\" tags).\n *\n * @param doc - Parsed HTML document\n * @param propertyPrefix - Prefix to match against property attributes\n * @returns Map of property to content values\n *\n * @example\n * ```typescript\n * const ogTags = getAllMetaByProperty(doc, 'og:');\n * // Map { 'og:title' => 'Page Title', 'og:image' => 'https://...', ... }\n * ```\n */\nexport function getAllMetaByProperty(doc: Document, propertyPrefix: string): Map<string, string> {\n const result = new Map<string, string>();\n const elements = doc.querySelectorAll(`meta[property^=\"${propertyPrefix}\"]`);\n\n for (const element of Array.from(elements)) {\n const property = element.getAttribute('property');\n const content = element.getAttribute('content');\n if (property && content) {\n result.set(property, content);\n }\n }\n\n return result;\n}\n\n/**\n * Get all values for a specific meta property that can appear multiple times.\n *\n * @remarks\n * Some meta tags can appear multiple times (e.g., og:image, article:author).\n * This function collects all values into an array.\n *\n * @param doc - Parsed HTML document\n * @param property - Property attribute value to search for\n * @returns Array of all content values (empty if none found)\n *\n * @example\n * ```typescript\n * const images = getAllMetaPropertyValues(doc, 'og:image');\n * // ['https://example.com/image1.jpg', 'https://example.com/image2.jpg']\n * ```\n */\nexport function getAllMetaPropertyValues(doc: Document, property: string): string[] {\n const elements = doc.querySelectorAll(`meta[property=\"${property}\"]`);\n const values: string[] = [];\n\n for (const element of Array.from(elements)) {\n const content = element.getAttribute('content');\n if (content) {\n values.push(content);\n }\n }\n\n return values;\n}\n\n/**\n * Get content from meta tag by http-equiv attribute.\n *\n * @remarks\n * Extracts the content attribute from a meta tag matching the specified http-equiv value.\n * Used for HTTP header equivalents like Content-Security-Policy, X-UA-Compatible, etc.\n *\n * @param doc - Parsed HTML document\n * @param httpEquiv - Value of the http-equiv attribute to search for\n * @returns Content attribute value, or undefined if not found\n *\n * @example\n * ```typescript\n * const csp = getMetaHttpEquiv(doc, 'Content-Security-Policy');\n * const compat = getMetaHttpEquiv(doc, 'X-UA-Compatible');\n * ```\n */\nexport function getMetaHttpEquiv(doc: Document, httpEquiv: string): string | undefined {\n const element = doc.querySelector(`meta[http-equiv=\"${httpEquiv}\" i]`);\n return element?.getAttribute('content') || undefined;\n}\n","/**\n * OpenGraph metadata extraction.\n *\n * @remarks\n * Extracts Open Graph protocol metadata from HTML documents.\n *\n * @packageDocumentation\n */\n\nimport type { HTMLDocument as Document } from '../../utils/html-parser.js';\nimport { getAllMetaPropertyValues, getMetaProperty } from '../../utils/meta-helpers.js';\nimport type {\n OpenGraphArticle,\n OpenGraphAudio,\n OpenGraphBook,\n OpenGraphImage,\n OpenGraphMetadata,\n OpenGraphProfile,\n OpenGraphVideo,\n} from './types.js';\n\n/**\n * Extract OpenGraph metadata from parsed HTML document.\n *\n * @remarks\n * Extracts Open Graph protocol metadata including basic metadata,\n * article data, video/audio, images, books, and profiles.\n *\n * @param doc - Parsed HTML document\n * @returns OpenGraph metadata object\n *\n * @example\n * ```typescript\n * const doc = parseHTML(htmlString);\n * const og = extractOpenGraph(doc);\n * console.log(og.title);\n * console.log(og.image);\n * console.log(og.article?.publishedTime);\n * ```\n */\nexport function extractOpenGraph(doc: Document): OpenGraphMetadata {\n const metadata: OpenGraphMetadata = {};\n\n // Extract basic OpenGraph properties\n metadata.title = getMetaProperty(doc, 'og:title');\n metadata.type = getMetaProperty(doc, 'og:type');\n metadata.image = getMetaProperty(doc, 'og:image');\n metadata.url = getMetaProperty(doc, 'og:url');\n metadata.description = getMetaProperty(doc, 'og:description');\n metadata.siteName = getMetaProperty(doc, 'og:site_name');\n metadata.locale = getMetaProperty(doc, 'og:locale');\n\n // Alternate locales (can be multiple)\n const alternateLocales = getAllMetaPropertyValues(doc, 'og:locale:alternate');\n if (alternateLocales.length > 0) {\n metadata.localeAlternate = alternateLocales;\n }\n\n // Extract article metadata\n const article = extractArticle(doc);\n if (Object.keys(article).length > 0) {\n metadata.article = article;\n }\n\n // Extract video metadata\n const video = extractVideo(doc);\n if (Object.keys(video).length > 0) {\n metadata.video = video;\n }\n\n // Extract audio metadata\n const audio = extractAudio(doc);\n if (Object.keys(audio).length > 0) {\n metadata.audio = audio;\n }\n\n // Extract all images with metadata\n const images = extractImages(doc);\n if (images.length > 0) {\n metadata.images = images;\n }\n\n // Extract book metadata\n const book = extractBook(doc);\n if (Object.keys(book).length > 0) {\n metadata.book = book;\n }\n\n // Extract profile metadata\n const profile = extractProfile(doc);\n if (Object.keys(profile).length > 0) {\n metadata.profile = profile;\n }\n\n // Remove undefined values\n return Object.fromEntries(\n Object.entries(metadata).filter(([_, value]) => value !== undefined),\n ) as OpenGraphMetadata;\n}\n\n/**\n * Extract article-specific metadata.\n */\nfunction extractArticle(doc: Document): OpenGraphArticle {\n const article: OpenGraphArticle = {};\n\n article.publishedTime = getMetaProperty(doc, 'article:published_time');\n article.modifiedTime = getMetaProperty(doc, 'article:modified_time');\n article.expirationTime = getMetaProperty(doc, 'article:expiration_time');\n article.section = getMetaProperty(doc, 'article:section');\n\n // Multiple authors\n const authors = getAllMetaPropertyValues(doc, 'article:author');\n if (authors.length > 0) {\n article.authors = authors;\n }\n\n // Multiple tags\n const tags = getAllMetaPropertyValues(doc, 'article:tag');\n if (tags.length > 0) {\n article.tags = tags;\n }\n\n return Object.fromEntries(\n Object.entries(article).filter(([_, value]) => value !== undefined),\n ) as OpenGraphArticle;\n}\n\n/**\n * Extract video metadata.\n */\nfunction extractVideo(doc: Document): OpenGraphVideo {\n const video: OpenGraphVideo = {};\n\n video.url = getMetaProperty(doc, 'og:video') || getMetaProperty(doc, 'og:video:url');\n video.secureUrl = getMetaProperty(doc, 'og:video:secure_url');\n video.type = getMetaProperty(doc, 'og:video:type');\n video.releaseDate = getMetaProperty(doc, 'og:video:release_date');\n\n // Parse numeric values\n const width = getMetaProperty(doc, 'og:video:width');\n if (width) {\n video.width = Number.parseInt(width, 10);\n }\n\n const height = getMetaProperty(doc, 'og:video:height');\n if (height) {\n video.height = Number.parseInt(height, 10);\n }\n\n const duration = getMetaProperty(doc, 'og:video:duration');\n if (duration) {\n video.duration = Number.parseInt(duration, 10);\n }\n\n // Multiple tags\n const tags = getAllMetaPropertyValues(doc, 'og:video:tag');\n if (tags.length > 0) {\n video.tags = tags;\n }\n\n return Object.fromEntries(\n Object.entries(video).filter(([_, value]) => value !== undefined),\n ) as OpenGraphVideo;\n}\n\n/**\n * Extract audio metadata.\n */\nfunction extractAudio(doc: Document): OpenGraphAudio {\n const audio: OpenGraphAudio = {};\n\n audio.url = getMetaProperty(doc, 'og:audio') || getMetaProperty(doc, 'og:audio:url');\n audio.secureUrl = getMetaProperty(doc, 'og:audio:secure_url');\n audio.type = getMetaProperty(doc, 'og:audio:type');\n\n return Object.fromEntries(\n Object.entries(audio).filter(([_, value]) => value !== undefined),\n ) as OpenGraphAudio;\n}\n\n/**\n * Extract all images with full metadata.\n */\nfunction extractImages(doc: Document): OpenGraphImage[] {\n const images: OpenGraphImage[] = [];\n\n // Get all og:image values (can be multiple)\n const imageUrls = getAllMetaPropertyValues(doc, 'og:image');\n const imageSecureUrls = getAllMetaPropertyValues(doc, 'og:image:secure_url');\n const imageTypes = getAllMetaPropertyValues(doc, 'og:image:type');\n const imageWidths = getAllMetaPropertyValues(doc, 'og:image:width');\n const imageHeights = getAllMetaPropertyValues(doc, 'og:image:height');\n const imageAlts = getAllMetaPropertyValues(doc, 'og:image:alt');\n\n // Build image objects\n for (let i = 0; i < imageUrls.length; i++) {\n const image: OpenGraphImage = {\n url: imageUrls[i],\n secureUrl: imageSecureUrls[i],\n type: imageTypes[i],\n alt: imageAlts[i],\n };\n\n // Parse numeric dimensions\n if (imageWidths[i]) {\n image.width = Number.parseInt(imageWidths[i], 10);\n }\n if (imageHeights[i]) {\n image.height = Number.parseInt(imageHeights[i], 10);\n }\n\n // Remove undefined values\n images.push(\n Object.fromEntries(\n Object.entries(image).filter(([_, value]) => value !== undefined),\n ) as OpenGraphImage,\n );\n }\n\n return images;\n}\n\n/**\n * Extract book metadata.\n */\nfunction extractBook(doc: Document): OpenGraphBook {\n const book: OpenGraphBook = {};\n\n book.isbn = getMetaProperty(doc, 'book:isbn');\n book.releaseDate = getMetaProperty(doc, 'book:release_date');\n\n // Multiple authors\n const authors = getAllMetaPropertyValues(doc, 'book:author');\n if (authors.length > 0) {\n book.authors = authors;\n }\n\n // Multiple tags\n const tags = getAllMetaPropertyValues(doc, 'book:tag');\n if (tags.length > 0) {\n book.tags = tags;\n }\n\n return Object.fromEntries(\n Object.entries(book).filter(([_, value]) => value !== undefined),\n ) as OpenGraphBook;\n}\n\n/**\n * Extract profile metadata.\n */\nfunction extractProfile(doc: Document): OpenGraphProfile {\n const profile: OpenGraphProfile = {};\n\n profile.firstName = getMetaProperty(doc, 'profile:first_name');\n profile.lastName = getMetaProperty(doc, 'profile:last_name');\n profile.username = getMetaProperty(doc, 'profile:username');\n profile.gender = getMetaProperty(doc, 'profile:gender');\n\n return Object.fromEntries(\n Object.entries(profile).filter(([_, value]) => value !== undefined),\n ) as OpenGraphProfile;\n}\n","/**\n * JSON-LD parsing utilities.\n *\n * @remarks\n * Utilities for parsing and validating JSON-LD structured data.\n *\n * @packageDocumentation\n */\n\nimport type { JsonLdBlock } from './types.js';\n\n/**\n * Parse JSON-LD string into structured block.\n *\n * @remarks\n * Attempts to parse JSON-LD content and extract @type and @context.\n * Returns null if parsing fails.\n *\n * @param jsonString - Raw JSON-LD string\n * @returns Parsed JSON-LD block or null if invalid\n */\nexport function parseJsonLd(jsonString: string): JsonLdBlock | null {\n if (!jsonString || typeof jsonString !== 'string') {\n return null;\n }\n\n const trimmed = jsonString.trim();\n if (!trimmed) {\n return null;\n }\n\n try {\n const parsed = JSON.parse(trimmed);\n\n // Extract @type\n let type: string | string[] | undefined;\n if (parsed['@type']) {\n type = parsed['@type'];\n }\n\n // Extract @context\n const context = parsed['@context'];\n\n return {\n raw: trimmed,\n parsed,\n type,\n context,\n };\n } catch {\n // Invalid JSON - return null\n return null;\n }\n}\n\n/**\n * Check if a type matches a target type (case-insensitive, handles arrays).\n *\n * @remarks\n * Handles both string and array @type values.\n * Case-insensitive comparison.\n *\n * @param type - The @type value from JSON-LD\n * @param targetType - The type to match against\n * @returns True if type matches target\n */\nexport function isType(type: string | string[] | undefined, targetType: string): boolean {\n if (!type) {\n return false;\n }\n\n const target = targetType.toLowerCase();\n\n if (Array.isArray(type)) {\n return type.some((t) => t.toLowerCase() === target);\n }\n\n return type.toLowerCase() === target;\n}\n\n/**\n * Extract items from @graph array if present.\n *\n * @remarks\n * JSON-LD can contain a @graph array with multiple items.\n * This function extracts those items or returns the object itself if no @graph.\n *\n * @param parsed - Parsed JSON-LD object\n * @returns Array of items\n */\nexport function extractGraphItems(parsed: unknown): unknown[] {\n if (!parsed || typeof parsed !== 'object') {\n return [];\n }\n\n const obj = parsed as Record<string, unknown>;\n\n // Check for @graph array\n if (Array.isArray(obj['@graph'])) {\n return obj['@graph'];\n }\n\n // No @graph - return the object itself\n return [parsed];\n}\n\n/**\n * Get @type from an object (handles both string and array).\n *\n * @param obj - Object to extract @type from\n * @returns @type value or undefined\n */\nexport function getType(obj: unknown): string | string[] | undefined {\n if (!obj || typeof obj !== 'object') {\n return undefined;\n }\n\n const record = obj as Record<string, unknown>;\n const type = record['@type'];\n\n if (typeof type === 'string' || Array.isArray(type)) {\n return type as string | string[];\n }\n\n return undefined;\n}\n\n/**\n * Check if object matches any of the target types.\n *\n * @param obj - Object to check\n * @param targetTypes - Array of type names to match\n * @returns True if object matches any target type\n */\nexport function matchesAnyType(obj: unknown, targetTypes: string[]): boolean {\n const type = getType(obj);\n return targetTypes.some((target) => isType(type, target));\n}\n","/**\n * Schema.org / JSON-LD extraction.\n *\n * @remarks\n * Extracts structured data from JSON-LD script tags.\n *\n * @packageDocumentation\n */\n\nimport type { HTMLDocument as Document } from '../../utils/html-parser.js';\nimport { extractGraphItems, matchesAnyType, parseJsonLd } from './parse-json-ld.js';\nimport type { SchemaOrgMetadata } from './types.js';\n\n/**\n * Extract Schema.org metadata from parsed HTML document.\n *\n * @remarks\n * Finds all <script type=\"application/ld+json\"> tags, parses the JSON-LD,\n * and organizes by type for easy access.\n *\n * @param doc - Parsed HTML document\n * @returns Schema.org metadata object\n *\n * @example\n * ```typescript\n * const doc = parseHTML(htmlString);\n * const schema = extractSchemaOrg(doc);\n * console.log(schema.jsonLd.length);\n * console.log(schema.articles);\n * ```\n */\nexport function extractSchemaOrg(doc: Document): SchemaOrgMetadata {\n const metadata: SchemaOrgMetadata = {\n jsonLd: [],\n };\n\n // Find all JSON-LD script tags\n const scripts = doc.querySelectorAll('script[type=\"application/ld+json\"]');\n\n // Parse each script\n for (const script of Array.from(scripts)) {\n // Try different ways to get script content\n const content = script.textContent || script.innerHTML;\n if (!content) continue;\n\n const block = parseJsonLd(content);\n if (block) {\n metadata.jsonLd.push(block);\n }\n }\n\n // Organize by type for convenience\n if (metadata.jsonLd.length > 0) {\n organizeByType(metadata);\n }\n\n return metadata;\n}\n\n/**\n * Organize JSON-LD blocks by type for convenience accessors.\n */\nfunction organizeByType(metadata: SchemaOrgMetadata): void {\n const articles: unknown[] = [];\n const webPages: unknown[] = [];\n const breadcrumbs: unknown[] = [];\n const products: unknown[] = [];\n const events: unknown[] = [];\n const recipes: unknown[] = [];\n const videos: unknown[] = [];\n const images: unknown[] = [];\n let organization: unknown | undefined;\n let person: unknown | undefined;\n\n // Process each JSON-LD block\n for (const block of metadata.jsonLd) {\n // Extract items from @graph if present\n const items = extractGraphItems(block.parsed);\n\n for (const item of items) {\n // Articles (Article, NewsArticle, BlogPosting, etc.)\n if (matchesAnyType(item, ['Article', 'NewsArticle', 'BlogPosting', 'TechArticle'])) {\n articles.push(item);\n }\n\n // Web pages (WebPage, WebSite)\n if (matchesAnyType(item, ['WebPage', 'WebSite', 'AboutPage', 'ContactPage'])) {\n webPages.push(item);\n }\n\n // Breadcrumbs\n if (matchesAnyType(item, ['BreadcrumbList'])) {\n breadcrumbs.push(item);\n }\n\n // Products\n if (matchesAnyType(item, ['Product'])) {\n products.push(item);\n }\n\n // Events\n if (matchesAnyType(item, ['Event'])) {\n events.push(item);\n }\n\n // Recipes\n if (matchesAnyType(item, ['Recipe'])) {\n recipes.push(item);\n }\n\n // Videos\n if (matchesAnyType(item, ['VideoObject'])) {\n videos.push(item);\n }\n\n // Images\n if (matchesAnyType(item, ['ImageObject'])) {\n images.push(item);\n }\n\n // Organization (take first one)\n if (!organization && matchesAnyType(item, ['Organization', 'Corporation'])) {\n organization = item;\n }\n\n // Person (take first one)\n if (!person && matchesAnyType(item, ['Person'])) {\n person = item;\n }\n }\n }\n\n // Add to metadata if found\n if (articles.length > 0) metadata.articles = articles;\n if (webPages.length > 0) metadata.webPages = webPages;\n if (breadcrumbs.length > 0) metadata.breadcrumbs = breadcrumbs;\n if (products.length > 0) metadata.products = products;\n if (events.length > 0) metadata.events = events;\n if (recipes.length > 0) metadata.recipes = recipes;\n if (videos.length > 0) metadata.videos = videos;\n if (images.length > 0) metadata.images = images;\n if (organization) metadata.organization = organization;\n if (person) metadata.person = person;\n}\n","/**\n * SEO metadata extraction.\n *\n * @remarks\n * Extracts standard SEO meta tags from HTML documents.\n *\n * @packageDocumentation\n */\n\nimport type { HTMLDocument as Document } from '../../utils/html-parser.js';\nimport { getMetaContent } from '../../utils/meta-helpers.js';\nimport type { SEOMetadata } from './types.js';\n\n/**\n * Extract SEO metadata from parsed HTML document.\n *\n * @remarks\n * Extracts standard SEO meta tags including title, description, keywords,\n * and browser-specific configuration. All fields are optional.\n *\n * @param doc - Parsed HTML document\n * @returns SEO metadata object\n *\n * @example\n * ```typescript\n * const doc = parseHTML(htmlString);\n * const seo = extractSEO(doc);\n * console.log(seo.title); // Page title\n * console.log(seo.description); // Meta description\n * ```\n */\nexport function extractSEO(doc: Document): SEOMetadata {\n const metadata: SEOMetadata = {};\n\n // Extract <title> tag\n const titleElement = doc.querySelector('title');\n if (titleElement?.textContent) {\n metadata.title = titleElement.textContent.trim();\n }\n\n // Extract meta tags\n metadata.description = getMetaContent(doc, 'description');\n metadata.author = getMetaContent(doc, 'author');\n metadata.generator = getMetaContent(doc, 'generator');\n metadata.viewport = getMetaContent(doc, 'viewport');\n metadata.themeColor = getMetaContent(doc, 'theme-color');\n metadata.colorScheme = getMetaContent(doc, 'color-scheme');\n metadata.applicationName = getMetaContent(doc, 'application-name');\n metadata.appleMobileWebAppTitle = getMetaContent(doc, 'apple-mobile-web-app-title');\n metadata.appleMobileWebAppStatusBarStyle = getMetaContent(\n doc,\n 'apple-mobile-web-app-status-bar-style',\n );\n\n // Extract keywords as array\n const keywordsString = getMetaContent(doc, 'keywords');\n if (keywordsString) {\n metadata.keywords = keywordsString\n .split(',')\n .map((k) => k.trim())\n .filter((k) => k.length > 0);\n }\n\n // Parse apple-mobile-web-app-capable as boolean\n const capable = getMetaContent(doc, 'apple-mobile-web-app-capable');\n if (capable) {\n metadata.appleMobileWebAppCapable = capable.toLowerCase() === 'yes';\n }\n\n // Remove undefined values to keep the object clean\n return Object.fromEntries(\n Object.entries(metadata).filter(([_, value]) => value !== undefined),\n ) as SEOMetadata;\n}\n","/**\n * Twitter Card metadata extraction.\n *\n * @remarks\n * Extracts Twitter Card metadata from HTML documents.\n *\n * @packageDocumentation\n */\n\nimport type { HTMLDocument as Document } from '../../utils/html-parser.js';\nimport { getMetaContent } from '../../utils/meta-helpers.js';\nimport type { TwitterApp, TwitterCardMetadata, TwitterPlayer } from './types.js';\n\n/**\n * Extract Twitter Card metadata from parsed HTML document.\n *\n * @remarks\n * Extracts Twitter Card metadata including card type, site/creator info,\n * title/description, images, app cards, and player cards.\n *\n * @param doc - Parsed HTML document\n * @returns Twitter Card metadata object\n *\n * @example\n * ```typescript\n * const doc = parseHTML(htmlString);\n * const twitter = extractTwitterCard(doc);\n * console.log(twitter.card);\n * console.log(twitter.title);\n * ```\n */\nexport function extractTwitterCard(doc: Document): TwitterCardMetadata {\n const metadata: TwitterCardMetadata = {};\n\n // Basic Twitter Card properties\n metadata.card = getMetaContent(doc, 'twitter:card') as TwitterCardMetadata['card'];\n metadata.site = getMetaContent(doc, 'twitter:site');\n metadata.creator = getMetaContent(doc, 'twitter:creator');\n metadata.title = getMetaContent(doc, 'twitter:title');\n metadata.description = getMetaContent(doc, 'twitter:description');\n metadata.image = getMetaContent(doc, 'twitter:image');\n metadata.imageAlt = getMetaContent(doc, 'twitter:image:alt');\n\n // Extract app card data\n const app = extractApp(doc);\n if (Object.keys(app).length > 0) {\n metadata.app = app;\n }\n\n // Extract player card data\n const player = extractPlayer(doc);\n if (Object.keys(player).length > 0) {\n metadata.player = player;\n }\n\n // Remove undefined values\n return Object.fromEntries(\n Object.entries(metadata).filter(([_, value]) => value !== undefined),\n ) as TwitterCardMetadata;\n}\n\n/**\n * Extract app card metadata.\n */\nfunction extractApp(doc: Document): TwitterApp {\n const app: TwitterApp = {};\n\n // iPhone\n const iphoneName = getMetaContent(doc, 'twitter:app:name:iphone');\n const iphoneId = getMetaContent(doc, 'twitter:app:id:iphone');\n const iphoneUrl = getMetaContent(doc, 'twitter:app:url:iphone');\n if (iphoneName || iphoneId || iphoneUrl) {\n app.iphone = { name: iphoneName, id: iphoneId, url: iphoneUrl };\n // Clean up undefined values\n app.iphone = Object.fromEntries(\n Object.entries(app.iphone).filter(([_, value]) => value !== undefined),\n ) as typeof app.iphone;\n }\n\n // iPad\n const ipadName = getMetaContent(doc, 'twitter:app:name:ipad');\n const ipadId = getMetaContent(doc, 'twitter:app:id:ipad');\n const ipadUrl = getMetaContent(doc, 'twitter:app:url:ipad');\n if (ipadName || ipadId || ipadUrl) {\n app.ipad = { name: ipadName, id: ipadId, url: ipadUrl };\n app.ipad = Object.fromEntries(\n Object.entries(app.ipad).filter(([_, value]) => value !== undefined),\n ) as typeof app.ipad;\n }\n\n // Google Play\n const googleplayName = getMetaContent(doc, 'twitter:app:name:googleplay');\n const googleplayId = getMetaContent(doc, 'twitter:app:id:googleplay');\n const googleplayUrl = getMetaContent(doc, 'twitter:app:url:googleplay');\n if (googleplayName || googleplayId || googleplayUrl) {\n app.googleplay = { name: googleplayName, id: googleplayId, url: googleplayUrl };\n app.googleplay = Object.fromEntries(\n Object.entries(app.googleplay).filter(([_, value]) => value !== undefined),\n ) as typeof app.googleplay;\n }\n\n return app;\n}\n\n/**\n * Extract player card metadata.\n */\nfunction extractPlayer(doc: Document): TwitterPlayer {\n const player: TwitterPlayer = {};\n\n player.url = getMetaContent(doc, 'twitter:player');\n player.stream = getMetaContent(doc, 'twitter:player:stream');\n\n // Parse numeric values\n const width = getMetaContent(doc, 'twitter:player:width');\n if (width) {\n player.width = Number.parseInt(width, 10);\n }\n\n const height = getMetaContent(doc, 'twitter:player:height');\n if (height) {\n player.height = Number.parseInt(height, 10);\n }\n\n return Object.fromEntries(\n Object.entries(player).filter(([_, value]) => value !== undefined),\n ) as TwitterPlayer;\n}\n","/**\n * Description extraction and aggregation for websites.\n *\n * @packageDocumentation\n */\n\nimport { extractOpenGraph } from '../../metadata/opengraph/index.js';\nimport { extractSchemaOrg } from '../../metadata/schema-org/index.js';\nimport { extractSEO } from '../../metadata/seo/index.js';\nimport { extractTwitterCard } from '../../metadata/twitter-card/index.js';\nimport type { HTMLDocument as Document } from '../../utils/html-parser.js';\n\n/**\n * Extract page description from multiple sources and pick the longest.\n *\n * @remarks\n * Strategy:\n * 1. Collect all possible descriptions from metadata sources (priority order):\n * - Schema.org NewsArticle/Article description\n * - OpenGraph og:description\n * - Twitter twitter:description\n * - HTML meta description tag\n * 2. Pick the longest description (no cleaning needed)\n * 3. This ensures we get the most detailed/descriptive summary\n *\n * Note: Does not look in the body content, only metadata tags.\n *\n * @param doc - Parsed HTML document\n * @returns Best available description or undefined if none found\n *\n * @example\n * ```typescript\n * const doc = parseHTML(html);\n * const description = extractBestDescription(doc);\n * console.log(description); // Most detailed description from metadata\n * ```\n */\nexport function extractBestDescription(doc: Document): string | undefined {\n const candidates: string[] = [];\n\n // 1. Schema.org Article/NewsArticle description\n const schema = extractSchemaOrg(doc);\n if (schema.articles && schema.articles.length > 0) {\n for (const article of schema.articles) {\n const description = getStringProperty(article, 'description');\n if (description?.trim()) {\n candidates.push(description.trim());\n }\n }\n }\n\n // 2. OpenGraph description\n const og = extractOpenGraph(doc);\n if (og.description?.trim()) {\n candidates.push(og.description.trim());\n }\n\n // 3. Twitter Card description\n const twitter = extractTwitterCard(doc);\n if (twitter.description?.trim()) {\n candidates.push(twitter.description.trim());\n }\n\n // 4. HTML meta description tag\n const seo = extractSEO(doc);\n if (seo.description?.trim()) {\n candidates.push(seo.description.trim());\n }\n\n // No candidates found\n if (candidates.length === 0) {\n return undefined;\n }\n\n // Pick the longest description (more detail is better)\n candidates.sort((a, b) => b.length - a.length);\n\n return candidates[0];\n}\n\n/**\n * Safely extract a string property from an unknown object.\n */\nfunction getStringProperty(obj: unknown, prop: string): string | undefined {\n if (!obj || typeof obj !== 'object') return undefined;\n const value = (obj as Record<string, unknown>)[prop];\n return typeof value === 'string' ? value : undefined;\n}\n","/**\n * Link tag extraction helpers.\n *\n * @remarks\n * Generic utilities for extracting data from <link> tags in parsed HTML documents.\n * These helpers work with parsed HTMLElement from linkedom.\n *\n * @packageDocumentation\n */\n\nimport type { HTMLDocument as Document } from '../utils/html-parser.js';\n\n/**\n * Link element data extracted from a <link> tag.\n */\nexport interface LinkData {\n /** The href attribute value */\n href: string;\n /** The rel attribute value (optional) */\n rel?: string;\n /** The type attribute value (optional) */\n type?: string;\n /** The hreflang attribute value (optional) */\n hreflang?: string;\n /** The title attribute value (optional) */\n title?: string;\n /** The sizes attribute value (optional) */\n sizes?: string;\n /** The media attribute value (optional) */\n media?: string;\n /** The color attribute value (optional, used for mask-icon) */\n color?: string;\n}\n\n/**\n * Get href from a link tag by rel attribute.\n *\n * @remarks\n * Finds the first link tag matching the specified rel attribute and returns its href.\n * Returns undefined if not found.\n *\n * @param doc - Parsed HTML document\n * @param rel - Value of the rel attribute to search for\n * @returns Href attribute value, or undefined if not found\n *\n * @example\n * ```typescript\n * const canonical = getLinkHref(doc, 'canonical');\n * const icon = getLinkHref(doc, 'icon');\n * ```\n */\nexport function getLinkHref(doc: Document, rel: string): string | undefined {\n const element = doc.querySelector(`link[rel=\"${rel}\"]`);\n return element?.getAttribute('href') || undefined;\n}\n\n/**\n * Get all link tags matching a rel attribute.\n *\n * @remarks\n * Finds all link tags with the specified rel attribute and extracts\n * their data (href, type, hreflang, etc.).\n *\n * Useful when multiple links can have the same rel (e.g., alternate, icon).\n *\n * @param doc - Parsed HTML document\n * @param rel - Value of the rel attribute to search for\n * @returns Array of link data objects (empty if none found)\n *\n * @example\n * ```typescript\n * const alternates = getAllLinks(doc, 'alternate');\n * // [\n * // { href: '/fr', hreflang: 'fr', rel: 'alternate' },\n * // { href: '/de', hreflang: 'de', rel: 'alternate' }\n * // ]\n * ```\n */\nexport function getAllLinks(doc: Document, rel: string): LinkData[] {\n const elements = doc.querySelectorAll(`link[rel=\"${rel}\"]`);\n const links: LinkData[] = [];\n\n for (const element of Array.from(elements)) {\n const href = element.getAttribute('href');\n if (!href) continue;\n\n links.push({\n href,\n rel: element.getAttribute('rel') || undefined,\n type: element.getAttribute('type') || undefined,\n hreflang: element.getAttribute('hreflang') || undefined,\n title: element.getAttribute('title') || undefined,\n sizes: element.getAttribute('sizes') || undefined,\n media: element.getAttribute('media') || undefined,\n color: element.getAttribute('color') || undefined,\n });\n }\n\n return links;\n}\n\n/**\n * Get all link tags matching multiple rel values.\n *\n * @remarks\n * Finds all link tags where the rel attribute matches any of the provided values.\n * Useful for finding related link types (e.g., \"icon\" or \"shortcut icon\").\n *\n * @param doc - Parsed HTML document\n * @param rels - Array of rel values to search for\n * @returns Array of link data objects (empty if none found)\n *\n * @example\n * ```typescript\n * const icons = getAllLinksByRels(doc, ['icon', 'shortcut icon']);\n * ```\n */\nexport function getAllLinksByRels(doc: Document, rels: string[]): LinkData[] {\n const links: LinkData[] = [];\n\n for (const rel of rels) {\n links.push(...getAllLinks(doc, rel));\n }\n\n return links;\n}\n\n/**\n * Get all link tags matching a rel pattern (prefix).\n *\n * @remarks\n * Finds all link tags where the rel attribute starts with the given prefix.\n * Less common but useful for custom rel types.\n *\n * @param doc - Parsed HTML document\n * @param relPrefix - Prefix to match against rel attributes\n * @returns Array of link data objects (empty if none found)\n *\n * @example\n * ```typescript\n * const appLinks = getAllLinksByPrefix(doc, 'apple-');\n * ```\n */\nexport function getAllLinksByPrefix(doc: Document, relPrefix: string): LinkData[] {\n const elements = doc.querySelectorAll(`link[rel^=\"${relPrefix}\"]`);\n const links: LinkData[] = [];\n\n for (const element of Array.from(elements)) {\n const href = element.getAttribute('href');\n if (!href) continue;\n\n links.push({\n href,\n rel: element.getAttribute('rel') || undefined,\n type: element.getAttribute('type') || undefined,\n hreflang: element.getAttribute('hreflang') || undefined,\n title: element.getAttribute('title') || undefined,\n sizes: element.getAttribute('sizes') || undefined,\n media: element.getAttribute('media') || undefined,\n color: element.getAttribute('color') || undefined,\n });\n }\n\n return links;\n}\n","/**\n * Icons and visual assets extraction.\n *\n * @remarks\n * Extracts icon metadata from HTML documents.\n *\n * @packageDocumentation\n */\n\nimport type { HTMLDocument as Document } from '../../utils/html-parser.js';\nimport { getAllLinksByPrefix, getAllLinksByRels, getLinkHref } from '../../utils/link-helpers.js';\nimport { getMetaContent } from '../../utils/meta-helpers.js';\nimport type { AppleTouchIcon, IconsMetadata, MaskIcon, MSTile } from './types.js';\n\n/**\n * Extract icons metadata from parsed HTML document.\n *\n * @remarks\n * Extracts all icon-related metadata including favicons, Apple touch icons,\n * Safari mask icons, and Microsoft tile configuration.\n *\n * @param doc - Parsed HTML document\n * @returns Icons metadata\n *\n * @example\n * ```typescript\n * const doc = parseHTML(htmlString);\n * const icons = extractIcons(doc);\n * console.log(icons.favicon);\n * console.log(icons.appleTouchIcons);\n * ```\n */\nexport function extractIcons(doc: Document): IconsMetadata {\n const metadata: IconsMetadata = {};\n\n // Extract standard favicons\n const iconLinks = getAllLinksByRels(doc, ['icon', 'shortcut icon']);\n for (const link of iconLinks) {\n if (link.rel === 'icon' && !metadata.favicon) {\n metadata.favicon = link.href;\n }\n if (link.rel === 'shortcut icon' && !metadata.shortcutIcon) {\n metadata.shortcutIcon = link.href;\n }\n }\n\n // Extract Apple touch icons\n const appleTouchIcons = extractAppleTouchIcons(doc);\n if (appleTouchIcons.length > 0) {\n metadata.appleTouchIcons = appleTouchIcons;\n }\n\n // Extract Safari mask icon\n const maskIcon = extractMaskIcon(doc);\n if (maskIcon) {\n metadata.maskIcon = maskIcon;\n }\n\n // Extract Microsoft tile\n const msTile = extractMSTile(doc);\n if (Object.keys(msTile).length > 0) {\n metadata.msTile = msTile;\n }\n\n // Extract fluid icon (legacy)\n metadata.fluidIcon = getLinkHref(doc, 'fluid-icon');\n\n // Remove undefined values\n return Object.fromEntries(\n Object.entries(metadata).filter(([_, value]) => value !== undefined),\n ) as IconsMetadata;\n}\n\n/**\n * Extract Apple touch icons.\n */\nfunction extractAppleTouchIcons(doc: Document): AppleTouchIcon[] {\n const icons: AppleTouchIcon[] = [];\n\n // Get all apple-touch-icon related links\n const links = getAllLinksByPrefix(doc, 'apple-touch-icon');\n\n for (const link of links) {\n const icon: AppleTouchIcon = {\n url: link.href,\n sizes: link.sizes,\n };\n\n // Add precomposed flag only if true\n if (link.rel === 'apple-touch-icon-precomposed') {\n icon.precomposed = true;\n }\n\n // Clean up undefined values\n icons.push(\n Object.fromEntries(\n Object.entries(icon).filter(([_, value]) => value !== undefined),\n ) as AppleTouchIcon,\n );\n }\n\n return icons;\n}\n\n/**\n * Extract Safari mask icon.\n */\nfunction extractMaskIcon(doc: Document): MaskIcon | undefined {\n const url = getLinkHref(doc, 'mask-icon');\n if (!url) {\n return undefined;\n }\n\n // Get color attribute\n const linkElement = doc.querySelector('link[rel=\"mask-icon\"]');\n const color = linkElement?.getAttribute('color') || undefined;\n\n const maskIcon: MaskIcon = { url, color };\n\n return Object.fromEntries(\n Object.entries(maskIcon).filter(([_, value]) => value !== undefined),\n ) as MaskIcon;\n}\n\n/**\n * Extract Microsoft tile metadata.\n */\nfunction extractMSTile(doc: Document): MSTile {\n const tile: MSTile = {};\n\n tile.image = getMetaContent(doc, 'msapplication-TileImage');\n tile.color = getMetaContent(doc, 'msapplication-TileColor');\n tile.config = getMetaContent(doc, 'msapplication-config');\n\n return Object.fromEntries(\n Object.entries(tile).filter(([_, value]) => value !== undefined),\n ) as MSTile;\n}\n","/**\n * Image/keyvisual extraction and aggregation for websites.\n *\n * @packageDocumentation\n */\n\nimport { extractIcons } from '../../metadata/icons/index.js';\nimport { extractOpenGraph } from '../../metadata/opengraph/index.js';\nimport { extractSchemaOrg } from '../../metadata/schema-org/index.js';\nimport { extractTwitterCard } from '../../metadata/twitter-card/index.js';\nimport type { HTMLDocument as Document } from '../../utils/html-parser.js';\nimport { normalizeUrl } from '../../utils/normalize-url.js';\n\n/**\n * Extract best keyvisual/image from multiple sources with smart fallbacks.\n *\n * @remarks\n * Strategy (priority order):\n * 1. Schema.org NewsArticle/Article image (largest if array with size metadata)\n * 2. OpenGraph image (optimized for social sharing, often high quality)\n * 3. Twitter Card image (fallback social image)\n * 4. Largest Apple Touch Icon (often high quality app/site icons)\n * 5. Standard favicon (last resort)\n *\n * This ensures we get the best visual representation of the site,\n * prioritizing social media images over generic icons.\n *\n * @param doc - Parsed HTML document\n * @param baseUrl - Base URL for resolving relative URLs\n * @returns Best available image URL (absolute) or undefined if none found\n *\n * @example\n * ```typescript\n * const doc = parseHTML(html);\n * const image = extractBestImage(doc, 'https://example.com/page');\n * console.log(image); // Absolute URL of best available image\n * ```\n */\nexport function extractBestImage(doc: Document, baseUrl: string): string | undefined {\n // 1. Try Schema.org Article/NewsArticle image (largest if array)\n const schema = extractSchemaOrg(doc);\n if (schema.articles && schema.articles.length > 0) {\n for (const article of schema.articles) {\n const imageUrl = extractSchemaImage(article);\n if (imageUrl?.trim()) {\n return normalizeUrl(baseUrl, imageUrl.trim());\n }\n }\n }\n\n // 2. Try OpenGraph image (social media optimized)\n const og = extractOpenGraph(doc);\n if (og.image?.trim()) {\n return normalizeUrl(baseUrl, og.image.trim());\n }\n\n // 3. Try Twitter Card image\n const twitter = extractTwitterCard(doc);\n if (twitter.image?.trim()) {\n return normalizeUrl(baseUrl, twitter.image.trim());\n }\n\n // 4. Fall back to largest Apple Touch Icon\n const icons = extractIcons(doc);\n if (icons.appleTouchIcons && icons.appleTouchIcons.length > 0) {\n // Find the largest icon by parsing sizes\n const largest = findLargestIcon(icons.appleTouchIcons);\n if (largest?.url) {\n return normalizeUrl(baseUrl, largest.url);\n }\n }\n\n // 5. Fall back to standard favicon\n if (icons.favicon?.trim()) {\n return normalizeUrl(baseUrl, icons.favicon.trim());\n }\n\n // No image found\n return undefined;\n}\n\n/**\n * Extract image URL from Schema.org article object.\n *\n * @remarks\n * Handles multiple formats:\n * - String URL\n * - Single ImageObject with url property\n * - Array of ImageObjects (picks largest by width * height)\n *\n * @param article - Schema.org article object\n * @returns Image URL or undefined\n */\nfunction extractSchemaImage(article: unknown): string | undefined {\n if (!article || typeof article !== 'object') return undefined;\n\n const image = (article as Record<string, unknown>).image;\n if (!image) return undefined;\n\n // Case 1: Direct string URL\n if (typeof image === 'string') {\n return image;\n }\n\n // Case 2: Single ImageObject\n if (typeof image === 'object' && !Array.isArray(image)) {\n const url = getImageUrl(image);\n if (url) return url;\n }\n\n // Case 3: Array of ImageObjects (pick largest)\n if (Array.isArray(image)) {\n let largest: { url: string; size: number } | undefined;\n\n for (const img of image) {\n if (typeof img === 'string') {\n // Direct URL in array - return first one\n return img;\n }\n\n const url = getImageUrl(img);\n if (!url) continue;\n\n const width = getNumberProperty(img, 'width') || 0;\n const height = getNumberProperty(img, 'height') || 0;\n const size = width * height;\n\n if (!largest || size > largest.size) {\n largest = { url, size };\n }\n }\n\n return largest?.url;\n }\n\n return undefined;\n}\n\n/**\n * Extract URL from ImageObject.\n */\nfunction getImageUrl(img: unknown): string | undefined {\n if (!img || typeof img !== 'object') return undefined;\n const obj = img as Record<string, unknown>;\n\n // Try multiple properties\n return (\n getStringProperty(obj, 'url') ||\n getStringProperty(obj, 'contentUrl') ||\n getStringProperty(obj, '@id')\n );\n}\n\n/**\n * Safely extract a string property from an object.\n */\nfunction getStringProperty(obj: Record<string, unknown>, prop: string): string | undefined {\n const value = obj[prop];\n return typeof value === 'string' ? value : undefined;\n}\n\n/**\n * Safely extract a number property from an object.\n */\nfunction getNumberProperty(obj: unknown, prop: string): number | undefined {\n if (!obj || typeof obj !== 'object') return undefined;\n const value = (obj as Record<string, unknown>)[prop];\n\n if (typeof value === 'number') return value;\n if (typeof value === 'string') {\n const parsed = Number.parseInt(value, 10);\n return Number.isNaN(parsed) ? undefined : parsed;\n }\n return undefined;\n}\n\n/**\n * Find the largest Apple Touch Icon by size.\n *\n * @param icons - Array of Apple Touch Icons\n * @returns Largest icon or first icon if sizes not specified\n */\nfunction findLargestIcon(\n icons: Array<{ url: string; sizes?: string; precomposed?: boolean }>,\n): { url: string; sizes?: string; precomposed?: boolean } | undefined {\n if (icons.length === 0) {\n return undefined;\n }\n\n let largest = icons[0];\n let largestSize = parseSizeString(icons[0].sizes);\n\n for (const icon of icons) {\n const size = parseSizeString(icon.sizes);\n if (size > largestSize) {\n largest = icon;\n largestSize = size;\n }\n }\n\n return largest;\n}\n\n/**\n * Parse size string (e.g., \"180x180\", \"any\") to numeric value.\n *\n * @param sizeStr - Size string from sizes attribute\n * @returns Numeric size value for comparison (0 if invalid)\n */\nfunction parseSizeString(sizeStr?: string): number {\n if (!sizeStr) {\n return 0;\n }\n\n // Handle \"any\" as very large\n if (sizeStr.toLowerCase() === 'any') {\n return Number.POSITIVE_INFINITY;\n }\n\n // Parse \"WxH\" format (e.g., \"180x180\")\n const match = /^(\\d+)x(\\d+)$/i.exec(sizeStr);\n if (match) {\n const width = Number.parseInt(match[1], 10);\n const height = Number.parseInt(match[2], 10);\n // Use area (width * height) for comparison\n return width * height;\n }\n\n return 0;\n}\n","/**\n * Language and localization extraction.\n *\n * @remarks\n * Extracts language and locale metadata from HTML documents.\n *\n * @packageDocumentation\n */\n\nimport type { HTMLDocument as Document } from '../../utils/html-parser.js';\nimport {\n getAllMetaPropertyValues,\n getMetaContent,\n getMetaHttpEquiv,\n getMetaProperty,\n} from '../../utils/meta-helpers.js';\nimport type { LanguageMetadata } from './types.js';\n\n/**\n * Extract language and localization metadata from parsed HTML document.\n *\n * @remarks\n * Extracts language information from HTML lang attribute, meta tags,\n * and OpenGraph locale. Normalizes to provide a primary language and region.\n *\n * @param doc - Parsed HTML document\n * @returns Language metadata\n *\n * @example\n * ```typescript\n * const doc = parseHTML(htmlString);\n * const lang = extractLanguage(doc);\n * console.log(lang.primary); // 'en'\n * console.log(lang.region); // 'US'\n * ```\n */\nexport function extractLanguage(doc: Document): LanguageMetadata {\n const metadata: LanguageMetadata = {};\n\n // Extract HTML lang attribute\n const htmlElement = doc.querySelector('html');\n if (htmlElement) {\n const lang = htmlElement.getAttribute('lang');\n if (lang) {\n metadata.htmlLang = lang;\n }\n }\n\n // Extract content-language meta tag (can be http-equiv or name)\n metadata.contentLanguage =\n getMetaHttpEquiv(doc, 'content-language') || getMetaContent(doc, 'content-language');\n\n // Extract OpenGraph locale\n metadata.ogLocale = getMetaProperty(doc, 'og:locale');\n\n // Extract OpenGraph alternate locales\n const alternateLocales = getAllMetaPropertyValues(doc, 'og:locale:alternate');\n if (alternateLocales.length > 0) {\n metadata.alternateLocales = alternateLocales;\n }\n\n // Determine primary language and region\n const { primary, region } = parseLanguageCode(\n metadata.htmlLang || metadata.contentLanguage || metadata.ogLocale,\n );\n\n if (primary) {\n metadata.primary = primary;\n }\n if (region) {\n metadata.region = region;\n }\n\n // Remove undefined values\n return Object.fromEntries(\n Object.entries(metadata).filter(([_, value]) => value !== undefined),\n ) as LanguageMetadata;\n}\n\n/**\n * Parse language code to extract language and region.\n *\n * @remarks\n * Handles various formats:\n * - en → { primary: 'en' }\n * - en-US → { primary: 'en', region: 'US' }\n * - en_US → { primary: 'en', region: 'US' }\n * - en-us → { primary: 'en', region: 'US' }\n *\n * @param code - Language code to parse\n * @returns Normalized primary language and region\n */\nfunction parseLanguageCode(code?: string): { primary?: string; region?: string } {\n if (!code) {\n return {};\n }\n\n // Normalize separators (both - and _ are used)\n const normalized = code.trim().replace(/_/g, '-');\n\n // Split on - or space\n const parts = normalized.split(/[-\\s]/);\n\n if (parts.length === 0) {\n return {};\n }\n\n // First part is the language code (lowercase)\n const primary = parts[0].toLowerCase();\n\n // Second part (if exists) is the region code (uppercase)\n const region = parts.length > 1 ? parts[1].toUpperCase() : undefined;\n\n return { primary, region };\n}\n","/**\n * Language extraction and aggregation for websites.\n *\n * @packageDocumentation\n */\n\nimport { extractLanguage } from '../../metadata/language/index.js';\nimport type { HTMLDocument as Document } from '../../utils/html-parser.js';\n\n/**\n * Language information for a website.\n */\nexport interface WebsiteLanguage {\n /** Primary language code (ISO 639-1, e.g., 'en', 'de', 'fr') */\n language?: string;\n /** Region code (ISO 3166-1 alpha-2, e.g., 'US', 'GB', 'DE') */\n region?: string;\n}\n\n/**\n * Extract best available language information from the document.\n *\n * @remarks\n * Uses the language metadata extractor to determine the primary language\n * and region of the page. Prioritizes HTML lang attribute, then content-language\n * meta tag, then OpenGraph locale.\n *\n * The returned language code is normalized to ISO 639-1 format (e.g., 'en')\n * and the region code (if available) to ISO 3166-1 alpha-2 (e.g., 'US').\n *\n * @param doc - Parsed HTML document\n * @returns Language information with ISO codes\n *\n * @example\n * ```typescript\n * const doc = parseHTML(html);\n * const lang = extractBestLanguage(doc);\n * console.log(lang.language); // 'en'\n * console.log(lang.region); // 'US'\n * ```\n */\nexport function extractBestLanguage(doc: Document): WebsiteLanguage {\n const metadata = extractLanguage(doc);\n\n return {\n language: metadata.primary,\n region: metadata.region,\n };\n}\n","/**\n * Links extraction.\n *\n * @remarks\n * Extract navigational links from HTML documents with advanced filtering\n * and categorization for crawler and SEO use cases.\n *\n * @author Anonyfox <max@anonyfox.com>\n * @license MIT\n * @see {@link https://github.com/Anonyfox/ravenjs}\n * @see {@link https://ravenjs.dev}\n * @see {@link https://anonyfox.com}\n *\n * @packageDocumentation\n */\n\nimport type { HTMLDocument as Document } from '../../utils/html-parser.js';\nimport { normalizeUrl } from '../../utils/normalize-url.js';\nimport type { ExtractedLink, LinksExtractionOptions, LinksMetadata } from './types.js';\n\n/**\n * Extract links from parsed HTML document.\n *\n * @remarks\n * Extracts all `<a href>` links with comprehensive metadata and filtering options.\n * Perfect for crawlers, SEO analysis, and link discovery.\n *\n * Features:\n * - Internal/external link categorization\n * - Rel attribute filtering (nofollow, ugc, sponsored, etc.)\n * - Automatic URL normalization\n * - Hash link filtering\n * - Scheme filtering (only http/https)\n * - Deduplication\n * - Link text extraction\n *\n * @param doc - Parsed HTML document\n * @param baseUrl - Base URL for resolving relative links and determining internal/external\n * @param options - Extraction options for filtering and categorization\n * @returns Links metadata with categorized links\n *\n * @example\n * ```typescript\n * const doc = parseHTML(htmlString);\n * const links = extractLinks(doc, 'https://example.com');\n *\n * // Get all internal links (same origin)\n * console.log(links.internal);\n *\n * // Get external links excluding nofollow\n * const linksNoFollow = extractLinks(doc, 'https://example.com', {\n * scope: 'external',\n * excludeRel: ['nofollow']\n * });\n * ```\n *\n * @example\n * ```typescript\n * // Crawler use case - get follow-able links\n * const links = extractLinks(doc, baseUrl, {\n * excludeRel: ['nofollow', 'ugc', 'sponsored'],\n * includeHashLinks: false\n * });\n * ```\n */\nexport function extractLinks(\n doc: Document,\n baseUrl?: string | URL | null,\n options: LinksExtractionOptions = {},\n): LinksMetadata {\n const opts = normalizeOptions(options);\n\n // Determine effective base URL (from <base> tag or parameter)\n const effectiveBaseUrl = getEffectiveBaseUrl(doc, baseUrl);\n const baseOrigin = effectiveBaseUrl ? getOrigin(effectiveBaseUrl) : null;\n\n // Extract all links\n const allLinks = extractAllLinks(doc, effectiveBaseUrl, baseOrigin, opts);\n\n // Categorize links\n const internal: ExtractedLink[] = [];\n const external: ExtractedLink[] = [];\n const nofollow: ExtractedLink[] = [];\n\n for (const link of allLinks) {\n if (link.internal) internal.push(link);\n if (link.external) external.push(link);\n if (link.nofollow) nofollow.push(link);\n }\n\n // Build metadata\n const metadata: LinksMetadata = {\n all: allLinks.length > 0 ? allLinks : undefined,\n internal: internal.length > 0 ? internal : undefined,\n external: external.length > 0 ? external : undefined,\n nofollow: nofollow.length > 0 ? nofollow : undefined,\n totalCount: allLinks.length,\n internalCount: internal.length,\n externalCount: external.length,\n nofollowCount: nofollow.length,\n };\n\n // Remove undefined values\n return Object.fromEntries(\n Object.entries(metadata).filter(([_, value]) => value !== undefined),\n ) as LinksMetadata;\n}\n\n/**\n * Normalize extraction options.\n */\nfunction normalizeOptions(options: LinksExtractionOptions): Required<LinksExtractionOptions> {\n return {\n scope: options.scope || 'all',\n excludeRel: options.excludeRel || [],\n includeRel: options.includeRel || [],\n includeHashLinks: options.includeHashLinks ?? false,\n deduplicate: options.deduplicate ?? true,\n limit: options.limit || Number.POSITIVE_INFINITY,\n };\n}\n\n/**\n * Get effective base URL from <base> tag or parameter.\n */\nfunction getEffectiveBaseUrl(doc: Document, baseUrl?: string | URL | null): string | null {\n // Check for <base> tag first\n const baseElement = doc.querySelector('base[href]');\n if (baseElement) {\n const baseHref = baseElement.getAttribute('href');\n if (baseHref) {\n try {\n // If baseUrl is provided, resolve relative base href against it\n if (baseUrl) {\n const resolvedBase = normalizeUrl(baseUrl, baseHref);\n return resolvedBase || null;\n }\n return baseHref;\n } catch {\n // Fall through to use provided baseUrl\n }\n }\n }\n\n // Use provided base URL\n if (baseUrl) {\n return typeof baseUrl === 'string' ? baseUrl : baseUrl.href;\n }\n\n return null;\n}\n\n/**\n * Get origin from URL string.\n */\nfunction getOrigin(url: string): string | null {\n try {\n const parsed = new URL(url);\n return parsed.origin;\n } catch {\n return null;\n }\n}\n\n/**\n * Extract all links from document.\n */\nfunction extractAllLinks(\n doc: Document,\n baseUrl: string | null,\n baseOrigin: string | null,\n options: Required<LinksExtractionOptions>,\n): ExtractedLink[] {\n const links: ExtractedLink[] = [];\n const seenUrls = new Set<string>();\n\n // Get all anchor elements\n const anchorElements = doc.querySelectorAll('a[href]');\n\n for (const anchor of Array.from(anchorElements)) {\n const href = anchor.getAttribute('href');\n if (!href) continue;\n\n const trimmedHref = href.trim();\n if (!trimmedHref) continue;\n\n // Skip hash-only links if not allowed\n if (!options.includeHashLinks && trimmedHref.startsWith('#')) {\n continue;\n }\n\n // Check scheme - only allow http/https or relative URLs\n const scheme = getScheme(trimmedHref);\n if (scheme && !isHttpLike(scheme)) {\n continue;\n }\n\n // Parse rel attribute\n const rel = anchor.getAttribute('rel')?.trim() || undefined;\n const relParts = rel ? rel.toLowerCase().split(/\\s+/).filter(Boolean) : [];\n\n // Check rel exclusions\n if (options.excludeRel.length > 0) {\n const hasExcluded = relParts.some((r) =>\n options.excludeRel.includes(\n r as 'nofollow' | 'noopener' | 'noreferrer' | 'ugc' | 'sponsored',\n ),\n );\n if (hasExcluded) continue;\n }\n\n // Check rel inclusions\n if (options.includeRel.length > 0) {\n const hasIncluded = relParts.some((r) =>\n options.includeRel.includes(\n r as 'nofollow' | 'noopener' | 'noreferrer' | 'ugc' | 'sponsored',\n ),\n );\n if (!hasIncluded) continue;\n }\n\n // Normalize URL\n let normalizedUrl: string;\n try {\n normalizedUrl = normalizeUrl(baseUrl, trimmedHref) || trimmedHref;\n } catch {\n continue;\n }\n\n // Deduplicate if enabled\n if (options.deduplicate) {\n if (seenUrls.has(normalizedUrl)) continue;\n seenUrls.add(normalizedUrl);\n }\n\n // Determine if internal/external\n let isInternal = false;\n let isExternal = false;\n\n if (baseOrigin) {\n try {\n const linkOrigin = getOrigin(normalizedUrl);\n if (linkOrigin) {\n isInternal = linkOrigin === baseOrigin;\n isExternal = linkOrigin !== baseOrigin;\n }\n } catch {\n // Unable to determine, skip classification\n }\n }\n\n // Apply scope filter\n if (options.scope === 'internal' && !isInternal) continue;\n if (options.scope === 'external' && !isExternal) continue;\n\n // Extract link metadata\n const link: ExtractedLink = {\n url: normalizedUrl,\n text: anchor.textContent?.trim() || undefined,\n title: anchor.getAttribute('title')?.trim() || undefined,\n rel: rel || undefined,\n target: anchor.getAttribute('target')?.trim() || undefined,\n internal: isInternal || undefined,\n external: isExternal || undefined,\n nofollow: relParts.includes('nofollow') || undefined,\n ugc: relParts.includes('ugc') || undefined,\n sponsored: relParts.includes('sponsored') || undefined,\n noopener: relParts.includes('noopener') || undefined,\n noreferrer: relParts.includes('noreferrer') || undefined,\n };\n\n // Clean up undefined values\n links.push(\n Object.fromEntries(\n Object.entries(link).filter(([_, value]) => value !== undefined),\n ) as ExtractedLink,\n );\n\n // Check limit\n if (links.length >= options.limit) {\n break;\n }\n }\n\n return links;\n}\n\n/**\n * Get URL scheme.\n */\nfunction getScheme(url: string): string {\n const match = /^([a-zA-Z][a-zA-Z0-9+.-]*):/.exec(url);\n return match ? match[1].toLowerCase() : '';\n}\n\n/**\n * Check if scheme is HTTP-like.\n */\nfunction isHttpLike(scheme: string): boolean {\n return scheme === 'http' || scheme === 'https' || scheme === '';\n}\n","/**\n * Links extraction and aggregation for websites.\n *\n * @packageDocumentation\n */\n\nimport { extractLinks } from '../../metadata/links/index.js';\nimport type { HTMLDocument as Document } from '../../utils/html-parser.js';\n\n/**\n * Result of link extraction with internal and external links separated.\n */\nexport interface ExtractedLinksResult {\n /** Internal links (same domain, excluding current page URL) */\n internal: string[];\n /** External links (different domains) */\n external: string[];\n}\n\n/**\n * Extract and categorize links from a page.\n *\n * @remarks\n * Strategy:\n * 1. Extract all links using the links metadata extractor\n * 2. Separate into internal (same domain) and external (different domains)\n * 3. Exclude the current page URL from internal links (self-reference)\n * 4. Return arrays of unique URL strings\n *\n * @param doc - Parsed HTML document\n * @param pageUrl - Current page URL (for categorization and self-exclusion)\n * @returns Object with internal and external link arrays\n *\n * @example\n * ```typescript\n * const doc = parseHTML(html);\n * const { internal, external } = extractPageLinks(doc, 'https://example.com/page');\n * console.log(internal); // ['https://example.com/about', 'https://example.com/contact']\n * console.log(external); // ['https://other.com', 'https://twitter.com/...']\n * ```\n */\nexport function extractPageLinks(doc: Document, pageUrl: string): ExtractedLinksResult {\n // Extract all links with categorization\n const linksMetadata = extractLinks(doc, pageUrl, {\n deduplicate: true,\n includeHashLinks: false, // Exclude #anchor links\n });\n\n // Normalize current page URL for comparison (remove hash/query if present)\n const currentUrl = normalizePageUrl(pageUrl);\n\n // Extract internal links (exclude self-reference)\n const internal: string[] = [];\n if (linksMetadata.internal) {\n for (const link of linksMetadata.internal) {\n const normalizedLink = normalizePageUrl(link.url);\n // Exclude the current page itself\n if (normalizedLink !== currentUrl) {\n internal.push(link.url);\n }\n }\n }\n\n // Extract external links\n const external: string[] = [];\n if (linksMetadata.external) {\n for (const link of linksMetadata.external) {\n external.push(link.url);\n }\n }\n\n return {\n internal,\n external,\n };\n}\n\n/**\n * Normalize a page URL for comparison (remove hash and query params).\n *\n * @remarks\n * This ensures we can properly detect self-references even if the link\n * includes query parameters or hash fragments.\n *\n * @param url - URL to normalize\n * @returns Normalized URL (origin + pathname)\n */\nfunction normalizePageUrl(url: string): string {\n try {\n const parsed = new URL(url);\n // Return origin + pathname (no query, no hash)\n return parsed.origin + parsed.pathname;\n } catch {\n return url;\n }\n}\n","/**\n * Title cleaning utilities.\n *\n * @remarks\n * Utilities for cleaning page titles by removing brand names and other noise.\n *\n * @packageDocumentation\n */\n\n/**\n * Common title separators used between content title and brand name.\n */\nconst TITLE_SEPARATORS = [\n '|',\n '-',\n '·',\n '•',\n ':',\n '—', // em dash\n '–', // en dash\n '›',\n '»',\n '//',\n];\n\n/**\n * Clean a page title by removing brand names and separators.\n *\n * @remarks\n * Many websites use patterns like \"Page Title | Brand Name\" or \"Article - Site Name\".\n * This function applies heuristics to detect and remove the brand portion:\n *\n * 1. Splits on common separators (|, -, ·, :, etc.)\n * 2. Identifies brand by length (usually shorter)\n * 3. Detects domain-like patterns (contains dots)\n * 4. Returns the more meaningful content title\n *\n * If no clear brand pattern is detected, returns the original title.\n *\n * @param title - Raw page title string\n * @returns Cleaned title without brand suffix/prefix\n *\n * @example\n * ```typescript\n * cleanTitle('Breaking News | CNN'); // 'Breaking News'\n * cleanTitle('GitHub - Where the world builds software'); // 'Where the world builds software'\n * cleanTitle('Article Title · example.com'); // 'Article Title'\n * cleanTitle('Simple Title'); // 'Simple Title' (no change)\n * ```\n */\nexport function cleanTitle(title: string): string {\n if (!title?.trim()) {\n return title;\n }\n\n const trimmed = title.trim();\n\n // Try each separator\n for (const separator of TITLE_SEPARATORS) {\n if (!trimmed.includes(separator)) {\n continue;\n }\n\n // Detect spacing pattern around separator (check first occurrence)\n const sepIndex = trimmed.indexOf(separator);\n const hasSpaceBefore = sepIndex > 0 && trimmed[sepIndex - 1] === ' ';\n const hasSpaceAfter = sepIndex < trimmed.length - 1 && trimmed[sepIndex + 1] === ' ';\n\n // Build join string that preserves original spacing\n let joinStr = separator;\n if (hasSpaceBefore) joinStr = ` ${joinStr}`;\n if (hasSpaceAfter) joinStr = `${joinStr} `;\n\n // Split by separator and clean up parts\n const parts = trimmed\n .split(separator)\n .map((part) => part.trim())\n .filter((part) => part.length > 0);\n\n // If only one part after split, continue to next separator\n if (parts.length < 2) {\n continue;\n }\n\n // For exactly 2 parts, try to identify brand\n // Common patterns: \"Title | Brand\" or \"Brand | Title\"\n if (parts.length === 2) {\n const [first, second] = parts;\n const brandIndex = identifyBrandIndex([first, second]);\n\n // Return the non-brand part\n return brandIndex === 0 ? second : first;\n }\n\n // For 3+ parts, heuristic: brand is usually first or last\n // Keep the middle/longer parts\n const firstIsBrand = isBrand(parts[0], parts.slice(1));\n const lastIsBrand = isBrand(parts[parts.length - 1], parts.slice(0, -1));\n\n if (firstIsBrand && !lastIsBrand) {\n return parts.slice(1).join(joinStr);\n }\n if (lastIsBrand && !firstIsBrand) {\n return parts.slice(0, -1).join(joinStr);\n }\n\n // If both or neither seem like brand, return original (no brand detected)\n return trimmed;\n }\n\n // No brand pattern detected, return original\n return trimmed;\n}\n\n/**\n * Identify which part is likely the brand (0 or 1).\n *\n * @param parts - Array of exactly 2 title parts\n * @returns Index of the brand part (0 or 1)\n */\nfunction identifyBrandIndex(parts: [string, string]): 0 | 1 {\n const [first, second] = parts;\n\n // Check for domain-like pattern (contains dots)\n const firstHasDots = /\\w+\\.\\w+/.test(first);\n const secondHasDots = /\\w+\\.\\w+/.test(second);\n\n if (firstHasDots && !secondHasDots) {\n return 0; // First is brand (domain)\n }\n if (secondHasDots && !firstHasDots) {\n return 1; // Second is brand (domain)\n }\n\n // Check for all-caps pattern (often brands/sites)\n const firstAllCaps = first === first.toUpperCase() && /[A-Z]/.test(first);\n const secondAllCaps = second === second.toUpperCase() && /[A-Z]/.test(second);\n\n if (firstAllCaps && !secondAllCaps && first.length < 20) {\n return 0; // First is brand (short all-caps)\n }\n if (secondAllCaps && !firstAllCaps && second.length < 20) {\n return 1; // Second is brand (short all-caps)\n }\n\n // Default: shorter part is likely the brand\n return first.length < second.length ? 0 : 1;\n}\n\n/**\n * Check if a part is likely a brand name.\n *\n * @param candidate - Potential brand string\n * @param others - Other parts to compare against\n * @returns True if candidate is likely a brand\n */\nfunction isBrand(candidate: string, others: string[]): boolean {\n // Domain-like pattern\n if (/\\w+\\.\\w+/.test(candidate)) {\n return true;\n }\n\n // Very short compared to others\n const avgLength = others.reduce((sum, s) => sum + s.length, 0) / others.length;\n if (candidate.length < avgLength * 0.5 && candidate.length < 30) {\n return true;\n }\n\n // All caps and short\n if (candidate === candidate.toUpperCase() && /[A-Z]/.test(candidate) && candidate.length < 20) {\n return true;\n }\n\n return false;\n}\n","/**\n * Title extraction and aggregation for websites.\n *\n * @packageDocumentation\n */\n\nimport { extractOpenGraph } from '../../metadata/opengraph/index.js';\nimport { extractSchemaOrg } from '../../metadata/schema-org/index.js';\nimport { extractSEO } from '../../metadata/seo/index.js';\nimport { extractTwitterCard } from '../../metadata/twitter-card/index.js';\nimport { cleanTitle } from '../../utils/clean-title.js';\nimport type { HTMLDocument as Document } from '../../utils/html-parser.js';\n\n/**\n * Extract page title from multiple sources, clean them, and pick the longest.\n *\n * @remarks\n * Strategy:\n * 1. Collect all possible titles from multiple sources (priority order):\n * - Schema.org NewsArticle/Article headline (cleanest, no brand)\n * - OpenGraph og:title\n * - Twitter twitter:title\n * - Schema.org WebPage name (may include brand)\n * - HTML <title> tag\n * - First <h1> element\n * 2. Clean each title to remove brand suffixes\n * 3. Pick the longest cleaned title\n * 4. This ensures we get the most substantial/descriptive title\n *\n * @param doc - Parsed HTML document\n * @returns Best available title or undefined if none found\n *\n * @example\n * ```typescript\n * const doc = parseHTML(html);\n * const title = extractBestTitle(doc);\n * console.log(title); // Most descriptive title without brand\n * ```\n */\nexport function extractBestTitle(doc: Document): string | undefined {\n const candidates: string[] = [];\n\n // 1. Schema.org Article/NewsArticle headline (cleanest, no brand)\n const schema = extractSchemaOrg(doc);\n if (schema.articles && schema.articles.length > 0) {\n for (const article of schema.articles) {\n const headline = getStringProperty(article, 'headline');\n if (headline?.trim()) {\n candidates.push(headline.trim());\n }\n }\n }\n\n // 2. OpenGraph title\n const og = extractOpenGraph(doc);\n if (og.title?.trim()) {\n candidates.push(og.title.trim());\n }\n\n // 3. Twitter Card title\n const twitter = extractTwitterCard(doc);\n if (twitter.title?.trim()) {\n candidates.push(twitter.title.trim());\n }\n\n // 4. Schema.org WebPage name (may include brand)\n if (schema.webPages && schema.webPages.length > 0) {\n for (const page of schema.webPages) {\n const name = getStringProperty(page, 'name');\n if (name?.trim()) {\n candidates.push(name.trim());\n }\n }\n }\n\n // 5. HTML <title> tag\n const seo = extractSEO(doc);\n if (seo.title?.trim()) {\n candidates.push(seo.title.trim());\n }\n\n // 6. First <h1> element\n const h1 = doc.querySelector('h1');\n if (h1?.textContent?.trim()) {\n candidates.push(h1.textContent.trim());\n }\n\n // No candidates found\n if (candidates.length === 0) {\n return undefined;\n }\n\n // Clean all candidates and pick the longest\n const cleaned = candidates.map((title) => ({\n original: title,\n cleaned: cleanTitle(title),\n }));\n\n // Sort by cleaned length (descending) and return the longest\n cleaned.sort((a, b) => b.cleaned.length - a.cleaned.length);\n\n return cleaned[0].cleaned;\n}\n\n/**\n * Safely extract a string property from an unknown object.\n */\nfunction getStringProperty(obj: unknown, prop: string): string | undefined {\n if (!obj || typeof obj !== 'object') return undefined;\n const value = (obj as Record<string, unknown>)[prop];\n return typeof value === 'string' ? value : undefined;\n}\n","/**\n * Canonical and alternate URL extraction.\n *\n * @remarks\n * Extracts canonical URLs, alternates, and special versions from HTML documents.\n *\n * @packageDocumentation\n */\n\nimport type { HTMLDocument as Document } from '../../utils/html-parser.js';\nimport { getAllLinks, getLinkHref } from '../../utils/link-helpers.js';\nimport { getMetaProperty } from '../../utils/meta-helpers.js';\nimport type { AlternateLink, AppLinks, CanonicalMetadata } from './types.js';\n\n/**\n * Extract canonical and alternate URL metadata from parsed HTML document.\n *\n * @remarks\n * Extracts canonical URLs, language alternates, AMP versions, manifests,\n * and app linking metadata.\n *\n * @param doc - Parsed HTML document\n * @returns Canonical metadata object\n *\n * @example\n * ```typescript\n * const doc = parseHTML(htmlString);\n * const canonical = extractCanonical(doc);\n * console.log(canonical.canonical);\n * console.log(canonical.alternates);\n * ```\n */\nexport function extractCanonical(doc: Document): CanonicalMetadata {\n const metadata: CanonicalMetadata = {};\n\n // Extract canonical URL\n metadata.canonical = getLinkHref(doc, 'canonical');\n\n // Extract alternate links (language versions, feeds, etc.)\n const alternateLinks = getAllLinks(doc, 'alternate');\n if (alternateLinks.length > 0) {\n metadata.alternates = alternateLinks.map((link): AlternateLink => {\n const alt: AlternateLink = {\n href: link.href,\n };\n\n if (link.hreflang) alt.hreflang = link.hreflang;\n if (link.type) alt.type = link.type;\n if (link.title) alt.title = link.title;\n\n return alt;\n });\n }\n\n // Extract AMP version\n metadata.amphtml = getLinkHref(doc, 'amphtml');\n\n // Extract manifest\n metadata.manifest = getLinkHref(doc, 'manifest');\n\n // Extract app links\n const appLinks = extractAppLinks(doc);\n if (Object.keys(appLinks).length > 0) {\n metadata.appLinks = appLinks;\n }\n\n // Remove undefined values\n return Object.fromEntries(\n Object.entries(metadata).filter(([_, value]) => value !== undefined),\n ) as CanonicalMetadata;\n}\n\n/**\n * Extract app linking metadata.\n */\nfunction extractAppLinks(doc: Document): AppLinks {\n const appLinks: AppLinks = {};\n\n // App Links (Facebook standard)\n appLinks.ios = getMetaProperty(doc, 'al:ios:url');\n appLinks.android = getMetaProperty(doc, 'al:android:url');\n appLinks.web = getMetaProperty(doc, 'al:web:url');\n\n return Object.fromEntries(\n Object.entries(appLinks).filter(([_, value]) => value !== undefined),\n ) as AppLinks;\n}\n","/**\n * URL determination for websites.\n *\n * @packageDocumentation\n */\n\nimport { extractCanonical } from '../../metadata/canonical/index.js';\nimport type { HTMLDocument as Document } from '../../utils/html-parser.js';\n\n/**\n * Extract the best/authoritative URL for a page.\n *\n * @remarks\n * Strategy:\n * 1. Check for canonical URL in <link rel=\"canonical\"> tag (authoritative)\n * 2. Fall back to the final URL after redirects (from fetch)\n *\n * The canonical URL is preferred as it represents the publisher's intended\n * URL for the content, even if accessed via a different URL or redirect chain.\n *\n * @param doc - Parsed HTML document\n * @param finalUrl - Final URL after following redirects (from pluck)\n * @returns Best available URL (canonical or final URL)\n *\n * @example\n * ```typescript\n * const doc = parseHTML(html);\n * const url = extractBestUrl(doc, 'https://example.com/page');\n * console.log(url); // Canonical URL if present, otherwise finalUrl\n * ```\n */\nexport function extractBestUrl(doc: Document, finalUrl: string): string {\n // 1. Try canonical URL (authoritative)\n const canonical = extractCanonical(doc);\n if (canonical.canonical?.trim()) {\n return canonical.canonical.trim();\n }\n\n // 2. Fall back to final URL after redirects\n return finalUrl;\n}\n","/**\n * High-level article gathering functionality.\n *\n * @packageDocumentation\n */\n\nimport { htmlToText } from '../../content/html-to-text/index.js';\nimport { calculateReadingTime, countWords, extractContent } from '../../content/index.js';\nimport { pluck } from '../../pluck/index.js';\nimport { parseHTML } from '../../utils/html-parser.js';\nimport type { Article } from '../types.js';\nimport { extractBestDescription } from '../website/description.js';\nimport { extractBestImage } from '../website/image.js';\nimport { extractBestLanguage } from '../website/language.js';\nimport { extractPageLinks } from '../website/links.js';\nimport { extractBestTitle } from '../website/title.js';\nimport { extractBestUrl } from '../website/url.js';\n\n/**\n * Gather article data from a URL in one convenient call.\n *\n * @remarks\n * This is a high-level convenience method that fetches an article page and extracts\n * relevant data. It handles encoding detection, redirects, and provides\n * a unified interface for all article data.\n *\n * This method will be extended incrementally to include metadata extraction,\n * content extraction, and more.\n *\n * @param url - Article URL as string or URL object\n * @returns Gathered article data including URL, content, metadata, language, and links\n * @throws Error if URL is invalid or fetch fails\n *\n * @example\n * ```typescript\n * // Fetch an article and get its data\n * const article = await gatherArticle('https://example.com/article');\n * console.log(article.url); // Final URL after redirects\n * console.log(article.html); // Raw HTML content (UTF-8)\n * console.log(article.text); // Plain text (full page HTML converted)\n * console.log(article.content); // Cleaned article content (Readability + htmlToText)\n * console.log(article.title); // Article title (from Readability or metadata)\n * console.log(article.description); // Article excerpt or description\n * console.log(article.image); // Article keyvisual/image (from best source)\n * console.log(article.language); // Language code (ISO 639-1, e.g., 'en')\n * console.log(article.region); // Region code (ISO 3166-1 alpha-2, e.g., 'US')\n * console.log(article.internalLinks); // Array of internal link URLs\n * console.log(article.externalLinks); // Array of external link URLs\n * console.log(article.wordCount); // Word count (from content or text)\n * console.log(article.readingTime); // Estimated reading time in minutes\n * ```\n */\nexport async function gatherArticle(url: string | URL): Promise<Article> {\n // Convert string to URL and validate\n let articleUrl: URL;\n try {\n articleUrl = typeof url === 'string' ? new URL(url) : url;\n } catch (error) {\n throw new Error(`Invalid article URL: ${typeof url === 'string' ? url : url.toString()}`, {\n cause: error,\n });\n }\n\n // Ensure URL is valid (has protocol and host)\n if (!articleUrl.protocol || !articleUrl.host) {\n throw new Error(`Invalid article URL: must have protocol and host (${articleUrl.toString()})`);\n }\n\n // Fetch the article\n const response = await pluck(articleUrl);\n const html = await response.textUtf8();\n\n // Parse HTML document\n const doc = parseHTML(html);\n\n // Extract plain text from HTML\n const text = htmlToText(html);\n\n // Extract best URL (canonical or final redirect URL)\n const pageUrl = extractBestUrl(doc, response.finalUrl);\n\n // Extract title, description, and content: try Readability first, fall back to metadata\n let title: string | undefined;\n let description: string | undefined;\n let content: string | undefined;\n\n try {\n // Try to extract article content with Mozilla Readability\n const contentResult = extractContent(doc, { baseUrl: pageUrl });\n\n if (contentResult.success) {\n // Extract title if available\n if (contentResult.title?.trim()) {\n title = contentResult.title.trim();\n }\n\n // Extract excerpt/description if available\n if (contentResult.excerpt?.trim()) {\n description = contentResult.excerpt.trim();\n }\n\n // Extract cleaned HTML content and convert to plain text\n if (contentResult.content?.trim()) {\n content = htmlToText(contentResult.content);\n }\n }\n } catch {\n // Readability extraction failed, will fall back to metadata\n }\n\n // If no title from Readability, fall back to metadata title\n if (!title) {\n title = extractBestTitle(doc);\n }\n\n // If no excerpt from Readability, fall back to metadata description\n if (!description) {\n description = extractBestDescription(doc);\n }\n\n // Extract best image from metadata\n const imageUrl = extractBestImage(doc, pageUrl);\n let image: URL | undefined;\n if (imageUrl) {\n try {\n image = new URL(imageUrl);\n } catch {\n // Skip invalid image URL\n }\n }\n\n // Extract language and region\n const { language, region } = extractBestLanguage(doc);\n\n // Extract internal and external links\n const { internal, external } = extractPageLinks(doc, pageUrl);\n const internalLinks: URL[] = [];\n for (const link of internal) {\n try {\n internalLinks.push(new URL(link));\n } catch {\n // Skip invalid URLs\n }\n }\n const externalLinks: URL[] = [];\n for (const link of external) {\n try {\n externalLinks.push(new URL(link));\n } catch {\n // Skip invalid URLs\n }\n }\n\n // Calculate word count and reading time\n // Prefer content (Readability-cleaned) over text (full page)\n const textForCounting = content?.trim() ? content : text;\n const wordCount = countWords(textForCounting);\n const readingTime = calculateReadingTime(wordCount);\n\n // Return the gathered article data\n return {\n url: new URL(pageUrl),\n html,\n text,\n content,\n title,\n description,\n image,\n language,\n region,\n internalLinks,\n externalLinks,\n wordCount,\n readingTime,\n };\n}\n","/**\n * High-level feed gathering functionality.\n *\n * @packageDocumentation\n */\n\nimport { parseFeed } from '../feed/parse.js';\nimport type { Feed } from '../feed/types.js';\nimport { pluck } from '../pluck/index.js';\n\n/**\n * Gather and parse a feed from a URL in one convenient call.\n *\n * @remarks\n * This is a high-level convenience method that combines fetching and parsing.\n * It handles encoding detection, redirects, and feed format detection automatically.\n *\n * @param url - Feed URL as string or URL object\n * @returns Normalized feed data\n * @throws Error if URL is invalid, fetch fails, or feed cannot be parsed\n *\n * @example\n * ```typescript\n * // Fetch and parse a feed\n * const feed = await gatherFeed('https://example.com/feed.xml');\n *\n * console.log(feed.title);\n * console.log(feed.items[0].title);\n * console.log(feed.items[0].url);\n * ```\n */\nexport async function gatherFeed(url: string | URL): Promise<Feed> {\n // Convert string to URL and validate\n let feedUrl: URL;\n try {\n feedUrl = typeof url === 'string' ? new URL(url) : url;\n } catch (error) {\n throw new Error(`Invalid feed URL: ${typeof url === 'string' ? url : url.toString()}`, {\n cause: error,\n });\n }\n\n // Ensure URL is valid (has protocol and host)\n if (!feedUrl.protocol || !feedUrl.host) {\n throw new Error(`Invalid feed URL: must have protocol and host (${feedUrl.toString()})`);\n }\n\n // Fetch the feed content\n const response = await pluck(feedUrl);\n const content = await response.textUtf8();\n\n // Parse the feed using the final URL (after redirects)\n const result = parseFeed(content, response.finalUrl);\n\n return result.feed;\n}\n","/**\n * Feed discovery heuristics.\n *\n * @remarks\n * Common feed URL patterns and heuristics for feed discovery.\n *\n * @packageDocumentation\n */\n\n/**\n * Common feed URL patterns to check.\n *\n * @remarks\n * These are common patterns for feed URLs. They should be checked relative\n * to the site's base URL.\n */\nexport const COMMON_FEED_PATHS = [\n '/feed',\n '/feed/',\n '/feeds',\n '/feeds/',\n '/rss',\n '/rss/',\n '/rss.xml',\n '/feed.xml',\n '/atom.xml',\n '/index.xml',\n '/feed.json',\n '/feed.rss',\n '/blog/feed',\n '/blog/rss',\n '/news/feed',\n '/news/rss',\n];\n\n/**\n * Generate feed URL suggestions based on the document URL.\n *\n * @remarks\n * Returns common feed URLs that might exist, relative to the document URL.\n * These are just suggestions - not verified to actually exist.\n *\n * @param documentUrl - The URL of the current document\n * @returns Array of suggested feed URLs\n */\nexport function generateFeedSuggestions(documentUrl?: string | URL): string[] {\n if (!documentUrl) {\n return COMMON_FEED_PATHS;\n }\n\n try {\n const url = typeof documentUrl === 'string' ? new URL(documentUrl) : documentUrl;\n const origin = url.origin;\n\n // Generate full URLs by combining origin with common paths\n return COMMON_FEED_PATHS.map((path) => `${origin}${path}`);\n } catch {\n // If URL parsing fails, return relative paths\n return COMMON_FEED_PATHS;\n }\n}\n","/**\n * Feed discovery extraction.\n *\n * @remarks\n * Discovers RSS, Atom, and JSON feeds in HTML documents.\n *\n * @packageDocumentation\n */\n\nimport type { HTMLDocument as Document } from '../../utils/html-parser.js';\nimport { getAllLinks } from '../../utils/link-helpers.js';\nimport { generateFeedSuggestions } from './heuristics.js';\nimport type { DiscoveredFeed, FeedDiscoveryMetadata } from './types.js';\n\n/**\n * Extract feed discovery metadata from parsed HTML document.\n *\n * @remarks\n * Finds all feeds declared in <link rel=\"alternate\"> tags and generates\n * suggestions for common feed URL patterns.\n *\n * @param doc - Parsed HTML document\n * @param documentUrl - Optional document URL for generating absolute feed suggestions\n * @returns Feed discovery metadata\n *\n * @example\n * ```typescript\n * const doc = parseHTML(htmlString);\n * const feeds = extractFeedDiscovery(doc, 'https://example.com');\n * console.log(feeds.feeds); // Discovered feeds\n * console.log(feeds.suggestions); // Suggested feed URLs\n * ```\n */\nexport function extractFeedDiscovery(\n doc: Document,\n documentUrl?: string | URL,\n): FeedDiscoveryMetadata {\n const metadata: FeedDiscoveryMetadata = {\n feeds: [],\n };\n\n // Find all alternate links\n const alternateLinks = getAllLinks(doc, 'alternate');\n\n // Filter for feed types and map to DiscoveredFeed format\n for (const link of alternateLinks) {\n const feedType = determineFeedType(link.type);\n if (feedType) {\n metadata.feeds.push({\n url: link.href,\n type: feedType,\n title: link.title,\n });\n }\n }\n\n // Clean up undefined titles\n metadata.feeds = metadata.feeds.map((feed) =>\n Object.fromEntries(Object.entries(feed).filter(([_, value]) => value !== undefined)),\n ) as DiscoveredFeed[];\n\n // Generate suggestions if document URL provided\n if (documentUrl) {\n metadata.suggestions = generateFeedSuggestions(documentUrl);\n }\n\n return metadata;\n}\n\n/**\n * Determine feed type from MIME type.\n */\nfunction determineFeedType(mimeType?: string): 'rss' | 'atom' | 'json' | 'unknown' | null {\n if (!mimeType) {\n return null;\n }\n\n const type = mimeType.toLowerCase();\n\n if (type.includes('rss') || type === 'application/rss+xml') {\n return 'rss';\n }\n\n if (type.includes('atom') || type === 'application/atom+xml') {\n return 'atom';\n }\n\n if (type.includes('json') || type === 'application/feed+json' || type === 'application/json') {\n return 'json';\n }\n\n // If it has xml or json in the type but doesn't match above, it might still be a feed\n if (type.includes('xml') || type.includes('json')) {\n return 'unknown';\n }\n\n return null;\n}\n","/**\n * Icon extraction and aggregation for websites.\n *\n * @packageDocumentation\n */\n\nimport { extractIcons } from '../../metadata/icons/index.js';\nimport type { AppleTouchIcon } from '../../metadata/icons/types.js';\nimport type { HTMLDocument as Document } from '../../utils/html-parser.js';\n\n/**\n * Extract best icon/favicon from multiple sources with smart fallbacks.\n *\n * @remarks\n * Strategy (priority order):\n * 1. Largest Apple Touch Icon (often high quality, 180x180+)\n * 2. Safari mask icon (SVG, scalable, modern)\n * 3. Standard favicon (most common)\n * 4. Shortcut icon (legacy fallback)\n * 5. Microsoft tile image (Windows)\n * 6. Fluid icon (legacy, rare)\n *\n * This ensures we get the highest quality icon available,\n * prioritizing modern, high-resolution icons over legacy formats.\n *\n * @param doc - Parsed HTML document\n * @returns Best available icon URL or undefined if none found\n *\n * @example\n * ```typescript\n * const doc = parseHTML(html);\n * const icon = extractBestIcon(doc);\n * console.log(icon); // URL of best available icon\n * ```\n */\nexport function extractBestIcon(doc: Document): string | undefined {\n const icons = extractIcons(doc);\n\n // Priority 1: Largest Apple Touch Icon (high quality)\n if (icons.appleTouchIcons && icons.appleTouchIcons.length > 0) {\n const largest = findLargestAppleTouchIcon(icons.appleTouchIcons);\n if (largest?.url) {\n return largest.url;\n }\n }\n\n // Priority 2: Safari mask icon (SVG, scalable)\n if (icons.maskIcon?.url) {\n return icons.maskIcon.url;\n }\n\n // Priority 3: Standard favicon (most common)\n if (icons.favicon?.trim()) {\n return icons.favicon.trim();\n }\n\n // Priority 4: Shortcut icon (legacy)\n if (icons.shortcutIcon?.trim()) {\n return icons.shortcutIcon.trim();\n }\n\n // Priority 5: Microsoft tile image\n if (icons.msTile?.image?.trim()) {\n return icons.msTile.image.trim();\n }\n\n // Priority 6: Fluid icon (legacy, rare)\n if (icons.fluidIcon?.trim()) {\n return icons.fluidIcon.trim();\n }\n\n return undefined;\n}\n\n/**\n * Find the largest Apple Touch Icon by size.\n *\n * @remarks\n * Parses size strings like \"180x180\" and compares by area (width * height).\n * Special handling for \"any\" size (treated as largest, typically SVG).\n *\n * @param icons - Array of Apple Touch Icons\n * @returns Largest icon or first icon if sizes not specified\n */\nfunction findLargestAppleTouchIcon(icons: AppleTouchIcon[]): AppleTouchIcon | undefined {\n if (icons.length === 0) {\n return undefined;\n }\n\n let largest = icons[0];\n let largestSize = parseSizeString(icons[0].sizes);\n\n for (const icon of icons) {\n const size = parseSizeString(icon.sizes);\n if (size > largestSize) {\n largest = icon;\n largestSize = size;\n }\n }\n\n return largest;\n}\n\n/**\n * Parse size string (e.g., \"180x180\", \"any\") to numeric value for comparison.\n *\n * @param sizeStr - Size string from sizes attribute\n * @returns Numeric size value (area = width * height), or 0 if invalid\n */\nfunction parseSizeString(sizeStr?: string): number {\n if (!sizeStr) {\n return 0;\n }\n\n // Handle \"any\" as very large (typically SVG, scalable)\n if (sizeStr.toLowerCase() === 'any') {\n return Number.POSITIVE_INFINITY;\n }\n\n // Parse \"WxH\" format (e.g., \"180x180\")\n const match = /^(\\d+)x(\\d+)$/i.exec(sizeStr);\n if (match) {\n const width = Number.parseInt(match[1], 10);\n const height = Number.parseInt(match[2], 10);\n // Use area (width * height) for comparison\n return width * height;\n }\n\n return 0;\n}\n","/**\n * High-level website gathering functionality.\n *\n * @packageDocumentation\n */\n\nimport { htmlToText } from '../../content/html-to-text/index.js';\nimport { extractFeedDiscovery } from '../../metadata/feed-discovery/index.js';\nimport { pluck } from '../../pluck/index.js';\nimport { parseHTML } from '../../utils/html-parser.js';\nimport type { Website } from '../types.js';\nimport { extractBestDescription } from './description.js';\nimport { extractBestIcon } from './icon.js';\nimport { extractBestImage } from './image.js';\nimport { extractBestLanguage } from './language.js';\nimport { extractPageLinks } from './links.js';\nimport { extractBestTitle } from './title.js';\nimport { extractBestUrl } from './url.js';\n\n/**\n * Gather website data from a URL in one convenient call.\n *\n * @remarks\n * This is a high-level convenience method that fetches a website and extracts\n * all relevant data. It handles encoding detection, redirects, and provides\n * a unified interface for all website data.\n *\n * This method will be extended incrementally to include metadata extraction,\n * content extraction, and more.\n *\n * @param url - Website URL as string or URL object\n * @returns Gathered website data including final URL, title, description, image, icon, language, html, text, feeds, and links\n * @throws Error if URL is invalid or fetch fails\n *\n * @example\n * ```typescript\n * // Fetch a website and get its data\n * const site = await gatherWebsite('https://example.com');\n * console.log(site.url); // Final URL after redirects\n * console.log(site.title); // Page title (cleaned, from best source)\n * console.log(site.description); // Page description (from best source)\n * console.log(site.image); // Page image/keyvisual (from best source)\n * console.log(site.icon); // Best available icon/favicon\n * console.log(site.language); // Primary language code (ISO 639-1)\n * console.log(site.region); // Region code (ISO 3166-1 alpha-2)\n * console.log(site.html); // Raw HTML content (UTF-8)\n * console.log(site.text); // Plain text content (extracted from HTML)\n * console.log(site.feeds); // Array of feed URL objects\n * console.log(site.internalLinks); // Array of internal link URL objects\n * console.log(site.externalLinks); // Array of external link URL objects\n * ```\n */\nexport async function gatherWebsite(url: string | URL): Promise<Website> {\n // Convert string to URL and validate\n let siteUrl: URL;\n try {\n siteUrl = typeof url === 'string' ? new URL(url) : url;\n } catch (error) {\n throw new Error(`Invalid website URL: ${typeof url === 'string' ? url : url.toString()}`, {\n cause: error,\n });\n }\n\n // Ensure URL is valid (has protocol and host)\n if (!siteUrl.protocol || !siteUrl.host) {\n throw new Error(`Invalid website URL: must have protocol and host (${siteUrl.toString()})`);\n }\n\n // Fetch the website\n const response = await pluck(siteUrl);\n const html = await response.textUtf8();\n\n // Parse HTML document\n const doc = parseHTML(html);\n\n // Extract plain text from HTML\n const text = htmlToText(html);\n\n // Extract best URL (canonical or final redirect URL)\n const pageUrl = extractBestUrl(doc, response.finalUrl);\n\n // Extract feed discovery metadata\n const feedDiscovery = extractFeedDiscovery(doc, pageUrl);\n\n // Convert feed URLs to URL objects (filter out invalid URLs)\n const feeds: URL[] = [];\n for (const feed of feedDiscovery.feeds) {\n try {\n feeds.push(new URL(feed.url));\n } catch {\n // Skip invalid feed URLs\n }\n }\n\n // Extract best title, description, image, icon, and language from multiple sources\n const title = extractBestTitle(doc);\n const description = extractBestDescription(doc);\n const imageUrl = extractBestImage(doc, pageUrl);\n const iconUrl = extractBestIcon(doc);\n const { language, region } = extractBestLanguage(doc);\n\n // Convert image URL string to URL object\n let image: URL | undefined;\n if (imageUrl) {\n try {\n image = new URL(imageUrl);\n } catch {\n // Skip invalid image URL\n }\n }\n\n // Convert icon URL string to URL object\n let icon: URL | undefined;\n if (iconUrl) {\n try {\n icon = new URL(iconUrl);\n } catch {\n // Skip invalid icon URL\n }\n }\n\n // Extract internal and external links\n const { internal, external } = extractPageLinks(doc, pageUrl);\n\n // Convert link strings to URL objects\n const internalLinks: URL[] = [];\n for (const link of internal) {\n try {\n internalLinks.push(new URL(link));\n } catch {\n // Skip invalid URLs\n }\n }\n\n const externalLinks: URL[] = [];\n for (const link of external) {\n try {\n externalLinks.push(new URL(link));\n } catch {\n // Skip invalid URLs\n }\n }\n\n // Return the gathered website data\n return {\n url: new URL(pageUrl),\n feeds,\n title,\n description,\n image,\n icon,\n language,\n region,\n html,\n text,\n internalLinks,\n externalLinks,\n };\n}\n","/**\n * Analytics and tracking extraction.\n *\n * @remarks\n * Detects analytics service IDs from HTML documents.\n * Privacy-conscious - only extracts IDs, doesn't perform any tracking.\n *\n * @packageDocumentation\n */\n\nimport type { HTMLDocument as Document } from '../../utils/html-parser.js';\nimport type { AnalyticsMetadata } from './types.js';\n\n/**\n * Extract analytics metadata from parsed HTML document.\n *\n * @remarks\n * Detects analytics service IDs by examining script tags and their content.\n * Only extracts identifiers, does not track or collect user data.\n *\n * @param doc - Parsed HTML document\n * @returns Analytics metadata\n *\n * @example\n * ```typescript\n * const doc = parseHTML(htmlString);\n * const analytics = extractAnalytics(doc);\n * console.log(analytics.googleAnalytics);\n * console.log(analytics.googleTagManager);\n * ```\n */\nexport function extractAnalytics(doc: Document): AnalyticsMetadata {\n const metadata: AnalyticsMetadata = {};\n\n // Get all script tags\n const scripts = doc.querySelectorAll('script');\n\n const googleAnalytics = new Set<string>();\n const googleTagManager = new Set<string>();\n const facebookPixel = new Set<string>();\n const matomo = new Set<string>();\n const plausible = new Set<string>();\n const adobe = new Set<string>();\n const cloudflare = new Set<string>();\n const fathom = new Set<string>();\n\n for (const script of Array.from(scripts)) {\n const src = script.getAttribute('src') || '';\n const content = script.textContent || '';\n const combined = `${src} ${content}`;\n\n // Google Analytics (GA4: G-, Universal: UA-, Tag Manager: GT-)\n const gaMatches = combined.matchAll(/\\b(UA-\\d+-\\d+|G-[A-Z0-9]+|GT-[A-Z0-9]+)\\b/g);\n for (const match of gaMatches) {\n googleAnalytics.add(match[1]);\n }\n\n // Google Tag Manager (GTM-)\n const gtmMatches = combined.matchAll(/\\b(GTM-[A-Z0-9]+)\\b/g);\n for (const match of gtmMatches) {\n googleTagManager.add(match[1]);\n }\n\n // Facebook Pixel (numeric IDs in fbq or _fbq)\n const fbMatches = combined.matchAll(/fbq\\s*\\(\\s*['\"]init['\"]\\s*,\\s*['\"](\\d+)['\"]/g);\n for (const match of fbMatches) {\n facebookPixel.add(match[1]);\n }\n\n // Matomo/Piwik\n if (src.includes('matomo') || src.includes('piwik') || content.includes('_paq')) {\n const matomoIdMatch =\n content.match(/setSiteId['\"]?\\s*,\\s*['\"]?(\\d+)['\"]?\\s*\\]/) ||\n content.match(/setSiteId\\s*\\(\\s*['\"]?(\\d+)['\"]?\\s*\\)/);\n if (matomoIdMatch) {\n matomo.add(matomoIdMatch[1]);\n }\n }\n\n // Plausible Analytics\n if (src.includes('plausible.io/js/')) {\n const domain = script.getAttribute('data-domain');\n if (domain) {\n plausible.add(domain);\n }\n }\n\n // Adobe Analytics (Omniture)\n if (src.includes('omniture') || src.includes('2o7.net') || content.includes('s.t()')) {\n const adobeIdMatch = content.match(/s_account\\s*=\\s*['\"]([^'\"]+)['\"]/);\n if (adobeIdMatch) {\n adobe.add(adobeIdMatch[1]);\n }\n }\n\n // Cloudflare Web Analytics\n if (src.includes('cloudflareinsights.com')) {\n const cfBeacon = script.getAttribute('data-cf-beacon');\n if (cfBeacon) {\n try {\n const beacon = JSON.parse(cfBeacon);\n if (beacon.token) {\n cloudflare.add(beacon.token);\n }\n } catch {\n // Ignore invalid JSON\n }\n }\n }\n\n // Fathom Analytics\n if (src.includes('cdn.usefathom.com')) {\n const siteId = script.getAttribute('data-site') || script.getAttribute('site');\n if (siteId) {\n fathom.add(siteId);\n }\n }\n }\n\n // Convert Sets to arrays if not empty\n if (googleAnalytics.size > 0) {\n metadata.googleAnalytics = Array.from(googleAnalytics);\n }\n if (googleTagManager.size > 0) {\n metadata.googleTagManager = Array.from(googleTagManager);\n }\n if (facebookPixel.size > 0) {\n metadata.facebookPixel = Array.from(facebookPixel);\n }\n if (matomo.size > 0) {\n metadata.matomo = Array.from(matomo);\n }\n if (plausible.size > 0) {\n metadata.plausible = Array.from(plausible);\n }\n if (adobe.size > 0) {\n metadata.adobe = Array.from(adobe);\n }\n if (cloudflare.size > 0) {\n metadata.cloudflare = Array.from(cloudflare);\n }\n if (fathom.size > 0) {\n metadata.fathom = Array.from(fathom);\n }\n\n return metadata;\n}\n","/**\n * Assets extraction.\n *\n * @remarks\n * Extracts categorized asset URLs from HTML documents.\n *\n * @author Anonyfox <max@anonyfox.com>\n * @license MIT\n * @see {@link https://github.com/Anonyfox/ravenjs}\n * @see {@link https://ravenjs.dev}\n * @see {@link https://anonyfox.com}\n *\n * @packageDocumentation\n */\n\nimport type { HTMLDocument as Document } from '../../utils/html-parser.js';\nimport { normalizeUrl } from '../../utils/normalize-url.js';\nimport type { AssetsMetadata, ConnectionHint, PreloadResource } from './types.js';\n\n/**\n * Extract assets metadata from parsed HTML document.\n *\n * @remarks\n * Extracts all external assets referenced in the document, organized by type.\n * All URLs are normalized to absolute format based on the document's base URL.\n *\n * The extractor finds assets from:\n * - Images: `<img>`, `<picture>`, `srcset`, OpenGraph meta tags\n * - Stylesheets: `<link rel=\"stylesheet\">`\n * - Scripts: `<script src>`\n * - Fonts: CSS `@font-face` and `url()` with font extensions\n * - Media: `<video>`, `<audio>`, `<source>`, `<track>`\n * - Manifests: `<link rel=\"manifest\">`\n * - Preloads: `<link rel=\"preload\">` and `<link rel=\"prefetch\">`\n * - Connection hints: `<link rel=\"dns-prefetch\">` and `<link rel=\"preconnect\">`\n *\n * @param doc - Parsed HTML document\n * @param baseUrl - Optional base URL for resolving relative URLs\n * @returns Assets metadata object with categorized URLs\n *\n * @example\n * ```typescript\n * const doc = parseHTML(htmlString);\n * const assets = extractAssets(doc, 'https://example.com');\n * console.log(assets.images);\n * console.log(assets.stylesheets);\n * console.log(assets.scripts);\n * ```\n */\nexport function extractAssets(doc: Document, baseUrl?: string | URL | null): AssetsMetadata {\n const metadata: AssetsMetadata = {};\n\n // Determine effective base URL (from <base> tag or parameter)\n const effectiveBaseUrl = getEffectiveBaseUrl(doc, baseUrl);\n\n // Extract images\n const images = extractImages(doc, effectiveBaseUrl);\n if (images.length > 0) {\n metadata.images = images;\n }\n\n // Extract stylesheets\n const stylesheets = extractStylesheets(doc, effectiveBaseUrl);\n if (stylesheets.length > 0) {\n metadata.stylesheets = stylesheets;\n }\n\n // Extract scripts\n const scripts = extractScripts(doc, effectiveBaseUrl);\n if (scripts.length > 0) {\n metadata.scripts = scripts;\n }\n\n // Extract fonts from CSS\n const fonts = extractFonts(doc, effectiveBaseUrl);\n if (fonts.length > 0) {\n metadata.fonts = fonts;\n }\n\n // Extract media\n const media = extractMedia(doc, effectiveBaseUrl);\n if (media.length > 0) {\n metadata.media = media;\n }\n\n // Extract manifests\n const manifests = extractManifests(doc, effectiveBaseUrl);\n if (manifests.length > 0) {\n metadata.manifests = manifests;\n }\n\n // Extract preload/prefetch hints\n const preloads = extractPreloads(doc, effectiveBaseUrl);\n if (preloads.length > 0) {\n metadata.preloads = preloads;\n }\n\n // Extract connection hints\n const connectionHints = extractConnectionHints(doc, effectiveBaseUrl);\n if (connectionHints.length > 0) {\n metadata.connectionHints = connectionHints;\n }\n\n return metadata;\n}\n\n/**\n * Get effective base URL from <base> tag or parameter.\n */\nfunction getEffectiveBaseUrl(doc: Document, baseUrl?: string | URL | null): string | null {\n // Check for <base> tag first\n const baseElement = doc.querySelector('base[href]');\n if (baseElement) {\n const baseHref = baseElement.getAttribute('href');\n if (baseHref) {\n try {\n // If baseUrl is provided, resolve relative base href against it\n if (baseUrl) {\n const resolvedBase = normalizeUrl(baseUrl, baseHref);\n return resolvedBase || null;\n }\n return baseHref;\n } catch {\n // Fall through to use provided baseUrl\n }\n }\n }\n\n // Use provided base URL\n if (baseUrl) {\n return typeof baseUrl === 'string' ? baseUrl : baseUrl.href;\n }\n\n return null;\n}\n\n/**\n * Extract image URLs.\n */\nfunction extractImages(doc: Document, baseUrl: string | null): string[] {\n const urls = new Set<string>();\n\n // Extract from <img src>\n const imgElements = doc.querySelectorAll('img[src]');\n for (const img of Array.from(imgElements)) {\n const src = img.getAttribute('src');\n if (src) {\n const normalized = normalizeUrl(baseUrl, src);\n if (normalized) urls.add(normalized);\n }\n }\n\n // Extract from srcset (img and source elements)\n const srcsetElements = doc.querySelectorAll('img[srcset], source[srcset]');\n for (const element of Array.from(srcsetElements)) {\n const srcset = element.getAttribute('srcset');\n if (srcset) {\n const srcsetUrls = parseSrcset(srcset);\n for (const url of srcsetUrls) {\n const normalized = normalizeUrl(baseUrl, url);\n if (normalized) urls.add(normalized);\n }\n }\n }\n\n // Extract from <picture><source srcset>\n const pictureSourceElements = doc.querySelectorAll('picture source[srcset]');\n for (const source of Array.from(pictureSourceElements)) {\n const srcset = source.getAttribute('srcset');\n if (srcset) {\n const srcsetUrls = parseSrcset(srcset);\n for (const url of srcsetUrls) {\n const normalized = normalizeUrl(baseUrl, url);\n if (normalized) urls.add(normalized);\n }\n }\n }\n\n // Extract from OpenGraph meta tags\n const ogImages = doc.querySelectorAll('meta[property=\"og:image\"], meta[property=\"og:image:url\"]');\n for (const meta of Array.from(ogImages)) {\n const content = meta.getAttribute('content');\n if (content) {\n const normalized = normalizeUrl(baseUrl, content);\n if (normalized) urls.add(normalized);\n }\n }\n\n // Extract from Twitter Card meta tags\n const twitterImages = doc.querySelectorAll(\n 'meta[name=\"twitter:image\"], meta[name=\"twitter:image:src\"]',\n );\n for (const meta of Array.from(twitterImages)) {\n const content = meta.getAttribute('content');\n if (content) {\n const normalized = normalizeUrl(baseUrl, content);\n if (normalized) urls.add(normalized);\n }\n }\n\n return Array.from(urls);\n}\n\n/**\n * Parse srcset attribute into individual URLs.\n */\nfunction parseSrcset(srcset: string): string[] {\n const urls: string[] = [];\n const candidates = srcset.split(',').map((s) => s.trim());\n\n for (const candidate of candidates) {\n // srcset format: \"url 1x\" or \"url 100w\" or just \"url\"\n const parts = candidate.split(/\\s+/);\n if (parts[0]) {\n urls.push(parts[0]);\n }\n }\n\n return urls;\n}\n\n/**\n * Extract stylesheet URLs.\n */\nfunction extractStylesheets(doc: Document, baseUrl: string | null): string[] {\n const urls = new Set<string>();\n\n const linkElements = doc.querySelectorAll('link[rel=\"stylesheet\"][href]');\n for (const link of Array.from(linkElements)) {\n const href = link.getAttribute('href');\n if (href) {\n const normalized = normalizeUrl(baseUrl, href);\n if (normalized) urls.add(normalized);\n }\n }\n\n return Array.from(urls);\n}\n\n/**\n * Extract script URLs.\n */\nfunction extractScripts(doc: Document, baseUrl: string | null): string[] {\n const urls = new Set<string>();\n\n const scriptElements = doc.querySelectorAll('script[src]');\n for (const script of Array.from(scriptElements)) {\n const src = script.getAttribute('src');\n if (src) {\n const normalized = normalizeUrl(baseUrl, src);\n if (normalized) urls.add(normalized);\n }\n }\n\n return Array.from(urls);\n}\n\n/**\n * Extract font URLs from CSS (inline styles and style tags).\n */\nfunction extractFonts(doc: Document, baseUrl: string | null): string[] {\n const urls = new Set<string>();\n\n // Extract from <style> tags\n const styleElements = doc.querySelectorAll('style');\n for (const style of Array.from(styleElements)) {\n const css = style.textContent || '';\n const fontUrls = extractFontUrlsFromCss(css);\n for (const url of fontUrls) {\n const normalized = normalizeUrl(baseUrl, url);\n if (normalized) urls.add(normalized);\n }\n }\n\n // Extract from inline style attributes\n const elementsWithStyle = doc.querySelectorAll('[style]');\n for (const element of Array.from(elementsWithStyle)) {\n const style = element.getAttribute('style') || '';\n const fontUrls = extractFontUrlsFromCss(style);\n for (const url of fontUrls) {\n const normalized = normalizeUrl(baseUrl, url);\n if (normalized) urls.add(normalized);\n }\n }\n\n // Also check for preload hints for fonts\n const fontPreloads = doc.querySelectorAll('link[rel=\"preload\"][as=\"font\"][href]');\n for (const link of Array.from(fontPreloads)) {\n const href = link.getAttribute('href');\n if (href) {\n const normalized = normalizeUrl(baseUrl, href);\n if (normalized) urls.add(normalized);\n }\n }\n\n return Array.from(urls);\n}\n\n/**\n * Extract font URLs from CSS content.\n */\nfunction extractFontUrlsFromCss(css: string): string[] {\n const urls: string[] = [];\n\n // Match url(...) with font extensions\n const urlRegex = /url\\(\\s*['\"]?([^'\")]+)['\"]?\\s*\\)/gi;\n const fontExtensions = /\\.(woff2?|ttf|otf|eot)(\\?.*)?$/i;\n\n let match: RegExpExecArray | null;\n // biome-ignore lint/suspicious/noAssignInExpressions: Standard regex pattern matching\n while ((match = urlRegex.exec(css)) !== null) {\n const url = match[1];\n if (url && fontExtensions.test(url)) {\n urls.push(url);\n }\n }\n\n return urls;\n}\n\n/**\n * Extract media URLs (video, audio, source, track).\n */\nfunction extractMedia(doc: Document, baseUrl: string | null): string[] {\n const urls = new Set<string>();\n\n // Video and audio elements with src\n const mediaElements = doc.querySelectorAll('video[src], audio[src]');\n for (const media of Array.from(mediaElements)) {\n const src = media.getAttribute('src');\n if (src) {\n const normalized = normalizeUrl(baseUrl, src);\n if (normalized) urls.add(normalized);\n }\n }\n\n // Source elements (inside video/audio)\n const sourceElements = doc.querySelectorAll('video source[src], audio source[src], source[src]');\n for (const source of Array.from(sourceElements)) {\n const src = source.getAttribute('src');\n if (src) {\n const normalized = normalizeUrl(baseUrl, src);\n if (normalized) urls.add(normalized);\n }\n }\n\n // Track elements (subtitles, captions)\n const trackElements = doc.querySelectorAll('track[src]');\n for (const track of Array.from(trackElements)) {\n const src = track.getAttribute('src');\n if (src) {\n const normalized = normalizeUrl(baseUrl, src);\n if (normalized) urls.add(normalized);\n }\n }\n\n // OpenGraph video\n const ogVideos = doc.querySelectorAll('meta[property=\"og:video\"], meta[property=\"og:video:url\"]');\n for (const meta of Array.from(ogVideos)) {\n const content = meta.getAttribute('content');\n if (content) {\n const normalized = normalizeUrl(baseUrl, content);\n if (normalized) urls.add(normalized);\n }\n }\n\n // OpenGraph audio\n const ogAudios = doc.querySelectorAll('meta[property=\"og:audio\"], meta[property=\"og:audio:url\"]');\n for (const meta of Array.from(ogAudios)) {\n const content = meta.getAttribute('content');\n if (content) {\n const normalized = normalizeUrl(baseUrl, content);\n if (normalized) urls.add(normalized);\n }\n }\n\n return Array.from(urls);\n}\n\n/**\n * Extract manifest URLs.\n */\nfunction extractManifests(doc: Document, baseUrl: string | null): string[] {\n const urls = new Set<string>();\n\n const linkElements = doc.querySelectorAll('link[rel=\"manifest\"][href]');\n for (const link of Array.from(linkElements)) {\n const href = link.getAttribute('href');\n if (href) {\n const normalized = normalizeUrl(baseUrl, href);\n if (normalized) urls.add(normalized);\n }\n }\n\n return Array.from(urls);\n}\n\n/**\n * Extract preload and prefetch resource hints.\n */\nfunction extractPreloads(doc: Document, baseUrl: string | null): PreloadResource[] {\n const resources: PreloadResource[] = [];\n\n // Preload links\n const preloadElements = doc.querySelectorAll('link[rel=\"preload\"][href]');\n for (const link of Array.from(preloadElements)) {\n const href = link.getAttribute('href');\n if (href) {\n const normalized = normalizeUrl(baseUrl, href);\n if (normalized) {\n const asAttr = link.getAttribute('as');\n const typeAttr = link.getAttribute('type');\n const crossoriginAttr = link.getAttribute('crossorigin');\n\n resources.push({\n url: normalized,\n as: asAttr || undefined,\n type: typeAttr || undefined,\n crossorigin: crossoriginAttr !== null ? crossoriginAttr || '' : undefined,\n prefetch: false,\n });\n }\n }\n }\n\n // Prefetch links\n const prefetchElements = doc.querySelectorAll('link[rel=\"prefetch\"][href]');\n for (const link of Array.from(prefetchElements)) {\n const href = link.getAttribute('href');\n if (href) {\n const normalized = normalizeUrl(baseUrl, href);\n if (normalized) {\n const asAttr = link.getAttribute('as');\n const typeAttr = link.getAttribute('type');\n const crossoriginAttr = link.getAttribute('crossorigin');\n\n resources.push({\n url: normalized,\n as: asAttr || undefined,\n type: typeAttr || undefined,\n crossorigin: crossoriginAttr !== null ? crossoriginAttr || '' : undefined,\n prefetch: true,\n });\n }\n }\n }\n\n // Clean up undefined values (but keep empty strings for boolean attributes like crossorigin)\n return resources.map((resource) =>\n Object.fromEntries(\n Object.entries(resource).filter(([_, value]) => value !== undefined && value !== null),\n ),\n ) as PreloadResource[];\n}\n\n/**\n * Extract DNS prefetch and preconnect hints.\n */\nfunction extractConnectionHints(doc: Document, baseUrl: string | null): ConnectionHint[] {\n const hints: ConnectionHint[] = [];\n\n // DNS prefetch\n const dnsPrefetchElements = doc.querySelectorAll('link[rel=\"dns-prefetch\"][href]');\n for (const link of Array.from(dnsPrefetchElements)) {\n const href = link.getAttribute('href');\n if (href) {\n const normalized = normalizeUrl(baseUrl, href);\n if (normalized) {\n hints.push({\n url: normalized,\n preconnect: false,\n });\n }\n }\n }\n\n // Preconnect\n const preconnectElements = doc.querySelectorAll('link[rel=\"preconnect\"][href]');\n for (const link of Array.from(preconnectElements)) {\n const href = link.getAttribute('href');\n if (href) {\n const normalized = normalizeUrl(baseUrl, href);\n if (normalized) {\n const crossoriginAttr = link.getAttribute('crossorigin');\n\n hints.push({\n url: normalized,\n preconnect: true,\n crossorigin: crossoriginAttr !== null ? crossoriginAttr || '' : undefined,\n });\n }\n }\n }\n\n // Clean up undefined values (but keep empty strings for boolean attributes like crossorigin)\n return hints.map((hint) =>\n Object.fromEntries(\n Object.entries(hint).filter(([_, value]) => value !== undefined && value !== null),\n ),\n ) as ConnectionHint[];\n}\n","/**\n * Copyright and licensing extraction.\n *\n * @remarks\n * Extracts copyright and license metadata from HTML documents.\n *\n * @packageDocumentation\n */\n\nimport type { HTMLDocument as Document } from '../../utils/html-parser.js';\nimport { getLinkHref } from '../../utils/link-helpers.js';\nimport { getMetaContent } from '../../utils/meta-helpers.js';\nimport type { CopyrightMetadata } from './types.js';\n\n/**\n * Extract copyright metadata from parsed HTML document.\n *\n * @remarks\n * Extracts copyright and licensing information from meta tags, link tags,\n * and Schema.org structured data.\n *\n * @param doc - Parsed HTML document\n * @returns Copyright metadata\n *\n * @example\n * ```typescript\n * const doc = parseHTML(htmlString);\n * const copyright = extractCopyright(doc);\n * console.log(copyright.copyright);\n * console.log(copyright.license);\n * ```\n */\nexport function extractCopyright(doc: Document): CopyrightMetadata {\n const metadata: CopyrightMetadata = {};\n\n // Extract copyright from meta tag\n metadata.copyright = getMetaContent(doc, 'copyright');\n\n // Extract license from link tag\n metadata.license = getLinkHref(doc, 'license');\n\n // Extract Dublin Core rights (if no copyright yet)\n if (!metadata.copyright) {\n metadata.copyright = getMetaContent(doc, 'DC.rights') || getMetaContent(doc, 'dcterms.rights');\n }\n\n // Try to parse copyright holder and year from copyright string\n if (metadata.copyright) {\n const parsed = parseCopyright(metadata.copyright);\n if (parsed.holder && !metadata.holder) {\n metadata.holder = parsed.holder;\n }\n if (parsed.year && !metadata.year) {\n metadata.year = parsed.year;\n }\n }\n\n // Remove undefined values\n return Object.fromEntries(\n Object.entries(metadata).filter(([_, value]) => value !== undefined),\n ) as CopyrightMetadata;\n}\n\n/**\n * Parse copyright string to extract holder and year.\n *\n * @remarks\n * Attempts to extract copyright holder and year from common copyright formats:\n * - \"© 2024 Company Name\"\n * - \"Copyright 2024 Company Name\"\n * - \"(c) 2024 Company Name\"\n *\n * @param copyrightString - Copyright string to parse\n * @returns Parsed holder and year\n */\nfunction parseCopyright(copyrightString: string): { holder?: string; year?: string } {\n const result: { holder?: string; year?: string } = {};\n\n // Match year (4 digits)\n const yearMatch = copyrightString.match(/\\b(19|20)\\d{2}\\b/);\n if (yearMatch) {\n result.year = yearMatch[0];\n }\n\n // Try to extract holder by removing copyright symbols and year\n let holder = copyrightString\n .replace(/©/g, '')\n .replace(/\\(c\\)/gi, '')\n .replace(/^copyright\\s+/gi, '') // Only remove \"copyright\" at the start\n .replace(/\\b(19|20)\\d{2}(-\\d{4})?\\b/g, '') // Remove year or year range\n .trim();\n\n // Clean up multiple spaces and leading punctuation\n holder = holder.replace(/\\s+/g, ' ').replace(/^[,\\-:\\s]+/g, '');\n\n // Remove trailing \"All rights reserved\" and similar phrases\n holder = holder.replace(/\\.\\s*all rights reserved\\.?$/gi, '');\n\n if (holder && holder.length > 0 && holder.length < 200) {\n result.holder = holder;\n }\n\n return result;\n}\n","/**\n * Dublin Core metadata extraction.\n *\n * @remarks\n * Extracts Dublin Core metadata from HTML documents.\n *\n * @packageDocumentation\n */\n\nimport type { HTMLDocument as Document } from '../../utils/html-parser.js';\nimport { getMetaContent } from '../../utils/meta-helpers.js';\nimport type { DublinCoreMetadata } from './types.js';\n\n/**\n * Extract Dublin Core metadata from parsed HTML document.\n *\n * @remarks\n * Extracts Dublin Core metadata using both DC. and dcterms. prefixes.\n * Fields that can have multiple values (creator, subject, contributor)\n * are extracted as arrays.\n *\n * @param doc - Parsed HTML document\n * @returns Dublin Core metadata object\n *\n * @example\n * ```typescript\n * const doc = parseHTML(htmlString);\n * const dc = extractDublinCore(doc);\n * console.log(dc.title);\n * console.log(dc.creator);\n * ```\n */\nexport function extractDublinCore(doc: Document): DublinCoreMetadata {\n const metadata: DublinCoreMetadata = {};\n\n // Extract single-value fields (try DC. first, then dcterms.)\n metadata.title = getMetaContent(doc, 'DC.title') || getMetaContent(doc, 'dcterms.title');\n metadata.description =\n getMetaContent(doc, 'DC.description') || getMetaContent(doc, 'dcterms.description');\n metadata.publisher =\n getMetaContent(doc, 'DC.publisher') || getMetaContent(doc, 'dcterms.publisher');\n metadata.date = getMetaContent(doc, 'DC.date') || getMetaContent(doc, 'dcterms.date');\n metadata.type = getMetaContent(doc, 'DC.type') || getMetaContent(doc, 'dcterms.type');\n metadata.format = getMetaContent(doc, 'DC.format') || getMetaContent(doc, 'dcterms.format');\n metadata.identifier =\n getMetaContent(doc, 'DC.identifier') || getMetaContent(doc, 'dcterms.identifier');\n metadata.source = getMetaContent(doc, 'DC.source') || getMetaContent(doc, 'dcterms.source');\n metadata.language = getMetaContent(doc, 'DC.language') || getMetaContent(doc, 'dcterms.language');\n metadata.relation = getMetaContent(doc, 'DC.relation') || getMetaContent(doc, 'dcterms.relation');\n metadata.coverage = getMetaContent(doc, 'DC.coverage') || getMetaContent(doc, 'dcterms.coverage');\n metadata.rights = getMetaContent(doc, 'DC.rights') || getMetaContent(doc, 'dcterms.rights');\n\n // Extract multi-value fields as arrays\n metadata.creator = extractMultiValue(doc, 'creator');\n metadata.subject = extractMultiValue(doc, 'subject');\n metadata.contributor = extractMultiValue(doc, 'contributor');\n\n // Remove undefined values\n return Object.fromEntries(\n Object.entries(metadata).filter(([_, value]) => value !== undefined),\n ) as DublinCoreMetadata;\n}\n\n/**\n * Extract multiple values for a Dublin Core field.\n *\n * @remarks\n * Dublin Core fields can appear multiple times. This function collects all values.\n * Tries both DC. and dcterms. prefixes.\n */\nfunction extractMultiValue(doc: Document, field: string): string[] | undefined {\n const values: string[] = [];\n\n // Try DC. prefix\n const dcElements = doc.querySelectorAll(`meta[name=\"DC.${field}\"]`);\n for (const element of Array.from(dcElements)) {\n const content = element.getAttribute('content');\n if (content) {\n values.push(content);\n }\n }\n\n // Try dcterms. prefix\n const dctermsElements = doc.querySelectorAll(`meta[name=\"dcterms.${field}\"]`);\n for (const element of Array.from(dctermsElements)) {\n const content = element.getAttribute('content');\n if (content) {\n values.push(content);\n }\n }\n\n return values.length > 0 ? values : undefined;\n}\n","/**\n * Geographic location extraction.\n *\n * @remarks\n * Extracts geographic location metadata from HTML documents.\n *\n * @packageDocumentation\n */\n\nimport type { HTMLDocument as Document } from '../../utils/html-parser.js';\nimport { getMetaContent } from '../../utils/meta-helpers.js';\nimport type { GeoMetadata, GeoPosition } from './types.js';\n\n/**\n * Extract geographic metadata from parsed HTML document.\n *\n * @remarks\n * Extracts geographic location information including coordinates,\n * place names, and region codes from meta tags.\n *\n * @param doc - Parsed HTML document\n * @returns Geographic metadata\n *\n * @example\n * ```typescript\n * const doc = parseHTML(htmlString);\n * const geo = extractGeo(doc);\n * console.log(geo.position?.latitude);\n * console.log(geo.placename);\n * ```\n */\nexport function extractGeo(doc: Document): GeoMetadata {\n const metadata: GeoMetadata = {};\n\n // Extract position from geo.position (semicolon-separated lat;long)\n const geoPosition = getMetaContent(doc, 'geo.position');\n if (geoPosition) {\n const position = parseGeoPosition(geoPosition);\n if (position) {\n metadata.position = position;\n }\n }\n\n // Extract from ICBM (legacy format, comma-separated lat,long)\n if (!metadata.position) {\n const icbm = getMetaContent(doc, 'ICBM') || getMetaContent(doc, 'icbm');\n if (icbm) {\n const position = parseICBM(icbm);\n if (position) {\n metadata.position = position;\n }\n }\n }\n\n // Extract place name\n metadata.placename = getMetaContent(doc, 'geo.placename');\n\n // Extract region\n metadata.region = getMetaContent(doc, 'geo.region');\n\n // Extract country\n metadata.country = getMetaContent(doc, 'geo.country');\n\n // Remove undefined values\n return Object.fromEntries(\n Object.entries(metadata).filter(([_, value]) => value !== undefined),\n ) as GeoMetadata;\n}\n\n/**\n * Parse geo.position format (lat;long).\n *\n * @param position - Position string in \"lat;long\" format\n * @returns Parsed position or undefined if invalid\n */\nfunction parseGeoPosition(position: string): GeoPosition | undefined {\n const parts = position.split(';').map((p) => p.trim());\n if (parts.length !== 2) {\n return undefined;\n }\n\n const latitude = Number.parseFloat(parts[0]);\n const longitude = Number.parseFloat(parts[1]);\n\n if (Number.isNaN(latitude) || Number.isNaN(longitude)) {\n return undefined;\n }\n\n if (latitude < -90 || latitude > 90 || longitude < -180 || longitude > 180) {\n return undefined;\n }\n\n return { latitude, longitude };\n}\n\n/**\n * Parse ICBM format (lat,long or lat, long).\n *\n * @param icbm - Position string in \"lat,long\" format\n * @returns Parsed position or undefined if invalid\n */\nfunction parseICBM(icbm: string): GeoPosition | undefined {\n const parts = icbm.split(',').map((p) => p.trim());\n if (parts.length !== 2) {\n return undefined;\n }\n\n const latitude = Number.parseFloat(parts[0]);\n const longitude = Number.parseFloat(parts[1]);\n\n if (Number.isNaN(latitude) || Number.isNaN(longitude)) {\n return undefined;\n }\n\n if (latitude < -90 || latitude > 90 || longitude < -180 || longitude > 180) {\n return undefined;\n }\n\n return { latitude, longitude };\n}\n","/**\n * Monetization and payment extraction.\n *\n * @remarks\n * Extracts web monetization and payment metadata from HTML documents.\n *\n * @packageDocumentation\n */\n\nimport type { HTMLDocument as Document } from '../../utils/html-parser.js';\nimport { getMetaContent } from '../../utils/meta-helpers.js';\nimport type { MonetizationMetadata } from './types.js';\n\n/**\n * Extract monetization metadata from parsed HTML document.\n *\n * @remarks\n * Extracts web monetization, payment verification, and cryptocurrency\n * addresses from meta tags and link tags.\n *\n * @param doc - Parsed HTML document\n * @returns Monetization metadata\n *\n * @example\n * ```typescript\n * const doc = parseHTML(htmlString);\n * const monetization = extractMonetization(doc);\n * console.log(monetization.webMonetization);\n * console.log(monetization.bitcoin);\n * ```\n */\nexport function extractMonetization(doc: Document): MonetizationMetadata {\n const metadata: MonetizationMetadata = {};\n\n // Web Monetization API (payment pointer)\n metadata.webMonetization = getMetaContent(doc, 'monetization');\n\n // PayPal site verification\n metadata.paypalVerification = getMetaContent(doc, 'paypal-site-verification');\n\n // Brave Creator verification\n metadata.braveCreator =\n getMetaContent(doc, 'brave-rewards-verification') ||\n getMetaContent(doc, 'brave-creator-verification');\n\n // Coil payment pointer (legacy)\n metadata.coil = getMetaContent(doc, 'coil:payment_pointer');\n\n // Bitcoin address\n metadata.bitcoin = getMetaContent(doc, 'bitcoin') || getMetaContent(doc, 'btc:address');\n\n // Ethereum address\n metadata.ethereum = getMetaContent(doc, 'ethereum') || getMetaContent(doc, 'eth:address');\n\n // Remove undefined values\n return Object.fromEntries(\n Object.entries(metadata).filter(([_, value]) => value !== undefined),\n ) as MonetizationMetadata;\n}\n","/**\n * News and press extraction.\n *\n * @remarks\n * Extracts news-specific metadata from HTML documents.\n *\n * @packageDocumentation\n */\n\nimport type { HTMLDocument as Document } from '../../utils/html-parser.js';\nimport { getMetaContent } from '../../utils/meta-helpers.js';\nimport type { NewsMetadata } from './types.js';\n\n/**\n * Extract news metadata from parsed HTML document.\n *\n * @remarks\n * Extracts news-specific metadata including keywords, standout tags,\n * and syndication information.\n *\n * @param doc - Parsed HTML document\n * @returns News metadata\n *\n * @example\n * ```typescript\n * const doc = parseHTML(htmlString);\n * const news = extractNews(doc);\n * console.log(news.keywords);\n * console.log(news.standout);\n * ```\n */\nexport function extractNews(doc: Document): NewsMetadata {\n const metadata: NewsMetadata = {};\n\n // News keywords (distinct from regular keywords)\n const newsKeywords = getMetaContent(doc, 'news_keywords');\n if (newsKeywords) {\n const keywords = newsKeywords\n .split(',')\n .map((k) => k.trim())\n .filter(Boolean);\n if (keywords.length > 0) {\n metadata.keywords = keywords;\n }\n }\n\n // Google News standout tag\n metadata.standout = getMetaContent(doc, 'standout');\n\n // Syndication source\n metadata.syndicationSource = getMetaContent(doc, 'syndication-source');\n\n // Original source\n metadata.originalSource = getMetaContent(doc, 'original-source');\n\n // Remove undefined values\n return Object.fromEntries(\n Object.entries(metadata).filter(([_, value]) => value !== undefined),\n ) as NewsMetadata;\n}\n","/**\n * Pagination metadata extraction.\n *\n * @remarks\n * Extracts pagination navigation links from HTML documents.\n *\n * @packageDocumentation\n */\n\nimport type { HTMLDocument as Document } from '../../utils/html-parser.js';\nimport { getLinkHref } from '../../utils/link-helpers.js';\nimport type { PaginationMetadata } from './types.js';\n\n/**\n * Extract pagination metadata from parsed HTML document.\n *\n * @remarks\n * Extracts pagination navigation links including prev, next, first, last,\n * up (parent), and index links.\n *\n * @param doc - Parsed HTML document\n * @returns Pagination metadata\n *\n * @example\n * ```typescript\n * const doc = parseHTML(htmlString);\n * const pagination = extractPagination(doc);\n * console.log(pagination.prev); // Previous page URL\n * console.log(pagination.next); // Next page URL\n * ```\n */\nexport function extractPagination(doc: Document): PaginationMetadata {\n const metadata: PaginationMetadata = {};\n\n // Extract prev/previous (both rel values are valid)\n metadata.prev = getLinkHref(doc, 'prev') || getLinkHref(doc, 'previous');\n\n // Extract next\n metadata.next = getLinkHref(doc, 'next');\n\n // Extract first\n metadata.first = getLinkHref(doc, 'first');\n\n // Extract last\n metadata.last = getLinkHref(doc, 'last');\n\n // Extract up (parent level)\n metadata.up = getLinkHref(doc, 'up');\n\n // Extract index\n metadata.index = getLinkHref(doc, 'index');\n\n // Remove undefined values\n return Object.fromEntries(\n Object.entries(metadata).filter(([_, value]) => value !== undefined),\n ) as PaginationMetadata;\n}\n","/**\n * Robot directives parsing utilities.\n *\n * @remarks\n * Utilities for parsing robot meta tag content into structured directives.\n *\n * @packageDocumentation\n */\n\nimport type { RobotDirectives } from './types.js';\n\n/**\n * Parse robot directives from meta content string.\n *\n * @remarks\n * Parses comma-separated directives like \"noindex, nofollow\" or \"max-snippet:20\".\n * Handles both simple flags and key:value pairs.\n *\n * @param content - Meta tag content string\n * @returns Parsed directives object\n *\n * @example\n * ```typescript\n * parseDirectives('noindex, nofollow');\n * // { index: false, follow: false }\n *\n * parseDirectives('max-snippet:150, noarchive');\n * // { maxSnippet: 150, noarchive: true }\n * ```\n */\nexport function parseDirectives(content?: string): RobotDirectives {\n if (!content) {\n return {};\n }\n\n const directives: RobotDirectives = {};\n\n // Split by comma and process each directive\n const parts = content.split(',').map((p) => p.trim().toLowerCase());\n\n for (const part of parts) {\n if (!part) continue;\n\n // Check for key:value format\n if (part.includes(':')) {\n const [key, value] = part.split(':').map((s) => s.trim());\n parseKeyValueDirective(key, value, directives);\n } else {\n // Simple flag directive\n parseFlagDirective(part, directives);\n }\n }\n\n return directives;\n}\n\n/**\n * Parse flag-based directive (e.g., \"noindex\", \"nofollow\").\n */\nfunction parseFlagDirective(directive: string, result: RobotDirectives): void {\n switch (directive) {\n case 'index':\n result.index = true;\n break;\n case 'noindex':\n result.index = false;\n break;\n case 'follow':\n result.follow = true;\n break;\n case 'nofollow':\n result.follow = false;\n break;\n case 'noarchive':\n result.noarchive = true;\n break;\n case 'nosnippet':\n result.nosnippet = true;\n break;\n case 'noimageindex':\n result.noimageindex = true;\n break;\n case 'notranslate':\n result.notranslate = true;\n break;\n case 'all':\n // \"all\" means index and follow\n result.index = true;\n result.follow = true;\n break;\n case 'none':\n // \"none\" means noindex and nofollow\n result.index = false;\n result.follow = false;\n break;\n }\n}\n\n/**\n * Parse key:value directive (e.g., \"max-snippet:150\").\n */\nfunction parseKeyValueDirective(key: string, value: string, result: RobotDirectives): void {\n switch (key) {\n case 'max-snippet':\n // Parse as number, or -1 for unlimited\n if (value === '-1') {\n result.maxSnippet = -1;\n } else {\n const num = Number.parseInt(value, 10);\n if (!Number.isNaN(num)) {\n result.maxSnippet = num;\n }\n }\n break;\n\n case 'max-image-preview':\n // Values: none, standard, large\n result.maxImagePreview = value;\n break;\n\n case 'max-video-preview':\n // Parse as number (seconds), or -1 for unlimited\n if (value === '-1') {\n result.maxVideoPreview = -1;\n } else {\n const num = Number.parseInt(value, 10);\n if (!Number.isNaN(num)) {\n result.maxVideoPreview = num;\n }\n }\n break;\n\n case 'unavailable_after':\n // Date string (RFC 850 format typically)\n result.unavailableAfter = value;\n break;\n }\n}\n","/**\n * Robots and crawling directives extraction.\n *\n * @remarks\n * Extracts robot crawling and indexing directives from HTML documents.\n *\n * @packageDocumentation\n */\n\nimport type { HTMLDocument as Document } from '../../utils/html-parser.js';\nimport { getMetaContent } from '../../utils/meta-helpers.js';\nimport { parseDirectives } from './parse-directives.js';\nimport type { RobotsMetadata } from './types.js';\n\n/**\n * Extract robots metadata from parsed HTML document.\n *\n * @remarks\n * Extracts robot directives from meta tags for general robots,\n * Googlebot, Bingbot, and Google News bot.\n *\n * @param doc - Parsed HTML document\n * @returns Robots metadata\n *\n * @example\n * ```typescript\n * const doc = parseHTML(htmlString);\n * const robots = extractRobots(doc);\n * console.log(robots.robots?.index); // true/false\n * console.log(robots.robots?.follow); // true/false\n * ```\n */\nexport function extractRobots(doc: Document): RobotsMetadata {\n const metadata: RobotsMetadata = {};\n\n // Extract general robots directives\n const robotsContent = getMetaContent(doc, 'robots');\n if (robotsContent) {\n const directives = parseDirectives(robotsContent);\n if (Object.keys(directives).length > 0) {\n metadata.robots = directives;\n }\n }\n\n // Extract Googlebot directives\n const googlebotContent = getMetaContent(doc, 'googlebot');\n if (googlebotContent) {\n const directives = parseDirectives(googlebotContent);\n if (Object.keys(directives).length > 0) {\n metadata.googlebot = directives;\n }\n }\n\n // Extract Bingbot directives\n const bingbotContent = getMetaContent(doc, 'bingbot');\n if (bingbotContent) {\n const directives = parseDirectives(bingbotContent);\n if (Object.keys(directives).length > 0) {\n metadata.bingbot = directives;\n }\n }\n\n // Extract Google News bot directives\n const googlebotNewsContent = getMetaContent(doc, 'googlebot-news');\n if (googlebotNewsContent) {\n const directives = parseDirectives(googlebotNewsContent);\n if (Object.keys(directives).length > 0) {\n metadata.googlebotNews = directives;\n }\n }\n\n return metadata;\n}\n","/**\n * Security and privacy extraction.\n *\n * @remarks\n * Extracts security and privacy-related metadata from HTML documents.\n *\n * @packageDocumentation\n */\n\nimport type { HTMLDocument as Document } from '../../utils/html-parser.js';\nimport { getMetaContent, getMetaHttpEquiv } from '../../utils/meta-helpers.js';\nimport type { SecurityMetadata } from './types.js';\n\n/**\n * Extract security metadata from parsed HTML document.\n *\n * @remarks\n * Extracts security and privacy-related meta tags including referrer policy,\n * content security policy, and browser compatibility directives.\n *\n * @param doc - Parsed HTML document\n * @returns Security metadata\n *\n * @example\n * ```typescript\n * const doc = parseHTML(htmlString);\n * const security = extractSecurity(doc);\n * console.log(security.referrerPolicy);\n * console.log(security.contentSecurityPolicy);\n * ```\n */\nexport function extractSecurity(doc: Document): SecurityMetadata {\n const metadata: SecurityMetadata = {};\n\n // Referrer policy\n metadata.referrerPolicy = getMetaContent(doc, 'referrer');\n\n // Content Security Policy\n metadata.contentSecurityPolicy = getMetaHttpEquiv(doc, 'Content-Security-Policy');\n\n // X-UA-Compatible (IE compatibility mode)\n metadata.xUaCompatible = getMetaHttpEquiv(doc, 'X-UA-Compatible');\n\n // Format detection (iOS Safari)\n metadata.formatDetection = getMetaContent(doc, 'format-detection');\n\n // Remove undefined values\n return Object.fromEntries(\n Object.entries(metadata).filter(([_, value]) => value !== undefined),\n ) as SecurityMetadata;\n}\n","/**\n * Sitemap discovery heuristics.\n *\n * @remarks\n * Common sitemap URL patterns and heuristics.\n *\n * @packageDocumentation\n */\n\n/**\n * Common sitemap URL patterns to check.\n *\n * @remarks\n * These are standard locations where sitemaps are typically found.\n * Should be checked relative to the site's base URL.\n */\nexport const COMMON_SITEMAP_PATHS = [\n '/sitemap.xml',\n '/sitemap_index.xml',\n '/sitemap-index.xml',\n '/sitemapindex.xml',\n '/sitemap1.xml',\n '/sitemap.xml.gz',\n '/sitemap_index.xml.gz',\n '/sitemap.php',\n '/sitemap/',\n '/sitemaps.xml',\n '/sitemaps/sitemap.xml',\n '/sitemap/sitemap.xml',\n '/wp-sitemap.xml', // WordPress\n '/page-sitemap.xml', // WordPress\n '/post-sitemap.xml', // WordPress\n];\n\n/**\n * Generate sitemap URL suggestions based on the document URL.\n *\n * @remarks\n * Returns common sitemap URLs that might exist, relative to the document URL.\n * These are just suggestions - not verified to actually exist.\n *\n * Also includes robots.txt location which typically references sitemaps.\n *\n * @param documentUrl - The URL of the current document\n * @returns Array of suggested sitemap URLs\n */\nexport function generateSitemapSuggestions(documentUrl?: string | URL): string[] {\n if (!documentUrl) {\n // Return paths with robots.txt included\n return ['/robots.txt', ...COMMON_SITEMAP_PATHS];\n }\n\n try {\n const url = typeof documentUrl === 'string' ? new URL(documentUrl) : documentUrl;\n const origin = url.origin;\n\n // Generate full URLs by combining origin with common paths\n const suggestions = [\n `${origin}/robots.txt`, // robots.txt often references sitemaps\n ...COMMON_SITEMAP_PATHS.map((path) => `${origin}${path}`),\n ];\n\n return suggestions;\n } catch {\n // If URL parsing fails, return relative paths\n return ['/robots.txt', ...COMMON_SITEMAP_PATHS];\n }\n}\n","/**\n * Sitemap discovery extraction.\n *\n * @remarks\n * Discovers XML sitemaps in HTML documents.\n *\n * @packageDocumentation\n */\n\nimport type { HTMLDocument as Document } from '../../utils/html-parser.js';\nimport { getAllLinks } from '../../utils/link-helpers.js';\nimport { generateSitemapSuggestions } from './heuristics.js';\nimport type { SitemapDiscoveryMetadata } from './types.js';\n\n/**\n * Extract sitemap discovery metadata from parsed HTML document.\n *\n * @remarks\n * Finds all sitemaps declared in <link rel=\"sitemap\"> tags and generates\n * suggestions for common sitemap URL patterns.\n *\n * @param doc - Parsed HTML document\n * @param documentUrl - Optional document URL for generating absolute sitemap suggestions\n * @returns Sitemap discovery metadata\n *\n * @example\n * ```typescript\n * const doc = parseHTML(htmlString);\n * const sitemaps = extractSitemapDiscovery(doc, 'https://example.com');\n * console.log(sitemaps.sitemaps); // Discovered sitemaps\n * console.log(sitemaps.suggestions); // Suggested sitemap URLs\n * ```\n */\nexport function extractSitemapDiscovery(\n doc: Document,\n documentUrl?: string | URL,\n): SitemapDiscoveryMetadata {\n const metadata: SitemapDiscoveryMetadata = {\n sitemaps: [],\n };\n\n // Find all sitemap links\n const sitemapLinks = getAllLinks(doc, 'sitemap');\n\n // Extract URLs\n metadata.sitemaps = sitemapLinks.map((link) => link.href);\n\n // Generate suggestions if document URL provided\n if (documentUrl) {\n metadata.suggestions = generateSitemapSuggestions(documentUrl);\n }\n\n return metadata;\n}\n","/**\n * Social profiles extraction.\n *\n * @remarks\n * Extracts social media profile links from HTML documents.\n *\n * @packageDocumentation\n */\n\nimport type { HTMLDocument as Document } from '../../utils/html-parser.js';\nimport { getMetaContent } from '../../utils/meta-helpers.js';\nimport type { SocialProfilesMetadata } from './types.js';\n\n/**\n * Extract social profiles metadata from parsed HTML document.\n *\n * @remarks\n * Extracts social media profile URLs and handles from meta tags and structured data.\n *\n * @param doc - Parsed HTML document\n * @returns Social profiles metadata\n *\n * @example\n * ```typescript\n * const doc = parseHTML(htmlString);\n * const profiles = extractSocialProfiles(doc);\n * console.log(profiles.twitter);\n * console.log(profiles.facebook);\n * ```\n */\nexport function extractSocialProfiles(doc: Document): SocialProfilesMetadata {\n const metadata: SocialProfilesMetadata = {};\n\n // Twitter - extract from multiple sources\n metadata.twitter =\n getMetaContent(doc, 'twitter:site') ||\n getMetaContent(doc, 'twitter:creator') ||\n extractFromProperty(doc, 'twitter:site') ||\n extractFromProperty(doc, 'twitter:creator');\n\n // Clean Twitter handle (remove @ if present)\n if (metadata.twitter) {\n metadata.twitter = metadata.twitter.replace(/^@/, '');\n }\n\n // Facebook - from OpenGraph\n metadata.facebook =\n extractFromProperty(doc, 'og:url', 'facebook.com') ||\n extractFromProperty(doc, 'fb:profile_id') ||\n extractFromProperty(doc, 'fb:page_id');\n\n // Instagram\n metadata.instagram =\n getMetaContent(doc, 'instagram:site') || extractFromProperty(doc, 'instagram:site');\n\n // LinkedIn\n metadata.linkedin = extractFromProperty(doc, 'linkedin:owner');\n\n // YouTube\n metadata.youtube =\n getMetaContent(doc, 'youtube:channel') || extractFromProperty(doc, 'youtube:channel');\n\n // GitHub\n metadata.github = getMetaContent(doc, 'github:user');\n\n // TikTok\n metadata.tiktok = getMetaContent(doc, 'tiktok:site');\n\n // Pinterest\n metadata.pinterest = getMetaContent(doc, 'pinterest:profile');\n\n // Mastodon\n metadata.mastodon = extractFromProperty(doc, 'fediverse:creator');\n\n // Reddit\n metadata.reddit = getMetaContent(doc, 'reddit:user');\n\n // Look for Schema.org sameAs links (common for social profiles)\n const schemaProfiles = extractSchemaOrgSameAs(doc);\n if (schemaProfiles.length > 0) {\n for (const url of schemaProfiles) {\n categorizeSchemaProfile(url, metadata);\n }\n }\n\n // Collect other social profiles\n const otherProfiles: Record<string, string> = {};\n\n // Look for other common social meta tags\n const socialPatterns = [\n 'vk:site', // VKontakte\n 'telegram:site', // Telegram\n 'snapchat:site', // Snapchat\n 'whatsapp:number', // WhatsApp\n 'discord:server', // Discord\n ];\n\n for (const pattern of socialPatterns) {\n const value = getMetaContent(doc, pattern);\n if (value) {\n otherProfiles[pattern] = value;\n }\n }\n\n // Add other profiles if any found\n if (Object.keys(otherProfiles).length > 0) {\n metadata.other = otherProfiles;\n }\n\n // Remove undefined values\n return Object.fromEntries(\n Object.entries(metadata).filter(([_, value]) => value !== undefined),\n ) as SocialProfilesMetadata;\n}\n\n/**\n * Extract content from meta tag with property attribute.\n *\n * @param doc - Parsed HTML document\n * @param property - Property name to search for\n * @param mustContain - Optional string that the content must contain\n * @returns Meta content or undefined\n */\nfunction extractFromProperty(\n doc: Document,\n property: string,\n mustContain?: string,\n): string | undefined {\n const meta = doc.querySelector(`meta[property=\"${property}\"]`);\n if (!meta) {\n return undefined;\n }\n\n const content = meta.getAttribute('content');\n if (!content) {\n return undefined;\n }\n\n if (mustContain && !content.includes(mustContain)) {\n return undefined;\n }\n\n return content;\n}\n\n/**\n * Extract Schema.org sameAs links.\n *\n * @remarks\n * Schema.org often uses sameAs property to list social media profiles.\n *\n * @param doc - Parsed HTML document\n * @returns Array of profile URLs\n */\nfunction extractSchemaOrgSameAs(doc: Document): string[] {\n const profiles: string[] = [];\n\n // Look for JSON-LD scripts\n const scripts = doc.querySelectorAll('script[type=\"application/ld+json\"]');\n\n for (const script of Array.from(scripts)) {\n try {\n const data = JSON.parse(script.textContent || '{}');\n\n // Handle array or single object\n const items = Array.isArray(data) ? data : [data];\n\n for (const item of items) {\n // Check for sameAs property\n if (item.sameAs) {\n if (Array.isArray(item.sameAs)) {\n profiles.push(...item.sameAs);\n } else if (typeof item.sameAs === 'string') {\n profiles.push(item.sameAs);\n }\n }\n\n // Check @graph\n if (item['@graph']) {\n for (const node of item['@graph']) {\n if (node.sameAs) {\n if (Array.isArray(node.sameAs)) {\n profiles.push(...node.sameAs);\n } else if (typeof node.sameAs === 'string') {\n profiles.push(node.sameAs);\n }\n }\n }\n }\n }\n } catch {\n // Ignore invalid JSON\n }\n }\n\n return profiles;\n}\n\n/**\n * Categorize Schema.org profile URL into appropriate social platform.\n *\n * @param url - Profile URL\n * @param metadata - Metadata object to update\n */\nfunction categorizeSchemaProfile(url: string, metadata: SocialProfilesMetadata): void {\n const lowerUrl = url.toLowerCase();\n\n if (lowerUrl.includes('twitter.com') || lowerUrl.includes('x.com')) {\n if (!metadata.twitter) {\n // Extract username from URL\n const match = url.match(/(?:twitter\\.com|x\\.com)\\/([^/?]+)/i);\n if (match) {\n metadata.twitter = match[1];\n }\n }\n } else if (lowerUrl.includes('facebook.com')) {\n if (!metadata.facebook) {\n metadata.facebook = url;\n }\n } else if (lowerUrl.includes('instagram.com')) {\n if (!metadata.instagram) {\n const match = url.match(/instagram\\.com\\/([^/?]+)/i);\n if (match) {\n metadata.instagram = match[1];\n }\n }\n } else if (lowerUrl.includes('linkedin.com')) {\n if (!metadata.linkedin) {\n metadata.linkedin = url;\n }\n } else if (lowerUrl.includes('youtube.com')) {\n if (!metadata.youtube) {\n metadata.youtube = url;\n }\n } else if (lowerUrl.includes('github.com')) {\n if (!metadata.github) {\n const match = url.match(/github\\.com\\/([^/?]+)/i);\n if (match) {\n metadata.github = match[1];\n }\n }\n } else if (lowerUrl.includes('tiktok.com')) {\n if (!metadata.tiktok) {\n const match = url.match(/tiktok\\.com\\/@?([^/?]+)/i);\n if (match) {\n metadata.tiktok = match[1];\n }\n }\n } else if (lowerUrl.includes('pinterest.com')) {\n if (!metadata.pinterest) {\n const match = url.match(/pinterest\\.com\\/([^/?]+)/i);\n if (match) {\n metadata.pinterest = match[1];\n }\n }\n } else if (lowerUrl.includes('reddit.com')) {\n if (!metadata.reddit) {\n const match = url.match(/reddit\\.com\\/(?:u|user)\\/([^/?]+)/i);\n if (match) {\n metadata.reddit = match[1];\n }\n }\n }\n}\n","/**\n * Verification tags extraction.\n *\n * @remarks\n * Extracts domain and ownership verification tags from HTML documents.\n *\n * @packageDocumentation\n */\n\nimport type { HTMLDocument as Document } from '../../utils/html-parser.js';\nimport { getMetaContent } from '../../utils/meta-helpers.js';\nimport type { VerificationMetadata } from './types.js';\n\n/**\n * Extract verification metadata from parsed HTML document.\n *\n * @remarks\n * Extracts verification tags used by various platforms for domain and ownership verification.\n *\n * @param doc - Parsed HTML document\n * @returns Verification metadata\n *\n * @example\n * ```typescript\n * const doc = parseHTML(htmlString);\n * const verification = extractVerification(doc);\n * console.log(verification.googleSiteVerification);\n * console.log(verification.facebookDomainVerification);\n * ```\n */\nexport function extractVerification(doc: Document): VerificationMetadata {\n const metadata: VerificationMetadata = {};\n\n // Google Site Verification\n metadata.googleSiteVerification = getMetaContent(doc, 'google-site-verification');\n\n // Microsoft/Bing validation\n metadata.msvalidate = getMetaContent(doc, 'msvalidate.01');\n\n // Yandex verification\n metadata.yandexVerification = getMetaContent(doc, 'yandex-verification');\n\n // Facebook domain verification\n metadata.facebookDomainVerification = getMetaContent(doc, 'facebook-domain-verification');\n\n // Pinterest verification\n metadata.pinterestVerification = getMetaContent(doc, 'p:domain_verify');\n\n // Alexa verification\n metadata.alexaVerification = getMetaContent(doc, 'alexaVerifyID');\n\n // Norton Safe Web\n metadata.nortonSafeWeb = getMetaContent(doc, 'norton-safeweb-site-verification');\n\n // Collect other verification tags\n const otherVerifications: Record<string, string> = {};\n\n // Look for other common verification patterns\n const verificationPatterns = [\n 'verify-v1', // Google legacy\n 'verify-a', // Google legacy\n 'verify', // Generic\n 'verification', // Generic\n 'domain-verification', // Generic\n 'site-verification', // Generic\n ];\n\n for (const pattern of verificationPatterns) {\n const value = getMetaContent(doc, pattern);\n if (value) {\n otherVerifications[pattern] = value;\n }\n }\n\n // Add other verifications if any found\n if (Object.keys(otherVerifications).length > 0) {\n metadata.other = otherVerifications;\n }\n\n // Remove undefined values\n return Object.fromEntries(\n Object.entries(metadata).filter(([_, value]) => value !== undefined),\n ) as VerificationMetadata;\n}\n","/**\n * Base error type for `swoop()`.\n */\nexport class SwoopError extends Error {\n override name = 'SwoopError';\n}\n\n/**\n * Thrown when the current runtime cannot execute `swoop()`.\n */\nexport class SwoopEnvironmentError extends SwoopError {\n override name = 'SwoopEnvironmentError';\n}\n\n/**\n * Thrown when `swoop()` exceeds its configured timeout.\n */\nexport class SwoopTimeoutError extends SwoopError {\n override name = 'SwoopTimeoutError';\n}\n\n/**\n * Thrown when script execution fails in a non-recoverable way.\n */\nexport class SwoopExecutionError extends SwoopError {\n override name = 'SwoopExecutionError';\n}\n\n/**\n * Thrown when `swoop()` is asked to execute potentially unsafe scripts\n * in a context where the caller should explicitly acknowledge the risk.\n */\nexport class SwoopSecurityError extends SwoopError {\n override name = 'SwoopSecurityError';\n}\n","import type { SwoopConsoleEntry } from './types.js';\n\nexport interface ConsoleCapture {\n entries: SwoopConsoleEntry[];\n record: (level: SwoopConsoleEntry['level'], args: unknown[]) => void;\n}\n\nexport function createConsoleCapture(now: () => number = () => Date.now()): ConsoleCapture {\n const entries: SwoopConsoleEntry[] = [];\n\n const formatError = (err: Error) => {\n const parts: string[] = [];\n parts.push(`${err.name}: ${err.message}${err.stack ? `\\n${err.stack}` : ''}`.trim());\n try {\n const props: Record<string, unknown> = {};\n for (const key of Object.getOwnPropertyNames(err)) {\n if (key === 'name' || key === 'message' || key === 'stack') continue;\n props[key] = (err as any)[key];\n }\n if (Object.keys(props).length > 0) {\n parts.push(`props: ${JSON.stringify(props)}`);\n }\n } catch {\n // ignore\n }\n return parts.join('\\n');\n };\n\n const record: ConsoleCapture['record'] = (level, args) => {\n const msg = args\n .map((a) => {\n try {\n if (a instanceof Error) return formatError(a);\n if (typeof a === 'string') return a;\n return String(a);\n } catch {\n return '[unstringifiable]';\n }\n })\n .join(' ');\n\n const argStrings = args.map((a) => {\n try {\n if (a instanceof Error) return formatError(a);\n if (typeof a === 'string') return a;\n return String(a);\n } catch {\n return '[unstringifiable]';\n }\n });\n\n entries.push({ level, message: msg, args: argStrings, time: now() });\n };\n\n return { entries, record };\n}\n","import {\n clearImmediate as nodeClearImmediate,\n clearInterval as nodeClearInterval,\n clearTimeout as nodeClearTimeout,\n setImmediate as nodeSetImmediate,\n setInterval as nodeSetInterval,\n setTimeout as nodeSetTimeout,\n} from 'node:timers';\n\nexport interface AsyncEnvInit {\n globalObj: any;\n debugProbes: boolean;\n}\n\nexport interface AsyncEnv {\n hostSetTimeout: typeof nodeSetTimeout;\n hostClearTimeout: typeof nodeClearTimeout;\n hostSetInterval: typeof nodeSetInterval;\n hostClearInterval: typeof nodeClearInterval;\n hostSetImmediate: typeof nodeSetImmediate;\n hostClearImmediate: typeof nodeClearImmediate;\n noteAsyncActivity: () => void;\n getLastAsyncActivityAt: () => number;\n cleanup: () => void;\n}\n\nexport function installAsyncEnv(init: AsyncEnvInit): AsyncEnv {\n const { globalObj } = init;\n\n const hostSetTimeout = nodeSetTimeout;\n const hostClearTimeout = nodeClearTimeout;\n const hostSetInterval = nodeSetInterval;\n const hostClearInterval = nodeClearInterval;\n const hostSetImmediate = nodeSetImmediate;\n const hostClearImmediate = nodeClearImmediate;\n\n const activeTimeouts = new Set<ReturnType<typeof nodeSetTimeout>>();\n const activeIntervals = new Set<ReturnType<typeof nodeSetInterval>>();\n const activeImmediates = new Set<ReturnType<typeof nodeSetImmediate>>();\n\n let lastAsyncActivityAt = Date.now();\n const noteAsyncActivity = () => {\n lastAsyncActivityAt = Date.now();\n if (init.debugProbes) {\n try {\n globalObj.__swoopStats.lastAsyncActivityAt = lastAsyncActivityAt;\n } catch {\n // ignore\n }\n }\n };\n\n globalObj.__swoop_requestIdleCallback = (cb: any, _opts?: any) => {\n return hostSetTimeout(() => {\n try {\n noteAsyncActivity();\n cb({\n didTimeout: false,\n timeRemaining: () => 0,\n });\n } catch {\n // ignore\n }\n }, 0) as any;\n };\n globalObj.__swoop_cancelIdleCallback = (handle: any) => hostClearTimeout(handle);\n\n globalObj.__swoop_setTimeout = (...args: Parameters<typeof setTimeout>) => {\n const handle = hostSetTimeout(() => {\n activeTimeouts.delete(handle);\n noteAsyncActivity();\n if (init.debugProbes) {\n try {\n globalObj.__swoopStats.timers.timeoutFired++;\n } catch {}\n }\n (args[0] as any)?.call?.(globalObj);\n }, args[1] as number);\n activeTimeouts.add(handle);\n if (init.debugProbes) {\n try {\n globalObj.__swoopStats.timers.timeoutScheduled++;\n } catch {}\n }\n return handle;\n };\n globalObj.__swoop_clearTimeout = (handle: ReturnType<typeof setTimeout>) => {\n activeTimeouts.delete(handle as any);\n hostClearTimeout(handle as any);\n };\n\n globalObj.__swoop_setInterval = (...args: Parameters<typeof setInterval>) => {\n const handle = hostSetInterval(() => {\n noteAsyncActivity();\n if (init.debugProbes) {\n try {\n globalObj.__swoopStats.timers.intervalFired++;\n } catch {}\n }\n (args[0] as any)?.call?.(globalObj);\n }, args[1] as number);\n activeIntervals.add(handle);\n if (init.debugProbes) {\n try {\n globalObj.__swoopStats.timers.intervalScheduled++;\n } catch {}\n }\n return handle;\n };\n globalObj.__swoop_clearInterval = (handle: ReturnType<typeof setInterval>) => {\n activeIntervals.delete(handle as any);\n hostClearInterval(handle as any);\n };\n\n globalObj.__swoop_queueMicrotask = (cb: () => void) => {\n try {\n process.nextTick(() => {\n noteAsyncActivity();\n cb.call(globalObj);\n });\n } catch {\n hostSetTimeout(() => {\n noteAsyncActivity();\n cb.call(globalObj);\n }, 0);\n }\n };\n\n globalObj.__swoop_setImmediate = (cb: (...a: any[]) => void, ...args: any[]) => {\n const handle = hostSetImmediate(() => {\n activeImmediates.delete(handle);\n try {\n noteAsyncActivity();\n cb.call(globalObj, ...args);\n } catch {\n // ignore\n }\n });\n activeImmediates.add(handle);\n return handle;\n };\n globalObj.__swoop_clearImmediate = (handle: ReturnType<typeof nodeSetImmediate>) => {\n activeImmediates.delete(handle);\n hostClearImmediate(handle);\n };\n\n globalObj.__swoop_requestAnimationFrame = (cb: FrameRequestCallback) => {\n if (init.debugProbes) {\n try {\n globalObj.__swoopStats.timers.rafScheduled++;\n } catch {}\n }\n const id = hostSetTimeout(() => {\n if (init.debugProbes) {\n try {\n globalObj.__swoopStats.timers.rafFired++;\n } catch {}\n }\n noteAsyncActivity();\n cb.call(globalObj, Date.now());\n }, 16) as any;\n return id;\n };\n globalObj.__swoop_cancelAnimationFrame = (id: number) => hostClearTimeout(id as any);\n\n const cleanup = () => {\n for (const h of activeTimeouts) hostClearTimeout(h);\n for (const h of activeIntervals) hostClearInterval(h as any);\n for (const h of activeImmediates) hostClearImmediate(h);\n };\n\n return {\n hostSetTimeout,\n hostClearTimeout,\n hostSetInterval,\n hostClearInterval,\n hostSetImmediate,\n hostClearImmediate,\n noteAsyncActivity,\n getLastAsyncActivityAt: () => lastAsyncActivityAt,\n cleanup,\n };\n}\n","export interface BaseResolve {\n baseForResolve: URL;\n baseTagHref: string | null;\n baseEl: any | null;\n}\n\n/**\n * Computes the base URL used for resolving relative resources.\n *\n * @remarks\n * Uses `<base href=\"...\">` if present; otherwise falls back to the page URL.\n */\nexport function computeBaseForResolve(finalUrl: string, document: any): BaseResolve {\n const pageUrl = new URL(finalUrl);\n const baseEl = (document as any)?.querySelector?.('base') ?? null;\n const baseTagHref: string | null = baseEl?.getAttribute?.('href') ?? null;\n\n const baseForResolve = (() => {\n try {\n return baseTagHref ? new URL(String(baseTagHref), finalUrl) : pageUrl;\n } catch {\n return pageUrl;\n }\n })();\n\n return { baseForResolve, baseTagHref, baseEl };\n}\n\n/**\n * Enforces the browser invariant that `document.baseURI` is an absolute URL.\n */\nexport function patchDocumentBaseURI(document: any, baseForResolve: URL): void {\n try {\n Object.defineProperty(document as any, 'baseURI', {\n configurable: true,\n get: () => baseForResolve.href,\n });\n } catch {\n // ignore\n }\n}\n\n/**\n * Enforces the browser invariant that `<base>.href` is an absolute URL.\n */\nexport function patchBaseElementHref(baseEl: any | null, baseForResolve: URL): void {\n try {\n if (baseEl) {\n Object.defineProperty(baseEl, 'href', {\n configurable: true,\n get: () => baseForResolve.href,\n set: (_v: string) => {},\n });\n }\n } catch {\n // ignore\n }\n}\n","export interface BrowserShimsInit {\n globalObj: any;\n domWindow: any;\n document: any;\n documentBaseUriForDom: string;\n}\n\nexport function installBrowserShims(init: BrowserShimsInit): void {\n const { globalObj, domWindow, documentBaseUriForDom } = init;\n const doc = init.document ?? (globalObj as any).document;\n\n // Ensure DOM APIs that rely on defaultView behave consistently.\n try {\n if (doc && (doc as any).defaultView == null) (doc as any).defaultView = globalObj;\n } catch {\n // ignore\n }\n // Some frameworks read document.baseURI for router/baseHref resolution.\n try {\n if (doc && (doc as any).baseURI == null) (doc as any).baseURI = documentBaseUriForDom;\n } catch {\n // ignore\n }\n\n // Prefer a minimally-faked navigator; avoid hard-coding vendor/UA brands.\n globalObj.navigator ??= {};\n globalObj.navigator.language ??= 'en';\n globalObj.navigator.languages ??= [globalObj.navigator.language];\n globalObj.navigator.onLine ??= true;\n\n // Basic viewport defaults (avoid baking in a specific browser fingerprint).\n globalObj.screen ??= {\n width: 1280,\n height: 720,\n availWidth: 1280,\n availHeight: 720,\n colorDepth: 24,\n };\n globalObj.devicePixelRatio ??= 1;\n globalObj.innerWidth ??= globalObj.screen.width ?? 1280;\n globalObj.innerHeight ??= globalObj.screen.height ?? 720;\n\n // Node (>=18+) usually has these web globals; expose them into the sandbox.\n globalObj.MessageChannel ??= (globalThis as any).MessageChannel;\n globalObj.MessagePort ??= (globalThis as any).MessagePort;\n globalObj.MessageEvent ??= (globalThis as any).MessageEvent;\n globalObj.BroadcastChannel ??= (globalThis as any).BroadcastChannel;\n\n // Minimal getComputedStyle: enough to keep frameworks from bailing.\n globalObj.getComputedStyle ??= (el: any) => {\n const style = el?.style ?? {};\n return new Proxy(style, {\n get(target, prop) {\n if (prop === 'getPropertyValue') return (name: string) => target?.[name] ?? '';\n return (target as any)[prop as any] ?? '';\n },\n });\n };\n\n // Navigation-related events.\n globalObj.PopStateEvent ??= class PopStateEvent extends (globalObj.Event ?? Event) {\n state: unknown;\n constructor(type: string, init?: any) {\n super(type, init);\n this.state = init?.state;\n }\n };\n globalObj.HashChangeEvent ??= class HashChangeEvent extends (globalObj.Event ?? Event) {\n oldURL: string;\n newURL: string;\n constructor(type: string, init?: any) {\n super(type, init);\n this.oldURL = init?.oldURL ?? '';\n this.newURL = init?.newURL ?? '';\n }\n };\n\n // Media queries are often used for breakpoint selection. Return a stable default.\n globalObj.matchMedia ??= (query: string) => {\n const listeners = new Set<any>();\n const mql: any = {\n matches: false,\n media: String(query ?? ''),\n onchange: null,\n addListener: (cb: any) => {\n if (typeof cb === 'function') listeners.add(cb);\n },\n removeListener: (cb: any) => {\n listeners.delete(cb);\n },\n addEventListener: (type: string, cb: any) => {\n if (String(type) === 'change' && typeof cb === 'function') listeners.add(cb);\n },\n removeEventListener: (type: string, cb: any) => {\n if (String(type) === 'change') listeners.delete(cb);\n },\n dispatchEvent: (evt: any) => {\n try {\n for (const cb of listeners) cb.call(mql, evt);\n if (typeof mql.onchange === 'function') mql.onchange.call(mql, evt);\n } catch {\n // ignore\n }\n return true;\n },\n };\n return mql;\n };\n\n // Observers are frequently used for lazy rendering; provide no-op implementations.\n globalObj.IntersectionObserver ??= class IntersectionObserver {\n observe(_el: any) {}\n unobserve(_el: any) {}\n disconnect() {}\n takeRecords() {\n return [];\n }\n };\n globalObj.ResizeObserver ??= class ResizeObserver {\n observe(_el: any) {}\n unobserve(_el: any) {}\n disconnect() {}\n };\n globalObj.MutationObserver ??= class MutationObserver {\n observe(_target: any, _options?: any) {}\n disconnect() {}\n takeRecords() {\n return [];\n }\n };\n\n globalObj.URL ??= URL;\n globalObj.URLSearchParams ??= URLSearchParams;\n globalObj.WebAssembly ??= WebAssembly;\n globalObj.TextEncoder ??= TextEncoder;\n globalObj.TextDecoder ??= TextDecoder;\n globalObj.Headers ??= globalThis.Headers;\n globalObj.Request ??= globalThis.Request;\n globalObj.Response ??= globalThis.Response;\n globalObj.crypto ??= globalThis.crypto;\n globalObj.performance ??= globalThis.performance;\n globalObj.structuredClone ??= globalThis.structuredClone;\n globalObj.Blob ??= globalThis.Blob;\n globalObj.FormData ??= globalThis.FormData;\n globalObj.File ??= (globalThis as any).File;\n globalObj.ReadableStream ??= (globalThis as any).ReadableStream;\n globalObj.atob ??= (data: string) => Buffer.from(data, 'base64').toString('binary');\n globalObj.btoa ??= (data: string) => Buffer.from(data, 'binary').toString('base64');\n\n // Big-ticket web platform APIs not yet implemented in `swoop`.\n globalObj.WebSocket ??= class WebSocket {\n constructor() {\n throw new Error('swoop: WebSocket is not implemented');\n }\n };\n globalObj.EventSource ??= class EventSource {\n constructor() {\n throw new Error('swoop: EventSource is not implemented');\n }\n };\n globalObj.Worker ??= class Worker {\n constructor() {\n throw new Error('swoop: Worker is not implemented');\n }\n };\n globalObj.SharedWorker ??= class SharedWorker {\n constructor() {\n throw new Error('swoop: SharedWorker is not implemented');\n }\n };\n globalObj.indexedDB ??= undefined;\n globalObj.caches ??= undefined;\n globalObj.Notification ??= undefined;\n\n // Common DOM globals frequently used as runtime tokens (and sometimes as DI tokens).\n globalObj.Document ??= domWindow.Document;\n globalObj.HTMLDocument ??= domWindow.HTMLDocument ?? init.document?.constructor;\n globalObj.Element ??= domWindow.Element;\n globalObj.HTMLElement ??= domWindow.HTMLElement;\n globalObj.Node ??= domWindow.Node;\n\n // TreeWalker / NodeIterator constants.\n globalObj.NodeFilter ??= domWindow.NodeFilter ?? {\n FILTER_ACCEPT: 1,\n FILTER_REJECT: 2,\n FILTER_SKIP: 3,\n SHOW_ALL: 0xffffffff,\n SHOW_ELEMENT: 0x1,\n SHOW_ATTRIBUTE: 0x2,\n SHOW_TEXT: 0x4,\n SHOW_CDATA_SECTION: 0x8,\n SHOW_ENTITY_REFERENCE: 0x10,\n SHOW_ENTITY: 0x20,\n SHOW_PROCESSING_INSTRUCTION: 0x40,\n SHOW_COMMENT: 0x80,\n SHOW_DOCUMENT: 0x100,\n SHOW_DOCUMENT_TYPE: 0x200,\n SHOW_DOCUMENT_FRAGMENT: 0x400,\n SHOW_NOTATION: 0x800,\n };\n}\n","export function installCookieJar(document: any): void {\n let cookieJar = '';\n try {\n Object.defineProperty(document, 'cookie', {\n configurable: true,\n get() {\n return cookieJar;\n },\n set(value: string) {\n // Best-effort: append; do not implement full RFC.\n if (typeof value === 'string' && value.length > 0) {\n cookieJar = cookieJar ? `${cookieJar}; ${value}` : value;\n }\n },\n });\n } catch {\n // ignore\n }\n}\n","export interface FetchShimInit {\n globalObj: any;\n hostFetch: typeof fetch | undefined;\n baseForResolveHref: string;\n remainingMs: () => number;\n hostSetTimeout: (cb: () => void, ms: number) => any;\n hostClearTimeout: (h: any) => void;\n noteAsyncActivity: () => void;\n debugFetch: boolean;\n recordDebug: (args: unknown[]) => void;\n queueMicrotask: (cb: () => void) => void;\n}\n\nexport interface FetchShim {\n getPendingFetches: () => number;\n}\n\nexport function installFetchShim(init: FetchShimInit): FetchShim {\n let pendingFetches = 0;\n\n init.globalObj.__swoop_fetch =\n typeof init.hostFetch === 'function'\n ? (...args: Parameters<typeof fetch>) => {\n init.noteAsyncActivity();\n pendingFetches++;\n try {\n const input = args[0];\n const initReq = args[1];\n\n // Browser fetch resolves relative URLs against document/base URL.\n // Node fetch rejects them. Emulate browser resolution here.\n let resolvedInput: typeof input = input;\n if (typeof input === 'string') {\n resolvedInput = new URL(input, init.baseForResolveHref).href;\n } else if (input instanceof URL) {\n resolvedInput = input.href;\n } else if (typeof (input as Request).url === 'string') {\n try {\n resolvedInput = new URL((input as Request).url, init.baseForResolveHref).href;\n } catch {\n // keep as-is\n }\n }\n\n if (init.debugFetch) {\n init.recordDebug(['[fetch]', resolvedInput]);\n }\n\n const controller = new AbortController();\n const timeoutHandle = init.hostSetTimeout(() => controller.abort(), init.remainingMs());\n const mergedInit = { ...(initReq as any), signal: controller.signal };\n\n const p = init.hostFetch!(resolvedInput as any, mergedInit as any).finally(() => {\n init.hostClearTimeout(timeoutHandle);\n });\n\n return p.finally(() => {\n try {\n init.queueMicrotask(() => {\n pendingFetches--;\n init.noteAsyncActivity();\n });\n } catch {\n pendingFetches--;\n init.noteAsyncActivity();\n }\n });\n } catch (err) {\n pendingFetches--;\n init.noteAsyncActivity();\n throw err;\n }\n }\n : undefined;\n\n return {\n getPendingFetches: () => pendingFetches,\n };\n}\n","export interface CreateNavigationInit {\n pageUrl: URL;\n onNavigate?: (href: string) => void;\n onPopState?: (state: unknown) => void;\n}\n\nexport interface NavigationShims {\n location: any;\n history: any;\n}\n\nexport function createNavigationShims(init: CreateNavigationInit): NavigationShims {\n const { pageUrl } = init;\n\n const resolveAndSetHref = (href: string) => {\n try {\n const next = new URL(href, pageUrl.href);\n pageUrl.href = next.href;\n init.onNavigate?.(pageUrl.href);\n } catch {\n // ignore\n }\n };\n\n const location: any = {};\n try {\n Object.defineProperties(location, {\n href: { get: () => pageUrl.href, set: (v: string) => resolveAndSetHref(String(v)) },\n origin: { get: () => pageUrl.origin },\n protocol: {\n get: () => pageUrl.protocol,\n set: (v: string) => {\n pageUrl.protocol = String(v);\n },\n },\n host: {\n get: () => pageUrl.host,\n set: (v: string) => {\n pageUrl.host = String(v);\n },\n },\n hostname: {\n get: () => pageUrl.hostname,\n set: (v: string) => {\n pageUrl.hostname = String(v);\n },\n },\n port: {\n get: () => pageUrl.port,\n set: (v: string) => {\n pageUrl.port = String(v);\n },\n },\n pathname: { get: () => pageUrl.pathname, set: (v: string) => resolveAndSetHref(String(v)) },\n search: {\n get: () => pageUrl.search,\n set: (v: string) => {\n pageUrl.search = String(v);\n },\n },\n hash: {\n get: () => pageUrl.hash,\n set: (v: string) => {\n pageUrl.hash = String(v);\n },\n },\n });\n } catch {\n // ignore\n }\n location.toString = () => pageUrl.href;\n location.assign = (href: string) => resolveAndSetHref(href);\n location.replace = (href: string) => resolveAndSetHref(href);\n location.reload = () => {};\n\n let historyState: unknown = null;\n const history: any = {\n get state() {\n return historyState;\n },\n pushState: (state: unknown, _title: string, url?: string | URL | null) => {\n historyState = state;\n if (url != null) resolveAndSetHref(String(url));\n try {\n init.onPopState?.(state);\n } catch {\n // ignore\n }\n },\n replaceState: (state: unknown, _title: string, url?: string | URL | null) => {\n historyState = state;\n if (url != null) resolveAndSetHref(String(url));\n },\n back: () => {},\n forward: () => {},\n go: (_delta?: number) => {},\n };\n\n return { location, history };\n}\n","export function installPermissiveShims(globalObj: any): void {\n const makeStorage = () => {\n const store = new Map<string, string>();\n return {\n get length() {\n return store.size;\n },\n clear() {\n store.clear();\n },\n getItem(key: string) {\n return store.has(String(key)) ? store.get(String(key))! : null;\n },\n key(index: number) {\n return Array.from(store.keys())[index] ?? null;\n },\n removeItem(key: string) {\n store.delete(String(key));\n },\n setItem(key: string, value: string) {\n store.set(String(key), String(value));\n },\n };\n };\n\n globalObj.localStorage ??= makeStorage();\n globalObj.sessionStorage ??= makeStorage();\n\n // Do NOT downgrade shims here. `permissiveShims` is meant to *fill gaps*,\n // not replace richer implementations installed earlier.\n globalObj.scrollTo ??= () => {};\n\n try {\n if (\n globalObj.HTMLElement?.prototype &&\n !globalObj.HTMLElement.prototype.getBoundingClientRect\n ) {\n globalObj.HTMLElement.prototype.getBoundingClientRect = () => ({\n x: 0,\n y: 0,\n width: 0,\n height: 0,\n top: 0,\n left: 0,\n right: 0,\n bottom: 0,\n toJSON() {},\n });\n }\n } catch {\n // ignore\n }\n\n globalObj.process ??= { env: { NODE_ENV: 'production' } };\n}\n","export interface InstallXhrInit {\n globalObj: any;\n resolveUrl: (u: string) => string;\n remainingMs: () => number;\n hostSetTimeout: (cb: () => void, ms: number) => any;\n hostClearTimeout: (handle: any) => void;\n fetch: typeof globalThis.fetch | undefined;\n}\n\ntype Listener = (ev: any) => void;\n\n/**\n * Minimal XMLHttpRequest shim over fetch (best-effort).\n *\n * @remarks\n * - Always async (sync XHR is emulated as async)\n * - Time-budgeted via `remainingMs()`\n */\nexport function installXMLHttpRequest(init: InstallXhrInit): void {\n const g = init.globalObj;\n if (g.XMLHttpRequest) return;\n\n class Xhr {\n // readyState constants\n static UNSENT = 0;\n static OPENED = 1;\n static HEADERS_RECEIVED = 2;\n static LOADING = 3;\n static DONE = 4;\n UNSENT = 0;\n OPENED = 1;\n HEADERS_RECEIVED = 2;\n LOADING = 3;\n DONE = 4;\n\n readyState = 0;\n status = 0;\n statusText = '';\n responseType: '' | 'text' | 'json' | 'arraybuffer' | 'blob' = '';\n response: any = null;\n responseText = '';\n timeout = 0;\n withCredentials = false;\n\n onreadystatechange: null | (() => void) = null;\n onload: null | (() => void) = null;\n onerror: null | (() => void) = null;\n ontimeout: null | (() => void) = null;\n onabort: null | (() => void) = null;\n\n private _method = 'GET';\n private _url = '';\n private _headers = new Map<string, string>();\n private _respHeaders: Headers | null = null;\n private _listeners = new Map<string, Set<Listener>>();\n private _controller: AbortController | null = null;\n\n addEventListener(type: string, cb: Listener) {\n const t = String(type);\n const set = this._listeners.get(t) ?? new Set<Listener>();\n set.add(cb);\n this._listeners.set(t, set);\n }\n removeEventListener(type: string, cb: Listener) {\n const t = String(type);\n this._listeners.get(t)?.delete(cb);\n }\n private _dispatch(type: string) {\n const ev = { type, target: this, currentTarget: this };\n this._listeners.get(type)?.forEach((cb) => {\n try {\n cb(ev);\n } catch {\n // ignore\n }\n });\n }\n private _setReadyState(n: number) {\n this.readyState = n;\n try {\n this.onreadystatechange?.();\n } catch {\n // ignore\n }\n this._dispatch('readystatechange');\n }\n\n open(method: string, url: string, async: boolean = true) {\n this._method = String(method ?? 'GET').toUpperCase();\n this._url = String(url ?? '');\n void async; // sync XHR is not supported; treat as async.\n this._headers.clear();\n this._respHeaders = null;\n this._controller = null;\n this._setReadyState(1);\n }\n\n setRequestHeader(name: string, value: string) {\n this._headers.set(String(name), String(value));\n }\n\n getResponseHeader(name: string) {\n try {\n return this._respHeaders?.get(String(name)) ?? null;\n } catch {\n return null;\n }\n }\n\n getAllResponseHeaders() {\n try {\n if (!this._respHeaders) return '';\n let out = '';\n this._respHeaders.forEach((v, k) => {\n out += `${k}: ${v}\\r\\n`;\n });\n return out;\n } catch {\n return '';\n }\n }\n\n overrideMimeType(_mime: string) {}\n\n abort() {\n try {\n this._controller?.abort();\n } catch {\n // ignore\n }\n try {\n this.onabort?.();\n } catch {\n // ignore\n }\n this._dispatch('abort');\n }\n\n send(body?: any) {\n const doFetch = async () => {\n const url = init.resolveUrl(this._url);\n const controller = new AbortController();\n this._controller = controller;\n\n let timeoutHandle: any;\n const ms = Math.min(this.timeout || 0, init.remainingMs());\n if (ms > 0) {\n timeoutHandle = init.hostSetTimeout(() => controller.abort(), ms);\n }\n\n try {\n const headers: Record<string, string> = {};\n for (const [k, v] of this._headers.entries()) headers[k] = v;\n\n if (!init.fetch) throw new Error('swoop: host fetch is unavailable in this Node runtime');\n\n const resp = await init.fetch(url, {\n method: this._method,\n headers,\n body: body as any,\n signal: controller.signal,\n // credentials/withCredentials ignored (Node fetch differs); best-effort.\n } as any);\n\n this._respHeaders = resp.headers;\n this.status = resp.status;\n this.statusText = (resp as any).statusText ?? '';\n this._setReadyState(2);\n\n // load body\n this._setReadyState(3);\n if (this.responseType === 'arraybuffer') {\n this.response = await resp.arrayBuffer();\n this.responseText = '';\n } else if (this.responseType === 'blob') {\n this.response = (resp as any).blob\n ? await (resp as any).blob()\n : await resp.arrayBuffer();\n this.responseText = '';\n } else {\n const text = await resp.text();\n this.responseText = text;\n if (this.responseType === 'json') {\n try {\n this.response = JSON.parse(text);\n } catch {\n this.response = null;\n }\n } else {\n this.response = text;\n }\n }\n\n this._setReadyState(4);\n try {\n this.onload?.();\n } catch {\n // ignore\n }\n this._dispatch('load');\n this._dispatch('loadend');\n } catch {\n this._setReadyState(4);\n const aborted = this._controller?.signal?.aborted;\n if (aborted) {\n try {\n this.ontimeout?.();\n } catch {}\n this._dispatch('timeout');\n } else {\n try {\n this.onerror?.();\n } catch {}\n this._dispatch('error');\n }\n this._dispatch('loadend');\n } finally {\n if (timeoutHandle) init.hostClearTimeout(timeoutHandle);\n }\n };\n\n // Always async.\n void doFetch();\n }\n }\n\n g.XMLHttpRequest = Xhr;\n}\n","import vm from 'node:vm';\n\n/**\n * Synthesize a browser-ish document lifecycle after scripts executed.\n *\n * @remarks\n * Best-effort. No layout/paint; this is only to unblock CSR bundles that wait\n * for DOMContentLoaded/load and related lifecycle events.\n */\nexport function synthesizeLifecycle(context: vm.Context, timeoutMs: number = 50): void {\n vm.runInContext(\n `\n try {\n const EventCtor = (globalThis.Event || (globalThis.window && globalThis.window.Event));\n const dispatchDoc = (type) => { try { document.dispatchEvent(new EventCtor(type)); } catch {} };\n const dispatchWin = (type) => { try { window.dispatchEvent(new EventCtor(type)); } catch {} };\n\n if (typeof document.readyState !== \"string\") {\n try { document.readyState = \"loading\"; } catch {}\n }\n\n dispatchDoc(\"readystatechange\");\n try { document.readyState = \"interactive\"; } catch {}\n dispatchDoc(\"readystatechange\");\n dispatchDoc(\"DOMContentLoaded\");\n try { document.readyState = \"complete\"; } catch {}\n dispatchDoc(\"readystatechange\");\n\n try {\n if (typeof document.visibilityState !== \"string\") document.visibilityState = \"visible\";\n if (typeof document.hidden !== \"boolean\") document.hidden = false;\n if (typeof document.hasFocus !== \"function\") document.hasFocus = () => true;\n } catch {}\n dispatchDoc(\"visibilitychange\");\n\n dispatchWin(\"pageshow\");\n dispatchWin(\"load\");\n\n try { window.dispatchEvent(new PopStateEvent(\"popstate\", { state: (history && history.state) })); } catch {}\n try {\n const href = String((location && location.href) || \"\");\n window.dispatchEvent(new HashChangeEvent(\"hashchange\", { oldURL: href, newURL: href }));\n } catch {}\n } catch {}\n `,\n context,\n { timeout: timeoutMs },\n );\n}\n","export interface DebugProbesInit {\n globalObj: any;\n hostSetTimeout: (cb: () => void, ms: number) => any;\n}\n\nexport function installDebugProbes(init: DebugProbesInit): void {\n const { globalObj, hostSetTimeout } = init;\n\n globalObj.__swoopStats = {\n startedAt: Date.now(),\n domOps: Object.create(null) as Record<string, number>,\n mutations: 0,\n lastDomActivityAt: 0,\n listeners: Object.create(null) as Record<string, number>,\n timers: {\n timeoutScheduled: 0,\n timeoutFired: 0,\n intervalScheduled: 0,\n intervalFired: 0,\n rafScheduled: 0,\n rafFired: 0,\n },\n nav: {\n pushState: 0,\n replaceState: 0,\n lastHref: null as string | null,\n },\n appRootSamples: [] as Array<{ t: number; len: number; opacity: string | null }>,\n };\n\n const bump = (name: string) => {\n const s = globalObj.__swoopStats;\n s.domOps[name] = (s.domOps[name] ?? 0) + 1;\n s.lastDomActivityAt = Date.now();\n };\n\n const bumpListener = (type: string) => {\n const s = globalObj.__swoopStats;\n s.listeners[type] = (s.listeners[type] ?? 0) + 1;\n };\n\n const wrapProto = (proto: any, fn: string) => {\n const orig = proto?.[fn];\n if (typeof orig !== 'function') return;\n proto[fn] = function (...args: any[]) {\n bump(fn);\n return orig.apply(this, args);\n };\n };\n\n // best-effort: cover the most common DOM mutation surfaces\n wrapProto(globalObj.Node?.prototype, 'appendChild');\n wrapProto(globalObj.Node?.prototype, 'insertBefore');\n wrapProto(globalObj.Node?.prototype, 'removeChild');\n wrapProto(globalObj.Element?.prototype, 'setAttribute');\n wrapProto(globalObj.Element?.prototype, 'removeAttribute');\n wrapProto(globalObj.Element?.prototype, 'append');\n wrapProto(globalObj.Element?.prototype, 'prepend');\n\n // Track event listener registrations (router, visibility, etc.)\n const wrapAddListener = (target: any, label: string) => {\n const orig = target?.addEventListener;\n if (typeof orig !== 'function') return;\n target.addEventListener = function (type: any, listener: any, options: any) {\n try {\n bumpListener(`${label}:${String(type)}`);\n } catch {\n // ignore\n }\n return orig.call(this, type, listener, options);\n };\n };\n wrapAddListener(globalObj, 'window');\n wrapAddListener(globalObj.document, 'document');\n\n const MO = globalObj.MutationObserver;\n if (typeof MO === 'function') {\n const mo = new MO(() => {\n globalObj.__swoopStats.mutations++;\n globalObj.__swoopStats.lastDomActivityAt = Date.now();\n });\n try {\n mo.observe(globalObj.document?.documentElement, {\n subtree: true,\n childList: true,\n attributes: true,\n characterData: true,\n });\n } catch {\n // ignore\n }\n }\n\n // sample app-root size over time\n const sample = () => {\n try {\n const el = globalObj.document?.querySelector?.('app-root');\n const len = el?.innerHTML?.length ?? 0;\n const opacity = el?.getAttribute?.('style')?.includes('opacity')\n ? String(el.getAttribute('style'))\n : null;\n globalObj.__swoopStats.appRootSamples.push({ t: Date.now(), len, opacity });\n } catch {\n // ignore\n }\n };\n sample();\n hostSetTimeout(sample, 250);\n hostSetTimeout(sample, 1000);\n hostSetTimeout(sample, 2500);\n hostSetTimeout(sample, 4500);\n}\n\nexport function emitDebugProbes(\n globalObj: any,\n recordDebug: (args: unknown[]) => void,\n now: () => number = () => Date.now(),\n): void {\n const stats = globalObj.__swoopStats;\n if (!stats) return;\n\n const appRootHtml = (() => {\n try {\n const el = globalObj.document?.querySelector?.('app-root');\n const raw = el?.innerHTML ?? '';\n return String(raw).slice(0, 400);\n } catch {\n return null;\n }\n })();\n\n recordDebug([\n '[swoop probes]',\n JSON.stringify({\n mutations: stats.mutations ?? 0,\n lastDomActivityMsAgo:\n stats.lastDomActivityAt && typeof stats.lastDomActivityAt === 'number'\n ? now() - stats.lastDomActivityAt\n : null,\n topDomOps: Object.entries(stats.domOps ?? {})\n .sort((a, b) => (b[1] as number) - (a[1] as number))\n .slice(0, 15),\n topListeners: Object.entries(stats.listeners ?? {})\n .sort((a, b) => (b[1] as number) - (a[1] as number))\n .slice(0, 20),\n timers: stats.timers ?? null,\n lastAsyncActivityMsAgo:\n stats.lastAsyncActivityAt && typeof stats.lastAsyncActivityAt === 'number'\n ? now() - stats.lastAsyncActivityAt\n : null,\n nav: stats.nav ?? null,\n location: (() => {\n try {\n return {\n href: String(globalObj.location?.href ?? ''),\n pathname: String(globalObj.location?.pathname ?? ''),\n search: String(globalObj.location?.search ?? ''),\n hash: String(globalObj.location?.hash ?? ''),\n baseURI: String(globalObj.document?.baseURI ?? ''),\n };\n } catch {\n return null;\n }\n })(),\n appRootSamples: stats.appRootSamples ?? [],\n appRootHtmlHead: appRootHtml,\n }),\n ]);\n}\n","export interface ScriptLoaderInit {\n globalObj: any;\n pageUrlHref: string;\n baseForResolveHref: string;\n remainingMs: () => number;\n hostSetTimeout: (cb: () => void, ms: number) => any;\n totalBudgetMs: number;\n maxDebugEvents: number;\n debug: (args: unknown[]) => void;\n onError?: (resolvedSrc: string, err: unknown) => void;\n noteAsyncActivity: () => void;\n\n fetchText: (url: string) => Promise<string>;\n runClassicScript: (code: string, filename: string) => void;\n runModuleScript: (resolvedSrc: string, parentUrlForResolve: string) => Promise<void>;\n}\n\nexport interface ScriptLoader {\n getPendingScriptLoads: () => number;\n install: () => void;\n}\n\nfunction isScriptEl(node: any): boolean {\n return node?.tagName?.toLowerCase?.() === 'script';\n}\n\nexport function createScriptLoader(init: ScriptLoaderInit): ScriptLoader {\n const loadedScriptSrcs = new Set<string>();\n let pendingScriptLoads = 0;\n let debugScriptEvents = 0;\n\n const debugScript = (...args: unknown[]) => {\n if (debugScriptEvents++ > init.maxDebugEvents) return;\n init.debug(args);\n };\n\n const loadScriptElement = async (scriptEl: any, parentUrlForResolve: string): Promise<void> => {\n const rawSrc = scriptEl?.src || scriptEl?.getAttribute?.('src');\n if (!rawSrc) return;\n\n let resolvedSrc: string;\n try {\n resolvedSrc = new URL(String(rawSrc), init.baseForResolveHref).href;\n } catch {\n return;\n }\n if (loadedScriptSrcs.has(resolvedSrc)) return;\n loadedScriptSrcs.add(resolvedSrc);\n init.noteAsyncActivity();\n pendingScriptLoads++;\n\n const type = (scriptEl?.type || scriptEl?.getAttribute?.('type') || '')\n .toString()\n .trim()\n .toLowerCase();\n const isModule = type === 'module';\n debugScript('[swoop] load <script>', resolvedSrc, isModule ? 'module' : 'classic');\n\n try {\n if (isModule) {\n await init.runModuleScript(resolvedSrc, parentUrlForResolve);\n } else {\n const code = await init.fetchText(resolvedSrc);\n init.runClassicScript(code, resolvedSrc);\n }\n\n // Fire load events/callbacks (webpack waits for these).\n try {\n if (typeof scriptEl?.onload === 'function')\n scriptEl.onload(new (init.globalObj.Event ?? Event)('load'));\n } catch {\n try {\n scriptEl.onload?.();\n } catch {}\n }\n try {\n scriptEl?.dispatchEvent?.(new (init.globalObj.Event ?? Event)('load'));\n } catch {}\n } catch (e) {\n try {\n init.onError?.(resolvedSrc, e);\n } catch {\n // ignore\n }\n try {\n if (typeof scriptEl?.onerror === 'function') scriptEl.onerror(e);\n } catch {\n try {\n scriptEl.onerror?.();\n } catch {}\n }\n try {\n scriptEl?.dispatchEvent?.(new (init.globalObj.Event ?? Event)('error'));\n } catch {}\n } finally {\n pendingScriptLoads--;\n init.noteAsyncActivity();\n }\n };\n\n const scheduleScriptLoad = (node: any, label: string) => {\n // Give page code a chance to set `src`, `type`, and event handlers after insertion.\n init.hostSetTimeout(() => {\n void loadScriptElement(node, `${init.pageUrlHref}#${label}`);\n }, 0);\n };\n\n const patchScriptInsertion = (container: any, label: string) => {\n if (!container) return;\n const origAppendChild = container.appendChild?.bind(container);\n const origInsertBefore = container.insertBefore?.bind(container);\n const origAppend = container.append?.bind(container);\n const origPrepend = container.prepend?.bind(container);\n if (typeof origAppendChild === 'function') {\n container.appendChild = (node: any) => {\n const ret = origAppendChild(node);\n if (isScriptEl(node)) scheduleScriptLoad(node, `${label}.appendChild`);\n return ret;\n };\n }\n if (typeof origInsertBefore === 'function') {\n container.insertBefore = (node: any, ref: any) => {\n const ret = origInsertBefore(node, ref);\n if (isScriptEl(node)) scheduleScriptLoad(node, `${label}.insertBefore`);\n return ret;\n };\n }\n if (typeof origAppend === 'function') {\n container.append = (...nodes: any[]) => {\n const ret = origAppend(...nodes);\n for (const n of nodes) if (isScriptEl(n)) scheduleScriptLoad(n, `${label}.append`);\n return ret;\n };\n }\n if (typeof origPrepend === 'function') {\n container.prepend = (...nodes: any[]) => {\n const ret = origPrepend(...nodes);\n for (const n of nodes) if (isScriptEl(n)) scheduleScriptLoad(n, `${label}.prepend`);\n return ret;\n };\n }\n };\n\n const install = () => {\n patchScriptInsertion(init.globalObj.document?.head, 'head');\n patchScriptInsertion(init.globalObj.document?.body, 'body');\n\n // If a script is inserted without `src` and `src` is set later, we still want to load it.\n // Hook setAttribute for script elements.\n try {\n const elProto = init.globalObj.Element?.prototype;\n const origSetAttr = elProto?.setAttribute;\n if (typeof origSetAttr === 'function') {\n elProto.setAttribute = function (name: string, value: string) {\n const ret = origSetAttr.call(this, name, value);\n try {\n if (\n this?.tagName?.toLowerCase?.() === 'script' &&\n typeof name === 'string' &&\n name.toLowerCase() === 'src'\n ) {\n scheduleScriptLoad(this, 'script.setAttribute(src)');\n }\n } catch {\n // ignore\n }\n return ret;\n };\n }\n } catch {\n // ignore\n }\n\n // Also patch document.createElement('script') to attempt hooking a `src` setter.\n try {\n const doc = init.globalObj.document;\n const origCreateElement = doc?.createElement?.bind(doc);\n if (typeof origCreateElement === 'function') {\n doc.createElement = (tagName: string, ...rest: any[]) => {\n const el = origCreateElement(tagName, ...rest);\n try {\n if (typeof tagName === 'string' && tagName.toLowerCase() === 'script') {\n const desc = Object.getOwnPropertyDescriptor(el, 'src');\n // If it's configurable, wrap it; otherwise setAttribute hook will still cover most cases.\n if (!desc || desc.configurable) {\n let _src = el.getAttribute?.('src') ?? '';\n Object.defineProperty(el, 'src', {\n configurable: true,\n enumerable: true,\n get: () => _src,\n set: (v: string) => {\n _src = String(v);\n try {\n el.setAttribute?.('src', _src);\n } catch {\n // ignore\n }\n scheduleScriptLoad(el, 'script.src=');\n },\n });\n }\n }\n } catch {\n // ignore\n }\n return el;\n };\n }\n } catch {\n // ignore\n }\n };\n\n return {\n getPendingScriptLoads: () => pendingScriptLoads,\n install,\n };\n}\n","import { setTimeout as nodeSetTimeout } from 'node:timers';\n\nimport type { SwoopInit } from './types.js';\n\nexport function isNodeRuntime(): boolean {\n return (\n typeof process !== 'undefined' &&\n typeof process.versions === 'object' &&\n typeof process.versions.node === 'string'\n );\n}\n\nexport function sleep(ms: number): Promise<void> {\n return new Promise((resolve) => nodeSetTimeout(resolve, ms));\n}\n\nexport function normalizeInit(init?: SwoopInit): Required<SwoopInit> {\n return {\n engine: init?.engine ?? 'vm',\n pluck: init?.pluck ?? {},\n executeScripts: init?.executeScripts ?? true,\n timeout: init?.timeout ?? 3000,\n waitStrategy: init?.waitStrategy ?? 'networkidle',\n idleTime: init?.idleTime ?? 250,\n pollInterval: init?.pollInterval ?? 25,\n maxScripts: init?.maxScripts ?? 64,\n forwardConsole: init?.forwardConsole ?? false,\n permissiveShims: init?.permissiveShims ?? true,\n debugFetch: init?.debugFetch ?? false,\n debugProbes: init?.debugProbes ?? false,\n };\n}\n","import vm from 'node:vm';\n\nexport function defineWindowInContext(context: vm.Context, timeoutMs: number = 50): void {\n vm.runInContext(\n `\n globalThis.Window ??= function Window() {};\n try { globalThis.Window.prototype = Object.getPrototypeOf(globalThis); } catch {}\n `,\n context,\n { timeout: timeoutMs },\n );\n}\n\nexport function ensureRealmFunctionIntrinsic(context: vm.Context, timeoutMs: number = 50): void {\n vm.runInContext(\n `\n try { globalThis.Function = (function(){}).constructor; } catch {}\n `,\n context,\n { timeout: timeoutMs },\n );\n}\n\nexport function installRealmWrappers(context: vm.Context, timeoutMs: number = 50): void {\n vm.runInContext(\n `\n // timers\n if (typeof globalThis.__swoop_setTimeout === \"function\") {\n globalThis.setTimeout = (...args) => globalThis.__swoop_setTimeout(...args);\n }\n if (typeof globalThis.__swoop_clearTimeout === \"function\") {\n globalThis.clearTimeout = (...args) => globalThis.__swoop_clearTimeout(...args);\n }\n if (typeof globalThis.__swoop_setInterval === \"function\") {\n globalThis.setInterval = (...args) => globalThis.__swoop_setInterval(...args);\n }\n if (typeof globalThis.__swoop_clearInterval === \"function\") {\n globalThis.clearInterval = (...args) => globalThis.__swoop_clearInterval(...args);\n }\n if (typeof globalThis.__swoop_setImmediate === \"function\") {\n globalThis.setImmediate = (...args) => globalThis.__swoop_setImmediate(...args);\n }\n if (typeof globalThis.__swoop_clearImmediate === \"function\") {\n globalThis.clearImmediate = (...args) => globalThis.__swoop_clearImmediate(...args);\n }\n\n // microtasks / raf / idle\n if (typeof globalThis.__swoop_queueMicrotask === \"function\") {\n globalThis.queueMicrotask = (...args) => globalThis.__swoop_queueMicrotask(...args);\n }\n if (typeof globalThis.__swoop_requestAnimationFrame === \"function\") {\n globalThis.requestAnimationFrame = (...args) => globalThis.__swoop_requestAnimationFrame(...args);\n }\n if (typeof globalThis.__swoop_cancelAnimationFrame === \"function\") {\n globalThis.cancelAnimationFrame = (...args) => globalThis.__swoop_cancelAnimationFrame(...args);\n }\n if (typeof globalThis.__swoop_requestIdleCallback === \"function\") {\n globalThis.requestIdleCallback = (...args) => globalThis.__swoop_requestIdleCallback(...args);\n }\n if (typeof globalThis.__swoop_cancelIdleCallback === \"function\") {\n globalThis.cancelIdleCallback = (...args) => globalThis.__swoop_cancelIdleCallback(...args);\n }\n\n // fetch\n if (typeof globalThis.__swoop_fetch === \"function\") {\n globalThis.fetch = (...args) => globalThis.__swoop_fetch(...args);\n }\n `,\n context,\n { timeout: timeoutMs },\n );\n}\n","import vm from 'node:vm';\nimport type { PluckInit } from '../../pluck/index.js';\nimport { pluck } from '../../pluck/index.js';\n\ntype PluckLike = typeof pluck;\n\nexport interface ModuleLoaderInit {\n context: vm.Context;\n remainingMs: () => number;\n pluckInit: PluckInit;\n pluckFn?: PluckLike;\n}\n\nexport interface ModuleLoader {\n loadModule: (specifier: string, referencingUrl: string) => Promise<vm.Module>;\n linkerFor: (referencingUrl: string) => (specifier: string) => Promise<vm.Module>;\n}\n\nexport function createModuleLoader(init: ModuleLoaderInit): ModuleLoader {\n const SourceTextModule = (vm as any).SourceTextModule as\n | (new (\n code: string,\n options: any,\n ) => vm.Module)\n | undefined;\n\n const moduleCache = new Map<string, vm.Module>();\n const pluckFn = init.pluckFn ?? pluck;\n\n const loadModule = async (specifier: string, referencingUrl: string): Promise<vm.Module> => {\n if (init.remainingMs() <= 0)\n throw new Error('swoop() time budget exhausted while loading modules');\n const resolved = new URL(specifier, referencingUrl).href;\n const cached = moduleCache.get(resolved);\n if (cached) return cached;\n\n if (!SourceTextModule) {\n throw new Error(\n 'Module scripts require Node `--experimental-vm-modules` (vm.SourceTextModule is unavailable).',\n );\n }\n\n const modRes = await pluckFn(resolved, {\n ...init.pluckInit,\n timeout: Math.min(init.pluckInit.timeout ?? 30000, init.remainingMs()),\n strictContentType: false,\n throwOnHttpError: true,\n });\n const rawSource = await modRes.textUtf8();\n\n const mod = new SourceTextModule(rawSource, {\n context: init.context,\n identifier: resolved,\n initializeImportMeta: (meta: any) => {\n meta.url = resolved;\n },\n importModuleDynamically: async (spec: string) => {\n const child = await loadModule(spec, resolved);\n await child.link(linkerFor(resolved));\n await child.evaluate();\n return child;\n },\n });\n\n moduleCache.set(resolved, mod);\n return mod;\n };\n\n const linkerFor =\n (referencingUrl: string) =>\n async (specifier: string): Promise<vm.Module> => {\n return await loadModule(specifier, referencingUrl);\n };\n\n return { loadModule, linkerFor };\n}\n","export type WaitStrategy = 'timeout' | 'networkidle';\n\nexport interface WaitForSettleInit {\n strategy: WaitStrategy;\n deadlineMs: number;\n idleTimeMs: number;\n pollIntervalMs: number;\n sleep: (ms: number) => Promise<void>;\n now: () => number;\n getPendingFetches: () => number;\n getPendingScriptLoads: () => number;\n getLastAsyncActivityAt: () => number;\n}\n\nexport async function waitForSettle(init: WaitForSettleInit): Promise<{ timedOut: boolean }> {\n if (init.strategy === 'timeout') {\n await init.sleep(Math.max(0, init.deadlineMs - init.now()));\n return { timedOut: init.now() >= init.deadlineMs };\n }\n\n while (init.now() < init.deadlineMs) {\n if (\n init.getPendingFetches() === 0 &&\n init.getPendingScriptLoads() === 0 &&\n init.now() - init.getLastAsyncActivityAt() >= init.idleTimeMs\n ) {\n return { timedOut: false };\n }\n await init.sleep(init.pollIntervalMs);\n }\n\n return { timedOut: true };\n}\n","import vm from 'node:vm';\nimport { parseHTML as linkedomParseHTML } from 'linkedom';\n\nimport { pluck } from '../../pluck/index.js';\nimport { createConsoleCapture } from '../console.js';\nimport { installAsyncEnv } from '../env/async.js';\nimport { computeBaseForResolve, patchBaseElementHref, patchDocumentBaseURI } from '../env/base.js';\nimport { installBrowserShims } from '../env/browser.js';\nimport { installCookieJar } from '../env/cookie.js';\nimport { installFetchShim } from '../env/fetch.js';\nimport { createNavigationShims } from '../env/navigation.js';\nimport { installPermissiveShims } from '../env/permissive.js';\nimport { installXMLHttpRequest } from '../env/xhr.js';\nimport { synthesizeLifecycle } from '../lifecycle.js';\nimport { emitDebugProbes, installDebugProbes } from '../probes.js';\nimport type { DiscoveredScript } from '../scripts/discover.js';\nimport { createScriptLoader } from '../scripts/loader.js';\nimport type { SwoopInit, SwoopScriptError } from '../types.js';\nimport { sleep } from '../utils.js';\nimport {\n defineWindowInContext,\n ensureRealmFunctionIntrinsic,\n installRealmWrappers,\n} from '../vm/bootstrap.js';\nimport { createModuleLoader } from '../vm/modules.js';\nimport { waitForSettle } from '../wait.js';\nimport type { EngineRunResult } from './types.js';\n\nexport async function runVmEngine(args: {\n finalUrl: string;\n html: string;\n scripts: DiscoveredScript[];\n options: Required<SwoopInit>;\n totalBudgetMs: number;\n deadline: number;\n hostFetch: typeof fetch | undefined;\n}): Promise<EngineRunResult> {\n const { entries: realmConsole, record } = createConsoleCapture();\n\n const remainingMs = () => Math.max(0, args.deadline - Date.now());\n\n const { window, document } = linkedomParseHTML(args.html, { url: args.finalUrl });\n\n const pageUrl = new URL(args.finalUrl);\n\n // For resolving relative URLs, respect the document's <base href=\"...\"> if present.\n // Also enforce browser invariants for `document.baseURI` / `<base>.href` to be absolute.\n const { baseForResolve, baseEl } = computeBaseForResolve(args.finalUrl, document);\n patchDocumentBaseURI(document, baseForResolve);\n patchBaseElementHref(baseEl, baseForResolve);\n\n const documentBaseUriForDom = baseForResolve.href;\n\n // Start with a browser-ish initial document lifecycle state.\n try {\n (document as any).readyState ??= 'loading';\n } catch {\n // ignore\n }\n\n // Use a dedicated sandbox global object whose prototype is the DOM window.\n const domWindow = window as any;\n const globalObj: any = Object.create(domWindow);\n\n // Browser-ish globals\n globalObj.window = globalObj;\n globalObj.self = globalObj;\n globalObj.globalThis = globalObj;\n globalObj.document = document;\n try {\n Object.defineProperty(document, 'defaultView', { value: globalObj, configurable: true });\n } catch {\n // ignore\n }\n\n const { location: locationShim, history: historyShim } = createNavigationShims({\n pageUrl,\n onNavigate: (href) => {\n if (!args.options.debugProbes) return;\n try {\n globalObj.__swoopStats.nav.lastHref = String(href);\n } catch {}\n },\n onPopState: (state) => {\n if (args.options.debugProbes) {\n try {\n globalObj.__swoopStats.nav.pushState++;\n } catch {}\n }\n try {\n globalObj.dispatchEvent?.(new (globalObj.PopStateEvent ?? Event)('popstate', { state }));\n } catch {}\n },\n });\n\n try {\n Object.defineProperty(document, 'location', {\n configurable: true,\n get: () => locationShim,\n set: (v: string) => {\n try {\n locationShim.href = String(v);\n } catch {}\n },\n });\n } catch {\n // ignore\n }\n\n globalObj.location = locationShim;\n globalObj.history = historyShim;\n\n installBrowserShims({ globalObj, domWindow, document, documentBaseUriForDom });\n installCookieJar(document);\n\n const asyncEnv = installAsyncEnv({ globalObj, debugProbes: args.options.debugProbes });\n const noteAsyncActivity = asyncEnv.noteAsyncActivity;\n const hostSetTimeout = asyncEnv.hostSetTimeout;\n const hostClearTimeout = asyncEnv.hostClearTimeout;\n\n if (args.options.debugProbes) {\n try {\n installDebugProbes({ globalObj, hostSetTimeout });\n } catch {\n // ignore\n }\n }\n\n const fetchShim = installFetchShim({\n globalObj,\n hostFetch: args.hostFetch,\n baseForResolveHref: baseForResolve.href,\n remainingMs,\n hostSetTimeout,\n hostClearTimeout,\n noteAsyncActivity,\n debugFetch: args.options.debugFetch,\n recordDebug: (a) => record('debug', a),\n queueMicrotask: (cb) => globalObj.__swoop_queueMicrotask(cb),\n });\n\n // Browser-style event helpers on globalThis.\n const addEventListener = domWindow.addEventListener?.bind(domWindow);\n const removeEventListener = domWindow.removeEventListener?.bind(domWindow);\n const dispatchEvent = domWindow.dispatchEvent?.bind(domWindow);\n if (typeof addEventListener === 'function') globalObj.addEventListener = addEventListener;\n if (typeof removeEventListener === 'function')\n globalObj.removeEventListener = removeEventListener;\n if (typeof dispatchEvent === 'function') globalObj.dispatchEvent = dispatchEvent;\n\n // Console capture\n globalObj.console = {\n debug: (...a: unknown[]) => record('debug', a),\n info: (...a: unknown[]) => record('info', a),\n warn: (...a: unknown[]) => record('warn', a),\n error: (...a: unknown[]) => record('error', a),\n log: (...a: unknown[]) => record('log', a),\n };\n if (args.options.forwardConsole) {\n for (const level of ['debug', 'info', 'warn', 'error', 'log'] as const) {\n const original = (console as any)[level]?.bind(console);\n if (typeof original === 'function') {\n const wrapped = globalObj.console[level];\n globalObj.console[level] = (...a: unknown[]) => {\n wrapped(...a);\n original(...a);\n };\n }\n }\n }\n\n // Capture global error hooks used by browsers/frameworks.\n try {\n globalObj.onerror = (\n message: unknown,\n source?: unknown,\n line?: unknown,\n col?: unknown,\n error?: unknown,\n ) => {\n record('error', ['[window.onerror]', message, source, line, col, error]);\n };\n } catch {}\n try {\n globalObj.onunhandledrejection = (event: any) => {\n record('error', ['[unhandledrejection]', event?.reason]);\n };\n } catch {}\n try {\n globalObj.addEventListener?.('error', (event: any) => {\n record('error', [\n '[error event]',\n event?.message,\n event?.filename,\n event?.lineno,\n event?.colno,\n event?.error instanceof Error\n ? `${event.error.name}: ${event.error.message}\\n${event.error.stack ?? ''}`.trim()\n : event?.error,\n ]);\n });\n } catch {}\n\n if (args.options.permissiveShims) {\n installPermissiveShims(globalObj);\n if (!globalObj.XMLHttpRequest) {\n installXMLHttpRequest({\n globalObj,\n resolveUrl: (u: string) => {\n try {\n return new URL(u, baseForResolve.href).href;\n } catch {\n return u;\n }\n },\n remainingMs,\n hostSetTimeout,\n hostClearTimeout,\n fetch: args.hostFetch,\n });\n }\n }\n\n const context = vm.createContext(globalObj, { name: 'magpie-html/swoop' });\n defineWindowInContext(context);\n ensureRealmFunctionIntrinsic(context);\n installRealmWrappers(context);\n\n const { loadModule, linkerFor } = createModuleLoader({\n context,\n remainingMs,\n pluckInit: args.options.pluck,\n });\n\n const scriptLoader = createScriptLoader({\n globalObj,\n pageUrlHref: pageUrl.href,\n baseForResolveHref: baseForResolve.href,\n remainingMs,\n hostSetTimeout,\n totalBudgetMs: args.totalBudgetMs,\n maxDebugEvents: args.options.debugProbes ? 80 : 0,\n debug: (a) => {\n if (!args.options.debugProbes) return;\n record('debug', a);\n },\n onError: (resolvedSrc, err) => {\n const e = err as Error;\n record('error', ['[swoop] script load failed', resolvedSrc, e?.message || String(e)]);\n },\n noteAsyncActivity,\n fetchText: async (url: string) => {\n const sres = await pluck(url, {\n ...args.options.pluck,\n timeout: Math.min(args.options.pluck.timeout ?? 30000, remainingMs()),\n strictContentType: false,\n throwOnHttpError: true,\n });\n return await sres.textUtf8();\n },\n runClassicScript: (code: string, filename: string) => {\n const script = new vm.Script(code, { filename });\n script.runInContext(context, { timeout: args.totalBudgetMs });\n },\n runModuleScript: async (resolvedSrc: string, parentUrlForResolve: string) => {\n const mod = await loadModule(resolvedSrc, parentUrlForResolve);\n await mod.link(linkerFor(resolvedSrc));\n await mod.evaluate();\n },\n });\n scriptLoader.install();\n const getPendingScriptLoads = () => scriptLoader.getPendingScriptLoads();\n\n const engineErrors: SwoopScriptError[] = [];\n\n // Execute discovered scripts\n const classicScripts = args.scripts.filter((s) => !s.isModule);\n const moduleScriptsInOrder = args.scripts.filter((s) => s.isModule);\n\n for (const s of [...classicScripts, ...moduleScriptsInOrder]) {\n if (remainingMs() <= 0) {\n engineErrors.push({\n stage: 'wait',\n message: `Hard time budget (${args.totalBudgetMs}ms) exceeded while executing scripts; returning snapshot.`,\n });\n break;\n }\n\n const scriptUrl = s.kind === 'external' ? s.url : `${args.finalUrl}#inline`;\n try {\n if (s.isModule) {\n const modCode = s.code;\n const SourceTextModule = (vm as any).SourceTextModule as any;\n if (!SourceTextModule) {\n throw new Error(\n 'Module scripts require Node `--experimental-vm-modules` (vm.SourceTextModule is unavailable).',\n );\n }\n const mod = new SourceTextModule(modCode, {\n context,\n identifier: scriptUrl,\n initializeImportMeta: (meta: any) => {\n meta.url = scriptUrl;\n },\n importModuleDynamically: async (spec: string) => {\n const child = await loadModule(spec, scriptUrl);\n await child.link(linkerFor(scriptUrl));\n await child.evaluate();\n return child;\n },\n });\n\n const timeoutP = (label: string) =>\n sleep(remainingMs()).then(() => {\n throw new Error(`swoop() time budget exhausted during ${label}`);\n });\n\n const linkP = mod.link(linkerFor(scriptUrl));\n try {\n await Promise.race([linkP, timeoutP('module link')]);\n } catch (e) {\n void (linkP as any).catch?.(() => {});\n throw e;\n }\n\n const evalP = mod.evaluate();\n try {\n await Promise.race([evalP as any, timeoutP('module evaluate')]);\n } catch (e) {\n void (evalP as any).catch?.(() => {});\n throw e;\n }\n } else {\n const script = new vm.Script(s.code, { filename: scriptUrl });\n script.runInContext(context, { timeout: args.totalBudgetMs });\n }\n } catch (err) {\n const e = err as Error;\n engineErrors.push({\n stage: 'script',\n scriptUrl: s.kind === 'external' ? s.url : undefined,\n message: e.message || String(e),\n stack: e.stack,\n });\n }\n }\n\n // Fire DOM lifecycle events\n try {\n synthesizeLifecycle(context, Math.min(50, remainingMs()));\n } catch {\n // ignore\n }\n\n const settle = await waitForSettle({\n strategy:\n args.options.waitStrategy === 'timeout' || typeof globalObj.fetch !== 'function'\n ? 'timeout'\n : 'networkidle',\n deadlineMs: args.deadline,\n idleTimeMs: args.options.idleTime,\n pollIntervalMs: args.options.pollInterval,\n sleep,\n now: () => Date.now(),\n getPendingFetches: () => fetchShim.getPendingFetches(),\n getPendingScriptLoads,\n getLastAsyncActivityAt: () => asyncEnv.getLastAsyncActivityAt(),\n });\n\n if (\n settle.timedOut &&\n args.options.waitStrategy === 'networkidle' &&\n typeof globalObj.fetch === 'function'\n ) {\n engineErrors.push({\n stage: 'wait',\n message: `Hard time budget (${args.totalBudgetMs}ms) exceeded waiting for network idle; returning snapshot.`,\n });\n }\n\n const snapshot = document.documentElement?.outerHTML ?? '';\n\n if (args.options.debugProbes) {\n try {\n emitDebugProbes(globalObj, (a) => record('debug', a));\n } catch {}\n }\n\n asyncEnv.cleanup();\n\n return { snapshot, consoleEntries: realmConsole, engineErrors };\n}\n","import { pluck } from '../../pluck/index.js';\nimport { parseHTML } from '../../utils/html-parser.js';\nimport type { SwoopInit, SwoopScriptError } from '../types.js';\n\nexport type DiscoveredScript =\n | { kind: 'inline'; code: string; isModule: boolean }\n | { kind: 'external'; url: string; code: string; isModule: boolean };\n\nfunction isExecutableScriptType(type: string | null): boolean {\n if (!type) return true; // default JS\n const t = type.trim().toLowerCase();\n if (t === '') return true;\n if (t === 'text/javascript') return true;\n if (t === 'application/javascript') return true;\n if (t === 'application/ecmascript') return true;\n if (t === 'text/ecmascript') return true;\n return false;\n}\n\nfunction isModuleScript(type: string | null): boolean {\n return (type ?? '').trim().toLowerCase() === 'module';\n}\n\ntype PluckLike = typeof pluck;\n\nexport async function discoverAndFetchScripts(\n html: string,\n finalUrl: string,\n init: Required<SwoopInit>,\n pluckFn: PluckLike = pluck,\n): Promise<{ scripts: DiscoveredScript[]; errors: SwoopScriptError[] }> {\n const errors: SwoopScriptError[] = [];\n const scripts: DiscoveredScript[] = [];\n\n if (!init.executeScripts) return { scripts, errors };\n\n const doc = parseHTML(html, finalUrl);\n const baseHref = doc.querySelector('base[href]')?.getAttribute('href') ?? null;\n const baseUrl = baseHref ? new URL(baseHref, finalUrl).href : finalUrl;\n\n const scriptEls = Array.from(doc.querySelectorAll('script'));\n for (const el of scriptEls.slice(0, init.maxScripts)) {\n const type = el.getAttribute('type');\n const isModule = isModuleScript(type);\n if (!isModule && !isExecutableScriptType(type)) continue;\n\n const src = el.getAttribute('src');\n if (src) {\n const scriptUrl = new URL(src, baseUrl).href;\n try {\n const res = await pluckFn(scriptUrl, {\n ...init.pluck,\n strictContentType: false,\n throwOnHttpError: true,\n });\n const code = await res.textUtf8();\n scripts.push({ kind: 'external', url: scriptUrl, code, isModule });\n } catch (err) {\n const e = err as Error;\n errors.push({\n stage: 'script',\n scriptUrl,\n message: `Failed to fetch external script: ${e.message || String(e)}`,\n stack: e.stack,\n });\n }\n continue;\n }\n\n const code = el.textContent ?? '';\n if (code.trim().length === 0) continue;\n scripts.push({ kind: 'inline', code, isModule });\n }\n\n return { scripts, errors };\n}\n","import { pluck } from '../pluck/index.js';\nimport { runVmEngine } from './engines/vm.js';\nimport { SwoopEnvironmentError } from './errors.js';\nimport { discoverAndFetchScripts } from './scripts/discover.js';\nimport type { SwoopConsoleEntry, SwoopInit, SwoopResult, SwoopScriptError } from './types.js';\nimport { isNodeRuntime, normalizeInit } from './utils.js';\n\n// Capture host web primordials once, so sandbox/window proxies can't accidentally\n// overwrite them and cause recursion (especially in tests).\nconst HOST_FETCH: typeof fetch | undefined =\n typeof globalThis.fetch === 'function' ? globalThis.fetch.bind(globalThis) : undefined;\n\n/**\n * Execute client-side JavaScript against a DOM-only environment and snapshot the resulting HTML.\n *\n * @remarks\n * **Experimental feature**.\n *\n * @remarks\n * - Default engine (`vm`) works on regular Node.js.\n *\n * This is *not* a real browser engine:\n * - No layout/paint/CSS correctness\n * - No true navigation lifecycle\n * - Best-effort shims for browser APIs\n *\n * ⚠️ **Security**: This executes third-party JavaScript. Only use on trusted sources or in an OS sandbox.\n */\nexport async function swoop(url: string | URL, init?: SwoopInit): Promise<SwoopResult> {\n const start = Date.now();\n const options = normalizeInit(init);\n const totalBudgetMs = Math.min(options.timeout, 5000);\n const deadline = start + totalBudgetMs;\n\n if (!isNodeRuntime()) {\n throw new SwoopEnvironmentError('swoop() is currently Node.js-only.');\n }\n\n // Fetch initial HTML (use pluck for robust encoding + redirects)\n const res = await pluck(String(url), {\n ...options.pluck,\n timeout: Math.min(options.pluck.timeout ?? 30000, totalBudgetMs),\n strictContentType: false,\n throwOnHttpError: true,\n });\n const html = await res.textUtf8();\n const finalUrl = res.finalUrl;\n\n const { scripts, errors: preErrors } = await discoverAndFetchScripts(html, finalUrl, options);\n\n // Engine: vm\n let snapshot = '';\n let consoleEntries: SwoopConsoleEntry[] = [];\n let engineErrors: SwoopScriptError[] = [];\n\n const r = await runVmEngine({\n finalUrl,\n html,\n scripts,\n options,\n totalBudgetMs,\n deadline,\n hostFetch: HOST_FETCH,\n });\n snapshot = r.snapshot;\n consoleEntries = r.consoleEntries;\n engineErrors = r.engineErrors;\n\n const end = Date.now();\n return {\n url: finalUrl,\n html: snapshot,\n console: consoleEntries,\n errors: [...preErrors, ...engineErrors],\n timing: {\n start,\n end,\n duration: end - start,\n },\n };\n}\n"]}