@plyaz/core 1.5.21 → 1.6.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/domain/base/BaseFrontendDomainService.d.ts +21 -0
- package/dist/domain/base/BaseFrontendDomainService.d.ts.map +1 -1
- package/dist/domain/example/FrontendExampleDomainService.d.ts.map +1 -1
- package/dist/entry-backend.js +50 -11
- package/dist/entry-backend.js.map +1 -1
- package/dist/entry-backend.mjs +50 -11
- package/dist/entry-backend.mjs.map +1 -1
- package/dist/entry-frontend-browser.js +50 -11
- package/dist/entry-frontend-browser.js.map +1 -1
- package/dist/entry-frontend-browser.mjs +50 -11
- package/dist/entry-frontend-browser.mjs.map +1 -1
- package/dist/entry-frontend.js +50 -11
- package/dist/entry-frontend.js.map +1 -1
- package/dist/entry-frontend.mjs +50 -11
- package/dist/entry-frontend.mjs.map +1 -1
- package/dist/index.js +50 -11
- package/dist/index.js.map +1 -1
- package/dist/index.mjs +50 -11
- package/dist/index.mjs.map +1 -1
- package/package.json +5 -5
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/base/cache/strategies/redis.ts","../src/utils/common/hash.ts","../src/utils/common/id.ts","../src/utils/common/values.ts","../src/events/CoreEventManager.ts","../src/services/ApiClientService.ts","../src/base/observability/BaseAdapter.ts","../src/base/observability/LoggerAdapter.ts","../src/base/observability/ObservabilityService.ts","../src/config/dependencies.ts","../src/init/ServiceRegistry.ts","../src/utils/runtime.ts","../src/init/CoreInitializer.ts","../src/domain/base/BaseDomainService.ts","../src/domain/base/BaseFrontendDomainService.ts","../src/domain/base/BaseMapper.ts","../src/domain/base/BaseValidator.ts","../src/utils/mapperUtils.ts","../src/frontend/components/InitializationError.tsx","../src/frontend/components/InitializationLoading.tsx","../src/base/cache/strategies/memory.ts","../src/base/cache/index.ts","../src/domain/example/mappers/ExampleMapper.ts","../src/domain/example/FrontendExampleDomainService.ts","../src/utils/featureFlags/context.ts","../src/utils/featureFlags/conditions.ts","../src/engine/featureFlags/engine.ts","../src/domain/featureFlags/provider.ts","../src/domain/featureFlags/providers/api.ts","../src/domain/featureFlags/FrontendFeatureFlagDomainService.ts","../src/frontend/providers/ApiProvider.tsx","../src/frontend/providers/PlyazProvider.tsx","../src/frontend/store/service-accessors.ts","../src/frontend/store/feature-flags.ts"],"names":["CorePackageError","ERROR_CODES","PackageLogger","logger","BACKEND_RUNTIMES","FRONTEND_RUNTIMES","CORE_EVENTS","createApiClient","setDefaultApiClient","STORE_KEYS","BaseError","OBSERVABILITY_METRICS","API_ERROR_CODES","HTTP_STATUS","jsx","Fragment","TIME_CONSTANTS","RedisCacheStrategy","apiEvaluateAllFlags","apiCreateFlag","apiUpdateFlag","apiDeleteFlag","apiFetchRules","SERVICE_KEYS","error","jsxs","useState","useEffect","ApiProvider"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA,IAAA,aAAA,GAAA,EAAA;AAAA,QAAA,CAAA,aAAA,EAAA;AAAA,EAAA,kBAAA,EAAA,MAAA;AAAA,CAAA,CAAA;AAAA,IAkCa,kBAAA;AAlCb,IAAA,UAAA,GAAA,KAAA,CAAA;AAAA,EAAA,oCAAA,GAAA;AAkCO,IAAM,qBAAN,MAAkD;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,MAgBvD,YAAoB,MAAA,EAA0B;AAA1B,QAAA,IAAA,CAAA,MAAA,GAAA,MAAA;AAdpB,QAAA,IAAA,CAAQ,KAAA,GAAQ;AAAA,UACd,QAAA,EAAU,CAAA;AAAA,UACV,SAAA,EAAW,CAAA;AAAA,UACX,QAAA,EAAU,CAAA;AAAA,UACV,WAAA,EAAa;AAAA,SACf;AACA,QAAA,IAAA,CAAQ,WAAA,GAAc,KAAA;AASpB,QAAA,IAAI,CAAC,OAAO,GAAA,EAAK;AACf,UAAA,MAAM,IAAIA,gBAAAA,CAAiB,uBAAA,EAAyBC,WAAAA,CAAY,qBAAqB,CAAA;AAAA,QACvF;AACA,QAAA,IAAA,CAAK,SAAA,GAAY,OAAO,SAAA,IAAa,QAAA;AAAA,MACvC;AAAA,MAvDF;AAkCyD,QAAA,MAAA,CAAA,IAAA,EAAA,oBAAA,CAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,MA8BvD,MAAM,GAAA,CAAO,GAAA,EAAa,KAAA,EAAqC;AAC7D,QAAA,MAAM,KAAK,eAAA,EAAgB;AAE3B,QAAA,MAAM,QAAA,GAAW,IAAA,CAAK,aAAA,CAAc,GAAG,CAAA;AACvC,QAAA,MAAM,eAAA,GAAkB,IAAA,CAAK,SAAA,CAAU,KAAK,CAAA;AAG5C,QAAA,MAAM,KAAA,GAAQ,KAAA,CAAM,SAAA,GAAY,IAAA,CAAK,GAAA,EAAI;AACzC,QAAA,MAAM,UAAA,GAAa,KAAK,GAAA,CAAI,CAAA,EAAG,KAAK,IAAA,CAAK,KAAA,GAAQ,cAAA,CAAe,uBAAuB,CAAC,CAAA;AAExF,QAAA,MAAM,KAAK,MAAA,CAAO,GAAA,CAAI,QAAA,EAAU,eAAA,EAAiB,MAAM,UAAU,CAAA;AACjE,QAAA,IAAA,CAAK,KAAA,CAAM,QAAA,EAAA;AAAA,MACb;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,MAQA,MAAM,IAAO,GAAA,EAA4C;AACvD,QAAA,MAAM,KAAK,eAAA,EAAgB;AAE3B,QAAA,MAAM,QAAA,GAAW,IAAA,CAAK,aAAA,CAAc,GAAG,CAAA;AACvC,QAAA,MAAM,eAAA,GAAkB,MAAM,IAAA,CAAK,MAAA,CAAO,IAAI,QAAQ,CAAA;AAEtD,QAAA,IAAI,CAAC,eAAA,IAAmB,OAAO,eAAA,KAAoB,QAAA,EAAU;AAC3D,UAAA,IAAA,CAAK,KAAA,CAAM,SAAA,EAAA;AACX,UAAA,OAAO,IAAA;AAAA,QACT;AAEA,QAAA,IAAI;AACF,UAAA,MAAM,KAAA,GAAQ,IAAA,CAAK,KAAA,CAAM,eAAe,CAAA;AACxC,UAAA,IAAA,CAAK,KAAA,CAAM,QAAA,EAAA;AACX,UAAA,OAAO,KAAA;AAAA,QACT,CAAA,CAAA,MAAQ;AAEN,UAAA,MAAM,IAAA,CAAK,MAAA,CAAO,GAAA,CAAI,QAAQ,CAAA;AAC9B,UAAA,IAAA,CAAK,KAAA,CAAM,SAAA,EAAA;AACX,UAAA,OAAO,IAAA;AAAA,QACT;AAAA,MACF;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,MAQA,MAAM,OAAO,GAAA,EAA4B;AACvC,QAAA,MAAM,KAAK,eAAA,EAAgB;AAE3B,QAAA,MAAM,QAAA,GAAW,IAAA,CAAK,aAAA,CAAc,GAAG,CAAA;AACvC,QAAA,MAAM,IAAA,CAAK,MAAA,CAAO,GAAA,CAAI,QAAQ,CAAA;AAC9B,QAAA,IAAA,CAAK,KAAA,CAAM,WAAA,EAAA;AAAA,MACb;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,MAQA,MAAM,KAAA,GAAuB;AAC3B,QAAA,MAAM,KAAK,eAAA,EAAgB;AAE3B,QAAA,MAAM,OAAA,GAAU,CAAA,EAAG,IAAA,CAAK,SAAS,CAAA,CAAA,CAAA;AAEjC,QAAA,MAAM,IAAA,GAAO,MAAM,IAAA,CAAK,MAAA,CAAO,KAAK,OAAO,CAAA;AAC3C,QAAA,IAAI,IAAA,CAAK,SAAS,CAAA,EAAG;AACnB,UAAA,MAAM,IAAA,CAAK,MAAA,CAAO,GAAA,CAAI,GAAG,IAAI,CAAA;AAAA,QAC/B;AAEA,QAAA,IAAA,CAAK,MAAM,QAAA,GAAW,CAAA;AACtB,QAAA,IAAA,CAAK,MAAM,SAAA,GAAY,CAAA;AAAA,MACzB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,MAOA,MAAM,QAAA,GAAgC;AACpC,QAAA,MAAM,KAAK,eAAA,EAAgB;AAG3B,QAAA,MAAM,OAAA,GAAU,CAAA,EAAG,IAAA,CAAK,SAAS,CAAA,CAAA,CAAA;AACjC,QAAA,MAAM,IAAA,GAAO,MAAM,IAAA,CAAK,MAAA,CAAO,KAAK,OAAO,CAAA;AAC3C,QAAA,MAAM,aAAa,KAAA,CAAM,OAAA,CAAQ,IAAI,CAAA,GAAI,KAAK,MAAA,GAAS,CAAA;AAEvD,QAAA,MAAM,aAAA,GAAgB,IAAA,CAAK,KAAA,CAAM,QAAA,GAAW,KAAK,KAAA,CAAM,SAAA;AACvD,QAAA,MAAM,WAAW,aAAA,GAAgB,CAAA,GAAI,IAAA,CAAK,KAAA,CAAM,WAAW,aAAA,GAAgB,CAAA;AAE3E,QAAA,OAAO;AAAA,UACL,IAAA,EAAM,KAAK,KAAA,CAAM,QAAA;AAAA,UACjB,MAAA,EAAQ,KAAK,KAAA,CAAM,SAAA;AAAA,UACnB,IAAA,EAAM,KAAK,KAAA,CAAM,QAAA;AAAA,UACjB,OAAA,EAAS,KAAK,KAAA,CAAM,WAAA;AAAA,UACpB,IAAA,EAAM,UAAA;AAAA,UACN;AAAA,SACF;AAAA,MACF;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,MAOA,MAAM,OAAA,GAAyB;AAC7B,QAAA,IAAI,IAAA,CAAK,MAAA,IAAU,IAAA,CAAK,WAAA,EAAa;AACnC,UAAA,MAAM,IAAA,CAAK,OAAO,IAAA,EAAK;AACvB,UAAA,IAAA,CAAK,WAAA,GAAc,KAAA;AAAA,QACrB;AAAA,MACF;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,MAQA,MAAc,eAAA,GAAiC;AAC7C,QAAA,IAAI,KAAK,WAAA,EAAa;AAEtB,QAAA,IAAI;AACF,UAAA,IAAA,CAAK,MAAA,GAAS,MAAM,IAAA,CAAK,mBAAA,EAAoB;AAC7C,UAAA,IAAA,CAAK,WAAA,GAAc,IAAA;AAAA,QACrB,SAAS,KAAA,EAAO;AACd,UAAA,MAAM,IAAID,gBAAAA;AAAA,YACR,CAAA,4BAAA,EAA+B,KAAA,YAAiB,KAAA,GAAQ,KAAA,CAAM,UAAU,eAAe,CAAA,CAAA;AAAA,YACvFC,WAAAA,CAAY;AAAA,WACd;AAAA,QACF;AAAA,MACF;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,MAQA,MAAc,mBAAA,GAAkD;AAC9D,QAAA,MAAM,eAAA,GAAkB,GAAA;AACxB,QAAA,MAAM,cAAA,GAAiB;AAAA,UACrB,cAAA,EAAgB,eAAA;AAAA,UAChB,cAAA,EAAgB,eAAA;AAAA,UAChB,kBAAA,EAAoB;AAAA,SACtB;AAMA,QAAA,MAAM,KAAA,GAAQ,MAAM,OAAO,SAAS,CAAA;AACpC,QAAA,MAAM,SAAS,IAAI,KAAA,CAAM,OAAA,CAAQ,IAAA,CAAK,OAAO,GAAA,EAAK;AAAA,UAChD,cAAA,EAAgB,IAAA,CAAK,MAAA,CAAO,cAAA,IAAkB,cAAA,CAAe,cAAA;AAAA,UAC7D,cAAA,EAAgB,IAAA,CAAK,MAAA,CAAO,cAAA,IAAkB,cAAA,CAAe,cAAA;AAAA,UAC7D,oBAAoB,cAAA,CAAe;AAAA,SACpC,CAAA;AAGD,QAAA,MAAM,IAAI,OAAA,CAAQ,CAAC,OAAA,EAAS,MAAA,KAAW;AACrC,UAAA,MAAA,CAAO,EAAA,CAAG,SAAS,OAAO,CAAA;AAC1B,UAAA,MAAA,CAAO,EAAA,CAAG,SAAS,MAAM,CAAA;AAAA,QAC3B,CAAC,CAAA;AAED,QAAA,OAAO,MAAA;AAAA,MACT;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,MASQ,cAAc,GAAA,EAAqB;AACzC,QAAA,OAAO,CAAA,EAAG,IAAA,CAAK,SAAS,CAAA,EAAG,GAAG,CAAA,CAAA;AAAA,MAChC;AAAA,KACF;AAAA,EAAA;AAAA,CAAA,CAAA;AClNO,SAAS,WAAW,GAAA,EAAqB;AAE9C,EAAA,IAAI,GAAA,CAAI,MAAA,KAAW,CAAA,EAAG,OAAO,CAAA;AAG7B,EAAA,IAAI,OAAe,aAAA,CAAc,aAAA;AAIjC,EAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,GAAA,CAAI,QAAQ,CAAA,EAAA,EAAK;AAGnC,IAAA,IAAA,IAAQ,GAAA,CAAI,WAAW,CAAC,CAAA;AACxB,IAAA,IAAA,GAAO,IAAA,CAAK,IAAA,CAAK,IAAA,EAAM,aAAA,CAAc,YAAY,CAAA,KAAM,CAAA;AAAA,EACzD;AAIA,EAAA,OAAO,IAAA,KAAS,CAAA;AAClB;AAnBgB,MAAA,CAAA,UAAA,EAAA,YAAA,CAAA;AAkCT,SAAS,WAAA,CAAY,YAAoB,UAAA,EAA6B;AAC3E,EAAA,IAAI,UAAA,IAAc,cAAA,CAAe,cAAA,EAAgB,OAAO,IAAA;AACxD,EAAA,IAAI,UAAA,IAAc,GAAG,OAAO,KAAA;AAE5B,EAAA,MAAM,IAAA,GAAO,WAAW,UAAU,CAAA;AAClC,EAAA,OAAO,IAAA,GAAO,eAAe,cAAA,GAAiB,UAAA;AAChD;AANgB,MAAA,CAAA,WAAA,EAAA,aAAA,CAAA;AAqBT,SAAS,uBAAA,CAAwB,YAAoB,MAAA,EAAyB;AACnF,EAAA,MAAM,aAAA,GAAgB,QAAQ,IAAA,EAAK;AACnC,EAAA,MAAM,eAAA,GAAkB,aAAA,IAAiB,aAAA,CAAc,MAAA,GAAS,IAAI,aAAA,GAAgB,WAAA;AACpF,EAAA,OAAO,CAAA,EAAG,UAAU,CAAA,CAAA,EAAI,eAAe,CAAA,CAAA;AACzC;AAJgB,MAAA,CAAA,uBAAA,EAAA,yBAAA,CAAA;;;AC9EhB,IAAM,eAAA,GAAkB,EAAA;AACxB,IAAM,qBAAA,GAAwB,CAAA;AAC9B,IAAM,eAAA,GAAkB,CAAA;AACxB,IAAM,SAAA,GAAY,EAAA;AAClB,IAAM,eAAA,GAAkB,CAAA;AACxB,IAAM,aAAA,GAAgB,EAAA;AACtB,IAAM,cAAA,GAAiB,EAAA;AAmChB,SAAS,eAAA,GAA0B;AACxC,EAAA,MAAM,YAAY,UAAA,CAAW,MAAA;AAC7B,EAAA,IAAI,WAAW,UAAA,EAAY;AACzB,IAAA,OAAO,SAAA,CAAU,YAAW,CAAE,OAAA,CAAQ,MAAM,EAAE,CAAA,CAAE,KAAA,CAAM,CAAA,EAAG,eAAe,CAAA;AAAA,EAC1E;AACA,EAAA,OAAO,IAAA,CAAK,QAAO,CAChB,QAAA,CAAS,eAAe,CAAA,CACxB,KAAA,CAAM,qBAAA,EAAuB,qBAAA,GAAwB,eAAe,CAAA;AACzE;AARgB,MAAA,CAAA,eAAA,EAAA,iBAAA,CAAA;AAsBT,SAAS,qBAAA,GAAgC;AAC9C,EAAA,OAAO,GAAG,IAAA,CAAK,GAAA,EAAK,CAAA,CAAA,EAAI,iBAAiB,CAAA,CAAA;AAC3C;AAFgB,MAAA,CAAA,qBAAA,EAAA,uBAAA,CAAA;AAeT,SAAS,eAAA,GAA0B;AACxC,EAAA,MAAM,YAAY,UAAA,CAAW,MAAA;AAC7B,EAAA,IAAI,WAAW,UAAA,EAAY;AAEzB,IAAA,OAAO,SAAA,CAAU,UAAA,EAAW,CAAE,OAAA,CAAQ,MAAM,EAAE,CAAA;AAAA,EAChD;AAEA,EAAA,OACE,KAAK,MAAA,EAAO,CAAE,SAAS,SAAS,CAAA,CAAE,UAAU,eAAA,EAAiB,aAAa,CAAA,GAC1E,IAAA,CAAK,QAAO,CAAE,QAAA,CAAS,SAAS,CAAA,CAAE,SAAA,CAAU,iBAAiB,aAAa,CAAA;AAE9E;AAXgB,MAAA,CAAA,eAAA,EAAA,iBAAA,CAAA;AAwBT,SAAS,cAAA,GAAyB;AACvC,EAAA,MAAM,YAAY,UAAA,CAAW,MAAA;AAC7B,EAAA,IAAI,WAAW,UAAA,EAAY;AAEzB,IAAA,OAAO,SAAA,CAAU,YAAW,CAAE,OAAA,CAAQ,MAAM,EAAE,CAAA,CAAE,SAAA,CAAU,CAAA,EAAG,cAAc,CAAA;AAAA,EAC7E;AAEA,EAAA,OAAO,IAAA,CAAK,QAAO,CAAE,QAAA,CAAS,SAAS,CAAA,CAAE,SAAA,CAAU,iBAAiB,aAAa,CAAA;AACnF;AARgB,MAAA,CAAA,cAAA,EAAA,gBAAA,CAAA;ACjFhB,SAAS,cAAc,KAAA,EAAwB;AAC7C,EAAA,IAAI,KAAA,KAAU,IAAI,OAAO,IAAA;AACzB,EAAA,MAAM,KAAA,GAAQ,KAAA,CAAM,WAAA,EAAY,CAAE,IAAA,EAAK;AACvC,EAAA,OAAO,CAAC,SAAS,IAAA,EAAM,GAAA,EAAK,OAAO,UAAU,CAAA,CAAE,SAAS,KAAK,CAAA;AAC/D;AAJS,MAAA,CAAA,aAAA,EAAA,eAAA,CAAA;AAOT,SAAS,eAAe,KAAA,EAAwB;AAC9C,EAAA,IAAI,MAAM,OAAA,CAAQ,KAAK,CAAA,EAAG,OAAO,MAAM,MAAA,GAAS,CAAA;AAChD,EAAA,IAAI,iBAAiB,GAAA,IAAO,KAAA,YAAiB,GAAA,EAAK,OAAO,MAAM,IAAA,GAAO,CAAA;AACtE,EAAA,IAAI,KAAA,CAAM,gBAAgB,MAAA,EAAQ,OAAO,OAAO,IAAA,CAAK,KAAK,EAAE,MAAA,GAAS,CAAA;AACrE,EAAA,OAAO,IAAA;AACT;AALS,MAAA,CAAA,cAAA,EAAA,gBAAA,CAAA;AAOF,SAAS,SAAS,KAAA,EAAyB;AAChD,EAAA,IAAI,KAAA,KAAU,IAAA,IAAQ,KAAA,KAAU,MAAA,EAAW,OAAO,KAAA;AAElD,EAAA,QAAQ,OAAO,KAAA;AAAO,IACpB,KAAK,SAAA;AACH,MAAA,OAAO,KAAA;AAAA,IACT,KAAK,QAAA;AACH,MAAA,OAAO,CAAC,cAAc,KAAK,CAAA;AAAA,IAC7B,KAAK,QAAA;AACH,MAAA,OAAO,KAAA,KAAU,CAAA,IAAK,CAAC,KAAA,CAAM,KAAK,CAAA;AAAA,IACpC,KAAK,UAAA;AAAA,IACL,KAAK,QAAA;AACH,MAAA,OAAO,IAAA;AAAA,IACT,KAAK,QAAA;AACH,MAAA,OAAO,eAAe,KAAK,CAAA;AAAA,IAC7B;AACE,MAAA,OAAO,KAAA;AAAA;AAEb;AAlBgB,MAAA,CAAA,QAAA,EAAA,UAAA,CAAA;;;ACmBhB,IAAM,mBAAA,GAAsB,GAAA;AAE5B,IAAM,wBAAN,MAA4B;AAAA,EAI1B,WAAA,GAAc;AAHd,IAAA,IAAA,CAAQ,OAAA,GAAU,IAAI,YAAA,EAAa;AACnC,IAAA,IAAA,CAAQ,aAAA,uBAAoB,GAAA,EAA8D;AAIxF,IAAA,IAAA,CAAK,OAAA,CAAQ,gBAAgB,mBAAmB,CAAA;AAAA,EAClD;AAAA,EAzEF;AAkE4B,IAAA,MAAA,CAAA,IAAA,EAAA,uBAAA,CAAA;AAAA;AAAA,EA0B1B,IAAA,CAAsB,WAAmB,IAAA,EAAuB;AAC9D,IAAA,MAAM,CAAC,KAAK,CAAA,GAAI,SAAA,CAAU,MAAM,GAAG,CAAA;AACnC,IAAA,MAAM,KAAA,GAAkC;AAAA,MACtC,IAAA,EAAM,SAAA;AAAA,MACN,OAAO,KAAA,IAAS,QAAA;AAAA,MAChB,SAAA,EAAW,KAAK,GAAA,EAAI;AAAA,MACpB,aAAA,EAAe,KAAK,gBAAA,EAAiB;AAAA,MACrC;AAAA,KACF;AAGA,IAAA,IAAA,CAAK,OAAA,CAAQ,IAAA,CAAK,SAAA,EAAW,KAAK,CAAA;AAGlC,IAAA,IAAA,CAAK,OAAA,CAAQ,IAAA,CAAK,GAAA,EAAK,KAAK,CAAA;AAE5B,IAAA,OAAO,IAAA;AAAA,EACT;AAAA,EA8BA,EAAA,CACE,WACA,OAAA,EACY;AACZ,IAAA,IAAA,CAAK,OAAA,CAAQ,EAAA,CAAG,SAAA,EAAW,OAAsD,CAAA;AAGjF,IAAA,IAAI,CAAC,IAAA,CAAK,aAAA,CAAc,GAAA,CAAI,SAAS,CAAA,EAAG;AACtC,MAAA,IAAA,CAAK,aAAA,CAAc,GAAA,CAAI,SAAA,kBAAW,IAAI,KAAK,CAAA;AAAA,IAC7C;AACA,IAAA,IAAA,CAAK,aAAA,CAAc,GAAA,CAAI,SAAS,CAAA,CAAG,IAAI,OAAsD,CAAA;AAG7F,IAAA,OAAO,MAAM;AACX,MAAA,IAAA,CAAK,OAAA,CAAQ,GAAA,CAAI,SAAA,EAAW,OAAsD,CAAA;AAClF,MAAA,IAAA,CAAK,aAAA,CACF,GAAA,CAAI,SAAS,CAAA,EACZ,OAAO,OAAsD,CAAA;AAAA,IACnE,CAAA;AAAA,EACF;AAAA,EAiBA,IAAA,CACE,WACA,OAAA,EACY;AACZ,IAAA,MAAM,cAAA,2BAAkB,KAAA,KAA0C;AAChE,MAAA,OAAA,CAAQ,KAAK,CAAA;AACb,MAAA,IAAA,CAAK,OAAA,CAAQ,GAAA,CAAI,SAAA,EAAW,cAA6D,CAAA;AACzF,MAAA,IAAA,CAAK,aAAA,CACF,GAAA,CAAI,SAAS,CAAA,EACZ,OAAO,cAA6D,CAAA;AAAA,IAC1E,CAAA,EANuB,gBAAA,CAAA;AAQvB,IAAA,IAAA,CAAK,OAAA,CAAQ,EAAA,CAAG,SAAA,EAAW,cAA6D,CAAA;AAGxF,IAAA,IAAI,CAAC,IAAA,CAAK,aAAA,CAAc,GAAA,CAAI,SAAS,CAAA,EAAG;AACtC,MAAA,IAAA,CAAK,aAAA,CAAc,GAAA,CAAI,SAAA,kBAAW,IAAI,KAAK,CAAA;AAAA,IAC7C;AACA,IAAA,IAAA,CAAK,aAAA,CACF,GAAA,CAAI,SAAS,CAAA,CACb,IAAI,cAA6D,CAAA;AAGpE,IAAA,OAAO,MAAM;AACX,MAAA,IAAA,CAAK,OAAA,CAAQ,GAAA,CAAI,SAAA,EAAW,cAA6D,CAAA;AACzF,MAAA,IAAA,CAAK,aAAA,CACF,GAAA,CAAI,SAAS,CAAA,EACZ,OAAO,cAA6D,CAAA;AAAA,IAC1E,CAAA;AAAA,EACF;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAiBA,OAAA,CACE,OACA,OAAA,EACY;AACZ,IAAA,MAAM,cAAA,2BAAkB,KAAA,KAA0C;AAChE,MAAA,IAAI,KAAA,CAAM,UAAU,KAAA,EAAO;AACzB,QAAA,OAAA,CAAQ,KAAK,CAAA;AAAA,MACf;AAAA,IACF,CAAA,EAJuB,gBAAA,CAAA;AAKvB,IAAA,OAAO,IAAA,CAAK,EAAA,CAAG,GAAA,EAAK,cAA6D,CAAA;AAAA,EACnF;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAQA,GAAA,CACE,WACA,OAAA,EACM;AACN,IAAA,IAAA,CAAK,OAAA,CAAQ,GAAA,CAAI,SAAA,EAAW,OAAsD,CAAA;AAClF,IAAA,IAAA,CAAK,aAAA,CACF,GAAA,CAAI,SAAS,CAAA,EACZ,OAAO,OAAsD,CAAA;AAAA,EACnE;AAAA;AAAA;AAAA;AAAA,EAKA,OAAA,GAAgB;AACd,IAAA,IAAA,CAAK,aAAA,CAAc,OAAA,CAAQ,CAAC,QAAA,EAAU,SAAA,KAAc;AAClD,MAAA,QAAA,CAAS,QAAQ,CAAA,OAAA,KAAW,IAAA,CAAK,QAAQ,GAAA,CAAI,SAAA,EAAW,OAAO,CAAC,CAAA;AAAA,IAClE,CAAC,CAAA;AACD,IAAA,IAAA,CAAK,cAAc,KAAA,EAAM;AACzB,IAAA,IAAA,CAAK,QAAQ,kBAAA,EAAmB;AAAA,EAClC;AAAA;AAAA;AAAA;AAAA,EAKQ,gBAAA,GAA2B;AACjC,IAAA,OAAO,qBAAA,EAAsB;AAAA,EAC/B;AACF,CAAA;AAGO,IAAM,gBAAA,GAAmB,IAAI,qBAAA;ACtOpC,IAAM,6BAAA,GAAgC,CAAA;AA6BtC,SAAS,wBAAwB,GAAA,EAA0D;AACzF,EAAA,QAAQ,GAAA;AAAK,IACX,KAAK,YAAA;AACH,MAAA,OAAO,iBAAA;AAAA,IACT,KAAK,SAAA;AACH,MAAA,OAAO,cAAA;AAAA,IACT,KAAK,aAAA;AAAA,IACL,KAAK,MAAA;AAAA,IACL;AACE,MAAA,OAAO,kBAAA;AAAA;AAEb;AAXS,MAAA,CAAA,uBAAA,EAAA,yBAAA,CAAA;AAkCT,SAAS,eAAA,CAAgB,cAAgC,MAAA,EAAwB;AAC/E,EAAA,IAAI,CAAC,aAAa,OAAA,EAAS;AACzB,IAAA,MAAA,CAAO,KAAK,gEAAgE,CAAA;AAAA,EAC9E;AACF;AAJS,MAAA,CAAA,eAAA,EAAA,iBAAA,CAAA;AAuCT,SAAS,4BAAA,CACP,YAAA,EACA,MAAA,EACA,QAAA,EACM;AACN,EAAA,IAAI,YAAA,CAAa,YAAY,OAAA,EAAS;AACpC,IAAA,IAAI,CAAC,YAAA,CAAa,UAAA,EAAY,GAAA,EAAK;AACjC,MAAA,MAAA,CAAO,IAAA;AAAA,QACL;AAAA,OAEF;AAAA,IACF;AAAA,EACF,CAAA,MAAO;AACL,IAAA,QAAA,CAAS,IAAA;AAAA,MACP;AAAA,KAEF;AAAA,EACF;AACF;AAlBS,MAAA,CAAA,4BAAA,EAAA,8BAAA,CAAA;AA+CT,SAAS,6BAAA,CAA8B,cAAgC,QAAA,EAA0B;AAC/F,EAAA,IAAI,CAAC,YAAA,CAAa,YAAA,EAAc,OAAA,EAAS;AACvC,IAAA,QAAA,CAAS,IAAA;AAAA,MACP;AAAA,KAEF;AAAA,EACF;AAEA,EAAA,IAAI,CAAC,YAAA,CAAa,QAAA,EAAU,SAAA,EAAW;AACrC,IAAA,QAAA,CAAS,IAAA;AAAA,MACP;AAAA,KAEF;AAAA,EACF;AAEA,EAAA,IACE,YAAA,CAAa,SACb,YAAA,CAAa,KAAA,CAAM,aAAa,MAAA,IAChC,YAAA,CAAa,KAAA,CAAM,QAAA,GAAW,6BAAA,EAC9B;AACA,IAAA,QAAA,CAAS,IAAA;AAAA,MACP,CAAA,2BAAA,EAA8B,YAAA,CAAa,KAAA,CAAM,QAAQ,CAAA,4FAAA;AAAA,KAE3D;AAAA,EACF;AACF;AAzBS,MAAA,CAAA,6BAAA,EAAA,+BAAA,CAAA;AA6DT,SAAS,yBAAA,CACP,YAAA,EACA,MAAA,EACA,QAAA,EACM;AACN,EAAA,IAAI,YAAA,CAAa,YAAY,OAAA,EAAS;AACpC,IAAA,IAAI,CAAC,YAAA,CAAa,UAAA,EAAY,GAAA,EAAK;AACjC,MAAA,MAAA,CAAO,IAAA;AAAA,QACL;AAAA,OAEF;AAAA,IACF;AAAA,EACF,CAAA,MAAO;AACL,IAAA,QAAA,CAAS,IAAA;AAAA,MACP;AAAA,KAEF;AAAA,EACF;AAEA,EAAA,IAAI,CAAC,YAAA,CAAa,QAAA,EAAU,SAAA,EAAW;AACrC,IAAA,QAAA,CAAS,IAAA;AAAA,MACP;AAAA,KAEF;AAAA,EACF;AACF;AAzBS,MAAA,CAAA,yBAAA,EAAA,2BAAA,CAAA;AAqDT,SAAS,6BAAA,CAA8B,cAAgC,QAAA,EAA0B;AAC/F,EAAA,IAAI,aAAa,UAAA,EAAY,OAAA,IAAW,CAAC,YAAA,CAAa,YAAY,GAAA,EAAK;AACrE,IAAA,QAAA,CAAS,IAAA;AAAA,MACP;AAAA,KAEF;AAAA,EACF;AACF;AAPS,MAAA,CAAA,6BAAA,EAAA,+BAAA,CAAA;AAqCT,SAAS,sBAAA,CACP,WACA,WAAA,EACoB;AACpB,EAAA,MAAM,SAA6B,EAAC;AAGpC,EAAA,IAAI,UAAU,MAAA,EAAQ;AAEpB,IAAA,MAAM,iBACJ,WAAA,CAAY,OAAA,IACZ,OAAO,WAAA,CAAY,OAAA,KAAY,YAC/B,QAAA,IAAY,WAAA,CAAY,OAAA,IACxB,OAAO,YAAY,OAAA,CAAQ,MAAA,KAAW,WAClC,WAAA,CAAY,OAAA,CAAQ,SACpB,EAAC;AAEP,IAAA,MAAA,CAAO,OAAA,GAAU;AAAA,MACf,MAAA,EAAQ,EAAE,GAAI,cAAA,IAAkB,EAAC,EAAI,WAAA,EAAa,UAAU,MAAA;AAAO,KACrE;AAAA,EACF;AAMA,EAAA,OAAO,MAAA;AACT;AA3BS,MAAA,CAAA,sBAAA,EAAA,wBAAA,CAAA;AAgFT,SAAS,yBAAA,CACP,QACA,SAAA,EACM;AACN,EAAA,MAAM,kBAAA,GAAqB,UAAU,YAAA,KAAiB,KAAA;AACtD,EAAA,IAAI,kBAAA,EAAoB;AACtB,IAAA,mBAAA,CAAoB,MAAM,CAAA;AAAA,EAC5B;AACF;AARS,MAAA,CAAA,yBAAA,EAAA,2BAAA,CAAA;AAkBT,SAAS,yBAAA,CACP,WACA,YAAA,EACM;AACN,EAAA,MAAM,SAAmB,EAAC;AAC1B,EAAA,MAAM,WAAqB,EAAC;AAG5B,EAAA,eAAA,CAAgB,cAAc,MAAM,CAAA;AAGpC,EAAA,IAAI,SAAA,CAAU,QAAQ,YAAA,EAAc;AAClC,IAAA,4BAAA,CAA6B,YAAA,EAAc,QAAQ,QAAQ,CAAA;AAC3D,IAAA,6BAAA,CAA8B,cAAc,QAAQ,CAAA;AAAA,EACtD,CAAA,MAAA,IAAW,SAAA,CAAU,GAAA,KAAQ,SAAA,EAAW;AACtC,IAAA,yBAAA,CAA0B,YAAA,EAAc,QAAQ,QAAQ,CAAA;AAAA,EAC1D,CAAA,MAAA,IAAW,SAAA,CAAU,GAAA,KAAQ,aAAA,EAAe;AAC1C,IAAA,6BAAA,CAA8B,cAAc,QAAQ,CAAA;AAAA,EACtD;AAGA,EAAA,IAAI,QAAA,CAAS,SAAS,CAAA,EAAG;AACvB,IAAA,UAAA,CAAW,OAAA,CAAQ,IAAA,CAAK,4CAAA,EAA8C,QAAQ,CAAA;AAAA,EAChF;AAGA,EAAA,IAAI,MAAA,CAAO,SAAS,CAAA,EAAG;AACrB,IAAA,MAAM,IAAI,eAAA;AAAA,MACR,2BAAA;AAAA,MACA,oBAAA,CAAqB,qBAAA;AAAA,MACrB,eAAA,CAAgB,wBAAA;AAAA,MAChB;AAAA,QACE,OAAA,EAAS;AAAA,UACP,WAAW,UAAA,CAAW,UAAA;AAAA;AAAA,UAEtB,MAAA,EAAQ,MAAA,CAAO,GAAA,CAAI,CAAA,GAAA,MAAQ;AAAA,YACzB,KAAA,EAAO,QAAA;AAAA,YACP,OAAA,EAAS,GAAA;AAAA,YACT,SAAA,EAAW,MAAA,CAAO,eAAA,CAAgB,wBAAwB;AAAA,WAC5D,CAAE,CAAA;AAAA,UACF,IAAA,EAAM;AAAA,YACJ,MAAA,EAAQ,MAAA,CAAO,IAAA,CAAK,IAAI,CAAA;AAAA,YACxB,QAAA,EAAU,QAAA,CAAS,IAAA,CAAK,IAAI;AAAA;AAC9B;AACF;AACF,KACF;AAAA,EACF;AACF;AAhDS,MAAA,CAAA,yBAAA,EAAA,2BAAA,CAAA;AAoFF,IAAM,gBAAA,GAAN,MAAM,iBAAA,CAAiB;AAAA,EAzgB9B;AAygB8B,IAAA,MAAA,CAAA,IAAA,EAAA,kBAAA,CAAA;AAAA;AAAA,EAC5B;AAAA,IAAA,IAAA,CAAe,QAAA,GAA0E,IAAA;AAAA;AAAA,EACzF;AAAA,IAAA,IAAA,CAAe,cAAA,GAAiB,KAAA;AAAA;AAAA,EAChC;AAAA,IAAA,IAAA,CAAe,WAAA,GAAoC,IAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EASnD,aAAa,IAAA,CACX,SAAA,EACA,SAAA,EACiE;AAEjE,IAAA,IAAI,KAAK,QAAA,EAAU;AACjB,MAAA,UAAA,CAAW,OAAA,CAAQ,IAAA;AAAA,QACjB;AAAA,OACF;AACA,MAAA,OAAO,IAAA,CAAK,QAAA;AAAA,IACd;AAGA,IAAA,IAAI,IAAA,CAAK,cAAA,IAAkB,IAAA,CAAK,WAAA,EAAa;AAC3C,MAAA,MAAM,IAAA,CAAK,WAAA;AACX,MAAA,OAAO,IAAA,CAAK,QAAA;AAAA,IACd;AAGA,IAAA,IAAA,CAAK,cAAA,GAAiB,IAAA;AACtB,IAAA,IAAA,CAAK,WAAA,GAAc,IAAA,CAAK,YAAA,CAAa,SAAA,EAAW,SAAS,CAAA;AAEzD,IAAA,IAAI;AACF,MAAA,MAAM,IAAA,CAAK,WAAA;AACX,MAAA,OAAO,IAAA,CAAK,QAAA;AAAA,IACd,CAAA,SAAE;AACA,MAAA,IAAA,CAAK,cAAA,GAAiB,KAAA;AACtB,MAAA,IAAA,CAAK,WAAA,GAAc,IAAA;AAAA,IACrB;AAAA,EACF;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAYA,aAAqB,YAAA,CACnB,SAAA,EACA,SAAA,EACe;AACf,IAAA,IAAI;AAEF,MAAA,MAAM,WAAA,GAAc,uBAAA,CAAwB,SAAA,CAAU,GAAG,CAAA;AAGzD,MAAA,MAAM,iBAAA,GAAoB,sBAAA,CAAuB,SAAA,EAAW,WAAW,CAAA;AAGvE,MAAA,MAAM,gBAAA,iCACJ,KAAA,KAEkB;AAClB,QAAA,MAAM,YAAY,iBAAA,EAAkB;AACpC,QAAA,MAAM,MAAA,GAAS,KAAA,CAAM,MAAA,EAAQ,MAAA,IAAU,SAAA;AACvC,QAAA,MAAM,GAAA,GAAM,KAAA,CAAM,MAAA,EAAQ,GAAA,IAAO,SAAA;AAMjC,QAAA,IAAI;AAEF,UAAA,MAAM,YAAA,GAAe,KAAA,CAAM,OAAA,CAAQ,KAAA,CAAM,QAAA,EAAU,IAAI,CAAA,GAAI,KAAA,CAAM,QAAA,CAAS,IAAA,GAAO,EAAC;AAGlF,UAAA,IAAI,YAAA,CAAa,WAAW,CAAA,EAAG;AAC7B,YAAA,MAAM,eAAA,GAAkB;AAAA,cACtB,EAAA,EAAI,SAAA;AAAA,cACJ,MAAM,WAAA,CAAY,8BAAA;AAAA,cAClB,OAAA,EAAS,MAAM,OAAA,IAAW,oBAAA;AAAA,cAC1B,QAAQ,KAAA,CAAM,MAAA;AAAA,cACd,UAAU,cAAA,CAAe,OAAA;AAAA,cACzB,SAAA,EAAA,iBAAW,IAAI,IAAA,EAAK,EAAE,WAAA,EAAY;AAAA,cAClC,aAAa,KAAA,CAAM,MAAA,GAAS,KAAA,CAAM,MAAA,IAAU,YAAY,qBAAA,GAAwB,KAAA;AAAA,cAChF,MAAA,EAAQ,YAAA;AAAA,cACR,SAAA,EAAW,KAAA;AAAA,cACX,OAAA,EAAS;AAAA,gBACP,MAAA;AAAA,gBACA,GAAA;AAAA,gBACA;AAAA;AACF,aACF;AAGA,YAAA,gBAAA,CAAiB,IAAA,CAAK,YAAY,MAAA,CAAO,KAAA,EAAO,EAAE,MAAA,EAAQ,CAAC,eAAe,CAAA,EAAG,CAAA;AAAA,UAC/E,CAAA,MAAO;AAEL,YAAA,MAAM,mBAAmB,YAAA,CAAa,GAAA;AAAA,cACpC,CAAC,QAAiC,KAAA,MAAmB;AAAA,gBACnD,EAAA,EAAI,CAAA,EAAG,SAAS,CAAA,CAAA,EAAI,KAAK,CAAA,CAAA;AAAA,gBACzB,IAAA,EAAO,MAAA,CAAO,SAAA,IAAwB,WAAA,CAAY,8BAAA;AAAA,gBAClD,OAAA,EAAU,MAAA,CAAO,OAAA,IAAsB,KAAA,CAAM,OAAA,IAAW,oBAAA;AAAA,gBACxD,QAAQ,KAAA,CAAM,MAAA;AAAA,gBACd,UAAU,cAAA,CAAe,OAAA;AAAA,gBACzB,SAAA,EAAA,iBAAW,IAAI,IAAA,EAAK,EAAE,WAAA,EAAY;AAAA,gBAClC,aAAa,KAAA,CAAM,MAAA,GACf,KAAA,CAAM,MAAA,IAAU,YAAY,qBAAA,GAC5B,KAAA;AAAA,gBACJ,MAAA,EAAQ,YAAA;AAAA,gBACR,SAAA,EAAW,KAAA;AAAA,gBACX,OAAA,EAAS;AAAA,kBACP,MAAA;AAAA,kBACA,GAAA;AAAA,kBACA,SAAA;AAAA,kBACA,OAAO,MAAA,CAAO,KAAA;AAAA,kBACd,YAAY,MAAA,CAAO,UAAA;AAAA,kBACnB,eAAe,MAAA,CAAO,aAAA;AAAA,kBACtB,aAAa,MAAA,CAAO;AAAA;AACtB,eACF;AAAA,aACF;AAGA,YAAA,gBAAA,CAAiB,KAAK,WAAA,CAAY,MAAA,CAAO,OAAO,EAAE,MAAA,EAAQ,kBAAkB,CAAA;AAAA,UAC9E;AAAA,QACF,SAAS,CAAA,EAAG;AAEV,UAAA,OAAA,CAAQ,KAAA,CAAM,kDAAkD,CAAC,CAAA;AAAA,QACnE;AAGA,QAAA,iBAAA,CAAiB,aAAa,KAAA,EAAO;AAAA,UACnC,MAAA;AAAA,UACA,GAAA;AAAA,UACA,SAAA;AAAA,UACA,QAAQ,KAAA,CAAM,MAAA;AAAA,UACd,QAAA,EAAU;AAAA,SACX,CAAA;AAAA,MACH,CAAA,EAhFyB,kBAAA,CAAA;AAmFzB,MAAA,MAAM,cAAc,SAAA,EAAW,OAAA;AAC/B,MAAA,MAAM,eAAA,GAAkB,WAAA,GACpB,KAAA,CAAM,OAAA,CAAQ,WAAW,CAAA,GACvB,CAAC,GAAG,WAAA,EAAa,gBAAgB,CAAA,GACjC,CAAC,WAAA,EAAa,gBAAgB,CAAA,GAChC,gBAAA;AAEJ,MAAA,MAAM,aAAA,GAAgB,YAAA;AAAA,QACpB,WAAA;AAAA;AAAA,QACA,iBAAA;AAAA;AAAA,QACA,EAAE,GAAI,SAAA,IAAa,EAAC,EAAI,SAAS,eAAA;AAAgB;AAAA,OACnD;AAGA,MAAA,yBAAA,CAA0B,WAAW,aAAa,CAAA;AAGlD,MAAA,IAAA,CAAK,QAAA,GAAW,MAAM,eAAA,CAAgB,aAAa,CAAA;AAGnD,MAAA,yBAAA,CAA0B,IAAA,CAAK,UAAU,SAAS,CAAA;AAAA,IACpD,SAAS,KAAA,EAAO;AACd,MAAA,MAAM,IAAI,eAAA;AAAA,QACR,+BAAA;AAAA,QACA,oBAAA,CAAqB,qBAAA;AAAA,QACrB,eAAA,CAAgB,4BAAA;AAAA,QAChB;AAAA,UACE,KAAA,EAAO,KAAA,YAAiB,KAAA,GAAQ,KAAA,GAAQ,MAAA;AAAA,UACxC,OAAA,EAAS;AAAA,YACP,WAAW,UAAA,CAAW,cAAA;AAAA,YACtB,eAAe,KAAA,YAAiB,KAAA,GAAQ,KAAA,CAAM,OAAA,GAAU,OAAO,KAAK,CAAA;AAAA,YACpE,IAAA,EAAM;AAAA,cACJ,OAAO,KAAA,YAAiB,KAAA,GAAQ,KAAA,CAAM,OAAA,GAAU,OAAO,KAAK;AAAA;AAC9D;AACF;AACF,OACF;AAAA,IACF;AAAA,EACF;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOA,OAAO,SAAA,GAAoE;AACzE,IAAA,IAAI,CAAC,KAAK,QAAA,EAAU;AAClB,MAAA,MAAM,IAAI,eAAA;AAAA,QACR,yBAAA;AAAA,QACA,oBAAA,CAAqB,qBAAA;AAAA,QACrB,eAAA,CAAgB,4BAAA;AAAA,QAChB;AAAA,UACE,OAAA,EAAS;AAAA,YACP,WAAW,UAAA,CAAW,cAAA;AAAA,YACtB,IAAA,EAAM;AAAA,cACJ,IAAA,EAAM;AAAA;AACR;AACF;AACF,OACF;AAAA,IACF;AACA,IAAA,OAAO,IAAA,CAAK,QAAA;AAAA,EACd;AAAA;AAAA;AAAA;AAAA,EAKA,OAAO,aAAA,GAAyB;AAC9B,IAAA,OAAO,KAAK,QAAA,KAAa,IAAA;AAAA,EAC3B;AAAA;AAAA;AAAA;AAAA,EAKA,aAAa,YAAA,CACX,SAAA,EACA,SAAA,EACiE;AACjE,IAAA,IAAA,CAAK,OAAA,EAAQ;AACb,IAAA,OAAO,IAAA,CAAK,IAAA,CAAK,SAAA,EAAW,SAAS,CAAA;AAAA,EACvC;AAAA;AAAA;AAAA;AAAA,EAKA,OAAO,OAAA,GAAgB;AACrB,IAAA,IAAI,IAAA,CAAK,QAAA,IAAY,SAAA,IAAa,IAAA,CAAK,QAAA,EAAU;AAC/C,MAAA,IAAA,CAAK,SAAS,OAAA,IAAU;AAAA,IAC1B;AACA,IAAA,IAAA,CAAK,QAAA,GAAW,IAAA;AAChB,IAAA,IAAA,CAAK,cAAA,GAAiB,KAAA;AACtB,IAAA,IAAA,CAAK,WAAA,GAAc,IAAA;AAAA,EACrB;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;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAuDA,OAAO,YAAA,CACL,KAAA,EACA,OAAA,EAQM;AACN,IAAA,MAAM,OAAA,GAAsC;AAAA,MAC1C,QAAQ,OAAA,CAAQ,MAAA;AAAA,MAChB,KAAK,OAAA,CAAQ,GAAA;AAAA,MACb,WAAW,OAAA,CAAQ,SAAA;AAAA,MACnB,QAAQ,OAAA,CAAQ,MAAA;AAAA,MAChB,KAAA;AAAA,MACA,UAAU,OAAA,CAAQ;AAAA,KACpB;AAEA,IAAA,gBAAA,CAAiB,IAAA,CAAK,WAAA,CAAY,GAAA,CAAI,aAAA,EAAe,OAAO,CAAA;AAG5D,IAAA,IAAI,OAAA,CAAQ,OAAA,IAAW,KAAA,YAAiB,KAAA,EAAO;AAC7C,MAAA,MAAM,KAAA;AAAA,IACR;AAAA,EACF;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,EA2BA,aAAa,cAAA,CACX,SAAA,EACA,SAAA,EACiE;AACjE,IAAA,IAAI;AAEF,MAAA,MAAM,WAAA,GAAc,uBAAA,CAAwB,SAAA,CAAU,GAAG,CAAA;AAGzD,MAAA,MAAM,iBAAA,GAAoB,sBAAA,CAAuB,SAAA,EAAW,WAAW,CAAA;AAGvE,MAAA,MAAM,aAAA,GAAgB,YAAA;AAAA,QACpB,WAAA;AAAA,QACA,iBAAA;AAAA,QACA,aAAa;AAAC,OAChB;AAGA,MAAA,yBAAA,CAA0B,WAAW,aAAa,CAAA;AAGlD,MAAA,MAAM,eAAA,GAAkB,MAAM,eAAA,CAAgB,aAAa,CAAA;AAK3D,MAAA,OAAO,eAAA;AAAA,IACT,SAAS,KAAA,EAAO;AACd,MAAA,MAAM,IAAI,eAAA;AAAA,QACR,kCAAA;AAAA,QACA,oBAAA,CAAqB,qBAAA;AAAA,QACrB,eAAA,CAAgB,4BAAA;AAAA,QAChB;AAAA,UACE,KAAA,EAAO,KAAA,YAAiB,KAAA,GAAQ,KAAA,GAAQ,MAAA;AAAA,UACxC,OAAA,EAAS;AAAA,YACP,WAAW,UAAA,CAAW,cAAA;AAAA,YACtB,eAAe,KAAA,YAAiB,KAAA,GAAQ,KAAA,CAAM,OAAA,GAAU,OAAO,KAAK,CAAA;AAAA,YACpE,IAAA,EAAM;AAAA,cACJ,OAAO,KAAA,YAAiB,KAAA,GAAQ,KAAA,CAAM,OAAA,GAAU,OAAO,KAAK;AAAA;AAC9D;AACF;AACF,OACF;AAAA,IACF;AAAA,EACF;AACF;AC72BO,IAAe,cAAf,MAA2D;AAAA,EAQhE,WAAA,GAAc;AAJd,IAAA,IAAA,CAAU,cAAA,GAAiB,KAAA;AAC3B,IAAA,IAAA,CAAU,OAAA,GAA6C,IAAA;AAIrD,IAAA,IAAA,CAAK,MAAA,GAAS,IAAI,aAAA,CAAc;AAAA,MAC9B,WAAA,EAAa,MAAA;AAAA,MACb,OAAA,EAAS;AAAA,KACV,CAAA;AAAA,EACH;AAAA,EAnDF;AAsCkE,IAAA,MAAA,CAAA,IAAA,EAAA,aAAA,CAAA;AAAA;AAAA,EAehE,IAAI,aAAA,GAAyB;AAC3B,IAAA,OAAO,IAAA,CAAK,cAAA;AAAA,EACd;AAAA,EAEA,IAAI,MAAA,GAA4C;AAC9C,IAAA,OAAO,IAAA,CAAK,OAAA;AAAA,EACd;AAAA;AAAA,EAIA,MAAM,WAAW,MAAA,EAAmD;AAClE,IAAA,IAAI,KAAK,cAAA,EAAgB;AACvB,MAAA,IAAA,CAAK,MAAA,CAAO,IAAA,CAAK,CAAA,EAAG,IAAA,CAAK,IAAI,CAAA,oBAAA,CAAsB,CAAA;AACnD,MAAA;AAAA,IACF;AAEA,IAAA,IAAA,CAAK,OAAA,GAAU,MAAA;AAEf,IAAA,IAAI,MAAA,CAAO,YAAY,KAAA,EAAO;AAC5B,MAAA,IAAA,CAAK,MAAA,CAAO,IAAA,CAAK,CAAA,EAAG,IAAA,CAAK,IAAI,CAAA,0BAAA,CAA4B,CAAA;AACzD,MAAA;AAAA,IACF;AAEA,IAAA,MAAM,IAAA,CAAK,aAAa,MAAM,CAAA;AAC9B,IAAA,IAAA,CAAK,cAAA,GAAiB,IAAA;AACtB,IAAA,IAAA,CAAK,MAAA,CAAO,IAAA,CAAK,CAAA,EAAG,IAAA,CAAK,IAAI,CAAA,YAAA,CAAA,EAAgB;AAAA,MAC3C,UAAU,IAAA,CAAK,QAAA;AAAA,MACf,aAAa,MAAA,CAAO,WAAA;AAAA,MACpB,aAAa,MAAA,CAAO;AAAA,KACrB,CAAA;AAAA,EACH;AAAA,EAEA,MAAM,QAAA,GAA0B;AAC9B,IAAA,IAAI,CAAC,KAAK,cAAA,EAAgB;AACxB,MAAA;AAAA,IACF;AAEA,IAAA,MAAM,KAAK,KAAA,EAAM;AACjB,IAAA,MAAM,KAAK,UAAA,EAAW;AACtB,IAAA,IAAA,CAAK,cAAA,GAAiB,KAAA;AACtB,IAAA,IAAA,CAAK,MAAA,CAAO,IAAA,CAAK,CAAA,EAAG,IAAA,CAAK,IAAI,CAAA,UAAA,CAAY,CAAA;AAAA,EAC3C;AAAA,EAEA,MAAM,SAAA,GAA8B;AAClC,IAAA,IAAI,CAAC,KAAK,cAAA,EAAgB;AACxB,MAAA,OAAO,KAAA;AAAA,IACT;AACA,IAAA,OAAO,KAAK,aAAA,EAAc;AAAA,EAC5B;AAAA;AAAA,EAUA,MAAM,aAAa,MAAA,EAA+B;AAChD,IAAA,IAAI,CAAC,IAAA,CAAK,cAAA,IAAkB,IAAA,CAAK,OAAA,EAAS,YAAY,KAAA,EAAO;AAC3D,MAAA;AAAA,IACF;AAEA,IAAA,MAAM,kBAAA,GAAqB,IAAA,CAAK,gBAAA,CAAiB,MAAM,CAAA;AACvD,IAAA,MAAM,IAAA,CAAK,eAAe,kBAAkB,CAAA;AAAA,EAC9C;AAAA,EAEA,MAAM,gBAAA,CACJ,IAAA,EACA,KAAA,GAAgB,GAChB,IAAA,EACe;AACf,IAAA,MAAM,KAAK,YAAA,CAAa;AAAA,MACtB,IAAA,EAAM,SAAA;AAAA,MACN,IAAA;AAAA,MACA,KAAA;AAAA,MACA,MAAM,EAAE,GAAG,KAAK,OAAA,EAAS,WAAA,EAAa,GAAG,IAAA;AAAK,KAC/C,CAAA;AAAA,EACH;AAAA,EAEA,MAAM,QAAA,CAAS,IAAA,EAAc,KAAA,EAAe,IAAA,EAA8C;AACxF,IAAA,MAAM,KAAK,YAAA,CAAa;AAAA,MACtB,IAAA,EAAM,OAAA;AAAA,MACN,IAAA;AAAA,MACA,KAAA;AAAA,MACA,MAAM,EAAE,GAAG,KAAK,OAAA,EAAS,WAAA,EAAa,GAAG,IAAA;AAAK,KAC/C,CAAA;AAAA,EACH;AAAA,EAEA,MAAM,eAAA,CAAgB,IAAA,EAAc,KAAA,EAAe,IAAA,EAA8C;AAC/F,IAAA,MAAM,KAAK,YAAA,CAAa;AAAA,MACtB,IAAA,EAAM,WAAA;AAAA,MACN,IAAA;AAAA,MACA,KAAA;AAAA,MACA,MAAM,EAAE,GAAG,KAAK,OAAA,EAAS,WAAA,EAAa,GAAG,IAAA;AAAK,KAC/C,CAAA;AAAA,EACH;AAAA;AAAA,EAMA,UAAU,OAAA,EAA4B;AACpC,IAAA,IAAI,CAAC,IAAA,CAAK,cAAA,IAAkB,IAAA,CAAK,OAAA,EAAS,YAAY,KAAA,EAAO;AAC3D,MAAA,OAAO,IAAA,CAAK,eAAe,OAAO,CAAA;AAAA,IACpC;AAGA,IAAA,IAAI,KAAK,OAAA,EAAS,YAAA,KAAiB,UAAa,IAAA,CAAK,OAAA,CAAQ,eAAe,CAAA,EAAG;AAC7E,MAAA,IAAI,IAAA,CAAK,MAAA,EAAO,GAAI,IAAA,CAAK,QAAQ,YAAA,EAAc;AAC7C,QAAA,OAAO,IAAA,CAAK,eAAe,OAAO,CAAA;AAAA,MACpC;AAAA,IACF;AAEA,IAAA,OAAO,IAAA,CAAK,YAAY,OAAO,CAAA;AAAA,EACjC;AAAA,EAEA,aAAA,GAA6B;AAC3B,IAAA,IAAI,CAAC,KAAK,cAAA,EAAgB;AACxB,MAAA,OAAO,IAAA;AAAA,IACT;AACA,IAAA,OAAO,KAAK,eAAA,EAAgB;AAAA,EAC9B;AAAA,EAEA,MAAM,QAAA,CAAY,OAAA,EAAsB,EAAA,EAA4C;AAClF,IAAA,MAAM,IAAA,GAAO,IAAA,CAAK,SAAA,CAAU,OAAO,CAAA;AACnC,IAAA,IAAI;AACF,MAAA,MAAM,MAAA,GAAS,MAAM,EAAA,CAAG,IAAI,CAAA;AAC5B,MAAA,IAAA,CAAK,UAAU,IAAI,CAAA;AACnB,MAAA,OAAO,MAAA;AAAA,IACT,SAAS,KAAA,EAAO;AACd,MAAA,IAAA,CAAK,SAAA,CAAU,SAAS,KAAA,YAAiB,KAAA,GAAQ,MAAM,OAAA,GAAU,MAAA,CAAO,KAAK,CAAC,CAAA;AAC9E,MAAA,IAAI,iBAAiB,KAAA,EAAO;AAC1B,QAAA,IAAA,CAAK,gBAAgB,KAAK,CAAA;AAAA,MAC5B;AACA,MAAA,MAAM,KAAA;AAAA,IACR,CAAA,SAAE;AACA,MAAA,IAAA,CAAK,GAAA,EAAI;AAAA,IACX;AAAA,EACF;AAAA;AAAA,EAOA,MAAM,IAAI,KAAA,EAAgC;AACxC,IAAA,IAAI,CAAC,IAAA,CAAK,cAAA,IAAkB,IAAA,CAAK,OAAA,EAAS,YAAY,KAAA,EAAO;AAC3D,MAAA;AAAA,IACF;AAEA,IAAA,MAAM,iBAAA,GAAoB;AAAA,MACxB,GAAG,KAAA;AAAA,MACH,SAAA,EAAW,KAAA,CAAM,SAAA,IAAa,IAAA,CAAK,GAAA,EAAI;AAAA,MACvC,OAAA,EAAS,KAAA,CAAM,OAAA,IAAW,IAAA,CAAK,OAAA,EAAS;AAAA,KAC1C;AAEA,IAAA,MAAM,IAAA,CAAK,MAAM,iBAAiB,CAAA;AAAA,EACpC;AAAA;AAAA,EAMA,MAAM,UAAU,KAAA,EAA0C;AACxD,IAAA,IAAI,CAAC,IAAA,CAAK,cAAA,IAAkB,IAAA,CAAK,OAAA,EAAS,YAAY,KAAA,EAAO;AAC3D,MAAA;AAAA,IACF;AAEA,IAAA,MAAM,iBAAA,GAAoB;AAAA,MACxB,GAAG,KAAA;AAAA,MACH,SAAA,EAAW,KAAA,CAAM,SAAA,IAAa,IAAA,CAAK,GAAA,EAAI;AAAA,MACvC,IAAA,EAAM,EAAE,GAAG,IAAA,CAAK,SAAS,WAAA,EAAa,GAAG,MAAM,IAAA;AAAK,KACtD;AAEA,IAAA,MAAM,IAAA,CAAK,YAAY,iBAAiB,CAAA;AAAA,EAC1C;AAAA;AAAA,EAMA,MAAM,KAAA,GAAuB;AAC3B,IAAA,IAAI,CAAC,KAAK,cAAA,EAAgB;AACxB,MAAA;AAAA,IACF;AACA,IAAA,MAAM,KAAK,OAAA,EAAQ;AAAA,EACrB;AAAA;AAAA;AAAA;AAAA;AAAA,EASU,iBAAiB,MAAA,EAAwB;AACjD,IAAA,IAAI,CAAC,IAAA,CAAK,OAAA,EAAS,WAAA,EAAa;AAC9B,MAAA,OAAO,MAAA;AAAA,IACT;AAEA,IAAA,OAAO;AAAA,MACL,GAAG,MAAA;AAAA,MACH,IAAA,EAAM;AAAA,QACJ,GAAG,KAAK,OAAA,CAAQ,WAAA;AAAA,QAChB,GAAG,MAAA,CAAO;AAAA;AACZ,KACF;AAAA,EACF;AAAA;AAAA;AAAA;AAAA;AAAA,EAMU,eAAe,QAAA,EAA6B;AACpD,IAAA,MAAM,OAAA,GAAuB;AAAA,MAC3B,SAAS,eAAA,EAAgB;AAAA,MACzB,QAAQ,cAAA;AAAe,KACzB;AAEA,IAAA,OAAO;AAAA,MACL,OAAA;AAAA,MACA,8BAAc,MAAA,CAAA,MAAM;AAAA,MAAC,CAAA,EAAP,cAAA,CAAA;AAAA,MACd,+BAAe,MAAA,CAAA,MAAM;AAAA,MAAC,CAAA,EAAP,eAAA,CAAA;AAAA,MACf,0BAAU,MAAA,CAAA,MAAM;AAAA,MAAC,CAAA,EAAP,UAAA,CAAA;AAAA,MACV,2BAAW,MAAA,CAAA,MAAM;AAAA,MAAC,CAAA,EAAP,WAAA,CAAA;AAAA,MACX,qBAAK,MAAA,CAAA,MAAM;AAAA,MAAC,CAAA,EAAP,KAAA,CAAA;AAAA,MACL,iCAAiB,MAAA,CAAA,MAAM;AAAA,MAAC,CAAA,EAAP,iBAAA;AAAA,KACnB;AAAA,EACF;AACF,CAAA;AAUO,IAAM,WAAA,GAAN,cAA0B,WAAA,CAAY;AAAA,EAAtC,WAAA,GAAA;AAAA,IAAA,KAAA,CAAA,GAAA,SAAA,CAAA;AACL,IAAA,IAAA,CAAS,QAAA,GAAW,MAAA;AACpB,IAAA,IAAA,CAAS,IAAA,GAAO,aAAA;AAAA,EAAA;AAAA,EAvSlB;AAqS6C,IAAA,MAAA,CAAA,IAAA,EAAA,aAAA,CAAA;AAAA;AAAA,EAI3C,MAAgB,YAAA,GAA8B;AAAA,EAAC;AAAA,EAC/C,MAAgB,UAAA,GAA4B;AAAA,EAAC;AAAA,EAC7C,MAAgB,aAAA,GAAkC;AAChD,IAAA,OAAO,IAAA;AAAA,EACT;AAAA,EACA,MAAgB,cAAA,GAAgC;AAAA,EAAC;AAAA,EACvC,YAAY,OAAA,EAA4B;AAChD,IAAA,OAAO,IAAA,CAAK,eAAe,OAAO,CAAA;AAAA,EACpC;AAAA,EACU,eAAA,GAA+B;AACvC,IAAA,OAAO,IAAA;AAAA,EACT;AAAA,EACA,MAAgB,KAAA,GAAuB;AAAA,EAAC;AAAA,EACxC,MAAgB,WAAA,GAA6B;AAAA,EAAC;AAAA,EAC9C,MAAgB,OAAA,GAAyB;AAAA,EAAC;AAC5C,CAAA;AChQO,IAAM,aAAA,GAAN,cAA4B,WAAA,CAAY;AAAA,EAAxC,WAAA,GAAA;AAAA,IAAA,KAAA,CAAA,GAAA,SAAA,CAAA;AACL,IAAA,IAAA,CAAS,QAAA,GAAW,SAAA;AACpB,IAAA,IAAA,CAAS,IAAA,GAAO,eAAA;AAGhB,IAAA,IAAA,CAAQ,UAAA,GAAa,IAAA;AACrB,IAAA,IAAA,CAAQ,QAAA,GAAW,IAAA;AACnB,IAAA,IAAA,CAAQ,SAAA,GAAY,IAAA;AAAA,EAAA;AAAA,EA/DtB;AAwD+C,IAAA,MAAA,CAAA,IAAA,EAAA,eAAA,CAAA;AAAA;AAAA,EAS7C,MAAgB,aAAa,MAAA,EAAmD;AAC9E,IAAA,MAAM,aAAA,GAAgB,MAAA;AAGtB,IAAA,IAAA,CAAK,mBAAA,GAAsB,IAAIC,aAAAA,CAAc;AAAA,MAC3C,WAAA,EAAa,eAAA;AAAA,MACb,OAAA,EAAS,OAAO,WAAA,IAAe,eAAA;AAAA,MAC/B,aAAa,MAAA,CAAO,WAAA;AAAA,MACpB,QAAA,EAAU,cAAc,QAAA,IAAY;AAAA,KACrC,CAAA;AAGD,IAAA,IAAA,CAAK,UAAA,GAAa,IAAA;AAClB,IAAA,IAAA,CAAK,QAAA,GAAW,IAAA;AAChB,IAAA,IAAA,CAAK,SAAA,GAAY,IAAA;AAAA,EACnB;AAAA,EAEA,MAAgB,UAAA,GAA4B;AAAA,EAE5C;AAAA,EAEA,MAAgB,aAAA,GAAkC;AAChD,IAAA,OAAO,IAAA;AAAA,EACT;AAAA,EAEA,MAAgB,eAAe,MAAA,EAA+B;AAC5D,IAAA,IAAI,CAAC,KAAK,UAAA,EAAY;AAEtB,IAAA,IAAA,CAAK,mBAAA,CAAoB,MAAM,CAAA,SAAA,EAAY,MAAA,CAAO,IAAI,CAAA,CAAA,EAAI,MAAA,CAAO,IAAI,CAAA,CAAA,EAAI;AAAA,MACvE,YAAY,MAAA,CAAO,IAAA;AAAA,MACnB,YAAY,MAAA,CAAO,IAAA;AAAA,MACnB,KAAA,EAAO,OAAA,IAAW,MAAA,GAAS,MAAA,CAAO,KAAA,GAAQ,MAAA;AAAA,MAC1C,MAAM,MAAA,CAAO,IAAA;AAAA,MACb,MAAM,MAAA,CAAO;AAAA,KACd,CAAA;AAAA,EACH;AAAA,EAEU,YAAY,OAAA,EAA4B;AAChD,IAAA,MAAM,OAAA,GAAuB;AAAA,MAC3B,SAAS,eAAA,EAAgB;AAAA,MACzB,QAAQ,cAAA,EAAe;AAAA,MACvB,YAAA,EAAc,QAAQ,aAAA,EAAe;AAAA,KACvC;AAEA,IAAA,MAAM,SAAA,GAAY,OAAA,CAAQ,SAAA,IAAa,IAAA,CAAK,GAAA,EAAI;AAEhD,IAAA,IAAI,KAAK,QAAA,EAAU;AACjB,MAAA,IAAA,CAAK,mBAAA,CAAoB,KAAA,CAAM,CAAA,aAAA,EAAgB,OAAA,CAAQ,IAAI,CAAA,CAAA,EAAI;AAAA,QAC7D,SAAS,OAAA,CAAQ,OAAA;AAAA,QACjB,QAAQ,OAAA,CAAQ,MAAA;AAAA,QAChB,cAAc,OAAA,CAAQ,YAAA;AAAA,QACtB,MAAM,OAAA,CAAQ,IAAA;AAAA,QACd,YAAY,OAAA,CAAQ;AAAA,OACrB,CAAA;AAAA,IACH;AAEA,IAAA,MAAM,SAAsB,EAAC;AAC7B,IAAA,IAAI,UAAA,GAA6B,EAAE,GAAG,OAAA,CAAQ,UAAA,EAAW;AACzD,IAAA,IAAI,MAAA,GAAqB,OAAA;AACzB,IAAA,IAAI,aAAA;AAEJ,IAAA,MAAM,WAAW,IAAA,CAAK,QAAA;AACtB,IAAA,MAAMC,UAAS,IAAA,CAAK,mBAAA;AAEpB,IAAA,OAAO;AAAA,MACL,OAAA;AAAA,MACA,YAAA,kBAAc,MAAA,CAAA,CAAC,GAAA,EAAK,KAAA,KAAU;AAC5B,QAAA,UAAA,CAAW,GAAG,CAAA,GAAI,KAAA;AAAA,MACpB,CAAA,EAFc,cAAA,CAAA;AAAA,MAGd,+BAAe,MAAA,CAAA,CAAA,KAAA,KAAS;AACtB,QAAA,UAAA,GAAa,EAAE,GAAG,UAAA,EAAY,GAAG,KAAA,EAAM;AAAA,MACzC,CAAA,EAFe,eAAA,CAAA;AAAA,MAGf,0BAAU,MAAA,CAAA,CAAA,KAAA,KAAS;AACjB,QAAA,MAAA,CAAO,KAAK,KAAK,CAAA;AACjB,QAAA,IAAI,QAAA,EAAU;AACZ,UAAAA,OAAAA,CAAO,MAAM,CAAA,aAAA,EAAgB,OAAA,CAAQ,IAAI,CAAA,EAAA,EAAK,KAAA,CAAM,IAAI,CAAA,CAAA,EAAI;AAAA,YAC1D,SAAS,OAAA,CAAQ,OAAA;AAAA,YACjB,QAAQ,OAAA,CAAQ,MAAA;AAAA,YAChB,iBAAiB,KAAA,CAAM;AAAA,WACxB,CAAA;AAAA,QACH;AAAA,MACF,CAAA,EATU,UAAA,CAAA;AAAA,MAUV,SAAA,kBAAW,MAAA,CAAA,CAAC,CAAA,EAAG,OAAA,KAAY;AACzB,QAAA,MAAA,GAAS,CAAA;AACT,QAAA,aAAA,GAAgB,OAAA;AAAA,MAClB,CAAA,EAHW,WAAA,CAAA;AAAA,MAIX,qBAAK,MAAA,CAAA,CAAA,OAAA,KAAW;AACd,QAAA,MAAM,QAAA,GAAA,CAAY,OAAA,IAAW,IAAA,CAAK,GAAA,EAAI,IAAK,SAAA;AAC3C,QAAA,IAAI,QAAA,EAAU;AACZ,UAAA,MAAM,SAAA,GAAY,MAAA,KAAW,OAAA,GAAU,MAAA,GAAS,OAAA;AAChD,UAAAA,QAAO,SAAS,CAAA,CAAE,CAAA,WAAA,EAAc,OAAA,CAAQ,IAAI,CAAA,CAAA,EAAI;AAAA,YAC9C,SAAS,OAAA,CAAQ,OAAA;AAAA,YACjB,QAAQ,OAAA,CAAQ,MAAA;AAAA,YAChB,UAAA,EAAY,QAAA;AAAA,YACZ,MAAA;AAAA,YACA,aAAA;AAAA,YACA,UAAA;AAAA,YACA,YAAY,MAAA,CAAO;AAAA,WACpB,CAAA;AAAA,QACH;AAAA,MACF,CAAA,EAdK,KAAA,CAAA;AAAA,MAeL,iCAAiB,MAAA,CAAA,CAAA,KAAA,KAAS;AACxB,QAAA,IAAI,QAAA,EAAU;AACZ,UAAAA,OAAAA,CAAO,KAAA,CAAM,CAAA,aAAA,EAAgB,OAAA,CAAQ,IAAI,CAAA,CAAA,EAAI;AAAA,YAC3C,SAAS,OAAA,CAAQ,OAAA;AAAA,YACjB,QAAQ,OAAA,CAAQ,MAAA;AAAA,YAChB,OAAO,KAAA,CAAM,OAAA;AAAA,YACb,OAAO,KAAA,CAAM;AAAA,WACd,CAAA;AAAA,QACH;AAAA,MACF,CAAA,EATiB,iBAAA;AAAA,KAUnB;AAAA,EACF;AAAA,EAEU,eAAA,GAA+B;AACvC,IAAA,OAAO,IAAA;AAAA,EACT;AAAA,EAEA,MAAgB,MAAM,KAAA,EAAgC;AACpD,IAAA,MAAM,IAAA,GAAO;AAAA,MACX,SAAS,KAAA,CAAM,OAAA;AAAA,MACf,SAAS,KAAA,CAAM,OAAA;AAAA,MACf,QAAQ,KAAA,CAAM,MAAA;AAAA,MACd,GAAG,KAAA,CAAM;AAAA,KACX;AAGA,IAAA,QAAQ,MAAM,KAAA;AAAO,MACnB,KAAK,OAAA;AACH,QAAA,IAAA,CAAK,mBAAA,CAAoB,KAAA,CAAM,KAAA,CAAM,OAAA,EAAS,IAAI,CAAA;AAClD,QAAA;AAAA,MACF,KAAK,MAAA;AACH,QAAA,IAAA,CAAK,mBAAA,CAAoB,IAAA,CAAK,KAAA,CAAM,OAAA,EAAS,IAAI,CAAA;AACjD,QAAA;AAAA,MACF,KAAK,MAAA;AACH,QAAA,IAAA,CAAK,mBAAA,CAAoB,IAAA,CAAK,KAAA,CAAM,OAAA,EAAS,IAAI,CAAA;AACjD,QAAA;AAAA,MACF,KAAK,OAAA;AACH,QAAA,IAAA,CAAK,mBAAA,CAAoB,KAAA,CAAM,KAAA,CAAM,OAAA,EAAS,IAAI,CAAA;AAClD,QAAA;AAAA,MACF,KAAK,OAAA;AACH,QAAA,IAAA,CAAK,mBAAA,CAAoB,KAAA,CAAM,KAAA,CAAM,OAAA,EAAS,IAAI,CAAA;AAClD,QAAA;AAAA;AACJ,EACF;AAAA,EAEA,MAAgB,YAAY,KAAA,EAA0C;AACpE,IAAA,IAAI,CAAC,KAAK,SAAA,EAAW;AAErB,IAAA,IAAA,CAAK,mBAAA,CAAoB,IAAA,CAAK,CAAA,QAAA,EAAW,KAAA,CAAM,IAAI,CAAA,CAAA,EAAI;AAAA,MACrD,WAAW,KAAA,CAAM,IAAA;AAAA,MACjB,YAAY,KAAA,CAAM,UAAA;AAAA,MAClB,MAAM,KAAA,CAAM;AAAA,KACb,CAAA;AAAA,EACH;AAAA,EAEA,MAAgB,OAAA,GAAyB;AAAA,EAEzC;AACF,CAAA;AC7LA,IAAM,0BAAA,GAA6B,GAAA;AA6B5B,IAAM,uBAAN,MAA0F;AAAA,EAY/F,WAAA,GAAc;AAXd,IAAA,IAAA,CAAS,QAAA,GAAW,QAAA;AACpB,IAAA,IAAA,CAAS,IAAA,GAAO,sBAAA;AAEhB,IAAA,IAAA,CAAQ,cAAA,GAAiB,KAAA;AACzB,IAAA,IAAA,CAAQ,OAAA,GAA6C,IAAA;AAErD,IAAA,IAAA,CAAiB,iBAAiC,EAAC;AACnD,IAAA,IAAA,CAAQ,IAAA,GAA2C,UAAA;AACnD,IAAA,IAAA,CAAiB,WAAA,GAAc,IAAI,WAAA,EAAY;AAC/C,IAAA,IAAA,CAAQ,aAAA,GAAsC,IAAA;AAG5C,IAAA,IAAA,CAAK,MAAA,GAAS,IAAID,aAAAA,CAAc;AAAA,MAC9B,WAAA,EAAa,MAAA;AAAA,MACb,OAAA,EAAS;AAAA,KACV,CAAA;AAAA,EACH;AAAA,EAjFF;AAgEiG,IAAA,MAAA,CAAA,IAAA,EAAA,sBAAA,CAAA;AAAA;AAAA,EAmB/F,IAAI,aAAA,GAAyB;AAC3B,IAAA,OAAO,IAAA,CAAK,cAAA;AAAA,EACd;AAAA;AAAA;AAAA;AAAA,EAKA,IAAI,OAAA,GAAmB;AACrB,IAAA,OAAO,KAAK,cAAA,CAAe,IAAA,CAAK,CAAA,CAAA,KAAK,CAAA,CAAE,QAAQ,aAAa,CAAA;AAAA,EAC9D;AAAA;AAAA;AAAA;AAAA,EAKA,IAAY,QAAA,GAAmC;AAC7C,IAAA,OAAO,IAAA,CAAK,cAAA,CAAe,GAAA,CAAI,CAAA,CAAA,KAAK,EAAE,OAAO,CAAA;AAAA,EAC/C;AAAA;AAAA;AAAA;AAAA,EAKA,IAAY,kBAAA,GAAqC;AAC/C,IAAA,OAAO,KAAK,cAAA,CAAe,MAAA,CAAO,CAAA,CAAA,KAAK,CAAA,CAAE,QAAQ,aAAa,CAAA;AAAA,EAChE;AAAA;AAAA;AAAA;AAAA,EAKA,IAAY,cAAA,GAAiC;AAC3C,IAAA,OAAO,KAAK,kBAAA,CAAmB,MAAA,CAAO,CAAA,CAAA,KAAK,CAAC,EAAE,QAAQ,CAAA;AAAA,EACxD;AAAA;AAAA;AAAA;AAAA,EAKA,IAAY,eAAA,GAAkC;AAC5C,IAAA,OAAO,IAAA,CAAK,kBAAA,CAAmB,MAAA,CAAO,CAAA,CAAA,KAAK,EAAE,QAAQ,CAAA;AAAA,EACvD;AAAA;AAAA;AAAA;AAAA;AAAA,EAOQ,sBACN,KAAA,EAC8B;AAC9B,IAAA,OACE,SAAA,IAAa,KAAA,IACb,OAAQ,KAAA,CAA8B,SAAS,aAAA,KAAkB,SAAA;AAAA,EAErE;AAAA;AAAA;AAAA;AAAA,EAKQ,gBAAA,CACN,OACA,eAAA,EACwE;AACxE,IAAA,IAAI,IAAA,CAAK,qBAAA,CAAsB,KAAK,CAAA,EAAG;AACrC,MAAA,OAAO;AAAA,QACL,SAAS,KAAA,CAAM,OAAA;AAAA,QACf,QAAA,EAAU,MAAM,QAAA,IAAY,eAAA;AAAA,QAC5B,QAAA,EAAU,MAAM,QAAA,IAAY;AAAA,OAC9B;AAAA,IACF;AACA,IAAA,OAAO,EAAE,OAAA,EAAS,KAAA,EAAO,QAAA,EAAU,eAAA,EAAiB,UAAU,KAAA,EAAM;AAAA,EACtE;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOA,MAAM,WAAW,MAAA,EAAgF;AAC/F,IAAA,IAAI,KAAK,cAAA,EAAgB;AACvB,MAAA,IAAA,CAAK,MAAA,CAAO,KAAK,0CAA0C,CAAA;AAC3D,MAAA;AAAA,IACF;AAEA,IAAA,IAAA,CAAK,OAAA,GAAU,MAAA;AACf,IAAA,IAAA,CAAK,IAAA,GAAO,OAAO,IAAA,IAAQ,UAAA;AAG3B,IAAA,MAAM,UAA0B,EAAC;AAGjC,IAAA,IAAI,OAAO,OAAA,EAAS;AAClB,MAAA,OAAA,CAAQ,KAAK,IAAA,CAAK,gBAAA,CAAiB,MAAA,CAAO,OAAA,EAAS,CAAC,CAAC,CAAA;AAAA,IACvD;AACA,IAAA,IAAI,OAAO,QAAA,EAAU;AACnB,MAAA,MAAA,CAAO,QAAA,CAAS,OAAA,CAAQ,CAAC,CAAA,EAAG,KAAA,KAAU;AAEpC,QAAA,OAAA,CAAQ,KAAK,IAAA,CAAK,gBAAA,CAAiB,CAAA,EAAG,CAAC,KAAK,CAAC,CAAA;AAAA,MAC/C,CAAC,CAAA;AAAA,IACH;AAIA,IAAA,MAAM,mBAAmB,OAAA,CAAQ,IAAA;AAAA,MAC/B,OAAK,CAAA,CAAE,OAAA,CAAQ,aAAa,SAAA,IAAa,CAAA,CAAE,QAAQ,IAAA,KAAS;AAAA,KAC9D;AACA,IAAA,IAAI,CAAC,gBAAA,EAAkB;AACrB,MAAA,IAAA,CAAK,aAAA,GAAgB,IAAI,aAAA,EAAc;AACvC,MAAA,MAAM,IAAA,CAAK,cAAc,UAAA,CAAW;AAAA,QAClC,OAAA,EAAS,OAAO,OAAA,KAAY,KAAA;AAAA,QAC5B,aAAa,MAAA,CAAO,WAAA;AAAA,QACpB,aAAa,MAAA,CAAO,WAAA;AAAA,QACpB,aAAa,MAAA,CAAO;AAAA,OACrB,CAAA;AAED,MAAA,OAAA,CAAQ,IAAA,CAAK,EAAE,OAAA,EAAS,IAAA,CAAK,eAAe,QAAA,EAAU,IAAA,EAAO,QAAA,EAAU,IAAA,EAAM,CAAA;AAAA,IAC/E;AAGA,IAAA,OAAA,CAAQ,IAAA,CAAK,CAAC,CAAA,EAAG,CAAA,KAAM;AAErB,MAAA,IAAI,CAAA,CAAE,QAAA,KAAa,CAAA,CAAE,QAAA,EAAU;AAC7B,QAAA,OAAO,CAAA,CAAE,WAAW,CAAA,GAAI,EAAA;AAAA,MAC1B;AAEA,MAAA,OAAO,CAAA,CAAE,WAAW,CAAA,CAAE,QAAA;AAAA,IACxB,CAAC,CAAA;AAGD,IAAA,IAAA,CAAK,cAAA,CAAe,IAAA,CAAK,GAAG,OAAO,CAAA;AAEnC,IAAA,IAAA,CAAK,cAAA,GAAiB,IAAA;AAEtB,IAAA,IAAA,CAAK,MAAA,CAAO,MAAM,kCAAA,EAAoC;AAAA,MACpD,MAAM,IAAA,CAAK,IAAA;AAAA,MACX,YAAA,EAAc,KAAK,cAAA,CAAe,MAAA;AAAA,MAClC,YAAA,EAAc,KAAK,cAAA,CAAe,MAAA;AAAA,MAClC,aAAA,EAAe,KAAK,eAAA,CAAgB,MAAA;AAAA,MACpC,QAAA,EAAU,IAAA,CAAK,cAAA,CAAe,GAAA,CAAI,CAAA,CAAA,MAAM;AAAA,QACtC,IAAA,EAAM,EAAE,OAAA,CAAQ,IAAA;AAAA,QAChB,QAAA,EAAU,EAAE,OAAA,CAAQ,QAAA;AAAA,QACpB,UAAU,CAAA,CAAE,QAAA;AAAA,QACZ,UAAU,CAAA,CAAE,QAAA;AAAA,QACZ,WAAA,EAAa,EAAE,OAAA,CAAQ;AAAA,OACzB,CAAE;AAAA,KACH,CAAA;AAAA,EACH;AAAA,EAEA,MAAM,QAAA,GAA0B;AAC9B,IAAA,MAAM,OAAA,CAAQ,IAAI,IAAA,CAAK,QAAA,CAAS,IAAI,CAAA,OAAA,KAAW,OAAA,CAAQ,QAAA,EAAU,CAAC,CAAA;AAClE,IAAA,IAAA,CAAK,cAAA,GAAiB,KAAA;AACtB,IAAA,IAAA,CAAK,MAAA,CAAO,KAAK,gCAAgC,CAAA;AAAA,EACnD;AAAA,EAEA,MAAM,SAAA,GAA8B;AAClC,IAAA,IAAI,IAAA,CAAK,QAAA,CAAS,MAAA,KAAW,CAAA,EAAG;AAC9B,MAAA,OAAO,KAAA;AAAA,IACT;AAEA,IAAA,MAAM,OAAA,GAAU,MAAM,OAAA,CAAQ,GAAA;AAAA,MAC5B,IAAA,CAAK,QAAA,CAAS,GAAA,CAAI,CAAA,OAAA,KAAW,OAAA,CAAQ,WAAU,CAAE,KAAA,CAAM,MAAM,KAAK,CAAC;AAAA,KACrE;AAGA,IAAA,OAAO,IAAA,CAAK,SAAS,UAAA,GAAa,OAAA,CAAQ,MAAM,OAAO,CAAA,GAAI,OAAA,CAAQ,IAAA,CAAK,OAAO,CAAA;AAAA,EACjF;AAAA,EAEA,MAAM,KAAA,GAAuB;AAC3B,IAAA,MAAM,KAAK,iBAAA,CAAkB,OAAA,EAAS,CAAA,OAAA,KAAW,OAAA,CAAQ,OAAO,CAAA;AAAA,EAClE;AAAA;AAAA,EAIA,IAAY,MAAA,GAAqC;AAC/C,IAAA,OAAO,IAAA,CAAK,WAAW,EAAC;AAAA,EAC1B;AAAA,EAEA,MAAc,iBAAA,CACZ,SAAA,EACA,EAAA,EACe;AACf,IAAA,MAAM,UAAU,IAAA,CAAK,kBAAA;AACrB,IAAA,IAAI,OAAA,CAAQ,WAAW,CAAA,EAAG;AACxB,MAAA;AAAA,IACF;AAEA,IAAA,MAAM,OAAA,GAAU,IAAA,CAAK,MAAA,CAAO,cAAA,IAAkB,0BAAA;AAE9C,IAAA,QAAQ,KAAK,IAAA;AAAM,MACjB,KAAK,UAAA;AACH,QAAA,MAAM,IAAA,CAAK,2BAAA,CAA4B,SAAA,EAAW,EAAA,EAAI,OAAO,CAAA;AAC7D,QAAA;AAAA,MACF,KAAK,UAAA;AACH,QAAA,MAAM,IAAA,CAAK,2BAAA,CAA4B,SAAA,EAAW,EAAA,EAAI,OAAO,CAAA;AAC7D,QAAA;AAAA,MACF,KAAK,QAAA;AAAA,MACL;AACE,QAAA,MAAM,IAAA,CAAK,cAAc,SAAA,EAAW,OAAA,CAAQ,CAAC,CAAA,CAAE,OAAA,EAAS,IAAI,OAAO,CAAA;AACnE,QAAA;AAAA;AACJ,EACF;AAAA,EAEA,MAAc,aAAA,CACZ,SAAA,EACA,OAAA,EACA,IACA,OAAA,EACe;AACf,IAAA,IAAI;AACF,MAAA,MAAM,IAAA,CAAK,WAAA,CAAY,EAAA,CAAG,OAAO,GAAG,OAAO,CAAA;AAAA,IAC7C,SAAS,KAAA,EAAO;AACd,MAAA,IAAA,CAAK,OAAO,KAAA,CAAM,CAAA,EAAG,SAAS,CAAA,WAAA,EAAc,OAAA,CAAQ,IAAI,CAAA,CAAA,EAAI;AAAA,QAC1D,OAAO,KAAA,YAAiB,KAAA,GAAQ,KAAA,CAAM,OAAA,GAAU,OAAO,KAAK;AAAA,OAC7D,CAAA;AAAA,IACH;AAAA,EACF;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOA,MAAc,2BAAA,CACZ,SAAA,EACA,EAAA,EACA,OAAA,EACe;AACf,IAAA,MAAM,UAAU,IAAA,CAAK,cAAA;AACrB,IAAA,MAAM,WAAW,IAAA,CAAK,eAAA;AAGtB,IAAA,IAAI,OAAA,CAAQ,SAAS,CAAA,EAAG;AACtB,MAAA,MAAM,OAAA,GAAU,MAAM,OAAA,CAAQ,UAAA;AAAA,QAC5B,OAAA,CAAQ,GAAA,CAAI,CAAA,CAAA,KAAK,IAAA,CAAK,WAAA,CAAY,GAAG,CAAA,CAAE,OAAO,CAAA,EAAG,OAAO,CAAC;AAAA,OAC3D;AAEA,MAAA,MAAM,SAAS,OAAA,CACZ,GAAA;AAAA,QAAI,CAAC,CAAA,EAAG,CAAA,KACP,CAAA,CAAE,MAAA,KAAW,aAAa,EAAE,OAAA,EAAS,OAAA,CAAQ,CAAC,EAAE,OAAA,CAAQ,IAAA,EAAM,KAAA,EAAO,CAAA,CAAE,QAAO,GAAI;AAAA,OACpF,CACC,OAAO,OAAO,CAAA;AAEjB,MAAA,MAAM,SAAA,GAAY,MAAA,CAAO,MAAA,KAAW,OAAA,CAAQ,MAAA;AAE5C,MAAA,IAAI,MAAA,CAAO,MAAA,GAAS,CAAA,IAAK,CAAC,SAAA,EAAW;AACnC,QAAA,IAAA,CAAK,OAAO,IAAA,CAAK,CAAA,EAAG,SAAS,CAAA,gCAAA,CAAA,EAAoC,EAAE,QAAQ,CAAA;AAAA,MAC7E;AAGA,MAAA,IAAI,SAAA,IAAa,QAAA,CAAS,MAAA,GAAS,CAAA,EAAG;AACpC,QAAA,IAAA,CAAK,OAAO,IAAA,CAAK,CAAA,EAAG,SAAS,CAAA,+CAAA,CAAA,EAAmD,EAAE,QAAQ,CAAA;AAC1F,QAAA,MAAM,IAAA,CAAK,eAAA;AAAA,UACT,SAAA;AAAA,UACA,QAAA,CAAS,GAAA,CAAI,CAAA,CAAA,KAAK,CAAA,CAAE,OAAO,CAAA;AAAA,UAC3B,EAAA;AAAA,UACA;AAAA,SACF;AACA,QAAA;AAAA,MACF;AAEA,MAAA,IAAI,IAAA,CAAK,MAAA,CAAO,cAAA,IAAkB,MAAA,CAAO,SAAS,CAAA,EAAG;AACnD,QAAA,MAAM,IAAI,gBAAA;AAAA,UACR,CAAA,EAAG,SAAS,CAAA,qBAAA,EAAwB,MAAA,CAAO,GAAA,CAAI,CAAA,CAAA,KAAK,CAAA,EAAG,OAAO,CAAA,CAAE,IAAA,CAAK,IAAI,CAAC,CAAA,CAAA;AAAA,UAC1ED,aAAAA,CAAY;AAAA,SACd;AAAA,MACF;AAAA,IACF,CAAA,MAAA,IAAW,QAAA,CAAS,MAAA,GAAS,CAAA,EAAG;AAE9B,MAAA,MAAM,IAAA,CAAK,eAAA;AAAA,QACT,SAAA;AAAA,QACA,QAAA,CAAS,GAAA,CAAI,CAAA,CAAA,KAAK,CAAA,CAAE,OAAO,CAAA;AAAA,QAC3B,EAAA;AAAA,QACA;AAAA,OACF;AAAA,IACF;AAAA,EACF;AAAA,EAEA,MAAc,eAAA,CACZ,SAAA,EACA,QAAA,EACA,IACA,OAAA,EACe;AACf,IAAA,MAAM,OAAA,GAAU,MAAM,OAAA,CAAQ,UAAA;AAAA,MAC5B,QAAA,CAAS,IAAI,CAAA,OAAA,KAAW,IAAA,CAAK,YAAY,EAAA,CAAG,OAAO,CAAA,EAAG,OAAO,CAAC;AAAA,KAChE;AAEA,IAAA,MAAM,SAAS,OAAA,CACZ,GAAA;AAAA,MAAI,CAAC,CAAA,EAAG,CAAA,KACP,CAAA,CAAE,WAAW,UAAA,GAAa,EAAE,OAAA,EAAS,QAAA,CAAS,CAAC,CAAA,CAAE,IAAA,EAAM,KAAA,EAAO,CAAA,CAAE,QAAO,GAAI;AAAA,KAC7E,CACC,OAAO,OAAO,CAAA;AAEjB,IAAA,IAAI,MAAA,CAAO,SAAS,CAAA,EAAG;AACrB,MAAA,IAAA,CAAK,OAAO,IAAA,CAAK,CAAA,EAAG,SAAS,CAAA,wBAAA,CAAA,EAA4B,EAAE,QAAQ,CAAA;AAAA,IACrE;AAAA,EACF;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOA,MAAc,2BAAA,CACZ,SAAA,EACA,EAAA,EACA,OAAA,EACe;AACf,IAAA,MAAM,UAAU,IAAA,CAAK,cAAA;AACrB,IAAA,MAAM,WAAW,IAAA,CAAK,eAAA;AAGtB,IAAA,KAAA,MAAW,SAAS,OAAA,EAAS;AAC3B,MAAA,IAAI;AACF,QAAA,MAAM,KAAK,WAAA,CAAY,EAAA,CAAG,KAAA,CAAM,OAAO,GAAG,OAAO,CAAA;AACjD,QAAA;AAAA,MACF,SAAS,KAAA,EAAO;AACd,QAAA,MAAM,SAAA,GAAY,KAAA,YAAiB,KAAA,GAAQ,KAAA,CAAM,IAAA,GAAO,OAAA;AACxD,QAAA,MAAM,cAAA,GACJ,CAAC,IAAA,CAAK,MAAA,CAAO,oBAAoB,IAAA,CAAK,MAAA,CAAO,gBAAA,CAAiB,QAAA,CAAS,SAAS,CAAA;AAElF,QAAA,IAAI,cAAA,EAAgB;AAClB,UAAA,IAAA,CAAK,MAAA,CAAO,KAAK,CAAA,EAAG,SAAS,cAAc,KAAA,CAAM,OAAA,CAAQ,IAAI,CAAA,aAAA,CAAA,EAAiB;AAAA,YAC5E,OAAO,KAAA,YAAiB,KAAA,GAAQ,KAAA,CAAM,OAAA,GAAU,OAAO,KAAK;AAAA,WAC7D,CAAA;AACD,UAAA;AAAA,QACF;AACA,QAAA,MAAM,KAAA;AAAA,MACR;AAAA,IACF;AAGA,IAAA,KAAA,MAAW,SAAS,QAAA,EAAU;AAC5B,MAAA,IAAI;AACF,QAAA,MAAM,KAAK,WAAA,CAAY,EAAA,CAAG,KAAA,CAAM,OAAO,GAAG,OAAO,CAAA;AACjD,QAAA;AAAA,MACF,SAAS,KAAA,EAAO;AACd,QAAA,IAAA,CAAK,MAAA,CAAO,KAAK,CAAA,EAAG,SAAS,uBAAuB,KAAA,CAAM,OAAA,CAAQ,IAAI,CAAA,CAAA,EAAI;AAAA,UACxE,OAAO,KAAA,YAAiB,KAAA,GAAQ,KAAA,CAAM,OAAA,GAAU,OAAO,KAAK;AAAA,SAC7D,CAAA;AAAA,MAEH;AAAA,IACF;AAEA,IAAA,IAAA,CAAK,MAAA,CAAO,KAAA,CAAM,CAAA,EAAG,SAAS,CAAA,8CAAA,CAAgD,CAAA;AAAA,EAChF;AAAA,EAEA,MAAc,WAAA,CAAe,OAAA,EAAqB,SAAA,EAA+B;AAC/E,IAAA,OAAO,QAAQ,IAAA,CAAK;AAAA,MAClB,OAAA;AAAA,MACA,IAAI,OAAA;AAAA,QAAW,CAAC,CAAA,EAAG,MAAA,KACjB,UAAA,CAAW,MAAM,MAAA,CAAO,IAAI,KAAA,CAAM,CAAA,0BAAA,EAA6B,SAAS,CAAA,EAAA,CAAI,CAAC,GAAG,SAAS;AAAA;AAC3F,KACD,CAAA;AAAA,EACH;AAAA;AAAA,EAIA,MAAM,aAAa,MAAA,EAA+B;AAChD,IAAA,MAAM,KAAK,iBAAA,CAAkB,cAAA,EAAgB,aAAW,OAAA,CAAQ,YAAA,CAAa,MAAM,CAAC,CAAA;AAAA,EACtF;AAAA,EAEA,MAAM,gBAAA,CACJ,IAAA,EACA,KAAA,GAAgB,GAChB,IAAA,EACe;AACf,IAAA,MAAM,IAAA,CAAK,iBAAA;AAAA,MAAkB,kBAAA;AAAA,MAAoB,CAAA,OAAA,KAC/C,OAAA,CAAQ,gBAAA,CAAiB,IAAA,EAAM,OAAO,IAAI;AAAA,KAC5C;AAAA,EACF;AAAA,EAEA,MAAM,QAAA,CAAS,IAAA,EAAc,KAAA,EAAe,IAAA,EAA8C;AACxF,IAAA,MAAM,IAAA,CAAK,kBAAkB,UAAA,EAAY,CAAA,OAAA,KAAW,QAAQ,QAAA,CAAS,IAAA,EAAM,KAAA,EAAO,IAAI,CAAC,CAAA;AAAA,EACzF;AAAA,EAEA,MAAM,eAAA,CAAgB,IAAA,EAAc,KAAA,EAAe,IAAA,EAA8C;AAC/F,IAAA,MAAM,IAAA,CAAK,iBAAA;AAAA,MAAkB,iBAAA;AAAA,MAAmB,CAAA,OAAA,KAC9C,OAAA,CAAQ,eAAA,CAAgB,IAAA,EAAM,OAAO,IAAI;AAAA,KAC3C;AAAA,EACF;AAAA;AAAA,EAIA,UAAU,OAAA,EAA4B;AAEpC,IAAA,MAAM,KAAA,GAAQ,IAAA,CAAK,kBAAA,CAAmB,CAAC,CAAA;AACvC,IAAA,OAAO,KAAA,EAAO,QAAQ,SAAA,CAAU,OAAO,KAAK,IAAA,CAAK,WAAA,CAAY,UAAU,OAAO,CAAA;AAAA,EAChF;AAAA,EAEA,MAAM,QAAA,CAAY,OAAA,EAAsB,EAAA,EAA4C;AAClF,IAAA,MAAM,KAAA,GAAQ,IAAA,CAAK,kBAAA,CAAmB,CAAC,CAAA;AACvC,IAAA,IAAI,CAAC,KAAA,EAAO;AACV,MAAA,OAAO,EAAA,CAAG,IAAA,CAAK,WAAA,CAAY,SAAA,CAAU,OAAO,CAAC,CAAA;AAAA,IAC/C;AACA,IAAA,OAAO,KAAA,CAAM,OAAA,CAAQ,QAAA,CAAS,OAAA,EAAS,EAAE,CAAA;AAAA,EAC3C;AAAA,EAEA,aAAA,GAA6B;AAC3B,IAAA,MAAM,KAAA,GAAQ,IAAA,CAAK,kBAAA,CAAmB,CAAC,CAAA;AACvC,IAAA,OAAO,KAAA,EAAO,OAAA,CAAQ,aAAA,EAAc,IAAK,IAAA;AAAA,EAC3C;AAAA;AAAA,EAIA,MAAM,IAAI,KAAA,EAAgC;AACxC,IAAA,MAAM,KAAK,iBAAA,CAAkB,KAAA,EAAO,aAAW,OAAA,CAAQ,GAAA,CAAI,KAAK,CAAC,CAAA;AAAA,EACnE;AAAA;AAAA,EAIA,MAAM,UAAU,KAAA,EAA0C;AACxD,IAAA,MAAM,KAAK,iBAAA,CAAkB,WAAA,EAAa,aAAW,OAAA,CAAQ,SAAA,CAAU,KAAK,CAAC,CAAA;AAAA,EAC/E;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAuBA,MAAM,cAAA,CACJ,OAAA,EACA,SAAA,EAC4D;AAC5D,IAAA,MAAM,SAAA,GAAY,OAAA,CAAQ,SAAA,IAAa,IAAA,CAAK,GAAA,EAAI;AAGhD,IAAA,MAAM,IAAA,GAAO,KAAK,SAAA,CAAU;AAAA,MAC1B,MAAM,CAAA,EAAG,OAAA,CAAQ,WAAW,CAAA,CAAA,EAAI,QAAQ,SAAS,CAAA,CAAA;AAAA,MACjD,UAAA,EAAY;AAAA,QACV,gBAAgB,OAAA,CAAQ,WAAA;AAAA,QACxB,kBAAkB,OAAA,CAAQ,SAAA;AAAA,QAC1B,GAAI,OAAA,CAAQ,UAAA,IAAc,EAAE,aAAA,EAAe,QAAQ,UAAA,EAAW;AAAA,QAC9D,GAAI,OAAA,CAAQ,QAAA,IAAY,EAAE,WAAA,EAAa,QAAQ,QAAA,EAAS;AAAA,QACxD,GAAG,OAAA,CAAQ;AAAA,OACb;AAAA,MACA,eAAe,OAAA,CAAQ;AAAA,KACxB,CAAA;AAGD,IAAA,MAAM,IAAA,CAAK,gBAAA,CAAiB,qBAAA,CAAsB,uBAAA,EAAyB,CAAA,EAAG;AAAA,MAC5E,SAAS,OAAA,CAAQ,WAAA;AAAA,MACjB,WAAW,OAAA,CAAQ,SAAA;AAAA,MACnB,GAAI,OAAA,CAAQ,UAAA,IAAc,EAAE,WAAA,EAAa,QAAQ,UAAA;AAAW,KAC7D,CAAA;AAED,IAAA,IAAI;AACF,MAAA,MAAM,MAAA,GAAS,MAAM,SAAA,EAAU;AAC/B,MAAA,MAAM,QAAA,GAAW,IAAA,CAAK,GAAA,EAAI,GAAI,SAAA;AAE9B,MAAA,IAAA,CAAK,UAAU,IAAI,CAAA;AAEnB,MAAA,MAAM,IAAA,CAAK,eAAA,CAAgB,qBAAA,CAAsB,0BAAA,EAA4B,QAAA,EAAU;AAAA,QACrF,SAAS,OAAA,CAAQ,WAAA;AAAA,QACjB,WAAW,OAAA,CAAQ,SAAA;AAAA,QACnB,MAAA,EAAQ;AAAA,OACT,CAAA;AAED,MAAA,OAAO;AAAA,QACL,MAAA;AAAA,QACA,SAAS,EAAE,OAAA,EAAS,IAAA,EAAM,QAAA,EAAU,MAAM,MAAA;AAAO,OACnD;AAAA,IACF,SAAS,KAAA,EAAO;AACd,MAAA,MAAM,QAAA,GAAW,IAAA,CAAK,GAAA,EAAI,GAAI,SAAA;AAE9B,MAAA,IAAA,CAAK,SAAA,CAAU,SAAS,KAAA,YAAiB,KAAA,GAAQ,MAAM,OAAA,GAAU,MAAA,CAAO,KAAK,CAAC,CAAA;AAC9E,MAAA,IAAI,iBAAiB,KAAA,EAAO;AAC1B,QAAA,IAAA,CAAK,gBAAgB,KAAK,CAAA;AAAA,MAC5B;AAEA,MAAA,MAAM,IAAA,CAAK,gBAAA,CAAiB,qBAAA,CAAsB,uBAAA,EAAyB,CAAA,EAAG;AAAA,QAC5E,SAAS,OAAA,CAAQ,WAAA;AAAA,QACjB,WAAW,OAAA,CAAQ,SAAA;AAAA,QACnB,UAAA,EAAY,KAAA,YAAiB,KAAA,GAAQ,KAAA,CAAM,IAAA,GAAO;AAAA,OACnD,CAAA;AAED,MAAA,MAAM,IAAA,CAAK,eAAA,CAAgB,qBAAA,CAAsB,0BAAA,EAA4B,QAAA,EAAU;AAAA,QACrF,SAAS,OAAA,CAAQ,WAAA;AAAA,QACjB,WAAW,OAAA,CAAQ,SAAA;AAAA,QACnB,MAAA,EAAQ;AAAA,OACT,CAAA;AAED,MAAA,MAAM,KAAA;AAAA,IACR,CAAA,SAAE;AACA,MAAA,IAAA,CAAK,GAAA,EAAI;AAAA,IACX;AAAA,EACF;AACF,CAAA;AA8BA,eAAsB,0BAAA,CACpB,MAAA,GAAsF,EAAC,EACxD;AAC/B,EAAA,MAAM,OAAA,GAAU,IAAI,oBAAA,EAAqB;AACzC,EAAA,MAAM,OAAA,CAAQ,WAAW,MAAM,CAAA;AAC/B,EAAA,OAAO,OAAA;AACT;AANsB,MAAA,CAAA,0BAAA,EAAA,4BAAA,CAAA;;;ACpjBtB,IAAI,gBAAkC,EAAC;AAsChC,SAAS,kBACd,GAAA,EACiC;AACjC,EAAA,OAAO,cAAc,GAAG,CAAA;AAC1B;AAJgB,MAAA,CAAA,iBAAA,EAAA,mBAAA,CAAA;;;ACGT,IAAM,eAAA,GAAN,MAAM,gBAAA,CAAgB;AAAA,EA1F7B;AA0F6B,IAAA,MAAA,CAAA,IAAA,EAAA,iBAAA,CAAA;AAAA;AAAA,EAC3B;AAAA,IAAA,IAAA,CAAwB,MAAA,GAAS,IAAIC,aAAAA,CAAc;AAAA,MACjD,WAAA,EAAa,MAAA;AAAA,MACb,OAAA,EAAS;AAAA,KACV,CAAA;AAAA;AAAA,EAGD;AAAA;AAAA,IAAA,IAAA,CAAe,SAAA,uBAAgB,GAAA,EAAuC;AAAA;AAAA,EAGtE;AAAA;AAAA,IAAA,IAAA,CAAe,QAAA,uBAAe,GAAA,EAA4B;AAAA;AAAA,EAG1D;AAAA;AAAA,IAAA,IAAA,CAAe,SAAA,uBAAgB,GAAA,EAA6B;AAAA;AAAA,EAG5D;AAAA;AAAA,IAAA,IAAA,CAAe,YAAA,GAAkE,aAAA;AAAA;AAAA,EAGjF;AAAA;AAAA,IAAA,IAAA,CAAe,QAAA,GAAmC,MAAA;AAAA;AAAA,EAGlD;AAAA;AAAA,IAAA,IAAA,CAAe,iBAAA,GAA6C,IAAA;AAAA;AAAA,EAG5D;AAAA;AAAA,IAAA,IAAA,CAAe,SAAA,GAAiD,IAAA;AAAA;AAAA,EAGhE;AAAA;AAAA,IAAA,IAAA,CAAe,YAAA,GAAuC,IAAA;AAAA;AAAA,EAGtD;AAAA;AAAA,IAAA,IAAA,CAAe,oBAAA,GAAuD,IAAA;AAAA;AAAA,EAGtE;AAAA;AAAA,IAAA,IAAA,CAAe,sBAAA,GAAsD,IAAA;AAAA;AAAA,EAGrE;AAAA;AAAA,IAAA,IAAA,CAAe,cAAA,GAA2C,IAAA;AAAA;AAAA,EAG1D;AAAA;AAAA,IAAA,IAAA,CAAe,oBAAA,GAAsD,IAAA;AAAA;AAAA,EAGrE;AAAA;AAAA,IAAA,IAAA,CAAe,cAAA,GAEJ,IAAA;AAAA;AAAA,EAGX;AAAA;AAAA,IAAA,IAAA,CAAe,aAAA,uBAAoB,GAAA,EAAgD;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAuBnF,aAAa,WAAW,MAAA,EAAkD;AACxE,IAAA,gBAAA,CAAgB,YAAA,GAAe,OAAO,WAAA,IAAe,aAAA;AACrD,IAAA,gBAAA,CAAgB,QAAA,GAAW,OAAO,OAAA,IAAW,MAAA;AAC7C,IAAA,gBAAA,CAAgB,iBAAA,GAAoB,OAAO,SAAA,IAAa,IAAA;AACxD,IAAA,gBAAA,CAAgB,SAAA,GAAY,OAAO,EAAA,IAAM,IAAA;AACzC,IAAA,gBAAA,CAAgB,YAAA,GAAe,OAAO,KAAA,IAAS,IAAA;AAC/C,IAAA,gBAAA,CAAgB,oBAAA,GAAuB,OAAO,aAAA,IAAiB,IAAA;AAC/D,IAAA,gBAAA,CAAgB,cAAA,GAAiB,OAAO,OAAA,IAAW,IAAA;AACnD,IAAA,gBAAA,CAAgB,oBAAA,GAAuB,OAAO,aAAA,IAAiB,IAAA;AAC/D,IAAA,gBAAA,CAAgB,cAAA,GAAiB,OAAO,MAAA,IAAU,IAAA;AAElD,IAAA,MAAM,oBAAqC,EAAC;AAE5C,IAAA,KAAA,MAAW,KAAA,IAAS,OAAO,QAAA,EAAU;AACnC,MAAA,MAAM,UAAA,GAAa,MAAM,OAAA,CAAQ,UAAA;AACjC,MAAA,MAAM,QAAA,GAAW,KAAA,CAAM,MAAA,CAAO,QAAA,IAAY,WAAA;AAC1C,MAAA,MAAM,OAAA,GAAU,KAAA,CAAM,MAAA,CAAO,OAAA,KAAY,KAAA;AACzC,MAAA,MAAM,WAAA,GAAc,KAAA,CAAM,MAAA,CAAO,SAAA,KAAc,KAAA;AAG/C,MAAA,gBAAA,CAAgB,UAAU,GAAA,CAAI,UAAA,EAAY,EAAE,KAAA,EAAO,aAAa,CAAA;AAGhE,MAAA,IAAI,CAAC,OAAA,EAAS;AACZ,QAAA,gBAAA,CAAgB,MAAA,CAAO,KAAA,CAAM,CAAA,QAAA,EAAW,UAAU,CAAA,sBAAA,CAAwB,CAAA;AAC1E,QAAA;AAAA,MACF;AAGA,MAAA,IAAI,QAAA,KAAa,eAAe,WAAA,EAAa;AAE3C,QAAA,iBAAA,CAAkB,IAAA;AAAA,UAChB,gBAAA,CAAgB,iBAAA,CAAkB,KAAK,CAAA,CAAE,KAAK,MAAM;AAClD,YAAA,gBAAA,CAAgB,MAAA,CAAO,KAAA,CAAM,CAAA,QAAA,EAAW,UAAU,CAAA,wBAAA,CAA0B,CAAA;AAAA,UAC9E,CAAC;AAAA,SACH;AAAA,MACF,WAAW,WAAA,EAAa;AAEtB,QAAA,gBAAA,CAAgB,SAAS,GAAA,CAAI,UAAA,EAAY,EAAE,KAAA,EAAO,UAAU,CAAA;AAC5D,QAAA,gBAAA,CAAgB,MAAA,CAAO,KAAA;AAAA,UACrB,CAAA,QAAA,EAAW,UAAU,CAAA,gBAAA,EAAmB,QAAQ,CAAA,eAAA;AAAA,SAClD;AAAA,MACF,CAAA,MAAO;AAEL,QAAA,gBAAA,CAAgB,MAAA,CAAO,KAAA;AAAA,UACrB,WAAW,UAAU,CAAA,yCAAA;AAAA,SACvB;AAAA,MACF;AAAA,IACF;AAGA,IAAA,MAAM,OAAA,CAAQ,IAAI,iBAAiB,CAAA;AAEnC,IAAA,MAAM,kBAAkB,CAAC,GAAG,gBAAA,CAAgB,SAAA,CAAU,MAAM,CAAA;AAC5D,IAAA,MAAM,cAAc,CAAC,GAAG,gBAAA,CAAgB,QAAA,CAAS,MAAM,CAAA;AACvD,IAAA,MAAM,gBAAA,GAAmB,CAAC,GAAG,gBAAA,CAAgB,UAAU,OAAA,EAAS,CAAA,CAC7D,MAAA,CAAO,CAAC,GAAG,IAAI,CAAA,KAAM,CAAC,IAAA,CAAK,WAAW,CAAA,CACtC,IAAI,CAAC,CAAC,GAAG,CAAA,KAAM,GAAG,CAAA;AAErB,IAAA,gBAAA,CAAgB,MAAA,CAAO,KAAK,8BAAA,EAAgC;AAAA,MAC1D,WAAA,EAAa,eAAA;AAAA,MACb,OAAA,EAAS,WAAA;AAAA,MACT,YAAA,EAAc;AAAA,KACf,CAAA;AAAA,EACH;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAoBA,OAAO,IAAqE,GAAA,EAAgB;AAC1F,IAAA,MAAM,OAAA,GAAU,gBAAA,CAAgB,SAAA,CAAU,GAAA,CAAI,GAAG,CAAA;AACjD,IAAA,IAAI,OAAA,EAAS;AACX,MAAA,OAAO,OAAA;AAAA,IACT;AAGA,IAAA,MAAM,QAAA,GAAW,gBAAA,CAAgB,SAAA,CAAU,GAAA,CAAI,GAAG,CAAA;AAClD,IAAA,IAAI,QAAA,IAAY,CAAC,QAAA,CAAS,WAAA,EAAa;AACrC,MAAA,MAAM,IAAIF,gBAAAA;AAAA,QACR,CAAA,SAAA,EAAY,GAAG,CAAA,oEAAA,EACwB,GAAG,CAAA,4BAAA,CAAA;AAAA,QAC1CC,WAAAA,CAAY;AAAA,OACd;AAAA,IACF;AAGA,IAAA,MAAM,OAAA,GAAU,gBAAA,CAAgB,QAAA,CAAS,GAAA,CAAI,GAAG,CAAA;AAChD,IAAA,IAAI,OAAA,EAAS;AACX,MAAA,MAAM,IAAID,gBAAAA;AAAA,QACR,CAAA,SAAA,EAAY,GAAG,CAAA,6EAAA,EAC0B,GAAG,CAAA,WAAA,CAAA;AAAA,QAC5CC,WAAAA,CAAY;AAAA,OACd;AAAA,IACF;AAEA,IAAA,MAAM,IAAID,gBAAAA;AAAA,MACR,YAAY,GAAG,CAAA,wDAAA,CAAA;AAAA,MACfC,WAAAA,CAAY;AAAA,KACd;AAAA,EACF;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,EA6BA,aAAa,MAAA,CACX,GAAA,EACA,eAAA,EACY;AACZ,IAAA,MAAM,QAAA,GAAW,gBAAA,CAAgB,SAAA,CAAU,GAAA,CAAI,GAAG,CAAA;AAClD,IAAA,IAAI,CAAC,QAAA,EAAU;AACb,MAAA,MAAM,IAAID,gBAAAA;AAAA,QACR,YAAY,GAAG,CAAA,wDAAA,CAAA;AAAA,QACfC,WAAAA,CAAY;AAAA,OACd;AAAA,IACF;AAGA,IAAA,MAAM,WAAA,GAAgC;AAAA,MACpC,OAAA,EAAS,SAAS,KAAA,CAAM,OAAA;AAAA,MACxB,QAAQ,EAAE,GAAG,SAAS,KAAA,CAAM,MAAA,EAAQ,GAAG,eAAA;AAAgB,KACzD;AAGA,IAAA,OAAO,gBAAA,CAAgB,iBAAA,CAAkB,WAAA,EAAa,KAAK,CAAA;AAAA,EAC7D;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAeA,aAAa,SACX,GAAA,EACY;AAEZ,IAAA,MAAM,QAAA,GAAW,gBAAA,CAAgB,SAAA,CAAU,GAAA,CAAI,GAAG,CAAA;AAClD,IAAA,IAAI,QAAA,EAAU;AACZ,MAAA,OAAO,QAAA;AAAA,IACT;AAGA,IAAA,MAAM,UAAA,GAAa,gBAAA,CAAgB,aAAA,CAAc,GAAA,CAAI,GAAG,CAAA;AACxD,IAAA,IAAI,UAAA,EAAY;AACd,MAAA,OAAQ,MAAM,UAAA;AAAA,IAChB;AAGA,IAAA,MAAM,OAAA,GAAU,gBAAA,CAAgB,QAAA,CAAS,GAAA,CAAI,GAAG,CAAA;AAChD,IAAA,IAAI,OAAA,EAAS;AAEX,MAAA,IAAI,OAAO,OAAA,CAAQ,QAAA,KAAa,UAAA,EAAY;AAC1C,QAAA,MAAM,UAAA,GAAa,MAAM,OAAA,CAAQ,QAAA,EAAS;AAC1C,QAAA,IAAI,CAAC,UAAA,EAAY;AACf,UAAA,MAAM,IAAID,gBAAAA;AAAA,YACR,YAAY,GAAG,CAAA,yCAAA,CAAA;AAAA,YACfC,WAAAA,CAAY;AAAA,WACd;AAAA,QACF;AAAA,MACF;AAGA,MAAA,MAAM,OAAA,GAAU,MAAM,gBAAA,CAAgB,iBAAA,CAAkB,QAAQ,KAAK,CAAA;AACrE,MAAA,gBAAA,CAAgB,QAAA,CAAS,OAAO,GAAG,CAAA;AACnC,MAAA,OAAO,OAAA;AAAA,IACT;AAEA,IAAA,MAAM,IAAID,gBAAAA;AAAA,MACR,YAAY,GAAG,CAAA,wDAAA,CAAA;AAAA,MACfC,WAAAA,CAAY;AAAA,KACd;AAAA,EACF;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOA,OAAO,IAAI,GAAA,EAAsB;AAC/B,IAAA,OAAO,gBAAA,CAAgB,UAAU,GAAA,CAAI,GAAG,KAAK,gBAAA,CAAgB,QAAA,CAAS,IAAI,GAAG,CAAA;AAAA,EAC/E;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOA,OAAO,cAAc,GAAA,EAAsB;AACzC,IAAA,OAAO,gBAAA,CAAgB,SAAA,CAAU,GAAA,CAAI,GAAG,CAAA;AAAA,EAC1C;AAAA;AAAA;AAAA;AAAA,EAKA,OAAO,kBAAA,GAA+B;AACpC,IAAA,OAAO,CAAC,GAAG,gBAAA,CAAgB,SAAA,CAAU,MAAM,CAAA;AAAA,EAC7C;AAAA;AAAA;AAAA;AAAA,EAKA,OAAO,cAAA,GAA2B;AAChC,IAAA,OAAO,CAAC,GAAG,gBAAA,CAAgB,QAAA,CAAS,MAAM,CAAA;AAAA,EAC5C;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAQA,aAAqB,qBAAA,CACnB,MAAA,EACA,KAAA,EAC6F;AAC7F,IAAA,MAAM,qBAAqB,MAAA,CAAO,kBAAA;AAClC,IAAA,MAAM,WAAA,GAAc,kBAAA,KAAuB,IAAA,IAAQ,OAAO,kBAAA,KAAuB,QAAA;AACjF,IAAA,MAAM,UAAA,GAAa,MAAM,OAAA,CAAQ,UAAA;AAEjC,IAAA,MAAM,UAAwC,WAAA,GAC1C,OAAO,kBAAA,KAAuB,QAAA,GAC5B,EAAE,GAAG,gBAAA,CAAgB,iBAAA,EAAmB,GAAG,oBAAmB,GAC7D,gBAAA,CAAgB,iBAAA,IAAqB,MAAA,GACvC,iBAAgB,iBAAA,IAAqB,MAAA;AAE1C,IAAA,IAAI,CAAC,OAAA,EAAS;AACZ,MAAA,OAAO,MAAA;AAAA,IACT;AAGA,IAAA,IAAI,WAAA;AACJ,IAAA,IAAI,eAAe,OAAA,EAAS;AAE1B,MAAA,IAAI;AAEF,QAAA,MAAM,SAAA,GAAY;AAAA,UAChB,KAAK,gBAAA,CAAgB,YAAA;AAAA,UACrB,YAAA,EAAc;AAAA;AAAA,SAChB;AACA,QAAA,WAAA,GAAc,MAAM,gBAAA,CAAiB,cAAA,CAAe,SAAA,EAAW,OAAO,CAAA;AACtE,QAAA,gBAAA,CAAgB,MAAA,CAAO,KAAA;AAAA,UACrB,sDAAsD,UAAU,CAAA,CAAA,CAAA;AAAA,UAChE;AAAA,YACE,aAAa,gBAAA,CAAgB;AAAA;AAC/B,SACF;AAAA,MACF,SAAS,KAAA,EAAO;AACd,QAAA,gBAAA,CAAgB,MAAA,CAAO,IAAA;AAAA,UACrB,sDAAsD,UAAU,CAAA,CAAA,CAAA;AAAA,UAChE;AAAA,YACE,OAAO,KAAA,YAAiB,KAAA,GAAQ,KAAA,CAAM,OAAA,GAAU,OAAO,KAAK;AAAA;AAC9D,SACF;AAAA,MACF;AAAA,IACF,CAAA,MAAO;AAEL,MAAA,IAAI;AACF,QAAA,WAAA,GAAc,iBAAiB,SAAA,EAAU;AAAA,MAC3C,CAAA,CAAA,MAAQ;AACN,QAAA,gBAAA,CAAgB,MAAA,CAAO,KAAA;AAAA,UACrB,+CAA+C,UAAU,CAAA,mBAAA;AAAA,SAC3D;AAAA,MACF;AAAA,IACF;AAEA,IAAA,OAAO;AAAA,MACL,SAAA,EAAW,WAAA;AAAA,MACX,OAAA;AAAA,MACA,QAAA,EAAU;AAAA,KACZ;AAAA,EACF;AAAA;AAAA;AAAA,EAIA,aAAqB,aAAA,CACnB,MAAA,EACA,KAAA,EAQA;AACA,IAAA,MAAM,cAAc,MAAA,CAAO,WAAA;AAC3B,IAAA,MAAM,WAAA,GAAc,WAAA,KAAgB,IAAA,IAAQ,OAAO,WAAA,KAAgB,QAAA;AACnE,IAAA,MAAM,UAAA,GAAa,MAAM,OAAA,CAAQ,UAAA;AAGjC,IAAA,MAAM,gBAAA,GAAmB,gBAAA,CAAiB,QAAA,CAAS,gBAAA,CAAgB,QAAQ,CAAA;AAE3E,IAAA,IAAA,CAAK,WAAA,IAAe,gBAAA,CAAgB,SAAA,KAAc,CAAC,gBAAA,EAAkB;AACnE,MAAA,gBAAA,CAAgB,MAAA,CAAO,IAAA;AAAA,QACrB,CAAA,SAAA,EAAY,UAAU,CAAA,uCAAA,EAA0C,gBAAA,CAAgB,QAAQ,CAAA,2DAAA,EACnC,gBAAA,CAAiB,IAAA,CAAK,IAAI,CAAC,CAAA,8CAAA;AAAA,OAElF;AACA,MAAA,OAAO,MAAA;AAAA,IACT;AAEA,IAAA,MAAM,WAAqD,WAAA,GACvD,OAAO,WAAA,KAAgB,QAAA,GACrB,EAAE,GAAG,gBAAA,CAAgB,SAAA,EAAW,GAAG,aAAY,GAC9C,gBAAA,CAAgB,SAAA,IAAa,MAAA,GAC/B,iBAAgB,SAAA,IAAa,MAAA;AAElC,IAAA,IAAI,CAAC,QAAA,EAAU;AACb,MAAA,OAAO,MAAA;AAAA,IACT;AAEA,IAAA,MAAM,SAAA,GAAY,kBAAkB,WAAW,CAAA;AAC/C,IAAA,IAAI,CAAC,SAAA,EAAW;AACd,MAAA,gBAAA,CAAgB,MAAA,CAAO,KAAA;AAAA,QACrB,sCAAsC,UAAU,CAAA,kBAAA;AAAA,OAClD;AACA,MAAA,OAAO,MAAA;AAAA,IACT;AAGA,IAAA,IAAI,UAAA;AACJ,IAAA,IAAI,eAAe,QAAA,EAAU;AAE3B,MAAA,IAAI;AACF,QAAA,UAAA,GAAa,MAAM,SAAA,CAAU,cAAA,GAAiB,QAA+B,CAAA;AAC7E,QAAA,gBAAA,CAAgB,MAAA,CAAO,KAAA;AAAA,UACrB,oDAAoD,UAAU,CAAA,CAAA;AAAA,SAChE;AAAA,MACF,SAAS,KAAA,EAAO;AACd,QAAA,gBAAA,CAAgB,MAAA,CAAO,IAAA;AAAA,UACrB,6DAA6D,UAAU,CAAA,CAAA,CAAA;AAAA,UACvE;AAAA,YACE,OAAO,KAAA,YAAiB,KAAA,GAAQ,KAAA,CAAM,OAAA,GAAU,OAAO,KAAK;AAAA;AAC9D,SACF;AAAA,MACF;AAAA,IACF,CAAA,MAAO;AAEL,MAAA,IAAI;AACF,QAAA,UAAA,GAAa,UAAU,WAAA,EAAY;AAAA,MACrC,CAAA,CAAA,MAAQ;AACN,QAAA,gBAAA,CAAgB,MAAA,CAAO,KAAA;AAAA,UACrB,uCAAuC,UAAU,CAAA,kBAAA;AAAA,SACnD;AAAA,MACF;AAAA,IACF;AAEA,IAAA,OAAO;AAAA,MACL,SAAA,EAAW,WAAA;AAAA,MACX,MAAA,EAAQ,QAAA;AAAA,MACR,QAAA,EAAU;AAAA,KACZ;AAAA,EACF;AAAA;AAAA;AAAA,EAIA,aAAqB,gBAAA,CACnB,MAAA,EACA,KAAA,EAIA;AACA,IAAA,MAAM,iBAAiB,MAAA,CAAO,cAAA;AAC9B,IAAA,MAAM,WAAA,GAAc,cAAA,KAAmB,IAAA,IAAQ,OAAO,cAAA,KAAmB,QAAA;AACzE,IAAA,MAAM,UAAA,GAAa,MAAM,OAAA,CAAQ,UAAA;AAEjC,IAAA,MAAM,cAA2C,WAAA,GAC7C,OAAO,cAAA,KAAmB,QAAA,GACvB,EAAE,GAAG,gBAAA,CAAgB,YAAA,EAAc,GAAG,gBAAe,GACrD,gBAAA,CAAgB,YAAA,IAAgB,MAAA,GAClC,iBAAgB,YAAA,IAAgB,MAAA;AAErC,IAAA,IAAI,CAAC,WAAA,EAAa;AAChB,MAAA,OAAO,MAAA;AAAA,IACT;AAGA,IAAA,MAAM,iBAAA,GAAoB,iBAAA,CAAkB,QAAA,CAAS,gBAAA,CAAgB,QAAQ,CAAA;AAE7E,IAAA,IAAI,iBAAA,EAAmB;AACrB,MAAA,gBAAA,CAAgB,MAAA,CAAO,KAAA;AAAA,QACrB,YAAY,UAAU,CAAA,6EAAA;AAAA,OACxB;AACA,MAAA,OAAO,MAAA;AAAA,IACT;AAEA,IAAA,MAAM,YAAA,GAAe,kBAAkB,cAAc,CAAA;AACrD,IAAA,IAAI,CAAC,YAAA,EAAc;AACjB,MAAA,gBAAA,CAAgB,MAAA,CAAO,KAAA;AAAA,QACrB,yCAAyC,UAAU,CAAA,qBAAA;AAAA,OACrD;AACA,MAAA,OAAO,MAAA;AAAA,IACT;AAGA,IAAA,IAAI,aAAA;AACJ,IAAA,IAAI;AACF,MAAA,aAAA,GAAgB,YAAA,CAAa,WAAA,EAAY,CAAE,eAAA,EAAgB;AAC3D,MAAA,IAAI,WAAA,EAAa;AACf,QAAA,gBAAA,CAAgB,MAAA,CAAO,KAAA;AAAA,UACrB,mCAAmC,UAAU,CAAA,0CAAA,CAAA;AAAA,UAC7C,EAAE,QAAA,EAAU,WAAA,CAAY,QAAA;AAAS,SACnC;AAAA,MACF;AAAA,IACF,CAAA,CAAA,MAAQ;AACN,MAAA,gBAAA,CAAgB,MAAA,CAAO,KAAA;AAAA,QACrB,0CAA0C,UAAU,CAAA,qBAAA;AAAA,OACtD;AAAA,IACF;AAEA,IAAA,OAAO;AAAA,MACL,SAAA,EAAW,WAAA;AAAA,MACX,MAAA,EAAQ,WAAA;AAAA,MACR,QAAA,EAAU;AAAA,KACZ;AAAA,EACF;AAAA;AAAA;AAAA,EAIA,OAAe,wBAAA,CACb,MAAA,EAEA,MAAA,EAGY;AACZ,IAAA,MAAM,yBAAyB,MAAA,CAAO,sBAAA;AACtC,IAAA,MAAM,WAAA,GACJ,sBAAA,KAA2B,IAAA,IAAQ,OAAO,sBAAA,KAA2B,QAAA;AAEvE,IAAA,MAAM,mBAAA,GAA2D,WAAA,GAC7D,OAAO,sBAAA,KAA2B,QAAA,GAC/B;AAAA,MACC,GAAG,gBAAA,CAAgB,oBAAA;AAAA,MACnB,GAAG;AAAA,KACL,GACC,gBAAA,CAAgB,oBAAA,IAAwB,MAAA,GAC1C,iBAAgB,oBAAA,IAAwB,MAAA;AAE7C,IAAA,IAAI,CAAC,mBAAA,EAAqB;AACxB,MAAA,OAAO,MAAA;AAAA,IACT;AAGA,IAAA,OAAO;AAAA,MACL,SAAA,EAAW,WAAA;AAAA,MACX,MAAA,EAAQ,mBAAA;AAAA,MACR,QAAA,EAAU,WAAA,GAAc,MAAA,GAAa,gBAAA,CAAgB,sBAAA,IAA0B;AAAA,KACjF;AAAA,EACF;AAAA;AAAA;AAAA,EAIA,aAAqB,kBAAA,CACnB,MAAA,EACA,KAAA,EAIA;AACA,IAAA,MAAM,mBAAmB,MAAA,CAAO,gBAAA;AAChC,IAAA,MAAM,WAAA,GAAc,gBAAA,KAAqB,IAAA,IAAQ,OAAO,gBAAA,KAAqB,QAAA;AAC7E,IAAA,MAAM,UAAA,GAAa,MAAM,OAAA,CAAQ,UAAA;AAGjC,IAAA,MAAM,gBAAA,GAAmB,gBAAA,CAAiB,QAAA,CAAS,gBAAA,CAAgB,QAAQ,CAAA;AAE3E,IAAA,IAAA,CAAK,WAAA,IAAe,gBAAA,CAAgB,cAAA,KAAmB,CAAC,gBAAA,EAAkB;AACxE,MAAA,gBAAA,CAAgB,MAAA,CAAO,IAAA;AAAA,QACrB,CAAA,SAAA,EAAY,UAAU,CAAA,sCAAA,EAAyC,gBAAA,CAAgB,QAAQ,CAAA,0DAAA,EACnC,gBAAA,CAAiB,IAAA,CAAK,IAAI,CAAC,CAAA,6CAAA;AAAA,OAEjF;AACA,MAAA,OAAO,MAAA;AAAA,IACT;AAEA,IAAA,MAAM,gBAA+C,WAAA,GACjD,OAAO,gBAAA,KAAqB,QAAA,GAC1B,EAAE,GAAG,gBAAA,CAAgB,cAAA,EAAgB,GAAG,kBAAiB,GACxD,gBAAA,CAAgB,cAAA,IAAkB,MAAA,GACpC,iBAAgB,cAAA,IAAkB,MAAA;AAEvC,IAAA,IAAI,CAAC,aAAA,EAAe;AAClB,MAAA,OAAO,MAAA;AAAA,IACT;AAEA,IAAA,MAAM,cAAA,GAAiB,kBAAkB,gBAAgB,CAAA;AACzD,IAAA,IAAI,CAAC,cAAA,EAAgB;AACnB,MAAA,gBAAA,CAAgB,MAAA,CAAO,KAAA;AAAA,QACrB,2CAA2C,UAAU,CAAA,uBAAA;AAAA,OACvD;AACA,MAAA,OAAO,MAAA;AAAA,IACT;AAGA,IAAA,IAAI,eAAA;AACJ,IAAA,IAAI,eAAe,aAAA,EAAe;AAChC,MAAA,IAAI;AACF,QAAA,eAAA,GAAkB,MAAM,cAAA,CAAe,cAAA,GAAiB,aAAa,CAAA;AACrE,QAAA,gBAAA,CAAgB,MAAA,CAAO,KAAA;AAAA,UACrB,mDAAmD,UAAU,CAAA,CAAA;AAAA,SAC/D;AAAA,MACF,SAAS,KAAA,EAAO;AACd,QAAA,gBAAA,CAAgB,MAAA,CAAO,IAAA;AAAA,UACrB,4DAA4D,UAAU,CAAA,CAAA,CAAA;AAAA,UACtE,EAAE,OAAO,KAAA,YAAiB,KAAA,GAAQ,MAAM,OAAA,GAAU,MAAA,CAAO,KAAK,CAAA;AAAE,SAClE;AAAA,MACF;AAAA,IACF,CAAA,MAAO;AACL,MAAA,IAAI;AACF,QAAA,eAAA,GAAkB,eAAe,WAAA,EAAY;AAAA,MAC/C,CAAA,CAAA,MAAQ;AACN,QAAA,gBAAA,CAAgB,MAAA,CAAO,KAAA;AAAA,UACrB,4CAA4C,UAAU,CAAA,uBAAA;AAAA,SACxD;AAAA,MACF;AAAA,IACF;AAEA,IAAA,OAAO;AAAA,MACL,SAAA,EAAW,WAAA;AAAA,MACX,MAAA,EAAQ,aAAA;AAAA,MACR,QAAA,EAAU;AAAA,KACZ;AAAA,EACF;AAAA;AAAA;AAAA,EAIA,aAAqB,wBAAA,CACnB,MAAA,EACA,KAAA,EAQA;AACA,IAAA,MAAM,yBAAyB,MAAA,CAAO,sBAAA;AACtC,IAAA,MAAM,WAAA,GACJ,sBAAA,KAA2B,IAAA,IAAQ,OAAO,sBAAA,KAA2B,QAAA;AACvE,IAAA,MAAM,UAAA,GAAa,MAAM,OAAA,CAAQ,UAAA;AAGjC,IAAA,MAAM,gBAAA,GAAmB,gBAAA,CAAiB,QAAA,CAAS,gBAAA,CAAgB,QAAQ,CAAA;AAE3E,IAAA,IAAA,CAAK,WAAA,IAAe,gBAAA,CAAgB,oBAAA,KAAyB,CAAC,gBAAA,EAAkB;AAC9E,MAAA,gBAAA,CAAgB,MAAA,CAAO,IAAA;AAAA,QACrB,CAAA,SAAA,EAAY,UAAU,CAAA,4CAAA,EAA+C,gBAAA,CAAgB,QAAQ,CAAA,gEAAA,EACnC,gBAAA,CAAiB,IAAA,CAAK,IAAI,CAAC,CAAA,mDAAA;AAAA,OAEvF;AACA,MAAA,OAAO,MAAA;AAAA,IACT;AAEA,IAAA,MAAM,sBAA0D,WAAA,GAC5D,OAAO,sBAAA,KAA2B,QAAA,GAChC,EAAE,GAAG,gBAAA,CAAgB,oBAAA,EAAsB,GAAG,wBAAuB,GACpE,gBAAA,CAAgB,oBAAA,IAAwB,MAAA,GAC1C,iBAAgB,oBAAA,IAAwB,MAAA;AAE7C,IAAA,IAAI,CAAC,mBAAA,EAAqB;AACxB,MAAA,OAAO,MAAA;AAAA,IACT;AAEA,IAAA,MAAM,mBAAA,GAAsB,kBAAkB,qBAAqB,CAAA;AACnE,IAAA,IAAI,CAAC,mBAAA,EAAqB;AACxB,MAAA,gBAAA,CAAgB,MAAA,CAAO,KAAA;AAAA,QACrB,gDAAgD,UAAU,CAAA,6BAAA;AAAA,OAC5D;AACA,MAAA,OAAO,MAAA;AAAA,IACT;AAGA,IAAA,IAAI,qBAAA;AACJ,IAAA,IAAI,eAAe,mBAAA,EAAqB;AACtC,MAAA,IAAI;AACF,QAAA,qBAAA,GAAwB,MAAM,mBAAA,CAAoB,cAAA,GAAiB,mBAAmB,CAAA;AACtF,QAAA,gBAAA,CAAgB,MAAA,CAAO,KAAA;AAAA,UACrB,yDAAyD,UAAU,CAAA,CAAA;AAAA,SACrE;AAAA,MACF,SAAS,KAAA,EAAO;AACd,QAAA,gBAAA,CAAgB,MAAA,CAAO,IAAA;AAAA,UACrB,kEAAkE,UAAU,CAAA,CAAA,CAAA;AAAA,UAC5E,EAAE,OAAO,KAAA,YAAiB,KAAA,GAAQ,MAAM,OAAA,GAAU,MAAA,CAAO,KAAK,CAAA;AAAE,SAClE;AAAA,MACF;AAAA,IACF,CAAA,MAAO;AACL,MAAA,IAAI;AACF,QAAA,qBAAA,GAAwB,oBAAoB,WAAA,EAAY;AAAA,MAC1D,CAAA,CAAA,MAAQ;AACN,QAAA,gBAAA,CAAgB,MAAA,CAAO,KAAA;AAAA,UACrB,kDAAkD,UAAU,CAAA,6BAAA;AAAA,SAC9D;AAAA,MACF;AAAA,IACF;AAEA,IAAA,OAAO;AAAA,MACL,SAAA,EAAW,WAAA;AAAA,MACX,MAAA,EAAQ,mBAAA;AAAA,MACR,QAAA,EAAU;AAAA,KACZ;AAAA,EACF;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,aAAqB,4BAAA,CACnB,UAAA,EACA,MAAA,EAC2C;AAE3C,IAAA,IAAI,MAAA,CAAO,YAAY,KAAA,EAAO;AAC5B,MAAA,OAAO,MAAA;AAAA,IACT;AAEA,IAAA,IAAI;AAEF,MAAA,MAAM,gBAAA,GAAmB,MAAM,0BAAA,CAA2B;AAAA,QACxD,IAAA,EAAM,OAAO,IAAA,IAAQ,UAAA;AAAA,QACrB,aAAa,CAAA,EAAG,MAAA,CAAO,WAAA,IAAe,SAAS,IAAI,UAAU,CAAA,CAAA;AAAA,QAC7D,aAAa,MAAA,CAAO,WAAA;AAAA,QACpB,UAAU,MAAA,CAAO;AAAA,OAClB,CAAA;AAED,MAAA,gBAAA,CAAgB,MAAA,CAAO,KAAA;AAAA,QACrB,uDAAuD,UAAU,CAAA,CAAA;AAAA,OACnE;AAEA,MAAA,OAAO,gBAAA;AAAA,IACT,SAAS,GAAA,EAAK;AACZ,MAAA,gBAAA,CAAgB,MAAA,CAAO,IAAA;AAAA,QACrB,iDAAiD,UAAU,CAAA,yBAAA,CAAA;AAAA,QAC3D,EAAE,OAAO,GAAA,YAAe,KAAA,GAAQ,IAAI,OAAA,GAAU,MAAA,CAAO,GAAG,CAAA;AAAE,OAC5D;AACA,MAAA,OAAO,iBAAgB,sBAAA,IAA0B,MAAA;AAAA,IACnD;AAAA,EACF;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,OAAO,yBAAyB,QAAA,EAAsC;AACpE,IAAA,gBAAA,CAAgB,sBAAA,GAAyB,QAAA;AACzC,IAAA,gBAAA,CAAgB,MAAA,CAAO,MAAM,mCAAmC,CAAA;AAAA,EAClE;AAAA;AAAA;AAAA;AAAA,EAKA,OAAO,wBAAA,GAAwD;AAC7D,IAAA,OAAO,gBAAA,CAAgB,sBAAA;AAAA,EACzB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOA,aAAqB,iBAAA,CACnB,KAAA,EACA,cAAA,GAAiB,IAAA,EACmB;AACpC,IAAA,MAAM,EAAE,OAAA,EAAS,YAAA,EAAc,MAAA,EAAO,GAAI,KAAA;AAC1C,IAAA,MAAM,aAAa,YAAA,CAAa,UAAA;AAChC,IAAA,MAAM,WAAA,GAAc,OAAO,SAAA,KAAc,KAAA;AAGzC,IAAA,IAAI,kBAAkB,WAAA,EAAa;AACjC,MAAA,MAAM,eAAA,GAAkB,gBAAA,CAAgB,aAAA,CAAc,GAAA,CAAI,UAAU,CAAA;AACpE,MAAA,IAAI,iBAAiB,OAAO,eAAA;AAAA,IAC9B;AAEA,IAAA,MAAM,cAAc,gBAAA,CAAgB,mBAAA,CAAoB,OAAO,EAAE,WAAA,EAAa,gBAAgB,CAAA;AAE9F,IAAA,IAAI,kBAAkB,WAAA,EAAa;AACjC,MAAA,gBAAA,CAAgB,aAAA,CAAc,GAAA,CAAI,UAAA,EAAY,WAAW,CAAA;AAAA,IAC3D;AAEA,IAAA,OAAO,WAAA;AAAA,EACT;AAAA;AAAA,EAGA,OAAe,sBACb,MAAA,EACqC;AACrC,IAAA,MAAM,OAAA,uBAAc,GAAA,EAA0B;AAG9C,IAAA,IAAI,OAAO,KAAA,EAAO;AAChB,MAAA,OAAA,CAAQ,GAAA,CAAI,OAAO,KAAK,CAAA;AAAA,IAC1B;AAGA,IAAA,IAAI,OAAO,UAAA,EAAY;AACrB,MAAA,MAAA,CAAO,WAAW,OAAA,CAAQ,CAAA,GAAA,KAAO,OAAA,CAAQ,GAAA,CAAI,GAAG,CAAC,CAAA;AAAA,IACnD;AAEA,IAAA,IAAI,OAAA,CAAQ,SAAS,CAAA,EAAG;AACtB,MAAA,OAAO,MAAA;AAAA,IACT;AAEA,IAAA,IAAI,CAAC,iBAAgB,cAAA,EAAgB;AACnC,MAAA,gBAAA,CAAgB,MAAA,CAAO,KAAK,sDAAsD,CAAA;AAClF,MAAA,OAAO,MAAA;AAAA,IACT;AAEA,IAAA,MAAM,SAAkC,EAAC;AACzC,IAAA,KAAA,MAAW,OAAO,OAAA,EAAS;AACzB,MAAA,MAAM,KAAA,GAAQ,gBAAA,CAAgB,cAAA,CAAe,QAAA,CAAS,GAAG,CAAA;AACzD,MAAA,IAAI,KAAA,EAAO;AACT,QAAC,MAAA,CAAiD,GAAG,CAAA,GAAI,KAAA;AACzD,QAAA,gBAAA,CAAgB,MAAA,CAAO,KAAA,CAAM,CAAA,gBAAA,EAAmB,GAAG,CAAA,cAAA,CAAgB,CAAA;AAAA,MACrE,CAAA,MAAO;AACL,QAAA,gBAAA,CAAgB,MAAA,CAAO,IAAA,CAAK,CAAA,OAAA,EAAU,GAAG,CAAA,qCAAA,CAAuC,CAAA;AAAA,MAClF;AAAA,IACF;AAEA,IAAA,OAAO,OAAO,IAAA,CAAK,MAAM,CAAA,CAAE,MAAA,GAAS,IAAI,MAAA,GAAS,MAAA;AAAA,EACnD;AAAA;AAAA;AAAA,EAIA,aAAqB,mBAAA,CACnB,KAAA,EACA,OAAA,EACoC;AACpC,IAAA,MAAM,EAAE,OAAA,EAAS,YAAA,EAAc,MAAA,EAAO,GAAI,KAAA;AAC1C,IAAA,MAAM,aAAa,YAAA,CAAa,UAAA;AAChC,IAAA,MAAM,EAAE,WAAA,EAAa,cAAA,EAAe,GAAI,OAAA;AAExC,IAAA,IAAI;AACF,MAAA,gBAAA,CAAgB,MAAA,CAAO,KAAA,CAAM,CAAA,sBAAA,EAAyB,UAAU,CAAA,CAAE,CAAA;AAGlE,MAAA,MAAM,SAAA,GAAY,MAAM,gBAAA,CAAgB,qBAAA,CAAsB,QAAQ,KAAK,CAAA;AAC3E,MAAA,MAAM,EAAA,GAAK,MAAM,gBAAA,CAAgB,aAAA,CAAc,QAAQ,KAAK,CAAA;AAC5D,MAAA,MAAM,KAAA,GAAQ,MAAM,gBAAA,CAAgB,gBAAA,CAAiB,QAAQ,KAAK,CAAA;AAClE,MAAA,MAAM,aAAA,GAAgB,gBAAA,CAAgB,wBAAA,CAAyB,MAAA,EAAQ,KAAK,CAAA;AAC5E,MAAA,MAAM,OAAA,GAAU,MAAM,gBAAA,CAAgB,kBAAA,CAAmB,QAAQ,KAAK,CAAA;AACtE,MAAA,MAAM,aAAA,GAAgB,MAAM,gBAAA,CAAgB,wBAAA,CAAyB,QAAQ,KAAK,CAAA;AAClF,MAAA,MAAM,MAAA,GAAS,gBAAA,CAAgB,qBAAA,CAAsB,MAAM,CAAA;AAG3D,MAAA,IAAI,wBAAwB,aAAA,EAAe,QAAA;AAC3C,MAAA,IAAI,aAAA,EAAe,SAAA,IAAa,aAAA,CAAc,MAAA,EAAQ;AACpD,QAAA,qBAAA,GAAwB,MAAM,gBAAA,CAAgB,4BAAA;AAAA,UAC5C,UAAA;AAAA,UACA,aAAA,CAAc;AAAA,SAChB;AAAA,MACF;AAEA,MAAA,MAAM,aAAA,GAA0C;AAAA,QAC9C,SAAA;AAAA,QACA,EAAA;AAAA,QACA,KAAA;AAAA,QACA,eAAe,aAAA,GACX,EAAE,GAAG,aAAA,EAAe,QAAA,EAAU,uBAAsB,GACpD,KAAA,CAAA;AAAA,QACJ,OAAA;AAAA,QACA,aAAA;AAAA,QACA,QAAA,EAAU;AAAA,UACR,GAAI,MAAA,GAAS,EAAE,MAAA,KAAW,EAAC;AAAA,UAC3B,OAAO,KAAA,EAAO,QAAA;AAAA,UACd,IAAI,EAAA,EAAI,QAAA;AAAA,UACR,KAAK,SAAA,EAAW,QAAA;AAAA,UAChB,aAAA,EAAe,qBAAA;AAAA,UACf,SAAS,OAAA,EAAS,QAAA;AAAA,UAClB,eAAe,aAAA,EAAe;AAAA,SAChC;AAAA,QACA;AAAA,OACF;AAEA,MAAA,gBAAA,CAAgB,MAAA,CAAO,KAAA,CAAM,CAAA,QAAA,EAAW,UAAU,CAAA,QAAA,CAAA,EAAY;AAAA,QAC5D,kBAAA,EAAoB,cAAc,SAAA,EAAW,SAAA;AAAA,QAC7C,WAAA,EAAa,cAAc,EAAA,EAAI,SAAA;AAAA,QAC/B,sBAAA,EAAwB,cAAc,aAAA,EAAe,SAAA;AAAA,QACrD,gBAAA,EAAkB,cAAc,OAAA,EAAS,SAAA;AAAA,QACzC,sBAAA,EAAwB,cAAc,aAAA,EAAe,SAAA;AAAA,QACrD,QAAA,EAAU;AAAA,UACR,QAAA,EAAU,CAAC,CAAC,aAAA,CAAc,QAAA,EAAU,KAAA;AAAA,UACpC,KAAA,EAAO,CAAC,CAAC,aAAA,CAAc,QAAA,EAAU,EAAA;AAAA,UACjC,MAAA,EAAQ,CAAC,CAAC,aAAA,CAAc,QAAA,EAAU,GAAA;AAAA,UAClC,gBAAA,EAAkB,CAAC,CAAC,aAAA,CAAc,QAAA,EAAU,aAAA;AAAA,UAC5C,UAAA,EAAY,CAAC,CAAC,aAAA,CAAc,QAAA,EAAU,OAAA;AAAA,UACtC,gBAAA,EAAkB,CAAC,CAAC,aAAA,CAAc,QAAA,EAAU,aAAA;AAAA,UAC5C,SAAA,EAAW,CAAC,CAAC,aAAA,CAAc,QAAA,EAAU;AAAA;AACvC,OACD,CAAA;AAED,MAAA,MAAM,QAAA,GAAW,MAAM,YAAA,CAAa,MAAA,CAAO,QAAQ,aAAa,CAAA;AAEhE,MAAA,IAAI,kBAAkB,WAAA,EAAa;AACjC,QAAA,gBAAA,CAAgB,SAAA,CAAU,GAAA,CAAI,UAAA,EAAY,QAAQ,CAAA;AAClD,QAAA,gBAAA,CAAgB,MAAA,CAAO,IAAA,CAAK,CAAA,qBAAA,EAAwB,UAAU,CAAA,YAAA,CAAc,CAAA;AAAA,MAC9E,CAAA,MAAO;AACL,QAAA,gBAAA,CAAgB,MAAA,CAAO,IAAA,CAAK,CAAA,iBAAA,EAAoB,UAAU,CAAA,WAAA,CAAa,CAAA;AAAA,MACzE;AAEA,MAAA,OAAO,QAAA;AAAA,IACT,SAAS,KAAA,EAAO;AACd,MAAA,gBAAA,CAAgB,MAAA,CAAO,KAAA,CAAM,CAAA,8BAAA,EAAiC,UAAU,CAAA,CAAA,EAAI;AAAA,QAC1E,OAAO,KAAA,YAAiB,KAAA,GAAQ,KAAA,CAAM,OAAA,GAAU,OAAO,KAAK;AAAA,OAC7D,CAAA;AACD,MAAA,MAAM,KAAA;AAAA,IACR,CAAA,SAAE;AACA,MAAA,IAAI,kBAAkB,WAAA,EAAa;AACjC,QAAA,gBAAA,CAAgB,aAAA,CAAc,OAAO,UAAU,CAAA;AAAA,MACjD;AAAA,IACF;AAAA,EACF;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAWA,OAAO,QAAQ,GAAA,EAAmB;AAChC,IAAA,MAAM,OAAA,GAAU,gBAAA,CAAgB,SAAA,CAAU,GAAA,CAAI,GAAG,CAAA;AACjD,IAAA,IAAI,OAAA,EAAS;AACX,MAAA,OAAA,CAAQ,OAAA,EAAQ;AAChB,MAAA,gBAAA,CAAgB,SAAA,CAAU,OAAO,GAAG,CAAA;AACpC,MAAA,gBAAA,CAAgB,MAAA,CAAO,IAAA,CAAK,CAAA,kBAAA,EAAqB,GAAG,CAAA,CAAE,CAAA;AAAA,IACxD;AACA,IAAA,gBAAA,CAAgB,QAAA,CAAS,OAAO,GAAG,CAAA;AAAA,EACrC;AAAA;AAAA;AAAA;AAAA,EAKA,OAAO,UAAA,GAAmB;AAExB,IAAA,KAAA,MAAW,CAAC,GAAA,EAAK,OAAO,CAAA,IAAK,iBAAgB,SAAA,EAAW;AACtD,MAAA,IAAI;AACF,QAAA,OAAA,CAAQ,OAAA,EAAQ;AAChB,QAAA,gBAAA,CAAgB,MAAA,CAAO,KAAA,CAAM,CAAA,kBAAA,EAAqB,GAAG,CAAA,CAAE,CAAA;AAAA,MACzD,SAAS,KAAA,EAAO;AACd,QAAA,gBAAA,CAAgB,MAAA,CAAO,KAAA,CAAM,CAAA,yBAAA,EAA4B,GAAG,CAAA,CAAA,EAAI;AAAA,UAC9D,OAAO,KAAA,YAAiB,KAAA,GAAQ,KAAA,CAAM,OAAA,GAAU,OAAO,KAAK;AAAA,SAC7D,CAAA;AAAA,MACH;AAAA,IACF;AAGA,IAAA,gBAAA,CAAgB,UAAU,KAAA,EAAM;AAChC,IAAA,gBAAA,CAAgB,SAAS,KAAA,EAAM;AAC/B,IAAA,gBAAA,CAAgB,UAAU,KAAA,EAAM;AAChC,IAAA,gBAAA,CAAgB,cAAc,KAAA,EAAM;AACpC,IAAA,gBAAA,CAAgB,iBAAA,GAAoB,IAAA;AACpC,IAAA,gBAAA,CAAgB,SAAA,GAAY,IAAA;AAC5B,IAAA,gBAAA,CAAgB,YAAA,GAAe,IAAA;AAC/B,IAAA,gBAAA,CAAgB,oBAAA,GAAuB,IAAA;AACvC,IAAA,gBAAA,CAAgB,sBAAA,GAAyB,IAAA;AACzC,IAAA,gBAAA,CAAgB,cAAA,GAAiB,IAAA;AACjC,IAAA,gBAAA,CAAgB,oBAAA,GAAuB,IAAA;AAEvC,IAAA,gBAAA,CAAgB,MAAA,CAAO,KAAK,2BAA2B,CAAA;AAAA,EACzD;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAQA,OAAO,YAAY,GAAA,EAAsB;AACvC,IAAA,MAAM,QAAA,GAAW,gBAAA,CAAgB,SAAA,CAAU,GAAA,CAAI,GAAG,CAAA;AAClD,IAAA,OAAO,UAAU,WAAA,IAAe,IAAA;AAAA,EAClC;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,OAAO,mBAAA,GAAgC;AACrC,IAAA,OAAO,CAAC,GAAG,gBAAA,CAAgB,SAAA,CAAU,SAAS,CAAA,CAC3C,MAAA,CAAO,CAAC,GAAG,IAAI,CAAA,KAAM,CAAC,KAAK,WAAW,CAAA,CACtC,IAAI,CAAC,CAAC,GAAG,CAAA,KAAM,GAAG,CAAA;AAAA,EACvB;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,EA2BA,aAAa,QAAA,CAAS,KAAA,EAAyB,OAAA,GAAU,IAAA,EAAqB;AAC5E,IAAA,MAAM,UAAA,GAAa,MAAM,OAAA,CAAQ,UAAA;AAGjC,IAAA,IAAI,gBAAA,CAAgB,UAAU,GAAA,CAAI,UAAU,KAAK,gBAAA,CAAgB,QAAA,CAAS,GAAA,CAAI,UAAU,CAAA,EAAG;AACzF,MAAA,gBAAA,CAAgB,MAAA,CAAO,IAAA,CAAK,CAAA,SAAA,EAAY,UAAU,CAAA,uBAAA,CAAyB,CAAA;AAC3E,MAAA;AAAA,IACF;AAEA,IAAA,MAAM,QAAA,GAAW,KAAA,CAAM,MAAA,CAAO,QAAA,IAAY,WAAA;AAE1C,IAAA,IAAI,OAAA,IAAW,aAAa,WAAA,EAAa;AACvC,MAAA,MAAM,gBAAA,CAAgB,kBAAkB,KAAK,CAAA;AAAA,IAC/C,CAAA,MAAO;AACL,MAAA,gBAAA,CAAgB,SAAS,GAAA,CAAI,UAAA,EAAY,EAAE,KAAA,EAAO,UAAU,CAAA;AAC5D,MAAA,gBAAA,CAAgB,MAAA,CAAO,KAAA;AAAA,QACrB,CAAA,QAAA,EAAW,UAAU,CAAA,gBAAA,EAAmB,QAAQ,CAAA,eAAA;AAAA,OAClD;AAAA,IACF;AAAA,EACF;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOA,OAAO,WAAW,GAAA,EAAmB;AACnC,IAAA,gBAAA,CAAgB,QAAQ,GAAG,CAAA;AAAA,EAC7B;AACF,CAAA;ACnnCA,IAAM,MAAA,GAAS,IAAIC,aAAAA,CAAc,EAAE,aAAa,MAAA,EAAQ,OAAA,EAAS,WAAW,CAAA;AAK5E,SAAS,kBAAkB,UAAA,EAA6B;AACtD,EAAA,MAAM,cAAc,UAAA,CAAW,OAAA;AAC/B,EAAA,IAAI,CAAC,aAAa,OAAO,KAAA;AAEzB,EAAA,MAAM,gBAAgB,WAAA,CAAY,OAAA;AAClC,EAAA,IAAI,CAAC,eAAe,OAAO,KAAA;AAE3B,EAAA,IAAI;AACF,IAAA,aAAA,CAAc,UAAU,CAAA;AACxB,IAAA,OAAO,IAAA;AAAA,EACT,CAAA,CAAA,MAAQ;AACN,IAAA,OAAO,KAAA;AAAA,EACT;AACF;AAbS,MAAA,CAAA,iBAAA,EAAA,mBAAA,CAAA;AAgBT,SAAS,gBAAA,GAAkD;AACzD,EAAA,IAAI,OAAO,UAAA,CAAW,IAAA,KAAS,WAAA,EAAa,OAAO,MAAA;AACnD,EAAA,IAAI,OAAO,UAAA,CAAW,GAAA,KAAQ,WAAA,EAAa,OAAO,KAAA;AAClD,EAAA,OAAO,IAAA;AACT;AAJS,MAAA,CAAA,gBAAA,EAAA,kBAAA,CAAA;AAOT,SAAS,iBAAA,GAAmD;AAC1D,EAAA,IAAI,OAAO,UAAA,CAAW,WAAA,KAAgB,WAAA,EAAa,OAAO,MAAA;AAC1D,EAAA,MAAM,UAAA,GACJ,OAAO,UAAA,CAAW,MAAA,KAAW,WAAA,IAC7B,OAAO,UAAA,CAAW,OAAA,KAAY,WAAA,IAC9B,OAAO,OAAA,KAAY,WAAA;AACrB,EAAA,OAAO,aAAa,MAAA,GAAS,IAAA;AAC/B;AAPS,MAAA,CAAA,iBAAA,EAAA,mBAAA,CAAA;AAUT,SAAS,aAAA,GAA+C;AACtD,EAAA,IAAI,OAAO,MAAA,KAAW,WAAA,IAAe,OAAO,aAAa,WAAA,EAAa;AACpE,IAAA,OAAO,SAAA;AAAA,EACT;AACA,EAAA,OAAO,IAAA;AACT;AALS,MAAA,CAAA,aAAA,EAAA,eAAA,CAAA;AAQT,SAAS,mBAAA,GAA8C;AAErD,EAAA,IAAI,QAAQ,GAAA,CAAI,QAAA,IAAY,OAAA,CAAQ,GAAA,CAAI,UAAU,OAAO,MAAA;AAEzD,EAAA,IAAI,QAAQ,GAAA,CAAI,qBAAA,IAAyB,OAAA,CAAQ,GAAA,CAAI,cAAc,OAAO,QAAA;AAE1E,EAAA,IAAI,iBAAA,CAAkB,cAAc,CAAA,EAAG,OAAO,QAAA;AAE9C,EAAA,IAAI,iBAAA,CAAkB,SAAS,CAAA,EAAG,OAAO,SAAA;AACzC,EAAA,OAAO,MAAA;AACT;AAVS,MAAA,CAAA,mBAAA,EAAA,qBAAA,CAAA;AAeF,SAAS,aAAA,GAAwC;AAEtD,EAAA,MAAM,aAAa,gBAAA,EAAiB;AACpC,EAAA,IAAI,YAAY,OAAO,UAAA;AAGvB,EAAA,MAAM,cAAc,iBAAA,EAAkB;AACtC,EAAA,IAAI,aAAa,OAAO,WAAA;AAGxB,EAAA,MAAM,UAAU,aAAA,EAAc;AAC9B,EAAA,IAAI,SAAS,OAAO,OAAA;AAGpB,EAAA,IAAI,OAAO,OAAA,KAAY,WAAA,IAAe,OAAA,CAAQ,UAAU,IAAA,EAAM;AAC5D,IAAA,OAAO,mBAAA,EAAoB;AAAA,EAC7B;AAEA,EAAA,OAAO,SAAA;AACT;AAnBgB,MAAA,CAAA,aAAA,EAAA,eAAA,CAAA;AAwBhB,eAAsB,WAAA,CAAY,SAAiB,OAAA,EAAkC;AACnF,EAAA,IAAI;AACF,IAAA,MAAM,MAAA,GAAS,MAAM,OAAO,QAAQ,CAAA;AACpC,IAAA,MAAM,SAAS,MAAA,CAAO,MAAA,CAAO,EAAE,IAAA,EAAM,SAAS,CAAA;AAE9C,IAAA,IAAI,OAAO,KAAA,EAAO;AAChB,MAAA,MAAA,CAAO,IAAA,CAAK,CAAA,yBAAA,EAA4B,MAAA,CAAO,KAAA,CAAM,OAAO,CAAA,CAAE,CAAA;AAAA,IAChE,WAAW,OAAA,EAAS;AAClB,MAAA,MAAA,CAAO,IAAA,CAAK,CAAA,iBAAA,EAAoB,OAAO,CAAA,CAAE,CAAA;AAAA,IAC3C;AAAA,EACF,CAAA,CAAA,MAAQ;AACN,IAAA,MAAA,CAAO,KAAK,kDAAkD,CAAA;AAAA,EAChE;AACF;AAbsB,MAAA,CAAA,WAAA,EAAA,aAAA,CAAA;ACgBtB,IAAM,kBAAA,GAAqB,GAAA;AAsGpB,IAAM,IAAA,GAAN,MAAM,KAAA,CAAK;AAAA,EApNlB;AAoNkB,IAAA,MAAA,CAAA,IAAA,EAAA,MAAA,CAAA;AAAA;AAAA,EAChB;AAAA,IAAA,IAAA,CAAe,WAAA,GAAc,KAAA;AAAA;AAAA,EAC7B;AAAA,IAAA,IAAA,CAAe,aAAA,GAAoC;AAAA,MACjD,EAAA,EAAI,IAAA;AAAA,MACJ,GAAA,EAAK,IAAA;AAAA,MACL,KAAA,EAAO,IAAA;AAAA,MACP,aAAA,EAAe,IAAA;AAAA,MACf,OAAA,EAAS,IAAA;AAAA,MACT,aAAA,EAAe,IAAA;AAAA,MACf,KAAK,EAAC;AAAA,MACN,OAAA,EAAS,SAAA;AAAA,MACT,UAAA,EAAY;AAAA,KACd;AAAA;AAAA,EAKA;AAAA;AAAA;AAAA;AAAA,IAAA,IAAA,CAAe,OAAA,GAAgC,IAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAK/C,WAAmB,MAAA,GAAwB;AACzC,IAAA,KAAA,CAAK,OAAA,KAAY,IAAIA,aAAAA,CAAc;AAAA,MACjC,WAAA,EAAa,MAAA;AAAA,MACb,OAAA,EAAS;AAAA,KACV,CAAA;AACD,IAAA,OAAO,KAAA,CAAK,OAAA;AAAA,EACd;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,OAAe,GAAA,CAAI,OAAA,EAAiB,OAAA,EAAmB,IAAA,EAAsC;AAC3F,IAAA,IAAI,CAAC,OAAA,EAAS;AACd,IAAA,IAAI,IAAA,EAAM;AACR,MAAA,KAAA,CAAK,MAAA,CAAO,IAAA,CAAK,OAAA,EAAS,IAAI,CAAA;AAAA,IAChC,CAAA,MAAO;AACL,MAAA,KAAA,CAAK,MAAA,CAAO,KAAK,OAAO,CAAA;AAAA,IAC1B;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKA,OAAe,QAAA,CACb,OAAA,EACA,OAAA,EACA,IAAA,EACM;AACN,IAAA,IAAI,CAAC,OAAA,EAAS;AACd,IAAA,IAAI,IAAA,EAAM;AACR,MAAA,KAAA,CAAK,MAAA,CAAO,KAAA,CAAM,OAAA,EAAS,IAAI,CAAA;AAAA,IACjC,CAAA,MAAO;AACL,MAAA,KAAA,CAAK,MAAA,CAAO,MAAM,OAAO,CAAA;AAAA,IAC3B;AAAA,EACF;AAAA,EAKA;AAAA;AAAA;AAAA;AAAA,IAAA,IAAA,CAAe,uBAAgD,EAAC;AAAA;AAAA,EAKhE;AAAA;AAAA;AAAA;AAAA,IAAA,IAAA,CAAe,aAAA,GAA2C,IAAA;AAAA;AAAA,EAK1D;AAAA;AAAA;AAAA;AAAA,IAAA,IAAA,CAAe,eAA2C,EAAC;AAAA;AAAA,EAM3D;AAAA;AAAA;AAAA;AAAA;AAAA,IAAA,IAAA,CAAe,iBAAA,GAA6B,IAAA;AAAA;AAAA,EAK5C;AAAA;AAAA;AAAA;AAAA,IAAA,IAAA,CAAe,mBAAmC,EAAC;AAAA;AAAA,EAKnD;AAAA;AAAA;AAAA;AAAA,IAAA,IAAA,CAAe,cAAyC,EAAC;AAAA;AAAA,EAOzD;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,IAAA,IAAA,CAAe,UAAA,GAA8C,IAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAK7D,aAAqB,iBAAiB,OAAA,EAAuD;AAC3F,IAAA,MAAM,EAAE,OAAA,EAAS,WAAA,EAAa,UAAA,EAAY,GAAA,EAAK,SAAQ,GAAI,OAAA;AAE3D,IAAA,KAAA,CAAK,aAAA,CAAc,aAAa,UAAA,IAAc,QAAA;AAC9C,IAAA,KAAA,CAAK,IAAI,CAAA,aAAA,EAAgB,KAAA,CAAK,aAAA,CAAc,UAAU,IAAI,OAAO,CAAA;AAEjE,IAAA,MAAM,iBAAA,GACJ,WAAA,IAAgB,OAAA,CAAQ,GAAA,CAAI,QAAA,IAAmC,aAAA;AACjE,IAAA,KAAA,CAAK,GAAA,CAAI,CAAA,oBAAA,EAAuB,iBAAiB,CAAA,CAAA,EAAI,OAAO,CAAA;AAE5D,IAAA,KAAA,CAAK,aAAA,CAAc,UAAU,aAAA,EAAc;AAC3C,IAAA,KAAA,CAAK,IAAI,CAAA,kBAAA,EAAqB,KAAA,CAAK,aAAA,CAAc,OAAO,IAAI,OAAO,CAAA;AAEnE,IAAA,IAAI,OAAA,EAAS,MAAM,WAAA,CAAY,OAAA,EAAS,OAAO,CAAA;AAC/C,IAAA,KAAA,CAAK,cAAc,GAAA,GAAM,EAAE,GAAG,OAAA,CAAQ,GAAA,EAAK,GAAG,GAAA,EAAI;AAElD,IAAA,OAAO,iBAAA;AAAA,EACT;AAAA;AAAA;AAAA;AAAA,EAKA,aAAqB,WAAA,CACnB,IAAA,EACA,IAAA,EACA,OAAA,EACwB;AACxB,IAAA,IAAI;AACF,MAAA,OAAO,MAAM,IAAA,EAAK;AAAA,IACpB,SAAS,KAAA,EAAO;AACd,MAAA,KAAA,CAAK,MAAA,CAAO,MAAM,CAAA,qBAAA,EAAwB,IAAI,IAAI,EAAE,KAAA,EAAQ,KAAA,CAAgB,OAAA,EAAS,CAAA;AACrF,MAAA,IAAI,SAAS,KAAA,CAAK,MAAA,CAAO,MAAM,YAAA,EAAc,EAAE,OAAO,CAAA;AACtD,MAAA,OAAO,MAAA;AAAA,IACT;AAAA,EACF;AAAA;AAAA,EAGA,aAAqB,0BAA0B,OAAA,EAAyC;AACtF,IAAA,MAAM,EAAE,YAAA,EAAc,MAAA,EAAQ,OAAA,EAAQ,GAAI,OAAA;AAC1C,IAAA,IAAI,MAAA,EAAQ,YAAY,KAAA,EAAO;AAC7B,MAAA,KAAA,CAAK,GAAA,CAAI,kDAAkD,OAAO,CAAA;AAClE,MAAA;AAAA,IACF;AACA,IAAA,MAAM,KAAA,CAAK,WAAA;AAAA,MACT,eAAA;AAAA,MACA,YAAY;AACV,QAAA,MAAM,KAAA,CAAK,sBAAA,CAAuB,MAAA,EAAQ,OAAO,CAAA;AACjD,QAAA,KAAA,CAAK,uBAAuB,OAAO,CAAA;AAAA,MACrC,CAAA;AAAA,MACA;AAAA,KACF;AAAA,EACF;AAAA;AAAA,EAGA,aAAqB,gBAAA,CACnB,OAAA,EACA,GAAA,EACe;AACf,IAAA,MAAM,EAAE,GAAA,EAAK,SAAA,EAAW,OAAA,EAAS,SAAQ,GAAI,OAAA;AAC7C,IAAA,IAAI,OAAA,EAAS;AAEb,IAAA,MAAM,KAAA,CAAK,WAAA;AAAA,MACT,YAAA;AAAA,MACA,YAAY;AACV,QAAA,MAAM,KAAA,CAAK,aAAA,CAAc,SAAA,EAAW,GAAA,EAAK,OAAO,CAAA;AAChD,QAAA,KAAA,CAAK,cAAc,GAAA,GAAM,gBAAA;AACzB,QAAA,KAAA,CAAK,GAAA,CAAI,kCAAkC,OAAO,CAAA;AAAA,MACpD,CAAA;AAAA,MACA;AAAA,KACF;AACA,IAAA,KAAA,CAAK,cAAc,GAAA,GAAM,gBAAA;AAAA,EAC3B;AAAA;AAAA,EAGA,aAAqB,mBAAmB,OAAA,EAAyC;AAC/E,IAAA,MAAM,EAAE,KAAA,EAAO,WAAA,EAAa,SAAA,EAAW,SAAQ,GAAI,OAAA;AACnD,IAAA,IAAI,SAAA,EAAW;AACb,MAAA,KAAA,CAAK,GAAA,CAAI,2CAA2C,OAAO,CAAA;AAC3D,MAAA;AAAA,IACF;AAGA,IAAA,IAAI,CAAC,WAAA,EAAa;AAChB,MAAA,KAAA,CAAK,GAAA,CAAI,8CAA8C,OAAO,CAAA;AAC9D,MAAA;AAAA,IACF;AAGA,IAAA,IAAI,MAAK,UAAA,EAAY;AACnB,MAAA,KAAA,CAAK,GAAA,CAAI,qDAAqD,OAAO,CAAA;AACrE,MAAA;AAAA,IACF;AAEA,IAAA,MAAM,KAAA,CAAK,WAAA;AAAA,MACT,OAAA;AAAA,MACA,YAAY;AACV,QAAA,MAAM,KAAA,CAAK,eAAA,CAAgB,WAAA,EAAgC,OAAO,CAAA;AAClE,QAAA,MAAM,YAAA,GAAe,kBAAkB,cAAc,CAAA;AACrD,QAAA,IAAI,YAAA,EAAc;AAChB,UAAA,KAAA,CAAK,aAAA,CAAc,KAAA,GAAQ,YAAA,CAAa,WAAA,EAAY;AACpD,UAAA,KAAA,CAAK,GAAA,CAAI,6BAA6B,OAAO,CAAA;AAAA,QAC/C;AAAA,MACF,CAAA;AAAA,MACA;AAAA,KACF;AAAA,EACF;AAAA;AAAA,EAGA,aAAqB,0BAAA,CACnB,OAAA,EACA,iBAAA,EACe;AACf,IAAA,MAAM,EAAE,aAAA,EAAe,mBAAA,EAAqB,iBAAA,EAAmB,SAAQ,GAAI,OAAA;AAC3E,IAAA,IAAI,iBAAA,EAAmB;AACrB,MAAA,KAAA,CAAK,GAAA,CAAI,2DAA2D,OAAO,CAAA;AAC3E,MAAA;AAAA,IACF;AAGA,IAAA,MAAM,MAAA,GAAS,mBAAA,IAAuB,EAAE,OAAA,EAAS,IAAA,EAAK;AAEtD,IAAA,MAAM,KAAA,CAAK,WAAA;AAAA,MACT,eAAA;AAAA,MACA,YAAY;AACV,QAAA,MAAM,KAAA,CAAK,uBAAA,CAAwB,MAAA,EAAQ,OAAA,EAAS,iBAAiB,CAAA;AACrE,QAAA,KAAA,CAAK,GAAA,CAAI,qCAAqC,OAAO,CAAA;AAAA,MACvD,CAAA;AAAA,MACA;AAAA,KACF;AAAA,EACF;AAAA;AAAA,EAGA,aAAqB,qBAAqB,OAAA,EAAyC;AACjF,IAAA,MAAM,EAAE,OAAA,EAAS,aAAA,EAAe,WAAA,EAAa,SAAQ,GAAI,OAAA;AAGzD,IAAA,IAAI,WAAA,EAAa;AACf,MAAA,KAAA,CAAK,GAAA,CAAI,+CAA+C,OAAO,CAAA;AAC/D,MAAA;AAAA,IACF;AAGA,IAAA,IAAI,CAAC,aAAA,EAAe;AAClB,MAAA,KAAA,CAAK,GAAA,CAAI,gDAAgD,OAAO,CAAA;AAChE,MAAA;AAAA,IACF;AAGA,IAAA,IAAI,MAAK,UAAA,EAAY;AACnB,MAAA,KAAA,CAAK,GAAA,CAAI,uDAAuD,OAAO,CAAA;AACvE,MAAA;AAAA,IACF;AAEA,IAAA,MAAM,KAAA,CAAK,WAAA;AAAA,MACT,SAAA;AAAA,MACA,YAAY;AACV,QAAA,MAAM,cAAA,GAAiB,kBAAkB,gBAAgB,CAAA;AACzD,QAAA,IAAI,CAAC,cAAA,EAAgB;AACnB,UAAA,KAAA,CAAK,GAAA,CAAI,uDAAuD,OAAO,CAAA;AACvE,UAAA;AAAA,QACF;AACA,QAAA,MAAM,cAAA,CAAe,WAAW,aAAa,CAAA;AAC7C,QAAA,KAAA,CAAK,aAAA,CAAc,OAAA,GAAU,cAAA,CAAe,WAAA,EAAY;AACxD,QAAA,KAAA,CAAK,GAAA,CAAI,+BAA+B,OAAO,CAAA;AAAA,MACjD,CAAA;AAAA,MACA;AAAA,KACF;AAAA,EACF;AAAA;AAAA,EAGA,aAAqB,2BAA2B,OAAA,EAAyC;AACvF,IAAA,MAAM,EAAE,aAAA,EAAe,mBAAA,EAAqB,iBAAA,EAAmB,SAAQ,GAAI,OAAA;AAG3E,IAAA,IAAI,iBAAA,EAAmB;AACrB,MAAA,KAAA,CAAK,GAAA,CAAI,2DAA2D,OAAO,CAAA;AAC3E,MAAA;AAAA,IACF;AAGA,IAAA,IAAI,CAAC,mBAAA,EAAqB;AACxB,MAAA,KAAA,CAAK,GAAA,CAAI,sDAAsD,OAAO,CAAA;AACtE,MAAA;AAAA,IACF;AAGA,IAAA,IAAI,MAAK,UAAA,EAAY;AACnB,MAAA,KAAA,CAAK,GAAA,CAAI,6DAA6D,OAAO,CAAA;AAC7E,MAAA;AAAA,IACF;AAEA,IAAA,MAAM,KAAA,CAAK,WAAA;AAAA,MACT,eAAA;AAAA,MACA,YAAY;AACV,QAAA,MAAM,mBAAA,GAAsB,kBAAkB,qBAAqB,CAAA;AACnE,QAAA,IAAI,CAAC,mBAAA,EAAqB;AACxB,UAAA,KAAA,CAAK,GAAA,CAAI,6DAA6D,OAAO,CAAA;AAC7E,UAAA;AAAA,QACF;AACA,QAAA,MAAM,mBAAA,CAAoB,WAAW,mBAAmB,CAAA;AACxD,QAAA,KAAA,CAAK,aAAA,CAAc,aAAA,GAAgB,mBAAA,CAAoB,WAAA,EAAY;AACnE,QAAA,KAAA,CAAK,GAAA,CAAI,qCAAqC,OAAO,CAAA;AAAA,MACvD,CAAA;AAAA,MACA;AAAA,KACF;AAAA,EACF;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAWA,aAAqB,8BAAA,CACnB,OAAA,EACA,iBAAA,EACe;AACf,IAAA,MAAM,EAAE,GAAA,EAAK,SAAA,EAAW,QAAA,EAAU,YAAA,EAAc,SAAQ,GAAI,OAAA;AAC5D,IAAA,MAAM,OAAA,GAAU,MAAK,aAAA,CAAc,OAAA;AAGnC,IAAA,MAAM,qBAEF,EAAC;AAIL,IAAA,MAAM,eAAA,GAAkB,IAAI,GAAA,CAAI,kBAAA,CAAmB,IAAI,CAAA,CAAA,KAAK,CAAA,CAAE,OAAA,CAAQ,UAAU,CAAC,CAAA;AACjF,IAAA,MAAM,aAAA,GAAA,CAAiB,YAAA,IAAgB,EAAC,EAAG,MAAA;AAAA,MAAO,CAAA,CAAA,KAChD,eAAA,CAAgB,GAAA,CAAI,CAAA,CAAE,QAAQ,UAAU;AAAA,KAC1C;AACA,IAAA,MAAM,sBAAA,GAAA,CAA0B,YAAA,IAAgB,EAAC,EAAG,MAAA;AAAA,MAClD,OAAK,CAAC,eAAA,CAAgB,GAAA,CAAI,CAAA,CAAE,QAAQ,UAAU;AAAA,KAChD;AAGA,IAAA,MAAM,cAAA,GAAqC,kBAAA,CACxC,GAAA,CAAI,CAAA,WAAA,KAAe;AAClB,MAAA,MAAM,WAAW,aAAA,CAAc,IAAA;AAAA,QAC7B,CAAA,CAAA,KAAK,CAAA,CAAE,OAAA,CAAQ,UAAA,KAAe,YAAY,OAAA,CAAQ;AAAA,OACpD;AACA,MAAA,OAAO,QAAA,GACH,EAAE,GAAG,WAAA,EAAa,MAAA,EAAQ,EAAE,GAAG,WAAA,CAAY,MAAA,EAAQ,GAAG,QAAA,CAAS,MAAA,IAAS,GACxE,WAAA;AAAA,IACN,CAAC,CAAA,CACA,MAAA,CAAO,sBAAsB,CAAA;AAGhC,IAAA,IAAI,cAAA,CAAe,WAAW,CAAA,EAAG;AAEjC,IAAA,MAAM,KAAA,CAAK,WAAA;AAAA,MACT,iBAAA;AAAA,MACA,YAAY;AACV,QAAA,KAAA,CAAK,GAAA,CAAI,uDAAuD,OAAO,CAAA;AACvE,QAAA,KAAA,CAAK,QAAA,CAAS,iBAAiB,OAAA,EAAS;AAAA,UACtC,UAAU,kBAAA,CAAmB,GAAA,CAAI,CAAA,CAAA,KAAK,CAAA,CAAE,QAAQ,UAAU;AAAA,SAC3D,CAAA;AACD,QAAA,IAAI,cAAc,MAAA,EAAQ;AACxB,UAAA,KAAA,CAAK,QAAA,CAAS,iBAAiB,OAAA,EAAS;AAAA,YACtC,UAAU,YAAA,CAAa,GAAA,CAAI,CAAA,CAAA,KAAK,CAAA,CAAE,QAAQ,UAAU;AAAA,WACrD,CAAA;AAAA,QACH;AACA,QAAA,MAAM,gBAAgB,UAAA,CAAW;AAAA,UAC/B,WAAA,EAAa,iBAAA;AAAA,UACb,OAAA;AAAA,UACA,SAAA,EAAW,YAAY,EAAE,OAAA,EAAS,UAAU,OAAA,EAAS,GAAG,WAAU,GAAI,MAAA;AAAA,UACtE,QAAA,EAAU,cAAA;AAAA,UACV,MAAA,EAAQ;AAAA;AAAA,YAEN,0BAAU,MAAA,CAAA,CAAiC,GAAA,KACzC,KAAA,CAAK,cAAA,CAAe,GAAG,CAAA,EADf,UAAA;AAAA;AAEZ,SACD,CAAA;AACD,QAAA,KAAA,CAAK,GAAA,CAAI,+BAA+B,OAAA,EAAS;AAAA,UAC/C,IAAA,EAAM,gBAAgB,kBAAA;AAAmB,SAC1C,CAAA;AAAA,MACH,CAAA;AAAA,MACA;AAAA,KACF;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAMA,aAAa,UAAA,CAAW,OAAA,GAA2B,EAAC,EAAgC;AAClF,IAAA,IAAI,MAAK,WAAA,EAAa;AACpB,MAAA,KAAA,CAAK,GAAA,CAAI,kDAAA,EAAoD,OAAA,CAAQ,OAAO,CAAA;AAC5E,MAAA,OAAO,KAAA,CAAK,aAAA;AAAA,IACd;AAEA,IAAA,MAAM,EAAE,EAAA,EAAI,QAAA,EAAU,cAAc,kBAAA,EAAoB,MAAA,EAAQ,SAAQ,GAAI,OAAA;AAC5E,IAAA,MAAM,iBAAA,GAAoB,MAAM,KAAA,CAAK,gBAAA,CAAiB,OAAO,CAAA;AAE7D,IAAA,MAAM,KAAA,CAAK,0BAA0B,OAAO,CAAA;AAE5C,IAAA,IAAI,CAAC,KAAA,CAAK,mBAAA,CAAoB,MAAA,EAAQ,OAAO,CAAA,EAAG;AAC9C,MAAA,MAAM,EAAA,GAAK,MAAM,KAAA,CAAK,WAAA;AAAA,QACpB,UAAA;AAAA,QACA,MAAM,KAAA,CAAK,YAAA,CAAa,QAAA,EAAU,OAAO,CAAA;AAAA,QACzC;AAAA,OACF;AACA,MAAA,KAAA,CAAK,aAAA,CAAc,KAAK,EAAA,IAAM,IAAA;AAAA,IAChC;AAEA,IAAA,MAAM,KAAA,CAAK,gBAAA,CAAiB,OAAA,EAAS,iBAAiB,CAAA;AAEtD,IAAA,MAAM,KAAA,CAAK,mBAAmB,OAAO,CAAA;AAErC,IAAA,MAAM,KAAA,CAAK,0BAAA,CAA2B,OAAA,EAAS,iBAAiB,CAAA;AAEhE,IAAA,MAAM,KAAA,CAAK,qBAAqB,OAAO,CAAA;AAEvC,IAAA,MAAM,KAAA,CAAK,2BAA2B,OAAO,CAAA;AAE7C,IAAA,IAAI,kBAAA,EAAoB,YAAY,KAAA,EAAO;AACzC,MAAA,MAAM,KAAA,CAAK,WAAA;AAAA,QACT,eAAA;AAAA,QACA,MAAM,KAAA,CAAK,sBAAA,CAAuB,kBAAA,EAAoB,OAAO,CAAA;AAAA,QAC7D;AAAA,OACF;AAAA,IACF;AAEA,IAAA,MAAM,KAAA,CAAK,8BAAA,CAA+B,OAAA,EAAS,iBAAiB,CAAA;AAEpE,IAAA,KAAA,CAAK,WAAA,GAAc,IAAA;AACnB,IAAA,KAAA,CAAK,GAAA,CAAI,2BAA2B,OAAO,CAAA;AAC3C,IAAA,OAAO,KAAA,CAAK,aAAA;AAAA,EACd;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAYA,WAAW,WAAA,GAAwB;AACjC,IAAA,OAAO,gBAAgB,kBAAA,EAAmB;AAAA,EAC5C;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAmBA,WAAW,MAAA,GAAuD;AAChE,IAAA,MAAM,SAAA,GAAY,KAAA,CAAK,UAAA,EAAY,QAAA,EAAS;AAG5C,IAAA,OAAO,MAAA,CAAO,MAAA,CAAO,UAAU,CAAA,CAAE,MAAA;AAAA,MAC/B,CAAC,KAAK,GAAA,KAAQ;AACZ,QAAA,MAAA,CAAO,cAAA,CAAe,KAAK,GAAA,EAAK;AAAA,UAC9B,GAAA,+BAAW,SAAA,EAAN,KAAA,CAAA;AAAA,UACL,UAAA,EAAY;AAAA,SACb,CAAA;AACD,QAAA,OAAO,GAAA;AAAA,MACT,CAAA;AAAA,MACA;AAAC,KACH;AAAA,EACF;AAAA,EAkBA,OAAO,eACL,GAAA,EACgD;AAChD,IAAA,MAAM,SAAA,GAAY,KAAA,CAAK,UAAA,EAAY,QAAA,EAAS;AAC5C,IAAA,IAAI,CAAC,WAAW,OAAO,MAAA;AAGvB,IAAA,IAAI,CAAC,KAAK,OAAO,SAAA;AAGjB,IAAA,OAAO,UAAU,GAAG,CAAA;AAAA,EACtB;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,WAAW,MAAA,GAAkC;AAC3C,IAAA,OAAO,gBAAA;AAAA,EACT;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,WAAW,EAAA,GAA4B;AACrC,IAAA,IAAI,CAAC,KAAA,CAAK,aAAA,CAAc,EAAA,EAAI;AAC1B,MAAA,MAAM,IAAIF,gBAAAA;AAAA,QACR,iEAAA;AAAA,QACAC,WAAAA,CAAY;AAAA,OACd;AAAA,IACF;AACA,IAAA,OAAO,MAAK,aAAA,CAAc,EAAA;AAAA,EAC5B;AAAA;AAAA;AAAA;AAAA,EAKA,WAAW,GAAA,GAA+B;AACxC,IAAA,IAAI,CAAC,KAAA,CAAK,aAAA,CAAc,GAAA,EAAK;AAC3B,MAAA,MAAM,IAAID,gBAAAA;AAAA,QACR,mEAAA;AAAA,QACAC,WAAAA,CAAY;AAAA,OACd;AAAA,IACF;AACA,IAAA,OAAO,MAAK,aAAA,CAAc,GAAA;AAAA,EAC5B;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,WAAW,KAAA,GAAkC;AAC3C,IAAA,IAAI,CAAC,KAAA,CAAK,aAAA,CAAc,KAAA,EAAO;AAC7B,MAAA,MAAM,IAAID,gBAAAA;AAAA,QACR,gFAAA;AAAA,QACAC,WAAAA,CAAY;AAAA,OACd;AAAA,IACF;AACA,IAAA,OAAO,MAAK,aAAA,CAAc,KAAA;AAAA,EAC5B;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,EA6BA,WAAW,aAAA,GAAsC;AAC/C,IAAA,IAAI,CAAC,KAAA,CAAK,aAAA,CAAc,aAAA,EAAe;AACrC,MAAA,MAAM,IAAID,gBAAAA;AAAA,QACR,sEAAA;AAAA,QACAC,WAAAA,CAAY;AAAA,OACd;AAAA,IACF;AACA,IAAA,OAAO,MAAK,aAAA,CAAc,aAAA;AAAA,EAC5B;AAAA;AAAA;AAAA;AAAA,EAKA,WAAW,0BAAA,GAAsC;AAC/C,IAAA,OAAO,KAAA,CAAK,cAAc,aAAA,KAAkB,IAAA;AAAA,EAC9C;AAAA;AAAA;AAAA;AAAA,EAKA,WAAW,mBAAA,GAA+C;AACxD,IAAA,OAAO,KAAA,CAAK,oBAAA;AAAA,EACd;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAYA,WAAW,OAAA,GAAsC;AAC/C,IAAA,IAAI,CAAC,KAAA,CAAK,aAAA,CAAc,OAAA,EAAS;AAC/B,MAAA,MAAM,IAAID,gBAAAA;AAAA,QACR,oFAAA;AAAA,QACAC,WAAAA,CAAY;AAAA,OACd;AAAA,IACF;AACA,IAAA,OAAO,MAAK,aAAA,CAAc,OAAA;AAAA,EAC5B;AAAA;AAAA;AAAA;AAAA,EAKA,WAAW,oBAAA,GAAgC;AACzC,IAAA,OAAO,KAAA,CAAK,cAAc,OAAA,KAAY,IAAA;AAAA,EACxC;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAYA,WAAW,aAAA,GAAiD;AAC1D,IAAA,IAAI,CAAC,KAAA,CAAK,aAAA,CAAc,aAAA,EAAe;AACrC,MAAA,MAAM,IAAID,gBAAAA;AAAA,QACR,gGAAA;AAAA,QACAC,WAAAA,CAAY;AAAA,OACd;AAAA,IACF;AACA,IAAA,OAAO,MAAK,aAAA,CAAc,aAAA;AAAA,EAC5B;AAAA;AAAA;AAAA;AAAA,EAKA,WAAW,0BAAA,GAAsC;AAC/C,IAAA,OAAO,KAAA,CAAK,cAAc,aAAA,KAAkB,IAAA;AAAA,EAC9C;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAsBA,WAAW,SAAA,GAAsC;AAC/C,IAAA,IAAI,CAAC,MAAK,UAAA,EAAY;AACpB,MAAA,MAAM,IAAID,gBAAAA;AAAA,QACR,2DAAA;AAAA,QACAC,WAAAA,CAAY;AAAA,OACd;AAAA,IACF;AACA,IAAA,OAAO,KAAA,CAAK,UAAA;AAAA,EACd;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAkBA,WAAW,MAAA,GAA4B;AACrC,IAAA,IAAI,CAAC,MAAK,aAAA,EAAe;AACvB,MAAA,MAAM,IAAID,gBAAAA;AAAA,QACR,gGAAA;AAAA,QACAC,WAAAA,CAAY;AAAA,OACd;AAAA,IACF;AACA,IAAA,OAAO,KAAA,CAAK,cAAc,QAAA,EAAS;AAAA,EACrC;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAkBA,WAAW,KAAA,GAA+B;AACxC,IAAA,IAAI,CAAC,MAAK,UAAA,EAAY;AACpB,MAAA,MAAM,IAAID,gBAAAA;AAAA,QACR,2DAAA;AAAA,QACAC,WAAAA,CAAY;AAAA,OACd;AAAA,IACF;AAGA,IAAA,OAAO,KAAA,CAAK,WAAW,QAAA,EAAS;AAAA,EAClC;AAAA;AAAA;AAAA;AAAA,EAKA,WAAW,yBAAA,GAAqC;AAC9C,IAAA,OAAO,MAAK,aAAA,KAAkB,IAAA;AAAA,EAChC;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,EAiCA,WAAW,gBAAA,GAA4B;AACrC,IAAA,OAAO,KAAA,CAAK,iBAAA;AAAA,EACd;AAAA;AAAA;AAAA;AAAA,EAKA,WAAW,kBAAA,GAA8B;AACvC,IAAA,OAAO,KAAA,CAAK,UAAA,EAAY,QAAA,EAAS,EAAG,cAAc,aAAA,IAAiB,KAAA;AAAA,EACrE;AAAA;AAAA;AAAA;AAAA,EAKA,WAAW,WAAA,GAA0C;AACnD,IAAA,OAAO,KAAA,CAAK,YAAA;AAAA,EACd;AAAA;AAAA;AAAA;AAAA,EAKA,WAAW,UAAA,GAAwC;AACjD,IAAA,OAAO,KAAA,CAAK,WAAA;AAAA,EACd;AAAA;AAAA;AAAA;AAAA,EAKA,WAAW,GAAA,GAAmB;AAC5B,IAAA,OAAO,MAAK,aAAA,CAAc,GAAA;AAAA,EAC5B;AAAA;AAAA;AAAA;AAAA,EAKA,WAAW,OAAA,GAAkC;AAC3C,IAAA,OAAO,MAAK,aAAA,CAAc,OAAA;AAAA,EAC5B;AAAA;AAAA;AAAA;AAAA,EAKA,WAAW,UAAA,GAA6B;AACtC,IAAA,OAAO,MAAK,aAAA,CAAc,UAAA;AAAA,EAC5B;AAAA;AAAA;AAAA;AAAA,EAKA,WAAW,aAAA,GAAyB;AAClC,IAAA,OAAO,KAAA,CAAK,WAAA;AAAA,EACd;AAAA;AAAA;AAAA;AAAA,EAKA,WAAW,SAAA,GAAqB;AAC9B,IAAA,OAAOG,gBAAAA,CAAiB,QAAA,CAAS,KAAA,CAAK,aAAA,CAAc,OAAO,CAAA;AAAA,EAC7D;AAAA;AAAA;AAAA;AAAA,EAKA,WAAW,UAAA,GAAsB;AAC/B,IAAA,OAAOC,iBAAAA,CAAkB,QAAA,CAAS,KAAA,CAAK,aAAA,CAAc,OAAO,CAAA;AAAA,EAC9D;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,OAAO,iBAAA,GAAwC;AAC7C,IAAA,IAAID,gBAAAA,CAAiB,QAAA,CAAS,KAAA,CAAK,aAAA,CAAc,OAAO,CAAA,EAAG;AACzD,MAAA,OAAO,SAAA;AAAA,IACT;AACA,IAAA,IAAIC,iBAAAA,CAAkB,QAAA,CAAS,KAAA,CAAK,aAAA,CAAc,OAAO,CAAA,EAAG;AAC1D,MAAA,OAAO,UAAA;AAAA,IACT;AACA,IAAA,OAAO,WAAA;AAAA,EACT;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAmBA,OAAO,aAAA,CACL,QAAA,EACA,WAAA,EACM;AACN,IAAA,MAAM,WAAW,KAAA,CAAM,OAAA,CAAQ,QAAQ,CAAA,GAAI,QAAA,GAAW,CAAC,QAAQ,CAAA;AAC/D,IAAA,MAAM,cAAA,GAAiB,MAAK,iBAAA,EAAkB;AAG9C,IAAA,MAAM,SAAA,GAAY,QAAA,CAAS,IAAA,CAAK,CAAA,OAAA,KAAW;AACzC,MAAA,IAAI,OAAA,KAAY,aAAa,OAAO,IAAA;AACpC,MAAA,IAAI,OAAA,KAAY,gBAAgB,OAAO,IAAA;AAEvC,MAAA,IAAI,cAAA,KAAmB,aAAa,OAAO,IAAA;AAC3C,MAAA,OAAO,KAAA;AAAA,IACT,CAAC,CAAA;AAED,IAAA,IAAI,CAAC,SAAA,EAAW;AACd,MAAA,MAAM,IAAIL,gBAAAA;AAAA,QACR,CAAA,EAAG,WAAW,CAAA,eAAA,EAAkB,cAAc,CAAA,4BAAA,EACvB,QAAA,CAAS,IAAA,CAAK,IAAI,CAAC,CAAA,mBAAA,EACpB,KAAA,CAAK,aAAA,CAAc,OAAO,CAAA,CAAA;AAAA,QAChDC,WAAAA,CAAY;AAAA,OACd;AAAA,IACF;AAAA,EACF;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAQA,OAAO,oBACL,QAAA,EACS;AACT,IAAA,MAAM,WAAW,KAAA,CAAM,OAAA,CAAQ,QAAQ,CAAA,GAAI,QAAA,GAAW,CAAC,QAAQ,CAAA;AAC/D,IAAA,MAAM,cAAA,GAAiB,MAAK,iBAAA,EAAkB;AAE9C,IAAA,OAAO,QAAA,CAAS,KAAK,CAAA,OAAA,KAAW;AAC9B,MAAA,IAAI,OAAA,KAAY,aAAa,OAAO,IAAA;AACpC,MAAA,IAAI,OAAA,KAAY,gBAAgB,OAAO,IAAA;AACvC,MAAA,IAAI,cAAA,KAAmB,aAAa,OAAO,IAAA;AAC3C,MAAA,OAAO,KAAA;AAAA,IACT,CAAC,CAAA;AAAA,EACH;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAeA,OAAO,WACL,GAAA,EACG;AACH,IAAA,OAAO,eAAA,CAAgB,IAAO,GAAG,CAAA;AAAA,EACnC;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EASA,aAAa,gBACX,GAAA,EACY;AACZ,IAAA,OAAO,eAAA,CAAgB,SAAY,GAAG,CAAA;AAAA,EACxC;AAAA;AAAA;AAAA;AAAA,EAKA,OAAO,WAAW,GAAA,EAAsB;AACtC,IAAA,OAAO,eAAA,CAAgB,IAAI,GAAG,CAAA;AAAA,EAChC;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,aAAa,KAAA,GAAuB;AAElC,IAAA,IAAI,KAAA,CAAK,cAAc,EAAA,EAAI;AACzB,MAAA,MAAM,KAAA,CAAK,aAAA,CAAc,EAAA,CAAG,WAAA,IAAe,KAAA,IAAQ;AAAA,IACrD;AAGA,IAAA,IAAI,KAAA,CAAK,cAAc,KAAA,EAAO;AAC5B,MAAA,MAAM,YAAA,GAAe,kBAAkB,cAAc,CAAA;AACrD,MAAA,YAAA,EAAc,KAAA,IAAQ;AAAA,IACxB;AAGA,IAAA,IAAI,KAAA,CAAK,cAAc,aAAA,EAAe;AACpC,MAAA,MAAM,KAAA,CAAK,aAAA,CAAc,aAAA,CAAc,QAAA,EAAS;AAAA,IAClD;AACA,IAAA,KAAA,CAAK,uBAAuB,EAAC;AAG7B,IAAA,IAAI,KAAA,CAAK,cAAc,OAAA,EAAS;AAC9B,MAAA,MAAM,KAAA,CAAK,aAAA,CAAc,OAAA,CAAQ,KAAA,EAAM;AACvC,MAAA,MAAM,cAAA,GAAiB,kBAAkB,gBAAgB,CAAA;AACzD,MAAA,MAAM,gBAAgB,KAAA,IAAQ;AAAA,IAChC;AAGA,IAAA,IAAI,KAAA,CAAK,cAAc,aAAA,EAAe;AACpC,MAAA,MAAM,KAAA,CAAK,aAAA,CAAc,aAAA,CAAc,KAAA,EAAM;AAC7C,MAAA,MAAM,mBAAA,GAAsB,kBAAkB,qBAAqB,CAAA;AACnE,MAAA,MAAM,qBAAqB,KAAA,IAAQ;AAAA,IACrC;AAGA,IAAA,IAAI,MAAK,aAAA,EAAe;AACtB,MAAA,KAAA,CAAK,cAAc,OAAA,EAAQ;AAC3B,MAAA,KAAA,CAAK,aAAA,GAAgB,IAAA;AACrB,MAAA,iBAAA,EAAkB;AAAA,IACpB;AACA,IAAA,KAAA,CAAK,eAAe,EAAC;AACrB,IAAA,KAAA,CAAK,iBAAA,GAAoB,IAAA;AAGzB,IAAA,KAAA,MAAW,OAAA,IAAW,MAAK,gBAAA,EAAkB;AAC3C,MAAA,OAAA,EAAQ;AAAA,IACV;AACA,IAAA,KAAA,CAAK,mBAAmB,EAAC;AAGzB,IAAA,IAAI,MAAK,UAAA,EAAY;AACnB,MAAA,MAAM,KAAA,GAAQ,KAAA,CAAK,UAAA,CAAW,QAAA,EAAS;AACvC,MAAA,IAAI,KAAA,CAAM,cAAc,OAAA,EAAS;AAC/B,QAAA,KAAA,CAAM,aAAa,OAAA,EAAQ;AAAA,MAC7B;AACA,MAAA,KAAA,CAAK,UAAA,GAAa,IAAA;AAAA,IACpB;AACA,IAAA,KAAA,CAAK,cAAc,EAAC;AAGpB,IAAA,eAAA,CAAgB,UAAA,EAAW;AAG3B,IAAA,gBAAA,CAAiB,OAAA,EAAQ;AAEzB,IAAA,KAAA,CAAK,aAAA,GAAgB;AAAA,MACnB,EAAA,EAAI,IAAA;AAAA,MACJ,GAAA,EAAK,IAAA;AAAA,MACL,KAAA,EAAO,IAAA;AAAA,MACP,aAAA,EAAe,IAAA;AAAA,MACf,OAAA,EAAS,IAAA;AAAA,MACT,aAAA,EAAe,IAAA;AAAA,MACf,KAAK,EAAC;AAAA,MACN,OAAA,EAAS,SAAA;AAAA,MACT,UAAA,EAAY;AAAA,KACd;AACA,IAAA,KAAA,CAAK,WAAA,GAAc,KAAA;AAAA,EACrB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAeA,OAAe,mBAAA,CAAoB,MAAA,EAA6B,OAAA,EAA4B;AAE1F,IAAA,IAAI,WAAW,IAAA,EAAM;AACnB,MAAA,KAAA,CAAK,GAAA,CAAI,2CAA2C,OAAO,CAAA;AAC3D,MAAA,OAAO,IAAA;AAAA,IACT;AAGA,IAAA,MAAM,aAAa,KAAA,CAAK,UAAA;AAExB,IAAA,IAAI,UAAA,EAAY;AAEd,MAAA,IAAI,WAAW,KAAA,EAAO;AACpB,QAAA,KAAA,CAAK,MAAA,CAAO,IAAA;AAAA,UACV;AAAA,SAGF;AAAA,MACF,WAAW,OAAA,EAAS;AAElB,QAAA,KAAA,CAAK,GAAA;AAAA,UACH,+FAAA;AAAA,UAEA;AAAA,SACF;AAAA,MACF;AACA,MAAA,OAAO,IAAA;AAAA,IACT;AAGA,IAAA,OAAO,KAAA;AAAA,EACT;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,aAAqB,YAAA,CACnB,MAAA,EACA,OAAA,EACgC;AAChC,IAAA,KAAA,CAAK,IAAI,CAAA,oCAAA,EAAuC,MAAA,EAAQ,OAAA,IAAW,SAAS,IAAI,OAAO,CAAA;AAEvF,IAAA,MAAM,SAAA,GAAY,kBAAkB,WAAW,CAAA;AAC/C,IAAA,IAAI,CAAC,SAAA,EAAW;AACd,MAAA,MAAM,IAAID,gBAAAA;AAAA,QACR,sFAAA;AAAA,QACAC,WAAAA,CAAY;AAAA,OACd;AAAA,IACF;AACA,IAAA,OAAO,UAAU,UAAA,CAAW;AAAA,MAC1B,OAAA,EAAS,SAAA;AAAA,MACT,GAAG;AAAA,KACmB,CAAA;AAAA,EAC1B;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,aAAqB,aAAA,CACnB,MAAA,EACA,iBAAA,EACA,OAAA,EACe;AACf,IAAA,MAAM,EAAE,KAAK,MAAA,EAAQ,YAAA,EAAc,GAAG,gBAAA,EAAiB,GAAI,UAAU,EAAC;AACtE,IAAA,MAAM,WAAA,GAAc,UAAU,iBAAA,IAAqB,aAAA;AAEnD,IAAA,KAAA,CAAK,GAAA,CAAI,CAAA,yCAAA,EAA4C,WAAW,CAAA,CAAA,EAAI,OAAO,CAAA;AAE3E,IAAA,MAAM,gBAAA,CAAiB,IAAA;AAAA,MACrB;AAAA,QACE,GAAA,EAAK,WAAA;AAAA,QACL,cAAc,YAAA,IAAgB;AAAA,OAChC;AAAA,MACA;AAAA,KACF;AAAA,EACF;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,aAAqB,eAAA,CAAgB,MAAA,EAAyB,OAAA,EAAkC;AAC9F,IAAA,KAAA,CAAK,GAAA,CAAI,CAAA,kCAAA,EAAqC,MAAA,CAAO,QAAQ,IAAI,OAAO,CAAA;AAExE,IAAA,MAAM,YAAA,GAAe,kBAAkB,cAAc,CAAA;AACrD,IAAA,IAAI,CAAC,YAAA,EAAc;AACjB,MAAA,MAAM,IAAID,gBAAAA;AAAA,QACR,yFAAA;AAAA,QACAC,WAAAA,CAAY;AAAA,OACd;AAAA,IACF;AACA,IAAA,MAAM,YAAA,CAAa,WAAW,MAAM,CAAA;AAAA,EACtC;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,aAAqB,uBAAA,CACnB,MAAA,EACA,OAAA,EACA,WAAA,EACe;AACf,IAAA,KAAA,CAAK,IAAI,CAAA,0CAAA,EAA6C,MAAA,CAAO,QAAA,IAAY,MAAM,IAAI,OAAO,CAAA;AAG1F,IAAA,MAAM,GAAA,GAAM,MAAA,CAAO,WAAA,IAAe,WAAA,IAAe,aAAA;AACjD,IAAA,KAAA,CAAK,oBAAA,GAAuB,EAAE,GAAG,MAAA,EAAQ,aAAa,GAAA,EAAI;AAG1D,IAAA,MAAM,WAAsF,EAAC;AAG7F,IAAA,MAAM,aAAA,GAAgB,IAAI,aAAA,EAAc;AACxC,IAAA,MAAM,cAAc,UAAA,CAAW;AAAA,MAC7B,OAAA,EAAS,OAAO,OAAA,KAAY,KAAA;AAAA,MAC5B,aAAa,MAAA,CAAO,WAAA;AAAA,MACpB,WAAA,EAAa,GAAA;AAAA,MACb,aAAa,MAAA,CAAO;AAAA,KACrB,CAAA;AACD,IAAA,QAAA,CAAS,IAAA,CAAK,EAAE,OAAA,EAAS,aAAA,EAAe,UAAU,IAAA,EAAM,QAAA,EAAU,MAAM,CAAA;AAcxE,IAAA,MAAM,aAAA,GAAgB,IAAI,oBAAA,EAAqB;AAC/C,IAAA,MAAM,cAAc,UAAA,CAAW;AAAA,MAC7B,IAAA,EAAM,OAAO,IAAA,IAAQ,UAAA;AAAA,MACrB,QAAA;AAAA,MACA,SAAS,MAAA,CAAO,OAAA;AAAA,MAChB,aAAa,MAAA,CAAO,WAAA;AAAA,MACpB,WAAA,EAAa,GAAA;AAAA,MACb,aAAa,MAAA,CAAO,WAAA;AAAA,MACpB,cAAc,MAAA,CAAO,YAAA;AAAA,MACrB,eAAe,MAAA,CAAO,aAAA;AAAA,MACtB,gBAAgB,MAAA,CAAO;AAAA,KACxB,CAAA;AAED,IAAA,KAAA,CAAK,GAAA;AAAA,MACH,CAAA,sCAAA,EAAyC,QAAA,CAAS,MAAM,CAAA,gBAAA,EAAmB,GAAG,CAAA,CAAA,CAAA;AAAA,MAC9E;AAAA,KACF;AAEA,IAAA,KAAA,CAAK,cAAc,aAAA,GAAgB,aAAA;AAEnC,IAAA,eAAA,CAAgB,yBAAyB,aAAa,CAAA;AAAA,EACxD;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,aAAqB,mBAAA,CACnB,MAAA,EACA,OAAA,EACe;AACf,IAAA,MAAM,UAAA,GAAa,OAAO,MAAA,KAAW,WAAA;AAErC,IAAA,IAAI,UAAA,EAAY;AACd,MAAA,KAAA,CAAK,GAAA,CAAI,uCAAuC,OAAO,CAAA;AAEvD,MAAA,KAAA,CAAK,UAAA,GAAa,YAAA;AAAA,IACpB,CAAA,MAAO;AACL,MAAA,KAAA,CAAK,GAAA,CAAI,gDAAgD,OAAO,CAAA;AAChE,MAAA,MAAM,qBAAA,GAAwB,kBAAkB,uBAAuB,CAAA;AACvE,MAAA,IAAI,CAAC,qBAAA,EAAuB;AAC1B,QAAA,MAAM,IAAID,gBAAAA;AAAA,UACR,kGAAA;AAAA,UACAC,WAAAA,CAAY;AAAA,SACd;AAAA,MACF;AAGA,MAAA,MAAM,iBAAA,GAAoB,sBAAsB,gBAAA,CAAiB;AAAA,QAC/D,SAAA,EAAW,QAAQ,SAAA,IAAa,kBAAA;AAAA,QAChC,cAAc,MAAA,EAAQ;AAAA,OACvB,CAAA;AAGD,MAAA,MAAM,mBAAmB,gCAAA,EAAiC;AAG1D,MAAA,MAAM,cAAA,GAAiB;AAAA;AAAA,QAErB,GAAG,iBAAA;AAAA;AAAA,QAEH,GAAG;AAAA,OACL;AAGA,MAAA,KAAA,CAAK,UAAA,GAAa;AAAA,QAChB,QAAA,+BAAgB,cAAA,EAAN,UAAA,CAAA;AAAA,QACV,SAAA,+BAAiB,MAAM;AAAA,QAAC,CAAA,EAAb,WAAA,CAAA;AAAA;AAAA,QACX,yBAAS,MAAA,CAAA,MAAM;AACb,UAAA,iBAAA,CAAkB,KAAA,EAAM;AACxB,UAAA,gBAAA,CAAiB,OAAA,IAAU;AAAA,QAC7B,CAAA,EAHS,SAAA;AAAA,OAIX;AAAA,IACF;AAAA,EACF;AAAA;AAAA,EAGA,OAAe,oBAAA,GAA0C;AACvD,IAAA,IAAI,CAAC,MAAK,UAAA,EAAY;AACpB,MAAA,MAAM,IAAID,gBAAAA;AAAA,QACR,2DAAA;AAAA,QACAC,WAAAA,CAAY;AAAA,OACd;AAAA,IACF;AACA,IAAA,OAAO,KAAA,CAAK,UAAA,CAAW,QAAA,EAAS,CAAE,MAAA;AAAA,EACpC;AAAA;AAAA;AAAA,EAIA,OAAe,wBACb,MAAA,EACoD;AACpD,IAAA,OAAO;AAAA,MACL,MAAA,EAAQ,QAAQ,MAAA,IAAU,QAAA;AAAA,MAC1B,SAAA,EAAW,QAAQ,SAAA,IAAa,kBAAA;AAAA,MAChC,QAAQ,MAAA,EAAQ,MAAA;AAAA,MAChB,SAAS,MAAA,EAAQ,OAAA;AAAA,MACjB,YAAA,EAAc,QAAQ,YAAA,IAAgB;AAAA,KACxC;AAAA,EACF;AAAA;AAAA,EAGA,aAAqB,sBAAA,CACnB,MAAA,EACA,OAAA,EACe;AACf,IAAA,IAAI,MAAA,EAAQ,YAAY,KAAA,EAAO;AAC7B,MAAA,KAAA,CAAK,GAAA,CAAI,2CAA2C,OAAO,CAAA;AAC3D,MAAA;AAAA,IACF;AAEA,IAAA,KAAA,CAAK,YAAA,GAAe,UAAU,EAAC;AAC/B,IAAA,KAAA,CAAK,GAAA,CAAI,wCAAwC,OAAO,CAAA;AAIxD,IAAA,qBAAA,CAAsB;AAAA,MACpB,aAAA,EAAe,KAAA,CAAK,YAAA,CAAa,YAAA,EAAc,aAAA;AAAA,MAC/C,cAAA,EAAgB,KAAA,CAAK,YAAA,CAAa,YAAA,EAAc,cAAA;AAAA,MAChD,kBAAA,EAAoB,KAAA,CAAK,YAAA,CAAa,YAAA,EAAc,kBAAA;AAAA,MACpD,cAAA,EAAgB,KAAA,CAAK,YAAA,CAAa,YAAA,EAAc;AAAA,KACjD,CAAA;AAGD,IAAA,MAAM,KAAA,CAAK,mBAAA,CAAoB,KAAA,CAAK,YAAA,EAAc,OAAO,CAAA;AAIzD,IAAA,eAAA,CAAgB,gBAAA,CAAiB,IAAA,CAAK,IAAA,CAAK,gBAAgB,CAAC,CAAA;AAE5D,IAAA,MAAM,UAAA,GAAa,MAAK,oBAAA,EAAqB;AAC7C,IAAA,KAAA,CAAK,aAAA,GAAgB,4BAAA;AAAA,MACnB,UAAA;AAAA,MACA,KAAA,CAAK,uBAAA,CAAwB,KAAA,CAAK,YAAY;AAAA,KAChD;AAIA,IAAA,MAAM,oBAAoB,gBAAA,CAAiB,EAAA;AAAA,MACzCK,cAAY,MAAA,CAAO,KAAA;AAAA,MACnB,CAAC,KAAA,KAA6C;AAC5C,QAAA,IAAI,CAAC,MAAK,UAAA,EAAY;AAEtB,QAAA,IAAI;AACF,UAAA,MAAM,EAAE,MAAA,EAAO,GAAI,KAAA,CAAM,IAAA;AACzB,UAAA,IAAI,MAAA,IAAU,MAAA,CAAO,MAAA,GAAS,CAAA,EAAG;AAG/B,YAAA,KAAA,CAAK,UAAA,CAAW,QAAA,EAAS,CAAE,MAAA,CAAO,UAAU,MAAM,CAAA;AAClD,YAAA,KAAA,CAAK,GAAA,CAAI,CAAA,MAAA,EAAS,MAAA,CAAO,MAAM,sBAAsB,OAAO,CAAA;AAAA,UAC9D;AAAA,QACF,SAAS,CAAA,EAAG;AACV,UAAA,KAAA,CAAK,OAAO,KAAA,CAAM,8BAAA,EAAgC,EAAE,KAAA,EAAO,GAAG,CAAA;AAAA,QAChE;AAAA,MACF;AAAA,KACF;AAGA,IAAA,KAAA,CAAK,gBAAA,CAAiB,KAAK,iBAAiB,CAAA;AAE5C,IAAA,KAAA,CAAK,GAAA,CAAI,sEAAsE,OAAO,CAAA;AAGtF,IAAA,IAAI,KAAA,CAAK,YAAA,CAAa,WAAA,KAAgB,KAAA,EAAO;AAC3C,MAAA,MAAM,KAAA,CAAK,sBAAA,CAAuB,KAAA,CAAK,YAAA,EAAc,OAAO,CAAA;AAAA,IAC9D;AAAA,EACF;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOA,aAAqB,sBAAA,CACnB,MAAA,EACA,OAAA,EACe;AACf,IAAA,MAAM,OAAA,GAAU,MAAK,aAAA,CAAc,OAAA;AACnC,IAAA,MAAM,YAAA,GAAe,KAAA,CAAK,aAAA,CAAc,GAAA,CAAI,QAAA,KAAa,YAAA;AAGzD,IAAA,IAAI,YAAY,SAAA,EAAW;AACzB,MAAA,KAAA,CAAK,iBAAA,GAAoB,IAAA;AACzB,MAAA,KAAA,CAAK,GAAA,CAAI,6CAA6C,OAAO,CAAA;AAC7D,MAAA;AAAA,IACF;AAEA,IAAA,MAAM,qBAAA,GAAwB,kBAAkB,uBAAuB,CAAA;AACvE,IAAA,IAAI,CAAC,qBAAA,EAAuB;AAC1B,MAAA,KAAA,CAAK,GAAA,CAAI,gEAAgE,OAAO,CAAA;AAChF,MAAA;AAAA,IACF;AAGA,IAAA,MAAM,UAAA,GAAa;AAAA,MACjB,MAAA,EAAQ,OAAA;AAAA,MACR,YAAA,EAAc,MAAA,EAAQ,YAAA,IAAgB,CAAC,YAAA;AAAA,MACvC,SAAA,EAAW,MAAA,EAAQ,MAAA,IAAU,MAAA,EAAQ,YAAA,IAAgB,IAAA;AAAA,MACrD,YAAA,EAAc,MAAK,aAAA,IAAiB;AAAA,KACtC;AAEA,IAAA,QAAQ,OAAA;AAAS,MACf,KAAK,SAAA;AACH,QAAA,KAAA,CAAK,iBAAA,GAAoB,qBAAA,CAAsB,sBAAA,CAAuB,UAAU,CAAA;AAChF,QAAA,KAAA,CAAK,GAAA,CAAI,4CAA4C,OAAO,CAAA;AAC5D,QAAA;AAAA,MAEF,KAAK,QAAA;AACH,QAAA,KAAA,CAAK,iBAAA,GAAoB,qBAAA,CAAsB,2BAAA,CAA4B,UAAU,CAAA;AACrF,QAAA,KAAA,CAAK,GAAA,CAAI,mCAAmC,OAAO,CAAA;AACnD,QAAA;AAAA,MAEF,KAAK,QAAA;AAEH,QAAA,KAAA,CAAK,iBAAA,GAAoB;AAAA;AAAA,UAEvB,kCAAkB,MAAA,CAAA,CAAI,OAAA,EAAY,cAAA,GAAiB,OACjD,qBAAA,CAAsB,gBAAA;AAAA,YACpB,OAAA;AAAA,YACA,EAAE,GAAG,UAAA,EAAY,GAAG,cAAA;AAAe,WACrC,EAJgB,kBAAA,CAAA;AAAA;AAAA,UAMlB,yBAAA,kBAA2B,MAAA,CAAA,CAAC,cAAA,GAAiB,EAAC,KAC5C,qBAAA,CAAsB,yBAAA,CAA0B,EAAE,GAAG,UAAA,EAAY,GAAG,cAAA,EAAgB,CAAA,EAD3D,2BAAA;AAAA,SAE7B;AACA,QAAA,KAAA,CAAK,GAAA,CAAI,kCAAkC,OAAO,CAAA;AAClD,QAAA;AAAA,MAEF,KAAK,MAAA;AAAA,MACL,KAAK,KAAA;AAAA,MACL,KAAK,MAAA;AAEH,QAAA,KAAA,CAAK,iBAAA,GAAoB;AAAA;AAAA,UAEvB,WAAA,kBAAa,MAAA,CAAA,CAAC,KAAA,EAAgB,GAAA,EAAc,QAC1C,qBAAA,CAAsB,eAAA;AAAA,YACpB,KAAA;AAAA,YACA,GAAA;AAAA;AAAA,YAEA,GAAA;AAAA,YACA;AAAA,WACF,EAPW,aAAA,CAAA;AAAA;AAAA,UASb,gBAAA,kBAAkB,MAAA,CAAA,MAAM,qBAAA,CAAsB,sBAAA,CAAuB,UAAU,CAAA,EAA7D,kBAAA;AAAA,SACpB;AACA,QAAA,KAAA,CAAK,GAAA,CAAI,CAAA,QAAA,EAAW,OAAO,CAAA,cAAA,CAAA,EAAkB,OAAO,CAAA;AACpD,QAAA;AAAA,MAEF;AAEE,QAAA,KAAA,CAAK,iBAAA,GAAoB,qBAAA,CAAsB,sBAAA,CAAuB,UAAU,CAAA;AAChF,QAAA,KAAA,CAAK,GAAA,CAAI,CAAA,uCAAA,EAA0C,OAAO,CAAA,CAAA,EAAI,OAAO,CAAA;AAAA;AACzE,EACF;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EASA,OAAe,uBAAuB,OAAA,EAAyB;AAC7D,IAAA,IAAI,CAAC,MAAK,aAAA,EAAe;AACvB,MAAA;AAAA,IACF;AAEA,IAAA,KAAA,CAAK,GAAA,CAAI,kCAAkC,OAAO,CAAA;AAGlD,IAAA,MAAM,qBAAqB,gBAAA,CAAiB,EAAA,CAAGA,aAAAA,CAAY,MAAA,CAAO,OAAO,CAAA,KAAA,KAAS;AAChF,MAAA,IAAI,KAAA,CAAK,aAAA,IAAiB,KAAA,CAAM,IAAA,EAAM,QAAQ,MAAA,EAAQ;AAEpD,QAAA,KAAA,MAAW,GAAA,IAAO,KAAA,CAAM,IAAA,CAAK,MAAA,EAAQ;AACnC,UAAA,KAAA,CAAK,aAAA,CAAc,YAAA,CAAa,GAAA,EAAK,QAAQ,CAAA;AAAA,QAC/C;AAAA,MACF;AAAA,IACF,CAAC,CAAA;AAGD,IAAA,MAAM,qBAAqB,gBAAA,CAAiB,EAAA,CAAGA,aAAAA,CAAY,MAAA,CAAO,OAAO,CAAA,KAAA,KAAS;AAChF,MAAA,IAAI,KAAA,CAAK,aAAA,IAAiB,KAAA,CAAM,IAAA,EAAM;AACpC,QAAA,KAAA,CAAK,aAAA,CAAc,YAAA,CAAa,KAAA,CAAM,IAAA,CAAK,OAAO,QAAQ,CAAA;AAAA,MAC5D;AAAA,IACF,CAAC,CAAA;AAGD,IAAA,MAAM,kBAAkB,gBAAA,CAAiB,EAAA,CAAGA,aAAAA,CAAY,GAAA,CAAI,eAAe,CAAA,KAAA,KAAS;AAClF,MAAA,IAAI,KAAA,CAAK,aAAA,IAAiB,KAAA,CAAM,IAAA,EAAM;AACpC,QAAA,KAAA,CAAK,aAAA,CAAc,YAAA,CAAa,KAAA,CAAM,IAAA,CAAK,OAAO,KAAK,CAAA;AAAA,MACzD;AAAA,IACF,CAAC,CAAA;AAGD,IAAA,MAAM,yBAAyB,gBAAA,CAAiB,EAAA,CAAGA,aAAAA,CAAY,UAAA,CAAW,QAAQ,CAAA,KAAA,KAAS;AACzF,MAAA,IAAI,KAAA,CAAK,aAAA,IAAiB,KAAA,CAAM,IAAA,EAAM;AACpC,QAAA,KAAA,CAAK,aAAA,CAAc,YAAA,CAAa,KAAA,CAAM,IAAA,CAAK,OAAO,YAAY,CAAA;AAAA,MAChE;AAAA,IACF,CAAC,CAAA;AAGD,IAAA,MAAM,0BAA0B,gBAAA,CAAiB,EAAA,CAAGA,aAAAA,CAAY,IAAA,CAAK,cAAc,CAAA,KAAA,KAAS;AAC1F,MAAA,IAAI,KAAA,CAAK,aAAA,IAAiB,KAAA,CAAM,IAAA,EAAM,KAAA,EAAO;AAC3C,QAAA,KAAA,CAAK,aAAA,CAAc,YAAA,CAAa,KAAA,CAAM,IAAA,CAAK,OAAO,MAAM,CAAA;AAAA,MAC1D;AAAA,IACF,CAAC,CAAA;AAED,IAAA,MAAM,4BAA4B,gBAAA,CAAiB,EAAA;AAAA,MACjDA,cAAY,IAAA,CAAK,eAAA;AAAA,MACjB,CAAA,KAAA,KAAS;AACP,QAAA,IAAI,KAAA,CAAK,aAAA,IAAiB,KAAA,CAAM,IAAA,EAAM,KAAA,EAAO;AAC3C,UAAA,KAAA,CAAK,aAAA,CAAc,YAAA,CAAa,KAAA,CAAM,IAAA,CAAK,OAAO,MAAM,CAAA;AAAA,QAC1D;AAAA,MACF;AAAA,KACF;AAGA,IAAA,KAAA,CAAK,gBAAA,CAAiB,IAAA;AAAA,MACpB,kBAAA;AAAA,MACA,kBAAA;AAAA,MACA,eAAA;AAAA,MACA,sBAAA;AAAA,MACA,uBAAA;AAAA,MACA;AAAA,KACF;AAIA,IAAA,IAAI,KAAA,CAAK,mBAAA,CAAoB,SAAS,CAAA,EAAG;AACvC,MAAA,MAAM,uBAAuB,gBAAA,CAAiB,EAAA,CAAGA,aAAAA,CAAY,QAAA,CAAS,OAAO,CAAA,KAAA,KAAS;AACpF,QAAA,IAAI,KAAA,CAAK,aAAA,IAAiB,KAAA,CAAM,IAAA,EAAM;AACpC,UAAA,KAAA,CAAK,aAAA,CAAc,YAAA,CAAa,KAAA,CAAM,IAAA,CAAK,OAAO,UAAU,CAAA;AAAA,QAC9D;AAAA,MACF,CAAC,CAAA;AACD,MAAA,KAAA,CAAK,gBAAA,CAAiB,KAAK,oBAAoB,CAAA;AAG/C,MAAA,MAAM,sBAAsB,gBAAA,CAAiB,EAAA,CAAGA,aAAAA,CAAY,OAAA,CAAQ,OAAO,CAAA,KAAA,KAAS;AAClF,QAAA,IAAI,KAAA,CAAK,aAAA,IAAiB,KAAA,CAAM,IAAA,EAAM;AACpC,UAAA,KAAA,CAAK,aAAA,CAAc,YAAA,CAAa,KAAA,CAAM,IAAA,CAAK,OAAO,SAAS,CAAA;AAAA,QAC7D;AAAA,MACF,CAAC,CAAA;AACD,MAAA,KAAA,CAAK,gBAAA,CAAiB,KAAK,mBAAmB,CAAA;AAG9C,MAAA,MAAM,2BAA2B,gBAAA,CAAiB,EAAA;AAAA,QAChDA,cAAY,YAAA,CAAa,KAAA;AAAA,QACzB,CAAA,KAAA,KAAS;AACP,UAAA,IAAI,KAAA,CAAK,aAAA,IAAiB,KAAA,CAAM,IAAA,EAAM;AACpC,YAAA,KAAA,CAAK,aAAA,CAAc,YAAA,CAAa,KAAA,CAAM,IAAA,CAAK,OAAO,cAAc,CAAA;AAAA,UAClE;AAAA,QACF;AAAA,OACF;AACA,MAAA,KAAA,CAAK,gBAAA,CAAiB,KAAK,wBAAwB,CAAA;AAEnD,MAAA,KAAA,CAAK,GAAA,CAAI,wEAAwE,OAAO,CAAA;AAAA,IAC1F;AAEA,IAAA,MAAM,aAAa,CAAC,QAAA,EAAU,QAAA,EAAU,KAAA,EAAO,cAAc,MAAM,CAAA;AACnE,IAAA,IAAI,KAAA,CAAK,mBAAA,CAAoB,SAAS,CAAA,EAAG;AACvC,MAAA,UAAA,CAAW,IAAA,CAAK,UAAA,EAAY,SAAA,EAAW,cAAc,CAAA;AAAA,IACvD;AACA,IAAA,KAAA,CAAK,IAAI,CAAA,4BAAA,EAA+B,UAAA,CAAW,KAAK,IAAI,CAAC,IAAI,OAAO,CAAA;AAAA,EAC1E;AAAA;AAAA,EAGA,OAAe,qBAAA,CACb,KAAA,EACA,MAAA,EACA,OAAA,EACkC;AAClC,IAAA,IAAI,SAAS,KAAA,CAAK,MAAA,CAAO,MAAM,+BAAA,EAAiC,EAAE,OAAO,CAAA;AAGzE,IAAA,MAAM,YAAA,GACJ,KAAA,YAAiB,SAAA,GACZ,KAAA,GACD,IAAIN,gBAAAA;AAAA,MACF,KAAA,YAAiB,KAAA,GAAQ,KAAA,CAAM,OAAA,GAAU,OAAO,KAAK,CAAA;AAAA,MACrDC,WAAAA,CAAY,gCAAA;AAAA,MACZ,EAAE,KAAA,EAAO,KAAA,YAAiB,KAAA,GAAQ,QAAQ,MAAA;AAAU,KACtD;AACN,IAAA,MAAA,EAAQ,UAAU,YAAY,CAAA;AAC9B,IAAA,OAAO,EAAC;AAAA,EACV;AAAA;AAAA,EAGA,OAAe,kBAAA,CACb,MAAA,EACA,OAAA,EACiD;AAEjD,IAAA,OAAO,YAAY;AACjB,MAAA,IAAI;AACF,QAAA,MAAM,MAAA,GAAS,iBAAiB,SAAA,EAAU;AAC1C,QAAA,MAAM,QAAA,GAAW,QAAQ,WAAA,IAAe,gBAAA;AACxC,QAAA,MAAM,QAAA,GAAW,MAAM,MAAA,CAAO,GAAA,CAAiD,QAAQ,CAAA;AAEvF,QAAA,IAAI,CAAC,SAAS,SAAA,EAAW;AACvB,UAAA,MAAM,IAAID,gBAAAA;AAAA,YACR,QAAA,CAAS,OAAO,OAAA,IAAW,+BAAA;AAAA,YAC3BC,WAAAA,CAAY;AAAA,WACd;AAAA,QACF;AAEA,QAAA,OAAO,QAAA,CAAS,IAAA,EAAM,KAAA,IAAS,EAAC;AAAA,MAClC,SAAS,KAAA,EAAO;AACd,QAAA,OAAO,KAAA,CAAK,qBAAA,CAAsB,KAAA,EAAO,MAAA,EAAQ,OAAO,CAAA;AAAA,MAC1D;AAAA,IACF,CAAA;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAMA,aAAqB,sBAAA,CACnB,MAAA,EACA,OAAA,EACe;AACf,IAAA,IAAI,MAAA,EAAQ,YAAY,KAAA,EAAO;AAC7B,MAAA,KAAA,CAAK,GAAA,CAAI,2CAA2C,OAAO,CAAA;AAC3D,MAAA;AAAA,IACF;AAEA,IAAA,IAAI,CAAC,MAAK,UAAA,EAAY;AACpB,MAAA,MAAM,IAAID,gBAAAA;AAAA,QACR,uEAAA;AAAA,QACAC,WAAAA,CAAY;AAAA,OACd;AAAA,IACF;AAEA,IAAA,KAAA,CAAK,WAAA,GAAc,UAAU,EAAC;AAC9B,IAAA,KAAA,CAAK,GAAA,CAAI,iDAAiD,OAAO,CAAA;AAGjE,IAAA,MAAM,KAAA,GAAQ,KAAA,CAAK,UAAA,CAAW,QAAA,EAAS;AACvC,IAAA,MAAM,KAAA,CAAM,aAAa,UAAA,CAAW;AAAA,MAClC,QAAA,EAAU,MAAK,WAAA,CAAY,QAAA;AAAA,MAC3B,OAAA,EAAS,MAAK,WAAA,CAAY,OAAA;AAAA,MAC1B,OAAA,EAAS,KAAA,CAAK,kBAAA,CAAmB,KAAA,CAAK,aAAa,OAAO,CAAA;AAAA,MAC1D,YAAA,EAAc,MAAK,WAAA,CAAY,YAAA;AAAA,MAC/B,OAAA,EAAS,MAAK,WAAA,CAAY;AAAA,KAC3B,CAAA;AAED,IAAA,KAAA,CAAK,GAAA,CAAI,6BAA6B,OAAO,CAAA;AAAA,EAC/C;AACF;ACpsDO,IAAe,oBAAf,MAOL;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EA4DA,YAAY,MAAA,EAA6D;AA1CzE;AAAA,IAAA,IAAA,CAAU,YAAA,GAAwB,KAAA;AAGlC;AAAA,IAAA,IAAA,CAAQ,UAAA,GAA+B,IAAA;AACvC,IAAA,IAAA,CAAQ,kBAAA,GAA2C,IAAA;AAoBnD;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,IAAA,IAAA,CAAU,WAAA,GAAsB,EAAA;AAGhC;AAAA,IAAA,IAAA,CAAQ,eAAA,GAAkC,IAAA;AAC1C,IAAA,IAAA,CAAQ,kBAAA,GAAwC,IAAA;AAe9C,IAAA,IAAA,CAAK,cAAc,MAAA,CAAO,WAAA;AAC1B,IAAA,IAAA,CAAK,oBAAoB,MAAA,CAAO,iBAAA;AAChC,IAAA,IAAA,CAAK,SAAS,MAAA,CAAO,aAAA;AACrB,IAAA,IAAA,CAAK,mBAAA,GAAsB,OAAO,kBAAA,IAAsB,KAAA;AAGxD,IAAA,IAAA,CAAK,MAAA,GAAS,IAAIC,aAAAA,CAAc;AAAA,MAC9B,WAAA,EAAa,MAAA;AAAA,MACb,SAAS,IAAA,CAAK;AAAA,KACf,CAAA;AAGD,IAAA,IAAA,CAAK,mBAAmB,MAAA,CAAO,eAAA;AAI/B,IAAA,IAAA,CAAK,YAAA,GAAe,OAAO,QAAA,EAAU,KAAA;AACrC,IAAA,IAAA,CAAK,SAAA,GAAY,OAAO,QAAA,EAAU,EAAA;AAClC,IAAA,IAAA,CAAK,UAAA,GAAa,OAAO,QAAA,EAAU,GAAA;AAEnC,IAAA,IAAA,CAAK,oBAAA,GAAwB,MAAA,CAAO,aAAA,CAAc,qBAAA,IAChD,OAAO,QAAA,EAAU,aAAA;AAInB,IAAA,IAAI,CAAC,KAAK,WAAA,EAAa;AACrB,MAAA,IAAA,CAAK,WAAA,GAAc,IAAA,CAAK,WAAA,CAAY,WAAA,EAAY;AAAA,IAClD;AAGA,IAAA,IAAA,CAAK,eAAe,MAAA,CAAO,WAAA;AAC3B,IAAA,IAAA,CAAK,kBAAkB,MAAA,CAAO,cAAA;AAG9B,IAAA,IAAI,KAAK,gBAAA,EAAkB;AACzB,MAAA,IAAA,CAAK,mBAAA,EAAoB;AAAA,IAC3B;AAEA,IAAA,IAAA,CAAK,MAAA,CAAO,KAAA,CAAM,CAAA,EAAG,IAAA,CAAK,WAAW,CAAA,QAAA,CAAA,EAAY;AAAA,MAC/C,mBAAmB,IAAA,CAAK,iBAAA;AAAA,MACxB,YAAA,EAAc,CAAC,CAAC,IAAA,CAAK,gBAAA;AAAA,MACrB,QAAA,EAAU;AAAA,QACR,KAAA,EAAO,CAAC,CAAC,IAAA,CAAK,YAAA;AAAA,QACd,EAAA,EAAI,CAAC,CAAC,IAAA,CAAK,SAAA;AAAA,QACX,GAAA,EAAK,CAAC,CAAC,IAAA,CAAK,UAAA;AAAA,QACZ,aAAA,EAAe,CAAC,CAAC,IAAA,CAAK;AAAA,OACxB;AAAA,MACA,aAAa,IAAA,CAAK,WAAA;AAAA,MAClB,SAAA,EAAW,CAAC,CAAC,IAAA,CAAK,YAAA;AAAA,MAClB,YAAA,EAAc,CAAC,CAAC,IAAA,CAAK;AAAA,KACtB,CAAA;AAAA,EACH;AAAA,EApPF;AAoIE,IAAA,MAAA,CAAA,IAAA,EAAA,mBAAA,CAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EA0HA,IAAI,gBAAA,GAA4B;AAC9B,IAAA,OAAO,IAAA,CAAK,QAAQ,OAAA,KAAY,KAAA;AAAA,EAClC;AAAA;AAAA;AAAA;AAAA,EAKA,IAAI,aAAA,GAAyB;AAC3B,IAAA,OAAO,IAAA,CAAK,YAAA;AAAA,EACd;AAAA;AAAA;AAAA;AAAA,EAKA,IAAI,SAAA,GAAqB;AACvB,IAAA,OAAO,CAAC,CAAC,IAAA,CAAK,YAAA;AAAA,EAChB;AAAA;AAAA;AAAA;AAAA,EAKA,IAAI,YAAA,GAAwB;AAC1B,IAAA,OAAO,CAAC,CAAC,IAAA,CAAK,eAAA;AAAA,EAChB;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,IAAI,MAAA,GAAkB;AACpB,IAAA,IAAI,CAAC,IAAA,CAAK,eAAA,IAAmB,IAAA,CAAK,YAAA,EAAc;AAC9C,MAAA,IAAA,CAAK,eAAA,GAAkB,IAAI,IAAA,CAAK,YAAA,EAAa;AAAA,IAC/C;AACA,IAAA,IAAI,CAAC,KAAK,eAAA,EAAiB;AACzB,MAAA,MAAM,IAAIF,gBAAAA;AAAA,QACR,CAAA,EAAG,KAAK,WAAW,CAAA,kCAAA,CAAA;AAAA,QACnBC,aAAAA,CAAY;AAAA,OACd;AAAA,IACF;AACA,IAAA,OAAO,IAAA,CAAK,eAAA;AAAA,EACd;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,IAAI,OAAO,KAAA,EAAgB;AACzB,IAAA,IAAA,CAAK,eAAA,GAAkB,KAAA;AAAA,EACzB;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,IAAI,SAAA,GAAwB;AAC1B,IAAA,IAAI,CAAC,IAAA,CAAK,kBAAA,IAAsB,IAAA,CAAK,eAAA,EAAiB;AACpD,MAAA,IAAA,CAAK,kBAAA,GAAqB,IAAI,IAAA,CAAK,eAAA,EAAgB;AAAA,IACrD;AACA,IAAA,IAAI,CAAC,KAAK,kBAAA,EAAoB;AAC5B,MAAA,MAAM,IAAID,gBAAAA;AAAA,QACR,CAAA,EAAG,KAAK,WAAW,CAAA,qCAAA,CAAA;AAAA,QACnBC,aAAAA,CAAY;AAAA,OACd;AAAA,IACF;AACA,IAAA,OAAO,IAAA,CAAK,kBAAA;AAAA,EACd;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,IAAI,UAAU,KAAA,EAAmB;AAC/B,IAAA,IAAA,CAAK,kBAAA,GAAqB,KAAA;AAAA,EAC5B;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,IAAI,SAAA,GAAuB;AACzB,IAAA,IAAI,CAAC,KAAK,UAAA,EAAY;AACpB,MAAA,MAAM,IAAID,gBAAAA;AAAA,QACR,CAAA,EAAG,KAAK,WAAW,CAAA,qEAAA,CAAA;AAAA,QACnBC,aAAAA,CAAY;AAAA,OACd;AAAA,IACF;AACA,IAAA,OAAO,IAAA,CAAK,UAAA;AAAA,EACd;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,IAAI,aAAA,GAAkD;AACpD,IAAA,OAAO,IAAA,CAAK,oBAAA;AAAA,EACd;AAAA;AAAA;AAAA;AAAA,EAKA,IAAI,gBAAA,GAA4B;AAC9B,IAAA,OAAO,CAAC,CAAC,IAAA,CAAK,oBAAA;AAAA,EAChB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAUQ,mBAAA,GAA4B;AAClC,IAAA,IAAI,IAAA,CAAK,kBAAA,IAAsB,CAAC,IAAA,CAAK,gBAAA,EAAkB;AACrD,MAAA;AAAA,IACF;AAEA,IAAA,IAAA,CAAK,sBAAsB,YAAY;AACrC,MAAA,IAAI;AACF,QAAA,IAAA,CAAK,UAAA,GAAa,MAAMM,eAAAA,CAAgB,IAAA,CAAK,gBAAiB,CAAA;AAG9D,QAAA,IAAI,KAAK,mBAAA,EAAqB;AAC5B,UAAAC,mBAAAA,CAAoB,KAAK,UAAU,CAAA;AAAA,QACrC;AAEA,QAAA,IAAA,CAAK,YAAA,GAAe,IAAA;AAEpB,QAAA,IAAA,CAAK,MAAA,CAAO,MAAM,wBAAA,EAA0B;AAAA,UAC1C,SAAS,IAAA,CAAK,WAAA;AAAA,UACd,OAAA,EAAS,KAAK,gBAAA,CAAkB;AAAA,SACjC,CAAA;AAAA,MACH,SAAS,KAAA,EAAO;AACd,QAAA,IAAA,CAAK,MAAA,CAAO,MAAM,iCAAA,EAAmC;AAAA,UACnD,SAAS,IAAA,CAAK,WAAA;AAAA,UACd,OAAO,KAAA,YAAiB,KAAA,GAAQ,KAAA,CAAM,OAAA,GAAU,OAAO,KAAK;AAAA,SAC7D,CAAA;AACD,QAAA,MAAM,KAAA;AAAA,MACR;AAAA,IACF,CAAA,GAAG;AAAA,EACL;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOA,MAAM,0BAAA,GAA4C;AAChD,IAAA,IAAI,KAAK,kBAAA,EAAoB;AAC3B,MAAA,MAAM,IAAA,CAAK,kBAAA;AAAA,IACb;AACA,IAAA,IAAI,IAAA,CAAK,gBAAA,IAAoB,CAAC,IAAA,CAAK,UAAA,EAAY;AAC7C,MAAA,MAAM,IAAIR,gBAAAA;AAAA,QACR,CAAA,EAAG,KAAK,WAAW,CAAA,2BAAA,CAAA;AAAA,QACnBC,aAAAA,CAAY;AAAA,OACd;AAAA,IACF;AAAA,EACF;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EASA,SAAA,GAA+B;AAC7B,IAAA,OAAO,EAAE,GAAG,IAAA,CAAK,MAAA,EAAO;AAAA,EAC1B;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,WAAiC,GAAA,EAA4B;AAC3D,IAAA,OAAO,IAAA,CAAK,MAAA,EAAQ,QAAA,GAAW,GAAG,CAAA;AAAA,EACpC;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOA,UAAA,CAAW,KAAa,KAAA,EAA+B;AACrD,IAAA,IAAI,CAAC,IAAA,CAAK,MAAA,CAAO,QAAA,EAAU;AACzB,MAAC,IAAA,CAAK,MAAA,CAAuC,QAAA,GAAW,EAAC;AAAA,IAC3D;AACA,IAAA,IAAA,CAAK,MAAA,CAAO,QAAA,CAAU,GAAG,CAAA,GAAI,KAAA;AAAA,EAC/B;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,YAAY,QAAA,EAAkD;AAC5D,IAAA,IAAI,CAAC,IAAA,CAAK,MAAA,CAAO,QAAA,EAAU;AACzB,MAAC,IAAA,CAAK,MAAA,CAAuC,QAAA,GAAW,EAAC;AAAA,IAC3D;AACA,IAAA,MAAA,CAAO,MAAA,CAAO,IAAA,CAAK,MAAA,CAAO,QAAA,EAAW,QAAQ,CAAA;AAAA,EAC/C;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAUU,eAAA,GAAwB;AAChC,IAAA,IAAI,CAAC,IAAA,CAAK,WAAA,EAAY,EAAG;AACvB,MAAA,MAAM,IAAID,gBAAAA;AAAA,QACR,CAAA,EAAG,KAAK,WAAW,CAAA,uCAAA,CAAA;AAAA,QACnBC,aAAAA,CAAY;AAAA,OACd;AAAA,IACF;AAAA,EACF;AAAA;AAAA;AAAA;AAAA;AAAA,EAMU,aAAA,GAAsB;AAC9B,IAAA,IAAI,CAAC,KAAK,gBAAA,EAAkB;AAC1B,MAAA,MAAM,IAAID,gBAAAA;AAAA,QACR,CAAA,EAAG,KAAK,WAAW,CAAA,iDAAA,CAAA;AAAA,QACnBC,aAAAA,CAAY;AAAA,OACd;AAAA,IACF;AAAA,EACF;AAAA;AAAA;AAAA;AAAA;AAAA,EAMU,WAAA,GAAoB;AAC5B,IAAA,IAAA,CAAK,aAAA,EAAc;AACnB,IAAA,IAAA,CAAK,eAAA,EAAgB;AAAA,EACvB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EA2BU,QAAA,CAAS,SAAiB,IAAA,EAAsC;AACxE,IAAA,IAAA,CAAK,MAAA,CAAO,MAAM,OAAA,EAAS;AAAA,MACzB,SAAS,IAAA,CAAK,WAAA;AAAA,MACd,GAAG;AAAA,KACJ,CAAA;AAAA,EACH;AAAA;AAAA;AAAA;AAAA,EAKU,OAAA,CAAQ,SAAiB,IAAA,EAAsC;AACvE,IAAA,IAAA,CAAK,MAAA,CAAO,KAAK,OAAA,EAAS;AAAA,MACxB,SAAS,IAAA,CAAK,WAAA;AAAA,MACd,GAAG;AAAA,KACJ,CAAA;AAAA,EACH;AAAA;AAAA;AAAA;AAAA,EAKU,OAAA,CAAQ,SAAiB,IAAA,EAAsC;AACvE,IAAA,IAAA,CAAK,MAAA,CAAO,KAAK,OAAA,EAAS;AAAA,MACxB,SAAS,IAAA,CAAK,WAAA;AAAA,MACd,GAAG;AAAA,KACJ,CAAA;AAAA,EACH;AAAA;AAAA;AAAA;AAAA,EAKU,QAAA,CAAS,SAAiB,IAAA,EAAsC;AACxE,IAAA,IAAA,CAAK,MAAA,CAAO,MAAM,OAAA,EAAS;AAAA,MACzB,SAAS,IAAA,CAAK,WAAA;AAAA,MACd,GAAG;AAAA,KACJ,CAAA;AAAA,EACH;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EASA,MAAgB,YAAA,CACd,IAAA,EACA,KAAA,EACA,IAAA,EACe;AACf,IAAA,IAAI,CAAC,KAAK,oBAAA,EAAsB;AAChC,IAAA,MAAM,IAAA,CAAK,oBAAA,CAAqB,eAAA,CAAgB,IAAA,EAAM,KAAA,EAAO;AAAA,MAC3D,SAAS,IAAA,CAAK,WAAA;AAAA,MACd,GAAG;AAAA,KACJ,CAAA;AAAA,EACH;AAAA;AAAA;AAAA;AAAA,EAKA,MAAgB,gBAAA,CACd,IAAA,EACA,KAAA,GAAQ,GACR,IAAA,EACe;AACf,IAAA,IAAI,CAAC,KAAK,oBAAA,EAAsB;AAChC,IAAA,MAAM,IAAA,CAAK,oBAAA,CAAqB,gBAAA,CAAiB,IAAA,EAAM,KAAA,EAAO;AAAA,MAC5D,SAAS,IAAA,CAAK,WAAA;AAAA,MACd,GAAG;AAAA,KACJ,CAAA;AAAA,EACH;AAAA;AAAA;AAAA;AAAA,EAKU,SAAA,CAAU,MAAc,UAAA,EAA8D;AAC9F,IAAA,IAAI,CAAC,KAAK,oBAAA,EAAsB;AAE9B,MAAA,OAAO;AAAA,QACL,OAAA,EAAS,EAAE,OAAA,EAAS,EAAA,EAAI,QAAQ,EAAA,EAAG;AAAA,QACnC,8BAAc,MAAA,CAAA,MAAM;AAAA,QAAC,CAAA,EAAP,cAAA,CAAA;AAAA,QACd,+BAAe,MAAA,CAAA,MAAM;AAAA,QAAC,CAAA,EAAP,eAAA,CAAA;AAAA,QACf,0BAAU,MAAA,CAAA,MAAM;AAAA,QAAC,CAAA,EAAP,UAAA,CAAA;AAAA,QACV,2BAAW,MAAA,CAAA,MAAM;AAAA,QAAC,CAAA,EAAP,WAAA,CAAA;AAAA,QACX,qBAAK,MAAA,CAAA,MAAM;AAAA,QAAC,CAAA,EAAP,KAAA,CAAA;AAAA,QACL,iCAAiB,MAAA,CAAA,MAAM;AAAA,QAAC,CAAA,EAAP,iBAAA;AAAA,OACnB;AAAA,IACF;AACA,IAAA,OAAO,IAAA,CAAK,qBAAqB,SAAA,CAAU;AAAA,MACzC,IAAA;AAAA,MACA,UAAA,EAAY;AAAA,QACV,gBAAgB,IAAA,CAAK,WAAA;AAAA,QACrB,GAAG;AAAA;AACL,KACD,CAAA;AAAA,EACH;AAAA;AAAA;AAAA;AAAA,EAKA,MAAgB,QAAA,CACd,IAAA,EACA,EAAA,EACA,UAAA,EACY;AACZ,IAAA,IAAI,CAAC,KAAK,oBAAA,EAAsB;AAE9B,MAAA,MAAM,QAAA,GAAW,IAAA,CAAK,SAAA,CAAU,IAAI,CAAA;AACpC,MAAA,OAAO,GAAG,QAAQ,CAAA;AAAA,IACpB;AACA,IAAA,OAAO,KAAK,oBAAA,CAAqB,QAAA;AAAA,MAC/B;AAAA,QACE,IAAA;AAAA,QACA,UAAA,EAAY;AAAA,UACV,gBAAgB,IAAA,CAAK,WAAA;AAAA,UACrB,GAAG;AAAA;AACL,OACF;AAAA,MACA;AAAA,KACF;AAAA,EACF;AACF;AC5dO,IAAe,yBAAA,GAAf,cA6BG,iBAAA,CAAgD;AAAA;AAAA;AAAA;AAAA;AAAA,EA6DxD,YACE,MAAA,EACA;AACA,IAAA,KAAA,CAAM,MAAM,CAAA;AA9Cd;AAAA;AAAA;AAAA;AAAA,IAAA,IAAA,CAAQ,aAAA,GAA+B,IAAA;AASvC;AAAA,IAAA,IAAA,CAAiB,WAAA,uBAAkB,GAAA,EAAqB;AAOxD;AAAA;AAAA;AAAA;AAAA;AAAA,IAAA,IAAA,CAAU,aAAA,GAA0B,CAACQ,UAAAA,CAAW,KAAA,EAAOA,WAAW,aAAa,CAAA;AAa/E;AAAA,IAAA,IAAA,CAAiB,iBAIZ,EAAC;AAGN;AAAA,IAAA,IAAA,CAAiB,qBAAA,GAAwB,EAAA;AAYvC,IAAA,IAAA,CAAK,aAAA,GAAgB,OAAO,aAAA,CAAc,aAAA;AAC1C,IAAA,IAAA,CAAK,gBAAA,GAAmB,OAAO,aAAA,CAAc,iBAAA;AAG7C,IAAA,IAAI,OAAO,WAAA,EAAa;AACtB,MAAA,IAAA,CAAK,MAAA,GAAS,IAAI,MAAA,CAAO,WAAA,EAAY;AAAA,IACvC;AAEA,IAAA,MAAM,gBAAgB,MAAA,CAAO,aAAA;AAI7B,IAAA,IAAI,aAAA,CAAc,UAAU,MAAA,EAAW;AACrC,MAAA,IAAA,CAAK,kBAAkB,aAAA,CAAc,KAAA;AAAA,IACvC;AACA,IAAA,IAAI,aAAA,CAAc,eAAe,MAAA,EAAW;AAG1C,MAAA,IAAA,CAAK,gBAAgB,KAAA,CAAM,IAAA;AAAA,4BACrB,GAAA,CAAI;AAAA,UACN,GAAG,IAAA,CAAK,aAAA;AAAA;AAAA,UACR,GAAG,aAAA,CAAc;AAAA;AAAA,SAClB;AAAA,OACH;AAAA,IACF;AAGA,IAAA,MAAM,cAAA,GAAiB,OAAO,QAAA,EAAU,MAAA;AAGxC,IAAA,IAAI,KAAK,eAAA,EAAiB;AACxB,MAAA,MAAM,YAAA,GAAe,cAAA,GAAiB,IAAA,CAAK,eAAe,CAAA;AAC1D,MAAA,IAAI,YAAA,EAAc;AAChB,QAAA,IAAA,CAAK,aAAA,GAAgB,YAAA;AACrB,QAAA,IAAA,CAAK,QAAA,CAAS,CAAA,0BAAA,EAA6B,IAAA,CAAK,eAAe,CAAA,CAAA,CAAG,CAAA;AAAA,MACpE,CAAA,MAAO;AAGL,QAAA,IAAA,CAAK,OAAA;AAAA,UACH,CAAA,eAAA,EAAkB,KAAK,eAAe,CAAA,6IAAA;AAAA,SAGxC;AAAA,MACF;AAAA,IACF;AAGA,IAAA,KAAA,MAAW,GAAA,IAAO,KAAK,aAAA,EAAe;AACpC,MAAA,MAAM,SAAA,GAAY,iBAAiB,GAAG,CAAA;AACtC,MAAA,IAAI,SAAA,EAAW;AACb,QAAA,IAAA,CAAK,WAAA,CAAY,GAAA,CAAI,GAAA,EAAK,SAAS,CAAA;AACnC,QAAA,IAAA,CAAK,QAAA,CAAS,CAAA,4BAAA,EAA+B,GAAG,CAAA,CAAA,CAAG,CAAA;AAAA,MACrD,CAAA,MAAO;AACL,QAAA,IAAA,CAAK,QAAA,CAAS,CAAA,iBAAA,EAAoB,GAAG,CAAA,8BAAA,CAAgC,CAAA;AAAA,MACvE;AAAA,IACF;AAGA,IAAA,IAAI,CAAC,KAAK,eAAA,EAAiB;AACzB,MAAA,IAAA,CAAK,OAAA;AAAA,QACH,CAAA,6GAAA;AAAA,OAEF;AAAA,IACF;AAEA,IAAA,IAAA,CAAK,SAAS,8BAAA,EAAgC;AAAA,MAC5C,cAAc,IAAA,CAAK,eAAA;AAAA,MACnB,YAAY,IAAA,CAAK;AAAA,KAClB,CAAA;AAAA,EACH;AAAA,EAvUF;AAgM0D,IAAA,MAAA,CAAA,IAAA,EAAA,2BAAA,CAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAgJxD,IAAI,mBAAA,GAA8B;AAChC,IAAA,OAAA,CAAQ,IAAA,CAAK,aAAA,GAAgB,CAAA,GAAI,CAAA,IAAK,KAAK,WAAA,CAAY,IAAA;AAAA,EACzD;AAAA;AAAA;AAAA;AAAA,EAKA,IAAI,kBAAA,GAA8B;AAChC,IAAA,OAAO,CAAC,CAAC,IAAA,CAAK,aAAA,IAAiB,IAAA,CAAK,YAAY,IAAA,GAAO,CAAA;AAAA,EACzD;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,IAAc,YAAA,GAA8B;AAC1C,IAAA,OAAO,IAAA,CAAK,aAAA;AAAA,EACd;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EASU,aAA6C,GAAA,EAAuC;AAC5F,IAAA,OAAO,IAAA,CAAK,WAAA,CAAY,GAAA,CAAI,GAAG,CAAA;AAAA,EACjC;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,EAoCU,SAAyC,GAAA,EAAuC;AAExF,IAAA,OAAO,IAAA,CAAK,eAAe,GAAG,CAAA;AAAA,EAChC;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAeU,YAAA,CAAa,IAAA,EAAa,OAAA,GAAU,KAAA,EAAa;AACzD,IAAA,IAAI,CAAC,KAAK,aAAA,EAAe;AACvB,MAAA,IAAA,CAAK,SAAS,6BAA6B,CAAA;AAC3C,MAAA;AAAA,IACF;AAGA,IAAA,IAAI,IAAA,CAAK,eAAe,QAAA,EAAU;AAChC,MAAA,IAAA,CAAK,SAAS,gDAAgD,CAAA;AAC9D,MAAA;AAAA,IACF;AAEA,IAAA,IAAI;AAEF,MAAA,IAAI,OAAA,IAAW,IAAA,CAAK,aAAA,EAAe,OAAA,EAAS;AAC1C,QAAA,IAAA,CAAK,aAAA,CAAc,OAAA,CAAQ,IAAA,CAAK,aAAA,EAAe,IAAI,CAAA;AAAA,MACrD,CAAA,MAAA,IAAW,CAAC,OAAA,IAAW,IAAA,CAAK,eAAe,UAAA,EAAY;AACrD,QAAA,IAAA,CAAK,aAAA,CAAc,UAAA,CAAW,IAAA,CAAK,aAAA,EAAe,IAAsB,CAAA;AAAA,MAC1E,CAAA,MAAA,IAES,OAAA,IAAW,IAAA,CAAK,aAAA,CAAc,OAAA,EAAS;AAC9C,QAAA,IAAA,CAAK,aAAA,CAAc,QAAQ,IAAI,CAAA;AAAA,MACjC,CAAA,MAAA,IAAW,CAAC,OAAA,IAAW,IAAA,CAAK,cAAc,UAAA,EAAY;AACpD,QAAA,IAAA,CAAK,aAAA,CAAc,WAAW,IAAsB,CAAA;AAAA,MACtD,CAAA,MAAA,IAAW,IAAA,CAAK,aAAA,CAAc,OAAA,EAAS;AAErC,QAAA,IAAA,CAAK,aAAA,CAAc,QAAQ,IAAI,CAAA;AAAA,MACjC;AAEA,MAAA,IAAA,CAAK,SAAS,yBAAA,EAA2B;AAAA,QACvC,cAAc,IAAA,CAAK,eAAA;AAAA,QACnB;AAAA,OACD,CAAA;AAAA,IACH,SAAS,KAAA,EAAO;AACd,MAAA,IAAA,CAAK,QAAA,CAAS,iCAAA,EAAmC,EAAE,KAAA,EAAO,CAAA;AAAA,IAC5D;AAAA,EACF;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAUU,iBAAiB,SAAA,EAA0B;AACnD,IAAA,IAAI,CAAC,KAAK,aAAA,EAAe;AAGzB,IAAA,IAAI,IAAA,CAAK,eAAe,QAAA,EAAU;AAChC,MAAA;AAAA,IACF;AAGA,IAAA,IAAI,IAAA,CAAK,eAAe,UAAA,EAAY;AAClC,MAAA,IAAA,CAAK,aAAA,CAAc,UAAA,CAAW,IAAA,CAAK,aAAA,EAAe,SAAS,CAAA;AAAA,IAC7D,CAAA,MAAA,IAES,IAAA,CAAK,aAAA,CAAc,UAAA,EAAY;AACtC,MAAA,IAAA,CAAK,aAAA,CAAc,WAAW,SAAS,CAAA;AAAA,IACzC;AAAA,EACF;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EASU,iBAAiB,MAAA,EAA8B;AACvD,IAAA,MAAM,UAAA,GAAa,IAAA,CAAK,MAAA,CAAO,YAAA,CAAa,MAAM,CAAA;AAElD,IAAA,IAAI,IAAA,CAAK,aAAA,IAAiB,CAAC,IAAA,CAAK,eAAe,QAAA,EAAU;AACvD,MAAA,IAAI;AACF,QAAA,IAAI,IAAA,CAAK,eAAe,OAAA,EAAS;AAC/B,UAAA,IAAA,CAAK,aAAA,CAAc,OAAA,CAAQ,IAAA,CAAK,aAAA,EAAe,UAAU,CAAA;AAAA,QAC3D,CAAA,MAAA,IAAW,IAAA,CAAK,aAAA,CAAc,OAAA,EAAS;AACrC,UAAA,IAAA,CAAK,aAAA,CAAc,QAAQ,UAAU,CAAA;AAAA,QACvC,CAAA,MAAO;AACL,UAAA,IAAA,CAAK,SAAS,uDAAuD,CAAA;AAAA,QACvE;AAAA,MACF,SAAS,KAAA,EAAO;AACd,QAAA,IAAA,CAAK,QAAA,CAAS,+BAAA,EAAiC,EAAE,KAAA,EAAO,CAAA;AAAA,MAC1D;AAAA,IACF;AAEA,IAAA,OAAO,UAAA;AAAA,EACT;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAUU,mBAAA,CAAoB,IAAY,MAAA,EAA8B;AACtE,IAAA,MAAM,UAAA,GAAa,IAAA,CAAK,MAAA,CAAO,YAAA,CAAa,MAAM,CAAA;AAElD,IAAA,IAAI,IAAA,CAAK,aAAA,IAAiB,CAAC,IAAA,CAAK,eAAe,QAAA,EAAU;AACvD,MAAA,IAAI;AACF,QAAA,IAAI,IAAA,CAAK,eAAe,cAAA,EAAgB;AACtC,UAAA,IAAA,CAAK,aAAA,CAAc,cAAA,CAAe,IAAA,CAAK,aAAA,EAAe,IAAI,UAAU,CAAA;AAAA,QACtE,CAAA,MAAA,IAAW,IAAA,CAAK,aAAA,CAAc,cAAA,EAAgB;AAC5C,UAAA,IAAA,CAAK,aAAA,CAAc,cAAA,CAAe,EAAA,EAAI,UAAU,CAAA;AAAA,QAClD,CAAA,MAAO;AACL,UAAA,IAAA,CAAK,SAAS,8DAA8D,CAAA;AAAA,QAC9E;AAAA,MACF,SAAS,KAAA,EAAO;AACd,QAAA,IAAA,CAAK,QAAA,CAAS,kCAAA,EAAoC,EAAE,KAAA,EAAO,CAAA;AAAA,MAC7D;AAAA,IACF;AAEA,IAAA,OAAO,UAAA;AAAA,EACT;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EASU,oBAAoB,QAAA,EAAoC;AAChE,IAAA,MAAM,WAAA,GAAc,SAAS,GAAA,CAAI,CAAA,MAAA,KAAU,KAAK,MAAA,CAAO,YAAA,CAAa,MAAM,CAAC,CAAA;AAE3E,IAAA,IAAI,IAAA,CAAK,iBAAiB,CAAC,IAAA,CAAK,eAAe,QAAA,IAAY,IAAA,CAAK,OAAO,gBAAA,EAAkB;AAEvF,MAAA,MAAM,SAAA,GAAY,IAAA,CAAK,MAAA,CAAO,gBAAA,CAAiB,QAAQ,CAAA;AACvD,MAAA,IAAA,CAAK,YAAA,CAAa,WAAoB,IAAI,CAAA;AAAA,IAC5C;AAEA,IAAA,OAAO,WAAA;AAAA,EACT;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAQU,sBAAsB,EAAA,EAAkB;AAChD,IAAA,IAAI,CAAC,IAAA,CAAK,aAAA,IAAiB,IAAA,CAAK,eAAe,QAAA,EAAU;AAEzD,IAAA,IAAI;AAEF,MAAA,IAAI,IAAA,CAAK,eAAe,UAAA,EAAY;AAClC,QAAA,IAAA,CAAK,aAAA,CAAc,UAAA,CAAW,IAAA,CAAK,aAAA,EAAe,EAAE,CAAA;AAAA,MACtD,CAAA,MAAA,IAES,IAAA,CAAK,aAAA,CAAc,UAAA,EAAY;AACtC,QAAA,IAAA,CAAK,aAAA,CAAc,WAAW,EAAE,CAAA;AAAA,MAClC,CAAA,MAAO;AACL,QAAA,IAAA,CAAK,SAAS,0DAA0D,CAAA;AACxE,QAAA;AAAA,MACF;AAEA,MAAA,IAAA,CAAK,QAAA,CAAS,2BAAA,EAA6B,EAAE,QAAA,EAAU,IAAI,CAAA;AAAA,IAC7D,SAAS,KAAA,EAAO;AACd,MAAA,IAAA,CAAK,SAAS,oCAAA,EAAsC,EAAE,KAAA,EAAO,QAAA,EAAU,IAAI,CAAA;AAAA,IAC7E;AAAA,EACF;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EASU,oBAAoB,SAAA,EAAoD;AAChF,IAAA,IAAI,CAAC,IAAA,CAAK,gBAAA,EAAkB,OAAA,EAAS,OAAO,KAAA;AAC5C,IAAA,MAAM,MAAM,IAAA,CAAK,gBAAA,CAAiB,cAAc,CAAC,QAAA,EAAU,UAAU,QAAQ,CAAA;AAC7E,IAAA,OAAO,GAAA,CAAI,SAAS,SAAS,CAAA;AAAA,EAC/B;AAAA;AAAA;AAAA;AAAA;AAAA,EAMU,qBAAqB,SAAA,EAAyB;AACtD,IAAA,IAAI,CAAC,IAAA,CAAK,aAAA,EAAe,OAAA,EAAS;AAElC,IAAA,MAAM,aAAA,GAAgB,IAAA,CAAK,aAAA,CAAc,OAAA,EAAQ;AACjD,IAAA,IAAA,CAAK,eAAe,IAAA,CAAK;AAAA,MACvB,SAAA;AAAA,MACA,aAAA,EAAe,aAAA,GAAgB,EAAE,GAAG,eAAc,GAAI,IAAA;AAAA,MACtD,SAAA,EAAW,KAAK,GAAA;AAAI,KACrB,CAAA;AAGD,IAAA,IAAI,IAAA,CAAK,cAAA,CAAe,MAAA,GAAS,IAAA,CAAK,qBAAA,EAAuB;AAC3D,MAAA,IAAA,CAAK,eAAe,KAAA,EAAM;AAAA,IAC5B;AAEA,IAAA,IAAA,CAAK,QAAA,CAAS,4BAA4B,EAAE,SAAA,EAAW,WAAW,IAAA,CAAK,cAAA,CAAe,QAAQ,CAAA;AAAA,EAChG;AAAA;AAAA;AAAA;AAAA;AAAA,EAMU,aAAA,CAAc,WAAmB,KAAA,EAAoB;AAC7D,IAAA,MAAM,KAAA,GAAQ,IAAA,CAAK,cAAA,CAAe,GAAA,EAAI;AACtC,IAAA,IAAI,CAAC,KAAA,IAAS,CAAC,IAAA,CAAK,aAAA,EAAe;AACjC,MAAA,IAAA,CAAK,OAAA,CAAQ,sBAAA,EAAwB,EAAE,SAAA,EAAW,CAAA;AAClD,MAAA;AAAA,IACF;AAEA,IAAA,IAAI;AACF,MAAA,IAAI,KAAA,CAAM,aAAA,IAAiB,IAAA,CAAK,aAAA,CAAc,OAAA,EAAS;AACrD,QAAA,IAAA,CAAK,aAAA,CAAc,OAAA,CAAQ,KAAA,CAAM,aAAa,CAAA;AAC9C,QAAA,IAAA,CAAK,OAAA,CAAQ,+BAAA,EAAiC,EAAE,SAAA,EAAW,CAAA;AAAA,MAC7D;AAGA,MAAA,IAAI,IAAA,CAAK,kBAAkB,UAAA,EAAY;AACrC,QAAA,IAAA,CAAK,gBAAA,CAAiB,UAAA,CAAW,SAAA,EAAW,KAAA,EAAO,MAAM,aAAa,CAAA;AAAA,MACxE;AAGA,MAAA,IAAA,CAAK,UAAU,qBAAA,EAAuB;AAAA,QACpC,SAAA;AAAA,QACA,OAAO,KAAA,CAAM,OAAA;AAAA,QACb,eAAe,KAAA,CAAM;AAAA,OACK,CAAA;AAAA,IAC9B,SAAS,aAAA,EAAe;AACtB,MAAA,IAAA,CAAK,SAAS,0BAAA,EAA4B,EAAE,KAAA,EAAO,aAAA,EAAe,WAAW,CAAA;AAAA,IAC/E;AAAA,EACF;AAAA;AAAA;AAAA;AAAA;AAAA,EAMU,mBAAmB,SAAA,EAAyB;AAEpD,IAAA,MAAM,QAAQ,IAAA,CAAK,cAAA,CAAe,UAAU,CAAA,CAAA,KAAK,CAAA,CAAE,cAAc,SAAS,CAAA;AAC1E,IAAA,IAAI,SAAS,CAAA,EAAG;AACd,MAAA,IAAA,CAAK,cAAA,CAAe,MAAA,CAAO,KAAA,EAAO,CAAC,CAAA;AAAA,IACrC;AAAA,EACF;AAAA;AAAA;AAAA;AAAA;AAAA,EAMU,eAAA,CAAmB,YAAe,MAAA,EAAc;AACxD,IAAA,MAAM,UAAA,GAAa,IAAA,CAAK,gBAAA,EAAkB,kBAAA,IAAsB,aAAA;AAEhE,IAAA,QAAQ,UAAA;AAAY,MAClB,KAAK,aAAA;AACH,QAAA,OAAO,MAAA;AAAA,MACT,KAAK,aAAA;AACH,QAAA,OAAO,UAAA;AAAA,MACT,KAAK,OAAA;AAEH,QAAA,IAAI,OAAO,UAAA,KAAe,QAAA,IAAY,OAAO,WAAW,QAAA,EAAU;AAChE,UAAA,OAAO,EAAE,GAAG,UAAA,EAAY,GAAG,MAAA,EAAO;AAAA,QACpC;AACA,QAAA,OAAO,MAAA;AAAA,MACT,KAAK,QAAA;AACH,QAAA,IAAI,IAAA,CAAK,kBAAkB,UAAA,EAAY;AACrC,UAAA,OAAO,IAAA,CAAK,gBAAA,CAAiB,UAAA,CAAW,UAAA,EAAY,MAAM,CAAA;AAAA,QAC5D;AACA,QAAA,OAAO,MAAA;AAAA,MACT;AACE,QAAA,OAAO,MAAA;AAAA;AACX,EACF;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;AAAA;AAAA,EA4CA,MAAM,QAAA,CAAS,KAAA,EAA4B,OAAA,EAAuC;AAChF,IAAA,IAAA,CAAK,WAAA,EAAY;AACjB,IAAA,MAAM,SAAA,GAAY,KAAK,GAAA,EAAI;AAE3B,IAAA,IAAI,CAAC,IAAA,CAAK,MAAA,CAAO,QAAA,EAAU,QAAA,EAAU;AACnC,MAAA,MAAM,IAAIT,gBAAAA;AAAA,QACR,4EAAA;AAAA,QACAC,aAAAA,CAAY;AAAA,OACd;AAAA,IACF;AAEA,IAAA,IAAA,CAAK,iBAAiB,IAAI,CAAA;AAC1B,IAAA,IAAA,CAAK,SAAA,CAAU,UAAA,EAAY,EAAE,KAAA,EAAkC,CAAA;AAE/D,IAAA,IAAI;AAEF,MAAA,MAAM,IAAA,CAAK,iBAAiB,KAAK,CAAA;AAGjC,MAAA,MAAM,WAAW,MAAM,IAAA,CAAK,OAAO,QAAA,CAAS,QAAA,CAAS,OAAO,OAAO,CAAA;AAEnE,MAAA,IAAI,CAAC,SAAS,SAAA,EAAW;AACvB,QAAA,MAAM,IAAID,gBAAAA;AAAA,UACR,0BAAA;AAAA,UACAC,aAAAA,CAAY,wBAAA;AAAA,UACZ;AAAA,YACE,OAAA,EAAS,EAAE,SAAA,EAAW,UAAA,EAAY,KAAA,EAAM;AAAA,YACxC,KAAA,EAAO,SAAS,KAAA,IAAS,KAAA;AAAA;AAC3B,SACF;AAAA,MACF;AAGA,MAAA,MAAM,QAAA,GAAA,CAAY,QAAA,CAAS,IAAA,IAAQ,EAAC,EAAG,GAAA,CAAI,CAAA,GAAA,KAAO,IAAA,CAAK,MAAA,CAAO,QAAA,CAAS,GAAmB,CAAC,CAAA;AAG3F,MAAA,IAAA,CAAK,oBAAoB,QAAQ,CAAA;AAGjC,MAAA,MAAM,IAAA,CAAK,aAAA,GAAgB,QAAA,EAAU,KAAK,CAAA;AAG1C,MAAA,IAAA,CAAK,UAAU,SAAA,EAAW;AAAA,QACxB,OAAO,QAAA,CAAS,MAAA;AAAA,QAChB;AAAA,OAC0B,CAAA;AAG5B,MAAA,MAAM,KAAK,sBAAA,CAAuB,UAAA,EAAY,KAAK,GAAA,EAAI,GAAI,WAAW,IAAI,CAAA;AAE1E,MAAA,IAAA,CAAK,QAAQ,kBAAA,EAAoB,EAAE,OAAO,QAAA,CAAS,MAAA,EAAQ,OAAO,CAAA;AAClE,MAAA,OAAO,QAAA;AAAA,IACT,SAAS,KAAA,EAAO;AAEd,MAAA,MAAM,KAAK,sBAAA,CAAuB,UAAA,EAAY,KAAK,GAAA,EAAI,GAAI,WAAW,KAAK,CAAA;AAE3E,MAAA,MAAM,WAAW,IAAA,CAAK,SAAA,CAAU,OAAO,UAAA,EAAY,EAAE,OAAO,CAAA;AAG5D,MAAA,IAAA,CAAK,UAAU,aAAA,EAAe;AAAA,QAC5B,KAAA,EAAO,QAAA;AAAA,QACP,IAAA,EAAM,EAAE,KAAA;AAAM,OACkB,CAAA;AAClC,MAAA,MAAM,QAAA;AAAA,IACR,CAAA,SAAE;AACA,MAAA,IAAA,CAAK,iBAAiB,KAAK,CAAA;AAAA,IAC7B;AAAA,EACF;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAWA,MAAM,SAAA,CACJ,EAAA,EACA,OAAA,EACyB;AACzB,IAAA,IAAA,CAAK,WAAA,EAAY;AACjB,IAAA,MAAM,SAAA,GAAY,KAAK,GAAA,EAAI;AAE3B,IAAA,IAAI,CAAC,IAAA,CAAK,MAAA,CAAO,QAAA,EAAU,SAAA,EAAW;AACpC,MAAA,MAAM,IAAID,gBAAAA;AAAA,QACR,8EAAA;AAAA,QACAC,aAAAA,CAAY;AAAA,OACd;AAAA,IACF;AAEA,IAAA,IAAI;AAEF,MAAA,MAAM,IAAA,CAAK,kBAAkB,EAAE,CAAA;AAG/B,MAAA,MAAM,QAAA,GAAW,MAAM,IAAA,CAAK,MAAA,CAAO,SAAS,SAAA,CAAU,MAAA,CAAO,EAAE,CAAA,EAAG,OAAO,CAAA;AAEzE,MAAA,IAAI,CAAC,SAAS,SAAA,EAAW;AACvB,QAAA,IAAI,QAAA,CAAS,KAAA,EAAO,OAAA,EAAS,QAAA,CAAS,KAAK,CAAA,EAAG;AAC5C,UAAA,OAAO,IAAA;AAAA,QACT;AACA,QAAA,MAAM,IAAID,gBAAAA,CAAiB,wBAAA,EAA0BC,aAAAA,CAAY,wBAAA,EAA0B;AAAA,UACzF,SAAS,EAAE,SAAA,EAAW,aAAa,QAAA,EAAU,MAAA,CAAO,EAAE,CAAA,EAAE;AAAA,UACxD,KAAA,EAAO,SAAS,KAAA,IAAS,KAAA;AAAA,SAC1B,CAAA;AAAA,MACH;AAGA,MAAA,MAAM,MAAA,GAAS,SAAS,IAAA,GAAO,IAAA,CAAK,OAAO,QAAA,CAAS,QAAA,CAAS,IAAoB,CAAA,GAAI,IAAA;AAGrF,MAAA,IAAI,MAAA,EAAQ;AACV,QAAA,MAAM,IAAA,CAAK,iBAAiB,MAAM,CAAA;AAAA,MACpC;AAGA,MAAA,MAAM,KAAK,sBAAA,CAAuB,WAAA,EAAa,KAAK,GAAA,EAAI,GAAI,WAAW,IAAI,CAAA;AAE3E,MAAA,OAAO,MAAA;AAAA,IACT,SAAS,KAAA,EAAO;AAEd,MAAA,MAAM,KAAK,sBAAA,CAAuB,WAAA,EAAa,KAAK,GAAA,EAAI,GAAI,WAAW,KAAK,CAAA;AAE5E,MAAA,MAAM,QAAA,GAAW,IAAA,CAAK,SAAA,CAAU,KAAA,EAAO,WAAA,EAAa,EAAE,QAAA,EAAU,MAAA,CAAO,EAAE,CAAA,EAAG,CAAA;AAC5E,MAAA,MAAM,QAAA;AAAA,IACR;AAAA,EACF;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,EA0BA,MAAM,MAAA,CACJ,IAAA,EACA,OAAA,EACkB;AAClB,IAAA,IAAA,CAAK,WAAA,EAAY;AACjB,IAAA,MAAM,SAAA,GAAY,KAAK,GAAA,EAAI;AAE3B,IAAA,IAAI,CAAC,IAAA,CAAK,MAAA,CAAO,QAAA,EAAU,MAAA,EAAQ;AACjC,MAAA,MAAM,IAAID,gBAAAA;AAAA,QACR,wEAAA;AAAA,QACAC,aAAAA,CAAY;AAAA,OACd;AAAA,IACF;AAEA,IAAA,MAAM,YAAA,GAAe,IAAA,CAAK,mBAAA,CAAoB,QAAQ,CAAA;AAEtD,IAAA,IAAA,CAAK,iBAAiB,IAAI,CAAA;AAC1B,IAAA,IAAA,CAAK,UAAU,UAAA,EAAY;AAAA,MACzB,OAAA,EAAS;AAAA,KACkC,CAAA;AAG7C,IAAA,IAAI,YAAA,EAAc;AAChB,MAAA,IAAA,CAAK,qBAAqB,QAAQ,CAAA;AAAA,IACpC;AAGA,IAAA,IAAI,gBAAA,GAAmC,IAAA;AACvC,IAAA,IAAI,oBAAA,GAA2C,IAAA;AAE/C,IAAA,IAAI;AAEF,MAAA,MAAM,IAAA,CAAK,eAAe,IAAI,CAAA;AAG9B,MAAA,MAAM,SAAA,GAAY,KAAK,MAAA,EAAQ,WAAA,GAC3B,KAAK,MAAA,CAAO,WAAA,CAAY,IAAwB,CAAA,GAC/C,IAAA;AAGL,MAAA,IAAI,YAAA,EAAc;AAEhB,QAAA,gBAAA,GAAmB;AAAA,UACjB,GAAI,IAAA;AAAA,UACJ,EAAA,EAAI,CAAA,KAAA,EAAQ,IAAA,CAAK,GAAA,EAAK,CAAA,CAAA;AAAA;AAAA,UACtB,WAAA,EAAa;AAAA,SACf;AACA,QAAA,oBAAA,GAAuB,IAAA,CAAK,iBAAiB,gBAAgB,CAAA;AAE7D,QAAA,IAAA,CAAK,UAAU,mBAAA,EAAqB;AAAA,UAClC,MAAA,EAAQ,gBAAA;AAAA,UACR,UAAA,EAAY;AAAA,SACc,CAAA;AAAA,MAC9B;AAGA,MAAA,MAAM,WAAW,MAAM,IAAA,CAAK,OAAO,QAAA,CAAS,MAAA,CAAO,WAAW,OAAO,CAAA;AAErE,MAAA,IAAI,CAAC,SAAS,SAAA,EAAW;AACvB,QAAA,MAAM,IAAID,gBAAAA;AAAA,UACR,QAAA,CAAS,OAAO,OAAA,IAAW,yBAAA;AAAA,UAC3BC,aAAAA,CAAY,wBAAA;AAAA,UACZ;AAAA,YACE,OAAA,EAAS,EAAE,SAAA,EAAW,QAAA,EAAS;AAAA,YAC/B,KAAA,EAAO,SAAS,KAAA,IAAS,KAAA;AAAA;AAC3B,SACF;AAAA,MACF;AAGA,MAAA,MAAM,MAAA,GAAS,IAAA,CAAK,MAAA,CAAO,QAAA,CAAS,SAAS,IAAoB,CAAA;AAGjE,MAAA,IAAI,UAAA;AACJ,MAAA,IAAI,gBAAgB,gBAAA,EAAkB;AAEpC,QAAA,MAAM,SAAU,gBAAA,CAAqC,EAAA;AACrD,QAAA,IAAI,MAAA,EAAQ;AACV,UAAA,IAAA,CAAK,sBAAsB,MAAM,CAAA;AAAA,QACnC;AACA,QAAA,UAAA,GAAa,IAAA,CAAK,iBAAiB,MAAM,CAAA;AACzC,QAAA,IAAA,CAAK,mBAAmB,QAAQ,CAAA;AAAA,MAClC,CAAA,MAAO;AACL,QAAA,UAAA,GAAa,IAAA,CAAK,iBAAiB,MAAM,CAAA;AAAA,MAC3C;AAGA,MAAA,MAAM,IAAA,CAAK,cAAc,MAAM,CAAA;AAG/B,MAAA,IAAA,CAAK,UAAU,SAAA,EAAW;AAAA,QACxB,MAAA;AAAA,QACA;AAAA,OACwD,CAAA;AAE1D,MAAA,IAAA,CAAK,UAAU,UAAA,EAAY;AAAA,QACzB,OAAA,EAAS;AAAA,OAC0B,CAAA;AAGrC,MAAA,MAAM,KAAK,sBAAA,CAAuB,QAAA,EAAU,KAAK,GAAA,EAAI,GAAI,WAAW,IAAI,CAAA;AAExE,MAAA,IAAA,CAAK,QAAQ,gBAAA,EAAkB,EAAE,QAAA,EAAW,MAAA,CAA2B,IAAI,CAAA;AAC3E,MAAA,OAAO,MAAA;AAAA,IACT,SAAS,KAAA,EAAO;AAEd,MAAA,MAAM,KAAK,sBAAA,CAAuB,QAAA,EAAU,KAAK,GAAA,EAAI,GAAI,WAAW,KAAK,CAAA;AAGzE,MAAA,IAAI,YAAA,IAAgB,IAAA,CAAK,gBAAA,EAAkB,eAAA,KAAoB,KAAA,EAAO;AACpE,QAAA,IAAA,CAAK,aAAA,CAAc,QAAA,EAAU,KAAA,YAAiB,KAAA,GAAQ,KAAA,GAAQ,IAAI,KAAA,CAAM,MAAA,CAAO,KAAK,CAAC,CAAC,CAAA;AAAA,MACxF;AAEA,MAAA,MAAM,QAAA,GAAW,IAAA,CAAK,SAAA,CAAU,KAAA,EAAO,QAAQ,CAAA;AAE/C,MAAA,IAAA,CAAK,UAAU,cAAA,EAAgB;AAAA,QAC7B,KAAA,EAAO;AAAA,OACyB,CAAA;AAClC,MAAA,MAAM,QAAA;AAAA,IACR,CAAA,SAAE;AACA,MAAA,IAAA,CAAK,iBAAiB,KAAK,CAAA;AAAA,IAC7B;AAAA,EACF;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAYA,MAAM,MAAA,CACJ,EAAA,EACA,IAAA,EACA,OAAA,EACkB;AAClB,IAAA,IAAA,CAAK,WAAA,EAAY;AACjB,IAAA,MAAM,SAAA,GAAY,KAAK,GAAA,EAAI;AAE3B,IAAA,IAAI,CAAC,IAAA,CAAK,MAAA,CAAO,QAAA,EAAU,MAAA,EAAQ;AACjC,MAAA,MAAM,IAAID,gBAAAA;AAAA,QACR,wEAAA;AAAA,QACAC,aAAAA,CAAY;AAAA,OACd;AAAA,IACF;AAEA,IAAA,MAAM,YAAA,GAAe,IAAA,CAAK,mBAAA,CAAoB,QAAQ,CAAA;AAEtD,IAAA,IAAA,CAAK,iBAAiB,IAAI,CAAA;AAC1B,IAAA,IAAA,CAAK,UAAU,UAAA,EAAY;AAAA,MACzB,EAAA;AAAA,MACA,OAAA,EAAS;AAAA,KACkC,CAAA;AAG7C,IAAA,IAAI,YAAA,EAAc;AAChB,MAAA,IAAA,CAAK,qBAAqB,QAAQ,CAAA;AAAA,IACpC;AAEA,IAAA,IAAI;AAEF,MAAA,MAAM,IAAA,CAAK,YAAA,GAAe,EAAA,EAAI,IAAI,CAAA;AAGlC,MAAA,MAAM,QAAA,GAAW,KAAK,MAAA,EAAQ,UAAA,GAC1B,KAAK,MAAA,CAAO,UAAA,CAAW,IAAwB,CAAA,GAC9C,IAAA;AAGL,MAAA,IAAI,oBAAA,GAA2C,IAAA;AAC/C,MAAA,IAAI,YAAA,EAAc;AAEhB,QAAA,MAAM,gBAAA,GAAmB;AAAA,UACvB,EAAA;AAAA,UACA,GAAI,IAAA;AAAA,UACJ,WAAA,EAAa;AAAA,SACf;AACA,QAAA,oBAAA,GAAuB,IAAA,CAAK,mBAAA,CAAoB,EAAA,EAAI,gBAAgB,CAAA;AAEpE,QAAA,IAAA,CAAK,UAAU,mBAAA,EAAqB;AAAA,UAClC,EAAA;AAAA,UACA,MAAA,EAAQ,gBAAA;AAAA,UACR,UAAA,EAAY;AAAA,SACc,CAAA;AAAA,MAC9B;AAGA,MAAA,MAAM,QAAA,GAAW,MAAM,IAAA,CAAK,MAAA,CAAO,QAAA,CAAS,MAAA,CAAO,EAAE,EAAA,EAAI,IAAA,EAAM,QAAA,EAAS,EAAG,OAAO,CAAA;AAElF,MAAA,IAAI,CAAC,SAAS,SAAA,EAAW;AACvB,QAAA,MAAM,IAAID,gBAAAA;AAAA,UACR,QAAA,CAAS,OAAO,OAAA,IAAW,yBAAA;AAAA,UAC3BC,aAAAA,CAAY,wBAAA;AAAA,UACZ;AAAA,YACE,OAAA,EAAS,EAAE,SAAA,EAAW,QAAA,EAAU,UAAU,EAAA,EAAG;AAAA,YAC7C,KAAA,EAAO,SAAS,KAAA,IAAS,KAAA;AAAA;AAC3B,SACF;AAAA,MACF;AAGA,MAAA,MAAM,YAAA,GAAe,IAAA,CAAK,MAAA,CAAO,QAAA,CAAS,SAAS,IAAoB,CAAA;AAGvE,MAAA,IAAI,WAAA,GAAc,YAAA;AAClB,MAAA,IAAI,gBAAgB,oBAAA,EAAsB;AAExC,QAAA,WAAA,GAAc,KAAK,eAAA,CAAgB,EAAE,IAAI,GAAI,IAAA,IAA8B,YAAY,CAAA;AACvF,QAAA,IAAA,CAAK,mBAAmB,QAAQ,CAAA;AAAA,MAClC;AAGA,MAAA,MAAM,UAAA,GAAa,IAAA,CAAK,mBAAA,CAAoB,EAAA,EAAI,WAAW,CAAA;AAG3D,MAAA,MAAM,IAAA,CAAK,WAAA,GAAc,EAAA,EAAI,WAAW,CAAA;AAGxC,MAAA,IAAA,CAAK,UAAU,SAAA,EAAW;AAAA,QACxB,MAAA,EAAQ,WAAA;AAAA,QACR;AAAA,OACwD,CAAA;AAE1D,MAAA,IAAA,CAAK,UAAU,UAAA,EAAY;AAAA,QACzB,OAAA,EAAS,IAAA;AAAA,QACT,QAAA,EAAU;AAAA,OACyB,CAAA;AAGrC,MAAA,MAAM,KAAK,sBAAA,CAAuB,OAAA,EAAS,KAAK,GAAA,EAAI,GAAI,WAAW,IAAI,CAAA;AAEvE,MAAA,IAAA,CAAK,OAAA,CAAQ,gBAAA,EAAkB,EAAE,QAAA,EAAU,IAAI,CAAA;AAC/C,MAAA,OAAO,WAAA;AAAA,IACT,SAAS,KAAA,EAAO;AAEd,MAAA,MAAM,KAAK,sBAAA,CAAuB,OAAA,EAAS,KAAK,GAAA,EAAI,GAAI,WAAW,KAAK,CAAA;AAGxE,MAAA,IAAI,YAAA,IAAgB,IAAA,CAAK,gBAAA,EAAkB,eAAA,KAAoB,KAAA,EAAO;AACpE,QAAA,IAAA,CAAK,aAAA,CAAc,QAAA,EAAU,KAAA,YAAiB,KAAA,GAAQ,KAAA,GAAQ,IAAI,KAAA,CAAM,MAAA,CAAO,KAAK,CAAC,CAAC,CAAA;AAAA,MACxF;AAEA,MAAA,MAAM,QAAA,GAAW,KAAK,SAAA,CAAU,KAAA,EAAO,UAAU,EAAE,QAAA,EAAU,IAAI,CAAA;AAEjE,MAAA,IAAA,CAAK,UAAU,cAAA,EAAgB;AAAA,QAC7B,KAAA,EAAO,QAAA;AAAA,QACP,QAAA,EAAU;AAAA,OACsB,CAAA;AAClC,MAAA,MAAM,QAAA;AAAA,IACR,CAAA,SAAE;AACA,MAAA,IAAA,CAAK,iBAAiB,KAAK,CAAA;AAAA,IAC7B;AAAA,EACF;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAWA,MAAM,MAAA,CACJ,EAAA,EACA,OAAA,EACwB;AACxB,IAAA,IAAA,CAAK,WAAA,EAAY;AACjB,IAAA,MAAM,SAAA,GAAY,KAAK,GAAA,EAAI;AAE3B,IAAA,IAAI,CAAC,IAAA,CAAK,MAAA,CAAO,QAAA,EAAU,MAAA,EAAQ;AACjC,MAAA,MAAM,IAAID,gBAAAA;AAAA,QACR,wEAAA;AAAA,QACAC,aAAAA,CAAY;AAAA,OACd;AAAA,IACF;AAEA,IAAA,MAAM,YAAA,GAAe,IAAA,CAAK,mBAAA,CAAoB,QAAQ,CAAA;AAEtD,IAAA,IAAA,CAAK,iBAAiB,IAAI,CAAA;AAC1B,IAAA,IAAA,CAAK,UAAU,UAAA,EAAY;AAAA,MACzB,EAAA,EAAI,OAAO,EAAE;AAAA,KACsB,CAAA;AAGrC,IAAA,IAAI,YAAA,EAAc;AAChB,MAAA,IAAA,CAAK,qBAAqB,QAAQ,CAAA;AAAA,IACpC;AAEA,IAAA,IAAI;AAEF,MAAA,MAAM,IAAA,CAAK,eAAe,EAAE,CAAA;AAG5B,MAAA,IAAI,YAAA,EAAc;AAChB,QAAA,IAAA,CAAK,qBAAA,CAAsB,MAAA,CAAO,EAAE,CAAC,CAAA;AAErC,QAAA,IAAA,CAAK,UAAU,mBAAA,EAAqB;AAAA,UAClC,EAAA,EAAI,OAAO,EAAE;AAAA,SACa,CAAA;AAAA,MAC9B;AAGA,MAAA,MAAM,QAAA,GAAW,MAAM,IAAA,CAAK,MAAA,CAAO,SAAS,MAAA,CAAO,MAAA,CAAO,EAAE,CAAA,EAAG,OAAO,CAAA;AAEtE,MAAA,IAAI,CAAC,SAAS,SAAA,EAAW;AACvB,QAAA,MAAM,IAAID,gBAAAA;AAAA,UACR,QAAA,CAAS,OAAO,OAAA,IAAW,yBAAA;AAAA,UAC3BC,aAAAA,CAAY,wBAAA;AAAA,UACZ;AAAA,YACE,SAAS,EAAE,SAAA,EAAW,UAAU,QAAA,EAAU,MAAA,CAAO,EAAE,CAAA,EAAE;AAAA,YACrD,KAAA,EAAO,SAAS,KAAA,IAAS,KAAA;AAAA;AAC3B,SACF;AAAA,MACF;AAGA,MAAA,IAAI,CAAC,YAAA,EAAc;AACjB,QAAA,IAAA,CAAK,qBAAA,CAAsB,MAAA,CAAO,EAAE,CAAC,CAAA;AAAA,MACvC,CAAA,MAAO;AACL,QAAA,IAAA,CAAK,mBAAmB,QAAQ,CAAA;AAAA,MAClC;AAGA,MAAA,MAAM,IAAA,CAAK,cAAc,EAAE,CAAA;AAG3B,MAAA,IAAA,CAAK,UAAU,SAAA,EAAW;AAAA,QACxB,EAAA,EAAI,OAAO,EAAE,CAAA;AAAA,QACb,IAAA,EAAM;AAAA,OAC4B,CAAA;AAEpC,MAAA,IAAA,CAAK,UAAU,UAAA,EAAY;AAAA,QACzB,OAAA,EAAS,IAAA;AAAA,QACT,QAAA,EAAU,OAAO,EAAE;AAAA,OACgB,CAAA;AAGrC,MAAA,MAAM,KAAK,sBAAA,CAAuB,QAAA,EAAU,KAAK,GAAA,EAAI,GAAI,WAAW,IAAI,CAAA;AAExE,MAAA,IAAA,CAAK,QAAQ,gBAAA,EAAkB,EAAE,UAAU,MAAA,CAAO,EAAE,GAAG,CAAA;AAGvD,MAAA,OAAO,QAAA,CAAS,IAAA;AAAA,IAClB,SAAS,KAAA,EAAO;AAEd,MAAA,MAAM,KAAK,sBAAA,CAAuB,QAAA,EAAU,KAAK,GAAA,EAAI,GAAI,WAAW,KAAK,CAAA;AAGzE,MAAA,IAAI,YAAA,IAAgB,IAAA,CAAK,gBAAA,EAAkB,eAAA,KAAoB,KAAA,EAAO;AACpE,QAAA,IAAA,CAAK,aAAA,CAAc,QAAA,EAAU,KAAA,YAAiB,KAAA,GAAQ,KAAA,GAAQ,IAAI,KAAA,CAAM,MAAA,CAAO,KAAK,CAAC,CAAC,CAAA;AAAA,MACxF;AAEA,MAAA,MAAM,QAAA,GAAW,IAAA,CAAK,SAAA,CAAU,KAAA,EAAO,QAAA,EAAU,EAAE,QAAA,EAAU,MAAA,CAAO,EAAE,CAAA,EAAG,CAAA;AAEzE,MAAA,IAAA,CAAK,UAAU,cAAA,EAAgB;AAAA,QAC7B,KAAA,EAAO,QAAA;AAAA,QACP,QAAA,EAAU,OAAO,EAAE;AAAA,OACa,CAAA;AAClC,MAAA,MAAM,QAAA;AAAA,IACR,CAAA,SAAE;AACA,MAAA,IAAA,CAAK,iBAAiB,KAAK,CAAA;AAAA,IAC7B;AAAA,EACF;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAmBU,SAAA,CACR,OACA,OAAA,EACM;AACN,IAAA,MAAM,SAAA,GAAY,CAAA,EAAG,IAAA,CAAK,WAAW,IAAI,KAAK,CAAA,CAAA;AAC9C,IAAA,gBAAA,CAAiB,IAAA,CAAK,WAAW,OAAO,CAAA;AACxC,IAAA,IAAA,CAAK,QAAA,CAAS,CAAA,eAAA,EAAkB,SAAS,CAAA,CAAA,EAAI,OAA6C,CAAA;AAAA,EAC5F;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAoHU,SAAA,CACR,KAAA,EACA,SAAA,EACA,OAAA,EACkB;AAElB,IAAA,IAAI,iBAAiBS,SAAAA,EAAW;AAC9B,MAAA,OAAO,KAAA;AAAA,IACT;AAGA,IAAA,OAAO,IAAIV,gBAAAA;AAAA,MACT,KAAA,YAAiB,KAAA,GAAQ,KAAA,CAAM,OAAA,GAAU,8BAAA;AAAA,MACzCC,aAAAA,CAAY,wBAAA;AAAA,MACZ;AAAA,QACE,OAAA,EAAS,EAAE,SAAA,EAAW,GAAG,OAAA,EAAQ;AAAA,QACjC,KAAA,EAAO,KAAA,YAAiB,KAAA,GAAQ,KAAA,GAAQ;AAAA;AAC1C,KACF;AAAA,EACF;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAsBA,MAAgB,cAAA,CACd,SAAA,EACA,QAAA,EACA,EAAA,EACY;AACZ,IAAA,MAAM,SAAA,GAAY,KAAK,GAAA,EAAI;AAC3B,IAAA,MAAM,QAAA,GAAW,CAAA,EAAG,IAAA,CAAK,WAAW,IAAI,SAAS,CAAA,CAAA;AAEjD,IAAA,OAAO,IAAA,CAAK,QAAA,CAAS,QAAA,EAAU,OAAM,IAAA,KAAQ;AAC3C,MAAA,IAAI,QAAA,EAAU;AACZ,QAAA,IAAA,CAAK,YAAA,CAAa,aAAa,QAAQ,CAAA;AAAA,MACzC;AACA,MAAA,IAAA,CAAK,YAAA,CAAa,cAAA,EAAgB,IAAA,CAAK,WAAW,CAAA;AAClD,MAAA,IAAA,CAAK,YAAA,CAAa,kBAAkB,SAAS,CAAA;AAE7C,MAAA,IAAI;AACF,QAAA,MAAM,MAAA,GAAS,MAAM,EAAA,EAAG;AAGxB,QAAA,MAAM,QAAA,GAAW,IAAA,CAAK,GAAA,EAAI,GAAI,SAAA;AAC9B,QAAA,MAAM,IAAA,CAAK,sBAAA,CAAuB,SAAA,EAAW,QAAA,EAAU,IAAI,CAAA;AAE3D,QAAA,IAAA,CAAK,UAAU,IAAI,CAAA;AACnB,QAAA,OAAO,MAAA;AAAA,MACT,SAAS,KAAA,EAAO;AAEd,QAAA,MAAM,QAAA,GAAW,IAAA,CAAK,GAAA,EAAI,GAAI,SAAA;AAC9B,QAAA,MAAM,IAAA,CAAK,sBAAA,CAAuB,SAAA,EAAW,QAAA,EAAU,KAAK,CAAA;AAE5D,QAAA,IAAA,CAAK,gBAAgB,KAAc,CAAA;AACnC,QAAA,IAAA,CAAK,SAAA,CAAU,OAAA,EAAU,KAAA,CAAgB,OAAO,CAAA;AAChD,QAAA,MAAM,KAAA;AAAA,MACR;AAAA,IACF,CAAC,CAAA;AAAA,EACH;AAAA;AAAA;AAAA;AAAA,EAKA,MAAc,sBAAA,CACZ,SAAA,EACA,QAAA,EACA,OAAA,EACe;AACf,IAAA,IAAI,CAAC,KAAK,gBAAA,EAAkB;AAE5B,IAAA,MAAM,IAAA,GAAO;AAAA,MACX,SAAS,IAAA,CAAK,WAAA;AAAA,MACd,SAAA;AAAA,MACA,QAAQ,IAAA,CAAK,WAAA;AAAA,MACb,OAAA,EAAS;AAAA,KACX;AAGA,IAAA,MAAM,IAAA,CAAK,YAAA,CAAaU,qBAAAA,CAAsB,0BAAA,EAA4B,UAAU,IAAI,CAAA;AAGxF,IAAA,MAAM,IAAA,CAAK,gBAAA;AAAA,MACT,OAAA,GACIA,qBAAAA,CAAsB,uBAAA,GACtBA,qBAAAA,CAAsB,uBAAA;AAAA,MAC1B,CAAA;AAAA,MACA;AAAA,KACF;AAAA,EACF;AACF;;;AC96CO,IAAe,aAAf,MAkBP;AAAA,EAlEA;AAkEA,IAAA,MAAA,CAAA,IAAA,EAAA,YAAA,CAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAqDE,aAAa,IAAA,EAAiC;AAC5C,IAAA,OAAO,KAAK,GAAA,CAAI,CAAA,GAAA,KAAO,IAAA,CAAK,QAAA,CAAS,GAAG,CAAC,CAAA;AAAA,EAC3C;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAUA,aAAa,MAAA,EAA8B;AACzC,IAAA,MAAM,QAAQ,EAAC;AACf,IAAA,KAAA,MAAW,CAAC,GAAA,EAAK,KAAK,KAAK,MAAA,CAAO,OAAA,CAAQ,MAAiC,CAAA,EAAG;AAC5E,MAAA,IAAI,OAAO,UAAU,UAAA,EAAY;AAE/B,QAAA,IAAI,iBAAiB,IAAA,EAAM;AACzB,UAAA,KAAA,CAAM,GAAG,CAAA,GAAI,KAAA,CAAM,WAAA,EAAY;AAAA,QACjC,CAAA,MAAO;AACL,UAAA,KAAA,CAAM,GAAG,CAAA,GAAI,KAAA;AAAA,QACf;AAAA,MACF;AAAA,IACF;AACA,IAAA,OAAO,KAAA;AAAA,EACT;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOA,iBAAkB,OAAA,EAA0C;AAG1D,IAAA,OAAO,QAAQ,GAAA,CAAI,CAAA,CAAA,KAAK,IAAA,CAAK,YAAA,CAAa,CAAC,CAAC,CAAA;AAAA,EAC9C;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,eAAe,KAAA,EAA6B;AAC1C,IAAA,OAAO,KAAA;AAAA,EACT;AACF;AChHO,IAAe,gBAAf,MAOP;AAAA,EA3DA;AA2DA,IAAA,MAAA,CAAA,IAAA,EAAA,eAAA,CAAA;AAAA;AAAA,EAGE,WAAA,CAAY,MAAA,GAAyE,EAAC,EAAG;AACvF,IAAA,IAAA,CAAK,MAAA,GAAS,MAAA;AAAA,EAChB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EASA,eAAe,IAAA,EAA8C;AAC3D,IAAA,IAAI,CAAC,IAAA,CAAK,MAAA,CAAO,YAAA,EAAc;AAC7B,MAAA,OAAO,EAAE,OAAA,EAAS,IAAA,EAAM,IAAA,EAAsB;AAAA,IAChD;AACA,IAAA,OAAO,IAAA,CAAK,QAAA,CAAS,IAAA,EAAM,IAAA,CAAK,OAAO,YAAY,CAAA;AAAA,EACrD;AAAA;AAAA;AAAA;AAAA,EAKA,eAAe,IAAA,EAA8C;AAC3D,IAAA,IAAI,CAAC,IAAA,CAAK,MAAA,CAAO,YAAA,EAAc;AAC7B,MAAA,OAAO,EAAE,OAAA,EAAS,IAAA,EAAM,IAAA,EAAsB;AAAA,IAChD;AACA,IAAA,OAAO,IAAA,CAAK,QAAA,CAAS,IAAA,EAAM,IAAA,CAAK,OAAO,YAAY,CAAA;AAAA,EACrD;AAAA;AAAA;AAAA;AAAA,EAKA,cAAc,IAAA,EAA6C;AACzD,IAAA,IAAI,CAAC,IAAA,CAAK,MAAA,CAAO,WAAA,EAAa;AAC5B,MAAA,OAAO,EAAE,OAAA,EAAS,IAAA,EAAM,IAAA,EAAqB;AAAA,IAC/C;AACA,IAAA,OAAO,IAAA,CAAK,QAAA,CAAS,IAAA,EAAM,IAAA,CAAK,OAAO,WAAW,CAAA;AAAA,EACpD;AAAA;AAAA;AAAA;AAAA,EAKA,eAAe,IAAA,EAA8C;AAC3D,IAAA,IAAI,CAAC,IAAA,CAAK,MAAA,CAAO,YAAA,EAAc;AAC7B,MAAA,OAAO,EAAE,OAAA,EAAS,IAAA,EAAM,IAAA,EAAsB;AAAA,IAChD;AACA,IAAA,OAAO,IAAA,CAAK,QAAA,CAAS,IAAA,EAAM,IAAA,CAAK,OAAO,YAAY,CAAA;AAAA,EACrD;AAAA;AAAA;AAAA;AAAA,EAKA,cAAc,IAAA,EAA6C;AACzD,IAAA,IAAI,CAAC,IAAA,CAAK,MAAA,CAAO,WAAA,EAAa;AAC5B,MAAA,OAAO,EAAE,OAAA,EAAS,IAAA,EAAM,IAAA,EAAqB;AAAA,IAC/C;AACA,IAAA,OAAO,IAAA,CAAK,QAAA,CAAS,IAAA,EAAM,IAAA,CAAK,OAAO,WAAW,CAAA;AAAA,EACpD;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAUA,sBAAsB,IAAA,EAAwB;AAC5C,IAAA,MAAM,MAAA,GAAS,IAAA,CAAK,cAAA,CAAe,IAAI,CAAA;AACvC,IAAA,IAAI,CAAC,MAAA,CAAO,OAAA,IAAW,MAAA,CAAO,MAAA,EAAQ;AACpC,MAAA,MAAM,gBAAA,GAAmB,IAAA,CAAK,sBAAA,CAAuB,MAAA,CAAO,MAAM,CAAA;AAClE,MAAA,IAAI,gBAAA,CAAiB,SAAS,CAAA,EAAG;AAC/B,QAAA,MAAM,gBAAA;AAAA,MACR;AAAA,IACF;AACA,IAAA,OAAO,MAAA,CAAO,IAAA;AAAA,EAChB;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,sBAAsB,IAAA,EAAwB;AAC5C,IAAA,MAAM,MAAA,GAAS,IAAA,CAAK,cAAA,CAAe,IAAI,CAAA;AACvC,IAAA,IAAI,CAAC,MAAA,CAAO,OAAA,IAAW,MAAA,CAAO,MAAA,EAAQ;AACpC,MAAA,MAAM,gBAAA,GAAmB,IAAA,CAAK,sBAAA,CAAuB,MAAA,CAAO,MAAM,CAAA;AAClE,MAAA,IAAI,gBAAA,CAAiB,SAAS,CAAA,EAAG;AAC/B,QAAA,MAAM,gBAAA;AAAA,MACR;AAAA,IACF;AACA,IAAA,OAAO,MAAA,CAAO,IAAA;AAAA,EAChB;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,qBAAqB,IAAA,EAAuB;AAC1C,IAAA,MAAM,MAAA,GAAS,IAAA,CAAK,aAAA,CAAc,IAAI,CAAA;AACtC,IAAA,IAAI,CAAC,MAAA,CAAO,OAAA,IAAW,MAAA,CAAO,MAAA,EAAQ;AACpC,MAAA,MAAM,gBAAA,GAAmB,IAAA,CAAK,sBAAA,CAAuB,MAAA,CAAO,MAAM,CAAA;AAClE,MAAA,IAAI,gBAAA,CAAiB,SAAS,CAAA,EAAG;AAC/B,QAAA,MAAM,gBAAA;AAAA,MACR;AAAA,IACF;AACA,IAAA,OAAO,MAAA,CAAO,IAAA;AAAA,EAChB;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,sBAAsB,IAAA,EAAwB;AAC5C,IAAA,MAAM,MAAA,GAAS,IAAA,CAAK,cAAA,CAAe,IAAI,CAAA;AACvC,IAAA,IAAI,CAAC,MAAA,CAAO,OAAA,IAAW,MAAA,CAAO,MAAA,EAAQ;AACpC,MAAA,MAAM,gBAAA,GAAmB,IAAA,CAAK,sBAAA,CAAuB,MAAA,CAAO,MAAM,CAAA;AAClE,MAAA,IAAI,gBAAA,CAAiB,SAAS,CAAA,EAAG;AAC/B,QAAA,MAAM,gBAAA;AAAA,MACR;AAAA,IACF;AACA,IAAA,OAAO,MAAA,CAAO,IAAA;AAAA,EAChB;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,qBAAqB,IAAA,EAAuB;AAC1C,IAAA,MAAM,MAAA,GAAS,IAAA,CAAK,aAAA,CAAc,IAAI,CAAA;AACtC,IAAA,IAAI,CAAC,MAAA,CAAO,OAAA,IAAW,MAAA,CAAO,MAAA,EAAQ;AACpC,MAAA,MAAM,gBAAA,GAAmB,IAAA,CAAK,sBAAA,CAAuB,MAAA,CAAO,MAAM,CAAA;AAClE,MAAA,IAAI,gBAAA,CAAiB,SAAS,CAAA,EAAG;AAC/B,QAAA,MAAM,gBAAA;AAAA,MACR;AAAA,IACF;AACA,IAAA,OAAO,MAAA,CAAO,IAAA;AAAA,EAChB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAUU,QAAA,CACR,MACA,MAAA,EACyB;AACzB,IAAA,MAAM,MAAA,GAAS,uBAAA,CAAwB,MAAA,EAAQ,IAAI,CAAA;AAEnD,IAAA,IAAI,CAAC,OAAO,OAAA,EAAS;AACnB,MAAA,OAAO;AAAA,QACL,OAAA,EAAS,KAAA;AAAA,QACT,QAAQ,MAAA,CAAO;AAAA,OACjB;AAAA,IACF;AAEA,IAAA,OAAO;AAAA,MACL,OAAA,EAAS,IAAA;AAAA,MACT,MAAM,MAAA,CAAO;AAAA,KACf;AAAA,EACF;AAAA;AAAA;AAAA;AAAA;AAAA,EAMU,uBAAuB,MAAA,EAA+C;AAC9E,IAAA,IAAI,CAAC,MAAA,IAAU,MAAA,CAAO,MAAA,KAAW,CAAA,EAAG;AAClC,MAAA,OAAO,EAAC;AAAA,IACV;AAEA,IAAA,OAAO,MAAA,CAAO,IAAI,CAAA,KAAA,KAAS;AACzB,MAAA,MAAM,KAAA,GAAQ,KAAA,CAAM,IAAA,CAAK,IAAA,CAAK,GAAG,CAAA;AACjC,MAAA,OAAO,IAAI,eAAA;AAAA,QACTC,iBAAAA,CAAgB,iBAAA;AAAA,QAChBC,aAAAA,CAAY,WAAA;AAAA,QACZ,KAAA,CAAM,OAAA;AAAA,QACN;AAAA,UACE,KAAA;AAAA,UACA,MAAM,KAAA,CAAM,IAAA;AAAA,UACZ,MAAM,KAAA,CAAM;AAAA;AACd,OACF;AAAA,IACF,CAAC,CAAA;AAAA,EACH;AAAA;AAAA;AAAA;AAAA;AAAA,EAMU,eAAe,MAAA,EAA8C;AACrE,IAAA,IAAI,CAAC,MAAA,IAAU,MAAA,CAAO,MAAA,KAAW,CAAA,EAAG;AAClC,MAAA,OAAO,EAAC;AAAA,IACV;AACA,IAAA,OAAO;AAAA,MACL,MAAA,EAAQ,MAAA,CAAO,GAAA,CAAI,CAAA,KAAA,MAAU;AAAA,QAC3B,WAAW,KAAA,CAAM,IAAA;AAAA,QACjB,SAAS,KAAA,CAAM,OAAA;AAAA,QACf,KAAA,EAAO,KAAA,CAAM,IAAA,CAAK,IAAA,CAAK,GAAG,CAAA;AAAA,QAC1B,OAAA,EAAS;AAAA,UACP,MAAM,KAAA,CAAM;AAAA;AACd,OACF,CAAE;AAAA,KACJ;AAAA,EACF;AACF;;;ACpQO,SAAS,aAAa,GAAA,EAAqB;AAChD,EAAA,OAAO,GAAA,CAAI,QAAQ,WAAA,EAAa,CAAC,GAAG,MAAA,KAAW,MAAA,CAAO,aAAa,CAAA;AACrE;AAFgB,MAAA,CAAA,YAAA,EAAA,cAAA,CAAA;AAOT,SAAS,aAAa,GAAA,EAAqB;AAChD,EAAA,OAAO,GAAA,CAAI,QAAQ,QAAA,EAAU,CAAA,MAAA,KAAU,IAAI,MAAA,CAAO,WAAA,EAAa,CAAA,CAAE,CAAA;AACnE;AAFgB,MAAA,CAAA,YAAA,EAAA,cAAA,CAAA;AAOT,SAAS,UAAU,UAAA,EAAoD;AAC5E,EAAA,IAAI,CAAC,YAAY,OAAO,IAAA;AACxB,EAAA,MAAM,IAAA,GAAO,IAAI,IAAA,CAAK,UAAU,CAAA;AAChC,EAAA,OAAO,KAAA,CAAM,IAAA,CAAK,OAAA,EAAS,IAAI,IAAA,GAAO,IAAA;AACxC;AAJgB,MAAA,CAAA,SAAA,EAAA,WAAA,CAAA;AAST,SAAS,WAAW,IAAA,EAA8C;AACvE,EAAA,OAAO,IAAA,EAAM,aAAY,IAAK,IAAA;AAChC;AAFgB,MAAA,CAAA,UAAA,EAAA,YAAA,CAAA;AAOT,SAAS,WAAW,GAAA,EAA6C;AACtE,EAAA,OAAO,KAAK,IAAA,EAAK;AACnB;AAFgB,MAAA,CAAA,UAAA,EAAA,YAAA,CAAA;AAOT,SAAS,YAA+C,GAAA,EAAoB;AACjF,EAAA,MAAM,SAAqB,EAAC;AAC5B,EAAA,KAAA,MAAW,CAAC,GAAA,EAAK,KAAK,KAAK,MAAA,CAAO,OAAA,CAAQ,GAAG,CAAA,EAAG;AAC9C,IAAA,IAAI,UAAU,MAAA,EAAW;AACvB,MAAC,MAAA,CAAmC,GAAG,CAAA,GAAI,KAAA;AAAA,IAC7C;AAAA,EACF;AACA,EAAA,OAAO,MAAA;AACT;AARgB,MAAA,CAAA,WAAA,EAAA,aAAA,CAAA;AAaT,SAAS,YAA+C,GAAA,EAAiC;AAC9F,EAAA,MAAM,SAAkC,EAAC;AACzC,EAAA,KAAA,MAAW,CAAC,GAAA,EAAK,KAAK,KAAK,MAAA,CAAO,OAAA,CAAQ,GAAG,CAAA,EAAG;AAC9C,IAAA,MAAA,CAAO,YAAA,CAAa,GAAG,CAAC,CAAA,GAAI,KAAA;AAAA,EAC9B;AACA,EAAA,OAAO,MAAA;AACT;AANgB,MAAA,CAAA,WAAA,EAAA,aAAA,CAAA;AAWT,SAAS,YAA+C,GAAA,EAAiC;AAC9F,EAAA,MAAM,SAAkC,EAAC;AACzC,EAAA,KAAA,MAAW,CAAC,GAAA,EAAK,KAAK,KAAK,MAAA,CAAO,OAAA,CAAQ,GAAG,CAAA,EAAG;AAC9C,IAAA,MAAA,CAAO,YAAA,CAAa,GAAG,CAAC,CAAA,GAAI,KAAA;AAAA,EAC9B;AACA,EAAA,OAAO,MAAA;AACT;AANgB,MAAA,CAAA,WAAA,EAAA,aAAA,CAAA;ACvDhB,IAAM,mBAAA,GAAqC;AAAA,EACzC,OAAA,EAAS,MAAA;AAAA,EACT,KAAA,EAAO,KAAA;AAAA,EACP,UAAA,EAAY;AACd,CAAA;AAKA,IAAM,iBAAA,GAAmC;AAAA,EACvC,MAAA,EAAQ,YAAA;AAAA,EACR,QAAA,EAAU,SAAA;AAAA,EACV,UAAA,EAAY;AACd,CAAA;AAKA,IAAM,iBAAA,GAAmC;AAAA,EACvC,MAAA,EAAQ,CAAA;AAAA,EACR,QAAA,EAAU;AACZ,CAAA;AAiBO,SAAS,mBAAA,CAAoB;AAAA,EAClC,KAAA;AAAA,EACA;AACF,CAAA,EAA2C;AACzC,EAAA,IAAI,cAAA,EAAgB;AAClB,IAAA,uBAAO,GAAA,CAAA,QAAA,EAAA,EAAG,QAAA,EAAA,cAAA,CAAe,KAAK,CAAA,EAAE,CAAA;AAAA,EAClC;AAEA,EAAA,uBACE,IAAA,CAAC,KAAA,EAAA,EAAI,KAAA,EAAO,mBAAA,EACV,QAAA,EAAA;AAAA,oBAAA,GAAA,CAAC,IAAA,EAAA,EAAG,KAAA,EAAO,iBAAA,EAAmB,QAAA,EAAA,6BAAA,EAA2B,CAAA;AAAA,oBACzD,GAAA,CAAC,GAAA,EAAA,EAAE,KAAA,EAAO,iBAAA,EAAoB,gBAAM,OAAA,EAAQ;AAAA,GAAA,EAC9C,CAAA;AAEJ;AAdgB,MAAA,CAAA,mBAAA,EAAA,qBAAA,CAAA;ACtChB,IAAM,qBAAA,GAAuC;AAAA,EAC3C,OAAA,EAAS,MAAA;AAAA,EACT,UAAA,EAAY;AACd,CAAA;AAKA,IAAM,mBAAA,GAAqC;AAAA,EACzC,MAAA,EAAQ,CAAA;AAAA,EACR,QAAA,EAAU,UAAA;AAAA,EACV,KAAA,EAAO;AACT,CAAA;AAcO,SAAS,qBAAA,CAAsB,EAAE,OAAA,EAAQ,EAA6C;AAC3F,EAAA,IAAI,OAAA,EAAS;AACX,IAAA,uBAAOC,GAAAA,CAAAC,QAAAA,EAAA,EAAG,QAAA,EAAA,OAAA,EAAQ,CAAA;AAAA,EACpB;AAEA,EAAA,uBACED,GAAAA,CAAC,KAAA,EAAA,EAAI,KAAA,EAAO,qBAAA,EACV,QAAA,kBAAAA,GAAAA,CAAC,GAAA,EAAA,EAAE,KAAA,EAAO,mBAAA,EAAqB,QAAA,EAAA,iBAAA,EAAe,CAAA,EAChD,CAAA;AAEJ;AAVgB,MAAA,CAAA,qBAAA,EAAA,uBAAA,CAAA;ACTT,IAAM,sBAAN,MAAmD;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAmBxD,WAAA,CAAY,MAAA,GAA4B,EAAC,EAAG;AAlB5C,IAAA,IAAA,CAAQ,KAAA,uBAAY,GAAA,EAAwB;AAC5C,IAAA,IAAA,CAAQ,WAAA,uBAAkB,GAAA,EAAoB;AAC9C,IAAA,IAAA,CAAQ,KAAA,GAAQ;AAAA,MACd,IAAA,EAAM,CAAA;AAAA,MACN,MAAA,EAAQ,CAAA;AAAA,MACR,IAAA,EAAM,CAAA;AAAA,MACN,OAAA,EAAS;AAAA,KACX;AAYE,IAAA,MAAM,aAAA,GAAgB;AAAA,MACpB,UAAA,EAAY,sBAAA;AAAA,MACZ,eAAA,EAAiB;AAAA,KACnB;AAEA,IAAA,IAAA,CAAK,OAAA,GAAU,MAAA,CAAO,OAAA,IAAW,MAAA,CAAO,cAAc,aAAA,CAAc,UAAA;AACpE,IAAA,IAAA,CAAK,eAAA,GAAkB,MAAA,CAAO,eAAA,IAAmB,aAAA,CAAc,eAAA;AAC/D,IAAA,IAAA,CAAK,UAAU,MAAA,CAAO,OAAA;AAGtB,IAAA,IAAA,CAAK,YAAA,EAAa;AAAA,EACpB;AAAA,EA/DF;AAgC0D,IAAA,MAAA,CAAA,IAAA,EAAA,qBAAA,CAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAwCxD,MAAM,GAAA,CAAO,GAAA,EAAa,KAAA,EAAqC;AAE7D,IAAA,IAAI,IAAA,CAAK,YAAY,CAAA,EAAG;AACtB,MAAA,IAAA,CAAK,KAAA,CAAM,IAAA,EAAA;AACX,MAAA;AAAA,IACF;AAIA,IAAA,IAAI,CAAC,IAAA,CAAK,KAAA,CAAM,GAAA,CAAI,GAAG,KAAK,IAAA,CAAK,KAAA,CAAM,IAAA,IAAQ,IAAA,CAAK,OAAA,EAAS;AAC3D,MAAA,IAAA,CAAK,kBAAA,EAAmB;AAAA,IAC1B;AAEA,IAAA,IAAA,CAAK,KAAA,CAAM,GAAA,CAAI,GAAA,EAAK,KAAK,CAAA;AACzB,IAAA,IAAA,CAAK,WAAA,CAAY,GAAA,CAAI,GAAA,EAAK,IAAA,CAAK,KAAK,CAAA;AACpC,IAAA,IAAA,CAAK,KAAA,CAAM,IAAA,EAAA;AAAA,EACb;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAQA,MAAM,IAAO,GAAA,EAA4C;AACvD,IAAA,MAAM,KAAA,GAAQ,IAAA,CAAK,KAAA,CAAM,GAAA,CAAI,GAAG,CAAA;AAEhC,IAAA,IAAI,CAAC,KAAA,EAAO;AACV,MAAA,IAAA,CAAK,KAAA,CAAM,MAAA,EAAA;AACX,MAAA,OAAO,IAAA;AAAA,IACT;AAGA,IAAA,IAAA,CAAK,WAAA,CAAY,GAAA,CAAI,GAAA,EAAK,IAAA,CAAK,KAAK,CAAA;AACpC,IAAA,IAAA,CAAK,KAAA,CAAM,IAAA,EAAA;AACX,IAAA,OAAO,KAAA;AAAA,EACT;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAQA,MAAM,OAAO,GAAA,EAA4B;AACvC,IAAA,IAAA,CAAK,KAAA,CAAM,OAAO,GAAG,CAAA;AACrB,IAAA,IAAA,CAAK,WAAA,CAAY,OAAO,GAAG,CAAA;AAC3B,IAAA,IAAA,CAAK,KAAA,CAAM,OAAA,EAAA;AAAA,EACb;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOA,MAAM,KAAA,GAAuB;AAC3B,IAAA,IAAA,CAAK,MAAM,KAAA,EAAM;AACjB,IAAA,IAAA,CAAK,YAAY,KAAA,EAAM;AACvB,IAAA,IAAA,CAAK,MAAM,IAAA,GAAO,CAAA;AAClB,IAAA,IAAA,CAAK,MAAM,MAAA,GAAS,CAAA;AACpB,IAAA,IAAA,CAAK,MAAM,IAAA,GAAO,CAAA;AAClB,IAAA,IAAA,CAAK,MAAM,OAAA,GAAU,CAAA;AAAA,EACvB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOA,MAAM,QAAA,GAAgC;AACpC,IAAA,MAAM,aAAA,GAAgB,IAAA,CAAK,KAAA,CAAM,IAAA,GAAO,KAAK,KAAA,CAAM,MAAA;AACnD,IAAA,MAAM,WAAW,aAAA,GAAgB,CAAA,GAAI,IAAA,CAAK,KAAA,CAAM,OAAO,aAAA,GAAgB,CAAA;AAEvE,IAAA,OAAO;AAAA,MACL,IAAA,EAAM,KAAK,KAAA,CAAM,IAAA;AAAA,MACjB,MAAA,EAAQ,KAAK,KAAA,CAAM,MAAA;AAAA,MACnB,IAAA,EAAM,KAAK,KAAA,CAAM,IAAA;AAAA,MACjB,OAAA,EAAS,KAAK,KAAA,CAAM,OAAA;AAAA,MACpB,IAAA,EAAM,KAAK,KAAA,CAAM,IAAA;AAAA,MACjB;AAAA,KACF;AAAA,EACF;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOA,MAAM,OAAA,GAAyB;AAC7B,IAAA,IAAI,KAAK,YAAA,EAAc;AACrB,MAAA,aAAA,CAAc,KAAK,YAAY,CAAA;AAC/B,MAAA,IAAA,CAAK,YAAA,GAAe,MAAA;AAAA,IACtB;AAEA,IAAA,MAAM,KAAK,KAAA,EAAM;AAAA,EACnB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOQ,YAAA,GAAqB;AAC3B,IAAA,IAAA,CAAK,YAAA,GAAe,YAAY,MAAM;AACpC,MAAA,IAAA,CAAK,qBAAA,EAAsB;AAAA,IAC7B,CAAA,EAAG,KAAK,eAAe,CAAA;AAEvB,IAAA,IAAI,KAAK,YAAA,IAAgB,OAAO,IAAA,CAAK,YAAA,CAAa,UAAU,UAAA,EAAY;AACtE,MAAA,IAAA,CAAK,aAAa,KAAA,EAAM;AAAA,IAC1B;AAAA,EACF;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOQ,qBAAA,GAA8B;AACpC,IAAA,MAAM,GAAA,GAAM,KAAK,GAAA,EAAI;AACrB,IAAA,MAAM,cAAwB,EAAC;AAE/B,IAAA,KAAA,MAAW,CAAC,GAAA,EAAK,KAAK,CAAA,IAAK,KAAA,CAAM,KAAK,IAAA,CAAK,KAAA,CAAM,OAAA,EAAS,CAAA,EAAG;AAC3D,MAAA,IAAI,GAAA,GAAM,MAAM,SAAA,EAAW;AACzB,QAAA,WAAA,CAAY,KAAK,GAAG,CAAA;AAAA,MACtB;AAAA,IACF;AAEA,IAAA,KAAA,MAAW,OAAO,WAAA,EAAa;AAC7B,MAAA,MAAM,KAAA,GAAQ,IAAA,CAAK,KAAA,CAAM,GAAA,CAAI,GAAG,CAAA;AAChC,MAAA,IAAA,CAAK,KAAA,CAAM,OAAO,GAAG,CAAA;AACrB,MAAA,IAAA,CAAK,WAAA,CAAY,OAAO,GAAG,CAAA;AAC3B,MAAA,IAAI,KAAA,IAAS,KAAK,OAAA,EAAS;AACzB,QAAA,IAAA,CAAK,OAAA,CAAQ,KAAK,KAAK,CAAA;AAAA,MACzB;AAAA,IACF;AAAA,EACF;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAQQ,kBAAA,GAA2B;AACjC,IAAA,IAAI,IAAA,CAAK,YAAY,CAAA,EAAG;AAEtB,MAAA,IAAA,CAAK,MAAM,KAAA,EAAM;AACjB,MAAA,IAAA,CAAK,YAAY,KAAA,EAAM;AACvB,MAAA;AAAA,IACF;AAEA,IAAA,MAAM,mBAAA,GAAsB,GAAA;AAC5B,IAAA,MAAM,cAAA,GAAiB,KAAK,GAAA,CAAI,CAAA,EAAG,KAAK,IAAA,CAAK,IAAA,CAAK,OAAA,GAAU,mBAAmB,CAAC,CAAA;AAGhF,IAAA,MAAM,aAAA,GAAgB,MAAM,IAAA,CAAK,IAAA,CAAK,YAAY,OAAA,EAAS,CAAA,CACxD,IAAA,CAAK,CAAC,GAAG,KAAK,CAAA,EAAG,GAAG,KAAK,CAAA,KAAM,QAAQ,KAAK,CAAA,CAC5C,KAAA,CAAM,CAAA,EAAG,cAAc,CAAA;AAE1B,IAAA,KAAA,MAAW,CAAC,GAAG,CAAA,IAAK,aAAA,EAAe;AACjC,MAAA,MAAM,KAAA,GAAQ,IAAA,CAAK,KAAA,CAAM,GAAA,CAAI,GAAG,CAAA;AAChC,MAAA,IAAA,CAAK,KAAA,CAAM,OAAO,GAAG,CAAA;AACrB,MAAA,IAAA,CAAK,WAAA,CAAY,OAAO,GAAG,CAAA;AAC3B,MAAA,IAAI,KAAA,IAAS,KAAK,OAAA,EAAS;AACzB,QAAA,IAAA,CAAK,OAAA,CAAQ,KAAK,KAAK,CAAA;AAAA,MACzB;AAAA,IACF;AAAA,EACF;AACF,CAAA;;;AC7MO,IAAM,eAAN,MAAmB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EASxB,YAAoB,MAAA,EAAqB;AAArB,IAAA,IAAA,CAAA,MAAA,GAAA,MAAA;AARpB,IAAA,IAAA,CAAQ,QAAA,GAAiC,IAAA;AACzC,IAAA,IAAA,CAAQ,eAAA,GAAiD,IAAA;AAAA,EASzD;AAAA,EA9CF;AAmC0B,IAAA,MAAA,CAAA,IAAA,EAAA,cAAA,CAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAiBxB,MAAc,WAAA,GAAsC;AAClD,IAAA,IAAI,IAAA,CAAK,QAAA,EAAU,OAAO,IAAA,CAAK,QAAA;AAC/B,IAAA,IAAI,IAAA,CAAK,eAAA,EAAiB,OAAO,IAAA,CAAK,eAAA;AAEtC,IAAA,IAAA,CAAK,eAAA,GAAkB,IAAA,CAAK,cAAA,CAAe,IAAA,CAAK,MAAM,CAAA;AACtD,IAAA,IAAA,CAAK,QAAA,GAAW,MAAM,IAAA,CAAK,eAAA;AAC3B,IAAA,OAAO,IAAA,CAAK,QAAA;AAAA,EACd;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAWA,MAAM,GAAA,CAAO,GAAA,EAAa,KAAA,EAAU,GAAA,EAA6B;AAC/D,IAAA,IAAI,CAAC,IAAA,CAAK,MAAA,CAAO,SAAA,EAAW;AAE5B,IAAA,MAAM,QAAA,GAAW,GAAA,IAAO,IAAA,CAAK,MAAA,CAAO,GAAA;AACpC,IAAA,MAAM,KAAA,GAAuB;AAAA,MAC3B,IAAA,EAAM,KAAA;AAAA,MACN,SAAA,EAAW,IAAA,CAAK,GAAA,EAAI,GAAI,WAAWE,cAAAA,CAAe,uBAAA;AAAA,MAClD,SAAA,EAAW,KAAK,GAAA;AAAI,KACtB;AAEA,IAAA,MAAM,QAAA,GAAW,MAAM,IAAA,CAAK,WAAA,EAAY;AACxC,IAAA,MAAM,QAAA,CAAS,GAAA,CAAI,GAAA,EAAK,KAAK,CAAA;AAAA,EAC/B;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EASA,MAAM,IAAO,GAAA,EAAgC;AAC3C,IAAA,IAAI,CAAC,IAAA,CAAK,MAAA,CAAO,SAAA,EAAW,OAAO,IAAA;AAEnC,IAAA,MAAM,QAAA,GAAW,MAAM,IAAA,CAAK,WAAA,EAAY;AACxC,IAAA,MAAM,KAAA,GAAQ,MAAM,QAAA,CAAS,GAAA,CAAO,GAAG,CAAA;AACvC,IAAA,IAAI,CAAC,OAAO,OAAO,IAAA;AAGnB,IAAA,IAAI,IAAA,CAAK,GAAA,EAAI,GAAI,KAAA,CAAM,SAAA,EAAW;AAChC,MAAA,MAAM,QAAA,CAAS,OAAO,GAAG,CAAA;AACzB,MAAA,OAAO,IAAA;AAAA,IACT;AAEA,IAAA,OAAO,KAAA,CAAM,IAAA;AAAA,EACf;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAQA,MAAM,OAAO,GAAA,EAA4B;AACvC,IAAA,IAAI,CAAC,IAAA,CAAK,MAAA,CAAO,SAAA,EAAW;AAC5B,IAAA,MAAM,QAAA,GAAW,MAAM,IAAA,CAAK,WAAA,EAAY;AACxC,IAAA,MAAM,QAAA,CAAS,OAAO,GAAG,CAAA;AAAA,EAC3B;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOA,MAAM,KAAA,GAAuB;AAC3B,IAAA,IAAI,CAAC,IAAA,CAAK,MAAA,CAAO,SAAA,EAAW;AAC5B,IAAA,MAAM,QAAA,GAAW,MAAM,IAAA,CAAK,WAAA,EAAY;AACxC,IAAA,MAAM,SAAS,KAAA,EAAM;AAAA,EACvB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAQA,MAAM,IAAI,GAAA,EAA+B;AACvC,IAAA,IAAI,CAAC,IAAA,CAAK,MAAA,CAAO,SAAA,EAAW,OAAO,KAAA;AAEnC,IAAA,MAAM,QAAA,GAAW,MAAM,IAAA,CAAK,WAAA,EAAY;AACxC,IAAA,MAAM,KAAA,GAAQ,MAAM,QAAA,CAAS,GAAA,CAAI,GAAG,CAAA;AACpC,IAAA,IAAI,CAAC,OAAO,OAAO,KAAA;AAGnB,IAAA,IAAI,IAAA,CAAK,GAAA,EAAI,GAAI,KAAA,CAAM,SAAA,EAAW;AAChC,MAAA,MAAM,QAAA,CAAS,OAAO,GAAG,CAAA;AACzB,MAAA,OAAO,KAAA;AAAA,IACT;AAEA,IAAA,OAAO,IAAA;AAAA,EACT;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOA,MAAM,QAAA,GAAuC;AAC3C,IAAA,MAAM,QAAA,GAAW,MAAM,IAAA,CAAK,WAAA,EAAY;AACxC,IAAA,OAAO,SAAS,QAAA,EAAS;AAAA,EAC3B;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAUA,MAAc,eAAe,MAAA,EAA6C;AACxE,IAAA,QAAQ,OAAO,QAAA;AAAU,MACvB,KAAK,OAAA,EAAS;AACZ,QAAA,IAAI,CAAC,OAAO,WAAA,EAAa;AACvB,UAAA,MAAM,IAAIhB,gBAAAA;AAAA,YACR,0DAAA;AAAA,YACAC,WAAAA,CAAY;AAAA,WACd;AAAA,QACF;AAEA,QAAA,MAAM,EAAE,kBAAA,EAAAgB,mBAAAA,EAAmB,GAAI,MAAM,OAAA,CAAA,OAAA,EAAA,CAAA,IAAA,CAAA,OAAA,UAAA,EAAA,EAAA,aAAA,CAAA,CAAA;AACrC,QAAA,OAAO,IAAIA,mBAAAA,CAAmB,MAAA,CAAO,WAAW,CAAA;AAAA,MAClD;AAAA,MAEA,KAAK,QAAA;AAAA,MACL;AACE,QAAA,OAAO,IAAI,mBAAA,CAAoB,MAAA,CAAO,YAAY,CAAA;AAAA;AACtD,EACF;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOA,MAAM,OAAA,GAAyB;AAC7B,IAAA,IAAI,KAAK,QAAA,EAAU;AACjB,MAAA,MAAM,IAAA,CAAK,SAAS,OAAA,IAAU;AAAA,IAChC;AAAA,EACF;AACF,CAAA;;;ACnLA,IAAM,mBAAA,GAAsB;AAAA,EAC1B,IAAA,EAAM,CAAA;AAAA,EACN,KAAA,EAAO;AACT,CAAA;AAWA,IAAM,kBAAA,GAAN,cAAiC,UAAA,CAQ/B;AAAA,EA3CF;AA2CE,IAAA,MAAA,CAAA,IAAA,EAAA,oBAAA,CAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAIA,SAAS,GAAA,EAAwC;AAC/C,IAAA,OAAO;AAAA,MACL,IAAI,GAAA,CAAI,EAAA;AAAA,MACR,MAAM,GAAA,CAAI,IAAA;AAAA,MACV,aAAa,GAAA,CAAI,WAAA;AAAA,MACjB,SAAS,GAAA,CAAI,QAAA;AAAA,MACb,QAAQ,GAAA,CAAI,MAAA;AAAA,MACZ,QAAQ,GAAA,CAAI,MAAA;AAAA,MACZ,WAAW,GAAA,CAAI,UAAA;AAAA,MACf,SAAA,EAAW,IAAI,IAAA,CAAK,GAAA,CAAI,UAAU,CAAA;AAAA,MAClC,SAAA,EAAW,IAAI,IAAA,CAAK,GAAA,CAAI,UAAU,CAAA;AAAA;AAAA,MAGlC,QAAA,EAAU,IAAI,MAAA,KAAW,QAAA;AAAA,MACzB,cAAA,kBAAgB,MAAA,CAAA,MAAM,OAAA,CAAQ,GAAA,CAAI,WAAW,CAAA,EAA7B,gBAAA;AAAA,KAClB;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKA,YAAY,IAAA,EAAgD;AAC1D,IAAA,OAAO;AAAA,MACL,IAAA,EAAM,UAAA,CAAW,IAAA,CAAK,IAAI,CAAA,IAAK,EAAA;AAAA,MAC/B,MAAA,EAAQ,KAAK,MAAA,IAAU,CAAA;AAAA,MACvB,WAAA,EAAa,KAAK,WAAA,IAAe,EAAA;AAAA,MACjC,UAAA,EAAY,KAAK,SAAA,IAAa;AAAA,KAChC;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKA,YAAY,IAAA,EAAgD;AAC1D,IAAA,OAAO,IAAA,CAAK,YAAY,IAAI,CAAA;AAAA,EAC9B;AAAA;AAAA;AAAA;AAAA,EAKA,WAAW,IAAA,EAA+C;AACxD,IAAA,MAAM,MAAuB,EAAC;AAE9B,IAAA,IAAI,IAAA,CAAK,SAAS,MAAA,EAAW;AAC3B,MAAA,GAAA,CAAI,IAAA,GAAO,UAAA,CAAW,IAAA,CAAK,IAAI,CAAA;AAAA,IACjC;AACA,IAAA,IAAI,IAAA,CAAK,WAAW,MAAA,EAAW;AAC7B,MAAA,GAAA,CAAI,SAAS,IAAA,CAAK,MAAA;AAAA,IACpB;AACA,IAAA,IAAI,IAAA,CAAK,gBAAgB,MAAA,EAAW;AAClC,MAAA,GAAA,CAAI,WAAA,GAAc,KAAK,WAAA,IAAe,MAAA;AAAA,IACxC;AACA,IAAA,IAAI,IAAA,CAAK,cAAc,MAAA,EAAW;AAChC,MAAA,GAAA,CAAI,aAAa,IAAA,CAAK,SAAA;AAAA,IACxB;AAEA,IAAA,OAAO,GAAA;AAAA,EACT;AAAA;AAAA;AAAA;AAAA,EAKA,WAAW,OAAA,EAAoD;AAC7D,IAAA,OAAO;AAAA,MACL,IAAA,EAAM,OAAA,CAAQ,IAAA,IAAQ,mBAAA,CAAoB,IAAA;AAAA,MAC1C,KAAA,EAAO,OAAA,CAAQ,KAAA,IAAS,mBAAA,CAAoB,KAAA;AAAA,MAC5C,OAAA,EAAS,QAAQ,OAAA,IAAW,YAAA;AAAA,MAC5B,UAAA,EAAY,QAAQ,UAAA,IAAc,MAAA;AAAA,MAClC,QAAQ,OAAA,CAAQ,MAAA;AAAA,MAChB,YAAY,OAAA,CAAQ,UAAA;AAAA,MACpB,YAAY,OAAA,CAAQ,UAAA;AAAA,MACpB,YAAY,OAAA,CAAQ,UAAA;AAAA,MACpB,QAAQ,OAAA,CAAQ;AAAA,KAClB;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKA,aAAa,MAAA,EAAyC;AACpD,IAAA,OAAO;AAAA,MACL,IAAI,MAAA,CAAO,EAAA;AAAA,MACX,MAAM,MAAA,CAAO,IAAA;AAAA,MACb,aAAa,MAAA,CAAO,WAAA;AAAA,MACpB,SAAS,MAAA,CAAO,OAAA;AAAA,MAChB,QAAQ,MAAA,CAAO,MAAA;AAAA,MACf,QAAQ,MAAA,CAAO,MAAA;AAAA,MACf,WAAW,MAAA,CAAO,SAAA;AAAA,MAClB,SAAA,EAAW,MAAA,CAAO,SAAA,CAAU,WAAA,EAAY;AAAA,MACxC,SAAA,EAAW,MAAA,CAAO,SAAA,CAAU,WAAA,EAAY;AAAA,MACxC,UAAU,MAAA,CAAO,QAAA;AAAA,MACjB,UAAA,EAAY;AAAA,KACd;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKA,eAAe,KAAA,EAAwC;AACrD,IAAA,OAAO;AAAA,MACL,IAAI,KAAA,CAAM,EAAA;AAAA,MACV,MAAM,KAAA,CAAM,IAAA;AAAA,MACZ,aAAa,KAAA,CAAM,WAAA;AAAA,MACnB,SAAS,KAAA,CAAM,OAAA;AAAA,MACf,QAAQ,KAAA,CAAM,MAAA;AAAA,MACd,QAAQ,KAAA,CAAM,MAAA;AAAA,MACd,WAAW,KAAA,CAAM,SAAA;AAAA,MACjB,SAAA,EAAW,IAAI,IAAA,CAAK,KAAA,CAAM,SAAS,CAAA;AAAA,MACnC,SAAA,EAAW,IAAI,IAAA,CAAK,KAAA,CAAM,SAAS,CAAA;AAAA,MACnC,UAAU,KAAA,CAAM,QAAA;AAAA,MAChB,cAAA,kBAAgB,MAAA,CAAA,MAAM,OAAA,CAAQ,KAAA,CAAM,WAAW,CAAA,EAA/B,gBAAA;AAAA,KAClB;AAAA,EACF;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,cAAc,GAAA,EAUS;AACrB,IAAA,OAAO;AAAA,MACL,IAAI,GAAA,CAAI,EAAA;AAAA,MACR,MAAM,GAAA,CAAI,IAAA;AAAA,MACV,aAAa,GAAA,CAAI,WAAA;AAAA,MACjB,QAAQ,GAAA,CAAI,MAAA;AAAA,MACZ,UAAU,GAAA,CAAI,QAAA;AAAA,MACd,QAAQ,GAAA,CAAI,MAAA;AAAA,MACZ,YAAY,GAAA,CAAI,UAAA;AAAA,MAChB,YAAY,GAAA,CAAI,UAAA;AAAA,MAChB,YAAY,GAAA,CAAI;AAAA,KAClB;AAAA,EACF;AACF,CAAA;;;AC5HA,IAAM,2BAAA,GAA8B,GAAA;AA6C7B,IAAM,4BAAA,GAAN,MAAM,6BAAA,SAAqC,yBAAA,CAahD;AAAA;AAAA;AAAA;AAAA,EA4DA,WAAA,CAAY,MAAA,GAAwC,EAAC,EAAG,OAAA,EAAoC;AAC1F,IAAA,MAAM,WAAA,GAAc,OAAO,WAAA,IAAe,eAAA;AAE1C,IAAA,KAAA,CAAM;AAAA,MACJ,WAAA,EAAa,wBAAA;AAAA,MACb,iBAAA,EAAmB,CAAC,UAAU,CAAA;AAAA;AAAA,MAE9B,iBAAiB,OAAA,EAAS,SAAA,EAAW,OAAA,IAAW,EAAE,SAAS,WAAA,EAAY;AAAA,MACvE,aAAA,EAAe;AAAA,QACb,OAAA,EAAS,IAAA;AAAA,QACT,WAAA;AAAA,QACA,SAAA,EAAW,KAAA;AAAA,QACX,eAAA,EAAiB,CAAA;AAAA,QACjB,GAAG,MAAA;AAAA;AAAA;AAAA;AAAA,QAIH,QAAA,EAAU;AAAA,UACR,QAAA,gCAAgB,KAAA,KAAS;AAEvB,YAAA,OAAO,IAAA,CAAK,SAAA,CAAU,GAAA,CAA0B,WAAA,EAAa;AAAA,cAC3D,MAAA,EAAQ;AAAA,aACT,CAAA;AAAA,UACH,CAAA,EALU,UAAA,CAAA;AAAA,UAMV,SAAA,gCAAiB,EAAA,KAAM;AACrB,YAAA,OAAO,KAAK,SAAA,CAAU,GAAA,CAAwB,GAAG,WAAW,CAAA,CAAA,EAAI,EAAE,CAAA,CAAE,CAAA;AAAA,UAGtE,CAAA,EAJW,WAAA,CAAA;AAAA,UAKX,MAAA,gCAAc,IAAA,KAAQ;AACpB,YAAA,OAAO,IAAA,CAAK,SAAA,CAAU,IAAA,CAAyB,WAAA,EAAa,IAAI,CAAA;AAAA,UAGlE,CAAA,EAJQ,QAAA,CAAA;AAAA,UAKR,MAAA,gCAAc,OAAA,KAAW;AACvB,YAAA,MAAM,EAAE,EAAA,EAAI,IAAA,EAAK,GAAI,OAAA;AACrB,YAAA,OAAO,KAAK,SAAA,CAAU,KAAA;AAAA,cACpB,CAAA,EAAG,WAAW,CAAA,CAAA,EAAI,EAAE,CAAA,CAAA;AAAA,cACpB;AAAA,aACF;AAAA,UACF,CAAA,EANQ,QAAA,CAAA;AAAA,UAOR,MAAA,gCAAc,EAAA,KAAM;AAClB,YAAA,OAAO,KAAK,SAAA,CAAU,MAAA,CAAO,GAAG,WAAW,CAAA,CAAA,EAAI,EAAE,CAAA,CAAE,CAAA;AAAA,UACrD,CAAA,EAFQ,QAAA;AAAA;AAGV;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,OAiBF;AAAA,MACA,WAAA,EAAa,kBAAA;AAAA,MACb,UAAU,OAAA,EAAS;AAAA,KACpB,CAAA;AAnHH;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,IAAA,IAAA,CAAU,WAAA,GAAc,SAAA;AAKxB;AAAA;AAAA;AAAA,IAAA,IAAA,CAAU,kBAAkBR,UAAAA,CAAW,OAAA;AAYvC;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,IAAA,IAAA,CAAQ,YAAA,GAAsD,IAAA;AAqG5D,IAAA,IAAI,KAAK,MAAA,CAAO,eAAA,IAAmB,IAAA,CAAK,MAAA,CAAO,kBAAkB,CAAA,EAAG;AAClE,MAAA,IAAA,CAAK,YAAA,EAAa;AAAA,IACpB;AAAA,EACF;AAAA,EA5PF;AA0HE,IAAA,MAAA,CAAA,IAAA,EAAA,8BAAA,CAAA;AAAA;AAAA,EAgCA;AAAA;AAAA;AAAA;AAAA,IAAA,IAAA,CAAgB,aAAa,YAAA,CAAa,gBAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAM1C,aAAa,MAAA,CACX,MAAA,EACA,OAAA,EACuC;AACvC,IAAA,MAAM,YAAA,GAA8C;AAAA,MAClD,GAAG,MAAA;AAAA,MACH,aAAa,MAAA,CAAO,WAAA,IAAe,OAAA,EAAS,SAAA,EAAW,SAAS,OAAA,IAAW;AAAA,KAC7E;AAEA,IAAA,MAAM,OAAA,GAAU,IAAI,6BAAA,CAA6B,YAAA,EAAc,OAAO,CAAA;AAEtE,IAAA,IAAI,aAAa,SAAA,EAAW;AAC1B,MAAA,MAAM,QAAQ,QAAA,EAAS;AAAA,IACzB;AAEA,IAAA,OAAO,OAAA;AAAA,EACT;AAAA;AAAA;AAAA;AAAA,EAkFA,WAAA,GAAuB;AACrB,IAAA,OAAO,IAAA,CAAK,gBAAA,IAAoB,OAAO,MAAA,KAAW,WAAA;AAAA,EACpD;AAAA,EAEA,OAAA,GAAgB;AACd,IAAA,IAAA,CAAK,WAAA,EAAY;AACjB,IAAA,IAAA,CAAK,QAAQ,kBAAkB,CAAA;AAAA,EACjC;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAUA,MAAyB,cAAc,QAAA,EAA0C;AAG/E,IAAA,gBAAA,CAAiB,IAAA,CAAK,sBAAA,EAAwB,EAAE,KAAA,EAAO,UAAU,CAAA;AAAA,EACnE;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,EAwCA,EAAA,CAAG,OAAiC,OAAA,EAA8C;AAChF,IAAA,OAAO,gBAAA,CAAiB,EAAA,CAAG,KAAA,EAAO,OAAO,CAAA;AAAA,EAC3C;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAUA,YAAA,GAAqB;AACnB,IAAA,IAAI,KAAK,YAAA,EAAc;AAEvB,IAAA,MAAM,QAAA,GAAW,IAAA,CAAK,MAAA,CAAO,eAAA,IAAmB,2BAAA;AAChD,IAAA,IAAA,CAAK,YAAA,GAAe,YAAY,MAAM;AACpC,MAAA,IAAA,CAAK,QAAA,EAAS,CAAE,KAAA,CAAM,CAAA,KAAA,KAAS;AAC7B,QAAA,IAAA,CAAK,QAAA,CAAS,sBAAA,EAAwB,EAAE,KAAA,EAAO,CAAA;AAAA,MACjD,CAAC,CAAA;AAAA,IACH,GAAG,QAAQ,CAAA;AAEX,IAAA,IAAA,CAAK,QAAA,CAAS,iBAAA,EAAmB,EAAE,QAAA,EAAU,CAAA;AAAA,EAC/C;AAAA;AAAA;AAAA;AAAA,EAKA,WAAA,GAAoB;AAClB,IAAA,IAAI,KAAK,YAAA,EAAc;AACrB,MAAA,aAAA,CAAc,KAAK,YAAY,CAAA;AAC/B,MAAA,IAAA,CAAK,YAAA,GAAe,IAAA;AACpB,MAAA,IAAA,CAAK,SAAS,iBAAiB,CAAA;AAAA,IACjC;AAAA,EACF;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,EAgCA,MAAM,YAAY,OAAA,EAAqD;AACrE,IAAA,OAAO,IAAA,CAAK,SAAS,OAAO,CAAA;AAAA,EAC9B;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,MAAM,iBAAA,GAA8C;AAClD,IAAA,OAAO,IAAA,CAAK,QAAA,CAAS,EAAE,MAAA,EAAQ,UAAU,CAAA;AAAA,EAC3C;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,MAAM,gBAAA,GAA6C;AACjD,IAAA,OAAO,IAAA,CAAK,QAAA,CAAS,EAAE,MAAA,EAAQ,SAAS,CAAA;AAAA,EAC1C;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,MAAM,mBAAA,GAAgD;AACpD,IAAA,OAAO,IAAA,CAAK,QAAA,CAAS,EAAE,MAAA,EAAQ,YAAY,CAAA;AAAA,EAC7C;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAgBF;AC9YO,IAAM,yBAAA,GAAN,MAAM,0BAAA,CAA0B;AAAA,EAAhC,WAAA,GAAA;AACL,IAAA,IAAA,CAAQ,UAAuC,EAAC;AAAA,EAAA;AAAA,EA9BlD;AA6BuC,IAAA,MAAA,CAAA,IAAA,EAAA,2BAAA,CAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EASrC,UAAU,MAAA,EAAsB;AAC9B,IAAA,IAAA,CAAK,QAAQ,MAAA,GAAS,MAAA;AACtB,IAAA,OAAO,IAAA;AAAA,EACT;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAQA,aAAa,SAAA,EAAyB;AACpC,IAAA,IAAA,CAAK,QAAQ,SAAA,GAAY,SAAA;AACzB,IAAA,OAAO,IAAA;AAAA,EACT;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAQA,YAAY,QAAA,EAAwB;AAClC,IAAA,IAAA,CAAK,QAAQ,QAAA,GAAW,QAAA;AACxB,IAAA,OAAO,IAAA;AAAA,EACT;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAQA,WAAW,OAAA,EAAuB;AAChC,IAAA,IAAA,CAAK,QAAQ,OAAA,GAAU,OAAA;AACvB,IAAA,OAAO,IAAA;AAAA,EACT;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAQA,YAAY,QAAA,EAA8C;AACxD,IAAA,IAAA,CAAK,QAAQ,QAAA,GAAW,QAAA;AACxB,IAAA,OAAO,IAAA;AAAA,EACT;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAQA,WAAW,OAAA,EAAuB;AAChC,IAAA,IAAA,CAAK,QAAQ,OAAA,GAAU,OAAA;AACvB,IAAA,OAAO,IAAA;AAAA,EACT;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAQA,eAAe,WAAA,EAA6D;AAC1E,IAAA,IAAA,CAAK,QAAQ,WAAA,GAAc,WAAA;AAC3B,IAAA,OAAO,IAAA;AAAA,EACT;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAQA,UAAU,MAAA,EAAuC;AAC/C,IAAA,IAAA,CAAK,OAAA,CAAQ,SAAS,EAAE,GAAG,KAAK,OAAA,CAAQ,MAAA,EAAQ,GAAG,MAAA,EAAO;AAC1D,IAAA,OAAO,IAAA;AAAA,EACT;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EASA,iBAAA,CAAkB,KAAa,KAAA,EAAsB;AACnD,IAAA,IAAA,CAAK,OAAA,CAAQ,WAAW,EAAC;AACzB,IAAA,IAAA,CAAK,OAAA,CAAQ,MAAA,CAAO,GAAG,CAAA,GAAI,KAAA;AAC3B,IAAA,OAAO,IAAA;AAAA,EACT;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EASA,KAAA,GAA4B;AAC1B,IAAA,OAAO;AAAA,MACL,WAAA,EAAa,IAAA,CAAK,OAAA,CAAQ,WAAA,IAAe,aAAA;AAAA,MACzC,MAAA,EAAQ,KAAK,OAAA,CAAQ,MAAA;AAAA,MACrB,SAAA,EAAW,KAAK,OAAA,CAAQ,SAAA;AAAA,MACxB,QAAA,EAAU,KAAK,OAAA,CAAQ,QAAA;AAAA,MACvB,OAAA,EAAS,KAAK,OAAA,CAAQ,OAAA;AAAA,MACtB,QAAA,EAAU,KAAK,OAAA,CAAQ,QAAA;AAAA,MACvB,OAAA,EAAS,KAAK,OAAA,CAAQ,OAAA;AAAA,MACtB,MAAA,EAAQ,KAAK,OAAA,CAAQ;AAAA,KACvB;AAAA,EACF;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOA,KAAA,GAAc;AACZ,IAAA,IAAA,CAAK,UAAU,EAAC;AAChB,IAAA,OAAO,IAAA;AAAA,EACT;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOA,KAAA,GAAmC;AACjC,IAAA,MAAM,MAAA,GAAS,IAAI,0BAAA,EAA0B;AAC7C,IAAA,MAAA,CAAO,OAAA,GAAU,EAAE,GAAG,IAAA,CAAK,OAAA,EAAQ;AACnC,IAAA,IAAI,IAAA,CAAK,QAAQ,MAAA,EAAQ;AACvB,MAAA,MAAA,CAAO,QAAQ,MAAA,GAAS,EAAE,GAAG,IAAA,CAAK,QAAQ,MAAA,EAAO;AAAA,IACnD;AACA,IAAA,OAAO,MAAA;AAAA,EACT;AACF,CAAA;AAKO,IAAM,YAAA,GAAe;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAQ1B,sBAAA,CACE,WAAA,EACA,QAAA,GAAyC,KAAA,EACrB;AACpB,IAAA,OAAO,IAAI,2BAA0B,CAClC,cAAA,CAAe,WAAW,CAAA,CAC1B,WAAA,CAAY,QAAQ,CAAA,CACpB,KAAA,EAAM;AAAA,EACX,CAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAQA,kBAAkB,MAAA,EASK;AACrB,IAAA,MAAM,OAAA,GAAU,IAAI,yBAAA,EAA0B,CAC3C,SAAA,CAAU,OAAO,MAAM,CAAA,CACvB,cAAA,CAAe,MAAA,CAAO,WAAW,CAAA;AAEpC,IAAA,IAAI,MAAA,CAAO,SAAA,EAAW,OAAA,CAAQ,YAAA,CAAa,OAAO,SAAS,CAAA;AAC3D,IAAA,IAAI,MAAA,CAAO,QAAA,EAAU,OAAA,CAAQ,WAAA,CAAY,OAAO,QAAQ,CAAA;AACxD,IAAA,IAAI,MAAA,CAAO,QAAA,EAAU,OAAA,CAAQ,WAAA,CAAY,OAAO,QAAQ,CAAA;AACxD,IAAA,IAAI,MAAA,CAAO,OAAA,EAAS,OAAA,CAAQ,UAAA,CAAW,OAAO,OAAO,CAAA;AACrD,IAAA,IAAI,MAAA,CAAO,OAAA,EAAS,OAAA,CAAQ,UAAA,CAAW,OAAO,OAAO,CAAA;AACrD,IAAA,IAAI,MAAA,CAAO,MAAA,EAAQ,OAAA,CAAQ,SAAA,CAAU,OAAO,MAAM,CAAA;AAElD,IAAA,OAAO,QAAQ,KAAA,EAAM;AAAA,EACvB,CAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAQA,oBAAA,CAAqB,SAAA,GAAyC,EAAC,EAAuB;AACpF,IAAA,OAAO;AAAA,MACL,WAAA,EAAa,aAAA;AAAA,MACb,QAAA,EAAU,KAAA;AAAA,MACV,GAAG;AAAA,KACL;AAAA,EACF,CAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAQA,gBAAgB,OAAA,EAGd;AACA,IAAA,MAAM,SAAmB,EAAC;AAE1B,IAAA,IAAI,CAAC,QAAQ,WAAA,EAAa;AACxB,MAAA,MAAA,CAAO,KAAK,yBAAyB,CAAA;AAAA,IACvC,CAAA,MAAA,IAAW,CAAC,CAAC,aAAA,EAAe,SAAA,EAAW,YAAY,CAAA,CAAE,QAAA,CAAS,OAAA,CAAQ,WAAW,CAAA,EAAG;AAClF,MAAA,MAAA,CAAO,KAAK,yDAAyD,CAAA;AAAA,IACvE;AAEA,IAAA,IAAI,OAAA,CAAQ,QAAA,IAAY,CAAC,CAAC,KAAA,EAAO,QAAA,EAAU,SAAS,CAAA,CAAE,QAAA,CAAS,OAAA,CAAQ,QAAQ,CAAA,EAAG;AAChF,MAAA,MAAA,CAAO,KAAK,0CAA0C,CAAA;AAAA,IACxD;AAEA,IAAA,IAAI,QAAQ,OAAA,IAAW,OAAA,CAAQ,OAAA,CAAQ,MAAA,KAAW,cAAc,uBAAA,EAAyB;AACvF,MAAA,MAAA,CAAO,KAAK,6CAA6C,CAAA;AAAA,IAC3D;AAEA,IAAA,OAAO;AAAA,MACL,OAAA,EAAS,OAAO,MAAA,KAAW,CAAA;AAAA,MAC3B;AAAA,KACF;AAAA,EACF,CAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAQA,iBAAiB,QAAA,EAA6D;AAC5E,IAAA,MAAM,MAAA,GAAS,QAAA,CAAS,MAAA,CAAO,CAAC,KAAK,OAAA,KAAY;AAC/C,MAAA,MAAM,MAAA,GAAS;AAAA,QACb,GAAG,GAAA;AAAA,QACH,GAAG;AAAA,OACL;AAGA,MAAA,IAAI,GAAA,CAAI,MAAA,IAAU,OAAA,CAAQ,MAAA,EAAQ;AAChC,QAAA,MAAA,CAAO,MAAA,GAAS;AAAA,UACd,GAAG,GAAA,CAAI,MAAA;AAAA,UACP,GAAG,OAAA,CAAQ;AAAA,SACb;AAAA,MACF;AAEA,MAAA,OAAO,MAAA;AAAA,IACT,CAAA,EAAG,EAAiC,CAAA;AAEpC,IAAA,MAAA,CAAO,WAAA,KAAgB,aAAA;AAEvB,IAAA,OAAO,MAAA;AAAA,EACT,CAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EASA,eAAA,CAAgB,OAAe,OAAA,EAAsC;AACnE,IAAA,MAAM,cAAA,GAAiB;AAAA,MACrB,MAAA,kBAAQ,MAAA,CAAA,CAAC,GAAA,KAA4B,GAAA,CAAI,MAAA,EAAjC,QAAA,CAAA;AAAA,MACR,SAAA,kBAAW,MAAA,CAAA,CAAC,GAAA,KAA4B,GAAA,CAAI,SAAA,EAAjC,WAAA,CAAA;AAAA,MACX,QAAA,kBAAU,MAAA,CAAA,CAAC,GAAA,KAA4B,GAAA,CAAI,QAAA,EAAjC,UAAA,CAAA;AAAA,MACV,OAAA,kBAAS,MAAA,CAAA,CAAC,GAAA,KAA4B,GAAA,CAAI,OAAA,EAAjC,SAAA,CAAA;AAAA,MACT,QAAA,kBAAU,MAAA,CAAA,CAAC,GAAA,KAA4B,GAAA,CAAI,QAAA,EAAjC,UAAA,CAAA;AAAA,MACV,OAAA,kBAAS,MAAA,CAAA,CAAC,GAAA,KAA4B,GAAA,CAAI,OAAA,EAAjC,SAAA,CAAA;AAAA,MACT,WAAA,kBAAa,MAAA,CAAA,CAAC,GAAA,KAA4B,GAAA,CAAI,WAAA,EAAjC,aAAA,CAAA;AAAA,MACb,MAAA,kBAAQ,MAAA,CAAA,CAAC,GAAA,KAA4B,GAAA,CAAI,MAAA,EAAjC,QAAA;AAAA,KACV;AAEA,IAAA,IAAI,SAAS,cAAA,EAAgB;AAC3B,MAAA,OAAO,cAAA,CAAe,KAAoC,CAAA,CAAE,OAAO,CAAA;AAAA,IACrE;AAEA,IAAA,OAAO,OAAA,CAAQ,SAAS,KAAK,CAAA;AAAA,EAC/B,CAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAQA,kBAAkB,OAAA,EAAqC;AACrD,IAAA,MAAM,QAAA,GAAW;AAAA,MACf,QAAQ,OAAA,CAAQ,MAAA;AAAA,MAChB,UAAU,OAAA,CAAQ,QAAA;AAAA,MAClB,aAAa,OAAA,CAAQ,WAAA;AAAA,MACrB,UAAU,OAAA,CAAQ,QAAA;AAAA,MAClB,SAAS,OAAA,CAAQ,OAAA;AAAA,MACjB,SAAS,OAAA,CAAQ,OAAA;AAAA,MACjB,QAAQ,OAAA,CAAQ;AAAA,KAClB;AAGA,IAAA,MAAM,WAAW,MAAA,CAAO,OAAA,CAAQ,QAAQ,CAAA,CACrC,MAAA,CAAO,CAAC,GAAG,KAAK,CAAA,KAAM,KAAA,KAAU,MAAS,CAAA,CACzC,IAAA,CAAK,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,MAAM,CAAA,CAAE,aAAA,CAAc,CAAC,CAAC,CAAA,CACrC,OAAO,CAAC,GAAA,EAAK,CAAC,GAAA,EAAK,KAAK,OAAO,EAAE,GAAG,KAAK,CAAC,GAAG,GAAG,KAAA,EAAM,CAAA,EAAI,EAAE,CAAA;AAE/D,IAAA,OAAO,IAAA,CAAK,UAAU,QAAQ,CAAA;AAAA,EAChC,CAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EASA,eAAA,CACE,OAAA,EACA,eAAA,GAA4B,CAAC,WAAW,CAAA,EACpB;AACpB,IAAA,MAAM,SAAA,GAAY,EAAE,GAAG,OAAA,EAAQ;AAG/B,IAAA,IAAI,QAAQ,MAAA,EAAQ;AAClB,MAAA,SAAA,CAAU,MAAA,GAAS,EAAE,GAAG,OAAA,CAAQ,MAAA,EAAO;AAAA,IACzC;AAEA,IAAA,KAAA,MAAW,SAAS,eAAA,EAAiB;AACnC,MAAA,IAAI,SAAS,SAAA,EAAW;AACtB,QAAA,OAAQ,UAAsC,KAAK,CAAA;AAAA,MACrD;AACA,MAAA,IAAI,SAAA,CAAU,MAAA,IAAU,KAAA,IAAS,SAAA,CAAU,MAAA,EAAQ;AACjD,QAAA,OAAO,SAAA,CAAU,OAAO,KAAK,CAAA;AAAA,MAC/B;AAAA,IACF;AAEA,IAAA,OAAO,SAAA;AAAA,EACT;AACF,CAAA;AC7WO,SAAS,yBAAA,CACd,WACA,YAAA,EACS;AACT,EAAA,MAAM,EAAE,UAAS,GAAI,SAAA;AAErB,EAAA,IAAI,kBAAA,CAAmB,QAAQ,CAAA,EAAG;AAChC,IAAA,OAAO,wBAAA,CAAyB,QAAA,EAAU,YAAA,EAAc,SAAA,CAAU,KAAK,CAAA;AAAA,EACzE;AAEA,EAAA,IAAI,gBAAA,CAAiB,QAAQ,CAAA,EAAG;AAC9B,IAAA,OAAO,sBAAA,CAAuB,QAAA,EAAU,YAAA,EAAc,SAAA,CAAU,KAAK,CAAA;AAAA,EACvE;AAEA,EAAA,IAAI,eAAA,CAAgB,QAAQ,CAAA,EAAG;AAC7B,IAAA,OAAO,qBAAA,CAAsB,QAAA,EAAU,SAAA,CAAU,KAAA,EAAO,YAAY,CAAA;AAAA,EACtE;AAEA,EAAA,IAAI,iBAAA,CAAkB,QAAQ,CAAA,EAAG;AAC/B,IAAA,OAAO,uBAAA,CAAwB,QAAA,EAAU,YAAA,EAAc,SAAA,CAAU,KAAK,CAAA;AAAA,EACxE;AAEA,EAAA,OAAO,KAAA;AACT;AAvBgB,MAAA,CAAA,yBAAA,EAAA,2BAAA,CAAA;AA+BT,SAAS,mBAAmB,QAAA,EAA2B;AAC5D,EAAA,OAAO,QAAA,KAAa,YAAY,QAAA,KAAa,YAAA;AAC/C;AAFgB,MAAA,CAAA,kBAAA,EAAA,oBAAA,CAAA;AAUT,SAAS,iBAAiB,QAAA,EAA2B;AAC1D,EAAA,OAAO,QAAA,KAAa,cAAc,QAAA,KAAa,cAAA;AACjD;AAFgB,MAAA,CAAA,gBAAA,EAAA,kBAAA,CAAA;AAUT,SAAS,gBAAgB,QAAA,EAA2B;AACzD,EAAA,OAAO,QAAA,KAAa,QAAQ,QAAA,KAAa,QAAA;AAC3C;AAFgB,MAAA,CAAA,eAAA,EAAA,iBAAA,CAAA;AAUT,SAAS,kBAAkB,QAAA,EAA2B;AAC3D,EAAA,OAAO,QAAA,KAAa,kBAAkB,QAAA,KAAa,WAAA;AACrD;AAFgB,MAAA,CAAA,iBAAA,EAAA,mBAAA,CAAA;AAYT,SAAS,wBAAA,CACd,QAAA,EACA,YAAA,EACA,cAAA,EACS;AACT,EAAA,MAAM,UAAU,YAAA,KAAiB,cAAA;AACjC,EAAA,OAAO,QAAA,KAAa,QAAA,GAAW,OAAA,GAAU,CAAC,OAAA;AAC5C;AAPgB,MAAA,CAAA,wBAAA,EAAA,0BAAA,CAAA;AAiBT,SAAS,sBAAA,CACd,QAAA,EACA,YAAA,EACA,cAAA,EACS;AAET,EAAA,IAAI,OAAO,YAAA,KAAiB,QAAA,IAAY,OAAO,mBAAmB,QAAA,EAAU;AAC1E,IAAA,MAAM,QAAA,GAAW,YAAA,CAAa,QAAA,CAAS,cAAc,CAAA;AACrD,IAAA,OAAO,QAAA,KAAa,UAAA,GAAa,QAAA,GAAW,CAAC,QAAA;AAAA,EAC/C;AAGA,EAAA,IAAI,MAAM,OAAA,CAAQ,YAAY,CAAA,IAAK,OAAO,mBAAmB,QAAA,EAAU;AACrE,IAAA,MAAM,QAAA,GAAW,YAAA,CAAa,QAAA,CAAS,cAAc,CAAA;AACrD,IAAA,OAAO,QAAA,KAAa,UAAA,GAAa,QAAA,GAAW,CAAC,QAAA;AAAA,EAC/C;AAGA,EAAA,OAAO,QAAA,KAAa,cAAA;AACtB;AAnBgB,MAAA,CAAA,sBAAA,EAAA,wBAAA,CAAA;AA6BT,SAAS,qBAAA,CACd,QAAA,EACA,cAAA,EACA,YAAA,EACS;AACT,EAAA,IAAI,CAAC,KAAA,CAAM,OAAA,CAAQ,cAAc,CAAA,EAAG;AAElC,IAAA,OAAO,QAAA,KAAa,QAAA;AAAA,EACtB;AAEA,EAAA,MAAM,UAAA,GAAa,cAAA,CAAe,QAAA,CAAS,YAAY,CAAA;AACvD,EAAA,OAAO,QAAA,KAAa,IAAA,GAAO,UAAA,GAAa,CAAC,UAAA;AAC3C;AAZgB,MAAA,CAAA,qBAAA,EAAA,uBAAA,CAAA;AAsBhB,SAAS,aAAA,CAAiB,QAAA,EAAkB,IAAA,EAAS,KAAA,EAAmB;AACtE,EAAA,QAAQ,QAAA;AAAU,IAChB,KAAK,cAAA;AACH,MAAA,OAAO,IAAA,GAAO,KAAA;AAAA,IAChB,KAAK,WAAA;AACH,MAAA,OAAO,IAAA,GAAO,KAAA;AAAA,IAChB;AACE,MAAA,OAAO,KAAA;AAAA;AAEb;AATS,MAAA,CAAA,aAAA,EAAA,eAAA,CAAA;AAWF,SAAS,uBAAA,CACd,QAAA,EACA,YAAA,EACA,cAAA,EACS;AAET,EAAA,MAAM,UAAA,GAAa,OAAO,YAAY,CAAA;AACtC,EAAA,MAAM,YAAA,GAAe,OAAO,cAAc,CAAA;AAE1C,EAAA,IAAI,CAAC,KAAA,CAAM,UAAU,KAAK,CAAC,KAAA,CAAM,YAAY,CAAA,EAAG;AAC9C,IAAA,OAAO,aAAA,CAAc,QAAA,EAAU,UAAA,EAAY,YAAY,CAAA;AAAA,EACzD;AAGA,EAAA,IAAI,OAAO,YAAA,KAAiB,QAAA,IAAY,OAAO,mBAAmB,QAAA,EAAU;AAC1E,IAAA,OAAO,aAAA,CAAc,QAAA,EAAU,YAAA,EAAc,cAAc,CAAA;AAAA,EAC7D;AAEA,EAAA,OAAO,KAAA;AACT;AAnBgB,MAAA,CAAA,uBAAA,EAAA,yBAAA,CAAA;;;ACtIT,IAAM,oBAAN,MAAuD;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAoB5D,WAAA,CACU,QAAA,EACA,gBAAA,GAAmB,KAAA,EAC3B;AAFQ,IAAA,IAAA,CAAA,QAAA,GAAA,QAAA;AACA,IAAA,IAAA,CAAA,gBAAA,GAAA,gBAAA;AApBV;AAAA,IAAA,IAAA,CAAiB,MAAA,GAAS,IAAIP,aAAAA,CAAc;AAAA,MAC1C,WAAA,EAAa,MAAA;AAAA,MACb,OAAA,EAAS;AAAA,KACV,CAAA;AAGD;AAAA,IAAA,IAAA,CAAQ,KAAA,uBAA8D,GAAA,EAAI;AAE1E;AAAA,IAAA,IAAA,CAAQ,KAAA,uBAAoE,GAAA,EAAI;AAEhF;AAAA,IAAA,IAAA,CAAQ,SAAA,uBAAuD,GAAA,EAAI;AAAA,EAWhE;AAAA,EA7DL;AAsC8D,IAAA,MAAA,CAAA,IAAA,EAAA,mBAAA,CAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EA+B5D,SAAS,KAAA,EAA4C;AACnD,IAAA,IAAA,CAAK,MAAM,KAAA,EAAM;AACjB,IAAA,IAAA,CAAK,MAAM,KAAA,EAAM;AAEjB,IAAA,KAAA,MAAW,QAAQ,KAAA,EAAO;AACxB,MAAA,IAAA,CAAK,KAAA,CAAM,GAAA,CAAI,IAAA,CAAK,GAAA,EAAK,IAAI,CAAA;AAAA,IAC/B;AAEA,IAAA,IAAA,CAAK,GAAA,CAAI,eAAA,EAAiB,IAAA,CAAK,KAAA,CAAM,IAAI,CAAA;AAAA,EAC3C;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAQA,SAAS,KAAA,EAAgD;AACvD,IAAA,IAAA,CAAK,MAAM,KAAA,EAAM;AAEjB,IAAA,KAAA,MAAW,QAAQ,KAAA,EAAO;AACxB,MAAA,MAAM,WAAW,IAAA,CAAK,KAAA,CAAM,IAAI,IAAA,CAAK,OAAO,KAAK,EAAC;AAClD,MAAA,QAAA,CAAS,KAAK,IAAI,CAAA;AAElB,MAAA,QAAA,CAAS,KAAK,CAAC,CAAA,EAAG,MAAM,CAAA,CAAE,QAAA,GAAW,EAAE,QAAQ,CAAA;AAC/C,MAAA,IAAA,CAAK,KAAA,CAAM,GAAA,CAAI,IAAA,CAAK,OAAA,EAAS,QAAQ,CAAA;AAAA,IACvC;AAEA,IAAA,IAAA,CAAK,GAAA,CAAI,eAAA,EAAiB,KAAA,CAAM,MAAM,CAAA;AAAA,EACxC;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOA,QAAA,GAA8C;AAC5C,IAAA,MAAM,WAA8C,EAAC;AACrD,IAAA,KAAA,MAAW,KAAA,IAAS,IAAA,CAAK,KAAA,CAAM,MAAA,EAAO,EAAG;AACvC,MAAA,QAAA,CAAS,IAAA,CAAK,GAAG,KAAK,CAAA;AAAA,IACxB;AACA,IAAA,OAAO,QAAA;AAAA,EACT;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EASA,WAAA,CAAY,KAAqB,KAAA,EAA+B;AAC9D,IAAA,IAAA,CAAK,SAAA,CAAU,GAAA,CAAI,GAAA,EAAK,KAAK,CAAA;AAC7B,IAAA,IAAA,CAAK,GAAA,CAAI,eAAA,EAAiB,GAAA,EAAK,KAAK,CAAA;AAAA,EACtC;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOA,eAAe,GAAA,EAA2B;AACxC,IAAA,IAAA,CAAK,SAAA,CAAU,OAAO,GAAG,CAAA;AACzB,IAAA,IAAA,CAAK,GAAA,CAAI,qBAAqB,GAAG,CAAA;AAAA,EACnC;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAQA,eAAe,WAAA,EAA6D;AAC1E,IAAA,IAAA,CAAK,QAAA,GAAW,WAAA;AAChB,IAAA,IAAA,CAAK,IAAI,gCAAgC,CAAA;AAAA,EAC3C;AAAA;AAAA;AAAA;AAAA,EAKA,cAAA,GAAuB;AACrB,IAAA,IAAA,CAAK,UAAU,KAAA,EAAM;AACrB,IAAA,IAAA,CAAK,IAAI,uBAAuB,CAAA;AAAA,EAClC;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOA,QAAA,GAA0C;AACxC,IAAA,OAAO,KAAA,CAAM,IAAA,CAAK,IAAA,CAAK,KAAA,CAAM,QAAQ,CAAA;AAAA,EACvC;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EASA,QAAA,CACE,KACA,OAAA,EACuC;AACvC,IAAA,MAAM,WAAA,uBAAkB,IAAA,EAAK;AAG7B,IAAA,MAAM,cAAA,GAAiB,IAAA,CAAK,aAAA,CAAc,GAAA,EAAK,WAAW,CAAA;AAC1D,IAAA,IAAI,gBAAgB,OAAO,cAAA;AAG3B,IAAA,MAAM,IAAA,GAAO,IAAA,CAAK,KAAA,CAAM,GAAA,CAAI,GAAG,CAAA;AAC/B,IAAA,IAAI,CAAC,IAAA,EAAM;AACT,MAAA,OAAO,IAAA,CAAK,uBAAA,CAAwB,GAAA,EAAK,WAAW,CAAA;AAAA,IACtD;AAGA,IAAA,IAAI,CAAC,KAAK,SAAA,EAAW;AACnB,MAAA,OAAO,IAAA,CAAK,wBAAA,CAAyB,GAAA,EAAK,WAAW,CAAA;AAAA,IACvD;AAGA,IAAA,IAAI,CAAC,IAAA,CAAK,kBAAA,CAAmB,IAAA,EAAM,OAAO,CAAA,EAAG;AAC3C,MAAA,OAAO,IAAA,CAAK,uBAAA,CAAwB,GAAA,EAAK,WAAW,CAAA;AAAA,IACtD;AAGA,IAAA,MAAM,UAAA,GAAa,IAAA,CAAK,aAAA,CAAc,GAAA,EAAK,SAAS,WAAW,CAAA;AAC/D,IAAA,IAAI,YAAY,OAAO,UAAA;AAGvB,IAAA,IAAI,CAAC,IAAA,CAAK,eAAA,CAAgB,GAAA,EAAK,IAAA,EAAM,OAAO,CAAA,EAAG;AAC7C,MAAA,OAAO,IAAA,CAAK,uBAAA,CAAwB,GAAA,EAAK,WAAW,CAAA;AAAA,IACtD;AAGA,IAAA,OAAO,IAAA,CAAK,oBAAA,CAAqB,GAAA,EAAK,IAAA,EAAM,WAAW,CAAA;AAAA,EACzD;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAUQ,aAAA,CACN,KACA,WAAA,EAC8C;AAC9C,IAAA,IAAI,CAAC,IAAA,CAAK,SAAA,CAAU,GAAA,CAAI,GAAG,GAAG,OAAO,IAAA;AAErC,IAAA,MAAM,KAAA,GAAQ,IAAA,CAAK,SAAA,CAAU,GAAA,CAAI,GAAG,CAAA;AACpC,IAAA,OAAO;AAAA,MACL,OAAA,EAAS,GAAA;AAAA,MACT,KAAA;AAAA,MACA,SAAA,EAAW,SAAS,KAAK,CAAA;AAAA,MACzB,MAAA,EAAQ,UAAA;AAAA,MACR;AAAA,KACF;AAAA,EACF;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAUQ,uBAAA,CACN,KACA,WAAA,EACuC;AACvC,IAAA,MAAM,YAAA,GAAe,IAAA,CAAK,QAAA,CAAS,GAAG,CAAA,IAAK,KAAA;AAC3C,IAAA,OAAO;AAAA,MACL,OAAA,EAAS,GAAA;AAAA,MACT,KAAA,EAAO,YAAA;AAAA,MACP,SAAA,EAAW,SAAS,YAAY,CAAA;AAAA,MAChC,MAAA,EAAQ,SAAA;AAAA,MACR;AAAA,KACF;AAAA,EACF;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAUQ,wBAAA,CACN,KACA,WAAA,EACuC;AACvC,IAAA,OAAO;AAAA,MACL,OAAA,EAAS,GAAA;AAAA,MACT,KAAA,EAAO,KAAA;AAAA,MACP,SAAA,EAAW,KAAA;AAAA,MACX,MAAA,EAAQ,UAAA;AAAA,MACR;AAAA,KACF;AAAA,EACF;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAWQ,oBAAA,CACN,GAAA,EACA,IAAA,EACA,WAAA,EACuC;AACvC,IAAA,OAAO;AAAA,MACL,OAAA,EAAS,GAAA;AAAA,MACT,OAAO,IAAA,CAAK,KAAA;AAAA,MACZ,SAAA,EAAW,QAAA,CAAS,IAAA,CAAK,KAAK,CAAA;AAAA,MAC9B,MAAA,EAAQ,SAAA;AAAA,MACR;AAAA,KACF;AAAA,EACF;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAUQ,kBAAA,CACN,MACA,OAAA,EACS;AACT,IAAA,OAAO,IAAA,CAAK,WAAA,KAAgB,KAAA,IAAS,OAAA,EAAS,gBAAgB,IAAA,CAAK,WAAA;AAAA,EACrE;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAWQ,eAAA,CACN,GAAA,EACA,IAAA,EACA,OAAA,EACS;AACT,IAAA,IAAI,IAAA,CAAK,iBAAA,KAAsB,MAAA,EAAW,OAAO,IAAA;AACjD,IAAA,MAAM,UAAA,GAAa,uBAAA,CAAwB,GAAA,EAAK,OAAA,EAAS,MAAM,CAAA;AAC/D,IAAA,OAAO,WAAA,CAAY,UAAA,EAAY,IAAA,CAAK,iBAAiB,CAAA;AAAA,EACvD;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAWQ,aAAA,CACN,GAAA,EACA,OAAA,EACA,WAAA,EAC8C;AAC9C,IAAA,MAAM,QAAQ,IAAA,CAAK,KAAA,CAAM,GAAA,CAAI,GAAG,KAAK,EAAC;AAEtC,IAAA,KAAA,MAAW,QAAQ,KAAA,EAAO;AACxB,MAAA,IAAI,CAAC,KAAK,SAAA,EAAW;AAErB,MAAA,MAAM,aAAa,IAAA,CAAK,oBAAA,CAAqB,GAAA,EAAK,IAAA,EAAM,SAAS,WAAW,CAAA;AAC5E,MAAA,IAAI,YAAY,OAAO,UAAA;AAAA,IACzB;AAEA,IAAA,OAAO,IAAA;AAAA,EACT;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAYQ,oBAAA,CACN,GAAA,EACA,IAAA,EACA,OAAA,EACA,WAAA,EAC8C;AAC9C,IAAA,IAAI,CAAC,IAAA,CAAK,YAAA,CAAa,IAAA,EAAM,OAAO,GAAG,OAAO,IAAA;AAE9C,IAAA,MAAM,eAAA,GACJ,IAAA,CAAK,iBAAA,KAAsB,MAAA,IAC3B,WAAA,CAAY,uBAAA,CAAwB,GAAA,EAAK,OAAA,EAAS,MAAM,CAAA,EAAG,IAAA,CAAK,iBAAiB,CAAA;AAEnF,IAAA,IAAI,CAAC,iBAAiB,OAAO,IAAA;AAE7B,IAAA,OAAO;AAAA,MACL,OAAA,EAAS,GAAA;AAAA,MACT,OAAO,IAAA,CAAK,KAAA;AAAA,MACZ,SAAA,EAAW,QAAA,CAAS,IAAA,CAAK,KAAK,CAAA;AAAA,MAC9B,MAAA,EAAQ,YAAA;AAAA,MACR,eAAe,IAAA,CAAK,EAAA;AAAA,MACpB,WAAA,EAAa,WAAA,oBAAe,IAAI,IAAA;AAAK,KACvC;AAAA,EACF;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAWQ,YAAA,CACN,MACA,OAAA,EACS;AACT,IAAA,IAAI,IAAA,CAAK,UAAA,CAAW,MAAA,KAAW,CAAA,EAAG,OAAO,IAAA;AAGzC,IAAA,OAAO,IAAA,CAAK,WAAW,KAAA,CAAM,CAAA,SAAA,KAAa,KAAK,iBAAA,CAAkB,SAAA,EAAW,OAAO,CAAC,CAAA;AAAA,EACtF;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAUQ,iBAAA,CACN,WACA,OAAA,EACS;AACT,IAAA,IAAI,CAAC,SAAS,OAAO,KAAA;AAErB,IAAA,MAAM,YAAA,GAAe,YAAA,CAAa,eAAA,CAAgB,SAAA,CAAU,OAAO,OAAO,CAAA;AAC1E,IAAA,IAAI,YAAA,KAAiB,QAAW,OAAO,KAAA;AAEvC,IAAA,OAAO,yBAAA,CAA0B,WAAW,YAAY,CAAA;AAAA,EAC1D;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAQQ,OAAO,IAAA,EAAuB;AACpC,IAAA,IAAI,KAAK,gBAAA,EAAkB;AACzB,MAAA,IAAA,CAAK,MAAA,CAAO,KAAA,CAAM,IAAA,CAAK,GAAA,CAAI,CAAA,GAAA,KAAO,MAAA,CAAO,GAAG,CAAC,CAAA,CAAE,IAAA,CAAK,GAAG,CAAC,CAAA;AAAA,IAC1D;AAAA,EACF;AACF,CAAA;AC7YO,IAAe,sBAAf,MAEP;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAeE,WAAA,CACY,QACV,QAAA,EACA;AAFU,IAAA,IAAA,CAAA,MAAA,GAAA,MAAA;AAbZ,IAAA,IAAA,CAAU,WAAA,uBAAkB,GAAA,EAA0B;AAEtD,IAAA,IAAA,CAAU,aAAA,GAAgB,KAAA;AAcxB,IAAA,IAAA,CAAK,QAAA,GAAW,QAAA;AAEhB,IAAA,IAAA,CAAK,SAAS,IAAI,iBAAA,CAAkC,QAAA,EAAU,MAAA,CAAO,oBAAoB,KAAK,CAAA;AAG9F,IAAA,IAAA,CAAK,YAAA,GAAe,IAAI,YAAA,CAAa;AAAA,MACnC,WAAW,MAAA,CAAO,cAAA;AAAA,MAClB,KAAK,MAAA,CAAO,QAAA;AAAA,MACZ,QAAA,EAAU;AAAA;AAAA,KACX,CAAA;AAED,IAAA,IAAA,CAAK,iBAAA,EAAkB;AAAA,EACzB;AAAA,EA/EF;AAgDA,IAAA,MAAA,CAAA,IAAA,EAAA,qBAAA,CAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAgDE,MAAM,UAAA,GAA4B;AAChC,IAAA,IAAI,KAAK,aAAA,EAAe;AACtB,MAAA;AAAA,IACF;AAGA,IAAA,IAAI,KAAK,iBAAA,EAAmB;AAC1B,MAAA,OAAO,IAAA,CAAK,iBAAA;AAAA,IACd;AAGA,IAAA,IAAA,CAAK,iBAAA,GAAoB,KAAK,YAAA,EAAa;AAC3C,IAAA,OAAO,IAAA,CAAK,iBAAA;AAAA,EACd;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAQA,MAAc,YAAA,GAA8B;AAC1C,IAAA,IAAI;AACF,MAAA,MAAM,KAAK,OAAA,EAAQ;AACnB,MAAA,IAAA,CAAK,aAAA,GAAgB,IAAA;AACrB,MAAA,IAAA,CAAK,IAAI,mCAAmC,CAAA;AAAA,IAC9C,SAAS,KAAA,EAAO;AACd,MAAA,IAAA,CAAK,GAAA,CAAI,kCAAkC,KAAK,CAAA;AAEhD,MAAA,IAAA,CAAK,iBAAA,GAAoB,MAAA;AACzB,MAAA,MAAM,KAAA;AAAA,IACR;AAAA,EACF;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EASA,MAAM,OAAA,CACJ,GAAA,EACA,OAAA,EACgD;AAChD,IAAA,IAAI,CAAC,KAAK,aAAA,EAAe;AACvB,MAAA,MAAM,KAAK,UAAA,EAAW;AAAA,IACxB;AAGA,IAAA,IAAI,IAAA,CAAK,OAAO,cAAA,EAAgB;AAC9B,MAAA,MAAM,QAAA,GAAW,IAAA,CAAK,gBAAA,CAAiB,GAAA,EAAK,OAAO,CAAA;AACnD,MAAA,MAAM,MAAA,GAAS,MAAM,IAAA,CAAK,YAAA,CAAa,IAA2C,QAAQ,CAAA;AAC1F,MAAA,IAAI,MAAA,EAAQ;AACV,QAAA,OAAO,MAAA;AAAA,MACT;AAGA,MAAA,MAAM,UAAA,GAAa,IAAA,CAAK,MAAA,CAAO,QAAA,CAAS,KAAK,OAAO,CAAA;AACpD,MAAA,MAAM,IAAA,CAAK,YAAA,CAAa,GAAA,CAAI,QAAA,EAAU,UAAU,CAAA;AAChD,MAAA,OAAO,UAAA;AAAA,IACT;AAGA,IAAA,OAAO,IAAA,CAAK,MAAA,CAAO,QAAA,CAAS,GAAA,EAAK,OAAO,CAAA;AAAA,EAC1C;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EASA,MAAM,SAAA,CAAU,GAAA,EAAqB,OAAA,EAAgD;AACnF,IAAA,MAAM,UAAA,GAAa,MAAM,IAAA,CAAK,OAAA,CAAQ,KAAK,OAAO,CAAA;AAClD,IAAA,OAAO,UAAA,CAAW,SAAA;AAAA,EACpB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAUA,MAAM,QAAA,CACJ,GAAA,EACA,OAAA,EACY;AACZ,IAAA,MAAM,UAAA,GAAa,MAAM,IAAA,CAAK,OAAA,CAAQ,KAAK,OAAO,CAAA;AAClD,IAAA,OAAO,UAAA,CAAW,KAAA;AAAA,EACpB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAQA,MAAM,YACJ,OAAA,EACgE;AAChE,IAAA,IAAI,CAAC,KAAK,aAAA,EAAe;AACvB,MAAA,MAAM,KAAK,UAAA,EAAW;AAAA,IACxB;AAEA,IAAA,MAAM,UAAiE,EAAC;AAGxE,IAAA,KAAA,MAAW,GAAA,IAAO,MAAA,CAAO,IAAA,CAAK,IAAA,CAAK,QAAQ,CAAA,EAAuB;AAChE,MAAA,OAAA,CAAQ,GAAG,CAAA,GAAI,MAAM,IAAA,CAAK,OAAA,CAAQ,KAAK,OAAO,CAAA;AAAA,IAChD;AAGA,IAAA,MAAM,WAAA,GAAc,IAAA,CAAK,MAAA,CAAO,QAAA,EAAS;AACzC,IAAA,KAAA,MAAW,QAAQ,WAAA,EAAa;AAC9B,MAAA,IAAI,EAAE,IAAA,CAAK,GAAA,IAAO,OAAA,CAAA,EAAU;AAC1B,QAAA,OAAA,CAAQ,IAAA,CAAK,GAAG,CAAA,GAAI,MAAM,KAAK,OAAA,CAAQ,IAAA,CAAK,KAAK,OAAO,CAAA;AAAA,MAC1D;AAAA,IACF;AAEA,IAAA,OAAO,OAAA;AAAA,EACT;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOA,MAAM,OAAA,GAAyB;AAC7B,IAAA,IAAI;AACF,MAAA,MAAM,EAAE,KAAA,EAAO,KAAA,EAAM,GAAI,MAAM,KAAK,SAAA,EAAU;AAE9C,MAAA,IAAA,CAAK,MAAA,CAAO,SAAS,KAAK,CAAA;AAC1B,MAAA,IAAA,CAAK,MAAA,CAAO,SAAS,KAAK,CAAA;AAG1B,MAAA,MAAM,IAAA,CAAK,aAAa,KAAA,EAAM;AAG9B,MAAA,IAAA,CAAK,iBAAA,EAAkB;AAEvB,MAAA,IAAA,CAAK,IAAI,CAAA,eAAA,EAAkB,KAAA,CAAM,MAAM,CAAA,WAAA,EAAc,KAAA,CAAM,MAAM,CAAA,MAAA,CAAQ,CAAA;AAAA,IAC3E,SAAS,KAAA,EAAO;AACd,MAAA,IAAA,CAAK,GAAA,CAAI,+BAA+B,KAAK,CAAA;AAC7C,MAAA,MAAM,KAAA;AAAA,IACR;AAAA,EACF;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAQA,UAAU,QAAA,EAA4C;AACpD,IAAA,IAAA,CAAK,WAAA,CAAY,IAAI,QAAQ,CAAA;AAC7B,IAAA,OAAO,MAAM;AACX,MAAA,IAAA,CAAK,WAAA,CAAY,OAAO,QAAQ,CAAA;AAAA,IAClC,CAAA;AAAA,EACF;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAQA,WAAA,CAAY,KAAqB,KAAA,EAA+B;AAC9D,IAAA,IAAA,CAAK,MAAA,CAAO,WAAA,CAAY,GAAA,EAAK,KAAK,CAAA;AAClC,IAAA,KAAK,IAAA,CAAK,aAAa,KAAA,EAAM;AAC7B,IAAA,IAAA,CAAK,iBAAA,EAAkB;AAAA,EACzB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOA,eAAe,GAAA,EAA2B;AACxC,IAAA,IAAA,CAAK,MAAA,CAAO,eAAe,GAAG,CAAA;AAC9B,IAAA,KAAK,IAAA,CAAK,aAAa,KAAA,EAAM;AAC7B,IAAA,IAAA,CAAK,iBAAA,EAAkB;AAAA,EACzB;AAAA;AAAA;AAAA;AAAA,EAKA,cAAA,GAAuB;AACrB,IAAA,IAAA,CAAK,OAAO,cAAA,EAAe;AAC3B,IAAA,KAAK,IAAA,CAAK,aAAa,KAAA,EAAM;AAC7B,IAAA,IAAA,CAAK,iBAAA,EAAkB;AAAA,EACzB;AAAA;AAAA;AAAA;AAAA,EAKA,OAAA,GAAgB;AACd,IAAA,IAAI,KAAK,YAAA,EAAc;AACrB,MAAA,aAAA,CAAc,KAAK,YAAY,CAAA;AAC/B,MAAA,IAAA,CAAK,YAAA,GAAe,MAAA;AAAA,IACtB;AAEA,IAAA,IAAA,CAAK,YAAY,KAAA,EAAM;AACvB,IAAA,KAAK,IAAA,CAAK,aAAa,KAAA,EAAM;AAC7B,IAAA,IAAA,CAAK,aAAA,GAAgB,KAAA;AAErB,IAAA,IAAA,CAAK,IAAI,mBAAmB,CAAA;AAAA,EAC9B;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAkFU,gBAAA,CAAiB,KAAqB,OAAA,EAAsC;AACpF,IAAA,IAAI,CAAC,OAAA,EAAS;AACZ,MAAA,OAAO,GAAA;AAAA,IACT;AAGA,IAAA,MAAM,UAAA,GAAa,KAAK,SAAA,CAAU;AAAA,MAChC,QAAQ,OAAA,CAAQ,MAAA;AAAA,MAChB,UAAU,OAAA,CAAQ,QAAA;AAAA,MAClB,aAAa,OAAA,CAAQ,WAAA;AAAA,MACrB,UAAU,OAAA,CAAQ,QAAA;AAAA,MAClB,SAAS,OAAA,CAAQ,OAAA;AAAA,MACjB,SAAS,OAAA,CAAQ;AAAA,KAClB,CAAA;AAED,IAAA,OAAO,CAAA,EAAG,GAAG,CAAA,CAAA,EAAI,UAAU,CAAA,CAAA;AAAA,EAC7B;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOU,iBAAA,GAA0B;AAClC,IAAA,IAAI,IAAA,CAAK,MAAA,CAAO,eAAA,GAAkB,CAAA,EAAG;AACnC,MAAA,IAAA,CAAK,YAAA,GAAe,YAAY,MAAM;AACpC,QAAA,KAAK,IAAA,CAAK,OAAA,EAAQ,CAAE,KAAA,CAAM,CAAA,KAAA,KAAS;AACjC,UAAA,IAAA,CAAK,GAAA,CAAI,wBAAwB,KAAK,CAAA;AAAA,QACxC,CAAC,CAAA;AAAA,MACH,CAAA,EAAG,IAAA,CAAK,MAAA,CAAO,eAAA,GAAkBc,eAAe,uBAAuB,CAAA;AAAA,IACzE;AAAA,EACF;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOU,iBAAA,GAA0B;AAClC,IAAA,KAAA,MAAW,QAAA,IAAY,KAAA,CAAM,IAAA,CAAK,IAAA,CAAK,WAAW,CAAA,EAAG;AACnD,MAAA,IAAI;AACF,QAAA,QAAA,EAAS;AAAA,MACX,SAAS,KAAA,EAAO;AACd,QAAA,IAAA,CAAK,GAAA,CAAI,8BAA8B,KAAK,CAAA;AAAA,MAC9C;AAAA,IACF;AAAA,EACF;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAQU,OAAO,IAAA,EAAuB;AACtC,IAAA,IAAI,IAAA,CAAK,OAAO,gBAAA,EAAkB;AAChC,MAAA,OAAA,CAAQ,GAAA,CAAI,uBAAA,EAAyB,GAAG,IAAI,CAAA;AAAA,IAC9C;AAAA,EACF;AACF,CAAA;AC3XO,IAAM,sBAAA,GAAN,cAEG,mBAAA,CAAoC;AAAA,EAtE9C;AAsE8C,IAAA,MAAA,CAAA,IAAA,EAAA,wBAAA,CAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAS5C,WAAA,CACE,QACA,QAAA,EACA;AACA,IAAA,KAAA,CAAM,QAAQ,QAAQ,CAAA;AAEtB,IAAA,IAAI,CAAC,OAAO,SAAA,EAAW;AACrB,MAAA,MAAM,IAAIhB,gBAAAA;AAAA,QACR,2CAAA;AAAA,QACAC,WAAAA,CAAY;AAAA,OACd;AAAA,IACF;AAEA,IAAA,IAAA,CAAK,YAAY,MAAA,CAAO,SAAA;AACxB,IAAA,IAAA,CAAK,cAAA,EAAe;AAAA,EACtB;AAAA;AAAA;AAAA;AAAA,EAKQ,iBAAA,GAAoC;AAC1C,IAAA,OAAO,EAAE,SAAA,EAAW,IAAA,CAAK,SAAA,EAAU;AAAA,EACrC;AAAA;AAAA,EAGQ,UAAU,KAAA,EAAkC;AAElD,IAAA,IAAI,iBAAiBS,SAAAA,EAAW;AAC9B,MAAA,OAAO,KAAA;AAAA,IACT;AAEA,IAAA,OAAO,IAAIV,gBAAAA;AAAA,MACT,uBAAuB,KAAA,YAAiB,KAAA,GAAQ,MAAM,OAAA,GAAU,MAAA,CAAO,KAAK,CAAC,CAAA,CAAA;AAAA,MAC7EC,WAAAA,CAAY,aAAA;AAAA,MACZ,EAAE,KAAA,EAAO,KAAA,YAAiB,KAAA,GAAQ,QAAQ,MAAA;AAAU,KACtD;AAAA,EACF;AAAA;AAAA,EAGQ,kBAAkB,IAAA,EAGxB;AACA,IAAA,MAAM,KAAA,GAAQ,IAAA,EAAM,KAAA,IAAS,EAAC;AAC9B,IAAA,MAAM,KAAA,GAAQ,IAAA,EAAM,KAAA,IAAS,EAAC;AAC9B,IAAA,IAAA,CAAK,IAAI,CAAA,QAAA,EAAW,KAAA,CAAM,MAAM,CAAA,WAAA,EAAc,KAAA,CAAM,MAAM,CAAA,eAAA,CAAiB,CAAA;AAC3E,IAAA,OAAO,EAAE,OAAO,KAAA,EAAM;AAAA,EACxB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAQA,MAAgB,SAAA,GAGb;AACD,IAAA,IAAI;AACF,MAAA,MAAM,YAAY,IAAA,CAAK,MAAA;AACvB,MAAA,MAAM,WAAW,MAAMiB,uBAAA;AAAA,QACrB,EAAE,OAAA,EAAS,SAAA,CAAU,OAAA,EAAQ;AAAA,QAC7B,KAAK,iBAAA;AAAkB,OACzB;AAEA,MAAA,IAAI,CAAC,SAAS,SAAA,EAAW;AACvB,QAAA,MAAM,IAAIlB,gBAAAA;AAAA,UACR,CAAA,+BAAA,EAAkC,QAAA,CAAS,KAAA,EAAO,OAAO,CAAA,CAAA;AAAA,UACzDC,WAAAA,CAAY;AAAA,SACd;AAAA,MACF;AAEA,MAAA,MAAM,OAAO,QAAA,CAAS,IAAA;AACtB,MAAA,OAAO,IAAA,CAAK,kBAAkB,IAAI,CAAA;AAAA,IACpC,SAAS,KAAA,EAAO;AACd,MAAA,MAAM,IAAA,CAAK,UAAU,KAAK,CAAA;AAAA,IAC5B;AAAA,EACF;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOQ,cAAA,GAAuB;AAC7B,IAAA,IAAI,IAAA,CAAK,MAAA,CAAO,QAAA,KAAa,KAAA,EAAO;AAClC,MAAA,MAAM,IAAID,gBAAAA;AAAA,QACR,mDAAA;AAAA,QACAC,WAAAA,CAAY;AAAA,OACd;AAAA,IACF;AAEA,IAAA,IAAA,CAAK,IAAI,yBAAyB,CAAA;AAAA,EACpC;AAAA;AAAA;AAAA;AAAA,EAKA,UAAA,GAEE;AACA,IAAA,OAAO;AAAA,MACL,YAAA,EAAc,OAAA,CAAQ,IAAA,CAAK,SAAS;AAAA,KACtC;AAAA,EACF;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EASA,MAAM,WAAW,IAAA,EAA+E;AAC9F,IAAA,MAAM,WAAA,GAAc;AAAA,MAClB,GAAG,IAAA;AAAA,MACH,SAAA,EAAW,KAAK,SAAA,IAAa,IAAA;AAAA,MAC7B,WAAA,EAAa,KAAK,WAAA,IAAe,aAAA;AAAA,MACjC,WAAA,EAAa,KAAK,WAAA,IAAe;AAAA,KACnC;AACA,IAAA,MAAM,WAAW,MAAMkB,iBAAA,CAA8B,WAAA,EAAa,IAAA,CAAK,mBAAmB,CAAA;AAE1F,IAAA,IAAI,CAAC,SAAS,SAAA,EAAW;AACvB,MAAA,MAAM,IAAInB,gBAAAA;AAAA,QACR,CAAA,uBAAA,EAA0B,QAAA,CAAS,KAAA,EAAO,OAAO,CAAA,CAAA;AAAA,QACjDC,WAAAA,CAAY;AAAA,OACd;AAAA,IACF;AAEA,IAAA,MAAM,KAAK,OAAA,EAAQ;AACnB,IAAA,OAAO,QAAA,CAAS,IAAA;AAAA,EAClB;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,UAAA,CACJ,GAAA,EACA,IAAA,EACsC;AACtC,IAAA,MAAM,QAAA,GAAW,MAAMmB,iBAAA,CAA8B,EAAE,KAAK,IAAA,EAAK,EAAG,IAAA,CAAK,iBAAA,EAAmB,CAAA;AAE5F,IAAA,IAAI,CAAC,SAAS,SAAA,EAAW;AACvB,MAAA,MAAM,IAAIpB,gBAAAA;AAAA,QACR,CAAA,uBAAA,EAA0B,QAAA,CAAS,KAAA,EAAO,OAAO,CAAA,CAAA;AAAA,QACjDC,WAAAA,CAAY;AAAA,OACd;AAAA,IACF;AAEA,IAAA,MAAM,KAAK,OAAA,EAAQ;AACnB,IAAA,OAAO,QAAA,CAAS,IAAA;AAAA,EAClB;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,WAAW,GAAA,EAAoC;AACnD,IAAA,MAAM,WAAW,MAAMoB,iBAAA,CAA8B,GAAA,EAAK,IAAA,CAAK,mBAAmB,CAAA;AAElF,IAAA,IAAI,CAAC,SAAS,SAAA,EAAW;AACvB,MAAA,MAAM,IAAIrB,gBAAAA;AAAA,QACR,CAAA,uBAAA,EAA0B,QAAA,CAAS,KAAA,EAAO,OAAO,CAAA,CAAA;AAAA,QACjDC,WAAAA,CAAY;AAAA,OACd;AAAA,IACF;AAEA,IAAA,MAAM,KAAK,OAAA,EAAQ;AAAA,EACrB;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,SAAS,GAAA,EAAiE;AAC9E,IAAA,MAAM,WAAW,MAAMqB,qBAAA,CAA8B,GAAA,EAAK,IAAA,CAAK,mBAAmB,CAAA;AAElF,IAAA,IAAI,CAAC,SAAS,SAAA,EAAW;AACvB,MAAA,MAAM,IAAItB,gBAAAA;AAAA,QACR,CAAA,qBAAA,EAAwB,QAAA,CAAS,KAAA,EAAO,OAAO,CAAA,CAAA;AAAA,QAC/CC,WAAAA,CAAY;AAAA,OACd;AAAA,IACF;AAEA,IAAA,OAAQ,QAAA,CAAS,IAAA,EAAkE,KAAA,IAAS,EAAC;AAAA,EAC/F;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,MAAM,WAAA,GAA0D;AAG9D,IAAA,OAAO,IAAA,CAAK,OAAO,QAAA,EAAS;AAAA,EAC9B;AACF,CAAA;AC/NA,IAAM,yBAAA,GAA4B,GAAA;AAElC,IAAM,2BAAA,GAA8B,GAAA;AA4B7B,IAAM,gCAAA,GAAN,MAAM,iCAAA,SACH,yBAAA,CAMV;AAAA,EAqEE,YAAY,MAAA,EAAsC;AAChD,IAAA,KAAA,CAAM;AAAA,MACJ,WAAA,EAAa,0BAAA;AAAA,MACb,iBAAA,EAAmB,CAAC,UAAA,EAAY,WAAW,CAAA;AAAA,MAC3C,aAAA,EAAe,EAAE,OAAA,EAAS,IAAA,EAAM,UAAU,EAAC,EAAG,GAAG,MAAA;AAAO,KACzD,CAAA;AATH;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,IAAA,IAAA,CAAU,WAAA,GAAc,aAAA;AAWtB,IAAA,IAAA,CAAK,WAAW,MAAA,CAAO,QAAA;AACvB,IAAA,IAAA,CAAK,YAAA,GAAe,IAAA;AAEpB,IAAA,IAAA,CAAK,QAAQ,qBAAA,EAAuB,EAAE,UAAA,EAAY,IAAA,CAAK,qBAAqB,CAAA;AAC5E,IAAA,gBAAA,CAAiB,IAAA,CAAK,kCAAA,EAAoC,EAAE,YAAA,EAAc,OAAO,CAAA;AAAA,EACnF;AAAA,EAzKF;AAwFA,IAAA,MAAA,CAAA,IAAA,EAAA,kCAAA,CAAA;AAAA;AAAA,EAKE;AAAA;AAAA;AAAA;AAAA,IAAA,IAAA,CAAgB,aAAasB,YAAAA,CAAa,aAAA;AAAA;AAAA;AAAA,EAG1C,aAAqB,cAAA,CACnB,MAAA,EACA,OAAA,EAC6C;AAC7C,IAAA,MAAM,cACJ,MAAA,CAAO,WAAA,IAAe,OAAA,EAAS,SAAA,EAAW,SAAS,OAAA,IAAW,gBAAA;AAChE,IAAA,OAAOhB,eAAAA,CAAgB,EAAE,GAAG,OAAA,EAAS,WAAW,OAAA,EAAS,OAAA,EAAS,aAAa,CAAA;AAAA,EACjF;AAAA;AAAA,EAGA,OAAe,aAAA,CACb,MAAA,EACA,SAAA,EACwC;AACxC,IAAA,OAAO,IAAI,sBAAA;AAAA,MACT;AAAA,QACE,QAAA,EAAU,KAAA;AAAA,QACV,SAAA;AAAA,QACA,cAAA,EAAgB,IAAA;AAAA,QAChB,QAAA,EAAU,OAAO,QAAA,IAAY,yBAAA;AAAA,QAC7B,SAAS,MAAA,CAAO,cAAA;AAAA,QAChB,eAAA,EAAiB,OAAO,eAAA,IAAmB,2BAAA;AAAA,QAC3C,wBAAA,EAA0B,OAAO,wBAAA,IAA4B;AAAA,OAC/D;AAAA,MACA,MAAA,CAAO,eAAe;AAAC,KACzB;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKA,aAAa,MAAA,CACX,MAAA,EACA,OAAA,EAC2C;AAC3C,IAAA,MAAM,SAAA,GAAY,MAAM,iCAAA,CAAiC,cAAA,CAAe,QAAQ,OAAO,CAAA;AACvF,IAAA,MAAM,QAAA,GAAW,iCAAA,CAAiC,aAAA,CAAc,MAAA,EAAQ,SAAS,CAAA;AACjF,IAAA,MAAM,SAAS,UAAA,EAAW;AAE1B,IAAA,OAAO,IAAI,iCAAA,CAAiC;AAAA,MAC1C,OAAA,EAAS,OAAO,OAAA,IAAW,IAAA;AAAA,MAC3B,QAAA;AAAA,MACA,gBAAgB,MAAA,CAAO,cAAA;AAAA,MACvB,UAAU,MAAA,CAAO,QAAA;AAAA,MACjB,OAAO,MAAA,CAAO,KAAA;AAAA,MACd,YAAY,MAAA,CAAO;AAAA,KACpB,CAAA;AAAA,EACH;AAAA;AAAA;AAAA;AAAA,EAgCA,WAAA,GAAuB;AACrB,IAAA,OAAO,IAAA,CAAK,gBAAA,IAAoB,IAAA,CAAK,QAAA,KAAa,IAAA;AAAA,EACpD;AAAA,EAEA,OAAA,GAAgB;AACd,IAAA,IAAA,CAAK,UAAU,OAAA,EAAQ;AACvB,IAAA,gBAAA,CAAiB,IAAA,CAAK,+BAAA,EAAiC,EAAE,CAAA;AACzD,IAAA,IAAA,CAAK,QAAQ,kBAAkB,CAAA;AAAA,EACjC;AAAA;AAAA;AAAA;AAAA,EAMA,MAAM,OAAA,GAAyB;AAC7B,IAAA,IAAA,CAAK,WAAA,EAAY;AACjB,IAAA,IAAA,CAAK,iBAAiB,IAAI,CAAA;AAE1B,IAAA,IAAI;AACF,MAAA,MAAM,IAAA,CAAK,SAAS,OAAA,EAAQ;AAC5B,MAAA,gBAAA,CAAiB,IAAA,CAAK,gCAAA,EAAkC,EAAE,CAAA;AAE1D,MAAA,IAAI,KAAK,kBAAA,EAAoB;AAC3B,QAAA,MAAM,cAAc,MAAM,IAAA,CAAK,SAAS,WAAA,CAAY,IAAA,CAAK,OAAO,cAAc,CAAA;AAC9E,QAAA,IAAA,CAAK,YAAA,CAAa,IAAA,CAAK,QAAA,CAAS,WAAW,CAAC,CAAA;AAAA,MAC9C;AAEA,MAAA,IAAA,CAAK,SAAS,+BAA+B,CAAA;AAAA,IAC/C,CAAA,SAAE;AACA,MAAA,IAAA,CAAK,iBAAiB,KAAK,CAAA;AAAA,IAC7B;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAMA,MAAM,QAAA,CACJ,GAAA,EACA,OAAA,EACsC;AACtC,IAAA,IAAA,CAAK,WAAA,EAAY;AACjB,IAAA,MAAM,GAAA,GAAM,OAAA,IAAW,IAAA,CAAK,MAAA,CAAO,cAAA;AAEnC,IAAA,gBAAA,CAAiB,KAAK,wBAAA,EAA0B,EAAE,GAAA,EAAK,OAAA,EAAS,KAAK,CAAA;AAErE,IAAA,IAAI;AACF,MAAA,MAAM,SAAS,MAAM,IAAA,CAAK,QAAA,CAAS,OAAA,CAAQ,KAAK,GAAG,CAAA;AACnD,MAAA,gBAAA,CAAiB,IAAA,CAAK,uBAAA,EAAyB,EAAE,GAAA,EAAK,QAAQ,CAAA;AAE9D,MAAA,IAAI,KAAK,kBAAA,EAAoB;AAC3B,QAAA,IAAA,CAAK,aAAa,EAAE,CAAC,GAAG,GAAG,MAAA,CAAO,OAAO,CAAA;AAAA,MAC3C;AAEA,MAAA,OAAO,MAAA;AAAA,IACT,SAAS,KAAA,EAAO;AACd,MAAA,gBAAA,CAAiB,IAAA,CAAK,4BAAA,EAA8B,EAAE,GAAA,EAAK,OAAO,CAAA;AAClE,MAAA,MAAM,KAAA;AAAA,IACR;AAAA,EACF;AAAA,EAEA,MAAM,SAAA,CACJ,GAAA,EACA,OAAA,EACkB;AAClB,IAAA,IAAA,CAAK,WAAA,EAAY;AACjB,IAAA,OAAO,KAAK,QAAA,CAAS,SAAA,CAAU,KAAK,OAAA,IAAW,IAAA,CAAK,OAAO,cAAc,CAAA;AAAA,EAC3E;AAAA,EAEA,MAAM,QAAA,CACJ,GAAA,EACA,OAAA,EACY;AACZ,IAAA,IAAA,CAAK,WAAA,EAAY;AACjB,IAAA,OAAO,KAAK,QAAA,CAAS,QAAA,CAAY,KAAK,OAAA,IAAW,IAAA,CAAK,OAAO,cAAc,CAAA;AAAA,EAC7E;AAAA,EAEA,MAAM,YACJ,OAAA,EACsD;AACtD,IAAA,IAAA,CAAK,WAAA,EAAY;AACjB,IAAA,IAAA,CAAK,iBAAiB,IAAI,CAAA;AAE1B,IAAA,IAAI;AACF,MAAA,MAAM,MAAA,GAAS,MAAM,IAAA,CAAK,QAAA,CAAS,YAAY,OAAA,IAAW,IAAA,CAAK,OAAO,cAAc,CAAA;AAEpF,MAAA,IAAI,KAAK,kBAAA,EAAoB;AAC3B,QAAA,IAAA,CAAK,YAAA,CAAa,IAAA,CAAK,QAAA,CAAS,MAAM,CAAC,CAAA;AAAA,MACzC;AAEA,MAAA,OAAO,MAAA;AAAA,IACT,SAAS,KAAA,EAAO;AACd,MAAA,IAAA,CAAK,QAAA,CAAS,8BAAA,EAAgC,EAAE,KAAA,EAAO,CAAA;AACvD,MAAA,MAAM,KAAA;AAAA,IACR,CAAA,SAAE;AACA,MAAA,IAAA,CAAK,iBAAiB,KAAK,CAAA;AAAA,IAC7B;AAAA,EACF;AAAA,EAEA,MAAM,gBAAgB,OAAA,EAAyE;AAC7F,IAAA,MAAM,WAAA,GAAc,MAAM,IAAA,CAAK,WAAA,CAAY,OAAO,CAAA;AAClD,IAAA,OAAO,IAAA,CAAK,SAAS,WAAW,CAAA;AAAA,EAClC;AAAA;AAAA;AAAA;AAAA,EAMA,MAAM,WACJ,IAAA,EAC4B;AAC5B,IAAA,IAAA,CAAK,WAAA,EAAY;AACjB,IAAA,gBAAA,CAAiB,IAAA,CAAK,sBAAA,EAAwB,EAAE,IAAA,EAAM,CAAA;AAEtD,IAAA,IAAI;AACF,MAAA,MAAM,IAAA,GAAO,MAAM,IAAA,CAAK,QAAA,CAAS,WAAW,IAAI,CAAA;AAChD,MAAA,gBAAA,CAAiB,IAAA,CAAK,qBAAA,EAAuB,EAAE,IAAA,EAAM,CAAA;AACrD,MAAA,IAAA,CAAK,QAAQ,cAAA,EAAgB,EAAE,GAAA,EAAK,IAAA,CAAK,KAAK,CAAA;AAE9C,MAAA,IAAI,KAAK,kBAAA,EAAoB;AAC3B,QAAA,IAAA,CAAK,YAAA,CAAa,EAAE,CAAC,IAAA,CAAK,GAAG,GAAG,IAAA,CAAK,OAAO,CAAA;AAAA,MAC9C;AAEA,MAAA,OAAO,IAAA;AAAA,IACT,SAAS,KAAA,EAAO;AACd,MAAA,gBAAA,CAAiB,IAAA,CAAK,0BAAA,EAA4B,EAAE,KAAA,EAAO,MAAM,CAAA;AACjE,MAAA,MAAM,KAAA;AAAA,IACR;AAAA,EACF;AAAA,EAEA,MAAM,UAAA,CACJ,GAAA,EACA,IAAA,EAC4B;AAC5B,IAAA,IAAA,CAAK,WAAA,EAAY;AACjB,IAAA,gBAAA,CAAiB,IAAA,CAAK,sBAAA,EAAwB,EAAE,GAAA,EAAK,MAAM,CAAA;AAE3D,IAAA,IAAI;AACF,MAAA,MAAM,OAAO,MAAM,IAAA,CAAK,QAAA,CAAS,UAAA,CAAW,KAAK,IAAI,CAAA;AACrD,MAAA,gBAAA,CAAiB,IAAA,CAAK,qBAAA,EAAuB,EAAE,IAAA,EAAM,CAAA;AACrD,MAAA,IAAA,CAAK,OAAA,CAAQ,cAAA,EAAgB,EAAE,GAAA,EAAK,CAAA;AAEpC,MAAA,IAAI,KAAK,kBAAA,EAAoB;AAC3B,QAAA,IAAA,CAAK,aAAa,EAAE,CAAC,GAAG,GAAG,IAAA,CAAK,OAAO,CAAA;AAAA,MACzC;AAEA,MAAA,OAAO,IAAA;AAAA,IACT,SAAS,KAAA,EAAO;AACd,MAAA,gBAAA,CAAiB,IAAA,CAAK,0BAAA,EAA4B,EAAE,KAAA,EAAO,KAAK,CAAA;AAChE,MAAA,MAAM,KAAA;AAAA,IACR;AAAA,EACF;AAAA,EAEA,MAAM,WAAyC,GAAA,EAA0B;AACvE,IAAA,IAAA,CAAK,WAAA,EAAY;AACjB,IAAA,gBAAA,CAAiB,IAAA,CAAK,sBAAA,EAAwB,EAAE,GAAA,EAAK,CAAA;AAErD,IAAA,IAAI;AACF,MAAA,MAAM,IAAA,CAAK,QAAA,CAAS,UAAA,CAAW,GAAG,CAAA;AAClC,MAAA,gBAAA,CAAiB,IAAA,CAAK,qBAAA,EAAuB,EAAE,GAAA,EAAK,CAAA;AACpD,MAAA,IAAA,CAAK,OAAA,CAAQ,cAAA,EAAgB,EAAE,GAAA,EAAK,CAAA;AAGpC,MAAA,IAAI,KAAK,kBAAA,EAAoB;AAC3B,QAAA,MAAM,cAAc,MAAM,IAAA,CAAK,SAAS,WAAA,CAAY,IAAA,CAAK,OAAO,cAAc,CAAA;AAC9E,QAAA,IAAA,CAAK,YAAA,CAAa,IAAA,CAAK,QAAA,CAAS,WAAW,GAAG,IAAI,CAAA;AAAA,MACpD;AAAA,IACF,SAAS,KAAA,EAAO;AACd,MAAA,gBAAA,CAAiB,IAAA,CAAK,0BAAA,EAA4B,EAAE,KAAA,EAAO,KAAK,CAAA;AAChE,MAAA,MAAM,KAAA;AAAA,IACR;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAMA,MAAM,SAAuC,GAAA,EAA6C;AACxF,IAAA,IAAA,CAAK,WAAA,EAAY;AACjB,IAAA,OAAO,IAAA,CAAK,QAAA,CAAS,QAAA,CAAS,GAAG,CAAA;AAAA,EACnC;AAAA,EAEA,MAAM,WAAA,GAA8E;AAClF,IAAA,IAAA,CAAK,WAAA,EAAY;AACjB,IAAA,OAAO,IAAA,CAAK,SAAS,WAAA,EAAY;AAAA,EACnC;AAAA;AAAA;AAAA;AAAA,EAMA,WAAA,CAA0C,KAAW,KAAA,EAA+B;AAClF,IAAA,IAAA,CAAK,WAAA,EAAY;AACjB,IAAA,gBAAA,CAAiB,IAAA,CAAK,8BAAA,EAAgC,EAAE,GAAA,EAAK,OAAO,CAAA;AACpE,IAAA,IAAA,CAAK,QAAA,CAAS,WAAA,CAAY,GAAA,EAAK,KAAK,CAAA;AACpC,IAAA,gBAAA,CAAiB,IAAA,CAAK,0BAAA,EAA4B,EAAE,GAAA,EAAK,OAAO,CAAA;AAAA,EAClE;AAAA,EAEA,eAA6C,GAAA,EAAiB;AAC5D,IAAA,IAAA,CAAK,WAAA,EAAY;AACjB,IAAA,gBAAA,CAAiB,IAAA,CAAK,+BAAA,EAAiC,EAAE,GAAA,EAAK,CAAA;AAC9D,IAAA,IAAA,CAAK,QAAA,CAAS,eAAe,GAAG,CAAA;AAChC,IAAA,gBAAA,CAAiB,IAAA,CAAK,8BAAA,EAAgC,EAAE,GAAA,EAAK,CAAA;AAAA,EAC/D;AAAA,EAEA,cAAA,GAAuB;AACrB,IAAA,IAAA,CAAK,WAAA,EAAY;AACjB,IAAA,IAAA,CAAK,SAAS,cAAA,EAAe;AAAA,EAC/B;AAAA;AAAA;AAAA;AAAA,EAMA,UAAU,QAAA,EAAkC;AAC1C,IAAA,IAAA,CAAK,WAAA,EAAY;AACjB,IAAA,OAAO,IAAA,CAAK,QAAA,CAAS,SAAA,CAAU,QAAQ,CAAA;AAAA,EACzC;AAAA,EAEA,EAAA,CAAG,OAAyC,OAAA,EAA8C;AACxF,IAAA,OAAO,gBAAA,CAAiB,EAAA,CAAG,KAAA,EAAO,OAAO,CAAA;AAAA,EAC3C;AAAA;AAAA;AAAA;AAAA,EAMmB,YAAA,CAAa,KAAA,EAAyC,OAAA,GAAU,KAAA,EAAa;AAC9F,IAAA,IAAI,CAAC,KAAK,YAAA,EAAc;AAExB,IAAA,IAAI;AACF,MAAA,IAAI,CAAC,OAAA,IAAW,IAAA,CAAK,YAAA,CAAa,WAAA,EAAa;AAC7C,QAAA,IAAA,CAAK,YAAA,CAAa,YAAY,KAAK,CAAA;AAAA,MACrC,CAAA,MAAO;AACL,QAAA,IAAA,CAAK,YAAA,CAAa,SAAS,KAAK,CAAA;AAAA,MAClC;AAAA,IACF,SAAS,KAAA,EAAO;AACd,MAAA,IAAA,CAAK,QAAA,CAAS,mBAAA,EAAqB,EAAE,KAAA,EAAO,CAAA;AAAA,IAC9C;AAEA,IAAA,IAAA,CAAK,SAAS,kBAAA,EAAoB;AAAA,MAChC,OAAO,IAAA,CAAK,mBAAA;AAAA,MACZ,KAAA,EAAO,MAAA,CAAO,IAAA,CAAK,KAAK,CAAA,CAAE;AAAA,KAC3B,CAAA;AAAA,EACH;AAAA;AAAA;AAAA;AAAA,EAMQ,SACN,WAAA,EACkC;AAClC,IAAA,MAAM,SAA2C,EAAC;AAClD,IAAA,KAAA,MAAW,CAAC,GAAA,EAAK,UAAU,KAAK,MAAA,CAAO,OAAA,CAAQ,WAAW,CAAA,EAAG;AAC3D,MAAA,MAAA,CAAO,GAAG,IAAI,UAAA,CAAW,KAAA;AAAA,IAC3B;AACA,IAAA,OAAO,MAAA;AAAA,EACT;AACF;ACtYO,SAAS,WAAA,CAAY;AAAA,EAC1B,QAAA;AAAA,EACA,SAAA;AAAA,EACA,SAAA;AAAA,EACA,gBAAA;AAAA,EACA,cAAA;AAAA,EACA,aAAA;AAAA,EACA;AACF,CAAA,EAAuC;AACrC,EAAA,MAAM,CAAC,OAAA,EAAS,UAAU,CAAA,GAAI,SAAS,KAAK,CAAA;AAC5C,EAAA,MAAM,CAAC,KAAA,EAAO,QAAQ,CAAA,GAAI,SAAuB,IAAI,CAAA;AAErD,EAAA,SAAA,CAAU,MAAM;AAId,IAAA,gBAAA,CAAiB,IAAA,CAAK,SAAA,EAAW,SAAS,CAAA,CACvC,KAAK,MAAM;AACV,MAAA,UAAA,CAAW,IAAI,CAAA;AACf,MAAA,aAAA,IAAgB;AAAA,IAClB,CAAC,CAAA,CACA,KAAA,CAAM,CAAC,GAAA,KAAiB;AACvB,MAAA,MAAMiB,MAAAA,GAAQ,eAAe,KAAA,GAAQ,GAAA,GAAM,IAAI,KAAA,CAAM,MAAA,CAAO,GAAG,CAAC,CAAA;AAChE,MAAA,QAAA,CAASA,MAAK,CAAA;AACd,MAAA,OAAA,GAAUA,MAAK,CAAA;AACf,MAAA,UAAA,CAAW,OAAA,CAAQ,KAAA,CAAM,gDAAA,EAAkDA,MAAK,CAAA;AAAA,IAClF,CAAC,CAAA;AAGH,IAAA,OAAO,MAAM;AAAA,IAGb,CAAA;AAAA,EACF,CAAA,EAAG,EAAE,CAAA;AAGL,EAAA,IAAI,KAAA,EAAO;AACT,IAAA,IAAI,cAAA,EAAgB;AAClB,MAAA,uBAAOV,GAAAA,CAAAC,QAAAA,EAAA,EAAG,QAAA,EAAA,cAAA,CAAe,KAAK,CAAA,EAAE,CAAA;AAAA,IAClC;AACA,IAAA,uBACEU,KAAC,KAAA,EAAA,EAAI,KAAA,EAAO,EAAE,OAAA,EAAS,MAAA,EAAQ,KAAA,EAAO,KAAA,EAAM,EAC1C,QAAA,EAAA;AAAA,sBAAAX,GAAAA,CAAC,QAAG,QAAA,EAAA,kCAAA,EAAgC,CAAA;AAAA,sBACpCA,GAAAA,CAAC,GAAA,EAAA,EAAG,QAAA,EAAA,KAAA,CAAM,OAAA,EAAQ;AAAA,KAAA,EACpB,CAAA;AAAA,EAEJ;AAGA,EAAA,IAAI,CAAC,OAAA,EAAS;AACZ,IAAA,IAAI,gBAAA,EAAkB;AACpB,MAAA,uBAAOA,GAAAA,CAAAC,QAAAA,EAAA,EAAG,QAAA,EAAA,gBAAA,EAAiB,CAAA;AAAA,IAC7B;AACA,IAAA,uBACED,GAAAA,CAAC,KAAA,EAAA,EAAI,KAAA,EAAO,EAAE,OAAA,EAAS,MAAA,EAAO,EAC5B,QAAA,kBAAAA,GAAAA,CAAC,GAAA,EAAA,EAAE,QAAA,EAAA,4BAAA,EAA0B,CAAA,EAC/B,CAAA;AAAA,EAEJ;AAGA,EAAA,uBAAOA,GAAAA,CAAAC,QAAAA,EAAA,EAAG,QAAA,EAAS,CAAA;AACrB;AA9DgB,MAAA,CAAA,WAAA,EAAA,aAAA,CAAA;ACyGhB,IAAM,YAAA,GAAe,cAAwC,IAAI;AAgBjE,IAAM,mBAAN,MAAuB;AAAA,EAMrB,WAAA,CAAY,MAAA,GAAqC,EAAC,EAAG;AALrD,IAAA,IAAA,CAAQ,QAAiC,EAAC;AAE1C,IAAA,IAAA,CAAQ,SAAA,GAA4C,IAAA;AACpD,IAAA,IAAA,CAAQ,YAAA,GAAiE,IAAA;AAGvE,IAAA,IAAA,CAAK,MAAA,GAAS,MAAA;AACd,IAAA,IAAA,CAAK,KAAA,GAAQ,MAAA,CAAO,QAAA,IAAY,EAAC;AAAA,EACnC;AAAA,EA9KF;AAqKuB,IAAA,MAAA,CAAA,IAAA,EAAA,kBAAA,CAAA;AAAA;AAAA,EAWrB,aAAa,MAAA,EAA8C;AACzD,IAAA,IAAA,CAAK,SAAA,GAAY,MAAA;AAAA,EACnB;AAAA,EAEA,GAAA,CAAI,GAAA,EAAa,YAAA,GAAe,KAAA,EAAgB;AAC9C,IAAA,OAAO,IAAA,CAAK,KAAA,CAAM,GAAG,CAAA,IAAK,YAAA;AAAA,EAC5B;AAAA,EAEA,MAAA,GAAkC;AAChC,IAAA,OAAO,EAAE,GAAG,IAAA,CAAK,KAAA,EAAM;AAAA,EACzB;AAAA,EAEA,GAAA,CAAI,KAAa,KAAA,EAAsB;AACrC,IAAA,IAAA,CAAK,KAAA,CAAM,GAAG,CAAA,GAAI,KAAA;AAAA,EACpB;AAAA,EAEA,OAAO,KAAA,EAAsC;AAC3C,IAAA,IAAA,CAAK,QAAQ,EAAE,GAAG,IAAA,CAAK,KAAA,EAAO,GAAG,KAAA,EAAM;AAAA,EACzC;AAAA,EAEA,MAAM,OAAA,GAAyB;AAE7B,IAAA,IAAI,KAAK,MAAA,CAAO,QAAA,KAAa,SAAS,IAAA,CAAK,SAAA,EAAW,eAAc,EAAG;AACrE,MAAA,IAAI;AACF,QAAA,MAAM,QAAA,GAAW,IAAA,CAAK,MAAA,CAAO,WAAA,IAAe,gBAAA;AAC5C,QAAA,MAAM,MAAA,GAAS,IAAA,CAAK,SAAA,CAAU,SAAA,EAAU;AACxC,QAAA,MAAM,QAAA,GAAW,MAAM,MAAA,CAAO,GAAA,CAAyC,QAAQ,CAAA;AAC/E,QAAA,IAAI,QAAA,CAAS,MAAM,KAAA,EAAO;AACxB,UAAA,IAAA,CAAK,KAAA,GAAQ,EAAE,GAAG,IAAA,CAAK,OAAO,GAAG,QAAA,CAAS,KAAK,KAAA,EAAM;AAAA,QACvD;AAAA,MACF,SAAS,KAAA,EAAO;AACd,QAAA,UAAA,CAAW,OAAA,CAAQ,IAAA,CAAK,kDAAA,EAAoD,KAAK,CAAA;AAAA,MACnF;AAAA,IACF;AAAA,EAEF;AAAA,EAEA,gBAAA,GAAyB;AAEvB,IAAA,IACE,IAAA,CAAK,MAAA,CAAO,QAAA,KAAa,KAAA,IACzB,IAAA,CAAK,OAAO,eAAA,IACZ,IAAA,CAAK,MAAA,CAAO,eAAA,GAAkB,CAAA,EAC9B;AACA,MAAA,IAAA,CAAK,YAAA,GAAe,UAAA,CAAW,WAAA,CAAY,MAAM;AAC/C,QAAA,IAAA,CAAK,OAAA,EAAQ,CAAE,KAAA,CAAM,MAAM;AAAA,QAAC,CAAC,CAAA;AAAA,MAC/B,CAAA,EAAG,IAAA,CAAK,MAAA,CAAO,eAAe,CAAA;AAAA,IAChC;AAAA,EACF;AAAA,EAEA,eAAA,GAAwB;AACtB,IAAA,IAAI,KAAK,YAAA,EAAc;AACrB,MAAA,UAAA,CAAW,aAAA,CAAc,KAAK,YAAY,CAAA;AAC1C,MAAA,IAAA,CAAK,YAAA,GAAe,IAAA;AAAA,IACtB;AAAA,EACF;AAAA,EAEA,OAAA,GAAgB;AACd,IAAA,IAAA,CAAK,eAAA,EAAgB;AACrB,IAAA,IAAA,CAAK,QAAQ,EAAC;AAAA,EAChB;AACF,CAAA;AAmBA,SAAS,eAAe,MAAA,EAAoD;AAC1E,EAAA,OAAO;AAAA,IACL,OAAA,EAAS,OAAO,GAAA,CAAI,OAAA;AAAA,IACpB,OAAA,EAAS,OAAO,GAAA,CAAI,OAAA;AAAA,IACpB,OAAA,EAAS,OAAO,GAAA,CAAI,OAAA,GAAU,EAAE,MAAA,EAAQ,MAAA,CAAO,GAAA,CAAI,OAAA,EAAQ,GAAI,MAAA;AAAA,IAC/D,KAAA,EAAO,OAAO,GAAA,CAAI,KAAA;AAAA,IAClB,UAAA,EACE,MAAA,CAAO,GAAA,CAAI,UAAA,EAAY,WAAW,MAAA,CAAO,GAAA,CAAI,UAAA,EAAY,GAAA,GACrD,sBAAA,CAAuB,MAAA,CAAO,GAAA,CAAI,UAAA,CAAW,GAAG,CAAA,GAChD;AAAA,GACR;AACF;AAXS,MAAA,CAAA,cAAA,EAAA,gBAAA,CAAA;AAcT,eAAe,eAAe,MAAA,EAAwC;AACpE,EAAA,MAAM,SAAA,GAAY,eAAe,MAAM,CAAA;AAEvC,EAAA,MAAM,KAAK,UAAA,CAAW;AAAA,IACpB,MAAA,EAAQ,IAAA;AAAA,IACR,UAAA,EAAY,OAAO,UAAA,IAAc,QAAA;AAAA,IACjC,SAAS,MAAA,CAAO,OAAA;AAAA,IAChB,GAAA,EAAK;AAAA,MACH,GAAA,EAAK,MAAA,CAAO,GAAA,CAAI,GAAA,IAAO,aAAA;AAAA,MACvB,MAAA,EAAQ,OAAO,GAAA,CAAI,MAAA;AAAA,MACnB,YAAA,EAAc,IAAA;AAAA,MACd,GAAG;AAAA;AACL,GACD,CAAA;AACH;AAde,MAAA,CAAA,cAAA,EAAA,gBAAA,CAAA;AAiBf,eAAe,mBAAmB,MAAA,EAAwC;AACxE,EAAA,IAAI,CAAC,MAAA,CAAO,QAAA,IAAY,MAAA,CAAO,QAAA,CAAS,WAAW,CAAA,EAAG;AAEtD,EAAA,IAAI,OAAO,OAAA,EAAS;AAClB,IAAA,UAAA,CAAW,OAAA,CAAQ,IAAI,iDAAiD,CAAA;AAAA,EAC1E;AAEA,EAAA,MAAM,gBAAgB,UAAA,CAAW;AAAA,IAC/B,SAAA,EAAW,EAAE,OAAA,EAAS,MAAA,CAAO,IAAI,OAAA,EAAQ;AAAA,IACzC,UAAU,MAAA,CAAO;AAAA,GAClB,CAAA;AAED,EAAA,IAAI,OAAO,OAAA,EAAS;AAClB,IAAA,UAAA,CAAW,OAAA,CAAQ,GAAA;AAAA,MACjB,uCAAA;AAAA,MACA,gBAAgB,kBAAA;AAAmB,KACrC;AAAA,EACF;AACF;AAlBe,MAAA,CAAA,kBAAA,EAAA,oBAAA,CAAA;AAqBf,eAAe,uBAAuB,gBAAA,EAAmD;AACvF,EAAA,gBAAA,CAAiB,aAAa,gBAAgB,CAAA;AAC9C,EAAA,MAAM,iBAAiB,OAAA,EAAQ;AAC/B,EAAA,gBAAA,CAAiB,gBAAA,EAAiB;AACpC;AAJe,MAAA,CAAA,sBAAA,EAAA,wBAAA,CAAA;AASf,SAAS,oBAAA,CACP,QACA,gBAAA,EACe;AACf,EAAA,OAAO;AAAA,IACL,GAAA,EAAK,gBAAA;AAAA,IACL,MAAA,EAAQ,gBAAA;AAAA,IACR,IAAA,EAAM,IAAA;AAAA,IACN,YAAA,EAAc;AAAA,MACZ,GAAA,0BAAM,GAAA,EAAK,GAAA,KAAQ,iBAAiB,GAAA,CAAI,GAAA,EAAK,GAAG,CAAA,EAA3C,KAAA,CAAA;AAAA,MACL,MAAA,kBAAQ,MAAA,CAAA,MAAM,gBAAA,CAAiB,MAAA,EAAO,EAA9B,QAAA,CAAA;AAAA,MACR,OAAA,kBAAS,MAAA,CAAA,MAAM,gBAAA,CAAiB,OAAA,EAAQ,EAA/B,SAAA;AAAA,KACX;AAAA,IACA,UAAA,EAAY,OAAO,UAAA,IAAc,QAAA;AAAA,IACjC,WAAA,EAAa,MAAA,CAAO,GAAA,CAAI,GAAA,IAAO,aAAA;AAAA,IAC/B,4BAAY,MAAA,CAAA,CAAsC,GAAA,KAAgB,eAAA,CAAgB,GAAA,CAAO,GAAG,CAAA,EAAhF,YAAA,CAAA;AAAA,IACZ,iCAAiB,MAAA,CAAA,CAAsC,GAAA,KACrD,eAAA,CAAgB,QAAA,CAAY,GAAG,CAAA,EADhB,iBAAA,CAAA;AAAA,IAEjB,4BAAY,MAAA,CAAA,CAAC,GAAA,KAAgB,eAAA,CAAgB,GAAA,CAAI,GAAG,CAAA,EAAxC,YAAA,CAAA;AAAA,IACZ,cAAA,kBAAgB,MAAA,CAAA,MAAM,eAAA,CAAgB,kBAAA,EAAmB,EAAzC,gBAAA;AAAA,GAClB;AACF;AArBS,MAAA,CAAA,oBAAA,EAAA,sBAAA,CAAA;AAuBF,SAAS,aAAA,CAAc;AAAA,EAC5B,QAAA;AAAA,EACA,MAAA;AAAA,EACA,OAAA;AAAA,EACA,KAAA,EAAO,cAAA;AAAA,EACP,OAAA;AAAA,EACA,OAAA;AAAA,EACA,gBAAA,GAAmB;AACrB,CAAA,EAAqC;AACnC,EAAA,MAAM,CAAC,OAAA,EAAS,UAAU,CAAA,GAAIW,SAAS,KAAK,CAAA;AAC5C,EAAA,MAAM,CAAC,KAAA,EAAO,QAAQ,CAAA,GAAIA,SAAuB,IAAI,CAAA;AACrD,EAAA,MAAM,CAAC,gBAAgB,CAAA,GAAIA,QAAAA,CAAS,MAAM,IAAI,gBAAA,CAAiB,MAAA,CAAO,YAAY,CAAC,CAAA;AAGnF,EAAA,MAAM,UAAA,GAAa,YAAY,YAAY;AACzC,IAAA,IAAI;AACF,MAAA,QAAA,CAAS,IAAI,CAAA;AAEb,MAAA,MAAM,eAAe,MAAM,CAAA;AAC3B,MAAA,MAAM,mBAAmB,MAAM,CAAA;AAC/B,MAAA,MAAM,uBAAuB,gBAAgB,CAAA;AAE7C,MAAA,UAAA,CAAW,IAAI,CAAA;AACf,MAAA,OAAA,GAAU,oBAAA,CAAqB,MAAA,EAAQ,gBAAgB,CAAC,CAAA;AAAA,IAC1D,SAAS,GAAA,EAAK;AACZ,MAAA,MAAM,SAAA,GAAY,eAAe,KAAA,GAAQ,GAAA,GAAM,IAAI,KAAA,CAAM,MAAA,CAAO,GAAG,CAAC,CAAA;AACpE,MAAA,QAAA,CAAS,SAAS,CAAA;AAClB,MAAA,OAAA,GAAU,SAAS,CAAA;AACnB,MAAA,UAAA,CAAW,OAAA,CAAQ,KAAA,CAAM,wCAAA,EAA0C,SAAS,CAAA;AAAA,IAC9E;AAAA,EACF,GAAG,CAAC,MAAA,EAAQ,gBAAA,EAAkB,OAAA,EAAS,OAAO,CAAC,CAAA;AAG/C,EAAA,MAAM,YAAA,GAAe,YAAY,YAAY;AAC3C,IAAA,UAAA,CAAW,KAAK,CAAA;AAChB,IAAA,eAAA,CAAgB,UAAA,EAAW;AAC3B,IAAA,MAAM,KAAK,KAAA,EAAM;AACjB,IAAA,MAAM,UAAA,EAAW;AAAA,EACnB,CAAA,EAAG,CAAC,UAAU,CAAC,CAAA;AAGf,EAAAC,UAAU,MAAM;AACd,IAAA,KAAK,UAAA,EAAW;AAEhB,IAAA,OAAO,MAAM;AACX,MAAA,gBAAA,CAAiB,OAAA,EAAQ;AACzB,MAAA,eAAA,CAAgB,UAAA,EAAW;AAAA,IAC7B,CAAA;AAAA,EACF,CAAA,EAAG,EAAE,CAAA;AAGL,EAAA,MAAM,YAAA,GAAe,OAAA;AAAA,IACnB,OAAO;AAAA,MACL,GAAA,EAAK,UAAU,gBAAA,GAAmB,IAAA;AAAA,MAClC,MAAA,EAAQ,gBAAA;AAAA,MACR,IAAA,EAAM,IAAA;AAAA,MACN,YAAA,EAAc;AAAA,QACZ,GAAA,0BAAM,GAAA,EAAK,GAAA,KAAQ,iBAAiB,GAAA,CAAI,GAAA,EAAK,GAAG,CAAA,EAA3C,KAAA,CAAA;AAAA,QACL,MAAA,kBAAQ,MAAA,CAAA,MAAM,gBAAA,CAAiB,MAAA,EAAO,EAA9B,QAAA,CAAA;AAAA,QACR,OAAA,kBAAS,MAAA,CAAA,MAAM,gBAAA,CAAiB,OAAA,EAAQ,EAA/B,SAAA;AAAA,OACX;AAAA,MACA,UAAA,EAAY,OAAO,UAAA,IAAc,QAAA;AAAA,MACjC,WAAA,EAAa,MAAA,CAAO,GAAA,CAAI,GAAA,IAAO,aAAA;AAAA,MAC/B,OAAA;AAAA,MACA,KAAA;AAAA,MACA,YAAA;AAAA;AAAA,MAEA,4BAAY,MAAA,CAAA,CAAsC,GAAA,KAAgB,eAAA,CAAgB,GAAA,CAAO,GAAG,CAAA,EAAhF,YAAA,CAAA;AAAA,MACZ,iCAAiB,MAAA,CAAA,CAAsC,GAAA,KACrD,eAAA,CAAgB,QAAA,CAAY,GAAG,CAAA,EADhB,iBAAA,CAAA;AAAA,MAEjB,4BAAY,MAAA,CAAA,CAAC,GAAA,KAAgB,eAAA,CAAgB,GAAA,CAAI,GAAG,CAAA,EAAxC,YAAA,CAAA;AAAA,MACZ,cAAA,kBAAgB,MAAA,CAAA,MAAM,eAAA,CAAgB,kBAAA,EAAmB,EAAzC,gBAAA;AAAA,KAClB,CAAA;AAAA,IACA,CAAC,SAAS,KAAA,EAAO,MAAA,CAAO,YAAY,MAAA,CAAO,GAAA,CAAI,GAAA,EAAK,gBAAA,EAAkB,YAAY;AAAA,GACpF;AAGA,EAAA,IAAI,KAAA,IAAS,CAAC,gBAAA,EAAkB;AAC9B,IAAA,uBACEb,IAACc,aAAAA,EAAA,EACC,0BAAAd,GAAAA,CAAC,mBAAA,EAAA,EAAoB,KAAA,EAAc,cAAA,EAAgC,CAAA,EACrE,CAAA;AAAA,EAEJ;AAGA,EAAA,IAAI,CAAC,OAAA,IAAW,CAAC,gBAAA,EAAkB;AACjC,IAAA,uBACEA,IAACc,aAAAA,EAAA,EACC,0BAAAd,GAAAA,CAAC,qBAAA,EAAA,EAAsB,SAAkB,CAAA,EAC3C,CAAA;AAAA,EAEJ;AAGA,EAAA,uBACEA,GAAAA,CAACc,aAAAA,EAAA,EACC,QAAA,kBAAAd,GAAAA,CAAC,YAAA,CAAa,QAAA,EAAb,EAAsB,KAAA,EAAO,YAAA,EAAe,QAAA,EAAS,CAAA,EACxD,CAAA;AAEJ;AApGgB,MAAA,CAAA,aAAA,EAAA,eAAA,CAAA;AA6HT,SAAS,QAAA,GAA8B;AAC5C,EAAA,MAAM,OAAA,GAAU,WAAW,YAAY,CAAA;AACvC,EAAA,IAAI,CAAC,OAAA,EAAS;AACZ,IAAA,MAAM,IAAI,KAAA;AAAA,MACR;AAAA,KAEF;AAAA,EACF;AACA,EAAA,OAAO,OAAA;AACT;AATgB,MAAA,CAAA,QAAA,EAAA,UAAA,CAAA;AA4BT,SAAS,MAAA,GAAkC;AAChD,EAAA,MAAM,EAAE,GAAA,EAAK,OAAA,EAAQ,GAAI,QAAA,EAAS;AAClC,EAAA,IAAI,CAAC,OAAA,IAAW,CAAC,GAAA,EAAK;AACpB,IAAA,MAAM,IAAI,MAAM,6EAA6E,CAAA;AAAA,EAC/F;AACA,EAAA,OAAO,GAAA;AACT;AANgB,MAAA,CAAA,MAAA,EAAA,QAAA,CAAA;AAWT,SAAS,UAAA,GAA6C;AAC3D,EAAA,MAAM,EAAE,GAAA,EAAI,GAAI,QAAA,EAAS;AACzB,EAAA,OAAO,GAAA;AACT;AAHgB,MAAA,CAAA,UAAA,EAAA,YAAA,CAAA;AAwBT,SAAS,SAAA,GAAqC;AACnD,EAAA,MAAM,EAAE,MAAA,EAAO,GAAI,QAAA,EAAS;AAC5B,EAAA,OAAO,MAAA;AACT;AAHgB,MAAA,CAAA,SAAA,EAAA,WAAA,CAAA;AAkBT,SAAS,OAAA,CAAQ,GAAA,EAAa,YAAA,GAAe,KAAA,EAAgB;AAClE,EAAA,MAAM,EAAE,YAAA,EAAa,GAAI,QAAA,EAAS;AAClC,EAAA,OAAO,YAAA,CAAa,GAAA,CAAI,GAAA,EAAK,YAAY,CAAA;AAC3C;AAHgB,MAAA,CAAA,OAAA,EAAA,SAAA,CAAA;AAuBT,SAAS,eAAA,GAAqD;AACnE,EAAA,MAAM,EAAE,YAAA,EAAa,GAAI,QAAA,EAAS;AAClC,EAAA,OAAO,YAAA;AACT;AAHgB,MAAA,CAAA,eAAA,EAAA,iBAAA,CAAA;AAkBT,SAAS,aAAA,GAAyB;AACvC,EAAA,MAAM,EAAE,OAAA,EAAQ,GAAI,QAAA,EAAS;AAC7B,EAAA,OAAO,OAAA;AACT;AAHgB,MAAA,CAAA,aAAA,EAAA,eAAA,CAAA;AAQT,SAAS,aAAA,GAAgC;AAC9C,EAAA,MAAM,EAAE,UAAA,EAAW,GAAI,QAAA,EAAS;AAChC,EAAA,OAAO,UAAA;AACT;AAHgB,MAAA,CAAA,aAAA,EAAA,eAAA,CAAA;AAQT,SAAS,cAAA,GAAqC;AACnD,EAAA,MAAM,EAAE,WAAA,EAAY,GAAI,QAAA,EAAS;AACjC,EAAA,OAAO,WAAA;AACT;AAHgB,MAAA,CAAA,cAAA,EAAA,gBAAA,CAAA;AA0BT,SAAS,WACd,GAAA,EACG;AACH,EAAA,MAAM,EAAE,UAAA,EAAY,OAAA,EAAQ,GAAI,QAAA,EAAS;AAEzC,EAAA,IAAI,CAAC,OAAA,EAAS;AACZ,IAAA,MAAM,IAAI,KAAA,CAAM,CAAA,6CAAA,EAAgD,GAAG,CAAA,EAAA,CAAI,CAAA;AAAA,EACzE;AAEA,EAAA,OAAO,OAAA,CAAQ,MAAM,UAAA,CAAc,GAAG,GAAG,CAAC,UAAA,EAAY,GAAG,CAAC,CAAA;AAC5D;AAVgB,MAAA,CAAA,UAAA,EAAA,YAAA,CAAA;AA+BT,SAAS,gBACd,GAAA,EACgE;AAChE,EAAA,MAAM,EAAE,eAAA,EAAiB,OAAA,EAAQ,GAAI,QAAA,EAAS;AAC9C,EAAA,MAAM,CAAC,OAAA,EAAS,UAAU,CAAA,GAAIY,SAAmB,IAAI,CAAA;AACrD,EAAA,MAAM,CAAC,SAAA,EAAW,YAAY,CAAA,GAAIA,SAAS,IAAI,CAAA;AAC/C,EAAA,MAAM,CAAC,KAAA,EAAO,QAAQ,CAAA,GAAIA,SAAuB,IAAI,CAAA;AAErD,EAAAC,UAAU,MAAM;AACd,IAAA,IAAI,CAAC,OAAA,EAAS;AAEd,IAAA,IAAI,OAAA,GAAU,IAAA;AAEd,IAAA,MAAM,8BAAc,MAAA,CAAA,YAA2B;AAC7C,MAAA,IAAI;AACF,QAAA,YAAA,CAAa,IAAI,CAAA;AACjB,QAAA,MAAM,GAAA,GAAM,MAAM,eAAA,CAAmB,GAAG,CAAA;AACxC,QAAA,IAAI,OAAA,EAAS;AACX,UAAA,UAAA,CAAW,GAAG,CAAA;AACd,UAAA,YAAA,CAAa,KAAK,CAAA;AAAA,QACpB;AAAA,MACF,SAAS,GAAA,EAAK;AACZ,QAAA,IAAI,OAAA,EAAS;AACX,UAAA,QAAA,CAAS,GAAA,YAAe,QAAQ,GAAA,GAAM,IAAI,MAAM,MAAA,CAAO,GAAG,CAAC,CAAC,CAAA;AAC5D,UAAA,YAAA,CAAa,KAAK,CAAA;AAAA,QACpB;AAAA,MACF;AAAA,IACF,CAAA,EAdoB,aAAA,CAAA;AAgBpB,IAAA,KAAK,WAAA,EAAY;AAEjB,IAAA,OAAO,MAAM;AACX,MAAA,OAAA,GAAU,KAAA;AAAA,IACZ,CAAA;AAAA,EACF,CAAA,EAAG,CAAC,GAAA,EAAK,eAAA,EAAiB,OAAO,CAAC,CAAA;AAElC,EAAA,OAAO,EAAE,OAAA,EAAS,SAAA,EAAW,KAAA,EAAM;AACrC;AArCgB,MAAA,CAAA,eAAA,EAAA,iBAAA,CAAA;AAuDT,SAAS,cAAc,GAAA,EAAsB;AAClD,EAAA,MAAM,EAAE,UAAA,EAAW,GAAI,QAAA,EAAS;AAChC,EAAA,OAAO,WAAW,GAAG,CAAA;AACvB;AAHgB,MAAA,CAAA,aAAA,EAAA,eAAA,CAAA;AAwBT,SAAS,cAAA,GAA2B;AACzC,EAAA,MAAM,EAAE,cAAA,EAAe,GAAI,QAAA,EAAS;AACpC,EAAA,OAAO,cAAA,EAAe;AACxB;AAHgB,MAAA,CAAA,cAAA,EAAA,gBAAA,CAAA;;;ACnsBT,SAAS,sBACd,UAAA,EACkB;AAClB,EAAA,OAAO,MAAM,eAAA,CAAgB,QAAA,CAAY,UAAU,CAAA;AACrD;AAJgB,MAAA,CAAA,qBAAA,EAAA,uBAAA,CAAA;AAwBT,SAAS,uBACd,IAAA,EAC8D;AAC9D,EAAA,MAAM,YAAY,EAAC;AAEnB,EAAA,KAAA,MAAW,CAAC,IAAA,EAAM,GAAG,KAAK,MAAA,CAAO,OAAA,CAAQ,IAAI,CAAA,EAAG;AAC9C,IAAA,SAAA,CAAU,IAAe,CAAA,GAAI,qBAAA,CAAsB,GAAG,CAAA;AAAA,EACxD;AAEA,EAAA,OAAO,SAAA;AACT;AAVgB,MAAA,CAAA,sBAAA,EAAA,wBAAA,CAAA;AA6CT,SAAS,YAAA,CACd,aACA,WAAA,EACkE;AAClE,EAAA,OAAO,CAAC,KAAiC,GAAA,KAAgC;AAEvE,IAAA,MAAM,WAAW,EAAC;AAElB,IAAA,KAAA,MAAW,OAAO,WAAA,EAAa;AAC7B,MAAA,MAAA,CAAO,cAAA,CAAe,UAAU,GAAA,EAAK;AAAA,QACnC,GAAA,kBAAK,MAAA,CAAA,MAAM,eAAA,CAAgB,GAAA,CAAI,GAAG,CAAA,EAA7B,KAAA,CAAA;AAAA,QACL,UAAA,EAAY;AAAA,OACb,CAAA;AAAA,IACH;AAEA,IAAA,OAAO,WAAA,CAAY,GAAA,EAAK,GAAA,EAAK,QAAQ,CAAA;AAAA,EACvC,CAAA;AACF;AAjBgB,MAAA,CAAA,YAAA,EAAA,cAAA,CAAA;;;AClDT,SAAS,wBAAA,CACd,OAAA,GAAyC,EAAC,EACO;AACjD,EAAA,MAAM,EAAE,UAAA,GAAa,cAAA,EAAgB,OAAA,EAAS,WAAU,GAAI,OAAA;AAE5D,EAAA,OAAO,YAAuD;AAC5D,IAAA,MAAM,OAAA,GAAU,MAAM,eAAA,CAAgB,QAAA,CAAqC,UAAU,CAAA;AACrF,IAAA,MAAM,KAAA,GAAQ,MAAM,OAAA,CAAQ,WAAA,CAAY,OAAO,CAAA;AAG/C,IAAA,MAAM,SAA2C,EAAC;AAClD,IAAA,KAAA,MAAW,CAAC,GAAA,EAAK,UAAU,KAAK,MAAA,CAAO,OAAA,CAAQ,KAAK,CAAA,EAAG;AACrD,MAAA,IAAI,UAAA,IAAc,OAAO,UAAA,KAAe,QAAA,IAAY,WAAW,UAAA,EAAY;AACzE,QAAA,MAAA,CAAO,GAAG,IAAK,UAAA,CAA2C,KAAA;AAAA,MAC5D,CAAA,MAAO;AACL,QAAA,MAAA,CAAO,GAAG,CAAA,GAAI,UAAA;AAAA,MAChB;AAAA,IACF;AAEA,IAAA,OAAO,SAAA,GAAY,SAAA,CAAU,MAAM,CAAA,GAAI,MAAA;AAAA,EACzC,CAAA;AACF;AArBgB,MAAA,CAAA,wBAAA,EAAA,0BAAA,CAAA;AAyCT,SAAS,6BAA6B,OAAA,EAWV;AACjC,EAAA,MAAM,EAAE,UAAA,EAAY,OAAA,EAAS,UAAU,OAAA,EAAS,YAAA,EAAc,SAAQ,GAAI,OAAA;AAE1E,EAAA,OAAO;AAAA,IACL,OAAA,EAAS,wBAAA,CAAyB,EAAE,UAAA,EAAY,SAAS,CAAA;AAAA,IACzD,QAAA;AAAA,IACA,OAAA;AAAA,IACA,YAAA;AAAA,IACA;AAAA,GACF;AACF;AArBgB,MAAA,CAAA,4BAAA,EAAA,8BAAA,CAAA","file":"entry-frontend.mjs","sourcesContent":["/**\n * Redis Cache Strategy\n *\n * Redis-based cache implementation for distributed caching.\n * This will be moved to @plyaz/core when the package structure is finalized.\n *\n * @fileoverview Redis cache strategy implementation\n * @version 1.0.0\n */\n\nimport { TIME_CONSTANTS } from '@plyaz/config';\nimport type { CacheStrategy, CacheEntry, CacheStats, RedisCacheConfig } from '@plyaz/types';\nimport { ERROR_CODES } from '@plyaz/types';\nimport { CorePackageError } from '@plyaz/errors';\nimport type { Redis as IoRedisClientType } from 'ioredis';\n\n/**\n * Redis cache strategy implementation.\n * Provides distributed caching for multi-instance applications.\n *\n * @class RedisCacheStrategy\n * @implements {CacheStrategy}\n *\n * @example\n * ```typescript\n * const cache = new RedisCacheStrategy({\n * url: 'redis://localhost:6379',\n * keyPrefix: 'app:cache:'\n * });\n *\n * await cache.set('key', entry);\n * const cached = await cache.get('key');\n * ```\n */\nexport class RedisCacheStrategy implements CacheStrategy {\n private client!: IoRedisClientType;\n private stats = {\n hitCount: 0,\n missCount: 0,\n setCount: 0,\n deleteCount: 0,\n };\n private isConnected = false;\n private readonly keyPrefix: string;\n\n /**\n * Creates a new Redis cache strategy.\n *\n * @param config - Redis cache configuration\n */\n constructor(private config: RedisCacheConfig) {\n if (!config.url) {\n throw new CorePackageError('Redis URL is required', ERROR_CODES.CLIENT_INVALID_CONFIG);\n }\n this.keyPrefix = config.keyPrefix ?? 'cache:';\n }\n\n /**\n * Stores a cache entry in Redis.\n *\n * @param key - Cache key\n * @param entry - Cache entry to store\n * @returns Promise that resolves when entry is stored\n */\n async set<T>(key: string, entry: CacheEntry<T>): Promise<void> {\n await this.ensureConnected();\n\n const redisKey = this.buildRedisKey(key);\n const serializedEntry = JSON.stringify(entry);\n\n // Calculate TTL in seconds\n const ttlMs = entry.expiresAt - Date.now();\n const ttlSeconds = Math.max(1, Math.ceil(ttlMs / TIME_CONSTANTS.MILLISECONDS_PER_SECOND));\n\n await this.client.set(redisKey, serializedEntry, 'EX', ttlSeconds);\n this.stats.setCount++;\n }\n\n /**\n * Retrieves a cache entry from Redis.\n *\n * @param key - Cache key\n * @returns Promise that resolves to cache entry or null if not found\n */\n async get<T>(key: string): Promise<CacheEntry<T> | null> {\n await this.ensureConnected();\n\n const redisKey = this.buildRedisKey(key);\n const serializedEntry = await this.client.get(redisKey);\n\n if (!serializedEntry || typeof serializedEntry !== 'string') {\n this.stats.missCount++;\n return null;\n }\n\n try {\n const entry = JSON.parse(serializedEntry) as CacheEntry<T>;\n this.stats.hitCount++;\n return entry;\n } catch {\n // Invalid JSON, remove the corrupted entry\n await this.client.del(redisKey);\n this.stats.missCount++;\n return null;\n }\n }\n\n /**\n * Removes a cache entry from Redis.\n *\n * @param key - Cache key to remove\n * @returns Promise that resolves when entry is removed\n */\n async delete(key: string): Promise<void> {\n await this.ensureConnected();\n\n const redisKey = this.buildRedisKey(key);\n await this.client.del(redisKey);\n this.stats.deleteCount++;\n }\n\n /**\n * Clears all cache entries from Redis.\n * This removes all keys with the configured prefix.\n *\n * @returns Promise that resolves when cache is cleared\n */\n async clear(): Promise<void> {\n await this.ensureConnected();\n\n const pattern = `${this.keyPrefix}*`;\n\n const keys = await this.client.keys(pattern);\n if (keys.length > 0) {\n await this.client.del(...keys);\n }\n\n this.stats.hitCount = 0;\n this.stats.missCount = 0;\n }\n\n /**\n * Gets cache statistics.\n *\n * @returns Promise that resolves to cache statistics\n */\n async getStats(): Promise<CacheStats> {\n await this.ensureConnected();\n\n // Get approximate entry count\n const pattern = `${this.keyPrefix}*`;\n const keys = await this.client.keys(pattern);\n const entryCount = Array.isArray(keys) ? keys.length : 0;\n\n const totalRequests = this.stats.hitCount + this.stats.missCount;\n const hitRatio = totalRequests > 0 ? this.stats.hitCount / totalRequests : 0;\n\n return {\n hits: this.stats.hitCount,\n misses: this.stats.missCount,\n sets: this.stats.setCount,\n deletes: this.stats.deleteCount,\n size: entryCount,\n hitRatio,\n };\n }\n\n /**\n * Disposes of the Redis cache and cleans up resources.\n *\n * @returns Promise that resolves when cleanup is complete\n */\n async dispose(): Promise<void> {\n if (this.client && this.isConnected) {\n await this.client.quit();\n this.isConnected = false;\n }\n }\n\n /**\n * Ensures Redis connection is established.\n *\n * @private\n * @returns Promise that resolves when connected\n */\n private async ensureConnected(): Promise<void> {\n if (this.isConnected) return;\n\n try {\n this.client = await this.createIoRedisClient();\n this.isConnected = true;\n } catch (error) {\n throw new CorePackageError(\n `Failed to connect to Redis: ${error instanceof Error ? error.message : 'Unknown error'}`,\n ERROR_CODES.DB_CONNECTION_FAILED\n );\n }\n }\n\n /**\n * Creates an ioredis client.\n *\n * @private\n * @returns Promise that resolves to ioredis client\n */\n private async createIoRedisClient(): Promise<IoRedisClientType> {\n const DEFAULT_TIMEOUT = 5000;\n const defaultOptions = {\n connectTimeout: DEFAULT_TIMEOUT,\n commandTimeout: DEFAULT_TIMEOUT,\n enableOfflineQueue: false,\n } satisfies {\n connectTimeout: number;\n commandTimeout: number;\n enableOfflineQueue: boolean;\n };\n\n const Redis = await import('ioredis');\n const client = new Redis.default(this.config.url, {\n connectTimeout: this.config.connectTimeout ?? defaultOptions.connectTimeout,\n commandTimeout: this.config.commandTimeout ?? defaultOptions.commandTimeout,\n enableOfflineQueue: defaultOptions.enableOfflineQueue,\n });\n\n // Wait for connection\n await new Promise((resolve, reject) => {\n client.on('ready', resolve);\n client.on('error', reject);\n });\n\n return client;\n }\n\n /**\n * Builds a Redis key with the configured prefix.\n *\n * @private\n * @param key - Base cache key\n * @returns Redis key with prefix\n */\n private buildRedisKey(key: string): string {\n return `${this.keyPrefix}${key}`;\n }\n}\n","/**\n * Hash Utilities\n *\n * Common hashing functions for consistent data distribution and rollouts.\n *\n * @fileoverview Hash utility functions\n * @version 1.0.0\n */\n\nimport { MATH_CONSTANTS, FNV_CONSTANTS, HASH_SEED_CONSTANTS } from '@plyaz/config';\n\n/**\n * Optimized string hashing function for consistent distribution.\n * Uses FNV-1a hash algorithm for better distribution and performance.\n * FNV-1a provides excellent avalanche properties and is faster than\n * polynomial rolling hash for short to medium strings.\n *\n * @param str - String to hash\n * @returns Positive hash value\n *\n * @example\n * ```typescript\n * const hash = hashString('user123:AUTH_GOOGLE');\n * const bucket = hash % 100; // 0-99\n * ```\n *\n * @remarks\n * FNV-1a algorithm benefits:\n * - Excellent distribution for hash tables\n * - Fast computation with minimal operations\n * - Good avalanche effect (small input changes create large output changes)\n * - Consistent timing reduces timing attack vulnerabilities\n */\nexport function hashString(str: string): number {\n // Handle empty string edge case early\n if (str.length === 0) return 0;\n\n // Use FNV-1a constants from config\n let hash: number = FNV_CONSTANTS.FNV_32_OFFSET;\n\n // Process string with FNV-1a algorithm\n // Using charCodeAt is faster than alternatives and handles Unicode correctly\n for (let i = 0; i < str.length; i++) {\n // XOR with byte value then multiply by prime\n // This order (XOR first) is what makes it FNV-1a vs FNV-1\n hash ^= str.charCodeAt(i);\n hash = Math.imul(hash, FNV_CONSTANTS.FNV_32_PRIME) >>> 0; // Ensure 32-bit unsigned\n }\n\n // Ensure positive value using >>> 0 for unsigned 32-bit conversion\n // This is more efficient than Math.abs() and handles edge cases better\n return hash >>> 0;\n}\n\n/**\n * Determines if a user should be included in a rollout based on percentage.\n * Uses consistent hashing to ensure the same user always gets the same result.\n *\n * @param identifier - Unique identifier for consistency (e.g., userId, flagKey)\n * @param percentage - Rollout percentage (0-100)\n * @returns true if identifier should be included in rollout\n *\n * @example\n * ```typescript\n * const shouldInclude = isInRollout('user123:AUTH_GOOGLE', 25); // 25% rollout\n * ```\n */\nexport function isInRollout(identifier: string, percentage: number): boolean {\n if (percentage >= MATH_CONSTANTS.PERCENTAGE_MAX) return true;\n if (percentage <= 0) return false;\n\n const hash = hashString(identifier);\n return hash % MATH_CONSTANTS.PERCENTAGE_MAX < percentage;\n}\n\n/**\n * Creates a consistent rollout identifier for a user and feature.\n *\n * @param featureKey - Feature or flag key\n * @param userId - User identifier (defaults to 'anonymous')\n * @returns Consistent identifier for rollout calculations\n *\n * @example\n * ```typescript\n * const identifier = createRolloutIdentifier('AUTH_GOOGLE', 'user123');\n * const inRollout = isInRollout(identifier, 50);\n * ```\n */\nexport function createRolloutIdentifier(featureKey: string, userId?: string): string {\n const trimmedUserId = userId?.trim();\n const effectiveUserId = trimmedUserId && trimmedUserId.length > 0 ? trimmedUserId : 'anonymous';\n return `${featureKey}:${effectiveUserId}`;\n}\n\n/**\n * Hash-based utilities for consistent data operations.\n */\nexport const HashUtils = {\n /**\n * Generates a hash-based bucket for load balancing or distribution.\n *\n * @param identifier - Unique identifier\n * @param bucketCount - Number of buckets (default: 10)\n * @returns Bucket number (0 to bucketCount-1)\n */\n getBucket: (identifier: string, bucketCount: number = 10): number => {\n return hashString(identifier) % bucketCount;\n },\n\n /**\n * Checks if an identifier falls within a specific bucket range.\n *\n * @param identifier - Unique identifier\n * @param startBucket - Starting bucket (inclusive)\n * @param endBucket - Ending bucket (inclusive)\n * @param totalBuckets - Total number of buckets (default: 100)\n * @returns true if identifier is in the bucket range\n */\n isInBucketRange: (\n identifier: string,\n startBucket: number,\n endBucket: number,\n totalBuckets: number = MATH_CONSTANTS.PERCENTAGE_MAX\n ): boolean => {\n const bucket = hashString(identifier) % totalBuckets;\n return bucket >= startBucket && bucket <= endBucket;\n },\n\n /**\n * Creates a deterministic random seed from a string.\n * Uses the improved hash function and ensures the seed is within\n * the safe range for JavaScript's Math.random seeding.\n *\n * @param str - String to convert to seed\n * @returns Deterministic seed value (0 to 2^31-1)\n */\n createSeed: (str: string): number => {\n // Use constant from config for consistency\n return hashString(str) % HASH_SEED_CONSTANTS.MAX_SAFE_SEED;\n },\n} as const;\n","/**\n * ID Generation Utilities\n *\n * Provides consistent ID generation across the application.\n * Uses globalThis.crypto when available, with a fallback for environments without it.\n *\n * @fileoverview ID generation utility functions\n */\n\n// Constants for ID generation\nconst RANDOM_ID_RADIX = 36;\nconst RANDOM_ID_SLICE_START = 2;\nconst SHORT_ID_LENGTH = 8;\nconst HEX_RADIX = 16;\nconst HEX_SLICE_START = 2;\nconst HEX_SLICE_END = 18;\nconst SPAN_ID_LENGTH = 16;\n\n/**\n * Generate a UUID v4 string.\n * Uses crypto.randomUUID when available, otherwise falls back to a timestamp-based ID.\n *\n * @returns A UUID v4 string or fallback ID\n *\n * @example\n * ```typescript\n * const id = generateId();\n * // => 'a1b2c3d4-e5f6-7890-abcd-ef1234567890' (crypto available)\n * // => '1701475200000-x7k9m2' (fallback)\n * ```\n */\nexport function generateId(): string {\n const cryptoApi = globalThis.crypto as { randomUUID?: () => string } | undefined;\n if (cryptoApi?.randomUUID) {\n return cryptoApi.randomUUID();\n }\n return `${Date.now()}-${Math.random().toString(RANDOM_ID_RADIX).slice(RANDOM_ID_SLICE_START)}`;\n}\n\n/**\n * Generate a short random ID (8 characters).\n * Useful for correlation IDs, short references, etc.\n *\n * @returns A short random string\n *\n * @example\n * ```typescript\n * const shortId = generateShortId();\n * // => 'x7k9m2ab'\n * ```\n */\nexport function generateShortId(): string {\n const cryptoApi = globalThis.crypto as { randomUUID?: () => string } | undefined;\n if (cryptoApi?.randomUUID) {\n return cryptoApi.randomUUID().replace(/-/g, '').slice(0, SHORT_ID_LENGTH);\n }\n return Math.random()\n .toString(RANDOM_ID_RADIX)\n .slice(RANDOM_ID_SLICE_START, RANDOM_ID_SLICE_START + SHORT_ID_LENGTH);\n}\n\n/**\n * Generate a correlation ID for tracing.\n * Format: timestamp-randomString\n *\n * @returns A correlation ID string\n *\n * @example\n * ```typescript\n * const correlationId = generateCorrelationId();\n * // => '1701475200000-x7k9m2'\n * ```\n */\nexport function generateCorrelationId(): string {\n return `${Date.now()}-${generateShortId()}`;\n}\n\n/**\n * Generate a trace ID for distributed tracing (32 hex characters / 128 bits).\n *\n * @returns A 32-character hex string\n *\n * @example\n * ```typescript\n * const traceId = generateTraceId();\n * // => 'a1b2c3d4e5f67890abcdef1234567890'\n * ```\n */\nexport function generateTraceId(): string {\n const cryptoApi = globalThis.crypto as { randomUUID?: () => string } | undefined;\n if (cryptoApi?.randomUUID) {\n // Use two UUIDs without dashes to get 64 hex chars, take first 32\n return cryptoApi.randomUUID().replace(/-/g, '');\n }\n // Fallback: concatenate two random hex strings\n return (\n Math.random().toString(HEX_RADIX).substring(HEX_SLICE_START, HEX_SLICE_END) +\n Math.random().toString(HEX_RADIX).substring(HEX_SLICE_START, HEX_SLICE_END)\n );\n}\n\n/**\n * Generate a span ID for distributed tracing (16 hex characters / 64 bits).\n *\n * @returns A 16-character hex string\n *\n * @example\n * ```typescript\n * const spanId = generateSpanId();\n * // => 'a1b2c3d4e5f67890'\n * ```\n */\nexport function generateSpanId(): string {\n const cryptoApi = globalThis.crypto as { randomUUID?: () => string } | undefined;\n if (cryptoApi?.randomUUID) {\n // Use UUID without dashes, take first 16 chars\n return cryptoApi.randomUUID().replace(/-/g, '').substring(0, SPAN_ID_LENGTH);\n }\n // Fallback: random hex string\n return Math.random().toString(HEX_RADIX).substring(HEX_SLICE_START, HEX_SLICE_END);\n}\n\n/**\n * ID generation utilities object for convenient access.\n */\nexport const IdUtils = {\n generate: generateId,\n generateShort: generateShortId,\n generateCorrelation: generateCorrelationId,\n generateTraceId,\n generateSpanId,\n} as const;\n","/* eslint-disable complexity */\n/**\n * Value Utilities\n *\n * Common utility functions for working with different value types.\n *\n * @fileoverview Value manipulation utilities\n * @version 1.0.0\n */\n\nimport { MATH_CONSTANTS } from '@plyaz/config';\n\n/**\n * Determines if a value should be considered 'truthy' for feature flags.\n * More strict than JavaScript's built-in truthiness.\n *\n * @param value - The value to check\n * @returns true if the value is considered enabled/truthy\n *\n * @example\n * ```typescript\n * isTruthy(true) // true\n * isTruthy('enabled') // true\n * isTruthy('') // false\n * isTruthy('false') // false\n * isTruthy(0) // false\n * isTruthy(42) // true\n * isTruthy({}) // false\n * ```\n */\n// Helper function to check if a string is falsy\nfunction isStringFalsy(value: string): boolean {\n if (value === '') return true;\n const lower = value.toLowerCase().trim();\n return ['false', 'no', '0', 'off', 'disabled'].includes(lower);\n}\n\n// Helper function to check if an object is truthy\nfunction isObjectTruthy(value: object): boolean {\n if (Array.isArray(value)) return value.length > 0;\n if (value instanceof Map || value instanceof Set) return value.size > 0;\n if (value.constructor === Object) return Object.keys(value).length > 0;\n return true; // All other objects (Date, RegExp, etc) are truthy\n}\n\nexport function isTruthy(value: unknown): boolean {\n if (value === null || value === undefined) return false;\n\n switch (typeof value) {\n case 'boolean':\n return value;\n case 'string':\n return !isStringFalsy(value);\n case 'number':\n return value !== 0 && !isNaN(value);\n case 'function':\n case 'symbol':\n return true;\n case 'object':\n return isObjectTruthy(value);\n default:\n return false;\n }\n}\n\n/**\n * Safely converts a value to a boolean with feature flag semantics.\n *\n * @param value - Value to convert\n * @param defaultValue - Default if conversion fails (default: false)\n * @returns Boolean representation\n *\n * @example\n * ```typescript\n * toBoolean('true') // true\n * toBoolean('yes') // true\n * toBoolean('1') // true\n * toBoolean('false') // false\n * toBoolean('no') // false\n * toBoolean('0') // false\n * ```\n */\n// Helper function to parse string to boolean\nfunction parseStringToBoolean(value: string, defaultValue: boolean): boolean {\n const lower = value.toLowerCase();\n if (['true', 'yes', '1', 'on', 'enabled'].includes(lower)) return true;\n if (['false', 'no', '0', 'off', 'disabled'].includes(lower)) return false;\n return defaultValue;\n}\n\nexport function toBoolean(value: unknown, defaultValue: boolean = false): boolean {\n if (value === null || value === undefined) return false;\n\n switch (typeof value) {\n case 'boolean':\n return value;\n case 'string':\n return parseStringToBoolean(value, defaultValue);\n case 'number':\n return value !== 0 && !isNaN(value);\n case 'object':\n case 'function':\n return true;\n default:\n return defaultValue;\n }\n}\n\n/**\n * Value validation and conversion utilities.\n */\nexport const ValueUtils = {\n /**\n * Checks if a value is a valid percentage (0-100).\n *\n * @param value - Value to check\n * @returns true if valid percentage\n */\n isValidPercentage: (value: unknown): boolean => {\n if (typeof value !== 'number') return false;\n return !isNaN(value) && isFinite(value) && value >= 0 && value <= MATH_CONSTANTS.PERCENTAGE_MAX;\n },\n\n /**\n * Clamps a number to a specific range.\n *\n * @param value - Value to clamp\n * @param min - Minimum value\n * @param max - Maximum value\n * @returns Clamped value\n */\n clamp: (value: number, min: number, max: number): number => {\n return Math.min(Math.max(value, min), max);\n },\n\n /**\n * Checks if a value is empty (null, undefined, empty string, empty array).\n *\n * @param value - Value to check\n * @returns true if empty\n */\n isEmpty: (value: unknown): boolean => {\n if (value === null || value === undefined) return true;\n if (typeof value === 'string') return value.trim() === '';\n if (Array.isArray(value)) return value.length === 0;\n if (typeof value === 'object') return Object.keys(value).length === 0;\n return false;\n },\n\n /**\n * Safely gets a nested property from an object.\n *\n * @param obj - Object to query\n * @param path - Dot-separated path (e.g., 'user.profile.name')\n * @param defaultValue - Default if path doesn't exist\n * @returns Property value or default\n */\n getNestedProperty: (obj: unknown, path: string, defaultValue?: unknown): unknown => {\n if (!obj || typeof obj !== 'object') return defaultValue;\n\n const keys = path.split('.');\n let current: unknown = obj;\n\n for (const key of keys) {\n if (current == null || typeof current !== 'object') return defaultValue;\n current = (current as Record<string, unknown>)[key];\n if (current === undefined) return defaultValue;\n }\n\n return current;\n },\n} as const;\n","/**\n * Core Event Manager\n *\n * Type-safe event system for the Plyaz ecosystem.\n * Services emit events → Store, API cache, and UI subscribe independently.\n *\n * @example\n * ```typescript\n * import { CoreEventManager, CORE_EVENTS } from '@plyaz/core/events';\n *\n * // Type-safe emission (using CORE_EVENTS constants)\n * CoreEventManager.emit(CORE_EVENTS.API.REQUEST_ERROR, {\n * method: 'GET',\n * url: '/api/users',\n * requestId: '123',\n * error: new Error('Failed'),\n * duration: 500,\n * });\n *\n * // Type-safe subscription\n * CoreEventManager.on(CORE_EVENTS.AUTH.LOGIN, (event) => {\n * console.log(event.data.userId); // Typed!\n * });\n *\n * // Custom events (with generic type)\n * CoreEventManager.emit<MyPayload>('custom:event', { custom: 'data' });\n * ```\n */\n\nimport { EventEmitter } from 'events';\nimport type { CoreEventPayloadMap, CoreEventScopeType, CoreEvent } from '@plyaz/types/core';\nimport { generateCorrelationId } from '../utils/common';\n\n/**\n * Core Event Manager\n *\n * Features:\n * - Type-safe event emission and subscription via CORE_EVENTS constants\n * - Scope-based event filtering\n * - Wildcard subscriptions\n * - Auto cleanup on dispose\n * - Correlation IDs for tracing\n *\n * @example\n * ```typescript\n * import { CoreEventManager, CORE_EVENTS } from '@plyaz/core/events';\n *\n * // Type-safe with CORE_EVENTS\n * CoreEventManager.emit(CORE_EVENTS.AUTH.LOGIN, {\n * userId: '123',\n * method: 'email',\n * });\n *\n * CoreEventManager.on(CORE_EVENTS.AUTH.LOGIN, (event) => {\n * console.log(event.data.userId); // Typed as string!\n * });\n *\n * // Custom events with explicit type\n * interface MyPayload { custom: string }\n * CoreEventManager.emit<MyPayload>('custom:event', { custom: 'data' });\n * ```\n */\n\n// Constants\nconst MAX_EVENT_LISTENERS = 100;\n\nclass CoreEventManagerClass {\n private emitter = new EventEmitter();\n private subscriptions = new Map<string, Set<(event: CoreEvent<unknown, string>) => void>>();\n\n constructor() {\n // Increase max listeners for large apps\n this.emitter.setMaxListeners(MAX_EVENT_LISTENERS);\n }\n\n /**\n * Emit an event\n *\n * @param eventType - Event type from CORE_EVENTS or custom string\n * @param data - Event payload (type-safe when using CORE_EVENTS)\n *\n * @example\n * ```typescript\n * // Type-safe with CORE_EVENTS\n * CoreEventManager.emit(CORE_EVENTS.AUTH.LOGIN, { userId: '123', method: 'email' });\n *\n * // Custom event\n * CoreEventManager.emit<MyPayload>('custom:event', { custom: 'data' });\n * ```\n */\n emit<T extends keyof CoreEventPayloadMap>(eventType: T, data: CoreEventPayloadMap[T]): boolean;\n emit<TData = unknown>(eventType: string, data?: TData): boolean;\n emit<TData = unknown>(eventType: string, data?: TData): boolean {\n const [scope] = eventType.split(':');\n const event: CoreEvent<TData, string> = {\n type: eventType,\n scope: scope ?? 'system',\n timestamp: Date.now(),\n correlationId: this.getCorrelationId(),\n data: data as TData,\n };\n\n // Emit to specific listeners\n this.emitter.emit(eventType, event);\n\n // Emit to wildcard listeners\n this.emitter.emit('*', event);\n\n return true;\n }\n\n /**\n * Subscribe to an event\n *\n * @param eventType - Event type from CORE_EVENTS or custom string\n * @param handler - Event handler (type-safe when using CORE_EVENTS)\n * @returns Unsubscribe function\n *\n * @example\n * ```typescript\n * // Type-safe with CORE_EVENTS\n * const unsub = CoreEventManager.on(CORE_EVENTS.AUTH.LOGIN, (event) => {\n * console.log(event.data.userId); // Typed!\n * });\n *\n * // Custom event\n * CoreEventManager.on<MyPayload>('custom:event', (event) => {\n * console.log(event.data.custom);\n * });\n * ```\n */\n on<T extends keyof CoreEventPayloadMap>(\n eventType: T,\n handler: (event: CoreEvent<CoreEventPayloadMap[T], CoreEventScopeType>) => void\n ): () => void;\n on<TData = unknown, TScope extends string = string>(\n eventType: string,\n handler: (event: CoreEvent<TData, TScope>) => void\n ): () => void;\n on<TData = unknown, TScope extends string = string>(\n eventType: string,\n handler: (event: CoreEvent<TData, TScope>) => void\n ): () => void {\n this.emitter.on(eventType, handler as (event: CoreEvent<unknown, string>) => void);\n\n // Track for cleanup\n if (!this.subscriptions.has(eventType)) {\n this.subscriptions.set(eventType, new Set());\n }\n this.subscriptions.get(eventType)!.add(handler as (event: CoreEvent<unknown, string>) => void);\n\n // Return unsubscribe function\n return () => {\n this.emitter.off(eventType, handler as (event: CoreEvent<unknown, string>) => void);\n this.subscriptions\n .get(eventType)\n ?.delete(handler as (event: CoreEvent<unknown, string>) => void);\n };\n }\n\n /**\n * Subscribe once to an event\n *\n * @param eventType - Event type from CORE_EVENTS or custom string\n * @param handler - Event handler\n * @returns Unsubscribe function\n */\n once<T extends keyof CoreEventPayloadMap>(\n eventType: T,\n handler: (event: CoreEvent<CoreEventPayloadMap[T], CoreEventScopeType>) => void\n ): () => void;\n once<TData = unknown, TScope extends string = string>(\n eventType: string,\n handler: (event: CoreEvent<TData, TScope>) => void\n ): () => void;\n once<TData = unknown, TScope extends string = string>(\n eventType: string,\n handler: (event: CoreEvent<TData, TScope>) => void\n ): () => void {\n const wrappedHandler = (event: CoreEvent<TData, TScope>): void => {\n handler(event);\n this.emitter.off(eventType, wrappedHandler as (event: CoreEvent<unknown, string>) => void);\n this.subscriptions\n .get(eventType)\n ?.delete(wrappedHandler as (event: CoreEvent<unknown, string>) => void);\n };\n\n this.emitter.on(eventType, wrappedHandler as (event: CoreEvent<unknown, string>) => void);\n\n // Track for cleanup\n if (!this.subscriptions.has(eventType)) {\n this.subscriptions.set(eventType, new Set());\n }\n this.subscriptions\n .get(eventType)!\n .add(wrappedHandler as (event: CoreEvent<unknown, string>) => void);\n\n // Return unsubscribe function\n return () => {\n this.emitter.off(eventType, wrappedHandler as (event: CoreEvent<unknown, string>) => void);\n this.subscriptions\n .get(eventType)\n ?.delete(wrappedHandler as (event: CoreEvent<unknown, string>) => void);\n };\n }\n\n /**\n * Subscribe to all events in a scope\n *\n * @param scope - Event scope to listen to (e.g., CoreEventScope.AUTH)\n * @param handler - Event handler\n * @returns Unsubscribe function\n *\n * @example\n * ```typescript\n * CoreEventManager.onScope(CoreEventScope.AUTH, (event) => {\n * // Handles auth:login, auth:logout, auth:tokenRefresh, etc.\n * console.log(`Auth event: ${event.type}`, event.data);\n * });\n * ```\n */\n onScope<TScope extends string = string, TData = unknown>(\n scope: TScope,\n handler: (event: CoreEvent<TData, TScope>) => void\n ): () => void {\n const wrappedHandler = (event: CoreEvent<TData, TScope>): void => {\n if (event.scope === scope) {\n handler(event);\n }\n };\n return this.on('*', wrappedHandler as (event: CoreEvent<unknown, string>) => void);\n }\n\n /**\n * Remove a specific handler from an event\n *\n * @param eventType - Event type\n * @param handler - Handler to remove\n */\n off<TData = unknown, TScope extends string = string>(\n eventType: string,\n handler: (event: CoreEvent<TData, TScope>) => void\n ): void {\n this.emitter.off(eventType, handler as (event: CoreEvent<unknown, string>) => void);\n this.subscriptions\n .get(eventType)\n ?.delete(handler as (event: CoreEvent<unknown, string>) => void);\n }\n\n /**\n * Dispose all subscriptions\n */\n dispose(): void {\n this.subscriptions.forEach((handlers, eventType) => {\n handlers.forEach(handler => this.emitter.off(eventType, handler));\n });\n this.subscriptions.clear();\n this.emitter.removeAllListeners();\n }\n\n /**\n * Generate correlation ID for event tracing\n */\n private getCorrelationId(): string {\n return generateCorrelationId();\n }\n}\n\n// Singleton export\nexport const CoreEventManager = new CoreEventManagerClass();\n","/**\n * API Client Singleton Service (@plyaz/core)\n * Manages the API client with environment-specific configurations and intelligent defaults\n *\n * The app reads process.env and constructs ApiClientOptions, then passes to this service.\n * Service never touches process.env directly - all env reading happens in the app layer.\n *\n * @module services/ApiClientService\n */\n\n// Imports from @plyaz/api (dependency)\nimport { createApiClient, mergeConfigs, setDefaultApiClient } from '@plyaz/api/frontend';\nimport type { ApiClientWithEvents, ApiClientOptions, ApiConfig } from '@plyaz/types/api';\nimport { type ClientEventManager, type EndpointsList, ApiPackageError } from '@plyaz/api/frontend';\nimport { PRODUCTION_CONFIG, STAGING_CONFIG, DEVELOPMENT_CONFIG } from '@plyaz/config';\nimport {\n API_ERROR_CODES,\n PACKAGE_STATUS_CODES,\n OPERATIONS,\n ERROR_CODES,\n ERROR_CATEGORY,\n HTTP_STATUS,\n CORE_EVENTS,\n} from '@plyaz/types';\nimport type { CoreApiRequestErrorPayload, CoreApiEnvironmentConfig } from '@plyaz/types/core';\nimport { CoreEventManager } from '../events/CoreEventManager';\nimport { generateRequestId } from '@plyaz/errors';\nimport type { ResponseError } from 'fetchff';\n// Note: Root store is injected by Core.initialize(), not created here\n\n/**\n * Minimum retry attempts recommended for production environments\n *\n * Production services should have sufficient retries to handle transient failures\n * while maintaining acceptable response times for end users.\n *\n * @constant\n * @default 3\n */\nconst MIN_RETRY_ATTEMPTS_PRODUCTION = 3;\n\n/**\n * Get configuration based on environment\n *\n * Returns environment-specific defaults that will be merged with user configuration.\n * Each environment has optimized settings for its use case:\n *\n * - **Production**: Aggressive retries (5), encryption required, telemetry enabled\n * - **Staging**: Mirrors production for accurate pre-deployment testing\n * - **Development/Test**: Conservative retries (1), encryption optional, full debug mode\n *\n * These defaults come from `@plyaz/config` and can be overridden via the `apiConfig` parameter.\n *\n * @param env - Environment name determining which defaults to apply\n * @returns Environment-specific configuration from @plyaz/config\n *\n * @example\n * ```typescript\n * const prodDefaults = getConfigForEnvironment('production');\n * // Returns PRODUCTION_CONFIG with aggressive retries, encryption, etc.\n *\n * const devDefaults = getConfigForEnvironment('development');\n * // Returns DEVELOPMENT_CONFIG with conservative retries, no encryption\n * ```\n *\n * @see {@link CoreApiEnvironmentConfig.env} - Environment types\n * @internal\n */\nfunction getConfigForEnvironment(env: CoreApiEnvironmentConfig['env']): Partial<ApiConfig> {\n switch (env) {\n case 'production':\n return PRODUCTION_CONFIG as Partial<ApiConfig>;\n case 'staging':\n return STAGING_CONFIG as Partial<ApiConfig>;\n case 'development':\n case 'test':\n default:\n return DEVELOPMENT_CONFIG as Partial<ApiConfig>;\n }\n}\n\n/**\n * Validate base URL requirement\n *\n * Ensures that a baseURL is provided in the configuration. The baseURL is mandatory\n * for all API clients as it defines where requests should be sent.\n *\n * @param mergedConfig - Merged configuration after applying all defaults\n * @param errors - Error array to append validation errors to\n *\n * @example\n * ```typescript\n * const errors: string[] = [];\n * validateBaseURL(mergedConfig, errors);\n *\n * if (errors.length > 0) {\n * // baseURL is missing\n * }\n * ```\n *\n * @internal\n */\nfunction validateBaseURL(mergedConfig: ApiClientOptions, errors: string[]): void {\n if (!mergedConfig.baseURL) {\n errors.push('baseURL is required in API configuration (apiConfig parameter)');\n }\n}\n\n/**\n * Validate production encryption configuration\n *\n * Production environments MUST have encryption properly configured to protect sensitive data.\n * This function validates that:\n * - If encryption is enabled, an encryption key MUST be provided\n * - If encryption is disabled, a security warning is issued\n *\n * **Why encryption is required in production**:\n * - Compliance: GDPR, CCPA, PIPL, HIPAA regulations require data protection\n * - Security: Protects PII, payment info, health data, crypto wallet addresses\n * - 50+ sensitive field patterns: email, SSN, card numbers, API keys, etc.\n *\n * @param mergedConfig - Merged configuration after applying all defaults\n * @param errors - Error array to append critical validation errors to\n * @param warnings - Warning array to append non-critical warnings to\n *\n * @example\n * ```typescript\n * const errors: string[] = [];\n * const warnings: string[] = [];\n *\n * validateProductionEncryption(mergedConfig, errors, warnings);\n *\n * // If encryption enabled but no key:\n * // errors = ['encryption.key is REQUIRED when encryption is enabled in production...']\n *\n * // If encryption disabled:\n * // warnings = ['[SECURITY WARNING] Encryption is disabled in production...']\n * ```\n *\n * @internal\n */\nfunction validateProductionEncryption(\n mergedConfig: ApiClientOptions,\n errors: string[],\n warnings: string[]\n): void {\n if (mergedConfig.encryption?.enabled) {\n if (!mergedConfig.encryption?.key) {\n errors.push(\n 'encryption.key is REQUIRED when encryption is enabled in production. ' +\n 'Pass it in apiConfig: { encryption: { key: { id: \"prod-key-v1\", key: process.env.ENCRYPTION_KEY!, algorithm: \"AES-GCM\", format: \"raw\" } } }'\n );\n }\n } else {\n warnings.push(\n '[SECURITY WARNING] Encryption is disabled in production. ' +\n 'This is not recommended for handling sensitive data (PII, payment info, etc.).'\n );\n }\n}\n\n/**\n * Validate production performance settings\n *\n * Validates production configuration for optimal performance, reliability, and monitoring:\n * - **Network-aware features**: Adapts to varying network conditions for better UX\n * - **Telemetry**: Required for production monitoring and alerting\n * - **Retry attempts**: Minimum 3 retries recommended for reliability\n *\n * These are warnings (not errors) as they don't prevent the client from working,\n * but indicate suboptimal production configuration.\n *\n * @param mergedConfig - Merged configuration after applying all defaults\n * @param warnings - Warning array to append performance warnings to\n *\n * @example\n * ```typescript\n * const warnings: string[] = [];\n * validateProductionPerformance(mergedConfig, warnings);\n *\n * // Possible warnings:\n * // - '[PERFORMANCE WARNING] networkAware is disabled in production...'\n * // - '[MONITORING WARNING] telemetry is disabled in production...'\n * // - '[RELIABILITY WARNING] Only 1 retry attempts configured...'\n * ```\n *\n * @internal\n */\nfunction validateProductionPerformance(mergedConfig: ApiClientOptions, warnings: string[]): void {\n if (!mergedConfig.networkAware?.enabled) {\n warnings.push(\n '[PERFORMANCE WARNING] networkAware is disabled in production. ' +\n 'Enable it for better user experience on varying network conditions.'\n );\n }\n\n if (!mergedConfig.tracking?.telemetry) {\n warnings.push(\n '[MONITORING WARNING] telemetry is disabled in production. ' +\n 'Enable it for production monitoring and alerting.'\n );\n }\n\n if (\n mergedConfig.retry &&\n mergedConfig.retry.attempts !== undefined &&\n mergedConfig.retry.attempts < MIN_RETRY_ATTEMPTS_PRODUCTION\n ) {\n warnings.push(\n `[RELIABILITY WARNING] Only ${mergedConfig.retry.attempts} retry attempts configured. ` +\n 'Consider increasing to 3-5 for better reliability in production.'\n );\n }\n}\n\n/**\n * Validate staging encryption configuration\n *\n * Staging environments should mirror production configuration for accurate pre-deployment testing.\n * This function validates:\n * - If encryption is enabled, an encryption key MUST be provided (same as production)\n * - If encryption is disabled, issues a warning (staging should match production)\n * - Telemetry should be enabled to test monitoring before production\n *\n * **Why staging should mirror production**:\n * - Catches configuration issues before they reach production\n * - Tests encryption/decryption with real-world-like data\n * - Validates monitoring and alerting pipelines\n *\n * @param mergedConfig - Merged configuration after applying all defaults\n * @param errors - Error array to append critical validation errors to\n * @param warnings - Warning array to append configuration warnings to\n *\n * @example\n * ```typescript\n * const errors: string[] = [];\n * const warnings: string[] = [];\n *\n * validateStagingEncryption(mergedConfig, errors, warnings);\n *\n * // If encryption enabled but no key:\n * // errors = ['encryption.key is REQUIRED in staging (aligned with production)...']\n *\n * // If encryption or telemetry disabled:\n * // warnings = ['[SECURITY WARNING] Encryption is disabled in staging...']\n * ```\n *\n * @internal\n */\nfunction validateStagingEncryption(\n mergedConfig: ApiClientOptions,\n errors: string[],\n warnings: string[]\n): void {\n if (mergedConfig.encryption?.enabled) {\n if (!mergedConfig.encryption?.key) {\n errors.push(\n 'encryption.key is REQUIRED in staging (aligned with production). ' +\n 'Pass it in apiConfig: { encryption: { key: { id: \"staging-key-v1\", key: process.env.ENCRYPTION_KEY!, algorithm: \"AES-GCM\", format: \"raw\" } } }'\n );\n }\n } else {\n warnings.push(\n '[SECURITY WARNING] Encryption is disabled in staging. ' +\n 'Staging should mirror production for accurate testing.'\n );\n }\n\n if (!mergedConfig.tracking?.telemetry) {\n warnings.push(\n '[MONITORING WARNING] telemetry is disabled in staging. ' +\n 'Enable it to test monitoring before production deployment.'\n );\n }\n}\n\n/**\n * Validate development encryption configuration\n *\n * Development environments have more relaxed requirements to facilitate rapid development:\n * - Encryption is OPTIONAL (enabled flag can be true, but key is not required)\n * - When encryption is enabled without a key, issues an informational warning\n *\n * **Why encryption is optional in development**:\n * - Faster iteration without needing to manage encryption keys\n * - Easier debugging of request/response payloads\n * - Test data typically doesn't contain real sensitive information\n *\n * @param mergedConfig - Merged configuration after applying all defaults\n * @param warnings - Warning array to append informational messages to\n *\n * @example\n * ```typescript\n * const warnings: string[] = [];\n * validateDevelopmentEncryption(mergedConfig, warnings);\n *\n * // If encryption enabled without key:\n * // warnings = ['[DEV INFO] Encryption is enabled but no key provided...']\n * ```\n *\n * @internal\n */\nfunction validateDevelopmentEncryption(mergedConfig: ApiClientOptions, warnings: string[]): void {\n if (mergedConfig.encryption?.enabled && !mergedConfig.encryption?.key) {\n warnings.push(\n '[DEV INFO] Encryption is enabled but no key provided in apiConfig. ' +\n 'Encryption will be skipped in development (this is normal).'\n );\n }\n}\n\n/**\n * Map environment metadata to API configuration structure\n *\n * Converts environment-level metadata from `CoreApiEnvironmentConfig` into `ApiConfig` format\n * that can be merged with other configurations. Currently maps:\n *\n * - **apiKey**: Converted to static header `X-API-Key`\n * - **rateLimit**: Reserved for future use (not currently mapped)\n *\n * **Note**: This mapping is applied AFTER environment defaults but BEFORE user-provided\n * apiConfig, giving it medium priority in the configuration merge hierarchy.\n *\n * @param envConfig - Environment configuration containing metadata\n * @param envDefaults - Environment-specific defaults from @plyaz/config\n * @returns Partial API configuration with mapped environment metadata\n *\n * @example\n * ```typescript\n * const envConfig = { env: 'production', apiKey: 'my-api-key' };\n * const envDefaults = PRODUCTION_CONFIG;\n *\n * const mapped = mapEnvironmentMetadata(envConfig, envDefaults);\n * // Returns: { headers: { static: { 'X-API-Key': 'my-api-key' } } }\n * ```\n *\n * @see {@link CoreApiEnvironmentConfig} - Environment configuration interface\n * @internal\n */\nfunction mapEnvironmentMetadata(\n envConfig: CoreApiEnvironmentConfig,\n envDefaults: Partial<ApiConfig>\n): Partial<ApiConfig> {\n const mapped: Partial<ApiConfig> = {};\n\n // Add API key to headers if provided\n if (envConfig.apiKey) {\n // Extract existing static headers if headers is an object with static property\n const existingStatic =\n envDefaults.headers &&\n typeof envDefaults.headers === 'object' &&\n 'static' in envDefaults.headers &&\n typeof envDefaults.headers.static === 'object'\n ? envDefaults.headers.static\n : {};\n\n mapped.headers = {\n static: { ...(existingStatic ?? {}), 'X-API-Key': envConfig.apiKey },\n };\n }\n\n // Note: rateLimit from envConfig is not mapped to ApiConfig\n // Rate limiting is typically handled at the server/API gateway level\n // If needed in the future, it should be added to ApiConfig interface first\n\n return mapped;\n}\n\n/**\n * Apply default client setting to @plyaz/api services and hooks\n *\n * Conditionally calls `setDefaultApiClient()` based on the `setAsDefault` flag in environment config.\n * When enabled, all services and hooks from @plyaz/api will automatically use this client instance\n * without needing to pass it explicitly via `ServiceOptions.apiClient`.\n *\n * **Default behavior**: If `setAsDefault` is not specified, it defaults to `true`.\n *\n * **Use cases**:\n * - `true` (default): Single API client for the entire application (recommended for most apps)\n * - `false`: Multiple API clients (main API, analytics API, etc.) or testing scenarios\n *\n * @param client - The API client instance to set as default\n * @param envConfig - Environment configuration containing the setAsDefault flag\n *\n * @example\n * ```typescript\n * const client = await createApiClient(config);\n * const envConfig = { env: 'production', setAsDefault: true };\n *\n * applyDefaultClientSetting(client, envConfig);\n * // Now all @plyaz/api services use this client automatically\n *\n * const campaigns = await fetchCampaigns({ page: 1 });\n * // No need to pass apiClient - uses the default\n * ```\n *\n * @example\n * ```typescript\n * // Multiple clients scenario\n * const mainClient = await createApiClient(mainConfig);\n * const analyticsClient = await createApiClient(analyticsConfig);\n *\n * applyDefaultClientSetting(mainClient, { env: 'production', setAsDefault: true });\n * applyDefaultClientSetting(analyticsClient, { env: 'production', setAsDefault: false });\n *\n * // Main API uses default\n * const campaigns = await fetchCampaigns({ page: 1 });\n *\n * // Analytics API must be passed explicitly\n * const analytics = await fetchAnalytics(\n * { date: '2025-10-16' },\n * { apiClient: analyticsClient }\n * );\n * ```\n *\n * @see {@link CoreApiEnvironmentConfig.setAsDefault} - Flag documentation\n * @see {@link ServiceOptions.apiClient} - How to override the default client\n * @internal\n */\nfunction applyDefaultClientSetting(\n client: ApiClientWithEvents<ClientEventManager, EndpointsList>,\n envConfig: CoreApiEnvironmentConfig\n): void {\n const shouldSetAsDefault = envConfig.setAsDefault !== false;\n if (shouldSetAsDefault) {\n setDefaultApiClient(client);\n }\n}\n\n/**\n * Validate environment configuration for production readiness.\n * Ensures critical settings are properly configured based on environment.\n *\n * @param envConfig - Environment configuration\n * @param mergedConfig - Merged configuration after applying all defaults\n * @throws {ApiPackageError} If validation fails\n */\nfunction validateEnvironmentConfig(\n envConfig: CoreApiEnvironmentConfig,\n mergedConfig: ApiClientOptions\n): void {\n const errors: string[] = [];\n const warnings: string[] = [];\n\n // Validate required base URL\n validateBaseURL(mergedConfig, errors);\n\n // Environment-specific validation\n if (envConfig.env === 'production') {\n validateProductionEncryption(mergedConfig, errors, warnings);\n validateProductionPerformance(mergedConfig, warnings);\n } else if (envConfig.env === 'staging') {\n validateStagingEncryption(mergedConfig, errors, warnings);\n } else if (envConfig.env === 'development') {\n validateDevelopmentEncryption(mergedConfig, warnings);\n }\n\n // Log warnings (intentional console usage for config validation)\n if (warnings.length > 0) {\n globalThis.console.warn('[ApiClientService] Configuration warnings:', warnings);\n }\n\n // Throw if there are errors\n if (errors.length > 0) {\n throw new ApiPackageError(\n 'service.validation.failed',\n PACKAGE_STATUS_CODES.INVALID_CONFIGURATION,\n API_ERROR_CODES.CONFIG_VALIDATION_FAILED,\n {\n context: {\n operation: OPERATIONS.VALIDATION,\n // Ensure error details conform to ErrorDetail shape (include errorCode)\n errors: errors.map(err => ({\n field: 'config',\n message: err,\n errorCode: String(API_ERROR_CODES.CONFIG_VALIDATION_FAILED),\n })),\n i18n: {\n errors: errors.join('; '),\n warnings: warnings.join('; '),\n },\n },\n }\n );\n }\n}\n\n/**\n * API Client Singleton Service\n * Manages API client instance lifecycle with environment-specific configurations\n *\n * @example\n * ```typescript\n * // In your app initialization (Next.js, React, etc.)\n * import { ApiClientService } from '@plyaz/core';\n *\n * // Environment metadata\n * const envConfig = {\n * env: process.env.NODE_ENV as 'production',\n * apiKey: process.env.API_KEY,\n * };\n *\n * // API configuration with event handlers\n * await ApiClientService.init(envConfig, {\n * baseURL: process.env.API_URL!,\n * encryption: {\n * key: {\n * id: 'prod-key-v1',\n * key: process.env.ENCRYPTION_KEY!,\n * algorithm: 'AES-GCM'\n * }\n * },\n * clientEvents: {\n * onRequestStart: (event) => apiStore.trackRequest(event),\n * },\n * });\n *\n * // Later, anywhere in your app\n * const client = ApiClientService.getClient();\n * ```\n */\nexport class ApiClientService {\n private static instance: ApiClientWithEvents<ClientEventManager, EndpointsList> | null = null;\n private static isInitializing = false;\n private static initPromise: Promise<void> | null = null;\n\n /**\n * Initialize the API client with environment config and API options\n *\n * @param envConfig - Environment metadata (env, apiKey)\n * @param apiConfig - API configuration (baseURL, encryption, timeout, event handlers, etc.)\n * @returns Promise that resolves to the initialized client\n */\n static async init(\n envConfig: CoreApiEnvironmentConfig,\n apiConfig?: Partial<ApiClientOptions>\n ): Promise<ApiClientWithEvents<ClientEventManager, EndpointsList>> {\n // If already initialized, return existing instance\n if (this.instance) {\n globalThis.console.warn(\n '[ApiClientService] Client already initialized. Returning existing instance.'\n );\n return this.instance;\n }\n\n // If currently initializing, wait for that to complete\n if (this.isInitializing && this.initPromise) {\n await this.initPromise;\n return this.instance!;\n }\n\n // Start initialization\n this.isInitializing = true;\n this.initPromise = this.createClient(envConfig, apiConfig);\n\n try {\n await this.initPromise;\n return this.instance!;\n } finally {\n this.isInitializing = false;\n this.initPromise = null;\n }\n }\n\n /**\n * Internal initialization logic\n * Merges environment-specific defaults with API configuration\n *\n * Merge Priority (lowest to highest):\n * 1. Environment defaults (PRODUCTION_CONFIG / STAGING_CONFIG / DEVELOPMENT_CONFIG)\n * 2. Environment metadata (envConfig - apiKey)\n * 3. API configuration (apiConfig - baseURL, encryption, timeout, etc.)\n */\n // eslint-disable-next-line max-lines-per-function, complexity\n private static async createClient(\n envConfig: CoreApiEnvironmentConfig,\n apiConfig?: Partial<ApiClientOptions>\n ): Promise<void> {\n try {\n // Step 1: Get environment-specific defaults based on env\n const envDefaults = getConfigForEnvironment(envConfig.env);\n\n // Step 2: Build config from envConfig (environment metadata only)\n const envMetadataMapped = mapEnvironmentMetadata(envConfig, envDefaults);\n\n // Step 3: Create onError handler to emit errors to Core\n const coreErrorHandler = async (\n error: ResponseError<unknown, unknown, unknown, unknown>\n // eslint-disable-next-line complexity\n ): Promise<void> => {\n const requestId = generateRequestId();\n const method = error.config?.method ?? 'UNKNOWN';\n const url = error.config?.url ?? 'unknown';\n\n // CRITICAL: Emit error event to Core\n // Core will handle updating the appropriate store based on runtime context:\n // - Backend: In-memory store (ServerErrorMiddleware)\n // - Frontend: Zustand store (useRootStore)\n try {\n // API returns ErrorResponse (array of error details)\n const errorDetails = Array.isArray(error.response?.data) ? error.response.data : [];\n\n // If no error details from API, create a fallback error\n if (errorDetails.length === 0) {\n const serializedError = {\n id: requestId,\n code: ERROR_CODES.CORE_API_CLIENT_REQUEST_FAILED,\n message: error.message ?? 'API request failed',\n status: error.status,\n category: ERROR_CATEGORY.Network,\n timestamp: new Date().toISOString(),\n isRetryable: error.status ? error.status >= HTTP_STATUS.INTERNAL_SERVER_ERROR : false,\n source: 'api-client',\n dismissed: false,\n context: {\n method,\n url,\n requestId,\n },\n };\n\n // Emit single error to Core\n CoreEventManager.emit(CORE_EVENTS.SYSTEM.ERROR, { errors: [serializedError] });\n } else {\n // Convert ErrorResponse (API error details array) to SerializedError[]\n const serializedErrors = errorDetails.map(\n (detail: Record<string, unknown>, index: number) => ({\n id: `${requestId}-${index}`,\n code: (detail.errorCode as string) ?? ERROR_CODES.CORE_API_CLIENT_REQUEST_FAILED,\n message: (detail.message as string) ?? error.message ?? 'API request failed',\n status: error.status,\n category: ERROR_CATEGORY.Network,\n timestamp: new Date().toISOString(),\n isRetryable: error.status\n ? error.status >= HTTP_STATUS.INTERNAL_SERVER_ERROR\n : false,\n source: 'api-client',\n dismissed: false,\n context: {\n method,\n url,\n requestId,\n field: detail.field as string | undefined,\n valueGiven: detail.valueGiven,\n allowedValues: detail.allowedValues,\n constraints: detail.constraints,\n },\n })\n );\n\n // Emit array of errors to Core\n CoreEventManager.emit(CORE_EVENTS.SYSTEM.ERROR, { errors: serializedErrors });\n }\n } catch (e) {\n // If event emission fails, log but don't break the error flow\n console.error('[ApiClientService] Failed to emit error event:', e);\n }\n\n // Also emit API-specific error event for logging, monitoring, etc.\n ApiClientService.emitApiError(error, {\n method,\n url,\n requestId,\n status: error.status,\n duration: 0,\n });\n };\n\n // Step 4: Merge with priority: envDefaults → envMetadata → apiConfig → coreErrorHandler\n const userOnError = apiConfig?.onError;\n const combinedOnError = userOnError\n ? Array.isArray(userOnError)\n ? [...userOnError, coreErrorHandler]\n : [userOnError, coreErrorHandler]\n : coreErrorHandler;\n\n const mergedOptions = mergeConfigs(\n envDefaults, // Environment defaults (lowest priority)\n envMetadataMapped, // Environment metadata (medium priority)\n { ...(apiConfig ?? {}), onError: combinedOnError } // API configuration + core error handler\n ) as ApiClientOptions;\n\n // Step 5: Validate the merged configuration\n validateEnvironmentConfig(envConfig, mergedOptions);\n\n // Step 6: Create the client instance with merged configuration\n this.instance = await createApiClient(mergedOptions);\n\n // Step 6: Set as default client for @plyaz/api services and hooks (if enabled)\n applyDefaultClientSetting(this.instance, envConfig);\n } catch (error) {\n throw new ApiPackageError(\n 'service.initialization.failed',\n PACKAGE_STATUS_CODES.INITIALIZATION_FAILED,\n API_ERROR_CODES.CLIENT_INITIALIZATION_FAILED,\n {\n cause: error instanceof Error ? error : undefined,\n context: {\n operation: OPERATIONS.INITIALIZATION,\n originalError: error instanceof Error ? error.message : String(error),\n i18n: {\n error: error instanceof Error ? error.message : String(error),\n },\n },\n }\n );\n }\n }\n\n /**\n * Get the initialized client instance\n *\n * @throws {ApiPackageError} If client not initialized\n */\n static getClient(): ApiClientWithEvents<ClientEventManager, EndpointsList> {\n if (!this.instance) {\n throw new ApiPackageError(\n 'service.not_initialized',\n PACKAGE_STATUS_CODES.INITIALIZATION_FAILED,\n API_ERROR_CODES.CLIENT_INITIALIZATION_FAILED,\n {\n context: {\n operation: OPERATIONS.INITIALIZATION,\n i18n: {\n hint: 'Call ApiClientService.init(envConfig, apiConfig) before accessing the client',\n },\n },\n }\n );\n }\n return this.instance;\n }\n\n /**\n * Check if client is initialized\n */\n static isInitialized(): boolean {\n return this.instance !== null;\n }\n\n /**\n * Reinitialize with new config and options\n */\n static async reinitialize(\n envConfig: CoreApiEnvironmentConfig,\n apiConfig?: Partial<ApiClientOptions>\n ): Promise<ApiClientWithEvents<ClientEventManager, EndpointsList>> {\n this.dispose();\n return this.init(envConfig, apiConfig);\n }\n\n /**\n * Dispose of the client instance\n */\n static dispose(): void {\n if (this.instance && 'dispose' in this.instance) {\n this.instance.dispose?.();\n }\n this.instance = null;\n this.isInitializing = false;\n this.initPromise = null;\n }\n\n /**\n * Emits an API error event via CoreEventManager.\n * Called when API operations fail to integrate with global error handling.\n *\n * **CRITICAL**: This event emission triggers automatic error state updates.\n * The global error store MUST subscribe to CORE_EVENTS.API.REQUEST_ERROR to:\n * 1. Capture all API errors automatically\n * 2. Update global error state for UI display\n * 3. Ensure individual domain stores remain error-free (only domain data)\n *\n * This is the unified error hook that:\n * - On frontend: Emits event that global error store subscribes to\n * - On backend: Emits event for logging/monitoring (can be configured to rethrow)\n *\n * @param error - The error that occurred\n * @param options - Additional context for the error\n * @param options.method - HTTP method (GET, POST, etc.)\n * @param options.url - Request URL\n * @param options.requestId - Unique request identifier\n * @param options.status - HTTP status code (if available)\n * @param options.duration - Request duration in ms\n * @param options.rethrow - Whether to rethrow the error after emitting (default: false)\n *\n * @example\n * ```typescript\n * // Global error store setup (in @plyaz/store)\n * CoreEventManager.on(CORE_EVENTS.API.REQUEST_ERROR, (payload) => {\n * errorStore.setError({\n * message: payload.error.message,\n * status: payload.status,\n * url: payload.url,\n * requestId: payload.requestId,\n * });\n * });\n *\n * // Frontend usage - emit to store\n * ApiClientService.emitApiError(error, {\n * method: 'GET',\n * url: '/api/users',\n * requestId: '123',\n * duration: 500,\n * });\n *\n * // Backend usage - emit and rethrow\n * ApiClientService.emitApiError(error, {\n * method: 'POST',\n * url: '/api/orders',\n * requestId: '456',\n * duration: 1200,\n * rethrow: true,\n * });\n * ```\n */\n static emitApiError(\n error: unknown,\n options: {\n method: string;\n url: string;\n requestId: string;\n status?: number;\n duration: number;\n rethrow?: boolean;\n }\n ): void {\n const payload: CoreApiRequestErrorPayload = {\n method: options.method,\n url: options.url,\n requestId: options.requestId,\n status: options.status,\n error,\n duration: options.duration,\n };\n\n CoreEventManager.emit(CORE_EVENTS.API.REQUEST_ERROR, payload);\n\n // Optionally rethrow for backend error propagation\n if (options.rethrow && error instanceof Error) {\n throw error;\n }\n }\n\n /**\n * Create a dedicated API client instance (NOT the singleton)\n *\n * Use this when you need an isolated client with its own configuration\n * that doesn't affect or get affected by the shared singleton instance.\n *\n * @param envConfig - Environment metadata (env, apiKey)\n * @param apiConfig - API configuration (baseURL, encryption, timeout, etc.)\n * @returns Promise that resolves to a new dedicated client instance\n *\n * @example\n * ```typescript\n * // Create a dedicated client for feature flags service\n * const flagsClient = await ApiClientService.createInstance(\n * { env: 'production' },\n * {\n * baseURL: 'https://flags.example.com',\n * timeout: 5000,\n * }\n * );\n *\n * // This client is independent from ApiClientService.getClient()\n * flagsClient.updateConfig({ timeout: 3000 }); // Only affects this instance\n * ```\n */\n static async createInstance(\n envConfig: CoreApiEnvironmentConfig,\n apiConfig?: Partial<ApiClientOptions>\n ): Promise<ApiClientWithEvents<ClientEventManager, EndpointsList>> {\n try {\n // Step 1: Get environment-specific defaults based on env\n const envDefaults = getConfigForEnvironment(envConfig.env);\n\n // Step 2: Build config from envConfig (environment metadata only)\n const envMetadataMapped = mapEnvironmentMetadata(envConfig, envDefaults);\n\n // Step 3: Merge with priority: envDefaults → envMetadata → apiConfig\n const mergedOptions = mergeConfigs(\n envDefaults,\n envMetadataMapped,\n apiConfig ?? {}\n ) as ApiClientOptions;\n\n // Step 4: Validate the merged configuration\n validateEnvironmentConfig(envConfig, mergedOptions);\n\n // Step 5: Create a NEW client instance (not stored as singleton)\n const dedicatedClient = await createApiClient(mergedOptions);\n\n // Note: Do NOT call applyDefaultClientSetting - this is a dedicated instance\n // that should not become the default client for @plyaz/api services\n\n return dedicatedClient;\n } catch (error) {\n throw new ApiPackageError(\n 'service.instance_creation.failed',\n PACKAGE_STATUS_CODES.INITIALIZATION_FAILED,\n API_ERROR_CODES.CLIENT_INITIALIZATION_FAILED,\n {\n cause: error instanceof Error ? error : undefined,\n context: {\n operation: OPERATIONS.INITIALIZATION,\n originalError: error instanceof Error ? error.message : String(error),\n i18n: {\n error: error instanceof Error ? error.message : String(error),\n },\n },\n }\n );\n }\n }\n}\n\n// Export convenience helpers\nexport const getApiClient = (): ApiClientWithEvents<ClientEventManager, EndpointsList> =>\n ApiClientService.getClient();\n\nexport const initApiClient = (\n envConfig: CoreApiEnvironmentConfig,\n apiConfig?: Partial<ApiClientOptions>\n): Promise<ApiClientWithEvents<ClientEventManager, EndpointsList>> =>\n ApiClientService.init(envConfig, apiConfig);\n\nexport const createApiClientInstance = (\n envConfig: CoreApiEnvironmentConfig,\n apiConfig?: Partial<ApiClientOptions>\n): Promise<ApiClientWithEvents<ClientEventManager, EndpointsList>> =>\n ApiClientService.createInstance(envConfig, apiConfig);\n","/**\n * Base Observability Adapter\n *\n * Abstract base class for all observability adapters.\n * Provides common functionality and enforces the adapter interface.\n *\n * @module base/observability\n */\n\nimport { PackageLogger } from '@plyaz/logger';\nimport type {\n ObservabilityAdapter,\n ObservabilityAdapterConfig,\n ObservabilityProvider,\n Metric,\n SpanOptions,\n Span,\n LogEntry,\n ObservabilityEvent,\n SpanContext,\n} from '@plyaz/types/observability';\nimport { generateTraceId, generateSpanId } from '@/utils/common';\n\n// ─────────────────────────────────────────────────────────────────────────────\n// Abstract Base Adapter\n// ─────────────────────────────────────────────────────────────────────────────\n\n/**\n * Abstract base class for observability adapters.\n *\n * Provides common functionality:\n * - Initialization lifecycle\n * - Default tag management\n * - Error handling\n * - Logging\n *\n * Subclasses must implement provider-specific methods.\n */\nexport abstract class BaseAdapter implements ObservabilityAdapter {\n abstract readonly provider: ObservabilityProvider;\n abstract readonly name: string;\n\n protected _isInitialized = false;\n protected _config: ObservabilityAdapterConfig | null = null;\n protected readonly logger: PackageLogger;\n\n constructor() {\n this.logger = new PackageLogger({\n packageName: 'core',\n service: 'ObservabilityAdapter',\n });\n }\n\n get isInitialized(): boolean {\n return this._isInitialized;\n }\n\n get config(): ObservabilityAdapterConfig | null {\n return this._config;\n }\n\n // ─── Lifecycle ─────────────────────────────────────────────────────────────\n\n async initialize(config: ObservabilityAdapterConfig): Promise<void> {\n if (this._isInitialized) {\n this.logger.warn(`${this.name} already initialized`);\n return;\n }\n\n this._config = config;\n\n if (config.enabled === false) {\n this.logger.info(`${this.name} disabled by configuration`);\n return;\n }\n\n await this.doInitialize(config);\n this._isInitialized = true;\n this.logger.info(`${this.name} initialized`, {\n provider: this.provider,\n serviceName: config.serviceName,\n environment: config.environment,\n });\n }\n\n async shutdown(): Promise<void> {\n if (!this._isInitialized) {\n return;\n }\n\n await this.flush();\n await this.doShutdown();\n this._isInitialized = false;\n this.logger.info(`${this.name} shut down`);\n }\n\n async isHealthy(): Promise<boolean> {\n if (!this._isInitialized) {\n return false;\n }\n return this.doHealthCheck();\n }\n\n // ─── Abstract Methods (Provider-specific) ──────────────────────────────────\n\n protected abstract doInitialize(config: ObservabilityAdapterConfig): Promise<void>;\n protected abstract doShutdown(): Promise<void>;\n protected abstract doHealthCheck(): Promise<boolean>;\n\n // ─── Metrics ───────────────────────────────────────────────────────────────\n\n async recordMetric(metric: Metric): Promise<void> {\n if (!this._isInitialized || this._config?.enabled === false) {\n return;\n }\n\n const metricWithDefaults = this.applyDefaultTags(metric);\n await this.doRecordMetric(metricWithDefaults);\n }\n\n async incrementCounter(\n name: string,\n value: number = 1,\n tags?: Record<string, string>\n ): Promise<void> {\n await this.recordMetric({\n type: 'counter',\n name,\n value,\n tags: { ...this._config?.defaultTags, ...tags },\n });\n }\n\n async setGauge(name: string, value: number, tags?: Record<string, string>): Promise<void> {\n await this.recordMetric({\n type: 'gauge',\n name,\n value,\n tags: { ...this._config?.defaultTags, ...tags },\n });\n }\n\n async recordHistogram(name: string, value: number, tags?: Record<string, string>): Promise<void> {\n await this.recordMetric({\n type: 'histogram',\n name,\n value,\n tags: { ...this._config?.defaultTags, ...tags },\n });\n }\n\n protected abstract doRecordMetric(metric: Metric): Promise<void>;\n\n // ─── Tracing ───────────────────────────────────────────────────────────────\n\n startSpan(options: SpanOptions): Span {\n if (!this._isInitialized || this._config?.enabled === false) {\n return this.createNoopSpan(options);\n }\n\n // Apply sampling\n if (this._config?.samplingRate !== undefined && this._config.samplingRate < 1) {\n if (Math.random() > this._config.samplingRate) {\n return this.createNoopSpan(options);\n }\n }\n\n return this.doStartSpan(options);\n }\n\n getActiveSpan(): Span | null {\n if (!this._isInitialized) {\n return null;\n }\n return this.doGetActiveSpan();\n }\n\n async withSpan<T>(options: SpanOptions, fn: (span: Span) => Promise<T>): Promise<T> {\n const span = this.startSpan(options);\n try {\n const result = await fn(span);\n span.setStatus('ok');\n return result;\n } catch (error) {\n span.setStatus('error', error instanceof Error ? error.message : String(error));\n if (error instanceof Error) {\n span.recordException(error);\n }\n throw error;\n } finally {\n span.end();\n }\n }\n\n protected abstract doStartSpan(options: SpanOptions): Span;\n protected abstract doGetActiveSpan(): Span | null;\n\n // ─── Logging ───────────────────────────────────────────────────────────────\n\n async log(entry: LogEntry): Promise<void> {\n if (!this._isInitialized || this._config?.enabled === false) {\n return;\n }\n\n const entryWithDefaults = {\n ...entry,\n timestamp: entry.timestamp ?? Date.now(),\n service: entry.service ?? this._config?.serviceName,\n };\n\n await this.doLog(entryWithDefaults);\n }\n\n protected abstract doLog(entry: LogEntry): Promise<void>;\n\n // ─── Events ────────────────────────────────────────────────────────────────\n\n async sendEvent(event: ObservabilityEvent): Promise<void> {\n if (!this._isInitialized || this._config?.enabled === false) {\n return;\n }\n\n const eventWithDefaults = {\n ...event,\n timestamp: event.timestamp ?? Date.now(),\n tags: { ...this._config?.defaultTags, ...event.tags },\n };\n\n await this.doSendEvent(eventWithDefaults);\n }\n\n protected abstract doSendEvent(event: ObservabilityEvent): Promise<void>;\n\n // ─── Flush ─────────────────────────────────────────────────────────────────\n\n async flush(): Promise<void> {\n if (!this._isInitialized) {\n return;\n }\n await this.doFlush();\n }\n\n protected abstract doFlush(): Promise<void>;\n\n // ─── Helpers ───────────────────────────────────────────────────────────────\n\n /**\n * Apply default tags to a metric\n */\n protected applyDefaultTags(metric: Metric): Metric {\n if (!this._config?.defaultTags) {\n return metric;\n }\n\n return {\n ...metric,\n tags: {\n ...this._config.defaultTags,\n ...metric.tags,\n },\n };\n }\n\n /**\n * Create a no-op span (for disabled/sampled-out traces)\n */\n // eslint-disable-next-line no-unused-vars\n protected createNoopSpan(_options: SpanOptions): Span {\n const context: SpanContext = {\n traceId: generateTraceId(),\n spanId: generateSpanId(),\n };\n\n return {\n context,\n setAttribute: () => {},\n setAttributes: () => {},\n addEvent: () => {},\n setStatus: () => {},\n end: () => {},\n recordException: () => {},\n };\n }\n}\n\n// ─────────────────────────────────────────────────────────────────────────────\n// No-Op Adapter\n// ─────────────────────────────────────────────────────────────────────────────\n\n/**\n * No-op adapter that does nothing.\n * Use when observability is disabled.\n */\nexport class NoopAdapter extends BaseAdapter {\n readonly provider = 'noop' as const;\n readonly name = 'NoopAdapter';\n\n protected async doInitialize(): Promise<void> {}\n protected async doShutdown(): Promise<void> {}\n protected async doHealthCheck(): Promise<boolean> {\n return true;\n }\n protected async doRecordMetric(): Promise<void> {}\n protected doStartSpan(options: SpanOptions): Span {\n return this.createNoopSpan(options);\n }\n protected doGetActiveSpan(): Span | null {\n return null;\n }\n protected async doLog(): Promise<void> {}\n protected async doSendEvent(): Promise<void> {}\n protected async doFlush(): Promise<void> {}\n}\n","/**\n * Logger Adapter\n *\n * Uses @plyaz/logger for observability output.\n * Can be used standalone OR alongside other adapters (Datadog, Grafana)\n * to always have console/file logging regardless of external providers.\n *\n * @example Standalone usage\n * ```typescript\n * const logger = new LoggerAdapter();\n * await logger.initialize({ serviceName: 'my-service' });\n * ```\n *\n * @example As console fallback with Datadog\n * ```typescript\n * const observability = new ObservabilityService({\n * mode: 'parallel',\n * adapters: [datadogAdapter, loggerAdapter], // Both receive all events\n * });\n * ```\n *\n * @module base/observability\n */\n\nimport { PackageLogger } from '@plyaz/logger';\nimport type {\n ObservabilityAdapterConfig,\n Metric,\n SpanOptions,\n Span,\n LogEntry,\n ObservabilityEvent,\n SpanContext,\n SpanAttributes,\n SpanEvent,\n SpanStatus,\n ConsoleAdapterConfig,\n} from '@plyaz/types/observability';\nimport { generateTraceId, generateSpanId } from '@/utils/common';\nimport { BaseAdapter } from './BaseAdapter';\n\n// ─────────────────────────────────────────────────────────────────────────────\n// Logger Adapter\n// ─────────────────────────────────────────────────────────────────────────────\n\n/**\n * Logger adapter that uses @plyaz/logger for output.\n *\n * This adapter integrates observability with the existing logging infrastructure,\n * providing structured logging for metrics, spans, and events through PackageLogger.\n *\n * Use this adapter:\n * - As standalone for development/debugging\n * - Alongside Datadog/Grafana to always have local console output\n * - As a fallback in priority mode when external providers fail\n */\nexport class LoggerAdapter extends BaseAdapter {\n readonly provider = 'console' as const;\n readonly name = 'LoggerAdapter';\n\n private observabilityLogger!: PackageLogger;\n private logMetrics = true;\n private logSpans = true;\n private logEvents = true;\n\n protected async doInitialize(config: ObservabilityAdapterConfig): Promise<void> {\n const consoleConfig = config as ConsoleAdapterConfig;\n\n // Create dedicated logger for observability output\n this.observabilityLogger = new PackageLogger({\n packageName: 'observability',\n service: config.serviceName ?? 'LoggerAdapter',\n environment: config.environment as 'development' | 'staging' | 'production' | undefined,\n minLevel: consoleConfig.logLevel ?? 'debug',\n });\n\n // All logging enabled by default\n this.logMetrics = true;\n this.logSpans = true;\n this.logEvents = true;\n }\n\n protected async doShutdown(): Promise<void> {\n // Logger doesn't need explicit shutdown\n }\n\n protected async doHealthCheck(): Promise<boolean> {\n return true;\n }\n\n protected async doRecordMetric(metric: Metric): Promise<void> {\n if (!this.logMetrics) return;\n\n this.observabilityLogger.debug(`[METRIC] ${metric.type}:${metric.name}`, {\n metricType: metric.type,\n metricName: metric.name,\n value: 'value' in metric ? metric.value : undefined,\n unit: metric.unit,\n tags: metric.tags,\n });\n }\n\n protected doStartSpan(options: SpanOptions): Span {\n const context: SpanContext = {\n traceId: generateTraceId(),\n spanId: generateSpanId(),\n parentSpanId: options.parentContext?.spanId,\n };\n\n const startTime = options.startTime ?? Date.now();\n\n if (this.logSpans) {\n this.observabilityLogger.debug(`[SPAN START] ${options.name}`, {\n traceId: context.traceId,\n spanId: context.spanId,\n parentSpanId: context.parentSpanId,\n kind: options.kind,\n attributes: options.attributes,\n });\n }\n\n const events: SpanEvent[] = [];\n let attributes: SpanAttributes = { ...options.attributes };\n let status: SpanStatus = 'unset';\n let statusMessage: string | undefined;\n\n const logSpans = this.logSpans;\n const logger = this.observabilityLogger;\n\n return {\n context,\n setAttribute: (key, value) => {\n attributes[key] = value;\n },\n setAttributes: attrs => {\n attributes = { ...attributes, ...attrs };\n },\n addEvent: event => {\n events.push(event);\n if (logSpans) {\n logger.debug(`[SPAN EVENT] ${options.name}: ${event.name}`, {\n traceId: context.traceId,\n spanId: context.spanId,\n eventAttributes: event.attributes,\n });\n }\n },\n setStatus: (s, message) => {\n status = s;\n statusMessage = message;\n },\n end: endTime => {\n const duration = (endTime ?? Date.now()) - startTime;\n if (logSpans) {\n const logMethod = status === 'error' ? 'warn' : 'debug';\n logger[logMethod](`[SPAN END] ${options.name}`, {\n traceId: context.traceId,\n spanId: context.spanId,\n durationMs: duration,\n status,\n statusMessage,\n attributes,\n eventCount: events.length,\n });\n }\n },\n recordException: error => {\n if (logSpans) {\n logger.error(`[SPAN ERROR] ${options.name}`, {\n traceId: context.traceId,\n spanId: context.spanId,\n error: error.message,\n stack: error.stack,\n });\n }\n },\n };\n }\n\n protected doGetActiveSpan(): Span | null {\n return null; // Logger adapter doesn't track active spans\n }\n\n protected async doLog(entry: LogEntry): Promise<void> {\n const meta = {\n service: entry.service,\n traceId: entry.traceId,\n spanId: entry.spanId,\n ...entry.context,\n };\n\n // Map observability log levels to logger methods\n switch (entry.level) {\n case 'debug':\n this.observabilityLogger.debug(entry.message, meta);\n break;\n case 'info':\n this.observabilityLogger.info(entry.message, meta);\n break;\n case 'warn':\n this.observabilityLogger.warn(entry.message, meta);\n break;\n case 'error':\n this.observabilityLogger.error(entry.message, meta);\n break;\n case 'fatal':\n this.observabilityLogger.fatal(entry.message, meta);\n break;\n }\n }\n\n protected async doSendEvent(event: ObservabilityEvent): Promise<void> {\n if (!this.logEvents) return;\n\n this.observabilityLogger.info(`[EVENT] ${event.name}`, {\n eventName: event.name,\n properties: event.properties,\n tags: event.tags,\n });\n }\n\n protected async doFlush(): Promise<void> {\n // Logger handles its own buffering/flushing\n }\n}\n","/**\n * Observability Service\n *\n * Injectable service for observability (metrics, tracing, logging).\n * Works like CacheManager, DatabaseService, and ApiClient - can be injected into domain services.\n *\n * Adapters are initialized separately with their own configs.\n * This service only orchestrates - it doesn't know about adapter-specific configs.\n *\n * @module base/observability\n */\n\nimport { PackageLogger } from '@plyaz/logger';\nimport { CorePackageError } from '@plyaz/errors';\nimport { ERROR_CODES } from '@plyaz/types/errors';\nimport type {\n ObservabilityAdapter,\n ObservabilityAdapterConfig,\n Metric,\n SpanOptions,\n Span,\n LogEntry,\n ObservabilityEvent,\n OperationContext,\n MonitoringOperationResult,\n AdapterWithPriority,\n AdapterEntry,\n ObservabilityServiceConfig,\n ObservabilityServiceInterface,\n} from '@plyaz/types/observability';\nimport { OBSERVABILITY_METRICS } from '@plyaz/types/observability';\nimport { NoopAdapter } from './BaseAdapter';\nimport { LoggerAdapter } from './LoggerAdapter';\n\n// Default timeout for adapter operations (5 seconds)\nconst DEFAULT_ADAPTER_TIMEOUT_MS = 5000;\n\n// ─────────────────────────────────────────────────────────────────────────────\n// Observability Service Implementation\n// ─────────────────────────────────────────────────────────────────────────────\n\n/**\n * ObservabilityService - Main observability service that implements ObservabilityAdapter.\n *\n * This service orchestrates multiple adapters and can be injected into domain services.\n * Logger adapter is always included by default for console output.\n *\n * ```typescript\n * // 1. Initialize adapters separately\n * const datadogAdapter = new DatadogAdapter();\n * await datadogAdapter.initialize({ apiKey: '...', serviceName: 'my-service' });\n *\n * // 2. Create service - logger is auto-added by default\n * const observability = new ObservabilityService();\n * await observability.initialize({\n * mode: 'parallel',\n * adapters: [datadogAdapter], // Logger added automatically\n * serviceName: 'my-service',\n * });\n *\n * // 3. Use in domain services (implements ObservabilityAdapter)\n * await observability.incrementCounter('api.requests', 1);\n * ```\n */\nexport class ObservabilityService implements ObservabilityAdapter, ObservabilityServiceInterface {\n readonly provider = 'custom' as const;\n readonly name = 'ObservabilityService';\n\n private _isInitialized = false;\n private _config: ObservabilityServiceConfig | null = null;\n private readonly logger: PackageLogger;\n private readonly adapterEntries: AdapterEntry[] = [];\n private mode: 'single' | 'parallel' | 'priority' = 'parallel';\n private readonly noopAdapter = new NoopAdapter();\n private loggerAdapter: LoggerAdapter | null = null;\n\n constructor() {\n this.logger = new PackageLogger({\n packageName: 'core',\n service: 'ObservabilityService',\n });\n }\n\n get isInitialized(): boolean {\n return this._isInitialized;\n }\n\n /**\n * Check if service has at least one working adapter\n */\n get isReady(): boolean {\n return this.adapterEntries.some(e => e.adapter.isInitialized);\n }\n\n /**\n * Get all adapters (for compatibility)\n */\n private get adapters(): ObservabilityAdapter[] {\n return this.adapterEntries.map(e => e.adapter);\n }\n\n /**\n * Get initialized adapter entries\n */\n private get initializedEntries(): AdapterEntry[] {\n return this.adapterEntries.filter(e => e.adapter.isInitialized);\n }\n\n /**\n * Get primary (non-failover) initialized adapters\n */\n private get primaryEntries(): AdapterEntry[] {\n return this.initializedEntries.filter(e => !e.failover);\n }\n\n /**\n * Get failover initialized adapters\n */\n private get failoverEntries(): AdapterEntry[] {\n return this.initializedEntries.filter(e => e.failover);\n }\n\n // ─── Lifecycle ─────────────────────────────────────────────────────────────\n\n /**\n * Check if input is an adapter with priority config\n */\n private isAdapterWithPriority(\n input: ObservabilityAdapter | AdapterWithPriority\n ): input is AdapterWithPriority {\n return (\n 'adapter' in input &&\n typeof (input as AdapterWithPriority).adapter?.isInitialized === 'boolean'\n );\n }\n\n /**\n * Normalize adapter input to adapter with priority and failover config\n */\n private normalizeAdapter(\n input: ObservabilityAdapter | AdapterWithPriority,\n defaultPriority: number\n ): { adapter: ObservabilityAdapter; priority: number; failover: boolean } {\n if (this.isAdapterWithPriority(input)) {\n return {\n adapter: input.adapter,\n priority: input.priority ?? defaultPriority,\n failover: input.failover ?? false,\n };\n }\n return { adapter: input, priority: defaultPriority, failover: false };\n }\n\n /**\n * Initialize the observability service.\n * Logger adapter is always added by default unless explicitly disabled.\n * Adapters are sorted by priority (higher = first), with failover adapters after primary.\n */\n async initialize(config: ObservabilityAdapterConfig & ObservabilityServiceConfig): Promise<void> {\n if (this._isInitialized) {\n this.logger.warn('ObservabilityService already initialized');\n return;\n }\n\n this._config = config;\n this.mode = config.mode ?? 'parallel';\n\n // Collect adapters with priorities\n const entries: AdapterEntry[] = [];\n\n // Add provided adapters\n if (config.adapter) {\n entries.push(this.normalizeAdapter(config.adapter, 0));\n }\n if (config.adapters) {\n config.adapters.forEach((a, index) => {\n // Default priority decreases with array position for stable sorting\n entries.push(this.normalizeAdapter(a, -index));\n });\n }\n\n // Always add logger adapter by default (for console output)\n // Unless there's already a console/logger adapter\n const hasLoggerAdapter = entries.some(\n e => e.adapter.provider === 'console' || e.adapter.name === 'LoggerAdapter'\n );\n if (!hasLoggerAdapter) {\n this.loggerAdapter = new LoggerAdapter();\n await this.loggerAdapter.initialize({\n enabled: config.enabled !== false,\n serviceName: config.serviceName,\n environment: config.environment,\n defaultTags: config.defaultTags,\n });\n // Logger is a failover by default with lowest priority\n entries.push({ adapter: this.loggerAdapter, priority: -1000, failover: true });\n }\n\n // Sort: primary adapters first (by priority desc), then failover adapters (by priority desc)\n entries.sort((a, b) => {\n // Primary adapters come before failover\n if (a.failover !== b.failover) {\n return a.failover ? 1 : -1;\n }\n // Within same category, sort by priority (higher first)\n return b.priority - a.priority;\n });\n\n // Store sorted entries\n this.adapterEntries.push(...entries);\n\n this._isInitialized = true;\n\n this.logger.debug('ObservabilityService initialized', {\n mode: this.mode,\n adapterCount: this.adapterEntries.length,\n primaryCount: this.primaryEntries.length,\n failoverCount: this.failoverEntries.length,\n adapters: this.adapterEntries.map(e => ({\n name: e.adapter.name,\n provider: e.adapter.provider,\n priority: e.priority,\n failover: e.failover,\n initialized: e.adapter.isInitialized,\n })),\n });\n }\n\n async shutdown(): Promise<void> {\n await Promise.all(this.adapters.map(adapter => adapter.shutdown()));\n this._isInitialized = false;\n this.logger.info('ObservabilityService shut down');\n }\n\n async isHealthy(): Promise<boolean> {\n if (this.adapters.length === 0) {\n return false;\n }\n\n const results = await Promise.all(\n this.adapters.map(adapter => adapter.isHealthy().catch(() => false))\n );\n\n // For parallel mode, all must be healthy; for priority/single, at least one\n return this.mode === 'parallel' ? results.every(Boolean) : results.some(Boolean);\n }\n\n async flush(): Promise<void> {\n await this.executeOnAdapters('flush', adapter => adapter.flush());\n }\n\n // ─── Execute on Adapters ───────────────────────────────────────────────────\n\n private get config(): ObservabilityServiceConfig {\n return this._config ?? {};\n }\n\n private async executeOnAdapters<T>(\n operation: string,\n fn: (adapter: ObservabilityAdapter) => Promise<T>\n ): Promise<void> {\n const entries = this.initializedEntries;\n if (entries.length === 0) {\n return;\n }\n\n const timeout = this.config.adapterTimeout ?? DEFAULT_ADAPTER_TIMEOUT_MS;\n\n switch (this.mode) {\n case 'parallel':\n await this.executeParallelWithFailover(operation, fn, timeout);\n break;\n case 'priority':\n await this.executePriorityWithFailover(operation, fn, timeout);\n break;\n case 'single':\n default:\n await this.executeSingle(operation, entries[0].adapter, fn, timeout);\n break;\n }\n }\n\n private async executeSingle<T>(\n operation: string,\n adapter: ObservabilityAdapter,\n fn: (adapter: ObservabilityAdapter) => Promise<T>,\n timeout: number\n ): Promise<void> {\n try {\n await this.withTimeout(fn(adapter), timeout);\n } catch (error) {\n this.logger.error(`${operation} failed on ${adapter.name}`, {\n error: error instanceof Error ? error.message : String(error),\n });\n }\n }\n\n /**\n * Execute on primary adapters in parallel.\n * If all primary adapters fail, execute on failover adapters.\n */\n // eslint-disable-next-line complexity\n private async executeParallelWithFailover<T>(\n operation: string,\n fn: (adapter: ObservabilityAdapter) => Promise<T>,\n timeout: number\n ): Promise<void> {\n const primary = this.primaryEntries;\n const failover = this.failoverEntries;\n\n // Execute on primary adapters\n if (primary.length > 0) {\n const results = await Promise.allSettled(\n primary.map(e => this.withTimeout(fn(e.adapter), timeout))\n );\n\n const errors = results\n .map((r, i) =>\n r.status === 'rejected' ? { adapter: primary[i].adapter.name, error: r.reason } : null\n )\n .filter(Boolean);\n\n const allFailed = errors.length === primary.length;\n\n if (errors.length > 0 && !allFailed) {\n this.logger.warn(`${operation} failed on some primary adapters`, { errors });\n }\n\n // If all primary adapters failed, use failover\n if (allFailed && failover.length > 0) {\n this.logger.warn(`${operation} failed on all primary adapters, using failover`, { errors });\n await this.executeParallel(\n operation,\n failover.map(e => e.adapter),\n fn,\n timeout\n );\n return;\n }\n\n if (this.config.failOnAnyError && errors.length > 0) {\n throw new CorePackageError(\n `${operation} failed on adapters: ${errors.map(e => e?.adapter).join(', ')}`,\n ERROR_CODES.CORE_OPERATION_FAILED\n );\n }\n } else if (failover.length > 0) {\n // No primary adapters, use failover directly\n await this.executeParallel(\n operation,\n failover.map(e => e.adapter),\n fn,\n timeout\n );\n }\n }\n\n private async executeParallel<T>(\n operation: string,\n adapters: ObservabilityAdapter[],\n fn: (adapter: ObservabilityAdapter) => Promise<T>,\n timeout: number\n ): Promise<void> {\n const results = await Promise.allSettled(\n adapters.map(adapter => this.withTimeout(fn(adapter), timeout))\n );\n\n const errors = results\n .map((r, i) =>\n r.status === 'rejected' ? { adapter: adapters[i].name, error: r.reason } : null\n )\n .filter(Boolean);\n\n if (errors.length > 0) {\n this.logger.warn(`${operation} failed on some adapters`, { errors });\n }\n }\n\n /**\n * Execute on primary adapters in priority order.\n * If all primary adapters fail, try failover adapters.\n */\n // eslint-disable-next-line complexity\n private async executePriorityWithFailover<T>(\n operation: string,\n fn: (adapter: ObservabilityAdapter) => Promise<T>,\n timeout: number\n ): Promise<void> {\n const primary = this.primaryEntries;\n const failover = this.failoverEntries;\n\n // Try primary adapters first\n for (const entry of primary) {\n try {\n await this.withTimeout(fn(entry.adapter), timeout);\n return; // Success - stop trying\n } catch (error) {\n const errorName = error instanceof Error ? error.name : 'Error';\n const shouldFallback =\n !this.config.fallbackOnErrors || this.config.fallbackOnErrors.includes(errorName);\n\n if (shouldFallback) {\n this.logger.warn(`${operation} failed on ${entry.adapter.name}, trying next`, {\n error: error instanceof Error ? error.message : String(error),\n });\n continue;\n }\n throw error;\n }\n }\n\n // All primary failed, try failover adapters\n for (const entry of failover) {\n try {\n await this.withTimeout(fn(entry.adapter), timeout);\n return; // Success\n } catch (error) {\n this.logger.warn(`${operation} failed on failover ${entry.adapter.name}`, {\n error: error instanceof Error ? error.message : String(error),\n });\n // Continue to next failover adapter\n }\n }\n\n this.logger.error(`${operation} failed on all adapters (primary and failover)`);\n }\n\n private async withTimeout<T>(promise: Promise<T>, timeoutMs: number): Promise<T> {\n return Promise.race([\n promise,\n new Promise<T>((_, reject) =>\n setTimeout(() => reject(new Error(`Operation timed out after ${timeoutMs}ms`)), timeoutMs)\n ),\n ]);\n }\n\n // ─── Metrics ───────────────────────────────────────────────────────────────\n\n async recordMetric(metric: Metric): Promise<void> {\n await this.executeOnAdapters('recordMetric', adapter => adapter.recordMetric(metric));\n }\n\n async incrementCounter(\n name: string,\n value: number = 1,\n tags?: Record<string, string>\n ): Promise<void> {\n await this.executeOnAdapters('incrementCounter', adapter =>\n adapter.incrementCounter(name, value, tags)\n );\n }\n\n async setGauge(name: string, value: number, tags?: Record<string, string>): Promise<void> {\n await this.executeOnAdapters('setGauge', adapter => adapter.setGauge(name, value, tags));\n }\n\n async recordHistogram(name: string, value: number, tags?: Record<string, string>): Promise<void> {\n await this.executeOnAdapters('recordHistogram', adapter =>\n adapter.recordHistogram(name, value, tags)\n );\n }\n\n // ─── Tracing ───────────────────────────────────────────────────────────────\n\n startSpan(options: SpanOptions): Span {\n // For tracing, use first initialized adapter\n const entry = this.initializedEntries[0];\n return entry?.adapter.startSpan(options) ?? this.noopAdapter.startSpan(options);\n }\n\n async withSpan<T>(options: SpanOptions, fn: (span: Span) => Promise<T>): Promise<T> {\n const entry = this.initializedEntries[0];\n if (!entry) {\n return fn(this.noopAdapter.startSpan(options));\n }\n return entry.adapter.withSpan(options, fn);\n }\n\n getActiveSpan(): Span | null {\n const entry = this.initializedEntries[0];\n return entry?.adapter.getActiveSpan() ?? null;\n }\n\n // ─── Logging ───────────────────────────────────────────────────────────────\n\n async log(entry: LogEntry): Promise<void> {\n await this.executeOnAdapters('log', adapter => adapter.log(entry));\n }\n\n // ─── Events ────────────────────────────────────────────────────────────────\n\n async sendEvent(event: ObservabilityEvent): Promise<void> {\n await this.executeOnAdapters('sendEvent', adapter => adapter.sendEvent(event));\n }\n\n // ─── Service Operation Tracking ────────────────────────────────────────────\n\n /**\n * Track a service operation with automatic metrics and tracing.\n *\n * @example\n * ```typescript\n * const { result, metrics } = await observability.trackOperation(\n * {\n * serviceName: 'UserService',\n * operation: 'create',\n * entityType: 'user',\n * startTime: Date.now(),\n * },\n * async () => {\n * return await this.repository.create(userData);\n * }\n * );\n * ```\n */\n // eslint-disable-next-line complexity\n async trackOperation<T>(\n context: OperationContext,\n operation: () => Promise<T>\n ): Promise<{ result: T; metrics: MonitoringOperationResult }> {\n const startTime = context.startTime ?? Date.now();\n\n // Start span\n const span = this.startSpan({\n name: `${context.serviceName}.${context.operation}`,\n attributes: {\n 'service.name': context.serviceName,\n 'operation.name': context.operation,\n ...(context.entityType && { 'entity.type': context.entityType }),\n ...(context.entityId && { 'entity.id': context.entityId }),\n ...context.attributes,\n },\n parentContext: context.parentContext,\n });\n\n // Increment operation counter\n await this.incrementCounter(OBSERVABILITY_METRICS.SERVICE_OPERATION_COUNT, 1, {\n service: context.serviceName,\n operation: context.operation,\n ...(context.entityType && { entity_type: context.entityType }),\n });\n\n try {\n const result = await operation();\n const duration = Date.now() - startTime;\n\n span.setStatus('ok');\n\n await this.recordHistogram(OBSERVABILITY_METRICS.SERVICE_OPERATION_DURATION, duration, {\n service: context.serviceName,\n operation: context.operation,\n status: 'success',\n });\n\n return {\n result,\n metrics: { success: true, duration, data: result },\n };\n } catch (error) {\n const duration = Date.now() - startTime;\n\n span.setStatus('error', error instanceof Error ? error.message : String(error));\n if (error instanceof Error) {\n span.recordException(error);\n }\n\n await this.incrementCounter(OBSERVABILITY_METRICS.SERVICE_OPERATION_ERROR, 1, {\n service: context.serviceName,\n operation: context.operation,\n error_type: error instanceof Error ? error.name : 'UnknownError',\n });\n\n await this.recordHistogram(OBSERVABILITY_METRICS.SERVICE_OPERATION_DURATION, duration, {\n service: context.serviceName,\n operation: context.operation,\n status: 'error',\n });\n\n throw error;\n } finally {\n span.end();\n }\n }\n}\n\n// ─────────────────────────────────────────────────────────────────────────────\n// Factory Function\n// ─────────────────────────────────────────────────────────────────────────────\n\n/**\n * Create an ObservabilityService with pre-initialized adapters.\n *\n * @example\n * ```typescript\n * // Initialize adapters first\n * const datadogAdapter = new DatadogAdapter();\n * await datadogAdapter.initialize({ apiKey: '...', serviceName: 'my-service' });\n *\n * // Create and initialize service (logger auto-added)\n * const observability = await createObservabilityService({\n * mode: 'parallel',\n * adapters: [datadogAdapter],\n * serviceName: 'my-service',\n * });\n *\n * // Priority mode (fallback chain)\n * const observability = await createObservabilityService({\n * mode: 'priority',\n * adapters: [datadogAdapter, grafanaAdapter],\n * serviceName: 'my-service',\n * });\n * ```\n */\nexport async function createObservabilityService(\n config: ObservabilityServiceConfig & { serviceName?: string; environment?: string } = {}\n): Promise<ObservabilityService> {\n const service = new ObservabilityService();\n await service.initialize(config);\n return service;\n}\n","/**\n * Core Dependencies Configuration\n *\n * Similar to @plyaz/api's setGlobalConfig pattern.\n * Backend services are registered here by entry points, not imported directly.\n *\n * IMPORTANT: This file must NOT import from backend service files (DbService, CacheService, etc.)\n * as that would cause the bundler to include backend dependencies in the frontend bundle.\n *\n * @example\n * ```typescript\n * // entry-backend.ts\n * import { setCoreDependencies } from './config/dependencies';\n * import { DbService } from './services/DbService';\n * import { CacheService } from './services/CacheService';\n *\n * setCoreDependencies({\n * DbService,\n * CacheService,\n * StorageService,\n * NotificationService,\n * });\n *\n * // entry-frontend.ts\n * // Don't call setCoreDependencies - no backend deps loaded\n * ```\n */\n\nimport type {\n CoreDbServiceStatic,\n CoreCacheServiceStatic,\n CoreStorageServiceStatic,\n CoreNotificationServiceStatic,\n CoreServerErrorMiddlewareStatic,\n} from '@plyaz/types/core';\n\n// ─────────────────────────────────────────────────────────────────────────────\n// Dependencies Container\n// ─────────────────────────────────────────────────────────────────────────────\n\nexport interface CoreDependencies {\n DbService?: CoreDbServiceStatic;\n CacheService?: CoreCacheServiceStatic;\n StorageService?: CoreStorageServiceStatic;\n NotificationService?: CoreNotificationServiceStatic;\n ServerErrorMiddleware?: CoreServerErrorMiddlewareStatic;\n}\n\n// Global dependencies container\nlet _dependencies: CoreDependencies = {};\n\n/**\n * Set core dependencies (called by entry points)\n *\n * @example\n * ```typescript\n * // entry-backend.ts\n * import { DbService } from './services/DbService';\n * import { CacheService } from './services/CacheService';\n *\n * setCoreDependencies({\n * DbService,\n * CacheService,\n * });\n * ```\n */\nexport function setCoreDependencies(deps: CoreDependencies): void {\n _dependencies = { ..._dependencies, ...deps };\n}\n\n/**\n * Get core dependencies\n */\nexport function getCoreDependencies(): CoreDependencies {\n return _dependencies;\n}\n\n/**\n * Check if a dependency is available\n */\nexport function hasCoreDependency(key: keyof CoreDependencies): boolean {\n return _dependencies[key] !== undefined;\n}\n\n/**\n * Get a specific dependency\n */\nexport function getCoreDependency<K extends keyof CoreDependencies>(\n key: K\n): CoreDependencies[K] | undefined {\n return _dependencies[key];\n}\n\n/**\n * Clear all dependencies (useful for testing)\n */\nexport function clearCoreDependencies(): void {\n _dependencies = {};\n}\n","// This eslint disable is an edge-case as we need to ensure that we're able to load CoreInitializer regardless if FE, BE or specific frameworks\n/**\n * Service Registry - Frontend Service Auto-Initialization\n *\n * Provides a generic, scalable pattern for initializing domain services.\n * Services implement the InitializableDomainService interface and are\n * initialized automatically without hardcoded switch statements.\n *\n * @example\n * ```typescript\n * import { ServiceRegistry } from '@plyaz/core';\n * import { FeatureFlagDomainService } from '@plyaz/core/frontend';\n * import { ExampleDomainService } from '@plyaz/core/domain';\n *\n * // Initialize services\n * await ServiceRegistry.initialize({\n * apiClient: { baseURL: '/api' },\n * services: [\n * { service: FeatureFlagDomainService, config: { enabled: true } },\n * { service: ExampleDomainService, config: { enabled: true, useRealApi: false } },\n * ],\n * });\n *\n * // Access services by key\n * const flags = ServiceRegistry.get('featureFlags');\n * const isEnabled = await flags.isEnabled('my-flag');\n *\n * // Or get with type safety\n * const example = ServiceRegistry.get<ExampleDomainService>('example');\n * ```\n */\n\nimport { CorePackageError } from '@plyaz/errors';\nimport { ERROR_CODES, BACKEND_RUNTIMES, FRONTEND_RUNTIMES } from '@plyaz/types';\nimport { PackageLogger } from '@plyaz/logger';\nimport type { ApiClientOptions } from '@plyaz/types/api';\nimport type { RootStoreSlice } from '@plyaz/types/store';\nimport type {\n CoreDomainServiceInstance,\n CoreServiceCreateOptions,\n CoreServiceEntry,\n CoreServiceInitConfig,\n CoreServiceRegistryConfig,\n CoreCacheConfig,\n CoreObservabilityConfig,\n CoreRuntimeEnvironment,\n CoreDbServiceConfig,\n CoreStorageConfig,\n CoreNotificationConfig,\n // Service instance types (from @plyaz/types, not backend modules)\n CoreDbServiceInstance,\n CoreCacheManagerInstance,\n CoreStorageServiceInstance,\n CoreNotificationServiceInstance,\n} from '@plyaz/types/core';\nimport type { ObservabilityAdapter } from '@plyaz/types/observability';\nimport { createObservabilityService } from '../base/observability';\nimport { ApiClientService } from '../services/ApiClientService';\nimport { getCoreDependency } from '../config/dependencies';\n\n// ─────────────────────────────────────────────────────────────────────────────\n// Internal Types\n// ─────────────────────────────────────────────────────────────────────────────\n\ninterface PendingService {\n entry: CoreServiceEntry;\n initWhen: CoreServiceInitConfig['initWhen'];\n}\n\ninterface ServiceMetadata {\n entry: CoreServiceEntry;\n isSingleton: boolean;\n}\n\n// ─────────────────────────────────────────────────────────────────────────────\n// Service Registry\n// ─────────────────────────────────────────────────────────────────────────────\n\n/**\n * Service Registry\n *\n * Manages frontend domain service instances with auto-initialization.\n * Supports immediate, lazy, and conditional initialization.\n *\n * Key features:\n * - Generic: No switch statements, services implement common interface\n * - Scalable: Add new services without modifying registry code\n * - Flexible: Immediate, lazy, or conditional initialization\n * - Type-safe: Get services with proper typing\n */\nexport class ServiceRegistry {\n private static readonly logger = new PackageLogger({\n packageName: 'core',\n service: 'ServiceRegistry',\n });\n\n /** Initialized singleton service instances by key */\n private static _services = new Map<string, CoreDomainServiceInstance>();\n\n /** Pending services for lazy initialization */\n private static _pending = new Map<string, PendingService>();\n\n /** Service metadata (config, singleton flag) by key */\n private static _metadata = new Map<string, ServiceMetadata>();\n\n /** Global environment */\n private static _environment: 'production' | 'staging' | 'development' | 'test' = 'development';\n\n /** Runtime environment (node, browser, bun, etc.) */\n private static _runtime: CoreRuntimeEnvironment = 'node';\n\n /** Global API client options */\n private static _apiClientOptions: ApiClientOptions | null = null;\n\n /** Global database config */\n private static _dbConfig: Partial<CoreDbServiceConfig> | null = null;\n\n /** Global cache config */\n private static _cacheConfig: CoreCacheConfig | null = null;\n\n /** Global observability config */\n private static _observabilityConfig: CoreObservabilityConfig | null = null;\n\n /** Global observability adapter instance */\n private static _observabilityInstance: ObservabilityAdapter | null = null;\n\n /** Global storage config */\n private static _storageConfig: CoreStorageConfig | null = null;\n\n /** Global notifications config */\n private static _notificationsConfig: CoreNotificationConfig | null = null;\n\n /** Store registry interface from Core (type-safe) */\n private static _storeRegistry: {\n getStore<K extends keyof RootStoreSlice>(key: K): RootStoreSlice[K] | undefined;\n } | null = null;\n\n /** Initialization promises (for concurrent access during lazy init) */\n private static _initPromises = new Map<string, Promise<CoreDomainServiceInstance>>();\n\n // ─────────────────────────────────────────────────────────────────────────\n // Initialization\n // ─────────────────────────────────────────────────────────────────────────\n\n /**\n * Initialize the service registry with the provided configuration.\n *\n * @param config - Registry configuration with services to initialize\n *\n * @example\n * ```typescript\n * await ServiceRegistry.initialize({\n * apiClient: { baseURL: '/api' },\n * services: [\n * { service: FeatureFlagDomainService, config: { enabled: true } },\n * { service: ExampleDomainService, config: { enabled: true, initWhen: 'lazy' } },\n * ],\n * });\n * ```\n */\n // eslint-disable-next-line complexity\n static async initialize(config: CoreServiceRegistryConfig): Promise<void> {\n ServiceRegistry._environment = config.environment ?? 'development';\n ServiceRegistry._runtime = config.runtime ?? 'node';\n ServiceRegistry._apiClientOptions = config.apiClient ?? null;\n ServiceRegistry._dbConfig = config.db ?? null;\n ServiceRegistry._cacheConfig = config.cache ?? null;\n ServiceRegistry._observabilityConfig = config.observability ?? null;\n ServiceRegistry._storageConfig = config.storage ?? null;\n ServiceRegistry._notificationsConfig = config.notifications ?? null;\n ServiceRegistry._storeRegistry = config.stores ?? null;\n\n const immediatePromises: Promise<void>[] = [];\n\n for (const entry of config.services) {\n const serviceKey = entry.service.serviceKey;\n const initWhen = entry.config.initWhen ?? 'immediate';\n const enabled = entry.config.enabled !== false;\n const isSingleton = entry.config.singleton !== false; // Default: true\n\n // Store metadata for all services (even disabled)\n ServiceRegistry._metadata.set(serviceKey, { entry, isSingleton });\n\n // Skip disabled services\n if (!enabled) {\n ServiceRegistry.logger.debug(`Service ${serviceKey} is disabled, skipping`);\n continue;\n }\n\n // Handle initialization timing\n if (initWhen === 'immediate' && isSingleton) {\n // Only auto-initialize singletons\n immediatePromises.push(\n ServiceRegistry.initializeService(entry).then(() => {\n ServiceRegistry.logger.debug(`Service ${serviceKey} initialized (singleton)`);\n })\n );\n } else if (isSingleton) {\n // Store for lazy/conditional initialization\n ServiceRegistry._pending.set(serviceKey, { entry, initWhen });\n ServiceRegistry.logger.debug(\n `Service ${serviceKey} registered for ${initWhen} initialization`\n );\n } else {\n // Non-singleton: just store metadata, create on demand via create()\n ServiceRegistry.logger.debug(\n `Service ${serviceKey} registered (non-singleton, use create())`\n );\n }\n }\n\n // Wait for all immediate initializations\n await Promise.all(immediatePromises);\n\n const initializedKeys = [...ServiceRegistry._services.keys()];\n const pendingKeys = [...ServiceRegistry._pending.keys()];\n const nonSingletonKeys = [...ServiceRegistry._metadata.entries()]\n .filter(([, meta]) => !meta.isSingleton)\n .map(([key]) => key);\n\n ServiceRegistry.logger.info('Service registry initialized', {\n initialized: initializedKeys,\n pending: pendingKeys,\n nonSingleton: nonSingletonKeys,\n });\n }\n\n // ─────────────────────────────────────────────────────────────────────────\n // Service Access\n // ─────────────────────────────────────────────────────────────────────────\n\n /**\n * Get a singleton service instance by key (synchronous).\n * Throws if the service is not initialized or is non-singleton.\n *\n * @param key - Service key (e.g., 'featureFlags', 'example')\n * @returns The service instance\n * @throws CorePackageError if service not found, not initialized, or non-singleton\n *\n * @example\n * ```typescript\n * const flags = ServiceRegistry.get<FeatureFlagDomainService>('featureFlags');\n * const isEnabled = await flags.isEnabled('my-flag');\n * ```\n */\n static get<T extends CoreDomainServiceInstance = CoreDomainServiceInstance>(key: string): T {\n const service = ServiceRegistry._services.get(key);\n if (service) {\n return service as T;\n }\n\n // Check if non-singleton (must use create())\n const metadata = ServiceRegistry._metadata.get(key);\n if (metadata && !metadata.isSingleton) {\n throw new CorePackageError(\n `Service '${key}' is configured as non-singleton. ` +\n `Use await ServiceRegistry.create('${key}') to create a new instance.`,\n ERROR_CODES.CLIENT_INITIALIZATION_FAILED\n );\n }\n\n // Check if pending lazy initialization\n const pending = ServiceRegistry._pending.get(key);\n if (pending) {\n throw new CorePackageError(\n `Service '${key}' is configured for lazy initialization. ` +\n `Use await ServiceRegistry.getAsync('${key}') instead.`,\n ERROR_CODES.CLIENT_INITIALIZATION_FAILED\n );\n }\n\n throw new CorePackageError(\n `Service '${key}' not found. Register it in ServiceRegistry.initialize()`,\n ERROR_CODES.CLIENT_INITIALIZATION_FAILED\n );\n }\n\n /**\n * Create a new instance of a service.\n * Use this for non-singleton services or when you need a fresh instance.\n *\n * Note: The caller is responsible for disposing the returned instance.\n *\n * @param key - Service key\n * @param configOverrides - Optional config overrides for this instance\n * @returns Promise resolving to a new service instance\n *\n * @example\n * ```typescript\n * // Non-singleton service - always creates new instance\n * const instance1 = await ServiceRegistry.create<WorkerService>('worker');\n * const instance2 = await ServiceRegistry.create<WorkerService>('worker');\n * instance1 !== instance2; // true\n *\n * // With config overrides\n * const customWorker = await ServiceRegistry.create<WorkerService>('worker', {\n * apiClient: { baseURL: 'https://custom-api.com' },\n * });\n *\n * // Don't forget to dispose when done!\n * instance1.dispose();\n * instance2.dispose();\n * ```\n */\n static async create<T extends CoreDomainServiceInstance = CoreDomainServiceInstance>(\n key: string,\n configOverrides?: Partial<CoreServiceInitConfig>\n ): Promise<T> {\n const metadata = ServiceRegistry._metadata.get(key);\n if (!metadata) {\n throw new CorePackageError(\n `Service '${key}' not found. Register it in ServiceRegistry.initialize()`,\n ERROR_CODES.CLIENT_INITIALIZATION_FAILED\n );\n }\n\n // Merge config with overrides\n const mergedEntry: CoreServiceEntry = {\n service: metadata.entry.service,\n config: { ...metadata.entry.config, ...configOverrides },\n };\n\n // Create new instance (don't store in registry)\n return ServiceRegistry.initializeService(mergedEntry, false) as Promise<T>;\n }\n\n /**\n * Get a service instance by key with async initialization if needed.\n * Use this for lazy-initialized services.\n *\n * @param key - Service key\n * @returns Promise resolving to the service instance\n *\n * @example\n * ```typescript\n * const example = await ServiceRegistry.getAsync<ExampleDomainService>('example');\n * const entities = await example.getAll();\n * ```\n */\n static async getAsync<T extends CoreDomainServiceInstance = CoreDomainServiceInstance>(\n key: string\n ): Promise<T> {\n // Return immediately if already initialized\n const existing = ServiceRegistry._services.get(key);\n if (existing) {\n return existing as T;\n }\n\n // Check for in-progress initialization\n const inProgress = ServiceRegistry._initPromises.get(key);\n if (inProgress) {\n return (await inProgress) as T;\n }\n\n // Check if pending lazy initialization\n const pending = ServiceRegistry._pending.get(key);\n if (pending) {\n // Handle conditional initialization\n if (typeof pending.initWhen === 'function') {\n const shouldInit = await pending.initWhen();\n if (!shouldInit) {\n throw new CorePackageError(\n `Service '${key}' initialization condition returned false`,\n ERROR_CODES.CLIENT_INITIALIZATION_FAILED\n );\n }\n }\n\n // Initialize and return\n const service = await ServiceRegistry.initializeService(pending.entry);\n ServiceRegistry._pending.delete(key);\n return service as T;\n }\n\n throw new CorePackageError(\n `Service '${key}' not found. Register it in ServiceRegistry.initialize()`,\n ERROR_CODES.CLIENT_INITIALIZATION_FAILED\n );\n }\n\n /**\n * Check if a service is registered (either initialized or pending).\n *\n * @param key - Service key\n */\n static has(key: string): boolean {\n return ServiceRegistry._services.has(key) || ServiceRegistry._pending.has(key);\n }\n\n /**\n * Check if a service is initialized and ready.\n *\n * @param key - Service key\n */\n static isInitialized(key: string): boolean {\n return ServiceRegistry._services.has(key);\n }\n\n /**\n * Get all initialized service keys.\n */\n static getInitializedKeys(): string[] {\n return [...ServiceRegistry._services.keys()];\n }\n\n /**\n * Get all pending (lazy) service keys.\n */\n static getPendingKeys(): string[] {\n return [...ServiceRegistry._pending.keys()];\n }\n\n // ─────────────────────────────────────────────────────────────────────────\n // Internal: Service Initialization\n // ─────────────────────────────────────────────────────────────────────────\n\n /** Build API client options and instance for service */\n // eslint-disable-next-line complexity\n private static async buildApiClientOptions(\n config: CoreServiceInitConfig,\n entry: CoreServiceEntry\n ): Promise<{ dedicated: boolean; options?: ApiClientOptions; instance?: unknown } | undefined> {\n const dedicatedApiClient = config.dedicatedApiClient;\n const isDedicated = dedicatedApiClient === true || typeof dedicatedApiClient === 'object';\n const serviceKey = entry.service.serviceKey;\n\n const options: ApiClientOptions | undefined = isDedicated\n ? typeof dedicatedApiClient === 'object'\n ? { ...ServiceRegistry._apiClientOptions, ...dedicatedApiClient }\n : (ServiceRegistry._apiClientOptions ?? undefined)\n : (ServiceRegistry._apiClientOptions ?? undefined);\n\n if (!options) {\n return undefined;\n }\n\n // Get or create API client instance\n let apiInstance: unknown;\n if (isDedicated && options) {\n // Create dedicated API client instance for this service\n try {\n // Use the global environment from initialization\n const envConfig = {\n env: ServiceRegistry._environment,\n setAsDefault: false, // Dedicated instances should not become default\n };\n apiInstance = await ApiClientService.createInstance(envConfig, options);\n ServiceRegistry.logger.debug(\n `Created dedicated API client instance for service '${serviceKey}'`,\n {\n environment: ServiceRegistry._environment,\n }\n );\n } catch (error) {\n ServiceRegistry.logger.warn(\n `Failed to create dedicated API client for service '${serviceKey}'`,\n {\n error: error instanceof Error ? error.message : String(error),\n }\n );\n }\n } else {\n // Use global shared API client\n try {\n apiInstance = ApiClientService.getClient();\n } catch {\n ServiceRegistry.logger.debug(\n `Global API client not initialized, service '${serviceKey}' will not have API`\n );\n }\n }\n\n return {\n dedicated: isDedicated,\n options,\n instance: apiInstance,\n };\n }\n\n /** Build DB config and instance for service with runtime validation */\n // eslint-disable-next-line complexity\n private static async buildDbConfig(\n config: CoreServiceInitConfig,\n entry: CoreServiceEntry\n ): Promise<\n | {\n dedicated: boolean;\n config?: Partial<CoreDbServiceConfig>;\n instance?: CoreDbServiceInstance;\n }\n | undefined\n > {\n const dedicatedDb = config.dedicatedDb;\n const isDedicated = dedicatedDb === true || typeof dedicatedDb === 'object';\n const serviceKey = entry.service.serviceKey;\n\n // Runtime validation: DB should only be injected for backend services\n const isBackendRuntime = BACKEND_RUNTIMES.includes(ServiceRegistry._runtime);\n\n if ((isDedicated || ServiceRegistry._dbConfig) && !isBackendRuntime) {\n ServiceRegistry.logger.warn(\n `Service '${serviceKey}' is requesting database injection in '${ServiceRegistry._runtime}' runtime. ` +\n `Database is only available in backend runtimes (${BACKEND_RUNTIMES.join(', ')}). ` +\n `This service will not have database access.`\n );\n return undefined; // Skip DB injection for non-backend runtimes\n }\n\n const dbConfig: Partial<CoreDbServiceConfig> | undefined = isDedicated\n ? typeof dedicatedDb === 'object'\n ? { ...ServiceRegistry._dbConfig, ...dedicatedDb }\n : (ServiceRegistry._dbConfig ?? undefined)\n : (ServiceRegistry._dbConfig ?? undefined);\n\n if (!dbConfig) {\n return undefined;\n }\n\n const DbService = getCoreDependency('DbService');\n if (!DbService) {\n ServiceRegistry.logger.debug(\n `DbService not registered, service '${serviceKey}' will not have DB`\n );\n return undefined;\n }\n\n // Get or create DB instance\n let dbInstance: CoreDbServiceInstance | undefined;\n if (isDedicated && dbConfig) {\n // Create dedicated database instance for this service\n try {\n dbInstance = await DbService.createInstance?.(dbConfig as CoreDbServiceConfig);\n ServiceRegistry.logger.debug(\n `Created dedicated database instance for service '${serviceKey}'`\n );\n } catch (error) {\n ServiceRegistry.logger.warn(\n `Failed to create dedicated database instance for service '${serviceKey}'`,\n {\n error: error instanceof Error ? error.message : String(error),\n }\n );\n }\n } else {\n // Use global shared database\n try {\n dbInstance = DbService.getInstance();\n } catch {\n ServiceRegistry.logger.debug(\n `Global DB not initialized, service '${serviceKey}' will not have DB`\n );\n }\n }\n\n return {\n dedicated: isDedicated,\n config: dbConfig,\n instance: dbInstance,\n };\n }\n\n /** Build cache config and instance for service with runtime validation */\n // eslint-disable-next-line complexity\n private static async buildCacheConfig(\n config: CoreServiceInitConfig,\n entry: CoreServiceEntry\n ): Promise<\n | { dedicated: boolean; config?: CoreCacheConfig; instance?: CoreCacheManagerInstance }\n | undefined\n > {\n const dedicatedCache = config.dedicatedCache;\n const isDedicated = dedicatedCache === true || typeof dedicatedCache === 'object';\n const serviceKey = entry.service.serviceKey;\n\n const cacheConfig: CoreCacheConfig | undefined = isDedicated\n ? typeof dedicatedCache === 'object'\n ? ({ ...ServiceRegistry._cacheConfig, ...dedicatedCache } as CoreCacheConfig)\n : (ServiceRegistry._cacheConfig ?? undefined)\n : (ServiceRegistry._cacheConfig ?? undefined);\n\n if (!cacheConfig) {\n return undefined;\n }\n\n // Runtime validation: Cache on frontend is not supported (CacheManager uses ioredis which requires Node.js)\n const isFrontendRuntime = FRONTEND_RUNTIMES.includes(ServiceRegistry._runtime);\n\n if (isFrontendRuntime) {\n ServiceRegistry.logger.debug(\n `Service '${serviceKey}' skipping cache (frontend runtime - use Zustand store + react-query instead)`\n );\n return undefined;\n }\n\n const CacheService = getCoreDependency('CacheService');\n if (!CacheService) {\n ServiceRegistry.logger.debug(\n `CacheService not registered, service '${serviceKey}' will not have cache`\n );\n return undefined;\n }\n\n // Backend-only: Get cache manager instance from CacheService\n let cacheInstance: CoreCacheManagerInstance | undefined;\n try {\n cacheInstance = CacheService.getInstance().getCacheManager();\n if (isDedicated) {\n ServiceRegistry.logger.debug(\n `Using shared cache for service '${serviceKey}' (dedicated cache not implemented via DI)`,\n { strategy: cacheConfig.strategy }\n );\n }\n } catch {\n ServiceRegistry.logger.debug(\n `Global cache not initialized, service '${serviceKey}' will not have cache`\n );\n }\n\n return {\n dedicated: isDedicated,\n config: cacheConfig,\n instance: cacheInstance,\n };\n }\n\n /** Build observability config and instance for service */\n // eslint-disable-next-line complexity\n private static buildObservabilityConfig(\n config: CoreServiceInitConfig,\n // eslint-disable-next-line no-unused-vars\n _entry: CoreServiceEntry\n ):\n | { dedicated: boolean; config?: CoreObservabilityConfig; instance?: ObservabilityAdapter }\n | undefined {\n const dedicatedObservability = config.dedicatedObservability;\n const isDedicated =\n dedicatedObservability === true || typeof dedicatedObservability === 'object';\n\n const observabilityConfig: CoreObservabilityConfig | undefined = isDedicated\n ? typeof dedicatedObservability === 'object'\n ? ({\n ...ServiceRegistry._observabilityConfig,\n ...dedicatedObservability,\n } as CoreObservabilityConfig)\n : (ServiceRegistry._observabilityConfig ?? undefined)\n : (ServiceRegistry._observabilityConfig ?? undefined);\n\n if (!observabilityConfig) {\n return undefined;\n }\n\n // Instance will be set async if dedicated\n return {\n dedicated: isDedicated,\n config: observabilityConfig,\n instance: isDedicated ? undefined : (ServiceRegistry._observabilityInstance ?? undefined),\n };\n }\n\n /** Build storage config and instance for service with runtime validation (backend-only) */\n // eslint-disable-next-line complexity\n private static async buildStorageConfig(\n config: CoreServiceInitConfig,\n entry: CoreServiceEntry\n ): Promise<\n | { dedicated: boolean; config?: CoreStorageConfig; instance?: CoreStorageServiceInstance }\n | undefined\n > {\n const dedicatedStorage = config.dedicatedStorage;\n const isDedicated = dedicatedStorage === true || typeof dedicatedStorage === 'object';\n const serviceKey = entry.service.serviceKey;\n\n // Runtime validation: Storage is backend-only\n const isBackendRuntime = BACKEND_RUNTIMES.includes(ServiceRegistry._runtime);\n\n if ((isDedicated || ServiceRegistry._storageConfig) && !isBackendRuntime) {\n ServiceRegistry.logger.warn(\n `Service '${serviceKey}' is requesting storage injection in '${ServiceRegistry._runtime}' runtime. ` +\n `Storage is only available in backend runtimes (${BACKEND_RUNTIMES.join(', ')}). ` +\n `This service will not have storage access.`\n );\n return undefined;\n }\n\n const storageConfig: CoreStorageConfig | undefined = isDedicated\n ? typeof dedicatedStorage === 'object'\n ? { ...ServiceRegistry._storageConfig, ...dedicatedStorage }\n : (ServiceRegistry._storageConfig ?? undefined)\n : (ServiceRegistry._storageConfig ?? undefined);\n\n if (!storageConfig) {\n return undefined;\n }\n\n const StorageService = getCoreDependency('StorageService');\n if (!StorageService) {\n ServiceRegistry.logger.debug(\n `StorageService not registered, service '${serviceKey}' will not have storage`\n );\n return undefined;\n }\n\n // Get or create storage instance\n let storageInstance: CoreStorageServiceInstance | undefined;\n if (isDedicated && storageConfig) {\n try {\n storageInstance = await StorageService.createInstance?.(storageConfig);\n ServiceRegistry.logger.debug(\n `Created dedicated storage instance for service '${serviceKey}'`\n );\n } catch (error) {\n ServiceRegistry.logger.warn(\n `Failed to create dedicated storage instance for service '${serviceKey}'`,\n { error: error instanceof Error ? error.message : String(error) }\n );\n }\n } else {\n try {\n storageInstance = StorageService.getInstance();\n } catch {\n ServiceRegistry.logger.debug(\n `Global storage not initialized, service '${serviceKey}' will not have storage`\n );\n }\n }\n\n return {\n dedicated: isDedicated,\n config: storageConfig,\n instance: storageInstance,\n };\n }\n\n /** Build notifications config and instance for service with runtime validation (backend-only) */\n // eslint-disable-next-line complexity\n private static async buildNotificationsConfig(\n config: CoreServiceInitConfig,\n entry: CoreServiceEntry\n ): Promise<\n | {\n dedicated: boolean;\n config?: CoreNotificationConfig;\n instance?: CoreNotificationServiceInstance;\n }\n | undefined\n > {\n const dedicatedNotifications = config.dedicatedNotifications;\n const isDedicated =\n dedicatedNotifications === true || typeof dedicatedNotifications === 'object';\n const serviceKey = entry.service.serviceKey;\n\n // Runtime validation: Notifications is backend-only\n const isBackendRuntime = BACKEND_RUNTIMES.includes(ServiceRegistry._runtime);\n\n if ((isDedicated || ServiceRegistry._notificationsConfig) && !isBackendRuntime) {\n ServiceRegistry.logger.warn(\n `Service '${serviceKey}' is requesting notifications injection in '${ServiceRegistry._runtime}' runtime. ` +\n `Notifications is only available in backend runtimes (${BACKEND_RUNTIMES.join(', ')}). ` +\n `This service will not have notifications access.`\n );\n return undefined;\n }\n\n const notificationsConfig: CoreNotificationConfig | undefined = isDedicated\n ? typeof dedicatedNotifications === 'object'\n ? { ...ServiceRegistry._notificationsConfig, ...dedicatedNotifications }\n : (ServiceRegistry._notificationsConfig ?? undefined)\n : (ServiceRegistry._notificationsConfig ?? undefined);\n\n if (!notificationsConfig) {\n return undefined;\n }\n\n const NotificationService = getCoreDependency('NotificationService');\n if (!NotificationService) {\n ServiceRegistry.logger.debug(\n `NotificationService not registered, service '${serviceKey}' will not have notifications`\n );\n return undefined;\n }\n\n // Get or create notifications instance\n let notificationsInstance: CoreNotificationServiceInstance | undefined;\n if (isDedicated && notificationsConfig) {\n try {\n notificationsInstance = await NotificationService.createInstance?.(notificationsConfig);\n ServiceRegistry.logger.debug(\n `Created dedicated notifications instance for service '${serviceKey}'`\n );\n } catch (error) {\n ServiceRegistry.logger.warn(\n `Failed to create dedicated notifications instance for service '${serviceKey}'`,\n { error: error instanceof Error ? error.message : String(error) }\n );\n }\n } else {\n try {\n notificationsInstance = NotificationService.getInstance();\n } catch {\n ServiceRegistry.logger.debug(\n `Global notifications not initialized, service '${serviceKey}' will not have notifications`\n );\n }\n }\n\n return {\n dedicated: isDedicated,\n config: notificationsConfig,\n instance: notificationsInstance,\n };\n }\n\n /**\n * Create a dedicated ObservabilityService instance for a service.\n * Uses the same adapter pattern as global observability but with service-specific config.\n */\n private static async createDedicatedObservability(\n serviceKey: string,\n config: CoreObservabilityConfig\n ): Promise<ObservabilityAdapter | undefined> {\n // Skip if explicitly disabled\n if (config.enabled === false) {\n return undefined;\n }\n\n try {\n // createObservabilityService auto-adds LoggerAdapter as failover\n const dedicatedService = await createObservabilityService({\n mode: config.mode ?? 'parallel',\n serviceName: `${config.serviceName ?? 'service'}-${serviceKey}`,\n environment: config.environment,\n adapters: config.adapters,\n });\n\n ServiceRegistry.logger.debug(\n `Created dedicated ObservabilityService for service '${serviceKey}'`\n );\n\n return dedicatedService;\n } catch (err) {\n ServiceRegistry.logger.warn(\n `Failed to create dedicated observability for '${serviceKey}', falling back to global`,\n { error: err instanceof Error ? err.message : String(err) }\n );\n return ServiceRegistry._observabilityInstance ?? undefined;\n }\n }\n\n /**\n * Set the global observability adapter instance.\n * Called by Core.initialize() after creating the adapter.\n */\n static setObservabilityInstance(instance: ObservabilityAdapter): void {\n ServiceRegistry._observabilityInstance = instance;\n ServiceRegistry.logger.debug('Global observability instance set');\n }\n\n /**\n * Get the global observability adapter instance.\n */\n static getObservabilityInstance(): ObservabilityAdapter | null {\n return ServiceRegistry._observabilityInstance;\n }\n\n /**\n * Initialize a single service from an entry.\n * Uses the service class's static create() method.\n * Merges per-service config with global config.\n */\n private static async initializeService(\n entry: CoreServiceEntry,\n storeSingleton = true\n ): Promise<CoreDomainServiceInstance> {\n const { service: ServiceClass, config } = entry;\n const serviceKey = ServiceClass.serviceKey;\n const isSingleton = config.singleton !== false;\n\n // For singletons, check for concurrent initialization\n if (storeSingleton && isSingleton) {\n const existingPromise = ServiceRegistry._initPromises.get(serviceKey);\n if (existingPromise) return existingPromise;\n }\n\n const initPromise = ServiceRegistry.doInitializeService(entry, { isSingleton, storeSingleton });\n\n if (storeSingleton && isSingleton) {\n ServiceRegistry._initPromises.set(serviceKey, initPromise);\n }\n\n return initPromise;\n }\n\n /** Build stores for service injection */\n private static buildStoresForService(\n config: CoreServiceInitConfig\n ): Partial<RootStoreSlice> | undefined {\n const allKeys = new Set<keyof RootStoreSlice>();\n\n // Add primary store\n if (config.store) {\n allKeys.add(config.store);\n }\n\n // Add read stores\n if (config.readStores) {\n config.readStores.forEach(key => allKeys.add(key));\n }\n\n if (allKeys.size === 0) {\n return undefined;\n }\n\n if (!ServiceRegistry._storeRegistry) {\n ServiceRegistry.logger.warn('Store registry not initialized, cannot inject stores');\n return undefined;\n }\n\n const stores: Partial<RootStoreSlice> = {};\n for (const key of allKeys) {\n const store = ServiceRegistry._storeRegistry.getStore(key);\n if (store) {\n (stores as Record<keyof RootStoreSlice, unknown>)[key] = store;\n ServiceRegistry.logger.debug(`Injected store '${key}' into service`);\n } else {\n ServiceRegistry.logger.warn(`Store '${key}' requested but not found in registry`);\n }\n }\n\n return Object.keys(stores).length > 0 ? stores : undefined;\n }\n\n /** Perform the actual service initialization */\n // eslint-disable-next-line complexity\n private static async doInitializeService(\n entry: CoreServiceEntry,\n options: { isSingleton: boolean; storeSingleton: boolean }\n ): Promise<CoreDomainServiceInstance> {\n const { service: serviceClass, config } = entry;\n const serviceKey = serviceClass.serviceKey;\n const { isSingleton, storeSingleton } = options;\n\n try {\n ServiceRegistry.logger.debug(`Initializing service: ${serviceKey}`);\n\n // Build dependencies (async operations) with runtime validation\n const apiClient = await ServiceRegistry.buildApiClientOptions(config, entry);\n const db = await ServiceRegistry.buildDbConfig(config, entry);\n const cache = await ServiceRegistry.buildCacheConfig(config, entry);\n const observability = ServiceRegistry.buildObservabilityConfig(config, entry);\n const storage = await ServiceRegistry.buildStorageConfig(config, entry);\n const notifications = await ServiceRegistry.buildNotificationsConfig(config, entry);\n const stores = ServiceRegistry.buildStoresForService(config);\n\n // Create dedicated observability instance if requested\n let observabilityInstance = observability?.instance;\n if (observability?.dedicated && observability.config) {\n observabilityInstance = await ServiceRegistry.createDedicatedObservability(\n serviceKey,\n observability.config\n );\n }\n\n const createOptions: CoreServiceCreateOptions = {\n apiClient,\n db,\n cache,\n observability: observability\n ? { ...observability, instance: observabilityInstance }\n : undefined,\n storage,\n notifications,\n injected: {\n ...(stores ? { stores } : {}),\n cache: cache?.instance,\n db: db?.instance,\n api: apiClient?.instance,\n observability: observabilityInstance,\n storage: storage?.instance,\n notifications: notifications?.instance,\n },\n isSingleton,\n };\n\n ServiceRegistry.logger.debug(`Service ${serviceKey} config:`, {\n apiClientDedicated: createOptions.apiClient?.dedicated,\n dbDedicated: createOptions.db?.dedicated,\n observabilityDedicated: createOptions.observability?.dedicated,\n storageDedicated: createOptions.storage?.dedicated,\n notificationsDedicated: createOptions.notifications?.dedicated,\n injected: {\n hasCache: !!createOptions.injected?.cache,\n hasDb: !!createOptions.injected?.db,\n hasApi: !!createOptions.injected?.api,\n hasObservability: !!createOptions.injected?.observability,\n hasStorage: !!createOptions.injected?.storage,\n hasNotifications: !!createOptions.injected?.notifications,\n hasStores: !!createOptions.injected?.stores,\n },\n });\n\n const instance = await serviceClass.create(config, createOptions);\n\n if (storeSingleton && isSingleton) {\n ServiceRegistry._services.set(serviceKey, instance);\n ServiceRegistry.logger.info(`Service initialized: ${serviceKey} (singleton)`);\n } else {\n ServiceRegistry.logger.info(`Service created: ${serviceKey} (instance)`);\n }\n\n return instance;\n } catch (error) {\n ServiceRegistry.logger.error(`Failed to initialize service: ${serviceKey}`, {\n error: error instanceof Error ? error.message : String(error),\n });\n throw error;\n } finally {\n if (storeSingleton && isSingleton) {\n ServiceRegistry._initPromises.delete(serviceKey);\n }\n }\n }\n\n // ─────────────────────────────────────────────────────────────────────────\n // Disposal\n // ─────────────────────────────────────────────────────────────────────────\n\n /**\n * Dispose a specific service by key.\n *\n * @param key - Service key to dispose\n */\n static dispose(key: string): void {\n const service = ServiceRegistry._services.get(key);\n if (service) {\n service.dispose();\n ServiceRegistry._services.delete(key);\n ServiceRegistry.logger.info(`Service disposed: ${key}`);\n }\n ServiceRegistry._pending.delete(key);\n }\n\n /**\n * Dispose all services and clear the registry.\n */\n static disposeAll(): void {\n // Dispose all initialized services\n for (const [key, service] of ServiceRegistry._services) {\n try {\n service.dispose();\n ServiceRegistry.logger.debug(`Disposed service: ${key}`);\n } catch (error) {\n ServiceRegistry.logger.error(`Error disposing service: ${key}`, {\n error: error instanceof Error ? error.message : String(error),\n });\n }\n }\n\n // Clear all state\n ServiceRegistry._services.clear();\n ServiceRegistry._pending.clear();\n ServiceRegistry._metadata.clear();\n ServiceRegistry._initPromises.clear();\n ServiceRegistry._apiClientOptions = null;\n ServiceRegistry._dbConfig = null;\n ServiceRegistry._cacheConfig = null;\n ServiceRegistry._observabilityConfig = null;\n ServiceRegistry._observabilityInstance = null;\n ServiceRegistry._storageConfig = null;\n ServiceRegistry._notificationsConfig = null;\n\n ServiceRegistry.logger.info('Service registry disposed');\n }\n\n /**\n * Check if a service is configured as singleton.\n *\n * @param key - Service key\n * @returns true if singleton (default), false if non-singleton\n */\n static isSingleton(key: string): boolean {\n const metadata = ServiceRegistry._metadata.get(key);\n return metadata?.isSingleton ?? true;\n }\n\n /**\n * Get all non-singleton service keys.\n * These services must be created via `create()` method.\n */\n static getNonSingletonKeys(): string[] {\n return [...ServiceRegistry._metadata.entries()]\n .filter(([, meta]) => !meta.isSingleton)\n .map(([key]) => key);\n }\n\n // ─────────────────────────────────────────────────────────────────────────\n // Dynamic Registration\n // ─────────────────────────────────────────────────────────────────────────\n\n /**\n * Register a new service dynamically after initialization.\n *\n * @param entry - Service entry to register\n * @param initNow - Whether to initialize immediately (default: true)\n *\n * @example\n * ```typescript\n * // Register and initialize immediately\n * await ServiceRegistry.register({\n * service: NewDomainService,\n * config: { enabled: true },\n * });\n *\n * // Register for lazy initialization\n * ServiceRegistry.register({\n * service: LazyService,\n * config: { enabled: true, initWhen: 'lazy' },\n * }, false);\n * ```\n */\n static async register(entry: CoreServiceEntry, initNow = true): Promise<void> {\n const serviceKey = entry.service.serviceKey;\n\n // Check if already registered\n if (ServiceRegistry._services.has(serviceKey) || ServiceRegistry._pending.has(serviceKey)) {\n ServiceRegistry.logger.warn(`Service '${serviceKey}' is already registered`);\n return;\n }\n\n const initWhen = entry.config.initWhen ?? 'immediate';\n\n if (initNow && initWhen === 'immediate') {\n await ServiceRegistry.initializeService(entry);\n } else {\n ServiceRegistry._pending.set(serviceKey, { entry, initWhen });\n ServiceRegistry.logger.debug(\n `Service ${serviceKey} registered for ${initWhen} initialization`\n );\n }\n }\n\n /**\n * Unregister a service (dispose if initialized).\n *\n * @param key - Service key to unregister\n */\n static unregister(key: string): void {\n ServiceRegistry.dispose(key);\n }\n}\n","/**\n * Runtime Detection Utilities\n *\n * Utilities for detecting the current JavaScript runtime environment.\n */\n\nimport type { CoreRuntimeEnvironment } from '@plyaz/types/core';\nimport { PackageLogger } from '@plyaz/logger';\n\nconst logger = new PackageLogger({ packageName: 'core', service: 'Runtime' });\n\n/**\n * Check if a module is available via require.resolve\n */\nfunction isModuleAvailable(moduleName: string): boolean {\n const nodeRequire = globalThis.require;\n if (!nodeRequire) return false;\n\n const resolveModule = nodeRequire.resolve;\n if (!resolveModule) return false;\n\n try {\n resolveModule(moduleName);\n return true;\n } catch {\n return false;\n }\n}\n\n/** Check for alternative runtimes (Deno, Bun) */\nfunction detectAltRuntime(): CoreRuntimeEnvironment | null {\n if (typeof globalThis.Deno !== 'undefined') return 'deno';\n if (typeof globalThis.Bun !== 'undefined') return 'bun';\n return null;\n}\n\n/** Check for edge runtime */\nfunction detectEdgeRuntime(): CoreRuntimeEnvironment | null {\n if (typeof globalThis.EdgeRuntime !== 'undefined') return 'edge';\n const isEdgeLike =\n typeof globalThis.caches !== 'undefined' &&\n typeof globalThis.Request !== 'undefined' &&\n typeof process === 'undefined';\n return isEdgeLike ? 'edge' : null;\n}\n\n/** Check for browser environment */\nfunction detectBrowser(): CoreRuntimeEnvironment | null {\n if (typeof window !== 'undefined' && typeof document !== 'undefined') {\n return 'browser';\n }\n return null;\n}\n\n/** Check for Node.js framework */\nfunction detectNodeFramework(): CoreRuntimeEnvironment {\n // Check for Nuxt (SSR)\n if (process.env.__NUXT__ || process.env.NUXT_APP) return 'nuxt';\n // Check for Next.js (SSR)\n if (process.env.__NEXT_PRIVATE_ORIGIN || process.env.NEXT_RUNTIME) return 'nextjs';\n // Check for NestJS via module detection\n if (isModuleAvailable('@nestjs/core')) return 'nestjs';\n // Check for Express via module detection\n if (isModuleAvailable('express')) return 'express';\n return 'node';\n}\n\n/**\n * Detect the current runtime environment\n */\nexport function detectRuntime(): CoreRuntimeEnvironment {\n // Check alternative runtimes first\n const altRuntime = detectAltRuntime();\n if (altRuntime) return altRuntime;\n\n // Check for edge runtime\n const edgeRuntime = detectEdgeRuntime();\n if (edgeRuntime) return edgeRuntime;\n\n // Check for browser\n const browser = detectBrowser();\n if (browser) return browser;\n\n // Server-side detection (Node.js based)\n if (typeof process !== 'undefined' && process.versions?.node) {\n return detectNodeFramework();\n }\n\n return 'unknown';\n}\n\n/**\n * Load environment variables from a .env file\n */\nexport async function loadEnvFile(envPath: string, verbose?: boolean): Promise<void> {\n try {\n const dotenv = await import('dotenv');\n const result = dotenv.config({ path: envPath });\n\n if (result.error) {\n logger.warn(`Failed to load env file: ${result.error.message}`);\n } else if (verbose) {\n logger.info(`Loaded env from: ${envPath}`);\n }\n } catch {\n logger.warn('dotenv not available, skipping .env file loading');\n }\n}\n","// This eslint disable is an edge-case as we need to ensure that we're able to load CoreInitializer regardless if FE, BE or specific frameworks\n/**\n * CoreInitializer - Unified initialization for @plyaz/core\n *\n * Provides a single entry point to initialize all core services with\n * environment-aware configuration. Works across all JavaScript runtimes.\n *\n * @example Backend with full config\n * ```typescript\n * import { Core } from '@plyaz/core';\n *\n * await Core.initialize({\n * envPath: '.env',\n * db: { adapter: 'drizzle' },\n * api: {\n * env: 'production',\n * baseURL: 'https://api.example.com',\n * },\n * });\n *\n * // Access services\n * const db = Core.db;\n * const api = Core.api;\n * ```\n *\n * @example Frontend (Nuxt/Next.js)\n * ```typescript\n * import { Core } from '@plyaz/core';\n *\n * await Core.initialize({\n * skipDb: true,\n * api: { baseURL: 'https://api.example.com' },\n * });\n *\n * const api = Core.api;\n * ```\n *\n * @example NestJS with DI\n * ```typescript\n * // app.module.ts\n * import { CoreModule } from '@plyaz/core/adapters';\n * import { FeatureFlagModule } from '@plyaz/core/backend/featureFlags';\n *\n * @Module({\n * imports: [\n * CoreModule.forRoot({ envPath: '.env', db: { adapter: 'drizzle' } }),\n * FeatureFlagModule.forRoot({ provider: 'database' }),\n * ],\n * })\n * export class AppModule {}\n * ```\n */\n\nimport { PackageLogger } from '@plyaz/logger';\nimport { ApiClientService } from '../services/ApiClientService';\nimport { CoreEventManager } from '../events/CoreEventManager';\nimport { ServiceRegistry } from './ServiceRegistry';\nimport type {\n CoreRuntimeEnvironment,\n CoreRuntimeContext,\n CoreEnvVars,\n CoreAppEnvironment,\n CoreAppContext,\n CoreApiInitOptions,\n CoreServiceRuntime,\n CoreInitOptions as BaseCoreInitOptions,\n CoreServicesResultBase,\n CoreServiceEntry,\n CoreDomainServiceInstance,\n CoreSystemErrorPayload,\n CoreFeatureFlagInitConfig,\n CoreErrorHandlerInitConfig,\n CoreCacheConfig,\n CoreObservabilityConfig,\n CoreDbServiceConfig,\n CoreStorageConfig,\n CoreNotificationConfig,\n // Service instance types (from @plyaz/types, not backend modules)\n CoreDbServiceInstance,\n CoreCacheServiceInstance,\n CoreStorageServiceInstance,\n CoreNotificationServiceInstance,\n} from '@plyaz/types/core';\nimport type { ObservabilityAdapter } from '@plyaz/types/observability';\nimport { ObservabilityService } from '../base/observability/ObservabilityService';\nimport { LoggerAdapter } from '../base/observability/LoggerAdapter';\nimport type { FeatureFlagValue, FeatureFlagStoreSlice } from '@plyaz/types/features';\nimport { ERROR_CODES, BACKEND_RUNTIMES, FRONTEND_RUNTIMES } from '@plyaz/types';\nimport { BaseError, CorePackageError, initializeErrorSystem } from '@plyaz/errors';\n// Core error handling (frontend-safe)\nimport {\n initializeGlobalErrorHandler,\n setEventEmitter,\n clearEventEmitter,\n} from '@plyaz/errors/middleware';\n// ServerErrorMiddleware is backend-only, import dynamically where needed\nimport type { ErrorStoreActions, GlobalErrorHandler } from '@plyaz/types/errors';\nimport { detectRuntime, loadEnvFile } from '../utils/runtime';\nimport {\n createStandaloneFeatureFlagStore,\n useRootStore,\n STORE_KEYS,\n type StoreKey,\n} from '@plyaz/store';\nimport { CORE_EVENTS, type CoreEvent } from '@plyaz/types/core';\nimport type { RootStoreSlice } from '@plyaz/types/store';\nimport type { StoreApi } from 'zustand/vanilla';\nimport { getCoreDependency } from '../config/dependencies';\n\n// Constants\nconst DEFAULT_MAX_ERRORS = 100;\n\n/**\n * Core initialization options with specific types for this package\n */\nexport interface CoreInitOptions\n extends Omit<\n BaseCoreInitOptions<\n Partial<CoreDbServiceConfig>,\n CoreApiInitOptions,\n CoreCacheConfig,\n CoreStorageConfig,\n CoreNotificationConfig\n >,\n 'observability' | 'skipObservability'\n > {\n /** Observability configuration */\n observability?: CoreObservabilityConfig;\n /** Skip observability initialization */\n skipObservability?: boolean;\n /**\n * Global error handler configuration.\n * Auto-initializes by default to catch all uncaught errors.\n * Set `enabled: false` to disable if you want to use your own error handling.\n *\n * @example\n * ```typescript\n * await Core.initialize({\n * errorHandler: {\n * enabled: true,\n * logToConsole: true,\n * maxErrors: 200,\n * filter: (error) => error instanceof MyError,\n * },\n * });\n * ```\n */\n errorHandler?: CoreErrorHandlerInitConfig;\n\n /** Feature flags configuration */\n featureFlags?: CoreFeatureFlagInitConfig;\n\n /**\n * Domain services to auto-initialize (frontend pattern).\n * Uses ServiceRegistry for automatic initialization.\n *\n * @example\n * ```typescript\n * await Core.initialize({\n * services: [\n * { service: FeatureFlagDomainService, config: { enabled: true } },\n * { service: ExampleDomainService, config: { enabled: true, useRealApi: true } },\n * ],\n * });\n *\n * // Access via ServiceRegistry\n * const flags = ServiceRegistry.get<FeatureFlagDomainService>('featureFlags');\n * ```\n */\n services?: CoreServiceEntry[];\n}\n\n/**\n * Core initialization result with specific types for this package\n */\nexport type CoreServicesResult = CoreServicesResultBase<\n CoreDbServiceInstance,\n typeof ApiClientService,\n CoreCacheServiceInstance,\n ObservabilityAdapter,\n CoreStorageServiceInstance,\n CoreNotificationServiceInstance\n>;\n\n// Domain store keys are automatically derived from STORE_KEYS\n// Excluding global stores (error, featureFlags) which are read-only by default\n\n/**\n * Function type for getting core domain services.\n * Used by entry points to inject runtime-appropriate services.\n *\n * @internal This is injected by entry points, not used directly.\n */\nexport type GetCoreDomainServicesFn = (isFrontend: boolean) => Promise<CoreServiceEntry[]>;\n\n/**\n * Injected function to get core domain services.\n * Set by entry points (entry-backend.ts) before Core.initialize().\n * Frontend entries don't set this - they just don't load default services.\n */\nlet _getCoreDomainServices: GetCoreDomainServicesFn | null = null;\n\n/**\n * Set the function to get core domain services.\n * Called by entry-backend.ts to inject the backend-aware service loader.\n *\n * @internal Used by entry points only.\n */\nexport function setGetCoreDomainServices(fn: GetCoreDomainServicesFn): void {\n _getCoreDomainServices = fn;\n}\n\nexport class Core {\n private static initialized = false;\n private static _coreServices: CoreServicesResult = {\n db: null,\n api: null,\n cache: null,\n observability: null,\n storage: null,\n notifications: null,\n env: {},\n runtime: 'unknown',\n appContext: 'webapp',\n };\n\n /**\n * Logger for Core initialization (created lazily)\n */\n private static _logger: PackageLogger | null = null;\n\n /**\n * Get or create the Core logger\n */\n private static get logger(): PackageLogger {\n Core._logger ??= new PackageLogger({\n packageName: 'core',\n service: 'Core',\n });\n return Core._logger;\n }\n\n /**\n * Log a message during initialization.\n * Uses PackageLogger, respects verbose flag.\n */\n private static log(message: string, verbose?: boolean, data?: Record<string, unknown>): void {\n if (!verbose) return;\n if (data) {\n Core.logger.info(message, data);\n } else {\n Core.logger.info(message);\n }\n }\n\n /**\n * Log a debug message during initialization.\n */\n private static logDebug(\n message: string,\n verbose?: boolean,\n data?: Record<string, unknown>\n ): void {\n if (!verbose) return;\n if (data) {\n Core.logger.debug(message, data);\n } else {\n Core.logger.debug(message);\n }\n }\n\n /**\n * Observability configuration\n */\n private static _observabilityConfig: CoreObservabilityConfig = {};\n\n /**\n * Global error handler instance\n */\n private static _errorHandler: GlobalErrorHandler | null = null;\n\n /**\n * Error handler configuration\n */\n private static _errorConfig: CoreErrorHandlerInitConfig = {};\n\n /**\n * HTTP error handler/middleware based on runtime.\n * Auto-created during initialization.\n */\n private static _httpErrorHandler: unknown = null;\n\n /**\n * Event listener cleanup functions\n */\n private static _eventCleanupFns: (() => void)[] = [];\n\n /**\n * Feature flag configuration\n */\n private static _flagConfig: CoreFeatureFlagInitConfig = {};\n\n /**\n * Root store instance (contains errors, feature flags, and all other slices)\n * Initialized during Core.initialize() - frontend uses React hook store, backend uses vanilla store\n * All store access should go through Core.rootStore - no separate stores needed\n */\n private static _rootStore: StoreApi<RootStoreSlice> | null = null;\n\n /**\n * Setup environment and context\n */\n private static async setupEnvironment(options: CoreInitOptions): Promise<CoreAppEnvironment> {\n const { envPath, environment, appContext, env, verbose } = options;\n\n Core._coreServices.appContext = appContext ?? 'webapp';\n Core.log(`App context: ${Core._coreServices.appContext}`, verbose);\n\n const globalEnvironment: CoreAppEnvironment =\n environment ?? (process.env.NODE_ENV as CoreAppEnvironment) ?? 'development';\n Core.log(`Global environment: ${globalEnvironment}`, verbose);\n\n Core._coreServices.runtime = detectRuntime();\n Core.log(`Detected runtime: ${Core._coreServices.runtime}`, verbose);\n\n if (envPath) await loadEnvFile(envPath, verbose);\n Core._coreServices.env = { ...process.env, ...env };\n\n return globalEnvironment;\n }\n\n /**\n * Initialize a service with error handling\n */\n private static async initService<T>(\n name: string,\n init: () => Promise<T>,\n verbose?: boolean\n ): Promise<T | undefined> {\n try {\n return await init();\n } catch (error) {\n Core.logger.error(`Failed to initialize ${name}`, { error: (error as Error).message });\n if (verbose) Core.logger.error('Full error', { error });\n return undefined;\n }\n }\n\n /** Initialize error handler if enabled */\n private static async initErrorHandlerIfEnabled(options: CoreInitOptions): Promise<void> {\n const { errorHandler: config, verbose } = options;\n if (config?.enabled === false) {\n Core.log('Global error handler disabled by configuration', verbose);\n return;\n }\n await Core.initService(\n 'error handler',\n async () => {\n await Core.initializeErrorHandler(config, verbose);\n Core.subscribeToErrorEvents(verbose);\n },\n verbose\n );\n }\n\n /** Initialize API client if not skipped */\n private static async initApiIfEnabled(\n options: CoreInitOptions,\n env: CoreAppEnvironment\n ): Promise<void> {\n const { api: apiConfig, skipApi, verbose } = options;\n if (skipApi) return;\n\n await Core.initService(\n 'API client',\n async () => {\n await Core.initializeApi(apiConfig, env, verbose);\n Core._coreServices.api = ApiClientService;\n Core.log('API client service initialized', verbose);\n },\n verbose\n );\n Core._coreServices.api = ApiClientService;\n }\n\n /** Initialize cache service if not skipped (backend-only due to ioredis dependency) */\n private static async initCacheIfEnabled(options: CoreInitOptions): Promise<void> {\n const { cache: cacheConfig, skipCache, verbose } = options;\n if (skipCache) {\n Core.log('Cache service skipped (skipCache: true)', verbose);\n return;\n }\n\n // Skip cache initialization if no config provided\n if (!cacheConfig) {\n Core.log('Cache service skipped (no config provided)', verbose);\n return;\n }\n\n // Skip on frontend runtimes (CacheService pulls in ioredis which requires Node.js)\n if (Core.isFrontend) {\n Core.log('Cache service skipped (frontend runtime detected)', verbose);\n return;\n }\n\n await Core.initService(\n 'cache',\n async () => {\n await Core.initializeCache(cacheConfig as CoreCacheConfig, verbose);\n const CacheService = getCoreDependency('CacheService');\n if (CacheService) {\n Core._coreServices.cache = CacheService.getInstance();\n Core.log('Cache service initialized', verbose);\n }\n },\n verbose\n );\n }\n\n /** Initialize observability if not skipped */\n private static async initObservabilityIfEnabled(\n options: CoreInitOptions,\n globalEnvironment: CoreAppEnvironment\n ): Promise<void> {\n const { observability: observabilityConfig, skipObservability, verbose } = options;\n if (skipObservability) {\n Core.log('Observability service skipped (skipObservability: true)', verbose);\n return;\n }\n\n // Always use ObservabilityService - it adds LoggerAdapter by default\n const config = observabilityConfig ?? { enabled: true };\n\n await Core.initService(\n 'observability',\n async () => {\n await Core.initializeObservability(config, verbose, globalEnvironment);\n Core.log('Observability service initialized', verbose);\n },\n verbose\n );\n }\n\n /** Initialize storage service if not skipped (backend-only) */\n private static async initStorageIfEnabled(options: CoreInitOptions): Promise<void> {\n const { storage: storageConfig, skipStorage, verbose } = options;\n\n // Skip if explicitly disabled\n if (skipStorage) {\n Core.log('Storage service skipped (skipStorage: true)', verbose);\n return;\n }\n\n // Skip if no config provided\n if (!storageConfig) {\n Core.log('Storage service skipped (no config provided)', verbose);\n return;\n }\n\n // Skip on frontend runtimes (storage is backend-only)\n if (Core.isFrontend) {\n Core.log('Storage service skipped (frontend runtime detected)', verbose);\n return;\n }\n\n await Core.initService(\n 'storage',\n async () => {\n const StorageService = getCoreDependency('StorageService');\n if (!StorageService) {\n Core.log('Storage service skipped (dependency not registered)', verbose);\n return;\n }\n await StorageService.initialize(storageConfig);\n Core._coreServices.storage = StorageService.getInstance();\n Core.log('Storage service initialized', verbose);\n },\n verbose\n );\n }\n\n /** Initialize notifications service if not skipped (backend-only) */\n private static async initNotificationsIfEnabled(options: CoreInitOptions): Promise<void> {\n const { notifications: notificationsConfig, skipNotifications, verbose } = options;\n\n // Skip if explicitly disabled\n if (skipNotifications) {\n Core.log('Notifications service skipped (skipNotifications: true)', verbose);\n return;\n }\n\n // Skip if no config provided\n if (!notificationsConfig) {\n Core.log('Notifications service skipped (no config provided)', verbose);\n return;\n }\n\n // Skip on frontend runtimes (notifications is backend-only)\n if (Core.isFrontend) {\n Core.log('Notifications service skipped (frontend runtime detected)', verbose);\n return;\n }\n\n await Core.initService(\n 'notifications',\n async () => {\n const NotificationService = getCoreDependency('NotificationService');\n if (!NotificationService) {\n Core.log('Notifications service skipped (dependency not registered)', verbose);\n return;\n }\n await NotificationService.initialize(notificationsConfig);\n Core._coreServices.notifications = NotificationService.getInstance();\n Core.log('Notifications service initialized', verbose);\n },\n verbose\n );\n }\n\n /**\n * Initialize domain services\n *\n * Loads core domain services using the injected loader (if available),\n * then merges with any user-provided services.\n * User-provided service configs override core defaults.\n *\n * Note: Frontend entries don't inject a loader, so they only use user-provided services.\n */\n private static async initDomainServicesIfConfigured(\n options: CoreInitOptions,\n globalEnvironment: CoreAppEnvironment\n ): Promise<void> {\n const { api: apiConfig, services: userServices, verbose } = options;\n const runtime = Core._coreServices.runtime;\n\n // Load core services using injected loader (backend sets this, frontend doesn't)\n const coreDomainServices = _getCoreDomainServices\n ? await _getCoreDomainServices(Core.isFrontend)\n : [];\n\n // Merge core services with user-provided services\n // User services can override core service configs by using the same service class\n const coreServiceKeys = new Set(coreDomainServices.map(s => s.service.serviceKey));\n const userOverrides = (userServices ?? []).filter(s =>\n coreServiceKeys.has(s.service.serviceKey)\n );\n const additionalUserServices = (userServices ?? []).filter(\n s => !coreServiceKeys.has(s.service.serviceKey)\n );\n\n // Build merged services: core (with overrides applied) + additional user services\n const mergedServices: CoreServiceEntry[] = coreDomainServices\n .map(coreService => {\n const override = userOverrides.find(\n u => u.service.serviceKey === coreService.service.serviceKey\n );\n return override\n ? { ...coreService, config: { ...coreService.config, ...override.config } }\n : coreService;\n })\n .concat(additionalUserServices);\n\n // Skip if somehow no services\n if (mergedServices.length === 0) return;\n\n await Core.initService(\n 'domain services',\n async () => {\n Core.log('Initializing domain services via ServiceRegistry...', verbose);\n Core.logDebug('Core services', verbose, {\n services: coreDomainServices.map(s => s.service.serviceKey),\n });\n if (userServices?.length) {\n Core.logDebug('User services', verbose, {\n services: userServices.map(s => s.service.serviceKey),\n });\n }\n await ServiceRegistry.initialize({\n environment: globalEnvironment,\n runtime,\n apiClient: apiConfig ? { baseURL: apiConfig.baseURL, ...apiConfig } : undefined,\n services: mergedServices,\n stores: {\n // Returns specific slice from namespaced root store (type-safe)\n getStore: <K extends keyof RootStoreSlice>(key: K): RootStoreSlice[K] | undefined =>\n Core.getDomainStore(key),\n },\n });\n Core.log('Domain services initialized', verbose, {\n keys: ServiceRegistry.getInitializedKeys(),\n });\n },\n verbose\n );\n }\n\n /**\n * Initialize all core services\n */\n\n static async initialize(options: CoreInitOptions = {}): Promise<CoreServicesResult> {\n if (Core.initialized) {\n Core.log('Already initialized, returning existing services', options.verbose);\n return Core._coreServices;\n }\n\n const { db: dbConfig, featureFlags: featureFlagsConfig, skipDb, verbose } = options;\n const globalEnvironment = await Core.setupEnvironment(options);\n\n await Core.initErrorHandlerIfEnabled(options);\n\n if (!Core.shouldSkipDbService(skipDb, verbose)) {\n const db = await Core.initService(\n 'database',\n () => Core.initializeDb(dbConfig, verbose),\n verbose\n );\n Core._coreServices.db = db ?? null;\n }\n\n await Core.initApiIfEnabled(options, globalEnvironment);\n\n await Core.initCacheIfEnabled(options);\n\n await Core.initObservabilityIfEnabled(options, globalEnvironment);\n\n await Core.initStorageIfEnabled(options);\n\n await Core.initNotificationsIfEnabled(options);\n\n if (featureFlagsConfig?.enabled !== false) {\n await Core.initService(\n 'feature flags',\n () => Core.initializeFeatureFlags(featureFlagsConfig, verbose),\n verbose\n );\n }\n\n await Core.initDomainServicesIfConfigured(options, globalEnvironment);\n\n Core.initialized = true;\n Core.log('Initialization complete', verbose);\n return Core._coreServices;\n }\n\n /**\n * Get initialized domain service keys\n * Use Core.getService(key) or ServiceRegistry.get(key) to access individual services.\n *\n * @example\n * ```typescript\n * const keys = Core.serviceKeys;\n * const exampleService = Core.getService('example');\n * ```\n */\n static get serviceKeys(): string[] {\n return ServiceRegistry.getInitializedKeys();\n }\n\n /**\n * All stores - unified access to ALL slices from single root store\n * All stores (global + domain) are slices of ONE Zustand store instance.\n *\n * **Auto-generated from STORE_KEYS** - No manual registration needed!\n *\n * **Benefits:**\n * - ✅ Access without hooks (store.getState())\n * - ✅ Cross-slice subscriptions work automatically\n * - ✅ Single source of truth\n * - ✅ Automatically scales with new stores\n *\n * @example\n * const errorStore = Core.stores.error; // Global slice\n * const flagsStore = Core.stores.featureFlags; // Global slice\n * const exampleStore = Core.stores.example; // Domain slice\n */\n static get stores(): Record<StoreKey, RootStoreSlice | undefined> {\n const rootState = Core._rootStore?.getState();\n\n // Dynamically generate store accessors from STORE_KEYS\n return Object.values(STORE_KEYS).reduce(\n (acc, key) => {\n Object.defineProperty(acc, key, {\n get: () => rootState,\n enumerable: true,\n });\n return acc;\n },\n {} as Record<StoreKey, RootStoreSlice | undefined>\n );\n }\n\n /**\n * Get a specific store slice by key (for ServiceRegistry injection).\n * Returns the actual slice from the namespaced root store.\n *\n * @param key - Store key (type-safe: 'example' | 'errors' | 'featureFlags')\n * @returns Specific store slice or undefined\n *\n * @example\n * ```typescript\n * const exampleSlice = Core.getDomainStore('example'); // ✅ Returns ExampleFrontendStoreSlice\n * const errorSlice = Core.getDomainStore('errors'); // ✅ Returns ErrorStoreSlice\n * const invalid = Core.getDomainStore('invalid'); // ❌ TypeScript error!\n * ```\n */\n static getDomainStore<K extends keyof RootStoreSlice>(key: K): RootStoreSlice[K] | undefined;\n static getDomainStore<T = RootStoreSlice>(): T | undefined;\n static getDomainStore<K extends keyof RootStoreSlice>(\n key?: K\n ): RootStoreSlice[K] | RootStoreSlice | undefined {\n const rootState = Core._rootStore?.getState();\n if (!rootState) return undefined;\n\n // If no key provided, return entire root store\n if (!key) return rootState;\n\n // Return specific slice from namespaced store (type-safe)\n return rootState[key];\n }\n\n /**\n * Event manager for subscribing to domain events\n * @example Core.events.on('example:created', handler)\n */\n static get events(): typeof CoreEventManager {\n return CoreEventManager;\n }\n\n /**\n * Get database service instance\n * @throws Error if not initialized\n */\n static get db(): CoreDbServiceInstance {\n if (!Core._coreServices.db) {\n throw new CorePackageError(\n 'Database service not initialized. Call Core.initialize() first.',\n ERROR_CODES.CLIENT_INITIALIZATION_FAILED\n );\n }\n return Core._coreServices.db;\n }\n\n /**\n * Get API client service\n */\n static get api(): typeof ApiClientService {\n if (!Core._coreServices.api) {\n throw new CorePackageError(\n 'API client service not initialized. Call Core.initialize() first.',\n ERROR_CODES.CLIENT_INITIALIZATION_FAILED\n );\n }\n return Core._coreServices.api;\n }\n\n /**\n * Get cache service instance (backend-only)\n * @throws Error if not initialized\n */\n static get cache(): CoreCacheServiceInstance {\n if (!Core._coreServices.cache) {\n throw new CorePackageError(\n 'Cache service not initialized. Call Core.initialize() with cache config first.',\n ERROR_CODES.CLIENT_INITIALIZATION_FAILED\n );\n }\n return Core._coreServices.cache;\n }\n\n /**\n * Get observability adapter instance\n * @throws Error if not initialized\n *\n * @example\n * ```typescript\n * // Record a metric\n * await Core.observability.recordMetric({\n * type: 'counter',\n * name: 'api.requests',\n * value: 1,\n * tags: { endpoint: '/users' },\n * });\n *\n * // Start a span\n * const span = Core.observability.startSpan({ name: 'processOrder' });\n * try {\n * // ... do work\n * span.setStatus('ok');\n * } catch (e) {\n * span.recordException(e);\n * span.setStatus('error');\n * } finally {\n * span.end();\n * }\n * ```\n */\n static get observability(): ObservabilityAdapter {\n if (!Core._coreServices.observability) {\n throw new CorePackageError(\n 'Observability service not initialized. Call Core.initialize() first.',\n ERROR_CODES.CLIENT_INITIALIZATION_FAILED\n );\n }\n return Core._coreServices.observability;\n }\n\n /**\n * Check if observability is initialized\n */\n static get isObservabilityInitialized(): boolean {\n return Core._coreServices.observability !== null;\n }\n\n /**\n * Get observability configuration\n */\n static get observabilityConfig(): CoreObservabilityConfig {\n return Core._observabilityConfig;\n }\n\n /**\n * Get storage service instance (backend-only)\n * @throws Error if not initialized\n *\n * @example\n * ```typescript\n * const storage = Core.storage.getStorage();\n * await storage.uploadFile({ file, filename: 'doc.pdf' });\n * ```\n */\n static get storage(): CoreStorageServiceInstance {\n if (!Core._coreServices.storage) {\n throw new CorePackageError(\n 'Storage service not initialized. Call Core.initialize() with storage config first.',\n ERROR_CODES.CLIENT_INITIALIZATION_FAILED\n );\n }\n return Core._coreServices.storage;\n }\n\n /**\n * Check if storage is initialized\n */\n static get isStorageInitialized(): boolean {\n return Core._coreServices.storage !== null;\n }\n\n /**\n * Get notifications service instance (backend-only)\n * @throws Error if not initialized\n *\n * @example\n * ```typescript\n * const notifications = Core.notifications.getNotifications();\n * await notifications.sendEmail({ to: 'user@example.com', templateId: 'welcome' });\n * ```\n */\n static get notifications(): CoreNotificationServiceInstance {\n if (!Core._coreServices.notifications) {\n throw new CorePackageError(\n 'Notifications service not initialized. Call Core.initialize() with notifications config first.',\n ERROR_CODES.CLIENT_INITIALIZATION_FAILED\n );\n }\n return Core._coreServices.notifications;\n }\n\n /**\n * Check if notifications is initialized\n */\n static get isNotificationsInitialized(): boolean {\n return Core._coreServices.notifications !== null;\n }\n\n /**\n * Get root store (contains all slices: errors, feature flags, etc.)\n * Use this to access the full store state and all slice actions globally.\n *\n * @example\n * ```typescript\n * // Access error actions\n * const state = Core.rootStore.getState();\n * state.addError({ ... });\n *\n * // Access flags\n * console.log(state.flags);\n *\n * // Subscribe to store changes\n * Core.rootStore.subscribe((state) => {\n * console.log('Errors:', state.errors);\n * console.log('Flags:', state.flags);\n * });\n * ```\n */\n static get rootStore(): StoreApi<RootStoreSlice> {\n if (!Core._rootStore) {\n throw new CorePackageError(\n 'Root store not initialized. Call Core.initialize() first.',\n ERROR_CODES.CLIENT_INITIALIZATION_FAILED\n );\n }\n return Core._rootStore;\n }\n\n /**\n * Get global error store actions.\n * Provides access to the error store for querying and managing errors.\n *\n * @example\n * ```typescript\n * // Get all errors\n * const allErrors = useErrorStore.getState().errors;\n *\n * // Clear all errors\n * Core.errors.clearErrors();\n *\n * // Dismiss an error\n * Core.errors.dismissError(errorId);\n * ```\n */\n static get errors(): ErrorStoreActions {\n if (!Core._errorHandler) {\n throw new CorePackageError(\n 'Error handler not initialized. Call Core.initialize() first or set errorHandler.enabled: true.',\n ERROR_CODES.CLIENT_INITIALIZATION_FAILED\n );\n }\n return Core._errorHandler.getStore();\n }\n\n /**\n * Get feature flags store\n * Provides synchronous access to feature flag values from the store.\n *\n * @example\n * ```typescript\n * // Check if a flag is enabled\n * const isEnabled = Core.flags.isEnabled('NEW_FEATURE');\n *\n * // Get a flag value\n * const provider = Core.flags.getValue<string>('PAYMENT_PROVIDER');\n *\n * // Refresh flags from source\n * await Core.flags.refresh();\n * ```\n */\n static get flags(): FeatureFlagStoreSlice {\n if (!Core._rootStore) {\n throw new CorePackageError(\n 'Root store not initialized. Call Core.initialize() first.',\n ERROR_CODES.CLIENT_INITIALIZATION_FAILED\n );\n }\n // Return the feature flag slice from root store\n // Root store state includes all flag methods (isEnabled, getValue, refresh, etc.)\n return Core._rootStore.getState() as unknown as FeatureFlagStoreSlice;\n }\n\n /**\n * Check if error handler is initialized\n */\n static get isErrorHandlerInitialized(): boolean {\n return Core._errorHandler !== null;\n }\n\n /**\n * Get the HTTP error handler/middleware based on runtime.\n * Returns different types based on detected runtime:\n *\n * - **Express**: Error handler middleware function\n * ```typescript\n * app.use(Core.httpErrorHandler);\n * ```\n *\n * - **NestJS**: Exception filter class\n * ```typescript\n * app.useGlobalFilters(new (Core.httpErrorHandler)());\n * ```\n *\n * - **Next.js**: Object with App Router and Pages Router handlers\n * ```typescript\n * // App Router\n * export const GET = Core.httpErrorHandler.withErrorHandler(handler);\n * // Pages Router\n * export default Core.httpErrorHandler.createNextApiErrorHandler()(handler);\n * ```\n *\n * - **Node.js/Bun/Deno**: Object with handleError and createMiddleware\n * ```typescript\n * Core.httpErrorHandler.handleError(error, req, res);\n * ```\n *\n * - **Browser**: null (no HTTP handler needed)\n *\n * @returns The HTTP error handler for the current runtime\n */\n static get httpErrorHandler(): unknown {\n return Core._httpErrorHandler;\n }\n\n /**\n * Check if feature flags are initialized\n */\n static get isFlagsInitialized(): boolean {\n return Core._rootStore?.getState()?.featureFlags?.isInitialized ?? false;\n }\n\n /**\n * Get error handler configuration\n */\n static get errorConfig(): CoreErrorHandlerInitConfig {\n return Core._errorConfig;\n }\n\n /**\n * Get feature flag configuration\n */\n static get flagConfig(): CoreFeatureFlagInitConfig {\n return Core._flagConfig;\n }\n\n /**\n * Get loaded environment variables\n */\n static get env(): CoreEnvVars {\n return Core._coreServices.env;\n }\n\n /**\n * Get detected runtime environment\n */\n static get runtime(): CoreRuntimeEnvironment {\n return Core._coreServices.runtime;\n }\n\n /**\n * Get current app context\n */\n static get appContext(): CoreAppContext {\n return Core._coreServices.appContext;\n }\n\n /**\n * Check if Core is initialized\n */\n static get isInitialized(): boolean {\n return Core.initialized;\n }\n\n /**\n * Check if running on a backend runtime\n */\n static get isBackend(): boolean {\n return BACKEND_RUNTIMES.includes(Core._coreServices.runtime);\n }\n\n /**\n * Check if running on a frontend runtime\n */\n static get isFrontend(): boolean {\n return FRONTEND_RUNTIMES.includes(Core._coreServices.runtime);\n }\n\n /**\n * Get runtime context (backend, frontend, or universal)\n * Universal means the runtime can be either (SSR frameworks like Next.js, Nuxt, Edge)\n */\n static getRuntimeContext(): CoreRuntimeContext {\n if (BACKEND_RUNTIMES.includes(Core._coreServices.runtime)) {\n return 'backend';\n }\n if (FRONTEND_RUNTIMES.includes(Core._coreServices.runtime)) {\n return 'frontend';\n }\n return 'universal';\n }\n\n /**\n * Assert that the current runtime matches the expected runtime(s)\n * Throws an error if the runtime doesn't match\n *\n * @param expected - Expected runtime(s) to check against\n * @param serviceName - Name of the service for error message\n * @throws CorePackageError if runtime doesn't match\n *\n * @example\n * ```typescript\n * // Assert backend-only\n * Core.assertRuntime('backend', 'DatabaseService');\n *\n * // Assert multiple runtimes\n * Core.assertRuntime(['backend', 'universal'], 'CacheService');\n * ```\n */\n static assertRuntime(\n expected: CoreServiceRuntime | readonly CoreServiceRuntime[],\n serviceName: string\n ): void {\n const runtimes = Array.isArray(expected) ? expected : [expected];\n const currentContext = Core.getRuntimeContext();\n\n // Check if current context matches any of the expected runtimes\n const isAllowed = runtimes.some(runtime => {\n if (runtime === 'universal') return true;\n if (runtime === currentContext) return true;\n // Universal context (SSR) can run both frontend and backend code\n if (currentContext === 'universal') return true;\n return false;\n });\n\n if (!isAllowed) {\n throw new CorePackageError(\n `${serviceName} cannot run in ${currentContext} runtime. ` +\n `Allowed runtimes: ${runtimes.join(', ')}. ` +\n `Current runtime: ${Core._coreServices.runtime}`,\n ERROR_CODES.FEATURE_NOT_SUPPORTED\n );\n }\n }\n\n /**\n * Check if a service runtime is compatible with current runtime\n * Returns true/false instead of throwing\n *\n * @param expected - Expected runtime(s) to check against\n */\n static isRuntimeCompatible(\n expected: CoreServiceRuntime | readonly CoreServiceRuntime[]\n ): boolean {\n const runtimes = Array.isArray(expected) ? expected : [expected];\n const currentContext = Core.getRuntimeContext();\n\n return runtimes.some(runtime => {\n if (runtime === 'universal') return true;\n if (runtime === currentContext) return true;\n if (currentContext === 'universal') return true;\n return false;\n });\n }\n\n /**\n * Get a registered domain service by key.\n * Convenience method that wraps ServiceRegistry.get().\n *\n * @param key - Service key (e.g., 'featureFlags', 'example')\n * @returns The service instance\n *\n * @example\n * ```typescript\n * const flags = Core.getService<FeatureFlagDomainService>('featureFlags');\n * const isEnabled = await flags.isEnabled('my-flag');\n * ```\n */\n static getService<T extends CoreDomainServiceInstance = CoreDomainServiceInstance>(\n key: string\n ): T {\n return ServiceRegistry.get<T>(key);\n }\n\n /**\n * Get a registered domain service by key with async initialization if needed.\n * Convenience method that wraps ServiceRegistry.getAsync().\n *\n * @param key - Service key\n * @returns Promise resolving to the service instance\n */\n static async getServiceAsync<T extends CoreDomainServiceInstance = CoreDomainServiceInstance>(\n key: string\n ): Promise<T> {\n return ServiceRegistry.getAsync<T>(key);\n }\n\n /**\n * Check if a domain service is registered.\n */\n static hasService(key: string): boolean {\n return ServiceRegistry.has(key);\n }\n\n /**\n * Reset Core (useful for testing)\n */\n // eslint-disable-next-line complexity\n static async reset(): Promise<void> {\n // Close database\n if (Core._coreServices.db) {\n await Core._coreServices.db.getDatabase()?.close?.();\n }\n\n // Dispose cache\n if (Core._coreServices.cache) {\n const CacheService = getCoreDependency('CacheService');\n CacheService?.reset?.();\n }\n\n // Dispose observability\n if (Core._coreServices.observability) {\n await Core._coreServices.observability.shutdown();\n }\n Core._observabilityConfig = {};\n\n // Dispose storage\n if (Core._coreServices.storage) {\n await Core._coreServices.storage.close();\n const StorageService = getCoreDependency('StorageService');\n await StorageService?.reset?.();\n }\n\n // Dispose notifications\n if (Core._coreServices.notifications) {\n await Core._coreServices.notifications.close();\n const NotificationService = getCoreDependency('NotificationService');\n await NotificationService?.reset?.();\n }\n\n // Dispose error handler\n if (Core._errorHandler) {\n Core._errorHandler.destroy();\n Core._errorHandler = null;\n clearEventEmitter(); // Clean up CoreEventManager integration\n }\n Core._errorConfig = {};\n Core._httpErrorHandler = null;\n\n // Cleanup event listeners\n for (const cleanup of Core._eventCleanupFns) {\n cleanup();\n }\n Core._eventCleanupFns = [];\n\n // Dispose feature flags slice from root store\n if (Core._rootStore) {\n const state = Core._rootStore.getState();\n if (state.featureFlags?.dispose) {\n state.featureFlags.dispose();\n }\n Core._rootStore = null;\n }\n Core._flagConfig = {};\n\n // Dispose all registered services via ServiceRegistry\n ServiceRegistry.disposeAll();\n\n // Dispose event manager\n CoreEventManager.dispose();\n\n Core._coreServices = {\n db: null,\n api: null,\n cache: null,\n observability: null,\n storage: null,\n notifications: null,\n env: {},\n runtime: 'unknown',\n appContext: 'webapp',\n };\n Core.initialized = false;\n }\n\n /**\n * Determines whether to skip DbService initialization.\n *\n * DbService is backend-only and should never be initialized on frontend runtimes.\n * This method:\n * - Returns true (skip) if skipDb was explicitly set to true\n * - Returns true (skip) if running on frontend, with a warning\n * - Warns if someone explicitly tried to init DbService on frontend (skipDb: false)\n *\n * @param skipDb - User-provided skipDb option\n * @param verbose - Enable verbose logging\n * @returns true if DbService should be skipped\n */\n private static shouldSkipDbService(skipDb: boolean | undefined, verbose?: boolean): boolean {\n // User explicitly requested to skip\n if (skipDb === true) {\n Core.log('Database service skipped (skipDb: true)', verbose);\n return true;\n }\n\n // Check if running on frontend\n const isFrontend = Core.isFrontend;\n\n if (isFrontend) {\n // User explicitly tried to init DbService on frontend (skipDb: false)\n if (skipDb === false) {\n Core.logger.warn(\n 'DbService cannot be initialized on frontend runtime. ' +\n 'DbService is backend-only and requires Node.js. ' +\n 'Use API calls from frontend instead. Skipping database initialization.'\n );\n } else if (verbose) {\n // skipDb was undefined (default) - just log that we're skipping\n Core.log(\n 'Database service skipped (frontend runtime detected). ' +\n 'DbService is only available on backend.',\n verbose\n );\n }\n return true;\n }\n\n // Backend or universal runtime - don't skip\n return false;\n }\n\n /**\n * Initialize database service\n * Config validation is handled by DbService\n */\n private static async initializeDb(\n config?: Partial<CoreDbServiceConfig>,\n verbose?: boolean\n ): Promise<CoreDbServiceInstance> {\n Core.log(`Initializing database with adapter: ${config?.adapter ?? 'drizzle'}`, verbose);\n\n const DbService = getCoreDependency('DbService');\n if (!DbService) {\n throw new CorePackageError(\n 'DbService not available. Ensure setCoreDependencies() was called in entry-backend.ts',\n ERROR_CODES.CLIENT_INITIALIZATION_FAILED\n );\n }\n return DbService.initialize({\n adapter: 'drizzle',\n ...config,\n } as CoreDbServiceConfig);\n }\n\n /**\n * Initialize API client service\n * Config validation is handled by ApiClientService\n */\n private static async initializeApi(\n config?: CoreApiInitOptions,\n globalEnvironment?: CoreAppEnvironment,\n verbose?: boolean\n ): Promise<void> {\n const { env: apiEnv, setAsDefault, ...apiClientOptions } = config ?? {};\n const resolvedEnv = apiEnv ?? globalEnvironment ?? 'development';\n\n Core.log(`Initializing API client for environment: ${resolvedEnv}`, verbose);\n\n await ApiClientService.init(\n {\n env: resolvedEnv,\n setAsDefault: setAsDefault ?? true,\n },\n apiClientOptions\n );\n }\n\n /**\n * Initialize cache service (backend-only)\n * Config validation is handled by CacheService\n */\n private static async initializeCache(config: CoreCacheConfig, verbose?: boolean): Promise<void> {\n Core.log(`Initializing cache with strategy: ${config.strategy}`, verbose);\n\n const CacheService = getCoreDependency('CacheService');\n if (!CacheService) {\n throw new CorePackageError(\n 'CacheService not available. Ensure setCoreDependencies() was called in entry-backend.ts',\n ERROR_CODES.CLIENT_INITIALIZATION_FAILED\n );\n }\n await CacheService.initialize(config);\n }\n\n /**\n * Initialize observability service based on config.\n * Always includes LoggerAdapter as failover for console output.\n */\n private static async initializeObservability(\n config: CoreObservabilityConfig,\n verbose?: boolean,\n environment?: CoreAppEnvironment\n ): Promise<void> {\n Core.log(`Initializing observability with provider: ${config.provider ?? 'auto'}`, verbose);\n\n // Use environment from config or passed parameter\n const env = config.environment ?? environment ?? 'development';\n Core._observabilityConfig = { ...config, environment: env };\n\n // Collect adapters with priorities\n const adapters: { adapter: ObservabilityAdapter; priority: number; failover?: boolean }[] = [];\n\n // Always add LoggerAdapter as failover for console output\n const loggerAdapter = new LoggerAdapter();\n await loggerAdapter.initialize({\n enabled: config.enabled !== false,\n serviceName: config.serviceName,\n environment: env,\n defaultTags: config.defaultTags,\n });\n adapters.push({ adapter: loggerAdapter, priority: -100, failover: true });\n\n // TODO: Add DatadogAdapter when configured (high priority, primary)\n // if (config.provider === 'datadog' || config.datadog) {\n // const datadogAdapter = new DatadogAdapter();\n // await datadogAdapter.initialize({\n // ...config,\n // ...config.datadog,\n // environment: env,\n // });\n // adapters.push({ adapter: datadogAdapter, priority: 100, failover: false });\n // }\n\n // Create ObservabilityService with all adapters\n const observability = new ObservabilityService();\n await observability.initialize({\n mode: config.mode ?? 'parallel',\n adapters,\n enabled: config.enabled,\n serviceName: config.serviceName,\n environment: env,\n defaultTags: config.defaultTags,\n samplingRate: config.samplingRate,\n flushInterval: config.flushInterval,\n adapterTimeout: config.flushInterval,\n });\n\n Core.log(\n `ObservabilityService initialized with ${adapters.length} adapters (env: ${env})`,\n verbose\n );\n\n Core._coreServices.observability = observability;\n // Set on ServiceRegistry for injection\n ServiceRegistry.setObservabilityInstance(observability);\n }\n\n /**\n * Initialize global error handler\n */\n /** Create and initialize root store (includes error store + all other slices) */\n private static async initializeRootStore(\n config?: CoreErrorHandlerInitConfig,\n verbose?: boolean\n ): Promise<void> {\n const isFrontend = typeof window !== 'undefined';\n\n if (isFrontend) {\n Core.log('Using frontend root store (Zustand)', verbose);\n // Frontend: use the React hook store's vanilla store API\n Core._rootStore = useRootStore as unknown as StoreApi<RootStoreSlice>;\n } else {\n Core.log('Creating backend composite store (in-memory)', verbose);\n const ServerErrorMiddleware = getCoreDependency('ServerErrorMiddleware');\n if (!ServerErrorMiddleware) {\n throw new CorePackageError(\n 'ServerErrorMiddleware not available. Ensure setCoreDependencies() was called in entry-backend.ts',\n ERROR_CODES.CLIENT_INITIALIZATION_FAILED\n );\n }\n\n // Backend: create in-memory error store + feature flag store (NOT Zustand)\n const backendErrorStore = ServerErrorMiddleware.createErrorStore({\n maxErrors: config?.maxErrors ?? DEFAULT_MAX_ERRORS,\n onErrorAdded: config?.onError as ((error: unknown) => void) | undefined,\n });\n\n // Create standalone feature flag store for backend\n const backendFlagStore = createStandaloneFeatureFlagStore();\n\n // Combine error + feature flag stores to match RootStoreSlice interface\n const compositeStore = {\n // Error store methods\n ...backendErrorStore,\n // Feature flag store methods\n ...backendFlagStore,\n };\n\n // Wrap backend composite store to match root store interface (getState() pattern)\n Core._rootStore = {\n getState: () => compositeStore,\n subscribe: () => () => {}, // No-op for backend\n destroy: () => {\n backendErrorStore.reset();\n backendFlagStore.dispose?.();\n },\n } as unknown as StoreApi<RootStoreSlice>;\n }\n }\n\n /** Get error store actions from root store */\n private static getErrorStoreActions(): ErrorStoreActions {\n if (!Core._rootStore) {\n throw new CorePackageError(\n 'Root store not initialized. Call Core.initialize() first.',\n ERROR_CODES.CLIENT_INITIALIZATION_FAILED\n );\n }\n return Core._rootStore.getState().errors;\n }\n\n /** Build global error handler config */\n // eslint-disable-next-line complexity\n private static buildErrorHandlerConfig(\n config?: CoreErrorHandlerInitConfig\n ): Parameters<typeof initializeGlobalErrorHandler>[1] {\n return {\n source: config?.source ?? 'global',\n maxErrors: config?.maxErrors ?? DEFAULT_MAX_ERRORS,\n filter: config?.filter,\n onError: config?.onError,\n logToConsole: config?.logToConsole ?? false,\n };\n }\n\n // eslint-disable-next-line complexity\n private static async initializeErrorHandler(\n config?: CoreErrorHandlerInitConfig,\n verbose?: boolean\n ): Promise<void> {\n if (config?.enabled === false) {\n Core.log('Error handler disabled by configuration', verbose);\n return;\n }\n\n Core._errorConfig = config ?? {};\n Core.log('Initializing global error handler...', verbose);\n\n // Initialize error system (translations, catalogs)\n // This is safe to call multiple times - it checks if already initialized\n initializeErrorSystem({\n defaultLocale: Core._errorConfig.localization?.defaultLocale,\n fallbackLocale: Core._errorConfig.localization?.fallbackLocale,\n additionalCatalogs: Core._errorConfig.localization?.additionalCatalogs,\n replaceBuiltIn: Core._errorConfig.localization?.replaceBuiltIn,\n });\n\n // Initialize root store (contains error store + all slices)\n await Core.initializeRootStore(Core._errorConfig, verbose);\n\n // Wire up CoreEventManager for automatic error event emission\n // This allows errors captured by the global handler to emit events\n setEventEmitter(CoreEventManager.emit.bind(CoreEventManager));\n\n const errorStore = Core.getErrorStoreActions();\n Core._errorHandler = initializeGlobalErrorHandler(\n errorStore,\n Core.buildErrorHandlerConfig(Core._errorConfig)\n );\n\n // Subscribe to SYSTEM.ERROR events from ApiClientService and other sources\n // Core handles updating the appropriate store based on runtime context\n const errorEventCleanup = CoreEventManager.on(\n CORE_EVENTS.SYSTEM.ERROR,\n (event: CoreEvent<CoreSystemErrorPayload>) => {\n if (!Core._rootStore) return;\n\n try {\n const { errors } = event.data;\n if (errors && errors.length > 0) {\n // Update the appropriate store based on runtime\n // Frontend: Zustand store, Backend: In-memory store (both via root store)\n Core._rootStore.getState().errors.addErrors(errors);\n Core.log(`Added ${errors.length} error(s) to store`, verbose);\n }\n } catch (e) {\n Core.logger.error('Failed to handle error event', { error: e });\n }\n }\n );\n\n // Store cleanup function\n Core._eventCleanupFns.push(errorEventCleanup);\n\n Core.log('Global error handler initialized with CoreEventManager integration', verbose);\n\n // Auto-create HTTP error handler based on runtime (unless disabled)\n if (Core._errorConfig.httpHandler !== false) {\n await Core.createHttpErrorHandler(Core._errorConfig, verbose);\n }\n }\n\n /**\n * Create HTTP error handler based on detected runtime.\n * Stores the handler in Core._httpErrorHandler for access via Core.httpErrorHandler\n */\n // eslint-disable-next-line complexity\n private static async createHttpErrorHandler(\n config?: CoreErrorHandlerInitConfig,\n verbose?: boolean\n ): Promise<void> {\n const runtime = Core._coreServices.runtime;\n const isProduction = Core._coreServices.env.NODE_ENV === 'production';\n\n // Skip for browser runtime (no HTTP error handler needed)\n if (runtime === 'browser') {\n Core._httpErrorHandler = null;\n Core.log('Skipping HTTP handler for browser runtime', verbose);\n return;\n }\n\n const ServerErrorMiddleware = getCoreDependency('ServerErrorMiddleware');\n if (!ServerErrorMiddleware) {\n Core.log('Skipping HTTP handler (ServerErrorMiddleware not registered)', verbose);\n return;\n }\n\n // Build common config for all HTTP handlers\n const httpConfig = {\n source: runtime,\n includeStack: config?.includeStack ?? !isProduction,\n logErrors: config?.logger ?? config?.logToConsole ?? true,\n errorHandler: Core._errorHandler ?? undefined,\n };\n\n switch (runtime) {\n case 'express':\n Core._httpErrorHandler = ServerErrorMiddleware.createHttpErrorHandler(httpConfig);\n Core.log('Created Express error handler middleware', verbose);\n break;\n\n case 'nestjs':\n Core._httpErrorHandler = ServerErrorMiddleware.createNestJsExceptionFilter(httpConfig);\n Core.log('Created NestJS exception filter', verbose);\n break;\n\n case 'nextjs':\n // For Next.js, provide both App Router and Pages Router handlers\n Core._httpErrorHandler = {\n /** For App Router: export const GET = withErrorHandler(handler) */\n withErrorHandler: <T>(handler: T, overrideConfig = {}) =>\n ServerErrorMiddleware.withErrorHandler(\n handler as Parameters<typeof ServerErrorMiddleware.withErrorHandler>[0],\n { ...httpConfig, ...overrideConfig }\n ),\n /** For Pages Router: export default createNextApiErrorHandler()(handler) */\n createNextApiErrorHandler: (overrideConfig = {}) =>\n ServerErrorMiddleware.createNextApiErrorHandler({ ...httpConfig, ...overrideConfig }),\n };\n Core.log('Created Next.js error handlers', verbose);\n break;\n\n case 'node':\n case 'bun':\n case 'deno':\n // Generic Node.js handler\n Core._httpErrorHandler = {\n /** Handle error: handleNodeError(error, req, res) */\n handleError: (error: unknown, req: unknown, res: unknown) =>\n ServerErrorMiddleware.handleNodeError(\n error,\n req as Parameters<typeof ServerErrorMiddleware.handleNodeError>[1],\n // eslint-disable-next-line no-magic-numbers -- Type parameter index for handleNodeError\n res as Parameters<typeof ServerErrorMiddleware.handleNodeError>[2],\n httpConfig\n ),\n /** Create middleware for use with native http */\n createMiddleware: () => ServerErrorMiddleware.createHttpErrorHandler(httpConfig),\n };\n Core.log(`Created ${runtime} error handler`, verbose);\n break;\n\n default:\n // For unknown runtimes, provide generic handler\n Core._httpErrorHandler = ServerErrorMiddleware.createHttpErrorHandler(httpConfig);\n Core.log(`Created generic HTTP error handler for ${runtime}`, verbose);\n }\n }\n\n /**\n * Subscribe to CoreEventManager error events\n * Forwards system, entity, API, validation, database, and auth errors to the global error handler.\n *\n * Note: Database errors (DATABASE.ERROR) are only subscribed on backend runtimes since\n * DbService is backend-only (skipDb: true on frontend).\n */\n private static subscribeToErrorEvents(verbose?: boolean): void {\n if (!Core._errorHandler) {\n return;\n }\n\n Core.log('Subscribing to error events...', verbose);\n\n // Subscribe to system errors (universal)\n const cleanupSystemError = CoreEventManager.on(CORE_EVENTS.SYSTEM.ERROR, event => {\n if (Core._errorHandler && event.data?.errors?.length) {\n // Capture each error in the array\n for (const err of event.data.errors) {\n Core._errorHandler.captureError(err, 'system');\n }\n }\n });\n\n // Subscribe to entity errors (universal)\n const cleanupEntityError = CoreEventManager.on(CORE_EVENTS.ENTITY.ERROR, event => {\n if (Core._errorHandler && event.data) {\n Core._errorHandler.captureError(event.data.error, 'entity');\n }\n });\n\n // Subscribe to API errors (universal)\n const cleanupApiError = CoreEventManager.on(CORE_EVENTS.API.REQUEST_ERROR, event => {\n if (Core._errorHandler && event.data) {\n Core._errorHandler.captureError(event.data.error, 'api');\n }\n });\n\n // Subscribe to validation errors (universal)\n const cleanupValidationError = CoreEventManager.on(CORE_EVENTS.VALIDATION.FAILED, event => {\n if (Core._errorHandler && event.data) {\n Core._errorHandler.captureError(event.data.error, 'validation');\n }\n });\n\n // Subscribe to auth errors (universal - can happen on both frontend and backend)\n const cleanupAuthUnauthorized = CoreEventManager.on(CORE_EVENTS.AUTH.UNAUTHORIZED, event => {\n if (Core._errorHandler && event.data?.error) {\n Core._errorHandler.captureError(event.data.error, 'auth');\n }\n });\n\n const cleanupAuthSessionExpired = CoreEventManager.on(\n CORE_EVENTS.AUTH.SESSION_EXPIRED,\n event => {\n if (Core._errorHandler && event.data?.error) {\n Core._errorHandler.captureError(event.data.error, 'auth');\n }\n }\n );\n\n // Store universal cleanup functions\n Core._eventCleanupFns.push(\n cleanupSystemError,\n cleanupEntityError,\n cleanupApiError,\n cleanupValidationError,\n cleanupAuthUnauthorized,\n cleanupAuthSessionExpired\n );\n\n // Subscribe to database errors (backend-only)\n // Database events only fire when DbService is initialized (skipDb: false)\n if (Core.isRuntimeCompatible('backend')) {\n const cleanupDatabaseError = CoreEventManager.on(CORE_EVENTS.DATABASE.ERROR, event => {\n if (Core._errorHandler && event.data) {\n Core._errorHandler.captureError(event.data.error, 'database');\n }\n });\n Core._eventCleanupFns.push(cleanupDatabaseError);\n\n // Subscribe to storage errors (backend-only)\n const cleanupStorageError = CoreEventManager.on(CORE_EVENTS.STORAGE.ERROR, event => {\n if (Core._errorHandler && event.data) {\n Core._errorHandler.captureError(event.data.error, 'storage');\n }\n });\n Core._eventCleanupFns.push(cleanupStorageError);\n\n // Subscribe to notification errors (backend-only)\n const cleanupNotificationError = CoreEventManager.on(\n CORE_EVENTS.NOTIFICATION.ERROR,\n event => {\n if (Core._errorHandler && event.data) {\n Core._errorHandler.captureError(event.data.error, 'notification');\n }\n }\n );\n Core._eventCleanupFns.push(cleanupNotificationError);\n\n Core.log('Subscribed to backend error events (database, storage, notification)', verbose);\n }\n\n const eventTypes = ['system', 'entity', 'api', 'validation', 'auth'];\n if (Core.isRuntimeCompatible('backend')) {\n eventTypes.push('database', 'storage', 'notification');\n }\n Core.log(`Subscribed to error events: ${eventTypes.join(', ')}`, verbose);\n }\n\n /** Handle fetch flags error and return empty flags */\n private static handleFetchFlagsError(\n error: unknown,\n config?: CoreFeatureFlagInitConfig,\n verbose?: boolean\n ): Record<string, FeatureFlagValue> {\n if (verbose) Core.logger.error('Failed to fetch feature flags', { error });\n\n // If already a package error, use as-is; otherwise wrap it\n const packageError =\n error instanceof BaseError\n ? (error as CorePackageError)\n : new CorePackageError(\n error instanceof Error ? error.message : String(error),\n ERROR_CODES.CORE_FEATURE_FLAG_PROVIDER_ERROR,\n { cause: error instanceof Error ? error : undefined }\n );\n config?.onError?.(packageError);\n return {};\n }\n\n /** Create fetch flags function */\n private static createFetchFlagsFn(\n config?: CoreFeatureFlagInitConfig,\n verbose?: boolean\n ): () => Promise<Record<string, FeatureFlagValue>> {\n // eslint-disable-next-line complexity\n return async () => {\n try {\n const client = ApiClientService.getClient();\n const endpoint = config?.apiEndpoint ?? '/feature-flags';\n const response = await client.get<{ flags: Record<string, FeatureFlagValue> }>(endpoint);\n\n if (!response.isSuccess) {\n throw new CorePackageError(\n response.error?.message ?? 'Failed to fetch feature flags',\n ERROR_CODES.CORE_FEATURE_FLAG_PROVIDER_ERROR\n );\n }\n\n return response.data?.flags ?? {};\n } catch (error) {\n return Core.handleFetchFlagsError(error, config, verbose);\n }\n };\n }\n\n /**\n * Initialize feature flags slice within root store\n */\n\n private static async initializeFeatureFlags(\n config?: CoreFeatureFlagInitConfig,\n verbose?: boolean\n ): Promise<void> {\n if (config?.enabled === false) {\n Core.log('Feature flags disabled by configuration', verbose);\n return;\n }\n\n if (!Core._rootStore) {\n throw new CorePackageError(\n 'Root store not initialized. Call Core.initializeErrorHandler() first.',\n ERROR_CODES.CLIENT_INITIALIZATION_FAILED\n );\n }\n\n Core._flagConfig = config ?? {};\n Core.log('Initializing feature flags from root store...', verbose);\n\n // Initialize the feature flag slice within the root store\n const state = Core._rootStore.getState();\n await state.featureFlags.initialize({\n defaults: Core._flagConfig.defaults,\n polling: Core._flagConfig.polling,\n fetchFn: Core.createFetchFlagsFn(Core._flagConfig, verbose),\n onFlagChange: Core._flagConfig.onFlagChange,\n onError: Core._flagConfig.onError,\n });\n\n Core.log('Feature flags initialized', verbose);\n }\n}\n\n// Export for convenience (excluding server-only services - use backend entry for those)\n// Note: CacheService and DEFAULT_ENCRYPTION_FIELDS are only exported from entry-backend.ts\nexport { ApiClientService };\n","/**\n * Base Domain Service\n *\n * Abstract base class for all domain services in @plyaz/core.\n * Follows the same pattern as BaseAdapter in @plyaz/notifications.\n *\n * Provides:\n * - API client initialization via constructor config\n * - Automatic mapper/validator instantiation\n * - Service enabled/disabled state management\n * - Default values handling\n * - Runtime context detection\n * - Lazy logger initialization\n *\n * Subclasses must implement:\n * - isAvailable() - Check if service is configured and ready\n * - dispose() - Cleanup resources\n *\n * @example\n * ```typescript\n * interface MyServiceConfig extends BaseDomainServiceConfig {\n * apiBasePath?: string;\n * }\n *\n * class MyDomainService extends BaseDomainService<\n * MyServiceConfig,\n * MyMapper,\n * MyValidator\n * > {\n * constructor(config: MyServiceConfig) {\n * super({\n * serviceName: 'MyDomainService',\n * supportedRuntimes: ['universal'],\n * serviceConfig: config,\n * apiClientConfig: {\n * baseURL: config.apiBasePath ?? '/api',\n * },\n * MapperClass: MyMapperClass,\n * ValidatorClass: MyValidatorClass,\n * });\n * }\n *\n * isAvailable(): boolean {\n * return this.config.enabled !== false;\n * }\n *\n * dispose(): void {\n * // Cleanup\n * }\n *\n * async create(data: unknown): Promise<MyEntity> {\n * this.assertReady();\n * const validated = this.validator.validateCreateOrThrow(data);\n * const dto = this.mapper.toCreateDTO(validated);\n * const response = await this.apiClient.post('/entities', dto);\n * return this.mapper.toDomain(response.data);\n * }\n * }\n *\n * // Usage\n * const service = new MyDomainService({ enabled: true, apiBasePath: '/api/v1' });\n * await service.ensureApiClientInitialized();\n * const entity = await service.create({ name: 'Test' });\n * ```\n */\n\nimport { PackageLogger } from '@plyaz/logger';\nimport { CorePackageError } from '@plyaz/errors';\nimport { ERROR_CODES } from '@plyaz/types/errors';\nimport type {\n CoreBaseMapperInstance,\n CoreBaseValidatorInstance,\n CoreServiceRuntime,\n} from '@plyaz/types/core';\nimport type { FeatureFlagValue } from '@plyaz/types/features';\nimport type { ApiClientOptions } from '@plyaz/types/api';\nimport { createApiClient, setDefaultApiClient } from '@plyaz/api/frontend';\n// Import types we need locally\nimport type {\n CoreBaseDomainServiceConfig,\n CoreMapperClass,\n CoreValidatorClass,\n CoreBaseServiceConfig,\n CoreCacheManagerInstance,\n} from '@plyaz/types/core';\nimport type { DatabaseServiceInterface } from '@plyaz/types/db';\nimport type { ObservabilityAdapter, Span } from '@plyaz/types/observability';\n\n// ─────────────────────────────────────────────────────────────────────────────\n// Types\n// ─────────────────────────────────────────────────────────────────────────────\n\n/**\n * API client type (from @plyaz/api)\n */\nexport type ApiClient = Awaited<ReturnType<typeof createApiClient>>;\n\n// ─────────────────────────────────────────────────────────────────────────────\n// Abstract Base Class\n// ─────────────────────────────────────────────────────────────────────────────\n\n/**\n * Abstract base class for domain services\n *\n * Uses generics for strong typing:\n * - TConfig: Service configuration type\n * - TMapper: Mapper instance type\n * - TValidator: Validator instance type\n *\n * Subclasses use the super({...}) pattern:\n * ```typescript\n * class MyService extends BaseDomainService<MyConfig, MyMapper, MyValidator> {\n * constructor(config: MyConfig) {\n * super({\n * serviceName: 'MyService',\n * supportedRuntimes: ['universal'],\n * serviceConfig: config,\n * apiClientConfig: { baseURL: '/api' },\n * MapperClass: MyMapperClass,\n * ValidatorClass: MyValidatorClass,\n * });\n * }\n * }\n * ```\n */\nexport abstract class BaseDomainService<\n TConfig extends CoreBaseDomainServiceConfig = CoreBaseDomainServiceConfig,\n TMapper extends CoreBaseMapperInstance<unknown, unknown> = CoreBaseMapperInstance<\n unknown,\n unknown\n >,\n TValidator extends CoreBaseValidatorInstance = CoreBaseValidatorInstance,\n> {\n // ─────────────────────────────────────────────────────────────────────────\n // Instance Properties\n // ─────────────────────────────────────────────────────────────────────────\n\n /** Service name for logging and error messages */\n readonly serviceName: string;\n\n /** Supported runtimes for this service */\n readonly supportedRuntimes: readonly CoreServiceRuntime[];\n\n /** Service configuration */\n protected readonly config: TConfig;\n\n /** Logger instance */\n protected readonly logger: PackageLogger;\n\n /** Initialization state */\n protected _initialized: boolean = false;\n\n // API Client (optional)\n private _apiClient: ApiClient | null = null;\n private _clientInitPromise: Promise<void> | null = null;\n private readonly _apiClientConfig?: ApiClientOptions;\n private readonly _setAsDefaultClient: boolean;\n\n // Injected Services (cache, db, api, observability)\n protected readonly cacheManager?: CoreCacheManagerInstance;\n protected readonly dbService?: DatabaseServiceInterface;\n protected readonly apiService?: ApiClient; // Injected ApiClient (different from _apiClient)\n protected readonly observabilityService?: ObservabilityAdapter;\n\n /**\n * Cache prefix for namespacing cache keys (e.g., 'example', 'user', 'product').\n * Subclasses can override by defining as a property.\n * If not overridden, defaults to serviceName.toLowerCase().\n *\n * @example\n * ```typescript\n * protected cachePrefix = 'my-service'; // Override default\n * ```\n */\n protected cachePrefix: string = '';\n\n // Mapper and Validator instances (lazy)\n private _mapperInstance: TMapper | null = null;\n private _validatorInstance: TValidator | null = null;\n private readonly _MapperClass?: CoreMapperClass<TMapper>;\n private readonly _ValidatorClass?: CoreValidatorClass<TValidator>;\n\n // ─────────────────────────────────────────────────────────────────────────\n // Constructor\n // ─────────────────────────────────────────────────────────────────────────\n\n /**\n * Create a new domain service instance\n *\n * @param config - Base service configuration (passed via super({...}))\n */\n // eslint-disable-next-line complexity\n constructor(config: CoreBaseServiceConfig<TConfig, TMapper, TValidator>) {\n this.serviceName = config.serviceName;\n this.supportedRuntimes = config.supportedRuntimes;\n this.config = config.serviceConfig;\n this._setAsDefaultClient = config.setAsDefaultClient ?? false;\n\n // Initialize logger\n this.logger = new PackageLogger({\n packageName: 'core',\n service: this.serviceName,\n });\n\n // Store API client config for lazy initialization\n this._apiClientConfig = config.apiClientConfig;\n\n // Store injected services (cache, db, api, observability)\n // Cast from unknown (types package uses unknown to avoid circular deps)\n this.cacheManager = config.injected?.cache as CoreCacheManagerInstance | undefined;\n this.dbService = config.injected?.db as DatabaseServiceInterface | undefined;\n this.apiService = config.injected?.api as ApiClient | undefined;\n // observabilityOverride takes precedence over injected observability\n this.observabilityService = (config.serviceConfig.observabilityOverride ??\n config.injected?.observability) as ObservabilityAdapter | undefined;\n\n // Initialize cache prefix to serviceName if not set by subclass\n // Subclasses can override by setting in their constructor after super()\n if (!this.cachePrefix) {\n this.cachePrefix = this.serviceName.toLowerCase();\n }\n\n // Store mapper/validator classes for lazy initialization\n this._MapperClass = config.mapperClass;\n this._ValidatorClass = config.validatorClass;\n\n // Initialize API client if config provided\n if (this._apiClientConfig) {\n this.initializeApiClient();\n }\n\n this.logger.debug(`${this.serviceName} created`, {\n supportedRuntimes: this.supportedRuntimes,\n hasApiClient: !!this._apiClientConfig,\n injected: {\n cache: !!this.cacheManager,\n db: !!this.dbService,\n api: !!this.apiService,\n observability: !!this.observabilityService,\n },\n cachePrefix: this.cachePrefix,\n hasMapper: !!this._MapperClass,\n hasValidator: !!this._ValidatorClass,\n });\n }\n\n // ─────────────────────────────────────────────────────────────────────────\n // Getters\n // ─────────────────────────────────────────────────────────────────────────\n\n /**\n * Check if the service is enabled\n * Service is enabled by default unless explicitly disabled\n */\n get isServiceEnabled(): boolean {\n return this.config?.enabled !== false;\n }\n\n /**\n * Check if the service is initialized (API client ready)\n */\n get isInitialized(): boolean {\n return this._initialized;\n }\n\n /**\n * Check if mapper is available\n */\n get hasMapper(): boolean {\n return !!this._MapperClass;\n }\n\n /**\n * Check if validator is available\n */\n get hasValidator(): boolean {\n return !!this._ValidatorClass;\n }\n\n /**\n * Get the mapper instance (lazy initialization)\n * @throws CorePackageError if MapperClass was not provided\n */\n get mapper(): TMapper {\n if (!this._mapperInstance && this._MapperClass) {\n this._mapperInstance = new this._MapperClass();\n }\n if (!this._mapperInstance) {\n throw new CorePackageError(\n `${this.serviceName} does not have a Mapper configured`,\n ERROR_CODES.FEATURE_NOT_SUPPORTED\n );\n }\n return this._mapperInstance;\n }\n\n /**\n * Set the mapper instance\n * Allows subclasses to override mapper initialization\n */\n set mapper(value: TMapper) {\n this._mapperInstance = value;\n }\n\n /**\n * Get the validator instance (lazy initialization)\n * @throws CorePackageError if ValidatorClass was not provided\n */\n get validator(): TValidator {\n if (!this._validatorInstance && this._ValidatorClass) {\n this._validatorInstance = new this._ValidatorClass();\n }\n if (!this._validatorInstance) {\n throw new CorePackageError(\n `${this.serviceName} does not have a Validator configured`,\n ERROR_CODES.FEATURE_NOT_SUPPORTED\n );\n }\n return this._validatorInstance;\n }\n\n /**\n * Set the validator instance\n * Allows subclasses to override validator initialization\n */\n set validator(value: TValidator) {\n this._validatorInstance = value;\n }\n\n /**\n * Get the API client (after initialization)\n * @throws CorePackageError if API client was not configured or not initialized\n */\n get apiClient(): ApiClient {\n if (!this._apiClient) {\n throw new CorePackageError(\n `${this.serviceName} API client not initialized. Call ensureApiClientInitialized() first.`,\n ERROR_CODES.CLIENT_INITIALIZATION_FAILED\n );\n }\n return this._apiClient;\n }\n\n /**\n * Get the observability adapter (if injected)\n * Returns undefined if observability is not enabled\n */\n get observability(): ObservabilityAdapter | undefined {\n return this.observabilityService;\n }\n\n /**\n * Check if observability is available\n */\n get hasObservability(): boolean {\n return !!this.observabilityService;\n }\n\n // ─────────────────────────────────────────────────────────────────────────\n // API Client Initialization\n // ─────────────────────────────────────────────────────────────────────────\n\n /**\n * Initialize API client asynchronously\n * Called from constructor if apiClientConfig is provided\n */\n private initializeApiClient(): void {\n if (this._clientInitPromise || !this._apiClientConfig) {\n return;\n }\n\n this._clientInitPromise = (async () => {\n try {\n this._apiClient = await createApiClient(this._apiClientConfig!);\n\n // Set as default client for all fetchers if configured\n if (this._setAsDefaultClient) {\n setDefaultApiClient(this._apiClient);\n }\n\n this._initialized = true;\n\n this.logger.debug('API client initialized', {\n service: this.serviceName,\n baseURL: this._apiClientConfig!.baseURL,\n });\n } catch (error) {\n this.logger.error('Failed to initialize API client', {\n service: this.serviceName,\n error: error instanceof Error ? error.message : String(error),\n });\n throw error;\n }\n })();\n }\n\n /**\n * Ensure API client is initialized before use.\n * Call this from methods that need the API client.\n * Also called by ServiceRegistry.create() for services with async initialization.\n */\n async ensureApiClientInitialized(): Promise<void> {\n if (this._clientInitPromise) {\n await this._clientInitPromise;\n }\n if (this._apiClientConfig && !this._apiClient) {\n throw new CorePackageError(\n `${this.serviceName} API client not initialized`,\n ERROR_CODES.CLIENT_INITIALIZATION_FAILED\n );\n }\n }\n\n // ─────────────────────────────────────────────────────────────────────────\n // Configuration Management\n // ─────────────────────────────────────────────────────────────────────────\n\n /**\n * Get current configuration (immutable copy)\n */\n getConfig(): Readonly<TConfig> {\n return { ...this.config };\n }\n\n /**\n * Get a default value\n * @param key - The key to get the default for\n */\n getDefault<T = FeatureFlagValue>(key: string): T | undefined {\n return this.config?.defaults?.[key] as T | undefined;\n }\n\n /**\n * Set a default value (mutates config.defaults)\n * @param key - The key to set the default for\n * @param value - The default value\n */\n setDefault(key: string, value: FeatureFlagValue): void {\n if (!this.config.defaults) {\n (this.config as CoreBaseDomainServiceConfig).defaults = {};\n }\n this.config.defaults![key] = value;\n }\n\n /**\n * Set multiple default values\n * @param defaults - Record of default values\n */\n setDefaults(defaults: Record<string, FeatureFlagValue>): void {\n if (!this.config.defaults) {\n (this.config as CoreBaseDomainServiceConfig).defaults = {};\n }\n Object.assign(this.config.defaults!, defaults);\n }\n\n // ─────────────────────────────────────────────────────────────────────────\n // Assertions\n // ─────────────────────────────────────────────────────────────────────────\n\n /**\n * Assert that the service is available (configured and ready)\n * @throws CorePackageError if not available\n */\n protected assertAvailable(): void {\n if (!this.isAvailable()) {\n throw new CorePackageError(\n `${this.serviceName} is not available. Check configuration.`,\n ERROR_CODES.CLIENT_INITIALIZATION_FAILED\n );\n }\n }\n\n /**\n * Assert that the service is enabled\n * @throws CorePackageError if disabled\n */\n protected assertEnabled(): void {\n if (!this.isServiceEnabled) {\n throw new CorePackageError(\n `${this.serviceName} is disabled. Set enabled: true in configuration.`,\n ERROR_CODES.FEATURE_NOT_SUPPORTED\n );\n }\n }\n\n /**\n * Assert that the service is ready (enabled AND available)\n * @throws CorePackageError if not ready\n */\n protected assertReady(): void {\n this.assertEnabled();\n this.assertAvailable();\n }\n\n // ─────────────────────────────────────────────────────────────────────────\n // Abstract Methods - Must be implemented by subclasses\n // ─────────────────────────────────────────────────────────────────────────\n\n /**\n * Check if service is available (configured and ready)\n * Subclasses must implement this to check credentials, config, etc.\n *\n * @returns true if available\n */\n abstract isAvailable(): boolean;\n\n /**\n * Dispose/cleanup the service\n * Subclasses must implement to release resources\n */\n abstract dispose(): void;\n\n // ─────────────────────────────────────────────────────────────────────────\n // Helper Methods\n // ─────────────────────────────────────────────────────────────────────────\n\n /**\n * Log debug message with service context\n */\n protected logDebug(message: string, data?: Record<string, unknown>): void {\n this.logger.debug(message, {\n service: this.serviceName,\n ...data,\n });\n }\n\n /**\n * Log info message with service context\n */\n protected logInfo(message: string, data?: Record<string, unknown>): void {\n this.logger.info(message, {\n service: this.serviceName,\n ...data,\n });\n }\n\n /**\n * Log warning message with service context\n */\n protected logWarn(message: string, data?: Record<string, unknown>): void {\n this.logger.warn(message, {\n service: this.serviceName,\n ...data,\n });\n }\n\n /**\n * Log error message with service context\n */\n protected logError(message: string, data?: Record<string, unknown>): void {\n this.logger.error(message, {\n service: this.serviceName,\n ...data,\n });\n }\n\n // ─────────────────────────────────────────────────────────────────────────\n // Observability Helpers\n // ─────────────────────────────────────────────────────────────────────────\n\n /**\n * Record a metric (no-op if observability not available)\n */\n protected async recordMetric(\n name: string,\n value: number,\n tags?: Record<string, string>\n ): Promise<void> {\n if (!this.observabilityService) return;\n await this.observabilityService.recordHistogram(name, value, {\n service: this.serviceName,\n ...tags,\n });\n }\n\n /**\n * Increment a counter (no-op if observability not available)\n */\n protected async incrementCounter(\n name: string,\n value = 1,\n tags?: Record<string, string>\n ): Promise<void> {\n if (!this.observabilityService) return;\n await this.observabilityService.incrementCounter(name, value, {\n service: this.serviceName,\n ...tags,\n });\n }\n\n /**\n * Start a span for tracing (returns noop span if observability not available)\n */\n protected startSpan(name: string, attributes?: Record<string, string | number | boolean>): Span {\n if (!this.observabilityService) {\n // Return a noop span\n return {\n context: { traceId: '', spanId: '' },\n setAttribute: () => {},\n setAttributes: () => {},\n addEvent: () => {},\n setStatus: () => {},\n end: () => {},\n recordException: () => {},\n };\n }\n return this.observabilityService.startSpan({\n name,\n attributes: {\n 'service.name': this.serviceName,\n ...attributes,\n },\n });\n }\n\n /**\n * Execute a function within a traced span\n */\n protected async withSpan<T>(\n name: string,\n fn: (span: Span) => Promise<T>,\n attributes?: Record<string, string | number | boolean>\n ): Promise<T> {\n if (!this.observabilityService) {\n // Execute without tracing\n const noopSpan = this.startSpan(name);\n return fn(noopSpan);\n }\n return this.observabilityService.withSpan(\n {\n name,\n attributes: {\n 'service.name': this.serviceName,\n ...attributes,\n },\n },\n fn\n );\n }\n}\n","/**\n * Base Frontend Domain Service\n *\n * Extends BaseDomainService with common frontend patterns:\n * - **Primary/Read Store Pattern**: Services have ONE primary store (mutate) + multiple read stores (read-only)\n * - **Automatic Store Injection**: Stores injected by ServiceRegistry from root store\n * - **Automatic Loading State**: Managed via setStoresLoading() on primary store\n * - **Generic CRUD Operations**: With fetchers from @plyaz/api\n * - **Event Emission**: Typed event payloads via CoreEventManager\n * - **Automatic DTO Mapping**: Via mapper classes\n *\n * ## Store Architecture (NEW)\n *\n * ### Primary Store (Mutate)\n * - Service has ONE primary store defined by `store: 'campaigns'` config\n * - Can call: setData(), updateData(), setLoading()\n * - syncToStores() syncs ONLY to primary store\n * - Access via: this.primaryStore\n *\n * ### Read Stores (Read-Only)\n * - Service can read from multiple stores: `readStores: ['users', 'error', 'featureFlags']`\n * - Can read state but should NOT call mutation methods\n * - Used for cross-domain data access (e.g., campaign service reading user data)\n * - Access via: this.getReadStore('users')\n *\n * ### All Stores from Root Store\n * - All stores (domain + global) are slices of ONE root Zustand store\n * - Automatically reactive - changes propagate to subscribers (React components)\n * - Error/featureFlags are built-in, domain stores added dynamically\n *\n * Frontend domain services should extend this class instead of BaseDomainService\n * to get automatic store integration and CRUD capabilities.\n *\n * All generic type parameters for full type safety:\n * - TConfig: Service configuration type\n * - TStore: Store interface type\n * - TData: Data type for store sync\n * - TEntity: Domain entity type\n * - TResponseDTO: API response DTO type (snake_case)\n * - TCreateDTO: Create request DTO type\n * - TPatchDTO: Patch request DTO type (partial update)\n * - TQueryDTO: Query/filter DTO type for fetchAll\n * - TStoreState: Serializable store state type\n * - TMapper: Mapper instance type\n * - TValidator: Optional validator type\n *\n * @example\n * ```typescript\n * class MyFrontendService extends BaseFrontendDomainService<\n * MyConfig,\n * MyStore,\n * MyStoreData,\n * MyEntity,\n * MyResponseDTO,\n * CreateMyDTO,\n * PatchMyDTO,\n * QueryMyDTO,\n * MyStoreState,\n * MyMapper\n * > {\n * protected eventPrefix = 'myDomain';\n * protected mapper: MyMapper;\n *\n * constructor(config: MyConfig) {\n * super({ ... mapperClass: MyMapperClass });\n * this.mapper = new MyMapperClass();\n * }\n *\n * // All CRUD methods inherited!\n * // - fetchAll(query?)\n * // - fetchById(id)\n * // - create(data)\n * // - update(id, data)\n * // - delete(id)\n * }\n * ```\n */\n\nimport { BaseDomainService } from './BaseDomainService';\nimport { STORE_KEYS } from '@plyaz/store';\nimport { CoreEventManager } from '../../events/CoreEventManager';\nimport { BaseError, CorePackageError } from '@plyaz/errors';\nimport { ERROR_CODES } from '@plyaz/types/errors';\nimport { OBSERVABILITY_METRICS } from '@plyaz/types/observability';\nimport { Core } from '../../init/CoreInitializer';\nimport type { RootStoreSlice } from '@plyaz/types/store';\nimport type {\n CoreEntityCreatingPayload,\n CoreEntityCreatedPayload,\n CoreEntityPatchingPayload,\n CoreEntityPatchedPayload,\n CoreEntityDeletingPayload,\n CoreEntityDeletedPayload,\n CoreEntityErrorPayload,\n CoreEntityCompletePayload,\n} from '@plyaz/types/core';\n\n// Re-export types\nexport type {\n CoreBaseFrontendStore,\n CoreBaseFrontendServiceConfig,\n CoreBaseFrontendServiceConstructorConfig,\n CoreStoreHandlers,\n} from '@plyaz/types/core';\n\n// Import types for local use\nimport type {\n CoreBaseFrontendStore,\n CoreBaseFrontendServiceConfig,\n CoreBaseFrontendServiceConstructorConfig,\n CoreBaseMapperInstance,\n CoreBaseValidatorInstance,\n CoreStoreHandlers,\n CoreOptimisticUpdateConfig,\n} from '@plyaz/types/core';\n\n// ─────────────────────────────────────────────────────────────────────────────\n// Base Event Payload Type\n// ─────────────────────────────────────────────────────────────────────────────\n\n/**\n * Base type for frontend event payloads\n * All frontend event payloads should extend this\n */\ntype BaseFrontendEventPayload =\n | CoreEntityCreatingPayload<unknown>\n | CoreEntityCreatedPayload<unknown, unknown>\n | CoreEntityPatchingPayload<unknown>\n | CoreEntityPatchedPayload<unknown, unknown>\n | CoreEntityDeletingPayload\n | CoreEntityDeletedPayload\n | CoreEntityErrorPayload\n | CoreEntityCompletePayload\n | Record<string, unknown>;\n\n// ─────────────────────────────────────────────────────────────────────────────\n// Abstract Base Class\n// ─────────────────────────────────────────────────────────────────────────────\n\n/**\n * Abstract base class for frontend domain services with store integration and CRUD operations.\n *\n * Extends BaseDomainService with:\n * - Multi-store connection management\n * - Automatic sync to connected stores\n * - Loading/error state propagation\n * - Generic CRUD operations (fetchAll, fetchById, create, update, delete)\n * - Event emission with typed payloads\n * - Automatic DTO mapping via mapper\n *\n * @typeParam TConfig - Service configuration type\n * @typeParam TStore - Store interface type\n * @typeParam TData - Data type for store sync\n * @typeParam TEntity - Domain entity type\n * @typeParam TResponseDTO - API response DTO type\n * @typeParam TCreateDTO - Create request DTO type\n * @typeParam TPatchDTO - Patch request DTO type\n * @typeParam TQueryDTO - Query/filter DTO type for fetchAll (default: unknown)\n * @typeParam TStoreState - Serializable store state type\n * @typeParam TMapper - Mapper instance type\n * @typeParam TValidator - Optional validator type\n * @typeParam TDeleteResult - Delete operation result type (default: void for backwards compatibility)\n */\nexport abstract class BaseFrontendDomainService<\n TConfig extends CoreBaseFrontendServiceConfig<TData, TStore>,\n TStore extends CoreBaseFrontendStore<TData>,\n TData = Record<string, unknown>,\n TEntity = unknown,\n TResponseDTO = unknown,\n TCreateDTO = unknown,\n TPatchDTO extends Partial<unknown> = Partial<TCreateDTO>,\n TQueryDTO = unknown,\n TStoreState = TEntity,\n TMapper extends CoreBaseMapperInstance<\n TEntity,\n TResponseDTO,\n TCreateDTO,\n TCreateDTO,\n TPatchDTO,\n unknown,\n TStoreState\n > = CoreBaseMapperInstance<\n TEntity,\n TResponseDTO,\n TCreateDTO,\n TCreateDTO,\n TPatchDTO,\n unknown,\n TStoreState\n >,\n TValidator extends CoreBaseValidatorInstance = CoreBaseValidatorInstance,\n TDeleteResult = void,\n> extends BaseDomainService<TConfig, TMapper, TValidator> {\n // ─────────────────────────────────────────────────────────────────────────\n // Required Properties (Subclasses must provide)\n // ─────────────────────────────────────────────────────────────────────────\n\n /**\n * Event prefix for all events emitted by this service\n * E.g., 'example' → emits 'example:creating', 'example:created', etc.\n *\n * Required by subclasses\n */\n protected abstract eventPrefix: string;\n\n // ─────────────────────────────────────────────────────────────────────────\n // Store Properties\n // ─────────────────────────────────────────────────────────────────────────\n\n /** Primary store - the main store this service can mutate */\n private _primaryStore: TStore | null = null;\n\n /**\n * Primary store key - override in subclass to set default\n * @example protected primaryStoreKey = STORE_KEYS.EXAMPLE;\n */\n protected primaryStoreKey?: string;\n\n /** Read-only stores - can read but not mutate */\n private readonly _readStores = new Map<string, unknown>();\n\n /**\n * Read-only store keys - always includes error and featureFlags by default\n * Override in subclass to add additional read stores\n * @example protected readStoreKeys = [...super.readStoreKeys, STORE_KEYS.CAMPAIGNS];\n */\n protected readStoreKeys: string[] = [STORE_KEYS.ERROR, STORE_KEYS.FEATURE_FLAGS];\n\n /** Store handlers for custom store synchronization */\n protected readonly storeHandlers?: CoreStoreHandlers<TData, TStore>;\n\n // ─────────────────────────────────────────────────────────────────────────\n // Optimistic Update Properties\n // ─────────────────────────────────────────────────────────────────────────\n\n /** Optimistic update configuration */\n protected readonly optimisticConfig?: CoreOptimisticUpdateConfig;\n\n /** Stack of previous states for rollback (LIFO) */\n private readonly _rollbackStack: Array<{\n operation: string;\n previousState: TData | null;\n timestamp: number;\n }> = [];\n\n /** Maximum rollback stack size */\n private readonly _maxRollbackStackSize = 10;\n\n // ─────────────────────────────────────────────────────────────────────────\n // Constructor\n // ─────────────────────────────────────────────────────────────────────────\n\n // eslint-disable-next-line complexity\n constructor(\n config: CoreBaseFrontendServiceConstructorConfig<TConfig, TStore, TData, TMapper, TValidator>\n ) {\n super(config);\n\n this.storeHandlers = config.serviceConfig.storeHandlers;\n this.optimisticConfig = config.serviceConfig.optimisticUpdates;\n\n // Initialize mapper if class provided\n if (config.mapperClass) {\n this.mapper = new config.mapperClass() as TMapper;\n }\n\n const serviceConfig = config.serviceConfig;\n\n // New pattern: store (primary) + readStores (read-only)\n // Use config if provided, otherwise use class property defaults\n if (serviceConfig.store !== undefined) {\n this.primaryStoreKey = serviceConfig.store;\n }\n if (serviceConfig.readStores !== undefined) {\n // Merge config readStores with base defaults (error, featureFlags)\n // Use Set to avoid duplicates\n this.readStoreKeys = Array.from(\n new Set([\n ...this.readStoreKeys, // Base defaults: error, featureFlags\n ...serviceConfig.readStores, // Additional from config\n ])\n );\n }\n\n // Get injected stores from ServiceRegistry\n const injectedStores = config.injected?.stores;\n\n // Connect primary store (can mutate)\n if (this.primaryStoreKey) {\n const primaryStore = injectedStores?.[this.primaryStoreKey] as TStore;\n if (primaryStore) {\n this._primaryStore = primaryStore;\n this.logDebug(`Connected primary store: '${this.primaryStoreKey}'`);\n } else {\n // Warn instead of throw - store integration is optional for services\n // Services can still work without stores, they just can't use store mutations\n this.logWarn(\n `Primary store '${this.primaryStoreKey}' not found. ` +\n `Store mutations (setData/updateData/setLoading) will be disabled. ` +\n `Configure stores in PlyazProvider to enable store integration.`\n );\n }\n }\n\n // Connect read-only stores (can only read)\n for (const key of this.readStoreKeys) {\n const readStore = injectedStores?.[key];\n if (readStore) {\n this._readStores.set(key, readStore);\n this.logDebug(`Connected read-only store: '${key}'`);\n } else {\n this.logDebug(`Read-only store '${key}' not found in injected stores`);\n }\n }\n\n // Log warning if no primary store configured\n if (!this.primaryStoreKey) {\n this.logWarn(\n `No primary store configured. ` +\n `Set 'store' in config to enable store mutations (setData/updateData/setLoading).`\n );\n }\n\n this.logDebug('Frontend service initialized', {\n primaryStore: this.primaryStoreKey,\n readStores: this.readStoreKeys,\n });\n }\n\n // ─────────────────────────────────────────────────────────────────────────\n // Store Management (Public API)\n // ─────────────────────────────────────────────────────────────────────────\n\n /**\n * Get the number of connected stores (primary + read stores).\n */\n get connectedStoreCount(): number {\n return (this._primaryStore ? 1 : 0) + this._readStores.size;\n }\n\n /**\n * Check if any stores are connected (primary or read).\n */\n get hasConnectedStores(): boolean {\n return !!this._primaryStore || this._readStores.size > 0;\n }\n\n /**\n * Get primary store (protected).\n * This is the store the service can mutate.\n */\n protected get primaryStore(): TStore | null {\n return this._primaryStore;\n }\n\n /**\n * Get a read-only store by key (protected).\n * Can read state but should not call mutation methods.\n *\n * @param key - Store key (type-safe)\n * @returns Store slice or undefined (auto-typed based on key)\n */\n protected getReadStore<K extends keyof RootStoreSlice>(key: K): RootStoreSlice[K] | undefined {\n return this._readStores.get(key) as RootStoreSlice[K] | undefined;\n }\n\n /**\n * Get a specific store slice by key (protected).\n *\n * **Namespaced Root Store Architecture:**\n * - All stores are slices merged into ONE Zustand root store\n * - Each slice is namespaced (e.g., store.example, store.errors)\n * - This returns the SPECIFIC slice for the given key\n * - Type-safe: only valid store keys allowed\n *\n * **Usage Guidelines:**\n * - Can mutate stores that are NOT in readStoreKeys\n * - Should NOT mutate stores in readStoreKeys (errors, featureFlags by default)\n * - Useful for cross-domain updates (e.g., campaign service updating user stats)\n *\n * @param key - Store key (type-safe: 'example' | 'errors' | 'featureFlags')\n * @returns Specific store slice (fully typed based on key)\n *\n * @example\n * ```typescript\n * // In CampaignService\n * protected async afterCreate(id: string, campaign: Campaign) {\n * // Update primary store (campaigns)\n * this.primaryStore.addItem(campaign);\n *\n * // Check feature flag (read-only) - auto-typed as FeatureFlagStoreSlice\n * const flagsSlice = this.getStore('featureFlags'); // ✅ Type-safe!\n * if (flagsSlice?.flags?.['update-user-stats']) {\n * // Update user store (cross-domain mutation - OK since not read-only)\n * const userSlice = this.getStore('users'); // ✅ Auto-typed!\n * userSlice?.incrementCampaignCount(campaign.userId);\n * }\n * }\n * ```\n */\n protected getStore<K extends keyof RootStoreSlice>(key: K): RootStoreSlice[K] | undefined {\n // Returns specific slice from namespaced root store (type-safe)\n return Core.getDomainStore(key);\n }\n\n // ─────────────────────────────────────────────────────────────────────────\n // Store Sync (Protected - for subclasses)\n // ─────────────────────────────────────────────────────────────────────────\n\n /**\n * Sync data to primary store only (read stores are NOT updated).\n * Uses setData (replace) or updateData (merge) based on `replace` parameter.\n * If custom store handlers are configured, uses those instead of default behavior.\n *\n * @param data - Data to sync to primary store\n * @param replace - If true, calls setData; if false, calls updateData\n */\n // eslint-disable-next-line complexity\n protected syncToStores(data: TData, replace = false): void {\n if (!this._primaryStore) {\n this.logDebug('No primary store to sync to');\n return;\n }\n\n // Check if store sync is disabled\n if (this.storeHandlers?.disabled) {\n this.logDebug('Store sync disabled via storeHandlers.disabled');\n return;\n }\n\n try {\n // Priority 1: Use custom handlers if configured\n if (replace && this.storeHandlers?.setData) {\n this.storeHandlers.setData(this._primaryStore, data);\n } else if (!replace && this.storeHandlers?.updateData) {\n this.storeHandlers.updateData(this._primaryStore, data as Partial<TData>);\n }\n // Priority 2: Use standard store methods\n else if (replace && this._primaryStore.setData) {\n this._primaryStore.setData(data);\n } else if (!replace && this._primaryStore.updateData) {\n this._primaryStore.updateData(data as Partial<TData>);\n } else if (this._primaryStore.setData) {\n // Fallback to setData if updateData not available\n this._primaryStore.setData(data);\n }\n\n this.logDebug('Synced to primary store', {\n primaryStore: this.primaryStoreKey,\n replace,\n });\n } catch (error) {\n this.logError('Failed to sync to primary store', { error });\n }\n }\n\n /**\n * Set loading state on primary store only.\n * Read stores are NOT affected.\n *\n * Automatically called by CRUD methods before and after API calls.\n *\n * @param isLoading - Loading state\n */\n protected setStoresLoading(isLoading: boolean): void {\n if (!this._primaryStore) return;\n\n // Check if store sync is disabled\n if (this.storeHandlers?.disabled) {\n return;\n }\n\n // Use custom handler if configured\n if (this.storeHandlers?.setLoading) {\n this.storeHandlers.setLoading(this._primaryStore, isLoading);\n }\n // Fallback to default behavior\n else if (this._primaryStore.setLoading) {\n this._primaryStore.setLoading(isLoading);\n }\n }\n\n /**\n * Add entity to store (for create operations).\n * Priority: storeHandlers.addData > store.addData\n *\n * @param entity - Entity to add\n * @returns The converted store state (for reuse in event payloads)\n */\n protected addEntityToStore(entity: TEntity): TStoreState {\n const storeState = this.mapper.toStoreState(entity);\n\n if (this._primaryStore && !this.storeHandlers?.disabled) {\n try {\n if (this.storeHandlers?.addData) {\n this.storeHandlers.addData(this._primaryStore, storeState);\n } else if (this._primaryStore.addData) {\n this._primaryStore.addData(storeState);\n } else {\n this.logDebug('Store does not support addData - skipping create sync');\n }\n } catch (error) {\n this.logError('Failed to add entity to store', { error });\n }\n }\n\n return storeState;\n }\n\n /**\n * Update entity in store (for update operations).\n * Priority: storeHandlers.updateDataById > store.updateDataById\n *\n * @param id - Entity ID\n * @param entity - Updated entity\n * @returns The converted store state (for reuse in event payloads)\n */\n protected updateEntityInStore(id: string, entity: TEntity): TStoreState {\n const storeState = this.mapper.toStoreState(entity);\n\n if (this._primaryStore && !this.storeHandlers?.disabled) {\n try {\n if (this.storeHandlers?.updateDataById) {\n this.storeHandlers.updateDataById(this._primaryStore, id, storeState);\n } else if (this._primaryStore.updateDataById) {\n this._primaryStore.updateDataById(id, storeState);\n } else {\n this.logDebug('Store does not support updateDataById - skipping update sync');\n }\n } catch (error) {\n this.logError('Failed to update entity in store', { error });\n }\n }\n\n return storeState;\n }\n\n /**\n * Sync multiple entities to store using mapper.toStoreStateList.\n * Converts entities to store format and syncs via setData (full replacement).\n *\n * @param entities - Entities to sync\n * @returns Array of converted store states\n */\n protected syncEntitiesToStore(entities: TEntity[]): TStoreState[] {\n const storeStates = entities.map(entity => this.mapper.toStoreState(entity));\n\n if (this._primaryStore && !this.storeHandlers?.disabled && this.mapper.toStoreStateList) {\n // mapper.toStoreStateList returns full store data structure\n const storeData = this.mapper.toStoreStateList(entities);\n this.syncToStores(storeData as TData, true); // Replace with full list\n }\n\n return storeStates;\n }\n\n /**\n * Remove entity from store by ID.\n * Priority: storeHandlers.removeData > store.removeData\n *\n * @param id - Entity ID to remove\n */\n protected removeEntityFromStore(id: string): void {\n if (!this._primaryStore || this.storeHandlers?.disabled) return;\n\n try {\n // Priority 1: Custom handler for removeData\n if (this.storeHandlers?.removeData) {\n this.storeHandlers.removeData(this._primaryStore, id);\n }\n // Priority 2: Store's removeData method\n else if (this._primaryStore.removeData) {\n this._primaryStore.removeData(id);\n } else {\n this.logDebug('Store does not support removeData - skipping delete sync');\n return;\n }\n\n this.logDebug('Removed entity from store', { entityId: id });\n } catch (error) {\n this.logError('Failed to remove entity from store', { error, entityId: id });\n }\n }\n\n // ─────────────────────────────────────────────────────────────────────────\n // Optimistic Update Helpers\n // ─────────────────────────────────────────────────────────────────────────\n\n /**\n * Check if optimistic updates are enabled for an operation.\n */\n protected isOptimisticEnabled(operation: 'create' | 'update' | 'delete'): boolean {\n if (!this.optimisticConfig?.enabled) return false;\n const ops = this.optimisticConfig.operations ?? ['create', 'update', 'delete'];\n return ops.includes(operation);\n }\n\n /**\n * Save current store state for potential rollback.\n * Call this BEFORE making optimistic changes.\n */\n protected saveStateForRollback(operation: string): void {\n if (!this._primaryStore?.getData) return;\n\n const previousState = this._primaryStore.getData();\n this._rollbackStack.push({\n operation,\n previousState: previousState ? { ...previousState } : null,\n timestamp: Date.now(),\n });\n\n // Limit stack size\n if (this._rollbackStack.length > this._maxRollbackStackSize) {\n this._rollbackStack.shift();\n }\n\n this.logDebug('Saved state for rollback', { operation, stackSize: this._rollbackStack.length });\n }\n\n /**\n * Rollback to previous state on error.\n * Call this when an optimistic update fails.\n */\n protected rollbackState(operation: string, error: Error): void {\n const entry = this._rollbackStack.pop();\n if (!entry || !this._primaryStore) {\n this.logWarn('No state to rollback', { operation });\n return;\n }\n\n try {\n if (entry.previousState && this._primaryStore.setData) {\n this._primaryStore.setData(entry.previousState);\n this.logInfo('Rolled back optimistic update', { operation });\n }\n\n // Call onRollback callback if configured\n if (this.optimisticConfig?.onRollback) {\n this.optimisticConfig.onRollback(operation, error, entry.previousState);\n }\n\n // Emit rollback event\n this.emitEvent('optimistic:rollback', {\n operation,\n error: error.message,\n previousState: entry.previousState,\n } as Record<string, unknown>);\n } catch (rollbackError) {\n this.logError('Failed to rollback state', { error: rollbackError, operation });\n }\n }\n\n /**\n * Clear rollback state after successful operation.\n * Call this when API succeeds.\n */\n protected clearRollbackState(operation: string): void {\n // Remove the most recent entry for this operation\n const index = this._rollbackStack.findIndex(e => e.operation === operation);\n if (index >= 0) {\n this._rollbackStack.splice(index, 1);\n }\n }\n\n /**\n * Resolve conflict between optimistic and server state.\n */\n // eslint-disable-next-line complexity\n protected resolveConflict<T>(optimistic: T, server: T): T {\n const resolution = this.optimisticConfig?.conflictResolution ?? 'server-wins';\n\n switch (resolution) {\n case 'server-wins':\n return server;\n case 'client-wins':\n return optimistic;\n case 'merge':\n // Deep merge (simple implementation)\n if (typeof optimistic === 'object' && typeof server === 'object') {\n return { ...optimistic, ...server } as T;\n }\n return server;\n case 'manual':\n if (this.optimisticConfig?.onConflict) {\n return this.optimisticConfig.onConflict(optimistic, server);\n }\n return server;\n default:\n return server;\n }\n }\n\n // ─────────────────────────────────────────────────────────────────────────\n // Generic CRUD Operations\n // ─────────────────────────────────────────────────────────────────────────\n\n /**\n * Fetch all entities from API\n *\n * Flow:\n * 1. Assert service is ready\n * 2. Check fetcher is available\n * 3. Set stores loading\n * 4. Emit 'fetching' event\n * 5. Lifecycle hook: beforeFetchAll\n * 6. Call fetcher (from @plyaz/api)\n * 7. Map response DTOs to domain entities\n * 8. Lifecycle hook: afterFetchAll\n * 9. Emit 'fetched' event\n * 10. Return entities\n *\n * Error Handling:\n * - On API error: wrap and emit error event\n * - Set error on all stores\n * - Re-throw wrapped error\n *\n * @param query - Optional query/filter parameters (e.g., { status: 'active' })\n * @param options - Optional service options for fetcher\n * @returns Promise resolving to array of entities\n * @throws CorePackageError if fetcher not configured or API call fails\n *\n * @example\n * ```typescript\n * // Fetch all entities\n * const allItems = await service.fetchAll();\n *\n * // Fetch with filters\n * const activeItems = await service.fetchAll({ status: 'active' });\n *\n * // Fetch with pagination\n * const pagedItems = await service.fetchAll({ page: 2, limit: 10 });\n * ```\n */\n // eslint-disable-next-line complexity\n async fetchAll(query?: Partial<TQueryDTO>, options?: unknown): Promise<TEntity[]> {\n this.assertReady();\n const startTime = Date.now();\n\n if (!this.config.fetchers?.fetchAll) {\n throw new CorePackageError(\n 'fetchAll fetcher not configured. Pass fetchers.fetchAll in service config.',\n ERROR_CODES.CORE_OPERATION_FAILED\n );\n }\n\n this.setStoresLoading(true);\n this.emitEvent('fetching', { query } as Record<string, unknown>);\n\n try {\n // 1. Lifecycle hook\n await this.beforeFetchAll?.(query);\n\n // 2. Call fetcher with query\n const response = await this.config.fetchers.fetchAll(query, options);\n\n if (!response.isSuccess) {\n throw new CorePackageError(\n 'Failed to fetch entities',\n ERROR_CODES.CONTEXT_OPERATION_FAILED,\n {\n context: { operation: 'fetchAll', query },\n cause: response.error ?? undefined,\n }\n );\n }\n\n // 3. Map DTOs to domain entities\n const entities = (response.data ?? []).map(dto => this.mapper.toDomain(dto as TResponseDTO));\n\n // 4. Sync to store and get converted store states (no duplicate toStoreState)\n this.syncEntitiesToStore(entities);\n\n // 5. Lifecycle hook\n await this.afterFetchAll?.(entities, query);\n\n // 6. Emit success event\n this.emitEvent('fetched', {\n count: entities.length,\n query,\n } as Record<string, unknown>);\n\n // Record success metrics\n await this.recordOperationMetrics('fetchAll', Date.now() - startTime, true);\n\n this.logInfo('Fetched entities', { count: entities.length, query });\n return entities;\n } catch (error) {\n // Record error metrics\n await this.recordOperationMetrics('fetchAll', Date.now() - startTime, false);\n\n const pkgError = this.wrapError(error, 'fetchAll', { query });\n // Note: Errors are thrown and caught by global error handler\n // Individual stores should NOT have error state - only global error store\n this.emitEvent('fetch:error', {\n error: pkgError,\n data: { query },\n } satisfies CoreEntityErrorPayload);\n throw pkgError;\n } finally {\n this.setStoresLoading(false);\n }\n }\n\n /**\n * Fetch single entity by ID from API\n *\n * @param id - Entity ID\n * @param options - Optional service options for fetcher\n * @returns Entity or null if not found\n * @throws CorePackageError if fetcher not configured or API call fails\n */\n // eslint-disable-next-line complexity\n async fetchById<TInput = string, TOptions = unknown>(\n id: TInput,\n options?: TOptions\n ): Promise<TEntity | null> {\n this.assertReady();\n const startTime = Date.now();\n\n if (!this.config.fetchers?.fetchById) {\n throw new CorePackageError(\n 'fetchById fetcher not configured. Pass fetchers.fetchById in service config.',\n ERROR_CODES.CORE_OPERATION_FAILED\n );\n }\n\n try {\n // 1. Lifecycle hook\n await this.beforeFetchById?.(id);\n\n // 2. Call fetcher\n const response = await this.config.fetchers.fetchById(String(id), options);\n\n if (!response.isSuccess) {\n if (response.error?.message?.includes('404')) {\n return null;\n }\n throw new CorePackageError('Failed to fetch entity', ERROR_CODES.CONTEXT_OPERATION_FAILED, {\n context: { operation: 'fetchById', entityId: String(id) },\n cause: response.error ?? undefined,\n });\n }\n\n // 3. Map DTO to domain entity\n const entity = response.data ? this.mapper.toDomain(response.data as TResponseDTO) : null;\n\n // 4. Lifecycle hook\n if (entity) {\n await this.afterFetchById?.(entity);\n }\n\n // Record success metrics\n await this.recordOperationMetrics('fetchById', Date.now() - startTime, true);\n\n return entity;\n } catch (error) {\n // Record error metrics\n await this.recordOperationMetrics('fetchById', Date.now() - startTime, false);\n\n const pkgError = this.wrapError(error, 'fetchById', { entityId: String(id) });\n throw pkgError;\n }\n }\n\n /**\n * Create new entity\n *\n * Flow:\n * 1. Assert service is ready\n * 2. Check fetcher is available\n * 3. Set stores loading\n * 4. Emit 'creating' event\n * 5. Lifecycle hook: beforeCreate\n * 6. Map input data to create DTO (if mapper available)\n * 7. [Optimistic] Save state and add to store BEFORE API call\n * 8. Call create fetcher (from @plyaz/api)\n * 9. Map response DTO to domain entity\n * 10. [Optimistic] Resolve conflicts if needed\n * 11. Lifecycle hook: afterCreate\n * 12. Emit 'created' event\n * 13. Return entity\n *\n * @param data - Create data (can be partial domain entity or DTO)\n * @param options - Optional service options for fetcher\n * @returns Created entity\n * @throws CorePackageError if fetcher not configured or creation fails\n */\n // eslint-disable-next-line complexity, max-lines-per-function\n async create<TInput = unknown, TOptions = unknown>(\n data: TInput,\n options?: TOptions\n ): Promise<TEntity> {\n this.assertReady();\n const startTime = Date.now();\n\n if (!this.config.fetchers?.create) {\n throw new CorePackageError(\n 'create fetcher not configured. Pass fetchers.create in service config.',\n ERROR_CODES.CORE_OPERATION_FAILED\n );\n }\n\n const isOptimistic = this.isOptimisticEnabled('create');\n\n this.setStoresLoading(true);\n this.emitEvent('creating', {\n request: data,\n } satisfies CoreEntityCreatingPayload<TInput>);\n\n // Save state for rollback if optimistic\n if (isOptimistic) {\n this.saveStateForRollback('create');\n }\n\n // Create optimistic entity for immediate UI update\n let optimisticEntity: TEntity | null = null;\n let optimisticStoreState: TStoreState | null = null;\n\n try {\n // 1. Lifecycle hook\n await this.beforeCreate?.(data);\n\n // 2. Map to DTO if mapper available (optional - data might already be DTO)\n const createDTO = this.mapper?.toCreateDTO\n ? this.mapper.toCreateDTO(data as Partial<TEntity>)\n : (data as unknown as TCreateDTO);\n\n // 3. [Optimistic] Add to store BEFORE API call\n if (isOptimistic) {\n // Create a temporary entity for optimistic display\n optimisticEntity = {\n ...(data as object),\n id: `temp-${Date.now()}`, // Temporary ID\n _optimistic: true,\n } as TEntity;\n optimisticStoreState = this.addEntityToStore(optimisticEntity);\n\n this.emitEvent('optimistic:create', {\n entity: optimisticEntity,\n storeState: optimisticStoreState,\n } as Record<string, unknown>);\n }\n\n // 4. Call create fetcher\n const response = await this.config.fetchers.create(createDTO, options);\n\n if (!response.isSuccess) {\n throw new CorePackageError(\n response.error?.message ?? 'Failed to create entity',\n ERROR_CODES.CONTEXT_OPERATION_FAILED,\n {\n context: { operation: 'create' },\n cause: response.error ?? undefined,\n }\n );\n }\n\n // 5. Map response to domain entity\n const entity = this.mapper.toDomain(response.data as TResponseDTO);\n\n // 6. Update store with real entity (replaces optimistic if used)\n let storeState: TStoreState;\n if (isOptimistic && optimisticEntity) {\n // Remove optimistic entity and add real one\n const tempId = (optimisticEntity as { id?: string }).id;\n if (tempId) {\n this.removeEntityFromStore(tempId);\n }\n storeState = this.addEntityToStore(entity);\n this.clearRollbackState('create');\n } else {\n storeState = this.addEntityToStore(entity);\n }\n\n // 7. Lifecycle hook\n await this.afterCreate?.(entity);\n\n // 8. Emit created event (reuse storeState from sync)\n this.emitEvent('created', {\n entity,\n storeState,\n } satisfies CoreEntityCreatedPayload<TEntity, TStoreState>);\n\n this.emitEvent('complete', {\n success: true,\n } satisfies CoreEntityCompletePayload);\n\n // Record success metrics\n await this.recordOperationMetrics('create', Date.now() - startTime, true);\n\n this.logInfo('Entity created', { entityId: (entity as { id?: string }).id });\n return entity;\n } catch (error) {\n // Record error metrics\n await this.recordOperationMetrics('create', Date.now() - startTime, false);\n\n // Rollback on error if optimistic\n if (isOptimistic && this.optimisticConfig?.rollbackOnError !== false) {\n this.rollbackState('create', error instanceof Error ? error : new Error(String(error)));\n }\n\n const pkgError = this.wrapError(error, 'create');\n // Errors thrown to global error handler - not set on individual stores\n this.emitEvent('create:error', {\n error: pkgError,\n } satisfies CoreEntityErrorPayload);\n throw pkgError;\n } finally {\n this.setStoresLoading(false);\n }\n }\n\n /**\n * Update entity (partial update - PATCH)\n *\n * @param id - Entity ID\n * @param data - Partial update data\n * @param options - Optional service options for fetcher\n * @returns Updated entity\n * @throws CorePackageError if fetcher not configured or update fails\n */\n // eslint-disable-next-line complexity, max-lines-per-function\n async update<TInput = unknown, TOptions = unknown>(\n id: string,\n data: TInput,\n options?: TOptions\n ): Promise<TEntity> {\n this.assertReady();\n const startTime = Date.now();\n\n if (!this.config.fetchers?.update) {\n throw new CorePackageError(\n 'update fetcher not configured. Pass fetchers.update in service config.',\n ERROR_CODES.CORE_OPERATION_FAILED\n );\n }\n\n const isOptimistic = this.isOptimisticEnabled('update');\n\n this.setStoresLoading(true);\n this.emitEvent('patching', {\n id,\n request: data,\n } satisfies CoreEntityPatchingPayload<TInput>);\n\n // Save state for rollback if optimistic\n if (isOptimistic) {\n this.saveStateForRollback('update');\n }\n\n try {\n // 1. Lifecycle hook\n await this.beforeUpdate?.(id, data);\n\n // 2. Map to DTO if mapper available\n const patchDTO = this.mapper?.toPatchDTO\n ? this.mapper.toPatchDTO(data as Partial<TEntity>)\n : (data as unknown as TPatchDTO);\n\n // 3. [Optimistic] Update store BEFORE API call\n let optimisticStoreState: TStoreState | null = null;\n if (isOptimistic) {\n // Create optimistic entity with merged data\n const optimisticEntity = {\n id,\n ...(data as object),\n _optimistic: true,\n } as TEntity;\n optimisticStoreState = this.updateEntityInStore(id, optimisticEntity);\n\n this.emitEvent('optimistic:update', {\n id,\n entity: optimisticEntity,\n storeState: optimisticStoreState,\n } as Record<string, unknown>);\n }\n\n // 4. Call update fetcher\n const response = await this.config.fetchers.update({ id, data: patchDTO }, options);\n\n if (!response.isSuccess) {\n throw new CorePackageError(\n response.error?.message ?? 'Failed to update entity',\n ERROR_CODES.CONTEXT_OPERATION_FAILED,\n {\n context: { operation: 'update', entityId: id },\n cause: response.error ?? undefined,\n }\n );\n }\n\n // 5. Map response to domain entity\n const serverEntity = this.mapper.toDomain(response.data as TResponseDTO);\n\n // 6. Resolve conflicts and update store with final entity\n let finalEntity = serverEntity;\n if (isOptimistic && optimisticStoreState) {\n // Resolve any conflicts between optimistic and server response\n finalEntity = this.resolveConflict({ id, ...(data as object) } as TEntity, serverEntity);\n this.clearRollbackState('update');\n }\n\n // 7. Update in store with final entity\n const storeState = this.updateEntityInStore(id, finalEntity);\n\n // 8. Lifecycle hook\n await this.afterUpdate?.(id, finalEntity);\n\n // 9. Emit updated event (reuse storeState from sync)\n this.emitEvent('patched', {\n entity: finalEntity,\n storeState,\n } satisfies CoreEntityPatchedPayload<TEntity, TStoreState>);\n\n this.emitEvent('complete', {\n success: true,\n entityId: id,\n } satisfies CoreEntityCompletePayload);\n\n // Record success metrics\n await this.recordOperationMetrics('patch', Date.now() - startTime, true);\n\n this.logInfo('Entity updated', { entityId: id });\n return finalEntity;\n } catch (error) {\n // Record error metrics\n await this.recordOperationMetrics('patch', Date.now() - startTime, false);\n\n // Rollback on error if optimistic\n if (isOptimistic && this.optimisticConfig?.rollbackOnError !== false) {\n this.rollbackState('update', error instanceof Error ? error : new Error(String(error)));\n }\n\n const pkgError = this.wrapError(error, 'update', { entityId: id });\n // Errors thrown to global error handler - not set on individual stores\n this.emitEvent('update:error', {\n error: pkgError,\n entityId: id,\n } satisfies CoreEntityErrorPayload);\n throw pkgError;\n } finally {\n this.setStoresLoading(false);\n }\n }\n\n /**\n * Delete entity\n *\n * @param id - Entity ID\n * @param options - Optional service options for fetcher\n * @returns Delete operation result (type specified by TDeleteResult generic)\n * @throws CorePackageError if fetcher not configured or deletion fails\n */\n // eslint-disable-next-line complexity\n async delete<TInput = string, TOptions = unknown>(\n id: TInput,\n options?: TOptions\n ): Promise<TDeleteResult> {\n this.assertReady();\n const startTime = Date.now();\n\n if (!this.config.fetchers?.delete) {\n throw new CorePackageError(\n 'delete fetcher not configured. Pass fetchers.delete in service config.',\n ERROR_CODES.CORE_OPERATION_FAILED\n );\n }\n\n const isOptimistic = this.isOptimisticEnabled('delete');\n\n this.setStoresLoading(true);\n this.emitEvent('deleting', {\n id: String(id),\n } satisfies CoreEntityDeletingPayload);\n\n // Save state for rollback if optimistic\n if (isOptimistic) {\n this.saveStateForRollback('delete');\n }\n\n try {\n // 1. Lifecycle hook\n await this.beforeDelete?.(id);\n\n // 2. [Optimistic] Remove from store BEFORE API call\n if (isOptimistic) {\n this.removeEntityFromStore(String(id));\n\n this.emitEvent('optimistic:delete', {\n id: String(id),\n } as Record<string, unknown>);\n }\n\n // 3. Call delete fetcher\n const response = await this.config.fetchers.delete(String(id), options);\n\n if (!response.isSuccess) {\n throw new CorePackageError(\n response.error?.message ?? 'Failed to delete entity',\n ERROR_CODES.CONTEXT_OPERATION_FAILED,\n {\n context: { operation: 'delete', entityId: String(id) },\n cause: response.error ?? undefined,\n }\n );\n }\n\n // 4. Remove from store (if not already done optimistically)\n if (!isOptimistic) {\n this.removeEntityFromStore(String(id));\n } else {\n this.clearRollbackState('delete');\n }\n\n // 5. Lifecycle hook\n await this.afterDelete?.(id);\n\n // 6. Emit deleted event\n this.emitEvent('deleted', {\n id: String(id),\n soft: false,\n } satisfies CoreEntityDeletedPayload);\n\n this.emitEvent('complete', {\n success: true,\n entityId: String(id),\n } satisfies CoreEntityCompletePayload);\n\n // Record success metrics\n await this.recordOperationMetrics('delete', Date.now() - startTime, true);\n\n this.logInfo('Entity deleted', { entityId: String(id) });\n\n // 7. Return delete result\n return response.data as TDeleteResult;\n } catch (error) {\n // Record error metrics\n await this.recordOperationMetrics('delete', Date.now() - startTime, false);\n\n // Rollback on error if optimistic\n if (isOptimistic && this.optimisticConfig?.rollbackOnError !== false) {\n this.rollbackState('delete', error instanceof Error ? error : new Error(String(error)));\n }\n\n const pkgError = this.wrapError(error, 'delete', { entityId: String(id) });\n // Errors thrown to global error handler - not set on individual stores\n this.emitEvent('delete:error', {\n error: pkgError,\n entityId: String(id),\n } satisfies CoreEntityErrorPayload);\n throw pkgError;\n } finally {\n this.setStoresLoading(false);\n }\n }\n\n // ─────────────────────────────────────────────────────────────────────────\n // Event Emission (Protected - for subclasses)\n // ─────────────────────────────────────────────────────────────────────────\n\n /**\n * Emit event with automatic prefix\n * Uses CoreEventManager under the hood\n *\n * @param event - Event name (without prefix)\n * @param payload - Event payload\n *\n * @example\n * ```typescript\n * // If eventPrefix is 'example', this emits 'example:created'\n * this.emitEvent('created', { entity, storeState });\n * ```\n */\n protected emitEvent<TPayload extends BaseFrontendEventPayload>(\n event: string,\n payload: TPayload\n ): void {\n const eventName = `${this.eventPrefix}:${event}`;\n CoreEventManager.emit(eventName, payload);\n this.logDebug(`Event emitted: ${eventName}`, payload as unknown as Record<string, unknown>);\n }\n\n // ─────────────────────────────────────────────────────────────────────────\n // Lifecycle Hooks (Optional - Override in subclasses)\n // ─────────────────────────────────────────────────────────────────────────\n\n /**\n * Called before fetchAll API call\n * Override to add custom logic (e.g., cache check, validate query)\n *\n * @param query - Optional query/filter parameters\n */\n protected beforeFetchAll?(query?: Partial<TQueryDTO>): Promise<void>;\n\n /**\n * Called after fetchAll success\n * Override to add custom logic (e.g., cache set, transform entities)\n *\n * @param entities - Fetched entities\n * @param query - Optional query/filter parameters that were used\n */\n protected afterFetchAll?(entities: TEntity[], query?: Partial<TQueryDTO>): Promise<void>;\n\n /**\n * Called before fetchById API call\n */\n protected beforeFetchById?<TInput>(id: TInput): Promise<void>;\n\n /**\n * Called after fetchById success\n */\n protected afterFetchById?(entity: TEntity): Promise<void>;\n\n /**\n * Called before create API call\n * Use this to modify data or validate before sending to API\n */\n protected beforeCreate?<TInput>(data: TInput): Promise<void>;\n\n /**\n * Called after create success\n * Use this to update stores, show notifications, etc.\n */\n protected afterCreate?(entity: TEntity): Promise<void>;\n\n /**\n * Called before update API call\n */\n protected beforeUpdate?<TInput>(id: string, data: TInput): Promise<void>;\n\n /**\n * Called after update success\n */\n protected afterUpdate?(id: string, entity: TEntity): Promise<void>;\n\n /**\n * Called before delete API call\n */\n protected beforeDelete?<TInput>(id: TInput): Promise<void>;\n\n /**\n * Called after delete success\n */\n protected afterDelete?<TInput>(id: TInput): Promise<void>;\n\n /**\n * Called before OPTIONS request\n *\n * Use for custom logic before checking allowed methods/CORS headers.\n *\n * @param resource - Optional resource identifier or URL\n */\n protected beforeOptions?<TInput>(resource?: TInput): Promise<void>;\n\n /**\n * Called after OPTIONS request success\n *\n * Use for processing allowed methods/headers or logging.\n *\n * @param resource - Optional resource identifier or URL\n * @param result - The OPTIONS response (allowed methods, CORS headers, etc.)\n */\n protected afterOptions?<TInput>(resource: TInput | undefined, result: unknown): Promise<void>;\n\n /**\n * Called before HEAD request\n *\n * Use for custom logic before checking resource existence/headers.\n *\n * @param resource - Optional resource identifier or URL\n */\n protected beforeHead?<TInput>(resource?: TInput): Promise<void>;\n\n /**\n * Called after HEAD request success\n *\n * Use for processing response headers or logging.\n * Note: HEAD requests return no body, only headers.\n *\n * @param resource - Optional resource identifier or URL\n * @param headers - Response headers (if available)\n */\n protected afterHead?<TInput>(resource: TInput | undefined, headers?: unknown): Promise<void>;\n\n // ─────────────────────────────────────────────────────────────────────────\n // Error Handling Helpers\n // ─────────────────────────────────────────────────────────────────────────\n\n /**\n * Wrap error in CorePackageError with context\n *\n * @param error - Original error\n * @param operation - Operation that failed\n * @param context - Additional context\n * @returns Wrapped error\n */\n protected wrapError(\n error: unknown,\n operation: string,\n context?: Record<string, unknown>\n ): CorePackageError {\n // If already a package error (BaseError subclass), return as-is\n if (error instanceof BaseError) {\n return error as CorePackageError;\n }\n\n // Wrap other errors in CorePackageError\n return new CorePackageError(\n error instanceof Error ? error.message : 'An unexpected error occurred',\n ERROR_CODES.CONTEXT_OPERATION_FAILED,\n {\n context: { operation, ...context },\n cause: error instanceof Error ? error : undefined,\n }\n );\n }\n\n // ─────────────────────────────────────────────────────────────────────────\n // Observability Helper Methods\n // ─────────────────────────────────────────────────────────────────────────\n\n /**\n * Track a frontend operation with observability (span + metrics).\n * Wraps an operation with automatic span creation, duration recording, and error tracking.\n *\n * @param operation - Operation name (fetchAll, fetchById, create, delete)\n * @param entityId - Optional entity ID for context\n * @param fn - The operation function to execute\n * @returns Result of the operation\n *\n * @example\n * ```typescript\n * const entity = await this.trackOperation('create', undefined, async () => {\n * return await this.config.fetchers.create(data);\n * });\n * ```\n */\n protected async trackOperation<T>(\n operation: 'fetchAll' | 'fetchById' | 'create' | 'patch' | 'delete',\n entityId: string | undefined,\n fn: () => Promise<T>\n ): Promise<T> {\n const startTime = Date.now();\n const spanName = `${this.eventPrefix}.${operation}`;\n\n return this.withSpan(spanName, async span => {\n if (entityId) {\n span.setAttribute('entity.id', entityId);\n }\n span.setAttribute('service.name', this.serviceName);\n span.setAttribute('operation.name', operation);\n\n try {\n const result = await fn();\n\n // Record success metrics\n const duration = Date.now() - startTime;\n await this.recordOperationMetrics(operation, duration, true);\n\n span.setStatus('ok');\n return result;\n } catch (error) {\n // Record error metrics\n const duration = Date.now() - startTime;\n await this.recordOperationMetrics(operation, duration, false);\n\n span.recordException(error as Error);\n span.setStatus('error', (error as Error).message);\n throw error;\n }\n });\n }\n\n /**\n * Record operation metrics (duration and count).\n */\n private async recordOperationMetrics(\n operation: string,\n duration: number,\n success: boolean\n ): Promise<void> {\n if (!this.hasObservability) return;\n\n const tags = {\n service: this.serviceName,\n operation,\n entity: this.eventPrefix,\n runtime: 'frontend',\n };\n\n // Record duration\n await this.recordMetric(OBSERVABILITY_METRICS.SERVICE_OPERATION_DURATION, duration, tags);\n\n // Record count\n await this.incrementCounter(\n success\n ? OBSERVABILITY_METRICS.SERVICE_OPERATION_COUNT\n : OBSERVABILITY_METRICS.SERVICE_OPERATION_ERROR,\n 1,\n tags\n );\n }\n}\n","/**\n * Base Mapper\n *\n * Abstract base class for domain mappers handling data transformation.\n * Supports all HTTP operations with corresponding mapping methods.\n *\n * Mapping concerns:\n * - Request mapping (domain → API DTO for POST, PUT, PATCH, DELETE)\n * - Response mapping (API DTO → domain)\n * - Store mapping (domain ↔ Zustand state)\n * - Query mapping (filters → query params)\n *\n * Note: Validation is handled by BaseValidator, not here.\n *\n * @example\n * ```typescript\n * class ExampleMapper extends BaseMapper<\n * ExampleEntity, // Domain model\n * ExampleResponseDTO, // API response\n * CreateExampleDTO, // POST body\n * UpdateExampleDTO, // PUT body\n * PatchExampleDTO, // PATCH body\n * QueryExampleDTO, // GET params\n * ExampleStoreItem // Store state\n * > {\n * toDomain(dto) { ... }\n * toCreateDTO(data) { ... }\n * // ... implement needed methods\n * }\n * ```\n */\n// Import for local use\nimport type { CoreBaseMapperInstance } from '@plyaz/types/core';\n\n/**\n * Abstract base mapper with default implementations\n *\n * Required to implement:\n * - toDomain(dto): Convert API response to domain model\n *\n * Optional to implement (based on your needs):\n * - toCreateDTO(data): For POST requests\n * - toUpdateDTO(data): For PUT requests\n * - toPatchDTO(data): For PATCH requests\n * - toQueryDTO(filters): For GET query params\n * - toStoreState(domain): Custom store state shape\n * - fromStoreState(state): Restore domain from store\n */\nexport abstract class BaseMapper<\n TDomain,\n TResponseDTO,\n TCreateDTO = unknown,\n TUpdateDTO = TCreateDTO,\n TPatchDTO = Partial<TCreateDTO>,\n TQueryDTO = unknown,\n TStoreState = TDomain,\n> implements\n CoreBaseMapperInstance<\n TDomain,\n TResponseDTO,\n TCreateDTO,\n TUpdateDTO,\n TPatchDTO,\n TQueryDTO,\n TStoreState\n >\n{\n // ─────────────────────────────────────────────────────────────────\n // Abstract methods - must be implemented\n // ─────────────────────────────────────────────────────────────────\n\n /**\n * Convert API response DTO to domain model\n * Handle snake_case → camelCase, add computed properties\n */\n abstract toDomain(dto: TResponseDTO): TDomain;\n\n // ─────────────────────────────────────────────────────────────────\n // Request Mapping - override as needed\n // ─────────────────────────────────────────────────────────────────\n\n /**\n * Convert domain data to create DTO (POST body)\n * Handle camelCase → snake_case, pick required fields\n */\n toCreateDTO?(data: Partial<TDomain>): TCreateDTO;\n\n /**\n * Convert domain data to update DTO (PUT body - full replacement)\n * Default: same as toCreateDTO\n */\n toUpdateDTO?(data: Partial<TDomain>): TUpdateDTO;\n\n /**\n * Convert domain data to patch DTO (PATCH body - partial)\n * Default: picks only defined fields\n */\n toPatchDTO?(data: Partial<TDomain>): TPatchDTO;\n\n /**\n * Convert filter object to query params DTO (GET)\n * Handle pagination, sorting, filtering\n */\n toQueryDTO?(filters: Partial<TQueryDTO>): TQueryDTO;\n\n // ─────────────────────────────────────────────────────────────────\n // Response Mapping - default implementations\n // ─────────────────────────────────────────────────────────────────\n\n /**\n * Convert database row/repository result to response DTO\n * Override to map repository output to API response format\n * Useful when repository returns different format than API expects\n */\n toResponseDTO?(row: unknown): TResponseDTO;\n\n /**\n * Map array of DTOs to domain models\n */\n toDomainList(dtos: TResponseDTO[]): TDomain[] {\n return dtos.map(dto => this.toDomain(dto));\n }\n\n // ─────────────────────────────────────────────────────────────────\n // Store Mapping - default implementations\n // ─────────────────────────────────────────────────────────────────\n\n /**\n * Convert domain model to store state (serializable)\n * Default: strips functions, keeps data\n */\n toStoreState(domain: TDomain): TStoreState {\n const state = {} as Record<string, unknown>;\n for (const [key, value] of Object.entries(domain as Record<string, unknown>)) {\n if (typeof value !== 'function') {\n // Convert Date to ISO string for serialization\n if (value instanceof Date) {\n state[key] = value.toISOString();\n } else {\n state[key] = value;\n }\n }\n }\n return state as TStoreState;\n }\n\n /**\n * Convert array of domain models to aggregated store state\n * Override to customize how multiple items map to store\n * Default: returns array of individual store states (as Partial since shape may differ)\n */\n toStoreStateList?(domains: TDomain[]): Partial<TStoreState> {\n // Default: map each domain to store state and return as array\n // Subclasses should override for custom aggregation (e.g., flags → Record<key, value>)\n return domains.map(d => this.toStoreState(d)) as unknown as Partial<TStoreState>;\n }\n\n /**\n * Restore domain model from store state\n * Override to restore computed properties/methods\n */\n fromStoreState(state: TStoreState): TDomain {\n return state as unknown as TDomain;\n }\n}\n","/**\n * Base Validator\n *\n * Abstract base class for domain validators.\n * Handles validation AND sanitization using Zod schemas from @plyaz/types.\n *\n * Supports all HTTP operations:\n * - create (POST)\n * - update (PUT - full replacement)\n * - patch (PATCH - partial update)\n * - delete (DELETE with options)\n * - query (GET params)\n *\n * @example\n * ```typescript\n * import { CreateExampleSchema, PatchExampleSchema } from '@plyaz/types/examples';\n *\n * class ExampleValidator extends BaseValidator<\n * CreateExampleDTO, // create\n * UpdateExampleDTO, // update (full)\n * PatchExampleDTO, // patch (partial)\n * DeleteExampleDTO, // delete options\n * QueryExampleDTO // query params\n * > {\n * constructor() {\n * super({\n * createSchema: CreateExampleSchema,\n * patchSchema: PatchExampleSchema,\n * // ... other schemas\n * });\n * }\n * }\n * ```\n */\n\nimport { ValidateAndFormatErrors, ValidationError } from '@plyaz/errors';\nimport type {\n ValidationIssue,\n BaseErrorContext,\n InternalValidationSchema,\n} from '@plyaz/types/errors';\nimport { API_ERROR_CODES } from '@plyaz/types/errors';\nimport { HTTP_STATUS } from '@plyaz/config';\nimport type {\n CoreValidationResult,\n CoreValidatorConfig,\n CoreBaseValidatorInstance,\n} from '@plyaz/types/core';\n\n/**\n * Abstract base validator with default implementations\n */\nexport abstract class BaseValidator<\n TCreate = unknown,\n TUpdate = TCreate,\n TPatch = Partial<TCreate>,\n TDelete = unknown,\n TQuery = unknown,\n> implements CoreBaseValidatorInstance<TCreate, TUpdate, TPatch, TDelete, TQuery>\n{\n protected readonly config: CoreValidatorConfig<TCreate, TUpdate, TPatch, TDelete, TQuery>;\n\n constructor(config: CoreValidatorConfig<TCreate, TUpdate, TPatch, TDelete, TQuery> = {}) {\n this.config = config;\n }\n\n // ─────────────────────────────────────────────────────────────────\n // Validation Methods (return ValidationResult)\n // ─────────────────────────────────────────────────────────────────\n\n /**\n * Validate data for create operation (POST)\n */\n validateCreate(data: unknown): CoreValidationResult<TCreate> {\n if (!this.config.createSchema) {\n return { success: true, data: data as TCreate };\n }\n return this.validate(data, this.config.createSchema);\n }\n\n /**\n * Validate data for full update operation (PUT)\n */\n validateUpdate(data: unknown): CoreValidationResult<TUpdate> {\n if (!this.config.updateSchema) {\n return { success: true, data: data as TUpdate };\n }\n return this.validate(data, this.config.updateSchema);\n }\n\n /**\n * Validate data for partial update operation (PATCH)\n */\n validatePatch(data: unknown): CoreValidationResult<TPatch> {\n if (!this.config.patchSchema) {\n return { success: true, data: data as TPatch };\n }\n return this.validate(data, this.config.patchSchema);\n }\n\n /**\n * Validate data for delete operation (DELETE with options)\n */\n validateDelete(data: unknown): CoreValidationResult<TDelete> {\n if (!this.config.deleteSchema) {\n return { success: true, data: data as TDelete };\n }\n return this.validate(data, this.config.deleteSchema);\n }\n\n /**\n * Validate query parameters (GET list)\n */\n validateQuery(data: unknown): CoreValidationResult<TQuery> {\n if (!this.config.querySchema) {\n return { success: true, data: data as TQuery };\n }\n return this.validate(data, this.config.querySchema);\n }\n\n // ─────────────────────────────────────────────────────────────────\n // OrThrow Methods (throw ValidationError on failure)\n // ─────────────────────────────────────────────────────────────────\n\n /**\n * Validate and throw if invalid (for create)\n * @throws ValidationError[] (array) if validation fails\n */\n validateCreateOrThrow(data: unknown): TCreate {\n const result = this.validateCreate(data);\n if (!result.success && result.errors) {\n const validationErrors = this.toValidationErrorArray(result.errors);\n if (validationErrors.length > 0) {\n throw validationErrors; // Throw array of errors\n }\n }\n return result.data!;\n }\n\n /**\n * Validate and throw if invalid (for update)\n * @throws ValidationError[] (array) if validation fails\n */\n validateUpdateOrThrow(data: unknown): TUpdate {\n const result = this.validateUpdate(data);\n if (!result.success && result.errors) {\n const validationErrors = this.toValidationErrorArray(result.errors);\n if (validationErrors.length > 0) {\n throw validationErrors; // Throw array of errors\n }\n }\n return result.data!;\n }\n\n /**\n * Validate and throw if invalid (for patch)\n * @throws ValidationError[] (array) if validation fails\n */\n validatePatchOrThrow(data: unknown): TPatch {\n const result = this.validatePatch(data);\n if (!result.success && result.errors) {\n const validationErrors = this.toValidationErrorArray(result.errors);\n if (validationErrors.length > 0) {\n throw validationErrors; // Throw array of errors\n }\n }\n return result.data!;\n }\n\n /**\n * Validate and throw if invalid (for delete)\n * @throws ValidationError[] (array) if validation fails\n */\n validateDeleteOrThrow(data: unknown): TDelete {\n const result = this.validateDelete(data);\n if (!result.success && result.errors) {\n const validationErrors = this.toValidationErrorArray(result.errors);\n if (validationErrors.length > 0) {\n throw validationErrors; // Throw array of errors\n }\n }\n return result.data!;\n }\n\n /**\n * Validate and throw if invalid (for query)\n * @throws ValidationError[] (array) if validation fails\n */\n validateQueryOrThrow(data: unknown): TQuery {\n const result = this.validateQuery(data);\n if (!result.success && result.errors) {\n const validationErrors = this.toValidationErrorArray(result.errors);\n if (validationErrors.length > 0) {\n throw validationErrors; // Throw array of errors\n }\n }\n return result.data!;\n }\n\n // ─────────────────────────────────────────────────────────────────\n // Protected Methods\n // ─────────────────────────────────────────────────────────────────\n\n /**\n * Internal validation using ValidateAndFormatErrors from @plyaz/errors\n * This handles both validation AND sanitization (via Zod transforms)\n */\n protected validate<T>(\n data: unknown,\n schema: InternalValidationSchema<T>\n ): CoreValidationResult<T> {\n const result = ValidateAndFormatErrors(schema, data);\n\n if (!result.success) {\n return {\n success: false,\n errors: result.errors,\n };\n }\n\n return {\n success: true,\n data: result.data as T,\n };\n }\n\n /**\n * Convert ValidationIssue[] to array of ValidationError objects\n * Each validation issue becomes a separate ValidationError\n */\n protected toValidationErrorArray(issues?: ValidationIssue[]): ValidationError[] {\n if (!issues || issues.length === 0) {\n return [];\n }\n\n return issues.map(issue => {\n const field = issue.path.join('.');\n return new ValidationError(\n API_ERROR_CODES.VALIDATION_FAILED,\n HTTP_STATUS.BAD_REQUEST,\n issue.message,\n {\n field,\n path: issue.path,\n code: issue.code,\n }\n );\n });\n }\n\n /**\n * Convert ValidationIssue[] to BaseErrorContext (legacy)\n * @deprecated Use toValidationErrorArray instead\n */\n protected toErrorContext(issues?: ValidationIssue[]): BaseErrorContext {\n if (!issues || issues.length === 0) {\n return {};\n }\n return {\n errors: issues.map(issue => ({\n errorCode: issue.code,\n message: issue.message,\n field: issue.path.join('.'),\n context: {\n path: issue.path,\n },\n })),\n };\n }\n}\n","/**\n * Mapper Utility Functions\n *\n * Common utilities for data transformation in mappers.\n */\n\n/**\n * Convert snake_case to camelCase\n */\nexport function snakeToCamel(str: string): string {\n return str.replace(/_([a-z])/g, (_, letter) => letter.toUpperCase());\n}\n\n/**\n * Convert camelCase to snake_case\n */\nexport function camelToSnake(str: string): string {\n return str.replace(/[A-Z]/g, letter => `_${letter.toLowerCase()}`);\n}\n\n/**\n * Parse ISO date string to Date object\n */\nexport function parseDate(dateString: string | null | undefined): Date | null {\n if (!dateString) return null;\n const date = new Date(dateString);\n return isNaN(date.getTime()) ? null : date;\n}\n\n/**\n * Format Date to ISO string for API\n */\nexport function formatDate(date: Date | null | undefined): string | null {\n return date?.toISOString() ?? null;\n}\n\n/**\n * Trim string if defined\n */\nexport function trimString(str: string | undefined): string | undefined {\n return str?.trim();\n}\n\n/**\n * Pick only defined values from object (for PATCH requests)\n */\nexport function pickDefined<T extends Record<string, unknown>>(obj: T): Partial<T> {\n const result: Partial<T> = {};\n for (const [key, value] of Object.entries(obj)) {\n if (value !== undefined) {\n (result as Record<string, unknown>)[key] = value;\n }\n }\n return result;\n}\n\n/**\n * Convert object keys from snake_case to camelCase\n */\nexport function keysToCamel<T extends Record<string, unknown>>(obj: T): Record<string, unknown> {\n const result: Record<string, unknown> = {};\n for (const [key, value] of Object.entries(obj)) {\n result[snakeToCamel(key)] = value;\n }\n return result;\n}\n\n/**\n * Convert object keys from camelCase to snake_case\n */\nexport function keysToSnake<T extends Record<string, unknown>>(obj: T): Record<string, unknown> {\n const result: Record<string, unknown> = {};\n for (const [key, value] of Object.entries(obj)) {\n result[camelToSnake(key)] = value;\n }\n return result;\n}\n","/**\n * InitializationError Component\n *\n * Default error display when Plyaz initialization fails.\n * Can be overridden via the `error` prop on PlyazProvider.\n */\n\n'use client';\n\nimport type { CSSProperties, ReactElement } from 'react';\nimport type { CoreInitializationErrorProps as InitializationErrorProps } from '@plyaz/types/core';\n\n/**\n * Default styles for the error container\n */\nconst errorContainerStyle: CSSProperties = {\n padding: '20px',\n color: 'red',\n fontFamily: 'system-ui, -apple-system, sans-serif',\n};\n\n/**\n * Default styles for the error heading\n */\nconst errorHeadingStyle: CSSProperties = {\n margin: '0 0 10px 0',\n fontSize: '1.25rem',\n fontWeight: 600,\n};\n\n/**\n * Default styles for the error message\n */\nconst errorMessageStyle: CSSProperties = {\n margin: 0,\n fontSize: '0.875rem',\n};\n\n/**\n * Renders an initialization error state.\n *\n * @example\n * ```tsx\n * // Using default error display\n * <InitializationError error={new Error('Failed to connect')} />\n *\n * // Using custom error component\n * <InitializationError\n * error={error}\n * errorComponent={(err) => <CustomErrorBoundary error={err} />}\n * />\n * ```\n */\nexport function InitializationError({\n error,\n errorComponent,\n}: InitializationErrorProps): ReactElement {\n if (errorComponent) {\n return <>{errorComponent(error)}</>;\n }\n\n return (\n <div style={errorContainerStyle}>\n <h2 style={errorHeadingStyle}>Plyaz Initialization Failed</h2>\n <p style={errorMessageStyle}>{error.message}</p>\n </div>\n );\n}\n","/**\n * InitializationLoading Component\n *\n * Default loading display while Plyaz is initializing.\n * Can be overridden via the `loading` prop on PlyazProvider.\n */\n\n'use client';\n\nimport type { CSSProperties, ReactElement } from 'react';\nimport type { CoreInitializationLoadingProps as InitializationLoadingProps } from '@plyaz/types/core';\n\n/**\n * Default styles for the loading container\n */\nconst loadingContainerStyle: CSSProperties = {\n padding: '20px',\n fontFamily: 'system-ui, -apple-system, sans-serif',\n};\n\n/**\n * Default styles for the loading message\n */\nconst loadingMessageStyle: CSSProperties = {\n margin: 0,\n fontSize: '0.875rem',\n color: '#666',\n};\n\n/**\n * Renders an initialization loading state.\n *\n * @example\n * ```tsx\n * // Using default loading display\n * <InitializationLoading />\n *\n * // Using custom loading component\n * <InitializationLoading loading={<Skeleton />} />\n * ```\n */\nexport function InitializationLoading({ loading }: InitializationLoadingProps): ReactElement {\n if (loading) {\n return <>{loading}</>;\n }\n\n return (\n <div style={loadingContainerStyle}>\n <p style={loadingMessageStyle}>Initializing...</p>\n </div>\n );\n}\n","/* eslint-disable no-undef */\n/**\n * Memory Cache Strategy\n *\n * In-memory cache implementation for fast local caching.\n * This will be moved to @plyaz/core when the package structure is finalized.\n *\n * @fileoverview Memory cache strategy implementation\n * @version 1.0.0\n */\n\nimport type { CacheStrategy, CacheEntry, CacheStats, MemoryCacheConfig } from '@plyaz/types';\nimport { CACHE_MAX_SIZE_DEFAULT, CACHE_CLEANUP_INTERVAL_DEFAULT } from '@plyaz/config';\n\n/**\n * In-memory cache strategy implementation.\n * Provides fast caching for single-instance applications.\n *\n * @class MemoryCacheStrategy\n * @implements {CacheStrategy}\n *\n * @example\n * ```typescript\n * const cache = new MemoryCacheStrategy({\n * maxEntries: 500,\n * cleanupInterval: 30000\n * });\n *\n * await cache.set('key', entry);\n * const cached = await cache.get('key');\n * ```\n */\nexport class MemoryCacheStrategy implements CacheStrategy {\n private cache = new Map<string, CacheEntry>();\n private accessOrder = new Map<string, number>();\n private stats = {\n hits: 0,\n misses: 0,\n sets: 0,\n deletes: 0,\n };\n private cleanupTimer?: NodeJS.Timeout;\n private readonly maxSize: number;\n private readonly cleanupInterval: number;\n private readonly onEvict?: (key: string, entry: CacheEntry) => void;\n\n /**\n * Creates a new memory cache strategy.\n *\n * @param config - Memory cache configuration\n */\n constructor(config: MemoryCacheConfig = {}) {\n const defaultConfig = {\n maxEntries: CACHE_MAX_SIZE_DEFAULT,\n cleanupInterval: CACHE_CLEANUP_INTERVAL_DEFAULT,\n };\n\n this.maxSize = config.maxSize ?? config.maxEntries ?? defaultConfig.maxEntries;\n this.cleanupInterval = config.cleanupInterval ?? defaultConfig.cleanupInterval;\n this.onEvict = config.onEvict;\n\n // Start cleanup timer\n this.startCleanup();\n }\n\n /**\n * Stores a cache entry in memory.\n *\n * @param key - Cache key\n * @param entry - Cache entry to store\n * @returns Promise that resolves when entry is stored\n */\n async set<T>(key: string, entry: CacheEntry<T>): Promise<void> {\n // If maxSize is 0, don't store anything\n if (this.maxSize === 0) {\n this.stats.sets++;\n return;\n }\n\n // Check if we need to evict entries to make room\n // Only evict if this is a new key and we're at capacity\n if (!this.cache.has(key) && this.cache.size >= this.maxSize) {\n this.evictOldestEntries();\n }\n\n this.cache.set(key, entry);\n this.accessOrder.set(key, Date.now());\n this.stats.sets++;\n }\n\n /**\n * Retrieves a cache entry from memory.\n *\n * @param key - Cache key\n * @returns Promise that resolves to cache entry or null if not found\n */\n async get<T>(key: string): Promise<CacheEntry<T> | null> {\n const entry = this.cache.get(key) as CacheEntry<T> | undefined;\n\n if (!entry) {\n this.stats.misses++;\n return null;\n }\n\n // Update access time for LRU\n this.accessOrder.set(key, Date.now());\n this.stats.hits++;\n return entry;\n }\n\n /**\n * Removes a cache entry from memory.\n *\n * @param key - Cache key to remove\n * @returns Promise that resolves when entry is removed\n */\n async delete(key: string): Promise<void> {\n this.cache.delete(key);\n this.accessOrder.delete(key);\n this.stats.deletes++;\n }\n\n /**\n * Clears all cache entries from memory.\n *\n * @returns Promise that resolves when cache is cleared\n */\n async clear(): Promise<void> {\n this.cache.clear();\n this.accessOrder.clear();\n this.stats.hits = 0;\n this.stats.misses = 0;\n this.stats.sets = 0;\n this.stats.deletes = 0;\n }\n\n /**\n * Gets cache statistics.\n *\n * @returns Promise that resolves to cache statistics\n */\n async getStats(): Promise<CacheStats> {\n const totalRequests = this.stats.hits + this.stats.misses;\n const hitRatio = totalRequests > 0 ? this.stats.hits / totalRequests : 0;\n\n return {\n hits: this.stats.hits,\n misses: this.stats.misses,\n sets: this.stats.sets,\n deletes: this.stats.deletes,\n size: this.cache.size,\n hitRatio,\n };\n }\n\n /**\n * Disposes of the memory cache and cleans up resources.\n *\n * @returns Promise that resolves when cleanup is complete\n */\n async dispose(): Promise<void> {\n if (this.cleanupTimer) {\n clearInterval(this.cleanupTimer);\n this.cleanupTimer = undefined;\n }\n\n await this.clear();\n }\n\n /**\n * Starts the periodic cleanup of expired entries.\n *\n * @private\n */\n private startCleanup(): void {\n this.cleanupTimer = setInterval(() => {\n this.cleanupExpiredEntries();\n }, this.cleanupInterval);\n\n if (this.cleanupTimer && typeof this.cleanupTimer.unref === 'function') {\n this.cleanupTimer.unref();\n }\n }\n\n /**\n * Removes expired entries from the cache.\n *\n * @private\n */\n private cleanupExpiredEntries(): void {\n const now = Date.now();\n const expiredKeys: string[] = [];\n\n for (const [key, entry] of Array.from(this.cache.entries())) {\n if (now > entry.expiresAt) {\n expiredKeys.push(key);\n }\n }\n\n for (const key of expiredKeys) {\n const entry = this.cache.get(key);\n this.cache.delete(key);\n this.accessOrder.delete(key);\n if (entry && this.onEvict) {\n this.onEvict(key, entry);\n }\n }\n }\n\n /**\n * Evicts the oldest entries when cache is full.\n * Uses LRU-like eviction by removing the oldest entries by creation time.\n *\n * @private\n */\n private evictOldestEntries(): void {\n if (this.maxSize === 0) {\n // If maxSize is 0, don't store anything\n this.cache.clear();\n this.accessOrder.clear();\n return;\n }\n\n const EVICTION_PERCENTAGE = 0.1; // Evict 10% of entries\n const entriesToEvict = Math.max(1, Math.ceil(this.maxSize * EVICTION_PERCENTAGE));\n\n // Sort by access time (LRU)\n const sortedEntries = Array.from(this.accessOrder.entries())\n .sort(([, timeA], [, timeB]) => timeA - timeB)\n .slice(0, entriesToEvict);\n\n for (const [key] of sortedEntries) {\n const entry = this.cache.get(key);\n this.cache.delete(key);\n this.accessOrder.delete(key);\n if (entry && this.onEvict) {\n this.onEvict(key, entry);\n }\n }\n }\n}\n","/**\n * Cache Manager - Core Caching Layer\n *\n * Main cache orchestration service that manages different caching strategies.\n * This will be moved to @plyaz/core when the package structure is finalized.\n *\n * @fileoverview Core caching infrastructure\n * @version 1.0.0\n */\n\nimport { TIME_CONSTANTS } from '@plyaz/config';\nimport { ERROR_CODES } from '@plyaz/types';\nimport { CorePackageError } from '@plyaz/errors';\nimport { MemoryCacheStrategy } from './strategies/memory';\nimport type { CacheStrategy, CacheConfig, CacheEntry, CacheManagerStats } from '@plyaz/types';\n\n/**\n * Cache manager that orchestrates different caching strategies.\n * Provides a unified interface for caching across the application.\n *\n * @class CacheManager\n *\n * @example\n * ```typescript\n * const cache = new CacheManager({\n * isEnabled: true,\n * ttl: 300,\n * strategy: 'redis',\n * redisConfig: { url: 'redis://localhost:6379' }\n * });\n *\n * await cache.set('key', value);\n * const cached = await cache.get('key');\n * ```\n */\nexport class CacheManager {\n private strategy: CacheStrategy | null = null;\n private strategyPromise: Promise<CacheStrategy> | null = null;\n\n /**\n * Creates a new cache manager with the specified configuration.\n *\n * @param config - Cache configuration\n */\n constructor(private config: CacheConfig) {\n // Strategy is created lazily on first use\n }\n\n /**\n * Gets the cache strategy, initializing it if needed.\n * Uses lazy initialization to support dynamic imports for Redis.\n */\n private async getStrategy(): Promise<CacheStrategy> {\n if (this.strategy) return this.strategy;\n if (this.strategyPromise) return this.strategyPromise;\n\n this.strategyPromise = this.createStrategy(this.config);\n this.strategy = await this.strategyPromise;\n return this.strategy;\n }\n\n /**\n * Stores a value in the cache.\n *\n * @template T - Type of the value to cache\n * @param key - Cache key\n * @param value - Value to cache\n * @param ttl - Optional TTL override in seconds\n * @returns Promise that resolves when value is cached\n */\n async set<T>(key: string, value: T, ttl?: number): Promise<void> {\n if (!this.config.isEnabled) return;\n\n const finalTtl = ttl ?? this.config.ttl;\n const entry: CacheEntry<T> = {\n data: value,\n expiresAt: Date.now() + finalTtl * TIME_CONSTANTS.MILLISECONDS_PER_SECOND,\n createdAt: Date.now(),\n };\n\n const strategy = await this.getStrategy();\n await strategy.set(key, entry);\n }\n\n /**\n * Retrieves a value from the cache.\n *\n * @template T - Expected type of the cached value\n * @param key - Cache key\n * @returns Promise that resolves to cached value or null if not found/expired\n */\n async get<T>(key: string): Promise<T | null> {\n if (!this.config.isEnabled) return null;\n\n const strategy = await this.getStrategy();\n const entry = await strategy.get<T>(key);\n if (!entry) return null;\n\n // Check if entry has expired\n if (Date.now() > entry.expiresAt) {\n await strategy.delete(key);\n return null;\n }\n\n return entry.data;\n }\n\n /**\n * Removes a value from the cache.\n *\n * @param key - Cache key to remove\n * @returns Promise that resolves when value is removed\n */\n async delete(key: string): Promise<void> {\n if (!this.config.isEnabled) return;\n const strategy = await this.getStrategy();\n await strategy.delete(key);\n }\n\n /**\n * Clears all cached values.\n *\n * @returns Promise that resolves when cache is cleared\n */\n async clear(): Promise<void> {\n if (!this.config.isEnabled) return;\n const strategy = await this.getStrategy();\n await strategy.clear();\n }\n\n /**\n * Checks if a key exists in the cache.\n *\n * @param key - Cache key to check\n * @returns Promise that resolves to true if key exists and is not expired\n */\n async has(key: string): Promise<boolean> {\n if (!this.config.isEnabled) return false;\n\n const strategy = await this.getStrategy();\n const entry = await strategy.get(key);\n if (!entry) return false;\n\n // Check if entry has expired\n if (Date.now() > entry.expiresAt) {\n await strategy.delete(key);\n return false;\n }\n\n return true;\n }\n\n /**\n * Gets cache statistics.\n *\n * @returns Promise that resolves to cache statistics\n */\n async getStats(): Promise<CacheManagerStats> {\n const strategy = await this.getStrategy();\n return strategy.getStats();\n }\n\n /**\n * Creates the appropriate cache strategy based on configuration.\n * Uses dynamic import for Redis to avoid bundling ioredis in frontend.\n *\n * @private\n * @param config - Cache configuration\n * @returns Promise that resolves to cache strategy instance\n */\n private async createStrategy(config: CacheConfig): Promise<CacheStrategy> {\n switch (config.strategy) {\n case 'redis': {\n if (!config.redisConfig) {\n throw new CorePackageError(\n 'Redis configuration is required for Redis cache strategy',\n ERROR_CODES.CLIENT_INVALID_CONFIG\n );\n }\n // Dynamic import to avoid bundling ioredis in frontend builds\n const { RedisCacheStrategy } = await import('./strategies/redis');\n return new RedisCacheStrategy(config.redisConfig);\n }\n\n case 'memory':\n default:\n return new MemoryCacheStrategy(config.memoryConfig);\n }\n }\n\n /**\n * Disposes of the cache manager and cleans up resources.\n *\n * @returns Promise that resolves when cleanup is complete\n */\n async dispose(): Promise<void> {\n if (this.strategy) {\n await this.strategy.dispose?.();\n }\n }\n}\n\nexport { CacheKeyBuilder } from './CacheKeyBuilder';\n","/**\n * Example Mapper\n *\n * Demonstrates extending BaseMapper for a domain entity.\n * Uses types from @plyaz/types/examples.\n *\n * Note: Validation is handled by ExampleValidator, not here.\n */\n\nimport { BaseMapper, trimString } from '../../base';\nimport type {\n ExampleEntity,\n ExampleResponseDTO,\n ExampleStoreItem,\n CreateExampleDTO,\n UpdateExampleDTO,\n PatchExampleDTO,\n QueryExampleDTO,\n} from '@plyaz/types/examples';\n\n/** Default pagination values */\nconst PAGINATION_DEFAULTS = {\n PAGE: 1,\n LIMIT: 20,\n} as const;\n\n/**\n * Example Mapper implementation\n *\n * Supports:\n * - toDomain: API response → Domain\n * - toCreateDTO: Domain → POST body\n * - toPatchDTO: Domain → PATCH body\n * - toStoreState: Domain → Zustand store\n */\nclass ExampleMapperClass extends BaseMapper<\n ExampleEntity,\n ExampleResponseDTO,\n CreateExampleDTO,\n UpdateExampleDTO,\n PatchExampleDTO,\n QueryExampleDTO,\n ExampleStoreItem\n> {\n /**\n * API DTO → Domain Model\n */\n toDomain(dto: ExampleResponseDTO): ExampleEntity {\n return {\n id: dto.id,\n name: dto.name,\n description: dto.description,\n ownerId: dto.owner_id,\n status: dto.status,\n amount: dto.amount,\n isVisible: dto.is_visible,\n createdAt: new Date(dto.created_at),\n updatedAt: new Date(dto.updated_at),\n\n // Computed properties\n isActive: dto.status === 'active',\n hasDescription: () => Boolean(dto.description),\n };\n }\n\n /**\n * Domain data → Create DTO (POST body)\n */\n toCreateDTO(data: Partial<ExampleEntity>): CreateExampleDTO {\n return {\n name: trimString(data.name) ?? '',\n amount: data.amount ?? 0,\n description: data.description ?? '',\n is_visible: data.isVisible ?? true,\n };\n }\n\n /**\n * Domain data → Update DTO (PUT body - full)\n */\n toUpdateDTO(data: Partial<ExampleEntity>): UpdateExampleDTO {\n return this.toCreateDTO(data);\n }\n\n /**\n * Domain data → Patch DTO (PATCH body - partial)\n */\n toPatchDTO(data: Partial<ExampleEntity>): PatchExampleDTO {\n const dto: PatchExampleDTO = {};\n\n if (data.name !== undefined) {\n dto.name = trimString(data.name);\n }\n if (data.amount !== undefined) {\n dto.amount = data.amount;\n }\n if (data.description !== undefined) {\n dto.description = data.description ?? undefined;\n }\n if (data.isVisible !== undefined) {\n dto.is_visible = data.isVisible;\n }\n\n return dto;\n }\n\n /**\n * Filters → Query params DTO (GET)\n */\n toQueryDTO(filters: Partial<QueryExampleDTO>): QueryExampleDTO {\n return {\n page: filters.page ?? PAGINATION_DEFAULTS.PAGE,\n limit: filters.limit ?? PAGINATION_DEFAULTS.LIMIT,\n sort_by: filters.sort_by ?? 'created_at',\n sort_order: filters.sort_order ?? 'desc',\n status: filters.status,\n is_visible: filters.is_visible,\n min_amount: filters.min_amount,\n max_amount: filters.max_amount,\n search: filters.search,\n };\n }\n\n /**\n * Domain → Store state (serializable)\n */\n toStoreState(domain: ExampleEntity): ExampleStoreItem {\n return {\n id: domain.id,\n name: domain.name,\n description: domain.description,\n ownerId: domain.ownerId,\n status: domain.status,\n amount: domain.amount,\n isVisible: domain.isVisible,\n createdAt: domain.createdAt.toISOString(),\n updatedAt: domain.updatedAt.toISOString(),\n isActive: domain.isActive,\n isSelected: false,\n };\n }\n\n /**\n * Store state → Domain (restore computed props)\n */\n fromStoreState(state: ExampleStoreItem): ExampleEntity {\n return {\n id: state.id,\n name: state.name,\n description: state.description,\n ownerId: state.ownerId,\n status: state.status,\n amount: state.amount,\n isVisible: state.isVisible,\n createdAt: new Date(state.createdAt),\n updatedAt: new Date(state.updatedAt),\n isActive: state.isActive,\n hasDescription: () => Boolean(state.description),\n };\n }\n\n /**\n * Database row → Response DTO\n * Maps repository output to API response format\n */\n toResponseDTO(row: {\n id: string;\n name: string;\n description: string | null;\n amount: number;\n owner_id: string;\n status: string;\n is_visible: boolean;\n created_at: string;\n updated_at: string;\n }): ExampleResponseDTO {\n return {\n id: row.id,\n name: row.name,\n description: row.description,\n amount: row.amount,\n owner_id: row.owner_id,\n status: row.status as 'draft' | 'active' | 'archived',\n is_visible: row.is_visible,\n created_at: row.created_at,\n updated_at: row.updated_at,\n };\n }\n}\n\n// Export class for BaseDomainService.MapperClass\nexport { ExampleMapperClass };\n\n// Singleton instance (for direct usage)\nexport const ExampleMapper = new ExampleMapperClass();\n","/**\n * Example Frontend Service\n *\n * Demonstrates extending BaseFrontendDomainService which provides:\n * - Automatic CRUD operations (fetchAll, fetchById, create, update, delete)\n * - Store integration (Zustand-compatible)\n * - Error handling with @plyaz/errors\n * - Event emission and subscription\n * - Loading/error state management\n * - Automatic DTO validation and mapping via validator and mapper\n *\n * This service only needs to:\n * - Set eventPrefix for event emission\n * - Add any custom domain methods (e.g., polling)\n * - Override lifecycle hooks if needed\n *\n * All standard CRUD operations are inherited:\n * - fetchAll(query?) - Inherited from BaseFrontendDomainService\n * - fetchById(id) - Inherited from BaseFrontendDomainService\n * - create(data) - Inherited from BaseFrontendDomainService\n * - update(id, data) - Inherited from BaseFrontendDomainService\n * - delete(id) - Inherited from BaseFrontendDomainService\n *\n * Runtime: Frontend only (Browser/React/Next.js)\n *\n * @example\n * ```tsx\n * // Service automatically gets stores via ServiceRegistry injection\n * const service = await ServiceRegistry.getAsync<FrontendExampleDomainService>('example');\n *\n * // Or create directly (stores injected if configured)\n * const service = new FrontendExampleDomainService({\n * enabled: true,\n * apiBasePath: '/api/examples',\n * });\n *\n * // Use inherited CRUD methods\n * const items = await service.fetchAll();\n * const activeItems = await service.fetchAll({ status: 'active' });\n * const item = await service.create({ name: 'Test', amount: 100 });\n * const updated = await service.update(item.id, { amount: 200 });\n * await service.delete(item.id);\n * ```\n */\n\nimport { STORE_KEYS } from '@plyaz/store';\nimport { SERVICE_KEYS } from '@plyaz/types/core';\nimport type {\n ExampleEntity,\n ExampleResponseDTO,\n CreateExampleDTO,\n PatchExampleDTO,\n QueryExampleDTO,\n ExampleStoreItem,\n} from '@plyaz/types/examples';\nimport { BaseFrontendDomainService } from '../base/BaseFrontendDomainService';\nimport { CoreEventManager } from '../../events/CoreEventManager';\nimport { ExampleMapperClass } from './mappers/ExampleMapper';\n\n// ─────────────────────────────────────────────────────────────────────────────\n// Constants\n// ─────────────────────────────────────────────────────────────────────────────\n\n/** Default polling interval in milliseconds (30 seconds) */\nconst DEFAULT_POLLING_INTERVAL_MS = 30000;\n\n// ─────────────────────────────────────────────────────────────────────────────\n// Store/Config/Event Types - Re-exported from @plyaz/types\n// ─────────────────────────────────────────────────────────────────────────────\n\n// Re-export types from @plyaz/types\nexport type {\n ExampleFrontendStoreData,\n ExampleFrontendStoreSlice,\n ExampleFrontendServiceConfig,\n ExampleFrontendEventType,\n} from '@plyaz/types/examples';\n\n// Import for local use\nimport type {\n ExampleFrontendStoreData,\n ExampleFrontendStoreSlice,\n ExampleFrontendServiceConfig as _ExampleFrontendServiceConfig,\n ExampleFrontendEventType,\n} from '@plyaz/types/examples';\nimport type { CoreServiceCreateOptions } from '@plyaz/types/core';\nimport type { CoreBaseValidatorInstance } from '@plyaz/types/core';\n\n// ─────────────────────────────────────────────────────────────────────────────\n// Service\n// ─────────────────────────────────────────────────────────────────────────────\n\n/**\n * Example Frontend Service\n *\n * Extends BaseFrontendDomainService with all generic types:\n * - TConfig: ExampleFrontendServiceConfig\n * - TStore: ExampleFrontendStoreSlice\n * - TData: ExampleFrontendStoreData\n * - TEntity: ExampleEntity\n * - TResponseDTO: ExampleResponseDTO\n * - TCreateDTO: CreateExampleDTO\n * - TPatchDTO: PatchExampleDTO\n * - TQueryDTO: QueryExampleDTO\n * - TStoreState: ExampleStoreItem\n * - TMapper: ExampleMapper\n *\n * All CRUD methods are inherited from base class - no need to implement!\n */\nexport class FrontendExampleDomainService extends BaseFrontendDomainService<\n _ExampleFrontendServiceConfig,\n ExampleFrontendStoreSlice,\n ExampleFrontendStoreData,\n ExampleEntity,\n ExampleResponseDTO,\n CreateExampleDTO,\n PatchExampleDTO,\n QueryExampleDTO,\n ExampleStoreItem,\n InstanceType<typeof ExampleMapperClass>,\n CoreBaseValidatorInstance,\n void // TDeleteResult - delete returns void (no response body)\n> {\n // ─────────────────────────────────────────────────────────────────────────\n // Required Properties\n // ─────────────────────────────────────────────────────────────────────────\n\n /**\n * Event prefix for all events emitted by this service\n * Required by BaseFrontendDomainService\n */\n protected eventPrefix = 'example';\n\n /**\n * Primary store key - the store this service can mutate\n */\n protected primaryStoreKey = STORE_KEYS.EXAMPLE;\n\n /**\n * Read-only store keys - inherits error and featureFlags from base\n * No need to redeclare them - they're always included by default\n */\n // protected readStoreKeys = [...super.readStoreKeys]; // Already includes ERROR, FEATURE_FLAGS\n\n // ─────────────────────────────────────────────────────────────────────────\n // Domain-Specific Properties\n // ─────────────────────────────────────────────────────────────────────────\n\n private pollingTimer: ReturnType<typeof setInterval> | null = null;\n\n // ─────────────────────────────────────────────────────────────────────────\n // Static: Service Registry Interface\n // ─────────────────────────────────────────────────────────────────────────\n\n static readonly serviceKey = SERVICE_KEYS.EXAMPLE_FRONTEND;\n\n /**\n * Factory method for ServiceRegistry auto-initialization.\n * Creates and initializes the service instance.\n */\n static async create(\n config: _ExampleFrontendServiceConfig,\n options?: CoreServiceCreateOptions\n ): Promise<FrontendExampleDomainService> {\n const mergedConfig: _ExampleFrontendServiceConfig = {\n ...config,\n apiBasePath: config.apiBasePath ?? options?.apiClient?.options?.baseURL ?? '/api/examples',\n };\n\n const service = new FrontendExampleDomainService(mergedConfig, options);\n\n if (mergedConfig.autoFetch) {\n await service.fetchAll();\n }\n\n return service;\n }\n\n // ─────────────────────────────────────────────────────────────────────────\n // Constructor\n // ─────────────────────────────────────────────────────────────────────────\n\n constructor(config: _ExampleFrontendServiceConfig = {}, options?: CoreServiceCreateOptions) {\n const apiBasePath = config.apiBasePath ?? '/api/examples';\n\n super({\n serviceName: 'ExampleFrontendService',\n supportedRuntimes: ['frontend'],\n // API client config - uses injected options or creates from apiBasePath\n apiClientConfig: options?.apiClient?.options ?? { baseURL: apiBasePath },\n serviceConfig: {\n enabled: true,\n apiBasePath,\n autoFetch: false,\n pollingInterval: 0,\n ...config,\n // Fetchers - using apiClient directly for testing/example purposes\n // In production, these would be imported from @plyaz/api services\n // Note: Validation is handled by validator class, mapping by mapper class\n fetchers: {\n fetchAll: async query => {\n // Pass query parameters to the API endpoint\n return this.apiClient.get<ExampleResponseDTO[]>(apiBasePath, {\n params: query,\n }) as ReturnType<typeof this.apiClient.get<ExampleResponseDTO[]>>;\n },\n fetchById: async id => {\n return this.apiClient.get<ExampleResponseDTO>(`${apiBasePath}/${id}`) as ReturnType<\n typeof this.apiClient.get<ExampleResponseDTO>\n >;\n },\n create: async data => {\n return this.apiClient.post<ExampleResponseDTO>(apiBasePath, data) as ReturnType<\n typeof this.apiClient.post<ExampleResponseDTO>\n >;\n },\n update: async payload => {\n const { id, data } = payload!; // Validated & mapped by base class\n return this.apiClient.patch<ExampleResponseDTO>(\n `${apiBasePath}/${id}`,\n data\n ) as ReturnType<typeof this.apiClient.patch<ExampleResponseDTO>>;\n },\n delete: async id => {\n return this.apiClient.delete(`${apiBasePath}/${id}`);\n },\n },\n // Store handlers - customize how data syncs to store\n // Use domain-specific methods or call other stores:\n // storeHandlers: {\n // setData: (store, data) => {\n // store.setData(data);\n // // Can also call domain-specific methods or other stores\n // // store.selectItem(data.selectedId);\n // // store.selectItem(data.selectedId);\n // },\n // updateData: (store, data) => store.updateData(data),\n // setLoading: (store, isLoading) => store.setLoading(isLoading),\n // addData: (store, item) => store.addData(item),\n // updateDataById: (store, id, item) => store.updateDataById(id, item),\n // removeData: (store, id) => store.removeData(id),\n // },\n // Or disable store sync: storeHandlers: { disabled: true }\n },\n mapperClass: ExampleMapperClass,\n injected: options?.injected,\n });\n\n // Start polling if configured\n if (this.config.pollingInterval && this.config.pollingInterval > 0) {\n this.startPolling();\n }\n }\n\n // ─────────────────────────────────────────────────────────────────────────\n // Abstract Implementations (Required by BaseDomainService)\n // ─────────────────────────────────────────────────────────────────────────\n\n isAvailable(): boolean {\n return this.isServiceEnabled && typeof window !== 'undefined';\n }\n\n dispose(): void {\n this.stopPolling();\n this.logInfo('Service disposed');\n }\n\n // ─────────────────────────────────────────────────────────────────────────\n // Lifecycle Hooks (Optional Override Examples)\n // ─────────────────────────────────────────────────────────────────────────\n\n /**\n * After fetchAll - emit event (store sync handled automatically)\n * Note: Base class automatically calls syncToStores() which uses storeHandlers\n */\n protected override async afterFetchAll(entities: ExampleEntity[]): Promise<void> {\n // Store sync happens automatically via base class + storeHandlers\n // Just emit domain-specific event\n CoreEventManager.emit('example:store:synced', { items: entities });\n }\n\n // ─────────────────────────────────────────────────────────────────────────\n // Optional: Manual Store Updates (Alternative to storeHandlers)\n // ─────────────────────────────────────────────────────────────────────────\n //\n // Uncomment these for fine-grained control over store updates:\n //\n // protected override async afterCreate(entity: ExampleEntity): Promise<void> {\n // // Manual optimistic update for immediate UI feedback\n // this.primaryStore.addItem?.(entity);\n // }\n //\n // protected override async afterUpdate(id: string, entity: ExampleEntity): Promise<void> {\n // // Targeted update using domain-specific method\n // this.primaryStore.updateItem?.(id, entity);\n // }\n //\n // protected override async afterDelete<TInput>(id: TInput): Promise<void> {\n // // Remove from store using domain-specific method\n // this.primaryStore.removeItem?.(String(id));\n // }\n\n // ─────────────────────────────────────────────────────────────────────────\n // Custom Domain Methods\n // ─────────────────────────────────────────────────────────────────────────\n\n /**\n * Subscribe to service events\n *\n * @example\n * ```tsx\n * const unsubscribe = service.on('example:created', (data) => {\n * console.log('Item created:', data.entity);\n * });\n *\n * // Later: cleanup\n * unsubscribe();\n * ```\n */\n on(event: ExampleFrontendEventType, handler: (data: unknown) => void): () => void {\n return CoreEventManager.on(event, handler);\n }\n\n // ─────────────────────────────────────────────────────────────────────────\n // Polling (Domain-Specific Feature)\n // ─────────────────────────────────────────────────────────────────────────\n\n /**\n * Start polling for updates\n * Domain-specific feature - not part of base class\n */\n startPolling(): void {\n if (this.pollingTimer) return;\n\n const interval = this.config.pollingInterval ?? DEFAULT_POLLING_INTERVAL_MS;\n this.pollingTimer = setInterval(() => {\n this.fetchAll().catch(error => {\n this.logError('Polling fetch failed', { error });\n });\n }, interval);\n\n this.logDebug('Polling started', { interval });\n }\n\n /**\n * Stop polling\n */\n stopPolling(): void {\n if (this.pollingTimer) {\n clearInterval(this.pollingTimer);\n this.pollingTimer = null;\n this.logDebug('Polling stopped');\n }\n }\n\n // ─────────────────────────────────────────────────────────────────────────\n // Demo Methods - fetchAll() with Query Examples\n // ─────────────────────────────────────────────────────────────────────────\n\n /**\n * Demo: Fetch all examples with optional filters\n * Demonstrates the fetchAll() method with typed query parameters\n *\n * @param filters - Optional query filters (status, pagination, sorting)\n * @returns Promise resolving to array of ExampleEntity\n *\n * @example\n * ```typescript\n * // Fetch all active examples\n * const activeExamples = await service.getExamples({ status: 'active' });\n *\n * // Fetch archived examples with pagination\n * const archivedExamples = await service.getExamples({\n * status: 'archived',\n * page: 2,\n * limit: 10\n * });\n *\n * // Fetch all examples sorted by name\n * const sortedExamples = await service.getExamples({\n * sort_by: 'name',\n * sort_order: 'asc'\n * });\n * ```\n */\n async getExamples(filters?: QueryExampleDTO): Promise<ExampleEntity[]> {\n return this.fetchAll(filters); // Properly typed!\n }\n\n /**\n * Demo: Fetch active examples only\n * Convenience method demonstrating filtering\n */\n async getActiveExamples(): Promise<ExampleEntity[]> {\n return this.fetchAll({ status: 'active' });\n }\n\n /**\n * Demo: Fetch draft examples only\n * Convenience method demonstrating filtering\n */\n async getDraftExamples(): Promise<ExampleEntity[]> {\n return this.fetchAll({ status: 'draft' });\n }\n\n /**\n * Demo: Fetch archived examples only\n * Convenience method demonstrating filtering\n */\n async getArchivedExamples(): Promise<ExampleEntity[]> {\n return this.fetchAll({ status: 'archived' });\n }\n\n // ─────────────────────────────────────────────────────────────────────────\n // NOTE: CRUD Methods Are Inherited from BaseFrontendDomainService\n // ─────────────────────────────────────────────────────────────────────────\n //\n // The following methods are available but NOT implemented here:\n // - fetchAll(query?: QueryExampleDTO): Promise<ExampleEntity[]>\n // - fetchById(id: string): Promise<ExampleEntity | null>\n // - create(data: unknown): Promise<ExampleEntity>\n // - update(id: string, data: unknown): Promise<ExampleEntity>\n // - delete(id: string): Promise<void>\n //\n // All API calls → validator → mapper → store sync → events are handled automatically!\n // All events are emitted automatically with 'example:' prefix!\n // ─────────────────────────────────────────────────────────────────────────\n}\n","/**\n * Feature Flag Context Utilities\n *\n * Utilities for building, validating, and manipulating feature flag contexts.\n *\n * @fileoverview Feature flag context utilities\n * @version 1.0.0\n */\n\nimport type { FeatureFlagContext } from '@plyaz/types';\nimport { ISO_STANDARDS } from '@plyaz/config';\n\n/**\n * Builder class for creating feature flag evaluation contexts.\n * Provides a fluent interface for setting context properties.\n *\n * @class FeatureFlagContextBuilder\n *\n * @example\n * ```typescript\n * const context = new FeatureFlagContextBuilder()\n * .setUserId('user123')\n * .setUserRole('premium')\n * .setEnvironment('production')\n * .setPlatform('web')\n * .setCustom({ subscription: 'premium', betaTester: true })\n * .build();\n * ```\n */\nexport class FeatureFlagContextBuilder {\n private context: Partial<FeatureFlagContext> = {};\n\n /**\n * Sets the user ID in the context.\n *\n * @param userId - User identifier\n * @returns Builder instance for chaining\n */\n setUserId(userId: string): this {\n this.context.userId = userId;\n return this;\n }\n\n /**\n * Sets the user email in the context.\n *\n * @param userEmail - User email address\n * @returns Builder instance for chaining\n */\n setUserEmail(userEmail: string): this {\n this.context.userEmail = userEmail;\n return this;\n }\n\n /**\n * Sets the user role in the context.\n *\n * @param userRole - User role or permission level\n * @returns Builder instance for chaining\n */\n setUserRole(userRole: string): this {\n this.context.userRole = userRole;\n return this;\n }\n\n /**\n * Sets the country in the context.\n *\n * @param country - Country code (ISO 3166-1 alpha-2)\n * @returns Builder instance for chaining\n */\n setCountry(country: string): this {\n this.context.country = country;\n return this;\n }\n\n /**\n * Sets the platform in the context.\n *\n * @param platform - Platform type\n * @returns Builder instance for chaining\n */\n setPlatform(platform: 'web' | 'mobile' | 'desktop'): this {\n this.context.platform = platform;\n return this;\n }\n\n /**\n * Sets the version in the context.\n *\n * @param version - Application version\n * @returns Builder instance for chaining\n */\n setVersion(version: string): this {\n this.context.version = version;\n return this;\n }\n\n /**\n * Sets the environment in the context.\n *\n * @param environment - Current environment\n * @returns Builder instance for chaining\n */\n setEnvironment(environment: 'development' | 'staging' | 'production'): this {\n this.context.environment = environment;\n return this;\n }\n\n /**\n * Sets custom context data.\n *\n * @param custom - Custom context properties\n * @returns Builder instance for chaining\n */\n setCustom(custom: Record<string, unknown>): this {\n this.context.custom = { ...this.context.custom, ...custom };\n return this;\n }\n\n /**\n * Adds a single custom property to the context.\n *\n * @param key - Custom property key\n * @param value - Custom property value\n * @returns Builder instance for chaining\n */\n addCustomProperty(key: string, value: unknown): this {\n this.context.custom ??= {};\n this.context.custom[key] = value;\n return this;\n }\n\n /**\n * Builds the final context object.\n * Validates required fields and returns the context.\n *\n * @returns Complete feature flag context\n * @throws Error if required environment is not set\n */\n build(): FeatureFlagContext {\n return {\n environment: this.context.environment ?? 'development',\n userId: this.context.userId,\n userEmail: this.context.userEmail,\n userRole: this.context.userRole,\n country: this.context.country,\n platform: this.context.platform,\n version: this.context.version,\n custom: this.context.custom,\n } satisfies FeatureFlagContext;\n }\n\n /**\n * Clears all context data and resets the builder.\n *\n * @returns Builder instance for chaining\n */\n clear(): this {\n this.context = {};\n return this;\n }\n\n /**\n * Creates a copy of the current builder state.\n *\n * @returns New builder instance with copied context\n */\n clone(): FeatureFlagContextBuilder {\n const cloned = new FeatureFlagContextBuilder();\n cloned.context = { ...this.context };\n if (this.context.custom) {\n cloned.context.custom = { ...this.context.custom };\n }\n return cloned;\n }\n}\n\n/**\n * Context utilities for common scenarios.\n */\nexport const ContextUtils = {\n /**\n * Creates a basic context for anonymous users using the builder.\n *\n * @param environment - Target environment\n * @param platform - User platform\n * @returns Basic anonymous context\n */\n createAnonymousContext(\n environment: 'development' | 'staging' | 'production',\n platform: 'web' | 'mobile' | 'desktop' = 'web'\n ): FeatureFlagContext {\n return new FeatureFlagContextBuilder()\n .setEnvironment(environment)\n .setPlatform(platform)\n .build();\n },\n\n /**\n * Creates a context for authenticated users using the builder.\n *\n * @param params - User context parameters\n * @returns User context\n */\n createUserContext(params: {\n userId: string;\n environment: 'development' | 'staging' | 'production';\n userEmail?: string;\n userRole?: string;\n platform?: 'web' | 'mobile' | 'desktop';\n country?: string;\n version?: string;\n custom?: Record<string, unknown>;\n }): FeatureFlagContext {\n const builder = new FeatureFlagContextBuilder()\n .setUserId(params.userId)\n .setEnvironment(params.environment);\n\n if (params.userEmail) builder.setUserEmail(params.userEmail);\n if (params.userRole) builder.setUserRole(params.userRole);\n if (params.platform) builder.setPlatform(params.platform);\n if (params.country) builder.setCountry(params.country);\n if (params.version) builder.setVersion(params.version);\n if (params.custom) builder.setCustom(params.custom);\n\n return builder.build();\n },\n\n /**\n * Creates a testing context with minimal required fields.\n *\n * @param overrides - Optional context overrides\n * @returns Testing context\n */\n createTestingContext(overrides: Partial<FeatureFlagContext> = {}): FeatureFlagContext {\n return {\n environment: 'development',\n platform: 'web',\n ...overrides,\n };\n },\n\n /**\n * Validates if a context object is complete and valid.\n *\n * @param context - Context to validate\n * @returns Validation result\n */\n validateContext(context: Partial<FeatureFlagContext>): {\n isValid: boolean;\n errors: string[];\n } {\n const errors: string[] = [];\n\n if (!context.environment) {\n errors.push('Environment is required');\n } else if (!['development', 'staging', 'production'].includes(context.environment)) {\n errors.push('Environment must be development, staging, or production');\n }\n\n if (context.platform && !['web', 'mobile', 'desktop'].includes(context.platform)) {\n errors.push('Platform must be web, mobile, or desktop');\n }\n\n if (context.country && context.country.length !== ISO_STANDARDS.ISO_COUNTRY_CODE_LENGTH) {\n errors.push('Country must be a 2-letter ISO country code');\n }\n\n return {\n isValid: errors.length === 0,\n errors,\n };\n },\n\n /**\n * Merges multiple context objects, with later contexts taking precedence.\n *\n * @param contexts - Array of contexts to merge\n * @returns Merged context\n */\n mergeContexts(...contexts: Partial<FeatureFlagContext>[]): FeatureFlagContext {\n const merged = contexts.reduce((acc, context) => {\n const result = {\n ...acc,\n ...context,\n };\n\n // Only merge custom if either has it\n if (acc.custom || context.custom) {\n result.custom = {\n ...acc.custom,\n ...context.custom,\n };\n }\n\n return result;\n }, {} as Partial<FeatureFlagContext>);\n\n merged.environment ??= 'development';\n\n return merged as FeatureFlagContext;\n },\n\n /**\n * Extracts a specific field value from a context.\n *\n * @param field - Field name to extract\n * @param context - Context object\n * @returns Field value or undefined\n */\n getContextValue(field: string, context: FeatureFlagContext): unknown {\n const standardFields = {\n userId: (ctx: FeatureFlagContext) => ctx.userId,\n userEmail: (ctx: FeatureFlagContext) => ctx.userEmail,\n userRole: (ctx: FeatureFlagContext) => ctx.userRole,\n country: (ctx: FeatureFlagContext) => ctx.country,\n platform: (ctx: FeatureFlagContext) => ctx.platform,\n version: (ctx: FeatureFlagContext) => ctx.version,\n environment: (ctx: FeatureFlagContext) => ctx.environment,\n custom: (ctx: FeatureFlagContext) => ctx.custom,\n };\n\n if (field in standardFields) {\n return standardFields[field as keyof typeof standardFields](context);\n }\n\n return context.custom?.[field];\n },\n\n /**\n * Creates a context fingerprint for caching and consistency.\n *\n * @param context - Context to fingerprint\n * @returns String fingerprint\n */\n createFingerprint(context: FeatureFlagContext): string {\n const relevant = {\n userId: context.userId,\n userRole: context.userRole,\n environment: context.environment,\n platform: context.platform,\n country: context.country,\n version: context.version,\n custom: context.custom,\n };\n\n // Filter out undefined values and sort keys for consistency\n const filtered = Object.entries(relevant)\n .filter(([, value]) => value !== undefined)\n .sort(([a], [b]) => a.localeCompare(b))\n .reduce((acc, [key, value]) => ({ ...acc, [key]: value }), {});\n\n return JSON.stringify(filtered);\n },\n\n /**\n * Sanitizes a context by removing sensitive information.\n *\n * @param context - Context to sanitize\n * @param sensitiveFields - Fields to remove (default: ['userEmail'])\n * @returns Sanitized context\n */\n sanitizeContext(\n context: FeatureFlagContext,\n sensitiveFields: string[] = ['userEmail']\n ): FeatureFlagContext {\n const sanitized = { ...context };\n\n // Deep copy custom object if it exists\n if (context.custom) {\n sanitized.custom = { ...context.custom };\n }\n\n for (const field of sensitiveFields) {\n if (field in sanitized) {\n delete (sanitized as Record<string, unknown>)[field];\n }\n if (sanitized.custom && field in sanitized.custom) {\n delete sanitized.custom[field];\n }\n }\n\n return sanitized;\n },\n} as const;\n\n/**\n * Utility for creating feature flag context for backend applications.\n *\n * @param params - Context parameters\n * @returns Backend-optimized feature flag context\n */\nexport function createBackendContext(params: {\n userId?: string;\n userEmail?: string;\n environment: 'development' | 'staging' | 'production';\n userRole?: string;\n platform?: 'api' | 'worker' | 'cron';\n country?: string;\n version?: string;\n custom?: Record<string, unknown>;\n}): {\n environment: 'development' | 'staging' | 'production';\n userId?: string;\n userEmail?: string;\n userRole?: string;\n platform: 'api' | 'worker' | 'cron';\n country?: string;\n version?: string;\n custom?: Record<string, unknown>;\n} {\n return {\n environment: params.environment,\n userId: params.userId,\n userEmail: params.userEmail,\n userRole: params.userRole,\n platform: params.platform ?? 'api',\n country: params.country,\n version: params.version,\n custom: params.custom,\n };\n}\n\n/**\n * Utility for creating feature flag context for frontend applications.\n *\n * @param params - Context parameters\n * @returns Frontend-optimized feature flag context\n */\nexport function createFrontendContext(params: {\n userId?: string;\n userEmail?: string;\n environment: 'development' | 'staging' | 'production';\n userRole?: string;\n platform?: 'web' | 'mobile' | 'desktop';\n country?: string;\n version?: string;\n custom?: Record<string, unknown>;\n}): {\n environment: 'development' | 'staging' | 'production';\n userId?: string;\n userEmail?: string;\n userRole?: string;\n platform: 'web' | 'mobile' | 'desktop';\n country?: string;\n version?: string;\n custom?: Record<string, unknown>;\n} {\n return {\n environment: params.environment,\n userId: params.userId,\n userEmail: params.userEmail,\n userRole: params.userRole,\n platform: params.platform ?? 'web',\n country: params.country,\n version: params.version,\n custom: params.custom,\n };\n}\n","/**\n * Feature Flag Condition Utilities\n *\n * Utilities for evaluating feature flag conditions and rules.\n *\n * @fileoverview Condition evaluation utilities\n * @version 1.0.0\n */\n\nimport type { FeatureFlagCondition } from '@plyaz/types';\nimport { ERROR_CODES } from '@plyaz/types';\nimport { CorePackageError } from '@plyaz/errors';\n\n/**\n * Evaluates condition operator against context value.\n *\n * @param condition - The condition to evaluate\n * @param contextValue - The context value to check against\n * @returns true if the condition matches\n */\nexport function evaluateConditionOperator(\n condition: FeatureFlagCondition,\n contextValue: unknown\n): boolean {\n const { operator } = condition;\n\n if (isEqualityOperator(operator)) {\n return evaluateEqualityOperator(operator, contextValue, condition.value);\n }\n\n if (isStringOperator(operator)) {\n return evaluateStringOperator(operator, contextValue, condition.value);\n }\n\n if (isArrayOperator(operator)) {\n return evaluateArrayOperator(operator, condition.value, contextValue);\n }\n\n if (isNumericOperator(operator)) {\n return evaluateNumericOperator(operator, contextValue, condition.value);\n }\n\n return false;\n}\n\n/**\n * Checks if operator is equality-based.\n *\n * @param operator - The operator to check\n * @returns true if equality operator\n */\nexport function isEqualityOperator(operator: string): boolean {\n return operator === 'equals' || operator === 'not_equals';\n}\n\n/**\n * Checks if operator is string-based.\n *\n * @param operator - The operator to check\n * @returns true if string operator\n */\nexport function isStringOperator(operator: string): boolean {\n return operator === 'contains' || operator === 'not_contains';\n}\n\n/**\n * Checks if operator is array-based.\n *\n * @param operator - The operator to check\n * @returns true if array operator\n */\nexport function isArrayOperator(operator: string): boolean {\n return operator === 'in' || operator === 'not_in';\n}\n\n/**\n * Checks if operator is numeric-based.\n *\n * @param operator - The operator to check\n * @returns true if numeric operator\n */\nexport function isNumericOperator(operator: string): boolean {\n return operator === 'greater_than' || operator === 'less_than';\n}\n\n/**\n * Evaluates equality operators.\n *\n * @param operator - equals or not_equals\n * @param contextValue - Value from context\n * @param conditionValue - Value from condition\n * @returns Evaluation result\n */\nexport function evaluateEqualityOperator(\n operator: string,\n contextValue: unknown,\n conditionValue: unknown\n): boolean {\n const isEqual = contextValue === conditionValue;\n return operator === 'equals' ? isEqual : !isEqual;\n}\n\n/**\n * Evaluates string operators.\n *\n * @param operator - contains or not_contains\n * @param contextValue - Value from context\n * @param conditionValue - Value from condition\n * @returns Evaluation result\n */\nexport function evaluateStringOperator(\n operator: string,\n contextValue: unknown,\n conditionValue: unknown\n): boolean {\n // Handle string contains\n if (typeof contextValue === 'string' && typeof conditionValue === 'string') {\n const contains = contextValue.includes(conditionValue);\n return operator === 'contains' ? contains : !contains;\n }\n\n // Handle array contains\n if (Array.isArray(contextValue) && typeof conditionValue === 'string') {\n const contains = contextValue.includes(conditionValue);\n return operator === 'contains' ? contains : !contains;\n }\n\n // For not_contains, if neither string nor array match, return true\n return operator === 'not_contains';\n}\n\n/**\n * Evaluates array operators.\n *\n * @param operator - in or not_in\n * @param conditionValue - Array value from condition\n * @param contextValue - Value from context\n * @returns Evaluation result\n */\nexport function evaluateArrayOperator(\n operator: string,\n conditionValue: unknown,\n contextValue: unknown\n): boolean {\n if (!Array.isArray(conditionValue)) {\n // For not_in operator, if condition value is not an array, return true\n return operator === 'not_in';\n }\n\n const isIncluded = conditionValue.includes(contextValue);\n return operator === 'in' ? isIncluded : !isIncluded;\n}\n\n/**\n * Evaluates numeric operators.\n *\n * @param operator - greater_than or less_than\n * @param contextValue - Value from context\n * @param conditionValue - Value from condition\n * @returns Evaluation result\n */\nfunction compareValues<T>(operator: string, left: T, right: T): boolean {\n switch (operator) {\n case 'greater_than':\n return left > right;\n case 'less_than':\n return left < right;\n default:\n return false;\n }\n}\n\nexport function evaluateNumericOperator(\n operator: string,\n contextValue: unknown,\n conditionValue: unknown\n): boolean {\n // Try numeric comparison first\n const contextNum = Number(contextValue);\n const conditionNum = Number(conditionValue);\n\n if (!isNaN(contextNum) && !isNaN(conditionNum)) {\n return compareValues(operator, contextNum, conditionNum);\n }\n\n // Fall back to string comparison for non-numeric values\n if (typeof contextValue === 'string' && typeof conditionValue === 'string') {\n return compareValues(operator, contextValue, conditionValue);\n }\n\n return false;\n}\n\n/**\n * Condition evaluation utilities.\n */\nexport const ConditionUtils = {\n /**\n * Evaluates multiple conditions with AND logic.\n *\n * @param conditions - Array of conditions\n * @param contextValue - Context value getter function\n * @returns true if all conditions match\n */\n evaluateConditionsAnd: (\n conditions: FeatureFlagCondition[],\n contextValue: (field: string) => unknown\n ): boolean => {\n if (conditions.length === 0) return true;\n\n return conditions.every(condition => {\n const value = contextValue(condition.field);\n if (value === undefined) return false;\n return evaluateConditionOperator(condition, value);\n });\n },\n\n /**\n * Evaluates multiple conditions with OR logic.\n *\n * @param conditions - Array of conditions\n * @param contextValue - Context value getter function\n * @returns true if any condition matches\n */\n evaluateConditionsOr: (\n conditions: FeatureFlagCondition[],\n contextValue: (field: string) => unknown\n ): boolean => {\n if (conditions.length === 0) return true;\n\n return conditions.some(condition => {\n const value = contextValue(condition.field);\n if (value === undefined) return false;\n return evaluateConditionOperator(condition, value);\n });\n },\n\n /**\n * Validates a condition structure.\n *\n * @param condition - Condition to validate\n * @returns Validation result\n */\n validateCondition: (\n condition: Partial<FeatureFlagCondition>\n ): {\n isValid: boolean;\n errors: string[];\n } => {\n const errors: string[] = [];\n\n if (!condition.field) {\n errors.push('Field is required');\n }\n\n if (!condition.operator) {\n errors.push('Operator is required');\n } else {\n const validOperators = [\n 'equals',\n 'not_equals',\n 'contains',\n 'not_contains',\n 'in',\n 'not_in',\n 'greater_than',\n 'less_than',\n ];\n if (!validOperators.includes(condition.operator)) {\n errors.push(`Invalid operator: ${condition.operator}`);\n }\n }\n\n if (condition.value === undefined) {\n errors.push('Value is required');\n }\n\n return {\n isValid: errors.length === 0,\n errors,\n };\n },\n\n /**\n * Creates a condition object with validation.\n *\n * @param field - Context field to evaluate\n * @param operator - Comparison operator\n * @param value - Value to compare against\n * @returns Valid condition object\n */\n createCondition: (\n field: string,\n operator: FeatureFlagCondition['operator'],\n value: FeatureFlagCondition['value']\n ): FeatureFlagCondition => {\n const condition = { field, operator, value } as FeatureFlagCondition;\n const validation = ConditionUtils.validateCondition(condition);\n\n if (!validation.isValid) {\n throw new CorePackageError(\n `Invalid condition: ${validation.errors.join(', ')}`,\n ERROR_CODES.VALIDATION_ERROR\n );\n }\n\n return condition;\n },\n} as const;\n","/**\n * Feature Flag Evaluation Engine\n *\n * Core engine for evaluating feature flags with rules, targeting, and rollouts.\n * This will be moved to @plyaz/core when the package structure is finalized.\n *\n * @fileoverview Core feature flag evaluation engine\n * @version 1.0.0\n */\n\nimport type {\n FeatureFlag,\n FeatureFlagRule,\n FeatureFlagCondition,\n FeatureFlagContext,\n FeatureFlagEvaluation,\n FeatureFlagValue,\n} from '@plyaz/types';\nimport { PackageLogger } from '@plyaz/logger';\nimport { isInRollout, createRolloutIdentifier, isTruthy } from '@utils/common';\nimport { ContextUtils, evaluateConditionOperator } from '@utils/featureFlags';\n\n/**\n * Core feature flag evaluation engine.\n * Handles all the logic for evaluating feature flags including rules, targeting, and rollouts.\n *\n * @class FeatureFlagEngine\n *\n * @example\n * ```typescript\n * const engine = new FeatureFlagEngine(defaultFlags, true);\n * engine.setFlags(flagsFromDatabase);\n * engine.setRules(rulesFromDatabase);\n *\n * const evaluation = engine.evaluate('AUTH_GOOGLE', context);\n * console.log(evaluation.isEnabled); // true/false\n * ```\n */\nexport class FeatureFlagEngine<FeatureFlagKey extends string> {\n /** Logger instance */\n private readonly logger = new PackageLogger({\n packageName: 'core',\n service: 'FeatureFlagEngine',\n });\n\n /** Storage for active feature flags */\n private flags: Map<FeatureFlagKey, FeatureFlag<FeatureFlagKey>> = new Map();\n /** Storage for targeting rules, organized by flag key */\n private rules: Map<FeatureFlagKey, FeatureFlagRule<FeatureFlagKey>[]> = new Map();\n /** Storage for manual overrides (useful for testing) */\n private overrides: Map<FeatureFlagKey, FeatureFlagValue> = new Map();\n\n /**\n * Creates a new feature flag evaluation engine.\n *\n * @param defaults - Default flag values to fall back to\n * @param isLoggingEnabled - Whether to enable debug logging\n */\n constructor(\n private defaults: Record<FeatureFlagKey, FeatureFlagValue>,\n private isLoggingEnabled = false\n ) {}\n\n /**\n * Sets the active feature flags for evaluation.\n * Clears existing flags and rules before setting new ones.\n *\n * @param flags - Array of feature flags to activate\n */\n setFlags(flags: FeatureFlag<FeatureFlagKey>[]): void {\n this.flags.clear();\n this.rules.clear();\n\n for (const flag of flags) {\n this.flags.set(flag.key, flag);\n }\n\n this.log('Loaded flags:', this.flags.size);\n }\n\n /**\n * Sets the targeting rules for feature flags.\n * Rules are automatically sorted by priority (higher numbers first).\n *\n * @param rules - Array of feature flag rules\n */\n setRules(rules: FeatureFlagRule<FeatureFlagKey>[]): void {\n this.rules.clear();\n\n for (const rule of rules) {\n const existing = this.rules.get(rule.flagKey) ?? [];\n existing.push(rule);\n // Sort by priority (higher priority first)\n existing.sort((a, b) => b.priority - a.priority);\n this.rules.set(rule.flagKey, existing);\n }\n\n this.log('Loaded rules:', rules.length);\n }\n\n /**\n * Gets all targeting rules.\n *\n * @returns Array of all feature flag rules\n */\n getRules(): FeatureFlagRule<FeatureFlagKey>[] {\n const allRules: FeatureFlagRule<FeatureFlagKey>[] = [];\n for (const rules of this.rules.values()) {\n allRules.push(...rules);\n }\n return allRules;\n }\n\n /**\n * Sets a manual override for a specific flag.\n * Overrides take precedence over all other evaluation logic.\n *\n * @param key - The flag key to override\n * @param value - The value to force for this flag\n */\n setOverride(key: FeatureFlagKey, value: FeatureFlagValue): void {\n this.overrides.set(key, value);\n this.log('Override set:', key, value);\n }\n\n /**\n * Removes a manual override for a specific flag.\n *\n * @param key - The flag key to remove override for\n */\n removeOverride(key: FeatureFlagKey): void {\n this.overrides.delete(key);\n this.log('Override removed:', key);\n }\n\n /**\n * Updates the default values for feature flags.\n * This is useful when the FEATURES constant is updated at runtime.\n *\n * @param newDefaults - New default values\n */\n updateDefaults(newDefaults: Record<FeatureFlagKey, FeatureFlagValue>): void {\n this.defaults = newDefaults;\n this.log('Updated default feature values');\n }\n\n /**\n * Clears all manual overrides.\n */\n clearOverrides(): void {\n this.overrides.clear();\n this.log('All overrides cleared');\n }\n\n /**\n * Gets all current flags.\n *\n * @returns Array of all feature flags\n */\n getFlags(): FeatureFlag<FeatureFlagKey>[] {\n return Array.from(this.flags.values());\n }\n\n /**\n * Evaluates a feature flag and returns the complete evaluation result.\n *\n * @param key - The feature flag key to evaluate\n * @param context - Optional context for targeting\n * @returns Complete evaluation result with value and metadata\n */\n evaluate(\n key: FeatureFlagKey,\n context?: FeatureFlagContext\n ): FeatureFlagEvaluation<FeatureFlagKey> {\n const evaluatedAt = new Date();\n\n // Check for override first\n const overrideResult = this.checkOverride(key, evaluatedAt);\n if (overrideResult) return overrideResult;\n\n // Get flag from storage\n const flag = this.flags.get(key);\n if (!flag) {\n return this.createDefaultEvaluation(key, evaluatedAt);\n }\n\n // Check if flag is disabled\n if (!flag.isEnabled) {\n return this.createDisabledEvaluation(key, evaluatedAt);\n }\n\n // Check environment\n if (!this.isEnvironmentMatch(flag, context)) {\n return this.createDefaultEvaluation(key, evaluatedAt);\n }\n\n // Evaluate rules\n const ruleResult = this.evaluateRules(key, context, evaluatedAt);\n if (ruleResult) return ruleResult;\n\n // Check flag-level rollout\n if (!this.isInFlagRollout(key, flag, context)) {\n return this.createDefaultEvaluation(key, evaluatedAt);\n }\n\n // Return flag value\n return this.createFlagEvaluation(key, flag, evaluatedAt);\n }\n\n /**\n * Checks for manual override and returns evaluation if found.\n *\n * @private\n * @param key - The feature flag key\n * @param evaluatedAt - Evaluation timestamp\n * @returns Evaluation result or null if no override\n */\n private checkOverride(\n key: FeatureFlagKey,\n evaluatedAt: Date\n ): FeatureFlagEvaluation<FeatureFlagKey> | null {\n if (!this.overrides.has(key)) return null;\n\n const value = this.overrides.get(key)!;\n return {\n flagKey: key,\n value,\n isEnabled: isTruthy(value),\n reason: 'override',\n evaluatedAt,\n } satisfies FeatureFlagEvaluation<FeatureFlagKey>;\n }\n\n /**\n * Creates default evaluation result.\n *\n * @private\n * @param key - The feature flag key\n * @param evaluatedAt - Evaluation timestamp\n * @returns Default evaluation result\n */\n private createDefaultEvaluation(\n key: FeatureFlagKey,\n evaluatedAt: Date\n ): FeatureFlagEvaluation<FeatureFlagKey> {\n const defaultValue = this.defaults[key] ?? false;\n return {\n flagKey: key,\n value: defaultValue,\n isEnabled: isTruthy(defaultValue),\n reason: 'default',\n evaluatedAt,\n } satisfies FeatureFlagEvaluation<FeatureFlagKey>;\n }\n\n /**\n * Creates disabled evaluation result.\n *\n * @private\n * @param key - The feature flag key\n * @param evaluatedAt - Evaluation timestamp\n * @returns Disabled evaluation result\n */\n private createDisabledEvaluation(\n key: FeatureFlagKey,\n evaluatedAt: Date\n ): FeatureFlagEvaluation<FeatureFlagKey> {\n return {\n flagKey: key,\n value: false,\n isEnabled: false,\n reason: 'disabled',\n evaluatedAt,\n } satisfies FeatureFlagEvaluation<FeatureFlagKey>;\n }\n\n /**\n * Creates flag evaluation result.\n *\n * @private\n * @param key - The feature flag key\n * @param flag - The feature flag\n * @param evaluatedAt - Evaluation timestamp\n * @returns Flag evaluation result\n */\n private createFlagEvaluation(\n key: FeatureFlagKey,\n flag: FeatureFlag<FeatureFlagKey>,\n evaluatedAt: Date\n ): FeatureFlagEvaluation<FeatureFlagKey> {\n return {\n flagKey: key,\n value: flag.value,\n isEnabled: isTruthy(flag.value),\n reason: 'default',\n evaluatedAt,\n } satisfies FeatureFlagEvaluation<FeatureFlagKey>;\n }\n\n /**\n * Checks if environment matches for flag evaluation.\n *\n * @private\n * @param flag - The feature flag\n * @param context - Evaluation context\n * @returns true if environment matches\n */\n private isEnvironmentMatch(\n flag: FeatureFlag<FeatureFlagKey>,\n context?: FeatureFlagContext\n ): boolean {\n return flag.environment === 'all' || context?.environment === flag.environment;\n }\n\n /**\n * Checks if user is in flag-level rollout.\n *\n * @private\n * @param key - The feature flag key\n * @param flag - The feature flag\n * @param context - Evaluation context\n * @returns true if user is in rollout\n */\n private isInFlagRollout(\n key: FeatureFlagKey,\n flag: FeatureFlag<FeatureFlagKey>,\n context?: FeatureFlagContext\n ): boolean {\n if (flag.rolloutPercentage === undefined) return true;\n const identifier = createRolloutIdentifier(key, context?.userId);\n return isInRollout(identifier, flag.rolloutPercentage);\n }\n\n /**\n * Evaluates all rules for a flag.\n *\n * @private\n * @param key - The feature flag key\n * @param context - Evaluation context\n * @param evaluatedAt - Evaluation timestamp\n * @returns Rule evaluation result or null if no match\n */\n private evaluateRules(\n key: FeatureFlagKey,\n context?: FeatureFlagContext,\n evaluatedAt?: Date\n ): FeatureFlagEvaluation<FeatureFlagKey> | null {\n const rules = this.rules.get(key) ?? [];\n\n for (const rule of rules) {\n if (!rule.isEnabled) continue;\n\n const ruleResult = this.evaluateMatchingRule(key, rule, context, evaluatedAt);\n if (ruleResult) return ruleResult;\n }\n\n return null;\n }\n\n /**\n * Evaluates a single matching rule and returns result if it passes.\n *\n * @private\n * @param key - The feature flag key\n * @param rule - The rule to evaluate\n * @param context - Evaluation context\n * @param evaluatedAt - Evaluation timestamp\n * @returns Rule evaluation result or null if no match\n */\n private evaluateMatchingRule(\n key: FeatureFlagKey,\n rule: FeatureFlagRule<FeatureFlagKey>,\n context?: FeatureFlagContext,\n evaluatedAt?: Date\n ): FeatureFlagEvaluation<FeatureFlagKey> | null {\n if (!this.evaluateRule(rule, context)) return null;\n\n const isInRuleRollout =\n rule.rolloutPercentage === undefined ||\n isInRollout(createRolloutIdentifier(key, context?.userId), rule.rolloutPercentage);\n\n if (!isInRuleRollout) return null;\n\n return {\n flagKey: key,\n value: rule.value,\n isEnabled: isTruthy(rule.value),\n reason: 'rule_match',\n matchedRuleId: rule.id,\n evaluatedAt: evaluatedAt ?? new Date(),\n } satisfies FeatureFlagEvaluation<FeatureFlagKey>;\n }\n\n /**\n * Evaluates a single rule against the provided context.\n * All conditions in the rule must match (AND logic).\n *\n * @private\n * @param rule - The rule to evaluate\n * @param context - Context to evaluate against\n * @returns true if the rule matches the context\n */\n private evaluateRule(\n rule: FeatureFlagRule<FeatureFlagKey>,\n context?: FeatureFlagContext\n ): boolean {\n if (rule.conditions.length === 0) return true;\n\n // All conditions must match (AND logic)\n return rule.conditions.every(condition => this.evaluateCondition(condition, context));\n }\n\n /**\n * Evaluates a single condition against the provided context.\n *\n * @private\n * @param condition - The condition to evaluate\n * @param context - Context to evaluate against\n * @returns true if the condition matches\n */\n private evaluateCondition(\n condition: FeatureFlagCondition,\n context?: FeatureFlagContext\n ): boolean {\n if (!context) return false;\n\n const contextValue = ContextUtils.getContextValue(condition.field, context);\n if (contextValue === undefined) return false;\n\n return evaluateConditionOperator(condition, contextValue);\n }\n\n /**\n * Logs debug information if logging is enabled.\n *\n * @private\n * @param args - Arguments to log\n */\n private log(...args: unknown[]): void {\n if (this.isLoggingEnabled) {\n this.logger.debug(args.map(arg => String(arg)).join(' '));\n }\n }\n}\n","/**\n * Feature Flag Provider - Core Implementation\n *\n * Main provider class that orchestrates feature flag evaluation and management.\n * This will be moved to @plyaz/core when the package structure is finalized.\n *\n * @fileoverview Core feature flag provider implementation\n * @version 1.0.0\n */\n\nimport type {\n FeatureFlagProvider as IFeatureFlagProvider,\n FeatureFlagConfig,\n FeatureFlagContext,\n FeatureFlagEvaluation,\n FeatureFlagValue,\n FetchFeatureFlagDataResponse,\n FeatureFlag,\n FeatureFlagRule,\n CreateFlagRequest,\n} from '@plyaz/types';\nimport { FeatureFlagEngine } from '@engine/featureFlags/engine';\nimport { CacheManager } from '@base/cache/index';\nimport { TIME_CONSTANTS } from '@plyaz/config';\n\n/**\n * Subscription callback function type\n */\nexport type SubscriptionCallback = () => void;\n\n/**\n * Core feature flag provider that implements the main business logic.\n * This class orchestrates between the evaluation engine, caching, and data providers.\n *\n * @class FeatureFlagProvider\n * @implements {IFeatureFlagProvider}\n *\n * @example\n * ```typescript\n * const provider = new MemoryFeatureFlagProvider<MyFeatureFlags>(config, FEATURES);\n * await provider.initialize();\n *\n * const isEnabled = await provider.isEnabled('AUTH_GOOGLE', context);\n * const value = await provider.getValue('ROLLOUT_PERCENTAGE', context);\n * ```\n */\nexport abstract class FeatureFlagProvider<FeatureFlagKey extends string>\n implements IFeatureFlagProvider<FeatureFlagKey>\n{\n protected engine: FeatureFlagEngine<FeatureFlagKey>;\n protected cacheManager: CacheManager;\n protected subscribers = new Set<SubscriptionCallback>();\n protected refreshTimer?: ReturnType<typeof setInterval>;\n protected isInitialized = false;\n protected features: Record<FeatureFlagKey, FeatureFlagValue>;\n protected initializePromise?: Promise<void>;\n\n /**\n * Creates a new feature flag provider.\n *\n * @param config - Provider configuration\n * @param features - Record of feature flag keys to their default values\n */\n constructor(\n protected config: FeatureFlagConfig<FeatureFlagKey>,\n features: Record<FeatureFlagKey, FeatureFlagValue>\n ) {\n this.features = features;\n // Initialize engine with defaults from FEATURES constant\n this.engine = new FeatureFlagEngine<FeatureFlagKey>(features, config.isLoggingEnabled ?? false);\n\n // Initialize cache manager\n this.cacheManager = new CacheManager({\n isEnabled: config.isCacheEnabled,\n ttl: config.cacheTtl,\n strategy: 'memory', // Default to memory, can be overridden\n });\n\n this.setupRefreshTimer();\n }\n\n /**\n * Abstract method to fetch flags and rules from the provider's data source.\n * Must be implemented by concrete provider classes.\n *\n * @protected\n * @abstract\n * @returns Promise resolving to flags and rules\n */\n protected abstract fetchData(): Promise<FetchFeatureFlagDataResponse<FeatureFlagKey>>;\n\n /**\n * Initializes the provider by loading initial data.\n *\n * @returns Promise that resolves when initialization is complete\n */\n async initialize(): Promise<void> {\n if (this.isInitialized) {\n return;\n }\n\n // If already initializing, wait for that to complete\n if (this.initializePromise) {\n return this.initializePromise;\n }\n\n // Create and store the initialization promise\n this.initializePromise = this.doInitialize();\n return this.initializePromise;\n }\n\n /**\n * Performs the actual initialization work.\n *\n * @private\n * @returns Promise that resolves when initialization is complete\n */\n private async doInitialize(): Promise<void> {\n try {\n await this.refresh();\n this.isInitialized = true;\n this.log('Provider initialized successfully');\n } catch (error) {\n this.log('Failed to initialize provider:', error);\n // Clear the promise so initialization can be retried\n this.initializePromise = undefined;\n throw error;\n }\n }\n\n /**\n * Gets a feature flag evaluation for the specified key and context.\n *\n * @param key - The feature flag key\n * @param context - Optional context for evaluation\n * @returns Promise resolving to the flag evaluation\n */\n async getFlag(\n key: FeatureFlagKey,\n context?: FeatureFlagContext\n ): Promise<FeatureFlagEvaluation<FeatureFlagKey>> {\n if (!this.isInitialized) {\n await this.initialize();\n }\n\n // Check cache first if enabled\n if (this.config.isCacheEnabled) {\n const cacheKey = this.generateCacheKey(key, context);\n const cached = await this.cacheManager.get<FeatureFlagEvaluation<FeatureFlagKey>>(cacheKey);\n if (cached) {\n return cached;\n }\n\n // Evaluate and cache the result\n const evaluation = this.engine.evaluate(key, context);\n await this.cacheManager.set(cacheKey, evaluation);\n return evaluation;\n }\n\n // Direct evaluation without caching\n return this.engine.evaluate(key, context);\n }\n\n /**\n * Checks if a feature flag is enabled.\n *\n * @param key - The feature flag key\n * @param context - Optional context for evaluation\n * @returns Promise resolving to boolean indicating if flag is enabled\n */\n async isEnabled(key: FeatureFlagKey, context?: FeatureFlagContext): Promise<boolean> {\n const evaluation = await this.getFlag(key, context);\n return evaluation.isEnabled;\n }\n\n /**\n * Gets the value of a feature flag.\n *\n * @template T - The expected type of the flag value\n * @param key - The feature flag key\n * @param context - Optional context for evaluation\n * @returns Promise resolving to the flag value\n */\n async getValue<T = FeatureFlagValue>(\n key: FeatureFlagKey,\n context?: FeatureFlagContext\n ): Promise<T> {\n const evaluation = await this.getFlag(key, context);\n return evaluation.value as T;\n }\n\n /**\n * Gets all feature flag evaluations for the given context.\n *\n * @param context - Optional context for evaluation\n * @returns Promise resolving to record of flag evaluations\n */\n async getAllFlags(\n context?: FeatureFlagContext\n ): Promise<Record<string, FeatureFlagEvaluation<FeatureFlagKey>>> {\n if (!this.isInitialized) {\n await this.initialize();\n }\n\n const results: Record<string, FeatureFlagEvaluation<FeatureFlagKey>> = {};\n\n // First, evaluate all default flags from FEATURES\n for (const key of Object.keys(this.features) as FeatureFlagKey[]) {\n results[key] = await this.getFlag(key, context);\n }\n\n // Then, evaluate any additional flags from the engine\n const engineFlags = this.engine.getFlags();\n for (const flag of engineFlags) {\n if (!(flag.key in results)) {\n results[flag.key] = await this.getFlag(flag.key, context);\n }\n }\n\n return results;\n }\n\n /**\n * Refreshes the provider by fetching latest data from the source.\n *\n * @returns Promise that resolves when refresh is complete\n */\n async refresh(): Promise<void> {\n try {\n const { flags, rules } = await this.fetchData();\n\n this.engine.setFlags(flags);\n this.engine.setRules(rules);\n\n // Clear cache after refresh\n await this.cacheManager.clear();\n\n // Notify subscribers\n this.notifySubscribers();\n\n this.log(`Refreshed with ${flags.length} flags and ${rules.length} rules`);\n } catch (error) {\n this.log('Failed to refresh provider:', error);\n throw error;\n }\n }\n\n /**\n * Subscribes to provider updates.\n *\n * @param callback - Function to call when provider updates\n * @returns Unsubscribe function\n */\n subscribe(callback: SubscriptionCallback): () => void {\n this.subscribers.add(callback);\n return () => {\n this.subscribers.delete(callback);\n };\n }\n\n /**\n * Sets an override for a specific flag key.\n *\n * @param key - The flag key to override\n * @param value - The value to force for this flag\n */\n setOverride(key: FeatureFlagKey, value: FeatureFlagValue): void {\n this.engine.setOverride(key, value);\n void this.cacheManager.clear(); // Clear cache to ensure overrides take effect\n this.notifySubscribers();\n }\n\n /**\n * Removes an override for a specific flag key.\n *\n * @param key - The flag key to remove override for\n */\n removeOverride(key: FeatureFlagKey): void {\n this.engine.removeOverride(key);\n void this.cacheManager.clear();\n this.notifySubscribers();\n }\n\n /**\n * Clears all overrides.\n */\n clearOverrides(): void {\n this.engine.clearOverrides();\n void this.cacheManager.clear();\n this.notifySubscribers();\n }\n\n /**\n * Disposes of the provider, cleaning up resources.\n */\n dispose(): void {\n if (this.refreshTimer) {\n clearInterval(this.refreshTimer);\n this.refreshTimer = undefined;\n }\n\n this.subscribers.clear();\n void this.cacheManager.clear();\n this.isInitialized = false;\n\n this.log('Provider disposed');\n }\n\n // ─────────────────────────────────────────────────────────────────────────\n // Flag Management Operations\n // Each provider implements these based on its storage backend:\n // - Memory: in-memory storage (ephemeral)\n // - File: JSON/YAML file storage\n // - Redis: Redis storage\n // - API: External API calls\n // - Database: Database storage\n // ─────────────────────────────────────────────────────────────────────────\n\n /**\n * Creates a new feature flag.\n * Abstract - each provider implements based on its storage backend.\n *\n * @param data - Flag creation data\n * @returns The created feature flag\n */\n abstract createFlag(\n data: CreateFlagRequest<FeatureFlagKey>\n ): Promise<FeatureFlag<FeatureFlagKey>>;\n\n /**\n * Updates an existing feature flag.\n * Abstract - each provider implements based on its storage backend.\n *\n * @param key - Flag key to update\n * @param data - Partial flag data to update\n * @returns The updated feature flag\n */\n abstract updateFlag(\n key: FeatureFlagKey,\n data: Partial<CreateFlagRequest<FeatureFlagKey>>\n ): Promise<FeatureFlag<FeatureFlagKey>>;\n\n /**\n * Deletes a feature flag.\n * Abstract - each provider implements based on its storage backend.\n *\n * @param key - Flag key to delete\n */\n abstract deleteFlag(key: FeatureFlagKey): Promise<void>;\n\n /**\n * Gets all rules for a specific flag.\n * Abstract - each provider implements based on its storage backend.\n *\n * @param key - Flag key to get rules for\n * @returns Array of rules for the flag\n */\n abstract getRules(key: FeatureFlagKey): Promise<FeatureFlagRule<FeatureFlagKey>[]>;\n\n /**\n * Gets all enabled rules across all flags.\n * Abstract - each provider implements based on its storage backend.\n *\n * @returns Array of all enabled rules\n */\n abstract getAllRules(): Promise<FeatureFlagRule<FeatureFlagKey>[]>;\n\n // ─────────────────────────────────────────────────────────────────────────\n // Optional Extensions\n // ─────────────────────────────────────────────────────────────────────────\n\n /**\n * Optional method to sync features at runtime.\n * This is useful for providers that can update their features dynamically.\n *\n * @param newFeatures - New features to sync\n * @returns Promise that resolves when sync is complete\n */\n syncFeatures?(newFeatures: Record<FeatureFlagKey, FeatureFlagValue>): Promise<void>;\n\n /**\n * Generates a cache key for flag evaluation.\n *\n * @protected\n * @param key - Feature flag key\n * @param context - Evaluation context\n * @returns Cache key string\n */\n protected generateCacheKey(key: FeatureFlagKey, context?: FeatureFlagContext): string {\n if (!context) {\n return key;\n }\n\n // Create a stable cache key from context\n const contextKey = JSON.stringify({\n userId: context.userId,\n userRole: context.userRole,\n environment: context.environment,\n platform: context.platform,\n country: context.country,\n version: context.version,\n });\n\n return `${key}:${contextKey}`;\n }\n\n /**\n * Sets up the automatic refresh timer if configured.\n *\n * @protected\n */\n protected setupRefreshTimer(): void {\n if (this.config.refreshInterval > 0) {\n this.refreshTimer = setInterval(() => {\n void this.refresh().catch(error => {\n this.log('Auto-refresh failed:', error);\n });\n }, this.config.refreshInterval * TIME_CONSTANTS.MILLISECONDS_PER_SECOND);\n }\n }\n\n /**\n * Notifies all subscribers of provider updates.\n *\n * @protected\n */\n protected notifySubscribers(): void {\n for (const callback of Array.from(this.subscribers)) {\n try {\n callback();\n } catch (error) {\n this.log('Subscriber callback error:', error);\n }\n }\n }\n\n /**\n * Logs a message if logging is enabled.\n *\n * @protected\n * @param args - Arguments to log\n */\n protected log(...args: unknown[]): void {\n if (this.config.isLoggingEnabled) {\n console.log('[FeatureFlagProvider]', ...args);\n }\n }\n}\n","/**\n * API Feature Flag Provider\n *\n * Provider adapter that uses @plyaz/api services with an injected API client\n * to fetch feature flags from a remote API. This provider extends the base\n * FeatureFlagProvider and implements fetchData() using the API services.\n *\n * @fileoverview API provider adapter for feature flags\n * @version 2.0.0\n */\n\nimport type {\n FeatureFlag,\n FeatureFlagRule,\n FeatureFlagValue,\n CreateFlagRequest,\n} from '@plyaz/types';\nimport { ERROR_CODES } from '@plyaz/types';\nimport { BaseError, CorePackageError } from '@plyaz/errors';\nimport { FeatureFlagProvider } from '../provider';\n\n// Import API services from @plyaz/api\nimport {\n createFeatureFlag as apiCreateFlag,\n updateFeatureFlag as apiUpdateFlag,\n deleteFeatureFlag as apiDeleteFlag,\n evaluateAllFeatureFlags as apiEvaluateAllFlags,\n fetchFeatureFlagRules as apiFetchRules,\n} from '@plyaz/api/frontend';\nimport type { ServiceOptions } from '@plyaz/types/api';\nimport type { ApiFeatureFlagConfig as _ApiFeatureFlagConfig } from '@plyaz/types/features';\n\n// API client type from ServiceOptions\ntype ApiClientType = NonNullable<ServiceOptions['apiClient']>;\n\n/**\n * API response type for fetching flags and rules\n */\ninterface ApiFetchResponse<TKey extends string> {\n flags: FeatureFlag<TKey>[];\n rules: FeatureFlagRule<TKey>[];\n}\n\n/**\n * API-based feature flag provider\n *\n * Uses @plyaz/api services with an injected API client to communicate with the backend.\n * Pass your configured API client via the config.\n *\n * @class ApiFeatureFlagProvider\n * @extends {FeatureFlagProvider}\n *\n * @example\n * ```typescript\n * // Get client from ApiClientService\n * const apiClient = ApiClientService.getClient();\n *\n * const provider = new ApiFeatureFlagProvider({\n * provider: 'api',\n * apiClient,\n * isCacheEnabled: true,\n * cacheTtl: 300,\n * }, FEATURES);\n *\n * await provider.initialize();\n * const isEnabled = await provider.isEnabled('new-feature');\n * ```\n */\nexport class ApiFeatureFlagProvider<\n FeatureFlagKey extends string,\n> extends FeatureFlagProvider<FeatureFlagKey> {\n protected readonly apiClient: ApiClientType;\n\n /**\n * Creates a new API feature flag provider.\n *\n * @param config - Provider configuration with API client\n * @param features - Record of feature flag keys to default values\n */\n constructor(\n config: _ApiFeatureFlagConfig<FeatureFlagKey>,\n features: Record<FeatureFlagKey, FeatureFlagValue>\n ) {\n super(config, features);\n\n if (!config.apiClient) {\n throw new CorePackageError(\n 'API provider requires apiClient in config',\n ERROR_CODES.CLIENT_INVALID_CONFIG\n );\n }\n\n this.apiClient = config.apiClient;\n this.validateConfig();\n }\n\n /**\n * Get service options with injected client\n */\n private getServiceOptions(): ServiceOptions {\n return { apiClient: this.apiClient };\n }\n\n /** Wrap error in CorePackageError if not already a package error */\n private wrapError(error: unknown): CorePackageError {\n // If already a package error (BaseError subclass), return as-is\n if (error instanceof BaseError) {\n return error as CorePackageError;\n }\n // Wrap other errors\n return new CorePackageError(\n `API request failed: ${error instanceof Error ? error.message : String(error)}`,\n ERROR_CODES.NETWORK_ERROR,\n { cause: error instanceof Error ? error : undefined }\n );\n }\n\n /** Transform API response to flags/rules */\n private transformResponse(data: ApiFetchResponse<FeatureFlagKey> | undefined): {\n flags: FeatureFlag<FeatureFlagKey>[];\n rules: FeatureFlagRule<FeatureFlagKey>[];\n } {\n const flags = data?.flags ?? [];\n const rules = data?.rules ?? [];\n this.log(`Fetched ${flags.length} flags and ${rules.length} rules from API`);\n return { flags, rules };\n }\n\n /**\n * Fetches flags and rules from the API endpoint using @plyaz/api services.\n *\n * @protected\n * @returns Promise resolving to flags and rules data\n */\n protected async fetchData(): Promise<{\n flags: FeatureFlag<FeatureFlagKey>[];\n rules: FeatureFlagRule<FeatureFlagKey>[];\n }> {\n try {\n const apiConfig = this.config as _ApiFeatureFlagConfig<FeatureFlagKey>;\n const response = await apiEvaluateAllFlags<FeatureFlagKey>(\n { context: apiConfig.context },\n this.getServiceOptions()\n );\n\n if (!response.isSuccess) {\n throw new CorePackageError(\n `Failed to fetch feature flags: ${response.error?.message}`,\n ERROR_CODES.NETWORK_ERROR\n );\n }\n\n const data = response.data as unknown as ApiFetchResponse<FeatureFlagKey>;\n return this.transformResponse(data);\n } catch (error) {\n throw this.wrapError(error);\n }\n }\n\n /**\n * Validates the API provider configuration.\n *\n * @private\n */\n private validateConfig(): void {\n if (this.config.provider !== 'api') {\n throw new CorePackageError(\n 'API provider requires provider to be set to \"api\"',\n ERROR_CODES.CLIENT_INVALID_CONFIG\n );\n }\n\n this.log('API provider configured');\n }\n\n /**\n * Gets API provider status and configuration info.\n */\n getApiInfo(): {\n hasApiClient: boolean;\n } {\n return {\n hasApiClient: Boolean(this.apiClient),\n };\n }\n\n // ─────────────────────────────────────────────────────────────────────────\n // Flag Management Operations (using @plyaz/api services)\n // ─────────────────────────────────────────────────────────────────────────\n\n /**\n * Creates a new feature flag via API\n */\n async createFlag(data: CreateFlagRequest<FeatureFlagKey>): Promise<FeatureFlag<FeatureFlagKey>> {\n const requestData = {\n ...data,\n isEnabled: data.isEnabled ?? true,\n environment: data.environment ?? 'development',\n description: data.description ?? '',\n };\n const response = await apiCreateFlag<FeatureFlagKey>(requestData, this.getServiceOptions());\n\n if (!response.isSuccess) {\n throw new CorePackageError(\n `Failed to create flag: ${response.error?.message}`,\n ERROR_CODES.CONTEXT_OPERATION_FAILED\n );\n }\n\n await this.refresh();\n return response.data as unknown as FeatureFlag<FeatureFlagKey>;\n }\n\n /**\n * Updates a feature flag via API\n */\n async updateFlag(\n key: FeatureFlagKey,\n data: Partial<CreateFlagRequest<FeatureFlagKey>>\n ): Promise<FeatureFlag<FeatureFlagKey>> {\n const response = await apiUpdateFlag<FeatureFlagKey>({ key, data }, this.getServiceOptions());\n\n if (!response.isSuccess) {\n throw new CorePackageError(\n `Failed to update flag: ${response.error?.message}`,\n ERROR_CODES.CONTEXT_OPERATION_FAILED\n );\n }\n\n await this.refresh();\n return response.data as unknown as FeatureFlag<FeatureFlagKey>;\n }\n\n /**\n * Deletes a feature flag via API\n */\n async deleteFlag(key: FeatureFlagKey): Promise<void> {\n const response = await apiDeleteFlag<FeatureFlagKey>(key, this.getServiceOptions());\n\n if (!response.isSuccess) {\n throw new CorePackageError(\n `Failed to delete flag: ${response.error?.message}`,\n ERROR_CODES.CONTEXT_OPERATION_FAILED\n );\n }\n\n await this.refresh();\n }\n\n /**\n * Gets rules for a specific flag via API\n */\n async getRules(key: FeatureFlagKey): Promise<FeatureFlagRule<FeatureFlagKey>[]> {\n const response = await apiFetchRules<FeatureFlagKey>(key, this.getServiceOptions());\n\n if (!response.isSuccess) {\n throw new CorePackageError(\n `Failed to get rules: ${response.error?.message}`,\n ERROR_CODES.CONTEXT_OPERATION_FAILED\n );\n }\n\n return (response.data as unknown as { rules: FeatureFlagRule<FeatureFlagKey>[] })?.rules ?? [];\n }\n\n /**\n * Gets all rules via API\n * Note: This requires fetching rules for all flags individually or a dedicated endpoint\n */\n async getAllRules(): Promise<FeatureFlagRule<FeatureFlagKey>[]> {\n // For now, return the rules from the engine (populated by fetchData)\n // A dedicated API endpoint would be needed for a direct call\n return this.engine.getRules();\n }\n}\n","/**\n * Feature Flag Domain Service (Frontend)\n *\n * Frontend-specific domain service for feature flag management.\n * Implements FeatureFlagServiceInterface for clean dependency injection.\n *\n * @example\n * ```tsx\n * // With ServiceRegistry (auto-initialization)\n * await ServiceRegistry.initialize({\n * services: [{ service: FeatureFlagDomainService, config: { cacheTtl: 300 } }],\n * });\n * const service = ServiceRegistry.get<FeatureFlagServiceInterface>('featureFlags');\n *\n * // Manual creation with provider\n * const service = new FeatureFlagDomainService({\n * provider,\n * store: useFeatureFlagStore.getState(),\n * });\n * await service.fetchAndSyncAll({ userId: user.id });\n * ```\n */\n\nimport type {\n FeatureFlag,\n FeatureFlagKey,\n FeatureFlagRule,\n FeatureFlagContext,\n FeatureFlagValue,\n FeatureFlagEvaluation,\n CreateFlagRequest,\n} from '@plyaz/types';\nimport { CoreEventManager } from '../../events/CoreEventManager';\nimport { createApiClient } from '@plyaz/api/frontend';\nimport { ApiFeatureFlagProvider } from '../../domain/featureFlags/providers/api';\nimport { BaseFrontendDomainService } from '../base/BaseFrontendDomainService';\nimport { SERVICE_KEYS } from '@plyaz/types/core';\nimport type {\n CoreFrontendFeatureFlagEventType,\n CoreFeatureFlagStore,\n CoreFeatureFlagServiceConfig,\n CoreFeatureFlagServiceInitConfig,\n CoreFeatureFlagServiceInterface,\n CoreServiceCreateOptions,\n} from '@plyaz/types/core';\n\n// ─────────────────────────────────────────────────────────────────────────────\n// Constants\n// ─────────────────────────────────────────────────────────────────────────────\n\n/** Default cache TTL in seconds (5 minutes) */\nconst DEFAULT_CACHE_TTL_SECONDS = 300;\n/** Default refresh interval in milliseconds (1 minute) */\nconst DEFAULT_REFRESH_INTERVAL_MS = 60000;\n\n// ─────────────────────────────────────────────────────────────────────────────\n// Service Implementation\n// ─────────────────────────────────────────────────────────────────────────────\n\n/**\n * Feature Flag Domain Service (Frontend)\n *\n * Frontend-specific domain service for feature flag management.\n * Implements FeatureFlagServiceInterface for clean dependency injection.\n *\n * @example\n * ```tsx\n * // With ServiceRegistry (auto-initialization)\n * await ServiceRegistry.initialize({\n * services: [{ service: FeatureFlagDomainService, config: { cacheTtl: 300 } }],\n * });\n * const service = ServiceRegistry.get<FeatureFlagServiceInterface>('featureFlags');\n *\n * // Manual creation with provider\n * const service = new FeatureFlagDomainService({\n * provider,\n * store: useFeatureFlagStore.getState(),\n * });\n * await service.fetchAndSyncAll({ userId: user.id });\n * ```\n */\nexport class FrontendFeatureFlagDomainService\n extends BaseFrontendDomainService<\n CoreFeatureFlagServiceConfig,\n CoreFeatureFlagStore,\n Record<string, FeatureFlagValue>\n >\n implements CoreFeatureFlagServiceInterface\n{\n // ─────────────────────────────────────────────────────────────────────────\n // Static: ServiceRegistry Interface\n // ─────────────────────────────────────────────────────────────────────────\n\n static readonly serviceKey = SERVICE_KEYS.FEATURE_FLAGS;\n\n /** Build API client for feature flags */\n private static async buildApiClient(\n config: CoreFeatureFlagServiceInitConfig,\n options?: CoreServiceCreateOptions\n ): Promise<ReturnType<typeof createApiClient>> {\n const apiBasePath =\n config.apiBasePath ?? options?.apiClient?.options?.baseURL ?? '/feature-flags';\n return createApiClient({ ...options?.apiClient?.options, baseURL: apiBasePath });\n }\n\n /** Build feature flag provider */\n private static buildProvider(\n config: CoreFeatureFlagServiceInitConfig,\n apiClient: Awaited<ReturnType<typeof createApiClient>>\n ): ApiFeatureFlagProvider<FeatureFlagKey> {\n return new ApiFeatureFlagProvider<FeatureFlagKey>(\n {\n provider: 'api',\n apiClient,\n isCacheEnabled: true,\n cacheTtl: config.cacheTtl ?? DEFAULT_CACHE_TTL_SECONDS,\n context: config.defaultContext,\n refreshInterval: config.refreshInterval ?? DEFAULT_REFRESH_INTERVAL_MS,\n shouldFallbackToDefaults: config.shouldFallbackToDefaults ?? true,\n },\n config.featureKeys ?? {}\n );\n }\n\n /**\n * Factory method for ServiceRegistry auto-initialization.\n */\n static async create(\n config: CoreFeatureFlagServiceInitConfig,\n options?: CoreServiceCreateOptions\n ): Promise<FrontendFeatureFlagDomainService> {\n const apiClient = await FrontendFeatureFlagDomainService.buildApiClient(config, options);\n const provider = FrontendFeatureFlagDomainService.buildProvider(config, apiClient);\n await provider.initialize();\n\n return new FrontendFeatureFlagDomainService({\n enabled: config.enabled ?? true,\n provider,\n defaultContext: config.defaultContext,\n defaults: config.defaults,\n store: config.store,\n readStores: config.readStores,\n });\n }\n\n // ─────────────────────────────────────────────────────────────────────────\n // Instance\n // ─────────────────────────────────────────────────────────────────────────\n\n /**\n * Event prefix for all events emitted by this service\n * Required by BaseFrontendDomainService\n */\n protected eventPrefix = 'featureFlag';\n\n private readonly provider: CoreFeatureFlagServiceConfig['provider'];\n\n constructor(config: CoreFeatureFlagServiceConfig) {\n super({\n serviceName: 'FeatureFlagDomainService',\n supportedRuntimes: ['frontend', 'universal'],\n serviceConfig: { enabled: true, defaults: {}, ...config },\n });\n\n this.provider = config.provider;\n this._initialized = true;\n\n this.logInfo('Service initialized', { storeCount: this.connectedStoreCount });\n CoreEventManager.emit('featureFlag:provider:initialized', { providerType: 'api' });\n }\n\n // ─────────────────────────────────────────────────────────────────────────\n // IFeatureFlagService: Lifecycle\n // ─────────────────────────────────────────────────────────────────────────\n\n isAvailable(): boolean {\n return this.isServiceEnabled && this.provider !== null;\n }\n\n dispose(): void {\n this.provider?.dispose();\n CoreEventManager.emit('featureFlag:provider:disposed', {});\n this.logInfo('Service disposed');\n }\n\n // ─────────────────────────────────────────────────────────────────────────\n // IFeatureFlagService: Provider Operations\n // ─────────────────────────────────────────────────────────────────────────\n\n async refresh(): Promise<void> {\n this.assertReady();\n this.setStoresLoading(true);\n\n try {\n await this.provider.refresh();\n CoreEventManager.emit('featureFlag:provider:refreshed', {});\n\n if (this.hasConnectedStores) {\n const evaluations = await this.provider.getAllFlags(this.config.defaultContext);\n this.syncToStores(this.toValues(evaluations));\n }\n\n this.logDebug('Provider refreshed and synced');\n } finally {\n this.setStoresLoading(false);\n }\n }\n\n // ─────────────────────────────────────────────────────────────────────────\n // IFeatureFlagService: Evaluation\n // ─────────────────────────────────────────────────────────────────────────\n\n async evaluate<TKey extends string = string>(\n key: TKey,\n context?: FeatureFlagContext\n ): Promise<FeatureFlagEvaluation<TKey>> {\n this.assertReady();\n const ctx = context ?? this.config.defaultContext;\n\n CoreEventManager.emit('featureFlag:evaluating', { key, context: ctx });\n\n try {\n const result = await this.provider.getFlag(key, ctx);\n CoreEventManager.emit('featureFlag:evaluated', { key, result });\n\n if (this.hasConnectedStores) {\n this.syncToStores({ [key]: result.value });\n }\n\n return result as FeatureFlagEvaluation<TKey>;\n } catch (error) {\n CoreEventManager.emit('featureFlag:evaluate:error', { key, error });\n throw error;\n }\n }\n\n async isEnabled<TKey extends string = string>(\n key: TKey,\n context?: FeatureFlagContext\n ): Promise<boolean> {\n this.assertReady();\n return this.provider.isEnabled(key, context ?? this.config.defaultContext);\n }\n\n async getValue<T = FeatureFlagValue, TKey extends string = string>(\n key: TKey,\n context?: FeatureFlagContext\n ): Promise<T> {\n this.assertReady();\n return this.provider.getValue<T>(key, context ?? this.config.defaultContext);\n }\n\n async evaluateAll<TKey extends string = string>(\n context?: FeatureFlagContext\n ): Promise<Record<string, FeatureFlagEvaluation<TKey>>> {\n this.assertReady();\n this.setStoresLoading(true);\n\n try {\n const result = await this.provider.getAllFlags(context ?? this.config.defaultContext);\n\n if (this.hasConnectedStores) {\n this.syncToStores(this.toValues(result));\n }\n\n return result as Record<string, FeatureFlagEvaluation<TKey>>;\n } catch (error) {\n this.logError('Failed to evaluate all flags', { error });\n throw error;\n } finally {\n this.setStoresLoading(false);\n }\n }\n\n async fetchAndSyncAll(context?: FeatureFlagContext): Promise<Record<string, FeatureFlagValue>> {\n const evaluations = await this.evaluateAll(context);\n return this.toValues(evaluations);\n }\n\n // ─────────────────────────────────────────────────────────────────────────\n // IFeatureFlagService: CRUD (renamed to avoid base class conflicts)\n // ─────────────────────────────────────────────────────────────────────────\n\n async createFlag<TKey extends string = string>(\n data: CreateFlagRequest<TKey>\n ): Promise<FeatureFlag<TKey>> {\n this.assertReady();\n CoreEventManager.emit('featureFlag:creating', { data });\n\n try {\n const flag = await this.provider.createFlag(data);\n CoreEventManager.emit('featureFlag:created', { flag });\n this.logInfo('Flag created', { key: data.key });\n\n if (this.hasConnectedStores) {\n this.syncToStores({ [data.key]: flag.value });\n }\n\n return flag as FeatureFlag<TKey>;\n } catch (error) {\n CoreEventManager.emit('featureFlag:create:error', { error, data });\n throw error;\n }\n }\n\n async updateFlag<TKey extends string = string>(\n key: TKey,\n data: Partial<CreateFlagRequest<TKey>>\n ): Promise<FeatureFlag<TKey>> {\n this.assertReady();\n CoreEventManager.emit('featureFlag:updating', { key, data });\n\n try {\n const flag = await this.provider.updateFlag(key, data);\n CoreEventManager.emit('featureFlag:updated', { flag });\n this.logInfo('Flag updated', { key });\n\n if (this.hasConnectedStores) {\n this.syncToStores({ [key]: flag.value });\n }\n\n return flag as FeatureFlag<TKey>;\n } catch (error) {\n CoreEventManager.emit('featureFlag:update:error', { error, key });\n throw error;\n }\n }\n\n async deleteFlag<TKey extends string = string>(key: TKey): Promise<void> {\n this.assertReady();\n CoreEventManager.emit('featureFlag:deleting', { key });\n\n try {\n await this.provider.deleteFlag(key);\n CoreEventManager.emit('featureFlag:deleted', { key });\n this.logInfo('Flag deleted', { key });\n\n // Refresh all to remove deleted flag from stores\n if (this.hasConnectedStores) {\n const evaluations = await this.provider.getAllFlags(this.config.defaultContext);\n this.syncToStores(this.toValues(evaluations), true);\n }\n } catch (error) {\n CoreEventManager.emit('featureFlag:delete:error', { error, key });\n throw error;\n }\n }\n\n // ─────────────────────────────────────────────────────────────────────────\n // IFeatureFlagService: Rules\n // ─────────────────────────────────────────────────────────────────────────\n\n async getRules<TKey extends string = string>(key: TKey): Promise<FeatureFlagRule<TKey>[]> {\n this.assertReady();\n return this.provider.getRules(key) as Promise<FeatureFlagRule<TKey>[]>;\n }\n\n async getAllRules<TKey extends string = string>(): Promise<FeatureFlagRule<TKey>[]> {\n this.assertReady();\n return this.provider.getAllRules() as Promise<FeatureFlagRule<TKey>[]>;\n }\n\n // ─────────────────────────────────────────────────────────────────────────\n // IFeatureFlagService: Overrides\n // ─────────────────────────────────────────────────────────────────────────\n\n setOverride<TKey extends string = string>(key: TKey, value: FeatureFlagValue): void {\n this.assertReady();\n CoreEventManager.emit('featureFlag:override:setting', { key, value });\n this.provider.setOverride(key, value);\n CoreEventManager.emit('featureFlag:override:set', { key, value });\n }\n\n removeOverride<TKey extends string = string>(key: TKey): void {\n this.assertReady();\n CoreEventManager.emit('featureFlag:override:removing', { key });\n this.provider.removeOverride(key);\n CoreEventManager.emit('featureFlag:override:removed', { key });\n }\n\n clearOverrides(): void {\n this.assertReady();\n this.provider.clearOverrides();\n }\n\n // ─────────────────────────────────────────────────────────────────────────\n // IFeatureFlagService: Subscription\n // ─────────────────────────────────────────────────────────────────────────\n\n subscribe(callback: () => void): () => void {\n this.assertReady();\n return this.provider.subscribe(callback);\n }\n\n on(event: CoreFrontendFeatureFlagEventType, handler: (data: unknown) => void): () => void {\n return CoreEventManager.on(event, handler);\n }\n\n // ─────────────────────────────────────────────────────────────────────────\n // Protected: Store Sync Override\n // ─────────────────────────────────────────────────────────────────────────\n\n protected override syncToStores(flags: Record<string, FeatureFlagValue>, replace = false): void {\n if (!this.primaryStore) return;\n\n try {\n if (!replace && this.primaryStore.updateFlags) {\n this.primaryStore.updateFlags(flags);\n } else {\n this.primaryStore.setFlags(flags);\n }\n } catch (error) {\n this.logError('Store sync failed', { error });\n }\n\n this.logDebug('Synced to stores', {\n count: this.connectedStoreCount,\n flags: Object.keys(flags).length,\n });\n }\n\n // ─────────────────────────────────────────────────────────────────────────\n // Private: Helpers\n // ─────────────────────────────────────────────────────────────────────────\n\n private toValues(\n evaluations: Record<string, FeatureFlagEvaluation<string>>\n ): Record<string, FeatureFlagValue> {\n const values: Record<string, FeatureFlagValue> = {};\n for (const [key, evaluation] of Object.entries(evaluations)) {\n values[key] = evaluation.value;\n }\n return values;\n }\n}\n","/**\n * API Provider Component for React/Next.js\n * Initializes the API client service with environment configuration and event handlers\n *\n * @module frontend/providers/ApiProvider\n */\n\n'use client';\n\nimport { useEffect, useState, type ReactElement } from 'react';\nimport { ApiClientService } from '../../services/ApiClientService';\nimport type { CoreApiProviderProps } from '@plyaz/types/core';\n\n/**\n * API Provider Component\n * IMPORTANT: For client components, pass sensitive config from server-side props/actions\n * Initializes the API client service for React/Next.js applications\n *\n * @example\n * ```tsx\n * // In your app layout or _app.tsx\n * import { ApiProvider } from '@plyaz/core';\n *\n * export default function RootLayout({ children }) {\n * const envConfig = {\n * env: process.env.NODE_ENV as 'production',\n * apiKey: process.env.API_KEY,\n * };\n *\n * const apiConfig = {\n * baseURL: process.env.API_URL!,\n * clientEvents: {\n * onRequestStart: (event) => console.log('Request started:', event),\n * },\n * };\n *\n * return (\n * <ApiProvider envConfig={envConfig} apiConfig={apiConfig}>\n * {children}\n * </ApiProvider>\n * );\n * }\n * ```\n */\nexport function ApiProvider({\n children,\n envConfig,\n apiConfig,\n loadingComponent,\n errorComponent,\n onInitialized,\n onError,\n}: CoreApiProviderProps): ReactElement {\n const [isReady, setIsReady] = useState(false);\n const [error, setError] = useState<Error | null>(null);\n\n useEffect(() => {\n // Initialize API client service once on mount\n // The singleton pattern in ApiClientService ensures only one instance is created\n // If already initialized, it returns the existing instance with a warning\n ApiClientService.init(envConfig, apiConfig)\n .then(() => {\n setIsReady(true);\n onInitialized?.();\n })\n .catch((err: unknown) => {\n const error = err instanceof Error ? err : new Error(String(err));\n setError(error);\n onError?.(error);\n globalThis.console.error('[ApiProvider] Failed to initialize API client:', error);\n });\n\n // Cleanup on unmount\n return () => {\n // Don't dispose the client on unmount - it's a singleton\n // Only dispose if you're sure you want to tear down the client\n };\n }, []); // Initialize once on mount - config changes are not supported after initialization\n\n // Show error component if initialization failed\n if (error) {\n if (errorComponent) {\n return <>{errorComponent(error)}</>;\n }\n return (\n <div style={{ padding: '20px', color: 'red' }}>\n <h2>API Client Initialization Failed</h2>\n <p>{error.message}</p>\n </div>\n );\n }\n\n // Show loading component while initializing\n if (!isReady) {\n if (loadingComponent) {\n return <>{loadingComponent}</>;\n }\n return (\n <div style={{ padding: '20px' }}>\n <p>Initializing API client...</p>\n </div>\n );\n }\n\n // Render children when ready\n return <>{children}</>;\n}\n","/**\n * PlyazProvider - Unified React Provider for Plyaz Core Services\n *\n * A single provider that initializes and provides access to all frontend-safe\n * Plyaz services. Designed for ease of use without unnecessary limitations.\n *\n * @module frontend/providers/PlyazProvider\n *\n * @example Basic usage\n * ```tsx\n * import { PlyazProvider } from '@plyaz/core/frontend';\n *\n * export default function App({ children }) {\n * return (\n * <PlyazProvider\n * config={{\n * api: {\n * baseURL: process.env.NEXT_PUBLIC_API_URL!,\n * env: 'production',\n * },\n * }}\n * >\n * {children}\n * </PlyazProvider>\n * );\n * }\n * ```\n *\n * @example With all options\n * ```tsx\n * <PlyazProvider\n * config={{\n * api: {\n * baseURL: 'https://api.example.com',\n * env: 'production',\n * apiKey: process.env.NEXT_PUBLIC_API_KEY,\n * },\n * featureFlags: {\n * provider: 'api',\n * refreshInterval: 60000,\n * },\n * appContext: 'webapp',\n * verbose: process.env.NODE_ENV === 'development',\n * }}\n * onReady={(services) => console.log('Services ready:', services)}\n * onError={(error) => Sentry.captureException(error)}\n * loading={<Skeleton />}\n * error={(err) => <ErrorBoundary error={err} />}\n * >\n * {children}\n * </PlyazProvider>\n * ```\n *\n * @example Accessing services in components\n * ```tsx\n * import { usePlyaz, useApi, useEvents, useFeatureFlag } from '@plyaz/core/frontend';\n *\n * function MyComponent() {\n * // Full access to all services\n * const { api, events, isReady } = usePlyaz();\n *\n * // Or use specific hooks\n * const apiClient = useApi();\n * const events = useEvents();\n * const { value: darkMode } = useFeatureFlag('DARK_MODE');\n *\n * // Make API calls\n * const fetchData = async () => {\n * const response = await apiClient.get('/users');\n * return response.data;\n * };\n *\n * // Subscribe to events\n * useEffect(() => {\n * const unsubscribe = events.on('user:updated', (event) => {\n * console.log('User updated:', event.data);\n * });\n * return unsubscribe;\n * }, [events]);\n *\n * return <div>...</div>;\n * }\n * ```\n */\n\n'use client';\n\nimport {\n createContext,\n useContext,\n useEffect,\n useState,\n useCallback,\n useMemo,\n type ReactElement,\n} from 'react';\nimport { ApiProvider } from '@plyaz/api/frontend';\nimport { Core } from '../../init/CoreInitializer';\nimport { ServiceRegistry } from '../../init/ServiceRegistry';\nimport { ApiClientService } from '../../services/ApiClientService';\nimport { CoreEventManager } from '../../events/CoreEventManager';\nimport type {\n CoreAppContext,\n CoreAppEnvironment,\n CorePlyazConfig,\n CorePlyazFeatureFlagConfig,\n CorePlyazServices,\n CorePlyazContextValue,\n CorePlyazProviderProps as PlyazProviderProps,\n CoreDomainServiceInstance,\n} from '@plyaz/types/core';\nimport type { ApiClientOptions } from '@plyaz/types/api';\nimport { createEncryptionConfig } from '@plyaz/config/api';\nimport { InitializationError } from '../components/InitializationError';\nimport { InitializationLoading } from '../components/InitializationLoading';\n\n// ============================================================================\n// Types\n// ============================================================================\n\n/**\n * Implementation-specific context value.\n * Extends CorePlyazContextValue with concrete implementation references.\n */\ninterface PlyazContextValue extends Omit<CorePlyazContextValue, 'api' | 'events' | 'core'> {\n /** API client for making HTTP requests */\n api: typeof ApiClientService | null;\n /** Event manager for pub/sub */\n events: typeof CoreEventManager;\n /** Core initializer reference */\n core: typeof Core;\n}\n\n/**\n * Implementation-specific services for callbacks.\n */\ninterface PlyazServices extends Omit<CorePlyazServices, never> {\n /** API client for making HTTP requests */\n api: typeof ApiClientService | null;\n /** Event manager for pub/sub */\n events: typeof CoreEventManager;\n /** Core initializer reference */\n core: typeof Core;\n}\n\n// ============================================================================\n// Context\n// ============================================================================\n\nconst PlyazContext = createContext<PlyazContextValue | null>(null);\n\n// ============================================================================\n// Feature Flag Store (Simple in-memory implementation for frontend)\n// ============================================================================\n\n/**\n * Frontend Feature Flag Store\n *\n * Manages feature flags in frontend context with two provider options:\n * - 'memory': Flags stored in-memory (default, resets on refresh)\n * - 'api': Flags fetched from API endpoint\n *\n * For backend/server-side feature flags, use Core.initialize() with\n * database, redis, or file providers instead.\n */\nclass FeatureFlagStore {\n private flags: Record<string, boolean> = {};\n private config: CorePlyazFeatureFlagConfig;\n private apiClient: typeof ApiClientService | null = null;\n private refreshTimer: ReturnType<typeof globalThis.setInterval> | null = null;\n\n constructor(config: CorePlyazFeatureFlagConfig = {}) {\n this.config = config;\n this.flags = config.defaults ?? {};\n }\n\n setApiClient(client: typeof ApiClientService | null): void {\n this.apiClient = client;\n }\n\n get(key: string, defaultValue = false): boolean {\n return this.flags[key] ?? defaultValue;\n }\n\n getAll(): Record<string, boolean> {\n return { ...this.flags };\n }\n\n set(key: string, value: boolean): void {\n this.flags[key] = value;\n }\n\n setAll(flags: Record<string, boolean>): void {\n this.flags = { ...this.flags, ...flags };\n }\n\n async refresh(): Promise<void> {\n // Only 'api' provider needs refresh - 'memory' is local only\n if (this.config.provider === 'api' && this.apiClient?.isInitialized()) {\n try {\n const endpoint = this.config.apiEndpoint ?? '/feature-flags';\n const client = this.apiClient.getClient();\n const response = await client.get<{ flags?: Record<string, boolean> }>(endpoint);\n if (response.data?.flags) {\n this.flags = { ...this.flags, ...response.data.flags };\n }\n } catch (error) {\n globalThis.console.warn('[PlyazProvider] Failed to refresh feature flags:', error);\n }\n }\n // 'memory' provider: no-op, flags are managed locally\n }\n\n startAutoRefresh(): void {\n // Only start auto-refresh for 'api' provider\n if (\n this.config.provider === 'api' &&\n this.config.refreshInterval &&\n this.config.refreshInterval > 0\n ) {\n this.refreshTimer = globalThis.setInterval(() => {\n this.refresh().catch(() => {});\n }, this.config.refreshInterval);\n }\n }\n\n stopAutoRefresh(): void {\n if (this.refreshTimer) {\n globalThis.clearInterval(this.refreshTimer);\n this.refreshTimer = null;\n }\n }\n\n dispose(): void {\n this.stopAutoRefresh();\n this.flags = {};\n }\n}\n\n// ============================================================================\n// Provider Component\n// ============================================================================\n\n/**\n * PlyazProvider - Unified provider for all Plyaz frontend services\n *\n * Initializes and provides access to:\n * - API Client (HTTP requests)\n * - Event Manager (pub/sub)\n * - Feature Flags\n * - Core utilities\n */\n\n/**\n * Build API client configuration from provider config\n */\nfunction buildApiConfig(config: CorePlyazConfig): Partial<ApiClientOptions> {\n return {\n baseURL: config.api.baseURL,\n timeout: config.api.timeout,\n headers: config.api.headers ? { static: config.api.headers } : undefined,\n retry: config.api.retry,\n encryption:\n config.api.encryption?.enabled && config.api.encryption?.key\n ? createEncryptionConfig(config.api.encryption.key)\n : undefined,\n };\n}\n\n/** Initialize Core with frontend config */\nasync function initializeCore(config: CorePlyazConfig): Promise<void> {\n const apiConfig = buildApiConfig(config);\n\n await Core.initialize({\n skipDb: true,\n appContext: config.appContext ?? 'webapp',\n verbose: config.verbose,\n api: {\n env: config.api.env ?? 'development',\n apiKey: config.api.apiKey,\n setAsDefault: true,\n ...apiConfig,\n },\n });\n}\n\n/** Initialize ServiceRegistry if services are configured */\nasync function initializeServices(config: CorePlyazConfig): Promise<void> {\n if (!config.services || config.services.length === 0) return;\n\n if (config.verbose) {\n globalThis.console.log('[PlyazProvider] Initializing domain services...');\n }\n\n await ServiceRegistry.initialize({\n apiClient: { baseURL: config.api.baseURL },\n services: config.services,\n });\n\n if (config.verbose) {\n globalThis.console.log(\n '[PlyazProvider] Services initialized:',\n ServiceRegistry.getInitializedKeys()\n );\n }\n}\n\n/** Initialize feature flags store */\nasync function initializeFeatureFlags(featureFlagStore: FeatureFlagStore): Promise<void> {\n featureFlagStore.setApiClient(ApiClientService);\n await featureFlagStore.refresh();\n featureFlagStore.startAutoRefresh();\n}\n\n/**\n * Create PlyazServices object for callbacks\n */\nfunction createServicesObject(\n config: CorePlyazConfig,\n featureFlagStore: FeatureFlagStore\n): PlyazServices {\n return {\n api: ApiClientService,\n events: CoreEventManager,\n core: Core,\n featureFlags: {\n get: (key, def) => featureFlagStore.get(key, def),\n getAll: () => featureFlagStore.getAll(),\n refresh: () => featureFlagStore.refresh(),\n },\n appContext: config.appContext ?? 'webapp',\n environment: config.api.env ?? 'development',\n getService: <T extends CoreDomainServiceInstance>(key: string) => ServiceRegistry.get<T>(key),\n getServiceAsync: <T extends CoreDomainServiceInstance>(key: string) =>\n ServiceRegistry.getAsync<T>(key),\n hasService: (key: string) => ServiceRegistry.has(key),\n getServiceKeys: () => ServiceRegistry.getInitializedKeys(),\n };\n}\n\nexport function PlyazProvider({\n children,\n config,\n loading,\n error: errorComponent,\n onReady,\n onError,\n skipLoadingState = false,\n}: PlyazProviderProps): ReactElement {\n const [isReady, setIsReady] = useState(false);\n const [error, setError] = useState<Error | null>(null);\n const [featureFlagStore] = useState(() => new FeatureFlagStore(config.featureFlags));\n\n // Initialize services\n const initialize = useCallback(async () => {\n try {\n setError(null);\n\n await initializeCore(config);\n await initializeServices(config);\n await initializeFeatureFlags(featureFlagStore);\n\n setIsReady(true);\n onReady?.(createServicesObject(config, featureFlagStore));\n } catch (err) {\n const initError = err instanceof Error ? err : new Error(String(err));\n setError(initError);\n onError?.(initError);\n globalThis.console.error('[PlyazProvider] Initialization failed:', initError);\n }\n }, [config, featureFlagStore, onReady, onError]);\n\n // Reinitialize function\n const reinitialize = useCallback(async () => {\n setIsReady(false);\n ServiceRegistry.disposeAll();\n await Core.reset();\n await initialize();\n }, [initialize]);\n\n // Initialize on mount\n useEffect(() => {\n void initialize();\n\n return () => {\n featureFlagStore.dispose();\n ServiceRegistry.disposeAll();\n };\n }, []); // Only run once on mount\n\n // Build context value\n const contextValue = useMemo<PlyazContextValue>(\n () => ({\n api: isReady ? ApiClientService : null,\n events: CoreEventManager,\n core: Core,\n featureFlags: {\n get: (key, def) => featureFlagStore.get(key, def),\n getAll: () => featureFlagStore.getAll(),\n refresh: () => featureFlagStore.refresh(),\n },\n appContext: config.appContext ?? 'webapp',\n environment: config.api.env ?? 'development',\n isReady,\n error,\n reinitialize,\n // ServiceRegistry access\n getService: <T extends CoreDomainServiceInstance>(key: string) => ServiceRegistry.get<T>(key),\n getServiceAsync: <T extends CoreDomainServiceInstance>(key: string) =>\n ServiceRegistry.getAsync<T>(key),\n hasService: (key: string) => ServiceRegistry.has(key),\n getServiceKeys: () => ServiceRegistry.getInitializedKeys(),\n }),\n [isReady, error, config.appContext, config.api.env, featureFlagStore, reinitialize]\n );\n\n // Handle error state\n if (error && !skipLoadingState) {\n return (\n <ApiProvider>\n <InitializationError error={error} errorComponent={errorComponent} />\n </ApiProvider>\n );\n }\n\n // Handle loading state\n if (!isReady && !skipLoadingState) {\n return (\n <ApiProvider>\n <InitializationLoading loading={loading} />\n </ApiProvider>\n );\n }\n\n // Render children with context and React Query\n return (\n <ApiProvider>\n <PlyazContext.Provider value={contextValue}>{children}</PlyazContext.Provider>\n </ApiProvider>\n );\n}\n\n// ============================================================================\n// Hooks\n// ============================================================================\n\n/**\n * Access all Plyaz services\n *\n * @example\n * ```tsx\n * function MyComponent() {\n * const { api, events, isReady, featureFlags } = usePlyaz();\n *\n * if (!isReady) return <Loading />;\n *\n * const handleClick = async () => {\n * const response = await api.getClient().get('/data');\n * events.emit('data:fetched', { data: response.data });\n * };\n *\n * return <button onClick={handleClick}>Fetch</button>;\n * }\n * ```\n */\nexport function usePlyaz(): PlyazContextValue {\n const context = useContext(PlyazContext);\n if (!context) {\n throw new Error(\n 'usePlyaz must be used within a PlyazProvider. ' +\n 'Wrap your app with <PlyazProvider config={...}>...</PlyazProvider>'\n );\n }\n return context;\n}\n\n/**\n * Access API client directly\n *\n * @example\n * ```tsx\n * function UserList() {\n * const api = useApi();\n * const [users, setUsers] = useState([]);\n *\n * useEffect(() => {\n * api.getClient().get('/users').then(res => setUsers(res.data));\n * }, [api]);\n *\n * return <ul>{users.map(u => <li key={u.id}>{u.name}</li>)}</ul>;\n * }\n * ```\n */\nexport function useApi(): typeof ApiClientService {\n const { api, isReady } = usePlyaz();\n if (!isReady || !api) {\n throw new Error('API client is not ready. Make sure PlyazProvider has finished initializing.');\n }\n return api;\n}\n\n/**\n * Access API client safely (returns null if not ready)\n */\nexport function useApiSafe(): typeof ApiClientService | null {\n const { api } = usePlyaz();\n return api;\n}\n\n/**\n * Access event manager\n *\n * @example\n * ```tsx\n * function NotificationListener() {\n * const events = useEvents();\n *\n * useEffect(() => {\n * const unsubscribe = events.on('notification:received', (event) => {\n * toast.show(event.data.message);\n * });\n * return unsubscribe;\n * }, [events]);\n *\n * return null;\n * }\n * ```\n */\nexport function useEvents(): typeof CoreEventManager {\n const { events } = usePlyaz();\n return events;\n}\n\n/**\n * Check if a feature flag is enabled\n *\n * @example\n * ```tsx\n * function FeatureComponent() {\n * const isEnabled = useFlag('NEW_DASHBOARD');\n *\n * if (!isEnabled) return null;\n * return <NewDashboard />;\n * }\n * ```\n */\nexport function useFlag(key: string, defaultValue = false): boolean {\n const { featureFlags } = usePlyaz();\n return featureFlags.get(key, defaultValue);\n}\n\n/**\n * Access feature flag utilities\n *\n * @example\n * ```tsx\n * function FlagManager() {\n * const flags = useFeatureFlags();\n * const allFlags = flags.getAll();\n *\n * return (\n * <div>\n * <pre>{JSON.stringify(allFlags, null, 2)}</pre>\n * <button onClick={flags.refresh}>Refresh Flags</button>\n * </div>\n * );\n * }\n * ```\n */\nexport function useFeatureFlags(): PlyazContextValue['featureFlags'] {\n const { featureFlags } = usePlyaz();\n return featureFlags;\n}\n\n/**\n * Check if Plyaz services are ready\n *\n * @example\n * ```tsx\n * function LoadingAwareComponent() {\n * const isReady = usePlyazReady();\n *\n * if (!isReady) return <Skeleton />;\n * return <ActualContent />;\n * }\n * ```\n */\nexport function usePlyazReady(): boolean {\n const { isReady } = usePlyaz();\n return isReady;\n}\n\n/**\n * Get current app context\n */\nexport function useAppContext(): CoreAppContext {\n const { appContext } = usePlyaz();\n return appContext;\n}\n\n/**\n * Get current environment\n */\nexport function useEnvironment(): CoreAppEnvironment {\n const { environment } = usePlyaz();\n return environment;\n}\n\n/**\n * Get a domain service by key.\n * Services must be registered in the `services` config.\n *\n * @param key - Service key (e.g., 'featureFlags', 'example')\n * @returns The service instance\n * @throws If service is not initialized or not found\n *\n * @example\n * ```tsx\n * function MyComponent() {\n * const flagService = useService<FeatureFlagDomainService>('featureFlags');\n *\n * useEffect(() => {\n * flagService.isEnabled('my-flag').then(console.log);\n * }, [flagService]);\n *\n * return <div>...</div>;\n * }\n * ```\n */\nexport function useService<T extends CoreDomainServiceInstance = CoreDomainServiceInstance>(\n key: string\n): T {\n const { getService, isReady } = usePlyaz();\n\n if (!isReady) {\n throw new Error(`PlyazProvider not ready. Cannot get service '${key}'.`);\n }\n\n return useMemo(() => getService<T>(key), [getService, key]);\n}\n\n/**\n * Get a domain service by key with loading state.\n * Useful for lazy-initialized services.\n *\n * @param key - Service key\n * @returns Object with service, loading state, and error\n *\n * @example\n * ```tsx\n * function MyComponent() {\n * const { service, isLoading, error } = useServiceAsync<ExampleDomainService>('example');\n *\n * if (isLoading) return <Spinner />;\n * if (error) return <Error message={error.message} />;\n *\n * return <div>{service?.serviceName}</div>;\n * }\n * ```\n */\nexport function useServiceAsync<T extends CoreDomainServiceInstance = CoreDomainServiceInstance>(\n key: string\n): { service: T | null; isLoading: boolean; error: Error | null } {\n const { getServiceAsync, isReady } = usePlyaz();\n const [service, setService] = useState<T | null>(null);\n const [isLoading, setIsLoading] = useState(true);\n const [error, setError] = useState<Error | null>(null);\n\n useEffect(() => {\n if (!isReady) return;\n\n let mounted = true;\n\n const loadService = async (): Promise<void> => {\n try {\n setIsLoading(true);\n const svc = await getServiceAsync<T>(key);\n if (mounted) {\n setService(svc);\n setIsLoading(false);\n }\n } catch (err) {\n if (mounted) {\n setError(err instanceof Error ? err : new Error(String(err)));\n setIsLoading(false);\n }\n }\n };\n\n void loadService();\n\n return () => {\n mounted = false;\n };\n }, [key, getServiceAsync, isReady]);\n\n return { service, isLoading, error };\n}\n\n/**\n * Check if a service is registered and available\n *\n * @example\n * ```tsx\n * function MyComponent() {\n * const hasFlags = useHasService('featureFlags');\n *\n * if (!hasFlags) {\n * return <div>Feature flags not configured</div>;\n * }\n *\n * return <FeatureFlagUI />;\n * }\n * ```\n */\nexport function useHasService(key: string): boolean {\n const { hasService } = usePlyaz();\n return hasService(key);\n}\n\n/**\n * Get all initialized service keys\n *\n * @example\n * ```tsx\n * function DebugPanel() {\n * const serviceKeys = useServiceKeys();\n *\n * return (\n * <div>\n * <h3>Loaded Services:</h3>\n * <ul>\n * {serviceKeys.map(key => <li key={key}>{key}</li>)}\n * </ul>\n * </div>\n * );\n * }\n * ```\n */\nexport function useServiceKeys(): string[] {\n const { getServiceKeys } = usePlyaz();\n return getServiceKeys();\n}\n\n// ============================================================================\n// Exports\n// ============================================================================\n\nexport { PlyazContext };\n","/**\n * Service Accessors (Generic)\n *\n * Generic utilities for accessing services from stores.\n * These work with any domain service, not just feature flags.\n */\n\nimport type { CoreDomainServiceInstance } from '@plyaz/types/core';\nimport { ServiceRegistry } from '../../init/ServiceRegistry';\n\n// ─────────────────────────────────────────────────────────────────────────────\n// Service Accessors\n// ─────────────────────────────────────────────────────────────────────────────\n\n/**\n * Create a service accessor function for use in stores.\n *\n * @param serviceKey - Key of the service in the registry\n * @returns Async function that returns the service instance\n *\n * @example\n * ```typescript\n * const getExampleService = createServiceAccessor<ExampleDomainService>('example');\n *\n * const myStoreSlice = {\n * async createEntity(data) {\n * const service = await getExampleService();\n * return service.create(data);\n * },\n * };\n * ```\n */\nexport function createServiceAccessor<T extends CoreDomainServiceInstance>(\n serviceKey: string\n): () => Promise<T> {\n return () => ServiceRegistry.getAsync<T>(serviceKey);\n}\n\n/**\n * Create multiple service accessors at once.\n *\n * @param keys - Object mapping accessor names to service keys\n * @returns Object with accessor functions\n *\n * @example\n * ```typescript\n * const services = createServiceAccessors({\n * flags: 'featureFlags',\n * examples: 'example',\n * users: 'users',\n * });\n *\n * const flags = await services.flags();\n * const example = await services.examples();\n * ```\n */\nexport function createServiceAccessors<T extends Record<string, string>>(\n keys: T\n): { [K in keyof T]: () => Promise<CoreDomainServiceInstance> } {\n const accessors = {} as { [K in keyof T]: () => Promise<CoreDomainServiceInstance> };\n\n for (const [name, key] of Object.entries(keys)) {\n accessors[name as keyof T] = createServiceAccessor(key);\n }\n\n return accessors;\n}\n\n// ─────────────────────────────────────────────────────────────────────────────\n// Zustand Middleware\n// ─────────────────────────────────────────────────────────────────────────────\n\n/**\n * Create a Zustand middleware that injects services into store actions.\n *\n * @param serviceKeys - Service keys to inject\n * @returns Zustand middleware function\n *\n * @example\n * ```typescript\n * import { create } from 'zustand';\n * import { withServices } from '@plyaz/core/frontend';\n *\n * interface MyStore {\n * items: Item[];\n * services: { example: ExampleDomainService };\n * fetchItems: () => Promise<void>;\n * }\n *\n * const useMyStore = create<MyStore>(\n * withServices(['example'], (set, get, services) => ({\n * items: [],\n * services,\n * fetchItems: async () => {\n * const items = await services.example.getAll();\n * set({ items });\n * },\n * }))\n * );\n * ```\n */\nexport function withServices<TServices extends Record<string, CoreDomainServiceInstance>>(\n serviceKeys: string[],\n createStore: (set: (partial: unknown) => void, get: () => unknown, services: TServices) => unknown\n): (set: (partial: unknown) => void, get: () => unknown) => unknown {\n return (set: (partial: unknown) => void, get: () => unknown): unknown => {\n // Create lazy service proxies\n const services = {} as TServices;\n\n for (const key of serviceKeys) {\n Object.defineProperty(services, key, {\n get: () => ServiceRegistry.get(key),\n enumerable: true,\n });\n }\n\n return createStore(set, get, services);\n };\n}\n","/**\n * Feature Flag Store Integration\n *\n * Utilities for integrating feature flags with Zustand stores.\n * Implements the \"pull\" pattern where stores fetch from services.\n */\n\nimport { ServiceRegistry } from '../../init/ServiceRegistry';\nimport type { FeatureFlagValue, FeatureFlagContext } from '@plyaz/types/features';\n\n// Re-export types from @plyaz/types/core\nexport type {\n CoreFeatureFlagServiceLike,\n CoreFeatureFlagFetcherOptions,\n CoreFeatureFlagStoreInitConfig,\n} from '@plyaz/types/core';\n\n// Import for local use\nimport type {\n CoreFeatureFlagServiceLike,\n CoreFeatureFlagFetcherOptions,\n CoreFeatureFlagStoreInitConfig,\n} from '@plyaz/types/core';\n\n// ─────────────────────────────────────────────────────────────────────────────\n// Fetcher Factory\n// ─────────────────────────────────────────────────────────────────────────────\n\n/**\n * Create a fetchFn for feature flag store that uses ServiceRegistry.\n *\n * This bridges the ServiceRegistry with the store's callback-based pattern.\n * Use this for polling or manual refresh scenarios.\n *\n * @param options - Fetcher options\n * @returns A function compatible with store initialization\n *\n * @example\n * ```typescript\n * // Basic usage\n * const fetchFn = createFeatureFlagFetcher();\n *\n * // With context\n * const fetchFn = createFeatureFlagFetcher({\n * context: { userId: currentUser.id },\n * });\n *\n * // Use in store initializer\n * useFeatureFlagInitializer({ fetchFn });\n * ```\n */\nexport function createFeatureFlagFetcher(\n options: CoreFeatureFlagFetcherOptions = {}\n): () => Promise<Record<string, FeatureFlagValue>> {\n const { serviceKey = 'featureFlags', context, transform } = options;\n\n return async (): Promise<Record<string, FeatureFlagValue>> => {\n const service = await ServiceRegistry.getAsync<CoreFeatureFlagServiceLike>(serviceKey);\n const flags = await service.evaluateAll(context);\n\n // Extract values from evaluations\n const values: Record<string, FeatureFlagValue> = {};\n for (const [key, evaluation] of Object.entries(flags)) {\n if (evaluation && typeof evaluation === 'object' && 'value' in evaluation) {\n values[key] = (evaluation as { value: FeatureFlagValue }).value;\n } else {\n values[key] = evaluation as FeatureFlagValue;\n }\n }\n\n return transform ? transform(values) : values;\n };\n}\n\n/**\n * Create full store initialization config with ServiceRegistry integration.\n *\n * @param options - Configuration options\n * @returns Config object for store initialization\n *\n * @example\n * ```typescript\n * const storeConfig = createFeatureFlagStoreConfig({\n * context: { userId: user.id },\n * defaults: { 'MY_FLAG': false },\n * polling: { enabled: true, interval: 30000 },\n * onFlagChange: (key, prev, next) => console.log(`${key}: ${prev} → ${next}`),\n * });\n *\n * useFeatureFlagInitializer(storeConfig);\n * ```\n */\nexport function createFeatureFlagStoreConfig(options: {\n serviceKey?: string;\n context?: FeatureFlagContext;\n defaults?: Record<string, FeatureFlagValue>;\n polling?: { enabled?: boolean; interval?: number };\n onFlagChange?: (\n key: string,\n prevValue: FeatureFlagValue | undefined,\n newValue: FeatureFlagValue\n ) => void;\n onError?: (error: unknown) => void;\n}): CoreFeatureFlagStoreInitConfig {\n const { serviceKey, context, defaults, polling, onFlagChange, onError } = options;\n\n return {\n fetchFn: createFeatureFlagFetcher({ serviceKey, context }),\n defaults,\n polling,\n onFlagChange,\n onError,\n };\n}\n"]}
|
|
1
|
+
{"version":3,"sources":["../src/base/cache/strategies/redis.ts","../src/utils/common/hash.ts","../src/utils/common/id.ts","../src/utils/common/values.ts","../src/events/CoreEventManager.ts","../src/services/ApiClientService.ts","../src/base/observability/BaseAdapter.ts","../src/base/observability/LoggerAdapter.ts","../src/base/observability/ObservabilityService.ts","../src/config/dependencies.ts","../src/init/ServiceRegistry.ts","../src/utils/runtime.ts","../src/init/CoreInitializer.ts","../src/domain/base/BaseDomainService.ts","../src/domain/base/BaseFrontendDomainService.ts","../src/domain/base/BaseMapper.ts","../src/domain/base/BaseValidator.ts","../src/utils/mapperUtils.ts","../src/frontend/components/InitializationError.tsx","../src/frontend/components/InitializationLoading.tsx","../src/base/cache/strategies/memory.ts","../src/base/cache/index.ts","../src/domain/example/mappers/ExampleMapper.ts","../src/domain/example/FrontendExampleDomainService.ts","../src/utils/featureFlags/context.ts","../src/utils/featureFlags/conditions.ts","../src/engine/featureFlags/engine.ts","../src/domain/featureFlags/provider.ts","../src/domain/featureFlags/providers/api.ts","../src/domain/featureFlags/FrontendFeatureFlagDomainService.ts","../src/frontend/providers/ApiProvider.tsx","../src/frontend/providers/PlyazProvider.tsx","../src/frontend/store/service-accessors.ts","../src/frontend/store/feature-flags.ts"],"names":["CorePackageError","ERROR_CODES","PackageLogger","logger","BACKEND_RUNTIMES","FRONTEND_RUNTIMES","CORE_EVENTS","createApiClient","setDefaultApiClient","STORE_KEYS","BaseError","OBSERVABILITY_METRICS","API_ERROR_CODES","HTTP_STATUS","jsx","Fragment","TIME_CONSTANTS","RedisCacheStrategy","apiEvaluateAllFlags","apiCreateFlag","apiUpdateFlag","apiDeleteFlag","apiFetchRules","SERVICE_KEYS","error","jsxs","useState","useEffect","ApiProvider"],"mappings":"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","file":"entry-frontend.mjs","sourcesContent":["/**\n * Redis Cache Strategy\n *\n * Redis-based cache implementation for distributed caching.\n * This will be moved to @plyaz/core when the package structure is finalized.\n *\n * @fileoverview Redis cache strategy implementation\n * @version 1.0.0\n */\n\nimport { TIME_CONSTANTS } from '@plyaz/config';\nimport type { CacheStrategy, CacheEntry, CacheStats, RedisCacheConfig } from '@plyaz/types';\nimport { ERROR_CODES } from '@plyaz/types';\nimport { CorePackageError } from '@plyaz/errors';\nimport type { Redis as IoRedisClientType } from 'ioredis';\n\n/**\n * Redis cache strategy implementation.\n * Provides distributed caching for multi-instance applications.\n *\n * @class RedisCacheStrategy\n * @implements {CacheStrategy}\n *\n * @example\n * ```typescript\n * const cache = new RedisCacheStrategy({\n * url: 'redis://localhost:6379',\n * keyPrefix: 'app:cache:'\n * });\n *\n * await cache.set('key', entry);\n * const cached = await cache.get('key');\n * ```\n */\nexport class RedisCacheStrategy implements CacheStrategy {\n private client!: IoRedisClientType;\n private stats = {\n hitCount: 0,\n missCount: 0,\n setCount: 0,\n deleteCount: 0,\n };\n private isConnected = false;\n private readonly keyPrefix: string;\n\n /**\n * Creates a new Redis cache strategy.\n *\n * @param config - Redis cache configuration\n */\n constructor(private config: RedisCacheConfig) {\n if (!config.url) {\n throw new CorePackageError('Redis URL is required', ERROR_CODES.CLIENT_INVALID_CONFIG);\n }\n this.keyPrefix = config.keyPrefix ?? 'cache:';\n }\n\n /**\n * Stores a cache entry in Redis.\n *\n * @param key - Cache key\n * @param entry - Cache entry to store\n * @returns Promise that resolves when entry is stored\n */\n async set<T>(key: string, entry: CacheEntry<T>): Promise<void> {\n await this.ensureConnected();\n\n const redisKey = this.buildRedisKey(key);\n const serializedEntry = JSON.stringify(entry);\n\n // Calculate TTL in seconds\n const ttlMs = entry.expiresAt - Date.now();\n const ttlSeconds = Math.max(1, Math.ceil(ttlMs / TIME_CONSTANTS.MILLISECONDS_PER_SECOND));\n\n await this.client.set(redisKey, serializedEntry, 'EX', ttlSeconds);\n this.stats.setCount++;\n }\n\n /**\n * Retrieves a cache entry from Redis.\n *\n * @param key - Cache key\n * @returns Promise that resolves to cache entry or null if not found\n */\n async get<T>(key: string): Promise<CacheEntry<T> | null> {\n await this.ensureConnected();\n\n const redisKey = this.buildRedisKey(key);\n const serializedEntry = await this.client.get(redisKey);\n\n if (!serializedEntry || typeof serializedEntry !== 'string') {\n this.stats.missCount++;\n return null;\n }\n\n try {\n const entry = JSON.parse(serializedEntry) as CacheEntry<T>;\n this.stats.hitCount++;\n return entry;\n } catch {\n // Invalid JSON, remove the corrupted entry\n await this.client.del(redisKey);\n this.stats.missCount++;\n return null;\n }\n }\n\n /**\n * Removes a cache entry from Redis.\n *\n * @param key - Cache key to remove\n * @returns Promise that resolves when entry is removed\n */\n async delete(key: string): Promise<void> {\n await this.ensureConnected();\n\n const redisKey = this.buildRedisKey(key);\n await this.client.del(redisKey);\n this.stats.deleteCount++;\n }\n\n /**\n * Clears all cache entries from Redis.\n * This removes all keys with the configured prefix.\n *\n * @returns Promise that resolves when cache is cleared\n */\n async clear(): Promise<void> {\n await this.ensureConnected();\n\n const pattern = `${this.keyPrefix}*`;\n\n const keys = await this.client.keys(pattern);\n if (keys.length > 0) {\n await this.client.del(...keys);\n }\n\n this.stats.hitCount = 0;\n this.stats.missCount = 0;\n }\n\n /**\n * Gets cache statistics.\n *\n * @returns Promise that resolves to cache statistics\n */\n async getStats(): Promise<CacheStats> {\n await this.ensureConnected();\n\n // Get approximate entry count\n const pattern = `${this.keyPrefix}*`;\n const keys = await this.client.keys(pattern);\n const entryCount = Array.isArray(keys) ? keys.length : 0;\n\n const totalRequests = this.stats.hitCount + this.stats.missCount;\n const hitRatio = totalRequests > 0 ? this.stats.hitCount / totalRequests : 0;\n\n return {\n hits: this.stats.hitCount,\n misses: this.stats.missCount,\n sets: this.stats.setCount,\n deletes: this.stats.deleteCount,\n size: entryCount,\n hitRatio,\n };\n }\n\n /**\n * Disposes of the Redis cache and cleans up resources.\n *\n * @returns Promise that resolves when cleanup is complete\n */\n async dispose(): Promise<void> {\n if (this.client && this.isConnected) {\n await this.client.quit();\n this.isConnected = false;\n }\n }\n\n /**\n * Ensures Redis connection is established.\n *\n * @private\n * @returns Promise that resolves when connected\n */\n private async ensureConnected(): Promise<void> {\n if (this.isConnected) return;\n\n try {\n this.client = await this.createIoRedisClient();\n this.isConnected = true;\n } catch (error) {\n throw new CorePackageError(\n `Failed to connect to Redis: ${error instanceof Error ? error.message : 'Unknown error'}`,\n ERROR_CODES.DB_CONNECTION_FAILED\n );\n }\n }\n\n /**\n * Creates an ioredis client.\n *\n * @private\n * @returns Promise that resolves to ioredis client\n */\n private async createIoRedisClient(): Promise<IoRedisClientType> {\n const DEFAULT_TIMEOUT = 5000;\n const defaultOptions = {\n connectTimeout: DEFAULT_TIMEOUT,\n commandTimeout: DEFAULT_TIMEOUT,\n enableOfflineQueue: false,\n } satisfies {\n connectTimeout: number;\n commandTimeout: number;\n enableOfflineQueue: boolean;\n };\n\n const Redis = await import('ioredis');\n const client = new Redis.default(this.config.url, {\n connectTimeout: this.config.connectTimeout ?? defaultOptions.connectTimeout,\n commandTimeout: this.config.commandTimeout ?? defaultOptions.commandTimeout,\n enableOfflineQueue: defaultOptions.enableOfflineQueue,\n });\n\n // Wait for connection\n await new Promise((resolve, reject) => {\n client.on('ready', resolve);\n client.on('error', reject);\n });\n\n return client;\n }\n\n /**\n * Builds a Redis key with the configured prefix.\n *\n * @private\n * @param key - Base cache key\n * @returns Redis key with prefix\n */\n private buildRedisKey(key: string): string {\n return `${this.keyPrefix}${key}`;\n }\n}\n","/**\n * Hash Utilities\n *\n * Common hashing functions for consistent data distribution and rollouts.\n *\n * @fileoverview Hash utility functions\n * @version 1.0.0\n */\n\nimport { MATH_CONSTANTS, FNV_CONSTANTS, HASH_SEED_CONSTANTS } from '@plyaz/config';\n\n/**\n * Optimized string hashing function for consistent distribution.\n * Uses FNV-1a hash algorithm for better distribution and performance.\n * FNV-1a provides excellent avalanche properties and is faster than\n * polynomial rolling hash for short to medium strings.\n *\n * @param str - String to hash\n * @returns Positive hash value\n *\n * @example\n * ```typescript\n * const hash = hashString('user123:AUTH_GOOGLE');\n * const bucket = hash % 100; // 0-99\n * ```\n *\n * @remarks\n * FNV-1a algorithm benefits:\n * - Excellent distribution for hash tables\n * - Fast computation with minimal operations\n * - Good avalanche effect (small input changes create large output changes)\n * - Consistent timing reduces timing attack vulnerabilities\n */\nexport function hashString(str: string): number {\n // Handle empty string edge case early\n if (str.length === 0) return 0;\n\n // Use FNV-1a constants from config\n let hash: number = FNV_CONSTANTS.FNV_32_OFFSET;\n\n // Process string with FNV-1a algorithm\n // Using charCodeAt is faster than alternatives and handles Unicode correctly\n for (let i = 0; i < str.length; i++) {\n // XOR with byte value then multiply by prime\n // This order (XOR first) is what makes it FNV-1a vs FNV-1\n hash ^= str.charCodeAt(i);\n hash = Math.imul(hash, FNV_CONSTANTS.FNV_32_PRIME) >>> 0; // Ensure 32-bit unsigned\n }\n\n // Ensure positive value using >>> 0 for unsigned 32-bit conversion\n // This is more efficient than Math.abs() and handles edge cases better\n return hash >>> 0;\n}\n\n/**\n * Determines if a user should be included in a rollout based on percentage.\n * Uses consistent hashing to ensure the same user always gets the same result.\n *\n * @param identifier - Unique identifier for consistency (e.g., userId, flagKey)\n * @param percentage - Rollout percentage (0-100)\n * @returns true if identifier should be included in rollout\n *\n * @example\n * ```typescript\n * const shouldInclude = isInRollout('user123:AUTH_GOOGLE', 25); // 25% rollout\n * ```\n */\nexport function isInRollout(identifier: string, percentage: number): boolean {\n if (percentage >= MATH_CONSTANTS.PERCENTAGE_MAX) return true;\n if (percentage <= 0) return false;\n\n const hash = hashString(identifier);\n return hash % MATH_CONSTANTS.PERCENTAGE_MAX < percentage;\n}\n\n/**\n * Creates a consistent rollout identifier for a user and feature.\n *\n * @param featureKey - Feature or flag key\n * @param userId - User identifier (defaults to 'anonymous')\n * @returns Consistent identifier for rollout calculations\n *\n * @example\n * ```typescript\n * const identifier = createRolloutIdentifier('AUTH_GOOGLE', 'user123');\n * const inRollout = isInRollout(identifier, 50);\n * ```\n */\nexport function createRolloutIdentifier(featureKey: string, userId?: string): string {\n const trimmedUserId = userId?.trim();\n const effectiveUserId = trimmedUserId && trimmedUserId.length > 0 ? trimmedUserId : 'anonymous';\n return `${featureKey}:${effectiveUserId}`;\n}\n\n/**\n * Hash-based utilities for consistent data operations.\n */\nexport const HashUtils = {\n /**\n * Generates a hash-based bucket for load balancing or distribution.\n *\n * @param identifier - Unique identifier\n * @param bucketCount - Number of buckets (default: 10)\n * @returns Bucket number (0 to bucketCount-1)\n */\n getBucket: (identifier: string, bucketCount: number = 10): number => {\n return hashString(identifier) % bucketCount;\n },\n\n /**\n * Checks if an identifier falls within a specific bucket range.\n *\n * @param identifier - Unique identifier\n * @param startBucket - Starting bucket (inclusive)\n * @param endBucket - Ending bucket (inclusive)\n * @param totalBuckets - Total number of buckets (default: 100)\n * @returns true if identifier is in the bucket range\n */\n isInBucketRange: (\n identifier: string,\n startBucket: number,\n endBucket: number,\n totalBuckets: number = MATH_CONSTANTS.PERCENTAGE_MAX\n ): boolean => {\n const bucket = hashString(identifier) % totalBuckets;\n return bucket >= startBucket && bucket <= endBucket;\n },\n\n /**\n * Creates a deterministic random seed from a string.\n * Uses the improved hash function and ensures the seed is within\n * the safe range for JavaScript's Math.random seeding.\n *\n * @param str - String to convert to seed\n * @returns Deterministic seed value (0 to 2^31-1)\n */\n createSeed: (str: string): number => {\n // Use constant from config for consistency\n return hashString(str) % HASH_SEED_CONSTANTS.MAX_SAFE_SEED;\n },\n} as const;\n","/**\n * ID Generation Utilities\n *\n * Provides consistent ID generation across the application.\n * Uses globalThis.crypto when available, with a fallback for environments without it.\n *\n * @fileoverview ID generation utility functions\n */\n\n// Constants for ID generation\nconst RANDOM_ID_RADIX = 36;\nconst RANDOM_ID_SLICE_START = 2;\nconst SHORT_ID_LENGTH = 8;\nconst HEX_RADIX = 16;\nconst HEX_SLICE_START = 2;\nconst HEX_SLICE_END = 18;\nconst SPAN_ID_LENGTH = 16;\n\n/**\n * Generate a UUID v4 string.\n * Uses crypto.randomUUID when available, otherwise falls back to a timestamp-based ID.\n *\n * @returns A UUID v4 string or fallback ID\n *\n * @example\n * ```typescript\n * const id = generateId();\n * // => 'a1b2c3d4-e5f6-7890-abcd-ef1234567890' (crypto available)\n * // => '1701475200000-x7k9m2' (fallback)\n * ```\n */\nexport function generateId(): string {\n const cryptoApi = globalThis.crypto as { randomUUID?: () => string } | undefined;\n if (cryptoApi?.randomUUID) {\n return cryptoApi.randomUUID();\n }\n return `${Date.now()}-${Math.random().toString(RANDOM_ID_RADIX).slice(RANDOM_ID_SLICE_START)}`;\n}\n\n/**\n * Generate a short random ID (8 characters).\n * Useful for correlation IDs, short references, etc.\n *\n * @returns A short random string\n *\n * @example\n * ```typescript\n * const shortId = generateShortId();\n * // => 'x7k9m2ab'\n * ```\n */\nexport function generateShortId(): string {\n const cryptoApi = globalThis.crypto as { randomUUID?: () => string } | undefined;\n if (cryptoApi?.randomUUID) {\n return cryptoApi.randomUUID().replace(/-/g, '').slice(0, SHORT_ID_LENGTH);\n }\n return Math.random()\n .toString(RANDOM_ID_RADIX)\n .slice(RANDOM_ID_SLICE_START, RANDOM_ID_SLICE_START + SHORT_ID_LENGTH);\n}\n\n/**\n * Generate a correlation ID for tracing.\n * Format: timestamp-randomString\n *\n * @returns A correlation ID string\n *\n * @example\n * ```typescript\n * const correlationId = generateCorrelationId();\n * // => '1701475200000-x7k9m2'\n * ```\n */\nexport function generateCorrelationId(): string {\n return `${Date.now()}-${generateShortId()}`;\n}\n\n/**\n * Generate a trace ID for distributed tracing (32 hex characters / 128 bits).\n *\n * @returns A 32-character hex string\n *\n * @example\n * ```typescript\n * const traceId = generateTraceId();\n * // => 'a1b2c3d4e5f67890abcdef1234567890'\n * ```\n */\nexport function generateTraceId(): string {\n const cryptoApi = globalThis.crypto as { randomUUID?: () => string } | undefined;\n if (cryptoApi?.randomUUID) {\n // Use two UUIDs without dashes to get 64 hex chars, take first 32\n return cryptoApi.randomUUID().replace(/-/g, '');\n }\n // Fallback: concatenate two random hex strings\n return (\n Math.random().toString(HEX_RADIX).substring(HEX_SLICE_START, HEX_SLICE_END) +\n Math.random().toString(HEX_RADIX).substring(HEX_SLICE_START, HEX_SLICE_END)\n );\n}\n\n/**\n * Generate a span ID for distributed tracing (16 hex characters / 64 bits).\n *\n * @returns A 16-character hex string\n *\n * @example\n * ```typescript\n * const spanId = generateSpanId();\n * // => 'a1b2c3d4e5f67890'\n * ```\n */\nexport function generateSpanId(): string {\n const cryptoApi = globalThis.crypto as { randomUUID?: () => string } | undefined;\n if (cryptoApi?.randomUUID) {\n // Use UUID without dashes, take first 16 chars\n return cryptoApi.randomUUID().replace(/-/g, '').substring(0, SPAN_ID_LENGTH);\n }\n // Fallback: random hex string\n return Math.random().toString(HEX_RADIX).substring(HEX_SLICE_START, HEX_SLICE_END);\n}\n\n/**\n * ID generation utilities object for convenient access.\n */\nexport const IdUtils = {\n generate: generateId,\n generateShort: generateShortId,\n generateCorrelation: generateCorrelationId,\n generateTraceId,\n generateSpanId,\n} as const;\n","/* eslint-disable complexity */\n/**\n * Value Utilities\n *\n * Common utility functions for working with different value types.\n *\n * @fileoverview Value manipulation utilities\n * @version 1.0.0\n */\n\nimport { MATH_CONSTANTS } from '@plyaz/config';\n\n/**\n * Determines if a value should be considered 'truthy' for feature flags.\n * More strict than JavaScript's built-in truthiness.\n *\n * @param value - The value to check\n * @returns true if the value is considered enabled/truthy\n *\n * @example\n * ```typescript\n * isTruthy(true) // true\n * isTruthy('enabled') // true\n * isTruthy('') // false\n * isTruthy('false') // false\n * isTruthy(0) // false\n * isTruthy(42) // true\n * isTruthy({}) // false\n * ```\n */\n// Helper function to check if a string is falsy\nfunction isStringFalsy(value: string): boolean {\n if (value === '') return true;\n const lower = value.toLowerCase().trim();\n return ['false', 'no', '0', 'off', 'disabled'].includes(lower);\n}\n\n// Helper function to check if an object is truthy\nfunction isObjectTruthy(value: object): boolean {\n if (Array.isArray(value)) return value.length > 0;\n if (value instanceof Map || value instanceof Set) return value.size > 0;\n if (value.constructor === Object) return Object.keys(value).length > 0;\n return true; // All other objects (Date, RegExp, etc) are truthy\n}\n\nexport function isTruthy(value: unknown): boolean {\n if (value === null || value === undefined) return false;\n\n switch (typeof value) {\n case 'boolean':\n return value;\n case 'string':\n return !isStringFalsy(value);\n case 'number':\n return value !== 0 && !isNaN(value);\n case 'function':\n case 'symbol':\n return true;\n case 'object':\n return isObjectTruthy(value);\n default:\n return false;\n }\n}\n\n/**\n * Safely converts a value to a boolean with feature flag semantics.\n *\n * @param value - Value to convert\n * @param defaultValue - Default if conversion fails (default: false)\n * @returns Boolean representation\n *\n * @example\n * ```typescript\n * toBoolean('true') // true\n * toBoolean('yes') // true\n * toBoolean('1') // true\n * toBoolean('false') // false\n * toBoolean('no') // false\n * toBoolean('0') // false\n * ```\n */\n// Helper function to parse string to boolean\nfunction parseStringToBoolean(value: string, defaultValue: boolean): boolean {\n const lower = value.toLowerCase();\n if (['true', 'yes', '1', 'on', 'enabled'].includes(lower)) return true;\n if (['false', 'no', '0', 'off', 'disabled'].includes(lower)) return false;\n return defaultValue;\n}\n\nexport function toBoolean(value: unknown, defaultValue: boolean = false): boolean {\n if (value === null || value === undefined) return false;\n\n switch (typeof value) {\n case 'boolean':\n return value;\n case 'string':\n return parseStringToBoolean(value, defaultValue);\n case 'number':\n return value !== 0 && !isNaN(value);\n case 'object':\n case 'function':\n return true;\n default:\n return defaultValue;\n }\n}\n\n/**\n * Value validation and conversion utilities.\n */\nexport const ValueUtils = {\n /**\n * Checks if a value is a valid percentage (0-100).\n *\n * @param value - Value to check\n * @returns true if valid percentage\n */\n isValidPercentage: (value: unknown): boolean => {\n if (typeof value !== 'number') return false;\n return !isNaN(value) && isFinite(value) && value >= 0 && value <= MATH_CONSTANTS.PERCENTAGE_MAX;\n },\n\n /**\n * Clamps a number to a specific range.\n *\n * @param value - Value to clamp\n * @param min - Minimum value\n * @param max - Maximum value\n * @returns Clamped value\n */\n clamp: (value: number, min: number, max: number): number => {\n return Math.min(Math.max(value, min), max);\n },\n\n /**\n * Checks if a value is empty (null, undefined, empty string, empty array).\n *\n * @param value - Value to check\n * @returns true if empty\n */\n isEmpty: (value: unknown): boolean => {\n if (value === null || value === undefined) return true;\n if (typeof value === 'string') return value.trim() === '';\n if (Array.isArray(value)) return value.length === 0;\n if (typeof value === 'object') return Object.keys(value).length === 0;\n return false;\n },\n\n /**\n * Safely gets a nested property from an object.\n *\n * @param obj - Object to query\n * @param path - Dot-separated path (e.g., 'user.profile.name')\n * @param defaultValue - Default if path doesn't exist\n * @returns Property value or default\n */\n getNestedProperty: (obj: unknown, path: string, defaultValue?: unknown): unknown => {\n if (!obj || typeof obj !== 'object') return defaultValue;\n\n const keys = path.split('.');\n let current: unknown = obj;\n\n for (const key of keys) {\n if (current == null || typeof current !== 'object') return defaultValue;\n current = (current as Record<string, unknown>)[key];\n if (current === undefined) return defaultValue;\n }\n\n return current;\n },\n} as const;\n","/**\n * Core Event Manager\n *\n * Type-safe event system for the Plyaz ecosystem.\n * Services emit events → Store, API cache, and UI subscribe independently.\n *\n * @example\n * ```typescript\n * import { CoreEventManager, CORE_EVENTS } from '@plyaz/core/events';\n *\n * // Type-safe emission (using CORE_EVENTS constants)\n * CoreEventManager.emit(CORE_EVENTS.API.REQUEST_ERROR, {\n * method: 'GET',\n * url: '/api/users',\n * requestId: '123',\n * error: new Error('Failed'),\n * duration: 500,\n * });\n *\n * // Type-safe subscription\n * CoreEventManager.on(CORE_EVENTS.AUTH.LOGIN, (event) => {\n * console.log(event.data.userId); // Typed!\n * });\n *\n * // Custom events (with generic type)\n * CoreEventManager.emit<MyPayload>('custom:event', { custom: 'data' });\n * ```\n */\n\nimport { EventEmitter } from 'events';\nimport type { CoreEventPayloadMap, CoreEventScopeType, CoreEvent } from '@plyaz/types/core';\nimport { generateCorrelationId } from '../utils/common';\n\n/**\n * Core Event Manager\n *\n * Features:\n * - Type-safe event emission and subscription via CORE_EVENTS constants\n * - Scope-based event filtering\n * - Wildcard subscriptions\n * - Auto cleanup on dispose\n * - Correlation IDs for tracing\n *\n * @example\n * ```typescript\n * import { CoreEventManager, CORE_EVENTS } from '@plyaz/core/events';\n *\n * // Type-safe with CORE_EVENTS\n * CoreEventManager.emit(CORE_EVENTS.AUTH.LOGIN, {\n * userId: '123',\n * method: 'email',\n * });\n *\n * CoreEventManager.on(CORE_EVENTS.AUTH.LOGIN, (event) => {\n * console.log(event.data.userId); // Typed as string!\n * });\n *\n * // Custom events with explicit type\n * interface MyPayload { custom: string }\n * CoreEventManager.emit<MyPayload>('custom:event', { custom: 'data' });\n * ```\n */\n\n// Constants\nconst MAX_EVENT_LISTENERS = 100;\n\nclass CoreEventManagerClass {\n private emitter = new EventEmitter();\n private subscriptions = new Map<string, Set<(event: CoreEvent<unknown, string>) => void>>();\n\n constructor() {\n // Increase max listeners for large apps\n this.emitter.setMaxListeners(MAX_EVENT_LISTENERS);\n }\n\n /**\n * Emit an event\n *\n * @param eventType - Event type from CORE_EVENTS or custom string\n * @param data - Event payload (type-safe when using CORE_EVENTS)\n *\n * @example\n * ```typescript\n * // Type-safe with CORE_EVENTS\n * CoreEventManager.emit(CORE_EVENTS.AUTH.LOGIN, { userId: '123', method: 'email' });\n *\n * // Custom event\n * CoreEventManager.emit<MyPayload>('custom:event', { custom: 'data' });\n * ```\n */\n emit<T extends keyof CoreEventPayloadMap>(eventType: T, data: CoreEventPayloadMap[T]): boolean;\n emit<TData = unknown>(eventType: string, data?: TData): boolean;\n emit<TData = unknown>(eventType: string, data?: TData): boolean {\n const [scope] = eventType.split(':');\n const event: CoreEvent<TData, string> = {\n type: eventType,\n scope: scope ?? 'system',\n timestamp: Date.now(),\n correlationId: this.getCorrelationId(),\n data: data as TData,\n };\n\n // Emit to specific listeners\n this.emitter.emit(eventType, event);\n\n // Emit to wildcard listeners\n this.emitter.emit('*', event);\n\n return true;\n }\n\n /**\n * Subscribe to an event\n *\n * @param eventType - Event type from CORE_EVENTS or custom string\n * @param handler - Event handler (type-safe when using CORE_EVENTS)\n * @returns Unsubscribe function\n *\n * @example\n * ```typescript\n * // Type-safe with CORE_EVENTS\n * const unsub = CoreEventManager.on(CORE_EVENTS.AUTH.LOGIN, (event) => {\n * console.log(event.data.userId); // Typed!\n * });\n *\n * // Custom event\n * CoreEventManager.on<MyPayload>('custom:event', (event) => {\n * console.log(event.data.custom);\n * });\n * ```\n */\n on<T extends keyof CoreEventPayloadMap>(\n eventType: T,\n handler: (event: CoreEvent<CoreEventPayloadMap[T], CoreEventScopeType>) => void\n ): () => void;\n on<TData = unknown, TScope extends string = string>(\n eventType: string,\n handler: (event: CoreEvent<TData, TScope>) => void\n ): () => void;\n on<TData = unknown, TScope extends string = string>(\n eventType: string,\n handler: (event: CoreEvent<TData, TScope>) => void\n ): () => void {\n this.emitter.on(eventType, handler as (event: CoreEvent<unknown, string>) => void);\n\n // Track for cleanup\n if (!this.subscriptions.has(eventType)) {\n this.subscriptions.set(eventType, new Set());\n }\n this.subscriptions.get(eventType)!.add(handler as (event: CoreEvent<unknown, string>) => void);\n\n // Return unsubscribe function\n return () => {\n this.emitter.off(eventType, handler as (event: CoreEvent<unknown, string>) => void);\n this.subscriptions\n .get(eventType)\n ?.delete(handler as (event: CoreEvent<unknown, string>) => void);\n };\n }\n\n /**\n * Subscribe once to an event\n *\n * @param eventType - Event type from CORE_EVENTS or custom string\n * @param handler - Event handler\n * @returns Unsubscribe function\n */\n once<T extends keyof CoreEventPayloadMap>(\n eventType: T,\n handler: (event: CoreEvent<CoreEventPayloadMap[T], CoreEventScopeType>) => void\n ): () => void;\n once<TData = unknown, TScope extends string = string>(\n eventType: string,\n handler: (event: CoreEvent<TData, TScope>) => void\n ): () => void;\n once<TData = unknown, TScope extends string = string>(\n eventType: string,\n handler: (event: CoreEvent<TData, TScope>) => void\n ): () => void {\n const wrappedHandler = (event: CoreEvent<TData, TScope>): void => {\n handler(event);\n this.emitter.off(eventType, wrappedHandler as (event: CoreEvent<unknown, string>) => void);\n this.subscriptions\n .get(eventType)\n ?.delete(wrappedHandler as (event: CoreEvent<unknown, string>) => void);\n };\n\n this.emitter.on(eventType, wrappedHandler as (event: CoreEvent<unknown, string>) => void);\n\n // Track for cleanup\n if (!this.subscriptions.has(eventType)) {\n this.subscriptions.set(eventType, new Set());\n }\n this.subscriptions\n .get(eventType)!\n .add(wrappedHandler as (event: CoreEvent<unknown, string>) => void);\n\n // Return unsubscribe function\n return () => {\n this.emitter.off(eventType, wrappedHandler as (event: CoreEvent<unknown, string>) => void);\n this.subscriptions\n .get(eventType)\n ?.delete(wrappedHandler as (event: CoreEvent<unknown, string>) => void);\n };\n }\n\n /**\n * Subscribe to all events in a scope\n *\n * @param scope - Event scope to listen to (e.g., CoreEventScope.AUTH)\n * @param handler - Event handler\n * @returns Unsubscribe function\n *\n * @example\n * ```typescript\n * CoreEventManager.onScope(CoreEventScope.AUTH, (event) => {\n * // Handles auth:login, auth:logout, auth:tokenRefresh, etc.\n * console.log(`Auth event: ${event.type}`, event.data);\n * });\n * ```\n */\n onScope<TScope extends string = string, TData = unknown>(\n scope: TScope,\n handler: (event: CoreEvent<TData, TScope>) => void\n ): () => void {\n const wrappedHandler = (event: CoreEvent<TData, TScope>): void => {\n if (event.scope === scope) {\n handler(event);\n }\n };\n return this.on('*', wrappedHandler as (event: CoreEvent<unknown, string>) => void);\n }\n\n /**\n * Remove a specific handler from an event\n *\n * @param eventType - Event type\n * @param handler - Handler to remove\n */\n off<TData = unknown, TScope extends string = string>(\n eventType: string,\n handler: (event: CoreEvent<TData, TScope>) => void\n ): void {\n this.emitter.off(eventType, handler as (event: CoreEvent<unknown, string>) => void);\n this.subscriptions\n .get(eventType)\n ?.delete(handler as (event: CoreEvent<unknown, string>) => void);\n }\n\n /**\n * Dispose all subscriptions\n */\n dispose(): void {\n this.subscriptions.forEach((handlers, eventType) => {\n handlers.forEach(handler => this.emitter.off(eventType, handler));\n });\n this.subscriptions.clear();\n this.emitter.removeAllListeners();\n }\n\n /**\n * Generate correlation ID for event tracing\n */\n private getCorrelationId(): string {\n return generateCorrelationId();\n }\n}\n\n// Singleton export\nexport const CoreEventManager = new CoreEventManagerClass();\n","/**\n * API Client Singleton Service (@plyaz/core)\n * Manages the API client with environment-specific configurations and intelligent defaults\n *\n * The app reads process.env and constructs ApiClientOptions, then passes to this service.\n * Service never touches process.env directly - all env reading happens in the app layer.\n *\n * @module services/ApiClientService\n */\n\n// Imports from @plyaz/api (dependency)\nimport { createApiClient, mergeConfigs, setDefaultApiClient } from '@plyaz/api/frontend';\nimport type { ApiClientWithEvents, ApiClientOptions, ApiConfig } from '@plyaz/types/api';\nimport { type ClientEventManager, type EndpointsList, ApiPackageError } from '@plyaz/api/frontend';\nimport { PRODUCTION_CONFIG, STAGING_CONFIG, DEVELOPMENT_CONFIG } from '@plyaz/config';\nimport {\n API_ERROR_CODES,\n PACKAGE_STATUS_CODES,\n OPERATIONS,\n ERROR_CODES,\n ERROR_CATEGORY,\n HTTP_STATUS,\n CORE_EVENTS,\n} from '@plyaz/types';\nimport type { CoreApiRequestErrorPayload, CoreApiEnvironmentConfig } from '@plyaz/types/core';\nimport { CoreEventManager } from '../events/CoreEventManager';\nimport { generateRequestId } from '@plyaz/errors';\nimport type { ResponseError } from 'fetchff';\n// Note: Root store is injected by Core.initialize(), not created here\n\n/**\n * Minimum retry attempts recommended for production environments\n *\n * Production services should have sufficient retries to handle transient failures\n * while maintaining acceptable response times for end users.\n *\n * @constant\n * @default 3\n */\nconst MIN_RETRY_ATTEMPTS_PRODUCTION = 3;\n\n/**\n * Get configuration based on environment\n *\n * Returns environment-specific defaults that will be merged with user configuration.\n * Each environment has optimized settings for its use case:\n *\n * - **Production**: Aggressive retries (5), encryption required, telemetry enabled\n * - **Staging**: Mirrors production for accurate pre-deployment testing\n * - **Development/Test**: Conservative retries (1), encryption optional, full debug mode\n *\n * These defaults come from `@plyaz/config` and can be overridden via the `apiConfig` parameter.\n *\n * @param env - Environment name determining which defaults to apply\n * @returns Environment-specific configuration from @plyaz/config\n *\n * @example\n * ```typescript\n * const prodDefaults = getConfigForEnvironment('production');\n * // Returns PRODUCTION_CONFIG with aggressive retries, encryption, etc.\n *\n * const devDefaults = getConfigForEnvironment('development');\n * // Returns DEVELOPMENT_CONFIG with conservative retries, no encryption\n * ```\n *\n * @see {@link CoreApiEnvironmentConfig.env} - Environment types\n * @internal\n */\nfunction getConfigForEnvironment(env: CoreApiEnvironmentConfig['env']): Partial<ApiConfig> {\n switch (env) {\n case 'production':\n return PRODUCTION_CONFIG as Partial<ApiConfig>;\n case 'staging':\n return STAGING_CONFIG as Partial<ApiConfig>;\n case 'development':\n case 'test':\n default:\n return DEVELOPMENT_CONFIG as Partial<ApiConfig>;\n }\n}\n\n/**\n * Validate base URL requirement\n *\n * Ensures that a baseURL is provided in the configuration. The baseURL is mandatory\n * for all API clients as it defines where requests should be sent.\n *\n * @param mergedConfig - Merged configuration after applying all defaults\n * @param errors - Error array to append validation errors to\n *\n * @example\n * ```typescript\n * const errors: string[] = [];\n * validateBaseURL(mergedConfig, errors);\n *\n * if (errors.length > 0) {\n * // baseURL is missing\n * }\n * ```\n *\n * @internal\n */\nfunction validateBaseURL(mergedConfig: ApiClientOptions, errors: string[]): void {\n if (!mergedConfig.baseURL) {\n errors.push('baseURL is required in API configuration (apiConfig parameter)');\n }\n}\n\n/**\n * Validate production encryption configuration\n *\n * Production environments MUST have encryption properly configured to protect sensitive data.\n * This function validates that:\n * - If encryption is enabled, an encryption key MUST be provided\n * - If encryption is disabled, a security warning is issued\n *\n * **Why encryption is required in production**:\n * - Compliance: GDPR, CCPA, PIPL, HIPAA regulations require data protection\n * - Security: Protects PII, payment info, health data, crypto wallet addresses\n * - 50+ sensitive field patterns: email, SSN, card numbers, API keys, etc.\n *\n * @param mergedConfig - Merged configuration after applying all defaults\n * @param errors - Error array to append critical validation errors to\n * @param warnings - Warning array to append non-critical warnings to\n *\n * @example\n * ```typescript\n * const errors: string[] = [];\n * const warnings: string[] = [];\n *\n * validateProductionEncryption(mergedConfig, errors, warnings);\n *\n * // If encryption enabled but no key:\n * // errors = ['encryption.key is REQUIRED when encryption is enabled in production...']\n *\n * // If encryption disabled:\n * // warnings = ['[SECURITY WARNING] Encryption is disabled in production...']\n * ```\n *\n * @internal\n */\nfunction validateProductionEncryption(\n mergedConfig: ApiClientOptions,\n errors: string[],\n warnings: string[]\n): void {\n if (mergedConfig.encryption?.enabled) {\n if (!mergedConfig.encryption?.key) {\n errors.push(\n 'encryption.key is REQUIRED when encryption is enabled in production. ' +\n 'Pass it in apiConfig: { encryption: { key: { id: \"prod-key-v1\", key: process.env.ENCRYPTION_KEY!, algorithm: \"AES-GCM\", format: \"raw\" } } }'\n );\n }\n } else {\n warnings.push(\n '[SECURITY WARNING] Encryption is disabled in production. ' +\n 'This is not recommended for handling sensitive data (PII, payment info, etc.).'\n );\n }\n}\n\n/**\n * Validate production performance settings\n *\n * Validates production configuration for optimal performance, reliability, and monitoring:\n * - **Network-aware features**: Adapts to varying network conditions for better UX\n * - **Telemetry**: Required for production monitoring and alerting\n * - **Retry attempts**: Minimum 3 retries recommended for reliability\n *\n * These are warnings (not errors) as they don't prevent the client from working,\n * but indicate suboptimal production configuration.\n *\n * @param mergedConfig - Merged configuration after applying all defaults\n * @param warnings - Warning array to append performance warnings to\n *\n * @example\n * ```typescript\n * const warnings: string[] = [];\n * validateProductionPerformance(mergedConfig, warnings);\n *\n * // Possible warnings:\n * // - '[PERFORMANCE WARNING] networkAware is disabled in production...'\n * // - '[MONITORING WARNING] telemetry is disabled in production...'\n * // - '[RELIABILITY WARNING] Only 1 retry attempts configured...'\n * ```\n *\n * @internal\n */\nfunction validateProductionPerformance(mergedConfig: ApiClientOptions, warnings: string[]): void {\n if (!mergedConfig.networkAware?.enabled) {\n warnings.push(\n '[PERFORMANCE WARNING] networkAware is disabled in production. ' +\n 'Enable it for better user experience on varying network conditions.'\n );\n }\n\n if (!mergedConfig.tracking?.telemetry) {\n warnings.push(\n '[MONITORING WARNING] telemetry is disabled in production. ' +\n 'Enable it for production monitoring and alerting.'\n );\n }\n\n if (\n mergedConfig.retry &&\n mergedConfig.retry.attempts !== undefined &&\n mergedConfig.retry.attempts < MIN_RETRY_ATTEMPTS_PRODUCTION\n ) {\n warnings.push(\n `[RELIABILITY WARNING] Only ${mergedConfig.retry.attempts} retry attempts configured. ` +\n 'Consider increasing to 3-5 for better reliability in production.'\n );\n }\n}\n\n/**\n * Validate staging encryption configuration\n *\n * Staging environments should mirror production configuration for accurate pre-deployment testing.\n * This function validates:\n * - If encryption is enabled, an encryption key MUST be provided (same as production)\n * - If encryption is disabled, issues a warning (staging should match production)\n * - Telemetry should be enabled to test monitoring before production\n *\n * **Why staging should mirror production**:\n * - Catches configuration issues before they reach production\n * - Tests encryption/decryption with real-world-like data\n * - Validates monitoring and alerting pipelines\n *\n * @param mergedConfig - Merged configuration after applying all defaults\n * @param errors - Error array to append critical validation errors to\n * @param warnings - Warning array to append configuration warnings to\n *\n * @example\n * ```typescript\n * const errors: string[] = [];\n * const warnings: string[] = [];\n *\n * validateStagingEncryption(mergedConfig, errors, warnings);\n *\n * // If encryption enabled but no key:\n * // errors = ['encryption.key is REQUIRED in staging (aligned with production)...']\n *\n * // If encryption or telemetry disabled:\n * // warnings = ['[SECURITY WARNING] Encryption is disabled in staging...']\n * ```\n *\n * @internal\n */\nfunction validateStagingEncryption(\n mergedConfig: ApiClientOptions,\n errors: string[],\n warnings: string[]\n): void {\n if (mergedConfig.encryption?.enabled) {\n if (!mergedConfig.encryption?.key) {\n errors.push(\n 'encryption.key is REQUIRED in staging (aligned with production). ' +\n 'Pass it in apiConfig: { encryption: { key: { id: \"staging-key-v1\", key: process.env.ENCRYPTION_KEY!, algorithm: \"AES-GCM\", format: \"raw\" } } }'\n );\n }\n } else {\n warnings.push(\n '[SECURITY WARNING] Encryption is disabled in staging. ' +\n 'Staging should mirror production for accurate testing.'\n );\n }\n\n if (!mergedConfig.tracking?.telemetry) {\n warnings.push(\n '[MONITORING WARNING] telemetry is disabled in staging. ' +\n 'Enable it to test monitoring before production deployment.'\n );\n }\n}\n\n/**\n * Validate development encryption configuration\n *\n * Development environments have more relaxed requirements to facilitate rapid development:\n * - Encryption is OPTIONAL (enabled flag can be true, but key is not required)\n * - When encryption is enabled without a key, issues an informational warning\n *\n * **Why encryption is optional in development**:\n * - Faster iteration without needing to manage encryption keys\n * - Easier debugging of request/response payloads\n * - Test data typically doesn't contain real sensitive information\n *\n * @param mergedConfig - Merged configuration after applying all defaults\n * @param warnings - Warning array to append informational messages to\n *\n * @example\n * ```typescript\n * const warnings: string[] = [];\n * validateDevelopmentEncryption(mergedConfig, warnings);\n *\n * // If encryption enabled without key:\n * // warnings = ['[DEV INFO] Encryption is enabled but no key provided...']\n * ```\n *\n * @internal\n */\nfunction validateDevelopmentEncryption(mergedConfig: ApiClientOptions, warnings: string[]): void {\n if (mergedConfig.encryption?.enabled && !mergedConfig.encryption?.key) {\n warnings.push(\n '[DEV INFO] Encryption is enabled but no key provided in apiConfig. ' +\n 'Encryption will be skipped in development (this is normal).'\n );\n }\n}\n\n/**\n * Map environment metadata to API configuration structure\n *\n * Converts environment-level metadata from `CoreApiEnvironmentConfig` into `ApiConfig` format\n * that can be merged with other configurations. Currently maps:\n *\n * - **apiKey**: Converted to static header `X-API-Key`\n * - **rateLimit**: Reserved for future use (not currently mapped)\n *\n * **Note**: This mapping is applied AFTER environment defaults but BEFORE user-provided\n * apiConfig, giving it medium priority in the configuration merge hierarchy.\n *\n * @param envConfig - Environment configuration containing metadata\n * @param envDefaults - Environment-specific defaults from @plyaz/config\n * @returns Partial API configuration with mapped environment metadata\n *\n * @example\n * ```typescript\n * const envConfig = { env: 'production', apiKey: 'my-api-key' };\n * const envDefaults = PRODUCTION_CONFIG;\n *\n * const mapped = mapEnvironmentMetadata(envConfig, envDefaults);\n * // Returns: { headers: { static: { 'X-API-Key': 'my-api-key' } } }\n * ```\n *\n * @see {@link CoreApiEnvironmentConfig} - Environment configuration interface\n * @internal\n */\nfunction mapEnvironmentMetadata(\n envConfig: CoreApiEnvironmentConfig,\n envDefaults: Partial<ApiConfig>\n): Partial<ApiConfig> {\n const mapped: Partial<ApiConfig> = {};\n\n // Add API key to headers if provided\n if (envConfig.apiKey) {\n // Extract existing static headers if headers is an object with static property\n const existingStatic =\n envDefaults.headers &&\n typeof envDefaults.headers === 'object' &&\n 'static' in envDefaults.headers &&\n typeof envDefaults.headers.static === 'object'\n ? envDefaults.headers.static\n : {};\n\n mapped.headers = {\n static: { ...(existingStatic ?? {}), 'X-API-Key': envConfig.apiKey },\n };\n }\n\n // Note: rateLimit from envConfig is not mapped to ApiConfig\n // Rate limiting is typically handled at the server/API gateway level\n // If needed in the future, it should be added to ApiConfig interface first\n\n return mapped;\n}\n\n/**\n * Apply default client setting to @plyaz/api services and hooks\n *\n * Conditionally calls `setDefaultApiClient()` based on the `setAsDefault` flag in environment config.\n * When enabled, all services and hooks from @plyaz/api will automatically use this client instance\n * without needing to pass it explicitly via `ServiceOptions.apiClient`.\n *\n * **Default behavior**: If `setAsDefault` is not specified, it defaults to `true`.\n *\n * **Use cases**:\n * - `true` (default): Single API client for the entire application (recommended for most apps)\n * - `false`: Multiple API clients (main API, analytics API, etc.) or testing scenarios\n *\n * @param client - The API client instance to set as default\n * @param envConfig - Environment configuration containing the setAsDefault flag\n *\n * @example\n * ```typescript\n * const client = await createApiClient(config);\n * const envConfig = { env: 'production', setAsDefault: true };\n *\n * applyDefaultClientSetting(client, envConfig);\n * // Now all @plyaz/api services use this client automatically\n *\n * const campaigns = await fetchCampaigns({ page: 1 });\n * // No need to pass apiClient - uses the default\n * ```\n *\n * @example\n * ```typescript\n * // Multiple clients scenario\n * const mainClient = await createApiClient(mainConfig);\n * const analyticsClient = await createApiClient(analyticsConfig);\n *\n * applyDefaultClientSetting(mainClient, { env: 'production', setAsDefault: true });\n * applyDefaultClientSetting(analyticsClient, { env: 'production', setAsDefault: false });\n *\n * // Main API uses default\n * const campaigns = await fetchCampaigns({ page: 1 });\n *\n * // Analytics API must be passed explicitly\n * const analytics = await fetchAnalytics(\n * { date: '2025-10-16' },\n * { apiClient: analyticsClient }\n * );\n * ```\n *\n * @see {@link CoreApiEnvironmentConfig.setAsDefault} - Flag documentation\n * @see {@link ServiceOptions.apiClient} - How to override the default client\n * @internal\n */\nfunction applyDefaultClientSetting(\n client: ApiClientWithEvents<ClientEventManager, EndpointsList>,\n envConfig: CoreApiEnvironmentConfig\n): void {\n const shouldSetAsDefault = envConfig.setAsDefault !== false;\n if (shouldSetAsDefault) {\n setDefaultApiClient(client);\n }\n}\n\n/**\n * Validate environment configuration for production readiness.\n * Ensures critical settings are properly configured based on environment.\n *\n * @param envConfig - Environment configuration\n * @param mergedConfig - Merged configuration after applying all defaults\n * @throws {ApiPackageError} If validation fails\n */\nfunction validateEnvironmentConfig(\n envConfig: CoreApiEnvironmentConfig,\n mergedConfig: ApiClientOptions\n): void {\n const errors: string[] = [];\n const warnings: string[] = [];\n\n // Validate required base URL\n validateBaseURL(mergedConfig, errors);\n\n // Environment-specific validation\n if (envConfig.env === 'production') {\n validateProductionEncryption(mergedConfig, errors, warnings);\n validateProductionPerformance(mergedConfig, warnings);\n } else if (envConfig.env === 'staging') {\n validateStagingEncryption(mergedConfig, errors, warnings);\n } else if (envConfig.env === 'development') {\n validateDevelopmentEncryption(mergedConfig, warnings);\n }\n\n // Log warnings (intentional console usage for config validation)\n if (warnings.length > 0) {\n globalThis.console.warn('[ApiClientService] Configuration warnings:', warnings);\n }\n\n // Throw if there are errors\n if (errors.length > 0) {\n throw new ApiPackageError(\n 'service.validation.failed',\n PACKAGE_STATUS_CODES.INVALID_CONFIGURATION,\n API_ERROR_CODES.CONFIG_VALIDATION_FAILED,\n {\n context: {\n operation: OPERATIONS.VALIDATION,\n // Ensure error details conform to ErrorDetail shape (include errorCode)\n errors: errors.map(err => ({\n field: 'config',\n message: err,\n errorCode: String(API_ERROR_CODES.CONFIG_VALIDATION_FAILED),\n })),\n i18n: {\n errors: errors.join('; '),\n warnings: warnings.join('; '),\n },\n },\n }\n );\n }\n}\n\n/**\n * API Client Singleton Service\n * Manages API client instance lifecycle with environment-specific configurations\n *\n * @example\n * ```typescript\n * // In your app initialization (Next.js, React, etc.)\n * import { ApiClientService } from '@plyaz/core';\n *\n * // Environment metadata\n * const envConfig = {\n * env: process.env.NODE_ENV as 'production',\n * apiKey: process.env.API_KEY,\n * };\n *\n * // API configuration with event handlers\n * await ApiClientService.init(envConfig, {\n * baseURL: process.env.API_URL!,\n * encryption: {\n * key: {\n * id: 'prod-key-v1',\n * key: process.env.ENCRYPTION_KEY!,\n * algorithm: 'AES-GCM'\n * }\n * },\n * clientEvents: {\n * onRequestStart: (event) => apiStore.trackRequest(event),\n * },\n * });\n *\n * // Later, anywhere in your app\n * const client = ApiClientService.getClient();\n * ```\n */\nexport class ApiClientService {\n private static instance: ApiClientWithEvents<ClientEventManager, EndpointsList> | null = null;\n private static isInitializing = false;\n private static initPromise: Promise<void> | null = null;\n\n /**\n * Initialize the API client with environment config and API options\n *\n * @param envConfig - Environment metadata (env, apiKey)\n * @param apiConfig - API configuration (baseURL, encryption, timeout, event handlers, etc.)\n * @returns Promise that resolves to the initialized client\n */\n static async init(\n envConfig: CoreApiEnvironmentConfig,\n apiConfig?: Partial<ApiClientOptions>\n ): Promise<ApiClientWithEvents<ClientEventManager, EndpointsList>> {\n // If already initialized, return existing instance\n if (this.instance) {\n globalThis.console.warn(\n '[ApiClientService] Client already initialized. Returning existing instance.'\n );\n return this.instance;\n }\n\n // If currently initializing, wait for that to complete\n if (this.isInitializing && this.initPromise) {\n await this.initPromise;\n return this.instance!;\n }\n\n // Start initialization\n this.isInitializing = true;\n this.initPromise = this.createClient(envConfig, apiConfig);\n\n try {\n await this.initPromise;\n return this.instance!;\n } finally {\n this.isInitializing = false;\n this.initPromise = null;\n }\n }\n\n /**\n * Internal initialization logic\n * Merges environment-specific defaults with API configuration\n *\n * Merge Priority (lowest to highest):\n * 1. Environment defaults (PRODUCTION_CONFIG / STAGING_CONFIG / DEVELOPMENT_CONFIG)\n * 2. Environment metadata (envConfig - apiKey)\n * 3. API configuration (apiConfig - baseURL, encryption, timeout, etc.)\n */\n // eslint-disable-next-line max-lines-per-function, complexity\n private static async createClient(\n envConfig: CoreApiEnvironmentConfig,\n apiConfig?: Partial<ApiClientOptions>\n ): Promise<void> {\n try {\n // Step 1: Get environment-specific defaults based on env\n const envDefaults = getConfigForEnvironment(envConfig.env);\n\n // Step 2: Build config from envConfig (environment metadata only)\n const envMetadataMapped = mapEnvironmentMetadata(envConfig, envDefaults);\n\n // Step 3: Create onError handler to emit errors to Core\n const coreErrorHandler = async (\n error: ResponseError<unknown, unknown, unknown, unknown>\n // eslint-disable-next-line complexity\n ): Promise<void> => {\n const requestId = generateRequestId();\n const method = error.config?.method ?? 'UNKNOWN';\n const url = error.config?.url ?? 'unknown';\n\n // CRITICAL: Emit error event to Core\n // Core will handle updating the appropriate store based on runtime context:\n // - Backend: In-memory store (ServerErrorMiddleware)\n // - Frontend: Zustand store (useRootStore)\n try {\n // API returns ErrorResponse (array of error details)\n const errorDetails = Array.isArray(error.response?.data) ? error.response.data : [];\n\n // If no error details from API, create a fallback error\n if (errorDetails.length === 0) {\n const serializedError = {\n id: requestId,\n code: ERROR_CODES.CORE_API_CLIENT_REQUEST_FAILED,\n message: error.message ?? 'API request failed',\n status: error.status,\n category: ERROR_CATEGORY.Network,\n timestamp: new Date().toISOString(),\n isRetryable: error.status ? error.status >= HTTP_STATUS.INTERNAL_SERVER_ERROR : false,\n source: 'api-client',\n dismissed: false,\n context: {\n method,\n url,\n requestId,\n },\n };\n\n // Emit single error to Core\n CoreEventManager.emit(CORE_EVENTS.SYSTEM.ERROR, { errors: [serializedError] });\n } else {\n // Convert ErrorResponse (API error details array) to SerializedError[]\n const serializedErrors = errorDetails.map(\n (detail: Record<string, unknown>, index: number) => ({\n id: `${requestId}-${index}`,\n code: (detail.errorCode as string) ?? ERROR_CODES.CORE_API_CLIENT_REQUEST_FAILED,\n message: (detail.message as string) ?? error.message ?? 'API request failed',\n status: error.status,\n category: ERROR_CATEGORY.Network,\n timestamp: new Date().toISOString(),\n isRetryable: error.status\n ? error.status >= HTTP_STATUS.INTERNAL_SERVER_ERROR\n : false,\n source: 'api-client',\n dismissed: false,\n context: {\n method,\n url,\n requestId,\n field: detail.field as string | undefined,\n valueGiven: detail.valueGiven,\n allowedValues: detail.allowedValues,\n constraints: detail.constraints,\n },\n })\n );\n\n // Emit array of errors to Core\n CoreEventManager.emit(CORE_EVENTS.SYSTEM.ERROR, { errors: serializedErrors });\n }\n } catch (e) {\n // If event emission fails, log but don't break the error flow\n console.error('[ApiClientService] Failed to emit error event:', e);\n }\n\n // Also emit API-specific error event for logging, monitoring, etc.\n ApiClientService.emitApiError(error, {\n method,\n url,\n requestId,\n status: error.status,\n duration: 0,\n });\n };\n\n // Step 4: Merge with priority: envDefaults → envMetadata → apiConfig → coreErrorHandler\n const userOnError = apiConfig?.onError;\n const combinedOnError = userOnError\n ? Array.isArray(userOnError)\n ? [...userOnError, coreErrorHandler]\n : [userOnError, coreErrorHandler]\n : coreErrorHandler;\n\n const mergedOptions = mergeConfigs(\n envDefaults, // Environment defaults (lowest priority)\n envMetadataMapped, // Environment metadata (medium priority)\n { ...(apiConfig ?? {}), onError: combinedOnError } // API configuration + core error handler\n ) as ApiClientOptions;\n\n // Step 5: Validate the merged configuration\n validateEnvironmentConfig(envConfig, mergedOptions);\n\n // Step 6: Create the client instance with merged configuration\n this.instance = await createApiClient(mergedOptions);\n\n // Step 6: Set as default client for @plyaz/api services and hooks (if enabled)\n applyDefaultClientSetting(this.instance, envConfig);\n } catch (error) {\n throw new ApiPackageError(\n 'service.initialization.failed',\n PACKAGE_STATUS_CODES.INITIALIZATION_FAILED,\n API_ERROR_CODES.CLIENT_INITIALIZATION_FAILED,\n {\n cause: error instanceof Error ? error : undefined,\n context: {\n operation: OPERATIONS.INITIALIZATION,\n originalError: error instanceof Error ? error.message : String(error),\n i18n: {\n error: error instanceof Error ? error.message : String(error),\n },\n },\n }\n );\n }\n }\n\n /**\n * Get the initialized client instance\n *\n * @throws {ApiPackageError} If client not initialized\n */\n static getClient(): ApiClientWithEvents<ClientEventManager, EndpointsList> {\n if (!this.instance) {\n throw new ApiPackageError(\n 'service.not_initialized',\n PACKAGE_STATUS_CODES.INITIALIZATION_FAILED,\n API_ERROR_CODES.CLIENT_INITIALIZATION_FAILED,\n {\n context: {\n operation: OPERATIONS.INITIALIZATION,\n i18n: {\n hint: 'Call ApiClientService.init(envConfig, apiConfig) before accessing the client',\n },\n },\n }\n );\n }\n return this.instance;\n }\n\n /**\n * Check if client is initialized\n */\n static isInitialized(): boolean {\n return this.instance !== null;\n }\n\n /**\n * Reinitialize with new config and options\n */\n static async reinitialize(\n envConfig: CoreApiEnvironmentConfig,\n apiConfig?: Partial<ApiClientOptions>\n ): Promise<ApiClientWithEvents<ClientEventManager, EndpointsList>> {\n this.dispose();\n return this.init(envConfig, apiConfig);\n }\n\n /**\n * Dispose of the client instance\n */\n static dispose(): void {\n if (this.instance && 'dispose' in this.instance) {\n this.instance.dispose?.();\n }\n this.instance = null;\n this.isInitializing = false;\n this.initPromise = null;\n }\n\n /**\n * Emits an API error event via CoreEventManager.\n * Called when API operations fail to integrate with global error handling.\n *\n * **CRITICAL**: This event emission triggers automatic error state updates.\n * The global error store MUST subscribe to CORE_EVENTS.API.REQUEST_ERROR to:\n * 1. Capture all API errors automatically\n * 2. Update global error state for UI display\n * 3. Ensure individual domain stores remain error-free (only domain data)\n *\n * This is the unified error hook that:\n * - On frontend: Emits event that global error store subscribes to\n * - On backend: Emits event for logging/monitoring (can be configured to rethrow)\n *\n * @param error - The error that occurred\n * @param options - Additional context for the error\n * @param options.method - HTTP method (GET, POST, etc.)\n * @param options.url - Request URL\n * @param options.requestId - Unique request identifier\n * @param options.status - HTTP status code (if available)\n * @param options.duration - Request duration in ms\n * @param options.rethrow - Whether to rethrow the error after emitting (default: false)\n *\n * @example\n * ```typescript\n * // Global error store setup (in @plyaz/store)\n * CoreEventManager.on(CORE_EVENTS.API.REQUEST_ERROR, (payload) => {\n * errorStore.setError({\n * message: payload.error.message,\n * status: payload.status,\n * url: payload.url,\n * requestId: payload.requestId,\n * });\n * });\n *\n * // Frontend usage - emit to store\n * ApiClientService.emitApiError(error, {\n * method: 'GET',\n * url: '/api/users',\n * requestId: '123',\n * duration: 500,\n * });\n *\n * // Backend usage - emit and rethrow\n * ApiClientService.emitApiError(error, {\n * method: 'POST',\n * url: '/api/orders',\n * requestId: '456',\n * duration: 1200,\n * rethrow: true,\n * });\n * ```\n */\n static emitApiError(\n error: unknown,\n options: {\n method: string;\n url: string;\n requestId: string;\n status?: number;\n duration: number;\n rethrow?: boolean;\n }\n ): void {\n const payload: CoreApiRequestErrorPayload = {\n method: options.method,\n url: options.url,\n requestId: options.requestId,\n status: options.status,\n error,\n duration: options.duration,\n };\n\n CoreEventManager.emit(CORE_EVENTS.API.REQUEST_ERROR, payload);\n\n // Optionally rethrow for backend error propagation\n if (options.rethrow && error instanceof Error) {\n throw error;\n }\n }\n\n /**\n * Create a dedicated API client instance (NOT the singleton)\n *\n * Use this when you need an isolated client with its own configuration\n * that doesn't affect or get affected by the shared singleton instance.\n *\n * @param envConfig - Environment metadata (env, apiKey)\n * @param apiConfig - API configuration (baseURL, encryption, timeout, etc.)\n * @returns Promise that resolves to a new dedicated client instance\n *\n * @example\n * ```typescript\n * // Create a dedicated client for feature flags service\n * const flagsClient = await ApiClientService.createInstance(\n * { env: 'production' },\n * {\n * baseURL: 'https://flags.example.com',\n * timeout: 5000,\n * }\n * );\n *\n * // This client is independent from ApiClientService.getClient()\n * flagsClient.updateConfig({ timeout: 3000 }); // Only affects this instance\n * ```\n */\n static async createInstance(\n envConfig: CoreApiEnvironmentConfig,\n apiConfig?: Partial<ApiClientOptions>\n ): Promise<ApiClientWithEvents<ClientEventManager, EndpointsList>> {\n try {\n // Step 1: Get environment-specific defaults based on env\n const envDefaults = getConfigForEnvironment(envConfig.env);\n\n // Step 2: Build config from envConfig (environment metadata only)\n const envMetadataMapped = mapEnvironmentMetadata(envConfig, envDefaults);\n\n // Step 3: Merge with priority: envDefaults → envMetadata → apiConfig\n const mergedOptions = mergeConfigs(\n envDefaults,\n envMetadataMapped,\n apiConfig ?? {}\n ) as ApiClientOptions;\n\n // Step 4: Validate the merged configuration\n validateEnvironmentConfig(envConfig, mergedOptions);\n\n // Step 5: Create a NEW client instance (not stored as singleton)\n const dedicatedClient = await createApiClient(mergedOptions);\n\n // Note: Do NOT call applyDefaultClientSetting - this is a dedicated instance\n // that should not become the default client for @plyaz/api services\n\n return dedicatedClient;\n } catch (error) {\n throw new ApiPackageError(\n 'service.instance_creation.failed',\n PACKAGE_STATUS_CODES.INITIALIZATION_FAILED,\n API_ERROR_CODES.CLIENT_INITIALIZATION_FAILED,\n {\n cause: error instanceof Error ? error : undefined,\n context: {\n operation: OPERATIONS.INITIALIZATION,\n originalError: error instanceof Error ? error.message : String(error),\n i18n: {\n error: error instanceof Error ? error.message : String(error),\n },\n },\n }\n );\n }\n }\n}\n\n// Export convenience helpers\nexport const getApiClient = (): ApiClientWithEvents<ClientEventManager, EndpointsList> =>\n ApiClientService.getClient();\n\nexport const initApiClient = (\n envConfig: CoreApiEnvironmentConfig,\n apiConfig?: Partial<ApiClientOptions>\n): Promise<ApiClientWithEvents<ClientEventManager, EndpointsList>> =>\n ApiClientService.init(envConfig, apiConfig);\n\nexport const createApiClientInstance = (\n envConfig: CoreApiEnvironmentConfig,\n apiConfig?: Partial<ApiClientOptions>\n): Promise<ApiClientWithEvents<ClientEventManager, EndpointsList>> =>\n ApiClientService.createInstance(envConfig, apiConfig);\n","/**\n * Base Observability Adapter\n *\n * Abstract base class for all observability adapters.\n * Provides common functionality and enforces the adapter interface.\n *\n * @module base/observability\n */\n\nimport { PackageLogger } from '@plyaz/logger';\nimport type {\n ObservabilityAdapter,\n ObservabilityAdapterConfig,\n ObservabilityProvider,\n Metric,\n SpanOptions,\n Span,\n LogEntry,\n ObservabilityEvent,\n SpanContext,\n} from '@plyaz/types/observability';\nimport { generateTraceId, generateSpanId } from '@/utils/common';\n\n// ─────────────────────────────────────────────────────────────────────────────\n// Abstract Base Adapter\n// ─────────────────────────────────────────────────────────────────────────────\n\n/**\n * Abstract base class for observability adapters.\n *\n * Provides common functionality:\n * - Initialization lifecycle\n * - Default tag management\n * - Error handling\n * - Logging\n *\n * Subclasses must implement provider-specific methods.\n */\nexport abstract class BaseAdapter implements ObservabilityAdapter {\n abstract readonly provider: ObservabilityProvider;\n abstract readonly name: string;\n\n protected _isInitialized = false;\n protected _config: ObservabilityAdapterConfig | null = null;\n protected readonly logger: PackageLogger;\n\n constructor() {\n this.logger = new PackageLogger({\n packageName: 'core',\n service: 'ObservabilityAdapter',\n });\n }\n\n get isInitialized(): boolean {\n return this._isInitialized;\n }\n\n get config(): ObservabilityAdapterConfig | null {\n return this._config;\n }\n\n // ─── Lifecycle ─────────────────────────────────────────────────────────────\n\n async initialize(config: ObservabilityAdapterConfig): Promise<void> {\n if (this._isInitialized) {\n this.logger.warn(`${this.name} already initialized`);\n return;\n }\n\n this._config = config;\n\n if (config.enabled === false) {\n this.logger.info(`${this.name} disabled by configuration`);\n return;\n }\n\n await this.doInitialize(config);\n this._isInitialized = true;\n this.logger.info(`${this.name} initialized`, {\n provider: this.provider,\n serviceName: config.serviceName,\n environment: config.environment,\n });\n }\n\n async shutdown(): Promise<void> {\n if (!this._isInitialized) {\n return;\n }\n\n await this.flush();\n await this.doShutdown();\n this._isInitialized = false;\n this.logger.info(`${this.name} shut down`);\n }\n\n async isHealthy(): Promise<boolean> {\n if (!this._isInitialized) {\n return false;\n }\n return this.doHealthCheck();\n }\n\n // ─── Abstract Methods (Provider-specific) ──────────────────────────────────\n\n protected abstract doInitialize(config: ObservabilityAdapterConfig): Promise<void>;\n protected abstract doShutdown(): Promise<void>;\n protected abstract doHealthCheck(): Promise<boolean>;\n\n // ─── Metrics ───────────────────────────────────────────────────────────────\n\n async recordMetric(metric: Metric): Promise<void> {\n if (!this._isInitialized || this._config?.enabled === false) {\n return;\n }\n\n const metricWithDefaults = this.applyDefaultTags(metric);\n await this.doRecordMetric(metricWithDefaults);\n }\n\n async incrementCounter(\n name: string,\n value: number = 1,\n tags?: Record<string, string>\n ): Promise<void> {\n await this.recordMetric({\n type: 'counter',\n name,\n value,\n tags: { ...this._config?.defaultTags, ...tags },\n });\n }\n\n async setGauge(name: string, value: number, tags?: Record<string, string>): Promise<void> {\n await this.recordMetric({\n type: 'gauge',\n name,\n value,\n tags: { ...this._config?.defaultTags, ...tags },\n });\n }\n\n async recordHistogram(name: string, value: number, tags?: Record<string, string>): Promise<void> {\n await this.recordMetric({\n type: 'histogram',\n name,\n value,\n tags: { ...this._config?.defaultTags, ...tags },\n });\n }\n\n protected abstract doRecordMetric(metric: Metric): Promise<void>;\n\n // ─── Tracing ───────────────────────────────────────────────────────────────\n\n startSpan(options: SpanOptions): Span {\n if (!this._isInitialized || this._config?.enabled === false) {\n return this.createNoopSpan(options);\n }\n\n // Apply sampling\n if (this._config?.samplingRate !== undefined && this._config.samplingRate < 1) {\n if (Math.random() > this._config.samplingRate) {\n return this.createNoopSpan(options);\n }\n }\n\n return this.doStartSpan(options);\n }\n\n getActiveSpan(): Span | null {\n if (!this._isInitialized) {\n return null;\n }\n return this.doGetActiveSpan();\n }\n\n async withSpan<T>(options: SpanOptions, fn: (span: Span) => Promise<T>): Promise<T> {\n const span = this.startSpan(options);\n try {\n const result = await fn(span);\n span.setStatus('ok');\n return result;\n } catch (error) {\n span.setStatus('error', error instanceof Error ? error.message : String(error));\n if (error instanceof Error) {\n span.recordException(error);\n }\n throw error;\n } finally {\n span.end();\n }\n }\n\n protected abstract doStartSpan(options: SpanOptions): Span;\n protected abstract doGetActiveSpan(): Span | null;\n\n // ─── Logging ───────────────────────────────────────────────────────────────\n\n async log(entry: LogEntry): Promise<void> {\n if (!this._isInitialized || this._config?.enabled === false) {\n return;\n }\n\n const entryWithDefaults = {\n ...entry,\n timestamp: entry.timestamp ?? Date.now(),\n service: entry.service ?? this._config?.serviceName,\n };\n\n await this.doLog(entryWithDefaults);\n }\n\n protected abstract doLog(entry: LogEntry): Promise<void>;\n\n // ─── Events ────────────────────────────────────────────────────────────────\n\n async sendEvent(event: ObservabilityEvent): Promise<void> {\n if (!this._isInitialized || this._config?.enabled === false) {\n return;\n }\n\n const eventWithDefaults = {\n ...event,\n timestamp: event.timestamp ?? Date.now(),\n tags: { ...this._config?.defaultTags, ...event.tags },\n };\n\n await this.doSendEvent(eventWithDefaults);\n }\n\n protected abstract doSendEvent(event: ObservabilityEvent): Promise<void>;\n\n // ─── Flush ─────────────────────────────────────────────────────────────────\n\n async flush(): Promise<void> {\n if (!this._isInitialized) {\n return;\n }\n await this.doFlush();\n }\n\n protected abstract doFlush(): Promise<void>;\n\n // ─── Helpers ───────────────────────────────────────────────────────────────\n\n /**\n * Apply default tags to a metric\n */\n protected applyDefaultTags(metric: Metric): Metric {\n if (!this._config?.defaultTags) {\n return metric;\n }\n\n return {\n ...metric,\n tags: {\n ...this._config.defaultTags,\n ...metric.tags,\n },\n };\n }\n\n /**\n * Create a no-op span (for disabled/sampled-out traces)\n */\n // eslint-disable-next-line no-unused-vars\n protected createNoopSpan(_options: SpanOptions): Span {\n const context: SpanContext = {\n traceId: generateTraceId(),\n spanId: generateSpanId(),\n };\n\n return {\n context,\n setAttribute: () => {},\n setAttributes: () => {},\n addEvent: () => {},\n setStatus: () => {},\n end: () => {},\n recordException: () => {},\n };\n }\n}\n\n// ─────────────────────────────────────────────────────────────────────────────\n// No-Op Adapter\n// ─────────────────────────────────────────────────────────────────────────────\n\n/**\n * No-op adapter that does nothing.\n * Use when observability is disabled.\n */\nexport class NoopAdapter extends BaseAdapter {\n readonly provider = 'noop' as const;\n readonly name = 'NoopAdapter';\n\n protected async doInitialize(): Promise<void> {}\n protected async doShutdown(): Promise<void> {}\n protected async doHealthCheck(): Promise<boolean> {\n return true;\n }\n protected async doRecordMetric(): Promise<void> {}\n protected doStartSpan(options: SpanOptions): Span {\n return this.createNoopSpan(options);\n }\n protected doGetActiveSpan(): Span | null {\n return null;\n }\n protected async doLog(): Promise<void> {}\n protected async doSendEvent(): Promise<void> {}\n protected async doFlush(): Promise<void> {}\n}\n","/**\n * Logger Adapter\n *\n * Uses @plyaz/logger for observability output.\n * Can be used standalone OR alongside other adapters (Datadog, Grafana)\n * to always have console/file logging regardless of external providers.\n *\n * @example Standalone usage\n * ```typescript\n * const logger = new LoggerAdapter();\n * await logger.initialize({ serviceName: 'my-service' });\n * ```\n *\n * @example As console fallback with Datadog\n * ```typescript\n * const observability = new ObservabilityService({\n * mode: 'parallel',\n * adapters: [datadogAdapter, loggerAdapter], // Both receive all events\n * });\n * ```\n *\n * @module base/observability\n */\n\nimport { PackageLogger } from '@plyaz/logger';\nimport type {\n ObservabilityAdapterConfig,\n Metric,\n SpanOptions,\n Span,\n LogEntry,\n ObservabilityEvent,\n SpanContext,\n SpanAttributes,\n SpanEvent,\n SpanStatus,\n ConsoleAdapterConfig,\n} from '@plyaz/types/observability';\nimport { generateTraceId, generateSpanId } from '@/utils/common';\nimport { BaseAdapter } from './BaseAdapter';\n\n// ─────────────────────────────────────────────────────────────────────────────\n// Logger Adapter\n// ─────────────────────────────────────────────────────────────────────────────\n\n/**\n * Logger adapter that uses @plyaz/logger for output.\n *\n * This adapter integrates observability with the existing logging infrastructure,\n * providing structured logging for metrics, spans, and events through PackageLogger.\n *\n * Use this adapter:\n * - As standalone for development/debugging\n * - Alongside Datadog/Grafana to always have local console output\n * - As a fallback in priority mode when external providers fail\n */\nexport class LoggerAdapter extends BaseAdapter {\n readonly provider = 'console' as const;\n readonly name = 'LoggerAdapter';\n\n private observabilityLogger!: PackageLogger;\n private logMetrics = true;\n private logSpans = true;\n private logEvents = true;\n\n protected async doInitialize(config: ObservabilityAdapterConfig): Promise<void> {\n const consoleConfig = config as ConsoleAdapterConfig;\n\n // Create dedicated logger for observability output\n this.observabilityLogger = new PackageLogger({\n packageName: 'observability',\n service: config.serviceName ?? 'LoggerAdapter',\n environment: config.environment as 'development' | 'staging' | 'production' | undefined,\n minLevel: consoleConfig.logLevel ?? 'debug',\n });\n\n // All logging enabled by default\n this.logMetrics = true;\n this.logSpans = true;\n this.logEvents = true;\n }\n\n protected async doShutdown(): Promise<void> {\n // Logger doesn't need explicit shutdown\n }\n\n protected async doHealthCheck(): Promise<boolean> {\n return true;\n }\n\n protected async doRecordMetric(metric: Metric): Promise<void> {\n if (!this.logMetrics) return;\n\n this.observabilityLogger.debug(`[METRIC] ${metric.type}:${metric.name}`, {\n metricType: metric.type,\n metricName: metric.name,\n value: 'value' in metric ? metric.value : undefined,\n unit: metric.unit,\n tags: metric.tags,\n });\n }\n\n protected doStartSpan(options: SpanOptions): Span {\n const context: SpanContext = {\n traceId: generateTraceId(),\n spanId: generateSpanId(),\n parentSpanId: options.parentContext?.spanId,\n };\n\n const startTime = options.startTime ?? Date.now();\n\n if (this.logSpans) {\n this.observabilityLogger.debug(`[SPAN START] ${options.name}`, {\n traceId: context.traceId,\n spanId: context.spanId,\n parentSpanId: context.parentSpanId,\n kind: options.kind,\n attributes: options.attributes,\n });\n }\n\n const events: SpanEvent[] = [];\n let attributes: SpanAttributes = { ...options.attributes };\n let status: SpanStatus = 'unset';\n let statusMessage: string | undefined;\n\n const logSpans = this.logSpans;\n const logger = this.observabilityLogger;\n\n return {\n context,\n setAttribute: (key, value) => {\n attributes[key] = value;\n },\n setAttributes: attrs => {\n attributes = { ...attributes, ...attrs };\n },\n addEvent: event => {\n events.push(event);\n if (logSpans) {\n logger.debug(`[SPAN EVENT] ${options.name}: ${event.name}`, {\n traceId: context.traceId,\n spanId: context.spanId,\n eventAttributes: event.attributes,\n });\n }\n },\n setStatus: (s, message) => {\n status = s;\n statusMessage = message;\n },\n end: endTime => {\n const duration = (endTime ?? Date.now()) - startTime;\n if (logSpans) {\n const logMethod = status === 'error' ? 'warn' : 'debug';\n logger[logMethod](`[SPAN END] ${options.name}`, {\n traceId: context.traceId,\n spanId: context.spanId,\n durationMs: duration,\n status,\n statusMessage,\n attributes,\n eventCount: events.length,\n });\n }\n },\n recordException: error => {\n if (logSpans) {\n logger.error(`[SPAN ERROR] ${options.name}`, {\n traceId: context.traceId,\n spanId: context.spanId,\n error: error.message,\n stack: error.stack,\n });\n }\n },\n };\n }\n\n protected doGetActiveSpan(): Span | null {\n return null; // Logger adapter doesn't track active spans\n }\n\n protected async doLog(entry: LogEntry): Promise<void> {\n const meta = {\n service: entry.service,\n traceId: entry.traceId,\n spanId: entry.spanId,\n ...entry.context,\n };\n\n // Map observability log levels to logger methods\n switch (entry.level) {\n case 'debug':\n this.observabilityLogger.debug(entry.message, meta);\n break;\n case 'info':\n this.observabilityLogger.info(entry.message, meta);\n break;\n case 'warn':\n this.observabilityLogger.warn(entry.message, meta);\n break;\n case 'error':\n this.observabilityLogger.error(entry.message, meta);\n break;\n case 'fatal':\n this.observabilityLogger.fatal(entry.message, meta);\n break;\n }\n }\n\n protected async doSendEvent(event: ObservabilityEvent): Promise<void> {\n if (!this.logEvents) return;\n\n this.observabilityLogger.info(`[EVENT] ${event.name}`, {\n eventName: event.name,\n properties: event.properties,\n tags: event.tags,\n });\n }\n\n protected async doFlush(): Promise<void> {\n // Logger handles its own buffering/flushing\n }\n}\n","/**\n * Observability Service\n *\n * Injectable service for observability (metrics, tracing, logging).\n * Works like CacheManager, DatabaseService, and ApiClient - can be injected into domain services.\n *\n * Adapters are initialized separately with their own configs.\n * This service only orchestrates - it doesn't know about adapter-specific configs.\n *\n * @module base/observability\n */\n\nimport { PackageLogger } from '@plyaz/logger';\nimport { CorePackageError } from '@plyaz/errors';\nimport { ERROR_CODES } from '@plyaz/types/errors';\nimport type {\n ObservabilityAdapter,\n ObservabilityAdapterConfig,\n Metric,\n SpanOptions,\n Span,\n LogEntry,\n ObservabilityEvent,\n OperationContext,\n MonitoringOperationResult,\n AdapterWithPriority,\n AdapterEntry,\n ObservabilityServiceConfig,\n ObservabilityServiceInterface,\n} from '@plyaz/types/observability';\nimport { OBSERVABILITY_METRICS } from '@plyaz/types/observability';\nimport { NoopAdapter } from './BaseAdapter';\nimport { LoggerAdapter } from './LoggerAdapter';\n\n// Default timeout for adapter operations (5 seconds)\nconst DEFAULT_ADAPTER_TIMEOUT_MS = 5000;\n\n// ─────────────────────────────────────────────────────────────────────────────\n// Observability Service Implementation\n// ─────────────────────────────────────────────────────────────────────────────\n\n/**\n * ObservabilityService - Main observability service that implements ObservabilityAdapter.\n *\n * This service orchestrates multiple adapters and can be injected into domain services.\n * Logger adapter is always included by default for console output.\n *\n * ```typescript\n * // 1. Initialize adapters separately\n * const datadogAdapter = new DatadogAdapter();\n * await datadogAdapter.initialize({ apiKey: '...', serviceName: 'my-service' });\n *\n * // 2. Create service - logger is auto-added by default\n * const observability = new ObservabilityService();\n * await observability.initialize({\n * mode: 'parallel',\n * adapters: [datadogAdapter], // Logger added automatically\n * serviceName: 'my-service',\n * });\n *\n * // 3. Use in domain services (implements ObservabilityAdapter)\n * await observability.incrementCounter('api.requests', 1);\n * ```\n */\nexport class ObservabilityService implements ObservabilityAdapter, ObservabilityServiceInterface {\n readonly provider = 'custom' as const;\n readonly name = 'ObservabilityService';\n\n private _isInitialized = false;\n private _config: ObservabilityServiceConfig | null = null;\n private readonly logger: PackageLogger;\n private readonly adapterEntries: AdapterEntry[] = [];\n private mode: 'single' | 'parallel' | 'priority' = 'parallel';\n private readonly noopAdapter = new NoopAdapter();\n private loggerAdapter: LoggerAdapter | null = null;\n\n constructor() {\n this.logger = new PackageLogger({\n packageName: 'core',\n service: 'ObservabilityService',\n });\n }\n\n get isInitialized(): boolean {\n return this._isInitialized;\n }\n\n /**\n * Check if service has at least one working adapter\n */\n get isReady(): boolean {\n return this.adapterEntries.some(e => e.adapter.isInitialized);\n }\n\n /**\n * Get all adapters (for compatibility)\n */\n private get adapters(): ObservabilityAdapter[] {\n return this.adapterEntries.map(e => e.adapter);\n }\n\n /**\n * Get initialized adapter entries\n */\n private get initializedEntries(): AdapterEntry[] {\n return this.adapterEntries.filter(e => e.adapter.isInitialized);\n }\n\n /**\n * Get primary (non-failover) initialized adapters\n */\n private get primaryEntries(): AdapterEntry[] {\n return this.initializedEntries.filter(e => !e.failover);\n }\n\n /**\n * Get failover initialized adapters\n */\n private get failoverEntries(): AdapterEntry[] {\n return this.initializedEntries.filter(e => e.failover);\n }\n\n // ─── Lifecycle ─────────────────────────────────────────────────────────────\n\n /**\n * Check if input is an adapter with priority config\n */\n private isAdapterWithPriority(\n input: ObservabilityAdapter | AdapterWithPriority\n ): input is AdapterWithPriority {\n return (\n 'adapter' in input &&\n typeof (input as AdapterWithPriority).adapter?.isInitialized === 'boolean'\n );\n }\n\n /**\n * Normalize adapter input to adapter with priority and failover config\n */\n private normalizeAdapter(\n input: ObservabilityAdapter | AdapterWithPriority,\n defaultPriority: number\n ): { adapter: ObservabilityAdapter; priority: number; failover: boolean } {\n if (this.isAdapterWithPriority(input)) {\n return {\n adapter: input.adapter,\n priority: input.priority ?? defaultPriority,\n failover: input.failover ?? false,\n };\n }\n return { adapter: input, priority: defaultPriority, failover: false };\n }\n\n /**\n * Initialize the observability service.\n * Logger adapter is always added by default unless explicitly disabled.\n * Adapters are sorted by priority (higher = first), with failover adapters after primary.\n */\n async initialize(config: ObservabilityAdapterConfig & ObservabilityServiceConfig): Promise<void> {\n if (this._isInitialized) {\n this.logger.warn('ObservabilityService already initialized');\n return;\n }\n\n this._config = config;\n this.mode = config.mode ?? 'parallel';\n\n // Collect adapters with priorities\n const entries: AdapterEntry[] = [];\n\n // Add provided adapters\n if (config.adapter) {\n entries.push(this.normalizeAdapter(config.adapter, 0));\n }\n if (config.adapters) {\n config.adapters.forEach((a, index) => {\n // Default priority decreases with array position for stable sorting\n entries.push(this.normalizeAdapter(a, -index));\n });\n }\n\n // Always add logger adapter by default (for console output)\n // Unless there's already a console/logger adapter\n const hasLoggerAdapter = entries.some(\n e => e.adapter.provider === 'console' || e.adapter.name === 'LoggerAdapter'\n );\n if (!hasLoggerAdapter) {\n this.loggerAdapter = new LoggerAdapter();\n await this.loggerAdapter.initialize({\n enabled: config.enabled !== false,\n serviceName: config.serviceName,\n environment: config.environment,\n defaultTags: config.defaultTags,\n });\n // Logger is a failover by default with lowest priority\n entries.push({ adapter: this.loggerAdapter, priority: -1000, failover: true });\n }\n\n // Sort: primary adapters first (by priority desc), then failover adapters (by priority desc)\n entries.sort((a, b) => {\n // Primary adapters come before failover\n if (a.failover !== b.failover) {\n return a.failover ? 1 : -1;\n }\n // Within same category, sort by priority (higher first)\n return b.priority - a.priority;\n });\n\n // Store sorted entries\n this.adapterEntries.push(...entries);\n\n this._isInitialized = true;\n\n this.logger.debug('ObservabilityService initialized', {\n mode: this.mode,\n adapterCount: this.adapterEntries.length,\n primaryCount: this.primaryEntries.length,\n failoverCount: this.failoverEntries.length,\n adapters: this.adapterEntries.map(e => ({\n name: e.adapter.name,\n provider: e.adapter.provider,\n priority: e.priority,\n failover: e.failover,\n initialized: e.adapter.isInitialized,\n })),\n });\n }\n\n async shutdown(): Promise<void> {\n await Promise.all(this.adapters.map(adapter => adapter.shutdown()));\n this._isInitialized = false;\n this.logger.info('ObservabilityService shut down');\n }\n\n async isHealthy(): Promise<boolean> {\n if (this.adapters.length === 0) {\n return false;\n }\n\n const results = await Promise.all(\n this.adapters.map(adapter => adapter.isHealthy().catch(() => false))\n );\n\n // For parallel mode, all must be healthy; for priority/single, at least one\n return this.mode === 'parallel' ? results.every(Boolean) : results.some(Boolean);\n }\n\n async flush(): Promise<void> {\n await this.executeOnAdapters('flush', adapter => adapter.flush());\n }\n\n // ─── Execute on Adapters ───────────────────────────────────────────────────\n\n private get config(): ObservabilityServiceConfig {\n return this._config ?? {};\n }\n\n private async executeOnAdapters<T>(\n operation: string,\n fn: (adapter: ObservabilityAdapter) => Promise<T>\n ): Promise<void> {\n const entries = this.initializedEntries;\n if (entries.length === 0) {\n return;\n }\n\n const timeout = this.config.adapterTimeout ?? DEFAULT_ADAPTER_TIMEOUT_MS;\n\n switch (this.mode) {\n case 'parallel':\n await this.executeParallelWithFailover(operation, fn, timeout);\n break;\n case 'priority':\n await this.executePriorityWithFailover(operation, fn, timeout);\n break;\n case 'single':\n default:\n await this.executeSingle(operation, entries[0].adapter, fn, timeout);\n break;\n }\n }\n\n private async executeSingle<T>(\n operation: string,\n adapter: ObservabilityAdapter,\n fn: (adapter: ObservabilityAdapter) => Promise<T>,\n timeout: number\n ): Promise<void> {\n try {\n await this.withTimeout(fn(adapter), timeout);\n } catch (error) {\n this.logger.error(`${operation} failed on ${adapter.name}`, {\n error: error instanceof Error ? error.message : String(error),\n });\n }\n }\n\n /**\n * Execute on primary adapters in parallel.\n * If all primary adapters fail, execute on failover adapters.\n */\n // eslint-disable-next-line complexity\n private async executeParallelWithFailover<T>(\n operation: string,\n fn: (adapter: ObservabilityAdapter) => Promise<T>,\n timeout: number\n ): Promise<void> {\n const primary = this.primaryEntries;\n const failover = this.failoverEntries;\n\n // Execute on primary adapters\n if (primary.length > 0) {\n const results = await Promise.allSettled(\n primary.map(e => this.withTimeout(fn(e.adapter), timeout))\n );\n\n const errors = results\n .map((r, i) =>\n r.status === 'rejected' ? { adapter: primary[i].adapter.name, error: r.reason } : null\n )\n .filter(Boolean);\n\n const allFailed = errors.length === primary.length;\n\n if (errors.length > 0 && !allFailed) {\n this.logger.warn(`${operation} failed on some primary adapters`, { errors });\n }\n\n // If all primary adapters failed, use failover\n if (allFailed && failover.length > 0) {\n this.logger.warn(`${operation} failed on all primary adapters, using failover`, { errors });\n await this.executeParallel(\n operation,\n failover.map(e => e.adapter),\n fn,\n timeout\n );\n return;\n }\n\n if (this.config.failOnAnyError && errors.length > 0) {\n throw new CorePackageError(\n `${operation} failed on adapters: ${errors.map(e => e?.adapter).join(', ')}`,\n ERROR_CODES.CORE_OPERATION_FAILED\n );\n }\n } else if (failover.length > 0) {\n // No primary adapters, use failover directly\n await this.executeParallel(\n operation,\n failover.map(e => e.adapter),\n fn,\n timeout\n );\n }\n }\n\n private async executeParallel<T>(\n operation: string,\n adapters: ObservabilityAdapter[],\n fn: (adapter: ObservabilityAdapter) => Promise<T>,\n timeout: number\n ): Promise<void> {\n const results = await Promise.allSettled(\n adapters.map(adapter => this.withTimeout(fn(adapter), timeout))\n );\n\n const errors = results\n .map((r, i) =>\n r.status === 'rejected' ? { adapter: adapters[i].name, error: r.reason } : null\n )\n .filter(Boolean);\n\n if (errors.length > 0) {\n this.logger.warn(`${operation} failed on some adapters`, { errors });\n }\n }\n\n /**\n * Execute on primary adapters in priority order.\n * If all primary adapters fail, try failover adapters.\n */\n // eslint-disable-next-line complexity\n private async executePriorityWithFailover<T>(\n operation: string,\n fn: (adapter: ObservabilityAdapter) => Promise<T>,\n timeout: number\n ): Promise<void> {\n const primary = this.primaryEntries;\n const failover = this.failoverEntries;\n\n // Try primary adapters first\n for (const entry of primary) {\n try {\n await this.withTimeout(fn(entry.adapter), timeout);\n return; // Success - stop trying\n } catch (error) {\n const errorName = error instanceof Error ? error.name : 'Error';\n const shouldFallback =\n !this.config.fallbackOnErrors || this.config.fallbackOnErrors.includes(errorName);\n\n if (shouldFallback) {\n this.logger.warn(`${operation} failed on ${entry.adapter.name}, trying next`, {\n error: error instanceof Error ? error.message : String(error),\n });\n continue;\n }\n throw error;\n }\n }\n\n // All primary failed, try failover adapters\n for (const entry of failover) {\n try {\n await this.withTimeout(fn(entry.adapter), timeout);\n return; // Success\n } catch (error) {\n this.logger.warn(`${operation} failed on failover ${entry.adapter.name}`, {\n error: error instanceof Error ? error.message : String(error),\n });\n // Continue to next failover adapter\n }\n }\n\n this.logger.error(`${operation} failed on all adapters (primary and failover)`);\n }\n\n private async withTimeout<T>(promise: Promise<T>, timeoutMs: number): Promise<T> {\n return Promise.race([\n promise,\n new Promise<T>((_, reject) =>\n setTimeout(() => reject(new Error(`Operation timed out after ${timeoutMs}ms`)), timeoutMs)\n ),\n ]);\n }\n\n // ─── Metrics ───────────────────────────────────────────────────────────────\n\n async recordMetric(metric: Metric): Promise<void> {\n await this.executeOnAdapters('recordMetric', adapter => adapter.recordMetric(metric));\n }\n\n async incrementCounter(\n name: string,\n value: number = 1,\n tags?: Record<string, string>\n ): Promise<void> {\n await this.executeOnAdapters('incrementCounter', adapter =>\n adapter.incrementCounter(name, value, tags)\n );\n }\n\n async setGauge(name: string, value: number, tags?: Record<string, string>): Promise<void> {\n await this.executeOnAdapters('setGauge', adapter => adapter.setGauge(name, value, tags));\n }\n\n async recordHistogram(name: string, value: number, tags?: Record<string, string>): Promise<void> {\n await this.executeOnAdapters('recordHistogram', adapter =>\n adapter.recordHistogram(name, value, tags)\n );\n }\n\n // ─── Tracing ───────────────────────────────────────────────────────────────\n\n startSpan(options: SpanOptions): Span {\n // For tracing, use first initialized adapter\n const entry = this.initializedEntries[0];\n return entry?.adapter.startSpan(options) ?? this.noopAdapter.startSpan(options);\n }\n\n async withSpan<T>(options: SpanOptions, fn: (span: Span) => Promise<T>): Promise<T> {\n const entry = this.initializedEntries[0];\n if (!entry) {\n return fn(this.noopAdapter.startSpan(options));\n }\n return entry.adapter.withSpan(options, fn);\n }\n\n getActiveSpan(): Span | null {\n const entry = this.initializedEntries[0];\n return entry?.adapter.getActiveSpan() ?? null;\n }\n\n // ─── Logging ───────────────────────────────────────────────────────────────\n\n async log(entry: LogEntry): Promise<void> {\n await this.executeOnAdapters('log', adapter => adapter.log(entry));\n }\n\n // ─── Events ────────────────────────────────────────────────────────────────\n\n async sendEvent(event: ObservabilityEvent): Promise<void> {\n await this.executeOnAdapters('sendEvent', adapter => adapter.sendEvent(event));\n }\n\n // ─── Service Operation Tracking ────────────────────────────────────────────\n\n /**\n * Track a service operation with automatic metrics and tracing.\n *\n * @example\n * ```typescript\n * const { result, metrics } = await observability.trackOperation(\n * {\n * serviceName: 'UserService',\n * operation: 'create',\n * entityType: 'user',\n * startTime: Date.now(),\n * },\n * async () => {\n * return await this.repository.create(userData);\n * }\n * );\n * ```\n */\n // eslint-disable-next-line complexity\n async trackOperation<T>(\n context: OperationContext,\n operation: () => Promise<T>\n ): Promise<{ result: T; metrics: MonitoringOperationResult }> {\n const startTime = context.startTime ?? Date.now();\n\n // Start span\n const span = this.startSpan({\n name: `${context.serviceName}.${context.operation}`,\n attributes: {\n 'service.name': context.serviceName,\n 'operation.name': context.operation,\n ...(context.entityType && { 'entity.type': context.entityType }),\n ...(context.entityId && { 'entity.id': context.entityId }),\n ...context.attributes,\n },\n parentContext: context.parentContext,\n });\n\n // Increment operation counter\n await this.incrementCounter(OBSERVABILITY_METRICS.SERVICE_OPERATION_COUNT, 1, {\n service: context.serviceName,\n operation: context.operation,\n ...(context.entityType && { entity_type: context.entityType }),\n });\n\n try {\n const result = await operation();\n const duration = Date.now() - startTime;\n\n span.setStatus('ok');\n\n await this.recordHistogram(OBSERVABILITY_METRICS.SERVICE_OPERATION_DURATION, duration, {\n service: context.serviceName,\n operation: context.operation,\n status: 'success',\n });\n\n return {\n result,\n metrics: { success: true, duration, data: result },\n };\n } catch (error) {\n const duration = Date.now() - startTime;\n\n span.setStatus('error', error instanceof Error ? error.message : String(error));\n if (error instanceof Error) {\n span.recordException(error);\n }\n\n await this.incrementCounter(OBSERVABILITY_METRICS.SERVICE_OPERATION_ERROR, 1, {\n service: context.serviceName,\n operation: context.operation,\n error_type: error instanceof Error ? error.name : 'UnknownError',\n });\n\n await this.recordHistogram(OBSERVABILITY_METRICS.SERVICE_OPERATION_DURATION, duration, {\n service: context.serviceName,\n operation: context.operation,\n status: 'error',\n });\n\n throw error;\n } finally {\n span.end();\n }\n }\n}\n\n// ─────────────────────────────────────────────────────────────────────────────\n// Factory Function\n// ─────────────────────────────────────────────────────────────────────────────\n\n/**\n * Create an ObservabilityService with pre-initialized adapters.\n *\n * @example\n * ```typescript\n * // Initialize adapters first\n * const datadogAdapter = new DatadogAdapter();\n * await datadogAdapter.initialize({ apiKey: '...', serviceName: 'my-service' });\n *\n * // Create and initialize service (logger auto-added)\n * const observability = await createObservabilityService({\n * mode: 'parallel',\n * adapters: [datadogAdapter],\n * serviceName: 'my-service',\n * });\n *\n * // Priority mode (fallback chain)\n * const observability = await createObservabilityService({\n * mode: 'priority',\n * adapters: [datadogAdapter, grafanaAdapter],\n * serviceName: 'my-service',\n * });\n * ```\n */\nexport async function createObservabilityService(\n config: ObservabilityServiceConfig & { serviceName?: string; environment?: string } = {}\n): Promise<ObservabilityService> {\n const service = new ObservabilityService();\n await service.initialize(config);\n return service;\n}\n","/**\n * Core Dependencies Configuration\n *\n * Similar to @plyaz/api's setGlobalConfig pattern.\n * Backend services are registered here by entry points, not imported directly.\n *\n * IMPORTANT: This file must NOT import from backend service files (DbService, CacheService, etc.)\n * as that would cause the bundler to include backend dependencies in the frontend bundle.\n *\n * @example\n * ```typescript\n * // entry-backend.ts\n * import { setCoreDependencies } from './config/dependencies';\n * import { DbService } from './services/DbService';\n * import { CacheService } from './services/CacheService';\n *\n * setCoreDependencies({\n * DbService,\n * CacheService,\n * StorageService,\n * NotificationService,\n * });\n *\n * // entry-frontend.ts\n * // Don't call setCoreDependencies - no backend deps loaded\n * ```\n */\n\nimport type {\n CoreDbServiceStatic,\n CoreCacheServiceStatic,\n CoreStorageServiceStatic,\n CoreNotificationServiceStatic,\n CoreServerErrorMiddlewareStatic,\n} from '@plyaz/types/core';\n\n// ─────────────────────────────────────────────────────────────────────────────\n// Dependencies Container\n// ─────────────────────────────────────────────────────────────────────────────\n\nexport interface CoreDependencies {\n DbService?: CoreDbServiceStatic;\n CacheService?: CoreCacheServiceStatic;\n StorageService?: CoreStorageServiceStatic;\n NotificationService?: CoreNotificationServiceStatic;\n ServerErrorMiddleware?: CoreServerErrorMiddlewareStatic;\n}\n\n// Global dependencies container\nlet _dependencies: CoreDependencies = {};\n\n/**\n * Set core dependencies (called by entry points)\n *\n * @example\n * ```typescript\n * // entry-backend.ts\n * import { DbService } from './services/DbService';\n * import { CacheService } from './services/CacheService';\n *\n * setCoreDependencies({\n * DbService,\n * CacheService,\n * });\n * ```\n */\nexport function setCoreDependencies(deps: CoreDependencies): void {\n _dependencies = { ..._dependencies, ...deps };\n}\n\n/**\n * Get core dependencies\n */\nexport function getCoreDependencies(): CoreDependencies {\n return _dependencies;\n}\n\n/**\n * Check if a dependency is available\n */\nexport function hasCoreDependency(key: keyof CoreDependencies): boolean {\n return _dependencies[key] !== undefined;\n}\n\n/**\n * Get a specific dependency\n */\nexport function getCoreDependency<K extends keyof CoreDependencies>(\n key: K\n): CoreDependencies[K] | undefined {\n return _dependencies[key];\n}\n\n/**\n * Clear all dependencies (useful for testing)\n */\nexport function clearCoreDependencies(): void {\n _dependencies = {};\n}\n","// This eslint disable is an edge-case as we need to ensure that we're able to load CoreInitializer regardless if FE, BE or specific frameworks\n/**\n * Service Registry - Frontend Service Auto-Initialization\n *\n * Provides a generic, scalable pattern for initializing domain services.\n * Services implement the InitializableDomainService interface and are\n * initialized automatically without hardcoded switch statements.\n *\n * @example\n * ```typescript\n * import { ServiceRegistry } from '@plyaz/core';\n * import { FeatureFlagDomainService } from '@plyaz/core/frontend';\n * import { ExampleDomainService } from '@plyaz/core/domain';\n *\n * // Initialize services\n * await ServiceRegistry.initialize({\n * apiClient: { baseURL: '/api' },\n * services: [\n * { service: FeatureFlagDomainService, config: { enabled: true } },\n * { service: ExampleDomainService, config: { enabled: true, useRealApi: false } },\n * ],\n * });\n *\n * // Access services by key\n * const flags = ServiceRegistry.get('featureFlags');\n * const isEnabled = await flags.isEnabled('my-flag');\n *\n * // Or get with type safety\n * const example = ServiceRegistry.get<ExampleDomainService>('example');\n * ```\n */\n\nimport { CorePackageError } from '@plyaz/errors';\nimport { ERROR_CODES, BACKEND_RUNTIMES, FRONTEND_RUNTIMES } from '@plyaz/types';\nimport { PackageLogger } from '@plyaz/logger';\nimport type { ApiClientOptions } from '@plyaz/types/api';\nimport type { RootStoreSlice } from '@plyaz/types/store';\nimport type {\n CoreDomainServiceInstance,\n CoreServiceCreateOptions,\n CoreServiceEntry,\n CoreServiceInitConfig,\n CoreServiceRegistryConfig,\n CoreCacheConfig,\n CoreObservabilityConfig,\n CoreRuntimeEnvironment,\n CoreDbServiceConfig,\n CoreStorageConfig,\n CoreNotificationConfig,\n // Service instance types (from @plyaz/types, not backend modules)\n CoreDbServiceInstance,\n CoreCacheManagerInstance,\n CoreStorageServiceInstance,\n CoreNotificationServiceInstance,\n} from '@plyaz/types/core';\nimport type { ObservabilityAdapter } from '@plyaz/types/observability';\nimport { createObservabilityService } from '../base/observability';\nimport { ApiClientService } from '../services/ApiClientService';\nimport { getCoreDependency } from '../config/dependencies';\n\n// ─────────────────────────────────────────────────────────────────────────────\n// Internal Types\n// ─────────────────────────────────────────────────────────────────────────────\n\ninterface PendingService {\n entry: CoreServiceEntry;\n initWhen: CoreServiceInitConfig['initWhen'];\n}\n\ninterface ServiceMetadata {\n entry: CoreServiceEntry;\n isSingleton: boolean;\n}\n\n// ─────────────────────────────────────────────────────────────────────────────\n// Service Registry\n// ─────────────────────────────────────────────────────────────────────────────\n\n/**\n * Service Registry\n *\n * Manages frontend domain service instances with auto-initialization.\n * Supports immediate, lazy, and conditional initialization.\n *\n * Key features:\n * - Generic: No switch statements, services implement common interface\n * - Scalable: Add new services without modifying registry code\n * - Flexible: Immediate, lazy, or conditional initialization\n * - Type-safe: Get services with proper typing\n */\nexport class ServiceRegistry {\n private static readonly logger = new PackageLogger({\n packageName: 'core',\n service: 'ServiceRegistry',\n });\n\n /** Initialized singleton service instances by key */\n private static _services = new Map<string, CoreDomainServiceInstance>();\n\n /** Pending services for lazy initialization */\n private static _pending = new Map<string, PendingService>();\n\n /** Service metadata (config, singleton flag) by key */\n private static _metadata = new Map<string, ServiceMetadata>();\n\n /** Global environment */\n private static _environment: 'production' | 'staging' | 'development' | 'test' = 'development';\n\n /** Runtime environment (node, browser, bun, etc.) */\n private static _runtime: CoreRuntimeEnvironment = 'node';\n\n /** Global API client options */\n private static _apiClientOptions: ApiClientOptions | null = null;\n\n /** Global database config */\n private static _dbConfig: Partial<CoreDbServiceConfig> | null = null;\n\n /** Global cache config */\n private static _cacheConfig: CoreCacheConfig | null = null;\n\n /** Global observability config */\n private static _observabilityConfig: CoreObservabilityConfig | null = null;\n\n /** Global observability adapter instance */\n private static _observabilityInstance: ObservabilityAdapter | null = null;\n\n /** Global storage config */\n private static _storageConfig: CoreStorageConfig | null = null;\n\n /** Global notifications config */\n private static _notificationsConfig: CoreNotificationConfig | null = null;\n\n /** Store registry interface from Core (type-safe) */\n private static _storeRegistry: {\n getStore<K extends keyof RootStoreSlice>(key: K): RootStoreSlice[K] | undefined;\n } | null = null;\n\n /** Initialization promises (for concurrent access during lazy init) */\n private static _initPromises = new Map<string, Promise<CoreDomainServiceInstance>>();\n\n // ─────────────────────────────────────────────────────────────────────────\n // Initialization\n // ─────────────────────────────────────────────────────────────────────────\n\n /**\n * Initialize the service registry with the provided configuration.\n *\n * @param config - Registry configuration with services to initialize\n *\n * @example\n * ```typescript\n * await ServiceRegistry.initialize({\n * apiClient: { baseURL: '/api' },\n * services: [\n * { service: FeatureFlagDomainService, config: { enabled: true } },\n * { service: ExampleDomainService, config: { enabled: true, initWhen: 'lazy' } },\n * ],\n * });\n * ```\n */\n // eslint-disable-next-line complexity\n static async initialize(config: CoreServiceRegistryConfig): Promise<void> {\n ServiceRegistry._environment = config.environment ?? 'development';\n ServiceRegistry._runtime = config.runtime ?? 'node';\n ServiceRegistry._apiClientOptions = config.apiClient ?? null;\n ServiceRegistry._dbConfig = config.db ?? null;\n ServiceRegistry._cacheConfig = config.cache ?? null;\n ServiceRegistry._observabilityConfig = config.observability ?? null;\n ServiceRegistry._storageConfig = config.storage ?? null;\n ServiceRegistry._notificationsConfig = config.notifications ?? null;\n ServiceRegistry._storeRegistry = config.stores ?? null;\n\n const immediatePromises: Promise<void>[] = [];\n\n for (const entry of config.services) {\n const serviceKey = entry.service.serviceKey;\n const initWhen = entry.config.initWhen ?? 'immediate';\n const enabled = entry.config.enabled !== false;\n const isSingleton = entry.config.singleton !== false; // Default: true\n\n // Store metadata for all services (even disabled)\n ServiceRegistry._metadata.set(serviceKey, { entry, isSingleton });\n\n // Skip disabled services\n if (!enabled) {\n ServiceRegistry.logger.debug(`Service ${serviceKey} is disabled, skipping`);\n continue;\n }\n\n // Handle initialization timing\n if (initWhen === 'immediate' && isSingleton) {\n // Only auto-initialize singletons\n immediatePromises.push(\n ServiceRegistry.initializeService(entry).then(() => {\n ServiceRegistry.logger.debug(`Service ${serviceKey} initialized (singleton)`);\n })\n );\n } else if (isSingleton) {\n // Store for lazy/conditional initialization\n ServiceRegistry._pending.set(serviceKey, { entry, initWhen });\n ServiceRegistry.logger.debug(\n `Service ${serviceKey} registered for ${initWhen} initialization`\n );\n } else {\n // Non-singleton: just store metadata, create on demand via create()\n ServiceRegistry.logger.debug(\n `Service ${serviceKey} registered (non-singleton, use create())`\n );\n }\n }\n\n // Wait for all immediate initializations\n await Promise.all(immediatePromises);\n\n const initializedKeys = [...ServiceRegistry._services.keys()];\n const pendingKeys = [...ServiceRegistry._pending.keys()];\n const nonSingletonKeys = [...ServiceRegistry._metadata.entries()]\n .filter(([, meta]) => !meta.isSingleton)\n .map(([key]) => key);\n\n ServiceRegistry.logger.info('Service registry initialized', {\n initialized: initializedKeys,\n pending: pendingKeys,\n nonSingleton: nonSingletonKeys,\n });\n }\n\n // ─────────────────────────────────────────────────────────────────────────\n // Service Access\n // ─────────────────────────────────────────────────────────────────────────\n\n /**\n * Get a singleton service instance by key (synchronous).\n * Throws if the service is not initialized or is non-singleton.\n *\n * @param key - Service key (e.g., 'featureFlags', 'example')\n * @returns The service instance\n * @throws CorePackageError if service not found, not initialized, or non-singleton\n *\n * @example\n * ```typescript\n * const flags = ServiceRegistry.get<FeatureFlagDomainService>('featureFlags');\n * const isEnabled = await flags.isEnabled('my-flag');\n * ```\n */\n static get<T extends CoreDomainServiceInstance = CoreDomainServiceInstance>(key: string): T {\n const service = ServiceRegistry._services.get(key);\n if (service) {\n return service as T;\n }\n\n // Check if non-singleton (must use create())\n const metadata = ServiceRegistry._metadata.get(key);\n if (metadata && !metadata.isSingleton) {\n throw new CorePackageError(\n `Service '${key}' is configured as non-singleton. ` +\n `Use await ServiceRegistry.create('${key}') to create a new instance.`,\n ERROR_CODES.CLIENT_INITIALIZATION_FAILED\n );\n }\n\n // Check if pending lazy initialization\n const pending = ServiceRegistry._pending.get(key);\n if (pending) {\n throw new CorePackageError(\n `Service '${key}' is configured for lazy initialization. ` +\n `Use await ServiceRegistry.getAsync('${key}') instead.`,\n ERROR_CODES.CLIENT_INITIALIZATION_FAILED\n );\n }\n\n throw new CorePackageError(\n `Service '${key}' not found. Register it in ServiceRegistry.initialize()`,\n ERROR_CODES.CLIENT_INITIALIZATION_FAILED\n );\n }\n\n /**\n * Create a new instance of a service.\n * Use this for non-singleton services or when you need a fresh instance.\n *\n * Note: The caller is responsible for disposing the returned instance.\n *\n * @param key - Service key\n * @param configOverrides - Optional config overrides for this instance\n * @returns Promise resolving to a new service instance\n *\n * @example\n * ```typescript\n * // Non-singleton service - always creates new instance\n * const instance1 = await ServiceRegistry.create<WorkerService>('worker');\n * const instance2 = await ServiceRegistry.create<WorkerService>('worker');\n * instance1 !== instance2; // true\n *\n * // With config overrides\n * const customWorker = await ServiceRegistry.create<WorkerService>('worker', {\n * apiClient: { baseURL: 'https://custom-api.com' },\n * });\n *\n * // Don't forget to dispose when done!\n * instance1.dispose();\n * instance2.dispose();\n * ```\n */\n static async create<T extends CoreDomainServiceInstance = CoreDomainServiceInstance>(\n key: string,\n configOverrides?: Partial<CoreServiceInitConfig>\n ): Promise<T> {\n const metadata = ServiceRegistry._metadata.get(key);\n if (!metadata) {\n throw new CorePackageError(\n `Service '${key}' not found. Register it in ServiceRegistry.initialize()`,\n ERROR_CODES.CLIENT_INITIALIZATION_FAILED\n );\n }\n\n // Merge config with overrides\n const mergedEntry: CoreServiceEntry = {\n service: metadata.entry.service,\n config: { ...metadata.entry.config, ...configOverrides },\n };\n\n // Create new instance (don't store in registry)\n return ServiceRegistry.initializeService(mergedEntry, false) as Promise<T>;\n }\n\n /**\n * Get a service instance by key with async initialization if needed.\n * Use this for lazy-initialized services.\n *\n * @param key - Service key\n * @returns Promise resolving to the service instance\n *\n * @example\n * ```typescript\n * const example = await ServiceRegistry.getAsync<ExampleDomainService>('example');\n * const entities = await example.getAll();\n * ```\n */\n static async getAsync<T extends CoreDomainServiceInstance = CoreDomainServiceInstance>(\n key: string\n ): Promise<T> {\n // Return immediately if already initialized\n const existing = ServiceRegistry._services.get(key);\n if (existing) {\n return existing as T;\n }\n\n // Check for in-progress initialization\n const inProgress = ServiceRegistry._initPromises.get(key);\n if (inProgress) {\n return (await inProgress) as T;\n }\n\n // Check if pending lazy initialization\n const pending = ServiceRegistry._pending.get(key);\n if (pending) {\n // Handle conditional initialization\n if (typeof pending.initWhen === 'function') {\n const shouldInit = await pending.initWhen();\n if (!shouldInit) {\n throw new CorePackageError(\n `Service '${key}' initialization condition returned false`,\n ERROR_CODES.CLIENT_INITIALIZATION_FAILED\n );\n }\n }\n\n // Initialize and return\n const service = await ServiceRegistry.initializeService(pending.entry);\n ServiceRegistry._pending.delete(key);\n return service as T;\n }\n\n throw new CorePackageError(\n `Service '${key}' not found. Register it in ServiceRegistry.initialize()`,\n ERROR_CODES.CLIENT_INITIALIZATION_FAILED\n );\n }\n\n /**\n * Check if a service is registered (either initialized or pending).\n *\n * @param key - Service key\n */\n static has(key: string): boolean {\n return ServiceRegistry._services.has(key) || ServiceRegistry._pending.has(key);\n }\n\n /**\n * Check if a service is initialized and ready.\n *\n * @param key - Service key\n */\n static isInitialized(key: string): boolean {\n return ServiceRegistry._services.has(key);\n }\n\n /**\n * Get all initialized service keys.\n */\n static getInitializedKeys(): string[] {\n return [...ServiceRegistry._services.keys()];\n }\n\n /**\n * Get all pending (lazy) service keys.\n */\n static getPendingKeys(): string[] {\n return [...ServiceRegistry._pending.keys()];\n }\n\n // ─────────────────────────────────────────────────────────────────────────\n // Internal: Service Initialization\n // ─────────────────────────────────────────────────────────────────────────\n\n /** Build API client options and instance for service */\n // eslint-disable-next-line complexity\n private static async buildApiClientOptions(\n config: CoreServiceInitConfig,\n entry: CoreServiceEntry\n ): Promise<{ dedicated: boolean; options?: ApiClientOptions; instance?: unknown } | undefined> {\n const dedicatedApiClient = config.dedicatedApiClient;\n const isDedicated = dedicatedApiClient === true || typeof dedicatedApiClient === 'object';\n const serviceKey = entry.service.serviceKey;\n\n const options: ApiClientOptions | undefined = isDedicated\n ? typeof dedicatedApiClient === 'object'\n ? { ...ServiceRegistry._apiClientOptions, ...dedicatedApiClient }\n : (ServiceRegistry._apiClientOptions ?? undefined)\n : (ServiceRegistry._apiClientOptions ?? undefined);\n\n if (!options) {\n return undefined;\n }\n\n // Get or create API client instance\n let apiInstance: unknown;\n if (isDedicated && options) {\n // Create dedicated API client instance for this service\n try {\n // Use the global environment from initialization\n const envConfig = {\n env: ServiceRegistry._environment,\n setAsDefault: false, // Dedicated instances should not become default\n };\n apiInstance = await ApiClientService.createInstance(envConfig, options);\n ServiceRegistry.logger.debug(\n `Created dedicated API client instance for service '${serviceKey}'`,\n {\n environment: ServiceRegistry._environment,\n }\n );\n } catch (error) {\n ServiceRegistry.logger.warn(\n `Failed to create dedicated API client for service '${serviceKey}'`,\n {\n error: error instanceof Error ? error.message : String(error),\n }\n );\n }\n } else {\n // Use global shared API client\n try {\n apiInstance = ApiClientService.getClient();\n } catch {\n ServiceRegistry.logger.debug(\n `Global API client not initialized, service '${serviceKey}' will not have API`\n );\n }\n }\n\n return {\n dedicated: isDedicated,\n options,\n instance: apiInstance,\n };\n }\n\n /** Build DB config and instance for service with runtime validation */\n // eslint-disable-next-line complexity\n private static async buildDbConfig(\n config: CoreServiceInitConfig,\n entry: CoreServiceEntry\n ): Promise<\n | {\n dedicated: boolean;\n config?: Partial<CoreDbServiceConfig>;\n instance?: CoreDbServiceInstance;\n }\n | undefined\n > {\n const dedicatedDb = config.dedicatedDb;\n const isDedicated = dedicatedDb === true || typeof dedicatedDb === 'object';\n const serviceKey = entry.service.serviceKey;\n\n // Runtime validation: DB should only be injected for backend services\n const isBackendRuntime = BACKEND_RUNTIMES.includes(ServiceRegistry._runtime);\n\n if ((isDedicated || ServiceRegistry._dbConfig) && !isBackendRuntime) {\n ServiceRegistry.logger.warn(\n `Service '${serviceKey}' is requesting database injection in '${ServiceRegistry._runtime}' runtime. ` +\n `Database is only available in backend runtimes (${BACKEND_RUNTIMES.join(', ')}). ` +\n `This service will not have database access.`\n );\n return undefined; // Skip DB injection for non-backend runtimes\n }\n\n const dbConfig: Partial<CoreDbServiceConfig> | undefined = isDedicated\n ? typeof dedicatedDb === 'object'\n ? { ...ServiceRegistry._dbConfig, ...dedicatedDb }\n : (ServiceRegistry._dbConfig ?? undefined)\n : (ServiceRegistry._dbConfig ?? undefined);\n\n if (!dbConfig) {\n return undefined;\n }\n\n const DbService = getCoreDependency('DbService');\n if (!DbService) {\n ServiceRegistry.logger.debug(\n `DbService not registered, service '${serviceKey}' will not have DB`\n );\n return undefined;\n }\n\n // Get or create DB instance\n let dbInstance: CoreDbServiceInstance | undefined;\n if (isDedicated && dbConfig) {\n // Create dedicated database instance for this service\n try {\n dbInstance = await DbService.createInstance?.(dbConfig as CoreDbServiceConfig);\n ServiceRegistry.logger.debug(\n `Created dedicated database instance for service '${serviceKey}'`\n );\n } catch (error) {\n ServiceRegistry.logger.warn(\n `Failed to create dedicated database instance for service '${serviceKey}'`,\n {\n error: error instanceof Error ? error.message : String(error),\n }\n );\n }\n } else {\n // Use global shared database\n try {\n dbInstance = DbService.getInstance();\n } catch {\n ServiceRegistry.logger.debug(\n `Global DB not initialized, service '${serviceKey}' will not have DB`\n );\n }\n }\n\n return {\n dedicated: isDedicated,\n config: dbConfig,\n instance: dbInstance,\n };\n }\n\n /** Build cache config and instance for service with runtime validation */\n // eslint-disable-next-line complexity\n private static async buildCacheConfig(\n config: CoreServiceInitConfig,\n entry: CoreServiceEntry\n ): Promise<\n | { dedicated: boolean; config?: CoreCacheConfig; instance?: CoreCacheManagerInstance }\n | undefined\n > {\n const dedicatedCache = config.dedicatedCache;\n const isDedicated = dedicatedCache === true || typeof dedicatedCache === 'object';\n const serviceKey = entry.service.serviceKey;\n\n const cacheConfig: CoreCacheConfig | undefined = isDedicated\n ? typeof dedicatedCache === 'object'\n ? ({ ...ServiceRegistry._cacheConfig, ...dedicatedCache } as CoreCacheConfig)\n : (ServiceRegistry._cacheConfig ?? undefined)\n : (ServiceRegistry._cacheConfig ?? undefined);\n\n if (!cacheConfig) {\n return undefined;\n }\n\n // Runtime validation: Cache on frontend is not supported (CacheManager uses ioredis which requires Node.js)\n const isFrontendRuntime = FRONTEND_RUNTIMES.includes(ServiceRegistry._runtime);\n\n if (isFrontendRuntime) {\n ServiceRegistry.logger.debug(\n `Service '${serviceKey}' skipping cache (frontend runtime - use Zustand store + react-query instead)`\n );\n return undefined;\n }\n\n const CacheService = getCoreDependency('CacheService');\n if (!CacheService) {\n ServiceRegistry.logger.debug(\n `CacheService not registered, service '${serviceKey}' will not have cache`\n );\n return undefined;\n }\n\n // Backend-only: Get cache manager instance from CacheService\n let cacheInstance: CoreCacheManagerInstance | undefined;\n try {\n cacheInstance = CacheService.getInstance().getCacheManager();\n if (isDedicated) {\n ServiceRegistry.logger.debug(\n `Using shared cache for service '${serviceKey}' (dedicated cache not implemented via DI)`,\n { strategy: cacheConfig.strategy }\n );\n }\n } catch {\n ServiceRegistry.logger.debug(\n `Global cache not initialized, service '${serviceKey}' will not have cache`\n );\n }\n\n return {\n dedicated: isDedicated,\n config: cacheConfig,\n instance: cacheInstance,\n };\n }\n\n /** Build observability config and instance for service */\n // eslint-disable-next-line complexity\n private static buildObservabilityConfig(\n config: CoreServiceInitConfig,\n // eslint-disable-next-line no-unused-vars\n _entry: CoreServiceEntry\n ):\n | { dedicated: boolean; config?: CoreObservabilityConfig; instance?: ObservabilityAdapter }\n | undefined {\n const dedicatedObservability = config.dedicatedObservability;\n const isDedicated =\n dedicatedObservability === true || typeof dedicatedObservability === 'object';\n\n const observabilityConfig: CoreObservabilityConfig | undefined = isDedicated\n ? typeof dedicatedObservability === 'object'\n ? ({\n ...ServiceRegistry._observabilityConfig,\n ...dedicatedObservability,\n } as CoreObservabilityConfig)\n : (ServiceRegistry._observabilityConfig ?? undefined)\n : (ServiceRegistry._observabilityConfig ?? undefined);\n\n if (!observabilityConfig) {\n return undefined;\n }\n\n // Instance will be set async if dedicated\n return {\n dedicated: isDedicated,\n config: observabilityConfig,\n instance: isDedicated ? undefined : (ServiceRegistry._observabilityInstance ?? undefined),\n };\n }\n\n /** Build storage config and instance for service with runtime validation (backend-only) */\n // eslint-disable-next-line complexity\n private static async buildStorageConfig(\n config: CoreServiceInitConfig,\n entry: CoreServiceEntry\n ): Promise<\n | { dedicated: boolean; config?: CoreStorageConfig; instance?: CoreStorageServiceInstance }\n | undefined\n > {\n const dedicatedStorage = config.dedicatedStorage;\n const isDedicated = dedicatedStorage === true || typeof dedicatedStorage === 'object';\n const serviceKey = entry.service.serviceKey;\n\n // Runtime validation: Storage is backend-only\n const isBackendRuntime = BACKEND_RUNTIMES.includes(ServiceRegistry._runtime);\n\n if ((isDedicated || ServiceRegistry._storageConfig) && !isBackendRuntime) {\n ServiceRegistry.logger.warn(\n `Service '${serviceKey}' is requesting storage injection in '${ServiceRegistry._runtime}' runtime. ` +\n `Storage is only available in backend runtimes (${BACKEND_RUNTIMES.join(', ')}). ` +\n `This service will not have storage access.`\n );\n return undefined;\n }\n\n const storageConfig: CoreStorageConfig | undefined = isDedicated\n ? typeof dedicatedStorage === 'object'\n ? { ...ServiceRegistry._storageConfig, ...dedicatedStorage }\n : (ServiceRegistry._storageConfig ?? undefined)\n : (ServiceRegistry._storageConfig ?? undefined);\n\n if (!storageConfig) {\n return undefined;\n }\n\n const StorageService = getCoreDependency('StorageService');\n if (!StorageService) {\n ServiceRegistry.logger.debug(\n `StorageService not registered, service '${serviceKey}' will not have storage`\n );\n return undefined;\n }\n\n // Get or create storage instance\n let storageInstance: CoreStorageServiceInstance | undefined;\n if (isDedicated && storageConfig) {\n try {\n storageInstance = await StorageService.createInstance?.(storageConfig);\n ServiceRegistry.logger.debug(\n `Created dedicated storage instance for service '${serviceKey}'`\n );\n } catch (error) {\n ServiceRegistry.logger.warn(\n `Failed to create dedicated storage instance for service '${serviceKey}'`,\n { error: error instanceof Error ? error.message : String(error) }\n );\n }\n } else {\n try {\n storageInstance = StorageService.getInstance();\n } catch {\n ServiceRegistry.logger.debug(\n `Global storage not initialized, service '${serviceKey}' will not have storage`\n );\n }\n }\n\n return {\n dedicated: isDedicated,\n config: storageConfig,\n instance: storageInstance,\n };\n }\n\n /** Build notifications config and instance for service with runtime validation (backend-only) */\n // eslint-disable-next-line complexity\n private static async buildNotificationsConfig(\n config: CoreServiceInitConfig,\n entry: CoreServiceEntry\n ): Promise<\n | {\n dedicated: boolean;\n config?: CoreNotificationConfig;\n instance?: CoreNotificationServiceInstance;\n }\n | undefined\n > {\n const dedicatedNotifications = config.dedicatedNotifications;\n const isDedicated =\n dedicatedNotifications === true || typeof dedicatedNotifications === 'object';\n const serviceKey = entry.service.serviceKey;\n\n // Runtime validation: Notifications is backend-only\n const isBackendRuntime = BACKEND_RUNTIMES.includes(ServiceRegistry._runtime);\n\n if ((isDedicated || ServiceRegistry._notificationsConfig) && !isBackendRuntime) {\n ServiceRegistry.logger.warn(\n `Service '${serviceKey}' is requesting notifications injection in '${ServiceRegistry._runtime}' runtime. ` +\n `Notifications is only available in backend runtimes (${BACKEND_RUNTIMES.join(', ')}). ` +\n `This service will not have notifications access.`\n );\n return undefined;\n }\n\n const notificationsConfig: CoreNotificationConfig | undefined = isDedicated\n ? typeof dedicatedNotifications === 'object'\n ? { ...ServiceRegistry._notificationsConfig, ...dedicatedNotifications }\n : (ServiceRegistry._notificationsConfig ?? undefined)\n : (ServiceRegistry._notificationsConfig ?? undefined);\n\n if (!notificationsConfig) {\n return undefined;\n }\n\n const NotificationService = getCoreDependency('NotificationService');\n if (!NotificationService) {\n ServiceRegistry.logger.debug(\n `NotificationService not registered, service '${serviceKey}' will not have notifications`\n );\n return undefined;\n }\n\n // Get or create notifications instance\n let notificationsInstance: CoreNotificationServiceInstance | undefined;\n if (isDedicated && notificationsConfig) {\n try {\n notificationsInstance = await NotificationService.createInstance?.(notificationsConfig);\n ServiceRegistry.logger.debug(\n `Created dedicated notifications instance for service '${serviceKey}'`\n );\n } catch (error) {\n ServiceRegistry.logger.warn(\n `Failed to create dedicated notifications instance for service '${serviceKey}'`,\n { error: error instanceof Error ? error.message : String(error) }\n );\n }\n } else {\n try {\n notificationsInstance = NotificationService.getInstance();\n } catch {\n ServiceRegistry.logger.debug(\n `Global notifications not initialized, service '${serviceKey}' will not have notifications`\n );\n }\n }\n\n return {\n dedicated: isDedicated,\n config: notificationsConfig,\n instance: notificationsInstance,\n };\n }\n\n /**\n * Create a dedicated ObservabilityService instance for a service.\n * Uses the same adapter pattern as global observability but with service-specific config.\n */\n private static async createDedicatedObservability(\n serviceKey: string,\n config: CoreObservabilityConfig\n ): Promise<ObservabilityAdapter | undefined> {\n // Skip if explicitly disabled\n if (config.enabled === false) {\n return undefined;\n }\n\n try {\n // createObservabilityService auto-adds LoggerAdapter as failover\n const dedicatedService = await createObservabilityService({\n mode: config.mode ?? 'parallel',\n serviceName: `${config.serviceName ?? 'service'}-${serviceKey}`,\n environment: config.environment,\n adapters: config.adapters,\n });\n\n ServiceRegistry.logger.debug(\n `Created dedicated ObservabilityService for service '${serviceKey}'`\n );\n\n return dedicatedService;\n } catch (err) {\n ServiceRegistry.logger.warn(\n `Failed to create dedicated observability for '${serviceKey}', falling back to global`,\n { error: err instanceof Error ? err.message : String(err) }\n );\n return ServiceRegistry._observabilityInstance ?? undefined;\n }\n }\n\n /**\n * Set the global observability adapter instance.\n * Called by Core.initialize() after creating the adapter.\n */\n static setObservabilityInstance(instance: ObservabilityAdapter): void {\n ServiceRegistry._observabilityInstance = instance;\n ServiceRegistry.logger.debug('Global observability instance set');\n }\n\n /**\n * Get the global observability adapter instance.\n */\n static getObservabilityInstance(): ObservabilityAdapter | null {\n return ServiceRegistry._observabilityInstance;\n }\n\n /**\n * Initialize a single service from an entry.\n * Uses the service class's static create() method.\n * Merges per-service config with global config.\n */\n private static async initializeService(\n entry: CoreServiceEntry,\n storeSingleton = true\n ): Promise<CoreDomainServiceInstance> {\n const { service: ServiceClass, config } = entry;\n const serviceKey = ServiceClass.serviceKey;\n const isSingleton = config.singleton !== false;\n\n // For singletons, check for concurrent initialization\n if (storeSingleton && isSingleton) {\n const existingPromise = ServiceRegistry._initPromises.get(serviceKey);\n if (existingPromise) return existingPromise;\n }\n\n const initPromise = ServiceRegistry.doInitializeService(entry, { isSingleton, storeSingleton });\n\n if (storeSingleton && isSingleton) {\n ServiceRegistry._initPromises.set(serviceKey, initPromise);\n }\n\n return initPromise;\n }\n\n /** Build stores for service injection */\n private static buildStoresForService(\n config: CoreServiceInitConfig\n ): Partial<RootStoreSlice> | undefined {\n const allKeys = new Set<keyof RootStoreSlice>();\n\n // Add primary store\n if (config.store) {\n allKeys.add(config.store);\n }\n\n // Add read stores\n if (config.readStores) {\n config.readStores.forEach(key => allKeys.add(key));\n }\n\n if (allKeys.size === 0) {\n return undefined;\n }\n\n if (!ServiceRegistry._storeRegistry) {\n ServiceRegistry.logger.warn('Store registry not initialized, cannot inject stores');\n return undefined;\n }\n\n const stores: Partial<RootStoreSlice> = {};\n for (const key of allKeys) {\n const store = ServiceRegistry._storeRegistry.getStore(key);\n if (store) {\n (stores as Record<keyof RootStoreSlice, unknown>)[key] = store;\n ServiceRegistry.logger.debug(`Injected store '${key}' into service`);\n } else {\n ServiceRegistry.logger.warn(`Store '${key}' requested but not found in registry`);\n }\n }\n\n return Object.keys(stores).length > 0 ? stores : undefined;\n }\n\n /** Perform the actual service initialization */\n // eslint-disable-next-line complexity\n private static async doInitializeService(\n entry: CoreServiceEntry,\n options: { isSingleton: boolean; storeSingleton: boolean }\n ): Promise<CoreDomainServiceInstance> {\n const { service: serviceClass, config } = entry;\n const serviceKey = serviceClass.serviceKey;\n const { isSingleton, storeSingleton } = options;\n\n try {\n ServiceRegistry.logger.debug(`Initializing service: ${serviceKey}`);\n\n // Build dependencies (async operations) with runtime validation\n const apiClient = await ServiceRegistry.buildApiClientOptions(config, entry);\n const db = await ServiceRegistry.buildDbConfig(config, entry);\n const cache = await ServiceRegistry.buildCacheConfig(config, entry);\n const observability = ServiceRegistry.buildObservabilityConfig(config, entry);\n const storage = await ServiceRegistry.buildStorageConfig(config, entry);\n const notifications = await ServiceRegistry.buildNotificationsConfig(config, entry);\n const stores = ServiceRegistry.buildStoresForService(config);\n\n // Create dedicated observability instance if requested\n let observabilityInstance = observability?.instance;\n if (observability?.dedicated && observability.config) {\n observabilityInstance = await ServiceRegistry.createDedicatedObservability(\n serviceKey,\n observability.config\n );\n }\n\n const createOptions: CoreServiceCreateOptions = {\n apiClient,\n db,\n cache,\n observability: observability\n ? { ...observability, instance: observabilityInstance }\n : undefined,\n storage,\n notifications,\n injected: {\n ...(stores ? { stores } : {}),\n cache: cache?.instance,\n db: db?.instance,\n api: apiClient?.instance,\n observability: observabilityInstance,\n storage: storage?.instance,\n notifications: notifications?.instance,\n },\n isSingleton,\n };\n\n ServiceRegistry.logger.debug(`Service ${serviceKey} config:`, {\n apiClientDedicated: createOptions.apiClient?.dedicated,\n dbDedicated: createOptions.db?.dedicated,\n observabilityDedicated: createOptions.observability?.dedicated,\n storageDedicated: createOptions.storage?.dedicated,\n notificationsDedicated: createOptions.notifications?.dedicated,\n injected: {\n hasCache: !!createOptions.injected?.cache,\n hasDb: !!createOptions.injected?.db,\n hasApi: !!createOptions.injected?.api,\n hasObservability: !!createOptions.injected?.observability,\n hasStorage: !!createOptions.injected?.storage,\n hasNotifications: !!createOptions.injected?.notifications,\n hasStores: !!createOptions.injected?.stores,\n },\n });\n\n const instance = await serviceClass.create(config, createOptions);\n\n if (storeSingleton && isSingleton) {\n ServiceRegistry._services.set(serviceKey, instance);\n ServiceRegistry.logger.info(`Service initialized: ${serviceKey} (singleton)`);\n } else {\n ServiceRegistry.logger.info(`Service created: ${serviceKey} (instance)`);\n }\n\n return instance;\n } catch (error) {\n ServiceRegistry.logger.error(`Failed to initialize service: ${serviceKey}`, {\n error: error instanceof Error ? error.message : String(error),\n });\n throw error;\n } finally {\n if (storeSingleton && isSingleton) {\n ServiceRegistry._initPromises.delete(serviceKey);\n }\n }\n }\n\n // ─────────────────────────────────────────────────────────────────────────\n // Disposal\n // ─────────────────────────────────────────────────────────────────────────\n\n /**\n * Dispose a specific service by key.\n *\n * @param key - Service key to dispose\n */\n static dispose(key: string): void {\n const service = ServiceRegistry._services.get(key);\n if (service) {\n service.dispose();\n ServiceRegistry._services.delete(key);\n ServiceRegistry.logger.info(`Service disposed: ${key}`);\n }\n ServiceRegistry._pending.delete(key);\n }\n\n /**\n * Dispose all services and clear the registry.\n */\n static disposeAll(): void {\n // Dispose all initialized services\n for (const [key, service] of ServiceRegistry._services) {\n try {\n service.dispose();\n ServiceRegistry.logger.debug(`Disposed service: ${key}`);\n } catch (error) {\n ServiceRegistry.logger.error(`Error disposing service: ${key}`, {\n error: error instanceof Error ? error.message : String(error),\n });\n }\n }\n\n // Clear all state\n ServiceRegistry._services.clear();\n ServiceRegistry._pending.clear();\n ServiceRegistry._metadata.clear();\n ServiceRegistry._initPromises.clear();\n ServiceRegistry._apiClientOptions = null;\n ServiceRegistry._dbConfig = null;\n ServiceRegistry._cacheConfig = null;\n ServiceRegistry._observabilityConfig = null;\n ServiceRegistry._observabilityInstance = null;\n ServiceRegistry._storageConfig = null;\n ServiceRegistry._notificationsConfig = null;\n\n ServiceRegistry.logger.info('Service registry disposed');\n }\n\n /**\n * Check if a service is configured as singleton.\n *\n * @param key - Service key\n * @returns true if singleton (default), false if non-singleton\n */\n static isSingleton(key: string): boolean {\n const metadata = ServiceRegistry._metadata.get(key);\n return metadata?.isSingleton ?? true;\n }\n\n /**\n * Get all non-singleton service keys.\n * These services must be created via `create()` method.\n */\n static getNonSingletonKeys(): string[] {\n return [...ServiceRegistry._metadata.entries()]\n .filter(([, meta]) => !meta.isSingleton)\n .map(([key]) => key);\n }\n\n // ─────────────────────────────────────────────────────────────────────────\n // Dynamic Registration\n // ─────────────────────────────────────────────────────────────────────────\n\n /**\n * Register a new service dynamically after initialization.\n *\n * @param entry - Service entry to register\n * @param initNow - Whether to initialize immediately (default: true)\n *\n * @example\n * ```typescript\n * // Register and initialize immediately\n * await ServiceRegistry.register({\n * service: NewDomainService,\n * config: { enabled: true },\n * });\n *\n * // Register for lazy initialization\n * ServiceRegistry.register({\n * service: LazyService,\n * config: { enabled: true, initWhen: 'lazy' },\n * }, false);\n * ```\n */\n static async register(entry: CoreServiceEntry, initNow = true): Promise<void> {\n const serviceKey = entry.service.serviceKey;\n\n // Check if already registered\n if (ServiceRegistry._services.has(serviceKey) || ServiceRegistry._pending.has(serviceKey)) {\n ServiceRegistry.logger.warn(`Service '${serviceKey}' is already registered`);\n return;\n }\n\n const initWhen = entry.config.initWhen ?? 'immediate';\n\n if (initNow && initWhen === 'immediate') {\n await ServiceRegistry.initializeService(entry);\n } else {\n ServiceRegistry._pending.set(serviceKey, { entry, initWhen });\n ServiceRegistry.logger.debug(\n `Service ${serviceKey} registered for ${initWhen} initialization`\n );\n }\n }\n\n /**\n * Unregister a service (dispose if initialized).\n *\n * @param key - Service key to unregister\n */\n static unregister(key: string): void {\n ServiceRegistry.dispose(key);\n }\n}\n","/**\n * Runtime Detection Utilities\n *\n * Utilities for detecting the current JavaScript runtime environment.\n */\n\nimport type { CoreRuntimeEnvironment } from '@plyaz/types/core';\nimport { PackageLogger } from '@plyaz/logger';\n\nconst logger = new PackageLogger({ packageName: 'core', service: 'Runtime' });\n\n/**\n * Check if a module is available via require.resolve\n */\nfunction isModuleAvailable(moduleName: string): boolean {\n const nodeRequire = globalThis.require;\n if (!nodeRequire) return false;\n\n const resolveModule = nodeRequire.resolve;\n if (!resolveModule) return false;\n\n try {\n resolveModule(moduleName);\n return true;\n } catch {\n return false;\n }\n}\n\n/** Check for alternative runtimes (Deno, Bun) */\nfunction detectAltRuntime(): CoreRuntimeEnvironment | null {\n if (typeof globalThis.Deno !== 'undefined') return 'deno';\n if (typeof globalThis.Bun !== 'undefined') return 'bun';\n return null;\n}\n\n/** Check for edge runtime */\nfunction detectEdgeRuntime(): CoreRuntimeEnvironment | null {\n if (typeof globalThis.EdgeRuntime !== 'undefined') return 'edge';\n const isEdgeLike =\n typeof globalThis.caches !== 'undefined' &&\n typeof globalThis.Request !== 'undefined' &&\n typeof process === 'undefined';\n return isEdgeLike ? 'edge' : null;\n}\n\n/** Check for browser environment */\nfunction detectBrowser(): CoreRuntimeEnvironment | null {\n if (typeof window !== 'undefined' && typeof document !== 'undefined') {\n return 'browser';\n }\n return null;\n}\n\n/** Check for Node.js framework */\nfunction detectNodeFramework(): CoreRuntimeEnvironment {\n // Check for Nuxt (SSR)\n if (process.env.__NUXT__ || process.env.NUXT_APP) return 'nuxt';\n // Check for Next.js (SSR)\n if (process.env.__NEXT_PRIVATE_ORIGIN || process.env.NEXT_RUNTIME) return 'nextjs';\n // Check for NestJS via module detection\n if (isModuleAvailable('@nestjs/core')) return 'nestjs';\n // Check for Express via module detection\n if (isModuleAvailable('express')) return 'express';\n return 'node';\n}\n\n/**\n * Detect the current runtime environment\n */\nexport function detectRuntime(): CoreRuntimeEnvironment {\n // Check alternative runtimes first\n const altRuntime = detectAltRuntime();\n if (altRuntime) return altRuntime;\n\n // Check for edge runtime\n const edgeRuntime = detectEdgeRuntime();\n if (edgeRuntime) return edgeRuntime;\n\n // Check for browser\n const browser = detectBrowser();\n if (browser) return browser;\n\n // Server-side detection (Node.js based)\n if (typeof process !== 'undefined' && process.versions?.node) {\n return detectNodeFramework();\n }\n\n return 'unknown';\n}\n\n/**\n * Load environment variables from a .env file\n */\nexport async function loadEnvFile(envPath: string, verbose?: boolean): Promise<void> {\n try {\n const dotenv = await import('dotenv');\n const result = dotenv.config({ path: envPath });\n\n if (result.error) {\n logger.warn(`Failed to load env file: ${result.error.message}`);\n } else if (verbose) {\n logger.info(`Loaded env from: ${envPath}`);\n }\n } catch {\n logger.warn('dotenv not available, skipping .env file loading');\n }\n}\n","// This eslint disable is an edge-case as we need to ensure that we're able to load CoreInitializer regardless if FE, BE or specific frameworks\n/**\n * CoreInitializer - Unified initialization for @plyaz/core\n *\n * Provides a single entry point to initialize all core services with\n * environment-aware configuration. Works across all JavaScript runtimes.\n *\n * @example Backend with full config\n * ```typescript\n * import { Core } from '@plyaz/core';\n *\n * await Core.initialize({\n * envPath: '.env',\n * db: { adapter: 'drizzle' },\n * api: {\n * env: 'production',\n * baseURL: 'https://api.example.com',\n * },\n * });\n *\n * // Access services\n * const db = Core.db;\n * const api = Core.api;\n * ```\n *\n * @example Frontend (Nuxt/Next.js)\n * ```typescript\n * import { Core } from '@plyaz/core';\n *\n * await Core.initialize({\n * skipDb: true,\n * api: { baseURL: 'https://api.example.com' },\n * });\n *\n * const api = Core.api;\n * ```\n *\n * @example NestJS with DI\n * ```typescript\n * // app.module.ts\n * import { CoreModule } from '@plyaz/core/adapters';\n * import { FeatureFlagModule } from '@plyaz/core/backend/featureFlags';\n *\n * @Module({\n * imports: [\n * CoreModule.forRoot({ envPath: '.env', db: { adapter: 'drizzle' } }),\n * FeatureFlagModule.forRoot({ provider: 'database' }),\n * ],\n * })\n * export class AppModule {}\n * ```\n */\n\nimport { PackageLogger } from '@plyaz/logger';\nimport { ApiClientService } from '../services/ApiClientService';\nimport { CoreEventManager } from '../events/CoreEventManager';\nimport { ServiceRegistry } from './ServiceRegistry';\nimport type {\n CoreRuntimeEnvironment,\n CoreRuntimeContext,\n CoreEnvVars,\n CoreAppEnvironment,\n CoreAppContext,\n CoreApiInitOptions,\n CoreServiceRuntime,\n CoreInitOptions as BaseCoreInitOptions,\n CoreServicesResultBase,\n CoreServiceEntry,\n CoreDomainServiceInstance,\n CoreSystemErrorPayload,\n CoreFeatureFlagInitConfig,\n CoreErrorHandlerInitConfig,\n CoreCacheConfig,\n CoreObservabilityConfig,\n CoreDbServiceConfig,\n CoreStorageConfig,\n CoreNotificationConfig,\n // Service instance types (from @plyaz/types, not backend modules)\n CoreDbServiceInstance,\n CoreCacheServiceInstance,\n CoreStorageServiceInstance,\n CoreNotificationServiceInstance,\n} from '@plyaz/types/core';\nimport type { ObservabilityAdapter } from '@plyaz/types/observability';\nimport { ObservabilityService } from '../base/observability/ObservabilityService';\nimport { LoggerAdapter } from '../base/observability/LoggerAdapter';\nimport type { FeatureFlagValue, FeatureFlagStoreSlice } from '@plyaz/types/features';\nimport { ERROR_CODES, BACKEND_RUNTIMES, FRONTEND_RUNTIMES } from '@plyaz/types';\nimport { BaseError, CorePackageError, initializeErrorSystem } from '@plyaz/errors';\n// Core error handling (frontend-safe)\nimport {\n initializeGlobalErrorHandler,\n setEventEmitter,\n clearEventEmitter,\n} from '@plyaz/errors/middleware';\n// ServerErrorMiddleware is backend-only, import dynamically where needed\nimport type { ErrorStoreActions, GlobalErrorHandler } from '@plyaz/types/errors';\nimport { detectRuntime, loadEnvFile } from '../utils/runtime';\nimport {\n createStandaloneFeatureFlagStore,\n useRootStore,\n STORE_KEYS,\n type StoreKey,\n} from '@plyaz/store';\nimport { CORE_EVENTS, type CoreEvent } from '@plyaz/types/core';\nimport type { RootStoreSlice } from '@plyaz/types/store';\nimport type { StoreApi } from 'zustand/vanilla';\nimport { getCoreDependency } from '../config/dependencies';\n\n// Constants\nconst DEFAULT_MAX_ERRORS = 100;\n\n/**\n * Core initialization options with specific types for this package\n */\nexport interface CoreInitOptions\n extends Omit<\n BaseCoreInitOptions<\n Partial<CoreDbServiceConfig>,\n CoreApiInitOptions,\n CoreCacheConfig,\n CoreStorageConfig,\n CoreNotificationConfig\n >,\n 'observability' | 'skipObservability'\n > {\n /** Observability configuration */\n observability?: CoreObservabilityConfig;\n /** Skip observability initialization */\n skipObservability?: boolean;\n /**\n * Global error handler configuration.\n * Auto-initializes by default to catch all uncaught errors.\n * Set `enabled: false` to disable if you want to use your own error handling.\n *\n * @example\n * ```typescript\n * await Core.initialize({\n * errorHandler: {\n * enabled: true,\n * logToConsole: true,\n * maxErrors: 200,\n * filter: (error) => error instanceof MyError,\n * },\n * });\n * ```\n */\n errorHandler?: CoreErrorHandlerInitConfig;\n\n /** Feature flags configuration */\n featureFlags?: CoreFeatureFlagInitConfig;\n\n /**\n * Domain services to auto-initialize (frontend pattern).\n * Uses ServiceRegistry for automatic initialization.\n *\n * @example\n * ```typescript\n * await Core.initialize({\n * services: [\n * { service: FeatureFlagDomainService, config: { enabled: true } },\n * { service: ExampleDomainService, config: { enabled: true, useRealApi: true } },\n * ],\n * });\n *\n * // Access via ServiceRegistry\n * const flags = ServiceRegistry.get<FeatureFlagDomainService>('featureFlags');\n * ```\n */\n services?: CoreServiceEntry[];\n}\n\n/**\n * Core initialization result with specific types for this package\n */\nexport type CoreServicesResult = CoreServicesResultBase<\n CoreDbServiceInstance,\n typeof ApiClientService,\n CoreCacheServiceInstance,\n ObservabilityAdapter,\n CoreStorageServiceInstance,\n CoreNotificationServiceInstance\n>;\n\n// Domain store keys are automatically derived from STORE_KEYS\n// Excluding global stores (error, featureFlags) which are read-only by default\n\n/**\n * Function type for getting core domain services.\n * Used by entry points to inject runtime-appropriate services.\n *\n * @internal This is injected by entry points, not used directly.\n */\nexport type GetCoreDomainServicesFn = (isFrontend: boolean) => Promise<CoreServiceEntry[]>;\n\n/**\n * Injected function to get core domain services.\n * Set by entry points (entry-backend.ts) before Core.initialize().\n * Frontend entries don't set this - they just don't load default services.\n */\nlet _getCoreDomainServices: GetCoreDomainServicesFn | null = null;\n\n/**\n * Set the function to get core domain services.\n * Called by entry-backend.ts to inject the backend-aware service loader.\n *\n * @internal Used by entry points only.\n */\nexport function setGetCoreDomainServices(fn: GetCoreDomainServicesFn): void {\n _getCoreDomainServices = fn;\n}\n\nexport class Core {\n private static initialized = false;\n private static _coreServices: CoreServicesResult = {\n db: null,\n api: null,\n cache: null,\n observability: null,\n storage: null,\n notifications: null,\n env: {},\n runtime: 'unknown',\n appContext: 'webapp',\n };\n\n /**\n * Logger for Core initialization (created lazily)\n */\n private static _logger: PackageLogger | null = null;\n\n /**\n * Get or create the Core logger\n */\n private static get logger(): PackageLogger {\n Core._logger ??= new PackageLogger({\n packageName: 'core',\n service: 'Core',\n });\n return Core._logger;\n }\n\n /**\n * Log a message during initialization.\n * Uses PackageLogger, respects verbose flag.\n */\n private static log(message: string, verbose?: boolean, data?: Record<string, unknown>): void {\n if (!verbose) return;\n if (data) {\n Core.logger.info(message, data);\n } else {\n Core.logger.info(message);\n }\n }\n\n /**\n * Log a debug message during initialization.\n */\n private static logDebug(\n message: string,\n verbose?: boolean,\n data?: Record<string, unknown>\n ): void {\n if (!verbose) return;\n if (data) {\n Core.logger.debug(message, data);\n } else {\n Core.logger.debug(message);\n }\n }\n\n /**\n * Observability configuration\n */\n private static _observabilityConfig: CoreObservabilityConfig = {};\n\n /**\n * Global error handler instance\n */\n private static _errorHandler: GlobalErrorHandler | null = null;\n\n /**\n * Error handler configuration\n */\n private static _errorConfig: CoreErrorHandlerInitConfig = {};\n\n /**\n * HTTP error handler/middleware based on runtime.\n * Auto-created during initialization.\n */\n private static _httpErrorHandler: unknown = null;\n\n /**\n * Event listener cleanup functions\n */\n private static _eventCleanupFns: (() => void)[] = [];\n\n /**\n * Feature flag configuration\n */\n private static _flagConfig: CoreFeatureFlagInitConfig = {};\n\n /**\n * Root store instance (contains errors, feature flags, and all other slices)\n * Initialized during Core.initialize() - frontend uses React hook store, backend uses vanilla store\n * All store access should go through Core.rootStore - no separate stores needed\n */\n private static _rootStore: StoreApi<RootStoreSlice> | null = null;\n\n /**\n * Setup environment and context\n */\n private static async setupEnvironment(options: CoreInitOptions): Promise<CoreAppEnvironment> {\n const { envPath, environment, appContext, env, verbose } = options;\n\n Core._coreServices.appContext = appContext ?? 'webapp';\n Core.log(`App context: ${Core._coreServices.appContext}`, verbose);\n\n const globalEnvironment: CoreAppEnvironment =\n environment ?? (process.env.NODE_ENV as CoreAppEnvironment) ?? 'development';\n Core.log(`Global environment: ${globalEnvironment}`, verbose);\n\n Core._coreServices.runtime = detectRuntime();\n Core.log(`Detected runtime: ${Core._coreServices.runtime}`, verbose);\n\n if (envPath) await loadEnvFile(envPath, verbose);\n Core._coreServices.env = { ...process.env, ...env };\n\n return globalEnvironment;\n }\n\n /**\n * Initialize a service with error handling\n */\n private static async initService<T>(\n name: string,\n init: () => Promise<T>,\n verbose?: boolean\n ): Promise<T | undefined> {\n try {\n return await init();\n } catch (error) {\n Core.logger.error(`Failed to initialize ${name}`, { error: (error as Error).message });\n if (verbose) Core.logger.error('Full error', { error });\n return undefined;\n }\n }\n\n /** Initialize error handler if enabled */\n private static async initErrorHandlerIfEnabled(options: CoreInitOptions): Promise<void> {\n const { errorHandler: config, verbose } = options;\n if (config?.enabled === false) {\n Core.log('Global error handler disabled by configuration', verbose);\n return;\n }\n await Core.initService(\n 'error handler',\n async () => {\n await Core.initializeErrorHandler(config, verbose);\n Core.subscribeToErrorEvents(verbose);\n },\n verbose\n );\n }\n\n /** Initialize API client if not skipped */\n private static async initApiIfEnabled(\n options: CoreInitOptions,\n env: CoreAppEnvironment\n ): Promise<void> {\n const { api: apiConfig, skipApi, verbose } = options;\n if (skipApi) return;\n\n await Core.initService(\n 'API client',\n async () => {\n await Core.initializeApi(apiConfig, env, verbose);\n Core._coreServices.api = ApiClientService;\n Core.log('API client service initialized', verbose);\n },\n verbose\n );\n Core._coreServices.api = ApiClientService;\n }\n\n /** Initialize cache service if not skipped (backend-only due to ioredis dependency) */\n private static async initCacheIfEnabled(options: CoreInitOptions): Promise<void> {\n const { cache: cacheConfig, skipCache, verbose } = options;\n if (skipCache) {\n Core.log('Cache service skipped (skipCache: true)', verbose);\n return;\n }\n\n // Skip cache initialization if no config provided\n if (!cacheConfig) {\n Core.log('Cache service skipped (no config provided)', verbose);\n return;\n }\n\n // Skip on frontend runtimes (CacheService pulls in ioredis which requires Node.js)\n if (Core.isFrontend) {\n Core.log('Cache service skipped (frontend runtime detected)', verbose);\n return;\n }\n\n await Core.initService(\n 'cache',\n async () => {\n await Core.initializeCache(cacheConfig as CoreCacheConfig, verbose);\n const CacheService = getCoreDependency('CacheService');\n if (CacheService) {\n Core._coreServices.cache = CacheService.getInstance();\n Core.log('Cache service initialized', verbose);\n }\n },\n verbose\n );\n }\n\n /** Initialize observability if not skipped */\n private static async initObservabilityIfEnabled(\n options: CoreInitOptions,\n globalEnvironment: CoreAppEnvironment\n ): Promise<void> {\n const { observability: observabilityConfig, skipObservability, verbose } = options;\n if (skipObservability) {\n Core.log('Observability service skipped (skipObservability: true)', verbose);\n return;\n }\n\n // Always use ObservabilityService - it adds LoggerAdapter by default\n const config = observabilityConfig ?? { enabled: true };\n\n await Core.initService(\n 'observability',\n async () => {\n await Core.initializeObservability(config, verbose, globalEnvironment);\n Core.log('Observability service initialized', verbose);\n },\n verbose\n );\n }\n\n /** Initialize storage service if not skipped (backend-only) */\n private static async initStorageIfEnabled(options: CoreInitOptions): Promise<void> {\n const { storage: storageConfig, skipStorage, verbose } = options;\n\n // Skip if explicitly disabled\n if (skipStorage) {\n Core.log('Storage service skipped (skipStorage: true)', verbose);\n return;\n }\n\n // Skip if no config provided\n if (!storageConfig) {\n Core.log('Storage service skipped (no config provided)', verbose);\n return;\n }\n\n // Skip on frontend runtimes (storage is backend-only)\n if (Core.isFrontend) {\n Core.log('Storage service skipped (frontend runtime detected)', verbose);\n return;\n }\n\n await Core.initService(\n 'storage',\n async () => {\n const StorageService = getCoreDependency('StorageService');\n if (!StorageService) {\n Core.log('Storage service skipped (dependency not registered)', verbose);\n return;\n }\n await StorageService.initialize(storageConfig);\n Core._coreServices.storage = StorageService.getInstance();\n Core.log('Storage service initialized', verbose);\n },\n verbose\n );\n }\n\n /** Initialize notifications service if not skipped (backend-only) */\n private static async initNotificationsIfEnabled(options: CoreInitOptions): Promise<void> {\n const { notifications: notificationsConfig, skipNotifications, verbose } = options;\n\n // Skip if explicitly disabled\n if (skipNotifications) {\n Core.log('Notifications service skipped (skipNotifications: true)', verbose);\n return;\n }\n\n // Skip if no config provided\n if (!notificationsConfig) {\n Core.log('Notifications service skipped (no config provided)', verbose);\n return;\n }\n\n // Skip on frontend runtimes (notifications is backend-only)\n if (Core.isFrontend) {\n Core.log('Notifications service skipped (frontend runtime detected)', verbose);\n return;\n }\n\n await Core.initService(\n 'notifications',\n async () => {\n const NotificationService = getCoreDependency('NotificationService');\n if (!NotificationService) {\n Core.log('Notifications service skipped (dependency not registered)', verbose);\n return;\n }\n await NotificationService.initialize(notificationsConfig);\n Core._coreServices.notifications = NotificationService.getInstance();\n Core.log('Notifications service initialized', verbose);\n },\n verbose\n );\n }\n\n /**\n * Initialize domain services\n *\n * Loads core domain services using the injected loader (if available),\n * then merges with any user-provided services.\n * User-provided service configs override core defaults.\n *\n * Note: Frontend entries don't inject a loader, so they only use user-provided services.\n */\n private static async initDomainServicesIfConfigured(\n options: CoreInitOptions,\n globalEnvironment: CoreAppEnvironment\n ): Promise<void> {\n const { api: apiConfig, services: userServices, verbose } = options;\n const runtime = Core._coreServices.runtime;\n\n // Load core services using injected loader (backend sets this, frontend doesn't)\n const coreDomainServices = _getCoreDomainServices\n ? await _getCoreDomainServices(Core.isFrontend)\n : [];\n\n // Merge core services with user-provided services\n // User services can override core service configs by using the same service class\n const coreServiceKeys = new Set(coreDomainServices.map(s => s.service.serviceKey));\n const userOverrides = (userServices ?? []).filter(s =>\n coreServiceKeys.has(s.service.serviceKey)\n );\n const additionalUserServices = (userServices ?? []).filter(\n s => !coreServiceKeys.has(s.service.serviceKey)\n );\n\n // Build merged services: core (with overrides applied) + additional user services\n const mergedServices: CoreServiceEntry[] = coreDomainServices\n .map(coreService => {\n const override = userOverrides.find(\n u => u.service.serviceKey === coreService.service.serviceKey\n );\n return override\n ? { ...coreService, config: { ...coreService.config, ...override.config } }\n : coreService;\n })\n .concat(additionalUserServices);\n\n // Skip if somehow no services\n if (mergedServices.length === 0) return;\n\n await Core.initService(\n 'domain services',\n async () => {\n Core.log('Initializing domain services via ServiceRegistry...', verbose);\n Core.logDebug('Core services', verbose, {\n services: coreDomainServices.map(s => s.service.serviceKey),\n });\n if (userServices?.length) {\n Core.logDebug('User services', verbose, {\n services: userServices.map(s => s.service.serviceKey),\n });\n }\n await ServiceRegistry.initialize({\n environment: globalEnvironment,\n runtime,\n apiClient: apiConfig ? { baseURL: apiConfig.baseURL, ...apiConfig } : undefined,\n services: mergedServices,\n stores: {\n // Returns specific slice from namespaced root store (type-safe)\n getStore: <K extends keyof RootStoreSlice>(key: K): RootStoreSlice[K] | undefined =>\n Core.getDomainStore(key),\n },\n });\n Core.log('Domain services initialized', verbose, {\n keys: ServiceRegistry.getInitializedKeys(),\n });\n },\n verbose\n );\n }\n\n /**\n * Initialize all core services\n */\n\n static async initialize(options: CoreInitOptions = {}): Promise<CoreServicesResult> {\n if (Core.initialized) {\n Core.log('Already initialized, returning existing services', options.verbose);\n return Core._coreServices;\n }\n\n const { db: dbConfig, featureFlags: featureFlagsConfig, skipDb, verbose } = options;\n const globalEnvironment = await Core.setupEnvironment(options);\n\n await Core.initErrorHandlerIfEnabled(options);\n\n if (!Core.shouldSkipDbService(skipDb, verbose)) {\n const db = await Core.initService(\n 'database',\n () => Core.initializeDb(dbConfig, verbose),\n verbose\n );\n Core._coreServices.db = db ?? null;\n }\n\n await Core.initApiIfEnabled(options, globalEnvironment);\n\n await Core.initCacheIfEnabled(options);\n\n await Core.initObservabilityIfEnabled(options, globalEnvironment);\n\n await Core.initStorageIfEnabled(options);\n\n await Core.initNotificationsIfEnabled(options);\n\n if (featureFlagsConfig?.enabled !== false) {\n await Core.initService(\n 'feature flags',\n () => Core.initializeFeatureFlags(featureFlagsConfig, verbose),\n verbose\n );\n }\n\n await Core.initDomainServicesIfConfigured(options, globalEnvironment);\n\n Core.initialized = true;\n Core.log('Initialization complete', verbose);\n return Core._coreServices;\n }\n\n /**\n * Get initialized domain service keys\n * Use Core.getService(key) or ServiceRegistry.get(key) to access individual services.\n *\n * @example\n * ```typescript\n * const keys = Core.serviceKeys;\n * const exampleService = Core.getService('example');\n * ```\n */\n static get serviceKeys(): string[] {\n return ServiceRegistry.getInitializedKeys();\n }\n\n /**\n * All stores - unified access to ALL slices from single root store\n * All stores (global + domain) are slices of ONE Zustand store instance.\n *\n * **Auto-generated from STORE_KEYS** - No manual registration needed!\n *\n * **Benefits:**\n * - ✅ Access without hooks (store.getState())\n * - ✅ Cross-slice subscriptions work automatically\n * - ✅ Single source of truth\n * - ✅ Automatically scales with new stores\n *\n * @example\n * const errorStore = Core.stores.error; // Global slice\n * const flagsStore = Core.stores.featureFlags; // Global slice\n * const exampleStore = Core.stores.example; // Domain slice\n */\n static get stores(): Record<StoreKey, RootStoreSlice | undefined> {\n const rootState = Core._rootStore?.getState();\n\n // Dynamically generate store accessors from STORE_KEYS\n return Object.values(STORE_KEYS).reduce(\n (acc, key) => {\n Object.defineProperty(acc, key, {\n get: () => rootState,\n enumerable: true,\n });\n return acc;\n },\n {} as Record<StoreKey, RootStoreSlice | undefined>\n );\n }\n\n /**\n * Get a specific store slice by key (for ServiceRegistry injection).\n * Returns the actual slice from the namespaced root store.\n *\n * @param key - Store key (type-safe: 'example' | 'errors' | 'featureFlags')\n * @returns Specific store slice or undefined\n *\n * @example\n * ```typescript\n * const exampleSlice = Core.getDomainStore('example'); // ✅ Returns ExampleFrontendStoreSlice\n * const errorSlice = Core.getDomainStore('errors'); // ✅ Returns ErrorStoreSlice\n * const invalid = Core.getDomainStore('invalid'); // ❌ TypeScript error!\n * ```\n */\n static getDomainStore<K extends keyof RootStoreSlice>(key: K): RootStoreSlice[K] | undefined;\n static getDomainStore<T = RootStoreSlice>(): T | undefined;\n static getDomainStore<K extends keyof RootStoreSlice>(\n key?: K\n ): RootStoreSlice[K] | RootStoreSlice | undefined {\n const rootState = Core._rootStore?.getState();\n if (!rootState) return undefined;\n\n // If no key provided, return entire root store\n if (!key) return rootState;\n\n // Return specific slice from namespaced store (type-safe)\n return rootState[key];\n }\n\n /**\n * Event manager for subscribing to domain events\n * @example Core.events.on('example:created', handler)\n */\n static get events(): typeof CoreEventManager {\n return CoreEventManager;\n }\n\n /**\n * Get database service instance\n * @throws Error if not initialized\n */\n static get db(): CoreDbServiceInstance {\n if (!Core._coreServices.db) {\n throw new CorePackageError(\n 'Database service not initialized. Call Core.initialize() first.',\n ERROR_CODES.CLIENT_INITIALIZATION_FAILED\n );\n }\n return Core._coreServices.db;\n }\n\n /**\n * Get API client service\n */\n static get api(): typeof ApiClientService {\n if (!Core._coreServices.api) {\n throw new CorePackageError(\n 'API client service not initialized. Call Core.initialize() first.',\n ERROR_CODES.CLIENT_INITIALIZATION_FAILED\n );\n }\n return Core._coreServices.api;\n }\n\n /**\n * Get cache service instance (backend-only)\n * @throws Error if not initialized\n */\n static get cache(): CoreCacheServiceInstance {\n if (!Core._coreServices.cache) {\n throw new CorePackageError(\n 'Cache service not initialized. Call Core.initialize() with cache config first.',\n ERROR_CODES.CLIENT_INITIALIZATION_FAILED\n );\n }\n return Core._coreServices.cache;\n }\n\n /**\n * Get observability adapter instance\n * @throws Error if not initialized\n *\n * @example\n * ```typescript\n * // Record a metric\n * await Core.observability.recordMetric({\n * type: 'counter',\n * name: 'api.requests',\n * value: 1,\n * tags: { endpoint: '/users' },\n * });\n *\n * // Start a span\n * const span = Core.observability.startSpan({ name: 'processOrder' });\n * try {\n * // ... do work\n * span.setStatus('ok');\n * } catch (e) {\n * span.recordException(e);\n * span.setStatus('error');\n * } finally {\n * span.end();\n * }\n * ```\n */\n static get observability(): ObservabilityAdapter {\n if (!Core._coreServices.observability) {\n throw new CorePackageError(\n 'Observability service not initialized. Call Core.initialize() first.',\n ERROR_CODES.CLIENT_INITIALIZATION_FAILED\n );\n }\n return Core._coreServices.observability;\n }\n\n /**\n * Check if observability is initialized\n */\n static get isObservabilityInitialized(): boolean {\n return Core._coreServices.observability !== null;\n }\n\n /**\n * Get observability configuration\n */\n static get observabilityConfig(): CoreObservabilityConfig {\n return Core._observabilityConfig;\n }\n\n /**\n * Get storage service instance (backend-only)\n * @throws Error if not initialized\n *\n * @example\n * ```typescript\n * const storage = Core.storage.getStorage();\n * await storage.uploadFile({ file, filename: 'doc.pdf' });\n * ```\n */\n static get storage(): CoreStorageServiceInstance {\n if (!Core._coreServices.storage) {\n throw new CorePackageError(\n 'Storage service not initialized. Call Core.initialize() with storage config first.',\n ERROR_CODES.CLIENT_INITIALIZATION_FAILED\n );\n }\n return Core._coreServices.storage;\n }\n\n /**\n * Check if storage is initialized\n */\n static get isStorageInitialized(): boolean {\n return Core._coreServices.storage !== null;\n }\n\n /**\n * Get notifications service instance (backend-only)\n * @throws Error if not initialized\n *\n * @example\n * ```typescript\n * const notifications = Core.notifications.getNotifications();\n * await notifications.sendEmail({ to: 'user@example.com', templateId: 'welcome' });\n * ```\n */\n static get notifications(): CoreNotificationServiceInstance {\n if (!Core._coreServices.notifications) {\n throw new CorePackageError(\n 'Notifications service not initialized. Call Core.initialize() with notifications config first.',\n ERROR_CODES.CLIENT_INITIALIZATION_FAILED\n );\n }\n return Core._coreServices.notifications;\n }\n\n /**\n * Check if notifications is initialized\n */\n static get isNotificationsInitialized(): boolean {\n return Core._coreServices.notifications !== null;\n }\n\n /**\n * Get root store (contains all slices: errors, feature flags, etc.)\n * Use this to access the full store state and all slice actions globally.\n *\n * @example\n * ```typescript\n * // Access error actions\n * const state = Core.rootStore.getState();\n * state.addError({ ... });\n *\n * // Access flags\n * console.log(state.flags);\n *\n * // Subscribe to store changes\n * Core.rootStore.subscribe((state) => {\n * console.log('Errors:', state.errors);\n * console.log('Flags:', state.flags);\n * });\n * ```\n */\n static get rootStore(): StoreApi<RootStoreSlice> {\n if (!Core._rootStore) {\n throw new CorePackageError(\n 'Root store not initialized. Call Core.initialize() first.',\n ERROR_CODES.CLIENT_INITIALIZATION_FAILED\n );\n }\n return Core._rootStore;\n }\n\n /**\n * Get global error store actions.\n * Provides access to the error store for querying and managing errors.\n *\n * @example\n * ```typescript\n * // Get all errors\n * const allErrors = useErrorStore.getState().errors;\n *\n * // Clear all errors\n * Core.errors.clearErrors();\n *\n * // Dismiss an error\n * Core.errors.dismissError(errorId);\n * ```\n */\n static get errors(): ErrorStoreActions {\n if (!Core._errorHandler) {\n throw new CorePackageError(\n 'Error handler not initialized. Call Core.initialize() first or set errorHandler.enabled: true.',\n ERROR_CODES.CLIENT_INITIALIZATION_FAILED\n );\n }\n return Core._errorHandler.getStore();\n }\n\n /**\n * Get feature flags store\n * Provides synchronous access to feature flag values from the store.\n *\n * @example\n * ```typescript\n * // Check if a flag is enabled\n * const isEnabled = Core.flags.isEnabled('NEW_FEATURE');\n *\n * // Get a flag value\n * const provider = Core.flags.getValue<string>('PAYMENT_PROVIDER');\n *\n * // Refresh flags from source\n * await Core.flags.refresh();\n * ```\n */\n static get flags(): FeatureFlagStoreSlice {\n if (!Core._rootStore) {\n throw new CorePackageError(\n 'Root store not initialized. Call Core.initialize() first.',\n ERROR_CODES.CLIENT_INITIALIZATION_FAILED\n );\n }\n // Return the feature flag slice from root store\n // Root store state includes all flag methods (isEnabled, getValue, refresh, etc.)\n return Core._rootStore.getState() as unknown as FeatureFlagStoreSlice;\n }\n\n /**\n * Check if error handler is initialized\n */\n static get isErrorHandlerInitialized(): boolean {\n return Core._errorHandler !== null;\n }\n\n /**\n * Get the HTTP error handler/middleware based on runtime.\n * Returns different types based on detected runtime:\n *\n * - **Express**: Error handler middleware function\n * ```typescript\n * app.use(Core.httpErrorHandler);\n * ```\n *\n * - **NestJS**: Exception filter class\n * ```typescript\n * app.useGlobalFilters(new (Core.httpErrorHandler)());\n * ```\n *\n * - **Next.js**: Object with App Router and Pages Router handlers\n * ```typescript\n * // App Router\n * export const GET = Core.httpErrorHandler.withErrorHandler(handler);\n * // Pages Router\n * export default Core.httpErrorHandler.createNextApiErrorHandler()(handler);\n * ```\n *\n * - **Node.js/Bun/Deno**: Object with handleError and createMiddleware\n * ```typescript\n * Core.httpErrorHandler.handleError(error, req, res);\n * ```\n *\n * - **Browser**: null (no HTTP handler needed)\n *\n * @returns The HTTP error handler for the current runtime\n */\n static get httpErrorHandler(): unknown {\n return Core._httpErrorHandler;\n }\n\n /**\n * Check if feature flags are initialized\n */\n static get isFlagsInitialized(): boolean {\n return Core._rootStore?.getState()?.featureFlags?.isInitialized ?? false;\n }\n\n /**\n * Get error handler configuration\n */\n static get errorConfig(): CoreErrorHandlerInitConfig {\n return Core._errorConfig;\n }\n\n /**\n * Get feature flag configuration\n */\n static get flagConfig(): CoreFeatureFlagInitConfig {\n return Core._flagConfig;\n }\n\n /**\n * Get loaded environment variables\n */\n static get env(): CoreEnvVars {\n return Core._coreServices.env;\n }\n\n /**\n * Get detected runtime environment\n */\n static get runtime(): CoreRuntimeEnvironment {\n return Core._coreServices.runtime;\n }\n\n /**\n * Get current app context\n */\n static get appContext(): CoreAppContext {\n return Core._coreServices.appContext;\n }\n\n /**\n * Check if Core is initialized\n */\n static get isInitialized(): boolean {\n return Core.initialized;\n }\n\n /**\n * Check if running on a backend runtime\n */\n static get isBackend(): boolean {\n return BACKEND_RUNTIMES.includes(Core._coreServices.runtime);\n }\n\n /**\n * Check if running on a frontend runtime\n */\n static get isFrontend(): boolean {\n return FRONTEND_RUNTIMES.includes(Core._coreServices.runtime);\n }\n\n /**\n * Get runtime context (backend, frontend, or universal)\n * Universal means the runtime can be either (SSR frameworks like Next.js, Nuxt, Edge)\n */\n static getRuntimeContext(): CoreRuntimeContext {\n if (BACKEND_RUNTIMES.includes(Core._coreServices.runtime)) {\n return 'backend';\n }\n if (FRONTEND_RUNTIMES.includes(Core._coreServices.runtime)) {\n return 'frontend';\n }\n return 'universal';\n }\n\n /**\n * Assert that the current runtime matches the expected runtime(s)\n * Throws an error if the runtime doesn't match\n *\n * @param expected - Expected runtime(s) to check against\n * @param serviceName - Name of the service for error message\n * @throws CorePackageError if runtime doesn't match\n *\n * @example\n * ```typescript\n * // Assert backend-only\n * Core.assertRuntime('backend', 'DatabaseService');\n *\n * // Assert multiple runtimes\n * Core.assertRuntime(['backend', 'universal'], 'CacheService');\n * ```\n */\n static assertRuntime(\n expected: CoreServiceRuntime | readonly CoreServiceRuntime[],\n serviceName: string\n ): void {\n const runtimes = Array.isArray(expected) ? expected : [expected];\n const currentContext = Core.getRuntimeContext();\n\n // Check if current context matches any of the expected runtimes\n const isAllowed = runtimes.some(runtime => {\n if (runtime === 'universal') return true;\n if (runtime === currentContext) return true;\n // Universal context (SSR) can run both frontend and backend code\n if (currentContext === 'universal') return true;\n return false;\n });\n\n if (!isAllowed) {\n throw new CorePackageError(\n `${serviceName} cannot run in ${currentContext} runtime. ` +\n `Allowed runtimes: ${runtimes.join(', ')}. ` +\n `Current runtime: ${Core._coreServices.runtime}`,\n ERROR_CODES.FEATURE_NOT_SUPPORTED\n );\n }\n }\n\n /**\n * Check if a service runtime is compatible with current runtime\n * Returns true/false instead of throwing\n *\n * @param expected - Expected runtime(s) to check against\n */\n static isRuntimeCompatible(\n expected: CoreServiceRuntime | readonly CoreServiceRuntime[]\n ): boolean {\n const runtimes = Array.isArray(expected) ? expected : [expected];\n const currentContext = Core.getRuntimeContext();\n\n return runtimes.some(runtime => {\n if (runtime === 'universal') return true;\n if (runtime === currentContext) return true;\n if (currentContext === 'universal') return true;\n return false;\n });\n }\n\n /**\n * Get a registered domain service by key.\n * Convenience method that wraps ServiceRegistry.get().\n *\n * @param key - Service key (e.g., 'featureFlags', 'example')\n * @returns The service instance\n *\n * @example\n * ```typescript\n * const flags = Core.getService<FeatureFlagDomainService>('featureFlags');\n * const isEnabled = await flags.isEnabled('my-flag');\n * ```\n */\n static getService<T extends CoreDomainServiceInstance = CoreDomainServiceInstance>(\n key: string\n ): T {\n return ServiceRegistry.get<T>(key);\n }\n\n /**\n * Get a registered domain service by key with async initialization if needed.\n * Convenience method that wraps ServiceRegistry.getAsync().\n *\n * @param key - Service key\n * @returns Promise resolving to the service instance\n */\n static async getServiceAsync<T extends CoreDomainServiceInstance = CoreDomainServiceInstance>(\n key: string\n ): Promise<T> {\n return ServiceRegistry.getAsync<T>(key);\n }\n\n /**\n * Check if a domain service is registered.\n */\n static hasService(key: string): boolean {\n return ServiceRegistry.has(key);\n }\n\n /**\n * Reset Core (useful for testing)\n */\n // eslint-disable-next-line complexity\n static async reset(): Promise<void> {\n // Close database\n if (Core._coreServices.db) {\n await Core._coreServices.db.getDatabase()?.close?.();\n }\n\n // Dispose cache\n if (Core._coreServices.cache) {\n const CacheService = getCoreDependency('CacheService');\n CacheService?.reset?.();\n }\n\n // Dispose observability\n if (Core._coreServices.observability) {\n await Core._coreServices.observability.shutdown();\n }\n Core._observabilityConfig = {};\n\n // Dispose storage\n if (Core._coreServices.storage) {\n await Core._coreServices.storage.close();\n const StorageService = getCoreDependency('StorageService');\n await StorageService?.reset?.();\n }\n\n // Dispose notifications\n if (Core._coreServices.notifications) {\n await Core._coreServices.notifications.close();\n const NotificationService = getCoreDependency('NotificationService');\n await NotificationService?.reset?.();\n }\n\n // Dispose error handler\n if (Core._errorHandler) {\n Core._errorHandler.destroy();\n Core._errorHandler = null;\n clearEventEmitter(); // Clean up CoreEventManager integration\n }\n Core._errorConfig = {};\n Core._httpErrorHandler = null;\n\n // Cleanup event listeners\n for (const cleanup of Core._eventCleanupFns) {\n cleanup();\n }\n Core._eventCleanupFns = [];\n\n // Dispose feature flags slice from root store\n if (Core._rootStore) {\n const state = Core._rootStore.getState();\n if (state.featureFlags?.dispose) {\n state.featureFlags.dispose();\n }\n Core._rootStore = null;\n }\n Core._flagConfig = {};\n\n // Dispose all registered services via ServiceRegistry\n ServiceRegistry.disposeAll();\n\n // Dispose event manager\n CoreEventManager.dispose();\n\n Core._coreServices = {\n db: null,\n api: null,\n cache: null,\n observability: null,\n storage: null,\n notifications: null,\n env: {},\n runtime: 'unknown',\n appContext: 'webapp',\n };\n Core.initialized = false;\n }\n\n /**\n * Determines whether to skip DbService initialization.\n *\n * DbService is backend-only and should never be initialized on frontend runtimes.\n * This method:\n * - Returns true (skip) if skipDb was explicitly set to true\n * - Returns true (skip) if running on frontend, with a warning\n * - Warns if someone explicitly tried to init DbService on frontend (skipDb: false)\n *\n * @param skipDb - User-provided skipDb option\n * @param verbose - Enable verbose logging\n * @returns true if DbService should be skipped\n */\n private static shouldSkipDbService(skipDb: boolean | undefined, verbose?: boolean): boolean {\n // User explicitly requested to skip\n if (skipDb === true) {\n Core.log('Database service skipped (skipDb: true)', verbose);\n return true;\n }\n\n // Check if running on frontend\n const isFrontend = Core.isFrontend;\n\n if (isFrontend) {\n // User explicitly tried to init DbService on frontend (skipDb: false)\n if (skipDb === false) {\n Core.logger.warn(\n 'DbService cannot be initialized on frontend runtime. ' +\n 'DbService is backend-only and requires Node.js. ' +\n 'Use API calls from frontend instead. Skipping database initialization.'\n );\n } else if (verbose) {\n // skipDb was undefined (default) - just log that we're skipping\n Core.log(\n 'Database service skipped (frontend runtime detected). ' +\n 'DbService is only available on backend.',\n verbose\n );\n }\n return true;\n }\n\n // Backend or universal runtime - don't skip\n return false;\n }\n\n /**\n * Initialize database service\n * Config validation is handled by DbService\n */\n private static async initializeDb(\n config?: Partial<CoreDbServiceConfig>,\n verbose?: boolean\n ): Promise<CoreDbServiceInstance> {\n Core.log(`Initializing database with adapter: ${config?.adapter ?? 'drizzle'}`, verbose);\n\n const DbService = getCoreDependency('DbService');\n if (!DbService) {\n throw new CorePackageError(\n 'DbService not available. Ensure setCoreDependencies() was called in entry-backend.ts',\n ERROR_CODES.CLIENT_INITIALIZATION_FAILED\n );\n }\n return DbService.initialize({\n adapter: 'drizzle',\n ...config,\n } as CoreDbServiceConfig);\n }\n\n /**\n * Initialize API client service\n * Config validation is handled by ApiClientService\n */\n private static async initializeApi(\n config?: CoreApiInitOptions,\n globalEnvironment?: CoreAppEnvironment,\n verbose?: boolean\n ): Promise<void> {\n const { env: apiEnv, setAsDefault, ...apiClientOptions } = config ?? {};\n const resolvedEnv = apiEnv ?? globalEnvironment ?? 'development';\n\n Core.log(`Initializing API client for environment: ${resolvedEnv}`, verbose);\n\n await ApiClientService.init(\n {\n env: resolvedEnv,\n setAsDefault: setAsDefault ?? true,\n },\n apiClientOptions\n );\n }\n\n /**\n * Initialize cache service (backend-only)\n * Config validation is handled by CacheService\n */\n private static async initializeCache(config: CoreCacheConfig, verbose?: boolean): Promise<void> {\n Core.log(`Initializing cache with strategy: ${config.strategy}`, verbose);\n\n const CacheService = getCoreDependency('CacheService');\n if (!CacheService) {\n throw new CorePackageError(\n 'CacheService not available. Ensure setCoreDependencies() was called in entry-backend.ts',\n ERROR_CODES.CLIENT_INITIALIZATION_FAILED\n );\n }\n await CacheService.initialize(config);\n }\n\n /**\n * Initialize observability service based on config.\n * Always includes LoggerAdapter as failover for console output.\n */\n private static async initializeObservability(\n config: CoreObservabilityConfig,\n verbose?: boolean,\n environment?: CoreAppEnvironment\n ): Promise<void> {\n Core.log(`Initializing observability with provider: ${config.provider ?? 'auto'}`, verbose);\n\n // Use environment from config or passed parameter\n const env = config.environment ?? environment ?? 'development';\n Core._observabilityConfig = { ...config, environment: env };\n\n // Collect adapters with priorities\n const adapters: { adapter: ObservabilityAdapter; priority: number; failover?: boolean }[] = [];\n\n // Always add LoggerAdapter as failover for console output\n const loggerAdapter = new LoggerAdapter();\n await loggerAdapter.initialize({\n enabled: config.enabled !== false,\n serviceName: config.serviceName,\n environment: env,\n defaultTags: config.defaultTags,\n });\n adapters.push({ adapter: loggerAdapter, priority: -100, failover: true });\n\n // TODO: Add DatadogAdapter when configured (high priority, primary)\n // if (config.provider === 'datadog' || config.datadog) {\n // const datadogAdapter = new DatadogAdapter();\n // await datadogAdapter.initialize({\n // ...config,\n // ...config.datadog,\n // environment: env,\n // });\n // adapters.push({ adapter: datadogAdapter, priority: 100, failover: false });\n // }\n\n // Create ObservabilityService with all adapters\n const observability = new ObservabilityService();\n await observability.initialize({\n mode: config.mode ?? 'parallel',\n adapters,\n enabled: config.enabled,\n serviceName: config.serviceName,\n environment: env,\n defaultTags: config.defaultTags,\n samplingRate: config.samplingRate,\n flushInterval: config.flushInterval,\n adapterTimeout: config.flushInterval,\n });\n\n Core.log(\n `ObservabilityService initialized with ${adapters.length} adapters (env: ${env})`,\n verbose\n );\n\n Core._coreServices.observability = observability;\n // Set on ServiceRegistry for injection\n ServiceRegistry.setObservabilityInstance(observability);\n }\n\n /**\n * Initialize global error handler\n */\n /** Create and initialize root store (includes error store + all other slices) */\n private static async initializeRootStore(\n config?: CoreErrorHandlerInitConfig,\n verbose?: boolean\n ): Promise<void> {\n const isFrontend = typeof window !== 'undefined';\n\n if (isFrontend) {\n Core.log('Using frontend root store (Zustand)', verbose);\n // Frontend: use the React hook store's vanilla store API\n Core._rootStore = useRootStore as unknown as StoreApi<RootStoreSlice>;\n } else {\n Core.log('Creating backend composite store (in-memory)', verbose);\n const ServerErrorMiddleware = getCoreDependency('ServerErrorMiddleware');\n if (!ServerErrorMiddleware) {\n throw new CorePackageError(\n 'ServerErrorMiddleware not available. Ensure setCoreDependencies() was called in entry-backend.ts',\n ERROR_CODES.CLIENT_INITIALIZATION_FAILED\n );\n }\n\n // Backend: create in-memory error store + feature flag store (NOT Zustand)\n const backendErrorStore = ServerErrorMiddleware.createErrorStore({\n maxErrors: config?.maxErrors ?? DEFAULT_MAX_ERRORS,\n onErrorAdded: config?.onError as ((error: unknown) => void) | undefined,\n });\n\n // Create standalone feature flag store for backend\n const backendFlagStore = createStandaloneFeatureFlagStore();\n\n // Combine error + feature flag stores to match RootStoreSlice interface\n const compositeStore = {\n // Error store methods\n ...backendErrorStore,\n // Feature flag store methods\n ...backendFlagStore,\n };\n\n // Wrap backend composite store to match root store interface (getState() pattern)\n Core._rootStore = {\n getState: () => compositeStore,\n subscribe: () => () => {}, // No-op for backend\n destroy: () => {\n backendErrorStore.reset();\n backendFlagStore.dispose?.();\n },\n } as unknown as StoreApi<RootStoreSlice>;\n }\n }\n\n /** Get error store actions from root store */\n private static getErrorStoreActions(): ErrorStoreActions {\n if (!Core._rootStore) {\n throw new CorePackageError(\n 'Root store not initialized. Call Core.initialize() first.',\n ERROR_CODES.CLIENT_INITIALIZATION_FAILED\n );\n }\n return Core._rootStore.getState().errors;\n }\n\n /** Build global error handler config */\n // eslint-disable-next-line complexity\n private static buildErrorHandlerConfig(\n config?: CoreErrorHandlerInitConfig\n ): Parameters<typeof initializeGlobalErrorHandler>[1] {\n return {\n source: config?.source ?? 'global',\n maxErrors: config?.maxErrors ?? DEFAULT_MAX_ERRORS,\n filter: config?.filter,\n onError: config?.onError,\n logToConsole: config?.logToConsole ?? false,\n };\n }\n\n // eslint-disable-next-line complexity\n private static async initializeErrorHandler(\n config?: CoreErrorHandlerInitConfig,\n verbose?: boolean\n ): Promise<void> {\n if (config?.enabled === false) {\n Core.log('Error handler disabled by configuration', verbose);\n return;\n }\n\n Core._errorConfig = config ?? {};\n Core.log('Initializing global error handler...', verbose);\n\n // Initialize error system (translations, catalogs)\n // This is safe to call multiple times - it checks if already initialized\n initializeErrorSystem({\n defaultLocale: Core._errorConfig.localization?.defaultLocale,\n fallbackLocale: Core._errorConfig.localization?.fallbackLocale,\n additionalCatalogs: Core._errorConfig.localization?.additionalCatalogs,\n replaceBuiltIn: Core._errorConfig.localization?.replaceBuiltIn,\n });\n\n // Initialize root store (contains error store + all slices)\n await Core.initializeRootStore(Core._errorConfig, verbose);\n\n // Wire up CoreEventManager for automatic error event emission\n // This allows errors captured by the global handler to emit events\n setEventEmitter(CoreEventManager.emit.bind(CoreEventManager));\n\n const errorStore = Core.getErrorStoreActions();\n Core._errorHandler = initializeGlobalErrorHandler(\n errorStore,\n Core.buildErrorHandlerConfig(Core._errorConfig)\n );\n\n // Subscribe to SYSTEM.ERROR events from ApiClientService and other sources\n // Core handles updating the appropriate store based on runtime context\n const errorEventCleanup = CoreEventManager.on(\n CORE_EVENTS.SYSTEM.ERROR,\n (event: CoreEvent<CoreSystemErrorPayload>) => {\n if (!Core._rootStore) return;\n\n try {\n const { errors } = event.data;\n if (errors && errors.length > 0) {\n // Update the appropriate store based on runtime\n // Frontend: Zustand store, Backend: In-memory store (both via root store)\n Core._rootStore.getState().errors.addErrors(errors);\n Core.log(`Added ${errors.length} error(s) to store`, verbose);\n }\n } catch (e) {\n Core.logger.error('Failed to handle error event', { error: e });\n }\n }\n );\n\n // Store cleanup function\n Core._eventCleanupFns.push(errorEventCleanup);\n\n Core.log('Global error handler initialized with CoreEventManager integration', verbose);\n\n // Auto-create HTTP error handler based on runtime (unless disabled)\n if (Core._errorConfig.httpHandler !== false) {\n await Core.createHttpErrorHandler(Core._errorConfig, verbose);\n }\n }\n\n /**\n * Create HTTP error handler based on detected runtime.\n * Stores the handler in Core._httpErrorHandler for access via Core.httpErrorHandler\n */\n // eslint-disable-next-line complexity\n private static async createHttpErrorHandler(\n config?: CoreErrorHandlerInitConfig,\n verbose?: boolean\n ): Promise<void> {\n const runtime = Core._coreServices.runtime;\n const isProduction = Core._coreServices.env.NODE_ENV === 'production';\n\n // Skip for browser runtime (no HTTP error handler needed)\n if (runtime === 'browser') {\n Core._httpErrorHandler = null;\n Core.log('Skipping HTTP handler for browser runtime', verbose);\n return;\n }\n\n const ServerErrorMiddleware = getCoreDependency('ServerErrorMiddleware');\n if (!ServerErrorMiddleware) {\n Core.log('Skipping HTTP handler (ServerErrorMiddleware not registered)', verbose);\n return;\n }\n\n // Build common config for all HTTP handlers\n const httpConfig = {\n source: runtime,\n includeStack: config?.includeStack ?? !isProduction,\n logErrors: config?.logger ?? config?.logToConsole ?? true,\n errorHandler: Core._errorHandler ?? undefined,\n };\n\n switch (runtime) {\n case 'express':\n Core._httpErrorHandler = ServerErrorMiddleware.createHttpErrorHandler(httpConfig);\n Core.log('Created Express error handler middleware', verbose);\n break;\n\n case 'nestjs':\n Core._httpErrorHandler = ServerErrorMiddleware.createNestJsExceptionFilter(httpConfig);\n Core.log('Created NestJS exception filter', verbose);\n break;\n\n case 'nextjs':\n // For Next.js, provide both App Router and Pages Router handlers\n Core._httpErrorHandler = {\n /** For App Router: export const GET = withErrorHandler(handler) */\n withErrorHandler: <T>(handler: T, overrideConfig = {}) =>\n ServerErrorMiddleware.withErrorHandler(\n handler as Parameters<typeof ServerErrorMiddleware.withErrorHandler>[0],\n { ...httpConfig, ...overrideConfig }\n ),\n /** For Pages Router: export default createNextApiErrorHandler()(handler) */\n createNextApiErrorHandler: (overrideConfig = {}) =>\n ServerErrorMiddleware.createNextApiErrorHandler({ ...httpConfig, ...overrideConfig }),\n };\n Core.log('Created Next.js error handlers', verbose);\n break;\n\n case 'node':\n case 'bun':\n case 'deno':\n // Generic Node.js handler\n Core._httpErrorHandler = {\n /** Handle error: handleNodeError(error, req, res) */\n handleError: (error: unknown, req: unknown, res: unknown) =>\n ServerErrorMiddleware.handleNodeError(\n error,\n req as Parameters<typeof ServerErrorMiddleware.handleNodeError>[1],\n // eslint-disable-next-line no-magic-numbers -- Type parameter index for handleNodeError\n res as Parameters<typeof ServerErrorMiddleware.handleNodeError>[2],\n httpConfig\n ),\n /** Create middleware for use with native http */\n createMiddleware: () => ServerErrorMiddleware.createHttpErrorHandler(httpConfig),\n };\n Core.log(`Created ${runtime} error handler`, verbose);\n break;\n\n default:\n // For unknown runtimes, provide generic handler\n Core._httpErrorHandler = ServerErrorMiddleware.createHttpErrorHandler(httpConfig);\n Core.log(`Created generic HTTP error handler for ${runtime}`, verbose);\n }\n }\n\n /**\n * Subscribe to CoreEventManager error events\n * Forwards system, entity, API, validation, database, and auth errors to the global error handler.\n *\n * Note: Database errors (DATABASE.ERROR) are only subscribed on backend runtimes since\n * DbService is backend-only (skipDb: true on frontend).\n */\n private static subscribeToErrorEvents(verbose?: boolean): void {\n if (!Core._errorHandler) {\n return;\n }\n\n Core.log('Subscribing to error events...', verbose);\n\n // Subscribe to system errors (universal)\n const cleanupSystemError = CoreEventManager.on(CORE_EVENTS.SYSTEM.ERROR, event => {\n if (Core._errorHandler && event.data?.errors?.length) {\n // Capture each error in the array\n for (const err of event.data.errors) {\n Core._errorHandler.captureError(err, 'system');\n }\n }\n });\n\n // Subscribe to entity errors (universal)\n const cleanupEntityError = CoreEventManager.on(CORE_EVENTS.ENTITY.ERROR, event => {\n if (Core._errorHandler && event.data) {\n Core._errorHandler.captureError(event.data.error, 'entity');\n }\n });\n\n // Subscribe to API errors (universal)\n const cleanupApiError = CoreEventManager.on(CORE_EVENTS.API.REQUEST_ERROR, event => {\n if (Core._errorHandler && event.data) {\n Core._errorHandler.captureError(event.data.error, 'api');\n }\n });\n\n // Subscribe to validation errors (universal)\n const cleanupValidationError = CoreEventManager.on(CORE_EVENTS.VALIDATION.FAILED, event => {\n if (Core._errorHandler && event.data) {\n Core._errorHandler.captureError(event.data.error, 'validation');\n }\n });\n\n // Subscribe to auth errors (universal - can happen on both frontend and backend)\n const cleanupAuthUnauthorized = CoreEventManager.on(CORE_EVENTS.AUTH.UNAUTHORIZED, event => {\n if (Core._errorHandler && event.data?.error) {\n Core._errorHandler.captureError(event.data.error, 'auth');\n }\n });\n\n const cleanupAuthSessionExpired = CoreEventManager.on(\n CORE_EVENTS.AUTH.SESSION_EXPIRED,\n event => {\n if (Core._errorHandler && event.data?.error) {\n Core._errorHandler.captureError(event.data.error, 'auth');\n }\n }\n );\n\n // Store universal cleanup functions\n Core._eventCleanupFns.push(\n cleanupSystemError,\n cleanupEntityError,\n cleanupApiError,\n cleanupValidationError,\n cleanupAuthUnauthorized,\n cleanupAuthSessionExpired\n );\n\n // Subscribe to database errors (backend-only)\n // Database events only fire when DbService is initialized (skipDb: false)\n if (Core.isRuntimeCompatible('backend')) {\n const cleanupDatabaseError = CoreEventManager.on(CORE_EVENTS.DATABASE.ERROR, event => {\n if (Core._errorHandler && event.data) {\n Core._errorHandler.captureError(event.data.error, 'database');\n }\n });\n Core._eventCleanupFns.push(cleanupDatabaseError);\n\n // Subscribe to storage errors (backend-only)\n const cleanupStorageError = CoreEventManager.on(CORE_EVENTS.STORAGE.ERROR, event => {\n if (Core._errorHandler && event.data) {\n Core._errorHandler.captureError(event.data.error, 'storage');\n }\n });\n Core._eventCleanupFns.push(cleanupStorageError);\n\n // Subscribe to notification errors (backend-only)\n const cleanupNotificationError = CoreEventManager.on(\n CORE_EVENTS.NOTIFICATION.ERROR,\n event => {\n if (Core._errorHandler && event.data) {\n Core._errorHandler.captureError(event.data.error, 'notification');\n }\n }\n );\n Core._eventCleanupFns.push(cleanupNotificationError);\n\n Core.log('Subscribed to backend error events (database, storage, notification)', verbose);\n }\n\n const eventTypes = ['system', 'entity', 'api', 'validation', 'auth'];\n if (Core.isRuntimeCompatible('backend')) {\n eventTypes.push('database', 'storage', 'notification');\n }\n Core.log(`Subscribed to error events: ${eventTypes.join(', ')}`, verbose);\n }\n\n /** Handle fetch flags error and return empty flags */\n private static handleFetchFlagsError(\n error: unknown,\n config?: CoreFeatureFlagInitConfig,\n verbose?: boolean\n ): Record<string, FeatureFlagValue> {\n if (verbose) Core.logger.error('Failed to fetch feature flags', { error });\n\n // If already a package error, use as-is; otherwise wrap it\n const packageError =\n error instanceof BaseError\n ? (error as CorePackageError)\n : new CorePackageError(\n error instanceof Error ? error.message : String(error),\n ERROR_CODES.CORE_FEATURE_FLAG_PROVIDER_ERROR,\n { cause: error instanceof Error ? error : undefined }\n );\n config?.onError?.(packageError);\n return {};\n }\n\n /** Create fetch flags function */\n private static createFetchFlagsFn(\n config?: CoreFeatureFlagInitConfig,\n verbose?: boolean\n ): () => Promise<Record<string, FeatureFlagValue>> {\n // eslint-disable-next-line complexity\n return async () => {\n try {\n const client = ApiClientService.getClient();\n const endpoint = config?.apiEndpoint ?? '/feature-flags';\n const response = await client.get<{ flags: Record<string, FeatureFlagValue> }>(endpoint);\n\n if (!response.isSuccess) {\n throw new CorePackageError(\n response.error?.message ?? 'Failed to fetch feature flags',\n ERROR_CODES.CORE_FEATURE_FLAG_PROVIDER_ERROR\n );\n }\n\n return response.data?.flags ?? {};\n } catch (error) {\n return Core.handleFetchFlagsError(error, config, verbose);\n }\n };\n }\n\n /**\n * Initialize feature flags slice within root store\n */\n\n private static async initializeFeatureFlags(\n config?: CoreFeatureFlagInitConfig,\n verbose?: boolean\n ): Promise<void> {\n if (config?.enabled === false) {\n Core.log('Feature flags disabled by configuration', verbose);\n return;\n }\n\n if (!Core._rootStore) {\n throw new CorePackageError(\n 'Root store not initialized. Call Core.initializeErrorHandler() first.',\n ERROR_CODES.CLIENT_INITIALIZATION_FAILED\n );\n }\n\n Core._flagConfig = config ?? {};\n Core.log('Initializing feature flags from root store...', verbose);\n\n // Initialize the feature flag slice within the root store\n const state = Core._rootStore.getState();\n await state.featureFlags.initialize({\n defaults: Core._flagConfig.defaults,\n polling: Core._flagConfig.polling,\n fetchFn: Core.createFetchFlagsFn(Core._flagConfig, verbose),\n onFlagChange: Core._flagConfig.onFlagChange,\n onError: Core._flagConfig.onError,\n });\n\n Core.log('Feature flags initialized', verbose);\n }\n}\n\n// Export for convenience (excluding server-only services - use backend entry for those)\n// Note: CacheService and DEFAULT_ENCRYPTION_FIELDS are only exported from entry-backend.ts\nexport { ApiClientService };\n","/**\n * Base Domain Service\n *\n * Abstract base class for all domain services in @plyaz/core.\n * Follows the same pattern as BaseAdapter in @plyaz/notifications.\n *\n * Provides:\n * - API client initialization via constructor config\n * - Automatic mapper/validator instantiation\n * - Service enabled/disabled state management\n * - Default values handling\n * - Runtime context detection\n * - Lazy logger initialization\n *\n * Subclasses must implement:\n * - isAvailable() - Check if service is configured and ready\n * - dispose() - Cleanup resources\n *\n * @example\n * ```typescript\n * interface MyServiceConfig extends BaseDomainServiceConfig {\n * apiBasePath?: string;\n * }\n *\n * class MyDomainService extends BaseDomainService<\n * MyServiceConfig,\n * MyMapper,\n * MyValidator\n * > {\n * constructor(config: MyServiceConfig) {\n * super({\n * serviceName: 'MyDomainService',\n * supportedRuntimes: ['universal'],\n * serviceConfig: config,\n * apiClientConfig: {\n * baseURL: config.apiBasePath ?? '/api',\n * },\n * MapperClass: MyMapperClass,\n * ValidatorClass: MyValidatorClass,\n * });\n * }\n *\n * isAvailable(): boolean {\n * return this.config.enabled !== false;\n * }\n *\n * dispose(): void {\n * // Cleanup\n * }\n *\n * async create(data: unknown): Promise<MyEntity> {\n * this.assertReady();\n * const validated = this.validator.validateCreateOrThrow(data);\n * const dto = this.mapper.toCreateDTO(validated);\n * const response = await this.apiClient.post('/entities', dto);\n * return this.mapper.toDomain(response.data);\n * }\n * }\n *\n * // Usage\n * const service = new MyDomainService({ enabled: true, apiBasePath: '/api/v1' });\n * await service.ensureApiClientInitialized();\n * const entity = await service.create({ name: 'Test' });\n * ```\n */\n\nimport { PackageLogger } from '@plyaz/logger';\nimport { CorePackageError } from '@plyaz/errors';\nimport { ERROR_CODES } from '@plyaz/types/errors';\nimport type {\n CoreBaseMapperInstance,\n CoreBaseValidatorInstance,\n CoreServiceRuntime,\n} from '@plyaz/types/core';\nimport type { FeatureFlagValue } from '@plyaz/types/features';\nimport type { ApiClientOptions } from '@plyaz/types/api';\nimport { createApiClient, setDefaultApiClient } from '@plyaz/api/frontend';\n// Import types we need locally\nimport type {\n CoreBaseDomainServiceConfig,\n CoreMapperClass,\n CoreValidatorClass,\n CoreBaseServiceConfig,\n CoreCacheManagerInstance,\n} from '@plyaz/types/core';\nimport type { DatabaseServiceInterface } from '@plyaz/types/db';\nimport type { ObservabilityAdapter, Span } from '@plyaz/types/observability';\n\n// ─────────────────────────────────────────────────────────────────────────────\n// Types\n// ─────────────────────────────────────────────────────────────────────────────\n\n/**\n * API client type (from @plyaz/api)\n */\nexport type ApiClient = Awaited<ReturnType<typeof createApiClient>>;\n\n// ─────────────────────────────────────────────────────────────────────────────\n// Abstract Base Class\n// ─────────────────────────────────────────────────────────────────────────────\n\n/**\n * Abstract base class for domain services\n *\n * Uses generics for strong typing:\n * - TConfig: Service configuration type\n * - TMapper: Mapper instance type\n * - TValidator: Validator instance type\n *\n * Subclasses use the super({...}) pattern:\n * ```typescript\n * class MyService extends BaseDomainService<MyConfig, MyMapper, MyValidator> {\n * constructor(config: MyConfig) {\n * super({\n * serviceName: 'MyService',\n * supportedRuntimes: ['universal'],\n * serviceConfig: config,\n * apiClientConfig: { baseURL: '/api' },\n * MapperClass: MyMapperClass,\n * ValidatorClass: MyValidatorClass,\n * });\n * }\n * }\n * ```\n */\nexport abstract class BaseDomainService<\n TConfig extends CoreBaseDomainServiceConfig = CoreBaseDomainServiceConfig,\n TMapper extends CoreBaseMapperInstance<unknown, unknown> = CoreBaseMapperInstance<\n unknown,\n unknown\n >,\n TValidator extends CoreBaseValidatorInstance = CoreBaseValidatorInstance,\n> {\n // ─────────────────────────────────────────────────────────────────────────\n // Instance Properties\n // ─────────────────────────────────────────────────────────────────────────\n\n /** Service name for logging and error messages */\n readonly serviceName: string;\n\n /** Supported runtimes for this service */\n readonly supportedRuntimes: readonly CoreServiceRuntime[];\n\n /** Service configuration */\n protected readonly config: TConfig;\n\n /** Logger instance */\n protected readonly logger: PackageLogger;\n\n /** Initialization state */\n protected _initialized: boolean = false;\n\n // API Client (optional)\n private _apiClient: ApiClient | null = null;\n private _clientInitPromise: Promise<void> | null = null;\n private readonly _apiClientConfig?: ApiClientOptions;\n private readonly _setAsDefaultClient: boolean;\n\n // Injected Services (cache, db, api, observability)\n protected readonly cacheManager?: CoreCacheManagerInstance;\n protected readonly dbService?: DatabaseServiceInterface;\n protected readonly apiService?: ApiClient; // Injected ApiClient (different from _apiClient)\n protected readonly observabilityService?: ObservabilityAdapter;\n\n /**\n * Cache prefix for namespacing cache keys (e.g., 'example', 'user', 'product').\n * Subclasses can override by defining as a property.\n * If not overridden, defaults to serviceName.toLowerCase().\n *\n * @example\n * ```typescript\n * protected cachePrefix = 'my-service'; // Override default\n * ```\n */\n protected cachePrefix: string = '';\n\n // Mapper and Validator instances (lazy)\n private _mapperInstance: TMapper | null = null;\n private _validatorInstance: TValidator | null = null;\n private readonly _MapperClass?: CoreMapperClass<TMapper>;\n private readonly _ValidatorClass?: CoreValidatorClass<TValidator>;\n\n // ─────────────────────────────────────────────────────────────────────────\n // Constructor\n // ─────────────────────────────────────────────────────────────────────────\n\n /**\n * Create a new domain service instance\n *\n * @param config - Base service configuration (passed via super({...}))\n */\n // eslint-disable-next-line complexity\n constructor(config: CoreBaseServiceConfig<TConfig, TMapper, TValidator>) {\n this.serviceName = config.serviceName;\n this.supportedRuntimes = config.supportedRuntimes;\n this.config = config.serviceConfig;\n this._setAsDefaultClient = config.setAsDefaultClient ?? false;\n\n // Initialize logger\n this.logger = new PackageLogger({\n packageName: 'core',\n service: this.serviceName,\n });\n\n // Store API client config for lazy initialization\n this._apiClientConfig = config.apiClientConfig;\n\n // Store injected services (cache, db, api, observability)\n // Cast from unknown (types package uses unknown to avoid circular deps)\n this.cacheManager = config.injected?.cache as CoreCacheManagerInstance | undefined;\n this.dbService = config.injected?.db as DatabaseServiceInterface | undefined;\n this.apiService = config.injected?.api as ApiClient | undefined;\n // observabilityOverride takes precedence over injected observability\n this.observabilityService = (config.serviceConfig.observabilityOverride ??\n config.injected?.observability) as ObservabilityAdapter | undefined;\n\n // Initialize cache prefix to serviceName if not set by subclass\n // Subclasses can override by setting in their constructor after super()\n if (!this.cachePrefix) {\n this.cachePrefix = this.serviceName.toLowerCase();\n }\n\n // Store mapper/validator classes for lazy initialization\n this._MapperClass = config.mapperClass;\n this._ValidatorClass = config.validatorClass;\n\n // Initialize API client if config provided\n if (this._apiClientConfig) {\n this.initializeApiClient();\n }\n\n this.logger.debug(`${this.serviceName} created`, {\n supportedRuntimes: this.supportedRuntimes,\n hasApiClient: !!this._apiClientConfig,\n injected: {\n cache: !!this.cacheManager,\n db: !!this.dbService,\n api: !!this.apiService,\n observability: !!this.observabilityService,\n },\n cachePrefix: this.cachePrefix,\n hasMapper: !!this._MapperClass,\n hasValidator: !!this._ValidatorClass,\n });\n }\n\n // ─────────────────────────────────────────────────────────────────────────\n // Getters\n // ─────────────────────────────────────────────────────────────────────────\n\n /**\n * Check if the service is enabled\n * Service is enabled by default unless explicitly disabled\n */\n get isServiceEnabled(): boolean {\n return this.config?.enabled !== false;\n }\n\n /**\n * Check if the service is initialized (API client ready)\n */\n get isInitialized(): boolean {\n return this._initialized;\n }\n\n /**\n * Check if mapper is available\n */\n get hasMapper(): boolean {\n return !!this._MapperClass;\n }\n\n /**\n * Check if validator is available\n */\n get hasValidator(): boolean {\n return !!this._ValidatorClass;\n }\n\n /**\n * Get the mapper instance (lazy initialization)\n * @throws CorePackageError if MapperClass was not provided\n */\n get mapper(): TMapper {\n if (!this._mapperInstance && this._MapperClass) {\n this._mapperInstance = new this._MapperClass();\n }\n if (!this._mapperInstance) {\n throw new CorePackageError(\n `${this.serviceName} does not have a Mapper configured`,\n ERROR_CODES.FEATURE_NOT_SUPPORTED\n );\n }\n return this._mapperInstance;\n }\n\n /**\n * Set the mapper instance\n * Allows subclasses to override mapper initialization\n */\n set mapper(value: TMapper) {\n this._mapperInstance = value;\n }\n\n /**\n * Get the validator instance (lazy initialization)\n * @throws CorePackageError if ValidatorClass was not provided\n */\n get validator(): TValidator {\n if (!this._validatorInstance && this._ValidatorClass) {\n this._validatorInstance = new this._ValidatorClass();\n }\n if (!this._validatorInstance) {\n throw new CorePackageError(\n `${this.serviceName} does not have a Validator configured`,\n ERROR_CODES.FEATURE_NOT_SUPPORTED\n );\n }\n return this._validatorInstance;\n }\n\n /**\n * Set the validator instance\n * Allows subclasses to override validator initialization\n */\n set validator(value: TValidator) {\n this._validatorInstance = value;\n }\n\n /**\n * Get the API client (after initialization)\n * @throws CorePackageError if API client was not configured or not initialized\n */\n get apiClient(): ApiClient {\n if (!this._apiClient) {\n throw new CorePackageError(\n `${this.serviceName} API client not initialized. Call ensureApiClientInitialized() first.`,\n ERROR_CODES.CLIENT_INITIALIZATION_FAILED\n );\n }\n return this._apiClient;\n }\n\n /**\n * Get the observability adapter (if injected)\n * Returns undefined if observability is not enabled\n */\n get observability(): ObservabilityAdapter | undefined {\n return this.observabilityService;\n }\n\n /**\n * Check if observability is available\n */\n get hasObservability(): boolean {\n return !!this.observabilityService;\n }\n\n // ─────────────────────────────────────────────────────────────────────────\n // API Client Initialization\n // ─────────────────────────────────────────────────────────────────────────\n\n /**\n * Initialize API client asynchronously\n * Called from constructor if apiClientConfig is provided\n */\n private initializeApiClient(): void {\n if (this._clientInitPromise || !this._apiClientConfig) {\n return;\n }\n\n this._clientInitPromise = (async () => {\n try {\n this._apiClient = await createApiClient(this._apiClientConfig!);\n\n // Set as default client for all fetchers if configured\n if (this._setAsDefaultClient) {\n setDefaultApiClient(this._apiClient);\n }\n\n this._initialized = true;\n\n this.logger.debug('API client initialized', {\n service: this.serviceName,\n baseURL: this._apiClientConfig!.baseURL,\n });\n } catch (error) {\n this.logger.error('Failed to initialize API client', {\n service: this.serviceName,\n error: error instanceof Error ? error.message : String(error),\n });\n throw error;\n }\n })();\n }\n\n /**\n * Ensure API client is initialized before use.\n * Call this from methods that need the API client.\n * Also called by ServiceRegistry.create() for services with async initialization.\n */\n async ensureApiClientInitialized(): Promise<void> {\n if (this._clientInitPromise) {\n await this._clientInitPromise;\n }\n if (this._apiClientConfig && !this._apiClient) {\n throw new CorePackageError(\n `${this.serviceName} API client not initialized`,\n ERROR_CODES.CLIENT_INITIALIZATION_FAILED\n );\n }\n }\n\n // ─────────────────────────────────────────────────────────────────────────\n // Configuration Management\n // ─────────────────────────────────────────────────────────────────────────\n\n /**\n * Get current configuration (immutable copy)\n */\n getConfig(): Readonly<TConfig> {\n return { ...this.config };\n }\n\n /**\n * Get a default value\n * @param key - The key to get the default for\n */\n getDefault<T = FeatureFlagValue>(key: string): T | undefined {\n return this.config?.defaults?.[key] as T | undefined;\n }\n\n /**\n * Set a default value (mutates config.defaults)\n * @param key - The key to set the default for\n * @param value - The default value\n */\n setDefault(key: string, value: FeatureFlagValue): void {\n if (!this.config.defaults) {\n (this.config as CoreBaseDomainServiceConfig).defaults = {};\n }\n this.config.defaults![key] = value;\n }\n\n /**\n * Set multiple default values\n * @param defaults - Record of default values\n */\n setDefaults(defaults: Record<string, FeatureFlagValue>): void {\n if (!this.config.defaults) {\n (this.config as CoreBaseDomainServiceConfig).defaults = {};\n }\n Object.assign(this.config.defaults!, defaults);\n }\n\n // ─────────────────────────────────────────────────────────────────────────\n // Assertions\n // ─────────────────────────────────────────────────────────────────────────\n\n /**\n * Assert that the service is available (configured and ready)\n * @throws CorePackageError if not available\n */\n protected assertAvailable(): void {\n if (!this.isAvailable()) {\n throw new CorePackageError(\n `${this.serviceName} is not available. Check configuration.`,\n ERROR_CODES.CLIENT_INITIALIZATION_FAILED\n );\n }\n }\n\n /**\n * Assert that the service is enabled\n * @throws CorePackageError if disabled\n */\n protected assertEnabled(): void {\n if (!this.isServiceEnabled) {\n throw new CorePackageError(\n `${this.serviceName} is disabled. Set enabled: true in configuration.`,\n ERROR_CODES.FEATURE_NOT_SUPPORTED\n );\n }\n }\n\n /**\n * Assert that the service is ready (enabled AND available)\n * @throws CorePackageError if not ready\n */\n protected assertReady(): void {\n this.assertEnabled();\n this.assertAvailable();\n }\n\n // ─────────────────────────────────────────────────────────────────────────\n // Abstract Methods - Must be implemented by subclasses\n // ─────────────────────────────────────────────────────────────────────────\n\n /**\n * Check if service is available (configured and ready)\n * Subclasses must implement this to check credentials, config, etc.\n *\n * @returns true if available\n */\n abstract isAvailable(): boolean;\n\n /**\n * Dispose/cleanup the service\n * Subclasses must implement to release resources\n */\n abstract dispose(): void;\n\n // ─────────────────────────────────────────────────────────────────────────\n // Helper Methods\n // ─────────────────────────────────────────────────────────────────────────\n\n /**\n * Log debug message with service context\n */\n protected logDebug(message: string, data?: Record<string, unknown>): void {\n this.logger.debug(message, {\n service: this.serviceName,\n ...data,\n });\n }\n\n /**\n * Log info message with service context\n */\n protected logInfo(message: string, data?: Record<string, unknown>): void {\n this.logger.info(message, {\n service: this.serviceName,\n ...data,\n });\n }\n\n /**\n * Log warning message with service context\n */\n protected logWarn(message: string, data?: Record<string, unknown>): void {\n this.logger.warn(message, {\n service: this.serviceName,\n ...data,\n });\n }\n\n /**\n * Log error message with service context\n */\n protected logError(message: string, data?: Record<string, unknown>): void {\n this.logger.error(message, {\n service: this.serviceName,\n ...data,\n });\n }\n\n // ─────────────────────────────────────────────────────────────────────────\n // Observability Helpers\n // ─────────────────────────────────────────────────────────────────────────\n\n /**\n * Record a metric (no-op if observability not available)\n */\n protected async recordMetric(\n name: string,\n value: number,\n tags?: Record<string, string>\n ): Promise<void> {\n if (!this.observabilityService) return;\n await this.observabilityService.recordHistogram(name, value, {\n service: this.serviceName,\n ...tags,\n });\n }\n\n /**\n * Increment a counter (no-op if observability not available)\n */\n protected async incrementCounter(\n name: string,\n value = 1,\n tags?: Record<string, string>\n ): Promise<void> {\n if (!this.observabilityService) return;\n await this.observabilityService.incrementCounter(name, value, {\n service: this.serviceName,\n ...tags,\n });\n }\n\n /**\n * Start a span for tracing (returns noop span if observability not available)\n */\n protected startSpan(name: string, attributes?: Record<string, string | number | boolean>): Span {\n if (!this.observabilityService) {\n // Return a noop span\n return {\n context: { traceId: '', spanId: '' },\n setAttribute: () => {},\n setAttributes: () => {},\n addEvent: () => {},\n setStatus: () => {},\n end: () => {},\n recordException: () => {},\n };\n }\n return this.observabilityService.startSpan({\n name,\n attributes: {\n 'service.name': this.serviceName,\n ...attributes,\n },\n });\n }\n\n /**\n * Execute a function within a traced span\n */\n protected async withSpan<T>(\n name: string,\n fn: (span: Span) => Promise<T>,\n attributes?: Record<string, string | number | boolean>\n ): Promise<T> {\n if (!this.observabilityService) {\n // Execute without tracing\n const noopSpan = this.startSpan(name);\n return fn(noopSpan);\n }\n return this.observabilityService.withSpan(\n {\n name,\n attributes: {\n 'service.name': this.serviceName,\n ...attributes,\n },\n },\n fn\n );\n }\n}\n","/**\n * Base Frontend Domain Service\n *\n * Extends BaseDomainService with common frontend patterns:\n * - **Primary/Read Store Pattern**: Services have ONE primary store (mutate) + multiple read stores (read-only)\n * - **Automatic Store Injection**: Stores injected by ServiceRegistry from root store\n * - **Automatic Loading State**: Managed via setStoresLoading() on primary store\n * - **Generic CRUD Operations**: With fetchers from @plyaz/api\n * - **Event Emission**: Typed event payloads via CoreEventManager\n * - **Automatic DTO Mapping**: Via mapper classes\n *\n * ## Store Architecture (NEW)\n *\n * ### Primary Store (Mutate)\n * - Service has ONE primary store defined by `store: 'campaigns'` config\n * - Can call: setData(), updateData(), setLoading()\n * - syncToStores() syncs ONLY to primary store\n * - Access via: this.primaryStore\n *\n * ### Read Stores (Read-Only)\n * - Service can read from multiple stores: `readStores: ['users', 'error', 'featureFlags']`\n * - Can read state but should NOT call mutation methods\n * - Used for cross-domain data access (e.g., campaign service reading user data)\n * - Access via: this.getReadStore('users')\n *\n * ### All Stores from Root Store\n * - All stores (domain + global) are slices of ONE root Zustand store\n * - Automatically reactive - changes propagate to subscribers (React components)\n * - Error/featureFlags are built-in, domain stores added dynamically\n *\n * Frontend domain services should extend this class instead of BaseDomainService\n * to get automatic store integration and CRUD capabilities.\n *\n * All generic type parameters for full type safety:\n * - TConfig: Service configuration type\n * - TStore: Store interface type\n * - TData: Data type for store sync\n * - TEntity: Domain entity type\n * - TResponseDTO: API response DTO type (snake_case)\n * - TCreateDTO: Create request DTO type\n * - TPatchDTO: Patch request DTO type (partial update)\n * - TQueryDTO: Query/filter DTO type for fetchAll\n * - TStoreState: Serializable store state type\n * - TMapper: Mapper instance type\n * - TValidator: Optional validator type\n *\n * @example\n * ```typescript\n * class MyFrontendService extends BaseFrontendDomainService<\n * MyConfig,\n * MyStore,\n * MyStoreData,\n * MyEntity,\n * MyResponseDTO,\n * CreateMyDTO,\n * PatchMyDTO,\n * QueryMyDTO,\n * MyStoreState,\n * MyMapper\n * > {\n * protected eventPrefix = 'myDomain';\n * protected mapper: MyMapper;\n *\n * constructor(config: MyConfig) {\n * super({ ... mapperClass: MyMapperClass });\n * this.mapper = new MyMapperClass();\n * }\n *\n * // All CRUD methods inherited!\n * // - fetchAll(query?)\n * // - fetchById(id)\n * // - create(data)\n * // - update(id, data)\n * // - delete(id)\n * }\n * ```\n */\n\nimport { BaseDomainService } from './BaseDomainService';\nimport { STORE_KEYS } from '@plyaz/store';\nimport { CoreEventManager } from '../../events/CoreEventManager';\nimport { BaseError, CorePackageError } from '@plyaz/errors';\nimport { ERROR_CODES } from '@plyaz/types/errors';\nimport { OBSERVABILITY_METRICS } from '@plyaz/types/observability';\nimport { Core } from '../../init/CoreInitializer';\nimport type { RootStoreSlice } from '@plyaz/types/store';\nimport type {\n CoreEntityCreatingPayload,\n CoreEntityCreatedPayload,\n CoreEntityPatchingPayload,\n CoreEntityPatchedPayload,\n CoreEntityDeletingPayload,\n CoreEntityDeletedPayload,\n CoreEntityErrorPayload,\n CoreEntityCompletePayload,\n} from '@plyaz/types/core';\n\n// Re-export types\nexport type {\n CoreBaseFrontendStore,\n CoreBaseFrontendServiceConfig,\n CoreBaseFrontendServiceConstructorConfig,\n CoreStoreHandlers,\n} from '@plyaz/types/core';\n\n// Import types for local use\nimport type {\n CoreBaseFrontendStore,\n CoreBaseFrontendServiceConfig,\n CoreBaseFrontendServiceConstructorConfig,\n CoreBaseMapperInstance,\n CoreBaseValidatorInstance,\n CoreStoreHandlers,\n CoreOptimisticUpdateConfig,\n} from '@plyaz/types/core';\n\n// ─────────────────────────────────────────────────────────────────────────────\n// Base Event Payload Type\n// ─────────────────────────────────────────────────────────────────────────────\n\n/**\n * Base type for frontend event payloads\n * All frontend event payloads should extend this\n */\ntype BaseFrontendEventPayload =\n | CoreEntityCreatingPayload<unknown>\n | CoreEntityCreatedPayload<unknown, unknown>\n | CoreEntityPatchingPayload<unknown>\n | CoreEntityPatchedPayload<unknown, unknown>\n | CoreEntityDeletingPayload\n | CoreEntityDeletedPayload\n | CoreEntityErrorPayload\n | CoreEntityCompletePayload\n | Record<string, unknown>;\n\n// ─────────────────────────────────────────────────────────────────────────────\n// Abstract Base Class\n// ─────────────────────────────────────────────────────────────────────────────\n\n/**\n * Abstract base class for frontend domain services with store integration and CRUD operations.\n *\n * Extends BaseDomainService with:\n * - Multi-store connection management\n * - Automatic sync to connected stores\n * - Loading/error state propagation\n * - Generic CRUD operations (fetchAll, fetchById, create, update, delete)\n * - Event emission with typed payloads\n * - Automatic DTO mapping via mapper\n *\n * @typeParam TConfig - Service configuration type\n * @typeParam TStore - Store interface type\n * @typeParam TData - Data type for store sync\n * @typeParam TEntity - Domain entity type\n * @typeParam TResponseDTO - API response DTO type\n * @typeParam TCreateDTO - Create request DTO type\n * @typeParam TPatchDTO - Patch request DTO type\n * @typeParam TQueryDTO - Query/filter DTO type for fetchAll (default: unknown)\n * @typeParam TStoreState - Serializable store state type\n * @typeParam TMapper - Mapper instance type\n * @typeParam TValidator - Optional validator type\n * @typeParam TDeleteResult - Delete operation result type (default: void for backwards compatibility)\n */\nexport abstract class BaseFrontendDomainService<\n TConfig extends CoreBaseFrontendServiceConfig<TData, TStore>,\n TStore extends CoreBaseFrontendStore<TData>,\n TData = Record<string, unknown>,\n TEntity = unknown,\n TResponseDTO = unknown,\n TCreateDTO = unknown,\n TPatchDTO extends Partial<unknown> = Partial<TCreateDTO>,\n TQueryDTO = unknown,\n TStoreState = TEntity,\n TMapper extends CoreBaseMapperInstance<\n TEntity,\n TResponseDTO,\n TCreateDTO,\n TCreateDTO,\n TPatchDTO,\n unknown,\n TStoreState\n > = CoreBaseMapperInstance<\n TEntity,\n TResponseDTO,\n TCreateDTO,\n TCreateDTO,\n TPatchDTO,\n unknown,\n TStoreState\n >,\n TValidator extends CoreBaseValidatorInstance = CoreBaseValidatorInstance,\n TDeleteResult = void,\n> extends BaseDomainService<TConfig, TMapper, TValidator> {\n // ─────────────────────────────────────────────────────────────────────────\n // Required Properties (Subclasses must provide)\n // ─────────────────────────────────────────────────────────────────────────\n\n /**\n * Event prefix for all events emitted by this service\n * E.g., 'example' → emits 'example:creating', 'example:created', etc.\n *\n * Required by subclasses\n */\n protected abstract eventPrefix: string;\n\n // ─────────────────────────────────────────────────────────────────────────\n // Store Properties\n // ─────────────────────────────────────────────────────────────────────────\n\n /** Primary store - the main store this service can mutate */\n private _primaryStore: TStore | null = null;\n\n /**\n * Primary store key - override in subclass to set default\n * @example protected primaryStoreKey = STORE_KEYS.EXAMPLE;\n */\n protected primaryStoreKey?: string;\n\n /** Read-only stores - can read but not mutate */\n private readonly _readStores = new Map<string, unknown>();\n\n /**\n * Read-only store keys - always includes error and featureFlags by default\n * Override in subclass to add additional read stores\n * @example protected readStoreKeys = [...super.readStoreKeys, STORE_KEYS.CAMPAIGNS];\n */\n protected readStoreKeys: string[] = [STORE_KEYS.ERROR, STORE_KEYS.FEATURE_FLAGS];\n\n /** Store handlers for custom store synchronization */\n protected readonly storeHandlers?: CoreStoreHandlers<TData, TStore>;\n\n // ─────────────────────────────────────────────────────────────────────────\n // Optimistic Update Properties\n // ─────────────────────────────────────────────────────────────────────────\n\n /** Optimistic update configuration */\n protected readonly optimisticConfig?: CoreOptimisticUpdateConfig;\n\n /** Stack of previous states for rollback (LIFO) */\n private readonly _rollbackStack: Array<{\n operation: string;\n previousState: TData | null;\n timestamp: number;\n }> = [];\n\n /** Maximum rollback stack size */\n private readonly _maxRollbackStackSize = 10;\n\n // ─────────────────────────────────────────────────────────────────────────\n // Constructor\n // ─────────────────────────────────────────────────────────────────────────\n\n // eslint-disable-next-line complexity\n constructor(\n config: CoreBaseFrontendServiceConstructorConfig<TConfig, TStore, TData, TMapper, TValidator>\n ) {\n super(config);\n\n this.storeHandlers = config.serviceConfig.storeHandlers;\n this.optimisticConfig = config.serviceConfig.optimisticUpdates;\n\n // Initialize mapper if class provided\n if (config.mapperClass) {\n this.mapper = new config.mapperClass() as TMapper;\n }\n\n const serviceConfig = config.serviceConfig;\n\n // New pattern: store (primary) + readStores (read-only)\n // Use config if provided, otherwise use class property defaults\n if (serviceConfig.store !== undefined) {\n this.primaryStoreKey = serviceConfig.store;\n }\n if (serviceConfig.readStores !== undefined) {\n // Merge config readStores with base defaults (error, featureFlags)\n // Use Set to avoid duplicates\n this.readStoreKeys = Array.from(\n new Set([\n ...this.readStoreKeys, // Base defaults: error, featureFlags\n ...serviceConfig.readStores, // Additional from config\n ])\n );\n }\n\n // Get injected stores from ServiceRegistry\n const injectedStores = config.injected?.stores;\n\n // Connect primary store (can mutate)\n if (this.primaryStoreKey) {\n const primaryStore = injectedStores?.[this.primaryStoreKey] as TStore;\n if (primaryStore) {\n this._primaryStore = primaryStore;\n this.logDebug(`Connected primary store: '${this.primaryStoreKey}'`);\n } else {\n // Warn instead of throw - store integration is optional for services\n // Services can still work without stores, they just can't use store mutations\n this.logWarn(\n `Primary store '${this.primaryStoreKey}' not found. ` +\n `Store mutations (setData/updateData/setLoading) will be disabled. ` +\n `Configure stores in PlyazProvider to enable store integration.`\n );\n }\n }\n\n // Connect read-only stores (can only read)\n for (const key of this.readStoreKeys) {\n const readStore = injectedStores?.[key];\n if (readStore) {\n this._readStores.set(key, readStore);\n this.logDebug(`Connected read-only store: '${key}'`);\n } else {\n this.logDebug(`Read-only store '${key}' not found in injected stores`);\n }\n }\n\n // Log warning if no primary store configured\n if (!this.primaryStoreKey) {\n this.logWarn(\n `No primary store configured. ` +\n `Set 'store' in config to enable store mutations (setData/updateData/setLoading).`\n );\n }\n\n this.logDebug('Frontend service initialized', {\n primaryStore: this.primaryStoreKey,\n readStores: this.readStoreKeys,\n });\n }\n\n // ─────────────────────────────────────────────────────────────────────────\n // Store Management (Public API)\n // ─────────────────────────────────────────────────────────────────────────\n\n /**\n * Get the number of connected stores (primary + read stores).\n */\n get connectedStoreCount(): number {\n return (this._primaryStore ? 1 : 0) + this._readStores.size;\n }\n\n /**\n * Check if any stores are connected (primary or read).\n */\n get hasConnectedStores(): boolean {\n return !!this._primaryStore || this._readStores.size > 0;\n }\n\n /**\n * Get primary store (protected).\n * This is the store the service can mutate.\n */\n protected get primaryStore(): TStore | null {\n return this._primaryStore;\n }\n\n /**\n * Get a read-only store by key (protected).\n * Can read state but should not call mutation methods.\n *\n * @param key - Store key (type-safe)\n * @returns Store slice or undefined (auto-typed based on key)\n */\n protected getReadStore<K extends keyof RootStoreSlice>(key: K): RootStoreSlice[K] | undefined {\n return this._readStores.get(key) as RootStoreSlice[K] | undefined;\n }\n\n /**\n * Get a specific store slice by key (protected).\n *\n * **Namespaced Root Store Architecture:**\n * - All stores are slices merged into ONE Zustand root store\n * - Each slice is namespaced (e.g., store.example, store.errors)\n * - This returns the SPECIFIC slice for the given key\n * - Type-safe: only valid store keys allowed\n *\n * **Usage Guidelines:**\n * - Can mutate stores that are NOT in readStoreKeys\n * - Should NOT mutate stores in readStoreKeys (errors, featureFlags by default)\n * - Useful for cross-domain updates (e.g., campaign service updating user stats)\n *\n * @param key - Store key (type-safe: 'example' | 'errors' | 'featureFlags')\n * @returns Specific store slice (fully typed based on key)\n *\n * @example\n * ```typescript\n * // In CampaignService\n * protected async afterCreate(id: string, campaign: Campaign) {\n * // Update primary store (campaigns)\n * this.primaryStore.addItem(campaign);\n *\n * // Check feature flag (read-only) - auto-typed as FeatureFlagStoreSlice\n * const flagsSlice = this.getStore('featureFlags'); // ✅ Type-safe!\n * if (flagsSlice?.flags?.['update-user-stats']) {\n * // Update user store (cross-domain mutation - OK since not read-only)\n * const userSlice = this.getStore('users'); // ✅ Auto-typed!\n * userSlice?.incrementCampaignCount(campaign.userId);\n * }\n * }\n * ```\n */\n protected getStore<K extends keyof RootStoreSlice>(key: K): RootStoreSlice[K] | undefined {\n // Returns specific slice from namespaced root store (type-safe)\n return Core.getDomainStore(key);\n }\n\n // ─────────────────────────────────────────────────────────────────────────\n // Store Sync (Protected - for subclasses)\n // ─────────────────────────────────────────────────────────────────────────\n\n /**\n * Sync data to primary store only (read stores are NOT updated).\n * Uses setData (replace) or updateData (merge) based on `replace` parameter.\n * If custom store handlers are configured, uses those instead of default behavior.\n *\n * @param data - Data to sync to primary store\n * @param replace - If true, calls setData; if false, calls updateData\n */\n // eslint-disable-next-line complexity\n protected syncToStores(data: TData, replace = false): void {\n if (!this._primaryStore) {\n this.logDebug('No primary store to sync to');\n return;\n }\n\n // Check if store sync is disabled\n if (this.storeHandlers?.disabled) {\n this.logDebug('Store sync disabled via storeHandlers.disabled');\n return;\n }\n\n try {\n // Priority 1: Use custom handlers if configured\n if (replace && this.storeHandlers?.setData) {\n this.storeHandlers.setData(this._primaryStore, data);\n } else if (!replace && this.storeHandlers?.updateData) {\n this.storeHandlers.updateData(this._primaryStore, data as Partial<TData>);\n }\n // Priority 2: Use standard store methods\n else if (replace && this._primaryStore.setData) {\n this._primaryStore.setData(data);\n } else if (!replace && this._primaryStore.updateData) {\n this._primaryStore.updateData(data as Partial<TData>);\n } else if (this._primaryStore.setData) {\n // Fallback to setData if updateData not available\n this._primaryStore.setData(data);\n }\n\n this.logDebug('Synced to primary store', {\n primaryStore: this.primaryStoreKey,\n replace,\n });\n } catch (error) {\n this.logError('Failed to sync to primary store', { error });\n }\n }\n\n /**\n * Set loading state on primary store only.\n * Read stores are NOT affected.\n *\n * Automatically called by CRUD methods before and after API calls.\n *\n * @param isLoading - Loading state\n */\n protected setStoresLoading(isLoading: boolean): void {\n if (!this._primaryStore) return;\n\n // Check if store sync is disabled\n if (this.storeHandlers?.disabled) {\n return;\n }\n\n // Use custom handler if configured\n if (this.storeHandlers?.setLoading) {\n this.storeHandlers.setLoading(this._primaryStore, isLoading);\n }\n // Fallback to default behavior\n else if (this._primaryStore.setLoading) {\n this._primaryStore.setLoading(isLoading);\n }\n }\n\n /**\n * Add entity to store (for create operations).\n * Priority: storeHandlers.addData > store.addData\n *\n * @param entity - Entity to add\n * @returns The converted store state (for reuse in event payloads)\n */\n protected addEntityToStore(entity: TEntity): TStoreState {\n const storeState = this.mapper.toStoreState(entity);\n\n if (this._primaryStore && !this.storeHandlers?.disabled) {\n try {\n if (this.storeHandlers?.addData) {\n this.storeHandlers.addData(this._primaryStore, storeState);\n } else if (this._primaryStore.addData) {\n this._primaryStore.addData(storeState);\n } else {\n this.logDebug('Store does not support addData - skipping create sync');\n }\n } catch (error) {\n this.logError('Failed to add entity to store', { error });\n }\n }\n\n return storeState;\n }\n\n /**\n * Update entity in store (for update operations).\n * Priority: storeHandlers.updateDataById > store.updateDataById\n *\n * @param id - Entity ID\n * @param entity - Updated entity\n * @returns The converted store state (for reuse in event payloads)\n */\n protected updateEntityInStore(id: string, entity: TEntity): TStoreState {\n const storeState = this.mapper.toStoreState(entity);\n\n if (this._primaryStore && !this.storeHandlers?.disabled) {\n try {\n if (this.storeHandlers?.updateDataById) {\n this.storeHandlers.updateDataById(this._primaryStore, id, storeState);\n } else if (this._primaryStore.updateDataById) {\n this._primaryStore.updateDataById(id, storeState);\n } else {\n this.logDebug('Store does not support updateDataById - skipping update sync');\n }\n } catch (error) {\n this.logError('Failed to update entity in store', { error });\n }\n }\n\n return storeState;\n }\n\n /**\n * Sync multiple entities to store using mapper.toStoreStateList.\n * Converts entities to store format and syncs via setData (full replacement).\n *\n * @param entities - Entities to sync\n * @returns Array of converted store states\n */\n protected syncEntitiesToStore(entities: TEntity[]): TStoreState[] {\n const storeStates = entities.map(entity => this.mapper.toStoreState(entity));\n\n if (this._primaryStore && !this.storeHandlers?.disabled && this.mapper.toStoreStateList) {\n // mapper.toStoreStateList returns full store data structure\n const storeData = this.mapper.toStoreStateList(entities);\n this.syncToStores(storeData as TData, true); // Replace with full list\n }\n\n return storeStates;\n }\n\n /**\n * Remove entity from store by ID.\n * Priority: storeHandlers.removeData > store.removeData\n *\n * @param id - Entity ID to remove\n */\n protected removeEntityFromStore(id: string): void {\n if (!this._primaryStore || this.storeHandlers?.disabled) return;\n\n try {\n // Priority 1: Custom handler for removeData\n if (this.storeHandlers?.removeData) {\n this.storeHandlers.removeData(this._primaryStore, id);\n }\n // Priority 2: Store's removeData method\n else if (this._primaryStore.removeData) {\n this._primaryStore.removeData(id);\n } else {\n this.logDebug('Store does not support removeData - skipping delete sync');\n return;\n }\n\n this.logDebug('Removed entity from store', { entityId: id });\n } catch (error) {\n this.logError('Failed to remove entity from store', { error, entityId: id });\n }\n }\n\n // ─────────────────────────────────────────────────────────────────────────\n // Optimistic Update Helpers\n // ─────────────────────────────────────────────────────────────────────────\n\n /**\n * Check if optimistic updates are enabled for an operation.\n */\n protected isOptimisticEnabled(operation: 'create' | 'update' | 'delete'): boolean {\n if (!this.optimisticConfig?.enabled) return false;\n const ops = this.optimisticConfig.operations ?? ['create', 'update', 'delete'];\n return ops.includes(operation);\n }\n\n /**\n * Save current store state for potential rollback.\n * Call this BEFORE making optimistic changes.\n */\n protected saveStateForRollback(operation: string): void {\n if (!this._primaryStore?.getData) return;\n\n const previousState = this._primaryStore.getData();\n this._rollbackStack.push({\n operation,\n previousState: previousState ? { ...previousState } : null,\n timestamp: Date.now(),\n });\n\n // Limit stack size\n if (this._rollbackStack.length > this._maxRollbackStackSize) {\n this._rollbackStack.shift();\n }\n\n this.logDebug('Saved state for rollback', { operation, stackSize: this._rollbackStack.length });\n }\n\n /**\n * Rollback to previous state on error.\n * Call this when an optimistic update fails.\n */\n protected rollbackState(operation: string, error: Error): void {\n const entry = this._rollbackStack.pop();\n if (!entry || !this._primaryStore) {\n this.logWarn('No state to rollback', { operation });\n return;\n }\n\n try {\n if (entry.previousState && this._primaryStore.setData) {\n this._primaryStore.setData(entry.previousState);\n this.logInfo('Rolled back optimistic update', { operation });\n }\n\n // Call onRollback callback if configured\n if (this.optimisticConfig?.onRollback) {\n this.optimisticConfig.onRollback(operation, error, entry.previousState);\n }\n\n // Emit rollback event\n this.emitEvent('optimistic:rollback', {\n operation,\n error: error.message,\n previousState: entry.previousState,\n } as Record<string, unknown>);\n } catch (rollbackError) {\n this.logError('Failed to rollback state', { error: rollbackError, operation });\n }\n }\n\n /**\n * Clear rollback state after successful operation.\n * Call this when API succeeds.\n */\n protected clearRollbackState(operation: string): void {\n // Remove the most recent entry for this operation\n const index = this._rollbackStack.findIndex(e => e.operation === operation);\n if (index >= 0) {\n this._rollbackStack.splice(index, 1);\n }\n }\n\n /**\n * Resolve conflict between optimistic and server state.\n */\n // eslint-disable-next-line complexity\n protected resolveConflict<T>(optimistic: T, server: T): T {\n const resolution = this.optimisticConfig?.conflictResolution ?? 'server-wins';\n\n switch (resolution) {\n case 'server-wins':\n return server;\n case 'client-wins':\n return optimistic;\n case 'merge':\n // Deep merge (simple implementation)\n if (typeof optimistic === 'object' && typeof server === 'object') {\n return { ...optimistic, ...server } as T;\n }\n return server;\n case 'manual':\n if (this.optimisticConfig?.onConflict) {\n return this.optimisticConfig.onConflict(optimistic, server);\n }\n return server;\n default:\n return server;\n }\n }\n\n // ─────────────────────────────────────────────────────────────────────────\n // Response Unwrapping\n // ─────────────────────────────────────────────────────────────────────────\n\n /**\n * Unwrap response data if responseDataKey is configured.\n *\n * Handles wrapped API responses (e.g., SuccessResponseStandard) by extracting\n * the actual data from a nested property. Supports nested keys with dot notation.\n *\n * @param data - Raw response data from fetcher\n * @returns Unwrapped data or original data if no key configured\n *\n * @example\n * ```typescript\n * // Simple key: responseDataKey: 'data'\n * // Input: { success: true, message: '...', data: [...], codeStatus: 200 }\n * // Output: [...]\n *\n * // Nested key: responseDataKey: 'data.items'\n * // Input: { data: { items: [...], total: 100 } }\n * // Output: [...]\n * ```\n */\n protected unwrapResponseData<T>(data: unknown): T {\n const key = this.config.responseDataKey;\n if (!key) return data as T;\n\n // Support nested keys with dot notation (e.g., 'data.items')\n const keys = key.split('.');\n let result: unknown = data;\n\n for (const k of keys) {\n if (result && typeof result === 'object' && k in result) {\n result = (result as Record<string, unknown>)[k];\n } else {\n // Key not found, return original data\n return data as T;\n }\n }\n\n return result as T;\n }\n\n // ─────────────────────────────────────────────────────────────────────────\n // Generic CRUD Operations\n // ─────────────────────────────────────────────────────────────────────────\n\n /**\n * Fetch all entities from API\n *\n * Flow:\n * 1. Assert service is ready\n * 2. Check fetcher is available\n * 3. Set stores loading\n * 4. Emit 'fetching' event\n * 5. Lifecycle hook: beforeFetchAll\n * 6. Call fetcher (from @plyaz/api)\n * 7. Map response DTOs to domain entities\n * 8. Lifecycle hook: afterFetchAll\n * 9. Emit 'fetched' event\n * 10. Return entities\n *\n * Error Handling:\n * - On API error: wrap and emit error event\n * - Set error on all stores\n * - Re-throw wrapped error\n *\n * @param query - Optional query/filter parameters (e.g., { status: 'active' })\n * @param options - Optional service options for fetcher\n * @returns Promise resolving to array of entities\n * @throws CorePackageError if fetcher not configured or API call fails\n *\n * @example\n * ```typescript\n * // Fetch all entities\n * const allItems = await service.fetchAll();\n *\n * // Fetch with filters\n * const activeItems = await service.fetchAll({ status: 'active' });\n *\n * // Fetch with pagination\n * const pagedItems = await service.fetchAll({ page: 2, limit: 10 });\n * ```\n */\n // eslint-disable-next-line complexity\n async fetchAll(query?: Partial<TQueryDTO>, options?: unknown): Promise<TEntity[]> {\n this.assertReady();\n const startTime = Date.now();\n\n if (!this.config.fetchers?.fetchAll) {\n throw new CorePackageError(\n 'fetchAll fetcher not configured. Pass fetchers.fetchAll in service config.',\n ERROR_CODES.CORE_OPERATION_FAILED\n );\n }\n\n this.setStoresLoading(true);\n this.emitEvent('fetching', { query } as Record<string, unknown>);\n\n try {\n // 1. Lifecycle hook\n await this.beforeFetchAll?.(query);\n\n // 2. Call fetcher with query\n const response = await this.config.fetchers.fetchAll(query, options);\n\n if (!response.isSuccess) {\n throw new CorePackageError(\n 'Failed to fetch entities',\n ERROR_CODES.CONTEXT_OPERATION_FAILED,\n {\n context: { operation: 'fetchAll', query },\n cause: response.error ?? undefined,\n }\n );\n }\n\n // 3. Unwrap response data if needed (e.g., SuccessResponseStandard format)\n const rawData = this.unwrapResponseData<TResponseDTO[]>(response.data);\n\n // 4. Map DTOs to domain entities\n const entities = (rawData ?? []).map(dto => this.mapper.toDomain(dto as TResponseDTO));\n\n // 4. Sync to store and get converted store states (no duplicate toStoreState)\n this.syncEntitiesToStore(entities);\n\n // 5. Lifecycle hook\n await this.afterFetchAll?.(entities, query);\n\n // 6. Emit success event\n this.emitEvent('fetched', {\n count: entities.length,\n query,\n } as Record<string, unknown>);\n\n // Record success metrics\n await this.recordOperationMetrics('fetchAll', Date.now() - startTime, true);\n\n this.logInfo('Fetched entities', { count: entities.length, query });\n return entities;\n } catch (error) {\n // Record error metrics\n await this.recordOperationMetrics('fetchAll', Date.now() - startTime, false);\n\n const pkgError = this.wrapError(error, 'fetchAll', { query });\n // Note: Errors are thrown and caught by global error handler\n // Individual stores should NOT have error state - only global error store\n this.emitEvent('fetch:error', {\n error: pkgError,\n data: { query },\n } satisfies CoreEntityErrorPayload);\n throw pkgError;\n } finally {\n this.setStoresLoading(false);\n }\n }\n\n /**\n * Fetch single entity by ID from API\n *\n * @param id - Entity ID\n * @param options - Optional service options for fetcher\n * @returns Entity or null if not found\n * @throws CorePackageError if fetcher not configured or API call fails\n */\n // eslint-disable-next-line complexity\n async fetchById<TInput = string, TOptions = unknown>(\n id: TInput,\n options?: TOptions\n ): Promise<TEntity | null> {\n this.assertReady();\n const startTime = Date.now();\n\n if (!this.config.fetchers?.fetchById) {\n throw new CorePackageError(\n 'fetchById fetcher not configured. Pass fetchers.fetchById in service config.',\n ERROR_CODES.CORE_OPERATION_FAILED\n );\n }\n\n try {\n // 1. Lifecycle hook\n await this.beforeFetchById?.(id);\n\n // 2. Call fetcher\n const response = await this.config.fetchers.fetchById(String(id), options);\n\n if (!response.isSuccess) {\n if (response.error?.message?.includes('404')) {\n return null;\n }\n throw new CorePackageError('Failed to fetch entity', ERROR_CODES.CONTEXT_OPERATION_FAILED, {\n context: { operation: 'fetchById', entityId: String(id) },\n cause: response.error ?? undefined,\n });\n }\n\n // 3. Unwrap and map DTO to domain entity\n const rawData = this.unwrapResponseData<TResponseDTO>(response.data);\n const entity = rawData ? this.mapper.toDomain(rawData) : null;\n\n // 4. Lifecycle hook\n if (entity) {\n await this.afterFetchById?.(entity);\n }\n\n // Record success metrics\n await this.recordOperationMetrics('fetchById', Date.now() - startTime, true);\n\n return entity;\n } catch (error) {\n // Record error metrics\n await this.recordOperationMetrics('fetchById', Date.now() - startTime, false);\n\n const pkgError = this.wrapError(error, 'fetchById', { entityId: String(id) });\n throw pkgError;\n }\n }\n\n /**\n * Create new entity\n *\n * Flow:\n * 1. Assert service is ready\n * 2. Check fetcher is available\n * 3. Set stores loading\n * 4. Emit 'creating' event\n * 5. Lifecycle hook: beforeCreate\n * 6. Map input data to create DTO (if mapper available)\n * 7. [Optimistic] Save state and add to store BEFORE API call\n * 8. Call create fetcher (from @plyaz/api)\n * 9. Map response DTO to domain entity\n * 10. [Optimistic] Resolve conflicts if needed\n * 11. Lifecycle hook: afterCreate\n * 12. Emit 'created' event\n * 13. Return entity\n *\n * @param data - Create data (can be partial domain entity or DTO)\n * @param options - Optional service options for fetcher\n * @returns Created entity\n * @throws CorePackageError if fetcher not configured or creation fails\n */\n // eslint-disable-next-line complexity, max-lines-per-function\n async create<TInput = unknown, TOptions = unknown>(\n data: TInput,\n options?: TOptions\n ): Promise<TEntity> {\n this.assertReady();\n const startTime = Date.now();\n\n if (!this.config.fetchers?.create) {\n throw new CorePackageError(\n 'create fetcher not configured. Pass fetchers.create in service config.',\n ERROR_CODES.CORE_OPERATION_FAILED\n );\n }\n\n const isOptimistic = this.isOptimisticEnabled('create');\n\n this.setStoresLoading(true);\n this.emitEvent('creating', {\n request: data,\n } satisfies CoreEntityCreatingPayload<TInput>);\n\n // Save state for rollback if optimistic\n if (isOptimistic) {\n this.saveStateForRollback('create');\n }\n\n // Create optimistic entity for immediate UI update\n let optimisticEntity: TEntity | null = null;\n let optimisticStoreState: TStoreState | null = null;\n\n try {\n // 1. Lifecycle hook\n await this.beforeCreate?.(data);\n\n // 2. Map to DTO if mapper available (optional - data might already be DTO)\n const createDTO = this.mapper?.toCreateDTO\n ? this.mapper.toCreateDTO(data as Partial<TEntity>)\n : (data as unknown as TCreateDTO);\n\n // 3. [Optimistic] Add to store BEFORE API call\n if (isOptimistic) {\n // Create a temporary entity for optimistic display\n optimisticEntity = {\n ...(data as object),\n id: `temp-${Date.now()}`, // Temporary ID\n _optimistic: true,\n } as TEntity;\n optimisticStoreState = this.addEntityToStore(optimisticEntity);\n\n this.emitEvent('optimistic:create', {\n entity: optimisticEntity,\n storeState: optimisticStoreState,\n } as Record<string, unknown>);\n }\n\n // 4. Call create fetcher\n const response = await this.config.fetchers.create(createDTO, options);\n\n if (!response.isSuccess) {\n throw new CorePackageError(\n response.error?.message ?? 'Failed to create entity',\n ERROR_CODES.CONTEXT_OPERATION_FAILED,\n {\n context: { operation: 'create' },\n cause: response.error ?? undefined,\n }\n );\n }\n\n // 5. Unwrap and map response to domain entity\n const rawData = this.unwrapResponseData<TResponseDTO>(response.data);\n const entity = this.mapper.toDomain(rawData);\n\n // 6. Update store with real entity (replaces optimistic if used)\n let storeState: TStoreState;\n if (isOptimistic && optimisticEntity) {\n // Remove optimistic entity and add real one\n const tempId = (optimisticEntity as { id?: string }).id;\n if (tempId) {\n this.removeEntityFromStore(tempId);\n }\n storeState = this.addEntityToStore(entity);\n this.clearRollbackState('create');\n } else {\n storeState = this.addEntityToStore(entity);\n }\n\n // 7. Lifecycle hook\n await this.afterCreate?.(entity);\n\n // 8. Emit created event (reuse storeState from sync)\n this.emitEvent('created', {\n entity,\n storeState,\n } satisfies CoreEntityCreatedPayload<TEntity, TStoreState>);\n\n this.emitEvent('complete', {\n success: true,\n } satisfies CoreEntityCompletePayload);\n\n // Record success metrics\n await this.recordOperationMetrics('create', Date.now() - startTime, true);\n\n this.logInfo('Entity created', { entityId: (entity as { id?: string }).id });\n return entity;\n } catch (error) {\n // Record error metrics\n await this.recordOperationMetrics('create', Date.now() - startTime, false);\n\n // Rollback on error if optimistic\n if (isOptimistic && this.optimisticConfig?.rollbackOnError !== false) {\n this.rollbackState('create', error instanceof Error ? error : new Error(String(error)));\n }\n\n const pkgError = this.wrapError(error, 'create');\n // Errors thrown to global error handler - not set on individual stores\n this.emitEvent('create:error', {\n error: pkgError,\n } satisfies CoreEntityErrorPayload);\n throw pkgError;\n } finally {\n this.setStoresLoading(false);\n }\n }\n\n /**\n * Update entity (partial update - PATCH)\n *\n * @param id - Entity ID\n * @param data - Partial update data\n * @param options - Optional service options for fetcher\n * @returns Updated entity\n * @throws CorePackageError if fetcher not configured or update fails\n */\n // eslint-disable-next-line complexity, max-lines-per-function\n async update<TInput = unknown, TOptions = unknown>(\n id: string,\n data: TInput,\n options?: TOptions\n ): Promise<TEntity> {\n this.assertReady();\n const startTime = Date.now();\n\n if (!this.config.fetchers?.update) {\n throw new CorePackageError(\n 'update fetcher not configured. Pass fetchers.update in service config.',\n ERROR_CODES.CORE_OPERATION_FAILED\n );\n }\n\n const isOptimistic = this.isOptimisticEnabled('update');\n\n this.setStoresLoading(true);\n this.emitEvent('patching', {\n id,\n request: data,\n } satisfies CoreEntityPatchingPayload<TInput>);\n\n // Save state for rollback if optimistic\n if (isOptimistic) {\n this.saveStateForRollback('update');\n }\n\n try {\n // 1. Lifecycle hook\n await this.beforeUpdate?.(id, data);\n\n // 2. Map to DTO if mapper available\n const patchDTO = this.mapper?.toPatchDTO\n ? this.mapper.toPatchDTO(data as Partial<TEntity>)\n : (data as unknown as TPatchDTO);\n\n // 3. [Optimistic] Update store BEFORE API call\n let optimisticStoreState: TStoreState | null = null;\n if (isOptimistic) {\n // Create optimistic entity with merged data\n const optimisticEntity = {\n id,\n ...(data as object),\n _optimistic: true,\n } as TEntity;\n optimisticStoreState = this.updateEntityInStore(id, optimisticEntity);\n\n this.emitEvent('optimistic:update', {\n id,\n entity: optimisticEntity,\n storeState: optimisticStoreState,\n } as Record<string, unknown>);\n }\n\n // 4. Call update fetcher\n const response = await this.config.fetchers.update({ id, data: patchDTO }, options);\n\n if (!response.isSuccess) {\n throw new CorePackageError(\n response.error?.message ?? 'Failed to update entity',\n ERROR_CODES.CONTEXT_OPERATION_FAILED,\n {\n context: { operation: 'update', entityId: id },\n cause: response.error ?? undefined,\n }\n );\n }\n\n // 5. Unwrap and map response to domain entity\n const rawData = this.unwrapResponseData<TResponseDTO>(response.data);\n const serverEntity = this.mapper.toDomain(rawData);\n\n // 6. Resolve conflicts and update store with final entity\n let finalEntity = serverEntity;\n if (isOptimistic && optimisticStoreState) {\n // Resolve any conflicts between optimistic and server response\n finalEntity = this.resolveConflict({ id, ...(data as object) } as TEntity, serverEntity);\n this.clearRollbackState('update');\n }\n\n // 7. Update in store with final entity\n const storeState = this.updateEntityInStore(id, finalEntity);\n\n // 8. Lifecycle hook\n await this.afterUpdate?.(id, finalEntity);\n\n // 9. Emit updated event (reuse storeState from sync)\n this.emitEvent('patched', {\n entity: finalEntity,\n storeState,\n } satisfies CoreEntityPatchedPayload<TEntity, TStoreState>);\n\n this.emitEvent('complete', {\n success: true,\n entityId: id,\n } satisfies CoreEntityCompletePayload);\n\n // Record success metrics\n await this.recordOperationMetrics('patch', Date.now() - startTime, true);\n\n this.logInfo('Entity updated', { entityId: id });\n return finalEntity;\n } catch (error) {\n // Record error metrics\n await this.recordOperationMetrics('patch', Date.now() - startTime, false);\n\n // Rollback on error if optimistic\n if (isOptimistic && this.optimisticConfig?.rollbackOnError !== false) {\n this.rollbackState('update', error instanceof Error ? error : new Error(String(error)));\n }\n\n const pkgError = this.wrapError(error, 'update', { entityId: id });\n // Errors thrown to global error handler - not set on individual stores\n this.emitEvent('update:error', {\n error: pkgError,\n entityId: id,\n } satisfies CoreEntityErrorPayload);\n throw pkgError;\n } finally {\n this.setStoresLoading(false);\n }\n }\n\n /**\n * Delete entity\n *\n * @param id - Entity ID\n * @param options - Optional service options for fetcher\n * @returns Delete operation result (type specified by TDeleteResult generic)\n * @throws CorePackageError if fetcher not configured or deletion fails\n */\n // eslint-disable-next-line complexity\n async delete<TInput = string, TOptions = unknown>(\n id: TInput,\n options?: TOptions\n ): Promise<TDeleteResult> {\n this.assertReady();\n const startTime = Date.now();\n\n if (!this.config.fetchers?.delete) {\n throw new CorePackageError(\n 'delete fetcher not configured. Pass fetchers.delete in service config.',\n ERROR_CODES.CORE_OPERATION_FAILED\n );\n }\n\n const isOptimistic = this.isOptimisticEnabled('delete');\n\n this.setStoresLoading(true);\n this.emitEvent('deleting', {\n id: String(id),\n } satisfies CoreEntityDeletingPayload);\n\n // Save state for rollback if optimistic\n if (isOptimistic) {\n this.saveStateForRollback('delete');\n }\n\n try {\n // 1. Lifecycle hook\n await this.beforeDelete?.(id);\n\n // 2. [Optimistic] Remove from store BEFORE API call\n if (isOptimistic) {\n this.removeEntityFromStore(String(id));\n\n this.emitEvent('optimistic:delete', {\n id: String(id),\n } as Record<string, unknown>);\n }\n\n // 3. Call delete fetcher\n const response = await this.config.fetchers.delete(String(id), options);\n\n if (!response.isSuccess) {\n throw new CorePackageError(\n response.error?.message ?? 'Failed to delete entity',\n ERROR_CODES.CONTEXT_OPERATION_FAILED,\n {\n context: { operation: 'delete', entityId: String(id) },\n cause: response.error ?? undefined,\n }\n );\n }\n\n // 4. Remove from store (if not already done optimistically)\n if (!isOptimistic) {\n this.removeEntityFromStore(String(id));\n } else {\n this.clearRollbackState('delete');\n }\n\n // 5. Lifecycle hook\n await this.afterDelete?.(id);\n\n // 6. Emit deleted event\n this.emitEvent('deleted', {\n id: String(id),\n soft: false,\n } satisfies CoreEntityDeletedPayload);\n\n this.emitEvent('complete', {\n success: true,\n entityId: String(id),\n } satisfies CoreEntityCompletePayload);\n\n // Record success metrics\n await this.recordOperationMetrics('delete', Date.now() - startTime, true);\n\n this.logInfo('Entity deleted', { entityId: String(id) });\n\n // 7. Return delete result\n return response.data as TDeleteResult;\n } catch (error) {\n // Record error metrics\n await this.recordOperationMetrics('delete', Date.now() - startTime, false);\n\n // Rollback on error if optimistic\n if (isOptimistic && this.optimisticConfig?.rollbackOnError !== false) {\n this.rollbackState('delete', error instanceof Error ? error : new Error(String(error)));\n }\n\n const pkgError = this.wrapError(error, 'delete', { entityId: String(id) });\n // Errors thrown to global error handler - not set on individual stores\n this.emitEvent('delete:error', {\n error: pkgError,\n entityId: String(id),\n } satisfies CoreEntityErrorPayload);\n throw pkgError;\n } finally {\n this.setStoresLoading(false);\n }\n }\n\n // ─────────────────────────────────────────────────────────────────────────\n // Event Emission (Protected - for subclasses)\n // ─────────────────────────────────────────────────────────────────────────\n\n /**\n * Emit event with automatic prefix\n * Uses CoreEventManager under the hood\n *\n * @param event - Event name (without prefix)\n * @param payload - Event payload\n *\n * @example\n * ```typescript\n * // If eventPrefix is 'example', this emits 'example:created'\n * this.emitEvent('created', { entity, storeState });\n * ```\n */\n protected emitEvent<TPayload extends BaseFrontendEventPayload>(\n event: string,\n payload: TPayload\n ): void {\n const eventName = `${this.eventPrefix}:${event}`;\n CoreEventManager.emit(eventName, payload);\n this.logDebug(`Event emitted: ${eventName}`, payload as unknown as Record<string, unknown>);\n }\n\n // ─────────────────────────────────────────────────────────────────────────\n // Lifecycle Hooks (Optional - Override in subclasses)\n // ─────────────────────────────────────────────────────────────────────────\n\n /**\n * Called before fetchAll API call\n * Override to add custom logic (e.g., cache check, validate query)\n *\n * @param query - Optional query/filter parameters\n */\n protected beforeFetchAll?(query?: Partial<TQueryDTO>): Promise<void>;\n\n /**\n * Called after fetchAll success\n * Override to add custom logic (e.g., cache set, transform entities)\n *\n * @param entities - Fetched entities\n * @param query - Optional query/filter parameters that were used\n */\n protected afterFetchAll?(entities: TEntity[], query?: Partial<TQueryDTO>): Promise<void>;\n\n /**\n * Called before fetchById API call\n */\n protected beforeFetchById?<TInput>(id: TInput): Promise<void>;\n\n /**\n * Called after fetchById success\n */\n protected afterFetchById?(entity: TEntity): Promise<void>;\n\n /**\n * Called before create API call\n * Use this to modify data or validate before sending to API\n */\n protected beforeCreate?<TInput>(data: TInput): Promise<void>;\n\n /**\n * Called after create success\n * Use this to update stores, show notifications, etc.\n */\n protected afterCreate?(entity: TEntity): Promise<void>;\n\n /**\n * Called before update API call\n */\n protected beforeUpdate?<TInput>(id: string, data: TInput): Promise<void>;\n\n /**\n * Called after update success\n */\n protected afterUpdate?(id: string, entity: TEntity): Promise<void>;\n\n /**\n * Called before delete API call\n */\n protected beforeDelete?<TInput>(id: TInput): Promise<void>;\n\n /**\n * Called after delete success\n */\n protected afterDelete?<TInput>(id: TInput): Promise<void>;\n\n /**\n * Called before OPTIONS request\n *\n * Use for custom logic before checking allowed methods/CORS headers.\n *\n * @param resource - Optional resource identifier or URL\n */\n protected beforeOptions?<TInput>(resource?: TInput): Promise<void>;\n\n /**\n * Called after OPTIONS request success\n *\n * Use for processing allowed methods/headers or logging.\n *\n * @param resource - Optional resource identifier or URL\n * @param result - The OPTIONS response (allowed methods, CORS headers, etc.)\n */\n protected afterOptions?<TInput>(resource: TInput | undefined, result: unknown): Promise<void>;\n\n /**\n * Called before HEAD request\n *\n * Use for custom logic before checking resource existence/headers.\n *\n * @param resource - Optional resource identifier or URL\n */\n protected beforeHead?<TInput>(resource?: TInput): Promise<void>;\n\n /**\n * Called after HEAD request success\n *\n * Use for processing response headers or logging.\n * Note: HEAD requests return no body, only headers.\n *\n * @param resource - Optional resource identifier or URL\n * @param headers - Response headers (if available)\n */\n protected afterHead?<TInput>(resource: TInput | undefined, headers?: unknown): Promise<void>;\n\n // ─────────────────────────────────────────────────────────────────────────\n // Error Handling Helpers\n // ─────────────────────────────────────────────────────────────────────────\n\n /**\n * Wrap error in CorePackageError with context\n *\n * @param error - Original error\n * @param operation - Operation that failed\n * @param context - Additional context\n * @returns Wrapped error\n */\n protected wrapError(\n error: unknown,\n operation: string,\n context?: Record<string, unknown>\n ): CorePackageError {\n // If already a package error (BaseError subclass), return as-is\n if (error instanceof BaseError) {\n return error as CorePackageError;\n }\n\n // Wrap other errors in CorePackageError\n return new CorePackageError(\n error instanceof Error ? error.message : 'An unexpected error occurred',\n ERROR_CODES.CONTEXT_OPERATION_FAILED,\n {\n context: { operation, ...context },\n cause: error instanceof Error ? error : undefined,\n }\n );\n }\n\n // ─────────────────────────────────────────────────────────────────────────\n // Observability Helper Methods\n // ─────────────────────────────────────────────────────────────────────────\n\n /**\n * Track a frontend operation with observability (span + metrics).\n * Wraps an operation with automatic span creation, duration recording, and error tracking.\n *\n * @param operation - Operation name (fetchAll, fetchById, create, delete)\n * @param entityId - Optional entity ID for context\n * @param fn - The operation function to execute\n * @returns Result of the operation\n *\n * @example\n * ```typescript\n * const entity = await this.trackOperation('create', undefined, async () => {\n * return await this.config.fetchers.create(data);\n * });\n * ```\n */\n protected async trackOperation<T>(\n operation: 'fetchAll' | 'fetchById' | 'create' | 'patch' | 'delete',\n entityId: string | undefined,\n fn: () => Promise<T>\n ): Promise<T> {\n const startTime = Date.now();\n const spanName = `${this.eventPrefix}.${operation}`;\n\n return this.withSpan(spanName, async span => {\n if (entityId) {\n span.setAttribute('entity.id', entityId);\n }\n span.setAttribute('service.name', this.serviceName);\n span.setAttribute('operation.name', operation);\n\n try {\n const result = await fn();\n\n // Record success metrics\n const duration = Date.now() - startTime;\n await this.recordOperationMetrics(operation, duration, true);\n\n span.setStatus('ok');\n return result;\n } catch (error) {\n // Record error metrics\n const duration = Date.now() - startTime;\n await this.recordOperationMetrics(operation, duration, false);\n\n span.recordException(error as Error);\n span.setStatus('error', (error as Error).message);\n throw error;\n }\n });\n }\n\n /**\n * Record operation metrics (duration and count).\n */\n private async recordOperationMetrics(\n operation: string,\n duration: number,\n success: boolean\n ): Promise<void> {\n if (!this.hasObservability) return;\n\n const tags = {\n service: this.serviceName,\n operation,\n entity: this.eventPrefix,\n runtime: 'frontend',\n };\n\n // Record duration\n await this.recordMetric(OBSERVABILITY_METRICS.SERVICE_OPERATION_DURATION, duration, tags);\n\n // Record count\n await this.incrementCounter(\n success\n ? OBSERVABILITY_METRICS.SERVICE_OPERATION_COUNT\n : OBSERVABILITY_METRICS.SERVICE_OPERATION_ERROR,\n 1,\n tags\n );\n }\n}\n","/**\n * Base Mapper\n *\n * Abstract base class for domain mappers handling data transformation.\n * Supports all HTTP operations with corresponding mapping methods.\n *\n * Mapping concerns:\n * - Request mapping (domain → API DTO for POST, PUT, PATCH, DELETE)\n * - Response mapping (API DTO → domain)\n * - Store mapping (domain ↔ Zustand state)\n * - Query mapping (filters → query params)\n *\n * Note: Validation is handled by BaseValidator, not here.\n *\n * @example\n * ```typescript\n * class ExampleMapper extends BaseMapper<\n * ExampleEntity, // Domain model\n * ExampleResponseDTO, // API response\n * CreateExampleDTO, // POST body\n * UpdateExampleDTO, // PUT body\n * PatchExampleDTO, // PATCH body\n * QueryExampleDTO, // GET params\n * ExampleStoreItem // Store state\n * > {\n * toDomain(dto) { ... }\n * toCreateDTO(data) { ... }\n * // ... implement needed methods\n * }\n * ```\n */\n// Import for local use\nimport type { CoreBaseMapperInstance } from '@plyaz/types/core';\n\n/**\n * Abstract base mapper with default implementations\n *\n * Required to implement:\n * - toDomain(dto): Convert API response to domain model\n *\n * Optional to implement (based on your needs):\n * - toCreateDTO(data): For POST requests\n * - toUpdateDTO(data): For PUT requests\n * - toPatchDTO(data): For PATCH requests\n * - toQueryDTO(filters): For GET query params\n * - toStoreState(domain): Custom store state shape\n * - fromStoreState(state): Restore domain from store\n */\nexport abstract class BaseMapper<\n TDomain,\n TResponseDTO,\n TCreateDTO = unknown,\n TUpdateDTO = TCreateDTO,\n TPatchDTO = Partial<TCreateDTO>,\n TQueryDTO = unknown,\n TStoreState = TDomain,\n> implements\n CoreBaseMapperInstance<\n TDomain,\n TResponseDTO,\n TCreateDTO,\n TUpdateDTO,\n TPatchDTO,\n TQueryDTO,\n TStoreState\n >\n{\n // ─────────────────────────────────────────────────────────────────\n // Abstract methods - must be implemented\n // ─────────────────────────────────────────────────────────────────\n\n /**\n * Convert API response DTO to domain model\n * Handle snake_case → camelCase, add computed properties\n */\n abstract toDomain(dto: TResponseDTO): TDomain;\n\n // ─────────────────────────────────────────────────────────────────\n // Request Mapping - override as needed\n // ─────────────────────────────────────────────────────────────────\n\n /**\n * Convert domain data to create DTO (POST body)\n * Handle camelCase → snake_case, pick required fields\n */\n toCreateDTO?(data: Partial<TDomain>): TCreateDTO;\n\n /**\n * Convert domain data to update DTO (PUT body - full replacement)\n * Default: same as toCreateDTO\n */\n toUpdateDTO?(data: Partial<TDomain>): TUpdateDTO;\n\n /**\n * Convert domain data to patch DTO (PATCH body - partial)\n * Default: picks only defined fields\n */\n toPatchDTO?(data: Partial<TDomain>): TPatchDTO;\n\n /**\n * Convert filter object to query params DTO (GET)\n * Handle pagination, sorting, filtering\n */\n toQueryDTO?(filters: Partial<TQueryDTO>): TQueryDTO;\n\n // ─────────────────────────────────────────────────────────────────\n // Response Mapping - default implementations\n // ─────────────────────────────────────────────────────────────────\n\n /**\n * Convert database row/repository result to response DTO\n * Override to map repository output to API response format\n * Useful when repository returns different format than API expects\n */\n toResponseDTO?(row: unknown): TResponseDTO;\n\n /**\n * Map array of DTOs to domain models\n */\n toDomainList(dtos: TResponseDTO[]): TDomain[] {\n return dtos.map(dto => this.toDomain(dto));\n }\n\n // ─────────────────────────────────────────────────────────────────\n // Store Mapping - default implementations\n // ─────────────────────────────────────────────────────────────────\n\n /**\n * Convert domain model to store state (serializable)\n * Default: strips functions, keeps data\n */\n toStoreState(domain: TDomain): TStoreState {\n const state = {} as Record<string, unknown>;\n for (const [key, value] of Object.entries(domain as Record<string, unknown>)) {\n if (typeof value !== 'function') {\n // Convert Date to ISO string for serialization\n if (value instanceof Date) {\n state[key] = value.toISOString();\n } else {\n state[key] = value;\n }\n }\n }\n return state as TStoreState;\n }\n\n /**\n * Convert array of domain models to aggregated store state\n * Override to customize how multiple items map to store\n * Default: returns array of individual store states (as Partial since shape may differ)\n */\n toStoreStateList?(domains: TDomain[]): Partial<TStoreState> {\n // Default: map each domain to store state and return as array\n // Subclasses should override for custom aggregation (e.g., flags → Record<key, value>)\n return domains.map(d => this.toStoreState(d)) as unknown as Partial<TStoreState>;\n }\n\n /**\n * Restore domain model from store state\n * Override to restore computed properties/methods\n */\n fromStoreState(state: TStoreState): TDomain {\n return state as unknown as TDomain;\n }\n}\n","/**\n * Base Validator\n *\n * Abstract base class for domain validators.\n * Handles validation AND sanitization using Zod schemas from @plyaz/types.\n *\n * Supports all HTTP operations:\n * - create (POST)\n * - update (PUT - full replacement)\n * - patch (PATCH - partial update)\n * - delete (DELETE with options)\n * - query (GET params)\n *\n * @example\n * ```typescript\n * import { CreateExampleSchema, PatchExampleSchema } from '@plyaz/types/examples';\n *\n * class ExampleValidator extends BaseValidator<\n * CreateExampleDTO, // create\n * UpdateExampleDTO, // update (full)\n * PatchExampleDTO, // patch (partial)\n * DeleteExampleDTO, // delete options\n * QueryExampleDTO // query params\n * > {\n * constructor() {\n * super({\n * createSchema: CreateExampleSchema,\n * patchSchema: PatchExampleSchema,\n * // ... other schemas\n * });\n * }\n * }\n * ```\n */\n\nimport { ValidateAndFormatErrors, ValidationError } from '@plyaz/errors';\nimport type {\n ValidationIssue,\n BaseErrorContext,\n InternalValidationSchema,\n} from '@plyaz/types/errors';\nimport { API_ERROR_CODES } from '@plyaz/types/errors';\nimport { HTTP_STATUS } from '@plyaz/config';\nimport type {\n CoreValidationResult,\n CoreValidatorConfig,\n CoreBaseValidatorInstance,\n} from '@plyaz/types/core';\n\n/**\n * Abstract base validator with default implementations\n */\nexport abstract class BaseValidator<\n TCreate = unknown,\n TUpdate = TCreate,\n TPatch = Partial<TCreate>,\n TDelete = unknown,\n TQuery = unknown,\n> implements CoreBaseValidatorInstance<TCreate, TUpdate, TPatch, TDelete, TQuery>\n{\n protected readonly config: CoreValidatorConfig<TCreate, TUpdate, TPatch, TDelete, TQuery>;\n\n constructor(config: CoreValidatorConfig<TCreate, TUpdate, TPatch, TDelete, TQuery> = {}) {\n this.config = config;\n }\n\n // ─────────────────────────────────────────────────────────────────\n // Validation Methods (return ValidationResult)\n // ─────────────────────────────────────────────────────────────────\n\n /**\n * Validate data for create operation (POST)\n */\n validateCreate(data: unknown): CoreValidationResult<TCreate> {\n if (!this.config.createSchema) {\n return { success: true, data: data as TCreate };\n }\n return this.validate(data, this.config.createSchema);\n }\n\n /**\n * Validate data for full update operation (PUT)\n */\n validateUpdate(data: unknown): CoreValidationResult<TUpdate> {\n if (!this.config.updateSchema) {\n return { success: true, data: data as TUpdate };\n }\n return this.validate(data, this.config.updateSchema);\n }\n\n /**\n * Validate data for partial update operation (PATCH)\n */\n validatePatch(data: unknown): CoreValidationResult<TPatch> {\n if (!this.config.patchSchema) {\n return { success: true, data: data as TPatch };\n }\n return this.validate(data, this.config.patchSchema);\n }\n\n /**\n * Validate data for delete operation (DELETE with options)\n */\n validateDelete(data: unknown): CoreValidationResult<TDelete> {\n if (!this.config.deleteSchema) {\n return { success: true, data: data as TDelete };\n }\n return this.validate(data, this.config.deleteSchema);\n }\n\n /**\n * Validate query parameters (GET list)\n */\n validateQuery(data: unknown): CoreValidationResult<TQuery> {\n if (!this.config.querySchema) {\n return { success: true, data: data as TQuery };\n }\n return this.validate(data, this.config.querySchema);\n }\n\n // ─────────────────────────────────────────────────────────────────\n // OrThrow Methods (throw ValidationError on failure)\n // ─────────────────────────────────────────────────────────────────\n\n /**\n * Validate and throw if invalid (for create)\n * @throws ValidationError[] (array) if validation fails\n */\n validateCreateOrThrow(data: unknown): TCreate {\n const result = this.validateCreate(data);\n if (!result.success && result.errors) {\n const validationErrors = this.toValidationErrorArray(result.errors);\n if (validationErrors.length > 0) {\n throw validationErrors; // Throw array of errors\n }\n }\n return result.data!;\n }\n\n /**\n * Validate and throw if invalid (for update)\n * @throws ValidationError[] (array) if validation fails\n */\n validateUpdateOrThrow(data: unknown): TUpdate {\n const result = this.validateUpdate(data);\n if (!result.success && result.errors) {\n const validationErrors = this.toValidationErrorArray(result.errors);\n if (validationErrors.length > 0) {\n throw validationErrors; // Throw array of errors\n }\n }\n return result.data!;\n }\n\n /**\n * Validate and throw if invalid (for patch)\n * @throws ValidationError[] (array) if validation fails\n */\n validatePatchOrThrow(data: unknown): TPatch {\n const result = this.validatePatch(data);\n if (!result.success && result.errors) {\n const validationErrors = this.toValidationErrorArray(result.errors);\n if (validationErrors.length > 0) {\n throw validationErrors; // Throw array of errors\n }\n }\n return result.data!;\n }\n\n /**\n * Validate and throw if invalid (for delete)\n * @throws ValidationError[] (array) if validation fails\n */\n validateDeleteOrThrow(data: unknown): TDelete {\n const result = this.validateDelete(data);\n if (!result.success && result.errors) {\n const validationErrors = this.toValidationErrorArray(result.errors);\n if (validationErrors.length > 0) {\n throw validationErrors; // Throw array of errors\n }\n }\n return result.data!;\n }\n\n /**\n * Validate and throw if invalid (for query)\n * @throws ValidationError[] (array) if validation fails\n */\n validateQueryOrThrow(data: unknown): TQuery {\n const result = this.validateQuery(data);\n if (!result.success && result.errors) {\n const validationErrors = this.toValidationErrorArray(result.errors);\n if (validationErrors.length > 0) {\n throw validationErrors; // Throw array of errors\n }\n }\n return result.data!;\n }\n\n // ─────────────────────────────────────────────────────────────────\n // Protected Methods\n // ─────────────────────────────────────────────────────────────────\n\n /**\n * Internal validation using ValidateAndFormatErrors from @plyaz/errors\n * This handles both validation AND sanitization (via Zod transforms)\n */\n protected validate<T>(\n data: unknown,\n schema: InternalValidationSchema<T>\n ): CoreValidationResult<T> {\n const result = ValidateAndFormatErrors(schema, data);\n\n if (!result.success) {\n return {\n success: false,\n errors: result.errors,\n };\n }\n\n return {\n success: true,\n data: result.data as T,\n };\n }\n\n /**\n * Convert ValidationIssue[] to array of ValidationError objects\n * Each validation issue becomes a separate ValidationError\n */\n protected toValidationErrorArray(issues?: ValidationIssue[]): ValidationError[] {\n if (!issues || issues.length === 0) {\n return [];\n }\n\n return issues.map(issue => {\n const field = issue.path.join('.');\n return new ValidationError(\n API_ERROR_CODES.VALIDATION_FAILED,\n HTTP_STATUS.BAD_REQUEST,\n issue.message,\n {\n field,\n path: issue.path,\n code: issue.code,\n }\n );\n });\n }\n\n /**\n * Convert ValidationIssue[] to BaseErrorContext (legacy)\n * @deprecated Use toValidationErrorArray instead\n */\n protected toErrorContext(issues?: ValidationIssue[]): BaseErrorContext {\n if (!issues || issues.length === 0) {\n return {};\n }\n return {\n errors: issues.map(issue => ({\n errorCode: issue.code,\n message: issue.message,\n field: issue.path.join('.'),\n context: {\n path: issue.path,\n },\n })),\n };\n }\n}\n","/**\n * Mapper Utility Functions\n *\n * Common utilities for data transformation in mappers.\n */\n\n/**\n * Convert snake_case to camelCase\n */\nexport function snakeToCamel(str: string): string {\n return str.replace(/_([a-z])/g, (_, letter) => letter.toUpperCase());\n}\n\n/**\n * Convert camelCase to snake_case\n */\nexport function camelToSnake(str: string): string {\n return str.replace(/[A-Z]/g, letter => `_${letter.toLowerCase()}`);\n}\n\n/**\n * Parse ISO date string to Date object\n */\nexport function parseDate(dateString: string | null | undefined): Date | null {\n if (!dateString) return null;\n const date = new Date(dateString);\n return isNaN(date.getTime()) ? null : date;\n}\n\n/**\n * Format Date to ISO string for API\n */\nexport function formatDate(date: Date | null | undefined): string | null {\n return date?.toISOString() ?? null;\n}\n\n/**\n * Trim string if defined\n */\nexport function trimString(str: string | undefined): string | undefined {\n return str?.trim();\n}\n\n/**\n * Pick only defined values from object (for PATCH requests)\n */\nexport function pickDefined<T extends Record<string, unknown>>(obj: T): Partial<T> {\n const result: Partial<T> = {};\n for (const [key, value] of Object.entries(obj)) {\n if (value !== undefined) {\n (result as Record<string, unknown>)[key] = value;\n }\n }\n return result;\n}\n\n/**\n * Convert object keys from snake_case to camelCase\n */\nexport function keysToCamel<T extends Record<string, unknown>>(obj: T): Record<string, unknown> {\n const result: Record<string, unknown> = {};\n for (const [key, value] of Object.entries(obj)) {\n result[snakeToCamel(key)] = value;\n }\n return result;\n}\n\n/**\n * Convert object keys from camelCase to snake_case\n */\nexport function keysToSnake<T extends Record<string, unknown>>(obj: T): Record<string, unknown> {\n const result: Record<string, unknown> = {};\n for (const [key, value] of Object.entries(obj)) {\n result[camelToSnake(key)] = value;\n }\n return result;\n}\n","/**\n * InitializationError Component\n *\n * Default error display when Plyaz initialization fails.\n * Can be overridden via the `error` prop on PlyazProvider.\n */\n\n'use client';\n\nimport type { CSSProperties, ReactElement } from 'react';\nimport type { CoreInitializationErrorProps as InitializationErrorProps } from '@plyaz/types/core';\n\n/**\n * Default styles for the error container\n */\nconst errorContainerStyle: CSSProperties = {\n padding: '20px',\n color: 'red',\n fontFamily: 'system-ui, -apple-system, sans-serif',\n};\n\n/**\n * Default styles for the error heading\n */\nconst errorHeadingStyle: CSSProperties = {\n margin: '0 0 10px 0',\n fontSize: '1.25rem',\n fontWeight: 600,\n};\n\n/**\n * Default styles for the error message\n */\nconst errorMessageStyle: CSSProperties = {\n margin: 0,\n fontSize: '0.875rem',\n};\n\n/**\n * Renders an initialization error state.\n *\n * @example\n * ```tsx\n * // Using default error display\n * <InitializationError error={new Error('Failed to connect')} />\n *\n * // Using custom error component\n * <InitializationError\n * error={error}\n * errorComponent={(err) => <CustomErrorBoundary error={err} />}\n * />\n * ```\n */\nexport function InitializationError({\n error,\n errorComponent,\n}: InitializationErrorProps): ReactElement {\n if (errorComponent) {\n return <>{errorComponent(error)}</>;\n }\n\n return (\n <div style={errorContainerStyle}>\n <h2 style={errorHeadingStyle}>Plyaz Initialization Failed</h2>\n <p style={errorMessageStyle}>{error.message}</p>\n </div>\n );\n}\n","/**\n * InitializationLoading Component\n *\n * Default loading display while Plyaz is initializing.\n * Can be overridden via the `loading` prop on PlyazProvider.\n */\n\n'use client';\n\nimport type { CSSProperties, ReactElement } from 'react';\nimport type { CoreInitializationLoadingProps as InitializationLoadingProps } from '@plyaz/types/core';\n\n/**\n * Default styles for the loading container\n */\nconst loadingContainerStyle: CSSProperties = {\n padding: '20px',\n fontFamily: 'system-ui, -apple-system, sans-serif',\n};\n\n/**\n * Default styles for the loading message\n */\nconst loadingMessageStyle: CSSProperties = {\n margin: 0,\n fontSize: '0.875rem',\n color: '#666',\n};\n\n/**\n * Renders an initialization loading state.\n *\n * @example\n * ```tsx\n * // Using default loading display\n * <InitializationLoading />\n *\n * // Using custom loading component\n * <InitializationLoading loading={<Skeleton />} />\n * ```\n */\nexport function InitializationLoading({ loading }: InitializationLoadingProps): ReactElement {\n if (loading) {\n return <>{loading}</>;\n }\n\n return (\n <div style={loadingContainerStyle}>\n <p style={loadingMessageStyle}>Initializing...</p>\n </div>\n );\n}\n","/* eslint-disable no-undef */\n/**\n * Memory Cache Strategy\n *\n * In-memory cache implementation for fast local caching.\n * This will be moved to @plyaz/core when the package structure is finalized.\n *\n * @fileoverview Memory cache strategy implementation\n * @version 1.0.0\n */\n\nimport type { CacheStrategy, CacheEntry, CacheStats, MemoryCacheConfig } from '@plyaz/types';\nimport { CACHE_MAX_SIZE_DEFAULT, CACHE_CLEANUP_INTERVAL_DEFAULT } from '@plyaz/config';\n\n/**\n * In-memory cache strategy implementation.\n * Provides fast caching for single-instance applications.\n *\n * @class MemoryCacheStrategy\n * @implements {CacheStrategy}\n *\n * @example\n * ```typescript\n * const cache = new MemoryCacheStrategy({\n * maxEntries: 500,\n * cleanupInterval: 30000\n * });\n *\n * await cache.set('key', entry);\n * const cached = await cache.get('key');\n * ```\n */\nexport class MemoryCacheStrategy implements CacheStrategy {\n private cache = new Map<string, CacheEntry>();\n private accessOrder = new Map<string, number>();\n private stats = {\n hits: 0,\n misses: 0,\n sets: 0,\n deletes: 0,\n };\n private cleanupTimer?: NodeJS.Timeout;\n private readonly maxSize: number;\n private readonly cleanupInterval: number;\n private readonly onEvict?: (key: string, entry: CacheEntry) => void;\n\n /**\n * Creates a new memory cache strategy.\n *\n * @param config - Memory cache configuration\n */\n constructor(config: MemoryCacheConfig = {}) {\n const defaultConfig = {\n maxEntries: CACHE_MAX_SIZE_DEFAULT,\n cleanupInterval: CACHE_CLEANUP_INTERVAL_DEFAULT,\n };\n\n this.maxSize = config.maxSize ?? config.maxEntries ?? defaultConfig.maxEntries;\n this.cleanupInterval = config.cleanupInterval ?? defaultConfig.cleanupInterval;\n this.onEvict = config.onEvict;\n\n // Start cleanup timer\n this.startCleanup();\n }\n\n /**\n * Stores a cache entry in memory.\n *\n * @param key - Cache key\n * @param entry - Cache entry to store\n * @returns Promise that resolves when entry is stored\n */\n async set<T>(key: string, entry: CacheEntry<T>): Promise<void> {\n // If maxSize is 0, don't store anything\n if (this.maxSize === 0) {\n this.stats.sets++;\n return;\n }\n\n // Check if we need to evict entries to make room\n // Only evict if this is a new key and we're at capacity\n if (!this.cache.has(key) && this.cache.size >= this.maxSize) {\n this.evictOldestEntries();\n }\n\n this.cache.set(key, entry);\n this.accessOrder.set(key, Date.now());\n this.stats.sets++;\n }\n\n /**\n * Retrieves a cache entry from memory.\n *\n * @param key - Cache key\n * @returns Promise that resolves to cache entry or null if not found\n */\n async get<T>(key: string): Promise<CacheEntry<T> | null> {\n const entry = this.cache.get(key) as CacheEntry<T> | undefined;\n\n if (!entry) {\n this.stats.misses++;\n return null;\n }\n\n // Update access time for LRU\n this.accessOrder.set(key, Date.now());\n this.stats.hits++;\n return entry;\n }\n\n /**\n * Removes a cache entry from memory.\n *\n * @param key - Cache key to remove\n * @returns Promise that resolves when entry is removed\n */\n async delete(key: string): Promise<void> {\n this.cache.delete(key);\n this.accessOrder.delete(key);\n this.stats.deletes++;\n }\n\n /**\n * Clears all cache entries from memory.\n *\n * @returns Promise that resolves when cache is cleared\n */\n async clear(): Promise<void> {\n this.cache.clear();\n this.accessOrder.clear();\n this.stats.hits = 0;\n this.stats.misses = 0;\n this.stats.sets = 0;\n this.stats.deletes = 0;\n }\n\n /**\n * Gets cache statistics.\n *\n * @returns Promise that resolves to cache statistics\n */\n async getStats(): Promise<CacheStats> {\n const totalRequests = this.stats.hits + this.stats.misses;\n const hitRatio = totalRequests > 0 ? this.stats.hits / totalRequests : 0;\n\n return {\n hits: this.stats.hits,\n misses: this.stats.misses,\n sets: this.stats.sets,\n deletes: this.stats.deletes,\n size: this.cache.size,\n hitRatio,\n };\n }\n\n /**\n * Disposes of the memory cache and cleans up resources.\n *\n * @returns Promise that resolves when cleanup is complete\n */\n async dispose(): Promise<void> {\n if (this.cleanupTimer) {\n clearInterval(this.cleanupTimer);\n this.cleanupTimer = undefined;\n }\n\n await this.clear();\n }\n\n /**\n * Starts the periodic cleanup of expired entries.\n *\n * @private\n */\n private startCleanup(): void {\n this.cleanupTimer = setInterval(() => {\n this.cleanupExpiredEntries();\n }, this.cleanupInterval);\n\n if (this.cleanupTimer && typeof this.cleanupTimer.unref === 'function') {\n this.cleanupTimer.unref();\n }\n }\n\n /**\n * Removes expired entries from the cache.\n *\n * @private\n */\n private cleanupExpiredEntries(): void {\n const now = Date.now();\n const expiredKeys: string[] = [];\n\n for (const [key, entry] of Array.from(this.cache.entries())) {\n if (now > entry.expiresAt) {\n expiredKeys.push(key);\n }\n }\n\n for (const key of expiredKeys) {\n const entry = this.cache.get(key);\n this.cache.delete(key);\n this.accessOrder.delete(key);\n if (entry && this.onEvict) {\n this.onEvict(key, entry);\n }\n }\n }\n\n /**\n * Evicts the oldest entries when cache is full.\n * Uses LRU-like eviction by removing the oldest entries by creation time.\n *\n * @private\n */\n private evictOldestEntries(): void {\n if (this.maxSize === 0) {\n // If maxSize is 0, don't store anything\n this.cache.clear();\n this.accessOrder.clear();\n return;\n }\n\n const EVICTION_PERCENTAGE = 0.1; // Evict 10% of entries\n const entriesToEvict = Math.max(1, Math.ceil(this.maxSize * EVICTION_PERCENTAGE));\n\n // Sort by access time (LRU)\n const sortedEntries = Array.from(this.accessOrder.entries())\n .sort(([, timeA], [, timeB]) => timeA - timeB)\n .slice(0, entriesToEvict);\n\n for (const [key] of sortedEntries) {\n const entry = this.cache.get(key);\n this.cache.delete(key);\n this.accessOrder.delete(key);\n if (entry && this.onEvict) {\n this.onEvict(key, entry);\n }\n }\n }\n}\n","/**\n * Cache Manager - Core Caching Layer\n *\n * Main cache orchestration service that manages different caching strategies.\n * This will be moved to @plyaz/core when the package structure is finalized.\n *\n * @fileoverview Core caching infrastructure\n * @version 1.0.0\n */\n\nimport { TIME_CONSTANTS } from '@plyaz/config';\nimport { ERROR_CODES } from '@plyaz/types';\nimport { CorePackageError } from '@plyaz/errors';\nimport { MemoryCacheStrategy } from './strategies/memory';\nimport type { CacheStrategy, CacheConfig, CacheEntry, CacheManagerStats } from '@plyaz/types';\n\n/**\n * Cache manager that orchestrates different caching strategies.\n * Provides a unified interface for caching across the application.\n *\n * @class CacheManager\n *\n * @example\n * ```typescript\n * const cache = new CacheManager({\n * isEnabled: true,\n * ttl: 300,\n * strategy: 'redis',\n * redisConfig: { url: 'redis://localhost:6379' }\n * });\n *\n * await cache.set('key', value);\n * const cached = await cache.get('key');\n * ```\n */\nexport class CacheManager {\n private strategy: CacheStrategy | null = null;\n private strategyPromise: Promise<CacheStrategy> | null = null;\n\n /**\n * Creates a new cache manager with the specified configuration.\n *\n * @param config - Cache configuration\n */\n constructor(private config: CacheConfig) {\n // Strategy is created lazily on first use\n }\n\n /**\n * Gets the cache strategy, initializing it if needed.\n * Uses lazy initialization to support dynamic imports for Redis.\n */\n private async getStrategy(): Promise<CacheStrategy> {\n if (this.strategy) return this.strategy;\n if (this.strategyPromise) return this.strategyPromise;\n\n this.strategyPromise = this.createStrategy(this.config);\n this.strategy = await this.strategyPromise;\n return this.strategy;\n }\n\n /**\n * Stores a value in the cache.\n *\n * @template T - Type of the value to cache\n * @param key - Cache key\n * @param value - Value to cache\n * @param ttl - Optional TTL override in seconds\n * @returns Promise that resolves when value is cached\n */\n async set<T>(key: string, value: T, ttl?: number): Promise<void> {\n if (!this.config.isEnabled) return;\n\n const finalTtl = ttl ?? this.config.ttl;\n const entry: CacheEntry<T> = {\n data: value,\n expiresAt: Date.now() + finalTtl * TIME_CONSTANTS.MILLISECONDS_PER_SECOND,\n createdAt: Date.now(),\n };\n\n const strategy = await this.getStrategy();\n await strategy.set(key, entry);\n }\n\n /**\n * Retrieves a value from the cache.\n *\n * @template T - Expected type of the cached value\n * @param key - Cache key\n * @returns Promise that resolves to cached value or null if not found/expired\n */\n async get<T>(key: string): Promise<T | null> {\n if (!this.config.isEnabled) return null;\n\n const strategy = await this.getStrategy();\n const entry = await strategy.get<T>(key);\n if (!entry) return null;\n\n // Check if entry has expired\n if (Date.now() > entry.expiresAt) {\n await strategy.delete(key);\n return null;\n }\n\n return entry.data;\n }\n\n /**\n * Removes a value from the cache.\n *\n * @param key - Cache key to remove\n * @returns Promise that resolves when value is removed\n */\n async delete(key: string): Promise<void> {\n if (!this.config.isEnabled) return;\n const strategy = await this.getStrategy();\n await strategy.delete(key);\n }\n\n /**\n * Clears all cached values.\n *\n * @returns Promise that resolves when cache is cleared\n */\n async clear(): Promise<void> {\n if (!this.config.isEnabled) return;\n const strategy = await this.getStrategy();\n await strategy.clear();\n }\n\n /**\n * Checks if a key exists in the cache.\n *\n * @param key - Cache key to check\n * @returns Promise that resolves to true if key exists and is not expired\n */\n async has(key: string): Promise<boolean> {\n if (!this.config.isEnabled) return false;\n\n const strategy = await this.getStrategy();\n const entry = await strategy.get(key);\n if (!entry) return false;\n\n // Check if entry has expired\n if (Date.now() > entry.expiresAt) {\n await strategy.delete(key);\n return false;\n }\n\n return true;\n }\n\n /**\n * Gets cache statistics.\n *\n * @returns Promise that resolves to cache statistics\n */\n async getStats(): Promise<CacheManagerStats> {\n const strategy = await this.getStrategy();\n return strategy.getStats();\n }\n\n /**\n * Creates the appropriate cache strategy based on configuration.\n * Uses dynamic import for Redis to avoid bundling ioredis in frontend.\n *\n * @private\n * @param config - Cache configuration\n * @returns Promise that resolves to cache strategy instance\n */\n private async createStrategy(config: CacheConfig): Promise<CacheStrategy> {\n switch (config.strategy) {\n case 'redis': {\n if (!config.redisConfig) {\n throw new CorePackageError(\n 'Redis configuration is required for Redis cache strategy',\n ERROR_CODES.CLIENT_INVALID_CONFIG\n );\n }\n // Dynamic import to avoid bundling ioredis in frontend builds\n const { RedisCacheStrategy } = await import('./strategies/redis');\n return new RedisCacheStrategy(config.redisConfig);\n }\n\n case 'memory':\n default:\n return new MemoryCacheStrategy(config.memoryConfig);\n }\n }\n\n /**\n * Disposes of the cache manager and cleans up resources.\n *\n * @returns Promise that resolves when cleanup is complete\n */\n async dispose(): Promise<void> {\n if (this.strategy) {\n await this.strategy.dispose?.();\n }\n }\n}\n\nexport { CacheKeyBuilder } from './CacheKeyBuilder';\n","/**\n * Example Mapper\n *\n * Demonstrates extending BaseMapper for a domain entity.\n * Uses types from @plyaz/types/examples.\n *\n * Note: Validation is handled by ExampleValidator, not here.\n */\n\nimport { BaseMapper, trimString } from '../../base';\nimport type {\n ExampleEntity,\n ExampleResponseDTO,\n ExampleStoreItem,\n CreateExampleDTO,\n UpdateExampleDTO,\n PatchExampleDTO,\n QueryExampleDTO,\n} from '@plyaz/types/examples';\n\n/** Default pagination values */\nconst PAGINATION_DEFAULTS = {\n PAGE: 1,\n LIMIT: 20,\n} as const;\n\n/**\n * Example Mapper implementation\n *\n * Supports:\n * - toDomain: API response → Domain\n * - toCreateDTO: Domain → POST body\n * - toPatchDTO: Domain → PATCH body\n * - toStoreState: Domain → Zustand store\n */\nclass ExampleMapperClass extends BaseMapper<\n ExampleEntity,\n ExampleResponseDTO,\n CreateExampleDTO,\n UpdateExampleDTO,\n PatchExampleDTO,\n QueryExampleDTO,\n ExampleStoreItem\n> {\n /**\n * API DTO → Domain Model\n */\n toDomain(dto: ExampleResponseDTO): ExampleEntity {\n return {\n id: dto.id,\n name: dto.name,\n description: dto.description,\n ownerId: dto.owner_id,\n status: dto.status,\n amount: dto.amount,\n isVisible: dto.is_visible,\n createdAt: new Date(dto.created_at),\n updatedAt: new Date(dto.updated_at),\n\n // Computed properties\n isActive: dto.status === 'active',\n hasDescription: () => Boolean(dto.description),\n };\n }\n\n /**\n * Domain data → Create DTO (POST body)\n */\n toCreateDTO(data: Partial<ExampleEntity>): CreateExampleDTO {\n return {\n name: trimString(data.name) ?? '',\n amount: data.amount ?? 0,\n description: data.description ?? '',\n is_visible: data.isVisible ?? true,\n };\n }\n\n /**\n * Domain data → Update DTO (PUT body - full)\n */\n toUpdateDTO(data: Partial<ExampleEntity>): UpdateExampleDTO {\n return this.toCreateDTO(data);\n }\n\n /**\n * Domain data → Patch DTO (PATCH body - partial)\n */\n toPatchDTO(data: Partial<ExampleEntity>): PatchExampleDTO {\n const dto: PatchExampleDTO = {};\n\n if (data.name !== undefined) {\n dto.name = trimString(data.name);\n }\n if (data.amount !== undefined) {\n dto.amount = data.amount;\n }\n if (data.description !== undefined) {\n dto.description = data.description ?? undefined;\n }\n if (data.isVisible !== undefined) {\n dto.is_visible = data.isVisible;\n }\n\n return dto;\n }\n\n /**\n * Filters → Query params DTO (GET)\n */\n toQueryDTO(filters: Partial<QueryExampleDTO>): QueryExampleDTO {\n return {\n page: filters.page ?? PAGINATION_DEFAULTS.PAGE,\n limit: filters.limit ?? PAGINATION_DEFAULTS.LIMIT,\n sort_by: filters.sort_by ?? 'created_at',\n sort_order: filters.sort_order ?? 'desc',\n status: filters.status,\n is_visible: filters.is_visible,\n min_amount: filters.min_amount,\n max_amount: filters.max_amount,\n search: filters.search,\n };\n }\n\n /**\n * Domain → Store state (serializable)\n */\n toStoreState(domain: ExampleEntity): ExampleStoreItem {\n return {\n id: domain.id,\n name: domain.name,\n description: domain.description,\n ownerId: domain.ownerId,\n status: domain.status,\n amount: domain.amount,\n isVisible: domain.isVisible,\n createdAt: domain.createdAt.toISOString(),\n updatedAt: domain.updatedAt.toISOString(),\n isActive: domain.isActive,\n isSelected: false,\n };\n }\n\n /**\n * Store state → Domain (restore computed props)\n */\n fromStoreState(state: ExampleStoreItem): ExampleEntity {\n return {\n id: state.id,\n name: state.name,\n description: state.description,\n ownerId: state.ownerId,\n status: state.status,\n amount: state.amount,\n isVisible: state.isVisible,\n createdAt: new Date(state.createdAt),\n updatedAt: new Date(state.updatedAt),\n isActive: state.isActive,\n hasDescription: () => Boolean(state.description),\n };\n }\n\n /**\n * Database row → Response DTO\n * Maps repository output to API response format\n */\n toResponseDTO(row: {\n id: string;\n name: string;\n description: string | null;\n amount: number;\n owner_id: string;\n status: string;\n is_visible: boolean;\n created_at: string;\n updated_at: string;\n }): ExampleResponseDTO {\n return {\n id: row.id,\n name: row.name,\n description: row.description,\n amount: row.amount,\n owner_id: row.owner_id,\n status: row.status as 'draft' | 'active' | 'archived',\n is_visible: row.is_visible,\n created_at: row.created_at,\n updated_at: row.updated_at,\n };\n }\n}\n\n// Export class for BaseDomainService.MapperClass\nexport { ExampleMapperClass };\n\n// Singleton instance (for direct usage)\nexport const ExampleMapper = new ExampleMapperClass();\n","/**\n * Example Frontend Service\n *\n * Demonstrates extending BaseFrontendDomainService which provides:\n * - Automatic CRUD operations (fetchAll, fetchById, create, update, delete)\n * - Store integration (Zustand-compatible)\n * - Error handling with @plyaz/errors\n * - Event emission and subscription\n * - Loading/error state management\n * - Automatic DTO validation and mapping via validator and mapper\n *\n * This service only needs to:\n * - Set eventPrefix for event emission\n * - Add any custom domain methods (e.g., polling)\n * - Override lifecycle hooks if needed\n *\n * All standard CRUD operations are inherited:\n * - fetchAll(query?) - Inherited from BaseFrontendDomainService\n * - fetchById(id) - Inherited from BaseFrontendDomainService\n * - create(data) - Inherited from BaseFrontendDomainService\n * - update(id, data) - Inherited from BaseFrontendDomainService\n * - delete(id) - Inherited from BaseFrontendDomainService\n *\n * Runtime: Frontend only (Browser/React/Next.js)\n *\n * @example\n * ```tsx\n * // Service automatically gets stores via ServiceRegistry injection\n * const service = await ServiceRegistry.getAsync<FrontendExampleDomainService>('example');\n *\n * // Or create directly (stores injected if configured)\n * const service = new FrontendExampleDomainService({\n * enabled: true,\n * apiBasePath: '/api/examples',\n * });\n *\n * // Use inherited CRUD methods\n * const items = await service.fetchAll();\n * const activeItems = await service.fetchAll({ status: 'active' });\n * const item = await service.create({ name: 'Test', amount: 100 });\n * const updated = await service.update(item.id, { amount: 200 });\n * await service.delete(item.id);\n * ```\n */\n\nimport { STORE_KEYS } from '@plyaz/store';\nimport { SERVICE_KEYS } from '@plyaz/types/core';\nimport type {\n ExampleEntity,\n ExampleResponseDTO,\n CreateExampleDTO,\n PatchExampleDTO,\n QueryExampleDTO,\n ExampleStoreItem,\n} from '@plyaz/types/examples';\nimport { BaseFrontendDomainService } from '../base/BaseFrontendDomainService';\nimport { CoreEventManager } from '../../events/CoreEventManager';\nimport { ExampleMapperClass } from './mappers/ExampleMapper';\n\n// ─────────────────────────────────────────────────────────────────────────────\n// Constants\n// ─────────────────────────────────────────────────────────────────────────────\n\n/** Default polling interval in milliseconds (30 seconds) */\nconst DEFAULT_POLLING_INTERVAL_MS = 30000;\n\n// ─────────────────────────────────────────────────────────────────────────────\n// Store/Config/Event Types - Re-exported from @plyaz/types\n// ─────────────────────────────────────────────────────────────────────────────\n\n// Re-export types from @plyaz/types\nexport type {\n ExampleFrontendStoreData,\n ExampleFrontendStoreSlice,\n ExampleFrontendServiceConfig,\n ExampleFrontendEventType,\n} from '@plyaz/types/examples';\n\n// Import for local use\nimport type {\n ExampleFrontendStoreData,\n ExampleFrontendStoreSlice,\n ExampleFrontendServiceConfig as _ExampleFrontendServiceConfig,\n ExampleFrontendEventType,\n} from '@plyaz/types/examples';\nimport type { CoreServiceCreateOptions } from '@plyaz/types/core';\nimport type { CoreBaseValidatorInstance } from '@plyaz/types/core';\n\n// ─────────────────────────────────────────────────────────────────────────────\n// Service\n// ─────────────────────────────────────────────────────────────────────────────\n\n/**\n * Example Frontend Service\n *\n * Extends BaseFrontendDomainService with all generic types:\n * - TConfig: ExampleFrontendServiceConfig\n * - TStore: ExampleFrontendStoreSlice\n * - TData: ExampleFrontendStoreData\n * - TEntity: ExampleEntity\n * - TResponseDTO: ExampleResponseDTO\n * - TCreateDTO: CreateExampleDTO\n * - TPatchDTO: PatchExampleDTO\n * - TQueryDTO: QueryExampleDTO\n * - TStoreState: ExampleStoreItem\n * - TMapper: ExampleMapper\n *\n * All CRUD methods are inherited from base class - no need to implement!\n */\nexport class FrontendExampleDomainService extends BaseFrontendDomainService<\n _ExampleFrontendServiceConfig,\n ExampleFrontendStoreSlice,\n ExampleFrontendStoreData,\n ExampleEntity,\n ExampleResponseDTO,\n CreateExampleDTO,\n PatchExampleDTO,\n QueryExampleDTO,\n ExampleStoreItem,\n InstanceType<typeof ExampleMapperClass>,\n CoreBaseValidatorInstance,\n void // TDeleteResult - delete returns void (no response body)\n> {\n // ─────────────────────────────────────────────────────────────────────────\n // Required Properties\n // ─────────────────────────────────────────────────────────────────────────\n\n /**\n * Event prefix for all events emitted by this service\n * Required by BaseFrontendDomainService\n */\n protected eventPrefix = 'example';\n\n /**\n * Primary store key - the store this service can mutate\n */\n protected primaryStoreKey = STORE_KEYS.EXAMPLE;\n\n /**\n * Read-only store keys - inherits error and featureFlags from base\n * No need to redeclare them - they're always included by default\n */\n // protected readStoreKeys = [...super.readStoreKeys]; // Already includes ERROR, FEATURE_FLAGS\n\n // ─────────────────────────────────────────────────────────────────────────\n // Domain-Specific Properties\n // ─────────────────────────────────────────────────────────────────────────\n\n private pollingTimer: ReturnType<typeof setInterval> | null = null;\n\n // ─────────────────────────────────────────────────────────────────────────\n // Static: Service Registry Interface\n // ─────────────────────────────────────────────────────────────────────────\n\n static readonly serviceKey = SERVICE_KEYS.EXAMPLE_FRONTEND;\n\n /**\n * Factory method for ServiceRegistry auto-initialization.\n * Creates and initializes the service instance.\n */\n static async create(\n config: _ExampleFrontendServiceConfig,\n options?: CoreServiceCreateOptions\n ): Promise<FrontendExampleDomainService> {\n const mergedConfig: _ExampleFrontendServiceConfig = {\n ...config,\n apiBasePath: config.apiBasePath ?? options?.apiClient?.options?.baseURL ?? '/api/examples',\n };\n\n const service = new FrontendExampleDomainService(mergedConfig, options);\n\n if (mergedConfig.autoFetch) {\n await service.fetchAll();\n }\n\n return service;\n }\n\n // ─────────────────────────────────────────────────────────────────────────\n // Constructor\n // ─────────────────────────────────────────────────────────────────────────\n\n constructor(config: _ExampleFrontendServiceConfig = {}, options?: CoreServiceCreateOptions) {\n const apiBasePath = config.apiBasePath ?? '/api/examples';\n\n super({\n serviceName: 'ExampleFrontendService',\n supportedRuntimes: ['frontend'],\n // API client config - uses injected options or creates from apiBasePath\n apiClientConfig: options?.apiClient?.options ?? { baseURL: apiBasePath },\n serviceConfig: {\n enabled: true,\n apiBasePath,\n autoFetch: false,\n pollingInterval: 0,\n ...config,\n // Unwrap SuccessResponseStandard: { success, message, data, codeStatus }\n // Base class will extract 'data' property automatically\n responseDataKey: 'data',\n\n // Fetchers - using apiClient directly for testing/example purposes\n // In production, these would be imported from @plyaz/api services\n // Note: Validation is handled by validator class, mapping by mapper class\n fetchers: {\n fetchAll: async query => {\n return this.apiClient.get<ExampleResponseDTO[]>(apiBasePath, { params: query });\n },\n fetchById: async id => {\n return this.apiClient.get<ExampleResponseDTO>(`${apiBasePath}/${id}`);\n },\n create: async data => {\n return this.apiClient.post<ExampleResponseDTO>(apiBasePath, data);\n },\n update: async payload => {\n const { id, data } = payload!;\n return this.apiClient.patch<ExampleResponseDTO>(`${apiBasePath}/${id}`, data);\n },\n delete: async id => {\n return this.apiClient.delete(`${apiBasePath}/${id}`);\n },\n },\n // Store handlers - customize how data syncs to store\n // Use domain-specific methods or call other stores:\n // storeHandlers: {\n // setData: (store, data) => {\n // store.setData(data);\n // // Can also call domain-specific methods or other stores\n // // store.selectItem(data.selectedId);\n // // store.selectItem(data.selectedId);\n // },\n // updateData: (store, data) => store.updateData(data),\n // setLoading: (store, isLoading) => store.setLoading(isLoading),\n // addData: (store, item) => store.addData(item),\n // updateDataById: (store, id, item) => store.updateDataById(id, item),\n // removeData: (store, id) => store.removeData(id),\n // },\n // Or disable store sync: storeHandlers: { disabled: true }\n },\n mapperClass: ExampleMapperClass,\n injected: options?.injected,\n });\n\n // Start polling if configured\n if (this.config.pollingInterval && this.config.pollingInterval > 0) {\n this.startPolling();\n }\n }\n\n // ─────────────────────────────────────────────────────────────────────────\n // Abstract Implementations (Required by BaseDomainService)\n // ─────────────────────────────────────────────────────────────────────────\n\n isAvailable(): boolean {\n return this.isServiceEnabled && typeof window !== 'undefined';\n }\n\n dispose(): void {\n this.stopPolling();\n this.logInfo('Service disposed');\n }\n\n // ─────────────────────────────────────────────────────────────────────────\n // Lifecycle Hooks (Optional Override Examples)\n // ─────────────────────────────────────────────────────────────────────────\n\n /**\n * After fetchAll - emit event (store sync handled automatically)\n * Note: Base class automatically calls syncToStores() which uses storeHandlers\n */\n protected override async afterFetchAll(entities: ExampleEntity[]): Promise<void> {\n // Store sync happens automatically via base class + storeHandlers\n // Just emit domain-specific event\n CoreEventManager.emit('example:store:synced', { items: entities });\n }\n\n // ─────────────────────────────────────────────────────────────────────────\n // Optional: Manual Store Updates (Alternative to storeHandlers)\n // ─────────────────────────────────────────────────────────────────────────\n //\n // Uncomment these for fine-grained control over store updates:\n //\n // protected override async afterCreate(entity: ExampleEntity): Promise<void> {\n // // Manual optimistic update for immediate UI feedback\n // this.primaryStore.addItem?.(entity);\n // }\n //\n // protected override async afterUpdate(id: string, entity: ExampleEntity): Promise<void> {\n // // Targeted update using domain-specific method\n // this.primaryStore.updateItem?.(id, entity);\n // }\n //\n // protected override async afterDelete<TInput>(id: TInput): Promise<void> {\n // // Remove from store using domain-specific method\n // this.primaryStore.removeItem?.(String(id));\n // }\n\n // ─────────────────────────────────────────────────────────────────────────\n // Custom Domain Methods\n // ─────────────────────────────────────────────────────────────────────────\n\n /**\n * Subscribe to service events\n *\n * @example\n * ```tsx\n * const unsubscribe = service.on('example:created', (data) => {\n * console.log('Item created:', data.entity);\n * });\n *\n * // Later: cleanup\n * unsubscribe();\n * ```\n */\n on(event: ExampleFrontendEventType, handler: (data: unknown) => void): () => void {\n return CoreEventManager.on(event, handler);\n }\n\n // ─────────────────────────────────────────────────────────────────────────\n // Polling (Domain-Specific Feature)\n // ─────────────────────────────────────────────────────────────────────────\n\n /**\n * Start polling for updates\n * Domain-specific feature - not part of base class\n */\n startPolling(): void {\n if (this.pollingTimer) return;\n\n const interval = this.config.pollingInterval ?? DEFAULT_POLLING_INTERVAL_MS;\n this.pollingTimer = setInterval(() => {\n this.fetchAll().catch(error => {\n this.logError('Polling fetch failed', { error });\n });\n }, interval);\n\n this.logDebug('Polling started', { interval });\n }\n\n /**\n * Stop polling\n */\n stopPolling(): void {\n if (this.pollingTimer) {\n clearInterval(this.pollingTimer);\n this.pollingTimer = null;\n this.logDebug('Polling stopped');\n }\n }\n\n // ─────────────────────────────────────────────────────────────────────────\n // Demo Methods - fetchAll() with Query Examples\n // ─────────────────────────────────────────────────────────────────────────\n\n /**\n * Demo: Fetch all examples with optional filters\n * Demonstrates the fetchAll() method with typed query parameters\n *\n * @param filters - Optional query filters (status, pagination, sorting)\n * @returns Promise resolving to array of ExampleEntity\n *\n * @example\n * ```typescript\n * // Fetch all active examples\n * const activeExamples = await service.getExamples({ status: 'active' });\n *\n * // Fetch archived examples with pagination\n * const archivedExamples = await service.getExamples({\n * status: 'archived',\n * page: 2,\n * limit: 10\n * });\n *\n * // Fetch all examples sorted by name\n * const sortedExamples = await service.getExamples({\n * sort_by: 'name',\n * sort_order: 'asc'\n * });\n * ```\n */\n async getExamples(filters?: QueryExampleDTO): Promise<ExampleEntity[]> {\n return this.fetchAll(filters); // Properly typed!\n }\n\n /**\n * Demo: Fetch active examples only\n * Convenience method demonstrating filtering\n */\n async getActiveExamples(): Promise<ExampleEntity[]> {\n return this.fetchAll({ status: 'active' });\n }\n\n /**\n * Demo: Fetch draft examples only\n * Convenience method demonstrating filtering\n */\n async getDraftExamples(): Promise<ExampleEntity[]> {\n return this.fetchAll({ status: 'draft' });\n }\n\n /**\n * Demo: Fetch archived examples only\n * Convenience method demonstrating filtering\n */\n async getArchivedExamples(): Promise<ExampleEntity[]> {\n return this.fetchAll({ status: 'archived' });\n }\n\n // ─────────────────────────────────────────────────────────────────────────\n // NOTE: CRUD Methods Are Inherited from BaseFrontendDomainService\n // ─────────────────────────────────────────────────────────────────────────\n //\n // The following methods are available but NOT implemented here:\n // - fetchAll(query?: QueryExampleDTO): Promise<ExampleEntity[]>\n // - fetchById(id: string): Promise<ExampleEntity | null>\n // - create(data: unknown): Promise<ExampleEntity>\n // - update(id: string, data: unknown): Promise<ExampleEntity>\n // - delete(id: string): Promise<void>\n //\n // All API calls → validator → mapper → store sync → events are handled automatically!\n // All events are emitted automatically with 'example:' prefix!\n // ─────────────────────────────────────────────────────────────────────────\n}\n","/**\n * Feature Flag Context Utilities\n *\n * Utilities for building, validating, and manipulating feature flag contexts.\n *\n * @fileoverview Feature flag context utilities\n * @version 1.0.0\n */\n\nimport type { FeatureFlagContext } from '@plyaz/types';\nimport { ISO_STANDARDS } from '@plyaz/config';\n\n/**\n * Builder class for creating feature flag evaluation contexts.\n * Provides a fluent interface for setting context properties.\n *\n * @class FeatureFlagContextBuilder\n *\n * @example\n * ```typescript\n * const context = new FeatureFlagContextBuilder()\n * .setUserId('user123')\n * .setUserRole('premium')\n * .setEnvironment('production')\n * .setPlatform('web')\n * .setCustom({ subscription: 'premium', betaTester: true })\n * .build();\n * ```\n */\nexport class FeatureFlagContextBuilder {\n private context: Partial<FeatureFlagContext> = {};\n\n /**\n * Sets the user ID in the context.\n *\n * @param userId - User identifier\n * @returns Builder instance for chaining\n */\n setUserId(userId: string): this {\n this.context.userId = userId;\n return this;\n }\n\n /**\n * Sets the user email in the context.\n *\n * @param userEmail - User email address\n * @returns Builder instance for chaining\n */\n setUserEmail(userEmail: string): this {\n this.context.userEmail = userEmail;\n return this;\n }\n\n /**\n * Sets the user role in the context.\n *\n * @param userRole - User role or permission level\n * @returns Builder instance for chaining\n */\n setUserRole(userRole: string): this {\n this.context.userRole = userRole;\n return this;\n }\n\n /**\n * Sets the country in the context.\n *\n * @param country - Country code (ISO 3166-1 alpha-2)\n * @returns Builder instance for chaining\n */\n setCountry(country: string): this {\n this.context.country = country;\n return this;\n }\n\n /**\n * Sets the platform in the context.\n *\n * @param platform - Platform type\n * @returns Builder instance for chaining\n */\n setPlatform(platform: 'web' | 'mobile' | 'desktop'): this {\n this.context.platform = platform;\n return this;\n }\n\n /**\n * Sets the version in the context.\n *\n * @param version - Application version\n * @returns Builder instance for chaining\n */\n setVersion(version: string): this {\n this.context.version = version;\n return this;\n }\n\n /**\n * Sets the environment in the context.\n *\n * @param environment - Current environment\n * @returns Builder instance for chaining\n */\n setEnvironment(environment: 'development' | 'staging' | 'production'): this {\n this.context.environment = environment;\n return this;\n }\n\n /**\n * Sets custom context data.\n *\n * @param custom - Custom context properties\n * @returns Builder instance for chaining\n */\n setCustom(custom: Record<string, unknown>): this {\n this.context.custom = { ...this.context.custom, ...custom };\n return this;\n }\n\n /**\n * Adds a single custom property to the context.\n *\n * @param key - Custom property key\n * @param value - Custom property value\n * @returns Builder instance for chaining\n */\n addCustomProperty(key: string, value: unknown): this {\n this.context.custom ??= {};\n this.context.custom[key] = value;\n return this;\n }\n\n /**\n * Builds the final context object.\n * Validates required fields and returns the context.\n *\n * @returns Complete feature flag context\n * @throws Error if required environment is not set\n */\n build(): FeatureFlagContext {\n return {\n environment: this.context.environment ?? 'development',\n userId: this.context.userId,\n userEmail: this.context.userEmail,\n userRole: this.context.userRole,\n country: this.context.country,\n platform: this.context.platform,\n version: this.context.version,\n custom: this.context.custom,\n } satisfies FeatureFlagContext;\n }\n\n /**\n * Clears all context data and resets the builder.\n *\n * @returns Builder instance for chaining\n */\n clear(): this {\n this.context = {};\n return this;\n }\n\n /**\n * Creates a copy of the current builder state.\n *\n * @returns New builder instance with copied context\n */\n clone(): FeatureFlagContextBuilder {\n const cloned = new FeatureFlagContextBuilder();\n cloned.context = { ...this.context };\n if (this.context.custom) {\n cloned.context.custom = { ...this.context.custom };\n }\n return cloned;\n }\n}\n\n/**\n * Context utilities for common scenarios.\n */\nexport const ContextUtils = {\n /**\n * Creates a basic context for anonymous users using the builder.\n *\n * @param environment - Target environment\n * @param platform - User platform\n * @returns Basic anonymous context\n */\n createAnonymousContext(\n environment: 'development' | 'staging' | 'production',\n platform: 'web' | 'mobile' | 'desktop' = 'web'\n ): FeatureFlagContext {\n return new FeatureFlagContextBuilder()\n .setEnvironment(environment)\n .setPlatform(platform)\n .build();\n },\n\n /**\n * Creates a context for authenticated users using the builder.\n *\n * @param params - User context parameters\n * @returns User context\n */\n createUserContext(params: {\n userId: string;\n environment: 'development' | 'staging' | 'production';\n userEmail?: string;\n userRole?: string;\n platform?: 'web' | 'mobile' | 'desktop';\n country?: string;\n version?: string;\n custom?: Record<string, unknown>;\n }): FeatureFlagContext {\n const builder = new FeatureFlagContextBuilder()\n .setUserId(params.userId)\n .setEnvironment(params.environment);\n\n if (params.userEmail) builder.setUserEmail(params.userEmail);\n if (params.userRole) builder.setUserRole(params.userRole);\n if (params.platform) builder.setPlatform(params.platform);\n if (params.country) builder.setCountry(params.country);\n if (params.version) builder.setVersion(params.version);\n if (params.custom) builder.setCustom(params.custom);\n\n return builder.build();\n },\n\n /**\n * Creates a testing context with minimal required fields.\n *\n * @param overrides - Optional context overrides\n * @returns Testing context\n */\n createTestingContext(overrides: Partial<FeatureFlagContext> = {}): FeatureFlagContext {\n return {\n environment: 'development',\n platform: 'web',\n ...overrides,\n };\n },\n\n /**\n * Validates if a context object is complete and valid.\n *\n * @param context - Context to validate\n * @returns Validation result\n */\n validateContext(context: Partial<FeatureFlagContext>): {\n isValid: boolean;\n errors: string[];\n } {\n const errors: string[] = [];\n\n if (!context.environment) {\n errors.push('Environment is required');\n } else if (!['development', 'staging', 'production'].includes(context.environment)) {\n errors.push('Environment must be development, staging, or production');\n }\n\n if (context.platform && !['web', 'mobile', 'desktop'].includes(context.platform)) {\n errors.push('Platform must be web, mobile, or desktop');\n }\n\n if (context.country && context.country.length !== ISO_STANDARDS.ISO_COUNTRY_CODE_LENGTH) {\n errors.push('Country must be a 2-letter ISO country code');\n }\n\n return {\n isValid: errors.length === 0,\n errors,\n };\n },\n\n /**\n * Merges multiple context objects, with later contexts taking precedence.\n *\n * @param contexts - Array of contexts to merge\n * @returns Merged context\n */\n mergeContexts(...contexts: Partial<FeatureFlagContext>[]): FeatureFlagContext {\n const merged = contexts.reduce((acc, context) => {\n const result = {\n ...acc,\n ...context,\n };\n\n // Only merge custom if either has it\n if (acc.custom || context.custom) {\n result.custom = {\n ...acc.custom,\n ...context.custom,\n };\n }\n\n return result;\n }, {} as Partial<FeatureFlagContext>);\n\n merged.environment ??= 'development';\n\n return merged as FeatureFlagContext;\n },\n\n /**\n * Extracts a specific field value from a context.\n *\n * @param field - Field name to extract\n * @param context - Context object\n * @returns Field value or undefined\n */\n getContextValue(field: string, context: FeatureFlagContext): unknown {\n const standardFields = {\n userId: (ctx: FeatureFlagContext) => ctx.userId,\n userEmail: (ctx: FeatureFlagContext) => ctx.userEmail,\n userRole: (ctx: FeatureFlagContext) => ctx.userRole,\n country: (ctx: FeatureFlagContext) => ctx.country,\n platform: (ctx: FeatureFlagContext) => ctx.platform,\n version: (ctx: FeatureFlagContext) => ctx.version,\n environment: (ctx: FeatureFlagContext) => ctx.environment,\n custom: (ctx: FeatureFlagContext) => ctx.custom,\n };\n\n if (field in standardFields) {\n return standardFields[field as keyof typeof standardFields](context);\n }\n\n return context.custom?.[field];\n },\n\n /**\n * Creates a context fingerprint for caching and consistency.\n *\n * @param context - Context to fingerprint\n * @returns String fingerprint\n */\n createFingerprint(context: FeatureFlagContext): string {\n const relevant = {\n userId: context.userId,\n userRole: context.userRole,\n environment: context.environment,\n platform: context.platform,\n country: context.country,\n version: context.version,\n custom: context.custom,\n };\n\n // Filter out undefined values and sort keys for consistency\n const filtered = Object.entries(relevant)\n .filter(([, value]) => value !== undefined)\n .sort(([a], [b]) => a.localeCompare(b))\n .reduce((acc, [key, value]) => ({ ...acc, [key]: value }), {});\n\n return JSON.stringify(filtered);\n },\n\n /**\n * Sanitizes a context by removing sensitive information.\n *\n * @param context - Context to sanitize\n * @param sensitiveFields - Fields to remove (default: ['userEmail'])\n * @returns Sanitized context\n */\n sanitizeContext(\n context: FeatureFlagContext,\n sensitiveFields: string[] = ['userEmail']\n ): FeatureFlagContext {\n const sanitized = { ...context };\n\n // Deep copy custom object if it exists\n if (context.custom) {\n sanitized.custom = { ...context.custom };\n }\n\n for (const field of sensitiveFields) {\n if (field in sanitized) {\n delete (sanitized as Record<string, unknown>)[field];\n }\n if (sanitized.custom && field in sanitized.custom) {\n delete sanitized.custom[field];\n }\n }\n\n return sanitized;\n },\n} as const;\n\n/**\n * Utility for creating feature flag context for backend applications.\n *\n * @param params - Context parameters\n * @returns Backend-optimized feature flag context\n */\nexport function createBackendContext(params: {\n userId?: string;\n userEmail?: string;\n environment: 'development' | 'staging' | 'production';\n userRole?: string;\n platform?: 'api' | 'worker' | 'cron';\n country?: string;\n version?: string;\n custom?: Record<string, unknown>;\n}): {\n environment: 'development' | 'staging' | 'production';\n userId?: string;\n userEmail?: string;\n userRole?: string;\n platform: 'api' | 'worker' | 'cron';\n country?: string;\n version?: string;\n custom?: Record<string, unknown>;\n} {\n return {\n environment: params.environment,\n userId: params.userId,\n userEmail: params.userEmail,\n userRole: params.userRole,\n platform: params.platform ?? 'api',\n country: params.country,\n version: params.version,\n custom: params.custom,\n };\n}\n\n/**\n * Utility for creating feature flag context for frontend applications.\n *\n * @param params - Context parameters\n * @returns Frontend-optimized feature flag context\n */\nexport function createFrontendContext(params: {\n userId?: string;\n userEmail?: string;\n environment: 'development' | 'staging' | 'production';\n userRole?: string;\n platform?: 'web' | 'mobile' | 'desktop';\n country?: string;\n version?: string;\n custom?: Record<string, unknown>;\n}): {\n environment: 'development' | 'staging' | 'production';\n userId?: string;\n userEmail?: string;\n userRole?: string;\n platform: 'web' | 'mobile' | 'desktop';\n country?: string;\n version?: string;\n custom?: Record<string, unknown>;\n} {\n return {\n environment: params.environment,\n userId: params.userId,\n userEmail: params.userEmail,\n userRole: params.userRole,\n platform: params.platform ?? 'web',\n country: params.country,\n version: params.version,\n custom: params.custom,\n };\n}\n","/**\n * Feature Flag Condition Utilities\n *\n * Utilities for evaluating feature flag conditions and rules.\n *\n * @fileoverview Condition evaluation utilities\n * @version 1.0.0\n */\n\nimport type { FeatureFlagCondition } from '@plyaz/types';\nimport { ERROR_CODES } from '@plyaz/types';\nimport { CorePackageError } from '@plyaz/errors';\n\n/**\n * Evaluates condition operator against context value.\n *\n * @param condition - The condition to evaluate\n * @param contextValue - The context value to check against\n * @returns true if the condition matches\n */\nexport function evaluateConditionOperator(\n condition: FeatureFlagCondition,\n contextValue: unknown\n): boolean {\n const { operator } = condition;\n\n if (isEqualityOperator(operator)) {\n return evaluateEqualityOperator(operator, contextValue, condition.value);\n }\n\n if (isStringOperator(operator)) {\n return evaluateStringOperator(operator, contextValue, condition.value);\n }\n\n if (isArrayOperator(operator)) {\n return evaluateArrayOperator(operator, condition.value, contextValue);\n }\n\n if (isNumericOperator(operator)) {\n return evaluateNumericOperator(operator, contextValue, condition.value);\n }\n\n return false;\n}\n\n/**\n * Checks if operator is equality-based.\n *\n * @param operator - The operator to check\n * @returns true if equality operator\n */\nexport function isEqualityOperator(operator: string): boolean {\n return operator === 'equals' || operator === 'not_equals';\n}\n\n/**\n * Checks if operator is string-based.\n *\n * @param operator - The operator to check\n * @returns true if string operator\n */\nexport function isStringOperator(operator: string): boolean {\n return operator === 'contains' || operator === 'not_contains';\n}\n\n/**\n * Checks if operator is array-based.\n *\n * @param operator - The operator to check\n * @returns true if array operator\n */\nexport function isArrayOperator(operator: string): boolean {\n return operator === 'in' || operator === 'not_in';\n}\n\n/**\n * Checks if operator is numeric-based.\n *\n * @param operator - The operator to check\n * @returns true if numeric operator\n */\nexport function isNumericOperator(operator: string): boolean {\n return operator === 'greater_than' || operator === 'less_than';\n}\n\n/**\n * Evaluates equality operators.\n *\n * @param operator - equals or not_equals\n * @param contextValue - Value from context\n * @param conditionValue - Value from condition\n * @returns Evaluation result\n */\nexport function evaluateEqualityOperator(\n operator: string,\n contextValue: unknown,\n conditionValue: unknown\n): boolean {\n const isEqual = contextValue === conditionValue;\n return operator === 'equals' ? isEqual : !isEqual;\n}\n\n/**\n * Evaluates string operators.\n *\n * @param operator - contains or not_contains\n * @param contextValue - Value from context\n * @param conditionValue - Value from condition\n * @returns Evaluation result\n */\nexport function evaluateStringOperator(\n operator: string,\n contextValue: unknown,\n conditionValue: unknown\n): boolean {\n // Handle string contains\n if (typeof contextValue === 'string' && typeof conditionValue === 'string') {\n const contains = contextValue.includes(conditionValue);\n return operator === 'contains' ? contains : !contains;\n }\n\n // Handle array contains\n if (Array.isArray(contextValue) && typeof conditionValue === 'string') {\n const contains = contextValue.includes(conditionValue);\n return operator === 'contains' ? contains : !contains;\n }\n\n // For not_contains, if neither string nor array match, return true\n return operator === 'not_contains';\n}\n\n/**\n * Evaluates array operators.\n *\n * @param operator - in or not_in\n * @param conditionValue - Array value from condition\n * @param contextValue - Value from context\n * @returns Evaluation result\n */\nexport function evaluateArrayOperator(\n operator: string,\n conditionValue: unknown,\n contextValue: unknown\n): boolean {\n if (!Array.isArray(conditionValue)) {\n // For not_in operator, if condition value is not an array, return true\n return operator === 'not_in';\n }\n\n const isIncluded = conditionValue.includes(contextValue);\n return operator === 'in' ? isIncluded : !isIncluded;\n}\n\n/**\n * Evaluates numeric operators.\n *\n * @param operator - greater_than or less_than\n * @param contextValue - Value from context\n * @param conditionValue - Value from condition\n * @returns Evaluation result\n */\nfunction compareValues<T>(operator: string, left: T, right: T): boolean {\n switch (operator) {\n case 'greater_than':\n return left > right;\n case 'less_than':\n return left < right;\n default:\n return false;\n }\n}\n\nexport function evaluateNumericOperator(\n operator: string,\n contextValue: unknown,\n conditionValue: unknown\n): boolean {\n // Try numeric comparison first\n const contextNum = Number(contextValue);\n const conditionNum = Number(conditionValue);\n\n if (!isNaN(contextNum) && !isNaN(conditionNum)) {\n return compareValues(operator, contextNum, conditionNum);\n }\n\n // Fall back to string comparison for non-numeric values\n if (typeof contextValue === 'string' && typeof conditionValue === 'string') {\n return compareValues(operator, contextValue, conditionValue);\n }\n\n return false;\n}\n\n/**\n * Condition evaluation utilities.\n */\nexport const ConditionUtils = {\n /**\n * Evaluates multiple conditions with AND logic.\n *\n * @param conditions - Array of conditions\n * @param contextValue - Context value getter function\n * @returns true if all conditions match\n */\n evaluateConditionsAnd: (\n conditions: FeatureFlagCondition[],\n contextValue: (field: string) => unknown\n ): boolean => {\n if (conditions.length === 0) return true;\n\n return conditions.every(condition => {\n const value = contextValue(condition.field);\n if (value === undefined) return false;\n return evaluateConditionOperator(condition, value);\n });\n },\n\n /**\n * Evaluates multiple conditions with OR logic.\n *\n * @param conditions - Array of conditions\n * @param contextValue - Context value getter function\n * @returns true if any condition matches\n */\n evaluateConditionsOr: (\n conditions: FeatureFlagCondition[],\n contextValue: (field: string) => unknown\n ): boolean => {\n if (conditions.length === 0) return true;\n\n return conditions.some(condition => {\n const value = contextValue(condition.field);\n if (value === undefined) return false;\n return evaluateConditionOperator(condition, value);\n });\n },\n\n /**\n * Validates a condition structure.\n *\n * @param condition - Condition to validate\n * @returns Validation result\n */\n validateCondition: (\n condition: Partial<FeatureFlagCondition>\n ): {\n isValid: boolean;\n errors: string[];\n } => {\n const errors: string[] = [];\n\n if (!condition.field) {\n errors.push('Field is required');\n }\n\n if (!condition.operator) {\n errors.push('Operator is required');\n } else {\n const validOperators = [\n 'equals',\n 'not_equals',\n 'contains',\n 'not_contains',\n 'in',\n 'not_in',\n 'greater_than',\n 'less_than',\n ];\n if (!validOperators.includes(condition.operator)) {\n errors.push(`Invalid operator: ${condition.operator}`);\n }\n }\n\n if (condition.value === undefined) {\n errors.push('Value is required');\n }\n\n return {\n isValid: errors.length === 0,\n errors,\n };\n },\n\n /**\n * Creates a condition object with validation.\n *\n * @param field - Context field to evaluate\n * @param operator - Comparison operator\n * @param value - Value to compare against\n * @returns Valid condition object\n */\n createCondition: (\n field: string,\n operator: FeatureFlagCondition['operator'],\n value: FeatureFlagCondition['value']\n ): FeatureFlagCondition => {\n const condition = { field, operator, value } as FeatureFlagCondition;\n const validation = ConditionUtils.validateCondition(condition);\n\n if (!validation.isValid) {\n throw new CorePackageError(\n `Invalid condition: ${validation.errors.join(', ')}`,\n ERROR_CODES.VALIDATION_ERROR\n );\n }\n\n return condition;\n },\n} as const;\n","/**\n * Feature Flag Evaluation Engine\n *\n * Core engine for evaluating feature flags with rules, targeting, and rollouts.\n * This will be moved to @plyaz/core when the package structure is finalized.\n *\n * @fileoverview Core feature flag evaluation engine\n * @version 1.0.0\n */\n\nimport type {\n FeatureFlag,\n FeatureFlagRule,\n FeatureFlagCondition,\n FeatureFlagContext,\n FeatureFlagEvaluation,\n FeatureFlagValue,\n} from '@plyaz/types';\nimport { PackageLogger } from '@plyaz/logger';\nimport { isInRollout, createRolloutIdentifier, isTruthy } from '@utils/common';\nimport { ContextUtils, evaluateConditionOperator } from '@utils/featureFlags';\n\n/**\n * Core feature flag evaluation engine.\n * Handles all the logic for evaluating feature flags including rules, targeting, and rollouts.\n *\n * @class FeatureFlagEngine\n *\n * @example\n * ```typescript\n * const engine = new FeatureFlagEngine(defaultFlags, true);\n * engine.setFlags(flagsFromDatabase);\n * engine.setRules(rulesFromDatabase);\n *\n * const evaluation = engine.evaluate('AUTH_GOOGLE', context);\n * console.log(evaluation.isEnabled); // true/false\n * ```\n */\nexport class FeatureFlagEngine<FeatureFlagKey extends string> {\n /** Logger instance */\n private readonly logger = new PackageLogger({\n packageName: 'core',\n service: 'FeatureFlagEngine',\n });\n\n /** Storage for active feature flags */\n private flags: Map<FeatureFlagKey, FeatureFlag<FeatureFlagKey>> = new Map();\n /** Storage for targeting rules, organized by flag key */\n private rules: Map<FeatureFlagKey, FeatureFlagRule<FeatureFlagKey>[]> = new Map();\n /** Storage for manual overrides (useful for testing) */\n private overrides: Map<FeatureFlagKey, FeatureFlagValue> = new Map();\n\n /**\n * Creates a new feature flag evaluation engine.\n *\n * @param defaults - Default flag values to fall back to\n * @param isLoggingEnabled - Whether to enable debug logging\n */\n constructor(\n private defaults: Record<FeatureFlagKey, FeatureFlagValue>,\n private isLoggingEnabled = false\n ) {}\n\n /**\n * Sets the active feature flags for evaluation.\n * Clears existing flags and rules before setting new ones.\n *\n * @param flags - Array of feature flags to activate\n */\n setFlags(flags: FeatureFlag<FeatureFlagKey>[]): void {\n this.flags.clear();\n this.rules.clear();\n\n for (const flag of flags) {\n this.flags.set(flag.key, flag);\n }\n\n this.log('Loaded flags:', this.flags.size);\n }\n\n /**\n * Sets the targeting rules for feature flags.\n * Rules are automatically sorted by priority (higher numbers first).\n *\n * @param rules - Array of feature flag rules\n */\n setRules(rules: FeatureFlagRule<FeatureFlagKey>[]): void {\n this.rules.clear();\n\n for (const rule of rules) {\n const existing = this.rules.get(rule.flagKey) ?? [];\n existing.push(rule);\n // Sort by priority (higher priority first)\n existing.sort((a, b) => b.priority - a.priority);\n this.rules.set(rule.flagKey, existing);\n }\n\n this.log('Loaded rules:', rules.length);\n }\n\n /**\n * Gets all targeting rules.\n *\n * @returns Array of all feature flag rules\n */\n getRules(): FeatureFlagRule<FeatureFlagKey>[] {\n const allRules: FeatureFlagRule<FeatureFlagKey>[] = [];\n for (const rules of this.rules.values()) {\n allRules.push(...rules);\n }\n return allRules;\n }\n\n /**\n * Sets a manual override for a specific flag.\n * Overrides take precedence over all other evaluation logic.\n *\n * @param key - The flag key to override\n * @param value - The value to force for this flag\n */\n setOverride(key: FeatureFlagKey, value: FeatureFlagValue): void {\n this.overrides.set(key, value);\n this.log('Override set:', key, value);\n }\n\n /**\n * Removes a manual override for a specific flag.\n *\n * @param key - The flag key to remove override for\n */\n removeOverride(key: FeatureFlagKey): void {\n this.overrides.delete(key);\n this.log('Override removed:', key);\n }\n\n /**\n * Updates the default values for feature flags.\n * This is useful when the FEATURES constant is updated at runtime.\n *\n * @param newDefaults - New default values\n */\n updateDefaults(newDefaults: Record<FeatureFlagKey, FeatureFlagValue>): void {\n this.defaults = newDefaults;\n this.log('Updated default feature values');\n }\n\n /**\n * Clears all manual overrides.\n */\n clearOverrides(): void {\n this.overrides.clear();\n this.log('All overrides cleared');\n }\n\n /**\n * Gets all current flags.\n *\n * @returns Array of all feature flags\n */\n getFlags(): FeatureFlag<FeatureFlagKey>[] {\n return Array.from(this.flags.values());\n }\n\n /**\n * Evaluates a feature flag and returns the complete evaluation result.\n *\n * @param key - The feature flag key to evaluate\n * @param context - Optional context for targeting\n * @returns Complete evaluation result with value and metadata\n */\n evaluate(\n key: FeatureFlagKey,\n context?: FeatureFlagContext\n ): FeatureFlagEvaluation<FeatureFlagKey> {\n const evaluatedAt = new Date();\n\n // Check for override first\n const overrideResult = this.checkOverride(key, evaluatedAt);\n if (overrideResult) return overrideResult;\n\n // Get flag from storage\n const flag = this.flags.get(key);\n if (!flag) {\n return this.createDefaultEvaluation(key, evaluatedAt);\n }\n\n // Check if flag is disabled\n if (!flag.isEnabled) {\n return this.createDisabledEvaluation(key, evaluatedAt);\n }\n\n // Check environment\n if (!this.isEnvironmentMatch(flag, context)) {\n return this.createDefaultEvaluation(key, evaluatedAt);\n }\n\n // Evaluate rules\n const ruleResult = this.evaluateRules(key, context, evaluatedAt);\n if (ruleResult) return ruleResult;\n\n // Check flag-level rollout\n if (!this.isInFlagRollout(key, flag, context)) {\n return this.createDefaultEvaluation(key, evaluatedAt);\n }\n\n // Return flag value\n return this.createFlagEvaluation(key, flag, evaluatedAt);\n }\n\n /**\n * Checks for manual override and returns evaluation if found.\n *\n * @private\n * @param key - The feature flag key\n * @param evaluatedAt - Evaluation timestamp\n * @returns Evaluation result or null if no override\n */\n private checkOverride(\n key: FeatureFlagKey,\n evaluatedAt: Date\n ): FeatureFlagEvaluation<FeatureFlagKey> | null {\n if (!this.overrides.has(key)) return null;\n\n const value = this.overrides.get(key)!;\n return {\n flagKey: key,\n value,\n isEnabled: isTruthy(value),\n reason: 'override',\n evaluatedAt,\n } satisfies FeatureFlagEvaluation<FeatureFlagKey>;\n }\n\n /**\n * Creates default evaluation result.\n *\n * @private\n * @param key - The feature flag key\n * @param evaluatedAt - Evaluation timestamp\n * @returns Default evaluation result\n */\n private createDefaultEvaluation(\n key: FeatureFlagKey,\n evaluatedAt: Date\n ): FeatureFlagEvaluation<FeatureFlagKey> {\n const defaultValue = this.defaults[key] ?? false;\n return {\n flagKey: key,\n value: defaultValue,\n isEnabled: isTruthy(defaultValue),\n reason: 'default',\n evaluatedAt,\n } satisfies FeatureFlagEvaluation<FeatureFlagKey>;\n }\n\n /**\n * Creates disabled evaluation result.\n *\n * @private\n * @param key - The feature flag key\n * @param evaluatedAt - Evaluation timestamp\n * @returns Disabled evaluation result\n */\n private createDisabledEvaluation(\n key: FeatureFlagKey,\n evaluatedAt: Date\n ): FeatureFlagEvaluation<FeatureFlagKey> {\n return {\n flagKey: key,\n value: false,\n isEnabled: false,\n reason: 'disabled',\n evaluatedAt,\n } satisfies FeatureFlagEvaluation<FeatureFlagKey>;\n }\n\n /**\n * Creates flag evaluation result.\n *\n * @private\n * @param key - The feature flag key\n * @param flag - The feature flag\n * @param evaluatedAt - Evaluation timestamp\n * @returns Flag evaluation result\n */\n private createFlagEvaluation(\n key: FeatureFlagKey,\n flag: FeatureFlag<FeatureFlagKey>,\n evaluatedAt: Date\n ): FeatureFlagEvaluation<FeatureFlagKey> {\n return {\n flagKey: key,\n value: flag.value,\n isEnabled: isTruthy(flag.value),\n reason: 'default',\n evaluatedAt,\n } satisfies FeatureFlagEvaluation<FeatureFlagKey>;\n }\n\n /**\n * Checks if environment matches for flag evaluation.\n *\n * @private\n * @param flag - The feature flag\n * @param context - Evaluation context\n * @returns true if environment matches\n */\n private isEnvironmentMatch(\n flag: FeatureFlag<FeatureFlagKey>,\n context?: FeatureFlagContext\n ): boolean {\n return flag.environment === 'all' || context?.environment === flag.environment;\n }\n\n /**\n * Checks if user is in flag-level rollout.\n *\n * @private\n * @param key - The feature flag key\n * @param flag - The feature flag\n * @param context - Evaluation context\n * @returns true if user is in rollout\n */\n private isInFlagRollout(\n key: FeatureFlagKey,\n flag: FeatureFlag<FeatureFlagKey>,\n context?: FeatureFlagContext\n ): boolean {\n if (flag.rolloutPercentage === undefined) return true;\n const identifier = createRolloutIdentifier(key, context?.userId);\n return isInRollout(identifier, flag.rolloutPercentage);\n }\n\n /**\n * Evaluates all rules for a flag.\n *\n * @private\n * @param key - The feature flag key\n * @param context - Evaluation context\n * @param evaluatedAt - Evaluation timestamp\n * @returns Rule evaluation result or null if no match\n */\n private evaluateRules(\n key: FeatureFlagKey,\n context?: FeatureFlagContext,\n evaluatedAt?: Date\n ): FeatureFlagEvaluation<FeatureFlagKey> | null {\n const rules = this.rules.get(key) ?? [];\n\n for (const rule of rules) {\n if (!rule.isEnabled) continue;\n\n const ruleResult = this.evaluateMatchingRule(key, rule, context, evaluatedAt);\n if (ruleResult) return ruleResult;\n }\n\n return null;\n }\n\n /**\n * Evaluates a single matching rule and returns result if it passes.\n *\n * @private\n * @param key - The feature flag key\n * @param rule - The rule to evaluate\n * @param context - Evaluation context\n * @param evaluatedAt - Evaluation timestamp\n * @returns Rule evaluation result or null if no match\n */\n private evaluateMatchingRule(\n key: FeatureFlagKey,\n rule: FeatureFlagRule<FeatureFlagKey>,\n context?: FeatureFlagContext,\n evaluatedAt?: Date\n ): FeatureFlagEvaluation<FeatureFlagKey> | null {\n if (!this.evaluateRule(rule, context)) return null;\n\n const isInRuleRollout =\n rule.rolloutPercentage === undefined ||\n isInRollout(createRolloutIdentifier(key, context?.userId), rule.rolloutPercentage);\n\n if (!isInRuleRollout) return null;\n\n return {\n flagKey: key,\n value: rule.value,\n isEnabled: isTruthy(rule.value),\n reason: 'rule_match',\n matchedRuleId: rule.id,\n evaluatedAt: evaluatedAt ?? new Date(),\n } satisfies FeatureFlagEvaluation<FeatureFlagKey>;\n }\n\n /**\n * Evaluates a single rule against the provided context.\n * All conditions in the rule must match (AND logic).\n *\n * @private\n * @param rule - The rule to evaluate\n * @param context - Context to evaluate against\n * @returns true if the rule matches the context\n */\n private evaluateRule(\n rule: FeatureFlagRule<FeatureFlagKey>,\n context?: FeatureFlagContext\n ): boolean {\n if (rule.conditions.length === 0) return true;\n\n // All conditions must match (AND logic)\n return rule.conditions.every(condition => this.evaluateCondition(condition, context));\n }\n\n /**\n * Evaluates a single condition against the provided context.\n *\n * @private\n * @param condition - The condition to evaluate\n * @param context - Context to evaluate against\n * @returns true if the condition matches\n */\n private evaluateCondition(\n condition: FeatureFlagCondition,\n context?: FeatureFlagContext\n ): boolean {\n if (!context) return false;\n\n const contextValue = ContextUtils.getContextValue(condition.field, context);\n if (contextValue === undefined) return false;\n\n return evaluateConditionOperator(condition, contextValue);\n }\n\n /**\n * Logs debug information if logging is enabled.\n *\n * @private\n * @param args - Arguments to log\n */\n private log(...args: unknown[]): void {\n if (this.isLoggingEnabled) {\n this.logger.debug(args.map(arg => String(arg)).join(' '));\n }\n }\n}\n","/**\n * Feature Flag Provider - Core Implementation\n *\n * Main provider class that orchestrates feature flag evaluation and management.\n * This will be moved to @plyaz/core when the package structure is finalized.\n *\n * @fileoverview Core feature flag provider implementation\n * @version 1.0.0\n */\n\nimport type {\n FeatureFlagProvider as IFeatureFlagProvider,\n FeatureFlagConfig,\n FeatureFlagContext,\n FeatureFlagEvaluation,\n FeatureFlagValue,\n FetchFeatureFlagDataResponse,\n FeatureFlag,\n FeatureFlagRule,\n CreateFlagRequest,\n} from '@plyaz/types';\nimport { FeatureFlagEngine } from '@engine/featureFlags/engine';\nimport { CacheManager } from '@base/cache/index';\nimport { TIME_CONSTANTS } from '@plyaz/config';\n\n/**\n * Subscription callback function type\n */\nexport type SubscriptionCallback = () => void;\n\n/**\n * Core feature flag provider that implements the main business logic.\n * This class orchestrates between the evaluation engine, caching, and data providers.\n *\n * @class FeatureFlagProvider\n * @implements {IFeatureFlagProvider}\n *\n * @example\n * ```typescript\n * const provider = new MemoryFeatureFlagProvider<MyFeatureFlags>(config, FEATURES);\n * await provider.initialize();\n *\n * const isEnabled = await provider.isEnabled('AUTH_GOOGLE', context);\n * const value = await provider.getValue('ROLLOUT_PERCENTAGE', context);\n * ```\n */\nexport abstract class FeatureFlagProvider<FeatureFlagKey extends string>\n implements IFeatureFlagProvider<FeatureFlagKey>\n{\n protected engine: FeatureFlagEngine<FeatureFlagKey>;\n protected cacheManager: CacheManager;\n protected subscribers = new Set<SubscriptionCallback>();\n protected refreshTimer?: ReturnType<typeof setInterval>;\n protected isInitialized = false;\n protected features: Record<FeatureFlagKey, FeatureFlagValue>;\n protected initializePromise?: Promise<void>;\n\n /**\n * Creates a new feature flag provider.\n *\n * @param config - Provider configuration\n * @param features - Record of feature flag keys to their default values\n */\n constructor(\n protected config: FeatureFlagConfig<FeatureFlagKey>,\n features: Record<FeatureFlagKey, FeatureFlagValue>\n ) {\n this.features = features;\n // Initialize engine with defaults from FEATURES constant\n this.engine = new FeatureFlagEngine<FeatureFlagKey>(features, config.isLoggingEnabled ?? false);\n\n // Initialize cache manager\n this.cacheManager = new CacheManager({\n isEnabled: config.isCacheEnabled,\n ttl: config.cacheTtl,\n strategy: 'memory', // Default to memory, can be overridden\n });\n\n this.setupRefreshTimer();\n }\n\n /**\n * Abstract method to fetch flags and rules from the provider's data source.\n * Must be implemented by concrete provider classes.\n *\n * @protected\n * @abstract\n * @returns Promise resolving to flags and rules\n */\n protected abstract fetchData(): Promise<FetchFeatureFlagDataResponse<FeatureFlagKey>>;\n\n /**\n * Initializes the provider by loading initial data.\n *\n * @returns Promise that resolves when initialization is complete\n */\n async initialize(): Promise<void> {\n if (this.isInitialized) {\n return;\n }\n\n // If already initializing, wait for that to complete\n if (this.initializePromise) {\n return this.initializePromise;\n }\n\n // Create and store the initialization promise\n this.initializePromise = this.doInitialize();\n return this.initializePromise;\n }\n\n /**\n * Performs the actual initialization work.\n *\n * @private\n * @returns Promise that resolves when initialization is complete\n */\n private async doInitialize(): Promise<void> {\n try {\n await this.refresh();\n this.isInitialized = true;\n this.log('Provider initialized successfully');\n } catch (error) {\n this.log('Failed to initialize provider:', error);\n // Clear the promise so initialization can be retried\n this.initializePromise = undefined;\n throw error;\n }\n }\n\n /**\n * Gets a feature flag evaluation for the specified key and context.\n *\n * @param key - The feature flag key\n * @param context - Optional context for evaluation\n * @returns Promise resolving to the flag evaluation\n */\n async getFlag(\n key: FeatureFlagKey,\n context?: FeatureFlagContext\n ): Promise<FeatureFlagEvaluation<FeatureFlagKey>> {\n if (!this.isInitialized) {\n await this.initialize();\n }\n\n // Check cache first if enabled\n if (this.config.isCacheEnabled) {\n const cacheKey = this.generateCacheKey(key, context);\n const cached = await this.cacheManager.get<FeatureFlagEvaluation<FeatureFlagKey>>(cacheKey);\n if (cached) {\n return cached;\n }\n\n // Evaluate and cache the result\n const evaluation = this.engine.evaluate(key, context);\n await this.cacheManager.set(cacheKey, evaluation);\n return evaluation;\n }\n\n // Direct evaluation without caching\n return this.engine.evaluate(key, context);\n }\n\n /**\n * Checks if a feature flag is enabled.\n *\n * @param key - The feature flag key\n * @param context - Optional context for evaluation\n * @returns Promise resolving to boolean indicating if flag is enabled\n */\n async isEnabled(key: FeatureFlagKey, context?: FeatureFlagContext): Promise<boolean> {\n const evaluation = await this.getFlag(key, context);\n return evaluation.isEnabled;\n }\n\n /**\n * Gets the value of a feature flag.\n *\n * @template T - The expected type of the flag value\n * @param key - The feature flag key\n * @param context - Optional context for evaluation\n * @returns Promise resolving to the flag value\n */\n async getValue<T = FeatureFlagValue>(\n key: FeatureFlagKey,\n context?: FeatureFlagContext\n ): Promise<T> {\n const evaluation = await this.getFlag(key, context);\n return evaluation.value as T;\n }\n\n /**\n * Gets all feature flag evaluations for the given context.\n *\n * @param context - Optional context for evaluation\n * @returns Promise resolving to record of flag evaluations\n */\n async getAllFlags(\n context?: FeatureFlagContext\n ): Promise<Record<string, FeatureFlagEvaluation<FeatureFlagKey>>> {\n if (!this.isInitialized) {\n await this.initialize();\n }\n\n const results: Record<string, FeatureFlagEvaluation<FeatureFlagKey>> = {};\n\n // First, evaluate all default flags from FEATURES\n for (const key of Object.keys(this.features) as FeatureFlagKey[]) {\n results[key] = await this.getFlag(key, context);\n }\n\n // Then, evaluate any additional flags from the engine\n const engineFlags = this.engine.getFlags();\n for (const flag of engineFlags) {\n if (!(flag.key in results)) {\n results[flag.key] = await this.getFlag(flag.key, context);\n }\n }\n\n return results;\n }\n\n /**\n * Refreshes the provider by fetching latest data from the source.\n *\n * @returns Promise that resolves when refresh is complete\n */\n async refresh(): Promise<void> {\n try {\n const { flags, rules } = await this.fetchData();\n\n this.engine.setFlags(flags);\n this.engine.setRules(rules);\n\n // Clear cache after refresh\n await this.cacheManager.clear();\n\n // Notify subscribers\n this.notifySubscribers();\n\n this.log(`Refreshed with ${flags.length} flags and ${rules.length} rules`);\n } catch (error) {\n this.log('Failed to refresh provider:', error);\n throw error;\n }\n }\n\n /**\n * Subscribes to provider updates.\n *\n * @param callback - Function to call when provider updates\n * @returns Unsubscribe function\n */\n subscribe(callback: SubscriptionCallback): () => void {\n this.subscribers.add(callback);\n return () => {\n this.subscribers.delete(callback);\n };\n }\n\n /**\n * Sets an override for a specific flag key.\n *\n * @param key - The flag key to override\n * @param value - The value to force for this flag\n */\n setOverride(key: FeatureFlagKey, value: FeatureFlagValue): void {\n this.engine.setOverride(key, value);\n void this.cacheManager.clear(); // Clear cache to ensure overrides take effect\n this.notifySubscribers();\n }\n\n /**\n * Removes an override for a specific flag key.\n *\n * @param key - The flag key to remove override for\n */\n removeOverride(key: FeatureFlagKey): void {\n this.engine.removeOverride(key);\n void this.cacheManager.clear();\n this.notifySubscribers();\n }\n\n /**\n * Clears all overrides.\n */\n clearOverrides(): void {\n this.engine.clearOverrides();\n void this.cacheManager.clear();\n this.notifySubscribers();\n }\n\n /**\n * Disposes of the provider, cleaning up resources.\n */\n dispose(): void {\n if (this.refreshTimer) {\n clearInterval(this.refreshTimer);\n this.refreshTimer = undefined;\n }\n\n this.subscribers.clear();\n void this.cacheManager.clear();\n this.isInitialized = false;\n\n this.log('Provider disposed');\n }\n\n // ─────────────────────────────────────────────────────────────────────────\n // Flag Management Operations\n // Each provider implements these based on its storage backend:\n // - Memory: in-memory storage (ephemeral)\n // - File: JSON/YAML file storage\n // - Redis: Redis storage\n // - API: External API calls\n // - Database: Database storage\n // ─────────────────────────────────────────────────────────────────────────\n\n /**\n * Creates a new feature flag.\n * Abstract - each provider implements based on its storage backend.\n *\n * @param data - Flag creation data\n * @returns The created feature flag\n */\n abstract createFlag(\n data: CreateFlagRequest<FeatureFlagKey>\n ): Promise<FeatureFlag<FeatureFlagKey>>;\n\n /**\n * Updates an existing feature flag.\n * Abstract - each provider implements based on its storage backend.\n *\n * @param key - Flag key to update\n * @param data - Partial flag data to update\n * @returns The updated feature flag\n */\n abstract updateFlag(\n key: FeatureFlagKey,\n data: Partial<CreateFlagRequest<FeatureFlagKey>>\n ): Promise<FeatureFlag<FeatureFlagKey>>;\n\n /**\n * Deletes a feature flag.\n * Abstract - each provider implements based on its storage backend.\n *\n * @param key - Flag key to delete\n */\n abstract deleteFlag(key: FeatureFlagKey): Promise<void>;\n\n /**\n * Gets all rules for a specific flag.\n * Abstract - each provider implements based on its storage backend.\n *\n * @param key - Flag key to get rules for\n * @returns Array of rules for the flag\n */\n abstract getRules(key: FeatureFlagKey): Promise<FeatureFlagRule<FeatureFlagKey>[]>;\n\n /**\n * Gets all enabled rules across all flags.\n * Abstract - each provider implements based on its storage backend.\n *\n * @returns Array of all enabled rules\n */\n abstract getAllRules(): Promise<FeatureFlagRule<FeatureFlagKey>[]>;\n\n // ─────────────────────────────────────────────────────────────────────────\n // Optional Extensions\n // ─────────────────────────────────────────────────────────────────────────\n\n /**\n * Optional method to sync features at runtime.\n * This is useful for providers that can update their features dynamically.\n *\n * @param newFeatures - New features to sync\n * @returns Promise that resolves when sync is complete\n */\n syncFeatures?(newFeatures: Record<FeatureFlagKey, FeatureFlagValue>): Promise<void>;\n\n /**\n * Generates a cache key for flag evaluation.\n *\n * @protected\n * @param key - Feature flag key\n * @param context - Evaluation context\n * @returns Cache key string\n */\n protected generateCacheKey(key: FeatureFlagKey, context?: FeatureFlagContext): string {\n if (!context) {\n return key;\n }\n\n // Create a stable cache key from context\n const contextKey = JSON.stringify({\n userId: context.userId,\n userRole: context.userRole,\n environment: context.environment,\n platform: context.platform,\n country: context.country,\n version: context.version,\n });\n\n return `${key}:${contextKey}`;\n }\n\n /**\n * Sets up the automatic refresh timer if configured.\n *\n * @protected\n */\n protected setupRefreshTimer(): void {\n if (this.config.refreshInterval > 0) {\n this.refreshTimer = setInterval(() => {\n void this.refresh().catch(error => {\n this.log('Auto-refresh failed:', error);\n });\n }, this.config.refreshInterval * TIME_CONSTANTS.MILLISECONDS_PER_SECOND);\n }\n }\n\n /**\n * Notifies all subscribers of provider updates.\n *\n * @protected\n */\n protected notifySubscribers(): void {\n for (const callback of Array.from(this.subscribers)) {\n try {\n callback();\n } catch (error) {\n this.log('Subscriber callback error:', error);\n }\n }\n }\n\n /**\n * Logs a message if logging is enabled.\n *\n * @protected\n * @param args - Arguments to log\n */\n protected log(...args: unknown[]): void {\n if (this.config.isLoggingEnabled) {\n console.log('[FeatureFlagProvider]', ...args);\n }\n }\n}\n","/**\n * API Feature Flag Provider\n *\n * Provider adapter that uses @plyaz/api services with an injected API client\n * to fetch feature flags from a remote API. This provider extends the base\n * FeatureFlagProvider and implements fetchData() using the API services.\n *\n * @fileoverview API provider adapter for feature flags\n * @version 2.0.0\n */\n\nimport type {\n FeatureFlag,\n FeatureFlagRule,\n FeatureFlagValue,\n CreateFlagRequest,\n} from '@plyaz/types';\nimport { ERROR_CODES } from '@plyaz/types';\nimport { BaseError, CorePackageError } from '@plyaz/errors';\nimport { FeatureFlagProvider } from '../provider';\n\n// Import API services from @plyaz/api\nimport {\n createFeatureFlag as apiCreateFlag,\n updateFeatureFlag as apiUpdateFlag,\n deleteFeatureFlag as apiDeleteFlag,\n evaluateAllFeatureFlags as apiEvaluateAllFlags,\n fetchFeatureFlagRules as apiFetchRules,\n} from '@plyaz/api/frontend';\nimport type { ServiceOptions } from '@plyaz/types/api';\nimport type { ApiFeatureFlagConfig as _ApiFeatureFlagConfig } from '@plyaz/types/features';\n\n// API client type from ServiceOptions\ntype ApiClientType = NonNullable<ServiceOptions['apiClient']>;\n\n/**\n * API response type for fetching flags and rules\n */\ninterface ApiFetchResponse<TKey extends string> {\n flags: FeatureFlag<TKey>[];\n rules: FeatureFlagRule<TKey>[];\n}\n\n/**\n * API-based feature flag provider\n *\n * Uses @plyaz/api services with an injected API client to communicate with the backend.\n * Pass your configured API client via the config.\n *\n * @class ApiFeatureFlagProvider\n * @extends {FeatureFlagProvider}\n *\n * @example\n * ```typescript\n * // Get client from ApiClientService\n * const apiClient = ApiClientService.getClient();\n *\n * const provider = new ApiFeatureFlagProvider({\n * provider: 'api',\n * apiClient,\n * isCacheEnabled: true,\n * cacheTtl: 300,\n * }, FEATURES);\n *\n * await provider.initialize();\n * const isEnabled = await provider.isEnabled('new-feature');\n * ```\n */\nexport class ApiFeatureFlagProvider<\n FeatureFlagKey extends string,\n> extends FeatureFlagProvider<FeatureFlagKey> {\n protected readonly apiClient: ApiClientType;\n\n /**\n * Creates a new API feature flag provider.\n *\n * @param config - Provider configuration with API client\n * @param features - Record of feature flag keys to default values\n */\n constructor(\n config: _ApiFeatureFlagConfig<FeatureFlagKey>,\n features: Record<FeatureFlagKey, FeatureFlagValue>\n ) {\n super(config, features);\n\n if (!config.apiClient) {\n throw new CorePackageError(\n 'API provider requires apiClient in config',\n ERROR_CODES.CLIENT_INVALID_CONFIG\n );\n }\n\n this.apiClient = config.apiClient;\n this.validateConfig();\n }\n\n /**\n * Get service options with injected client\n */\n private getServiceOptions(): ServiceOptions {\n return { apiClient: this.apiClient };\n }\n\n /** Wrap error in CorePackageError if not already a package error */\n private wrapError(error: unknown): CorePackageError {\n // If already a package error (BaseError subclass), return as-is\n if (error instanceof BaseError) {\n return error as CorePackageError;\n }\n // Wrap other errors\n return new CorePackageError(\n `API request failed: ${error instanceof Error ? error.message : String(error)}`,\n ERROR_CODES.NETWORK_ERROR,\n { cause: error instanceof Error ? error : undefined }\n );\n }\n\n /** Transform API response to flags/rules */\n private transformResponse(data: ApiFetchResponse<FeatureFlagKey> | undefined): {\n flags: FeatureFlag<FeatureFlagKey>[];\n rules: FeatureFlagRule<FeatureFlagKey>[];\n } {\n const flags = data?.flags ?? [];\n const rules = data?.rules ?? [];\n this.log(`Fetched ${flags.length} flags and ${rules.length} rules from API`);\n return { flags, rules };\n }\n\n /**\n * Fetches flags and rules from the API endpoint using @plyaz/api services.\n *\n * @protected\n * @returns Promise resolving to flags and rules data\n */\n protected async fetchData(): Promise<{\n flags: FeatureFlag<FeatureFlagKey>[];\n rules: FeatureFlagRule<FeatureFlagKey>[];\n }> {\n try {\n const apiConfig = this.config as _ApiFeatureFlagConfig<FeatureFlagKey>;\n const response = await apiEvaluateAllFlags<FeatureFlagKey>(\n { context: apiConfig.context },\n this.getServiceOptions()\n );\n\n if (!response.isSuccess) {\n throw new CorePackageError(\n `Failed to fetch feature flags: ${response.error?.message}`,\n ERROR_CODES.NETWORK_ERROR\n );\n }\n\n const data = response.data as unknown as ApiFetchResponse<FeatureFlagKey>;\n return this.transformResponse(data);\n } catch (error) {\n throw this.wrapError(error);\n }\n }\n\n /**\n * Validates the API provider configuration.\n *\n * @private\n */\n private validateConfig(): void {\n if (this.config.provider !== 'api') {\n throw new CorePackageError(\n 'API provider requires provider to be set to \"api\"',\n ERROR_CODES.CLIENT_INVALID_CONFIG\n );\n }\n\n this.log('API provider configured');\n }\n\n /**\n * Gets API provider status and configuration info.\n */\n getApiInfo(): {\n hasApiClient: boolean;\n } {\n return {\n hasApiClient: Boolean(this.apiClient),\n };\n }\n\n // ─────────────────────────────────────────────────────────────────────────\n // Flag Management Operations (using @plyaz/api services)\n // ─────────────────────────────────────────────────────────────────────────\n\n /**\n * Creates a new feature flag via API\n */\n async createFlag(data: CreateFlagRequest<FeatureFlagKey>): Promise<FeatureFlag<FeatureFlagKey>> {\n const requestData = {\n ...data,\n isEnabled: data.isEnabled ?? true,\n environment: data.environment ?? 'development',\n description: data.description ?? '',\n };\n const response = await apiCreateFlag<FeatureFlagKey>(requestData, this.getServiceOptions());\n\n if (!response.isSuccess) {\n throw new CorePackageError(\n `Failed to create flag: ${response.error?.message}`,\n ERROR_CODES.CONTEXT_OPERATION_FAILED\n );\n }\n\n await this.refresh();\n return response.data as unknown as FeatureFlag<FeatureFlagKey>;\n }\n\n /**\n * Updates a feature flag via API\n */\n async updateFlag(\n key: FeatureFlagKey,\n data: Partial<CreateFlagRequest<FeatureFlagKey>>\n ): Promise<FeatureFlag<FeatureFlagKey>> {\n const response = await apiUpdateFlag<FeatureFlagKey>({ key, data }, this.getServiceOptions());\n\n if (!response.isSuccess) {\n throw new CorePackageError(\n `Failed to update flag: ${response.error?.message}`,\n ERROR_CODES.CONTEXT_OPERATION_FAILED\n );\n }\n\n await this.refresh();\n return response.data as unknown as FeatureFlag<FeatureFlagKey>;\n }\n\n /**\n * Deletes a feature flag via API\n */\n async deleteFlag(key: FeatureFlagKey): Promise<void> {\n const response = await apiDeleteFlag<FeatureFlagKey>(key, this.getServiceOptions());\n\n if (!response.isSuccess) {\n throw new CorePackageError(\n `Failed to delete flag: ${response.error?.message}`,\n ERROR_CODES.CONTEXT_OPERATION_FAILED\n );\n }\n\n await this.refresh();\n }\n\n /**\n * Gets rules for a specific flag via API\n */\n async getRules(key: FeatureFlagKey): Promise<FeatureFlagRule<FeatureFlagKey>[]> {\n const response = await apiFetchRules<FeatureFlagKey>(key, this.getServiceOptions());\n\n if (!response.isSuccess) {\n throw new CorePackageError(\n `Failed to get rules: ${response.error?.message}`,\n ERROR_CODES.CONTEXT_OPERATION_FAILED\n );\n }\n\n return (response.data as unknown as { rules: FeatureFlagRule<FeatureFlagKey>[] })?.rules ?? [];\n }\n\n /**\n * Gets all rules via API\n * Note: This requires fetching rules for all flags individually or a dedicated endpoint\n */\n async getAllRules(): Promise<FeatureFlagRule<FeatureFlagKey>[]> {\n // For now, return the rules from the engine (populated by fetchData)\n // A dedicated API endpoint would be needed for a direct call\n return this.engine.getRules();\n }\n}\n","/**\n * Feature Flag Domain Service (Frontend)\n *\n * Frontend-specific domain service for feature flag management.\n * Implements FeatureFlagServiceInterface for clean dependency injection.\n *\n * @example\n * ```tsx\n * // With ServiceRegistry (auto-initialization)\n * await ServiceRegistry.initialize({\n * services: [{ service: FeatureFlagDomainService, config: { cacheTtl: 300 } }],\n * });\n * const service = ServiceRegistry.get<FeatureFlagServiceInterface>('featureFlags');\n *\n * // Manual creation with provider\n * const service = new FeatureFlagDomainService({\n * provider,\n * store: useFeatureFlagStore.getState(),\n * });\n * await service.fetchAndSyncAll({ userId: user.id });\n * ```\n */\n\nimport type {\n FeatureFlag,\n FeatureFlagKey,\n FeatureFlagRule,\n FeatureFlagContext,\n FeatureFlagValue,\n FeatureFlagEvaluation,\n CreateFlagRequest,\n} from '@plyaz/types';\nimport { CoreEventManager } from '../../events/CoreEventManager';\nimport { createApiClient } from '@plyaz/api/frontend';\nimport { ApiFeatureFlagProvider } from '../../domain/featureFlags/providers/api';\nimport { BaseFrontendDomainService } from '../base/BaseFrontendDomainService';\nimport { SERVICE_KEYS } from '@plyaz/types/core';\nimport type {\n CoreFrontendFeatureFlagEventType,\n CoreFeatureFlagStore,\n CoreFeatureFlagServiceConfig,\n CoreFeatureFlagServiceInitConfig,\n CoreFeatureFlagServiceInterface,\n CoreServiceCreateOptions,\n} from '@plyaz/types/core';\n\n// ─────────────────────────────────────────────────────────────────────────────\n// Constants\n// ─────────────────────────────────────────────────────────────────────────────\n\n/** Default cache TTL in seconds (5 minutes) */\nconst DEFAULT_CACHE_TTL_SECONDS = 300;\n/** Default refresh interval in milliseconds (1 minute) */\nconst DEFAULT_REFRESH_INTERVAL_MS = 60000;\n\n// ─────────────────────────────────────────────────────────────────────────────\n// Service Implementation\n// ─────────────────────────────────────────────────────────────────────────────\n\n/**\n * Feature Flag Domain Service (Frontend)\n *\n * Frontend-specific domain service for feature flag management.\n * Implements FeatureFlagServiceInterface for clean dependency injection.\n *\n * @example\n * ```tsx\n * // With ServiceRegistry (auto-initialization)\n * await ServiceRegistry.initialize({\n * services: [{ service: FeatureFlagDomainService, config: { cacheTtl: 300 } }],\n * });\n * const service = ServiceRegistry.get<FeatureFlagServiceInterface>('featureFlags');\n *\n * // Manual creation with provider\n * const service = new FeatureFlagDomainService({\n * provider,\n * store: useFeatureFlagStore.getState(),\n * });\n * await service.fetchAndSyncAll({ userId: user.id });\n * ```\n */\nexport class FrontendFeatureFlagDomainService\n extends BaseFrontendDomainService<\n CoreFeatureFlagServiceConfig,\n CoreFeatureFlagStore,\n Record<string, FeatureFlagValue>\n >\n implements CoreFeatureFlagServiceInterface\n{\n // ─────────────────────────────────────────────────────────────────────────\n // Static: ServiceRegistry Interface\n // ─────────────────────────────────────────────────────────────────────────\n\n static readonly serviceKey = SERVICE_KEYS.FEATURE_FLAGS;\n\n /** Build API client for feature flags */\n private static async buildApiClient(\n config: CoreFeatureFlagServiceInitConfig,\n options?: CoreServiceCreateOptions\n ): Promise<ReturnType<typeof createApiClient>> {\n const apiBasePath =\n config.apiBasePath ?? options?.apiClient?.options?.baseURL ?? '/feature-flags';\n return createApiClient({ ...options?.apiClient?.options, baseURL: apiBasePath });\n }\n\n /** Build feature flag provider */\n private static buildProvider(\n config: CoreFeatureFlagServiceInitConfig,\n apiClient: Awaited<ReturnType<typeof createApiClient>>\n ): ApiFeatureFlagProvider<FeatureFlagKey> {\n return new ApiFeatureFlagProvider<FeatureFlagKey>(\n {\n provider: 'api',\n apiClient,\n isCacheEnabled: true,\n cacheTtl: config.cacheTtl ?? DEFAULT_CACHE_TTL_SECONDS,\n context: config.defaultContext,\n refreshInterval: config.refreshInterval ?? DEFAULT_REFRESH_INTERVAL_MS,\n shouldFallbackToDefaults: config.shouldFallbackToDefaults ?? true,\n },\n config.featureKeys ?? {}\n );\n }\n\n /**\n * Factory method for ServiceRegistry auto-initialization.\n */\n static async create(\n config: CoreFeatureFlagServiceInitConfig,\n options?: CoreServiceCreateOptions\n ): Promise<FrontendFeatureFlagDomainService> {\n const apiClient = await FrontendFeatureFlagDomainService.buildApiClient(config, options);\n const provider = FrontendFeatureFlagDomainService.buildProvider(config, apiClient);\n await provider.initialize();\n\n return new FrontendFeatureFlagDomainService({\n enabled: config.enabled ?? true,\n provider,\n defaultContext: config.defaultContext,\n defaults: config.defaults,\n store: config.store,\n readStores: config.readStores,\n });\n }\n\n // ─────────────────────────────────────────────────────────────────────────\n // Instance\n // ─────────────────────────────────────────────────────────────────────────\n\n /**\n * Event prefix for all events emitted by this service\n * Required by BaseFrontendDomainService\n */\n protected eventPrefix = 'featureFlag';\n\n private readonly provider: CoreFeatureFlagServiceConfig['provider'];\n\n constructor(config: CoreFeatureFlagServiceConfig) {\n super({\n serviceName: 'FeatureFlagDomainService',\n supportedRuntimes: ['frontend', 'universal'],\n serviceConfig: { enabled: true, defaults: {}, ...config },\n });\n\n this.provider = config.provider;\n this._initialized = true;\n\n this.logInfo('Service initialized', { storeCount: this.connectedStoreCount });\n CoreEventManager.emit('featureFlag:provider:initialized', { providerType: 'api' });\n }\n\n // ─────────────────────────────────────────────────────────────────────────\n // IFeatureFlagService: Lifecycle\n // ─────────────────────────────────────────────────────────────────────────\n\n isAvailable(): boolean {\n return this.isServiceEnabled && this.provider !== null;\n }\n\n dispose(): void {\n this.provider?.dispose();\n CoreEventManager.emit('featureFlag:provider:disposed', {});\n this.logInfo('Service disposed');\n }\n\n // ─────────────────────────────────────────────────────────────────────────\n // IFeatureFlagService: Provider Operations\n // ─────────────────────────────────────────────────────────────────────────\n\n async refresh(): Promise<void> {\n this.assertReady();\n this.setStoresLoading(true);\n\n try {\n await this.provider.refresh();\n CoreEventManager.emit('featureFlag:provider:refreshed', {});\n\n if (this.hasConnectedStores) {\n const evaluations = await this.provider.getAllFlags(this.config.defaultContext);\n this.syncToStores(this.toValues(evaluations));\n }\n\n this.logDebug('Provider refreshed and synced');\n } finally {\n this.setStoresLoading(false);\n }\n }\n\n // ─────────────────────────────────────────────────────────────────────────\n // IFeatureFlagService: Evaluation\n // ─────────────────────────────────────────────────────────────────────────\n\n async evaluate<TKey extends string = string>(\n key: TKey,\n context?: FeatureFlagContext\n ): Promise<FeatureFlagEvaluation<TKey>> {\n this.assertReady();\n const ctx = context ?? this.config.defaultContext;\n\n CoreEventManager.emit('featureFlag:evaluating', { key, context: ctx });\n\n try {\n const result = await this.provider.getFlag(key, ctx);\n CoreEventManager.emit('featureFlag:evaluated', { key, result });\n\n if (this.hasConnectedStores) {\n this.syncToStores({ [key]: result.value });\n }\n\n return result as FeatureFlagEvaluation<TKey>;\n } catch (error) {\n CoreEventManager.emit('featureFlag:evaluate:error', { key, error });\n throw error;\n }\n }\n\n async isEnabled<TKey extends string = string>(\n key: TKey,\n context?: FeatureFlagContext\n ): Promise<boolean> {\n this.assertReady();\n return this.provider.isEnabled(key, context ?? this.config.defaultContext);\n }\n\n async getValue<T = FeatureFlagValue, TKey extends string = string>(\n key: TKey,\n context?: FeatureFlagContext\n ): Promise<T> {\n this.assertReady();\n return this.provider.getValue<T>(key, context ?? this.config.defaultContext);\n }\n\n async evaluateAll<TKey extends string = string>(\n context?: FeatureFlagContext\n ): Promise<Record<string, FeatureFlagEvaluation<TKey>>> {\n this.assertReady();\n this.setStoresLoading(true);\n\n try {\n const result = await this.provider.getAllFlags(context ?? this.config.defaultContext);\n\n if (this.hasConnectedStores) {\n this.syncToStores(this.toValues(result));\n }\n\n return result as Record<string, FeatureFlagEvaluation<TKey>>;\n } catch (error) {\n this.logError('Failed to evaluate all flags', { error });\n throw error;\n } finally {\n this.setStoresLoading(false);\n }\n }\n\n async fetchAndSyncAll(context?: FeatureFlagContext): Promise<Record<string, FeatureFlagValue>> {\n const evaluations = await this.evaluateAll(context);\n return this.toValues(evaluations);\n }\n\n // ─────────────────────────────────────────────────────────────────────────\n // IFeatureFlagService: CRUD (renamed to avoid base class conflicts)\n // ─────────────────────────────────────────────────────────────────────────\n\n async createFlag<TKey extends string = string>(\n data: CreateFlagRequest<TKey>\n ): Promise<FeatureFlag<TKey>> {\n this.assertReady();\n CoreEventManager.emit('featureFlag:creating', { data });\n\n try {\n const flag = await this.provider.createFlag(data);\n CoreEventManager.emit('featureFlag:created', { flag });\n this.logInfo('Flag created', { key: data.key });\n\n if (this.hasConnectedStores) {\n this.syncToStores({ [data.key]: flag.value });\n }\n\n return flag as FeatureFlag<TKey>;\n } catch (error) {\n CoreEventManager.emit('featureFlag:create:error', { error, data });\n throw error;\n }\n }\n\n async updateFlag<TKey extends string = string>(\n key: TKey,\n data: Partial<CreateFlagRequest<TKey>>\n ): Promise<FeatureFlag<TKey>> {\n this.assertReady();\n CoreEventManager.emit('featureFlag:updating', { key, data });\n\n try {\n const flag = await this.provider.updateFlag(key, data);\n CoreEventManager.emit('featureFlag:updated', { flag });\n this.logInfo('Flag updated', { key });\n\n if (this.hasConnectedStores) {\n this.syncToStores({ [key]: flag.value });\n }\n\n return flag as FeatureFlag<TKey>;\n } catch (error) {\n CoreEventManager.emit('featureFlag:update:error', { error, key });\n throw error;\n }\n }\n\n async deleteFlag<TKey extends string = string>(key: TKey): Promise<void> {\n this.assertReady();\n CoreEventManager.emit('featureFlag:deleting', { key });\n\n try {\n await this.provider.deleteFlag(key);\n CoreEventManager.emit('featureFlag:deleted', { key });\n this.logInfo('Flag deleted', { key });\n\n // Refresh all to remove deleted flag from stores\n if (this.hasConnectedStores) {\n const evaluations = await this.provider.getAllFlags(this.config.defaultContext);\n this.syncToStores(this.toValues(evaluations), true);\n }\n } catch (error) {\n CoreEventManager.emit('featureFlag:delete:error', { error, key });\n throw error;\n }\n }\n\n // ─────────────────────────────────────────────────────────────────────────\n // IFeatureFlagService: Rules\n // ─────────────────────────────────────────────────────────────────────────\n\n async getRules<TKey extends string = string>(key: TKey): Promise<FeatureFlagRule<TKey>[]> {\n this.assertReady();\n return this.provider.getRules(key) as Promise<FeatureFlagRule<TKey>[]>;\n }\n\n async getAllRules<TKey extends string = string>(): Promise<FeatureFlagRule<TKey>[]> {\n this.assertReady();\n return this.provider.getAllRules() as Promise<FeatureFlagRule<TKey>[]>;\n }\n\n // ─────────────────────────────────────────────────────────────────────────\n // IFeatureFlagService: Overrides\n // ─────────────────────────────────────────────────────────────────────────\n\n setOverride<TKey extends string = string>(key: TKey, value: FeatureFlagValue): void {\n this.assertReady();\n CoreEventManager.emit('featureFlag:override:setting', { key, value });\n this.provider.setOverride(key, value);\n CoreEventManager.emit('featureFlag:override:set', { key, value });\n }\n\n removeOverride<TKey extends string = string>(key: TKey): void {\n this.assertReady();\n CoreEventManager.emit('featureFlag:override:removing', { key });\n this.provider.removeOverride(key);\n CoreEventManager.emit('featureFlag:override:removed', { key });\n }\n\n clearOverrides(): void {\n this.assertReady();\n this.provider.clearOverrides();\n }\n\n // ─────────────────────────────────────────────────────────────────────────\n // IFeatureFlagService: Subscription\n // ─────────────────────────────────────────────────────────────────────────\n\n subscribe(callback: () => void): () => void {\n this.assertReady();\n return this.provider.subscribe(callback);\n }\n\n on(event: CoreFrontendFeatureFlagEventType, handler: (data: unknown) => void): () => void {\n return CoreEventManager.on(event, handler);\n }\n\n // ─────────────────────────────────────────────────────────────────────────\n // Protected: Store Sync Override\n // ─────────────────────────────────────────────────────────────────────────\n\n protected override syncToStores(flags: Record<string, FeatureFlagValue>, replace = false): void {\n if (!this.primaryStore) return;\n\n try {\n if (!replace && this.primaryStore.updateFlags) {\n this.primaryStore.updateFlags(flags);\n } else {\n this.primaryStore.setFlags(flags);\n }\n } catch (error) {\n this.logError('Store sync failed', { error });\n }\n\n this.logDebug('Synced to stores', {\n count: this.connectedStoreCount,\n flags: Object.keys(flags).length,\n });\n }\n\n // ─────────────────────────────────────────────────────────────────────────\n // Private: Helpers\n // ─────────────────────────────────────────────────────────────────────────\n\n private toValues(\n evaluations: Record<string, FeatureFlagEvaluation<string>>\n ): Record<string, FeatureFlagValue> {\n const values: Record<string, FeatureFlagValue> = {};\n for (const [key, evaluation] of Object.entries(evaluations)) {\n values[key] = evaluation.value;\n }\n return values;\n }\n}\n","/**\n * API Provider Component for React/Next.js\n * Initializes the API client service with environment configuration and event handlers\n *\n * @module frontend/providers/ApiProvider\n */\n\n'use client';\n\nimport { useEffect, useState, type ReactElement } from 'react';\nimport { ApiClientService } from '../../services/ApiClientService';\nimport type { CoreApiProviderProps } from '@plyaz/types/core';\n\n/**\n * API Provider Component\n * IMPORTANT: For client components, pass sensitive config from server-side props/actions\n * Initializes the API client service for React/Next.js applications\n *\n * @example\n * ```tsx\n * // In your app layout or _app.tsx\n * import { ApiProvider } from '@plyaz/core';\n *\n * export default function RootLayout({ children }) {\n * const envConfig = {\n * env: process.env.NODE_ENV as 'production',\n * apiKey: process.env.API_KEY,\n * };\n *\n * const apiConfig = {\n * baseURL: process.env.API_URL!,\n * clientEvents: {\n * onRequestStart: (event) => console.log('Request started:', event),\n * },\n * };\n *\n * return (\n * <ApiProvider envConfig={envConfig} apiConfig={apiConfig}>\n * {children}\n * </ApiProvider>\n * );\n * }\n * ```\n */\nexport function ApiProvider({\n children,\n envConfig,\n apiConfig,\n loadingComponent,\n errorComponent,\n onInitialized,\n onError,\n}: CoreApiProviderProps): ReactElement {\n const [isReady, setIsReady] = useState(false);\n const [error, setError] = useState<Error | null>(null);\n\n useEffect(() => {\n // Initialize API client service once on mount\n // The singleton pattern in ApiClientService ensures only one instance is created\n // If already initialized, it returns the existing instance with a warning\n ApiClientService.init(envConfig, apiConfig)\n .then(() => {\n setIsReady(true);\n onInitialized?.();\n })\n .catch((err: unknown) => {\n const error = err instanceof Error ? err : new Error(String(err));\n setError(error);\n onError?.(error);\n globalThis.console.error('[ApiProvider] Failed to initialize API client:', error);\n });\n\n // Cleanup on unmount\n return () => {\n // Don't dispose the client on unmount - it's a singleton\n // Only dispose if you're sure you want to tear down the client\n };\n }, []); // Initialize once on mount - config changes are not supported after initialization\n\n // Show error component if initialization failed\n if (error) {\n if (errorComponent) {\n return <>{errorComponent(error)}</>;\n }\n return (\n <div style={{ padding: '20px', color: 'red' }}>\n <h2>API Client Initialization Failed</h2>\n <p>{error.message}</p>\n </div>\n );\n }\n\n // Show loading component while initializing\n if (!isReady) {\n if (loadingComponent) {\n return <>{loadingComponent}</>;\n }\n return (\n <div style={{ padding: '20px' }}>\n <p>Initializing API client...</p>\n </div>\n );\n }\n\n // Render children when ready\n return <>{children}</>;\n}\n","/**\n * PlyazProvider - Unified React Provider for Plyaz Core Services\n *\n * A single provider that initializes and provides access to all frontend-safe\n * Plyaz services. Designed for ease of use without unnecessary limitations.\n *\n * @module frontend/providers/PlyazProvider\n *\n * @example Basic usage\n * ```tsx\n * import { PlyazProvider } from '@plyaz/core/frontend';\n *\n * export default function App({ children }) {\n * return (\n * <PlyazProvider\n * config={{\n * api: {\n * baseURL: process.env.NEXT_PUBLIC_API_URL!,\n * env: 'production',\n * },\n * }}\n * >\n * {children}\n * </PlyazProvider>\n * );\n * }\n * ```\n *\n * @example With all options\n * ```tsx\n * <PlyazProvider\n * config={{\n * api: {\n * baseURL: 'https://api.example.com',\n * env: 'production',\n * apiKey: process.env.NEXT_PUBLIC_API_KEY,\n * },\n * featureFlags: {\n * provider: 'api',\n * refreshInterval: 60000,\n * },\n * appContext: 'webapp',\n * verbose: process.env.NODE_ENV === 'development',\n * }}\n * onReady={(services) => console.log('Services ready:', services)}\n * onError={(error) => Sentry.captureException(error)}\n * loading={<Skeleton />}\n * error={(err) => <ErrorBoundary error={err} />}\n * >\n * {children}\n * </PlyazProvider>\n * ```\n *\n * @example Accessing services in components\n * ```tsx\n * import { usePlyaz, useApi, useEvents, useFeatureFlag } from '@plyaz/core/frontend';\n *\n * function MyComponent() {\n * // Full access to all services\n * const { api, events, isReady } = usePlyaz();\n *\n * // Or use specific hooks\n * const apiClient = useApi();\n * const events = useEvents();\n * const { value: darkMode } = useFeatureFlag('DARK_MODE');\n *\n * // Make API calls\n * const fetchData = async () => {\n * const response = await apiClient.get('/users');\n * return response.data;\n * };\n *\n * // Subscribe to events\n * useEffect(() => {\n * const unsubscribe = events.on('user:updated', (event) => {\n * console.log('User updated:', event.data);\n * });\n * return unsubscribe;\n * }, [events]);\n *\n * return <div>...</div>;\n * }\n * ```\n */\n\n'use client';\n\nimport {\n createContext,\n useContext,\n useEffect,\n useState,\n useCallback,\n useMemo,\n type ReactElement,\n} from 'react';\nimport { ApiProvider } from '@plyaz/api/frontend';\nimport { Core } from '../../init/CoreInitializer';\nimport { ServiceRegistry } from '../../init/ServiceRegistry';\nimport { ApiClientService } from '../../services/ApiClientService';\nimport { CoreEventManager } from '../../events/CoreEventManager';\nimport type {\n CoreAppContext,\n CoreAppEnvironment,\n CorePlyazConfig,\n CorePlyazFeatureFlagConfig,\n CorePlyazServices,\n CorePlyazContextValue,\n CorePlyazProviderProps as PlyazProviderProps,\n CoreDomainServiceInstance,\n} from '@plyaz/types/core';\nimport type { ApiClientOptions } from '@plyaz/types/api';\nimport { createEncryptionConfig } from '@plyaz/config/api';\nimport { InitializationError } from '../components/InitializationError';\nimport { InitializationLoading } from '../components/InitializationLoading';\n\n// ============================================================================\n// Types\n// ============================================================================\n\n/**\n * Implementation-specific context value.\n * Extends CorePlyazContextValue with concrete implementation references.\n */\ninterface PlyazContextValue extends Omit<CorePlyazContextValue, 'api' | 'events' | 'core'> {\n /** API client for making HTTP requests */\n api: typeof ApiClientService | null;\n /** Event manager for pub/sub */\n events: typeof CoreEventManager;\n /** Core initializer reference */\n core: typeof Core;\n}\n\n/**\n * Implementation-specific services for callbacks.\n */\ninterface PlyazServices extends Omit<CorePlyazServices, never> {\n /** API client for making HTTP requests */\n api: typeof ApiClientService | null;\n /** Event manager for pub/sub */\n events: typeof CoreEventManager;\n /** Core initializer reference */\n core: typeof Core;\n}\n\n// ============================================================================\n// Context\n// ============================================================================\n\nconst PlyazContext = createContext<PlyazContextValue | null>(null);\n\n// ============================================================================\n// Feature Flag Store (Simple in-memory implementation for frontend)\n// ============================================================================\n\n/**\n * Frontend Feature Flag Store\n *\n * Manages feature flags in frontend context with two provider options:\n * - 'memory': Flags stored in-memory (default, resets on refresh)\n * - 'api': Flags fetched from API endpoint\n *\n * For backend/server-side feature flags, use Core.initialize() with\n * database, redis, or file providers instead.\n */\nclass FeatureFlagStore {\n private flags: Record<string, boolean> = {};\n private config: CorePlyazFeatureFlagConfig;\n private apiClient: typeof ApiClientService | null = null;\n private refreshTimer: ReturnType<typeof globalThis.setInterval> | null = null;\n\n constructor(config: CorePlyazFeatureFlagConfig = {}) {\n this.config = config;\n this.flags = config.defaults ?? {};\n }\n\n setApiClient(client: typeof ApiClientService | null): void {\n this.apiClient = client;\n }\n\n get(key: string, defaultValue = false): boolean {\n return this.flags[key] ?? defaultValue;\n }\n\n getAll(): Record<string, boolean> {\n return { ...this.flags };\n }\n\n set(key: string, value: boolean): void {\n this.flags[key] = value;\n }\n\n setAll(flags: Record<string, boolean>): void {\n this.flags = { ...this.flags, ...flags };\n }\n\n async refresh(): Promise<void> {\n // Only 'api' provider needs refresh - 'memory' is local only\n if (this.config.provider === 'api' && this.apiClient?.isInitialized()) {\n try {\n const endpoint = this.config.apiEndpoint ?? '/feature-flags';\n const client = this.apiClient.getClient();\n const response = await client.get<{ flags?: Record<string, boolean> }>(endpoint);\n if (response.data?.flags) {\n this.flags = { ...this.flags, ...response.data.flags };\n }\n } catch (error) {\n globalThis.console.warn('[PlyazProvider] Failed to refresh feature flags:', error);\n }\n }\n // 'memory' provider: no-op, flags are managed locally\n }\n\n startAutoRefresh(): void {\n // Only start auto-refresh for 'api' provider\n if (\n this.config.provider === 'api' &&\n this.config.refreshInterval &&\n this.config.refreshInterval > 0\n ) {\n this.refreshTimer = globalThis.setInterval(() => {\n this.refresh().catch(() => {});\n }, this.config.refreshInterval);\n }\n }\n\n stopAutoRefresh(): void {\n if (this.refreshTimer) {\n globalThis.clearInterval(this.refreshTimer);\n this.refreshTimer = null;\n }\n }\n\n dispose(): void {\n this.stopAutoRefresh();\n this.flags = {};\n }\n}\n\n// ============================================================================\n// Provider Component\n// ============================================================================\n\n/**\n * PlyazProvider - Unified provider for all Plyaz frontend services\n *\n * Initializes and provides access to:\n * - API Client (HTTP requests)\n * - Event Manager (pub/sub)\n * - Feature Flags\n * - Core utilities\n */\n\n/**\n * Build API client configuration from provider config\n */\nfunction buildApiConfig(config: CorePlyazConfig): Partial<ApiClientOptions> {\n return {\n baseURL: config.api.baseURL,\n timeout: config.api.timeout,\n headers: config.api.headers ? { static: config.api.headers } : undefined,\n retry: config.api.retry,\n encryption:\n config.api.encryption?.enabled && config.api.encryption?.key\n ? createEncryptionConfig(config.api.encryption.key)\n : undefined,\n };\n}\n\n/** Initialize Core with frontend config */\nasync function initializeCore(config: CorePlyazConfig): Promise<void> {\n const apiConfig = buildApiConfig(config);\n\n await Core.initialize({\n skipDb: true,\n appContext: config.appContext ?? 'webapp',\n verbose: config.verbose,\n api: {\n env: config.api.env ?? 'development',\n apiKey: config.api.apiKey,\n setAsDefault: true,\n ...apiConfig,\n },\n });\n}\n\n/** Initialize ServiceRegistry if services are configured */\nasync function initializeServices(config: CorePlyazConfig): Promise<void> {\n if (!config.services || config.services.length === 0) return;\n\n if (config.verbose) {\n globalThis.console.log('[PlyazProvider] Initializing domain services...');\n }\n\n await ServiceRegistry.initialize({\n apiClient: { baseURL: config.api.baseURL },\n services: config.services,\n });\n\n if (config.verbose) {\n globalThis.console.log(\n '[PlyazProvider] Services initialized:',\n ServiceRegistry.getInitializedKeys()\n );\n }\n}\n\n/** Initialize feature flags store */\nasync function initializeFeatureFlags(featureFlagStore: FeatureFlagStore): Promise<void> {\n featureFlagStore.setApiClient(ApiClientService);\n await featureFlagStore.refresh();\n featureFlagStore.startAutoRefresh();\n}\n\n/**\n * Create PlyazServices object for callbacks\n */\nfunction createServicesObject(\n config: CorePlyazConfig,\n featureFlagStore: FeatureFlagStore\n): PlyazServices {\n return {\n api: ApiClientService,\n events: CoreEventManager,\n core: Core,\n featureFlags: {\n get: (key, def) => featureFlagStore.get(key, def),\n getAll: () => featureFlagStore.getAll(),\n refresh: () => featureFlagStore.refresh(),\n },\n appContext: config.appContext ?? 'webapp',\n environment: config.api.env ?? 'development',\n getService: <T extends CoreDomainServiceInstance>(key: string) => ServiceRegistry.get<T>(key),\n getServiceAsync: <T extends CoreDomainServiceInstance>(key: string) =>\n ServiceRegistry.getAsync<T>(key),\n hasService: (key: string) => ServiceRegistry.has(key),\n getServiceKeys: () => ServiceRegistry.getInitializedKeys(),\n };\n}\n\nexport function PlyazProvider({\n children,\n config,\n loading,\n error: errorComponent,\n onReady,\n onError,\n skipLoadingState = false,\n}: PlyazProviderProps): ReactElement {\n const [isReady, setIsReady] = useState(false);\n const [error, setError] = useState<Error | null>(null);\n const [featureFlagStore] = useState(() => new FeatureFlagStore(config.featureFlags));\n\n // Initialize services\n const initialize = useCallback(async () => {\n try {\n setError(null);\n\n await initializeCore(config);\n await initializeServices(config);\n await initializeFeatureFlags(featureFlagStore);\n\n setIsReady(true);\n onReady?.(createServicesObject(config, featureFlagStore));\n } catch (err) {\n const initError = err instanceof Error ? err : new Error(String(err));\n setError(initError);\n onError?.(initError);\n globalThis.console.error('[PlyazProvider] Initialization failed:', initError);\n }\n }, [config, featureFlagStore, onReady, onError]);\n\n // Reinitialize function\n const reinitialize = useCallback(async () => {\n setIsReady(false);\n ServiceRegistry.disposeAll();\n await Core.reset();\n await initialize();\n }, [initialize]);\n\n // Initialize on mount\n useEffect(() => {\n void initialize();\n\n return () => {\n featureFlagStore.dispose();\n ServiceRegistry.disposeAll();\n };\n }, []); // Only run once on mount\n\n // Build context value\n const contextValue = useMemo<PlyazContextValue>(\n () => ({\n api: isReady ? ApiClientService : null,\n events: CoreEventManager,\n core: Core,\n featureFlags: {\n get: (key, def) => featureFlagStore.get(key, def),\n getAll: () => featureFlagStore.getAll(),\n refresh: () => featureFlagStore.refresh(),\n },\n appContext: config.appContext ?? 'webapp',\n environment: config.api.env ?? 'development',\n isReady,\n error,\n reinitialize,\n // ServiceRegistry access\n getService: <T extends CoreDomainServiceInstance>(key: string) => ServiceRegistry.get<T>(key),\n getServiceAsync: <T extends CoreDomainServiceInstance>(key: string) =>\n ServiceRegistry.getAsync<T>(key),\n hasService: (key: string) => ServiceRegistry.has(key),\n getServiceKeys: () => ServiceRegistry.getInitializedKeys(),\n }),\n [isReady, error, config.appContext, config.api.env, featureFlagStore, reinitialize]\n );\n\n // Handle error state\n if (error && !skipLoadingState) {\n return (\n <ApiProvider>\n <InitializationError error={error} errorComponent={errorComponent} />\n </ApiProvider>\n );\n }\n\n // Handle loading state\n if (!isReady && !skipLoadingState) {\n return (\n <ApiProvider>\n <InitializationLoading loading={loading} />\n </ApiProvider>\n );\n }\n\n // Render children with context and React Query\n return (\n <ApiProvider>\n <PlyazContext.Provider value={contextValue}>{children}</PlyazContext.Provider>\n </ApiProvider>\n );\n}\n\n// ============================================================================\n// Hooks\n// ============================================================================\n\n/**\n * Access all Plyaz services\n *\n * @example\n * ```tsx\n * function MyComponent() {\n * const { api, events, isReady, featureFlags } = usePlyaz();\n *\n * if (!isReady) return <Loading />;\n *\n * const handleClick = async () => {\n * const response = await api.getClient().get('/data');\n * events.emit('data:fetched', { data: response.data });\n * };\n *\n * return <button onClick={handleClick}>Fetch</button>;\n * }\n * ```\n */\nexport function usePlyaz(): PlyazContextValue {\n const context = useContext(PlyazContext);\n if (!context) {\n throw new Error(\n 'usePlyaz must be used within a PlyazProvider. ' +\n 'Wrap your app with <PlyazProvider config={...}>...</PlyazProvider>'\n );\n }\n return context;\n}\n\n/**\n * Access API client directly\n *\n * @example\n * ```tsx\n * function UserList() {\n * const api = useApi();\n * const [users, setUsers] = useState([]);\n *\n * useEffect(() => {\n * api.getClient().get('/users').then(res => setUsers(res.data));\n * }, [api]);\n *\n * return <ul>{users.map(u => <li key={u.id}>{u.name}</li>)}</ul>;\n * }\n * ```\n */\nexport function useApi(): typeof ApiClientService {\n const { api, isReady } = usePlyaz();\n if (!isReady || !api) {\n throw new Error('API client is not ready. Make sure PlyazProvider has finished initializing.');\n }\n return api;\n}\n\n/**\n * Access API client safely (returns null if not ready)\n */\nexport function useApiSafe(): typeof ApiClientService | null {\n const { api } = usePlyaz();\n return api;\n}\n\n/**\n * Access event manager\n *\n * @example\n * ```tsx\n * function NotificationListener() {\n * const events = useEvents();\n *\n * useEffect(() => {\n * const unsubscribe = events.on('notification:received', (event) => {\n * toast.show(event.data.message);\n * });\n * return unsubscribe;\n * }, [events]);\n *\n * return null;\n * }\n * ```\n */\nexport function useEvents(): typeof CoreEventManager {\n const { events } = usePlyaz();\n return events;\n}\n\n/**\n * Check if a feature flag is enabled\n *\n * @example\n * ```tsx\n * function FeatureComponent() {\n * const isEnabled = useFlag('NEW_DASHBOARD');\n *\n * if (!isEnabled) return null;\n * return <NewDashboard />;\n * }\n * ```\n */\nexport function useFlag(key: string, defaultValue = false): boolean {\n const { featureFlags } = usePlyaz();\n return featureFlags.get(key, defaultValue);\n}\n\n/**\n * Access feature flag utilities\n *\n * @example\n * ```tsx\n * function FlagManager() {\n * const flags = useFeatureFlags();\n * const allFlags = flags.getAll();\n *\n * return (\n * <div>\n * <pre>{JSON.stringify(allFlags, null, 2)}</pre>\n * <button onClick={flags.refresh}>Refresh Flags</button>\n * </div>\n * );\n * }\n * ```\n */\nexport function useFeatureFlags(): PlyazContextValue['featureFlags'] {\n const { featureFlags } = usePlyaz();\n return featureFlags;\n}\n\n/**\n * Check if Plyaz services are ready\n *\n * @example\n * ```tsx\n * function LoadingAwareComponent() {\n * const isReady = usePlyazReady();\n *\n * if (!isReady) return <Skeleton />;\n * return <ActualContent />;\n * }\n * ```\n */\nexport function usePlyazReady(): boolean {\n const { isReady } = usePlyaz();\n return isReady;\n}\n\n/**\n * Get current app context\n */\nexport function useAppContext(): CoreAppContext {\n const { appContext } = usePlyaz();\n return appContext;\n}\n\n/**\n * Get current environment\n */\nexport function useEnvironment(): CoreAppEnvironment {\n const { environment } = usePlyaz();\n return environment;\n}\n\n/**\n * Get a domain service by key.\n * Services must be registered in the `services` config.\n *\n * @param key - Service key (e.g., 'featureFlags', 'example')\n * @returns The service instance\n * @throws If service is not initialized or not found\n *\n * @example\n * ```tsx\n * function MyComponent() {\n * const flagService = useService<FeatureFlagDomainService>('featureFlags');\n *\n * useEffect(() => {\n * flagService.isEnabled('my-flag').then(console.log);\n * }, [flagService]);\n *\n * return <div>...</div>;\n * }\n * ```\n */\nexport function useService<T extends CoreDomainServiceInstance = CoreDomainServiceInstance>(\n key: string\n): T {\n const { getService, isReady } = usePlyaz();\n\n if (!isReady) {\n throw new Error(`PlyazProvider not ready. Cannot get service '${key}'.`);\n }\n\n return useMemo(() => getService<T>(key), [getService, key]);\n}\n\n/**\n * Get a domain service by key with loading state.\n * Useful for lazy-initialized services.\n *\n * @param key - Service key\n * @returns Object with service, loading state, and error\n *\n * @example\n * ```tsx\n * function MyComponent() {\n * const { service, isLoading, error } = useServiceAsync<ExampleDomainService>('example');\n *\n * if (isLoading) return <Spinner />;\n * if (error) return <Error message={error.message} />;\n *\n * return <div>{service?.serviceName}</div>;\n * }\n * ```\n */\nexport function useServiceAsync<T extends CoreDomainServiceInstance = CoreDomainServiceInstance>(\n key: string\n): { service: T | null; isLoading: boolean; error: Error | null } {\n const { getServiceAsync, isReady } = usePlyaz();\n const [service, setService] = useState<T | null>(null);\n const [isLoading, setIsLoading] = useState(true);\n const [error, setError] = useState<Error | null>(null);\n\n useEffect(() => {\n if (!isReady) return;\n\n let mounted = true;\n\n const loadService = async (): Promise<void> => {\n try {\n setIsLoading(true);\n const svc = await getServiceAsync<T>(key);\n if (mounted) {\n setService(svc);\n setIsLoading(false);\n }\n } catch (err) {\n if (mounted) {\n setError(err instanceof Error ? err : new Error(String(err)));\n setIsLoading(false);\n }\n }\n };\n\n void loadService();\n\n return () => {\n mounted = false;\n };\n }, [key, getServiceAsync, isReady]);\n\n return { service, isLoading, error };\n}\n\n/**\n * Check if a service is registered and available\n *\n * @example\n * ```tsx\n * function MyComponent() {\n * const hasFlags = useHasService('featureFlags');\n *\n * if (!hasFlags) {\n * return <div>Feature flags not configured</div>;\n * }\n *\n * return <FeatureFlagUI />;\n * }\n * ```\n */\nexport function useHasService(key: string): boolean {\n const { hasService } = usePlyaz();\n return hasService(key);\n}\n\n/**\n * Get all initialized service keys\n *\n * @example\n * ```tsx\n * function DebugPanel() {\n * const serviceKeys = useServiceKeys();\n *\n * return (\n * <div>\n * <h3>Loaded Services:</h3>\n * <ul>\n * {serviceKeys.map(key => <li key={key}>{key}</li>)}\n * </ul>\n * </div>\n * );\n * }\n * ```\n */\nexport function useServiceKeys(): string[] {\n const { getServiceKeys } = usePlyaz();\n return getServiceKeys();\n}\n\n// ============================================================================\n// Exports\n// ============================================================================\n\nexport { PlyazContext };\n","/**\n * Service Accessors (Generic)\n *\n * Generic utilities for accessing services from stores.\n * These work with any domain service, not just feature flags.\n */\n\nimport type { CoreDomainServiceInstance } from '@plyaz/types/core';\nimport { ServiceRegistry } from '../../init/ServiceRegistry';\n\n// ─────────────────────────────────────────────────────────────────────────────\n// Service Accessors\n// ─────────────────────────────────────────────────────────────────────────────\n\n/**\n * Create a service accessor function for use in stores.\n *\n * @param serviceKey - Key of the service in the registry\n * @returns Async function that returns the service instance\n *\n * @example\n * ```typescript\n * const getExampleService = createServiceAccessor<ExampleDomainService>('example');\n *\n * const myStoreSlice = {\n * async createEntity(data) {\n * const service = await getExampleService();\n * return service.create(data);\n * },\n * };\n * ```\n */\nexport function createServiceAccessor<T extends CoreDomainServiceInstance>(\n serviceKey: string\n): () => Promise<T> {\n return () => ServiceRegistry.getAsync<T>(serviceKey);\n}\n\n/**\n * Create multiple service accessors at once.\n *\n * @param keys - Object mapping accessor names to service keys\n * @returns Object with accessor functions\n *\n * @example\n * ```typescript\n * const services = createServiceAccessors({\n * flags: 'featureFlags',\n * examples: 'example',\n * users: 'users',\n * });\n *\n * const flags = await services.flags();\n * const example = await services.examples();\n * ```\n */\nexport function createServiceAccessors<T extends Record<string, string>>(\n keys: T\n): { [K in keyof T]: () => Promise<CoreDomainServiceInstance> } {\n const accessors = {} as { [K in keyof T]: () => Promise<CoreDomainServiceInstance> };\n\n for (const [name, key] of Object.entries(keys)) {\n accessors[name as keyof T] = createServiceAccessor(key);\n }\n\n return accessors;\n}\n\n// ─────────────────────────────────────────────────────────────────────────────\n// Zustand Middleware\n// ─────────────────────────────────────────────────────────────────────────────\n\n/**\n * Create a Zustand middleware that injects services into store actions.\n *\n * @param serviceKeys - Service keys to inject\n * @returns Zustand middleware function\n *\n * @example\n * ```typescript\n * import { create } from 'zustand';\n * import { withServices } from '@plyaz/core/frontend';\n *\n * interface MyStore {\n * items: Item[];\n * services: { example: ExampleDomainService };\n * fetchItems: () => Promise<void>;\n * }\n *\n * const useMyStore = create<MyStore>(\n * withServices(['example'], (set, get, services) => ({\n * items: [],\n * services,\n * fetchItems: async () => {\n * const items = await services.example.getAll();\n * set({ items });\n * },\n * }))\n * );\n * ```\n */\nexport function withServices<TServices extends Record<string, CoreDomainServiceInstance>>(\n serviceKeys: string[],\n createStore: (set: (partial: unknown) => void, get: () => unknown, services: TServices) => unknown\n): (set: (partial: unknown) => void, get: () => unknown) => unknown {\n return (set: (partial: unknown) => void, get: () => unknown): unknown => {\n // Create lazy service proxies\n const services = {} as TServices;\n\n for (const key of serviceKeys) {\n Object.defineProperty(services, key, {\n get: () => ServiceRegistry.get(key),\n enumerable: true,\n });\n }\n\n return createStore(set, get, services);\n };\n}\n","/**\n * Feature Flag Store Integration\n *\n * Utilities for integrating feature flags with Zustand stores.\n * Implements the \"pull\" pattern where stores fetch from services.\n */\n\nimport { ServiceRegistry } from '../../init/ServiceRegistry';\nimport type { FeatureFlagValue, FeatureFlagContext } from '@plyaz/types/features';\n\n// Re-export types from @plyaz/types/core\nexport type {\n CoreFeatureFlagServiceLike,\n CoreFeatureFlagFetcherOptions,\n CoreFeatureFlagStoreInitConfig,\n} from '@plyaz/types/core';\n\n// Import for local use\nimport type {\n CoreFeatureFlagServiceLike,\n CoreFeatureFlagFetcherOptions,\n CoreFeatureFlagStoreInitConfig,\n} from '@plyaz/types/core';\n\n// ─────────────────────────────────────────────────────────────────────────────\n// Fetcher Factory\n// ─────────────────────────────────────────────────────────────────────────────\n\n/**\n * Create a fetchFn for feature flag store that uses ServiceRegistry.\n *\n * This bridges the ServiceRegistry with the store's callback-based pattern.\n * Use this for polling or manual refresh scenarios.\n *\n * @param options - Fetcher options\n * @returns A function compatible with store initialization\n *\n * @example\n * ```typescript\n * // Basic usage\n * const fetchFn = createFeatureFlagFetcher();\n *\n * // With context\n * const fetchFn = createFeatureFlagFetcher({\n * context: { userId: currentUser.id },\n * });\n *\n * // Use in store initializer\n * useFeatureFlagInitializer({ fetchFn });\n * ```\n */\nexport function createFeatureFlagFetcher(\n options: CoreFeatureFlagFetcherOptions = {}\n): () => Promise<Record<string, FeatureFlagValue>> {\n const { serviceKey = 'featureFlags', context, transform } = options;\n\n return async (): Promise<Record<string, FeatureFlagValue>> => {\n const service = await ServiceRegistry.getAsync<CoreFeatureFlagServiceLike>(serviceKey);\n const flags = await service.evaluateAll(context);\n\n // Extract values from evaluations\n const values: Record<string, FeatureFlagValue> = {};\n for (const [key, evaluation] of Object.entries(flags)) {\n if (evaluation && typeof evaluation === 'object' && 'value' in evaluation) {\n values[key] = (evaluation as { value: FeatureFlagValue }).value;\n } else {\n values[key] = evaluation as FeatureFlagValue;\n }\n }\n\n return transform ? transform(values) : values;\n };\n}\n\n/**\n * Create full store initialization config with ServiceRegistry integration.\n *\n * @param options - Configuration options\n * @returns Config object for store initialization\n *\n * @example\n * ```typescript\n * const storeConfig = createFeatureFlagStoreConfig({\n * context: { userId: user.id },\n * defaults: { 'MY_FLAG': false },\n * polling: { enabled: true, interval: 30000 },\n * onFlagChange: (key, prev, next) => console.log(`${key}: ${prev} → ${next}`),\n * });\n *\n * useFeatureFlagInitializer(storeConfig);\n * ```\n */\nexport function createFeatureFlagStoreConfig(options: {\n serviceKey?: string;\n context?: FeatureFlagContext;\n defaults?: Record<string, FeatureFlagValue>;\n polling?: { enabled?: boolean; interval?: number };\n onFlagChange?: (\n key: string,\n prevValue: FeatureFlagValue | undefined,\n newValue: FeatureFlagValue\n ) => void;\n onError?: (error: unknown) => void;\n}): CoreFeatureFlagStoreInitConfig {\n const { serviceKey, context, defaults, polling, onFlagChange, onError } = options;\n\n return {\n fetchFn: createFeatureFlagFetcher({ serviceKey, context }),\n defaults,\n polling,\n onFlagChange,\n onError,\n };\n}\n"]}
|