@qhr123/sa2kit 0.2.0 → 0.3.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.
- package/README.md +82 -0
- package/dist/analytics/index.d.mts +741 -0
- package/dist/analytics/index.d.ts +741 -0
- package/dist/analytics/index.js +1215 -0
- package/dist/analytics/index.js.map +1 -0
- package/dist/analytics/index.mjs +1164 -0
- package/dist/analytics/index.mjs.map +1 -0
- package/dist/i18n/index.d.mts +306 -0
- package/dist/i18n/index.d.ts +306 -0
- package/dist/i18n/index.js +369 -0
- package/dist/i18n/index.js.map +1 -0
- package/dist/i18n/index.mjs +360 -0
- package/dist/i18n/index.mjs.map +1 -0
- package/package.json +15 -1
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../src/analytics/types.ts","../../src/analytics/core/EventQueue.ts","../../src/analytics/core/Uploader.ts","../../src/analytics/core/Analytics.ts","../../src/analytics/client/presets.ts","../../src/analytics/client/singleton.ts","../../src/analytics/utils/helpers.ts","../../src/analytics/utils/decorators.ts","../../src/analytics/utils/hooks.ts","../../src/analytics/index.ts"],"names":["EventType","EventPriority","getAnalyticsInstance"],"mappings":";;;AAQO,IAAK,SAAA,qBAAAA,UAAAA,KAAL;AAEL,EAAAA,WAAA,WAAA,CAAA,GAAY,WAAA;AACZ,EAAAA,WAAA,YAAA,CAAA,GAAa,YAAA;AAGb,EAAAA,WAAA,OAAA,CAAA,GAAQ,OAAA;AACR,EAAAA,WAAA,QAAA,CAAA,GAAS,QAAA;AACT,EAAAA,WAAA,OAAA,CAAA,GAAQ,OAAA;AACR,EAAAA,WAAA,QAAA,CAAA,GAAS,QAAA;AAGT,EAAAA,WAAA,OAAA,CAAA,GAAQ,OAAA;AACR,EAAAA,WAAA,QAAA,CAAA,GAAS,QAAA;AACT,EAAAA,WAAA,UAAA,CAAA,GAAW,UAAA;AACX,EAAAA,WAAA,QAAA,CAAA,GAAS,QAAA;AACT,EAAAA,WAAA,OAAA,CAAA,GAAQ,OAAA;AAGR,EAAAA,WAAA,aAAA,CAAA,GAAc,aAAA;AACd,EAAAA,WAAA,OAAA,CAAA,GAAQ,OAAA;AACR,EAAAA,WAAA,UAAA,CAAA,GAAW,UAAA;AAGX,EAAAA,WAAA,QAAA,CAAA,GAAS,QAAA;AAxBC,EAAA,OAAAA,UAAAA;AAAA,CAAA,EAAA,SAAA,IAAA,EAAA;AA8BL,IAAK,aAAA,qBAAAC,cAAAA,KAAL;AACL,EAAAA,cAAAA,CAAAA,cAAAA,CAAA,SAAM,CAAA,CAAA,GAAN,KAAA;AACA,EAAAA,cAAAA,CAAAA,cAAAA,CAAA,YAAS,CAAA,CAAA,GAAT,QAAA;AACA,EAAAA,cAAAA,CAAAA,cAAAA,CAAA,UAAO,CAAA,CAAA,GAAP,MAAA;AACA,EAAAA,cAAAA,CAAAA,cAAAA,CAAA,cAAW,CAAA,CAAA,GAAX,UAAA;AAJU,EAAA,OAAAA,cAAAA;AAAA,CAAA,EAAA,aAAA,IAAA,EAAA;;;AC/BL,IAAM,aAAN,MAAiB;AAAA,EAItB,WAAA,CAAY,UAAkB,GAAA,EAAK;AAHnC,IAAA,IAAA,CAAQ,QAA0B,EAAC;AAIjC,IAAA,IAAA,CAAK,OAAA,GAAU,OAAA;AAAA,EACjB;AAAA;AAAA;AAAA;AAAA,EAKA,QAAQ,KAAA,EAA6B;AAEnC,IAAA,IAAI,IAAA,CAAK,KAAA,CAAM,MAAA,IAAU,IAAA,CAAK,OAAA,EAAS;AACrC,MAAA,IAAA,CAAK,yBAAA,EAA0B;AAAA,IACjC;AAEA,IAAA,IAAA,CAAK,KAAA,CAAM,KAAK,KAAK,CAAA;AAGrB,IAAA,IAAA,CAAK,KAAA,CAAM,KAAK,CAAC,CAAA,EAAG,MAAM,CAAA,CAAE,QAAA,GAAW,EAAE,QAAQ,CAAA;AAAA,EACnD;AAAA;AAAA;AAAA;AAAA,EAKA,aAAa,MAAA,EAAgC;AAC3C,IAAA,MAAA,CAAO,QAAQ,CAAC,KAAA,KAAU,IAAA,CAAK,OAAA,CAAQ,KAAK,CAAC,CAAA;AAAA,EAC/C;AAAA;AAAA;AAAA;AAAA,EAKA,QAAQ,KAAA,EAAiC;AACvC,IAAA,OAAO,IAAA,CAAK,KAAA,CAAM,MAAA,CAAO,CAAA,EAAG,KAAK,CAAA;AAAA,EACnC;AAAA;AAAA;AAAA;AAAA,EAKA,UAAA,GAA+B;AAC7B,IAAA,MAAM,MAAA,GAAS,CAAC,GAAG,IAAA,CAAK,KAAK,CAAA;AAC7B,IAAA,IAAA,CAAK,QAAQ,EAAC;AACd,IAAA,OAAO,MAAA;AAAA,EACT;AAAA;AAAA;AAAA;AAAA,EAKA,qBAAA,GAA0C;AACxC,IAAA,MAAM,kBAAA,GAAqB,KAAK,KAAA,CAAM,MAAA;AAAA,MACpC,CAAC,KAAA,KAAU,KAAA,CAAM,QAAA,IAAY;AAAA;AAAA,KAC/B;AAGA,IAAA,IAAA,CAAK,KAAA,GAAQ,KAAK,KAAA,CAAM,MAAA,CAAO,CAAC,KAAA,KAAU,KAAA,CAAM,WAAW,CAAC,CAAA;AAE5D,IAAA,OAAO,kBAAA;AAAA,EACT;AAAA;AAAA;AAAA;AAAA,EAKA,IAAA,GAAe;AACb,IAAA,OAAO,KAAK,KAAA,CAAM,MAAA;AAAA,EACpB;AAAA;AAAA;AAAA;AAAA,EAKA,OAAA,GAAmB;AACjB,IAAA,OAAO,IAAA,CAAK,MAAM,MAAA,KAAW,CAAA;AAAA,EAC/B;AAAA;AAAA;AAAA;AAAA,EAKA,MAAA,GAAkB;AAChB,IAAA,OAAO,IAAA,CAAK,KAAA,CAAM,MAAA,IAAU,IAAA,CAAK,OAAA;AAAA,EACnC;AAAA;AAAA;AAAA;AAAA,EAKA,KAAA,GAAc;AACZ,IAAA,IAAA,CAAK,QAAQ,EAAC;AAAA,EAChB;AAAA;AAAA;AAAA;AAAA,EAKQ,yBAAA,GAAkC;AACxC,IAAA,IAAI,IAAA,CAAK,KAAA,CAAM,MAAA,KAAW,CAAA,EAAG;AAG7B,IAAA,IAAI,mBAAA,GAAsB,CAAA;AAC1B,IAAA,IAAI,cAAA,GAAiB,IAAA,CAAK,KAAA,CAAM,CAAC,GAAG,QAAA,IAAY,CAAA;AAEhD,IAAA,KAAA,IAAS,IAAI,CAAA,EAAG,CAAA,GAAI,IAAA,CAAK,KAAA,CAAM,QAAQ,CAAA,EAAA,EAAK;AAC1C,MAAA,MAAM,eAAA,GAAkB,IAAA,CAAK,KAAA,CAAM,CAAC,GAAG,QAAA,IAAY,CAAA;AACnD,MAAA,IAAI,kBAAkB,cAAA,EAAgB;AACpC,QAAA,cAAA,GAAiB,eAAA;AACjB,QAAA,mBAAA,GAAsB,CAAA;AAAA,MACxB;AAAA,IACF;AAEA,IAAA,IAAA,CAAK,KAAA,CAAM,MAAA,CAAO,mBAAA,EAAqB,CAAC,CAAA;AAAA,EAC1C;AAAA;AAAA;AAAA;AAAA,EAKA,QAAA,GAA6B;AAC3B,IAAA,OAAO,CAAC,GAAG,IAAA,CAAK,KAAK,CAAA;AAAA,EACvB;AACF;;;ACpGO,IAAM,WAAN,MAAe;AAAA,EAKpB,YAAY,MAAA,EAAwB;AAHpC,IAAA,IAAA,CAAQ,SAAA,GAAY,KAAA;AACpB,IAAA,IAAA,CAAQ,UAAA,uBAAgF,GAAA,EAAI;AAG1F,IAAA,IAAA,CAAK,MAAA,GAAS,MAAA;AAAA,EAChB;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,OAAO,MAAA,EAA4C;AACvD,IAAA,IAAI,MAAA,CAAO,MAAA,KAAW,CAAA,EAAG,OAAO,IAAA;AAGhC,IAAA,MAAM,QAAA,GAAW,MAAM,IAAA,CAAK,MAAA,CAAO,eAAe,QAAA,EAAS;AAC3D,IAAA,IAAI,CAAC,QAAA,EAAU;AAEb,MAAA,MAAM,IAAA,CAAK,YAAY,MAAM,CAAA;AAC7B,MAAA,OAAO,KAAA;AAAA,IACT;AAEA,IAAA,IAAI;AACF,MAAA,IAAA,CAAK,SAAA,GAAY,IAAA;AAEjB,MAAA,MAAM,QAAA,GAAW,MAAM,IAAA,CAAK,MAAA,CAAO,eAAe,MAAA,CAAO,IAAA,CAAK,MAAA,CAAO,QAAA,EAAU,MAAM,CAAA;AAErF,MAAA,IAAI,SAAS,OAAA,EAAS;AACpB,QAAA,IAAA,CAAK,MAAA,CAAO,YAAY,MAAM,CAAA;AAC9B,QAAA,OAAO,IAAA;AAAA,MACT,CAAA,MAAO;AACL,QAAA,MAAM,IAAI,KAAA,CAAM,QAAA,CAAS,OAAA,IAAW,eAAe,CAAA;AAAA,MACrD;AAAA,IACF,SAAS,KAAA,EAAO;AACd,MAAA,MAAM,GAAA,GAAM,iBAAiB,KAAA,GAAQ,KAAA,GAAQ,IAAI,KAAA,CAAM,MAAA,CAAO,KAAK,CAAC,CAAA;AACpE,MAAA,IAAA,CAAK,MAAA,CAAO,OAAA,GAAU,GAAA,EAAK,MAAM,CAAA;AAGjC,MAAA,MAAM,IAAA,CAAK,gBAAgB,MAAM,CAAA;AACjC,MAAA,OAAO,KAAA;AAAA,IACT,CAAA,SAAE;AACA,MAAA,IAAA,CAAK,SAAA,GAAY,KAAA;AAAA,IACnB;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,YAAY,MAAA,EAA4C;AAC5D,IAAA,MAAM,UAAU,IAAA,CAAK,gBAAA,CAAiB,MAAA,EAAQ,IAAA,CAAK,OAAO,SAAS,CAAA;AACnE,IAAA,MAAM,OAAA,GAAU,MAAM,OAAA,CAAQ,GAAA,CAAI,OAAA,CAAQ,GAAA,CAAI,CAAC,KAAA,KAAU,IAAA,CAAK,MAAA,CAAO,KAAK,CAAC,CAAC,CAAA;AAE5E,IAAA,OAAO,OAAA,CAAQ,KAAA,CAAM,CAAC,MAAA,KAAW,MAAM,CAAA;AAAA,EACzC;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,kBAAA,GAAoC;AACxC,IAAA,IAAI,IAAA,CAAK,SAAA,IAAa,IAAA,CAAK,UAAA,CAAW,SAAS,CAAA,EAAG;AAElD,IAAA,MAAM,QAAA,GAAW,MAAM,IAAA,CAAK,MAAA,CAAO,eAAe,QAAA,EAAS;AAC3D,IAAA,IAAI,CAAC,QAAA,EAAU;AAEf,IAAA,MAAM,UAAU,KAAA,CAAM,IAAA,CAAK,IAAA,CAAK,UAAA,CAAW,SAAS,CAAA;AAEpD,IAAA,KAAA,MAAW,CAAC,GAAA,EAAK,IAAI,CAAA,IAAK,OAAA,EAAS;AACjC,MAAA,IAAI,IAAA,CAAK,UAAA,IAAc,IAAA,CAAK,MAAA,CAAO,UAAA,EAAY;AAE7C,QAAA,MAAM,IAAA,CAAK,WAAA,CAAY,IAAA,CAAK,MAAM,CAAA;AAClC,QAAA,IAAA,CAAK,UAAA,CAAW,OAAO,GAAG,CAAA;AAC1B,QAAA;AAAA,MACF;AAGA,MAAA,MAAM,KAAK,KAAA,CAAM,IAAA,CAAK,OAAO,aAAA,IAAiB,IAAA,CAAK,aAAa,CAAA,CAAE,CAAA;AAElE,MAAA,MAAM,OAAA,GAAU,MAAM,IAAA,CAAK,MAAA,CAAO,KAAK,MAAM,CAAA;AAE7C,MAAA,IAAI,OAAA,EAAS;AACX,QAAA,IAAA,CAAK,UAAA,CAAW,OAAO,GAAG,CAAA;AAAA,MAC5B,CAAA,MAAO;AAEL,QAAA,IAAA,CAAK,UAAA,EAAA;AAAA,MACP;AAAA,IACF;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,kBAAA,GAAoC;AACxC,IAAA,IAAI;AACF,MAAA,MAAM,YAAA,GAAe,MAAM,IAAA,CAAK,MAAA,CAAO,eAAe,SAAA,EAAU;AAEhE,MAAA,IAAI,YAAA,CAAa,SAAS,CAAA,EAAG;AAC3B,QAAA,MAAM,OAAA,GAAU,MAAM,IAAA,CAAK,WAAA,CAAY,YAAY,CAAA;AAEnD,QAAA,IAAI,OAAA,EAAS;AACX,UAAA,MAAM,IAAA,CAAK,MAAA,CAAO,cAAA,CAAe,WAAA,EAAY;AAAA,QAC/C;AAAA,MACF;AAAA,IACF,SAAS,KAAA,EAAO;AACd,MAAA,OAAA,CAAQ,KAAA,CAAM,mCAAmC,KAAK,CAAA;AAAA,IACxD;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKA,MAAc,YAAY,MAAA,EAAyC;AACjE,IAAA,IAAI;AACF,MAAA,MAAM,cAAA,GAAiB,MAAM,IAAA,CAAK,MAAA,CAAO,eAAe,SAAA,EAAU;AAClE,MAAA,MAAM,SAAA,GAAY,CAAC,GAAG,cAAA,EAAgB,GAAG,MAAM,CAAA;AAC/C,MAAA,MAAM,IAAA,CAAK,MAAA,CAAO,cAAA,CAAe,UAAA,CAAW,SAAS,CAAA;AAAA,IACvD,SAAS,KAAA,EAAO;AACd,MAAA,OAAA,CAAQ,KAAA,CAAM,2CAA2C,KAAK,CAAA;AAAA,IAChE;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKA,MAAc,gBAAgB,MAAA,EAAyC;AACrE,IAAA,MAAM,GAAA,GAAM,GAAG,IAAA,CAAK,GAAA,EAAK,CAAA,CAAA,EAAI,IAAA,CAAK,QAAQ,CAAA,CAAA;AAC1C,IAAA,IAAA,CAAK,UAAA,CAAW,IAAI,GAAA,EAAK;AAAA,MACvB,MAAA;AAAA,MACA,UAAA,EAAY;AAAA,KACb,CAAA;AAAA,EACH;AAAA;AAAA;AAAA;AAAA,EAKQ,gBAAA,CAAiB,QAA0B,SAAA,EAAuC;AACxF,IAAA,MAAM,UAA8B,EAAC;AAErC,IAAA,KAAA,IAAS,IAAI,CAAA,EAAG,CAAA,GAAI,MAAA,CAAO,MAAA,EAAQ,KAAK,SAAA,EAAW;AACjD,MAAA,OAAA,CAAQ,KAAK,MAAA,CAAO,KAAA,CAAM,CAAA,EAAG,CAAA,GAAI,SAAS,CAAC,CAAA;AAAA,IAC7C;AAEA,IAAA,OAAO,OAAA;AAAA,EACT;AAAA;AAAA;AAAA;AAAA,EAKQ,MAAM,EAAA,EAA2B;AACvC,IAAA,OAAO,IAAI,OAAA,CAAQ,CAAC,YAAY,UAAA,CAAW,OAAA,EAAS,EAAE,CAAC,CAAA;AAAA,EACzD;AAAA;AAAA;AAAA;AAAA,EAKA,WAAA,GAAuB;AACrB,IAAA,OAAO,IAAA,CAAK,SAAA;AAAA,EACd;AAAA;AAAA;AAAA;AAAA,EAKA,iBAAA,GAA4B;AAC1B,IAAA,OAAO,KAAK,UAAA,CAAW,IAAA;AAAA,EACzB;AAAA;AAAA;AAAA;AAAA,EAKA,eAAA,GAAwB;AACtB,IAAA,IAAA,CAAK,WAAW,KAAA,EAAM;AAAA,EACxB;AACF;;;AC/KA,IAAM,WAAA,GAAc,OAAA;AAEb,IAAM,YAAN,MAAgB;AAAA,EAcrB,WAAA,CACE,MAAA,EAUA,cAAA,EACA,cAAA,EACA,aAAA,EACA;AApBF,IAAA,IAAA,CAAQ,SAAA,GAAoB,EAAA;AAC5B,IAAA,IAAA,CAAQ,QAAA,GAAmB,EAAA;AAC3B,IAAA,IAAA,CAAQ,UAAA,GAAgC,IAAA;AACxC,IAAA,IAAA,CAAQ,WAAA,GAAc,KAAA;AACtB,IAAA,IAAA,CAAQ,UAAA,GAAkB,IAAA;AAoBxB,IAAA,IAAI,OAAO,OAAA,EAAS;AAClB,MAAA,IAAA,CAAK,cAAA,GAAiB,OAAO,OAAA,CAAQ,OAAA;AACrC,MAAA,IAAA,CAAK,cAAA,GAAiB,OAAO,OAAA,CAAQ,OAAA;AACrC,MAAA,IAAA,CAAK,aAAA,GAAgB,OAAO,OAAA,CAAQ,MAAA;AAAA,IACtC,CAAA,MAAA,IAAW,cAAA,IAAkB,cAAA,IAAkB,aAAA,EAAe;AAC5D,MAAA,IAAA,CAAK,cAAA,GAAiB,cAAA;AACtB,MAAA,IAAA,CAAK,cAAA,GAAiB,cAAA;AACtB,MAAA,IAAA,CAAK,aAAA,GAAgB,aAAA;AAAA,IACvB,CAAA,MAAO;AACL,MAAA,MAAM,IAAI,MAAM,sDAAsD,CAAA;AAAA,IACxE;AAGA,IAAA,MAAM,SAAA,GAAa,MAAA,CAAe,SAAA,IAAa,MAAA,CAAO,QAAA,IAAY,uBAAA;AAClE,IAAA,MAAM,QAAA,GAAY,OAAe,QAAA,IAAY,KAAA;AAE7C,IAAA,IAAA,CAAK,MAAA,GAAS;AAAA,MACZ,GAAG,MAAA;AAAA,MACH,OAAO,MAAA,CAAO,KAAA;AAAA,MACd,UAAA,EAAY,OAAO,UAAA,IAAc,OAAA;AAAA,MACjC,QAAA;AAAA,MACA,QAAA,EAAU,SAAA;AAAA,MACV,SAAA,EAAW,OAAO,SAAA,IAAa,EAAA;AAAA,MAC/B,aAAA,EAAe,OAAO,aAAA,IAAiB,GAAA;AAAA,MACvC,YAAA,EAAc,OAAO,YAAA,IAAgB,GAAA;AAAA,MACrC,UAAA,EAAY,OAAO,UAAA,IAAc,CAAA;AAAA,MACjC,aAAA,EAAe,OAAO,aAAA,IAAiB,GAAA;AAAA,MACvC,kBAAA,EAAoB,OAAO,kBAAA,IAAsB,IAAA;AAAA,MACjD,eAAA,EAAiB,OAAO,eAAA,IAAmB,KAAA;AAAA,MAC3C,eAAA,EAAiB,OAAO,eAAA,IAAmB,IAAA;AAAA,MAC3C,qBAAA,EAAuB,OAAO,qBAAA,IAAyB,IAAA;AAAA,MACvD,KAAA,EAAO,OAAO,KAAA,IAAS,KAAA;AAAA,MACvB,UAAA,EAAY,MAAA,CAAO,UAAA,IAAc,EAAC;AAAA,MAClC,YAAA,EAAc,MAAA,CAAO,YAAA,IAAgB,EAAC;AAAA,MACtC,YAAY,MAAA,CAAO;AAAA,KACrB;AAEA,IAAA,IAAA,CAAK,UAAA,GAAa,IAAI,UAAA,CAAW,IAAA,CAAK,OAAO,YAAY,CAAA;AACzD,IAAA,IAAA,CAAK,QAAA,GAAW,IAAI,QAAA,CAAS;AAAA,MAC3B,QAAA,EAAU,KAAK,MAAA,CAAO,QAAA;AAAA,MACtB,SAAA,EAAW,KAAK,MAAA,CAAO,SAAA;AAAA,MACvB,UAAA,EAAY,KAAK,MAAA,CAAO,UAAA;AAAA,MACxB,aAAA,EAAe,KAAK,MAAA,CAAO,aAAA;AAAA,MAC3B,gBAAgB,IAAA,CAAK,cAAA;AAAA,MACrB,gBAAgB,IAAA,CAAK,cAAA;AAAA,MACrB,SAAA,EAAW,CAAC,MAAA,KAAW,IAAA,CAAK,gBAAgB,MAAM,CAAA;AAAA,MAClD,SAAS,CAAC,KAAA,EAAO,WAAW,IAAA,CAAK,aAAA,CAAc,OAAO,MAAM;AAAA,KAC7D,CAAA;AAGD,IAAA,IAAA,CAAK,IAAA,EAAK,CAAE,KAAA,CAAM,CAAC,KAAA,KAAU;AAC3B,MAAA,OAAA,CAAQ,KAAA,CAAM,mCAAmC,KAAK,CAAA;AAAA,IACxD,CAAC,CAAA;AAAA,EACH;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,IAAA,GAAsB;AAC1B,IAAA,IAAI,KAAK,WAAA,EAAa;AACpB,MAAA,IAAA,CAAK,IAAI,+BAA+B,CAAA;AACxC,MAAA;AAAA,IACF;AAEA,IAAA,IAAI;AAEF,MAAA,MAAM,KAAK,cAAA,EAAe;AAG1B,MAAA,MAAM,KAAK,WAAA,EAAY;AAGvB,MAAA,MAAM,IAAA,CAAK,SAAS,kBAAA,EAAmB;AAGvC,MAAA,IAAA,CAAK,eAAA,EAAgB;AAGrB,MAAA,IAAI,OAAO,WAAW,WAAA,EAAa;AACjC,QAAA,MAAA,CAAO,gBAAA,CAAiB,yBAAA,GAA4B,CAAC,CAAA,KAAmB;AACtE,UAAA,IAAA,CAAK,IAAI,CAAA,oBAAA,EAAuB,CAAA,CAAE,OAAO,OAAA,GAAU,SAAA,GAAY,UAAU,CAAA,CAAE,CAAA;AAAA,QAC7E,CAAA,EAAmB;AAAA,MACrB;AAEA,MAAA,IAAA,CAAK,WAAA,GAAc,IAAA;AACnB,MAAA,IAAA,CAAK,IAAI,oCAAoC,CAAA;AAAA,IAC/C,SAAS,KAAA,EAAO;AACd,MAAA,OAAA,CAAQ,KAAA,CAAM,mCAAmC,KAAK,CAAA;AACtD,MAAA,MAAM,KAAA;AAAA,IACR;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKA,KAAA,CACE,eAAA,EACA,gBAAA,EACA,eAAA,EACA,QAAA,GAAA,CAAA,eACM;AACN,IAAA,IAAI,CAAC,KAAK,WAAA,EAAa;AACrB,MAAA,OAAA,CAAQ,KAAK,iDAAiD,CAAA;AAE9D,MAAA,UAAA;AAAA,QACE,MAAM,IAAA,CAAK,KAAA,CAAM,eAAA,EAAiB,gBAAA,EAAkB,iBAAiB,QAAQ,CAAA;AAAA,QAC7E;AAAA,OACF;AACA,MAAA;AAAA,IACF;AAEA,IAAA,IAAI,SAAA;AACJ,IAAA,IAAI,SAAA;AACJ,IAAA,IAAI,UAAA;AAKJ,IAAA,IAAI,OAAO,qBAAqB,QAAA,EAAU;AAExC,MAAA,SAAA,GAAY,eAAA;AACZ,MAAA,SAAA,GAAY,gBAAA;AACZ,MAAA,UAAA,GAAa,eAAA;AAAA,IACf,CAAA,MAAO;AAEL,MAAA,SAAA,GAAA,QAAA;AACA,MAAA,SAAA,GAAY,eAAA;AACZ,MAAA,UAAA,GAAa,gBAAA;AAAA,IACf;AAEA,IAAA,MAAM,QAAQ,IAAA,CAAK,WAAA,CAAY,SAAA,EAAW,SAAA,EAAW,YAAY,QAAQ,CAAA;AAGzE,IAAA,MAAM,cAAA,GAAiB,IAAA,CAAK,MAAA,CAAO,UAAA,GAAa,KAAK,CAAA,IAAK,KAAA;AAC1D,IAAA,IAAI,CAAC,cAAA,EAAgB;AACnB,MAAA,IAAA,CAAK,GAAA,CAAI,qCAAqC,KAAK,CAAA;AACnD,MAAA;AAAA,IACF;AAGA,IAAA,IAAA,CAAK,UAAA,CAAW,QAAQ,cAAc,CAAA;AACtC,IAAA,IAAA,CAAK,GAAA,CAAI,iBAAiB,cAAc,CAAA;AAGxC,IAAA,IAAI,QAAA,IAAA,CAAA,aAAgC;AAClC,MAAA,IAAA,CAAK,iBAAA,EAAkB;AAAA,IACzB;AAGA,IAAA,IAAI,IAAA,CAAK,UAAA,CAAW,MAAA,EAAO,EAAG;AAC5B,MAAA,IAAA,CAAK,KAAA,EAAM;AAAA,IACb;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKA,aAAA,CAAc,OAAA,EAAiB,SAAA,EAAmB,UAAA,EAAwC;AACxF,IAAA,IAAA,CAAK,KAAA;AAAA,MAAA,WAAA;AAAA,MAEH,WAAA;AAAA,MACA;AAAA,QACE,QAAA,EAAU,OAAA;AAAA,QACV,UAAA,EAAY,SAAA;AAAA,QACZ,GAAG;AAAA,OACL;AAAA,MAAA,CAAA;AAAA,KAEF;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKA,UAAA,CACE,aAOA,UAAA,EACM;AACN,IAAA,IAAA,CAAK,KAAA;AAAA,MAAA,OAAA;AAAA,MAEH,OAAA;AAAA,MACA;AAAA,QACE,GAAG,WAAA;AAAA,QACH,GAAG;AAAA,OACL;AAAA,MAAA,CAAA;AAAA,KAEF;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKA,UAAA,CACE,YAAA,EACA,UAAA,EACA,SAAA,EACA,UAAA,EACM;AACN,IAAA,IAAA,CAAK,KAAA;AAAA,MAAA,OAAA;AAAA,MAEH,OAAA;AAAA,MACA;AAAA,QACE,aAAA,EAAe,YAAA;AAAA,QACf,WAAA,EAAa,UAAA;AAAA,QACb,UAAA,EAAY,SAAA;AAAA,QACZ,GAAG;AAAA,OACL;AAAA,MAAA,CAAA;AAAA,KAEF;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKA,gBAAA,CACE,UAAA,EACA,WAAA,EACA,UAAA,EACA,UAAA,EACM;AACN,IAAA,IAAA,CAAK,KAAA;AAAA,MAAA,aAAA;AAAA,MAEH,aAAA;AAAA,MACA;AAAA,QACE,WAAA,EAAa,UAAA;AAAA,QACb,YAAA,EAAc,WAAA;AAAA,QACd,WAAA,EAAa,UAAA;AAAA,QACb,GAAG;AAAA,OACL;AAAA,MAAA,CAAA;AAAA,KAEF;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKA,aACE,MAAA,EACA,SAAA,EACA,SAAA,EACA,QAAA,EACA,SACA,UAAA,EACM;AACN,IAAA,IAAA,CAAK,KAAA;AAAA,MAAA,UAAA;AAAA,MAEH,UAAA;AAAA,MACA;AAAA,QACE,OAAA,EAAS,MAAA;AAAA,QACT,UAAA,EAAY,SAAA;AAAA,QACZ,UAAA,EAAY,SAAA;AAAA,QACZ,QAAA;AAAA,QACA,OAAA;AAAA,QACA,GAAG;AAAA,OACL;AAAA,MAAA,CAAA;AAAA,KAEF;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKA,UAAU,MAAA,EAAsB;AAC9B,IAAA,IAAA,CAAK,OAAO,MAAA,GAAS,MAAA;AACrB,IAAA,IAAA,CAAK,GAAA,CAAI,eAAe,MAAM,CAAA;AAAA,EAChC;AAAA;AAAA;AAAA;AAAA,EAKA,QAAQ,QAAA,EAAwD;AAC9D,IAAA,MAAM,EAAE,MAAA,EAAQ,GAAG,UAAA,EAAW,GAAI,QAAA;AAClC,IAAA,IAAA,CAAK,OAAO,MAAA,GAAS,MAAA;AACrB,IAAA,IAAA,CAAK,OAAO,gBAAA,GAAmB;AAAA,MAC7B,GAAG,KAAK,MAAA,CAAO,gBAAA;AAAA,MACf,GAAG;AAAA,KACL;AACA,IAAA,IAAA,CAAK,GAAA,CAAI,iBAAiB,QAAQ,CAAA;AAAA,EACpC;AAAA;AAAA;AAAA;AAAA,EAKA,oBAAoB,UAAA,EAAuC;AACzD,IAAA,IAAA,CAAK,OAAO,gBAAA,GAAmB;AAAA,MAC7B,GAAG,KAAK,MAAA,CAAO,gBAAA;AAAA,MACf,GAAG;AAAA,KACL;AACA,IAAA,IAAA,CAAK,GAAA,CAAI,yBAAyB,UAAU,CAAA;AAAA,EAC9C;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,KAAA,GAAuB;AAC3B,IAAA,IAAI,IAAA,CAAK,UAAA,CAAW,OAAA,EAAQ,EAAG;AAC7B,MAAA;AAAA,IACF;AAEA,IAAA,MAAM,MAAA,GAAS,IAAA,CAAK,UAAA,CAAW,UAAA,EAAW;AAC1C,IAAA,MAAM,IAAA,CAAK,QAAA,CAAS,MAAA,CAAO,MAAM,CAAA;AAAA,EACnC;AAAA;AAAA;AAAA;AAAA,EAKA,MAAc,iBAAA,GAAmC;AAC/C,IAAA,MAAM,kBAAA,GAAqB,IAAA,CAAK,UAAA,CAAW,qBAAA,EAAsB;AAEjE,IAAA,IAAI,kBAAA,CAAmB,SAAS,CAAA,EAAG;AACjC,MAAA,MAAM,IAAA,CAAK,QAAA,CAAS,MAAA,CAAO,kBAAkB,CAAA;AAAA,IAC/C;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,OAAA,GAAyB;AAE7B,IAAA,IAAI,KAAK,UAAA,EAAY;AACnB,MAAA,aAAA,CAAc,KAAK,UAAU,CAAA;AAC7B,MAAA,IAAA,CAAK,UAAA,GAAa,IAAA;AAAA,IACpB;AAGA,IAAA,MAAM,KAAK,KAAA,EAAM;AAEjB,IAAA,IAAA,CAAK,WAAA,GAAc,KAAA;AACnB,IAAA,IAAA,CAAK,IAAI,qBAAqB,CAAA;AAAA,EAChC;AAAA;AAAA;AAAA;AAAA,EAKQ,WAAA,CACN,SAAA,EACA,SAAA,EACA,UAAA,EACA,QAAA,GAAA,CAAA,eACW;AAEX,IAAA,IAAI,OAAA;AACJ,IAAA,IAAI,SAAA;AACJ,IAAA,IAAI,QAAA;AAEJ,IAAA,IAAI,OAAO,WAAW,WAAA,EAAa;AACjC,MAAA,OAAA,GAAU,OAAO,QAAA,CAAS,IAAA;AAC1B,MAAA,SAAA,GAAY,QAAA,CAAS,KAAA;AACrB,MAAA,QAAA,GAAW,SAAS,QAAA,IAAY,MAAA;AAAA,IAClC;AAEA,IAAA,OAAO;AAAA,MACL,QAAA,EAAU,KAAK,eAAA,EAAgB;AAAA,MAC/B,UAAA,EAAY,SAAA;AAAA,MACZ,UAAA,EAAY,SAAA;AAAA,MACZ,SAAA,EAAW,KAAK,GAAA,EAAI;AAAA,MACpB,QAAA;AAAA,MACA,OAAA,EAAS,KAAK,MAAA,CAAO,MAAA;AAAA,MACrB,YAAY,IAAA,CAAK,SAAA;AAAA,MACjB,WAAW,IAAA,CAAK,QAAA;AAAA,MAChB,QAAA,EAAU,OAAA;AAAA,MACV,UAAA,EAAY,SAAA;AAAA,MACZ,QAAA;AAAA,MACA,UAAA,EAAY;AAAA,QACV,GAAG,KAAK,MAAA,CAAO,gBAAA;AAAA,QACf,GAAG;AAAA,OACL;AAAA,MACA,QAAA,EAAU,KAAK,WAAA,EAAY;AAAA,MAC3B,WAAA,EAAa,KAAK,MAAA,CAAO,UAAA;AAAA,MACzB,WAAA,EAAa;AAAA,KACf;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKA,MAAc,cAAA,GAAgC;AAC5C,IAAA,IAAI;AAEF,MAAA,IAAI,gBAAA,GAAmB,MAAM,IAAA,CAAK,cAAA,CAAe,aAAA,EAAc;AAE/D,MAAA,IAAI,CAAC,gBAAA,EAAkB;AAErB,QAAA,IAAA,CAAK,UAAA,GAAa,MAAM,IAAA,CAAK,aAAA,CAAc,aAAA,EAAc;AACzD,QAAA,IAAA,CAAK,QAAA,GAAW,MAAM,IAAA,CAAK,aAAA,CAAc,gBAAA,EAAiB;AAG1D,QAAA,MAAM,IAAA,CAAK,cAAA,CAAe,cAAA,CAAe,IAAA,CAAK,UAAU,CAAA;AAAA,MAC1D,CAAA,MAAO;AACL,QAAA,IAAA,CAAK,UAAA,GAAa,gBAAA;AAClB,QAAA,IAAA,CAAK,WAAW,gBAAA,CAAiB,SAAA;AAAA,MACnC;AAAA,IACF,SAAS,KAAA,EAAO;AACd,MAAA,OAAA,CAAQ,KAAA,CAAM,+BAA+B,KAAK,CAAA;AAElD,MAAA,IAAA,CAAK,QAAA,GAAW,QAAQ,IAAA,CAAK,GAAA,EAAK,CAAA,CAAA,EAAI,IAAA,CAAK,QAAQ,CAAA,CAAA;AAAA,IACrD;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKA,MAAc,WAAA,GAA6B;AACzC,IAAA,IAAI;AAEF,MAAA,MAAM,eAAA,GAAkB,MAAM,IAAA,CAAK,cAAA,CAAe,YAAA,EAAa;AAE/D,MAAA,IAAI,eAAA,EAAiB;AACnB,QAAA,IAAA,CAAK,SAAA,GAAY,eAAA;AAAA,MACnB,CAAA,MAAO;AAEL,QAAA,IAAA,CAAK,SAAA,GAAY,KAAK,iBAAA,EAAkB;AACxC,QAAA,MAAM,IAAA,CAAK,cAAA,CAAe,aAAA,CAAc,IAAA,CAAK,SAAS,CAAA;AAAA,MACxD;AAAA,IACF,SAAS,KAAA,EAAO;AACd,MAAA,OAAA,CAAQ,KAAA,CAAM,2BAA2B,KAAK,CAAA;AAC9C,MAAA,IAAA,CAAK,SAAA,GAAY,KAAK,iBAAA,EAAkB;AAAA,IAC1C;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKQ,eAAA,GAAwB;AAC9B,IAAA,IAAA,CAAK,UAAA,GAAa,YAAY,MAAM;AAClC,MAAA,IAAI,CAAC,IAAA,CAAK,UAAA,CAAW,OAAA,EAAQ,EAAG;AAC9B,QAAA,IAAA,CAAK,KAAA,EAAM;AAAA,MACb;AAGA,MAAA,IAAA,CAAK,SAAS,kBAAA,EAAmB;AAAA,IACnC,CAAA,EAAG,IAAA,CAAK,MAAA,CAAO,aAAa,CAAA;AAAA,EAC9B;AAAA;AAAA;AAAA;AAAA,EAKQ,gBAAgB,MAAA,EAAgC;AACtD,IAAA,IAAA,CAAK,GAAA,CAAI,gCAAgC,MAAM,CAAA;AAAA,EACjD;AAAA;AAAA;AAAA;AAAA,EAKQ,aAAA,CAAc,OAAc,MAAA,EAAgC;AAClE,IAAA,IAAA,CAAK,GAAA,CAAI,yBAAA,EAA2B,EAAE,KAAA,EAAO,QAAQ,CAAA;AAAA,EACvD;AAAA;AAAA;AAAA;AAAA,EAKQ,eAAA,GAA0B;AAChC,IAAA,OAAO,CAAA,EAAG,IAAA,CAAK,GAAA,EAAK,IAAI,IAAA,CAAK,MAAA,EAAO,CAAE,QAAA,CAAS,EAAE,CAAA,CAAE,SAAA,CAAU,CAAA,EAAG,EAAE,CAAC,CAAA,CAAA;AAAA,EACrE;AAAA;AAAA;AAAA;AAAA,EAKQ,iBAAA,GAA4B;AAClC,IAAA,OAAO,CAAA,QAAA,EAAW,IAAA,CAAK,GAAA,EAAK,IAAI,IAAA,CAAK,MAAA,EAAO,CAAE,QAAA,CAAS,EAAE,CAAA,CAAE,SAAA,CAAU,CAAA,EAAG,EAAE,CAAC,CAAA,CAAA;AAAA,EAC7E;AAAA;AAAA;AAAA;AAAA,EAKQ,WAAA,GAAsB;AAC5B,IAAA,OAAO,IAAA,CAAK,OAAO,QAAA,IAAY,SAAA;AAAA,EACjC;AAAA;AAAA;AAAA;AAAA,EAKQ,GAAA,CAAI,SAAiB,IAAA,EAAkB;AAE7C,IAAA,MAAM,YAAA,GACJ,OAAO,MAAA,KAAW,WAAA,GAAc,aAAa,OAAA,CAAQ,iBAAiB,MAAM,MAAA,GAAS,KAAA;AAEvF,IAAA,IAAI,IAAA,CAAK,MAAA,CAAO,KAAA,IAAS,YAAA,EAAc;AACrC,MAAA,OAAA,CAAQ,GAAA,CAAI,CAAA,YAAA,EAAe,OAAO,CAAA,CAAA,EAAI,QAAQ,EAAE,CAAA;AAAA,IAClD;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKA,cAAA,GAIE;AACA,IAAA,OAAO;AAAA,MACL,IAAA,EAAM,IAAA,CAAK,UAAA,CAAW,IAAA,EAAK;AAAA,MAC3B,MAAA,EAAQ,IAAA,CAAK,UAAA,CAAW,MAAA,EAAO;AAAA,MAC/B,OAAA,EAAS,IAAA,CAAK,UAAA,CAAW,OAAA;AAAQ,KACnC;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKA,aAAA,GAAyB;AACvB,IAAA,OAAO,IAAA,CAAK,WAAA;AAAA,EACd;AACF;;;ACpiBO,SAAS,eAAA,CACd,KAAA,EACA,OAAA,GAKI,EAAC,EACqB;AAC1B,EAAA,OAAO;AAAA,IACL,KAAA;AAAA,IACA,UAAA,EAAY,QAAQ,UAAA,IAAc,OAAA;AAAA,IAClC,QAAA,EAAU,QAAQ,QAAA,IAAY,uBAAA;AAAA,IAC9B,QAAA,EAAU,KAAA;AAAA,IACV,kBAAA,EAAoB,QAAQ,kBAAA,IAAsB,IAAA;AAAA,IAClD,KAAA,EACE,QAAQ,KAAA,KACP,OAAO,YAAY,WAAA,IAAe,OAAA,CAAQ,KAAK,QAAA,KAAa,aAAA;AAAA;AAAA,GAEjE;AACF;AAKO,SAAS,kBAAA,CACd,KAAA,EACA,OAAA,GAII,EAAC,EACqB;AAC1B,EAAA,OAAO;AAAA,IACL,KAAA;AAAA,IACA,UAAA,EAAY,QAAQ,UAAA,IAAc,OAAA;AAAA,IAClC,QAAA,EAAU,QAAQ,QAAA,IAAY,uBAAA;AAAA,IAC9B,QAAA,EAAU,QAAA;AAAA,IACV,kBAAA,EAAoB,KAAA;AAAA,IACpB,KAAA,EAAO,QAAQ,KAAA,IAAS;AAAA;AAAA,GAE1B;AACF;AAKO,SAAS,mBAAA,CACd,KAAA,EACA,OAAA,GAII,EAAC,EACqB;AAC1B,EAAA,OAAO;AAAA,IACL,KAAA;AAAA,IACA,UAAA,EAAY,QAAQ,UAAA,IAAc,OAAA;AAAA,IAClC,QAAA,EAAU,QAAQ,QAAA,IAAY,uBAAA;AAAA,IAC9B,QAAA,EAAU,SAAA;AAAA,IACV,kBAAA,EAAoB,IAAA;AAAA,IACpB,KAAA,EAAO,QAAQ,KAAA,IAAS;AAAA;AAAA,GAE1B;AACF;AAKO,SAAS,mBAAA,CACd,KAAA,EACA,OAAA,GAII,EAAC,EACqB;AAC1B,EAAA,OAAO;AAAA,IACL,KAAA;AAAA,IACA,UAAA,EAAY,QAAQ,UAAA,IAAc,OAAA;AAAA,IAClC,QAAA,EAAU,QAAQ,QAAA,IAAY,uBAAA;AAAA,IAC9B,QAAA,EAAU,SAAA;AAAA,IACV,kBAAA,EAAoB,KAAA;AAAA,IACpB,KAAA,EAAO,QAAQ,KAAA,IAAS;AAAA;AAAA,GAE1B;AACF;;;ACxFA,IAAM,SAAA,uBAAgB,GAAA,EAAuB;AAQtC,SAAS,eAAA,CAAgB,aAAqB,MAAA,EAAoC;AACvF,EAAA,IAAI,CAAC,SAAA,CAAU,GAAA,CAAI,WAAW,CAAA,EAAG;AAC/B,IAAA,SAAA,CAAU,GAAA,CAAI,WAAA,EAAa,IAAI,SAAA,CAAU,MAAM,CAAC,CAAA;AAAA,EAClD;AACA,EAAA,OAAO,SAAA,CAAU,IAAI,WAAW,CAAA;AAClC;AAOO,SAAS,qBAAqB,WAAA,EAAuC;AAC1E,EAAA,OAAO,SAAA,CAAU,GAAA,CAAI,WAAW,CAAA,IAAK,IAAA;AACvC;AAMO,SAAS,eAAe,WAAA,EAA2B;AACxD,EAAA,SAAA,CAAU,OAAO,WAAW,CAAA;AAC9B;AAKO,SAAS,iBAAA,GAA0B;AACxC,EAAA,SAAA,CAAU,KAAA,EAAM;AAClB;AAMO,SAAS,uBAAuB,WAAA,EAA8B;AACnE,EAAA,OAAO,SAAA,CAAU,IAAI,WAAW,CAAA;AAClC;AAKO,SAAS,kBAAA,GAA+B;AAC7C,EAAA,OAAO,KAAA,CAAM,IAAA,CAAK,SAAA,CAAU,IAAA,EAAM,CAAA;AACpC;;;ACrDO,SAAS,QAAA,CACd,MACA,IAAA,EACkC;AAClC,EAAA,IAAI,OAAA,GAAe,IAAA;AACnB,EAAA,IAAI,QAAA,GAAW,CAAA;AAEf,EAAA,OAAO,YAAwB,IAAA,EAAqB;AAClD,IAAA,MAAM,GAAA,GAAM,KAAK,GAAA,EAAI;AACrB,IAAA,MAAM,SAAA,GAAY,QAAQ,GAAA,GAAM,QAAA,CAAA;AAEhC,IAAA,IAAI,SAAA,IAAa,CAAA,IAAK,SAAA,GAAY,IAAA,EAAM;AACtC,MAAA,IAAI,OAAA,EAAS;AACX,QAAA,YAAA,CAAa,OAAO,CAAA;AACpB,QAAA,OAAA,GAAU,IAAA;AAAA,MACZ;AACA,MAAA,QAAA,GAAW,GAAA;AACX,MAAA,IAAA,CAAK,KAAA,CAAM,MAAM,IAAI,CAAA;AAAA,IACvB,CAAA,MAAA,IAAW,CAAC,OAAA,EAAS;AACnB,MAAA,OAAA,GAAU,WAAW,MAAM;AACzB,QAAA,QAAA,GAAW,KAAK,GAAA,EAAI;AACpB,QAAA,OAAA,GAAU,IAAA;AACV,QAAA,IAAA,CAAK,KAAA,CAAM,MAAM,IAAI,CAAA;AAAA,MACvB,GAAG,SAAS,CAAA;AAAA,IACd;AAAA,EACF,CAAA;AACF;AAKO,SAAS,QAAA,CACd,MACA,IAAA,EACkC;AAClC,EAAA,IAAI,OAAA,GAAe,IAAA;AAEnB,EAAA,OAAO,YAAwB,IAAA,EAAqB;AAClD,IAAA,IAAI,OAAA,EAAS;AACX,MAAA,YAAA,CAAa,OAAO,CAAA;AAAA,IACtB;AAEA,IAAA,OAAA,GAAU,WAAW,MAAM;AACzB,MAAA,IAAA,CAAK,KAAA,CAAM,MAAM,IAAI,CAAA;AAAA,IACvB,GAAG,IAAI,CAAA;AAAA,EACT,CAAA;AACF;AAKO,SAAS,YAAY,KAAA,EAA+B;AACzD,EAAA,OAAO,IAAA,CAAK,SAAA,CAAU,KAAA,EAAO,IAAA,EAAM,CAAC,CAAA;AACtC;AAKO,SAAS,cAAc,KAAA,EAAgC;AAC5D,EAAA,IAAI,CAAC,MAAM,QAAA,IAAY,CAAC,MAAM,UAAA,IAAc,CAAC,MAAM,UAAA,EAAY;AAC7D,IAAA,OAAO,KAAA;AAAA,EACT;AACA,EAAA,IAAI,CAAC,KAAA,CAAM,SAAA,IAAa,KAAA,CAAM,aAAa,CAAA,EAAG;AAC5C,IAAA,OAAO,KAAA;AAAA,EACT;AACA,EAAA,IAAI,CAAC,KAAA,CAAM,UAAA,IAAc,CAAC,MAAM,SAAA,EAAW;AACzC,IAAA,OAAO,KAAA;AAAA,EACT;AACA,EAAA,OAAO,IAAA;AACT;AAKO,SAAS,eAAe,MAAA,EAG7B;AACA,EAAA,MAAM,QAA0B,EAAC;AACjC,EAAA,MAAM,UAA4B,EAAC;AAEnC,EAAA,MAAA,CAAO,OAAA,CAAQ,CAAC,KAAA,KAAU;AACxB,IAAA,IAAI,aAAA,CAAc,KAAK,CAAA,EAAG;AACxB,MAAA,KAAA,CAAM,KAAK,KAAK,CAAA;AAAA,IAClB,CAAA,MAAO;AACL,MAAA,OAAA,CAAQ,KAAK,KAAK,CAAA;AAAA,IACpB;AAAA,EACF,CAAC,CAAA;AAED,EAAA,OAAO,EAAE,OAAO,OAAA,EAAQ;AAC1B;AAKO,SAAS,aAAa,KAAA,EAA+B;AAC1D,EAAA,OAAO,IAAI,KAAK,CAAC,IAAA,CAAK,UAAU,KAAK,CAAC,CAAC,CAAA,CAAE,IAAA;AAC3C;AAKO,SAAS,aAAa,MAAA,EAAkC;AAC7D,EAAA,OAAO,MAAA,CAAO,OAAO,CAAC,KAAA,EAAO,UAAU,KAAA,GAAQ,YAAA,CAAa,KAAK,CAAA,EAAG,CAAC,CAAA;AACvE;AAKO,SAAS,aAAA,CACd,OACA,aAAA,GAA0B,CAAC,YAAY,OAAA,EAAS,QAAA,EAAU,KAAK,CAAA,EAC/C;AAChB,EAAA,MAAM,SAAA,GAAY,EAAE,GAAG,KAAA,EAAM;AAE7B,EAAA,IAAI,UAAU,UAAA,EAAY;AACxB,IAAA,MAAM,eAAA,GAAkB,EAAE,GAAG,SAAA,CAAU,UAAA,EAAW;AAElD,IAAA,aAAA,CAAc,OAAA,CAAQ,CAAC,GAAA,KAAQ;AAC7B,MAAA,IAAI,OAAO,eAAA,EAAiB;AAC1B,QAAA,eAAA,CAAgB,GAAG,CAAA,GAAI,KAAA;AAAA,MACzB;AAAA,IACF,CAAC,CAAA;AAED,IAAA,SAAA,CAAU,UAAA,GAAa,eAAA;AAAA,EACzB;AAEA,EAAA,OAAO,SAAA;AACT;AAKO,SAAS,oBAAA,CACd,mBACG,oBAAA,EACkB;AACrB,EAAA,OAAO,OAAO,MAAA,CAAO,EAAC,EAAG,cAAA,EAAgB,GAAG,oBAAoB,CAAA;AAClE;AAKO,SAAS,gBAAA,CAAiB,SAAiB,EAAA,EAAY;AAC5D,EAAA,MAAM,SAAA,GAAY,KAAK,GAAA,EAAI;AAC3B,EAAA,MAAM,MAAA,GAAS,KAAK,MAAA,EAAO,CAAE,SAAS,EAAE,CAAA,CAAE,SAAA,CAAU,CAAA,EAAG,EAAE,CAAA;AACzD,EAAA,OAAO,MAAA,GAAS,CAAA,EAAG,MAAM,CAAA,CAAA,EAAI,SAAS,CAAA,CAAA,EAAI,MAAM,CAAA,CAAA,GAAK,CAAA,EAAG,SAAS,CAAA,CAAA,EAAI,MAAM,CAAA,CAAA;AAC7E;AAKO,SAAS,QAAA,GAAoB;AAClC,EAAA,IAAI,OAAO,SAAA,KAAc,WAAA,EAAa,OAAO,KAAA;AAE7C,EAAA,OAAO,gEAAA,CAAiE,IAAA,CAAK,SAAA,CAAU,SAAS,CAAA;AAClG;AAKO,SAAS,aAAA,GAAyB;AACvC,EAAA,OAAO,OAAA,CAAQ,IAAI,QAAA,KAAa,aAAA;AAClC;AAKO,SAAS,eAAA,CACd,SAAA,EACA,MAAA,GAAuC,UAAA,EAC/B;AACR,EAAA,MAAM,IAAA,GAAO,IAAI,IAAA,CAAK,SAAS,CAAA;AAE/B,EAAA,QAAQ,MAAA;AAAQ,IACd,KAAK,MAAA;AACH,MAAA,OAAO,KAAK,kBAAA,EAAmB;AAAA,IACjC,KAAK,MAAA;AACH,MAAA,OAAO,KAAK,kBAAA,EAAmB;AAAA,IACjC,KAAK,UAAA;AAAA,IACL;AACE,MAAA,OAAO,KAAK,cAAA,EAAe;AAAA;AAEjC;AAKO,SAAS,UAAa,GAAA,EAAW;AACtC,EAAA,OAAO,IAAA,CAAK,KAAA,CAAM,IAAA,CAAK,SAAA,CAAU,GAAG,CAAC,CAAA;AACvC;AAKO,SAAS,aAAA,CAAc,GAAA,EAAU,QAAA,GAAmB,IAAA,EAAc;AACvE,EAAA,IAAI;AACF,IAAA,OAAO,IAAA,CAAK,UAAU,GAAG,CAAA;AAAA,EAC3B,SAAS,KAAA,EAAO;AACd,IAAA,OAAA,CAAQ,KAAA,CAAM,+BAA+B,KAAK,CAAA;AAClD,IAAA,OAAO,QAAA;AAAA,EACT;AACF;AAKO,SAAS,SAAA,CAAa,MAAc,QAAA,EAAgB;AACzD,EAAA,IAAI;AACF,IAAA,OAAO,IAAA,CAAK,MAAM,IAAI,CAAA;AAAA,EACxB,SAAS,KAAA,EAAO;AACd,IAAA,OAAA,CAAQ,KAAA,CAAM,yBAAyB,KAAK,CAAA;AAC5C,IAAA,OAAO,QAAA;AAAA,EACT;AACF;AAKO,SAAS,gBAAgB,SAAA,EAA2B;AACzD,EAAA,OAAO,IAAA,CAAK,KAAI,GAAI,SAAA;AACtB;AAKO,SAAS,iBAAA,GAA4B;AAC1C,EAAA,IAAI,OAAO,WAAW,WAAA,EAAa;AACjC,IAAA,OAAO,OAAO,QAAA,CAAS,IAAA;AAAA,EACzB;AACA,EAAA,OAAO,EAAA;AACT;AAKO,SAAS,mBAAA,GAA8B;AAC5C,EAAA,IAAI,OAAO,aAAa,WAAA,EAAa;AACnC,IAAA,OAAO,QAAA,CAAS,KAAA;AAAA,EAClB;AACA,EAAA,OAAO,EAAA;AACT;AAKO,SAAS,WAAA,GAAsB;AACpC,EAAA,IAAI,OAAO,aAAa,WAAA,EAAa;AACnC,IAAA,OAAO,QAAA,CAAS,QAAA;AAAA,EAClB;AACA,EAAA,OAAO,EAAA;AACT;;;ACxPO,SAAS,KAAA,CAAM,WAAoB,QAAA,GAAA,CAAA,eAAgD;AACxF,EAAA,OAAO,SAAU,OAAA,EAAc,WAAA,EAAqB,UAAA,EAAgC;AAClF,IAAA,MAAM,iBAAiB,UAAA,CAAW,KAAA;AAElC,IAAA,UAAA,CAAW,KAAA,GAAQ,kBAA8B,IAAA,EAAa;AAC5D,MAAA,MAAM,SAAA,GAAYC,sBAAqB,IAAI,CAAA;AAC3C,MAAA,MAAM,iBAAiB,SAAA,IAAa,WAAA;AAGpC,MAAA,MAAM,SAAA,GAAY,KAAK,GAAA,EAAI;AAE3B,MAAA,IAAI;AACF,QAAA,MAAM,MAAA,GAAS,MAAM,cAAA,CAAe,KAAA,CAAM,MAAM,IAAI,CAAA;AAGpD,QAAA,SAAA,EAAW,KAAA;AAAA,UAAA,QAAA;AAAA,UAET,cAAA;AAAA,UACA;AAAA,YACE,OAAA,EAAS,IAAA;AAAA,YACT,QAAA,EAAU,IAAA,CAAK,GAAA,EAAI,GAAI,SAAA;AAAA,YACvB,IAAA,EAAM,IAAA,CAAK,SAAA,CAAU,IAAI;AAAA,WAC3B;AAAA,UACA;AAAA,SACF;AAEA,QAAA,OAAO,MAAA;AAAA,MACT,SAAS,KAAA,EAAO;AAEd,QAAA,SAAA,EAAW,KAAA;AAAA,UAAA,OAAA;AAAA,UAET,GAAG,cAAc,CAAA,MAAA,CAAA;AAAA,UACjB;AAAA,YACE,OAAA,EAAS,KAAA;AAAA,YACT,QAAA,EAAU,IAAA,CAAK,GAAA,EAAI,GAAI,SAAA;AAAA,YACvB,OAAO,KAAA,YAAiB,KAAA,GAAQ,KAAA,CAAM,OAAA,GAAU,OAAO,KAAK;AAAA,WAC9D;AAAA,UAAA,CAAA;AAAA,SAEF;AAEA,QAAA,MAAM,KAAA;AAAA,MACR;AAAA,IACF,CAAA;AAEA,IAAA,OAAO,UAAA;AAAA,EACT,CAAA;AACF;AAKO,SAAS,WAAW,SAAA,EAAoB;AAC7C,EAAA,OAAO,SAAU,OAAA,EAAc,WAAA,EAAqB,UAAA,EAAgC;AAClF,IAAA,MAAM,iBAAiB,UAAA,CAAW,KAAA;AAElC,IAAA,UAAA,CAAW,KAAA,GAAQ,YAAwB,IAAA,EAAa;AACtD,MAAA,MAAM,SAAA,GAAYA,sBAAqB,IAAI,CAAA;AAC3C,MAAA,MAAM,iBAAiB,SAAA,IAAa,WAAA;AAEpC,MAAA,SAAA,EAAW,KAAA;AAAA,QAAA,OAAA;AAAA,QAET,cAAA;AAAA,QACA;AAAA,UACE,IAAA,EAAM,IAAA,CAAK,SAAA,CAAU,IAAI;AAAA,SAC3B;AAAA,QAAA,CAAA;AAAA,OAEF;AAEA,MAAA,OAAO,cAAA,CAAe,KAAA,CAAM,IAAA,EAAM,IAAI,CAAA;AAAA,IACxC,CAAA;AAEA,IAAA,OAAO,UAAA;AAAA,EACT,CAAA;AACF;AAKO,SAAS,iBAAiB,UAAA,EAAqB;AACpD,EAAA,OAAO,SAAU,OAAA,EAAc,WAAA,EAAqB,UAAA,EAAgC;AAClF,IAAA,MAAM,iBAAiB,UAAA,CAAW,KAAA;AAElC,IAAA,UAAA,CAAW,KAAA,GAAQ,kBAA8B,IAAA,EAAa;AAC5D,MAAA,MAAM,SAAA,GAAYA,sBAAqB,IAAI,CAAA;AAC3C,MAAA,MAAM,kBAAkB,UAAA,IAAc,WAAA;AACtC,MAAA,MAAM,SAAA,GAAY,YAAY,GAAA,EAAI;AAElC,MAAA,IAAI;AACF,QAAA,MAAM,MAAA,GAAS,MAAM,cAAA,CAAe,KAAA,CAAM,MAAM,IAAI,CAAA;AACpD,QAAA,MAAM,QAAA,GAAW,WAAA,CAAY,GAAA,EAAI,GAAI,SAAA;AAErC,QAAA,SAAA,EAAW,gBAAA,CAAiB,eAAA,EAAiB,QAAA,EAAU,IAAA,EAAM;AAAA,UAC3D,OAAA,EAAS;AAAA,SACV,CAAA;AAED,QAAA,OAAO,MAAA;AAAA,MACT,SAAS,KAAA,EAAO;AACd,QAAA,MAAM,QAAA,GAAW,WAAA,CAAY,GAAA,EAAI,GAAI,SAAA;AAErC,QAAA,SAAA,EAAW,gBAAA,CAAiB,eAAA,EAAiB,QAAA,EAAU,IAAA,EAAM;AAAA,UAC3D,OAAA,EAAS,KAAA;AAAA,UACT,OAAO,KAAA,YAAiB,KAAA,GAAQ,KAAA,CAAM,OAAA,GAAU,OAAO,KAAK;AAAA,SAC7D,CAAA;AAED,QAAA,MAAM,KAAA;AAAA,MACR;AAAA,IACF,CAAA;AAEA,IAAA,OAAO,UAAA;AAAA,EACT,CAAA;AACF;AAKO,SAAS,WAAW,UAAA,EAAqB;AAC9C,EAAA,OAAO,SAAU,OAAA,EAAc,WAAA,EAAqB,UAAA,EAAgC;AAClF,IAAA,MAAM,iBAAiB,UAAA,CAAW,KAAA;AAElC,IAAA,UAAA,CAAW,KAAA,GAAQ,kBAA8B,IAAA,EAAa;AAC5D,MAAA,IAAI;AACF,QAAA,OAAO,MAAM,cAAA,CAAe,KAAA,CAAM,IAAA,EAAM,IAAI,CAAA;AAAA,MAC9C,SAAS,KAAA,EAAO;AACd,QAAA,MAAM,SAAA,GAAYA,sBAAqB,IAAI,CAAA;AAE3C,QAAA,SAAA,EAAW,UAAA;AAAA,UACT,KAAA,YAAiB,KAAA,GAAQ,KAAA,CAAM,OAAA,GAAU,OAAO,KAAK,CAAA;AAAA,UACrD,KAAA,YAAiB,KAAA,GAAQ,KAAA,CAAM,KAAA,GAAQ,MAAA;AAAA,UACvC,KAAA,YAAiB,KAAA,GAAQ,KAAA,CAAM,IAAA,GAAO,OAAA;AAAA,UACtC;AAAA,YACE,MAAA,EAAQ,WAAA;AAAA,YACR,IAAA,EAAM,IAAA,CAAK,SAAA,CAAU,IAAI;AAAA;AAC3B,SACF;AAEA,QAAA,MAAM,KAAA;AAAA,MACR;AAAA,IACF,CAAA;AAEA,IAAA,OAAO,UAAA;AAAA,EACT,CAAA;AACF;AAKA,SAASA,sBAAqB,QAAA,EAAiC;AAE7D,EAAA,IAAI,SAAS,SAAA,EAAW;AACtB,IAAA,OAAO,QAAA,CAAS,SAAA;AAAA,EAClB;AACA,EAAA,IAAI,SAAS,UAAA,EAAY;AACvB,IAAA,OAAO,QAAA,CAAS,UAAA;AAAA,EAClB;AACA,EAAA,IAAK,WAAmB,aAAA,EAAe;AACrC,IAAA,OAAQ,UAAA,CAAmB,aAAA;AAAA,EAC7B;AACA,EAAA,OAAO,IAAA;AACT;AAKO,SAAS,mBAAmB,SAAA,EAA4B;AAC7D,EAAC,WAAmB,aAAA,GAAgB,SAAA;AACtC;AAKO,SAAS,kBAAA,GAAuC;AACrD,EAAA,OAAQ,WAAmB,aAAA,IAAiB,IAAA;AAC9C;AC3KO,SAAS,aAAa,SAAA,EAA6B;AACxD,EAAA,OAAO,SAAA;AACT;AAKO,SAAS,WAAA,CAAY,SAAA,EAA6B,OAAA,EAAkB,SAAA,EAAoB;AAC7F,EAAA,SAAA,CAAU,MAAM;AACd,IAAA,IAAI,CAAC,SAAA,EAAW;AAEhB,IAAA,MAAM,MAAM,OAAA,KAAY,OAAO,WAAW,WAAA,GAAc,MAAA,CAAO,SAAS,IAAA,GAAO,EAAA,CAAA;AAC/E,IAAA,MAAM,QAAQ,SAAA,KAAc,OAAO,QAAA,KAAa,WAAA,GAAc,SAAS,KAAA,GAAQ,EAAA,CAAA;AAE/E,IAAA,SAAA,CAAU,aAAA,CAAc,KAAK,KAAK,CAAA;AAAA,EACpC,CAAA,EAAG,CAAC,SAAA,EAAW,OAAA,EAAS,SAAS,CAAC,CAAA;AACpC;AAKO,SAAS,cAAc,SAAA,EAA6B;AACzD,EAAA,OAAO,WAAA;AAAA,IACL,CACE,SAAA,EACA,SAAA,EACA,UAAA,EACA,QAAA,KACG;AACH,MAAA,IAAI,SAAA,EAAW;AACb,QAAA,SAAA,CAAU,KAAA,CAAM,SAAA,EAAW,SAAA,EAAW,UAAA,EAAY,QAAQ,CAAA;AAAA,MAC5D;AAAA,IACF,CAAA;AAAA,IACA,CAAC,SAAS;AAAA,GACZ;AACF;AAKO,SAAS,cAAc,SAAA,EAA6B;AACzD,EAAA,OAAO,WAAA;AAAA,IACL,CAAC,WAAA,KAKK;AACJ,MAAA,IAAI,SAAA,EAAW;AACb,QAAA,SAAA,CAAU,WAAW,WAAW,CAAA;AAAA,MAClC;AAAA,IACF,CAAA;AAAA,IACA,CAAC,SAAS;AAAA,GACZ;AACF;AAKO,SAAS,gBAAgB,SAAA,EAA6B;AAC3D,EAAA,MAAM,YAAA,GAAe,MAAA,CAAe,IAAA,CAAK,GAAA,EAAK,CAAA;AAE9C,EAAA,SAAA,CAAU,MAAM;AACd,IAAA,YAAA,CAAa,OAAA,GAAU,KAAK,GAAA,EAAI;AAEhC,IAAA,OAAO,MAAM;AACX,MAAA,IAAI,SAAA,EAAW;AACb,QAAA,MAAM,QAAA,GAAW,IAAA,CAAK,GAAA,EAAI,GAAI,YAAA,CAAa,OAAA;AAC3C,QAAA,SAAA,CAAU,KAAA;AAAA,UAAA,YAAA;AAAA,UAER,YAAA;AAAA,UACA;AAAA,YACE,QAAA;AAAA,YACA,UAAU,OAAO,MAAA,KAAW,WAAA,GAAc,MAAA,CAAO,SAAS,IAAA,GAAO;AAAA,WACnE;AAAA,UAAA,CAAA;AAAA,SAEF;AAAA,MACF;AAAA,IACF,CAAA;AAAA,EACF,CAAA,EAAG,CAAC,SAAS,CAAC,CAAA;AAChB;AAKO,SAAS,uBAAuB,SAAA,EAA6B;AAClE,EAAA,SAAA,CAAU,MAAM;AACd,IAAA,IAAI,CAAC,SAAA,IAAa,OAAO,MAAA,KAAW,WAAA,EAAa;AAGjD,IAAA,IAAI,aAAA,IAAiB,MAAA,IAAU,QAAA,IAAY,MAAA,CAAO,WAAA,EAAa;AAC7D,MAAA,MAAM,MAAA,GAAS,OAAO,WAAA,CAAY,MAAA;AAClC,MAAA,MAAM,QAAA,GAAW,MAAA,CAAO,YAAA,GAAe,MAAA,CAAO,eAAA;AAC9C,MAAA,MAAM,YAAA,GAAe,MAAA,CAAO,wBAAA,GAA2B,MAAA,CAAO,eAAA;AAC9D,MAAA,MAAM,cAAA,GAAiB,MAAA,CAAO,aAAA,GAAgB,MAAA,CAAO,eAAA;AAErD,MAAA,SAAA,CAAU,gBAAA,CAAiB,gBAAA,EAAkB,QAAA,EAAU,IAAI,CAAA;AAC3D,MAAA,SAAA,CAAU,gBAAA,CAAiB,gBAAA,EAAkB,YAAA,EAAc,IAAI,CAAA;AAC/D,MAAA,SAAA,CAAU,gBAAA,CAAiB,kBAAA,EAAoB,cAAA,EAAgB,IAAI,CAAA;AAAA,IACrE;AAGA,IAAA,IAAI,yBAAyB,MAAA,EAAQ;AACnC,MAAA,MAAM,QAAA,GAAW,IAAI,mBAAA,CAAoB,CAAC,IAAA,KAAS;AACjD,QAAA,IAAA,CAAK,UAAA,EAAW,CAAE,OAAA,CAAQ,CAAC,KAAA,KAAU;AACnC,UAAA,IAAI,KAAA,CAAM,cAAc,UAAA,EAAY;AAClC,YAAA,SAAA,CAAU,gBAAA,CAAiB,oBAAA,EAAsB,KAAA,CAAM,QAAA,EAAU,IAAA,EAAM;AAAA,cACrE,eAAe,KAAA,CAAM;AAAA,aACtB,CAAA;AAAA,UACH;AAAA,QACF,CAAC,CAAA;AAAA,MACH,CAAC,CAAA;AAED,MAAA,QAAA,CAAS,QAAQ,EAAE,UAAA,EAAY,CAAC,UAAU,GAAG,CAAA;AAE7C,MAAA,OAAO,MAAM,SAAS,UAAA,EAAW;AAAA,IACnC;AAEA,IAAA,OAAO,MAAA;AAAA,EACT,CAAA,EAAG,CAAC,SAAS,CAAC,CAAA;AAChB;AAKO,SAAS,iBAAiB,SAAA,EAA6B;AAC5D,EAAA,SAAA,CAAU,MAAM;AACd,IAAA,IAAI,CAAC,SAAA,IAAa,OAAO,MAAA,KAAW,WAAA,EAAa;AAEjD,IAAA,MAAM,WAAA,GAAc,CAAC,KAAA,KAAsB;AACzC,MAAA,SAAA,CAAU,UAAA,CAAW,MAAM,OAAA,EAAS,KAAA,CAAM,OAAO,KAAA,EAAO,KAAA,CAAM,OAAO,IAAA,EAAM;AAAA,QACzE,UAAU,KAAA,CAAM,QAAA;AAAA,QAChB,QAAQ,KAAA,CAAM,MAAA;AAAA,QACd,OAAO,KAAA,CAAM;AAAA,OACd,CAAA;AAAA,IACH,CAAA;AAEA,IAAA,MAAM,wBAAA,GAA2B,CAAC,KAAA,KAAiC;AACjE,MAAA,SAAA,CAAU,UAAA,CAAW,6BAAA,EAA+B,MAAA,EAAW,kBAAA,EAAoB;AAAA,QACjF,MAAA,EAAQ,MAAA,CAAO,KAAA,CAAM,MAAM;AAAA,OAC5B,CAAA;AAAA,IACH,CAAA;AAEA,IAAA,MAAA,CAAO,gBAAA,CAAiB,SAAS,WAAW,CAAA;AAC5C,IAAA,MAAA,CAAO,gBAAA,CAAiB,sBAAsB,wBAAwB,CAAA;AAEtE,IAAA,OAAO,MAAM;AACX,MAAA,MAAA,CAAO,mBAAA,CAAoB,SAAS,WAAW,CAAA;AAC/C,MAAA,MAAA,CAAO,mBAAA,CAAoB,sBAAsB,wBAAwB,CAAA;AAAA,IAC3E,CAAA;AAAA,EACF,CAAA,EAAG,CAAC,SAAS,CAAC,CAAA;AAChB;AAKO,SAAS,eAAA,CACd,SAAA,EACA,OAAA,GAKI,EAAC,EACL;AACA,EAAA,MAAM;AAAA,IACJ,aAAA,GAAgB,IAAA;AAAA,IAChB,iBAAA,GAAoB,IAAA;AAAA,IACpB,gBAAA,GAAmB,IAAA;AAAA,IACnB,WAAA,GAAc;AAAA,GAChB,GAAI,OAAA;AAGJ,EAAA,SAAA,CAAU,MAAM;AACd,IAAA,IAAI,iBAAiB,SAAA,EAAW;AAC9B,MAAA,MAAM,MAAM,OAAO,MAAA,KAAW,WAAA,GAAc,MAAA,CAAO,SAAS,IAAA,GAAO,EAAA;AACnE,MAAA,MAAM,KAAA,GAAQ,OAAO,QAAA,KAAa,WAAA,GAAc,SAAS,KAAA,GAAQ,EAAA;AACjE,MAAA,SAAA,CAAU,aAAA,CAAc,KAAK,KAAK,CAAA;AAAA,IACpC;AAAA,EACF,CAAA,EAAG,CAAC,SAAA,EAAW,aAAa,CAAC,CAAA;AAG7B,EAAA,MAAM,YAAA,GAAe,MAAA,CAAe,IAAA,CAAK,GAAA,EAAK,CAAA;AAC9C,EAAA,SAAA,CAAU,MAAM;AACd,IAAA,IAAI,CAAC,iBAAA,IAAqB,CAAC,SAAA,EAAW;AAEtC,IAAA,YAAA,CAAa,OAAA,GAAU,KAAK,GAAA,EAAI;AAEhC,IAAA,OAAO,MAAM;AACX,MAAA,MAAM,QAAA,GAAW,IAAA,CAAK,GAAA,EAAI,GAAI,YAAA,CAAa,OAAA;AAC3C,MAAA,SAAA,CAAU,KAAA;AAAA,QAAA,YAAA;AAAA,QAER,YAAA;AAAA,QACA;AAAA,UACE,QAAA;AAAA,UACA,UAAU,OAAO,MAAA,KAAW,WAAA,GAAc,MAAA,CAAO,SAAS,IAAA,GAAO;AAAA,SACnE;AAAA,QAAA,CAAA;AAAA,OAEF;AAAA,IACF,CAAA;AAAA,EACF,CAAA,EAAG,CAAC,SAAA,EAAW,iBAAiB,CAAC,CAAA;AAGjC,EAAA,SAAA,CAAU,MAAM;AACd,IAAA,IAAI,CAAC,gBAAA,IAAoB,CAAC,SAAA,IAAa,OAAO,WAAW,WAAA,EAAa;AAEtE,IAAA,MAAM,aAAa,MAAM;AACvB,MAAA,IAAI,aAAA,IAAiB,MAAA,IAAU,QAAA,IAAY,MAAA,CAAO,WAAA,EAAa;AAC7D,QAAA,MAAM,MAAA,GAAS,OAAO,WAAA,CAAY,MAAA;AAClC,QAAA,MAAM,QAAA,GAAW,MAAA,CAAO,YAAA,GAAe,MAAA,CAAO,eAAA;AAC9C,QAAA,SAAA,CAAU,gBAAA,CAAiB,gBAAA,EAAkB,QAAA,EAAU,IAAI,CAAA;AAAA,MAC7D;AAAA,IACF,CAAA;AAEA,IAAA,MAAA,CAAO,gBAAA,CAAiB,QAAQ,UAAU,CAAA;AAC1C,IAAA,OAAO,MAAM,MAAA,CAAO,mBAAA,CAAoB,MAAA,EAAQ,UAAU,CAAA;AAAA,EAC5D,CAAA,EAAG,CAAC,SAAA,EAAW,gBAAgB,CAAC,CAAA;AAGhC,EAAA,SAAA,CAAU,MAAM;AACd,IAAA,IAAI,CAAC,WAAA,IAAe,CAAC,SAAA,IAAa,OAAO,WAAW,WAAA,EAAa;AAEjE,IAAA,MAAM,WAAA,GAAc,CAAC,KAAA,KAAsB;AACzC,MAAA,SAAA,CAAU,UAAA,CAAW,MAAM,OAAA,EAAS,KAAA,CAAM,OAAO,KAAA,EAAO,KAAA,CAAM,OAAO,IAAI,CAAA;AAAA,IAC3E,CAAA;AAEA,IAAA,MAAA,CAAO,gBAAA,CAAiB,SAAS,WAAW,CAAA;AAC5C,IAAA,OAAO,MAAM,MAAA,CAAO,mBAAA,CAAoB,OAAA,EAAS,WAAW,CAAA;AAAA,EAC9D,CAAA,EAAG,CAAC,SAAA,EAAW,WAAW,CAAC,CAAA;AAC7B;;;ACzNO,IAAM,iBAAA,GAAoB","file":"index.mjs","sourcesContent":["/**\n * 埋点系统类型定义\n * Analytics System Type Definitions\n */\n\n/**\n * 事件类型枚举\n */\nexport enum EventType {\n // 页面事件\n PAGE_VIEW = 'page_view',\n PAGE_LEAVE = 'page_leave',\n\n // 用户行为事件\n CLICK = 'click',\n SCROLL = 'scroll',\n INPUT = 'input',\n SUBMIT = 'submit',\n\n // 业务事件\n LOGIN = 'login',\n LOGOUT = 'logout',\n REGISTER = 'register',\n SEARCH = 'search',\n SHARE = 'share',\n\n // 性能事件\n PERFORMANCE = 'performance',\n ERROR = 'error',\n API_CALL = 'api_call',\n\n // 自定义事件\n CUSTOM = 'custom',\n}\n\n/**\n * 事件优先级\n */\nexport enum EventPriority {\n LOW = 0, // 低优先级,可延迟上报\n NORMAL = 1, // 普通优先级,批量上报\n HIGH = 2, // 高优先级,实时上报\n CRITICAL = 3, // 关键事件,立即上报\n}\n\n/**\n * 基础事件数据接口\n */\nexport interface BaseEvent {\n // 基本信息\n event_id: string; // 事件唯一ID\n event_type: EventType; // 事件类型\n event_name: string; // 事件名称\n timestamp: number; // 事件时间戳\n priority: EventPriority; // 事件优先级\n\n // 用户信息\n user_id?: string; // 用户ID\n session_id: string; // 会话ID\n device_id: string; // 设备ID\n\n // 页面信息\n page_url?: string; // 页面URL\n page_title?: string; // 页面标题\n referrer?: string; // 来源页面\n\n // 自定义属性\n properties?: Record<string, any>;\n\n // 系统信息\n platform: string; // 平台:web/mobile/desktop/miniapp\n app_version: string; // 应用版本\n sdk_version: string; // SDK版本\n}\n\n/**\n * 页面浏览事件\n */\nexport interface PageViewEvent extends BaseEvent {\n event_type: EventType.PAGE_VIEW;\n page_url: string;\n page_title: string;\n duration?: number; // 页面停留时长(ms)\n}\n\n/**\n * 点击事件\n */\nexport interface ClickEvent extends BaseEvent {\n event_type: EventType.CLICK;\n element_id?: string; // 元素ID\n element_class?: string; // 元素类名\n element_text?: string; // 元素文本\n element_type?: string; // 元素类型\n position?: {\n // 点击位置\n x: number;\n y: number;\n };\n}\n\n/**\n * 错误事件\n */\nexport interface ErrorEvent extends BaseEvent {\n event_type: EventType.ERROR;\n error_message: string; // 错误信息\n error_stack?: string; // 错误堆栈\n error_type?: string; // 错误类型\n error_level?: 'warning' | 'error' | 'fatal';\n}\n\n/**\n * 性能事件\n */\nexport interface PerformanceEvent extends BaseEvent {\n event_type: EventType.PERFORMANCE;\n metric_name: string; // 指标名称\n metric_value: number; // 指标值\n metric_unit?: string; // 单位\n}\n\n/**\n * API调用事件\n */\nexport interface ApiCallEvent extends BaseEvent {\n event_type: EventType.API_CALL;\n api_url: string; // API地址\n api_method: string; // 请求方法\n api_status?: number; // 响应状态码\n duration?: number; // 请求耗时(ms)\n success: boolean; // 是否成功\n}\n\n/**\n * 所有事件类型联合\n */\nexport type AnalyticsEvent =\n | BaseEvent\n | PageViewEvent\n | ClickEvent\n | ErrorEvent\n | PerformanceEvent\n | ApiCallEvent;\n\n/**\n * 事件上报配置\n */\nexport interface AnalyticsConfig {\n // 基础配置\n appId: string; // 应用ID\n appVersion: string; // 应用版本\n endpoint: string; // 上报接口地址\n platform?: string; // 平台标识(web/mobile/miniapp/desktop)\n debug?: boolean; // 是否开启调试模式\n\n // 上报策略\n batchSize?: number; // 批量上报数量(默认10)\n batchInterval?: number; // 批量上报间隔(ms,默认5000)\n maxQueueSize?: number; // 最大队列长度(默认100)\n retryTimes?: number; // 失败重试次数(默认3)\n retryInterval?: number; // 重试间隔(ms,默认1000)\n\n // 功能开关\n enableAutoPageView?: boolean; // 自动采集页面浏览(默认true)\n enableAutoClick?: boolean; // 自动采集点击事件(默认false)\n enableAutoError?: boolean; // 自动采集错误(默认true)\n enableAutoPerformance?: boolean; // 自动采集性能(默认true)\n\n // 数据过滤\n ignoreUrls?: string[]; // 忽略的URL列表\n ignoreErrors?: string[]; // 忽略的错误列表\n beforeSend?: (event: AnalyticsEvent) => AnalyticsEvent | null; // 发送前钩子\n\n // 用户信息\n userId?: string; // 用户ID\n customProperties?: Record<string, any>; // 自定义全局属性\n}\n\n/**\n * 设备信息接口\n */\nexport interface DeviceInfo {\n device_id: string; // 设备唯一ID\n device_model?: string; // 设备型号\n device_brand?: string; // 设备品牌\n os_name: string; // 操作系统名称\n os_version: string; // 操作系统版本\n screen_width: number; // 屏幕宽度\n screen_height: number; // 屏幕高度\n language: string; // 系统语言\n timezone: string; // 时区\n network_type?: string; // 网络类型\n carrier?: string; // 运营商\n}\n\n/**\n * 上报响应接口\n */\nexport interface UploadResponse {\n success: boolean;\n message?: string;\n code?: number;\n}\n\n/**\n * 存储适配器接口\n */\nexport interface AnalyticsStorageAdapter {\n /**\n * 保存事件到本地存储\n */\n saveEvents(events: AnalyticsEvent[]): Promise<void>;\n\n /**\n * 获取本地存储的事件\n */\n getEvents(): Promise<AnalyticsEvent[]>;\n\n /**\n * 清除本地存储的事件\n */\n clearEvents(): Promise<void>;\n\n /**\n * 保存设备信息\n */\n saveDeviceInfo(info: DeviceInfo): Promise<void>;\n\n /**\n * 获取设备信息\n */\n getDeviceInfo(): Promise<DeviceInfo | null>;\n\n /**\n * 保存会话ID\n */\n saveSessionId(sessionId: string): Promise<void>;\n\n /**\n * 获取会话ID\n */\n getSessionId(): Promise<string | null>;\n}\n\n/**\n * 网络适配器接口\n */\nexport interface AnalyticsNetworkAdapter {\n /**\n * 上传事件数据\n */\n upload(url: string, events: AnalyticsEvent[]): Promise<UploadResponse>;\n\n /**\n * 检查网络连接状态\n */\n isOnline(): Promise<boolean>;\n}\n\n/**\n * 设备信息适配器接口\n */\nexport interface AnalyticsDeviceAdapter {\n /**\n * 获取设备信息\n */\n getDeviceInfo(): Promise<DeviceInfo>;\n\n /**\n * 生成设备唯一ID\n */\n generateDeviceId(): Promise<string>;\n}\n","/**\n * 事件队列管理器\n * Event Queue Manager\n */\n\nimport type { AnalyticsEvent } from '../types';\n\nexport class EventQueue {\n private queue: AnalyticsEvent[] = [];\n private maxSize: number;\n\n constructor(maxSize: number = 100) {\n this.maxSize = maxSize;\n }\n\n /**\n * 添加事件到队列\n */\n enqueue(event: AnalyticsEvent): void {\n // 如果队列已满,移除最老的低优先级事件\n if (this.queue.length >= this.maxSize) {\n this.removeLowestPriorityEvent();\n }\n\n this.queue.push(event);\n\n // 按优先级排序(高优先级在前)\n this.queue.sort((a, b) => b.priority - a.priority);\n }\n\n /**\n * 批量添加事件\n */\n enqueueBatch(events: AnalyticsEvent[]): void {\n events.forEach((event) => this.enqueue(event));\n }\n\n /**\n * 获取指定数量的事件\n */\n dequeue(count: number): AnalyticsEvent[] {\n return this.queue.splice(0, count);\n }\n\n /**\n * 获取所有事件\n */\n dequeueAll(): AnalyticsEvent[] {\n const events = [...this.queue];\n this.queue = [];\n return events;\n }\n\n /**\n * 获取高优先级事件\n */\n getHighPriorityEvents(): AnalyticsEvent[] {\n const highPriorityEvents = this.queue.filter(\n (event) => event.priority >= 2 // HIGH 和 CRITICAL\n );\n\n // 从队列中移除这些事件\n this.queue = this.queue.filter((event) => event.priority < 2);\n\n return highPriorityEvents;\n }\n\n /**\n * 查看队列长度\n */\n size(): number {\n return this.queue.length;\n }\n\n /**\n * 队列是否为空\n */\n isEmpty(): boolean {\n return this.queue.length === 0;\n }\n\n /**\n * 队列是否已满\n */\n isFull(): boolean {\n return this.queue.length >= this.maxSize;\n }\n\n /**\n * 清空队列\n */\n clear(): void {\n this.queue = [];\n }\n\n /**\n * 移除最低优先级的事件\n */\n private removeLowestPriorityEvent(): void {\n if (this.queue.length === 0) return;\n\n // 找到优先级最低的事件\n let lowestPriorityIndex = 0;\n let lowestPriority = this.queue[0]?.priority ?? 0;\n\n for (let i = 1; i < this.queue.length; i++) {\n const currentPriority = this.queue[i]?.priority ?? 0;\n if (currentPriority < lowestPriority) {\n lowestPriority = currentPriority;\n lowestPriorityIndex = i;\n }\n }\n\n this.queue.splice(lowestPriorityIndex, 1);\n }\n\n /**\n * 获取队列快照(不移除事件)\n */\n snapshot(): AnalyticsEvent[] {\n return [...this.queue];\n }\n}\n","/**\n * 事件上传器\n * Event Uploader\n */\n\nimport type {\n AnalyticsEvent,\n AnalyticsNetworkAdapter,\n AnalyticsStorageAdapter,\n} from '../types';\n\nexport interface UploaderConfig {\n endpoint: string;\n batchSize: number;\n retryTimes: number;\n retryInterval: number;\n networkAdapter: AnalyticsNetworkAdapter;\n storageAdapter: AnalyticsStorageAdapter;\n onSuccess?: (events: AnalyticsEvent[]) => void;\n onError?: (error: Error, events: AnalyticsEvent[]) => void;\n}\n\nexport class Uploader {\n private config: UploaderConfig;\n private uploading = false;\n private retryQueue: Map<string, { events: AnalyticsEvent[]; retryCount: number }> = new Map();\n\n constructor(config: UploaderConfig) {\n this.config = config;\n }\n\n /**\n * 上传事件\n */\n async upload(events: AnalyticsEvent[]): Promise<boolean> {\n if (events.length === 0) return true;\n\n // 检查网络状态\n const isOnline = await this.config.networkAdapter.isOnline();\n if (!isOnline) {\n // 离线时保存到本地\n await this.saveToLocal(events);\n return false;\n }\n\n try {\n this.uploading = true;\n\n const response = await this.config.networkAdapter.upload(this.config.endpoint, events);\n\n if (response.success) {\n this.config.onSuccess?.(events);\n return true;\n } else {\n throw new Error(response.message || 'Upload failed');\n }\n } catch (error) {\n const err = error instanceof Error ? error : new Error(String(error));\n this.config.onError?.(err, events);\n\n // 添加到重试队列\n await this.addToRetryQueue(events);\n return false;\n } finally {\n this.uploading = false;\n }\n }\n\n /**\n * 批量上传\n */\n async uploadBatch(events: AnalyticsEvent[]): Promise<boolean> {\n const batches = this.splitIntoBatches(events, this.config.batchSize);\n const results = await Promise.all(batches.map((batch) => this.upload(batch)));\n\n return results.every((result) => result);\n }\n\n /**\n * 重试失败的上传\n */\n async retryFailedUploads(): Promise<void> {\n if (this.uploading || this.retryQueue.size === 0) return;\n\n const isOnline = await this.config.networkAdapter.isOnline();\n if (!isOnline) return;\n\n const entries = Array.from(this.retryQueue.entries());\n\n for (const [key, item] of entries) {\n if (item.retryCount >= this.config.retryTimes) {\n // 达到最大重试次数,保存到本地\n await this.saveToLocal(item.events);\n this.retryQueue.delete(key);\n continue;\n }\n\n // 延迟重试\n await this.delay(this.config.retryInterval * (item.retryCount + 1));\n\n const success = await this.upload(item.events);\n\n if (success) {\n this.retryQueue.delete(key);\n } else {\n // 增加重试次数\n item.retryCount++;\n }\n }\n }\n\n /**\n * 上传本地缓存的事件\n */\n async uploadCachedEvents(): Promise<void> {\n try {\n const cachedEvents = await this.config.storageAdapter.getEvents();\n\n if (cachedEvents.length > 0) {\n const success = await this.uploadBatch(cachedEvents);\n\n if (success) {\n await this.config.storageAdapter.clearEvents();\n }\n }\n } catch (error) {\n console.error('Failed to upload cached events:', error);\n }\n }\n\n /**\n * 保存事件到本地存储\n */\n private async saveToLocal(events: AnalyticsEvent[]): Promise<void> {\n try {\n const existingEvents = await this.config.storageAdapter.getEvents();\n const allEvents = [...existingEvents, ...events];\n await this.config.storageAdapter.saveEvents(allEvents);\n } catch (error) {\n console.error('Failed to save events to local storage:', error);\n }\n }\n\n /**\n * 添加到重试队列\n */\n private async addToRetryQueue(events: AnalyticsEvent[]): Promise<void> {\n const key = `${Date.now()}_${Math.random()}`;\n this.retryQueue.set(key, {\n events,\n retryCount: 0,\n });\n }\n\n /**\n * 分割成批次\n */\n private splitIntoBatches(events: AnalyticsEvent[], batchSize: number): AnalyticsEvent[][] {\n const batches: AnalyticsEvent[][] = [];\n\n for (let i = 0; i < events.length; i += batchSize) {\n batches.push(events.slice(i, i + batchSize));\n }\n\n return batches;\n }\n\n /**\n * 延迟函数\n */\n private delay(ms: number): Promise<void> {\n return new Promise((resolve) => setTimeout(resolve, ms));\n }\n\n /**\n * 是否正在上传\n */\n isUploading(): boolean {\n return this.uploading;\n }\n\n /**\n * 获取重试队列大小\n */\n getRetryQueueSize(): number {\n return this.retryQueue.size;\n }\n\n /**\n * 清空重试队列\n */\n clearRetryQueue(): void {\n this.retryQueue.clear();\n }\n}\n","/**\n * 埋点系统核心类\n * Analytics Core SDK\n */\n\nimport {\n EventType,\n EventPriority,\n type AnalyticsConfig,\n type AnalyticsEvent,\n type BaseEvent,\n type AnalyticsStorageAdapter,\n type AnalyticsNetworkAdapter,\n type AnalyticsDeviceAdapter,\n type DeviceInfo,\n} from '../types';\nimport { EventQueue } from './EventQueue';\nimport { Uploader } from './Uploader';\n\nconst SDK_VERSION = '1.0.0';\n\nexport class Analytics {\n private config: Required<AnalyticsConfig>;\n private eventQueue: EventQueue;\n private uploader: Uploader;\n private storageAdapter: AnalyticsStorageAdapter;\n private networkAdapter: AnalyticsNetworkAdapter;\n private deviceAdapter: AnalyticsDeviceAdapter;\n\n private sessionId: string = '';\n private deviceId: string = '';\n private deviceInfo: DeviceInfo | null = null;\n private initialized = false;\n private batchTimer: any = null;\n\n constructor(\n config: Omit<AnalyticsConfig, 'endpoint'> & {\n adapter?: {\n storage: AnalyticsStorageAdapter;\n network: AnalyticsNetworkAdapter;\n device: AnalyticsDeviceAdapter;\n };\n platform?: string;\n serverUrl?: string;\n endpoint?: string;\n },\n storageAdapter?: AnalyticsStorageAdapter,\n networkAdapter?: AnalyticsNetworkAdapter,\n deviceAdapter?: AnalyticsDeviceAdapter\n ) {\n // 支持两种初始化方式:\n // 1. 新方式:传入包含 adapter 的 config 对象\n // 2. 旧方式:分别传入四个参数\n if (config.adapter) {\n this.storageAdapter = config.adapter.storage;\n this.networkAdapter = config.adapter.network;\n this.deviceAdapter = config.adapter.device;\n } else if (storageAdapter && networkAdapter && deviceAdapter) {\n this.storageAdapter = storageAdapter;\n this.networkAdapter = networkAdapter;\n this.deviceAdapter = deviceAdapter;\n } else {\n throw new Error('Analytics initialization failed: adapter is required');\n }\n\n // 合并默认配置\n const serverUrl = (config as any).serverUrl || config.endpoint || '/api/analytics/events';\n const platform = (config as any).platform || 'web';\n\n this.config = {\n ...config,\n appId: config.appId,\n appVersion: config.appVersion || '1.0.0',\n platform: platform,\n endpoint: serverUrl,\n batchSize: config.batchSize ?? 10,\n batchInterval: config.batchInterval ?? 5000,\n maxQueueSize: config.maxQueueSize ?? 100,\n retryTimes: config.retryTimes ?? 3,\n retryInterval: config.retryInterval ?? 1000,\n enableAutoPageView: config.enableAutoPageView ?? true,\n enableAutoClick: config.enableAutoClick ?? false,\n enableAutoError: config.enableAutoError ?? true,\n enableAutoPerformance: config.enableAutoPerformance ?? true,\n debug: config.debug ?? false,\n ignoreUrls: config.ignoreUrls ?? [],\n ignoreErrors: config.ignoreErrors ?? [],\n beforeSend: config.beforeSend,\n } as Required<AnalyticsConfig>;\n\n this.eventQueue = new EventQueue(this.config.maxQueueSize);\n this.uploader = new Uploader({\n endpoint: this.config.endpoint,\n batchSize: this.config.batchSize,\n retryTimes: this.config.retryTimes,\n retryInterval: this.config.retryInterval,\n networkAdapter: this.networkAdapter,\n storageAdapter: this.storageAdapter,\n onSuccess: (events) => this.onUploadSuccess(events),\n onError: (error, events) => this.onUploadError(error, events),\n });\n\n // 自动初始化\n this.init().catch((error) => {\n console.error('Failed to initialize Analytics:', error);\n });\n }\n\n /**\n * 初始化\n */\n async init(): Promise<void> {\n if (this.initialized) {\n this.log('Analytics already initialized');\n return;\n }\n\n try {\n // 初始化设备信息\n await this.initDeviceInfo();\n\n // 初始化会话\n await this.initSession();\n\n // 上传缓存的事件\n await this.uploader.uploadCachedEvents();\n\n // 启动批量上传定时器\n this.startBatchTimer();\n\n // 监听调试配置变化\n if (typeof window !== 'undefined') {\n window.addEventListener('analytics-debug-changed', ((e: CustomEvent) => {\n this.log(`Debug mode changed: ${e.detail.enabled ? 'enabled' : 'disabled'}`);\n }) as EventListener);\n }\n\n this.initialized = true;\n this.log('Analytics initialized successfully');\n } catch (error) {\n console.error('Failed to initialize analytics:', error);\n throw error;\n }\n }\n\n /**\n * 追踪事件(简化版本,支持两种调用方式)\n */\n track(\n eventNameOrType: string | EventType,\n propertiesOrName?: Record<string, any> | string,\n maybeProperties?: Record<string, any>,\n priority: EventPriority = EventPriority.NORMAL\n ): void {\n if (!this.initialized) {\n console.warn('Analytics not initialized yet, queuing event...');\n // 可以选择在初始化后重试\n setTimeout(\n () => this.track(eventNameOrType, propertiesOrName, maybeProperties, priority),\n 100\n );\n return;\n }\n\n let eventType: EventType;\n let eventName: string;\n let properties: Record<string, any> | undefined;\n\n // 支持两种调用方式:\n // 1. track(eventName, properties) - 简化版\n // 2. track(eventType, eventName, properties, priority) - 完整版\n if (typeof propertiesOrName === 'string') {\n // 完整版调用\n eventType = eventNameOrType as EventType;\n eventName = propertiesOrName;\n properties = maybeProperties;\n } else {\n // 简化版调用\n eventType = EventType.CUSTOM;\n eventName = eventNameOrType as string;\n properties = propertiesOrName;\n }\n\n const event = this.createEvent(eventType, eventName, properties, priority);\n\n // beforeSend 钩子\n const processedEvent = this.config.beforeSend?.(event) ?? event;\n if (!processedEvent) {\n this.log('Event filtered by beforeSend hook', event);\n return;\n }\n\n // 添加到队列\n this.eventQueue.enqueue(processedEvent);\n this.log('Event tracked', processedEvent);\n\n // 高优先级事件立即上传\n if (priority >= EventPriority.HIGH) {\n this.flushHighPriority();\n }\n\n // 队列满了自动上传\n if (this.eventQueue.isFull()) {\n this.flush();\n }\n }\n\n /**\n * 追踪页面浏览\n */\n trackPageView(pageUrl: string, pageTitle: string, properties?: Record<string, any>): void {\n this.track(\n EventType.PAGE_VIEW,\n 'page_view',\n {\n page_url: pageUrl,\n page_title: pageTitle,\n ...properties,\n },\n EventPriority.NORMAL\n );\n }\n\n /**\n * 追踪点击事件\n */\n trackClick(\n elementInfo: {\n elementId?: string;\n elementClass?: string;\n elementText?: string;\n elementType?: string;\n position?: { x: number; y: number };\n },\n properties?: Record<string, any>\n ): void {\n this.track(\n EventType.CLICK,\n 'click',\n {\n ...elementInfo,\n ...properties,\n },\n EventPriority.LOW\n );\n }\n\n /**\n * 追踪错误\n */\n trackError(\n errorMessage: string,\n errorStack?: string,\n errorType?: string,\n properties?: Record<string, any>\n ): void {\n this.track(\n EventType.ERROR,\n 'error',\n {\n error_message: errorMessage,\n error_stack: errorStack,\n error_type: errorType,\n ...properties,\n },\n EventPriority.HIGH\n );\n }\n\n /**\n * 追踪性能指标\n */\n trackPerformance(\n metricName: string,\n metricValue: number,\n metricUnit?: string,\n properties?: Record<string, any>\n ): void {\n this.track(\n EventType.PERFORMANCE,\n 'performance',\n {\n metric_name: metricName,\n metric_value: metricValue,\n metric_unit: metricUnit,\n ...properties,\n },\n EventPriority.LOW\n );\n }\n\n /**\n * 追踪 API 调用\n */\n trackApiCall(\n apiUrl: string,\n apiMethod: string,\n apiStatus: number,\n duration: number,\n success: boolean,\n properties?: Record<string, any>\n ): void {\n this.track(\n EventType.API_CALL,\n 'api_call',\n {\n api_url: apiUrl,\n api_method: apiMethod,\n api_status: apiStatus,\n duration,\n success,\n ...properties,\n },\n EventPriority.NORMAL\n );\n }\n\n /**\n * 设置用户ID\n */\n setUserId(userId: string): void {\n this.config.userId = userId;\n this.log('User ID set', userId);\n }\n\n /**\n * 设置用户信息(包括用户ID和其他属性)\n */\n setUser(userInfo: { userId: string; [key: string]: any }): void {\n const { userId, ...otherProps } = userInfo;\n this.config.userId = userId;\n this.config.customProperties = {\n ...this.config.customProperties,\n ...otherProps,\n };\n this.log('User info set', userInfo);\n }\n\n /**\n * 设置自定义属性\n */\n setCustomProperties(properties: Record<string, any>): void {\n this.config.customProperties = {\n ...this.config.customProperties,\n ...properties,\n };\n this.log('Custom properties set', properties);\n }\n\n /**\n * 立即上传所有事件\n */\n async flush(): Promise<void> {\n if (this.eventQueue.isEmpty()) {\n return;\n }\n\n const events = this.eventQueue.dequeueAll();\n await this.uploader.upload(events);\n }\n\n /**\n * 立即上传高优先级事件\n */\n private async flushHighPriority(): Promise<void> {\n const highPriorityEvents = this.eventQueue.getHighPriorityEvents();\n\n if (highPriorityEvents.length > 0) {\n await this.uploader.upload(highPriorityEvents);\n }\n }\n\n /**\n * 销毁实例\n */\n async destroy(): Promise<void> {\n // 停止定时器\n if (this.batchTimer) {\n clearInterval(this.batchTimer);\n this.batchTimer = null;\n }\n\n // 上传剩余事件\n await this.flush();\n\n this.initialized = false;\n this.log('Analytics destroyed');\n }\n\n /**\n * 创建事件对象\n */\n private createEvent(\n eventType: EventType,\n eventName: string,\n properties?: Record<string, any>,\n priority: EventPriority = EventPriority.NORMAL\n ): BaseEvent {\n // 获取当前页面信息(仅在浏览器环境)\n let pageUrl: string | undefined;\n let pageTitle: string | undefined;\n let referrer: string | undefined;\n\n if (typeof window !== 'undefined') {\n pageUrl = window.location.href;\n pageTitle = document.title;\n referrer = document.referrer || undefined;\n }\n\n return {\n event_id: this.generateEventId(),\n event_type: eventType,\n event_name: eventName,\n timestamp: Date.now(),\n priority,\n user_id: this.config.userId,\n session_id: this.sessionId,\n device_id: this.deviceId,\n page_url: pageUrl,\n page_title: pageTitle,\n referrer: referrer,\n properties: {\n ...this.config.customProperties,\n ...properties,\n },\n platform: this.getPlatform(),\n app_version: this.config.appVersion,\n sdk_version: SDK_VERSION,\n };\n }\n\n /**\n * 初始化设备信息\n */\n private async initDeviceInfo(): Promise<void> {\n try {\n // 尝试从缓存获取\n let cachedDeviceInfo = await this.storageAdapter.getDeviceInfo();\n\n if (!cachedDeviceInfo) {\n // 生成新的设备信息\n this.deviceInfo = await this.deviceAdapter.getDeviceInfo();\n this.deviceId = await this.deviceAdapter.generateDeviceId();\n\n // 保存到缓存\n await this.storageAdapter.saveDeviceInfo(this.deviceInfo);\n } else {\n this.deviceInfo = cachedDeviceInfo;\n this.deviceId = cachedDeviceInfo.device_id;\n }\n } catch (error) {\n console.error('Failed to init device info:', error);\n // 使用临时ID\n this.deviceId = `temp_${Date.now()}_${Math.random()}`;\n }\n }\n\n /**\n * 初始化会话\n */\n private async initSession(): Promise<void> {\n try {\n // 尝试从缓存获取\n const cachedSessionId = await this.storageAdapter.getSessionId();\n\n if (cachedSessionId) {\n this.sessionId = cachedSessionId;\n } else {\n // 生成新会话\n this.sessionId = this.generateSessionId();\n await this.storageAdapter.saveSessionId(this.sessionId);\n }\n } catch (error) {\n console.error('Failed to init session:', error);\n this.sessionId = this.generateSessionId();\n }\n }\n\n /**\n * 启动批量上传定时器\n */\n private startBatchTimer(): void {\n this.batchTimer = setInterval(() => {\n if (!this.eventQueue.isEmpty()) {\n this.flush();\n }\n\n // 重试失败的上传\n this.uploader.retryFailedUploads();\n }, this.config.batchInterval);\n }\n\n /**\n * 上传成功回调\n */\n private onUploadSuccess(events: AnalyticsEvent[]): void {\n this.log('Events uploaded successfully', events);\n }\n\n /**\n * 上传失败回调\n */\n private onUploadError(error: Error, events: AnalyticsEvent[]): void {\n this.log('Failed to upload events', { error, events });\n }\n\n /**\n * 生成事件ID\n */\n private generateEventId(): string {\n return `${Date.now()}_${Math.random().toString(36).substring(2, 15)}`;\n }\n\n /**\n * 生成会话ID\n */\n private generateSessionId(): string {\n return `session_${Date.now()}_${Math.random().toString(36).substring(2, 15)}`;\n }\n\n /**\n * 获取平台标识\n */\n private getPlatform(): string {\n return this.config.platform || 'unknown';\n }\n\n /**\n * 日志输出\n */\n private log(message: string, data?: any): void {\n // 检查动态调试配置(优先级高于初始化时的 debug 配置)\n const dynamicDebug =\n typeof window !== 'undefined' ? localStorage.getItem('analytics-debug') === 'true' : false;\n\n if (this.config.debug || dynamicDebug) {\n console.log(`[Analytics] ${message}`, data ?? '');\n }\n }\n\n /**\n * 获取队列状态\n */\n getQueueStatus(): {\n size: number;\n isFull: boolean;\n isEmpty: boolean;\n } {\n return {\n size: this.eventQueue.size(),\n isFull: this.eventQueue.isFull(),\n isEmpty: this.eventQueue.isEmpty(),\n };\n }\n\n /**\n * 获取初始化状态\n */\n isInitialized(): boolean {\n return this.initialized;\n }\n}\n","/**\n * Analytics 预设配置\n * Analytics Preset Configurations\n *\n * 提供常见场景的配置模板(不包含平台适配器)\n * 使用时需要提供具体的 adapter 实现\n */\n\nimport type { AnalyticsConfig } from '../types';\n\n/**\n * Web 应用基础配置模板\n */\nexport function createWebConfig(\n appId: string,\n options: {\n endpoint?: string;\n debug?: boolean;\n enableAutoPageView?: boolean;\n appVersion?: string;\n } = {}\n): Partial<AnalyticsConfig> {\n return {\n appId,\n appVersion: options.appVersion || '1.0.0',\n endpoint: options.endpoint || '/api/analytics/events',\n platform: 'web',\n enableAutoPageView: options.enableAutoPageView ?? true,\n debug:\n options.debug ??\n (typeof process !== 'undefined' && process.env?.NODE_ENV === 'development'),\n // adapter 需要由调用者提供\n };\n}\n\n/**\n * 移动应用基础配置模板\n */\nexport function createMobileConfig(\n appId: string,\n options: {\n endpoint?: string;\n debug?: boolean;\n appVersion?: string;\n } = {}\n): Partial<AnalyticsConfig> {\n return {\n appId,\n appVersion: options.appVersion || '1.0.0',\n endpoint: options.endpoint || '/api/analytics/events',\n platform: 'mobile',\n enableAutoPageView: false,\n debug: options.debug ?? false,\n // adapter 需要由调用者提供\n };\n}\n\n/**\n * 小程序基础配置模板\n */\nexport function createMiniappConfig(\n appId: string,\n options: {\n endpoint?: string;\n debug?: boolean;\n appVersion?: string;\n } = {}\n): Partial<AnalyticsConfig> {\n return {\n appId,\n appVersion: options.appVersion || '1.0.0',\n endpoint: options.endpoint || '/api/analytics/events',\n platform: 'miniapp',\n enableAutoPageView: true,\n debug: options.debug ?? false,\n // adapter 需要由调用者提供\n };\n}\n\n/**\n * 桌面应用基础配置模板\n */\nexport function createDesktopConfig(\n appId: string,\n options: {\n endpoint?: string;\n debug?: boolean;\n appVersion?: string;\n } = {}\n): Partial<AnalyticsConfig> {\n return {\n appId,\n appVersion: options.appVersion || '1.0.0',\n endpoint: options.endpoint || '/api/analytics/events',\n platform: 'desktop',\n enableAutoPageView: false,\n debug: options.debug ?? false,\n // adapter 需要由调用者提供\n };\n}\n\n/**\n * 使用示例:\n *\n * ```typescript\n * import { createWebConfig, createAnalytics } from '@qhr123/sa2kit/analytics';\n * import { webAdapter } from './adapters/web'; // 你的适配器实现\n *\n * const config = createWebConfig('my-app', {\n * endpoint: 'https://api.example.com/analytics',\n * debug: true,\n * });\n *\n * const analytics = createAnalytics('my-instance', {\n * ...config,\n * adapter: webAdapter, // 提供具体的适配器\n * });\n * ```\n */\n","/**\n * Analytics 单例管理器\n * Analytics Singleton Manager\n *\n * 提供统一的单例创建和管理功能,支持多个独立实例\n */\n\nimport { Analytics } from '../core/Analytics';\nimport type { AnalyticsConfig } from '../types';\n\n// 存储多个实例的 Map\nconst instances = new Map<string, Analytics>();\n\n/**\n * 创建或获取 Analytics 实例\n * @param instanceKey 实例唯一标识\n * @param config Analytics 配置\n * @returns Analytics 实例\n */\nexport function createAnalytics(instanceKey: string, config: AnalyticsConfig): Analytics {\n if (!instances.has(instanceKey)) {\n instances.set(instanceKey, new Analytics(config));\n }\n return instances.get(instanceKey)!;\n}\n\n/**\n * 获取已存在的 Analytics 实例\n * @param instanceKey 实例唯一标识\n * @returns Analytics 实例或 null\n */\nexport function getAnalyticsInstance(instanceKey: string): Analytics | null {\n return instances.get(instanceKey) || null;\n}\n\n/**\n * 重置指定实例\n * @param instanceKey 实例唯一标识\n */\nexport function resetAnalytics(instanceKey: string): void {\n instances.delete(instanceKey);\n}\n\n/**\n * 重置所有实例\n */\nexport function resetAllAnalytics(): void {\n instances.clear();\n}\n\n/**\n * 检查实例是否已初始化\n * @param instanceKey 实例唯一标识\n */\nexport function isAnalyticsInitialized(instanceKey: string): boolean {\n return instances.has(instanceKey);\n}\n\n/**\n * 获取所有已创建的实例键名\n */\nexport function getAllInstanceKeys(): string[] {\n return Array.from(instances.keys());\n}\n","/**\n * 埋点工具函数\n * Analytics Helper Functions\n */\n\nimport type { AnalyticsEvent } from '../types';\n\n/**\n * 节流函数\n */\nexport function throttle<T extends (...args: any[]) => any>(\n func: T,\n wait: number\n): (...args: Parameters<T>) => void {\n let timeout: any = null;\n let previous = 0;\n\n return function (this: any, ...args: Parameters<T>) {\n const now = Date.now();\n const remaining = wait - (now - previous);\n\n if (remaining <= 0 || remaining > wait) {\n if (timeout) {\n clearTimeout(timeout);\n timeout = null;\n }\n previous = now;\n func.apply(this, args);\n } else if (!timeout) {\n timeout = setTimeout(() => {\n previous = Date.now();\n timeout = null;\n func.apply(this, args);\n }, remaining);\n }\n };\n}\n\n/**\n * 防抖函数\n */\nexport function debounce<T extends (...args: any[]) => any>(\n func: T,\n wait: number\n): (...args: Parameters<T>) => void {\n let timeout: any = null;\n\n return function (this: any, ...args: Parameters<T>) {\n if (timeout) {\n clearTimeout(timeout);\n }\n\n timeout = setTimeout(() => {\n func.apply(this, args);\n }, wait);\n };\n}\n\n/**\n * 格式化事件数据\n */\nexport function formatEvent(event: AnalyticsEvent): string {\n return JSON.stringify(event, null, 2);\n}\n\n/**\n * 验证事件数据\n */\nexport function validateEvent(event: AnalyticsEvent): boolean {\n if (!event.event_id || !event.event_type || !event.event_name) {\n return false;\n }\n if (!event.timestamp || event.timestamp <= 0) {\n return false;\n }\n if (!event.session_id || !event.device_id) {\n return false;\n }\n return true;\n}\n\n/**\n * 批量验证事件\n */\nexport function validateEvents(events: AnalyticsEvent[]): {\n valid: AnalyticsEvent[];\n invalid: AnalyticsEvent[];\n} {\n const valid: AnalyticsEvent[] = [];\n const invalid: AnalyticsEvent[] = [];\n\n events.forEach((event) => {\n if (validateEvent(event)) {\n valid.push(event);\n } else {\n invalid.push(event);\n }\n });\n\n return { valid, invalid };\n}\n\n/**\n * 计算事件大小(字节)\n */\nexport function getEventSize(event: AnalyticsEvent): number {\n return new Blob([JSON.stringify(event)]).size;\n}\n\n/**\n * 计算批量事件大小\n */\nexport function getBatchSize(events: AnalyticsEvent[]): number {\n return events.reduce((total, event) => total + getEventSize(event), 0);\n}\n\n/**\n * 过滤敏感信息\n */\nexport function sanitizeEvent(\n event: AnalyticsEvent,\n sensitiveKeys: string[] = ['password', 'token', 'secret', 'key']\n): AnalyticsEvent {\n const sanitized = { ...event };\n\n if (sanitized.properties) {\n const cleanProperties = { ...sanitized.properties };\n\n sensitiveKeys.forEach((key) => {\n if (key in cleanProperties) {\n cleanProperties[key] = '***';\n }\n });\n\n sanitized.properties = cleanProperties;\n }\n\n return sanitized;\n}\n\n/**\n * 合并事件属性\n */\nexport function mergeEventProperties(\n baseProperties: Record<string, any>,\n ...additionalProperties: Record<string, any>[]\n): Record<string, any> {\n return Object.assign({}, baseProperties, ...additionalProperties);\n}\n\n/**\n * 生成唯一ID\n */\nexport function generateUniqueId(prefix: string = ''): string {\n const timestamp = Date.now();\n const random = Math.random().toString(36).substring(2, 15);\n return prefix ? `${prefix}_${timestamp}_${random}` : `${timestamp}_${random}`;\n}\n\n/**\n * 判断是否为移动设备\n */\nexport function isMobile(): boolean {\n if (typeof navigator === 'undefined') return false;\n\n return /Android|webOS|iPhone|iPad|iPod|BlackBerry|IEMobile|Opera Mini/i.test(navigator.userAgent);\n}\n\n/**\n * 判断是否为开发环境\n */\nexport function isDevelopment(): boolean {\n return process.env.NODE_ENV === 'development';\n}\n\n/**\n * 格式化时间戳\n */\nexport function formatTimestamp(\n timestamp: number,\n format: 'date' | 'datetime' | 'time' = 'datetime'\n): string {\n const date = new Date(timestamp);\n\n switch (format) {\n case 'date':\n return date.toLocaleDateString();\n case 'time':\n return date.toLocaleTimeString();\n case 'datetime':\n default:\n return date.toLocaleString();\n }\n}\n\n/**\n * 深拷贝对象\n */\nexport function deepClone<T>(obj: T): T {\n return JSON.parse(JSON.stringify(obj));\n}\n\n/**\n * 安全的 JSON.stringify\n */\nexport function safeStringify(obj: any, fallback: string = '{}'): string {\n try {\n return JSON.stringify(obj);\n } catch (error) {\n console.error('Failed to stringify object:', error);\n return fallback;\n }\n}\n\n/**\n * 安全的 JSON.parse\n */\nexport function safeParse<T>(json: string, fallback: T): T {\n try {\n return JSON.parse(json);\n } catch (error) {\n console.error('Failed to parse JSON:', error);\n return fallback;\n }\n}\n\n/**\n * 获取页面停留时长\n */\nexport function getPageDuration(startTime: number): number {\n return Date.now() - startTime;\n}\n\n/**\n * 获取当前页面 URL\n */\nexport function getCurrentPageUrl(): string {\n if (typeof window !== 'undefined') {\n return window.location.href;\n }\n return '';\n}\n\n/**\n * 获取当前页面标题\n */\nexport function getCurrentPageTitle(): string {\n if (typeof document !== 'undefined') {\n return document.title;\n }\n return '';\n}\n\n/**\n * 获取来源页面\n */\nexport function getReferrer(): string {\n if (typeof document !== 'undefined') {\n return document.referrer;\n }\n return '';\n}\n","/**\n * 埋点装饰器\n * Analytics Decorators\n */\n\nimport type { Analytics } from '../core/Analytics';\nimport { EventType, EventPriority } from '../types';\n\n/**\n * 追踪方法执行\n * @param eventName 事件名称\n * @param priority 事件优先级\n */\nexport function Track(eventName?: string, priority: EventPriority = EventPriority.NORMAL) {\n return function (_target: any, propertyKey: string, descriptor: PropertyDescriptor) {\n const originalMethod = descriptor.value;\n\n descriptor.value = async function (this: any, ...args: any[]) {\n const analytics = getAnalyticsInstance(this);\n const finalEventName = eventName || propertyKey;\n\n // 执行前记录\n const startTime = Date.now();\n\n try {\n const result = await originalMethod.apply(this, args);\n\n // 执行成功\n analytics?.track(\n EventType.CUSTOM,\n finalEventName,\n {\n success: true,\n duration: Date.now() - startTime,\n args: JSON.stringify(args),\n },\n priority\n );\n\n return result;\n } catch (error) {\n // 执行失败\n analytics?.track(\n EventType.ERROR,\n `${finalEventName}_error`,\n {\n success: false,\n duration: Date.now() - startTime,\n error: error instanceof Error ? error.message : String(error),\n },\n EventPriority.HIGH\n );\n\n throw error;\n }\n };\n\n return descriptor;\n };\n}\n\n/**\n * 追踪点击事件\n */\nexport function TrackClick(eventName?: string) {\n return function (_target: any, propertyKey: string, descriptor: PropertyDescriptor) {\n const originalMethod = descriptor.value;\n\n descriptor.value = function (this: any, ...args: any[]) {\n const analytics = getAnalyticsInstance(this);\n const finalEventName = eventName || propertyKey;\n\n analytics?.track(\n EventType.CLICK,\n finalEventName,\n {\n args: JSON.stringify(args),\n },\n EventPriority.LOW\n );\n\n return originalMethod.apply(this, args);\n };\n\n return descriptor;\n };\n}\n\n/**\n * 追踪性能\n */\nexport function TrackPerformance(metricName?: string) {\n return function (_target: any, propertyKey: string, descriptor: PropertyDescriptor) {\n const originalMethod = descriptor.value;\n\n descriptor.value = async function (this: any, ...args: any[]) {\n const analytics = getAnalyticsInstance(this);\n const finalMetricName = metricName || propertyKey;\n const startTime = performance.now();\n\n try {\n const result = await originalMethod.apply(this, args);\n const duration = performance.now() - startTime;\n\n analytics?.trackPerformance(finalMetricName, duration, 'ms', {\n success: true,\n });\n\n return result;\n } catch (error) {\n const duration = performance.now() - startTime;\n\n analytics?.trackPerformance(finalMetricName, duration, 'ms', {\n success: false,\n error: error instanceof Error ? error.message : String(error),\n });\n\n throw error;\n }\n };\n\n return descriptor;\n };\n}\n\n/**\n * 自动捕获错误\n */\nexport function CatchError(_eventName?: string) {\n return function (_target: any, propertyKey: string, descriptor: PropertyDescriptor) {\n const originalMethod = descriptor.value;\n\n descriptor.value = async function (this: any, ...args: any[]) {\n try {\n return await originalMethod.apply(this, args);\n } catch (error) {\n const analytics = getAnalyticsInstance(this);\n\n analytics?.trackError(\n error instanceof Error ? error.message : String(error),\n error instanceof Error ? error.stack : undefined,\n error instanceof Error ? error.name : 'Error',\n {\n method: propertyKey,\n args: JSON.stringify(args),\n }\n );\n\n throw error;\n }\n };\n\n return descriptor;\n };\n}\n\n/**\n * 从实例中获取 Analytics 实例\n */\nfunction getAnalyticsInstance(instance: any): Analytics | null {\n // 尝试多种方式获取\n if (instance.analytics) {\n return instance.analytics;\n }\n if (instance._analytics) {\n return instance._analytics;\n }\n if ((globalThis as any).__analytics__) {\n return (globalThis as any).__analytics__;\n }\n return null;\n}\n\n/**\n * 设置全局 Analytics 实例\n */\nexport function setGlobalAnalytics(analytics: Analytics): void {\n (globalThis as any).__analytics__ = analytics;\n}\n\n/**\n * 获取全局 Analytics 实例\n */\nexport function getGlobalAnalytics(): Analytics | null {\n return (globalThis as any).__analytics__ || null;\n}\n","'use client';\n\n/**\n * React Hooks for Analytics\n * 埋点 React Hooks\n */\n\nimport { useEffect, useCallback, useRef } from 'react';\nimport type { Analytics } from '../core/Analytics';\nimport { EventType, EventPriority } from '../types';\n\n/**\n * 使用埋点实例\n */\nexport function useAnalytics(analytics: Analytics | null) {\n return analytics;\n}\n\n/**\n * 追踪页面浏览\n */\nexport function usePageView(analytics: Analytics | null, pageUrl?: string, pageTitle?: string) {\n useEffect(() => {\n if (!analytics) return;\n\n const url = pageUrl || (typeof window !== 'undefined' ? window.location.href : '');\n const title = pageTitle || (typeof document !== 'undefined' ? document.title : '');\n\n analytics.trackPageView(url, title);\n }, [analytics, pageUrl, pageTitle]);\n}\n\n/**\n * 追踪事件(返回追踪函数)\n */\nexport function useTrackEvent(analytics: Analytics | null) {\n return useCallback(\n (\n eventType: EventType,\n eventName: string,\n properties?: Record<string, any>,\n priority?: EventPriority\n ) => {\n if (analytics) {\n analytics.track(eventType, eventName, properties, priority);\n }\n },\n [analytics]\n );\n}\n\n/**\n * 追踪点击事件\n */\nexport function useTrackClick(analytics: Analytics | null) {\n return useCallback(\n (elementInfo: {\n elementId?: string;\n elementClass?: string;\n elementText?: string;\n elementType?: string;\n }) => {\n if (analytics) {\n analytics.trackClick(elementInfo);\n }\n },\n [analytics]\n );\n}\n\n/**\n * 追踪页面停留时长\n */\nexport function usePageDuration(analytics: Analytics | null) {\n const startTimeRef = useRef<number>(Date.now());\n\n useEffect(() => {\n startTimeRef.current = Date.now();\n\n return () => {\n if (analytics) {\n const duration = Date.now() - startTimeRef.current;\n analytics.track(\n EventType.PAGE_LEAVE,\n 'page_leave',\n {\n duration,\n page_url: typeof window !== 'undefined' ? window.location.href : '',\n },\n EventPriority.NORMAL\n );\n }\n };\n }, [analytics]);\n}\n\n/**\n * 追踪性能指标\n */\nexport function usePerformanceTracking(analytics: Analytics | null) {\n useEffect(() => {\n if (!analytics || typeof window === 'undefined') return;\n\n // 监听页面加载性能\n if ('performance' in window && 'timing' in window.performance) {\n const timing = window.performance.timing as any;\n const loadTime = timing.loadEventEnd - timing.navigationStart;\n const domReadyTime = timing.domContentLoadedEventEnd - timing.navigationStart;\n const firstPaintTime = timing.responseStart - timing.navigationStart;\n\n analytics.trackPerformance('page_load_time', loadTime, 'ms');\n analytics.trackPerformance('dom_ready_time', domReadyTime, 'ms');\n analytics.trackPerformance('first_paint_time', firstPaintTime, 'ms');\n }\n\n // 监听资源加载性能\n if ('PerformanceObserver' in window) {\n const observer = new PerformanceObserver((list) => {\n list.getEntries().forEach((entry) => {\n if (entry.entryType === 'resource') {\n analytics.trackPerformance('resource_load_time', entry.duration, 'ms', {\n resource_name: entry.name,\n });\n }\n });\n });\n\n observer.observe({ entryTypes: ['resource'] });\n\n return () => observer.disconnect();\n }\n\n return undefined;\n }, [analytics]);\n}\n\n/**\n * 追踪错误\n */\nexport function useErrorTracking(analytics: Analytics | null) {\n useEffect(() => {\n if (!analytics || typeof window === 'undefined') return;\n\n const handleError = (event: ErrorEvent) => {\n analytics.trackError(event.message, event.error?.stack, event.error?.name, {\n filename: event.filename,\n lineno: event.lineno,\n colno: event.colno,\n });\n };\n\n const handleUnhandledRejection = (event: PromiseRejectionEvent) => {\n analytics.trackError('Unhandled Promise Rejection', undefined, 'PromiseRejection', {\n reason: String(event.reason),\n });\n };\n\n window.addEventListener('error', handleError);\n window.addEventListener('unhandledrejection', handleUnhandledRejection);\n\n return () => {\n window.removeEventListener('error', handleError);\n window.removeEventListener('unhandledrejection', handleUnhandledRejection);\n };\n }, [analytics]);\n}\n\n/**\n * 自动追踪用户行为(综合 Hook)\n */\nexport function useAutoTracking(\n analytics: Analytics | null,\n options: {\n trackPageView?: boolean;\n trackPageDuration?: boolean;\n trackPerformance?: boolean;\n trackErrors?: boolean;\n } = {}\n) {\n const {\n trackPageView = true,\n trackPageDuration = true,\n trackPerformance = true,\n trackErrors = true,\n } = options;\n\n // 页面浏览\n useEffect(() => {\n if (trackPageView && analytics) {\n const url = typeof window !== 'undefined' ? window.location.href : '';\n const title = typeof document !== 'undefined' ? document.title : '';\n analytics.trackPageView(url, title);\n }\n }, [analytics, trackPageView]);\n\n // 页面停留时长\n const startTimeRef = useRef<number>(Date.now());\n useEffect(() => {\n if (!trackPageDuration || !analytics) return;\n\n startTimeRef.current = Date.now();\n\n return () => {\n const duration = Date.now() - startTimeRef.current;\n analytics.track(\n EventType.PAGE_LEAVE,\n 'page_leave',\n {\n duration,\n page_url: typeof window !== 'undefined' ? window.location.href : '',\n },\n EventPriority.NORMAL\n );\n };\n }, [analytics, trackPageDuration]);\n\n // 性能追踪\n useEffect(() => {\n if (!trackPerformance || !analytics || typeof window === 'undefined') return;\n\n const handleLoad = () => {\n if ('performance' in window && 'timing' in window.performance) {\n const timing = window.performance.timing as any;\n const loadTime = timing.loadEventEnd - timing.navigationStart;\n analytics.trackPerformance('page_load_time', loadTime, 'ms');\n }\n };\n\n window.addEventListener('load', handleLoad);\n return () => window.removeEventListener('load', handleLoad);\n }, [analytics, trackPerformance]);\n\n // 错误追踪\n useEffect(() => {\n if (!trackErrors || !analytics || typeof window === 'undefined') return;\n\n const handleError = (event: ErrorEvent) => {\n analytics.trackError(event.message, event.error?.stack, event.error?.name);\n };\n\n window.addEventListener('error', handleError);\n return () => window.removeEventListener('error', handleError);\n }, [analytics, trackErrors]);\n}\n","/**\n * Analytics 埋点分析模块\n *\n * 提供完整的事件追踪、用户行为分析、数据上报等功能\n *\n * 注意:此模块不包含平台特定的适配器(web/mobile/desktop/miniapp)\n * 如需使用平台适配器,请在项目中自行实现\n */\n\n// 核心类\nexport { Analytics } from './core/Analytics';\nexport { EventQueue } from './core/EventQueue';\nexport { Uploader } from './core/Uploader';\n\n// 类型定义\nexport * from './types';\n\n// 客户端工具(单例管理器 + 预设配置)\nexport * from './client';\n\n// 工具函数\nexport * from './utils/helpers';\nexport * from './utils/decorators';\nexport * from './utils/hooks';\n\n// 版本信息\nexport const ANALYTICS_VERSION = '1.0.0';\n\n"]}
|
|
@@ -0,0 +1,306 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* i18n 类型定义
|
|
3
|
+
*/
|
|
4
|
+
type Locale = 'zh-CN' | 'zh-TW' | 'en-US' | 'ja-JP';
|
|
5
|
+
type TranslationKey = string;
|
|
6
|
+
type TranslationValue = string | {
|
|
7
|
+
[key: string]: TranslationValue;
|
|
8
|
+
};
|
|
9
|
+
type Translations = {
|
|
10
|
+
[key: string]: TranslationValue;
|
|
11
|
+
};
|
|
12
|
+
type LocaleResources = {
|
|
13
|
+
[locale in Locale]?: Translations;
|
|
14
|
+
};
|
|
15
|
+
interface TranslateOptions {
|
|
16
|
+
defaultValue?: string;
|
|
17
|
+
count?: number;
|
|
18
|
+
context?: Record<string, any>;
|
|
19
|
+
}
|
|
20
|
+
type InterpolateFunction = (template: string, data: Record<string, any>) => string;
|
|
21
|
+
interface I18nConfig {
|
|
22
|
+
locale: Locale;
|
|
23
|
+
fallbackLocale?: Locale;
|
|
24
|
+
resources: LocaleResources;
|
|
25
|
+
interpolate?: InterpolateFunction;
|
|
26
|
+
}
|
|
27
|
+
interface I18nInstance {
|
|
28
|
+
locale: Locale;
|
|
29
|
+
t: (key: string, options?: TranslateOptions) => string;
|
|
30
|
+
setLocale: (locale: Locale) => void;
|
|
31
|
+
addResources: (locale: Locale, resources: Translations) => void;
|
|
32
|
+
getLocale: () => Locale;
|
|
33
|
+
}
|
|
34
|
+
interface I18nAdapter {
|
|
35
|
+
getSystemLocale: () => Locale;
|
|
36
|
+
saveLocale: (locale: Locale) => Promise<void>;
|
|
37
|
+
loadLocale: () => Promise<Locale | null>;
|
|
38
|
+
}
|
|
39
|
+
|
|
40
|
+
/**
|
|
41
|
+
* 轻量级 i18n 核心实现
|
|
42
|
+
* 支持:翻译、插值、复数、嵌套键、类型安全
|
|
43
|
+
*/
|
|
44
|
+
|
|
45
|
+
/**
|
|
46
|
+
* 创建 i18n 实例
|
|
47
|
+
*/
|
|
48
|
+
declare function createI18n(config: I18nConfig): I18nInstance;
|
|
49
|
+
/**
|
|
50
|
+
* 初始化全局 i18n
|
|
51
|
+
*/
|
|
52
|
+
declare function initI18n(config: I18nConfig): I18nInstance;
|
|
53
|
+
/**
|
|
54
|
+
* 获取全局 i18n 实例
|
|
55
|
+
*/
|
|
56
|
+
declare function getI18n(): I18nInstance;
|
|
57
|
+
/**
|
|
58
|
+
* 快捷翻译函数
|
|
59
|
+
*/
|
|
60
|
+
declare function t(key: string, options?: TranslateOptions): string;
|
|
61
|
+
|
|
62
|
+
/**
|
|
63
|
+
* React hooks for i18n
|
|
64
|
+
*/
|
|
65
|
+
|
|
66
|
+
/**
|
|
67
|
+
* useTranslation Hook
|
|
68
|
+
* React 组件中使用翻译
|
|
69
|
+
*/
|
|
70
|
+
declare function useTranslation(): {
|
|
71
|
+
t: (key: string, options?: TranslateOptions) => string;
|
|
72
|
+
locale: Locale;
|
|
73
|
+
setLocale: (newLocale: Locale) => void;
|
|
74
|
+
};
|
|
75
|
+
/**
|
|
76
|
+
* useLocale Hook
|
|
77
|
+
* 只获取和设置语言,不包含翻译函数
|
|
78
|
+
*/
|
|
79
|
+
declare function useLocale(): {
|
|
80
|
+
locale: Locale;
|
|
81
|
+
setLocale: (newLocale: Locale) => void;
|
|
82
|
+
};
|
|
83
|
+
|
|
84
|
+
/**
|
|
85
|
+
* 简体中文翻译
|
|
86
|
+
*/
|
|
87
|
+
declare const _default$1: {
|
|
88
|
+
readonly app: {
|
|
89
|
+
readonly name: "LyricNote";
|
|
90
|
+
readonly fullName: "LyricNote - 歌词笔记";
|
|
91
|
+
readonly icon: "🎵";
|
|
92
|
+
readonly description: "一个强大的歌词和笔记管理应用";
|
|
93
|
+
readonly author: "LyricNote Team";
|
|
94
|
+
readonly copyright: `\u00A9 ${number} LyricNote`;
|
|
95
|
+
readonly version: "1.0.0";
|
|
96
|
+
};
|
|
97
|
+
readonly titles: {
|
|
98
|
+
readonly main: "🎵 LyricNote";
|
|
99
|
+
readonly admin: "LyricNote 管理后台";
|
|
100
|
+
readonly withVersion: "LyricNote v1.0.0";
|
|
101
|
+
readonly welcome: "欢迎使用 LyricNote";
|
|
102
|
+
readonly about: "关于 LyricNote";
|
|
103
|
+
};
|
|
104
|
+
readonly common: {
|
|
105
|
+
readonly hello: "你好";
|
|
106
|
+
readonly welcome: "欢迎";
|
|
107
|
+
readonly confirm: "确认";
|
|
108
|
+
readonly cancel: "取消";
|
|
109
|
+
readonly save: "保存";
|
|
110
|
+
readonly delete: "删除";
|
|
111
|
+
readonly edit: "编辑";
|
|
112
|
+
readonly back: "返回";
|
|
113
|
+
readonly next: "下一步";
|
|
114
|
+
readonly submit: "提交";
|
|
115
|
+
readonly finish: "完成";
|
|
116
|
+
readonly loading: "加载中...";
|
|
117
|
+
readonly success: "操作成功";
|
|
118
|
+
readonly error: "操作失败";
|
|
119
|
+
readonly retry: "重试";
|
|
120
|
+
readonly empty: "暂无数据";
|
|
121
|
+
};
|
|
122
|
+
readonly nav: {
|
|
123
|
+
readonly home: "首页";
|
|
124
|
+
readonly lyrics: "歌词";
|
|
125
|
+
readonly create: "创作";
|
|
126
|
+
readonly collection: "收藏";
|
|
127
|
+
readonly profile: "我的";
|
|
128
|
+
readonly settings: "设置";
|
|
129
|
+
readonly history: "历史";
|
|
130
|
+
readonly logout: "退出登录";
|
|
131
|
+
};
|
|
132
|
+
readonly user: {
|
|
133
|
+
readonly login: "登录";
|
|
134
|
+
readonly register: "注册";
|
|
135
|
+
readonly username: "用户名";
|
|
136
|
+
readonly password: "密码";
|
|
137
|
+
readonly email: "邮箱";
|
|
138
|
+
readonly phone: "手机号";
|
|
139
|
+
readonly nickname: "昵称";
|
|
140
|
+
};
|
|
141
|
+
readonly pages: {
|
|
142
|
+
readonly home: {
|
|
143
|
+
readonly title: "首页";
|
|
144
|
+
readonly description: "一个强大的歌词和笔记管理应用";
|
|
145
|
+
};
|
|
146
|
+
readonly profile: {
|
|
147
|
+
readonly title: "个人中心";
|
|
148
|
+
readonly description: "管理您的个人信息和偏好设置";
|
|
149
|
+
};
|
|
150
|
+
readonly admin: {
|
|
151
|
+
readonly title: "LyricNote 管理后台";
|
|
152
|
+
readonly description: "系统管理和数据统计";
|
|
153
|
+
};
|
|
154
|
+
readonly login: {
|
|
155
|
+
readonly title: "登录";
|
|
156
|
+
readonly description: "登录到 LyricNote";
|
|
157
|
+
};
|
|
158
|
+
};
|
|
159
|
+
readonly validation: {
|
|
160
|
+
readonly required: "{{field}}不能为空";
|
|
161
|
+
readonly invalid_email: "邮箱格式不正确";
|
|
162
|
+
readonly password_too_short: "密码至少需要{{count}}个字符";
|
|
163
|
+
readonly password_weak: "密码强度不够";
|
|
164
|
+
readonly passwords_not_match: "两次密码不一致";
|
|
165
|
+
};
|
|
166
|
+
readonly status: {
|
|
167
|
+
readonly loading: "加载中...";
|
|
168
|
+
readonly success: "操作成功";
|
|
169
|
+
readonly error: "操作失败";
|
|
170
|
+
readonly empty: "暂无数据";
|
|
171
|
+
readonly network_error: "网络错误,请稍后重试";
|
|
172
|
+
};
|
|
173
|
+
readonly errors: {
|
|
174
|
+
readonly network: "网络错误,请稍后重试";
|
|
175
|
+
readonly server: "服务器错误";
|
|
176
|
+
readonly unauthorized: "未授权,请先登录";
|
|
177
|
+
readonly not_found: "未找到相关内容";
|
|
178
|
+
readonly unknown: "未知错误";
|
|
179
|
+
};
|
|
180
|
+
readonly success: {
|
|
181
|
+
readonly saved: "保存成功";
|
|
182
|
+
readonly deleted: "删除成功";
|
|
183
|
+
readonly updated: "更新成功";
|
|
184
|
+
readonly created: "创建成功";
|
|
185
|
+
};
|
|
186
|
+
readonly language: {
|
|
187
|
+
readonly label: "语言";
|
|
188
|
+
readonly zh_cn: "简体中文";
|
|
189
|
+
readonly zh_tw: "繁體中文";
|
|
190
|
+
readonly en_us: "English";
|
|
191
|
+
readonly ja_jp: "日本語";
|
|
192
|
+
};
|
|
193
|
+
};
|
|
194
|
+
|
|
195
|
+
/**
|
|
196
|
+
* English translations
|
|
197
|
+
*/
|
|
198
|
+
declare const _default: {
|
|
199
|
+
readonly app: {
|
|
200
|
+
readonly name: "LyricNote";
|
|
201
|
+
readonly fullName: "LyricNote - Lyrics & Notes";
|
|
202
|
+
readonly icon: "🎵";
|
|
203
|
+
readonly description: "A powerful lyrics and notes management app";
|
|
204
|
+
readonly author: "LyricNote Team";
|
|
205
|
+
readonly copyright: `\u00A9 ${number} LyricNote`;
|
|
206
|
+
readonly version: "1.0.0";
|
|
207
|
+
};
|
|
208
|
+
readonly titles: {
|
|
209
|
+
readonly main: "🎵 LyricNote";
|
|
210
|
+
readonly admin: "LyricNote Admin";
|
|
211
|
+
readonly withVersion: "LyricNote v1.0.0";
|
|
212
|
+
readonly welcome: "Welcome to LyricNote";
|
|
213
|
+
readonly about: "About LyricNote";
|
|
214
|
+
};
|
|
215
|
+
readonly common: {
|
|
216
|
+
readonly hello: "Hello";
|
|
217
|
+
readonly welcome: "Welcome";
|
|
218
|
+
readonly confirm: "Confirm";
|
|
219
|
+
readonly cancel: "Cancel";
|
|
220
|
+
readonly save: "Save";
|
|
221
|
+
readonly delete: "Delete";
|
|
222
|
+
readonly edit: "Edit";
|
|
223
|
+
readonly back: "Back";
|
|
224
|
+
readonly next: "Next";
|
|
225
|
+
readonly submit: "Submit";
|
|
226
|
+
readonly finish: "Finish";
|
|
227
|
+
readonly loading: "Loading...";
|
|
228
|
+
readonly success: "Success";
|
|
229
|
+
readonly error: "Error";
|
|
230
|
+
readonly retry: "Retry";
|
|
231
|
+
readonly empty: "No data";
|
|
232
|
+
};
|
|
233
|
+
readonly nav: {
|
|
234
|
+
readonly home: "Home";
|
|
235
|
+
readonly lyrics: "Lyrics";
|
|
236
|
+
readonly create: "Create";
|
|
237
|
+
readonly collection: "Collection";
|
|
238
|
+
readonly profile: "Profile";
|
|
239
|
+
readonly settings: "Settings";
|
|
240
|
+
readonly history: "History";
|
|
241
|
+
readonly logout: "Logout";
|
|
242
|
+
};
|
|
243
|
+
readonly user: {
|
|
244
|
+
readonly login: "Login";
|
|
245
|
+
readonly register: "Register";
|
|
246
|
+
readonly username: "Username";
|
|
247
|
+
readonly password: "Password";
|
|
248
|
+
readonly email: "Email";
|
|
249
|
+
readonly phone: "Phone";
|
|
250
|
+
readonly nickname: "Nickname";
|
|
251
|
+
};
|
|
252
|
+
readonly pages: {
|
|
253
|
+
readonly home: {
|
|
254
|
+
readonly title: "Home";
|
|
255
|
+
readonly description: "A powerful lyrics and notes management app";
|
|
256
|
+
};
|
|
257
|
+
readonly profile: {
|
|
258
|
+
readonly title: "Profile";
|
|
259
|
+
readonly description: "Manage your personal information and preferences";
|
|
260
|
+
};
|
|
261
|
+
readonly admin: {
|
|
262
|
+
readonly title: "LyricNote Admin";
|
|
263
|
+
readonly description: "System management and data statistics";
|
|
264
|
+
};
|
|
265
|
+
readonly login: {
|
|
266
|
+
readonly title: "Login";
|
|
267
|
+
readonly description: "Login to LyricNote";
|
|
268
|
+
};
|
|
269
|
+
};
|
|
270
|
+
readonly validation: {
|
|
271
|
+
readonly required: "{{field}} is required";
|
|
272
|
+
readonly invalid_email: "Invalid email format";
|
|
273
|
+
readonly password_too_short: "Password must be at least {{count}} characters";
|
|
274
|
+
readonly password_weak: "Password is too weak";
|
|
275
|
+
readonly passwords_not_match: "Passwords do not match";
|
|
276
|
+
};
|
|
277
|
+
readonly status: {
|
|
278
|
+
readonly loading: "Loading...";
|
|
279
|
+
readonly success: "Success";
|
|
280
|
+
readonly error: "Error";
|
|
281
|
+
readonly empty: "No data";
|
|
282
|
+
readonly network_error: "Network error, please try again later";
|
|
283
|
+
};
|
|
284
|
+
readonly errors: {
|
|
285
|
+
readonly network: "Network error, please try again later";
|
|
286
|
+
readonly server: "Server error";
|
|
287
|
+
readonly unauthorized: "Unauthorized, please login first";
|
|
288
|
+
readonly not_found: "Not found";
|
|
289
|
+
readonly unknown: "Unknown error";
|
|
290
|
+
};
|
|
291
|
+
readonly success: {
|
|
292
|
+
readonly saved: "Saved successfully";
|
|
293
|
+
readonly deleted: "Deleted successfully";
|
|
294
|
+
readonly updated: "Updated successfully";
|
|
295
|
+
readonly created: "Created successfully";
|
|
296
|
+
};
|
|
297
|
+
readonly language: {
|
|
298
|
+
readonly label: "Language";
|
|
299
|
+
readonly zh_cn: "简体中文";
|
|
300
|
+
readonly zh_tw: "繁體中文";
|
|
301
|
+
readonly en_us: "English";
|
|
302
|
+
readonly ja_jp: "日本語";
|
|
303
|
+
};
|
|
304
|
+
};
|
|
305
|
+
|
|
306
|
+
export { type I18nAdapter, type I18nConfig, type I18nInstance, type Locale, type LocaleResources, type TranslateOptions, type TranslationKey, type TranslationValue, type Translations, createI18n, _default as enUS, getI18n, initI18n, t, useLocale, useTranslation, _default$1 as zhCN };
|