@flutchai/flutch-sdk 0.1.22 → 0.1.23

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/callbacks/callback.decorators.ts","../src/agent-ui/endpoint.registry.ts","../src/agent-ui/endpoint.decorators.ts","../src/agent-ui/ui-endpoints.discovery.ts","../src/agent-ui/ui-dispatch.controller.ts","../src/agent-ui/index.ts","../src/service-discovery/file-based.discovery.ts","../src/core/builder-registry.service.ts","../src/utils/graph-type.utils.ts","../src/graph/versioning/versioned-graph.service.ts","../src/callbacks/callback-store.ts","../src/callbacks/callback-registry.ts","../src/callbacks/idempotency-manager.ts","../src/callbacks/smart-callback.router.ts","../src/callbacks/universal-callback.service.ts","../src/callbacks/example.callback.ts","../src/callbacks/callback-acl.service.ts","../src/callbacks/callback-auditor.service.ts","../src/callbacks/callback-metrics.service.ts","../src/callbacks/callback-rate-limiter.ts","../src/callbacks/callback-patch.service.ts","../src/callbacks/telegram-patch.handler.ts","../src/callbacks/web-patch.handler.ts","../src/callbacks/index.ts","../src/callbacks/callback-token.guard.ts","../src/callbacks/callback.controller.ts","../src/graph/abstract-graph.builder.ts","../src/core/bootstrap.ts","../src/core/index.ts","../src/messages/attachments.ts","../src/messages/streaming.ts","../src/graph/graph-service.interface.ts","../src/graph/graph.controller.ts","../src/graph/graph-manifest.schema.ts","../src/graph/versioning/index.ts","../src/engines/api-call-tracer.utils.ts","../src/engines/graph-engine.factory.ts","../src/engines/langgraph/event-processor.utils.ts","../src/engines/langgraph/langgraph-engine.ts","../src/core/universal-graph.module.ts","../src/index.ts","../src/tools/mcp-converter.ts","../src/tools/mcp-tool-filter.ts","../src/tools/mcp-runtime-http.client.ts","../src/models/enums.ts","../src/models/rerankers/voyageai-rerank.ts","../src/models/model.initializer.ts","../src/retriever/enums.ts","../src/retriever/retriever.service.ts","../src/utils/index.ts","../src/service-discovery/index.ts","../src/service-discovery/static.discovery.ts"],"names":["EndpointRegistry","Logger","Injectable","ENDPOINT_METADATA_KEY","UIEndpointsDiscoveryService","getUIEndpointMethodsMetadata","Optional","UIDispatchController","NotFoundException","InternalServerErrorException","Post","ApiOperation","ApiResponse","Body","Get","ApiTags","Controller","FileBasedDiscovery","path2","os","fs","BuilderRegistryService","GraphTypeUtils","VersionedGraphService","randomBytes","IdempotencyStatus","IdempotencyManager","createHash","SmartCallbackRouter","resolve","CallbackACL","ForbiddenException","CallbackAuditAction","CallbackAuditor","randomUUID","entry","CallbackMetrics","Registry","collectDefaultMetrics","Counter","Histogram","Gauge","CallbackRateLimiter","CallbackPatchService","TelegramPatchHandler","WebPatchHandler","CallbackTokenGuard","UnauthorizedException","CallbackController","UseGuards","Req","path","getCallbackMetadata","getEndpointMetadata","createEndpointDescriptors","Inject","UniversalGraphService","findCallbackMethod","Module","net","logger","NestFactory","ValidationPipe","DocumentBuilder","SwaggerModule","AttachmentType","StreamChannel","GraphController","HttpException","HttpStatus","Res","ApiParam","Param","LangGraph","GraphEngineType","GraphEngineFactory","EventProcessor","LangGraphEngine","UniversalGraphModule","MetadataScanner","ModuleRef","ConfigModule","DiscoveryModule","z","zodToJsonSchema","DynamicStructuredTool","axios","response","McpRuntimeHttpClient","parseCallbackConfigArg","CallbackManager","ModelProvider","ModelType","ChatFeature","BaseDocumentCompressor","ChatOpenAI","AzureChatOpenAI","ChatAnthropic","ChatCohere","ChatMistralAI","CohereRerank","OpenAIEmbeddings","RetrieverSearchType","RetrieverService","StaticDiscovery"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA,IAAA,2BAAA,GAAA,EAAA;AAAA,QAAA,CAAA,2BAAA,EAAA;AAAA,EAAA,QAAA,EAAA,MAAA,QAAA;AAAA,EAAA,aAAA,EAAA,MAAA,aAAA;AAAA,EAAA,kBAAA,EAAA,MAAA,kBAAA;AAAA,EAAA,mBAAA,EAAA,MAAA,mBAAA;AAAA,EAAA,YAAA,EAAA,MAAA;AAAA,CAAA,CAAA;AA4DO,SAAS,SAAS,OAAA,EAAiB;AACxC,EAAA,OAAO,SACL,MAAA,EACA,WAAA,EACA,UAAA,EACA;AAEA,IAAA,MAAM,oBACJ,OAAA,CAAQ,WAAA,CAAY,uBAAuB,MAAA,CAAO,WAAW,KAAK,EAAC;AAGrE,IAAA,MAAM,gBAAA,GAAqC;AAAA,MACzC,OAAA;AAAA,MACA,MAAA,EAAQ,WAAA;AAAA,MACR,QAAQ,MAAA,CAAO;AAAA,KACjB;AAEA,IAAA,iBAAA,CAAkB,KAAK,gBAAgB,CAAA;AAGvC,IAAA,OAAA,CAAQ,cAAA;AAAA,MACN,qBAAA;AAAA,MACA,iBAAA;AAAA,MACA,MAAA,CAAO;AAAA,KACT;AAGA,IAAA,IAAI,UAAA,CAAW,KAAA,IAAS,OAAO,UAAA,CAAW,UAAU,UAAA,EAAY;AAC9D,MAAA,MAAM,iBAAiB,UAAA,CAAW,KAAA;AAElC,MAAA,UAAA,CAAW,KAAA,GAAQ,SAAU,OAAA,EAA0B;AAErD,QAAA,OAAO,cAAA,CAAe,IAAA,CAAK,IAAA,EAAM,OAAO,CAAA;AAAA,MAC1C,CAAA;AAAA,IACF;AAEA,IAAA,OAAO,UAAA;AAAA,EACT,CAAA;AACF;AAgBO,SAAS,cACd,cAAA,EACA;AACA,EAAA,OAAO,SAAkD,YAAA,EAAiB;AAExE,IAAA,MAAM,mBACJ,OAAA,CAAQ,WAAA,CAAY,qBAAA,EAAuB,cAAc,KAAK,EAAC;AAAA,IAGjE,MAAM,6BAA6B,YAAA,CAAa;AAAA,MAC9C,eAAe,IAAA,EAAa;AAC1B,QAAA,KAAA,CAAM,GAAG,IAAI,CAAA;AAGb,QAAA,MAAM,iBAAA,GAAoB,IAAI,cAAA,EAAe;AAG7C,QAAA,gBAAA,CAAiB,OAAA,CAAQ,CAAC,EAAE,MAAA,EAAQ,SAAQ,KAAM;AAChD,UAAA,MAAM,cAAA,GAAkB,kBAA0B,MAAM,CAAA;AACxD,UAAA,IAAI,OAAO,mBAAmB,UAAA,EAAY;AAExC,YAAC,IAAA,CAAa,MAAM,CAAA,GAAI,OAAO,OAAA,KAA6B;AAE1D,cAAA,MAAM,eAAA,GAAkB;AAAA,gBACtB,GAAG,OAAA;AAAA,gBACH,OAAA,EAAS;AAAA;AAAA,eACX;AACA,cAAA,OAAO,cAAA,CAAe,IAAA,CAAK,iBAAA,EAAmB,eAAe,CAAA;AAAA,YAC/D,CAAA;AAAA,UACF;AAAA,QACF,CAAC,CAAA;AAAA,MACH;AAAA;AAIF,IAAA,OAAA,CAAQ,cAAA;AAAA,MACN,qBAAA;AAAA,MACA,gBAAA;AAAA,MACA;AAAA,KACF;AAGA,IAAA,OAAA,CAAQ,cAAA;AAAA,MACN,2BAAA;AAAA,MACA,IAAA;AAAA,MACA;AAAA,KACF;AAGA,IAAA,MAAA,CAAO,cAAA,CAAe,sBAAsB,YAAY,CAAA;AACxD,IAAA,MAAA,CAAO,mBAAA,CAAoB,YAAY,CAAA,CAAE,OAAA,CAAQ,CAAA,IAAA,KAAQ;AACvD,MAAA,IAAI,IAAA,KAAS,QAAA,IAAY,IAAA,KAAS,WAAA,IAAe,SAAS,MAAA,EAAQ;AAChE,QAAA,MAAM,UAAA,GAAa,MAAA,CAAO,wBAAA,CAAyB,YAAA,EAAc,IAAI,CAAA;AACrE,QAAA,IAAI,UAAA,EAAY;AACd,UAAA,MAAA,CAAO,cAAA,CAAe,oBAAA,EAAsB,IAAA,EAAM,UAAU,CAAA;AAAA,QAC9D;AAAA,MACF;AAAA,IACF,CAAC,CAAA;AAED,IAAA,OAAO,oBAAA;AAAA,EACT,CAAA;AACF;AAKO,SAAS,oBAAoB,MAAA,EAAiC;AACnE,EAAA,OAAO,OAAA,CAAQ,WAAA,CAAY,qBAAA,EAAuB,MAAM,KAAK,EAAC;AAChE;AAKO,SAAS,aAAa,MAAA,EAAsB;AACjD,EAAA,OAAO,OAAA,CAAQ,WAAA,CAAY,2BAAA,EAA6B,MAAM,CAAA,KAAM,IAAA;AACtE;AAKO,SAAS,kBAAA,CACd,QACA,OAAA,EACwB;AACxB,EAAA,MAAM,SAAA,GAAY,oBAAoB,MAAM,CAAA;AAC5C,EAAA,MAAM,WAAW,SAAA,CAAU,IAAA,CAAK,CAAA,EAAA,KAAM,EAAA,CAAG,YAAY,OAAO,CAAA;AAC5D,EAAA,OAAO,QAAA,GAAW,SAAS,MAAA,GAAS,IAAA;AACtC;AAzMA,IAiBM,qBAAA,EAKA,2BAAA;AAtBN,IAAA,wBAAA,GAAA,KAAA,CAAA;AAAA,EAAA,sCAAA,GAAA;AAiBA,IAAM,qBAAA,GAAwB,OAAO,WAAW,CAAA;AAKhD,IAAM,2BAAA,GAA8B,OAAO,gBAAgB,CAAA;AAAA,EAAA;AAAA,CAAA,CAAA;AC2B9CA;AAjDb,IAAA,sBAAA,GAAA,KAAA,CAAA;AAAA,EAAA,mCAAA,GAAA;AAiDO,IAAMA,2BAAN,MAAuB;AAAA,MACX,MAAA,GAAS,IAAIC,aAAAA,CAAOD,wBAAA,CAAiB,IAAI,CAAA;AAAA;AAAA,MAGzC,SAAA,uBAAgB,GAAA,EAG/B;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,MAOF,QAAA,CAAS,WAAmB,QAAA,EAAoC;AAC9D,QAAA,IAAI,CAAC,IAAA,CAAK,SAAA,CAAU,GAAA,CAAI,SAAS,CAAA,EAAG;AAClC,UAAA,IAAA,CAAK,SAAA,CAAU,GAAA,CAAI,SAAA,kBAAW,IAAI,KAAK,CAAA;AAAA,QACzC;AAEA,QAAA,MAAM,cAAA,GAAiB,IAAA,CAAK,SAAA,CAAU,GAAA,CAAI,SAAS,CAAA;AACnD,QAAA,cAAA,CAAe,GAAA,CAAI,QAAA,CAAS,IAAA,EAAM,QAAQ,CAAA;AAE1C,QAAA,IAAA,CAAK,MAAA,CAAO,KAAA;AAAA,UACV,CAAA,qBAAA,EAAwB,QAAA,CAAS,IAAI,CAAA,kBAAA,EAAqB,SAAS,CAAA,CAAA;AAAA,SACrE;AAAA,MACF;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,MAOA,gBAAA,CAAiB,WAAmB,SAAA,EAAuC;AACzE,QAAA,KAAA,MAAW,YAAY,SAAA,EAAW;AAChC,UAAA,IAAA,CAAK,QAAA,CAAS,WAAW,QAAQ,CAAA;AAAA,QACnC;AAAA,MACF;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,MAQA,GAAA,CAAI,WAAmB,YAAA,EAAsD;AAC3E,QAAA,MAAM,cAAA,GAAiB,IAAA,CAAK,SAAA,CAAU,GAAA,CAAI,SAAS,CAAA;AACnD,QAAA,OAAO,cAAA,EAAgB,IAAI,YAAY,CAAA;AAAA,MACzC;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,MAOA,KAAK,SAAA,EAA6B;AAChC,QAAA,MAAM,cAAA,GAAiB,IAAA,CAAK,SAAA,CAAU,GAAA,CAAI,SAAS,CAAA;AACnD,QAAA,IAAI,CAAC,cAAA,EAAgB;AACnB,UAAA,OAAO,EAAC;AAAA,QACV;AACA,QAAA,OAAO,KAAA,CAAM,IAAA,CAAK,cAAA,CAAe,IAAA,EAAM,CAAA;AAAA,MACzC;AAAA;AAAA;AAAA;AAAA,MAKA,cAAc,SAAA,EAA6B;AACzC,QAAA,OAAO,IAAA,CAAK,KAAK,SAAS,CAAA;AAAA,MAC5B;AAAA;AAAA;AAAA;AAAA;AAAA,MAMA,cAAA,GAA2B;AACzB,QAAA,OAAO,KAAA,CAAM,IAAA,CAAK,IAAA,CAAK,SAAA,CAAU,MAAM,CAAA;AAAA,MACzC;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,MASA,MAAM,IAAA,CACJ,SAAA,EACA,YAAA,EACA,OAAA,EACuB;AACvB,QAAA,MAAM,QAAA,GAAW,IAAA,CAAK,GAAA,CAAI,SAAA,EAAW,YAAY,CAAA;AAEjD,QAAA,IAAI,CAAC,QAAA,EAAU;AACb,UAAA,MAAM,IAAI,KAAA;AAAA,YACR,CAAA,UAAA,EAAa,YAAY,CAAA,uBAAA,EAA0B,SAAS,CAAA,CAAA;AAAA,WAC9D;AAAA,QACF;AAGA,QAAA,IAAI,QAAA,CAAS,MAAA,KAAW,OAAA,CAAQ,MAAA,EAAQ;AACtC,UAAA,MAAM,IAAI,KAAA;AAAA,YACR,CAAA,kCAAA,EAAqC,QAAA,CAAS,MAAM,CAAA,MAAA,EAAS,QAAQ,MAAM,CAAA;AAAA,WAC7E;AAAA,QACF;AAEA,QAAA,IAAA,CAAK,MAAA,CAAO,KAAA;AAAA,UACV,qBAAqB,YAAY,CAAA,aAAA,EAAgB,SAAS,CAAA,cAAA,EAAiB,QAAQ,MAAM,CAAA;AAAA,SAC3F;AAEA,QAAA,IAAI;AACF,UAAA,OAAO,MAAM,QAAA,CAAS,OAAA,CAAQ,OAAO,CAAA;AAAA,QACvC,SAAS,KAAA,EAAO;AACd,UAAA,IAAA,CAAK,MAAA,CAAO,KAAA;AAAA,YACV,CAAA,wBAAA,EAA2B,YAAY,CAAA,aAAA,EAAgB,SAAS,CAAA,EAAA,CAAA;AAAA,YAChE;AAAA,WACF;AACA,UAAA,MAAM,KAAA;AAAA,QACR;AAAA,MACF;AAAA;AAAA;AAAA;AAAA,MAKA,QAAA,GAIE;AACA,QAAA,MAAM,KAAA,GAAQ;AAAA,UACZ,eAAA,EAAiB,KAAK,SAAA,CAAU,IAAA;AAAA,UAChC,cAAA,EAAgB,CAAA;AAAA,UAChB,kBAAkB;AAAC,SACrB;AAEA,QAAA,KAAA,MAAW,CAAC,SAAA,EAAW,SAAS,CAAA,IAAK,KAAK,SAAA,EAAW;AACnD,UAAA,MAAM,QAAQ,SAAA,CAAU,IAAA;AACxB,UAAA,KAAA,CAAM,cAAA,IAAkB,KAAA;AACxB,UAAA,KAAA,CAAM,gBAAA,CAAiB,SAAS,CAAA,GAAI,KAAA;AAAA,QACtC;AAEA,QAAA,OAAO,KAAA;AAAA,MACT;AAAA;AAAA;AAAA;AAAA,MAKA,KAAA,GAAc;AACZ,QAAA,IAAA,CAAK,UAAU,KAAA,EAAM;AACrB,QAAA,IAAA,CAAK,MAAA,CAAO,MAAM,qCAAqC,CAAA;AAAA,MACzD;AAAA;AAAA;AAAA;AAAA,MAKA,WAAW,SAAA,EAAyB;AAClC,QAAA,IAAA,CAAK,SAAA,CAAU,OAAO,SAAS,CAAA;AAC/B,QAAA,IAAA,CAAK,MAAA,CAAO,KAAA,CAAM,CAAA,kCAAA,EAAqC,SAAS,CAAA,CAAA,CAAG,CAAA;AAAA,MACrE;AAAA,KACF;AA7Ja,IAAAA,wBAAA,GAAN,eAAA,CAAA;AAAA,MADNE,iBAAAA;AAAW,KAAA,EACCF,wBAAA,CAAA;AAAA,EAAA;AAAA,CAAA,CAAA;;;ACjDb,IAAA,2BAAA,GAAA,EAAA;AAAA,QAAA,CAAA,2BAAA,EAAA;AAAA,EAAA,qBAAA,EAAA,MAAAG,6BAAA;AAAA,EAAA,QAAA,EAAA,MAAA,QAAA;AAAA,EAAA,UAAA,EAAA,MAAA,UAAA;AAAA,EAAA,aAAA,EAAA,MAAA,aAAA;AAAA,EAAA,eAAA,EAAA,MAAA,eAAA;AAAA,EAAA,yBAAA,EAAA,MAAA,yBAAA;AAAA,EAAA,kBAAA,EAAA,MAAA,kBAAA;AAAA,EAAA,mBAAA,EAAA,MAAA,mBAAA;AAAA,EAAA,0BAAA,EAAA,MAAA,0BAAA;AAAA,EAAA,4BAAA,EAAA,MAAA,4BAAA;AAAA,EAAA,cAAA,EAAA,MAAA,cAAA;AAAA,EAAA,4BAAA,EAAA,MAAA;AAAA,CAAA,CAAA;AAgCO,SAAS,QAAA,CAAS,MAAc,OAAA,EAA0B;AAC/D,EAAA,OAAO,SACL,MAAA,EACA,WAAA,EACA,UAAA,EACA;AAEA,IAAA,MAAM,mBACJ,OAAA,CAAQ,WAAA,CAAYA,+BAAuB,MAAA,CAAO,WAAW,KAAK,EAAC;AAGrE,IAAA,MAAM,QAAA,GAA6B;AAAA,MACjC,IAAA;AAAA,MACA,QAAQ,OAAA,CAAQ,MAAA;AAAA,MAChB,UAAA,EAAY,WAAA;AAAA,MACZ,QAAQ,OAAA,CAAQ;AAAA,KAClB;AAEA,IAAA,gBAAA,CAAiB,KAAK,QAAQ,CAAA;AAG9B,IAAA,OAAA,CAAQ,cAAA;AAAA,MACNA,6BAAA;AAAA,MACA,gBAAA;AAAA,MACA,MAAA,CAAO;AAAA,KACT;AAAA,EACF,CAAA;AACF;AAMO,SAAS,cAAc,MAAA,EAAa;AAEzC,EAAA,IAAI,CAAC,OAAA,CAAQ,WAAA,CAAYA,6BAAA,EAAuB,MAAM,CAAA,EAAG;AACvD,IAAA,OAAA,CAAQ,cAAA,CAAeA,6BAAA,EAAuB,EAAC,EAAG,MAAM,CAAA;AAAA,EAC1D;AACF;AAOO,SAAS,oBAAoB,WAAA,EAAsC;AACxE,EAAA,OAAO,OAAA,CAAQ,WAAA,CAAYA,6BAAA,EAAuB,WAAW,KAAK,EAAC;AACrE;AAQO,SAAS,yBAAA,CACd,UACA,QAAA,EACsB;AACtB,EAAA,OAAO,QAAA,CAAS,IAAI,CAAA,IAAA,MAAS;AAAA,IAC3B,MAAM,IAAA,CAAK,IAAA;AAAA,IACX,QAAQ,IAAA,CAAK,MAAA;AAAA,IACb,QAAQ,IAAA,CAAK,MAAA;AAAA,IACb,OAAA,EAAS,OAAM,GAAA,KAAO;AACpB,MAAA,MAAM,MAAA,GAAS,QAAA,CAAS,IAAA,CAAK,UAAU,CAAA;AACvC,MAAA,IAAI,OAAO,WAAW,UAAA,EAAY;AAChC,QAAA,MAAM,IAAI,KAAA,CAAM,CAAA,OAAA,EAAU,IAAA,CAAK,UAAU,CAAA,sBAAA,CAAwB,CAAA;AAAA,MACnE;AACA,MAAA,OAAO,MAAA,CAAO,IAAA,CAAK,QAAA,EAAU,GAAG,CAAA;AAAA,IAClC;AAAA,GACF,CAAE,CAAA;AACJ;AAQO,SAAS,kBAAA,CACd,aACA,YAAA,EACoB;AACpB,EAAA,MAAM,QAAA,GAAW,oBAAoB,WAAW,CAAA;AAChD,EAAA,MAAM,WAAW,QAAA,CAAS,IAAA,CAAK,CAAA,IAAA,KAAQ,IAAA,CAAK,SAAS,YAAY,CAAA;AACjE,EAAA,OAAO,QAAA,EAAU,UAAA;AACnB;AAiCO,SAAS,gBAAgB,SAAA,EAAmB;AACjD,EAAA,OAAO,SAAkD,WAAA,EAAgB;AAEvE,IAAA,OAAA,CAAQ,cAAA;AAAA,MACN,8BAAA;AAAA,MACA,EAAE,SAAA,EAAU;AAAA,MACZ;AAAA,KACF;AACA,IAAA,OAAO,WAAA;AAAA,EACT,CAAA;AACF;AAQO,SAAS,UAAA,CACd,YAAA,EACA,MAAA,GAAyB,KAAA,EACzB;AACA,EAAA,OAAO,SACL,MAAA,EACA,WAAA,EACA,UAAA,EACA;AAEA,IAAA,MAAM,kBACJ,OAAA,CAAQ,WAAA;AAAA,MACN,+BAAA;AAAA,MACA,MAAA,CAAO;AAAA,SACJ,EAAC;AAGR,IAAA,MAAM,cAAA,GAA2C;AAAA,MAC/C,YAAA;AAAA,MACA,MAAA;AAAA,MACA,UAAA,EAAY;AAAA,KACd;AAEA,IAAA,eAAA,CAAgB,KAAK,cAAc,CAAA;AAGnC,IAAA,OAAA,CAAQ,cAAA;AAAA,MACN,+BAAA;AAAA,MACA,eAAA;AAAA,MACA,MAAA,CAAO;AAAA,KACT;AAEA,IAAA,OAAO,UAAA;AAAA,EACT,CAAA;AACF;AAKO,SAAS,2BACd,WAAA,EACgC;AAChC,EAAA,OACE,OAAA,CAAQ,WAAA,CAAY,8BAAA,EAAgC,WAAW,CAAA,IAAK,IAAA;AAExE;AAKO,SAAS,6BACd,WAAA,EAC4B;AAC5B,EAAA,OACE,OAAA,CAAQ,WAAA,CAAY,+BAAA,EAAiC,WAAW,KAAK,EAAC;AAE1E;AAKO,SAAS,eAAe,WAAA,EAA2B;AACxD,EAAA,OAAO,0BAAA,CAA2B,WAAW,CAAA,KAAM,IAAA;AACrD;AAQO,SAAS,4BAAA,CACd,gBAAA,EACA,aAAA,EACA,QAAA,EACM;AAEN,EAAA,MAAM,aAAA,GAAgB,2BAA2B,aAAa,CAAA;AAC9D,EAAA,IAAI,CAAC,aAAA,EAAe;AAClB,IAAA;AAAA,EACF;AAGA,EAAA,MAAM,eAAA,GAAkB,6BAA6B,aAAa,CAAA;AAClE,EAAA,IAAI,eAAA,CAAgB,WAAW,CAAA,EAAG;AAChC,IAAA;AAAA,EACF;AAGA,EAAA,OAAA,CAAQ,IAAI,qCAAA,EAAuC;AAAA,IACjD,WAAA,EAAa,CAAC,CAAC,QAAA;AAAA,IACf,eAAe,CAAC,QAAA;AAAA,IAChB,WAAW,aAAA,CAAc;AAAA,GAC1B,CAAA;AAED,EAAA,MAAM,gBAAA,GAAmB,QAAA,IAAY,IAAI,aAAA,EAAc;AAGvD,EAAA,MAAM,WAAA,GAAc,eAAA,CAAgB,GAAA,CAAI,CAAA,IAAA,MAAS;AAAA,IAC/C,MAAM,IAAA,CAAK,YAAA;AAAA,IACX,QAAQ,IAAA,CAAK,MAAA;AAAA,IACb,OAAA,EAAS,OAAO,GAAA,KAAa;AAC3B,MAAA,MAAM,MAAA,GAAS,gBAAA,CAAiB,IAAA,CAAK,UAAoB,CAAA;AACzD,MAAA,IAAI,OAAO,WAAW,UAAA,EAAY;AAChC,QAAA,MAAM,IAAI,KAAA;AAAA,UACR,CAAA,OAAA,EAAU,MAAA,CAAO,IAAA,CAAK,UAAU,CAAC,CAAA,sBAAA;AAAA,SACnC;AAAA,MACF;AACA,MAAA,OAAO,MAAA,CAAO,IAAA,CAAK,gBAAA,EAAkB,GAAG,CAAA;AAAA,IAC1C;AAAA,GACF,CAAE,CAAA;AAGF,EAAA,gBAAA,CAAiB,gBAAA,CAAiB,aAAA,CAAc,SAAA,EAAW,WAAW,CAAA;AACxE;AApRaA,4CAgIP,8BAAA,CAAA,CACA;AAxIN,IAAA,wBAAA,GAAA,KAAA,CAAA;AAAA,EAAA,qCAAA,GAAA;AAOO,IAAMA,6BAAA,GAAwB,iBAAA;AAgIrC,IAAM,8BAAA,GAAiC,OAAO,mBAAmB,CAAA;AACjE,IAAM,+BAAA,GAAkC,OAAO,qBAAqB,CAAA;AAAA,EAAA;AAAA,CAAA,CAAA;ACzHvDC;AAfb,IAAA,2BAAA,GAAA,KAAA,CAAA;AAAA,EAAA,wCAAA,GAAA;AAIA,IAAA,wBAAA,EAAA;AAWO,IAAMA,sCAAN,MAA0D;AAAA,MAG/D,WAAA,CAC+B,gBAAA,EACA,eAAA,EACZ,gBAAA,EACjB;AAH6B,QAAA,IAAA,CAAA,gBAAA,GAAA,gBAAA;AACA,QAAA,IAAA,CAAA,eAAA,GAAA,eAAA;AACZ,QAAA,IAAA,CAAA,gBAAA,GAAA,gBAAA;AAAA,MAChB;AAAA,MANc,MAAA,GAAS,IAAIH,aAAAA,CAAOG,mCAAA,CAA4B,IAAI,CAAA;AAAA,MAQrE,MAAM,YAAA,GAAe;AACnB,QAAA,MAAM,KAAK,mBAAA,EAAoB;AAAA,MACjC;AAAA;AAAA;AAAA;AAAA;AAAA,MAMA,MAAM,mBAAA,GAAqC;AACzC,QAAA,IAAA,CAAK,MAAA,CAAO,IAAI,oCAAoC,CAAA;AAGpD,QAAA,IAAI,CAAC,KAAK,gBAAA,EAAkB;AAC1B,UAAA,IAAA,CAAK,MAAA,CAAO,IAAA;AAAA,YACV;AAAA,WACF;AACA,UAAA;AAAA,QACF;AAGA,QAAA,MAAM,SAAA,GAAY,IAAA,CAAK,gBAAA,CAAiB,YAAA,EAAa;AAErD,QAAA,IAAI,eAAA,GAAkB,CAAA;AACtB,QAAA,IAAI,cAAA,GAAiB,CAAA;AAErB,QAAA,KAAA,MAAW,YAAY,SAAA,EAAW;AAChC,UAAA,IAAI;AACF,YAAA,MAAM,EAAE,QAAA,EAAU,QAAA,EAAS,GAAI,QAAA;AAG/B,YAAA,IAAI,CAAC,QAAA,IAAY,CAAC,QAAA,EAAU;AAC1B,cAAA;AAAA,YACF;AAGA,YAAA,IAAI,cAAA,CAAe,QAAQ,CAAA,EAAG;AAC5B,cAAA,IAAA,CAAK,MAAA,CAAO,KAAA,CAAM,CAAA,0BAAA,EAA6B,QAAA,CAAS,IAAI,CAAA,CAAE,CAAA;AAC9D,cAAA,OAAA,CAAQ,IAAI,iCAAA,EAAmC;AAAA,gBAC7C,WAAW,QAAA,CAAS,IAAA;AAAA,gBACpB,WAAA,EAAa,CAAC,CAAC,QAAA;AAAA,gBACf,cAAc,OAAO;AAAA,eACtB,CAAA;AAGD,cAAA,4BAAA;AAAA,gBACE,IAAA,CAAK,gBAAA;AAAA,gBACL,QAAA;AAAA,gBACA;AAAA,eACF;AAEA,cAAA,eAAA,EAAA;AAGA,cAAA,MAAM,QAAA,GAAW,IAAA,CAAK,yBAAA,CAA0B,QAAQ,CAAA;AACxD,cAAA,cAAA,IAAkB,QAAA;AAElB,cAAA,IAAA,CAAK,MAAA,CAAO,GAAA;AAAA,gBACV,CAAA,WAAA,EAAc,QAAQ,CAAA,mBAAA,EAAsB,QAAA,CAAS,IAAI,CAAA;AAAA,eAC3D;AAAA,YACF;AAAA,UACF,SAAS,KAAA,EAAO;AACd,YAAA,IAAA,CAAK,MAAA,CAAO,IAAA,CAAK,CAAA,4BAAA,EAA+B,KAAA,CAAM,OAAO,CAAA,CAAE,CAAA;AAAA,UACjE;AAAA,QACF;AAEA,QAAA,IAAA,CAAK,MAAA,CAAO,IAAI,CAAA,iCAAA,CAAmC,CAAA;AACnD,QAAA,IAAA,CAAK,MAAA,CAAO,GAAA;AAAA,UACV,CAAA,OAAA,EAAU,eAAe,CAAA,UAAA,EAAa,cAAc,CAAA,gBAAA;AAAA,SACtD;AAGA,QAAA,MAAM,KAAA,GAAQ,IAAA,CAAK,gBAAA,CAAiB,QAAA,EAAS;AAC7C,QAAA,IAAA,CAAK,MAAA,CAAO,GAAA;AAAA,UACV,CAAA,UAAA,EAAa,KAAA,CAAM,eAAe,CAAA,cAAA,EAAiB,MAAM,cAAc,CAAA,UAAA;AAAA,SACzE;AAAA,MACF;AAAA;AAAA;AAAA;AAAA,MAKQ,0BAA0B,QAAA,EAAuB;AACvD,QAAA,MAAM,EAAE,4BAAA,EAAAC,6BAAAA,EAA6B,IAAI,wBAAA,EAAA,EAAA,YAAA,CAAA,2BAAA,CAAA,CAAA;AACzC,QAAA,MAAM,OAAA,GAAUA,8BAA6B,QAAQ,CAAA;AACrD,QAAA,OAAO,OAAA,CAAQ,MAAA;AAAA,MACjB;AAAA,KACF;AA9Fa,IAAAD,mCAAA,GAAN,eAAA,CAAA;AAAA,MADNF,iBAAAA,EAAW;AAAA,MAKP,eAAA,CAAA,CAAA,EAAAI,eAAA,EAAS,CAAA;AAAA,MACT,eAAA,CAAA,CAAA,EAAAA,eAAA,EAAS;AAAA,KAAA,EALDF,mCAAA,CAAA;AAAA,EAAA;AAAA,CAAA,CAAA;ACmBAG;AAlCb,IAAA,2BAAA,GAAA,KAAA,CAAA;AAAA,EAAA,wCAAA,GAAA;AAkCO,IAAMA,+BAAN,MAA2B;AAAA,MAGhC,WAAA,CACmB,kBACA,eAAA,EACjB;AAFiB,QAAA,IAAA,CAAA,gBAAA,GAAA,gBAAA;AACA,QAAA,IAAA,CAAA,eAAA,GAAA,eAAA;AAAA,MAChB;AAAA,MALc,MAAA,GAAS,IAAIN,aAAAA,CAAOM,4BAAA,CAAqB,IAAI,CAAA;AAAA,MAkB9D,MAAM,mBAA2B,GAAA,EAA2C;AAC1E,QAAA,IAAA,CAAK,MAAA,CAAO,KAAA;AAAA,UACV,CAAA,0BAAA,EAA6B,GAAA,CAAI,SAAS,CAAA,CAAA,EAAI,IAAI,QAAQ,CAAA;AAAA,SAC5D;AAEA,QAAA,IAAA,CAAK,MAAA,CAAO,MAAM,uCAAA,EAAyC;AAAA,UACzD,WAAW,GAAA,CAAI,SAAA;AAAA,UACf,UAAU,GAAA,CAAI,QAAA;AAAA,UACd,QAAQ,GAAA,CAAI,MAAA;AAAA,UACZ,MAAM,GAAA,CAAI,IAAA;AAAA,UACV,SAAS,GAAA,CAAI;AAAA,SACd,CAAA;AAED,QAAA,IAAI;AAEF,UAAA,MAAM,OAAA,GAA0B;AAAA,YAC9B,MAAA,EAAQ,IAAI,OAAA,CAAQ,MAAA;AAAA,YACpB,SAAA,EAAW,IAAI,OAAA,CAAQ,SAAA;AAAA,YACvB,QAAQ,GAAA,CAAI,MAAA;AAAA,YACZ,SAAS,GAAA,CAAI,IAAA;AAAA,YACb,OAAA,EAAS,GAAA,CAAI,OAAA,CAAQ,OAAA,IAAW,KAAA;AAAA,YAChC,QAAA,EAAU,IAAI,OAAA,CAAQ;AAAA,WACxB;AAEA,UAAA,IAAA,CAAK,MAAA,CAAO,KAAA,CAAM,sBAAA,EAAwB,OAAO,CAAA;AAGjD,UAAA,MAAM,MAAA,GAAS,MAAM,IAAA,CAAK,gBAAA,CAAiB,IAAA;AAAA,YACzC,GAAA,CAAI,SAAA;AAAA,YACJ,GAAA,CAAI,QAAA;AAAA,YACJ;AAAA,WACF;AAEA,UAAA,IAAA,CAAK,MAAA,CAAO,KAAA;AAAA,YACV,CAAA,2BAAA,EAA8B,GAAA,CAAI,SAAS,CAAA,CAAA,EAAI,IAAI,QAAQ,CAAA;AAAA,WAC7D;AAEA,UAAA,OAAO,MAAA;AAAA,QACT,SAAS,KAAA,EAAY;AACnB,UAAA,IAAA,CAAK,MAAA,CAAO,KAAA;AAAA,YACV,CAAA,sBAAA,EAAyB,GAAA,CAAI,SAAS,CAAA,CAAA,EAAI,IAAI,QAAQ,CAAA,CAAA,CAAA;AAAA,YACtD,KAAA,CAAM;AAAA,WACR;AAEA,UAAA,IAAI,KAAA,CAAM,OAAA,CAAQ,QAAA,CAAS,WAAW,CAAA,EAAG;AACvC,YAAA,MAAM,IAAIC,wBAAA,CAAkB,KAAA,CAAM,OAAO,CAAA;AAAA,UAC3C;AAEA,UAAA,MAAM,IAAIC,mCAAA;AAAA,YACR,CAAA,oBAAA,EAAuB,MAAM,OAAO,CAAA;AAAA,WACtC;AAAA,QACF;AAAA,MACF;AAAA,MAUA,MAAM,gBAAA,CACgB,SAAA,EACE,MAAA,EACR;AACd,QAAA,IAAA,CAAK,MAAA,CAAO,KAAA,CAAM,CAAA,4BAAA,EAA+B,SAAS,CAAA,CAAE,CAAA;AAE5D,QAAA,IAAI;AAEF,UAAA,MAAM,OAAA,GAAU,KAAK,eAAA,CAClB,WAAA,GACA,IAAA,CAAK,CAAA,CAAA,KAAK,CAAA,CAAE,SAAA,KAAc,SAAS,CAAA;AAEtC,UAAA,IAAI,CAAC,OAAA,EAAS;AACZ,YAAA,MAAM,IAAID,wBAAA,CAAkB,CAAA,MAAA,EAAS,SAAS,CAAA,sBAAA,CAAwB,CAAA;AAAA,UACxE;AAGA,UAAA,MAAM,WAAY,OAAA,CAAgB,QAAA;AAElC,UAAA,IAAI,CAAC,QAAA,EAAU;AACb,YAAA,IAAA,CAAK,MAAA,CAAO,IAAA;AAAA,cACV,eAAe,SAAS,CAAA,kCAAA;AAAA,aAC1B;AAEA,YAAA,OAAO;AAAA,cACL,SAAA;AAAA,cACA,IAAA,EAAM,SAAA;AAAA,cACN,SAAS,OAAA,CAAQ,OAAA;AAAA,cACjB,EAAA,EAAI;AAAA,gBACF,OAAA,EAAS;AAAA;AACX,aACF;AAAA,UACF;AAEA,UAAA,IAAA,CAAK,MAAA,CAAO,KAAA;AAAA,YACV,sBAAsB,SAAS,CAAA,kBAAA,EAAqB,CAAC,CAAC,QAAA,CAAS,IAAI,OAAO,CAAA;AAAA,WAC5E;AAEA,UAAA,OAAO,QAAA;AAAA,QACT,SAAS,KAAA,EAAY;AACnB,UAAA,IAAA,CAAK,MAAA,CAAO,KAAA;AAAA,YACV,8BAA8B,SAAS,CAAA,CAAA,CAAA;AAAA,YACvC,KAAA,CAAM;AAAA,WACR;AACA,UAAA,MAAM,IAAIA,wBAAA,CAAkB,CAAA,MAAA,EAAS,SAAS,CAAA,UAAA,CAAY,CAAA;AAAA,QAC5D;AAAA,MACF;AAAA,MAaA,MAAM,aAAA,CACgB,SAAA,EACE,MAAA,EACH;AACnB,QAAA,IAAA,CAAK,MAAA,CAAO,KAAA,CAAM,CAAA,4BAAA,EAA+B,SAAS,CAAA,CAAE,CAAA;AAE5D,QAAA,IAAI;AACF,UAAA,MAAM,SAAA,GAAY,IAAA,CAAK,gBAAA,CAAiB,aAAA,CAAc,SAAS,CAAA;AAE/D,UAAA,IAAA,CAAK,OAAO,KAAA,CAAM,CAAA,MAAA,EAAS,UAAU,MAAM,CAAA,eAAA,EAAkB,SAAS,CAAA,CAAE,CAAA;AAExE,UAAA,OAAO,SAAA;AAAA,QACT,SAAS,KAAA,EAAY;AACnB,UAAA,IAAA,CAAK,MAAA,CAAO,KAAA;AAAA,YACV,gCAAgC,SAAS,CAAA,CAAA,CAAA;AAAA,YACzC,KAAA,CAAM;AAAA,WACR;AACA,UAAA,OAAO,EAAC;AAAA,QACV;AAAA,MACF;AAAA,MAYA,MAAM,eAAA,CACkB,MAAA,EACG,SAAA,EACT;AAChB,QAAA,IAAA,CAAK,MAAA,CAAO,MAAM,wBAAwB,CAAA;AAE1C,QAAA,IAAI;AAEF,UAAA,MAAM,UAAA,GAAa,IAAA,CAAK,gBAAA,CAAiB,cAAA,EAAe;AAGxD,UAAA,MAAM,OAAA,GAAU,UAAA,CAAW,GAAA,CAAI,CAAA,SAAA,MAAc;AAAA,YAC3C,SAAA;AAAA,YACA,IAAA,EAAM,SAAA;AAAA,YACN,EAAA,EAAI;AAAA,cACF,SAAS,IAAA,CAAK,gBAAA,CAAiB,aAAA,CAAc,SAAS,EAAE,MAAA,GAAS;AAAA;AACnE,WACF,CAAE,CAAA;AAEF,UAAA,IAAA,CAAK,MAAA,CAAO,KAAA,CAAM,CAAA,uBAAA,EAA0B,OAAA,CAAQ,MAAM,CAAA,OAAA,CAAS,CAAA;AAEnE,UAAA,OAAO,OAAA;AAAA,QACT,SAAS,KAAA,EAAY;AACnB,UAAA,IAAA,CAAK,MAAA,CAAO,KAAA,CAAM,8BAAA,EAAgC,KAAA,CAAM,OAAO,CAAA;AAC/D,UAAA,OAAO,EAAC;AAAA,QACV;AAAA,MACF;AAAA,KACF;AAnLQ,IAAA,eAAA,CAAA;AAAA,MAPLE,YAAK,aAAa,CAAA;AAAA,MAClBC,oBAAAA,CAAa,EAAE,OAAA,EAAS,iCAAA,EAAmC,CAAA;AAAA,MAC3DC,mBAAAA,CAAY;AAAA,QACX,MAAA,EAAQ,GAAA;AAAA,QACR,WAAA,EAAa;AAAA,OACd,CAAA;AAAA,MACAA,oBAAY,EAAE,MAAA,EAAQ,GAAA,EAAK,WAAA,EAAa,sBAAsB,CAAA;AAAA,MACrC,eAAA,CAAA,CAAA,EAAAC,WAAA,EAAK;AAAA,KAAA,EAnBpBN,4BAAA,CAmBL,SAAA,EAAA,oBAAA,EAAA,CAAA,CAAA;AA8DA,IAAA,eAAA,CAAA;AAAA,MAJLO,WAAI,qBAAqB,CAAA;AAAA,MACzBH,oBAAAA,CAAa,EAAE,OAAA,EAAS,0CAAA,EAA4C,CAAA;AAAA,MACpEC,oBAAY,EAAE,MAAA,EAAQ,GAAA,EAAK,WAAA,EAAa,kBAAkB,CAAA;AAAA,MAC1DA,oBAAY,EAAE,MAAA,EAAQ,GAAA,EAAK,WAAA,EAAa,mBAAmB,CAAA;AAAA,MAEzD,gCAAM,WAAW,CAAA,CAAA;AAAA,MACjB,kCAAQ,WAAW,CAAA;AAAA,KAAA,EAnFXL,4BAAA,CAiFL,SAAA,EAAA,kBAAA,EAAA,CAAA,CAAA;AA2DA,IAAA,eAAA,CAAA;AAAA,MAPLO,WAAI,sBAAsB,CAAA;AAAA,MAC1BH,oBAAAA,CAAa,EAAE,OAAA,EAAS,+BAAA,EAAiC,CAAA;AAAA,MACzDC,mBAAAA,CAAY;AAAA,QACX,MAAA,EAAQ,GAAA;AAAA,QACR,WAAA,EAAa,wBAAA;AAAA,QACb,IAAA,EAAM,CAAC,MAAM;AAAA,OACd,CAAA;AAAA,MAEE,gCAAM,WAAW,CAAA,CAAA;AAAA,MACjB,kCAAQ,WAAW,CAAA;AAAA,KAAA,EA9IXL,4BAAA,CA4IL,SAAA,EAAA,eAAA,EAAA,CAAA,CAAA;AA+BA,IAAA,eAAA,CAAA;AAAA,MANLO,WAAI,SAAS,CAAA;AAAA,MACbH,oBAAAA,CAAa,EAAE,OAAA,EAAS,2BAAA,EAA6B,CAAA;AAAA,MACrDC,mBAAAA,CAAY;AAAA,QACX,MAAA,EAAQ,GAAA;AAAA,QACR,WAAA,EAAa;AAAA,OACd,CAAA;AAAA,MAEE,kCAAQ,WAAW,CAAA,CAAA;AAAA,MACnB,kCAAQ,cAAc,CAAA;AAAA,KAAA,EA7KdL,4BAAA,CA2KL,SAAA,EAAA,iBAAA,EAAA,CAAA,CAAA;AA3KK,IAAAA,4BAAA,GAAN,eAAA,CAAA;AAAA,MAFNQ,gBAAQ,aAAa,CAAA;AAAA,MACrBC,kBAAW,WAAW;AAAA,KAAA,EACVT,4BAAA,CAAA;AAAA,EAAA;AAAA,CAAA,CAAA;;;AClCb,IAAA,gBAAA,GAAA,EAAA;AAAA,QAAA,CAAA,gBAAA,EAAA;AAAA,EAAA,qBAAA,EAAA,MAAAJ,6BAAA;AAAA,EAAA,QAAA,EAAA,MAAA,QAAA;AAAA,EAAA,gBAAA,EAAA,MAAAH,wBAAA;AAAA,EAAA,oBAAA,EAAA,MAAAO,4BAAA;AAAA,EAAA,UAAA,EAAA,MAAA,UAAA;AAAA,EAAA,2BAAA,EAAA,MAAAH,mCAAA;AAAA,EAAA,aAAA,EAAA,MAAA,aAAA;AAAA,EAAA,eAAA,EAAA,MAAA,eAAA;AAAA,EAAA,yBAAA,EAAA,MAAA,yBAAA;AAAA,EAAA,kBAAA,EAAA,MAAA,kBAAA;AAAA,EAAA,mBAAA,EAAA,MAAA,mBAAA;AAAA,EAAA,0BAAA,EAAA,MAAA,0BAAA;AAAA,EAAA,4BAAA,EAAA,MAAA,4BAAA;AAAA,EAAA,cAAA,EAAA,MAAA,cAAA;AAAA,EAAA,4BAAA,EAAA,MAAA;AAAA,CAAA,CAAA;AAAA,IAAA,aAAA,GAAA,KAAA,CAAA;AAAA,EAAA,uBAAA,GAAA;AAAA,IAAA,sBAAA,EAAA;AACA,IAAA,wBAAA,EAAA;AACA,IAAA,2BAAA,EAAA;AACA,IAAA,2BAAA,EAAA;AAAA,EAAA;AAAA,CAAA,CAAA;;;ACHA,IAAA,4BAAA,GAAA,EAAA;AAAA,QAAA,CAAA,4BAAA,EAAA;AAAA,EAAA,kBAAA,EAAA,MAAAa;AAAA,CAAA,CAAA;AAqBaA;AArBb,IAAA,yBAAA,GAAA,KAAA,CAAA;AAAA,EAAA,+CAAA,GAAA;AAqBO,IAAMA,6BAAN,MAA6D;AAAA,MACjD,MAAA,GAAS,IAAIhB,aAAAA,CAAOgB,0BAAA,CAAmB,IAAI,CAAA;AAAA,MAC3C,WAAA;AAAA,MAEjB,WAAA,GAAc;AACZ,QAAA,IAAA,CAAK,WAAA,GAAmBC,gBAAA,CAAA,IAAA,CAAQC,aAAA,CAAA,OAAA,EAAQ,EAAG,WAAW,UAAU,CAAA;AAChE,QAAA,IAAA,CAAK,uBAAA,EAAwB;AAC7B,QAAA,IAAA,CAAK,oBAAA,EAAqB;AAAA,MAC5B;AAAA;AAAA;AAAA;AAAA,MAKA,MAAM,gBACJ,IAAA,EACA,OAAA,EACA,MACA,QAAA,EACA,UAAA,GAAuB,EAAC,EACT;AACf,QAAA,MAAM,YAAA,GAAoC;AAAA,UACxC,IAAA;AAAA,UACA,OAAA;AAAA,UACA,IAAA;AAAA,UACA,QAAA;AAAA,UACA,KAAK,OAAA,CAAQ,GAAA;AAAA,UACb,SAAA,EAAW,KAAK,GAAA,EAAI;AAAA,UACpB;AAAA,SACF;AAEA,QAAA,MAAM,WAAA,GAAmBD,gBAAA,CAAA,IAAA;AAAA,UACvB,IAAA,CAAK,WAAA;AAAA,UACL,CAAA,EAAG,IAAI,CAAA,CAAA,EAAI,OAAA,CAAQ,GAAG,CAAA,KAAA;AAAA,SACxB;AAEA,QAAA,IAAI;AACF,UAAA,MAASE,aAAA,CAAA,QAAA,CAAS,SAAA;AAAA,YAChB,WAAA;AAAA,YACA,IAAA,CAAK,SAAA,CAAU,YAAA,EAAc,IAAA,EAAM,CAAC;AAAA,WACtC;AAEA,UAAA,IAAA,CAAK,MAAA,CAAO,IAAI,CAAA,oBAAA,EAAuB,IAAI,OAAO,OAAO,CAAA,CAAA,EAAI,IAAI,CAAA,CAAE,CAAA;AAGnE,UAAA,OAAA,CAAQ,GAAG,MAAA,EAAQ,MAAM,IAAA,CAAK,iBAAA,CAAkB,IAAI,CAAC,CAAA;AACrD,UAAA,OAAA,CAAQ,EAAA,CAAG,UAAU,MAAM;AACzB,YAAA,IAAA,CAAK,kBAAkB,IAAI,CAAA;AAC3B,YAAA,OAAA,CAAQ,KAAK,CAAC,CAAA;AAAA,UAChB,CAAC,CAAA;AACD,UAAA,OAAA,CAAQ,EAAA,CAAG,WAAW,MAAM;AAC1B,YAAA,IAAA,CAAK,kBAAkB,IAAI,CAAA;AAC3B,YAAA,OAAA,CAAQ,KAAK,CAAC,CAAA;AAAA,UAChB,CAAC,CAAA;AAAA,QACH,SAAS,KAAA,EAAO;AACd,UAAA,IAAA,CAAK,OAAO,KAAA,CAAM,CAAA,2BAAA,EAA8B,IAAI,CAAA,EAAA,EAAK,KAAA,CAAM,OAAO,CAAA,CAAE,CAAA;AAAA,QAC1E;AAAA,MACF;AAAA;AAAA;AAAA;AAAA,MAKA,MAAM,kBAAkB,IAAA,EAA6B;AACnD,QAAA,MAAM,WAAA,GAAmBF,gBAAA,CAAA,IAAA;AAAA,UACvB,IAAA,CAAK,WAAA;AAAA,UACL,CAAA,EAAG,IAAI,CAAA,CAAA,EAAI,OAAA,CAAQ,GAAG,CAAA,KAAA;AAAA,SACxB;AAEA,QAAA,IAAI;AACF,UAAA,IAAOE,aAAA,CAAA,UAAA,CAAW,WAAW,CAAA,EAAG;AAC9B,YAAA,MAASA,aAAA,CAAA,QAAA,CAAS,OAAO,WAAW,CAAA;AACpC,YAAA,IAAA,CAAK,MAAA,CAAO,GAAA,CAAI,CAAA,sBAAA,EAAyB,IAAI,CAAA,CAAE,CAAA;AAAA,UACjD;AAAA,QACF,SAAS,KAAA,EAAO;AACd,UAAA,IAAA,CAAK,MAAA,CAAO,KAAA;AAAA,YACV,CAAA,6BAAA,EAAgC,IAAI,CAAA,EAAA,EAAK,KAAA,CAAM,OAAO,CAAA;AAAA,WACxD;AAAA,QACF;AAAA,MACF;AAAA;AAAA;AAAA;AAAA,MAKA,MAAM,YAAY,SAAA,EAOhB;AACA,QAAA,IAAI;AACF,UAAA,MAAM,KAAA,GAAQ,MAASA,aAAA,CAAA,QAAA,CAAS,OAAA,CAAQ,KAAK,WAAW,CAAA;AACxD,UAAA,MAAM,WAKD,EAAC;AAEN,UAAA,KAAA,MAAW,QAAQ,KAAA,EAAO;AACxB,YAAA,IAAI,CAAC,IAAA,CAAK,QAAA,CAAS,OAAO,CAAA,EAAG;AAE7B,YAAA,IAAI;AACF,cAAA,MAAM,WAAA,GAAmBF,gBAAA,CAAA,IAAA,CAAK,IAAA,CAAK,WAAA,EAAa,IAAI,CAAA;AACpD,cAAA,MAAM,OAAA,GAAU,MAASE,aAAA,CAAA,QAAA,CAAS,QAAA,CAAS,aAAa,OAAO,CAAA;AAC/D,cAAA,MAAM,YAAA,GAAoC,IAAA,CAAK,KAAA,CAAM,OAAO,CAAA;AAG5D,cAAA,IAAI,CAAC,IAAA,CAAK,cAAA,CAAe,YAAA,CAAa,GAAG,CAAA,EAAG;AAC1C,gBAAA,MAASA,aAAA,CAAA,QAAA,CAAS,OAAO,WAAW,CAAA;AACpC,gBAAA;AAAA,cACF;AAGA,cAAA,IACE,YAAA,CAAa,UAAA,CAAW,QAAA,CAAS,SAAS,CAAA,IAC1C,aAAa,QAAA,CAAS,UAAA,EAAY,QAAA,CAAS,SAAS,CAAA,EACpD;AACA,gBAAA,QAAA,CAAS,IAAA,CAAK;AAAA,kBACZ,MAAM,YAAA,CAAa,IAAA;AAAA,kBACnB,SAAS,YAAA,CAAa,OAAA;AAAA,kBACtB,MAAM,YAAA,CAAa,IAAA;AAAA,kBACnB,UAAU,YAAA,CAAa;AAAA,iBACxB,CAAA;AAAA,cACH;AAAA,YACF,SAAS,KAAA,EAAO;AACd,cAAA,IAAA,CAAK,MAAA,CAAO,IAAA;AAAA,gBACV,CAAA,6BAAA,EAAgC,IAAI,CAAA,EAAA,EAAK,KAAA,CAAM,OAAO,CAAA;AAAA,eACxD;AAAA,YACF;AAAA,UACF;AAEA,UAAA,OAAO,QAAA;AAAA,QACT,SAAS,KAAA,EAAO;AACd,UAAA,IAAA,CAAK,MAAA,CAAO,KAAA,CAAM,CAAA,wBAAA,EAA2B,KAAA,CAAM,OAAO,CAAA,CAAE,CAAA;AAC5D,UAAA,OAAO,EAAC;AAAA,QACV;AAAA,MACF;AAAA;AAAA;AAAA;AAAA,MAKA,MAAM,kBAAkB,WAAA,EAKd;AACR,QAAA,IAAI;AACF,UAAA,MAAM,KAAA,GAAQ,MAASA,aAAA,CAAA,QAAA,CAAS,OAAA,CAAQ,KAAK,WAAW,CAAA;AAExD,UAAA,KAAA,MAAW,QAAQ,KAAA,EAAO;AACxB,YAAA,IAAI,CAAC,IAAA,CAAK,QAAA,CAAS,OAAO,CAAA,EAAG;AAE7B,YAAA,IAAI;AACF,cAAA,MAAM,WAAA,GAAmBF,gBAAA,CAAA,IAAA,CAAK,IAAA,CAAK,WAAA,EAAa,IAAI,CAAA;AACpD,cAAA,MAAM,OAAA,GAAU,MAASE,aAAA,CAAA,QAAA,CAAS,QAAA,CAAS,aAAa,OAAO,CAAA;AAC/D,cAAA,MAAM,YAAA,GAAoC,IAAA,CAAK,KAAA,CAAM,OAAO,CAAA;AAE5D,cAAA,IACE,aAAa,IAAA,KAAS,WAAA,IACtB,KAAK,cAAA,CAAe,YAAA,CAAa,GAAG,CAAA,EACpC;AACA,gBAAA,OAAO;AAAA,kBACL,MAAM,YAAA,CAAa,IAAA;AAAA,kBACnB,SAAS,YAAA,CAAa,OAAA;AAAA,kBACtB,MAAM,YAAA,CAAa,IAAA;AAAA,kBACnB,UAAU,YAAA,CAAa;AAAA,iBACzB;AAAA,cACF;AAAA,YACF,SAAS,KAAA,EAAO;AACd,cAAA,IAAA,CAAK,MAAA,CAAO,IAAA;AAAA,gBACV,CAAA,6BAAA,EAAgC,IAAI,CAAA,EAAA,EAAK,KAAA,CAAM,OAAO,CAAA;AAAA,eACxD;AAAA,YACF;AAAA,UACF;AAEA,UAAA,OAAO,IAAA;AAAA,QACT,SAAS,KAAA,EAAO;AACd,UAAA,IAAA,CAAK,MAAA,CAAO,KAAA;AAAA,YACV,CAAA,uBAAA,EAA0B,WAAW,CAAA,EAAA,EAAK,KAAA,CAAM,OAAO,CAAA;AAAA,WACzD;AACA,UAAA,OAAO,IAAA;AAAA,QACT;AAAA,MACF;AAAA;AAAA;AAAA;AAAA,MAKQ,uBAAA,GAAgC;AACtC,QAAA,IAAI;AACF,UAAA,MAAM,SAAA,GAAiBF,gBAAA,CAAA,IAAA,CAAQC,aAAA,CAAA,OAAA,EAAQ,EAAG,SAAS,CAAA;AACnD,UAAA,IAAI,CAAIC,aAAA,CAAA,UAAA,CAAW,SAAS,CAAA,EAAG;AAC7B,YAAGA,aAAA,CAAA,SAAA,CAAU,SAAA,EAAW,EAAE,SAAA,EAAW,MAAM,CAAA;AAAA,UAC7C;AAEA,UAAA,IAAI,CAAIA,aAAA,CAAA,UAAA,CAAW,IAAA,CAAK,WAAW,CAAA,EAAG;AACpC,YAAGA,wBAAU,IAAA,CAAK,WAAA,EAAa,EAAE,SAAA,EAAW,MAAM,CAAA;AAAA,UACpD;AAAA,QACF,SAAS,KAAA,EAAO;AACd,UAAA,IAAA,CAAK,MAAA,CAAO,KAAA;AAAA,YACV,CAAA,qCAAA,EAAwC,MAAM,OAAO,CAAA;AAAA,WACvD;AAAA,QACF;AAAA,MACF;AAAA;AAAA;AAAA;AAAA,MAKA,MAAc,oBAAA,GAAsC;AAClD,QAAA,IAAI;AACF,UAAA,MAAM,KAAA,GAAQ,MAASA,aAAA,CAAA,QAAA,CAAS,OAAA,CAAQ,KAAK,WAAW,CAAA;AAExD,UAAA,KAAA,MAAW,QAAQ,KAAA,EAAO;AACxB,YAAA,IAAI,CAAC,IAAA,CAAK,QAAA,CAAS,OAAO,CAAA,EAAG;AAE7B,YAAA,IAAI;AACF,cAAA,MAAM,WAAA,GAAmBF,gBAAA,CAAA,IAAA,CAAK,IAAA,CAAK,WAAA,EAAa,IAAI,CAAA;AACpD,cAAA,MAAM,OAAA,GAAU,MAASE,aAAA,CAAA,QAAA,CAAS,QAAA,CAAS,aAAa,OAAO,CAAA;AAC/D,cAAA,MAAM,YAAA,GAAoC,IAAA,CAAK,KAAA,CAAM,OAAO,CAAA;AAG5D,cAAA,IAAI,CAAC,IAAA,CAAK,cAAA,CAAe,YAAA,CAAa,GAAG,CAAA,EAAG;AAC1C,gBAAA,MAASA,aAAA,CAAA,QAAA,CAAS,OAAO,WAAW,CAAA;AACpC,gBAAA,IAAA,CAAK,MAAA,CAAO,KAAA,CAAM,CAAA,0BAAA,EAA6B,YAAA,CAAa,IAAI,CAAA,CAAE,CAAA;AAAA,cACpE;AAAA,YACF,SAAS,KAAA,EAAO;AAEd,cAAA,IAAI;AACF,gBAAA,MAASA,uBAAS,MAAA,CAAYF,gBAAA,CAAA,IAAA,CAAK,IAAA,CAAK,WAAA,EAAa,IAAI,CAAC,CAAA;AAAA,cAC5D,CAAA,CAAA,MAAQ;AAAA,cAAC;AAAA,YACX;AAAA,UACF;AAAA,QACF,SAAS,KAAA,EAAO;AACd,UAAA,IAAA,CAAK,MAAA,CAAO,KAAA,CAAM,CAAA,kCAAA,EAAqC,KAAA,CAAM,OAAO,CAAA,CAAE,CAAA;AAAA,QACxE;AAAA,MACF;AAAA;AAAA;AAAA;AAAA,MAKQ,eAAe,GAAA,EAAsB;AAC3C,QAAA,IAAI;AACF,UAAA,OAAA,CAAQ,IAAA,CAAK,KAAK,CAAC,CAAA;AACnB,UAAA,OAAO,IAAA;AAAA,QACT,SAAS,KAAA,EAAO;AACd,UAAA,OAAO,KAAA;AAAA,QACT;AAAA,MACF;AAAA,KACF;AAzPa,IAAAD,0BAAA,GAAN,eAAA,CAAA;AAAA,MADNf,iBAAAA;AAAW,KAAA,EACCe,0BAAA,CAAA;AAAA,EAAA;AAAA,CAAA,CAAA;;;ACrBb,IAAA,gCAAA,GAAA,EAAA;AAAA,QAAA,CAAA,gCAAA,EAAA;AAAA,EAAA,sBAAA,EAAA,MAAAI;AAAA,CAAA,CAAA;AAKaA;AALb,IAAA,6BAAA,GAAA,KAAA,CAAA;AAAA,EAAA,sCAAA,GAAA;AAKO,IAAMA,iCAAN,MAA6B;AAAA,MAC1B,WAA2C,EAAC;AAAA,MAEpD,gBAAgB,OAAA,EAAuC;AAErD,QAAA,MAAM,eAAA,GAAkB,KAAK,QAAA,CAAS,IAAA;AAAA,UACpC,CAAA,CAAA,KAAK,CAAA,CAAE,SAAA,KAAc,OAAA,CAAQ;AAAA,SAC/B;AAEA,QAAA,IAAI,CAAC,eAAA,EAAiB;AACpB,UAAA,IAAA,CAAK,QAAA,CAAS,KAAK,OAAO,CAAA;AAAA,QAC5B;AAAA,MAEF;AAAA,MAEA,WAAA,GAA8C;AAC5C,QAAA,OAAO,IAAA,CAAK,QAAA;AAAA,MACd;AAAA,KACF;AAlBa,IAAAA,8BAAA,GAAN,eAAA,CAAA;AAAA,MADNnB,iBAAAA;AAAW,KAAA,EACCmB,8BAAA,CAAA;AAAA,EAAA;AAAA,CAAA,CAAA;;;ACIAC;AATb,IAAA,qBAAA,GAAA,KAAA,CAAA;AAAA,EAAA,+BAAA,GAAA;AASO,IAAMA,yBAAN,MAAqB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,MAM1B,OAAO,MAAM,QAAA,EAIX;AAEA,QAAA,IAAI,QAAA,CAAS,QAAA,CAAS,IAAI,CAAA,EAAG;AAC3B,UAAA,MAAM,CAAC,QAAA,EAAU,OAAO,CAAA,GAAI,QAAA,CAAS,MAAM,IAAI,CAAA;AAC/C,UAAA,MAAM,CAAC,SAAA,EAAW,IAAI,CAAA,GAAI,QAAA,CAAS,MAAM,GAAG,CAAA;AAC5C,UAAA,OAAO,EAAE,SAAA,EAAW,IAAA,EAAM,OAAA,EAAQ;AAAA,QACpC;AAGA,QAAA,MAAM,KAAA,GAAQ,QAAA,CAAS,KAAA,CAAM,GAAG,CAAA;AAGhC,QAAA,IAAI,KAAA,CAAM,WAAW,CAAA,EAAG;AACtB,UAAA,OAAO,EAAE,SAAA,EAAW,QAAA,EAAU,IAAA,EAAM,KAAA,CAAM,CAAC,CAAA,EAAE;AAAA,QAC/C;AAGA,QAAA,OAAO,EAAE,WAAW,KAAA,CAAM,CAAC,GAAG,IAAA,EAAM,KAAA,CAAM,CAAC,CAAA,EAAE;AAAA,MAC/C;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,MASA,OAAO,KAAA,CAAM,SAAA,EAAmB,IAAA,EAAc,OAAA,EAA0B;AACtE,QAAA,MAAM,IAAA,GAAO,CAAA,EAAG,SAAS,CAAA,CAAA,EAAI,IAAI,CAAA,CAAA;AACjC,QAAA,OAAO,OAAA,GAAU,CAAA,EAAG,IAAI,CAAA,EAAA,EAAK,OAAO,CAAA,CAAA,GAAK,IAAA;AAAA,MAC3C;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,MAOA,OAAO,UAAU,SAAA,EAA2B;AAC1C,QAAA,MAAM,EAAE,SAAA,EAAW,IAAA,EAAM,SAAQ,GAAI,IAAA,CAAK,MAAM,SAAS,CAAA;AACzD,QAAA,OAAO,IAAA,CAAK,KAAA,CAAM,SAAA,EAAW,IAAA,EAAM,OAAO,CAAA;AAAA,MAC5C;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,MAOA,OAAO,YAAY,SAAA,EAA2B;AAC5C,QAAA,IAAI,SAAA,CAAU,QAAA,CAAS,IAAI,CAAA,EAAG;AAC5B,UAAA,OAAO,SAAA,CAAU,KAAA,CAAM,IAAI,CAAA,CAAE,CAAC,CAAA;AAAA,QAChC;AAEA,QAAA,MAAM,EAAE,SAAA,EAAW,IAAA,EAAK,GAAI,IAAA,CAAK,MAAM,SAAS,CAAA;AAChD,QAAA,OAAO,CAAA,EAAG,SAAS,CAAA,CAAA,EAAI,IAAI,CAAA,CAAA;AAAA,MAC7B;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,MAOA,OAAO,WAAW,SAAA,EAAuC;AACvD,QAAA,OAAO,SAAA,CAAU,SAAS,IAAI,CAAA,GAAI,UAAU,KAAA,CAAM,IAAI,CAAA,CAAE,CAAC,CAAA,GAAI,MAAA;AAAA,MAC/D;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,MAOA,OAAO,eAAe,OAAA,EAA0B;AAE9C,QAAA,MAAM,WAAA,GAAc,mCAAA;AACpB,QAAA,OAAO,WAAA,CAAY,KAAK,OAAO,CAAA;AAAA,MACjC;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,MAOA,OAAO,cAAc,SAAA,EAA4B;AAC/C,QAAA,MAAM,EAAE,SAAA,EAAU,GAAI,IAAA,CAAK,MAAM,SAAS,CAAA;AAC1C,QAAA,OAAO,SAAA,KAAc,QAAA;AAAA,MACvB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,MAQA,OAAO,eAAA,CAAgB,CAAA,EAAW,CAAA,EAAmB;AACnD,QAAA,MAAM,YAAA,GAAe,CAAC,CAAA,KAAc;AAClC,UAAA,MAAM,CAAC,IAAA,EAAM,UAAU,CAAA,GAAI,CAAA,CAAE,MAAM,GAAG,CAAA;AACtC,UAAA,MAAM,CAAC,KAAA,EAAO,KAAA,EAAO,KAAK,CAAA,GAAI,KAAK,KAAA,CAAM,GAAG,CAAA,CAAE,GAAA,CAAI,MAAM,CAAA;AACxD,UAAA,OAAO,EAAE,KAAA,EAAO,KAAA,EAAO,KAAA,EAAO,UAAA,EAAW;AAAA,QAC3C,CAAA;AAEA,QAAA,MAAM,QAAA,GAAW,aAAa,CAAC,CAAA;AAC/B,QAAA,MAAM,QAAA,GAAW,aAAa,CAAC,CAAA;AAG/B,QAAA,IAAI,QAAA,CAAS,KAAA,KAAU,QAAA,CAAS,KAAA,EAAO;AACrC,UAAA,OAAO,QAAA,CAAS,QAAQ,QAAA,CAAS,KAAA;AAAA,QACnC;AAGA,QAAA,IAAI,QAAA,CAAS,KAAA,KAAU,QAAA,CAAS,KAAA,EAAO;AACrC,UAAA,OAAO,QAAA,CAAS,QAAQ,QAAA,CAAS,KAAA;AAAA,QACnC;AAGA,QAAA,IAAI,QAAA,CAAS,KAAA,KAAU,QAAA,CAAS,KAAA,EAAO;AACrC,UAAA,OAAO,QAAA,CAAS,QAAQ,QAAA,CAAS,KAAA;AAAA,QACnC;AAGA,QAAA,IAAI,QAAA,CAAS,UAAA,IAAc,CAAC,QAAA,CAAS,YAAY,OAAO,EAAA;AACxD,QAAA,IAAI,CAAC,QAAA,CAAS,UAAA,IAAc,QAAA,CAAS,YAAY,OAAO,CAAA;AACxD,QAAA,IAAI,QAAA,CAAS,UAAA,IAAc,QAAA,CAAS,UAAA,EAAY;AAC9C,UAAA,OAAO,QAAA,CAAS,UAAA,CAAW,aAAA,CAAc,QAAA,CAAS,UAAU,CAAA;AAAA,QAC9D;AAEA,QAAA,OAAO,CAAA;AAAA,MACT;AAAA,KACF;AAAA,EAAA;AAAA,CAAA,CAAA;;;ACjJA,IAAA,+BAAA,GAAA,EAAA;AAAA,QAAA,CAAA,+BAAA,EAAA;AAAA,EAAA,qBAAA,EAAA,MAAAC;AAAA,CAAA,CAAA;AAiBaA;AAjBb,IAAA,4BAAA,GAAA,KAAA,CAAA;AAAA,EAAA,iDAAA,GAAA;AAGA,IAAA,qBAAA,EAAA;AAcO,IAAMA,gCAAN,MAA4B;AAAA,MAChB,MAAA,GAAS,IAAItB,aAAAA,CAAOsB,6BAAA,CAAsB,IAAI,CAAA;AAAA,MAC9C,cAAA,uBAAqB,GAAA,EAA8B;AAAA,MAEpE,WAAA,GAAc;AAAA,MAGd;AAAA;AAAA;AAAA;AAAA,MAKA,mBAAmB,MAAA,EAAgC;AACjD,QAAA,IAAA,CAAK,cAAA,CAAe,GAAA,CAAI,MAAA,CAAO,aAAA,EAAe,MAAM,CAAA;AACpD,QAAA,IAAA,CAAK,MAAA,CAAO,GAAA;AAAA,UACV,6BAA6B,MAAA,CAAO,aAAa,CAAA,MAAA,EAAS,MAAA,CAAO,SAAS,MAAM,CAAA,SAAA;AAAA,SAClF;AAAA,MACF;AAAA;AAAA;AAAA;AAAA,MAKA,MAAM,cAAA,CACJ,SAAA,EACA,OAAA,GAAoC,EAAC,EACT;AAC5B,QAAA,MAAM,MAAA,GAASD,sBAAA,CAAe,KAAA,CAAM,SAAS,CAAA;AAC7C,QAAA,MAAM,QAAA,GAAWA,sBAAA,CAAe,WAAA,CAAY,SAAS,CAAA;AACrD,QAAA,MAAM,gBAAA,GACJA,sBAAA,CAAe,UAAA,CAAW,SAAS,KAAK,OAAA,CAAQ,gBAAA;AAElD,QAAA,MAAM,MAAA,GAAS,IAAA,CAAK,cAAA,CAAe,GAAA,CAAI,QAAQ,CAAA;AAC/C,QAAA,IAAI,CAAC,MAAA,EAAQ;AACX,UAAA,MAAM,IAAI,KAAA,CAAM,CAAA,sCAAA,EAAyC,QAAQ,CAAA,CAAE,CAAA;AAAA,QACrE;AAGA,QAAA,MAAM,KAAA,GAAQ,IAAA,CAAK,oBAAA,CAAqB,MAAA,EAAQ,kBAAkB,OAAO,CAAA;AACzE,QAAA,IAAI,CAAC,KAAA,EAAO;AACV,UAAA,MAAM,IAAI,KAAA;AAAA,YACR,mCAAmC,SAAS,CAAA,eAAA,EAAkB,IAAA,CAAK,SAAA,CAAU,OAAO,CAAC,CAAA;AAAA,WACvF;AAAA,QACF;AAEA,QAAA,MAAM,gBAAgBA,sBAAA,CAAe,KAAA;AAAA,UACnC,MAAA,CAAO,SAAA;AAAA,UACP,MAAA,CAAO,IAAA;AAAA,UACP,KAAA,CAAM;AAAA,SACR;AAEA,QAAA,OAAO;AAAA,UACL,SAAS,KAAA,CAAM,OAAA;AAAA,UACf,cAAc,KAAA,CAAM,YAAA;AAAA,UACpB;AAAA,SACF;AAAA,MACF;AAAA;AAAA;AAAA;AAAA,MAKA,MAAM,sBAAA,CACJ,SAAA,EACA,SAAA,EACA,OAAA,GAAoC,EAAC,EACD;AACpC,QAAA,MAAM,UAAA,GAAa,MAAM,IAAA,CAAK,cAAA,CAAe,WAAW,OAAO,CAAA;AAE/D,QAAA,IAAI;AACF,UAAA,IAAI,CAAC,SAAA,EAAW;AACd,YAAA,MAAM,IAAI,KAAA;AAAA,cACR;AAAA,aACF;AAAA,UACF;AACA,UAAA,MAAM,OAAA,GAAU,MAAM,SAAA,CAAU,MAAA,CAAO,WAAW,YAAY,CAAA;AAC9D,UAAA,IAAA,CAAK,MAAA,CAAO,KAAA;AAAA,YACV,CAAA,8BAAA,EAAiC,WAAW,aAAa,CAAA;AAAA,WAC3D;AACA,UAAA,OAAO,OAAA;AAAA,QACT,SAAS,KAAA,EAAO;AACd,UAAA,IAAA,CAAK,MAAA,CAAO,KAAA;AAAA,YACV,CAAA,6BAAA,EAAgC,UAAA,CAAW,aAAa,CAAA,EAAA,EAAK,MAAM,OAAO,CAAA;AAAA,WAC5E;AACA,UAAA,MAAM,IAAI,KAAA,CAAM,CAAA,oCAAA,EAAuC,KAAA,CAAM,OAAO,CAAA,CAAE,CAAA;AAAA,QACxE;AAAA,MACF;AAAA;AAAA;AAAA;AAAA,MAKA,qBAAqB,aAAA,EAAiC;AACpD,QAAA,MAAM,MAAA,GAAS,IAAA,CAAK,cAAA,CAAe,GAAA,CAAI,aAAa,CAAA;AACpD,QAAA,IAAI,CAAC,MAAA,EAAQ;AACX,UAAA,OAAO,EAAC;AAAA,QACV;AAEA,QAAA,OAAO,MAAA,CAAO,QAAA,CACX,GAAA,CAAI,CAAA,KAAA,KAAS,MAAM,OAAO,CAAA,CAC1B,IAAA,CAAK,CAAC,GAAG,CAAA,KAAMA,sBAAA,CAAe,eAAA,CAAgB,CAAA,EAAG,CAAC,CAAC,CAAA;AAAA,MACxD;AAAA;AAAA;AAAA;AAAA,MAKA,kBAAA,CACE,SAAA,EACA,OAAA,GAAoC,EAAC,EAC5B;AACT,QAAA,IAAI;AACF,UAAA,MAAM,QAAA,GAAWA,sBAAA,CAAe,WAAA,CAAY,SAAS,CAAA;AACrD,UAAA,MAAM,gBAAA,GAAmBA,sBAAA,CAAe,UAAA,CAAW,SAAS,CAAA;AAC5D,UAAA,MAAM,MAAA,GAAS,IAAA,CAAK,cAAA,CAAe,GAAA,CAAI,QAAQ,CAAA;AAE/C,UAAA,IAAI,CAAC,MAAA,EAAQ;AACX,YAAA,OAAO,KAAA;AAAA,UACT;AAEA,UAAA,MAAM,QAAQ,IAAA,CAAK,oBAAA;AAAA,YACjB,MAAA;AAAA,YACA,gBAAA;AAAA,YACA;AAAA,WACF;AACA,UAAA,OAAO,KAAA,KAAU,IAAA;AAAA,QACnB,CAAA,CAAA,MAAQ;AACN,UAAA,OAAO,KAAA;AAAA,QACT;AAAA,MACF;AAAA;AAAA;AAAA;AAAA,MAKQ,oBAAA,CACN,MAAA,EACA,gBAAA,EACA,OAAA,GAAoC,EAAC,EAChB;AACrB,QAAA,MAAM,EAAE,MAAA,GAAS,KAAA,EAAM,GAAI,OAAA;AAC3B,QAAA,IAAI,UAAA,GAAa,CAAC,GAAG,MAAA,CAAO,QAAQ,CAAA;AAGpC,QAAA,IAAI,gBAAA,EAAkB;AAEpB,UAAA,MAAM,aAAa,UAAA,CAAW,IAAA;AAAA,YAC5B,CAAA,KAAA,KAAS,MAAM,OAAA,KAAY;AAAA,WAC7B;AACA,UAAA,IAAI,UAAA,EAAY;AACd,YAAA,OAAO,UAAA;AAAA,UACT;AAGA,UAAA,IAAI,MAAA,EAAQ;AACV,YAAA,OAAO,IAAA;AAAA,UACT;AAGA,UAAA,MAAM,qBAAqB,UAAA,CAAW,MAAA;AAAA,YAAO,CAAA,KAAA,KAC3C,IAAA,CAAK,mBAAA,CAAoB,gBAAA,EAAkB,MAAM,OAAO;AAAA,WAC1D;AAEA,UAAA,IAAI,kBAAA,CAAmB,SAAS,CAAA,EAAG;AAEjC,YAAA,OAAO,kBAAA,CAAmB,IAAA;AAAA,cAAK,CAAC,GAAG,CAAA,KACjCA,sBAAA,CAAe,gBAAgB,CAAA,CAAE,OAAA,EAAS,EAAE,OAAO;AAAA,cACnD,CAAC,CAAA;AAAA,UACL;AAAA,QACF;AAGA,QAAA,MAAM,YAAA,GAAe,UAAA,CAAW,IAAA,CAAK,CAAA,KAAA,KAAS,MAAM,SAAS,CAAA;AAC7D,QAAA,IAAI,YAAA,EAAc;AAChB,UAAA,OAAO,YAAA;AAAA,QACT;AAGA,QAAA,IACE,MAAA,CAAO,sBAAA,KAA2B,QAAA,IAClC,CAAC,OAAO,sBAAA,EACR;AACA,UAAA,MAAM,iBAAiB,UAAA,CAAW,IAAA;AAAA,YAAK,CAAC,GAAG,CAAA,KACzCA,sBAAA,CAAe,gBAAgB,CAAA,CAAE,OAAA,EAAS,EAAE,OAAO;AAAA,WACrD;AACA,UAAA,OAAO,cAAA,CAAe,CAAC,CAAA,IAAK,IAAA;AAAA,QAC9B;AAEA,QAAA,OAAO,IAAA;AAAA,MACT;AAAA;AAAA;AAAA;AAAA,MAKQ,mBAAA,CAAoB,WAAmB,SAAA,EAA4B;AACzE,QAAA,IAAI;AACF,UAAA,MAAM,iBAAiB,SAAA,CAAU,KAAA,CAAM,GAAG,CAAA,CAAE,IAAI,MAAM,CAAA;AACtD,UAAA,MAAM,iBAAiB,SAAA,CAAU,KAAA,CAAM,GAAG,CAAA,CAAE,IAAI,MAAM,CAAA;AAGtD,UAAA,IAAI,cAAA,CAAe,CAAC,CAAA,KAAM,cAAA,CAAe,CAAC,CAAA,EAAG;AAC3C,YAAA,OAAO,KAAA;AAAA,UACT;AAGA,UAAA,OAAOA,sBAAA,CAAe,eAAA,CAAgB,SAAA,EAAW,SAAS,CAAA,IAAK,CAAA;AAAA,QACjE,CAAA,CAAA,MAAQ;AACN,UAAA,OAAO,KAAA;AAAA,QACT;AAAA,MACF;AAAA;AAAA;AAAA;AAAA,MAKA,kBAAkB,aAAA,EAAgD;AAChE,QAAA,OAAO,IAAA,CAAK,cAAA,CAAe,GAAA,CAAI,aAAa,CAAA,IAAK,IAAA;AAAA,MACnD;AAAA,KACF;AApNa,IAAAC,6BAAA,GAAN,eAAA,CAAA;AAAA,MADNrB,iBAAAA;AAAW,KAAA,EACCqB,6BAAA,CAAA;AAAA,EAAA;AAAA,CAAA,CAAA;ACAN,IAAM,gBAAN,MAAoB;AAAA,EAGzB,YAA6B,KAAA,EAAc;AAAd,IAAA,IAAA,CAAA,KAAA,GAAA,KAAA;AAC3B,IAAA,IAAA,CAAK,YAAA,GAAe,OAAA,CAAQ,GAAA,CAAI,QAAA,KAAa,YAAA;AAAA,EAC/C;AAAA,EAJiB,YAAA;AAAA,EAMT,cAAc,SAAA,EAA2B;AAI/C,IAAA,OAAO,CAAA,IAAA,EAAO,SAAS,CAAA,EAAA,EAAKC,kBAAA,CAAY,CAAC,CAAA,CAAE,QAAA,CAAS,WAAW,CAAC,CAAA,CAAA;AAAA,EAClE;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,MAAM,KAAA,EAAuC;AACjD,IAAA,MAAM,KAAA,GAAQ,IAAA,CAAK,aAAA,CAAc,KAAA,CAAM,SAAS,CAAA;AAChD,IAAA,MAAM,MAAA,GAAyB;AAAA,MAC7B,GAAG,KAAA;AAAA,MACH,KAAA;AAAA,MACA,MAAA,EAAQ,SAAA;AAAA,MACR,SAAA,EAAW,KAAK,GAAA,EAAI;AAAA,MACpB,OAAA,EAAS;AAAA,KACX;AACA,IAAA,MAAM,GAAA,GAAM,KAAA,CAAM,QAAA,EAAU,MAAA,IAAU,GAAA;AACtC,IAAA,MAAM,IAAA,CAAK,KAAA,CAAM,KAAA,CAAM,CAAA,SAAA,EAAY,KAAK,IAAI,GAAA,EAAK,IAAA,CAAK,SAAA,CAAU,MAAM,CAAC,CAAA;AACvE,IAAA,OAAO,KAAA;AAAA,EACT;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,WAAW,KAAA,EAA+C;AAC9D,IAAA,IAAI,KAAK,YAAA,EAAc;AACrB,MAAA,OAAO,IAAA,CAAK,iBAAiB,KAAK,CAAA;AAAA,IACpC,CAAA,MAAO;AACL,MAAA,OAAO,IAAA,CAAK,iBAAiB,KAAK,CAAA;AAAA,IACpC;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKA,MAAc,iBACZ,KAAA,EACgC;AAChC,IAAA,MAAM,MAAA,GAAS;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,IAAA,CAAA;AASf,IAAA,MAAM,MAAA,GAAS,MAAM,IAAA,CAAK,KAAA,CAAM,KAAK,MAAA,EAAQ,CAAA,EAAG,CAAA,SAAA,EAAY,KAAK,CAAA,CAAE,CAAA;AACnE,IAAA,OAAO,MAAA,GAAU,IAAA,CAAK,KAAA,CAAM,MAAgB,CAAA,GAAuB,IAAA;AAAA,EACrE;AAAA;AAAA;AAAA;AAAA,EAKA,MAAc,iBACZ,KAAA,EACgC;AAChC,IAAA,MAAM,GAAA,GAAM,YAAY,KAAK,CAAA,CAAA;AAC7B,IAAA,MAAM,IAAA,GAAO,MAAM,IAAA,CAAK,KAAA,CAAM,IAAI,GAAG,CAAA;AAErC,IAAA,IAAI,CAAC,IAAA,EAAM;AACT,MAAA,OAAO,IAAA;AAAA,IACT;AAEA,IAAA,IAAI;AACF,MAAA,MAAM,MAAA,GAAS,IAAA,CAAK,KAAA,CAAM,IAAI,CAAA;AAE9B,MAAA,IAAI,MAAA,CAAO,WAAW,SAAA,EAAW;AAC/B,QAAA,OAAO,IAAA;AAAA,MACT;AAGA,MAAA,MAAA,CAAO,MAAA,GAAS,YAAA;AAChB,MAAA,MAAM,KAAK,KAAA,CAAM,GAAA,CAAI,KAAK,IAAA,CAAK,SAAA,CAAU,MAAM,CAAC,CAAA;AAEhD,MAAA,OAAO,MAAA;AAAA,IACT,SAAS,KAAA,EAAO;AACd,MAAA,OAAA,CAAQ,KAAA,CAAM,oCAAoC,KAAK,CAAA;AACvD,MAAA,OAAO,IAAA;AAAA,IACT;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,SAAS,KAAA,EAA8B;AAC3C,IAAA,MAAM,IAAA,CAAK,KAAA,CAAM,GAAA,CAAI,CAAA,SAAA,EAAY,KAAK,CAAA,CAAE,CAAA;AAAA,EAC1C;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,IAAA,CAAK,KAAA,EAAe,KAAA,EAA+C;AACvE,IAAA,IAAI,KAAK,YAAA,EAAc;AACrB,MAAA,OAAO,IAAA,CAAK,UAAA,CAAW,KAAA,EAAO,KAAK,CAAA;AAAA,IACrC,CAAA,MAAO;AACL,MAAA,OAAO,IAAA,CAAK,UAAA,CAAW,KAAA,EAAO,KAAK,CAAA;AAAA,IACrC;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKA,MAAc,UAAA,CACZ,KAAA,EACA,KAAA,EACgC;AAChC,IAAA,MAAM,MAAA,GAAS;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,IAAA,CAAA;AAUf,IAAA,MAAM,MAAA,GAAS,MAAM,IAAA,CAAK,KAAA,CAAM,IAAA,CAAK,QAAQ,CAAA,EAAG,CAAA,SAAA,EAAY,KAAK,CAAA,CAAA,EAAI,KAAK,CAAA;AAC1E,IAAA,OAAO,MAAA,GAAU,IAAA,CAAK,KAAA,CAAM,MAAgB,CAAA,GAAuB,IAAA;AAAA,EACrE;AAAA;AAAA;AAAA;AAAA,EAKA,MAAc,UAAA,CACZ,KAAA,EACA,KAAA,EACgC;AAChC,IAAA,MAAM,GAAA,GAAM,YAAY,KAAK,CAAA,CAAA;AAC7B,IAAA,MAAM,IAAA,GAAO,MAAM,IAAA,CAAK,KAAA,CAAM,IAAI,GAAG,CAAA;AAErC,IAAA,IAAI,CAAC,IAAA,EAAM;AACT,MAAA,OAAO,IAAA;AAAA,IACT;AAEA,IAAA,IAAI;AACF,MAAA,MAAM,MAAA,GAAS,IAAA,CAAK,KAAA,CAAM,IAAI,CAAA;AAC9B,MAAA,MAAA,CAAO,MAAA,GAAS,QAAA;AAChB,MAAA,MAAA,CAAO,OAAA,GAAA,CAAW,MAAA,CAAO,OAAA,IAAW,CAAA,IAAK,CAAA;AACzC,MAAA,MAAA,CAAO,SAAA,GAAY,KAAA;AAEnB,MAAA,MAAM,KAAK,KAAA,CAAM,GAAA,CAAI,KAAK,IAAA,CAAK,SAAA,CAAU,MAAM,CAAC,CAAA;AAChD,MAAA,OAAO,MAAA;AAAA,IACT,SAAS,UAAA,EAAY;AACnB,MAAA,OAAA,CAAQ,KAAA,CAAM,oCAAoC,UAAU,CAAA;AAC5D,MAAA,OAAO,IAAA;AAAA,IACT;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,MAAM,KAAA,EAA+C;AACzD,IAAA,IAAI,KAAK,YAAA,EAAc;AACrB,MAAA,OAAO,IAAA,CAAK,YAAY,KAAK,CAAA;AAAA,IAC/B,CAAA,MAAO;AACL,MAAA,OAAO,IAAA,CAAK,YAAY,KAAK,CAAA;AAAA,IAC/B;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKA,MAAc,YAAY,KAAA,EAA+C;AACvE,IAAA,MAAM,MAAA,GAAS;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,IAAA,CAAA;AAQf,IAAA,MAAM,MAAA,GAAS,MAAM,IAAA,CAAK,KAAA,CAAM,KAAK,MAAA,EAAQ,CAAA,EAAG,CAAA,SAAA,EAAY,KAAK,CAAA,CAAE,CAAA;AACnE,IAAA,OAAO,MAAA,GAAU,IAAA,CAAK,KAAA,CAAM,MAAgB,CAAA,GAAuB,IAAA;AAAA,EACrE;AAAA;AAAA;AAAA;AAAA,EAKA,MAAc,YAAY,KAAA,EAA+C;AACvE,IAAA,MAAM,GAAA,GAAM,YAAY,KAAK,CAAA,CAAA;AAC7B,IAAA,MAAM,IAAA,GAAO,MAAM,IAAA,CAAK,KAAA,CAAM,IAAI,GAAG,CAAA;AAErC,IAAA,IAAI,CAAC,IAAA,EAAM;AACT,MAAA,OAAO,IAAA;AAAA,IACT;AAEA,IAAA,IAAI;AACF,MAAA,MAAM,MAAA,GAAS,IAAA,CAAK,KAAA,CAAM,IAAI,CAAA;AAC9B,MAAA,MAAA,CAAO,MAAA,GAAS,SAAA;AAEhB,MAAA,MAAM,KAAK,KAAA,CAAM,GAAA,CAAI,KAAK,IAAA,CAAK,SAAA,CAAU,MAAM,CAAC,CAAA;AAChD,MAAA,OAAO,MAAA;AAAA,IACT,SAAS,UAAA,EAAY;AACnB,MAAA,OAAA,CAAQ,KAAA,CAAM,oCAAoC,UAAU,CAAA;AAC5D,MAAA,OAAO,IAAA;AAAA,IACT;AAAA,EACF;AACF;;;AC/NO,IAAM,mBAAN,MAAuB;AAAA,EACpB,QAAA,uBAAe,GAAA,EAA6B;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAQpD,QAAA,CACE,OAAA,EACA,QAAA,EACA,SAAA,EACM;AAEN,IAAA,MAAM,MAAM,SAAA,GAAY,CAAA,EAAG,SAAS,CAAA,EAAA,EAAK,OAAO,CAAA,CAAA,GAAK,OAAA;AACrD,IAAA,IAAA,CAAK,QAAA,CAAS,GAAA,CAAI,GAAA,EAAK,QAAQ,CAAA;AAG/B,IAAA,IAAI,SAAA,EAAW;AACb,MAAA,IAAA,CAAK,QAAA,CAAS,GAAA,CAAI,OAAA,EAAS,QAAQ,CAAA;AAAA,IACrC;AAAA,EACF;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOA,GAAA,CAAI,SAAiB,SAAA,EAAiD;AAEpE,IAAA,IAAI,SAAA,EAAW;AACb,MAAA,MAAM,gBAAA,GAAmB,KAAK,QAAA,CAAS,GAAA,CAAI,GAAG,SAAS,CAAA,EAAA,EAAK,OAAO,CAAA,CAAE,CAAA;AACrE,MAAA,IAAI,gBAAA,EAAkB;AACpB,QAAA,OAAO,gBAAA;AAAA,MACT;AAAA,IACF;AAGA,IAAA,OAAO,IAAA,CAAK,QAAA,CAAS,GAAA,CAAI,OAAO,CAAA;AAAA,EAClC;AAAA;AAAA;AAAA;AAAA,EAKA,YAAA,GAAyB;AACvB,IAAA,OAAO,KAAA,CAAM,IAAA,CAAK,IAAA,CAAK,QAAA,CAAS,MAAM,CAAA;AAAA,EACxC;AACF;AC5BO,IAAK,iBAAA,qBAAAC,kBAAAA,KAAL;AACL,EAAAA,mBAAA,KAAA,CAAA,GAAM,KAAA;AACN,EAAAA,mBAAA,aAAA,CAAA,GAAc,aAAA;AACd,EAAAA,mBAAA,WAAA,CAAA,GAAY,WAAA;AACZ,EAAAA,mBAAA,QAAA,CAAA,GAAS,QAAA;AAJC,EAAA,OAAAA,kBAAAA;AAAA,CAAA,EAAA,iBAAA,IAAA,EAAA;AAYCC,6BAAN,wBAAA,CAAyB;AAAA,EAS9B,YAA6B,KAAA,EAAc;AAAd,IAAA,IAAA,CAAA,KAAA,GAAA,KAAA;AAAA,EAAe;AAAA,EAR3B,MAAA,GAAS,IAAIzB,aAAA,CAAOyB,0BAAA,CAAmB,IAAI,CAAA;AAAA,EAC3C,aAAA,GAAmC;AAAA,IAClD,UAAA,EAAY,IAAA;AAAA;AAAA,IACZ,SAAA,EAAW,aAAA;AAAA,IACX,WAAA,EAAa,IAAA;AAAA,IACb,aAAA,EAAe;AAAA,GACjB;AAAA;AAAA;AAAA;AAAA;AAAA,EAQA,MAAM,YAAA,CACJ,cAAA,EACA,WAAA,EAMA,MAAA,EAKC;AACD,IAAA,MAAM,MAAM,EAAE,GAAG,IAAA,CAAK,aAAA,EAAe,GAAG,MAAA,EAAO;AAG/C,IAAA,MAAM,GAAA,GAAM,cAAA,IAAkB,IAAA,CAAK,WAAA,CAAY,aAAa,GAAG,CAAA;AAC/D,IAAA,MAAM,QAAA,GAAW,CAAA,EAAG,GAAA,CAAI,SAAS,IAAI,GAAG,CAAA,CAAA;AAGxC,IAAA,MAAM,QAAA,GAAW,MAAM,IAAA,CAAK,KAAA,CAAM,IAAI,QAAQ,CAAA;AAC9C,IAAA,IAAI,QAAA,EAAU;AACZ,MAAA,IAAI;AACF,QAAA,MAAM,KAAA,GAA0B,IAAA,CAAK,KAAA,CAAM,QAAQ,CAAA;AAGnD,QAAA,IAAI,KAAA,CAAM,MAAA,KAAW,IAAA,IAAQ,KAAA,CAAM,eAAe,CAAA,EAAG;AAEnD,UAAA,MAAM,cAAA,GAAiB,IAAA,CAAK,GAAA,EAAI,GAAI,KAAA,CAAM,SAAA;AAC1C,UAAA,IAAI,iBAAiB,GAAA,EAAQ;AAE3B,YAAA,MAAM,IAAA,CAAK,KAAA,CAAM,GAAA,CAAI,QAAQ,CAAA;AAAA,UAC/B,CAAA,MAAO;AACL,YAAA,OAAO;AAAA,cACL,MAAA,EAAQ,aAAA;AAAA,cACR;AAAA,aACF;AAAA,UACF;AAAA,QACF;AAGA,QAAA,IAAA,CAAK,MAAA,CAAO,KAAA;AAAA,UACV,gDAAgD,GAAG,CAAA;AAAA,SACrD;AACA,QAAA,OAAO;AAAA,UACL,MAAA,EAAQ,WAAA;AAAA,UACR,QAAQ,KAAA,CAAM,MAAA;AAAA,UACd;AAAA,SACF;AAAA,MACF,SAAS,KAAA,EAAO;AACd,QAAA,IAAA,CAAK,MAAA,CAAO,KAAA;AAAA,UACV,CAAA,mCAAA,EAAsC,MAAM,OAAO,CAAA;AAAA,SACrD;AACA,QAAA,MAAM,IAAA,CAAK,KAAA,CAAM,GAAA,CAAI,QAAQ,CAAA;AAAA,MAC/B;AAAA,IACF;AAGA,IAAA,MAAM,eAAe,MAAM,IAAA,CAAK,WAAA,CAAY,QAAA,EAAU,IAAI,UAAU,CAAA;AACpE,IAAA,IAAI,CAAC,YAAA,EAAc;AAEjB,MAAA,OAAO;AAAA,QACL,MAAA,EAAQ,aAAA;AAAA,QACR;AAAA,OACF;AAAA,IACF;AAEA,IAAA,OAAO;AAAA,MACL,MAAA,EAAQ,KAAA;AAAA,MACR;AAAA,KACF;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,WAAA,CACJ,GAAA,EACA,MAAA,EACA,MAAA,EACe;AACf,IAAA,MAAM,MAAM,EAAE,GAAG,IAAA,CAAK,aAAA,EAAe,GAAG,MAAA,EAAO;AAC/C,IAAA,MAAM,QAAA,GAAW,CAAA,EAAG,GAAA,CAAI,SAAS,IAAI,GAAG,CAAA,CAAA;AAExC,IAAA,MAAM,KAAA,GAA0B;AAAA,MAC9B,GAAA;AAAA,MACA,MAAA;AAAA,MACA,SAAA,EAAW,KAAK,GAAA,EAAI;AAAA,MACpB,UAAA,EAAY,KAAK,GAAA,EAAI;AAAA,MACrB,SAAA,EAAW,IAAA,CAAK,GAAA,EAAI,GAAI,IAAI,UAAA,GAAa,GAAA;AAAA,MACzC,WAAA,EAAa,EAAA;AAAA,MACb,QAAA,EAAU;AAAA,KACZ;AAEA,IAAA,MAAM,IAAA,CAAK,MAAM,KAAA,CAAM,QAAA,EAAU,IAAI,UAAA,EAAY,IAAA,CAAK,SAAA,CAAU,KAAK,CAAC,CAAA;AAEtE,IAAA,IAAA,CAAK,MAAA,CAAO,KAAA,CAAM,CAAA,kCAAA,EAAqC,GAAG,CAAA,CAAE,CAAA;AAAA,EAC9D;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,UAAA,CACJ,GAAA,EACA,KAAA,EACA,MAAA,EACe;AACf,IAAA,MAAM,MAAM,EAAE,GAAG,IAAA,CAAK,aAAA,EAAe,GAAG,MAAA,EAAO;AAC/C,IAAA,MAAM,QAAA,GAAW,CAAA,EAAG,GAAA,CAAI,SAAS,IAAI,GAAG,CAAA,CAAA;AAGxC,IAAA,MAAM,KAAA,GAA0B;AAAA,MAC9B,GAAA;AAAA,MACA,MAAA,EAAQ;AAAA,QACN,OAAA,EAAS,KAAA;AAAA,QACT;AAAA,OACF;AAAA,MACA,SAAA,EAAW,KAAK,GAAA,EAAI;AAAA,MACpB,UAAA,EAAY,KAAK,GAAA,EAAI;AAAA,MACrB,SAAA,EAAW,IAAA,CAAK,GAAA,EAAI,GAAI,GAAA;AAAA;AAAA,MACxB,WAAA,EAAa,EAAA;AAAA,MACb,QAAA,EAAU;AAAA,KACZ;AAEA,IAAA,MAAM,KAAK,KAAA,CAAM,KAAA;AAAA,MACf,QAAA;AAAA,MACA,GAAA;AAAA;AAAA,MACA,IAAA,CAAK,UAAU,KAAK;AAAA,KACtB;AAEA,IAAA,IAAA,CAAK,MAAA,CAAO,KAAA,CAAM,CAAA,+CAAA,EAAkD,GAAG,CAAA,CAAE,CAAA;AAAA,EAC3E;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,WAAA,CACJ,GAAA,EACA,MAAA,EACe;AACf,IAAA,MAAM,MAAM,EAAE,GAAG,IAAA,CAAK,aAAA,EAAe,GAAG,MAAA,EAAO;AAC/C,IAAA,MAAM,QAAA,GAAW,CAAA,EAAG,GAAA,CAAI,SAAS,IAAI,GAAG,CAAA,CAAA;AACxC,IAAA,MAAM,IAAA,CAAK,KAAA,CAAM,GAAA,CAAI,QAAQ,CAAA;AAC7B,IAAA,IAAA,CAAK,MAAA,CAAO,KAAA,CAAM,CAAA,uBAAA,EAA0B,GAAG,CAAA,CAAE,CAAA;AAAA,EACnD;AAAA;AAAA;AAAA;AAAA,EAKQ,WAAA,CACN,aAMA,MAAA,EACQ;AACR,IAAA,MAAM,UAAA,GAAuB,CAAC,WAAA,CAAY,SAAA,EAAW,YAAY,OAAO,CAAA;AAExE,IAAA,IAAI,MAAA,CAAO,aAAA,IAAiB,WAAA,CAAY,MAAA,EAAQ;AAC9C,MAAA,UAAA,CAAW,IAAA,CAAK,YAAY,MAAM,CAAA;AAAA,IACpC;AAGA,IAAA,MAAM,SAAA,GAAY,IAAA,CAAK,sBAAA,CAAuB,WAAA,CAAY,MAAM,CAAA;AAEhE,IAAA,IAAI,OAAO,WAAA,EAAa;AAEtB,MAAA,MAAM,IAAA,GAAOC,iBAAA,CAAW,QAAQ,CAAA,CAC7B,MAAA,CAAO,SAAS,CAAA,CAChB,MAAA,CAAO,KAAK,CAAA,CACZ,SAAA,CAAU,CAAA,EAAG,EAAE,CAAA;AAClB,MAAA,UAAA,CAAW,KAAK,IAAI,CAAA;AAAA,IACtB,CAAA,MAAO;AACL,MAAA,UAAA,CAAW,KAAK,SAAS,CAAA;AAAA,IAC3B;AAEA,IAAA,OAAO,UAAA,CAAW,KAAK,GAAG,CAAA;AAAA,EAC5B;AAAA;AAAA;AAAA;AAAA,EAKA,MAAc,WAAA,CAAY,GAAA,EAAa,UAAA,EAAsC;AAE3E,IAAA,MAAM,KAAA,GAA0B;AAAA,MAC9B,GAAA;AAAA,MACA,MAAA,EAAQ,IAAA;AAAA,MACR,SAAA,EAAW,KAAK,GAAA,EAAI;AAAA,MACpB,UAAA,EAAY,CAAA;AAAA,MACZ,SAAA,EAAW,IAAA,CAAK,GAAA,EAAI,GAAI,UAAA,GAAa,GAAA;AAAA,MACrC,WAAA,EAAa,EAAA;AAAA,MACb,QAAA,EAAU;AAAA,KACZ;AAGA,IAAA,MAAM,MAAA,GAAS,MAAM,IAAA,CAAK,KAAA,CAAM,GAAA;AAAA,MAC9B,GAAA;AAAA,MACA,IAAA,CAAK,UAAU,KAAK,CAAA;AAAA,MACpB,IAAA;AAAA,MACA,UAAA;AAAA,MACA;AAAA,KACF;AAEA,IAAA,OAAO,MAAA,KAAW,IAAA;AAAA,EACpB;AAAA;AAAA;AAAA;AAAA,EAKQ,uBAAuB,GAAA,EAAkB;AAC/C,IAAA,OAAO,IAAA,CAAK,SAAA,CAAU,IAAA,CAAK,UAAA,CAAW,GAAG,CAAC,CAAA;AAAA,EAC5C;AAAA;AAAA;AAAA;AAAA,EAKQ,WAAW,GAAA,EAAe;AAChC,IAAA,IAAI,GAAA,KAAQ,IAAA,IAAQ,OAAO,GAAA,KAAQ,QAAA,EAAU;AAC3C,MAAA,OAAO,GAAA;AAAA,IACT;AAEA,IAAA,IAAI,KAAA,CAAM,OAAA,CAAQ,GAAG,CAAA,EAAG;AACtB,MAAA,OAAO,IAAI,GAAA,CAAI,CAAA,IAAA,KAAQ,IAAA,CAAK,UAAA,CAAW,IAAI,CAAC,CAAA;AAAA,IAC9C;AAEA,IAAA,MAAM,SAA8B,EAAC;AACrC,IAAA,MAAA,CAAO,KAAK,GAAG,CAAA,CACZ,IAAA,EAAK,CACL,QAAQ,CAAA,GAAA,KAAO;AACd,MAAA,MAAA,CAAO,GAAG,CAAA,GAAI,IAAA,CAAK,UAAA,CAAW,GAAA,CAAI,GAAG,CAAC,CAAA;AAAA,IACxC,CAAC,CAAA;AAEH,IAAA,OAAO,MAAA;AAAA,EACT;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,OAAA,GAA2B;AAC/B,IAAA,MAAM,OAAA,GAAU,CAAA,EAAG,IAAA,CAAK,aAAA,CAAc,SAAS,CAAA,EAAA,CAAA;AAC/C,IAAA,MAAM,IAAA,GAAO,MAAM,IAAA,CAAK,KAAA,CAAM,KAAK,OAAO,CAAA;AAC1C,IAAA,IAAI,OAAA,GAAU,CAAA;AAEd,IAAA,KAAA,MAAW,OAAO,IAAA,EAAM;AACtB,MAAA,MAAM,KAAA,GAAQ,MAAM,IAAA,CAAK,KAAA,CAAM,IAAI,GAAG,CAAA;AACtC,MAAA,IAAI,KAAA,EAAO;AACT,QAAA,IAAI;AACF,UAAA,MAAM,KAAA,GAA0B,IAAA,CAAK,KAAA,CAAM,KAAK,CAAA;AAChD,UAAA,IAAI,KAAA,CAAM,SAAA,GAAY,IAAA,CAAK,GAAA,EAAI,EAAG;AAChC,YAAA,MAAM,IAAA,CAAK,KAAA,CAAM,GAAA,CAAI,GAAG,CAAA;AACxB,YAAA,OAAA,EAAA;AAAA,UACF;AAAA,QACF,CAAA,CAAA,MAAQ;AAEN,UAAA,MAAM,IAAA,CAAK,KAAA,CAAM,GAAA,CAAI,GAAG,CAAA;AACxB,UAAA,OAAA,EAAA;AAAA,QACF;AAAA,MACF;AAAA,IACF;AAEA,IAAA,IAAA,CAAK,MAAA,CAAO,GAAA,CAAI,CAAA,WAAA,EAAc,OAAO,CAAA,4BAAA,CAA8B,CAAA;AACnE,IAAA,OAAO,OAAA;AAAA,EACT;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,aAAA,GAMH;AACD,IAAA,MAAM,OAAA,GAAU,CAAA,EAAG,IAAA,CAAK,aAAA,CAAc,SAAS,CAAA,EAAA,CAAA;AAC/C,IAAA,MAAM,IAAA,GAAO,MAAM,IAAA,CAAK,KAAA,CAAM,KAAK,OAAO,CAAA;AAE1C,IAAA,IAAI,SAAA,GAAY,CAAA;AAChB,IAAA,IAAI,UAAA,GAAa,CAAA;AACjB,IAAA,IAAI,MAAA,GAAS,CAAA;AAEb,IAAA,KAAA,MAAW,OAAO,IAAA,EAAM;AACtB,MAAA,MAAM,KAAA,GAAQ,MAAM,IAAA,CAAK,KAAA,CAAM,IAAI,GAAG,CAAA;AACtC,MAAA,IAAI,KAAA,EAAO;AACT,QAAA,IAAI;AACF,UAAA,MAAM,KAAA,GAA0B,IAAA,CAAK,KAAA,CAAM,KAAK,CAAA;AAChD,UAAA,IAAI,KAAA,CAAM,WAAW,IAAA,EAAM;AACzB,YAAA,UAAA,EAAA;AAAA,UACF,CAAA,MAAA,IAAW,KAAA,CAAM,MAAA,CAAO,OAAA,KAAY,KAAA,EAAO;AACzC,YAAA,MAAA,EAAA;AAAA,UACF,CAAA,MAAO;AACL,YAAA,SAAA,EAAA;AAAA,UACF;AAAA,QACF,CAAA,CAAA,MAAQ;AAAA,QAER;AAAA,MACF;AAAA,IACF;AAEA,IAAA,MAAM,KAAA,GAAQ,YAAY,UAAA,GAAa,MAAA;AACvC,IAAA,MAAM,YAAA,GAAe,KAAA,GAAQ,CAAA,GAAK,SAAA,GAAY,QAAS,GAAA,GAAM,CAAA;AAE7D,IAAA,OAAO;AAAA,MACL,YAAA,EAAc,KAAA;AAAA,MACd,gBAAA,EAAkB,SAAA;AAAA,MAClB,iBAAA,EAAmB,UAAA;AAAA,MACnB,aAAA,EAAe,MAAA;AAAA,MACf;AAAA,KACF;AAAA,EACF;AACF;AAxUaD,0BAAA,GAAN,eAAA,CAAA;AAAA,EADNxB,iBAAA;AAAW,CAAA,EACCwB,0BAAA,CAAA;;;ACHAE,8BAAN,yBAAA,CAA0B;AAAA,EAY/B,WAAA,CACmB,UACA,KAAA,EACA,GAAA,EACA,SACA,OAAA,EACA,WAAA,EACA,oBACA,YAAA,EACjB;AARiB,IAAA,IAAA,CAAA,QAAA,GAAA,QAAA;AACA,IAAA,IAAA,CAAA,KAAA,GAAA,KAAA;AACA,IAAA,IAAA,CAAA,GAAA,GAAA,GAAA;AACA,IAAA,IAAA,CAAA,OAAA,GAAA,OAAA;AACA,IAAA,IAAA,CAAA,OAAA,GAAA,OAAA;AACA,IAAA,IAAA,CAAA,WAAA,GAAA,WAAA;AACA,IAAA,IAAA,CAAA,kBAAA,GAAA,kBAAA;AACA,IAAA,IAAA,CAAA,YAAA,GAAA,YAAA;AAAA,EAChB;AAAA,EApBc,MAAA,GAAS,IAAI3B,aAAAA,CAAO2B,2BAAA,CAAoB,IAAI,CAAA;AAAA,EAC5C,eAAA,uBAAsB,GAAA,EAAiC;AAAA,EACvD,aAAA,GAA8B;AAAA,IAC7C,UAAA,EAAY,CAAA;AAAA,IACZ,YAAA,EAAc,GAAA;AAAA,IACd,SAAA,EAAW,GAAA;AAAA,IACX,oBAAA,EAAsB,IAAA;AAAA,IACtB,uBAAA,EAAyB,CAAA;AAAA,IACzB,qBAAA,EAAuB;AAAA,GACzB;AAAA;AAAA;AAAA;AAAA,EAgBA,MAAM,KAAA,CACJ,MAAA,EACA,IAAA,EACA,iBAMA,MAAA,EACyB;AACzB,IAAA,MAAM,MAAM,EAAE,GAAG,IAAA,CAAK,aAAA,EAAe,GAAG,MAAA,EAAO;AAC/C,IAAA,MAAM,SAAA,GAAY,KAAK,GAAA,EAAI;AAC3B,IAAA,MAAM,gBAAgB,MAAM,IAAA,CAAK,OAAA,CAAQ,iBAAA,CAAkB,QAAQ,IAAI,CAAA;AACvE,IAAA,IAAI,gBAAA,GAAwB,IAAA;AAE5B,IAAA,IAAI;AAEF,MAAA,MAAM,cAAA,GAAiB,OAAO,QAAA,EAAU,cAAA;AACxC,MAAA,gBAAA,GAAmB,MAAM,KAAK,kBAAA,CAAmB,YAAA;AAAA,QAC/C,cAAA;AAAA,QACA;AAAA,UACE,QAAQ,MAAA,CAAO,MAAA;AAAA,UACf,WAAW,MAAA,CAAO,SAAA;AAAA,UAClB,SAAS,MAAA,CAAO,OAAA;AAAA,UAChB,QAAQ,MAAA,CAAO;AAAA;AACjB,OACF;AAGA,MAAA,IAAI,iBAAiB,MAAA,KAAA,WAAA,kBAAwC;AAC3D,QAAA,IAAA,CAAK,MAAA,CAAO,KAAA,CAAM,CAAA,4BAAA,EAA+B,MAAA,CAAO,KAAK,CAAA,CAAE,CAAA;AAC/D,QAAA,OAAO,gBAAA,CAAiB,MAAA;AAAA,MAC1B;AAGA,MAAA,IAAI,iBAAiB,MAAA,KAAA,aAAA,oBAA0C;AAC7D,QAAA,MAAM,IAAI,MAAM,oCAAoC,CAAA;AAAA,MACtD;AAGA,MAAA,MAAM,IAAA,CAAK,eAAA,CAAgB,IAAA,EAAM,eAAA,EAAiB,EAAE,CAAA;AAMpD,MAAA,MAAM,QAAA,GAAW,IAAA,CAAK,GAAA,EAAI,GAAI,MAAA,CAAO,SAAA;AACrC,MAAA,IAAA,CAAK,OAAA,CAAQ,cAAA,CAAe,MAAA,CAAO,SAAA,EAAW,QAAQ,CAAA;AAGtD,MAAA,IAAA,CAAK,mBAAA,CAAoB,MAAA,CAAO,SAAA,EAAW,MAAA,CAAO,OAAO,CAAA;AAGzD,MAAA,IAAA,CAAK,OAAA,CAAQ,oBAAA,CAAqB,MAAA,CAAO,SAAA,EAAW,OAAO,OAAO,CAAA;AAGlE,MAAA,MAAM,MAAA,GAAS,MAAM,IAAA,CAAK,gBAAA;AAAA,QACxB,MAAA;AAAA,QACA,IAAA;AAAA,QACA,GAAA;AAAA,QACA;AAAA,OACF;AAGA,MAAA,MAAM,QAAA,GAAW,IAAA,CAAK,GAAA,EAAI,GAAI,SAAA;AAC9B,MAAA,MAAM,KAAK,OAAA,CAAQ,mBAAA;AAAA,QACjB,MAAA;AAAA,QACA,IAAA;AAAA,QACA,MAAA;AAAA,QACA,QAAA;AAAA,QACA;AAAA,OACF;AACA,MAAA,IAAA,CAAK,OAAA,CAAQ,uBAAA;AAAA,QACX,MAAA,CAAO,SAAA;AAAA,QACP,MAAA,CAAO,OAAA;AAAA,QACP,QAAA;AAAA,QACA;AAAA,OACF;AAGA,MAAA,IAAA,CAAK,mBAAA,CAAoB,MAAA,CAAO,SAAA,EAAW,MAAA,CAAO,OAAO,CAAA;AAGzD,MAAA,MAAM,IAAA,CAAK,kBAAA,CAAmB,WAAA,CAAY,gBAAA,CAAiB,KAAK,MAAM,CAAA;AAGtE,MAAA,MAAM,IAAA,CAAK,KAAA,CAAM,QAAA,CAAS,MAAA,CAAO,KAAK,CAAA;AAGtC,MAAA,IAAI,OAAO,KAAA,EAAO;AAChB,QAAA,MAAM,KAAK,YAAA,CAAa,KAAA;AAAA,UACtB,MAAA;AAAA,UACA,MAAA,CAAO,KAAA;AAAA,UACP,eAAA,EAAiB;AAAA,SACnB;AAAA,MACF;AAEA,MAAA,OAAO,MAAA;AAAA,IACT,SAAS,KAAA,EAAO;AAEd,MAAA,MAAM,QAAA,GAAW,IAAA,CAAK,GAAA,EAAI,GAAI,SAAA;AAC9B,MAAA,MAAM,KAAK,OAAA,CAAQ,mBAAA;AAAA,QACjB,MAAA;AAAA,QACA,IAAA;AAAA,QACA,KAAA;AAAA,QACA,QAAA;AAAA,QACA;AAAA,OACF;AACA,MAAA,IAAA,CAAK,OAAA,CAAQ,uBAAA;AAAA,QACX,MAAA,CAAO,SAAA;AAAA,QACP,MAAA,CAAO,OAAA;AAAA,QACP,QAAA;AAAA,QACA,KAAA;AAAA,QACA,KAAA,CAAM;AAAA,OACR;AAGA,MAAA,IAAA,CAAK,2BAAA,CAA4B,MAAA,CAAO,SAAA,EAAW,MAAA,CAAO,OAAO,CAAA;AAGjE,MAAA,IAAI,gBAAA,EAAkB;AACpB,QAAA,MAAM,KAAK,kBAAA,CAAmB,UAAA;AAAA,UAC5B,gBAAA,CAAiB,GAAA;AAAA,UACjB,KAAA,CAAM;AAAA,SACR;AAAA,MACF;AAGA,MAAA,MAAM,KAAK,KAAA,CAAM,IAAA,CAAK,MAAA,CAAO,KAAA,EAAO,MAAM,OAAO,CAAA;AAEjD,MAAA,MAAM,KAAA;AAAA,IACR;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKA,MAAc,gBAAA,CACZ,MAAA,EACA,IAAA,EACA,QACA,aAAA,EACyB;AACzB,IAAA,IAAI,SAAA;AAEJ,IAAA,KAAA,IAAS,OAAA,GAAU,CAAA,EAAG,OAAA,IAAW,MAAA,CAAO,YAAa,OAAA,EAAA,EAAW;AAC9D,MAAA,IAAI;AACF,QAAA,IAAI,UAAU,CAAA,EAAG;AAEf,UAAA,MAAM,IAAA,CAAK,OAAA,CAAQ,eAAA,CAAgB,MAAA,EAAQ,MAAM,OAAO,CAAA;AACxD,UAAA,IAAA,CAAK,OAAA,CAAQ,WAAA,CAAY,MAAA,CAAO,SAAA,EAAW,OAAO,OAAO,CAAA;AAGzD,UAAA,MAAM,QAAQ,MAAA,CAAO,YAAA,GAAgB,KAAK,GAAA,CAAI,CAAA,EAAG,UAAU,CAAC,CAAA;AAC5D,UAAA,MAAM,IAAA,CAAK,MAAM,KAAK,CAAA;AAAA,QACxB;AAGA,QAAA,OAAO,MAAM,IAAA,CAAK,kBAAA,CAAmB,MAAA,EAAQ,OAAO,SAAU,CAAA;AAAA,MAChE,SAAS,KAAA,EAAO;AACd,QAAA,SAAA,GAAY,KAAA;AACZ,QAAA,IAAA,CAAK,MAAA,CAAO,IAAA;AAAA,UACV,CAAA,CAAA,EAAI,aAAa,CAAA,UAAA,EAAa,OAAO,IAAI,MAAA,CAAO,UAAU,CAAA,SAAA,EAAY,KAAA,CAAM,OAAO,CAAA;AAAA,SACrF;AAGA,QAAA,IAAI,IAAA,CAAK,mBAAA,CAAoB,KAAK,CAAA,EAAG;AACnC,UAAA,MAAM,KAAA;AAAA,QACR;AAAA,MACF;AAAA,IACF;AAEA,IAAA,MAAM,IAAI,KAAA;AAAA,MACR,CAAA,gCAAA,EAAmC,MAAA,CAAO,UAAU,CAAA,WAAA,EAAc,UAAW,OAAO,CAAA;AAAA,KACtF;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKA,MAAc,kBAAA,CACZ,MAAA,EACA,SAAA,EACyB;AACzB,IAAA,MAAM,UAAU,IAAA,CAAK,QAAA,CAAS,IAAI,MAAA,CAAO,OAAA,EAAS,OAAO,SAAS,CAAA;AAClE,IAAA,IAAI,CAAC,OAAA,EAAS;AACZ,MAAA,MAAM,IAAI,KAAA;AAAA,QACR,CAAA,mCAAA,EAAsC,MAAA,CAAO,OAAO,CAAA,aAAA,EAAgB,OAAO,SAAS,CAAA,CAAA;AAAA,OACtF;AAAA,IACF;AAEA,IAAA,OAAO,QAAQ,IAAA,CAAK;AAAA,MAClB,OAAA,CAAQ;AAAA,QACN,QAAQ,MAAA,CAAO,MAAA;AAAA,QACf,UAAU,MAAA,CAAO,QAAA;AAAA,QACjB,SAAS,MAAA,CAAO,OAAA;AAAA,QAChB,QAAQ,MAAA,CAAO,MAAA;AAAA,QACf,QAAA,EAAU,OAAO,QAAA,EAAU,QAAA;AAAA,QAC3B,UAAU,MAAA,CAAO;AAAA,OAClB,CAAA;AAAA,MACD,IAAI,OAAA;AAAA,QAAe,CAAC,GAAG,MAAA,KACrB,UAAA;AAAA,UACE,MACE,MAAA;AAAA,YACE,IAAI,KAAA,CAAM,CAAA,iCAAA,EAAoC,SAAS,CAAA,EAAA,CAAI;AAAA,WAC7D;AAAA,UACF;AAAA;AACF;AACF,KACD,CAAA;AAAA,EACH;AAAA;AAAA;AAAA;AAAA,EAKA,MAAc,eAAA,CACZ,IAAA,EACA,EAAA,EACe;AAEf,IAAA,IAAI,IAAA,EAAM;AACR,MAAA,MAAM,YAAY,MAAM,IAAA,CAAK,WAAA,CAAY,cAAA,CAAe,KAAK,MAAM,CAAA;AACnE,MAAA,IAAI,CAAC,UAAU,OAAA,EAAS;AACtB,QAAA,IAAA,CAAK,OAAA,CAAQ,kBAAkB,MAAM,CAAA;AACrC,QAAA,MAAM,KAAK,OAAA,CAAQ,cAAA;AAAA,UACjB,CAAA,KAAA,EAAQ,KAAK,MAAM,CAAA,CAAA;AAAA,UACnB,SAAA,CAAU;AAAA,SACZ;AACA,QAAA,MAAM,IAAI,KAAA;AAAA,UACR,CAAA,iCAAA,EAAoC,UAAU,UAAU,CAAA,QAAA;AAAA,SAC1D;AAAA,MACF;AAAA,IACF;AAGA,IAAA,IAAI,EAAA,EAAI;AACN,MAAA,MAAM,OAAA,GAAU,MAAM,IAAA,CAAK,WAAA,CAAY,aAAa,EAAE,CAAA;AACtD,MAAA,IAAI,CAAC,QAAQ,OAAA,EAAS;AACpB,QAAA,IAAA,CAAK,OAAA,CAAQ,kBAAkB,IAAI,CAAA;AACnC,QAAA,MAAM,KAAK,OAAA,CAAQ,cAAA,CAAe,MAAM,EAAE,CAAA,CAAA,EAAI,QAAQ,UAAW,CAAA;AACjE,QAAA,MAAM,IAAI,KAAA;AAAA,UACR,CAAA,iCAAA,EAAoC,QAAQ,UAAU,CAAA,QAAA;AAAA,SACxD;AAAA,MACF;AAAA,IACF;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKQ,mBAAA,CAAoB,WAAmB,OAAA,EAAuB;AACpE,IAAA,MAAM,GAAA,GAAM,CAAA,EAAG,SAAS,CAAA,EAAA,EAAK,OAAO,CAAA,CAAA;AACpC,IAAA,MAAM,OAAA,GAAU,IAAA,CAAK,eAAA,CAAgB,GAAA,CAAI,GAAG,CAAA;AAE5C,IAAA,IAAI,CAAC,OAAA,EAAS;AAEd,IAAA,IAAI,OAAA,CAAQ,UAAU,MAAA,EAAQ;AAC5B,MAAA,MAAM,GAAA,GAAM,KAAK,GAAA,EAAI;AACrB,MAAA,MAAM,SAAA,GACJ,OAAA,CAAQ,WAAA,GAAe,IAAA,CAAK,aAAA,CAAc,qBAAA;AAE5C,MAAA,IAAI,MAAM,SAAA,EAAW;AACnB,QAAA,MAAM,IAAI,KAAA;AAAA,UACR,+BAA+B,GAAG,CAAA,kCAAA;AAAA,SACpC;AAAA,MACF,CAAA,MAAO;AAEL,QAAA,OAAA,CAAQ,KAAA,GAAQ,WAAA;AAAA,MAClB;AAAA,IACF;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKQ,2BAAA,CACN,WACA,OAAA,EACM;AACN,IAAA,MAAM,GAAA,GAAM,CAAA,EAAG,SAAS,CAAA,EAAA,EAAK,OAAO,CAAA,CAAA;AACpC,IAAA,MAAM,OAAA,GAAU,IAAA,CAAK,eAAA,CAAgB,GAAA,CAAI,GAAG,CAAA,IAAK;AAAA,MAC/C,QAAA,EAAU,CAAA;AAAA,MACV,KAAA,EAAO;AAAA,KACT;AAEA,IAAA,OAAA,CAAQ,QAAA,EAAA;AACR,IAAA,OAAA,CAAQ,WAAA,GAAc,KAAK,GAAA,EAAI;AAE/B,IAAA,IAAI,OAAA,CAAQ,QAAA,IAAY,IAAA,CAAK,aAAA,CAAc,uBAAA,EAA0B;AACnE,MAAA,OAAA,CAAQ,KAAA,GAAQ,MAAA;AAChB,MAAA,IAAA,CAAK,MAAA,CAAO,KAAA;AAAA,QACV,CAAA,2BAAA,EAA8B,GAAG,CAAA,OAAA,EAAU,OAAA,CAAQ,QAAQ,CAAA,SAAA;AAAA,OAC7D;AAAA,IACF;AAEA,IAAA,IAAA,CAAK,eAAA,CAAgB,GAAA,CAAI,GAAA,EAAK,OAAO,CAAA;AAAA,EACvC;AAAA;AAAA;AAAA;AAAA,EAKQ,mBAAA,CAAoB,WAAmB,OAAA,EAAuB;AACpE,IAAA,MAAM,GAAA,GAAM,CAAA,EAAG,SAAS,CAAA,EAAA,EAAK,OAAO,CAAA,CAAA;AACpC,IAAA,IAAA,CAAK,eAAA,CAAgB,OAAO,GAAG,CAAA;AAAA,EACjC;AAAA;AAAA;AAAA;AAAA,EAKQ,oBAAoB,KAAA,EAAuB;AACjD,IAAA,MAAM,OAAA,GAAU,KAAA,CAAM,OAAA,CAAQ,WAAA,EAAY;AAC1C,IAAA,OACE,QAAQ,QAAA,CAAS,WAAW,KAC5B,OAAA,CAAQ,QAAA,CAAS,cAAc,CAAA,IAC/B,OAAA,CAAQ,QAAA,CAAS,eAAe,KAChC,OAAA,CAAQ,QAAA,CAAS,SAAS,CAAA,IAC1B,OAAA,CAAQ,SAAS,YAAY,CAAA;AAAA,EAEjC;AAAA;AAAA;AAAA;AAAA,EAKQ,MAAM,EAAA,EAA2B;AACvC,IAAA,OAAO,IAAI,OAAA,CAAQ,CAAAC,aAAW,UAAA,CAAWA,QAAAA,EAAS,EAAE,CAAC,CAAA;AAAA,EACvD;AAAA;AAAA;AAAA;AAAA,EAKA,uBAAA,GAA4D;AAC1D,IAAA,OAAO,IAAI,GAAA,CAAI,IAAA,CAAK,eAAe,CAAA;AAAA,EACrC;AACF;AAxWaD,2BAAA,GAAN,eAAA,CAAA;AAAA,EADN1B,iBAAAA;AAAW,CAAA,EACC0B,2BAAA,CAAA;;;AC3BN,IAAM,2BAAN,MAA+B;AAAA,EACpC,WAAA,CACmB,OACA,MAAA,EACjB;AAFiB,IAAA,IAAA,CAAA,KAAA,GAAA,KAAA;AACA,IAAA,IAAA,CAAA,MAAA,GAAA,MAAA;AAAA,EAChB;AAAA,EAEH,MAAM,MAAA,CACJ,MAAA,EACA,IAAA,EACA,QAAA,EAMyB;AACzB,IAAA,IAAI;AACF,MAAA,MAAM,SAAS,MAAM,IAAA,CAAK,OAAO,KAAA,CAAM,MAAA,EAAQ,MAAM,QAAQ,CAAA;AAE7D,MAAA,OAAO,MAAA;AAAA,IACT,SAAS,GAAA,EAAU;AACjB,MAAA,OAAO,EAAE,OAAA,EAAS,KAAA,EAAO,KAAA,EAAO,GAAA,EAAK,WAAW,gBAAA,EAAiB;AAAA,IACnE;AAAA,EACF;AACF;;;ACrBO,SAAS,+BAA+B,QAAA,EAA4B;AACzE,EAAA,QAAA,CAAS,QAAA;AAAA,IACP,SAAA;AAAA,IACA,aAAsC;AAAA,MACpC,OAAA,EAAS,IAAA;AAAA,MACT,OAAA,EAAS;AAAA,KACX,CAAA;AAAA,IACA;AAAA;AAAA,GACF;AACF;ACMaE,sBAAN,iBAAA,CAAkB;AAAA,EACN,MAAA,GAAS,IAAI7B,aAAAA,CAAO6B,mBAAA,CAAY,IAAI,CAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAMrD,MAAM,QAAA,CACJ,IAAA,EACA,MAAA,EAC8B;AAC9B,IAAA,MAAM,eAAA,GAAkB,KAAK,GAAA,EAAI;AAEjC,IAAA,IAAI;AAEF,MAAA,IAAI,CAAC,IAAA,EAAM;AACT,QAAA,IAAA,CAAK,MAAA,CAAO,IAAA;AAAA,UACV,CAAA,4CAAA,EAA+C,OAAO,KAAK,CAAA;AAAA,SAC7D;AACA,QAAA,MAAM,IAAIC,yBAAA;AAAA,UACR;AAAA,SACF;AAAA,MACF;AAGA,MAAA,IAAI,MAAA,CAAO,MAAA,IAAU,MAAA,CAAO,MAAA,KAAW,KAAK,MAAA,EAAQ;AAClD,QAAA,IAAA,CAAK,MAAA,CAAO,IAAA;AAAA,UACV,CAAA,KAAA,EAAQ,IAAA,CAAK,MAAM,CAAA,wCAAA,EAA2C,OAAO,MAAM,CAAA;AAAA,SAC7E;AACA,QAAA,MAAM,IAAIA,yBAAA;AAAA,UACR;AAAA,SACF;AAAA,MACF;AAQA,MAAA,IAAA,CAAK,MAAA,CAAO,GAAA;AAAA,QACV,CAAA,0DAAA,EAA6D,OAAO,KAAK,CAAA;AAAA,OAC3E;AAGA,MAAA,MAAM,IAAA,CAAK,+BAAA,CAAgC,IAAA,EAAM,MAAM,CAAA;AAEvD,MAAA,MAAM,cAAA,GAAiB,IAAA,CAAK,GAAA,EAAI,GAAI,eAAA;AACpC,MAAA,IAAA,CAAK,MAAA,CAAO,KAAA;AAAA,QACV,kCAAkC,IAAA,CAAK,MAAM,gBAAgB,MAAA,CAAO,KAAK,KACnE,cAAc,CAAA,GAAA;AAAA,OACtB;AAEA,MAAA,OAAO;AAAA,QACL,OAAA,EAAS;AAAA,OACX;AAAA,IACF,SAAS,KAAA,EAAO;AACd,MAAA,MAAM,cAAA,GAAiB,IAAA,CAAK,GAAA,EAAI,GAAI,eAAA;AACpC,MAAA,IAAA,CAAK,MAAA,CAAO,KAAA;AAAA,QACV,sCAAsC,MAAA,CAAO,KAAK,KAAK,cAAc,CAAA,KAAA,EAAQ,MAAM,OAAO,CAAA;AAAA,OAC5F;AACA,MAAA,MAAM,KAAA;AAAA,IACR;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKQ,cAAA,CACN,MACA,cAAA,EACS;AACT,IAAA,IAAI,CAAC,IAAA,CAAK,WAAA,IAAe,IAAA,CAAK,WAAA,CAAY,WAAW,CAAA,EAAG;AACtD,MAAA,OAAO,KAAA;AAAA,IACT;AAGA,IAAA,OAAO,cAAA,CAAe,MAAM,CAAA,KAAA,KAAS;AAEnC,MAAA,MAAM,aAAA,GAAgB,IAAA,CAAK,WAAA,CAAY,QAAA,CAAS,KAAK,CAAA;AACrD,MAAA,MAAM,gBAAA,GAAmB,IAAA,CAAK,WAAA,CAAY,IAAA,CAAK,CAAA,CAAA,KAAK;AAClD,QAAA,IAAI,CAAA,CAAE,QAAA,CAAS,GAAG,CAAA,EAAG;AACnB,UAAA,MAAM,OAAA,GAAU,CAAA,CAAE,OAAA,CAAQ,GAAA,EAAK,IAAI,CAAA;AACnC,UAAA,OAAO,IAAI,MAAA,CAAO,CAAA,CAAA,EAAI,OAAO,CAAA,CAAA,CAAG,CAAA,CAAE,KAAK,KAAK,CAAA;AAAA,QAC9C;AACA,QAAA,OAAO,KAAA;AAAA,MACT,CAAC,CAAA;AAED,MAAA,OAAO,aAAA,IAAiB,gBAAA;AAAA,IAC1B,CAAC,CAAA;AAAA,EACH;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,MAAc,uBAAA,CACZ,IAAA,EACA,SAAA,EACkB;AAElB,IAAA,MAAM,CAAC,SAAS,CAAA,GAAI,SAAA,CAAU,MAAM,IAAI,CAAA;AAGxC,IAAA,MAAM,iBAAA,GAAoB,IAAA,CAAK,yBAAA,CAA0B,IAAI,CAAA;AAE7D,IAAA,IAAA,CAAK,MAAA,CAAO,GAAA,CAAI,CAAA,4BAAA,EAA+B,IAAA,CAAK,MAAM,CAAA,CAAA,EAAI;AAAA,MAC5D,SAAA;AAAA,MACA,SAAA;AAAA,MACA,iBAAA;AAAA,MACA,WAAW,IAAA,CAAK,KAAA;AAAA,MAChB,iBAAiB,IAAA,CAAK,WAAA;AAAA,MACtB,eAAe,IAAA,CAAK;AAAA,KACrB,CAAA;AAGD,IAAA,IAAI,cAAc,QAAA,EAAU;AAC1B,MAAA,OAAO,IAAA;AAAA,IACT;AAGA,IAAA,IACE,CAAC,kBAAkB,QAAA,CAAS,SAAS,KACrC,CAAC,iBAAA,CAAkB,QAAA,CAAS,GAAG,CAAA,EAC/B;AACA,MAAA,IAAA,CAAK,MAAA,CAAO,IAAA;AAAA,QACV,6BAA6B,SAAS,CAAA,6BAAA,EAAgC,iBAAA,CAAkB,IAAA,CAAK,IAAI,CAAC,CAAA;AAAA,OACpG;AACA,MAAA,OAAO,KAAA;AAAA,IACT;AAKA,IAAA,OAAO,IAAA;AAAA,EACT;AAAA;AAAA;AAAA;AAAA,EAKQ,0BAA0B,IAAA,EAA8B;AAC9D,IAAA,MAAM,aAAuB,EAAC;AAG9B,IAAA,IAAI,IAAA,CAAK,KAAA,EAAO,QAAA,CAAS,OAAO,CAAA,EAAG;AACjC,MAAA,UAAA,CAAW,KAAK,GAAG,CAAA;AAAA,IACrB;AAIA,IAAA,IAAA,CAAK,WAAA,EAAa,QAAQ,CAAA,UAAA,KAAc;AACtC,MAAA,MAAM,KAAA,GAAQ,UAAA,CAAW,KAAA,CAAM,iBAAiB,CAAA;AAChD,MAAA,IAAI,KAAA,EAAO;AACT,QAAA,UAAA,CAAW,IAAA,CAAK,KAAA,CAAM,CAAC,CAAC,CAAA;AAAA,MAC1B;AAAA,IACF,CAAC,CAAA;AAGD,IAAA,IAAI,KAAK,SAAA,EAAW;AAClB,MAAA,UAAA,CAAW,IAAA,CAAK,KAAK,SAAS,CAAA;AAAA,IAChC;AAEA,IAAA,OAAO,CAAC,GAAG,IAAI,GAAA,CAAI,UAAU,CAAC,CAAA;AAAA,EAChC;AAAA;AAAA;AAAA;AAAA,EAKQ,qBAAA,CACN,MACA,iBAAA,EACS;AAET,IAAA,OAAO,KAAK,SAAA,KAAc,iBAAA;AAAA,EAC5B;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,MAAc,+BAAA,CACZ,IAAA,EACA,MAAA,EACe;AAEf,IAAA,MAAM,GAAA,GAAM,KAAK,GAAA,EAAI;AACrB,IAAA,MAAM,GAAA,GAAM,MAAM,MAAA,CAAO,SAAA;AACzB,IAAA,MAAM,MAAA,GAAA,CAAU,MAAA,CAAO,QAAA,EAAU,MAAA,IAAU,GAAA,IAAO,GAAA;AAElD,IAAA,IAAI,MAAM,MAAA,EAAQ;AAChB,MAAA,MAAM,IAAIA,0BAAmB,4BAA4B,CAAA;AAAA,IAC3D;AAGA,IAAA,IAAI,MAAA,CAAO,UAAU,CAAA,EAAG;AACtB,MAAA,MAAM,IAAIA,yBAAA;AAAA,QACR;AAAA,OACF;AAAA,IACF;AAAA,EAIF;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,QAAA,CAAS,IAAA,EAAoB,MAAA,EAA0C;AAE3E,IAAA,IAAI,MAAA,CAAO,MAAA,KAAW,IAAA,CAAK,MAAA,EAAQ;AACjC,MAAA,OAAO,KAAA;AAAA,IACT;AAGA,IAAA,IAAI,MAAA,CAAO,WAAW,CAAA,EAAG;AACvB,MAAA,OAAO,KAAA;AAAA,IACT;AAGA,IAAA,IAAI,CAAC,CAAC,QAAA,EAAU,YAAY,EAAE,QAAA,CAAS,MAAA,CAAO,MAAM,CAAA,EAAG;AACrD,MAAA,OAAO,KAAA;AAAA,IACT;AAEA,IAAA,OAAO,IAAA;AAAA,EACT;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,oBAAA,CACE,MACA,MAAA,EACqB;AACrB,IAAA,OAAO;AAAA,MACL,QAAQ,IAAA,CAAK,MAAA;AAAA,MACb,gBAAgB,MAAA,CAAO,MAAA;AAAA,MACvB,WAAA,EAAa,IAAA,CAAK,MAAA,KAAW,MAAA,CAAO,MAAA;AAAA,MACpC,cAAA,EAAgB,MAAA,CAAO,QAAA,EAAU,MAAA,IAAU,EAAC;AAAA,MAC5C,UAAA,EAAY,IAAA,CAAK,WAAA,IAAe,EAAC;AAAA,MACjC,SAAA,EAAW,IAAA,CAAK,KAAA,IAAS,EAAC;AAAA,MAC1B,WAAW,MAAA,CAAO,SAAA;AAAA,MAClB,WAAW,IAAA,CAAK,SAAA;AAAA,MAChB,iBAAA,EAAmB,OAAO,QAAA,EAAU,SAAA;AAAA,MACpC,YAAA,EACE,CAAC,MAAA,CAAO,QAAA,EAAU,aAClB,IAAA,CAAK,SAAA,KAAc,OAAO,QAAA,CAAS;AAAA,KACvC;AAAA,EACF;AACF;AAzPaD,mBAAA,GAAN,eAAA,CAAA;AAAA,EADN5B,iBAAAA;AAAW,CAAA,EACC4B,mBAAA,CAAA;ACAN,IAAK,mBAAA,qBAAAE,oBAAAA,KAAL;AACL,EAAAA,qBAAA,cAAA,CAAA,GAAe,cAAA;AACf,EAAAA,qBAAA,iBAAA,CAAA,GAAkB,iBAAA;AAClB,EAAAA,qBAAA,cAAA,CAAA,GAAe,cAAA;AACf,EAAAA,qBAAA,mBAAA,CAAA,GAAoB,mBAAA;AACpB,EAAAA,qBAAA,qBAAA,CAAA,GAAsB,qBAAA;AACtB,EAAAA,qBAAA,kBAAA,CAAA,GAAmB,kBAAA;AACnB,EAAAA,qBAAA,eAAA,CAAA,GAAgB,eAAA;AAChB,EAAAA,qBAAA,eAAA,CAAA,GAAgB,eAAA;AAChB,EAAAA,qBAAA,cAAA,CAAA,GAAe,cAAA;AACf,EAAAA,qBAAA,iBAAA,CAAA,GAAkB,iBAAA;AAVR,EAAA,OAAAA,oBAAAA;AAAA,CAAA,EAAA,mBAAA,IAAA,EAAA;AAkBCC,0BAAN,qBAAA,CAAsB;AAAA,EACV,MAAA,GAAS,IAAIhC,aAAAA,CAAOgC,uBAAA,CAAgB,IAAI,CAAA;AAAA,EACxC,UAAA,uBAA0C,GAAA,EAAI;AAAA;AAAA;AAAA;AAAA,EAK/D,MAAM,cAAA,CACJ,KAAA,EACA,SAAA,EACA,OAAA,EACA,QACA,QAAA,EACiB;AACjB,IAAA,MAAM,aAAA,GAAgB,KAAK,qBAAA,EAAsB;AACjD,IAAA,MAAM,KAAA,GAAoB;AAAA,MACxB,IAAIC,iBAAA,EAAW;AAAA,MACf,aAAA;AAAA,MACA,SAAA,EAAW,KAAK,GAAA,EAAI;AAAA,MACpB,MAAA,EAAQ,cAAA;AAAA,MACR,MAAA;AAAA,MACA,aAAA,EAAe,KAAA;AAAA,MACf,SAAA;AAAA,MACA,OAAA;AAAA,MACA,OAAA,EAAS,IAAA;AAAA,MACT,QAAA,EAAU;AAAA,QACR,GAAG,QAAA;AAAA,QACH,KAAK,QAAA,EAAU,MAAA;AAAA,QACf,QAAQ,QAAA,EAAU;AAAA;AACpB,KACF;AAEA,IAAA,MAAM,IAAA,CAAK,QAAQ,KAAK,CAAA;AACxB,IAAA,IAAA,CAAK,MAAA,CAAO,GAAA;AAAA,MACV,CAAA,CAAA,EAAI,aAAa,CAAA,gBAAA,EAAmB,KAAK,QAAQ,SAAS,CAAA,EAAA,EAAK,OAAO,CAAA,SAAA,EAAY,MAAM,CAAA;AAAA,KAC1F;AAEA,IAAA,OAAO,aAAA;AAAA,EACT;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,iBAAA,CACJ,MAAA,EACA,IAAA,EACA,aAAA,EACiB;AACjB,IAAA,MAAM,MAAA,GAAS,aAAA,IAAiB,IAAA,CAAK,qBAAA,EAAsB;AAC3D,IAAA,MAAM,KAAA,GAAoB;AAAA,MACxB,IAAIA,iBAAA,EAAW;AAAA,MACf,aAAA,EAAe,MAAA;AAAA,MACf,SAAA,EAAW,KAAK,GAAA,EAAI;AAAA,MACpB,MAAA,EAAQ,mBAAA;AAAA,MACR,QAAQ,IAAA,EAAM,MAAA;AAAA,MACd,eAAe,MAAA,CAAO,KAAA;AAAA,MACtB,WAAW,MAAA,CAAO,SAAA;AAAA,MAClB,SAAS,MAAA,CAAO,OAAA;AAAA,MAChB,OAAA,EAAS,IAAA;AAAA,MACT,QAAA,EAAU;AAAA,QACR,gBAAgB,MAAA,CAAO,MAAA;AAAA,QACvB,SAAS,MAAA,CAAO,OAAA;AAAA,QAChB,GAAA,EAAK,IAAA,CAAK,GAAA,EAAI,GAAI,MAAA,CAAO;AAAA;AAC3B,KACF;AAEA,IAAA,MAAM,IAAA,CAAK,QAAQ,KAAK,CAAA;AACxB,IAAA,IAAA,CAAK,MAAA,CAAO,GAAA;AAAA,MACV,CAAA,CAAA,EAAI,MAAM,CAAA,qBAAA,EAAwB,MAAA,CAAO,SAAS,KAAK,MAAA,CAAO,OAAO,CAAA,SAAA,EAAY,IAAA,EAAM,MAAM,CAAA;AAAA,KAC/F;AAEA,IAAA,OAAO,MAAA;AAAA,EACT;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,mBAAA,CACJ,MAAA,EACA,IAAA,EACA,MAAA,EACA,UACA,aAAA,EACe;AACf,IAAA,MAAM,KAAA,GAAoB;AAAA,MACxB,IAAIA,iBAAA,EAAW;AAAA,MACf,aAAA;AAAA,MACA,SAAA,EAAW,KAAK,GAAA,EAAI;AAAA,MACpB,MAAA,EAAQ,qBAAA;AAAA,MACR,QAAQ,IAAA,EAAM,MAAA;AAAA,MACd,eAAe,MAAA,CAAO,KAAA;AAAA,MACtB,WAAW,MAAA,CAAO,SAAA;AAAA,MAClB,SAAS,MAAA,CAAO,OAAA;AAAA,MAChB,OAAA,EAAS,IAAA;AAAA,MACT,QAAA;AAAA,MACA,QAAA,EAAU;AAAA,QACR,cAAA,EAAgB,CAAC,CAAC,MAAA,CAAO,WAAA,EAAa,MAAA;AAAA,QACtC,QAAA,EAAU,CAAC,CAAC,MAAA,CAAO,KAAA;AAAA,QACnB,SAAS,MAAA,CAAO;AAAA;AAClB,KACF;AAEA,IAAA,MAAM,IAAA,CAAK,QAAQ,KAAK,CAAA;AACxB,IAAA,IAAA,CAAK,MAAA,CAAO,GAAA;AAAA,MACV,CAAA,CAAA,EAAI,aAAa,CAAA,uBAAA,EAA0B,MAAA,CAAO,SAAS,CAAA,EAAA,EAAK,MAAA,CAAO,OAAO,CAAA,IAAA,EACtE,QAAQ,CAAA,EAAA;AAAA,KAClB;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,mBAAA,CACJ,MAAA,EACA,IAAA,EACA,KAAA,EACA,UACA,aAAA,EACe;AACf,IAAA,MAAM,KAAA,GAAoB;AAAA,MACxB,IAAIA,iBAAA,EAAW;AAAA,MACf,aAAA;AAAA,MACA,SAAA,EAAW,KAAK,GAAA,EAAI;AAAA,MACpB,MAAA,EAAQ,kBAAA;AAAA,MACR,QAAQ,IAAA,EAAM,MAAA;AAAA,MACd,eAAe,MAAA,CAAO,KAAA;AAAA,MACtB,WAAW,MAAA,CAAO,SAAA;AAAA,MAClB,SAAS,MAAA,CAAO,OAAA;AAAA,MAChB,OAAA,EAAS,KAAA;AAAA,MACT,QAAA;AAAA,MACA,OAAO,KAAA,CAAM,OAAA;AAAA,MACb,QAAA,EAAU;AAAA,QACR,WAAW,KAAA,CAAM,IAAA;AAAA,QACjB,YAAY,KAAA,CAAM,KAAA;AAAA,QAClB,SAAS,MAAA,CAAO;AAAA;AAClB,KACF;AAEA,IAAA,MAAM,IAAA,CAAK,QAAQ,KAAK,CAAA;AACxB,IAAA,IAAA,CAAK,MAAA,CAAO,KAAA;AAAA,MACV,CAAA,CAAA,EAAI,aAAa,CAAA,oBAAA,EAAuB,MAAA,CAAO,SAAS,KAAK,MAAA,CAAO,OAAO,CAAA,GAAA,EAAM,KAAA,CAAM,OAAO,CAAA,CAAA;AAAA,MAC9F,KAAA,CAAM;AAAA,KACR;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,eAAA,CACJ,KAAA,EACA,MAAA,EACA,QACA,QAAA,EACe;AACf,IAAA,MAAM,aAAA,GAAgB,KAAK,qBAAA,EAAsB;AACjD,IAAA,MAAM,KAAA,GAAoB;AAAA,MACxB,IAAIA,iBAAA,EAAW;AAAA,MACf,aAAA;AAAA,MACA,SAAA,EAAW,KAAK,GAAA,EAAI;AAAA,MACpB,MAAA,EAAQ,eAAA;AAAA,MACR,MAAA;AAAA,MACA,aAAA,EAAe,KAAA;AAAA,MACf,SAAA,EAAW,UAAU,SAAA,IAAa,SAAA;AAAA,MAClC,OAAA,EAAS,UAAU,OAAA,IAAW,SAAA;AAAA,MAC9B,OAAA,EAAS,KAAA;AAAA,MACT,KAAA,EAAO,MAAA;AAAA,MACP,QAAA,EAAU,YAAY;AAAC,KACzB;AAEA,IAAA,MAAM,IAAA,CAAK,QAAQ,KAAK,CAAA;AACxB,IAAA,IAAA,CAAK,MAAA,CAAO,IAAA;AAAA,MACV,CAAA,CAAA,EAAI,aAAa,CAAA,0BAAA,EAA6B,KAAK,KAAK,MAAM,CAAA;AAAA,KAChE;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,cAAA,CACJ,UAAA,EACA,UAAA,EACA,QAAA,EACe;AACf,IAAA,MAAM,aAAA,GAAgB,KAAK,qBAAA,EAAsB;AACjD,IAAA,MAAM,KAAA,GAAoB;AAAA,MACxB,IAAIA,iBAAA,EAAW;AAAA,MACf,aAAA;AAAA,MACA,SAAA,EAAW,KAAK,GAAA,EAAI;AAAA,MACpB,MAAA,EAAQ,cAAA;AAAA,MACR,aAAA,EAAe,UAAU,KAAA,IAAS,SAAA;AAAA,MAClC,SAAA,EAAW,UAAU,SAAA,IAAa,SAAA;AAAA,MAClC,OAAA,EAAS,UAAU,OAAA,IAAW,SAAA;AAAA,MAC9B,OAAA,EAAS,KAAA;AAAA,MACT,QAAA,EAAU;AAAA,QACR,UAAA;AAAA,QACA,UAAA;AAAA,QACA,GAAG;AAAA;AACL,KACF;AAEA,IAAA,MAAM,IAAA,CAAK,QAAQ,KAAK,CAAA;AACxB,IAAA,IAAA,CAAK,MAAA,CAAO,IAAA;AAAA,MACV,CAAA,CAAA,EAAI,aAAa,CAAA,gBAAA,EAAmB,UAAU,iBAAiB,UAAU,CAAA,CAAA;AAAA,KAC3E;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,eAAA,CACJ,MAAA,EACA,IAAA,EACA,aAAA,EACiB;AACjB,IAAA,MAAM,aAAA,GAAgB,KAAK,qBAAA,EAAsB;AACjD,IAAA,MAAM,KAAA,GAAoB;AAAA,MACxB,IAAIA,iBAAA,EAAW;AAAA,MACf,aAAA;AAAA,MACA,SAAA,EAAW,KAAK,GAAA,EAAI;AAAA,MACpB,MAAA,EAAQ,iBAAA;AAAA,MACR,QAAQ,IAAA,EAAM,MAAA;AAAA,MACd,eAAe,MAAA,CAAO,KAAA;AAAA,MACtB,WAAW,MAAA,CAAO,SAAA;AAAA,MAClB,SAAS,MAAA,CAAO,OAAA;AAAA,MAChB,OAAA,EAAS,IAAA;AAAA,MACT,QAAA,EAAU;AAAA,QACR,aAAA;AAAA,QACA,cAAc,MAAA,CAAO,OAAA;AAAA,QACrB,WAAW,MAAA,CAAO;AAAA;AACpB,KACF;AAEA,IAAA,MAAM,IAAA,CAAK,QAAQ,KAAK,CAAA;AACxB,IAAA,IAAA,CAAK,MAAA,CAAO,GAAA;AAAA,MACV,CAAA,CAAA,EAAI,aAAa,CAAA,iBAAA,EAAoB,aAAa,QAAQ,MAAA,CAAO,SAAS,CAAA,EAAA,EAAK,MAAA,CAAO,OAAO,CAAA;AAAA,KAC/F;AAEA,IAAA,OAAO,aAAA;AAAA,EACT;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,mBAAmB,KAAA,EAAsC;AAC7D,IAAA,MAAM,UAAwB,EAAC;AAC/B,IAAA,KAAA,MAAW,KAAA,IAAS,IAAA,CAAK,UAAA,CAAW,MAAA,EAAO,EAAG;AAC5C,MAAA,IAAI,KAAA,CAAM,kBAAkB,KAAA,EAAO;AACjC,QAAA,OAAA,CAAQ,KAAK,KAAK,CAAA;AAAA,MACpB;AAAA,IACF;AACA,IAAA,OAAO,OAAA,CAAQ,KAAK,CAAC,CAAA,EAAG,MAAM,CAAA,CAAE,SAAA,GAAY,EAAE,SAAS,CAAA;AAAA,EACzD;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,iBAAA,CACJ,MAAA,EACA,SAAA,EACA,OAAA,EACuB;AACvB,IAAA,MAAM,UAAwB,EAAC;AAC/B,IAAA,MAAM,QAAQ,SAAA,IAAa,CAAA;AAC3B,IAAA,MAAM,GAAA,GAAM,OAAA,IAAW,IAAA,CAAK,GAAA,EAAI;AAEhC,IAAA,KAAA,MAAW,KAAA,IAAS,IAAA,CAAK,UAAA,CAAW,MAAA,EAAO,EAAG;AAC5C,MAAA,IACE,KAAA,CAAM,WAAW,MAAA,IACjB,KAAA,CAAM,aAAa,KAAA,IACnB,KAAA,CAAM,aAAa,GAAA,EACnB;AACA,QAAA,OAAA,CAAQ,KAAK,KAAK,CAAA;AAAA,MACpB;AAAA,IACF;AACA,IAAA,OAAO,OAAA,CAAQ,KAAK,CAAC,CAAA,EAAG,MAAM,CAAA,CAAE,SAAA,GAAY,EAAE,SAAS,CAAA;AAAA,EACzD;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,aAAA,CACJ,SAAA,EACA,OAAA,EAC8B;AAC9B,IAAA,MAAM,UAAwB,EAAC;AAC/B,IAAA,KAAA,MAAW,KAAA,IAAS,IAAA,CAAK,UAAA,CAAW,MAAA,EAAO,EAAG;AAC5C,MAAA,IAAI,KAAA,CAAM,SAAA,IAAa,SAAA,IAAa,KAAA,CAAM,aAAa,OAAA,EAAS;AAC9D,QAAA,OAAA,CAAQ,KAAK,KAAK,CAAA;AAAA,MACpB;AAAA,IACF;AAEA,IAAA,MAAM,KAAA,GAAQ;AAAA,MACZ,gBAAgB,OAAA,CAAQ,MAAA;AAAA,MACxB,sBAAsB,OAAA,CAAQ,MAAA;AAAA,QAC5B,CAAA,CAAA,KAAK,EAAE,MAAA,KAAW,qBAAA;AAAA,OACpB,CAAE,MAAA;AAAA,MACF,kBAAkB,OAAA,CAAQ,MAAA;AAAA,QACxB,CAAA,CAAA,KAAK,EAAE,MAAA,KAAW,kBAAA;AAAA,OACpB,CAAE,MAAA;AAAA,MACF,cAAc,OAAA,CAAQ,MAAA;AAAA,QACpB,CAAA,CAAA,KAAK,EAAE,MAAA,KAAW,eAAA;AAAA,OACpB,CAAE,MAAA;AAAA,MACF,aAAa,OAAA,CAAQ,MAAA;AAAA,QACnB,CAAA,CAAA,KAAK,EAAE,MAAA,KAAW,cAAA;AAAA,OACpB,CAAE,MAAA;AAAA,MACF,eAAA,EAAiB,CAAA;AAAA,MACjB,aAAa,EAAC;AAAA,MACd,WAAW;AAAC,KACd;AAGA,IAAA,MAAM,SAAA,GAAY,OAAA,CAAQ,MAAA,CAAO,CAAA,CAAA,KAAK,CAAA,CAAE,QAAQ,CAAA,CAAE,GAAA,CAAI,CAAA,CAAA,KAAK,CAAA,CAAE,QAAS,CAAA;AACtE,IAAA,IAAI,SAAA,CAAU,SAAS,CAAA,EAAG;AACxB,MAAA,KAAA,CAAM,eAAA,GACJ,SAAA,CAAU,MAAA,CAAO,CAAC,CAAA,EAAG,MAAM,CAAA,GAAI,CAAA,EAAG,CAAC,CAAA,GAAI,SAAA,CAAU,MAAA;AAAA,IACrD;AAGA,IAAA,OAAA,CAAQ,QAAQ,CAAA,KAAA,KAAS;AACvB,MAAA,KAAA,CAAM,WAAA,CAAY,MAAM,SAAS,CAAA,GAAA,CAC9B,MAAM,WAAA,CAAY,KAAA,CAAM,SAAS,CAAA,IAAK,CAAA,IAAK,CAAA;AAC9C,MAAA,MAAM,MAAM,CAAA,EAAG,KAAA,CAAM,SAAS,CAAA,EAAA,EAAK,MAAM,OAAO,CAAA,CAAA;AAChD,MAAA,KAAA,CAAM,UAAU,GAAG,CAAA,GAAA,CAAK,MAAM,SAAA,CAAU,GAAG,KAAK,CAAA,IAAK,CAAA;AAAA,IACvD,CAAC,CAAA;AAED,IAAA,OAAO,KAAA;AAAA,EACT;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,MAAc,QAAQ,KAAA,EAAkC;AAEtD,IAAA,IAAA,CAAK,UAAA,CAAW,GAAA,CAAI,KAAA,CAAM,EAAA,EAAI,KAAK,CAAA;AAGnC,IAAA,IAAI,IAAA,CAAK,UAAA,CAAW,IAAA,GAAO,GAAA,EAAO;AAChC,MAAA,MAAM,OAAA,GAAU,MAAM,IAAA,CAAK,IAAA,CAAK,WAAW,OAAA,EAAS,CAAA,CACjD,IAAA,CAAK,CAAC,CAAA,EAAG,MAAM,CAAA,CAAE,CAAC,CAAA,CAAE,SAAA,GAAY,CAAA,CAAE,CAAC,EAAE,SAAS,CAAA,CAC9C,KAAA,CAAM,CAAA,EAAG,GAAK,CAAA;AACjB,MAAA,IAAA,CAAK,WAAW,KAAA,EAAM;AACtB,MAAA,OAAA,CAAQ,OAAA,CAAQ,CAAC,CAAC,EAAA,EAAIC,MAAK,CAAA,KAAM,IAAA,CAAK,UAAA,CAAW,GAAA,CAAI,EAAA,EAAIA,MAAK,CAAC,CAAA;AAAA,IACjE;AAAA,EAIF;AAAA;AAAA;AAAA;AAAA,EAKQ,qBAAA,GAAgC;AACtC,IAAA,OAAO,CAAA,GAAA,EAAM,IAAA,CAAK,GAAA,EAAK,CAAA,CAAA,EAAID,mBAAW,CAAE,KAAA,CAAM,CAAA,EAAG,CAAC,CAAC,CAAA,CAAA;AAAA,EACrD;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,eAAA,CACJ,SAAA,EACA,OAAA,EACA,SAAyB,MAAA,EACR;AACjB,IAAA,MAAM,UAAwB,EAAC;AAC/B,IAAA,KAAA,MAAW,KAAA,IAAS,IAAA,CAAK,UAAA,CAAW,MAAA,EAAO,EAAG;AAC5C,MAAA,IAAI,KAAA,CAAM,SAAA,IAAa,SAAA,IAAa,KAAA,CAAM,aAAa,OAAA,EAAS;AAC9D,QAAA,OAAA,CAAQ,KAAK,KAAK,CAAA;AAAA,MACpB;AAAA,IACF;AAEA,IAAA,IAAI,WAAW,MAAA,EAAQ;AACrB,MAAA,OAAO,IAAA,CAAK,SAAA,CAAU,OAAA,EAAS,IAAA,EAAM,CAAC,CAAA;AAAA,IACxC,CAAA,MAAO;AAEL,MAAA,MAAM,OAAA,GAAU;AAAA,QACd,IAAA;AAAA,QACA,eAAA;AAAA,QACA,WAAA;AAAA,QACA,QAAA;AAAA,QACA,QAAA;AAAA,QACA,eAAA;AAAA,QACA,WAAA;AAAA,QACA,SAAA;AAAA,QACA,SAAA;AAAA,QACA,UAAA;AAAA,QACA;AAAA,OACF;AACA,MAAA,MAAM,IAAA,GAAO,OAAA,CAAQ,GAAA,CAAI,CAAA,CAAA,KAAK;AAAA,QAC5B,CAAA,CAAE,EAAA;AAAA,QACF,CAAA,CAAE,aAAA;AAAA,QACF,IAAI,IAAA,CAAK,CAAA,CAAE,SAAS,EAAE,WAAA,EAAY;AAAA,QAClC,CAAA,CAAE,MAAA;AAAA,QACF,EAAE,MAAA,IAAU,EAAA;AAAA,QACZ,CAAA,CAAE,aAAA;AAAA,QACF,CAAA,CAAE,SAAA;AAAA,QACF,CAAA,CAAE,OAAA;AAAA,QACF,CAAA,CAAE,QAAQ,QAAA,EAAS;AAAA,QACnB,CAAA,CAAE,QAAA,EAAU,QAAA,EAAS,IAAK,EAAA;AAAA,QAC1B,EAAE,KAAA,IAAS;AAAA,OACZ,CAAA;AACD,MAAA,OAAO,CAAC,OAAA,EAAS,GAAG,IAAI,CAAA,CAAE,GAAA,CAAI,CAAA,GAAA,KAAO,GAAA,CAAI,IAAA,CAAK,GAAG,CAAC,CAAA,CAAE,KAAK,IAAI,CAAA;AAAA,IAC/D;AAAA,EACF;AACF;AApZaD,uBAAA,GAAN,eAAA,CAAA;AAAA,EADN/B,iBAAAA;AAAW,CAAA,EACC+B,uBAAA,CAAA;AC3BAG,0BAAN,qBAAA,CAAsB;AAAA,EACV,QAAA;AAAA;AAAA,EAGA,cAAA;AAAA,EACA,gBAAA;AAAA,EACA,eAAA;AAAA,EACA,gBAAA;AAAA,EACA,YAAA;AAAA,EACA,WAAA;AAAA,EACA,YAAA;AAAA,EACA,aAAA;AAAA;AAAA,EAGA,iBAAA;AAAA,EACA,qBAAA;AAAA,EACA,QAAA;AAAA;AAAA,EAGA,eAAA;AAAA,EACA,gBAAA;AAAA,EACA,SAAA;AAAA,EAEjB,YAAY,QAAA,EAAqB;AAC/B,IAAA,IAAA,CAAK,QAAA,GAAW,QAAA,IAAY,IAAIC,mBAAA,EAAS;AAGzC,IAAAC,gCAAA,CAAsB,EAAE,QAAA,EAAU,IAAA,CAAK,QAAA,EAAU,CAAA;AAGjD,IAAA,IAAA,CAAK,cAAA,GAAiB,IAAIC,kBAAA,CAAQ;AAAA,MAChC,IAAA,EAAM,uBAAA;AAAA,MACN,IAAA,EAAM,qCAAA;AAAA,MACN,UAAA,EAAY,CAAC,YAAA,EAAc,SAAA,EAAW,QAAQ,CAAA;AAAA,MAC9C,SAAA,EAAW,CAAC,IAAA,CAAK,QAAQ;AAAA,KAC1B,CAAA;AAED,IAAA,IAAA,CAAK,gBAAA,GAAmB,IAAIA,kBAAA,CAAQ;AAAA,MAClC,IAAA,EAAM,+BAAA;AAAA,MACN,IAAA,EAAM,gDAAA;AAAA,MACN,UAAA,EAAY,CAAC,YAAA,EAAc,SAAS,CAAA;AAAA,MACpC,SAAA,EAAW,CAAC,IAAA,CAAK,QAAQ;AAAA,KAC1B,CAAA;AAED,IAAA,IAAA,CAAK,eAAA,GAAkB,IAAIA,kBAAA,CAAQ;AAAA,MACjC,IAAA,EAAM,8BAAA;AAAA,MACN,IAAA,EAAM,4CAAA;AAAA,MACN,UAAA,EAAY,CAAC,YAAA,EAAc,SAAA,EAAW,YAAY,CAAA;AAAA,MAClD,SAAA,EAAW,CAAC,IAAA,CAAK,QAAQ;AAAA,KAC1B,CAAA;AAED,IAAA,IAAA,CAAK,gBAAA,GAAmB,IAAIA,kBAAA,CAAQ;AAAA,MAClC,IAAA,EAAM,+BAAA;AAAA,MACN,IAAA,EAAM,mCAAA;AAAA,MACN,UAAA,EAAY,CAAC,YAAA,EAAc,SAAS,CAAA;AAAA,MACpC,SAAA,EAAW,CAAC,IAAA,CAAK,QAAQ;AAAA,KAC1B,CAAA;AAED,IAAA,IAAA,CAAK,YAAA,GAAe,IAAIA,kBAAA,CAAQ;AAAA,MAC9B,IAAA,EAAM,qCAAA;AAAA,MACN,IAAA,EAAM,sCAAA;AAAA,MACN,UAAA,EAAY,CAAC,QAAQ,CAAA;AAAA,MACrB,SAAA,EAAW,CAAC,IAAA,CAAK,QAAQ;AAAA,KAC1B,CAAA;AAED,IAAA,IAAA,CAAK,WAAA,GAAc,IAAIA,kBAAA,CAAQ;AAAA,MAC7B,IAAA,EAAM,oCAAA;AAAA,MACN,IAAA,EAAM,uCAAA;AAAA,MACN,UAAA,EAAY,CAAC,iBAAiB,CAAA;AAAA,MAC9B,SAAA,EAAW,CAAC,IAAA,CAAK,QAAQ;AAAA,KAC1B,CAAA;AAED,IAAA,IAAA,CAAK,YAAA,GAAe,IAAIA,kBAAA,CAAQ;AAAA,MAC9B,IAAA,EAAM,oCAAA;AAAA,MACN,IAAA,EAAM,wCAAA;AAAA,MACN,UAAA,EAAY,CAAC,YAAA,EAAc,SAAS,CAAA;AAAA,MACpC,SAAA,EAAW,CAAC,IAAA,CAAK,QAAQ;AAAA,KAC1B,CAAA;AAED,IAAA,IAAA,CAAK,aAAA,GAAgB,IAAIA,kBAAA,CAAQ;AAAA,MAC/B,IAAA,EAAM,qCAAA;AAAA,MACN,IAAA,EAAM,yCAAA;AAAA,MACN,UAAA,EAAY,CAAC,YAAY,CAAA;AAAA,MACzB,SAAA,EAAW,CAAC,IAAA,CAAK,QAAQ;AAAA,KAC1B,CAAA;AAGD,IAAA,IAAA,CAAK,iBAAA,GAAoB,IAAIC,oBAAA,CAAU;AAAA,MACrC,IAAA,EAAM,2CAAA;AAAA,MACN,IAAA,EAAM,2CAAA;AAAA,MACN,UAAA,EAAY,CAAC,YAAA,EAAc,SAAA,EAAW,QAAQ,CAAA;AAAA,MAC9C,OAAA,EAAS,CAAC,IAAA,EAAM,IAAA,EAAM,KAAK,GAAA,EAAK,CAAA,EAAG,CAAA,EAAG,CAAA,EAAG,EAAE,CAAA;AAAA,MAC3C,SAAA,EAAW,CAAC,IAAA,CAAK,QAAQ;AAAA,KAC1B,CAAA;AAED,IAAA,IAAA,CAAK,qBAAA,GAAwB,IAAIA,oBAAA,CAAU;AAAA,MACzC,IAAA,EAAM,gDAAA;AAAA,MACN,IAAA,EAAM,uCAAA;AAAA,MACN,UAAA,EAAY,CAAC,QAAQ,CAAA;AAAA,MACrB,SAAS,CAAC,IAAA,EAAO,MAAO,IAAA,EAAM,KAAA,EAAO,MAAM,GAAG,CAAA;AAAA,MAC9C,SAAA,EAAW,CAAC,IAAA,CAAK,QAAQ;AAAA,KAC1B,CAAA;AAED,IAAA,IAAA,CAAK,QAAA,GAAW,IAAIA,oBAAA,CAAU;AAAA,MAC5B,IAAA,EAAM,kCAAA;AAAA,MACN,IAAA,EAAM,qCAAA;AAAA,MACN,UAAA,EAAY,CAAC,YAAY,CAAA;AAAA,MACzB,OAAA,EAAS,CAAC,CAAA,EAAG,CAAA,EAAG,IAAI,EAAA,EAAI,EAAA,EAAI,GAAA,EAAK,GAAA,EAAK,GAAG,CAAA;AAAA,MACzC,SAAA,EAAW,CAAC,IAAA,CAAK,QAAQ;AAAA,KAC1B,CAAA;AAGD,IAAA,IAAA,CAAK,eAAA,GAAkB,IAAIC,gBAAA,CAAM;AAAA,MAC/B,IAAA,EAAM,wBAAA;AAAA,MACN,IAAA,EAAM,yCAAA;AAAA,MACN,UAAA,EAAY,CAAC,YAAY,CAAA;AAAA,MACzB,SAAA,EAAW,CAAC,IAAA,CAAK,QAAQ;AAAA,KAC1B,CAAA;AAED,IAAA,IAAA,CAAK,gBAAA,GAAmB,IAAIA,gBAAA,CAAM;AAAA,MAChC,IAAA,EAAM,yBAAA;AAAA,MACN,IAAA,EAAM,sCAAA;AAAA,MACN,UAAA,EAAY,CAAC,YAAY,CAAA;AAAA,MACzB,SAAA,EAAW,CAAC,IAAA,CAAK,QAAQ;AAAA,KAC1B,CAAA;AAED,IAAA,IAAA,CAAK,SAAA,GAAY,IAAIA,gBAAA,CAAM;AAAA,MACzB,IAAA,EAAM,2BAAA;AAAA,MACN,IAAA,EAAM,gCAAA;AAAA,MACN,SAAA,EAAW,CAAC,IAAA,CAAK,QAAQ;AAAA,KAC1B,CAAA;AAAA,EACH;AAAA;AAAA;AAAA;AAAA,EAKA,oBAAA,CAAqB,WAAmB,OAAA,EAAwB;AAC9D,IAAA,MAAM,MAAA,GAAS,EAAE,UAAA,EAAY,SAAA,EAAU;AACvC,IAAA,IAAA,CAAK,eAAA,CAAgB,IAAI,MAAM,CAAA;AAC/B,IAAA,IAAA,CAAK,gBAAA,CAAiB,IAAI,MAAM,CAAA;AAAA,EAClC;AAAA;AAAA;AAAA;AAAA,EAKA,uBAAA,CACE,SAAA,EACA,OAAA,EACA,QAAA,EACA,SACA,KAAA,EACM;AACN,IAAA,MAAM,MAAA,GAAS,UAAU,SAAA,GAAY,SAAA;AAGrC,IAAA,IAAA,CAAK,eAAe,GAAA,CAAI,EAAE,YAAY,SAAA,EAAW,OAAA,EAAS,QAAQ,CAAA;AAElE,IAAA,IAAI,OAAA,EAAS;AACX,MAAA,IAAA,CAAK,iBAAiB,GAAA,CAAI,EAAE,UAAA,EAAY,SAAA,EAAW,SAAS,CAAA;AAAA,IAC9D,CAAA,MAAO;AACL,MAAA,MAAM,SAAA,GAAY,IAAA,CAAK,aAAA,CAAc,KAAK,CAAA;AAC1C,MAAA,IAAA,CAAK,gBAAgB,GAAA,CAAI;AAAA,QACvB,UAAA,EAAY,SAAA;AAAA,QACZ,OAAA;AAAA,QACA,UAAA,EAAY;AAAA,OACb,CAAA;AAAA,IACH;AAGA,IAAA,IAAA,CAAK,iBAAA,CAAkB,OAAA;AAAA,MACrB,EAAE,UAAA,EAAY,SAAA,EAAW,OAAA,EAAS,MAAA,EAAO;AAAA,MACzC,QAAA,GAAW;AAAA;AAAA,KACb;AAGA,IAAA,IAAA,CAAK,eAAA,CAAgB,GAAA,CAAI,EAAE,UAAA,EAAY,WAAW,CAAA;AAAA,EACpD;AAAA;AAAA;AAAA;AAAA,EAKA,iBAAA,CAAkB,WAAmB,OAAA,EAAuB;AAC1D,IAAA,IAAA,CAAK,aAAa,GAAA,CAAI,EAAE,UAAA,EAAY,SAAA,EAAW,SAAS,CAAA;AACxD,IAAA,IAAA,CAAK,gBAAA,CAAiB,GAAA,CAAI,EAAE,UAAA,EAAY,WAAW,CAAA;AAAA,EACrD;AAAA;AAAA;AAAA;AAAA,EAKA,mBAAmB,SAAA,EAAyB;AAC1C,IAAA,IAAA,CAAK,aAAA,CAAc,GAAA,CAAI,EAAE,UAAA,EAAY,WAAW,CAAA;AAChD,IAAA,IAAA,CAAK,gBAAA,CAAiB,GAAA,CAAI,EAAE,UAAA,EAAY,WAAW,CAAA;AAAA,EACrD;AAAA;AAAA;AAAA;AAAA,EAKA,cAAA,CAAe,WAAmB,KAAA,EAAqB;AACrD,IAAA,IAAA,CAAK,SAAS,OAAA,CAAQ,EAAE,YAAY,SAAA,EAAU,EAAG,QAAQ,GAAI,CAAA;AAAA,EAC/D;AAAA;AAAA;AAAA;AAAA,EAKA,mBAAA,CAAoB,SAAkB,UAAA,EAA0B;AAC9D,IAAA,MAAM,MAAA,GAAS,UAAU,SAAA,GAAY,QAAA;AACrC,IAAA,IAAA,CAAK,sBAAsB,OAAA,CAAQ,EAAE,MAAA,EAAO,EAAG,aAAa,GAAI,CAAA;AAEhE,IAAA,IAAI,CAAC,OAAA,EAAS;AACZ,MAAA,IAAA,CAAK,YAAA,CAAa,GAAA,CAAI,EAAE,MAAA,EAAQ,kBAAkB,CAAA;AAAA,IACpD;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKA,mBAAmB,MAAA,EAAsB;AACvC,IAAA,IAAA,CAAK,YAAA,CAAa,GAAA,CAAI,EAAE,MAAA,EAAQ,CAAA;AAAA,EAClC;AAAA;AAAA;AAAA;AAAA,EAKA,kBAAkB,cAAA,EAA+C;AAC/D,IAAA,IAAA,CAAK,WAAA,CAAY,GAAA,CAAI,EAAE,eAAA,EAAiB,gBAAgB,CAAA;AAAA,EAC1D;AAAA;AAAA;AAAA;AAAA,EAKA,WAAA,CAAY,WAAmB,OAAA,EAAuB;AACpD,IAAA,IAAA,CAAK,iBAAiB,GAAA,CAAI,EAAE,UAAA,EAAY,SAAA,EAAW,SAAS,CAAA;AAAA,EAC9D;AAAA;AAAA;AAAA;AAAA,EAKA,gBAAgB,IAAA,EAAoB;AAClC,IAAA,IAAA,CAAK,SAAA,CAAU,IAAI,IAAI,CAAA;AAAA,EACzB;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,UAAA,GAA8B;AAClC,IAAA,OAAO,IAAA,CAAK,SAAS,OAAA,EAAQ;AAAA,EAC/B;AAAA;AAAA;AAAA;AAAA,EAKA,cAAA,GAAyB;AACvB,IAAA,OAAO,KAAK,QAAA,CAAS,WAAA;AAAA,EACvB;AAAA;AAAA;AAAA;AAAA,EAKA,KAAA,GAAc;AACZ,IAAA,IAAA,CAAK,SAAS,YAAA,EAAa;AAAA,EAC7B;AAAA;AAAA;AAAA;AAAA,EAKQ,cAAc,KAAA,EAAwB;AAC5C,IAAA,IAAI,CAAC,OAAO,OAAO,SAAA;AAEnB,IAAA,MAAM,UAAA,GAAa,MAAM,WAAA,EAAY;AAErC,IAAA,IAAI,UAAA,CAAW,QAAA,CAAS,SAAS,CAAA,EAAG,OAAO,SAAA;AAC3C,IAAA,IAAI,UAAA,CAAW,QAAA,CAAS,SAAS,CAAA,EAAG,OAAO,SAAA;AAC3C,IAAA,IAAI,UAAA,CAAW,QAAA,CAAS,YAAY,CAAA,EAAG,OAAO,YAAA;AAC9C,IAAA,IAAI,WAAW,QAAA,CAAS,YAAY,CAAA,IAAK,UAAA,CAAW,SAAS,WAAW,CAAA;AACtE,MAAA,OAAO,YAAA;AACT,IAAA,IAAI,UAAA,CAAW,QAAA,CAAS,WAAW,CAAA,EAAG,OAAO,WAAA;AAC7C,IAAA,IAAI,UAAA,CAAW,QAAA,CAAS,YAAY,CAAA,EAAG,OAAO,YAAA;AAC9C,IAAA,IAAI,UAAA,CAAW,QAAA,CAAS,OAAO,CAAA,EAAG,OAAO,iBAAA;AAEzC,IAAA,OAAO,aAAA;AAAA,EACT;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,UAAA,GAA2C;AAC/C,IAAA,MAAM,OAAA,GAAU,MAAM,IAAA,CAAK,QAAA,CAAS,gBAAA,EAAiB;AACrD,IAAA,MAAM,UAA+B,EAAC;AAEtC,IAAA,OAAA,CAAQ,OAAA,CAAQ,CAAC,MAAA,KAAgB;AAC/B,MAAA,IAAI,MAAA,CAAO,SAAS,uBAAA,EAAyB;AAC3C,QAAA,OAAA,CAAQ,cAAA,GAAiB,OAAO,MAAA,CAAO,MAAA;AAAA,UACrC,CAAC,GAAA,EAAa,CAAA,KAAW,GAAA,GAAM,CAAA,CAAE,KAAA;AAAA,UACjC;AAAA,SACF;AAAA,MACF;AACA,MAAA,IAAI,MAAA,CAAO,SAAS,+BAAA,EAAiC;AACnD,QAAA,OAAA,CAAQ,mBAAA,GAAsB,OAAO,MAAA,CAAO,MAAA;AAAA,UAC1C,CAAC,GAAA,EAAa,CAAA,KAAW,GAAA,GAAM,CAAA,CAAE,KAAA;AAAA,UACjC;AAAA,SACF;AAAA,MACF;AACA,MAAA,IAAI,MAAA,CAAO,SAAS,8BAAA,EAAgC;AAClD,QAAA,OAAA,CAAQ,eAAA,GAAkB,OAAO,MAAA,CAAO,MAAA;AAAA,UACtC,CAAC,GAAA,EAAa,CAAA,KAAW,GAAA,GAAM,CAAA,CAAE,KAAA;AAAA,UACjC;AAAA,SACF;AAAA,MACF;AACA,MAAA,IAAI,MAAA,CAAO,SAAS,wBAAA,EAA0B;AAC5C,QAAA,OAAA,CAAQ,eAAA,GAAkB,OAAO,MAAA,CAAO,MAAA;AAAA,UACtC,CAAC,GAAA,EAAa,CAAA,KAAW,GAAA,GAAM,CAAA,CAAE,KAAA;AAAA,UACjC;AAAA,SACF;AAAA,MACF;AAAA,IACF,CAAC,CAAA;AAED,IAAA,IAAI,OAAA,CAAQ,iBAAiB,CAAA,EAAG;AAC9B,MAAA,OAAA,CAAQ,WAAA,GACL,OAAA,CAAQ,mBAAA,GAAsB,OAAA,CAAQ,cAAA,GAAkB,GAAA;AAAA,IAC7D;AAEA,IAAA,OAAO,OAAA;AAAA,EACT;AACF;AAnUaL,uBAAA,GAAN,eAAA,CAAA;AAAA,EADNlC,iBAAAA;AAAW,CAAA,EACCkC,uBAAA,CAAA;ACUAM,8BAAN,yBAAA,CAA0B;AAAA,EAS/B,YAA6B,KAAA,EAAc;AAAd,IAAA,IAAA,CAAA,KAAA,GAAA,KAAA;AAAA,EAAe;AAAA,EAR3B,MAAA,GAAS,IAAIzC,aAAAA,CAAOyC,2BAAA,CAAoB,IAAI,CAAA;AAAA,EAC5C,aAAA,GAAiC;AAAA,IAChD,QAAA,EAAU,GAAA;AAAA;AAAA,IACV,WAAA,EAAa,EAAA;AAAA;AAAA,IACb,SAAA,EAAW,oBAAA;AAAA,IACX,kBAAA,EAAoB;AAAA,GACtB;AAAA;AAAA;AAAA;AAAA,EAOA,MAAM,UAAA,CACJ,UAAA,EACA,MAAA,EAC0B;AAC1B,IAAA,MAAM,MAAM,EAAE,GAAG,IAAA,CAAK,aAAA,EAAe,GAAG,MAAA,EAAO;AAC/C,IAAA,MAAM,GAAA,GAAM,CAAA,EAAG,GAAA,CAAI,SAAS,IAAI,UAAU,CAAA,CAAA;AAC1C,IAAA,MAAM,GAAA,GAAM,KAAK,GAAA,EAAI;AACrB,IAAA,MAAM,WAAA,GAAc,MAAM,GAAA,CAAI,QAAA;AAG9B,IAAA,MAAM,MAAA,GAAS;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,IAAA,CAAA;AA6Bf,IAAA,MAAM,MAAA,GAAU,MAAM,IAAA,CAAK,KAAA,CAAM,IAAA;AAAA,MAC/B,MAAA;AAAA,MACA,CAAA;AAAA,MACA,GAAA;AAAA,MACA,GAAA;AAAA,MACA,WAAA;AAAA,MACA,GAAA,CAAI,WAAA;AAAA,MACJ,GAAA,CAAI;AAAA,KACN;AAEA,IAAA,MAAM,CAAC,OAAA,EAAS,KAAA,EAAO,SAAA,EAAW,OAAO,CAAA,GAAI,MAAA;AAE7C,IAAA,MAAM,eAAA,GAAmC;AAAA,MACvC,SAAS,OAAA,KAAY,CAAA;AAAA,MACrB,KAAA;AAAA,MACA,SAAA,EAAW,IAAA,CAAK,GAAA,CAAI,CAAA,EAAG,SAAS,CAAA;AAAA,MAChC;AAAA,KACF;AAEA,IAAA,IAAI,CAAC,gBAAgB,OAAA,EAAS;AAC5B,MAAA,eAAA,CAAgB,UAAA,GAAa,IAAA,CAAK,IAAA,CAAA,CAAM,OAAA,GAAU,OAAO,GAAI,CAAA;AAC7D,MAAA,IAAA,CAAK,MAAA,CAAO,IAAA;AAAA,QACV,CAAA,wBAAA,EAA2B,UAAU,CAAA,cAAA,EAAiB,eAAA,CAAgB,UAAU,CAAA,CAAA;AAAA,OAClF;AAAA,IACF;AAEA,IAAA,OAAO,eAAA;AAAA,EACT;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,cAAA,CACJ,MAAA,EACA,MAAA,EAC0B;AAC1B,IAAA,OAAO,IAAA,CAAK,UAAA,CAAW,CAAA,KAAA,EAAQ,MAAM,CAAA,CAAA,EAAI;AAAA,MACvC,QAAA,EAAU,GAAA;AAAA;AAAA,MACV,WAAA,EAAa,EAAA;AAAA;AAAA,MACb,GAAG;AAAA,KACJ,CAAA;AAAA,EACH;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,YAAA,CACJ,EAAA,EACA,MAAA,EAC0B;AAC1B,IAAA,OAAO,IAAA,CAAK,UAAA,CAAW,CAAA,GAAA,EAAM,EAAE,CAAA,CAAA,EAAI;AAAA,MACjC,QAAA,EAAU,GAAA;AAAA;AAAA,MACV,WAAA,EAAa,EAAA;AAAA;AAAA,MACb,GAAG;AAAA,KACJ,CAAA;AAAA,EACH;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,eAAA,CACJ,UAAA,EACA,MAAA,EAC0B;AAC1B,IAAA,OAAO,IAAA,CAAK,UAAA,CAAW,CAAA,MAAA,EAAS,UAAU,CAAA,CAAA,EAAI;AAAA,MAC5C,QAAA,EAAU,GAAA;AAAA;AAAA,MACV,WAAA,EAAa,CAAA;AAAA;AAAA,MACb,GAAG;AAAA,KACJ,CAAA;AAAA,EACH;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,MAAM,KAAA,CAAM,UAAA,EAAoB,SAAA,EAAmC;AACjE,IAAA,MAAM,MAAA,GAAS,SAAA,IAAa,IAAA,CAAK,aAAA,CAAc,SAAA;AAC/C,IAAA,MAAM,GAAA,GAAM,CAAA,EAAG,MAAM,CAAA,CAAA,EAAI,UAAU,CAAA,CAAA;AACnC,IAAA,MAAM,IAAA,CAAK,KAAA,CAAM,GAAA,CAAI,GAAG,CAAA;AACxB,IAAA,IAAA,CAAK,MAAA,CAAO,KAAA,CAAM,CAAA,qBAAA,EAAwB,UAAU,CAAA,CAAE,CAAA;AAAA,EACxD;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,SAAA,CACJ,UAAA,EACA,MAAA,EAC0B;AAC1B,IAAA,MAAM,MAAM,EAAE,GAAG,IAAA,CAAK,aAAA,EAAe,GAAG,MAAA,EAAO;AAC/C,IAAA,MAAM,GAAA,GAAM,CAAA,EAAG,GAAA,CAAI,SAAS,IAAI,UAAU,CAAA,CAAA;AAC1C,IAAA,MAAM,GAAA,GAAM,KAAK,GAAA,EAAI;AACrB,IAAA,MAAM,WAAA,GAAc,MAAM,GAAA,CAAI,QAAA;AAG9B,IAAA,MAAM,IAAA,CAAK,KAAA,CAAM,gBAAA,CAAiB,GAAA,EAAK,GAAG,WAAW,CAAA;AACrD,IAAA,MAAM,eAAA,GAAkB,MAAM,IAAA,CAAK,KAAA,CAAM,MAAM,GAAG,CAAA;AAElD,IAAA,MAAM,YAAY,IAAA,CAAK,GAAA,CAAI,CAAA,EAAG,GAAA,CAAI,cAAc,eAAe,CAAA;AAC/D,IAAA,MAAM,OAAA,GAAU,kBAAkB,GAAA,CAAI,WAAA;AAEtC,IAAA,IAAI,OAAA,GAAU,MAAM,GAAA,CAAI,QAAA;AACxB,IAAA,IAAI,CAAC,OAAA,EAAS;AACZ,MAAA,MAAM,MAAA,GAAS,MAAM,IAAA,CAAK,KAAA,CAAM,OAAO,GAAA,EAAK,CAAA,EAAG,GAAG,YAAY,CAAA;AAC9D,MAAA,IAAI,MAAA,CAAO,UAAU,CAAA,EAAG;AACtB,QAAA,OAAA,GAAU,QAAA,CAAS,MAAA,CAAO,CAAC,CAAC,IAAI,GAAA,CAAI,QAAA;AAAA,MACtC;AAAA,IACF;AAEA,IAAA,OAAO;AAAA,MACL,OAAA;AAAA,MACA,OAAO,GAAA,CAAI,WAAA;AAAA,MACX,SAAA;AAAA,MACA,OAAA;AAAA,MACA,YAAY,OAAA,GAAU,MAAA,GAAY,KAAK,IAAA,CAAA,CAAM,OAAA,GAAU,OAAO,GAAI;AAAA,KACpE;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKA,cAAc,MAAA,EAAiD;AAC7D,IAAA,MAAM,OAAA,GAAkC;AAAA,MACtC,mBAAA,EAAqB,MAAA,CAAO,KAAA,CAAM,QAAA,EAAS;AAAA,MAC3C,uBAAA,EAAyB,MAAA,CAAO,SAAA,CAAU,QAAA,EAAS;AAAA,MACnD,qBAAqB,IAAI,IAAA,CAAK,MAAA,CAAO,OAAO,EAAE,WAAA;AAAY,KAC5D;AAEA,IAAA,IAAI,OAAO,UAAA,EAAY;AACrB,MAAA,OAAA,CAAQ,aAAa,CAAA,GAAI,MAAA,CAAO,UAAA,CAAW,QAAA,EAAS;AAAA,IACtD;AAEA,IAAA,OAAO,OAAA;AAAA,EACT;AACF;AA3LaA,2BAAA,GAAN,eAAA,CAAA;AAAA,EADNxC,iBAAAA;AAAW,CAAA,EACCwC,2BAAA,CAAA;ACbAC,+BAAN,0BAAA,CAA2B;AAAA,EAEhC,WAAA,CACmB,UACA,GAAA,EACjB;AAFiB,IAAA,IAAA,CAAA,QAAA,GAAA,QAAA;AACA,IAAA,IAAA,CAAA,GAAA,GAAA,GAAA;AAAA,EAChB;AAAA,EAJc,MAAA,GAAS,IAAI1C,aAAAA,CAAO0C,4BAAA,CAAqB,IAAI,CAAA;AAAA,EAM9D,MAAM,KAAA,CACJ,MAAA,EACA,KAAA,EACA,OAAA,EACe;AACf,IAAA,IAAI,CAAC,KAAA,EAAO;AACZ,IAAA,MAAM,QAAA,GAAW,OAAO,QAAA,EAAU,QAAA;AAClC,IAAA,IAAI;AACF,MAAA,QAAQ,QAAA;AAAU,QAChB,KAAK,UAAA;AACH,UAAA,MAAM,IAAA,CAAK,QAAA,CAAS,KAAA,CAAM,KAAA,EAAO,OAAO,CAAA;AACxC,UAAA;AAAA,QACF,KAAK,KAAA;AACH,UAAA,MAAM,IAAA,CAAK,GAAA,CAAI,KAAA,CAAM,KAAA,EAAO,OAAO,CAAA;AACnC,UAAA;AAAA,QACF;AACE,UAAA,IAAA,CAAK,MAAA,CAAO,IAAA,CAAK,CAAA,4BAAA,EAA+B,QAAQ,CAAA,CAAE,CAAA;AAAA;AAC9D,IACF,SAAS,GAAA,EAAK;AACZ,MAAA,IAAA,CAAK,MAAA,CAAO,KAAA;AAAA,QACV,CAAA,0BAAA,EAA6B,MAAA,CAAO,SAAS,CAAA,EAAA,EAAK,OAAO,OAAO,CAAA,CAAA;AAAA,QAChE,GAAA,YAAe,KAAA,GAAQ,GAAA,CAAI,KAAA,GAAQ;AAAA,OACrC;AAAA,IACF;AAAA,EACF;AACF;AAhCaA,4BAAA,GAAN,eAAA,CAAA;AAAA,EADNzC,iBAAAA;AAAW,CAAA,EACCyC,4BAAA,CAAA;ACLAC,+BAAN,0BAAA,CAA2D;AAAA,EAC/C,MAAA,GAAS,IAAI3C,aAAAA,CAAO2C,4BAAA,CAAqB,IAAI,CAAA;AAAA,EAE9D,MAAM,KAAA,CAAM,KAAA,EAAsB,OAAA,EAA8B;AAC9D,IAAA,IAAA,CAAK,MAAA,CAAO,KAAA;AAAA,MACV,2BAA2B,IAAA,CAAK,SAAA,CAAU,KAAK,CAAC,iBAAiB,IAAA,CAAK,SAAA;AAAA,QACpE;AAAA,OACD,CAAA;AAAA,KACH;AAAA,EACF;AACF;AAVaA,4BAAA,GAAN,eAAA,CAAA;AAAA,EADN1C,iBAAAA;AAAW,CAAA,EACC0C,4BAAA,CAAA;ACAAC,0BAAN,qBAAA,CAAsD;AAAA,EAC1C,MAAA,GAAS,IAAI5C,aAAAA,CAAO4C,uBAAA,CAAgB,IAAI,CAAA;AAAA,EAEzD,MAAM,KAAA,CAAM,KAAA,EAAsB,OAAA,EAA8B;AAC9D,IAAA,IAAA,CAAK,MAAA,CAAO,KAAA;AAAA,MACV,sBAAsB,IAAA,CAAK,SAAA,CAAU,KAAK,CAAC,iBAAiB,IAAA,CAAK,SAAA;AAAA,QAC/D;AAAA,OACD,CAAA;AAAA,KACH;AAAA,EACF;AACF;AAVaA,uBAAA,GAAN,eAAA,CAAA;AAAA,EADN3C,iBAAAA;AAAW,CAAA,EACC2C,uBAAA,CAAA;;;ACQb,wBAAA,EAAA;ACKaC,6BAAN,wBAAA,CAAgD;AAAA,EAGrD,WAAA,CACmB,OACA,GAAA,EACjB;AAFiB,IAAA,IAAA,CAAA,KAAA,GAAA,KAAA;AACA,IAAA,IAAA,CAAA,GAAA,GAAA,GAAA;AAAA,EAChB;AAAA,EALc,MAAA,GAAS,IAAI7C,aAAAA,CAAO6C,0BAAA,CAAmB,IAAI,CAAA;AAAA,EAO5D,MAAM,YAAY,OAAA,EAA6C;AAC7D,IAAA,MAAM,OAAA,GAAU,OAAA,CAAQ,YAAA,EAAa,CAAE,UAAA,EAA4B;AACnE,IAAA,MAAM,KAAA,GAAQ,QAAQ,IAAA,EAAM,KAAA;AAC5B,IAAA,IAAI,CAAC,KAAA,EAAO;AACV,MAAA,MAAM,IAAIC,6BAAsB,wBAAwB,CAAA;AAAA,IAC1D;AACA,IAAA,MAAM,MAAA,GAAS,MAAM,IAAA,CAAK,KAAA,CAAM,WAAW,KAAK,CAAA;AAChD,IAAA,IAAI,CAAC,MAAA,EAAQ;AACX,MAAA,MAAM,IAAIA,6BAAsB,wBAAwB,CAAA;AAAA,IAC1D;AAGA,IAAA,MAAM,IAAA,GAAO,IAAA,CAAK,WAAA,CAAY,OAAO,CAAA;AAGrC,IAAA,MAAM,IAAA,CAAK,GAAA,CAAI,QAAA,CAAS,IAAA,EAAM,MAAM,CAAA;AAEpC,IAAA,OAAA,CAAQ,cAAA,GAAiB,MAAA;AACzB,IAAA,OAAA,CAAQ,IAAA,GAAO,IAAA;AACf,IAAA,OAAO,IAAA;AAAA,EACT;AAAA,EAEQ,YAAY,OAAA,EAAoD;AACtE,IAAA,IAAA,CAAK,MAAA,CAAO,IAAI,CAAA,4BAAA,CAAA,EAAgC;AAAA,MAC9C,cAAA,EAAgB,CAAC,CAAC,OAAA,CAAQ,IAAA;AAAA,MAC1B,kBAAA,EAAoB,CAAC,CAAC,OAAA,CAAQ,IAAA,EAAM,eAAA;AAAA,MACpC,mBAAA,EAAqB,OAAA,CAAQ,IAAA,EAAM,eAAA,GAC/B,MAAA,CAAO,KAAK,OAAA,CAAQ,IAAA,CAAK,eAAe,CAAA,GACxC;AAAC,KACN,CAAA;AAGD,IAAA,IAAI,QAAQ,IAAA,EAAM;AAChB,MAAA,IAAA,CAAK,MAAA,CAAO,GAAA;AAAA,QACV,CAAA,gCAAA,EAAmC,QAAQ,IAAA,CAAK,IAAI,KAAK,OAAA,CAAQ,IAAA,CAAK,KAAK,CAAC,CAAA;AAAA,OAC9E;AACA,MAAA,OAAO;AAAA,QACL,QAAQ,OAAA,CAAQ,IAAA,CAAK,IAAI,CAAA,IAAK,OAAA,CAAQ,KAAK,KAAK,CAAA;AAAA,QAChD,KAAA,EAAO,OAAA,CAAQ,IAAA,CAAK,OAAO,CAAA;AAAA,QAC3B,WAAA,EAAa,OAAA,CAAQ,IAAA,CAAK,aAAa,CAAA;AAAA,QACvC,SAAA,EAAW,OAAA,CAAQ,IAAA,CAAK,WAAW;AAAA,OACrC;AAAA,IACF;AAGA,IAAA,MAAM,eAAA,GAAkB,QAAQ,IAAA,EAAM,eAAA;AACtC,IAAA,IACE,eAAA,IACA,eAAA,CAAgB,MAAA,IAChB,eAAA,CAAgB,aAAA,EAChB;AACA,MAAA,IAAA,CAAK,MAAA,CAAO,GAAA;AAAA,QACV,CAAA,iCAAA,EAAoC,gBAAgB,MAAM,CAAA;AAAA,OAC5D;AACA,MAAA,OAAO;AAAA,QACL,QAAQ,eAAA,CAAgB,MAAA;AAAA,QACxB,KAAA,EAAO,eAAA,CAAgB,KAAA,IAAS,EAAC;AAAA,QACjC,WAAA,EAAa,eAAA,CAAgB,WAAA,IAAe,EAAC;AAAA,QAC7C,WAAW,eAAA,CAAgB;AAAA,OAC7B;AAAA,IACF;AAEA,IAAA,IAAA,CAAK,MAAA,CAAO,KAAK,CAAA,2CAAA,CAA6C,CAAA;AAC9D,IAAA,OAAO,MAAA;AAAA,EACT;AACF;AAzEaD,0BAAA,GAAN,eAAA,CAAA;AAAA,EADN5C,iBAAAA;AAAW,CAAA,EACC4C,0BAAA,CAAA;ACXAE,6BAAN,wBAAA,CAAyB;AAAA,EAC9B,YAA6B,eAAA,EAA2C;AAA3C,IAAA,IAAA,CAAA,eAAA,GAAA,eAAA;AAAA,EAA4C;AAAA,EAMzE,MAAM,eAAsB,GAAA,EAAsB;AAChD,IAAA,OAAO,KAAK,eAAA,CAAgB,MAAA,CAAO,GAAA,CAAI,cAAA,EAAgB,IAAI,IAAI,CAAA;AAAA,EACjE;AACF;AAHQ,eAAA,CAAA;AAAA,EAJLtC,YAAK,UAAU,CAAA;AAAA,EACfuC,iBAAUH,0BAAkB,CAAA;AAAA,EAC5BnC,oBAAA,CAAa,EAAE,OAAA,EAAS,2BAAA,EAA6B,CAAA;AAAA,EACrDC,oBAAY,EAAE,MAAA,EAAQ,GAAA,EAAK,WAAA,EAAa,qBAAqB,CAAA;AAAA,EACxC,eAAA,CAAA,CAAA,EAAAsC,UAAA,EAAI;AAAA,CAAA,EAPfF,0BAAA,CAOL,SAAA,EAAA,gBAAA,EAAA,CAAA,CAAA;AAPKA,0BAAA,GAAN,eAAA,CAAA;AAAA,EAFNjC,gBAAQ,WAAW,CAAA;AAAA,EACnBC,iBAAA;AAAW,CAAA,EACCgC,0BAAA,CAAA;;;ACIb,aAAA,EAAA;AAyDO,IAAe,qBAAA,GAAf,MAAe,qBAAA,CAAgD;AAAA,EAM1D,MAAA,GAAS,IAAI/C,aAAAA,CAAO,qBAAA,CAAqB,IAAI,CAAA;AAAA,EAG7C,gBAAA;AAAA,EAGA,gBAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAMV,IAAI,SAAA,GAAoB;AAEtB,IAAA,IAAI,IAAA,CAAK,QAAA,EAAU,WAAA,IAAe,IAAA,CAAK,UAAU,IAAA,EAAM;AACrD,MAAA,OAAO,CAAA,EAAG,IAAA,CAAK,QAAA,CAAS,WAAW,CAAA,CAAA,EAAI,KAAK,QAAA,CAAS,IAAI,CAAA,EAAA,EAAK,IAAA,CAAK,OAAO,CAAA,CAAA;AAAA,IAC5E;AAGA,IAAA,OAAO,CAAA,SAAA,EAAY,KAAK,OAAO,CAAA,CAAA;AAAA,EACjC;AAAA;AAAA;AAAA;AAAA,EAKU,YAAA,GAA4BkD,gBAAA,CAAA,IAAA;AAAA,IACpC,QAAQ,GAAA,EAAI;AAAA,IACZ;AAAA,GACF;AAAA;AAAA;AAAA;AAAA,EAKU,QAAA;AAAA,EAEV,WAAA,GAAc;AAEZ,IAAA,IAAI;AACF,MAAA,IAAA,CAAK,gBAAA,EAAiB;AACtB,MAAA,IAAI,KAAK,QAAA,EAAU;AACjB,QAAA,IAAA,CAAK,MAAA,CAAO,KAAA;AAAA,UACV,CAAA,oBAAA,EAAuB,IAAA,CAAK,QAAA,CAAS,WAAW,CAAA,CAAA,EAAI,IAAA,CAAK,QAAA,CAAS,IAAI,CAAA,EAAA,EAAK,IAAA,CAAK,WAAA,CAAY,IAAI,CAAA,CAAA;AAAA,SAClG;AAAA,MACF;AAAA,IACF,SAAS,KAAA,EAAO;AACd,MAAA,IAAA,CAAK,MAAA,CAAO,IAAA;AAAA,QACV,CAAA,wCAAA,EAA2C,MAAM,OAAO,CAAA;AAAA,OAC1D;AAAA,IACF;AAGA,IAAA,YAAA,CAAa,MAAM;AACjB,MAAA,IAAA,CAAK,MAAA,CAAO,KAAA;AAAA,QACV,CAAA,gDAAA,EAAmD,IAAA,CAAK,WAAA,CAAY,IAAI,CAAA;AAAA,OAC1E;AAEA,MAAA,IAAA,CAAK,iBAAA,EAAkB,CAAE,KAAA,CAAM,CAAA,KAAA,KAAS;AACtC,QAAA,IAAA,CAAK,MAAA,CAAO,KAAA;AAAA,UACV,CAAA,6CAAA,EAAgD,MAAM,OAAO,CAAA;AAAA,SAC/D;AAAA,MACF,CAAC,CAAA;AAED,MAAA,IAAA,CAAK,iBAAA,EAAkB,CAAE,KAAA,CAAM,CAAA,KAAA,KAAS;AACtC,QAAA,IAAA,CAAK,MAAA,CAAO,KAAA;AAAA,UACV,CAAA,6CAAA,EAAgD,MAAM,OAAO,CAAA;AAAA,SAC/D;AAAA,MACF,CAAC,CAAA;AAAA,IACH,CAAC,CAAA;AAAA,EACH;AAAA;AAAA;AAAA;AAAA;AAAA,EAWU,mBAAmB,OAAA,EAM3B;AACA,IAAA,OAAO;AAAA,MACL,WAAY,OAAA,CAAgB,SAAA;AAAA,MAC5B,UAAU,OAAA,CAAQ,QAAA;AAAA,MAClB,QAAQ,OAAA,CAAQ,MAAA;AAAA,MAChB,SAAS,OAAA,CAAQ,OAAA;AAAA,MACjB,WAAY,OAAA,CAAgB;AAAA,KAC9B;AAAA,EACF;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOA,MAAM,cAAc,OAAA,EAA6C;AAC/D,IAAA,MAAM,OAAA,GAAU,IAAA,CAAK,kBAAA,CAAmB,OAAO,CAAA;AAE/C,IAAA,OAAO;AAAA,MACL,YAAA,EAAc;AAAA,QACZ,WAAW,OAAA,CAAQ,QAAA;AAAA,QACnB,OAAA;AAAA;AAAA,QAEA,QAAA,EAAU;AAAA,UACR,QAAQ,OAAA,CAAQ,MAAA;AAAA,UAChB,SAAS,OAAA,CAAQ,OAAA;AAAA,UACjB,WAAW,OAAA,CAAQ,SAAA;AAAA,UACnB,WAAW,IAAA,CAAK,SAAA;AAAA,UAChB,SAAS,IAAA,CAAK;AAAA;AAChB;AACF,KACF;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKA,MAAgB,YAAA,GAA+C;AAC7D,IAAA,IAAI,CAAC,KAAK,YAAA,EAAc;AACtB,MAAA,OAAO,IAAA;AAAA,IACT;AAEA,IAAA,IAAI;AACF,MAAA,MAAM/B,GAAAA,GAAK,MAAM,OAAO,aAAa,CAAA;AACrC,MAAA,MAAM+B,KAAAA,GAAO,MAAM,OAAO,MAAM,CAAA;AAEhC,MAAA,MAAM,gBAAA,GAAmBA,KAAAA,CAAK,OAAA,CAAQ,IAAA,CAAK,YAAY,CAAA;AACvD,MAAA,MAAM,eAAA,GAAkB,MAAM/B,GAAAA,CAAG,QAAA,CAAS,kBAAkB,OAAO,CAAA;AACnE,MAAA,MAAM,QAAA,GAAW,IAAA,CAAK,KAAA,CAAM,eAAe,CAAA;AAK3C,MAAA,IAAA,CAAK,QAAA,GAAW,QAAA;AAChB,MAAA,OAAO,QAAA;AAAA,IACT,SAAS,KAAA,EAAO;AACd,MAAA,OAAA,CAAQ,KAAA;AAAA,QACN,CAAA,6BAAA,EAAgC,IAAA,CAAK,YAAY,CAAA,EAAA,EAAK,KAAA,YAAiB,QAAQ,KAAA,CAAM,OAAA,GAAU,MAAA,CAAO,KAAK,CAAC,CAAA;AAAA,OAC9G;AACA,MAAA,OAAO,IAAA;AAAA,IACT;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKU,gBAAA,GAA0C;AAClD,IAAA,IAAI,CAAC,KAAK,YAAA,EAAc;AACtB,MAAA,OAAO,IAAA;AAAA,IACT;AAEA,IAAA,IAAI;AACF,MAAA,MAAMA,GAAAA,GAAK,UAAQ,IAAI,CAAA;AACvB,MAAA,MAAM+B,KAAAA,GAAO,UAAQ,MAAM,CAAA;AAE3B,MAAA,MAAM,gBAAA,GAAmBA,KAAAA,CAAK,OAAA,CAAQ,IAAA,CAAK,YAAY,CAAA;AACvD,MAAA,MAAM,eAAA,GAAkB/B,GAAAA,CAAG,YAAA,CAAa,gBAAA,EAAkB,OAAO,CAAA;AACjE,MAAA,MAAM,QAAA,GAAW,IAAA,CAAK,KAAA,CAAM,eAAe,CAAA;AAK3C,MAAA,IAAA,CAAK,QAAA,GAAW,QAAA;AAChB,MAAA,OAAO,QAAA;AAAA,IACT,SAAS,KAAA,EAAO;AACd,MAAA,OAAA,CAAQ,KAAA;AAAA,QACN,CAAA,6BAAA,EAAgC,IAAA,CAAK,YAAY,CAAA,EAAA,EAAK,KAAA,YAAiB,QAAQ,KAAA,CAAM,OAAA,GAAU,MAAA,CAAO,KAAK,CAAC,CAAA;AAAA,OAC9G;AACA,MAAA,OAAO,IAAA;AAAA,IACT;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKU,iBAAiB,QAAA,EAAgC;AAAA,EAI3D;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,gBAAA,GAAmD;AACvD,IAAA,IAAI,KAAK,QAAA,EAAU;AACjB,MAAA,OAAO,IAAA,CAAK,QAAA;AAAA,IACd;AAEA,IAAA,OAAO,MAAM,KAAK,YAAA,EAAa;AAAA,EACjC;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,gBAAA,GAAmB;AACvB,IAAA,MAAM,QAAA,GAAW,MAAM,IAAA,CAAK,YAAA,EAAa;AACzC,IAAA,IAAI,CAAC,QAAA,EAAU;AACb,MAAA,MAAM,IAAI,KAAA,CAAM,CAAA,sBAAA,EAAyB,IAAA,CAAK,YAAY,CAAA,CAAE,CAAA;AAAA,IAC9D;AAEA,IAAA,MAAM,aAAA,GAAgB,QAAA,CAAS,QAAA,CAAS,IAAA,CAAK,OAAO,CAAA;AACpD,IAAA,IAAI,CAAC,aAAA,EAAe;AAClB,MAAA,MAAM,IAAI,KAAA,CAAM,CAAA,QAAA,EAAW,IAAA,CAAK,OAAO,CAAA,sBAAA,CAAwB,CAAA;AAAA,IACjE;AAGA,IAAA,IAAI,YAAA,GAAe,IAAA;AACnB,IAAA,IAAI,cAAc,gBAAA,EAAkB;AAClC,MAAA,IAAI;AACF,QAAA,MAAMA,GAAAA,GAAK,MAAM,OAAO,aAAa,CAAA;AACrC,QAAA,MAAM,UAAA,GAAkB+B,gBAAA,CAAA,OAAA;AAAA,UACtB,QAAQ,GAAA,EAAI;AAAA,UACZ,aAAA,CAAc;AAAA,SAChB;AACA,QAAA,MAAM,aAAA,GAAgB,MAAM/B,GAAAA,CAAG,QAAA,CAAS,YAAY,OAAO,CAAA;AAC3D,QAAA,MAAM,UAAA,GAAa,IAAA,CAAK,KAAA,CAAM,aAAa,CAAA;AAC3C,QAAA,YAAA,GAAe,UAAA,CAAW,MAAA;AAAA,MAC5B,SAAS,KAAA,EAAO;AACd,QAAA,IAAA,CAAK,MAAA,CAAO,IAAA,CAAK,CAAA,8BAAA,EAAiC,KAAA,CAAM,OAAO,CAAA,CAAE,CAAA;AAAA,MACnE;AAAA,IACF;AAEA,IAAA,OAAO;AAAA;AAAA,MAEL,aAAa,QAAA,CAAS,WAAA;AAAA,MACtB,MAAM,QAAA,CAAS,IAAA;AAAA,MACf,OAAO,QAAA,CAAS,KAAA;AAAA,MAChB,aAAa,QAAA,CAAS,WAAA;AAAA,MACtB,qBAAqB,QAAA,CAAS,mBAAA;AAAA,MAC9B,UAAU,QAAA,CAAS,QAAA;AAAA,MACnB,MAAM,QAAA,CAAS,IAAA;AAAA;AAAA,MAGf,IAAI,QAAA,CAAS,EAAA;AAAA;AAAA,MAGb,GAAG,aAAA;AAAA;AAAA,MAGH,YAAA;AAAA;AAAA,MAGA,WAAW,IAAA,CAAK,SAAA;AAAA,MAChB,SAAS,IAAA,CAAK;AAAA,KAChB;AAAA,EACF;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,iBAAiB,aAAA,EAA+B;AAC9C,IAAA,IAAI,CAAC,aAAA,EAAe;AAClB,MAAA,MAAM,IAAI,MAAM,gDAAgD,CAAA;AAAA,IAClE;AAEA,IAAA,OAAO,CAAA,EAAG,aAAa,CAAA,EAAA,EAAK,IAAA,CAAK,OAAO,CAAA,CAAA;AAAA,EAC1C;AAAA;AAAA;AAAA;AAAA,EAKA,eAAA,GAA2B;AACzB,IAAA,MAAM,YAAA,GAAe,iBAAA;AACrB,IAAA,IAAI,CAAC,YAAA,CAAa,IAAA,CAAK,IAAA,CAAK,OAAO,CAAA,EAAG;AACpC,MAAA,MAAM,IAAI,KAAA;AAAA,QACR,CAAA,wBAAA,EAA2B,KAAK,OAAO,CAAA,wBAAA;AAAA,OACzC;AAAA,IACF;AACA,IAAA,OAAO,IAAA;AAAA,EACT;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,MAAgB,iBAAA,GAAmC;AACjD,IAAA,IAAA,CAAK,OAAO,GAAA,CAAI,CAAA,2BAAA,EAA8B,CAAC,CAAC,IAAA,CAAK,gBAAgB,CAAA,CAAE,CAAA;AAEvE,IAAA,IAAI,CAAC,KAAK,gBAAA,EAAkB;AAC1B,MAAA,IAAA,CAAK,MAAA,CAAO,KAAA;AAAA,QACV;AAAA,OACF;AACA,MAAA;AAAA,IACF;AAEA,IAAA,IAAI;AAEF,MAAA,MAAM,EAAE,mBAAA,EAAAgC,oBAAAA,EAAoB,GAAI,MAAM,OAAA,CAAA,OAAA,EAAA,CAAA,IAAA,CAAA,OAAA,wBAAA,EAAA,EAAA,2BAAA,CAAA,CAAA;AAKtC,MAAA,MAAM,gBAAA,GAAmBA,oBAAAA,CAAoB,IAAA,CAAK,WAAW,CAAA;AAE7D,MAAA,IAAA,CAAK,MAAA,CAAO,GAAA;AAAA,QACV,SAAS,gBAAA,EAAkB,MAAA,IAAU,CAAC,CAAA,eAAA,EAAkB,IAAA,CAAK,YAAY,IAAI,CAAA;AAAA,OAC/E;AACA,MAAA,IAAA,CAAK,MAAA,CAAO,GAAA;AAAA,QACV,CAAA,kBAAA,CAAA;AAAA,QACA,IAAA,CAAK,SAAA,CAAU,gBAAA,EAAkB,IAAA,EAAM,CAAC;AAAA,OAC1C;AAEA,MAAA,IAAI,CAAC,gBAAA,IAAoB,gBAAA,CAAiB,MAAA,KAAW,CAAA,EAAG;AACtD,QAAA,IAAA,CAAK,MAAA,CAAO,IAAA;AAAA,UACV,CAAA,uBAAA,EAA0B,IAAA,CAAK,WAAA,CAAY,IAAI,CAAA,iCAAA;AAAA,SACjD;AACA,QAAA;AAAA,MACF;AAGA,MAAA,MAAM,gBAAgB,IAAA,CAAK,SAAA;AAG3B,MAAA,KAAA,MAAW,EAAE,OAAA,EAAS,MAAA,EAAO,IAAK,gBAAA,EAAkB;AAClD,QAAA,MAAM,cAAA,GAAkB,KAAa,MAAM,CAAA;AAC3C,QAAA,IAAI,OAAO,mBAAmB,UAAA,EAAY;AAExC,UAAA,MAAM,aAAA,GAAiC,OAAM,OAAA,KAAW;AACtD,YAAA,OAAO,cAAA,CAAe,IAAA,CAAK,IAAA,EAAM,OAAO,CAAA;AAAA,UAC1C,CAAA;AAGA,UAAA,IAAA,CAAK,gBAAA,CAAiB,QAAA,CAAS,OAAA,EAAS,aAAA,EAAe,aAAa,CAAA;AAEpE,UAAA,IAAA,CAAK,MAAA,CAAO,GAAA;AAAA,YACV,CAAA,qBAAA,EAAwB,OAAO,CAAA,kBAAA,EAAqB,aAAa,CAAA,CAAA;AAAA,WACnE;AAAA,QACF;AAAA,MACF;AAEA,MAAA,IAAA,CAAK,MAAA,CAAO,GAAA;AAAA,QACV,cAAc,gBAAA,CAAiB,MAAM,CAAA,eAAA,EAAkB,IAAA,CAAK,YAAY,IAAI,CAAA;AAAA,OAC9E;AAAA,IACF,SAAS,KAAA,EAAO;AACd,MAAA,IAAA,CAAK,MAAA,CAAO,KAAA;AAAA,QACV,iCAAiC,KAAA,YAAiB,KAAA,GAAQ,MAAM,OAAA,GAAU,MAAA,CAAO,KAAK,CAAC,CAAA;AAAA,OACzF;AAAA,IACF;AAAA,EACF;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,MAAgB,iBAAA,GAAmC;AACjD,IAAA,IAAA,CAAK,OAAO,GAAA,CAAI,CAAA,2BAAA,EAA8B,CAAC,CAAC,IAAA,CAAK,gBAAgB,CAAA,CAAE,CAAA;AAEvE,IAAA,IAAI,CAAC,KAAK,gBAAA,EAAkB;AAC1B,MAAA,IAAA,CAAK,MAAA,CAAO,KAAA;AAAA,QACV;AAAA,OACF;AACA,MAAA;AAAA,IACF;AAEA,IAAA,IAAI;AAEF,MAAA,MAAM,EAAE,mBAAA,EAAAC,oBAAAA,EAAqB,yBAAA,EAAAC,0BAAAA,KAA8B,MAAM,OAAA,CAAA,OAAA,EAAA,CAAA,IAAA,CAAA,OAAA,aAAA,EAAA,EAAA,gBAAA,CAAA,CAAA;AAKjE,MAAA,MAAM,gBAAA,GAAmBD,oBAAAA,CAAoB,IAAA,CAAK,WAAW,CAAA;AAE7D,MAAA,IAAI,CAAC,gBAAA,IAAoB,gBAAA,CAAiB,MAAA,KAAW,CAAA,EAAG;AAEtD,QAAA;AAAA,MACF;AAEA,MAAA,IAAA,CAAK,MAAA,CAAO,GAAA;AAAA,QACV,SAAS,gBAAA,CAAiB,MAAM,CAAA,eAAA,EAAkB,IAAA,CAAK,YAAY,IAAI,CAAA;AAAA,OACzE;AACA,MAAA,IAAA,CAAK,MAAA,CAAO,KAAA;AAAA,QACV,CAAA,kBAAA,CAAA;AAAA,QACA,IAAA,CAAK,SAAA,CAAU,gBAAA,EAAkB,IAAA,EAAM,CAAC;AAAA,OAC1C;AAGA,MAAA,MAAM,gBAAgB,IAAA,CAAK,SAAA;AAG3B,MAAA,MAAM,mBAAA,GAAsBC,0BAAAA;AAAA,QAC1B,IAAA;AAAA,QACA;AAAA,OACF;AAEA,MAAA,KAAA,MAAW,cAAc,mBAAA,EAAqB;AAC5C,QAAA,IAAA,CAAK,gBAAA,CAAiB,QAAA,CAAS,aAAA,EAAe,UAAU,CAAA;AAExD,QAAA,IAAA,CAAK,MAAA,CAAO,GAAA;AAAA,UACV,CAAA,qBAAA,EAAwB,UAAA,CAAW,IAAI,CAAA,kBAAA,EAAqB,aAAa,CAAA,CAAA;AAAA,SAC3E;AAAA,MACF;AAEA,MAAA,IAAA,CAAK,MAAA,CAAO,GAAA;AAAA,QACV,cAAc,mBAAA,CAAoB,MAAM,CAAA,eAAA,EAAkB,IAAA,CAAK,YAAY,IAAI,CAAA;AAAA,OACjF;AAAA,IACF,SAAS,KAAA,EAAO;AACd,MAAA,IAAA,CAAK,MAAA,CAAO,KAAA;AAAA,QACV,iCAAiC,KAAA,YAAiB,KAAA,GAAQ,MAAM,OAAA,GAAU,MAAA,CAAO,KAAK,CAAC,CAAA;AAAA,OACzF;AAAA,IACF;AAAA,EACF;AAAA;AAAA;AAAA;AAAA;AAAA,EAMU,0BACR,SAAA,EACM;AACN,IAAA,IAAI,CAAC,KAAK,gBAAA,EAAkB;AAC1B,MAAA,IAAA,CAAK,MAAA,CAAO,MAAM,gCAAgC,CAAA;AAClD,MAAA;AAAA,IACF;AAEA,IAAA,MAAM,gBAAgB,IAAA,CAAK,SAAA;AAC3B,IAAA,KAAA,MAAW,YAAY,SAAA,EAAW;AAChC,MAAA,IAAA,CAAK,gBAAA,CAAiB,QAAA,CAAS,aAAA,EAAe,QAAQ,CAAA;AACtD,MAAA,IAAA,CAAK,MAAA,CAAO,GAAA;AAAA,QACV,CAAA,8BAAA,EAAiC,QAAA,CAAS,IAAI,CAAA,kBAAA,EAAqB,aAAa,CAAA,CAAA;AAAA,OAClF;AAAA,IACF;AAAA,EACF;AACF,CAAA;AA3aY,eAAA,CAAA;AAAA,EADTC,cAAO,gBAAgB;AAAA,CAAA,EARJ,qBAAA,CASV,SAAA,EAAA,kBAAA,EAAA,CAAA,CAAA;AAGA,eAAA,CAAA;AAAA,EADTA,cAAOvD,wBAAgB;AAAA,CAAA,EAXJ,qBAAA,CAYV,SAAA,EAAA,kBAAA,EAAA,CAAA,CAAA;AAZL,IAAe,oBAAA,GAAf;AAucMwD,gCAAN,2BAAA,CAAqD;AAAA,EAG1D,WAAA,CACqB,aAAA,EAEF,QAAA,EAEA,MAAA,EAEA,gBAAA,EACjB;AAPmB,IAAA,IAAA,CAAA,aAAA,GAAA,aAAA;AAEF,IAAA,IAAA,CAAA,QAAA,GAAA,QAAA;AAEA,IAAA,IAAA,CAAA,MAAA,GAAA,MAAA;AAEA,IAAA,IAAA,CAAA,gBAAA,GAAA,gBAAA;AAEjB,IAAA,IAAA,CAAK,MAAA,CAAO,IAAI,mCAAmC,CAAA;AACnD,IAAA,IAAI,CAAC,KAAK,MAAA,EAAQ;AAChB,MAAA,IAAA,CAAK,MAAA,CAAO,MAAM,wCAAwC,CAAA;AAAA,IAC5D;AAAA,EACF;AAAA,EAfS,MAAA,GAAS,IAAIvD,aAAAA,CAAOuD,6BAAA,CAAsB,IAAI,CAAA;AAAA;AAAA;AAAA;AAAA,EAoBvD,MAAM,sBAAA,GAA4C;AAEhD,IAAA,OAAO,IAAA,CAAK,QAAA,CAAS,GAAA,CAAI,CAAA,OAAA,KAAW;AAElC,MAAA,OAAO,OAAA,CAAQ,SAAA;AAAA,IACjB,CAAC,CAAA;AAAA,EACH;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,eACJ,OAAA,EACgC;AAChC,IAAA,MAAM,OAAA,GAAU,IAAA,CAAK,iBAAA,CAAkB,OAAA,CAAQ,SAAS,CAAA;AAGxD,IAAA,MAAM,KAAA,GAAQ,MAAM,OAAA,CAAQ,UAAA,CAAW,OAAO,CAAA;AAG9C,IAAA,MAAM,MAAA,GAAS,MAAM,OAAA,CAAQ,aAAA,CAAc,OAAO,CAAA;AAGlD,IAAA,MAAM,eAAA,GAAkB,IAAI,eAAA,EAAgB;AAC5C,IAAA,IAAA,CAAK,wBAAA,CAAyB,OAAA,CAAQ,SAAA,EAAW,MAAM;AACrD,MAAA,eAAA,CAAgB,KAAA,EAAM;AAAA,IACxB,CAAC,CAAA;AAED,IAAA,IAAI;AAEF,MAAA,MAAM,MAAA,GAAS,MAAM,IAAA,CAAK,MAAA,CAAO,WAAA;AAAA,QAC/B,KAAA;AAAA,QACA,MAAA;AAAA,QACA,eAAA,CAAgB;AAAA,OAClB;AAGA,MAAA,OAAO;AAAA,QACL,WAAW,OAAA,CAAQ,SAAA;AAAA,QACnB,IAAA,EAAM,OAAO,IAAA,IAAQ,EAAA;AAAA,QACrB,WAAA,EAAa,MAAA,CAAO,WAAA,IAAe,EAAC;AAAA,QACpC,QAAA,EAAU,MAAA,CAAO,QAAA,IAAY,EAAC;AAAA,QAC9B,eAAA,EAAiB,MAAA,CAAO,eAAA,IAAmB;AAAC;AAAA,OAC9C;AAAA,IACF,CAAA,SAAE;AACA,MAAA,IAAA,CAAK,0BAAA,CAA2B,QAAQ,SAAS,CAAA;AAAA,IACnD;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,YAAA,CAAa,OAAA,EAAS,SAAA,EAAW;AACrC,IAAA,IAAA,CAAK,MAAA,CAAO,KAAA;AAAA,MACV,CAAA,0CAAA,EAA6C,QAAQ,SAAS,CAAA;AAAA,KAChE;AACA,IAAA,MAAM,eAAA,GAAkB,IAAI,eAAA,EAAgB;AAE5C,IAAA,IAAI;AAEF,MAAA,MAAM,OAAA,GAAU,IAAA,CAAK,iBAAA,CAAkB,OAAA,CAAQ,SAAS,CAAA;AACxD,MAAA,IAAA,CAAK,MAAA,CAAO,KAAA,CAAM,CAAA,4BAAA,EAA+B,OAAA,CAAQ,SAAS,CAAA,CAAE,CAAA;AAGpE,MAAA,MAAM,KAAA,GAAQ,MAAM,OAAA,CAAQ,UAAA,CAAW,OAAO,CAAA;AAC9C,MAAA,IAAA,CAAK,MAAA,CAAO,KAAA,CAAM,CAAA,2BAAA,EAA8B,OAAA,CAAQ,SAAS,CAAA,CAAE,CAAA;AAGnE,MAAA,IAAA,CAAK,MAAA,CAAO,KAAA,CAAM,CAAA,gCAAA,EAAmC,OAAA,CAAQ,SAAS,CAAA,CAAE,CAAA;AACxE,MAAA,MAAM,MAAA,GAAS,MAAM,OAAA,CAAQ,aAAA,CAAc,OAAO,CAAA;AAClD,MAAA,IAAA,CAAK,MAAA,CAAO,MAAM,CAAA,eAAA,CAAiB,CAAA;AAGnC,MAAA,IAAA,CAAK,wBAAA,CAAyB,OAAA,CAAQ,SAAA,EAAW,MAAM;AACrD,QAAA,eAAA,CAAgB,KAAA,EAAM;AAAA,MACxB,CAAC,CAAA;AACD,MAAA,IAAA,CAAK,MAAA,CAAO,KAAA,CAAM,CAAA,8BAAA,EAAiC,OAAA,CAAQ,SAAS,CAAA,CAAE,CAAA;AAEtE,MAAA,IAAA,CAAK,MAAA,CAAO,KAAA;AAAA,QACV,CAAA,0CAAA,EAA6C,QAAQ,SAAS,CAAA;AAAA,OAChE;AACA,MAAA,MAAM,MAAA,GAAS,MAAM,IAAA,CAAK,MAAA,CAAO,WAAA;AAAA,QAC/B,KAAA;AAAA,QACA,MAAA;AAAA,QACA,SAAA;AAAA,QACA,eAAA,CAAgB;AAAA,OAClB;AAEA,MAAA,IAAA,CAAK,MAAA,CAAO,MAAM,CAAA,gCAAA,CAAA,EAAoC;AAAA,QACpD,OAAA,EAAS,CAAC,CAAC,MAAA,CAAO,IAAA;AAAA,QAClB,UAAA,EAAY,MAAA,CAAO,IAAA,EAAM,MAAA,IAAU,CAAA;AAAA,QACnC,gBAAA,EAAkB,MAAA,CAAO,WAAA,EAAa,MAAA,IAAU,CAAA;AAAA,QAChD,oBAAA,EAAsB,MAAA,CAAO,eAAA,EAAiB,MAAA,IAAU,CAAA;AAAA,QACxD,UAAA,EAAY,MAAA,CAAO,IAAA,CAAK,MAAA,IAAU,EAAE;AAAA,OACrC,CAAA;AAGD,MAAA,OAAO;AAAA,QACL,WAAW,OAAA,CAAQ,SAAA;AAAA,QACnB,IAAA,EAAM,OAAO,IAAA,IAAQ,EAAA;AAAA,QACrB,WAAA,EAAa,MAAA,CAAO,WAAA,IAAe,EAAC;AAAA,QACpC,QAAA,EAAU,MAAA,CAAO,QAAA,IAAY,EAAC;AAAA,QAC9B,eAAA,EAAiB,MAAA,CAAO,eAAA,IAAmB;AAAC;AAAA,OAC9C;AAAA,IACF,SAAS,KAAA,EAAO;AACd,MAAA,IAAA,CAAK,MAAA,CAAO,KAAA,CAAM,CAAA,uBAAA,EAA0B,KAAA,CAAM,OAAO,CAAA,CAAE,CAAA;AAC3D,MAAA,IAAA,CAAK,MAAA,CAAO,KAAA,CAAM,CAAA,aAAA,EAAgB,KAAA,CAAM,KAAK,CAAA,CAAE,CAAA;AAC/C,MAAA,MAAM,KAAA;AAAA,IACR,CAAA,SAAE;AACA,MAAA,eAAA,CAAgB,KAAA,EAAM;AACtB,MAAA,IAAA,CAAK,0BAAA,CAA2B,QAAQ,SAAS,CAAA;AAAA,IACnD;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,WAAA,GAAgC;AACpC,IAAA,IAAI;AAEF,MAAA,IAAI,IAAA,CAAK,QAAA,CAAS,MAAA,KAAW,CAAA,EAAG;AAC9B,QAAA,IAAA,CAAK,MAAA,CAAO,KAAK,wBAAwB,CAAA;AACzC,QAAA,OAAO,KAAA;AAAA,MACT;AAEA,MAAA,OAAO,IAAA;AAAA,IACT,SAAS,KAAA,EAAO;AACd,MAAA,IAAA,CAAK,MAAA,CAAO,KAAA,CAAM,CAAA,qBAAA,EAAwB,KAAA,CAAM,OAAO,CAAA,CAAE,CAAA;AACzD,MAAA,OAAO,KAAA;AAAA,IACT;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,iBAAiB,SAAA,EAAkC;AACvD,IAAA,MAAM,UAAA,GAAa,IAAA,CAAK,iBAAA,CAAkB,GAAA,CAAI,SAAS,CAAA;AAEvD,IAAA,IAAI,UAAA,EAAY;AACd,MAAA,UAAA,CAAW,MAAA,EAAO;AAClB,MAAA,IAAA,CAAK,iBAAA,CAAkB,OAAO,SAAS,CAAA;AACvC,MAAA,IAAA,CAAK,MAAA,CAAO,GAAA,CAAI,CAAA,kCAAA,EAAqC,SAAS,CAAA,CAAE,CAAA;AAAA,IAClE,CAAA,MAAO;AACL,MAAA,IAAA,CAAK,MAAA,CAAO,IAAA,CAAK,CAAA,wCAAA,EAA2C,SAAS,CAAA,CAAE,CAAA;AAAA,IACzE;AAAA,EACF;AAAA;AAAA,EAGiB,iBAAA,uBAAwB,GAAA,EAGvC;AAAA;AAAA;AAAA;AAAA,EAKM,wBAAA,CACN,WACA,MAAA,EACM;AACN,IAAA,IAAA,CAAK,iBAAA,CAAkB,GAAA,CAAI,SAAA,EAAW,EAAE,QAAQ,CAAA;AAGhD,IAAA,UAAA;AAAA,MACE,MAAM;AACJ,QAAA,IAAI,IAAA,CAAK,iBAAA,CAAkB,GAAA,CAAI,SAAS,CAAA,EAAG;AACzC,UAAA,IAAA,CAAK,iBAAA,CAAkB,OAAO,SAAS,CAAA;AACvC,UAAA,IAAA,CAAK,MAAA,CAAO,KAAA;AAAA,YACV,wCAAwC,SAAS,CAAA;AAAA,WACnD;AAAA,QACF;AAAA,MACF,CAAA;AAAA,MACA,KAAK,EAAA,GAAK;AAAA,KACZ;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKQ,2BAA2B,SAAA,EAAyB;AAC1D,IAAA,IAAA,CAAK,iBAAA,CAAkB,OAAO,SAAS,CAAA;AAAA,EACzC;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,eAAA,CACJ,KAAA,EACA,QAAA,EACA,eAAA,EACyB;AACzB,IAAA,IAAA,CAAK,MAAA,CAAO,KAAA,CAAM,CAAA,+BAAA,EAAkC,KAAK,CAAA,CAAE,CAAA;AAE3D,IAAA,IAAI;AAEF,MAAA,MAAM,MAAA,GAAS,MAAM,IAAA,CAAK,6BAAA;AAAA,QACxB,KAAA;AAAA,QACA,QAAA;AAAA,QACA;AAAA,OACF;AAEA,MAAA,IAAI,MAAA,EAAQ;AACV,QAAA,OAAO,MAAA;AAAA,MACT;AAKA,MAAA,OAAO;AAAA,QACL,OAAA,EAAS,KAAA;AAAA,QACT,KAAA,EAAO;AAAA,OACT;AAAA,IACF,SAAS,KAAA,EAAO;AACd,MAAA,IAAA,CAAK,MAAA,CAAO,KAAA;AAAA,QACV,6BAA6B,KAAA,YAAiB,KAAA,GAAQ,MAAM,OAAA,GAAU,MAAA,CAAO,KAAK,CAAC,CAAA;AAAA,OACrF;AACA,MAAA,OAAO;AAAA,QACL,OAAA,EAAS,KAAA;AAAA,QACT,KAAA,EAAO,KAAA,YAAiB,KAAA,GAAQ,KAAA,CAAM,OAAA,GAAU;AAAA,OAClD;AAAA,IACF;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKA,MAAc,6BAAA,CACZ,KAAA,EACA,QAAA,EACA,eAAA,EACgC;AAEhC,IAAA,MAAM,EAAE,mBAAA,EAAAJ,oBAAAA,EAAqB,kBAAA,EAAAK,mBAAAA,KAAuB,MAAM,OAAA,CAAA,OAAA,EAAA,CAAA,IAAA,CAAA,OAAA,wBAAA,EAAA,EAAA,2BAAA,CAAA,CAAA;AAK1D,IAAA,MAAM,EAAE,SAAA,EAAW,OAAA,EAAQ,GAAI,IAAA,CAAK,mBAAmB,KAAK,CAAA;AAG5D,IAAA,MAAM,UAAU,IAAA,CAAK,QAAA,CAAS,KAAK,CAAA,CAAA,KAAK,CAAA,CAAE,cAAc,SAAS,CAAA;AACjE,IAAA,IAAI,CAAC,OAAA,EAAS;AACZ,MAAA,IAAA,CAAK,MAAA,CAAO,IAAA,CAAK,CAAA,iCAAA,EAAoC,SAAS,CAAA,CAAE,CAAA;AAChE,MAAA,OAAO,IAAA;AAAA,IACT;AAGA,IAAA,MAAM,UAAA,GAAaA,mBAAAA,CAAmB,OAAA,CAAQ,WAAA,EAAa,OAAO,CAAA;AAClE,IAAA,IAAI,CAAC,UAAA,IAAc,OAAQ,OAAA,CAAgB,UAAU,MAAM,UAAA,EAAY;AACrE,MAAA,IAAA,CAAK,MAAA,CAAO,IAAA;AAAA,QACV,CAAA,sCAAA,EAAyC,OAAO,CAAA,IAAA,EAAO,SAAS,CAAA;AAAA,OAClE;AACA,MAAA,OAAO,IAAA;AAAA,IACT;AAGA,IAAA,MAAM,OAAA,GAAU;AAAA,MACd,MAAA,EAAQ,iBAAiB,MAAA,IAAU,SAAA;AAAA,MACnC,UAAU,eAAA,EAAiB,QAAA;AAAA,MAC3B,SAAS,eAAA,EAAiB,OAAA;AAAA,MAC1B,MAAA,EAAQ,IAAA,CAAK,mBAAA,CAAoB,KAAK,CAAA;AAAA,MACtC,QAAA;AAAA,MACA,QAAA,EAAU;AAAA,QACR,KAAA;AAAA,QACA,eAAA;AAAA,QACA,SAAA;AAAA,QACA;AAAA;AACF,KACF;AAGA,IAAA,IAAA,CAAK,OAAO,KAAA,CAAM,CAAA,mBAAA,EAAsB,OAAO,CAAA,YAAA,EAAe,SAAS,CAAA,CAAE,CAAA;AACzE,IAAA,MAAM,MAAA,GAAS,MAAO,OAAA,CAAgB,UAAU,EAAE,OAAO,CAAA;AAEzD,IAAA,OAAO,MAAA;AAAA,EACT;AAAA;AAAA;AAAA;AAAA;AAAA,EAMQ,mBAAmB,KAAA,EAGzB;AACA,IAAA,MAAM,KAAA,GAAQ,KAAA,CAAM,KAAA,CAAM,GAAG,CAAA;AAE7B,IAAA,IAAI,MAAM,MAAA,GAAS,CAAA,IAAK,KAAA,CAAM,CAAC,MAAM,IAAA,EAAM;AACzC,MAAA,MAAM,IAAI,KAAA,CAAM,CAAA,+BAAA,EAAkC,KAAK,CAAA,CAAE,CAAA;AAAA,IAC3D;AAEA,IAAA,MAAM,SAAA,GAAY,MAAM,CAAC,CAAA;AACzB,IAAA,MAAM,OAAA,GAAU,MAAM,CAAC,CAAA;AAGvB,IAAA,MAAM,SAAA,GAAY,GAAG,SAAS,CAAA,OAAA,CAAA;AAE9B,IAAA,OAAO,EAAE,WAAW,OAAA,EAAQ;AAAA,EAC9B;AAAA;AAAA;AAAA;AAAA,EAKQ,oBAAoB,KAAA,EAAoC;AAC9D,IAAA,MAAM,KAAA,GAAQ,KAAA,CAAM,KAAA,CAAM,GAAG,CAAA;AAE7B,IAAA,IAAI,KAAA,CAAM,SAAS,CAAA,EAAG;AACpB,MAAA,OAAO,EAAC;AAAA,IACV;AAEA,IAAA,IAAI;AAEF,MAAA,MAAM,gBAAgB,KAAA,CAAM,KAAA,CAAM,CAAC,CAAA,CAAE,KAAK,GAAG,CAAA;AAC7C,MAAA,MAAM,aAAA,GAAgB,MAAA,CAAO,IAAA,CAAK,aAAA,EAAe,WAAW,CAAA,CAAE,QAAA;AAAA,QAC5D;AAAA,OACF;AACA,MAAA,OAAO,IAAA,CAAK,MAAM,aAAa,CAAA;AAAA,IACjC,SAAS,KAAA,EAAO;AACd,MAAA,IAAA,CAAK,MAAA,CAAO,IAAA;AAAA,QACV,+CAA+C,KAAK,CAAA,CAAA;AAAA,QACpD;AAAA,OACF;AACA,MAAA,OAAO,EAAC;AAAA,IACV;AAAA,EACF;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EASA,MAAM,YAAA,CACJ,SAAA,EACA,YAAA,EACA,OAAA,EAC6C;AAC7C,IAAA,IAAA,CAAK,MAAA,CAAO,KAAA;AAAA,MACV,CAAA,kBAAA,EAAqB,YAAY,CAAA,aAAA,EAAgB,SAAS,CAAA,CAAA;AAAA,KAC5D;AAEA,IAAA,OAAO,MAAM,IAAA,CAAK,gBAAA,CAAiB,IAAA,CAAK,SAAA,EAAW,cAAc,OAAO,CAAA;AAAA,EAC1E;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOA,cAAc,SAAA,EAA6B;AACzC,IAAA,OAAO,IAAA,CAAK,gBAAA,CAAiB,IAAA,CAAK,SAAS,CAAA;AAAA,EAC7C;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,2BAAA,GAAwC;AACtC,IAAA,OAAO,IAAA,CAAK,iBAAiB,cAAA,EAAe;AAAA,EAC9C;AAAA;AAAA;AAAA;AAAA,EAKQ,kBAAkB,SAAA,EAAiD;AACzE,IAAA,MAAM,UAAU,IAAA,CAAK,QAAA,CAAS,KAAK,CAAA,CAAA,KAAK,CAAA,CAAE,cAAc,SAAS,CAAA;AAEjE,IAAA,IAAI,CAAC,OAAA,EAAS;AACZ,MAAA,MAAM,IAAI,KAAA,CAAM,CAAA,iCAAA,EAAoC,SAAS,CAAA,CAAE,CAAA;AAAA,IACjE;AAEA,IAAA,OAAO,OAAA;AAAA,EACT;AACF;AA3YaD,6BAAA,GAAN,eAAA,CAAA;AAAA,EADNtD,iBAAAA,EAAW;AAAA,EAMP,iCAAO,gBAAgB,CAAA,CAAA;AAAA,EAEvB,iCAAO,cAAc,CAAA,CAAA;AAAA,EAErB,iCAAOF,wBAAgB,CAAA;AAAA,CAAA,EATfwD,6BAAA,CAAA;AChgBb,SAAS,cAAA,GAAiB;AACxB,EAAA,IACE,QAAQ,GAAA,CAAI,QAAA,KAAa,iBACzB,CAAC,OAAA,CAAQ,IAAI,uBAAA,EACb;AACA,IAAA,OAAA,CAAQ,IAAI,4DAA4D,CAAA;AACxE,IAAA,MAAME,OAAAA,GAAS,UAAQ,QAAQ,CAAA;AAC/B,IAAA,MAAM,eAAA,GAAkBA,QAAO,SAAA,CAAU,OAAA;AAEzC,IAAAA,OAAAA,CAAO,SAAA,CAAU,OAAA,GAAU,SAAA,GAAa,IAAA,EAAa;AACnD,MAAA,IAAI,IAAA,CAAK,CAAC,CAAA,KAAM,SAAA,EAAW;AACzB,QAAA,OAAA,CAAQ,IAAI,kDAAkD,CAAA;AAC9D,QAAA,OAAO,eAAA,CAAgB,KAAA,CAAM,IAAA,EAAM,CAAC,cAAc,CAAC,CAAA;AAAA,MACrD;AACA,MAAA,OAAO,eAAA,CAAgB,KAAA,CAAM,IAAA,EAAM,IAAI,CAAA;AAAA,IACzC,CAAA;AAAA,EACF;AACF;AAKA,eAAe,gBAAgB,IAAA,EAAgC;AAC7D,EAAA,OAAO,IAAI,OAAA,CAAQ,CAAA7B,QAAAA,KAAW;AAC5B,IAAA,MAAM,SAAa8B,cAAA,CAAA,YAAA,EAAa;AAChC,IAAA,MAAA,CAAO,MAAA,CAAO,MAAM,MAAM;AACxB,MAAA,MAAA,CAAO,KAAA,CAAM,MAAM9B,QAAAA,CAAQ,IAAI,CAAC,CAAA;AAAA,IAClC,CAAC,CAAA;AACD,IAAA,MAAA,CAAO,EAAA,CAAG,OAAA,EAAS,MAAMA,QAAAA,CAAQ,KAAK,CAAC,CAAA;AAAA,EACzC,CAAC,CAAA;AACH;AAKA,eAAe,kBAAkB,SAAA,EAAoC;AACnE,EAAA,IAAI,IAAA,GAAO,SAAA;AACX,EAAA,OAAO,IAAA,GAAO,YAAY,GAAA,EAAK;AAE7B,IAAA,IAAI,MAAM,eAAA,CAAgB,IAAI,CAAA,EAAG;AAC/B,MAAA,OAAO,IAAA;AAAA,IACT;AACA,IAAA,IAAA,EAAA;AAAA,EACF;AACA,EAAA,MAAM,IAAI,KAAA;AAAA,IACR,CAAA,kCAAA,EAAqC,SAAS,CAAA,CAAA,EAAI,SAAA,GAAY,EAAE,CAAA;AAAA,GAClE;AACF;AAQA,eAAe,4BAAA,CACb,SAAA,EACA,IAAA,EACA+B,OAAAA,EACA,GAAA,EACe;AACf,EAAA,IAAI;AACF,IAAAA,OAAAA,CAAO,KAAA;AAAA,MACL;AAAA,KACF;AAGA,IAAA,MAAM,EAAE,kBAAA,EAAA3C,mBAAAA,EAAmB,GAAI,MAAM,OAAA,CAAA,OAAA,EAAA,CAAA,IAAA,CAAA,OAAA,yBAAA,EAAA,EAAA,4BAAA,CAAA,CAAA;AAIrC,IAAA2C,OAAAA,CAAO,KAAA;AAAA,MACL;AAAA,KACF;AACA,IAAA,MAAM,SAAA,GAAY,IAAI3C,mBAAAA,EAAmB;AACzC,IAAA2C,OAAAA,CAAO,MAAM,yDAAyD,CAAA;AAGtE,IAAA,MAAM,cAAc,SAAA,CAAU,IAAA,CAAK,QAAQ,QAAA,EAAU,EAAE,EAAE,WAAA,EAAY;AAGrE,IAAA,IAAI,aAAuB,EAAC;AAC5B,IAAA,IAAI;AACF,MAAA,IAAI,GAAA,EAAK;AAEP,QAAA,MAAM,EAAE,sBAAA,EAAAvC,uBAAAA,EAAuB,GAAI,MAAM,OAAA,CAAA,OAAA,EAAA,CAAA,IAAA,CAAA,OAAA,6BAAA,EAAA,EAAA,gCAAA,CAAA,CAAA;AAGzC,QAAA,MAAM,eAAA,GAAkB,GAAA,CAAI,GAAA,CAAIA,uBAAAA,EAAwB;AAAA,UACtD,MAAA,EAAQ;AAAA,SACT,CAAA;AACD,QAAAuC,OAAAA,CAAO,KAAA;AAAA,UACL,CAAA,oCAAA,EAAuC,CAAC,CAAC,eAAe,CAAA;AAAA,SAC1D;AAEA,QAAA,IAAI,eAAA,EAAiB;AACnB,UAAA,MAAM,QAAA,GAAW,gBAAgB,WAAA,EAAY;AAC7C,UAAAA,OAAAA,CAAO,KAAA,CAAM,CAAA,MAAA,EAAS,QAAA,CAAS,MAAM,CAAA,qBAAA,CAAuB,CAAA;AAC5D,UAAA,MAAM,cAAA,GAAiB,QAAA,CAAS,GAAA,CAAI,CAAA,OAAA,KAAW,QAAQ,SAAS,CAAA;AAChE,UAAAA,QAAO,KAAA,CAAM,CAAA,mBAAA,EAAsB,eAAe,IAAA,CAAK,IAAI,CAAC,CAAA,CAAA,CAAG,CAAA;AAG/D,UAAA,IAAI;AACF,YAAAA,OAAAA,CAAO,MAAM,+CAA+C,CAAA;AAC5D,YAAA,MAAM,EAAE,qBAAA,EAAArC,sBAAAA,EAAsB,GAAI,MAAM,OAAA,CAAA,OAAA,EAAA,CAAA,IAAA,CAAA,OAAA,4BAAA,EAAA,EAAA,+BAAA,CAAA,CAAA;AAGxC,YAAAqC,OAAAA,CAAO,MAAM,6CAA6C,CAAA;AAE1D,YAAA,MAAM,gBAAA,GAAmB,GAAA,CAAI,GAAA,CAAIrC,sBAAAA,EAAuB;AAAA,cACtD,MAAA,EAAQ;AAAA,aACT,CAAA;AACD,YAAAqC,OAAAA,CAAO,KAAA;AAAA,cACL,CAAA,mCAAA,EAAsC,CAAC,CAAC,gBAAgB,CAAA;AAAA,aAC1D;AAEA,YAAA,IAAI,gBAAA,EAAkB;AAEpB,cAAA,MAAM,oBAA8B,EAAC;AACrC,cAAA,KAAA,MAAW,YAAY,cAAA,EAAgB;AACrC,gBAAAA,OAAAA,CAAO,KAAA,CAAM,CAAA,gCAAA,EAAmC,QAAQ,CAAA,CAAE,CAAA;AAC1D,gBAAA,MAAM,QAAA,GACJ,gBAAA,CAAiB,oBAAA,CAAqB,QAAQ,CAAA;AAChD,gBAAAA,OAAAA,CAAO,KAAA;AAAA,kBACL,CAAA,MAAA,EAAS,SAAS,MAAM,CAAA,cAAA,EAAiB,QAAQ,CAAA,GAAA,EAAM,QAAA,CAAS,IAAA,CAAK,IAAI,CAAC,CAAA,CAAA;AAAA,iBAC5E;AAEA,gBAAA,IAAI,QAAA,CAAS,SAAS,CAAA,EAAG;AAEvB,kBAAA,iBAAA,CAAkB,KAAK,QAAQ,CAAA;AAC/B,kBAAA,QAAA,CAAS,QAAQ,CAAA,OAAA,KAAW;AAC1B,oBAAA,iBAAA,CAAkB,IAAA,CAAK,CAAA,EAAG,QAAQ,CAAA,EAAA,EAAK,OAAO,CAAA,CAAE,CAAA;AAAA,kBAClD,CAAC,CAAA;AAAA,gBACH,CAAA,MAAO;AAEL,kBAAA,iBAAA,CAAkB,KAAK,QAAQ,CAAA;AAAA,gBACjC;AAAA,cACF;AACA,cAAA,UAAA,GAAa,iBAAA;AACb,cAAAA,OAAAA,CAAO,KAAA;AAAA,gBACL,CAAA,MAAA,EAAS,cAAA,CAAe,MAAM,CAAA,iBAAA,EAAoB,UAAA,CAAW,MAAM,CAAA,wBAAA,EAA2B,UAAA,CAAW,IAAA,CAAK,IAAI,CAAC,CAAA;AAAA,eACrH;AAAA,YACF,CAAA,MAAO;AAEL,cAAA,UAAA,GAAa,cAAA;AACb,cAAAA,OAAAA,CAAO,KAAA;AAAA,gBACL,CAAA,mEAAA,EAAsE,UAAA,CAAW,IAAA,CAAK,IAAI,CAAC,CAAA;AAAA,eAC7F;AAAA,YACF;AAAA,UACF,SAAS,KAAA,EAAO;AAEd,YAAA,UAAA,GAAa,cAAA;AACb,YAAAA,OAAAA,CAAO,KAAA;AAAA,cACL,CAAA,iDAAA,EAAoD,MAAM,OAAO,CAAA;AAAA,aACnE;AACA,YAAAA,OAAAA,CAAO,KAAA,CAAM,CAAA,aAAA,EAAgB,KAAA,CAAM,KAAK,CAAA,CAAE,CAAA;AAAA,UAC5C;AAAA,QACF;AAAA,MACF;AAAA,IACF,SAAS,KAAA,EAAO;AACd,MAAAA,OAAAA,CAAO,KAAA,CAAM,CAAA,yCAAA,EAA4C,KAAA,CAAM,OAAO,CAAA,CAAE,CAAA;AAAA,IAC1E;AAGA,IAAA,IAAI,UAAA,CAAW,WAAW,CAAA,EAAG;AAC3B,MAAAA,OAAAA,CAAO,MAAM,qDAAqD,CAAA;AAClE,MAAA,UAAA,GAAa,CAAC,WAAW,CAAA;AAAA,IAC3B;AAEA,IAAA,MAAM,SAAA,CAAU,eAAA;AAAA,MACd,WAAA;AAAA,MACA,WAAA;AAAA,MACA,IAAA;AAAA,MACA;AAAA,QACE,UAAA;AAAA,QACA,WAAA,EAAa,aAAA;AAAA,QACb,SAAA,EAAA,iBAAW,IAAI,IAAA,EAAK,EAAE,WAAA,EAAY;AAAA,QAClC,OAAA,EAAS,OAAA,CAAQ,GAAA,CAAI,mBAAA,IAAuB;AAAA,OAC9C;AAAA,MACA;AAAA,KACF;AAEA,IAAAA,OAAAA,CAAO,GAAA;AAAA,MACL,gDAAyC,WAAW,CAAA,SAAA,EAAY,UAAA,CAAW,IAAA,CAAK,IAAI,CAAC,CAAA,CAAA;AAAA,KACvF;AAAA,EACF,SAAS,KAAA,EAAO;AACd,IAAAA,OAAAA,CAAO,IAAA,CAAK,CAAA,2CAAA,EAA8C,KAAA,CAAM,OAAO,CAAA,CAAE,CAAA;AAAA,EAC3E;AACF;AAKA,eAAsB,SAAA,CACpB,SAAA,EACA,OAAA,GAAoD,EAAC,EACrD;AAEA,EAAA,cAAA,EAAe;AAEf,EAAA,MAAM,GAAA,GAAM,MAAMC,gBAAA,CAAY,MAAA,CAAO,SAAS,CAAA;AAC9C,EAAA,MAAMD,OAAAA,GAAS,IAAI3D,aAAAA,CAAO,WAAW,CAAA;AAGrC,EAAA,MAAM,aAAA,GACJ,QAAQ,IAAA,IAAQ,QAAA,CAAS,QAAQ,GAAA,CAAI,IAAA,IAAQ,QAAQ,EAAE,CAAA;AACzD,EAAA,MAAM,IAAA,GAAO,MAAM,iBAAA,CAAkB,aAAa,CAAA;AAClD,EAAA,MAAM,eAAe,OAAA,CAAQ,YAAA;AAE7B,EAAA,IAAI,SAAS,aAAA,EAAe;AAC1B,IAAA2D,QAAO,IAAA,CAAK,CAAA,KAAA,EAAQ,aAAa,CAAA,qBAAA,EAAwB,IAAI,CAAA,QAAA,CAAU,CAAA;AAAA,EACzE;AAGA,EAAA,IAAI,YAAA,EAAc;AAChB,IAAA,GAAA,CAAI,gBAAgB,YAAY,CAAA;AAAA,EAClC;AAGA,EAAA,GAAA,CAAI,cAAA;AAAA,IACF,IAAIE,qBAAA,CAAe;AAAA,MACjB,SAAA,EAAW,IAAA;AAAA,MACX,oBAAA,EAAsB,IAAA;AAAA,MACtB,SAAA,EAAW;AAAA,KACZ;AAAA,GACH;AAGA,EAAA,GAAA,CAAI,UAAA,CAAW;AAAA,IACb,MAAA,EAAQ,IAAA;AAAA,IACR,WAAA,EAAa;AAAA,GACd,CAAA;AAGD,EAAA,MAAM,MAAA,GAAS,IAAIC,uBAAA,EAAgB,CAChC,SAAS,mBAAmB,CAAA,CAC5B,cAAA,CAAe,oCAAoC,EACnD,UAAA,CAAW,KAAK,CAAA,CAChB,aAAA,GACA,KAAA,EAAM;AAET,EAAA,MAAM,QAAA,GAAWC,qBAAA,CAAc,cAAA,CAAe,GAAA,EAAK,MAAM,CAAA;AACzD,EAAAA,qBAAA,CAAc,KAAA,CAAM,UAAA,EAAY,GAAA,EAAK,QAAQ,CAAA;AAG7C,EAAA,MAAM,GAAA,CAAI,OAAO,IAAI,CAAA;AAErB,EAAA,MAAM,OAAA,GAAU,eACZ,CAAA,iBAAA,EAAoB,IAAI,IAAI,YAAY,CAAA,CAAA,GACxC,oBAAoB,IAAI,CAAA,CAAA;AAC5B,EAAAJ,OAAAA,CAAO,GAAA,CAAI,CAAA,uCAAA,EAAmC,OAAO,CAAA,CAAE,CAAA;AACvD,EAAAA,OAAAA,CAAO,GAAA,CAAI,CAAA,8CAAA,EAA0C,IAAI,CAAA,SAAA,CAAW,CAAA;AAGpE,EAAA,IAAI,OAAA,CAAQ,GAAA,CAAI,QAAA,KAAa,YAAA,EAAc;AACzC,IAAAA,OAAAA,CAAO,KAAA;AAAA,MACL,CAAA,qDAAA,EAAwD,OAAA,CAAQ,GAAA,CAAI,QAAA,IAAY,WAAW,CAAA,CAAA;AAAA,KAC7F;AACA,IAAA,MAAM,4BAAA,CAA6B,SAAA,EAAW,IAAA,EAAMA,OAAAA,EAAQ,GAAG,CAAA;AAAA,EACjE,CAAA,MAAO;AACL,IAAAA,OAAAA,CAAO,KAAA;AAAA,MACL,CAAA,mDAAA,EAAsD,OAAA,CAAQ,GAAA,CAAI,QAAQ,CAAA,CAAA;AAAA,KAC5E;AAAA,EACF;AAEA,EAAA,OAAO,GAAA;AACT;;;AClRA,6BAAA,EAAA;;;ACCO,IAAK,cAAA,qBAAAK,eAAAA,KAAL;AACL,EAAAA,gBAAA,OAAA,CAAA,GAAQ,OAAA;AACR,EAAAA,gBAAA,OAAA,CAAA,GAAQ,OAAA;AACR,EAAAA,gBAAA,MAAA,CAAA,GAAO,MAAA;AACP,EAAAA,gBAAA,QAAA,CAAA,GAAS,QAAA;AACT,EAAAA,gBAAA,UAAA,CAAA,GAAW,UAAA;AACX,EAAAA,gBAAA,YAAA,CAAA,GAAa,YAAA;AACb,EAAAA,gBAAA,QAAA,CAAA,GAAS,QAAA;AACT,EAAAA,gBAAA,QAAA,CAAA,GAAS,QAAA;AACT,EAAAA,gBAAA,MAAA,CAAA,GAAO,MAAA;AACP,EAAAA,gBAAA,OAAA,CAAA,GAAQ,OAAA;AAVE,EAAA,OAAAA,eAAAA;AAAA,CAAA,EAAA,cAAA,IAAA,EAAA;;;ACAL,IAAK,aAAA,qBAAAC,cAAAA,KAAL;AACL,EAAAA,eAAA,MAAA,CAAA,GAAO,MAAA;AACP,EAAAA,eAAA,YAAA,CAAA,GAAa,YAAA;AAFH,EAAA,OAAAA,cAAAA;AAAA,CAAA,EAAA,aAAA,IAAA,EAAA;;;ACkJL,IAAM,kBAAA,GAAqB;AAAA,EAChC,QAAA,EAAU,wBAAA;AAAA,EACV,MAAA,EAAQ,sBAAA;AAAA,EACR,mBAAA,EAAqB;AACvB;;;AC9HA,6BAAA,EAAA;AAQaC,0BAAN,qBAAA,CAAsB;AAAA,EAG3B,WAAA,CAEqB,cAEF,eAAA,EACjB;AAHmB,IAAA,IAAA,CAAA,YAAA,GAAA,YAAA;AAEF,IAAA,IAAA,CAAA,eAAA,GAAA,eAAA;AAAA,EAChB;AAAA,EAPgB,MAAA,GAAS,IAAIlE,aAAAA,CAAOkE,uBAAA,CAAgB,IAAI,CAAA;AAAA,EAc3D,MAAM,WAAA,GAA8D;AAClE,IAAA,IAAI;AACF,MAAA,MAAM,SAAA,GAAY,MAAM,IAAA,CAAK,YAAA,CAAa,WAAA,EAAY;AACtD,MAAA,OAAO;AAAA,QACL,MAAA,EAAQ,YAAY,SAAA,GAAY,WAAA;AAAA,QAChC,SAAA,EAAA,iBAAW,IAAI,IAAA,EAAK,EAAE,WAAA;AAAY,OACpC;AAAA,IACF,SAAS,KAAA,EAAO;AACd,MAAA,IAAA,CAAK,MAAA,CAAO,KAAA,CAAM,CAAA,qBAAA,EAAwB,KAAA,CAAM,OAAO,CAAA,CAAE,CAAA;AACzD,MAAA,MAAM,IAAIC,oBAAA;AAAA,QACR,mBAAA;AAAA,QACAC,iBAAA,CAAW;AAAA,OACb;AAAA,IACF;AAAA,EACF;AAAA,EAKA,MAAM,sBAAA,GAA4C;AAChD,IAAA,OAAO,IAAA,CAAK,aAAa,sBAAA,EAAuB;AAAA,EAClD;AAAA,EAKA,MAAM,eACI,OAAA,EACwB;AAChC,IAAA,IAAI;AACF,MAAA,OAAO,MAAM,IAAA,CAAK,YAAA,CAAa,cAAA,CAAe,OAAO,CAAA;AAAA,IACvD,SAAS,KAAA,EAAO;AACd,MAAA,IAAA,CAAK,MAAA,CAAO,KAAA,CAAM,CAAA,mBAAA,EAAsB,KAAA,CAAM,OAAO,CAAA,CAAE,CAAA;AACvD,MAAA,MAAM,IAAID,oBAAA;AAAA,QACR,CAAA,mBAAA,EAAsB,MAAM,OAAO,CAAA,CAAA;AAAA,QACnCC,iBAAA,CAAW;AAAA,OACb;AAAA,IACF;AAAA,EACF;AAAA,EAKA,MAAM,YAAA,CACI,OAAA,EACD,GAAA,EACQ;AACf,IAAA,GAAA,CAAI,SAAA,CAAU,gBAAgB,mBAAmB,CAAA;AACjD,IAAA,GAAA,CAAI,SAAA,CAAU,qBAAqB,SAAS,CAAA;AAC5C,IAAA,GAAA,CAAI,SAAA,CAAU,iBAAiB,UAAU,CAAA;AACzC,IAAA,GAAA,CAAI,SAAA,CAAU,cAAc,YAAY,CAAA;AAExC,IAAA,IAAI;AACF,MAAA,IAAA,CAAK,MAAA,CAAO,KAAA;AAAA,QACV,CAAA,kDAAA,EAAqD,QAAQ,SAAS,CAAA;AAAA,OACxE;AAEA,MAAA,MAAM,MAAA,GAAS,MAAM,IAAA,CAAK,YAAA,CAAa,YAAA;AAAA,QACrC,OAAA;AAAA,QACA,CAAC,KAAA,KAAkB;AAEjB,UAAA,GAAA,CAAI,KAAA,CAAM,CAAA;AAAA,CAAuB,CAAA;AACjC,UAAA,GAAA,CAAI,KAAA,CAAM,SAAS,KAAK;;AAAA,CAAM,CAAA;AAAA,QAChC;AAAA,OACF;AAEA,MAAA,IAAA,CAAK,MAAA,CAAO,KAAA;AAAA,QACV,CAAA,+BAAA,EAAkC,IAAA,CAAK,SAAA,CAAU,MAAM,CAAC,CAAA,GAAA;AAAA,OAC1D;AAEA,MAAA,IAAA,CAAK,MAAA,CAAO,MAAM,CAAA,kCAAA,CAAA,EAAsC;AAAA,QACtD,OAAA,EAAS,CAAC,CAAC,MAAA,CAAO,IAAA;AAAA,QAClB,UAAA,EAAY,MAAA,CAAO,IAAA,EAAM,MAAA,IAAU,CAAA;AAAA,QACnC,gBAAA,EAAkB,MAAA,CAAO,WAAA,EAAa,MAAA,IAAU,CAAA;AAAA,QAChD,oBAAA,EAAsB,MAAA,CAAO,eAAA,EAAiB,MAAA,IAAU,CAAA;AAAA,QACxD,UAAA,EAAY,MAAA,CAAO,IAAA,CAAK,MAAA,IAAU,EAAE;AAAA,OACrC,CAAA;AAGD,MAAA,GAAA,CAAI,KAAA,CAAM,CAAA;AAAA,CAAgB,CAAA;AAC1B,MAAA,GAAA,CAAI,KAAA,CAAM,CAAA,MAAA,EAAS,IAAA,CAAK,SAAA,CAAU,MAAM,CAAC;;AAAA,CAAM,CAAA;AAC/C,MAAA,GAAA,CAAI,GAAA,EAAI;AAER,MAAA,IAAA,CAAK,MAAA,CAAO,MAAM,CAAA,0CAAA,CAA4C,CAAA;AAAA,IAChE,SAAS,KAAA,EAAO;AACd,MAAA,IAAA,CAAK,MAAA,CAAO,KAAA,CAAM,CAAA,+BAAA,EAAkC,KAAA,CAAM,OAAO,CAAA,CAAE,CAAA;AACnE,MAAA,IAAA,CAAK,MAAA,CAAO,KAAA,CAAM,CAAA,0BAAA,EAA6B,KAAA,CAAM,KAAK,CAAA,CAAE,CAAA;AAE5D,MAAA,GAAA,CAAI,KAAA,CAAM,CAAA;AAAA,CAAgB,CAAA;AAC1B,MAAA,GAAA,CAAI,KAAA,CAAM,SAAS,IAAA,CAAK,SAAA,CAAU,EAAE,OAAA,EAAS,KAAA,CAAM,OAAA,EAAS,CAAC;;AAAA,CAAM,CAAA;AACnE,MAAA,GAAA,CAAI,GAAA,EAAI;AAAA,IACV;AAAA,EACF;AAAA,EAMA,MAAM,iBACgB,SAAA,EACU;AAC9B,IAAA,IAAI;AACF,MAAA,MAAM,IAAA,CAAK,YAAA,CAAa,gBAAA,CAAiB,SAAS,CAAA;AAClD,MAAA,OAAO,EAAE,OAAA,EAAS,CAAA,WAAA,EAAc,SAAS,CAAA,UAAA,CAAA,EAAa;AAAA,IACxD,SAAS,KAAA,EAAO;AACd,MAAA,IAAA,CAAK,MAAA,CAAO,KAAA,CAAM,CAAA,qBAAA,EAAwB,KAAA,CAAM,OAAO,CAAA,CAAE,CAAA;AACzD,MAAA,MAAM,IAAID,oBAAA;AAAA,QACR,CAAA,qBAAA,EAAwB,MAAM,OAAO,CAAA,CAAA;AAAA,QACrCC,iBAAA,CAAW;AAAA,OACb;AAAA,IACF;AAAA,EACF;AAAA,EAOA,MAAM,mBAAA,GAGH;AACD,IAAA,MAAM,QAAA,GAAW,IAAA,CAAK,eAAA,CAAgB,WAAA,EAAY;AAClD,IAAA,OAAO;AAAA,MACL,OAAO,QAAA,CAAS,MAAA;AAAA,MAChB,MAAA,EAAQ,QAAA,CAAS,GAAA,CAAI,CAAA,OAAA,MAAY;AAAA,QAC/B,WAAW,OAAA,CAAQ,SAAA;AAAA,QACnB,WAAA,EAAa,QAAQ,WAAA,CAAY;AAAA,OACnC,CAAE;AAAA,KACJ;AAAA,EACF;AAAA,EAKA,MAAM,gBAAA,GAIH;AACD,IAAA,MAAM,QAAA,GAAW,IAAA,CAAK,eAAA,CAAgB,WAAA,EAAY;AAClD,IAAA,MAAM,UAAA,GAAa,QAAA,CAAS,GAAA,CAAI,CAAA,CAAA,KAAK,EAAE,SAAS,CAAA;AAChD,IAAA,MAAM,eAAuC,EAAC;AAE9C,IAAA,QAAA,CAAS,QAAQ,CAAA,OAAA,KAAW;AAC1B,MAAA,MAAM,IAAA,GAAO,QAAQ,WAAA,CAAY,IAAA;AACjC,MAAA,YAAA,CAAa,IAAI,CAAA,GAAA,CAAK,YAAA,CAAa,IAAI,KAAK,CAAA,IAAK,CAAA;AAAA,IACnD,CAAC,CAAA;AAED,IAAA,OAAO;AAAA,MACL,eAAe,QAAA,CAAS,MAAA;AAAA,MACxB,UAAA;AAAA,MACA;AAAA,KACF;AAAA,EACF;AACF;AA3JQ,eAAA,CAAA;AAAA,EAHLvD,WAAI,QAAQ,CAAA;AAAA,EACZH,oBAAAA,CAAa,EAAE,OAAA,EAAS,4BAAA,EAA8B,CAAA;AAAA,EACtDC,oBAAY,EAAE,MAAA,EAAQ,GAAA,EAAK,WAAA,EAAa,wBAAwB;AAAA,CAAA,EAdtDuD,uBAAA,CAeL,SAAA,EAAA,aAAA,EAAA,CAAA,CAAA;AAmBA,eAAA,CAAA;AAAA,EAHLrD,WAAI,aAAa,CAAA;AAAA,EACjBH,oBAAAA,CAAa,EAAE,OAAA,EAAS,2BAAA,EAA6B,CAAA;AAAA,EACrDC,oBAAY,EAAE,MAAA,EAAQ,GAAA,EAAK,WAAA,EAAa,uBAAuB;AAAA,CAAA,EAjCrDuD,uBAAA,CAkCL,SAAA,EAAA,wBAAA,EAAA,CAAA,CAAA;AAOA,eAAA,CAAA;AAAA,EAHLzD,YAAK,UAAU,CAAA;AAAA,EACfC,oBAAAA,CAAa,EAAE,OAAA,EAAS,iCAAA,EAAmC,CAAA;AAAA,EAC3DC,oBAAY,EAAE,MAAA,EAAQ,GAAA,EAAK,WAAA,EAAa,oBAAoB,CAAA;AAAA,EAE1D,mBAAAC,WAAAA,EAAK;AAAA,CAAA,EA1CGsD,uBAAA,CAyCL,SAAA,EAAA,gBAAA,EAAA,CAAA,CAAA;AAiBA,eAAA,CAAA;AAAA,EAHLzD,YAAK,QAAQ,CAAA;AAAA,EACbC,oBAAAA,CAAa,EAAE,OAAA,EAAS,0BAAA,EAA4B,CAAA;AAAA,EACpDC,oBAAY,EAAE,MAAA,EAAQ,GAAA,EAAK,WAAA,EAAa,sBAAsB,CAAA;AAAA,EAE5D,mBAAAC,WAAAA,EAAK,CAAA;AAAA,EACL,eAAA,CAAA,CAAA,EAAAyD,UAAA,EAAI;AAAA,CAAA,EA5DIH,uBAAA,CA0DL,SAAA,EAAA,cAAA,EAAA,CAAA,CAAA;AAuDA,eAAA,CAAA;AAAA,EAJLzD,YAAK,mBAAmB,CAAA;AAAA,EACxBC,oBAAAA,CAAa,EAAE,OAAA,EAAS,mBAAA,EAAqB,CAAA;AAAA,EAC7C4D,iBAAS,EAAE,IAAA,EAAM,WAAA,EAAa,WAAA,EAAa,wBAAwB,CAAA;AAAA,EACnE3D,oBAAY,EAAE,MAAA,EAAQ,GAAA,EAAK,WAAA,EAAa,wBAAwB,CAAA;AAAA,EAE9D,eAAA,CAAA,CAAA,EAAA4D,aAAM,WAAW,CAAA;AAAA,CAAA,EAlHTL,uBAAA,CAiHL,SAAA,EAAA,kBAAA,EAAA,CAAA,CAAA;AAoBA,eAAA,CAAA;AAAA,EAHLrD,WAAI,UAAU,CAAA;AAAA,EACdH,oBAAAA,CAAa,EAAE,OAAA,EAAS,2BAAA,EAA6B,CAAA;AAAA,EACrDC,oBAAY,EAAE,MAAA,EAAQ,GAAA,EAAK,WAAA,EAAa,6BAA6B;AAAA,CAAA,EApI3DuD,uBAAA,CAqIL,SAAA,EAAA,qBAAA,EAAA,CAAA,CAAA;AAiBA,eAAA,CAAA;AAAA,EAHLrD,WAAI,gBAAgB,CAAA;AAAA,EACpBH,oBAAAA,CAAa,EAAE,OAAA,EAAS,2BAAA,EAA6B,CAAA;AAAA,EACrDC,oBAAY,EAAE,MAAA,EAAQ,GAAA,EAAK,WAAA,EAAa,cAAc;AAAA,CAAA,EArJ5CuD,uBAAA,CAsJL,SAAA,EAAA,kBAAA,EAAA,CAAA,CAAA;AAtJKA,uBAAA,GAAN,eAAA,CAAA;AAAA,EAFNpD,gBAAQ,QAAQ,CAAA;AAAA,EAChBC,iBAAAA,EAAW;AAAA,EAKP,eAAA,CAAA,CAAA,EAAAuC,cAAO,eAAe,CAAA,CAAA;AAAA,EAEtB,eAAA,CAAA,CAAA,EAAAA,cAAOlC,8BAAsB,CAAA;AAAA,CAAA,EANrB8C,uBAAA,CAAA;;;ACjCN,IAAM,mBAAA,GAAsB;AAAA,EACjC,OAAA,EAAS,yCAAA;AAAA,EACT,IAAA,EAAM,QAAA;AAAA,EACN,KAAA,EAAO,uBAAA;AAAA,EACP,WAAA,EAAa,4CAAA;AAAA,EACb,UAAA,EAAY;AAAA,IACV,SAAA,EAAW;AAAA,MACT,IAAA,EAAM,QAAA;AAAA,MACN,WAAA,EAAa,sCAAA;AAAA,MACb,OAAA,EAAS;AAAA,KACX;AAAA,IACA,KAAA,EAAO;AAAA,MACL,IAAA,EAAM,QAAA;AAAA,MACN,WAAA,EAAa,oCAAA;AAAA,MACb,SAAA,EAAW,CAAA;AAAA,MACX,SAAA,EAAW;AAAA,KACb;AAAA,IACA,WAAA,EAAa;AAAA,MACX,IAAA,EAAM,QAAA;AAAA,MACN,WAAA,EAAa,gCAAA;AAAA,MACb,SAAA,EAAW,CAAA;AAAA,MACX,SAAA,EAAW;AAAA,KACb;AAAA,IACA,mBAAA,EAAqB;AAAA,MACnB,IAAA,EAAM,QAAA;AAAA,MACN,WAAA,EAAa,4CAAA;AAAA,MACb,SAAA,EAAW;AAAA,KACb;AAAA,IACA,QAAA,EAAU;AAAA,MACR,IAAA,EAAM,QAAA;AAAA,MACN,WAAA,EAAa,8BAAA;AAAA,MACb,IAAA,EAAM,CAAC,OAAA,EAAS,aAAA,EAAe,YAAY,cAAc;AAAA,KAC3D;AAAA,IACA,IAAA,EAAM;AAAA,MACJ,IAAA,EAAM,OAAA;AAAA,MACN,WAAA,EAAa,kCAAA;AAAA,MACb,KAAA,EAAO;AAAA,QACL,IAAA,EAAM,QAAA;AAAA,QACN,OAAA,EAAS;AAAA,OACX;AAAA,MACA,WAAA,EAAa;AAAA,KACf;AAAA,IACA,GAAA,EAAK;AAAA,MACH,IAAA,EAAM,QAAA;AAAA,MACN,WAAA,EAAa,yCAAA;AAAA,MACb,OAAA,EAAS,CAAA;AAAA,MACT,OAAA,EAAS;AAAA,KACX;AAAA,IACA,UAAA,EAAY;AAAA,MACV,IAAA,EAAM,QAAA;AAAA,MACN,WAAA,EAAa,gCAAA;AAAA,MACb,IAAA,EAAM,CAAC,QAAA,EAAU,SAAS,CAAA;AAAA,MAC1B,OAAA,EAAS;AAAA,KACX;AAAA,IACA,UAAA,EAAY;AAAA,MACV,IAAA,EAAM,SAAA;AAAA,MACN,WAAA,EAAa,yCAAA;AAAA,MACb,OAAA,EAAS;AAAA,KACX;AAAA,IACA,QAAA,EAAU;AAAA,MACR,IAAA,EAAM,SAAA;AAAA,MACN,WAAA,EAAa,uCAAA;AAAA,MACb,OAAA,EAAS;AAAA,KACX;AAAA,IACA,MAAA,EAAQ;AAAA,MACN,IAAA,EAAM,QAAA;AAAA,MACN,WAAA,EAAa,qCAAA;AAAA,MACb,UAAA,EAAY;AAAA,QACV,IAAA,EAAM;AAAA,UACJ,IAAA,EAAM,QAAA;AAAA,UACN,KAAA,EAAO;AAAA,SACT;AAAA,QACA,UAAA,EAAY;AAAA,UACV,IAAA,EAAM,QAAA;AAAA,UACN,oBAAA,EAAsB;AAAA,YACpB,IAAA,EAAM,QAAA;AAAA,YACN,UAAA,EAAY;AAAA,cACV,IAAA,EAAM,EAAE,IAAA,EAAM,QAAA,EAAS;AAAA,cACvB,KAAA,EAAO,EAAE,IAAA,EAAM,QAAA,EAAS;AAAA,cACxB,WAAA,EAAa,EAAE,IAAA,EAAM,QAAA,EAAS;AAAA,cAC9B,SAAS,EAAC;AAAA,cACV,OAAA,EAAS,EAAE,IAAA,EAAM,QAAA,EAAS;AAAA,cAC1B,OAAA,EAAS,EAAE,IAAA,EAAM,QAAA,EAAS;AAAA,cAC1B,SAAA,EAAW,EAAE,IAAA,EAAM,QAAA,EAAS;AAAA,cAC5B,SAAA,EAAW,EAAE,IAAA,EAAM,QAAA,EAAS;AAAA,cAC5B,MAAA,EAAQ,EAAE,IAAA,EAAM,QAAA,EAAS;AAAA,cACzB,IAAA,EAAM,EAAE,IAAA,EAAM,OAAA;AAAQ,aACxB;AAAA,YACA,QAAA,EAAU,CAAC,MAAA,EAAQ,OAAO;AAAA;AAC5B,SACF;AAAA,QACA,QAAA,EAAU;AAAA,UACR,IAAA,EAAM,OAAA;AAAA,UACN,KAAA,EAAO,EAAE,IAAA,EAAM,QAAA;AAAS;AAC1B,OACF;AAAA,MACA,QAAA,EAAU,CAAC,MAAA,EAAQ,YAAA,EAAc,UAAU,CAAA;AAAA,MAC3C,oBAAA,EAAsB;AAAA,KACxB;AAAA,IACA,eAAA,EAAiB;AAAA,MACf,IAAA,EAAM,QAAA;AAAA,MACN,WAAA,EAAa;AAAA;AACf,GACF;AAAA,EACA,QAAA,EAAU,CAAC,WAAA,EAAa,OAAA,EAAS,eAAe,QAAQ,CAAA;AAAA,EACxD,oBAAA,EAAsB;AACxB;AAKO,IAAM,yBAAN,MAA6B;AAAA;AAAA;AAAA;AAAA,EAIlC,OAAO,SAAS,QAAA,EAAuD;AACrE,IAAA,MAAM,SAAmB,EAAC;AAE1B,IAAA,IAAI;AAEF,MAAA,MAAM,WAAW,mBAAA,CAAoB,QAAA;AACrC,MAAA,KAAA,MAAW,SAAS,QAAA,EAAU;AAC5B,QAAA,IAAI,CAAC,QAAA,CAAS,cAAA,CAAe,KAAK,CAAA,EAAG;AACnC,UAAA,MAAA,CAAO,IAAA,CAAK,CAAA,wBAAA,EAA2B,KAAK,CAAA,CAAE,CAAA;AAAA,QAChD;AAAA,MACF;AAGA,MAAA,IACE,SAAS,SAAA,IACT,CAAC,0BAA0B,IAAA,CAAK,QAAA,CAAS,SAAS,CAAA,EAClD;AACA,QAAA,MAAA,CAAO,KAAK,CAAA,qDAAA,CAAuD,CAAA;AAAA,MACrE;AAGA,MAAA,IACE,QAAA,CAAS,YACT,CAAC,CAAC,SAAS,aAAA,EAAe,UAAA,EAAY,cAAc,CAAA,CAAE,QAAA;AAAA,QACpD,QAAA,CAAS;AAAA,OACX,EACA;AACA,QAAA,MAAA,CAAO,IAAA;AAAA,UACL,CAAA,mEAAA;AAAA,SACF;AAAA,MACF;AAGA,MAAA,IACE,QAAA,CAAS,UAAA,IACT,CAAC,CAAC,QAAA,EAAU,SAAS,CAAA,CAAE,QAAA,CAAS,QAAA,CAAS,UAAU,CAAA,EACnD;AACA,QAAA,MAAA,CAAO,KAAK,CAAA,0CAAA,CAA4C,CAAA;AAAA,MAC1D;AAGA,MAAA,IACE,QAAA,CAAS,QAAQ,KAAA,CAAA,KAChB,QAAA,CAAS,MAAM,CAAA,IAAK,QAAA,CAAS,MAAM,GAAA,CAAA,EACpC;AACA,QAAA,MAAA,CAAO,KAAK,CAAA,6BAAA,CAA+B,CAAA;AAAA,MAC7C;AAGA,MAAA,IAAI,SAAS,MAAA,EAAQ;AACnB,QAAA,IAAI,QAAA,CAAS,MAAA,CAAO,IAAA,KAAS,QAAA,EAAU;AACrC,UAAA,MAAA,CAAO,KAAK,CAAA,4BAAA,CAA8B,CAAA;AAAA,QAC5C;AACA,QAAA,IACE,CAAC,SAAS,MAAA,CAAO,UAAA,IACjB,OAAO,QAAA,CAAS,MAAA,CAAO,eAAe,QAAA,EACtC;AACA,UAAA,MAAA,CAAO,KAAK,CAAA,mCAAA,CAAqC,CAAA;AAAA,QACnD;AACA,QAAA,IAAI,CAAC,KAAA,CAAM,OAAA,CAAQ,QAAA,CAAS,MAAA,CAAO,QAAQ,CAAA,EAAG;AAC5C,UAAA,MAAA,CAAO,KAAK,CAAA,gCAAA,CAAkC,CAAA;AAAA,QAChD;AAAA,MACF;AAGA,MAAA,IAAI,SAAS,IAAA,IAAQ,KAAA,CAAM,OAAA,CAAQ,QAAA,CAAS,IAAI,CAAA,EAAG;AACjD,QAAA,KAAA,MAAW,GAAA,IAAO,SAAS,IAAA,EAAM;AAC/B,UAAA,IAAI,OAAO,GAAA,KAAQ,QAAA,IAAY,CAAC,sBAAA,CAAuB,IAAA,CAAK,GAAG,CAAA,EAAG;AAChE,YAAA,MAAA,CAAO,IAAA;AAAA,cACL,uBAAuB,GAAG,CAAA,+CAAA;AAAA,aAC5B;AAAA,UACF;AAAA,QACF;AAGA,QAAA,MAAM,UAAA,GAAa,IAAI,GAAA,CAAI,QAAA,CAAS,IAAI,CAAA;AACxC,QAAA,IAAI,UAAA,CAAW,IAAA,KAAS,QAAA,CAAS,IAAA,CAAK,MAAA,EAAQ;AAC5C,UAAA,MAAA,CAAO,KAAK,CAAA,oBAAA,CAAsB,CAAA;AAAA,QACpC;AAAA,MACF;AAEA,MAAA,OAAO;AAAA,QACL,OAAA,EAAS,OAAO,MAAA,KAAW,CAAA;AAAA,QAC3B;AAAA,OACF;AAAA,IACF,SAAS,KAAA,EAAY;AACnB,MAAA,OAAO;AAAA,QACL,OAAA,EAAS,KAAA;AAAA,QACT,MAAA,EAAQ,CAAC,CAAA,kBAAA,EAAqB,KAAA,CAAM,OAAO,CAAA,CAAE;AAAA,OAC/C;AAAA,IACF;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKA,OAAO,gBAAgB,QAAA,EAAqB;AAC1C,IAAA,MAAM,MAAA,GAAS,IAAA,CAAK,QAAA,CAAS,QAAQ,CAAA;AACrC,IAAA,IAAI,CAAC,OAAO,OAAA,EAAS;AACnB,MAAA,MAAM,IAAI,KAAA;AAAA,QACR,CAAA;AAAA,EAAsC,MAAA,CAAO,MAAA,CAAO,IAAA,CAAK,IAAI,CAAC,CAAA;AAAA,OAChE;AAAA,IACF;AAAA,EACF;AACF;;;AC7NA,4BAAA,EAAA;ACEA,IAAM,MAAA,GAAS,IAAIlE,aAAAA,CAAO,eAAe,CAAA;AASlC,IAAM,sBAAA,GAAyD;AAAA,EACpE,eAAA,EAAiB,GAAA;AAAA,EACjB,QAAA,EAAU;AACZ;AAOA,IAAI,cAAA;AACJ,IAAI,yBAAA,GAA4B,KAAA;AAahC,eAAsB,YAAA,CACpB,SACA,OAAA,EACsC;AACtC,EAAA,MAAM,SAAA,GAAY,KAAK,GAAA,EAAI;AAE3B,EAAA,qBAAA,CAAsB,uBAAuB,CAAA;AAE7C,EAAA,IAAI;AACF,IAAA,MAAM,MAAA,GAAS,MAAM,OAAA,EAAQ;AAC7B,IAAA,MAAM,WAAA,GAAc,KAAK,GAAA,EAAI;AAC7B,IAAA,MAAM,aAAa,WAAA,GAAc,SAAA;AAEjC,IAAA,qBAAA,CAAsB,qBAAA,EAAuB;AAAA,MAC3C,QAAQ,iBAAA,CAAkB,MAAA,EAAQ,mBAAG,IAAI,OAAA,IAAW,OAAO,CAAA;AAAA,MAC3D,SAAA;AAAA,MACA,WAAA;AAAA,MACA;AAAA,KACD,CAAA;AAED,IAAA,OAAO,EAAE,MAAA,EAAQ,SAAA,EAAW,WAAA,EAAa,UAAA,EAAW;AAAA,EACtD,SAAS,KAAA,EAAO;AACd,IAAA,MAAM,QAAA,GAAW,KAAK,GAAA,EAAI;AAC1B,IAAA,MAAM,aAAa,QAAA,GAAW,SAAA;AAE9B,IAAA,qBAAA,CAAsB,uBAAA,EAAyB;AAAA,MAC7C,KAAA,EAAO,kBAAA,CAAmB,KAAA,EAAO,OAAO,CAAA;AAAA,MACxC,SAAA;AAAA,MACA,QAAA;AAAA,MACA;AAAA,KACD,CAAA;AAED,IAAA,MAAM,KAAA;AAAA,EACR;AACF;AAEA,SAAS,qBAAA,CACP,WACA,OAAA,EACM;AACN,EAAA,MAAM,WAAW,oBAAA,EAAqB;AAEtC,EAAA,IAAI,CAAC,QAAA,EAAU;AACb,IAAA,IAAI,CAAC,yBAAA,EAA2B;AAC9B,MAAA,MAAA,CAAO,MAAM,gDAAgD,CAAA;AAC7D,MAAA,yBAAA,GAA4B,IAAA;AAAA,IAC9B;AACA,IAAA;AAAA,EACF;AAEA,EAAA,IAAI;AACF,IAAA,QAAA,CAAS,WAAW,OAAO,CAAA;AAAA,EAC7B,SAAS,KAAA,EAAO;AACd,IAAA,MAAA,CAAO,KAAK,gCAAA,EAAkC;AAAA,MAC5C,OAAO,KAAA,YAAiB,KAAA,GAAQ,KAAA,CAAM,OAAA,GAAU,OAAO,KAAK,CAAA;AAAA,MAC5D;AAAA,KACD,CAAA;AAAA,EACH;AACF;AAEA,SAAS,oBAAA,GAAmD;AAC1D,EAAA,IAAI,mBAAmB,MAAA,EAAW;AAChC,IAAA,OAAO,cAAA;AAAA,EACT;AAEA,EAAA,MAAM,EAAE,qBAAoB,GAAIwE,oBAAA;AAIhC,EAAA,cAAA,GACE,OAAO,mBAAA,KAAwB,UAAA,GAAa,mBAAA,GAAsB,IAAA;AAEpE,EAAA,OAAO,cAAA;AACT;AAEO,SAAS,iBAAA,CACd,OACA,KAAA,GAAQ,CAAA,EACR,uBAAO,IAAI,OAAA,IACX,OAAA,EACS;AACT,EAAA,MAAM,IAAA,GAAO,EAAE,GAAG,sBAAA,EAAwB,GAAG,OAAA,EAAQ;AAErD,EAAA,IAAI,UAAU,MAAA,EAAW;AACvB,IAAA,OAAO,MAAA;AAAA,EACT;AAEA,EAAA,IAAI,UAAU,IAAA,EAAM;AAClB,IAAA,OAAO,IAAA;AAAA,EACT;AAEA,EAAA,IAAI,OAAO,UAAU,QAAA,EAAU;AAE7B,IAAA,OAAO,KAAA;AAAA,EACT;AAEA,EAAA,IAAI,OAAO,KAAA,KAAU,QAAA,IAAY,OAAO,UAAU,SAAA,EAAW;AAC3D,IAAA,OAAO,KAAA;AAAA,EACT;AAEA,EAAA,IAAI,OAAO,UAAU,QAAA,EAAU;AAC7B,IAAA,OAAO,MAAM,QAAA,EAAS;AAAA,EACxB;AAEA,EAAA,IAAI,iBAAiB,IAAA,EAAM;AACzB,IAAA,OAAO,MAAM,WAAA,EAAY;AAAA,EAC3B;AAEA,EAAA,IAAI,iBAAiB,KAAA,EAAO;AAC1B,IAAA,OAAO,kBAAA,CAAmB,OAAO,OAAO,CAAA;AAAA,EAC1C;AAEA,EAAA,IAAI,KAAA,IAAS,KAAK,QAAA,EAAU;AAC1B,IAAA,OAAO,KAAA,CAAM,OAAA,CAAQ,KAAK,CAAA,GAAI,SAAA,GAAY,UAAA;AAAA,EAC5C;AAEA,EAAA,IAAI,OAAO,UAAU,QAAA,EAAU;AAC7B,IAAA,IAAI,IAAA,CAAK,GAAA,CAAI,KAAe,CAAA,EAAG;AAE7B,MAAA,OAAO,MAAA;AAAA,IACT;AAEA,IAAA,IAAA,CAAK,IAAI,KAAe,CAAA;AAExB,IAAA,IAAI,KAAA,CAAM,OAAA,CAAQ,KAAK,CAAA,EAAG;AAExB,MAAA,OAAO,KAAA,CACJ,GAAA,CAAI,CAAA,IAAA,KAAQ,iBAAA,CAAkB,MAAM,KAAA,GAAQ,CAAA,EAAG,IAAA,EAAM,OAAO,CAAC,CAAA,CAC7D,MAAA,CAAO,CAAA,IAAA,KAAQ,SAAS,MAAS,CAAA;AAAA,IACtC;AAEA,IAAA,IAAI,iBAAiB,GAAA,EAAK;AACxB,MAAA,OAAO,MAAM,IAAA,CAAK,KAAK,CAAA,CACpB,GAAA,CAAI,UAAQ,iBAAA,CAAkB,IAAA,EAAM,KAAA,GAAQ,CAAA,EAAG,MAAM,OAAO,CAAC,EAC7D,MAAA,CAAO,CAAA,IAAA,KAAQ,SAAS,MAAS,CAAA;AAAA,IACtC;AAEA,IAAA,IAAI,iBAAiB,GAAA,EAAK;AACxB,MAAA,MAAM,UAAmC,EAAC;AAC1C,MAAA,KAAA,MAAW,CAAC,GAAA,EAAK,UAAU,CAAA,IAAK,KAAA,CAAM,SAAQ,EAAG;AAC/C,QAAA,MAAM,SAAA,GAAY,iBAAA;AAAA,UAChB,UAAA;AAAA,UACA,KAAA,GAAQ,CAAA;AAAA,UACR,IAAA;AAAA,UACA;AAAA,SACF;AACA,QAAA,IAAI,cAAc,MAAA,EAAW;AAC3B,UAAA,OAAA,CAAQ,MAAA,CAAO,GAAG,CAAC,CAAA,GAAI,SAAA;AAAA,QACzB;AAAA,MACF;AACA,MAAA,OAAO,OAAA;AAAA,IACT;AAEA,IAAA,MAAM,SAAkC,EAAC;AACzC,IAAA,KAAA,MAAW,CAAC,GAAA,EAAK,UAAU,CAAA,IAAK,MAAA,CAAO,OAAA;AAAA,MACrC;AAAA,KACF,EAAG;AACD,MAAA,MAAM,YAAY,iBAAA,CAAkB,UAAA,EAAY,KAAA,GAAQ,CAAA,EAAG,MAAM,OAAO,CAAA;AAExE,MAAA,IAAI,cAAc,MAAA,EAAW;AAC3B,QAAA,MAAA,CAAO,GAAG,CAAA,GAAI,SAAA;AAAA,MAChB;AAAA,IACF;AACA,IAAA,OAAO,MAAA;AAAA,EACT;AAEA,EAAA,OAAO,OAAO,KAAK,CAAA;AACrB;AAEA,SAAS,kBAAA,CACP,OACA,OAAA,EACyB;AACzB,EAAA,MAAM,IAAA,GAAO,EAAE,GAAG,sBAAA,EAAwB,GAAG,OAAA,EAAQ;AAErD,EAAA,IAAI,iBAAiB,KAAA,EAAO;AAC1B,IAAA,OAAO;AAAA,MACL,MAAM,KAAA,CAAM,IAAA;AAAA,MACZ,SAAS,KAAA,CAAM,OAAA;AAAA,MACf,KAAA,EAAO,KAAA,CAAM,KAAA,GACT,iBAAA,CAAkB,KAAA,CAAM,KAAA,EAAO,CAAA,kBAAG,IAAI,OAAA,EAAQ,EAAG,OAAO,CAAA,GACxD;AAAA,KACN;AAAA,EACF;AAEA,EAAA,IAAI,OAAO,UAAU,QAAA,EAAU;AAC7B,IAAA,OAAO;AAAA,MACL,OAAA,EACE,KAAA,CAAM,MAAA,GAAS,IAAA,CAAK,eAAA,GAChB,CAAA,EAAG,KAAA,CAAM,KAAA,CAAM,CAAA,EAAG,IAAA,CAAK,eAAe,CAAC,CAAA,MAAA,CAAA,GACvC;AAAA,KACR;AAAA,EACF;AAEA,EAAA,OAAO;AAAA,IACL,OAAA,EAAS,eAAA;AAAA,IACT,KAAK,iBAAA,CAAkB,KAAA,EAAO,mBAAG,IAAI,OAAA,IAAW,OAAO;AAAA,GACzD;AACF;AClOO,IAAK,eAAA,qBAAAC,gBAAAA,KAAL;AACL,EAAAA,iBAAA,WAAA,CAAA,GAAY,WAAA;AACZ,EAAAA,iBAAA,UAAA,CAAA,GAAW,UAAA;AACX,EAAAA,iBAAA,SAAA,CAAA,GAAU,SAAA;AAHA,EAAA,OAAAA,gBAAAA;AAAA,CAAA,EAAA,eAAA,IAAA,EAAA;AAUCC,6BAAN,wBAAA,CAAyB;AAAA,EAC9B,YAA6B,SAAA,EAA4B;AAA5B,IAAA,IAAA,CAAA,SAAA,GAAA,SAAA;AAAA,EAA6B;AAAA;AAAA;AAAA;AAAA,EAK1D,UAAU,UAAA,EAA2C;AACnD,IAAA,QAAQ,UAAA;AAAY,MAClB,KAAK,WAAA;AACH,QAAA,OAAO,IAAA,CAAK,SAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,MAMd;AACE,QAAA,MAAM,IAAI,KAAA,CAAM,CAAA,+BAAA,EAAkC,UAAU,CAAA,CAAE,CAAA;AAAA;AAClE,EACF;AACF;AAnBaA,0BAAA,GAAN,eAAA,CAAA;AAAA,EADNzE,iBAAAA;AAAW,CAAA,EACCyE,0BAAA,CAAA;ACuCAC,yBAAN,oBAAA,CAAqB;AAAA,EACT,MAAA,GAAS,IAAI3E,aAAAA,CAAO2E,sBAAA,CAAe,IAAI,CAAA;AAAA;AAAA;AAAA;AAAA,EAKxD,iBAAA,GAAuC;AACrC,IAAA,OAAO;AAAA,MACL,QAAA,sBAAc,GAAA,CAAI;AAAA,QAChB;AAAA,UAAA,MAAA;AAAA,UAEE,EAAE,cAAc,EAAC,EAAG,cAAc,IAAA,EAAM,iBAAA,EAAmB,EAAC;AAAE,SAChE;AAAA,QACA;AAAA,UAAA,YAAA;AAAA,UAEE,EAAE,cAAc,EAAC,EAAG,cAAc,IAAA,EAAM,iBAAA,EAAmB,EAAC;AAAE;AAChE,OACD,CAAA;AAAA,MACD,aAAa,EAAC;AAAA,MACd,UAAU,EAAC;AAAA,MACX,aAAa,EAAC;AAAA,MACd,cAAA,EAAgB,IAAA;AAAA,MAChB,gBAAA,EAAkB;AAAA,KACpB;AAAA,EACF;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAYQ,uBAAuB,OAAA,EAAqB;AAClD,IAAA,IAAI,CAAC,OAAA,EAAS;AACZ,MAAA,OAAO,EAAC;AAAA,IACV;AAGA,IAAA,IAAI,KAAA,CAAM,OAAA,CAAQ,OAAO,CAAA,EAAG;AAC1B,MAAA,OAAO,OAAA;AAAA,IACT;AAGA,IAAA,IAAI,OAAO,YAAY,QAAA,EAAU;AAC/B,MAAA,OAAO,OAAA,CAAQ,IAAA,EAAK,GAAI,CAAC,EAAE,IAAA,EAAM,MAAA,EAAQ,IAAA,EAAM,OAAA,EAAS,CAAA,GAAI,EAAC;AAAA,IAC/D;AAGA,IAAA,IAAI,OAAO,YAAY,QAAA,EAAU;AAC/B,MAAA,OAAO,CAAC,OAAO,CAAA;AAAA,IACjB;AAEA,IAAA,OAAO,EAAC;AAAA,EACV;AAAA;AAAA;AAAA;AAAA,EAKQ,SAAA,CACN,OAAA,EACA,KAAA,EACA,SAAA,EACM;AACN,IAAA,IAAI,CAAC,SAAA,EAAW;AAGhB,IAAA,IACE,KAAA,CAAM,SAAS,cAAA,IACf,KAAA,CAAM,SAAS,mBAAA,IACf,KAAA,CAAM,SAAS,kBAAA,EACf;AACA,MAAA,IAAA,CAAK,MAAA,CAAO,KAAA;AAAA,QACV,CAAA,aAAA,EAAgB,KAAA,CAAM,IAAI,CAAA,SAAA,EAAY,OAAO,CAAA,QAAA,EAAW,KAAA,CAAM,MAAA,IAAU,KAAA,CAAM,MAAM,EAAE,CAAA,MAAA,EAAS,KAAA,CAAM,IAAA,EAAM,QAAQ,KAAK,CAAA;AAAA,OAC1H;AAAA,IACF;AAEA,IAAA,SAAA;AAAA,MACE,KAAK,SAAA,CAAU;AAAA,QACb,OAAA;AAAA,QACA;AAAA,OACD;AAAA,KACH;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKQ,oBAAA,CACN,GAAA,EACA,OAAA,EACA,MAAA,EACA,SAAA,EACM;AACN,IAAA,MAAM,KAAA,GAAQ,GAAA,CAAI,QAAA,CAAS,GAAA,CAAI,OAAO,CAAA;AAEtC,IAAA,KAAA,MAAW,SAAS,MAAA,EAAQ;AAC1B,MAAA,IAAI,KAAA,CAAM,IAAA,KAAS,UAAA,IAAc,KAAA,CAAM,SAAS,WAAA,EAAa;AAE3D,QAAA,IAAI,MAAM,YAAA,EAAc;AACtB,UAAA,KAAA,CAAM,YAAA,CAAa,IAAA,CAAK,KAAA,CAAM,YAAY,CAAA;AAAA,QAC5C;AAGA,QAAA,KAAA,CAAM,YAAA,GAAe;AAAA,UACnB,KAAA,EAAO,MAAM,YAAA,CAAa,MAAA;AAAA,UAC1B,IAAA,EAAM,UAAA;AAAA,UACN,MAAM,KAAA,CAAM,IAAA;AAAA,UACZ,IAAI,KAAA,CAAM,EAAA;AAAA,UACV,KAAA,EAAO,MAAM,KAAA,IAAS,EAAA;AAAA,UACtB,MAAA,EAAQ;AAAA,SACV;AAGA,QAAA,KAAA,CAAM,iBAAA,CAAkB,IAAA,CAAK,KAAA,CAAM,YAAY,CAAA;AAG/C,QAAA,IAAA,CAAK,SAAA;AAAA,UACH,OAAA;AAAA,UACA;AAAA,YACE,IAAA,EAAM,cAAA;AAAA,YACN,MAAM,KAAA,CAAM;AAAA,WACd;AAAA,UACA;AAAA,SACF;AAAA,MACF,CAAA,MAAA,IAAW,KAAA,CAAM,IAAA,KAAS,kBAAA,EAAoB;AAE5C,QAAA,IAAI,KAAA,CAAM,YAAA,IAAgB,KAAA,CAAM,YAAA,CAAa,SAAS,UAAA,EAAY;AAChE,UAAA,MAAM,KAAA,GAAQ,MAAM,KAAA,IAAS,EAAA;AAC7B,UAAA,KAAA,CAAM,aAAa,KAAA,IAAS,KAAA;AAG5B,UAAA,IAAA,CAAK,SAAA;AAAA,YACH,OAAA;AAAA,YACA;AAAA,cACE,IAAA,EAAM,kBAAA;AAAA,cACN,MAAA,EAAQ,MAAM,YAAA,CAAa,EAAA;AAAA,cAC3B;AAAA,aACF;AAAA,YACA;AAAA,WACF;AAAA,QACF;AAAA,MACF,CAAA,MAAA,IAAW,KAAA,CAAM,IAAA,KAAS,MAAA,EAAQ;AAChC,QAAA,MAAM,SAAA,GAAY,MAAM,IAAA,IAAQ,EAAA;AAGhC,QAAA,IAAI,KAAA,CAAM,YAAA,IAAgB,KAAA,CAAM,YAAA,CAAa,SAAS,MAAA,EAAQ;AAC5D,UAAA,KAAA,CAAM,YAAA,CAAa,IAAA,GAAA,CAAQ,KAAA,CAAM,YAAA,CAAa,QAAQ,EAAA,IAAM,SAAA;AAAA,QAC9D,CAAA,MAAO;AAEL,UAAA,IAAI,MAAM,YAAA,EAAc;AACtB,YAAA,KAAA,CAAM,YAAA,CAAa,IAAA,CAAK,KAAA,CAAM,YAAY,CAAA;AAAA,UAC5C;AAGA,UAAA,KAAA,CAAM,YAAA,GAAe;AAAA,YACnB,KAAA,EAAO,MAAM,YAAA,CAAa,MAAA;AAAA,YAC1B,IAAA,EAAM,MAAA;AAAA,YACN,IAAA,EAAM;AAAA,WACR;AAAA,QACF;AAGA,QAAA,IAAA,CAAK,SAAA;AAAA,UACH,OAAA;AAAA,UACA;AAAA,YACE,IAAA,EAAM,YAAA;AAAA,YACN,IAAA,EAAM;AAAA,WACR;AAAA,UACA;AAAA,SACF;AAAA,MACF;AAAA,IACF;AAAA,EACF;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAQQ,kBAAkB,QAAA,EAAkC;AAC1D,IAAA,MAAM,QAAyB,EAAC;AAChC,IAAA,IAAI,cAAA,GAAuC,IAAA;AAE3C,IAAA,KAAA,MAAW,OAAO,QAAA,EAAU;AAC1B,MAAA,IAAI,GAAA,CAAI,IAAA,KAAS,UAAA,IAAc,GAAA,CAAI,SAAS,WAAA,EAAa;AAEvD,QAAA,IAAI,cAAA,EAAgB;AAClB,UAAA,KAAA,CAAM,KAAK,cAAc,CAAA;AAAA,QAC3B;AAIA,QAAA,cAAA,GAAiB;AAAA,UACf,KAAA,EAAO,IAAI,KAAA,IAAS,CAAA;AAAA,UACpB,IAAA,EAAM,UAAA;AAAA,UACN,MAAM,GAAA,CAAI,IAAA;AAAA,UACV,IAAI,GAAA,CAAI,EAAA;AAAA,UACR,KAAA,EAAO,EAAA;AAAA;AAAA,UACP,MAAA,EAAQ,IAAI,KAAA,IAAS;AAAA;AAAA,SACvB;AAAA,MACF,CAAA,MAAA,IAAW,GAAA,CAAI,IAAA,KAAS,kBAAA,EAAoB;AAE1C,QAAA,IAAI,cAAA,EAAgB;AAClB,UAAA,cAAA,CAAe,MAAA,GAAA,CACZ,cAAA,CAAe,MAAA,IAAU,EAAA,KAAO,IAAI,KAAA,IAAS,EAAA,CAAA;AAAA,QAClD;AAAA,MACF,CAAA,MAAO;AAEL,QAAA,IAAI,cAAA,EAAgB;AAClB,UAAA,KAAA,CAAM,KAAK,cAAc,CAAA;AACzB,UAAA,cAAA,GAAiB,IAAA;AAAA,QACnB;AAEA,QAAA,KAAA,CAAM,IAAA,CAAK;AAAA,UACT,KAAA,EAAO,IAAI,KAAA,IAAS,CAAA;AAAA,UACpB,MAAM,GAAA,CAAI,IAAA;AAAA,UACV,IAAA,EAAM,IAAI,IAAA,IAAQ,EAAA;AAAA,UAClB,UAAU,GAAA,CAAI;AAAA,SACf,CAAA;AAAA,MACH;AAAA,IACF;AAGA,IAAA,IAAI,cAAA,EAAgB;AAClB,MAAA,KAAA,CAAM,KAAK,cAAc,CAAA;AAAA,IAC3B;AAEA,IAAA,OAAO,KAAA;AAAA,EACT;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOA,YAAA,CACE,GAAA,EACA,KAAA,EACA,SAAA,EACM;AACN,IAAA,IAAA,CAAK,iBAAA,CAAkB,KAAK,KAAK,CAAA;AAGjC,IAAA,IAAI,MAAM,KAAA,KAAU,sBAAA,IAA0B,KAAA,CAAM,IAAA,EAAM,OAAO,OAAA,EAAS;AACxE,MAAA,MAAM,OAAA,GACH,MAAM,QAAA,EAAU,cAAA,IAAA,MAAA;AACnB,MAAA,MAAM,SAAS,IAAA,CAAK,sBAAA,CAAuB,KAAA,CAAM,IAAA,CAAK,MAAM,OAAO,CAAA;AAEnE,MAAA,IAAA,CAAK,oBAAA,CAAqB,GAAA,EAAK,OAAA,EAAS,MAAA,EAAQ,SAAS,CAAA;AACzD,MAAA;AAAA,IACF;AAGA,IAAA,IAAI,KAAA,CAAM,UAAU,eAAA,EAAiB;AACnC,MAAA,IAAA,CAAK,MAAA,CAAO,IAAI,kCAAA,EAA6B;AAAA,QAC3C,UAAU,KAAA,CAAM,IAAA;AAAA,QAChB,KAAA,EAAO,MAAM,IAAA,EAAM,KAAA;AAAA,QACnB,OAAO,KAAA,CAAM,MAAA;AAAA,QACb,UAAU,KAAA,CAAM;AAAA,OACjB,CAAA;AACD,MAAA;AAAA,IACF;AAEA,IAAA,IAAI,KAAA,CAAM,UAAU,aAAA,EAAe;AACjC,MAAA,MAAM,OAAA,GACH,MAAM,QAAA,EAAU,cAAA,IAAA,MAAA;AACnB,MAAA,MAAM,KAAA,GAAQ,GAAA,CAAI,QAAA,CAAS,GAAA,CAAI,OAAO,CAAA;AAEtC,MAAA,IAAI,CAAC,KAAA,EAAO;AAIZ,MAAA,IAAA,CAAK,MAAA,CAAO,KAAA;AAAA,QACV,CAAA,sBAAA,EAAyB,OAAO,CAAA,cAAA,EAAiB,KAAA,CAAM,kBAAkB,MAAM,CAAA,YAAA,EAAe,MAAM,iBAAA,CAAkB,GAAA,CAAI,OAAK,CAAA,CAAE,EAAE,EAAE,IAAA,CAAK,GAAG,CAAC,CAAA,cAAA,EAAiB,KAAA,CAAM,cAAc,EAAE,CAAA;AAAA,OACvL;AACA,MAAA,MAAM,SAAA,GAAY,KAAA,CAAM,iBAAA,CAAkB,KAAA,EAAM;AAEhD,MAAA,IAAI,SAAA,IAAa,SAAA,CAAU,IAAA,KAAS,UAAA,EAAY;AAE9C,QAAA,MAAM,MAAA,GAAS,MAAM,IAAA,EAAM,MAAA;AAC3B,QAAA,MAAM,YAAA,GACJ,OAAO,MAAA,KAAW,QAAA,GAAW,SAAS,IAAA,CAAK,SAAA,CAAU,MAAA,EAAQ,IAAA,EAAM,CAAC,CAAA;AAEtE,QAAA,SAAA,CAAU,MAAA,GAAS,YAAA;AAGnB,QAAA,IAAA,CAAK,SAAA;AAAA,UACH,OAAA;AAAA,UACA;AAAA,YACE,IAAA,EAAM,mBAAA;AAAA,YACN,QAAQ,SAAA,CAAU,EAAA;AAAA,YAClB,KAAA,EAAO;AAAA,WACT;AAAA,UACA;AAAA,SACF;AAEA,QAAA,IAAA,CAAK,MAAA,CAAO,IAAI,iCAAA,EAA8B;AAAA,UAC5C,UAAU,KAAA,CAAM,IAAA;AAAA,UAChB,aAAa,SAAA,CAAU,EAAA;AAAA,UACvB,aAAA,EACE,aAAa,SAAA,CAAU,CAAA,EAAG,GAAG,CAAA,IAC5B,YAAA,CAAa,MAAA,GAAS,GAAA,GAAM,KAAA,GAAQ,EAAA,CAAA;AAAA,UACvC,OAAO,KAAA,CAAM;AAAA,SACd,CAAA;AAAA,MACH,CAAA,MAAO;AACL,QAAA,IAAA,CAAK,MAAA,CAAO,IAAA;AAAA,UACV,mEAAA;AAAA,UACA;AAAA,YACE,UAAU,KAAA,CAAM,IAAA;AAAA,YAChB,OAAO,KAAA,CAAM,MAAA;AAAA,YACb,YAAA,EAAc,MAAM,iBAAA,CAAkB;AAAA;AACxC,SACF;AAAA,MACF;AACA,MAAA;AAAA,IACF;AAEA,IAAA,IAAI,KAAA,CAAM,UAAU,eAAA,EAAiB;AACnC,MAAA,IAAA,CAAK,MAAA,CAAO,MAAM,8BAAA,EAA2B;AAAA,QAC3C,UAAU,KAAA,CAAM,IAAA;AAAA,QAChB,KAAA,EAAO,MAAM,IAAA,EAAM,KAAA;AAAA,QACnB,OAAO,KAAA,CAAM;AAAA,OACd,CAAA;AACD,MAAA;AAAA,IACF;AAGA,IAAA,IAAI,KAAA,CAAM,UAAU,mBAAA,EAAqB;AACvC,MAAA,IAAA,CAAK,MAAA,CAAO,MAAM,2BAAA,EAAwB;AAAA,QACxC,QAAA,EAAU,KAAA,CAAM,QAAA,EAAU,cAAA,IAAkB,KAAA,CAAM,IAAA;AAAA,QAClD,OAAA,EAAS,MAAM,QAAA,EAAU;AAAA,OAC1B,CAAA;AACD,MAAA;AAAA,IACF;AAGA,IAAA,IAAI,KAAA,CAAM,UAAU,cAAA,EAAgB;AAClC,MAAA,MAAM,OAAA,GACH,MAAM,QAAA,EAAU,cAAA,IAAA,MAAA;AAEnB,MAAA,IAAI,OAAA,KAAA,MAAA,aAAgC;AAClC,QAAA,MAAM,MAAA,GAAS,MAAM,IAAA,CAAK,MAAA;AAI1B,QAAA,IAAI,QAAQ,MAAA,EAAQ;AAClB,UAAA,GAAA,CAAI,WAAA,GAAc;AAAA,YAChB,GAAG,GAAA,CAAI,WAAA;AAAA,YACP,GAAI,MAAA,CAAO,MAAA,CAAO,WAAA,IAAe;AAAC,WACpC;AACA,UAAA,GAAA,CAAI,QAAA,GAAW,EAAE,GAAG,GAAA,CAAI,QAAA,EAAU,GAAI,MAAA,CAAO,MAAA,CAAO,QAAA,IAAY,EAAC,EAAG;AAAA,QACtE,CAAA,MAAA,IAAW,QAAQ,UAAA,EAAY;AAC7B,UAAA,GAAA,CAAI,WAAA,GAAc;AAAA,YAChB,GAAG,GAAA,CAAI,WAAA;AAAA,YACP,GAAI,MAAA,CAAO,UAAA,CAAW,WAAA,IAAe;AAAC,WACxC;AACA,UAAA,GAAA,CAAI,QAAA,GAAW;AAAA,YACb,GAAG,GAAA,CAAI,QAAA;AAAA,YACP,GAAI,MAAA,CAAO,UAAA,CAAW,QAAA,IAAY;AAAC,WACrC;AAAA,QACF,CAAA,MAAA,IAAW,MAAA,EAAQ,WAAA,IAAe,MAAA,EAAQ,QAAA,EAAU;AAClD,UAAA,GAAA,CAAI,WAAA,GAAc,CAAC,GAAG,GAAA,CAAI,aAAa,GAAI,MAAA,CAAO,WAAA,IAAe,EAAG,CAAA;AACpE,UAAA,GAAA,CAAI,QAAA,GAAW,EAAE,GAAG,GAAA,CAAI,UAAU,GAAI,MAAA,CAAO,QAAA,IAAY,EAAC,EAAG;AAAA,QAC/D;AAAA,MACF;AAEA,MAAA;AAAA,IACF;AAAA,EACF;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,UAAU,GAAA,EASR;AAEA,IAAA,MAAM,YAA6B,EAAC;AAEpC,IAAA,KAAA,MAAW,CAAC,OAAA,EAAS,KAAK,KAAK,GAAA,CAAI,QAAA,CAAS,SAAQ,EAAG;AAErD,MAAA,IAAI,MAAM,YAAA,EAAc;AACtB,QAAA,KAAA,CAAM,YAAA,CAAa,IAAA,CAAK,KAAA,CAAM,YAAY,CAAA;AAAA,MAC5C;AAGA,MAAA,IAAI,KAAA,CAAM,YAAA,CAAa,MAAA,GAAS,CAAA,EAAG;AACjC,QAAA,SAAA,CAAU,IAAA,CAAK;AAAA,UACb,OAAA;AAAA,UACA,OAAO,KAAA,CAAM,YAAA;AAAA,UACb,UAAA,EAAY;AAAA,SACb,CAAA;AAAA,MACH;AAAA,IACF;AAEA,IAAA,MAAM,SAAA,GAAY,GAAA,CAAI,cAAA,IAAkB,IAAA,CAAK,GAAA,EAAI;AACjD,IAAA,MAAM,WAAA,GAAc,IAAI,gBAAA,IAAoB,SAAA;AAE5C,IAAA,MAAM,KAAA,GACJ,GAAA,CAAI,WAAA,CAAY,MAAA,GAAS,CAAA,GACrB;AAAA,MACE,QAAQ,GAAA,CAAI,WAAA;AAAA,MACZ,SAAA;AAAA,MACA,WAAA;AAAA,MACA,UAAA,EAAY,IAAA,CAAK,GAAA,CAAI,CAAA,EAAG,cAAc,SAAS,CAAA;AAAA,MAC/C,WAAA,EAAa,IAAI,WAAA,CAAY;AAAA,KAC/B,GACA,IAAA;AAGN,IAAA,MAAM,YAAY,SAAA,CAAU,IAAA,CAAK,CAAA,CAAA,KAAK,CAAA,CAAE,YAAY,MAAM,CAAA;AAC1D,IAAA,MAAM,OAAO,SAAA,GACT,SAAA,CAAU,MACP,MAAA,CAAO,CAAA,IAAA,KAAQ,KAAK,IAAA,KAAS,MAAM,CAAA,CACnC,GAAA,CAAI,UAAQ,IAAA,CAAK,IAAA,IAAQ,EAAE,CAAA,CAC3B,IAAA,CAAK,EAAE,CAAA,GACV,EAAA;AAEJ,IAAA,IAAA,CAAK,MAAA,CAAO,IAAI,mDAAA,EAA8C;AAAA,MAC5D,aAAa,SAAA,CAAU,MAAA;AAAA,MACvB,YAAY,SAAA,CAAU,MAAA,CAAO,OAAK,CAAA,CAAE,OAAA,KAAY,MAAM,CAAA,CAAE,MAAA;AAAA,MACxD,kBAAkB,SAAA,CAAU,MAAA,CAAO,OAAK,CAAA,CAAE,OAAA,KAAY,YAAY,CAAA,CAC/D,MAAA;AAAA,MACH,UAAA,EAAY,SAAA,CAAU,MAAA,CAAO,CAAC,GAAA,EAAK,MAAM,GAAA,GAAM,CAAA,CAAE,KAAA,CAAM,MAAA,EAAQ,CAAC,CAAA;AAAA,MAChE,YAAY,IAAA,CAAK;AAAA,KAClB,CAAA;AAED,IAAA,OAAO;AAAA,MACL,OAAA,EAAS;AAAA,QACP,aAAA,EAAe,SAAA,CAAU,MAAA,GAAS,CAAA,GAAI,SAAA,GAAY,MAAA;AAAA,QAClD,aAAa,GAAA,CAAI,WAAA;AAAA,QACjB,UAAU,GAAA,CAAI,QAAA;AAAA,QACd;AAAA;AAAA,OACF;AAAA,MACA;AAAA,KACF;AAAA,EACF;AAAA,EAEQ,iBAAA,CAAkB,KAAwB,KAAA,EAAkB;AAElE,IAAA,MAAM,UAAA,GAAa,IAAA,CAAK,mBAAA,CAAoB,KAAK,CAAA;AAEjD,IAAA,IAAI,CAAC,UAAA,EAAY;AACf,MAAA;AAAA,IACF;AAEA,IAAA,GAAA,CAAI,WAAA,CAAY,KAAK,UAAU,CAAA;AAC/B,IAAA,IAAA,CAAK,MAAA,CAAO,KAAA;AAAA,MACV,CAAA,6BAAA,EAAgC,WAAW,IAAI,CAAA,UAAA,EAAa,WAAW,QAAQ,CAAA,EAAA,EAAK,GAAA,CAAI,WAAA,CAAY,MAAM,CAAA,OAAA;AAAA,KAC5G;AAAA,EACF;AAAA,EAEQ,oBAAoB,KAAA,EAAqC;AAC/D,IAAA,MAAM,IAAA,GAAO,KAAA,EAAO,KAAA,IAAS,KAAA,EAAO,IAAA;AACpC,IAAA,IAAI,CAAC,IAAA,EAAM;AACT,MAAA,OAAO,IAAA;AAAA,IACT;AAEA,IAAA,MAAM,cAAA,GAAiB,OAAO,IAAI,CAAA;AAGlC,IAAA,IAAI,eAAe,QAAA,CAAS,OAAO,CAAA,IAAK,CAAC,OAAO,IAAA,EAAM;AACpD,MAAA,IAAA,CAAK,MAAA,CAAO,MAAM,CAAA,uCAAA,CAAA,EAA2C;AAAA,QAC3D,IAAA,EAAM,cAAA;AAAA,QACN,SAAA,EAAW,OAAO,IAAA,CAAK,KAAA,IAAS,EAAE,CAAA,CAAE,KAAK,IAAI,CAAA;AAAA,QAC7C,WAAA,EAAa,CAAC,CAAC,KAAA,EAAO,QAAA;AAAA,QACtB,YAAA,EAAc,KAAA,EAAO,QAAA,GACjB,MAAA,CAAO,IAAA,CAAK,MAAM,QAAQ,CAAA,CAAE,IAAA,CAAK,IAAI,CAAA,GACrC;AAAA,OACL,CAAA;AAAA,IACH;AAGA,IAAA,IAAI,cAAA,CAAe,WAAA,EAAY,KAAM,cAAA,EAAgB;AACnD,MAAA,OAAO,IAAA;AAAA,IACT;AAEA,IAAA,MAAM,YAAY,KAAA,EAAO,IAAA,EAAM,OAAO,IAAA,IAAQ,KAAA,EAAO,MAAM,KAAA,EAAO,KAAA;AAClE,IAAA,IACE,OAAO,SAAA,KAAc,QAAA,IACrB,SAAA,CAAU,WAAA,OAAkB,cAAA,EAC5B;AACA,MAAA,OAAO,IAAA;AAAA,IACT;AAIA,IAAA,IAAI,mBAAmB,sBAAA,EAAwB;AAC7C,MAAA,OAAO,IAAA;AAAA,IACT;AAEA,IAAA,MAAM,OAAO,KAAA,EAAO,IAAA,GAAO,MAAA,CAAO,KAAA,CAAM,IAAI,CAAA,GAAI,MAAA;AAGhD,IAAA,IACE,SACC,IAAA,CAAK,QAAA,CAAS,cAAc,CAAA,IAC3B,KAAK,QAAA,CAAS,aAAa,CAAA,IAC3B,IAAA,CAAK,SAAS,eAAe,CAAA,IAC7B,IAAA,CAAK,QAAA,CAAS,SAAS,CAAA,CAAA,EACzB;AACA,MAAA,IAAA,CAAK,MAAA,CAAO,KAAA;AAAA,QACV,CAAA,uCAAA,EAA0C,IAAI,CAAA,QAAA,EAAW,cAAc,CAAA,CAAA;AAAA,OACzE;AACA,MAAA,OAAO,IAAA;AAAA,IACT;AAGA,IAAA,IAAI,cAAA,CAAe,QAAA,CAAS,OAAO,CAAA,IAAK,IAAA,EAAM;AAC5C,MAAA,IAAA,CAAK,MAAA,CAAO,KAAA;AAAA,QACV,CAAA,+BAAA,EAAkC,IAAI,CAAA,SAAA,EAAY,cAAc,cAAc,CAAC,CAAC,KAAA,EAAO,QAAA,EAAU,cAAc,CAAA;AAAA,OACjH;AAAA,IACF;AAIA,IAAA,MAAM,gBAAA,GAAmB,OAAO,QAAA,EAAU,cAAA;AAC1C,IAAA,IAAI,CAAC,gBAAA,IAAoB,IAAA,CAAK,UAAA,CAAW,UAAU,CAAA,EAAG;AACpD,MAAA,OAAO,IAAA;AAAA,IACT;AAKA,IAAA,MAAM,QAAA,GAAW,iBAAA,CAAkB,KAAA,EAAO,QAAQ,CAAA;AAGlD,IAAA,MAAM,IAAA,GAAO,iBAAA,CAAkB,KAAA,EAAO,IAAI,CAAA;AAI1C,IAAA,MAAM,eAAA,GACJ,KAAA,EAAO,SAAA,IACP,KAAA,EAAO,IAAA,IACP,KAAA,EAAO,IAAA,EAAM,SAAA,IACb,KAAA,EAAO,IAAA,EAAM,EAAA,IACb,IAAA,CAAK,GAAA,EAAI;AAEX,IAAA,MAAM,SAAA,GAAY,MAAA,CAAO,eAAe,CAAA,IAAK,KAAK,GAAA,EAAI;AAEtD,IAAA,MAAM,aAAA,GACJ,OAAO,KAAA,EAAO,QAAA,EAAU,mBAAmB,QAAA,GACvC,KAAA,CAAM,QAAA,CAAS,cAAA,GACf,OAAQ,QAAA,EAAkB,cAAA,KAAmB,QAAA,GACzC,SAAiB,cAAA,GACnB,MAAA;AAER,IAAA,MAAM,uBAAwB,QAAA,EAAkB,cAAA;AAChD,IAAA,MAAM,mBAAoB,QAAA,EAAkB,SAAA;AAE5C,IAAA,OAAO;AAAA,MACL,IAAA,EAAM,cAAA;AAAA,MACN,IAAA;AAAA,MACA,OAAA,EAAS,aAAA;AAAA,MACT,QAAA,EAAA,CACG,OAAO,oBAAA,KAAyB,QAAA,GAC7B,uBACA,OAAO,gBAAA,KAAqB,QAAA,GAC1B,gBAAA,GACA,IAAA,KAAS,MAAA;AAAA,MACjB,SAAA;AAAA,MACA,QAAA;AAAA,MACA;AAAA,KACF;AAAA,EACF;AACF;AAlkBaA,sBAAA,GAAN,eAAA,CAAA;AAAA,EADN1E,iBAAAA;AAAW,CAAA,EACC0E,sBAAA,CAAA;AChDb,IAAM,uBAAA,GAA0B,EAAA;AAMhC,OAAA,CAAQ,gBAAgB,CAAC,CAAA;AAEZC,0BAAN,qBAAA,CAA8C;AAAA,EAGnD,WAAA,CACmB,gBACY,aAAA,EAC7B;AAFiB,IAAA,IAAA,CAAA,cAAA,GAAA,cAAA;AACY,IAAA,IAAA,CAAA,aAAA,GAAA,aAAA;AAE7B,IAAA,IAAI,CAAC,cAAA,EAAgB;AACnB,MAAA,IAAA,CAAK,MAAA,CAAO,MAAM,mCAAmC,CAAA;AAAA,IACvD;AAAA,EACF;AAAA,EATiB,MAAA,GAAS,IAAI5E,aAAAA,CAAO4E,uBAAA,CAAgB,IAAI,CAAA;AAAA;AAAA;AAAA;AAAA,EAczD,MAAM,WAAA,CACJ,KAAA,EACA,MAAA,EACA,MAAA,EACc;AAEd,IAAA,IAAI,MAAA,EAAQ;AACV,MAAA,MAAA,CAAO,MAAA,GAAS,MAAA;AAAA,IAClB;AAGA,IAAA,MAAM,cAAA,GAAiB,OAAO,cAAA,IAAkB,uBAAA;AAChD,IAAA,MAAM,SAAS,MAAM,KAAA,CAAM,OAAO,MAAA,CAAO,KAAA,IAAS,EAAC,EAAG;AAAA,MACpD,GAAG,MAAA;AAAA,MACH;AAAA,KACD,CAAA;AAGD,IAAA,OAAO,IAAA,CAAK,mBAAmB,MAAM,CAAA;AAAA,EACvC;AAAA,EAEA,MAAM,WAAA,CACJ,KAAA,EACA,MAAA,EACA,WACA,MAAA,EACc;AAEd,IAAA,MAAM,GAAA,GAAM,IAAA,CAAK,cAAA,CAAe,iBAAA,EAAkB;AAClD,IAAA,IAAI,WAAA,GAA4B,IAAA;AAEhC,IAAA,IAAI;AACF,MAAA,IAAI,MAAA,EAAQ;AACV,QAAA,MAAA,CAAO,MAAA,GAAS,MAAA;AAAA,MAClB;AAEA,MAAA,MAAM,cAAA,GAAiB,OAAO,cAAA,IAAkB,uBAAA;AAChD,MAAA,MAAM,cAAc,MAAM,KAAA,CAAM,aAAa,MAAA,CAAO,KAAA,IAAS,EAAC,EAAG;AAAA,QAC/D,GAAG,MAAA;AAAA,QACH,OAAA,EAAS,IAAA;AAAA;AAAA,QACT;AAAA;AAAA,OACD,CAAA;AAGD,MAAA,WAAA,MAAiB,SAAS,WAAA,EAAa;AACrC,QAAA,IAAI;AACF,UAAA,IAAA,CAAK,cAAA,CAAe,YAAA,CAAa,GAAA,EAAK,KAAA,EAAO,SAAS,CAAA;AAAA,QACxD,SAAS,KAAA,EAAO;AACd,UAAA,IAAA,CAAK,MAAA,CAAO,IAAA;AAAA,YACV,CAAA,6CAAA,EAAgD,MAAM,OAAO,CAAA;AAAA,WAC/D;AAAA,QACF;AAAA,MACF;AAAA,IACF,SAAS,KAAA,EAAO;AAEd,MAAA,WAAA,GAAc,iBAAiB,KAAA,GAAQ,KAAA,GAAQ,IAAI,KAAA,CAAM,MAAA,CAAO,KAAK,CAAC,CAAA;AACtE,MAAA,IAAA,CAAK,MAAA,CAAO,KAAA;AAAA,QACV,CAAA,qCAAA,EAAwC,YAAY,OAAO,CAAA;AAAA,OAC7D;AACA,MAAA,IAAA,CAAK,MAAA,CAAO,KAAA,CAAM,CAAA,4BAAA,EAA+B,WAAA,CAAY,KAAK,CAAA,CAAE,CAAA;AAAA,IACtE,CAAA,SAAE;AAGA,MAAA,MAAM,IAAA,CAAK,wBAAA,CAAyB,GAAA,EAAK,MAAA,EAAQ,WAAW,CAAA;AAAA,IAC9D;AAGA,IAAA,MAAM,EAAE,OAAA,EAAS,KAAA,KAAU,IAAA,CAAK,cAAA,CAAe,UAAU,GAAG,CAAA;AAE5D,IAAA,IAAA,CAAK,MAAA,CAAO,MAAM,gDAAA,EAAkD;AAAA,MAClE,UAAA,EAAY,CAAC,CAAC,OAAA;AAAA,MACd,UAAA,EAAY,CAAC,CAAC,MAAA,CAAO,YAAA,EAAc,OAAA;AAAA,MACnC,QAAA,EAAU,CAAC,CAAC,KAAA;AAAA,MACZ,WAAA,EAAa,KAAA,EAAO,MAAA,EAAQ,MAAA,IAAU,CAAA;AAAA,MACtC,QAAA,EAAU,CAAC,CAAC;AAAA,KACb,CAAA;AAGD,IAAA,IAAI,WAAA,EAAa;AACf,MAAA,MAAM,WAAA;AAAA,IACR;AAEA,IAAA,OAAO,OAAA;AAAA,EACT;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,MAAc,wBAAA,CACZ,GAAA,EACA,MAAA,EACA,KAAA,EACe;AACf,IAAA,IAAI;AACF,MAAA,MAAM,EAAE,KAAA,EAAM,GAAI,IAAA,CAAK,cAAA,CAAe,UAAU,GAAG,CAAA;AAEnD,MAAA,IAAI,SAAS,KAAA,CAAM,MAAA,CAAO,SAAS,CAAA,IAAK,MAAA,CAAO,cAAc,OAAA,EAAS;AACpE,QAAA,MAAM,OAAA,GAAU,OAAO,YAAA,CAAa,OAAA;AAEpC,QAAA,IAAA,CAAK,MAAA,CAAO,MAAM,4CAAA,EAA8C;AAAA,UAC9D,WAAW,OAAA,CAAQ,SAAA;AAAA,UACnB,aAAa,KAAA,CAAM,WAAA;AAAA,UACnB,iBAAA,EAAmB,MAAM,MAAA,CAAO,MAAA;AAAA,UAChC,cAAA,EAAgB,KAAA,CAAM,MAAA,CAAO,CAAC,CAAA,EAAG,IAAA;AAAA,UACjC,QAAA,EAAU,CAAC,CAAC,KAAA;AAAA,UACZ,cAAc,KAAA,EAAO;AAAA,SACtB,CAAA;AAGD,QAAA,MAAM,KAAK,oBAAA,CAAqB;AAAA,UAC9B,SAAA,EAAW,QAAQ,SAAA,IAAa,SAAA;AAAA,UAChC,QAAA,EAAU,QAAQ,QAAA,IAAY,SAAA;AAAA,UAC9B,MAAA,EAAQ,QAAQ,MAAA,IAAU,SAAA;AAAA,UAC1B,OAAA,EAAS,QAAQ,OAAA,IAAW,SAAA;AAAA,UAC5B,SAAA,EAAW,QAAQ,SAAA,IAAa,SAAA;AAAA,UAChC,QAAQ,KAAA,CAAM,MAAA;AAAA,UACd,aAAa,KAAA,CAAM,WAAA;AAAA,UACnB,WAAW,KAAA,CAAM,SAAA;AAAA,UACjB,WAAA,EAAa,KAAA,CAAM,WAAA,IAAe,IAAA,CAAK,GAAA,EAAI;AAAA,UAC3C,YAAY,KAAA,CAAM,UAAA,IAAc,IAAA,CAAK,GAAA,KAAQ,KAAA,CAAM,SAAA;AAAA,UACnD,MAAA,EAAQ,QAAQ,OAAA,GAAU,SAAA;AAAA,UAC1B,KAAA,EAAO,QACH,EAAE,OAAA,EAAS,MAAM,OAAA,EAAS,IAAA,EAAM,KAAA,CAAM,IAAA,EAAK,GAC3C,KAAA;AAAA,SACL,CAAA;AAAA,MACH,CAAA,MAAO;AACL,QAAA,IAAA,CAAK,MAAA,CAAO,MAAM,kCAAA,EAAoC;AAAA,UACpD,QAAA,EAAU,CAAC,CAAC,KAAA;AAAA,UACZ,WAAA,EAAa,KAAA,EAAO,MAAA,EAAQ,MAAA,IAAU,CAAA;AAAA,UACtC,UAAA,EAAY,CAAC,CAAC,MAAA,CAAO,YAAA,EAAc,OAAA;AAAA,UACnC,WAAA,EAAa,MAAA,CAAO,YAAA,EAAc,OAAA,GAC9B,MAAA,CAAO,KAAK,MAAA,CAAO,YAAA,CAAa,OAAO,CAAA,GACvC,EAAC;AAAA,UACL,QAAA,EAAU,CAAC,CAAC;AAAA,SACb,CAAA;AAAA,MACH;AAAA,IACF,SAAS,YAAA,EAAc;AAErB,MAAA,IAAA,CAAK,MAAA,CAAO,KAAA;AAAA,QACV,uDAAA;AAAA,QACA;AAAA,UACE,OACE,YAAA,YAAwB,KAAA,GACpB,YAAA,CAAa,OAAA,GACb,OAAO,YAAY,CAAA;AAAA,UACzB,eAAe,KAAA,EAAO;AAAA;AACxB,OACF;AAAA,IACF;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKA,MAAc,mBAAmB,OAAA,EAOf;AAChB,IAAA,IAAI;AACF,MAAA,MAAM,UAAA,GACJ,IAAA,CAAK,aAAA,EAAe,GAAA,CAAY,SAAS,CAAA,IAAK,uBAAA;AAChD,MAAA,MAAM,aAAA,GACJ,IAAA,CAAK,aAAA,EAAe,GAAA,CAAY,oBAAoB,CAAA;AAEtD,MAAA,IAAI,CAAC,aAAA,EAAe;AAClB,QAAA,IAAA,CAAK,MAAA,CAAO,IAAA;AAAA,UACV;AAAA,SACF;AACA,QAAA;AAAA,MACF;AAEA,MAAA,MAAM,UAAA,GAAa,GAAG,UAAU,CAAA,uBAAA,CAAA;AAEhC,MAAA,IAAA,CAAK,MAAA,CAAO,MAAM,8CAAA,EAAgD;AAAA,QAChE,GAAA,EAAK,UAAA;AAAA,QACL,WAAW,OAAA,CAAQ,SAAA;AAAA,QACnB,eAAA,EAAiB,OAAA,CAAQ,OAAA,CAAQ,UAAA,CAAW;AAAA,OAC7C,CAAA;AAED,MAAA,MAAM,QAAA,GAAW,MAAM,KAAA,CAAM,UAAA,EAAY;AAAA,QACvC,MAAA,EAAQ,MAAA;AAAA,QACR,OAAA,EAAS;AAAA,UACP,cAAA,EAAgB,kBAAA;AAAA,UAChB,kBAAA,EAAoB;AAAA,SACtB;AAAA,QACA,IAAA,EAAM,IAAA,CAAK,SAAA,CAAU,OAAO;AAAA,OAC7B,CAAA;AAED,MAAA,IAAI,CAAC,SAAS,EAAA,EAAI;AAChB,QAAA,MAAM,IAAI,KAAA;AAAA,UACR,CAAA,2BAAA,EAA8B,QAAA,CAAS,MAAM,CAAA,EAAA,EAAK,SAAS,UAAU,CAAA;AAAA,SACvE;AAAA,MACF;AAEA,MAAA,IAAA,CAAK,MAAA,CAAO,IAAI,0CAAA,EAAuC;AAAA,QACrD,WAAW,OAAA,CAAQ,SAAA;AAAA,QACnB,eAAA,EAAiB,OAAA,CAAQ,OAAA,CAAQ,UAAA,CAAW;AAAA,OAC7C,CAAA;AAAA,IACH,SAAS,KAAA,EAAO;AACd,MAAA,IAAA,CAAK,MAAA,CAAO,MAAM,kDAAA,EAAoD;AAAA,QACpE,OAAO,KAAA,CAAM,OAAA;AAAA,QACb,WAAW,OAAA,CAAQ;AAAA,OACpB,CAAA;AAAA,IAEH;AAAA,EACF;AAAA,EAEA,MAAc,qBAAqB,OAAA,EAajB;AAChB,IAAA,IAAI;AACF,MAAA,MAAM,UAAA,GACJ,IAAA,CAAK,aAAA,EAAe,GAAA,CAAY,SAAS,CAAA,IAAK,uBAAA;AAChD,MAAA,MAAM,aAAA,GACJ,IAAA,CAAK,aAAA,EAAe,GAAA,CAAY,oBAAoB,CAAA;AAEtD,MAAA,IAAI,CAAC,aAAA,EAAe;AAClB,QAAA,IAAA,CAAK,MAAA,CAAO,IAAA;AAAA,UACV;AAAA,SACF;AACA,QAAA;AAAA,MACF;AAEA,MAAA,MAAM,UAAA,GAAa,GAAG,UAAU,CAAA,kCAAA,CAAA;AAGhC,MAAA,MAAM,YAAA,GAAe;AAAA,QACnB,WAAW,OAAA,CAAQ,SAAA;AAAA,QACnB,UAAU,OAAA,CAAQ,QAAA;AAAA,QAClB,QAAQ,OAAA,CAAQ,MAAA;AAAA,QAChB,SAAS,OAAA,CAAQ,OAAA;AAAA,QACjB,WAAW,OAAA,CAAQ,SAAA;AAAA,QACnB,aAAa,OAAA,CAAQ,WAAA;AAAA,QACrB,WAAW,OAAA,CAAQ,SAAA;AAAA,QACnB,aAAa,OAAA,CAAQ,WAAA;AAAA,QACrB,YAAY,OAAA,CAAQ,UAAA;AAAA,QACpB,MAAA,EAAQ,QAAQ,MAAA,IAAU,SAAA;AAAA,QAC1B,OAAO,OAAA,CAAQ,KAAA;AAAA,QACf,MAAA,EAAQ,OAAA,CAAQ,MAAA,CAAO,GAAA,CAAI,CAAA,KAAA,MAAU;AAAA,UACnC,SAAA,EAAW,KAAA,CAAM,SAAA,GACb,IAAI,IAAA,CAAK,KAAA,CAAM,SAAS,CAAA,CAAE,WAAA,EAAY,GAAA,iBACtC,IAAI,IAAA,IAAO,WAAA,EAAY;AAAA,UAC3B,IAAA,EAAM;AAAA,YACJ,WAAW,OAAA,CAAQ,SAAA;AAAA,YACnB,UAAU,OAAA,CAAQ,QAAA;AAAA,YAClB,QAAQ,OAAA,CAAQ,MAAA;AAAA,YAChB,SAAS,OAAA,CAAQ,OAAA;AAAA,YACjB,WAAW,OAAA,CAAQ,SAAA;AAAA,YACnB,MAAM,KAAA,CAAM,IAAA;AAAA,YACZ,UAAU,KAAA,CAAM,QAAA;AAAA,YAChB,SAAS,KAAA,CAAM;AAAA,WACjB;AAAA,UACA;AAAA,SACF,CAAE;AAAA,OACJ;AAEA,MAAA,IAAA,CAAK,MAAA,CAAO,MAAM,+CAAA,EAAiD;AAAA,QACjE,GAAA,EAAK,UAAA;AAAA,QACL,WAAW,OAAA,CAAQ,SAAA;AAAA,QACnB,WAAA,EAAa,aAAa,MAAA,CAAO;AAAA,OAClC,CAAA;AAED,MAAA,MAAM,QAAA,GAAW,MAAM,KAAA,CAAM,UAAA,EAAY;AAAA,QACvC,MAAA,EAAQ,MAAA;AAAA,QACR,OAAA,EAAS;AAAA,UACP,cAAA,EAAgB,kBAAA;AAAA,UAChB,kBAAA,EAAoB;AAAA,SACtB;AAAA,QACA,IAAA,EAAM,IAAA,CAAK,SAAA,CAAU,YAAY;AAAA,OAClC,CAAA;AAED,MAAA,IAAI,CAAC,SAAS,EAAA,EAAI;AAChB,QAAA,MAAM,YAAA,GAAe,MAAM,QAAA,CAAS,IAAA,EAAK;AACzC,QAAA,MAAM,IAAI,KAAA;AAAA,UACR,CAAA,iCAAA,EAAoC,QAAA,CAAS,MAAM,CAAA,EAAA,EAAK,YAAY,CAAA;AAAA,SACtE;AAAA,MACF;AAEA,MAAA,MAAM,YAAA,GAAe,MAAM,QAAA,CAAS,IAAA,EAAK;AAEzC,MAAA,IAAA,CAAK,MAAA,CAAO,IAAI,6CAAA,EAA0C;AAAA,QACxD,WAAW,OAAA,CAAQ,SAAA;AAAA,QACnB,IAAA,EAAM,aAAa,MAAA,CAAO,MAAA;AAAA,QAC1B,QAAQ,YAAA,CAAa;AAAA,OACtB,CAAA;AAAA,IACH,SAAS,KAAA,EAAO;AACd,MAAA,IAAA,CAAK,MAAA,CAAO,MAAM,mDAAA,EAAqD;AAAA,QACrE,OAAO,KAAA,YAAiB,KAAA,GAAQ,KAAA,CAAM,OAAA,GAAU,OAAO,KAAK,CAAA;AAAA,QAC5D,WAAW,OAAA,CAAQ,SAAA;AAAA,QACnB,WAAA,EAAa,QAAQ,MAAA,CAAO;AAAA,OAC7B,CAAA;AAAA,IAEH;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKQ,mBAAmB,MAAA,EAAkB;AAC3C,IAAA,OAAO;AAAA,MACL,MAAM,MAAA,CAAO,IAAA;AAAA,MACb,aAAa,MAAA,CAAO,WAAA;AAAA,MACpB,QAAA,EAAU;AAAA,QACR,GAAG,MAAA,CAAO,QAAA;AAAA,QACV,cAAc,MAAA,EAAQ;AAAA;AACxB,KACF;AAAA,EACF;AACF;AAnVaA,uBAAA,GAAN,eAAA,CAAA;AAAA,EADN3E,iBAAAA,EAAW;AAAA,EAMP,mBAAAI,eAAAA,EAAS;AAAA,CAAA,EALDuE,uBAAA,CAAA;;;ACCb,6BAAA,EAAA;AAmBA,aAAA,EAAA;AAmBA,SAAS,iBAAA,CACP,MAAA,EACA,qBAAA,EACA,SAAA,EACA,kBACA,gBAAA,EACA;AAEA,EAAA,MAAM,YAAY,CAAA,EAAG,MAAA,CAAO,cAAc,OAAA,CAAQ,KAAA,EAAO,EAAE,CAAC,CAAA,aAAA,CAAA;AAAA,EAE5D,MAAM,sBAAsB,oBAAA,CAA0B;AAAA,IAC3C,OAAA,GAAU,QAAA;AAAA;AAAA;AAAA,IAGnB,WAAA,GAAc;AACZ,MAAA,KAAA,EAAM;AAEN,MAAC,KAAa,gBAAA,GAAmB,gBAAA;AACjC,MAAC,KAAa,gBAAA,GAAmB,gBAAA;AAAA,IACnC;AAAA;AAAA,IAGA,IAAI,SAAA,GAAoB;AACtB,MAAA,OAAO,MAAA,CAAO,aAAA;AAAA,IAChB;AAAA,IAEA,MAAM,WAAW,OAAA,EAA6C;AAC5D,MAAA,MAAM,SAAA,GAAY,QAAQ,aAAA,EAAe,SAAA;AACzC,MAAA,IAAI,CAAC,SAAA,EAAW;AACd,QAAA,MAAM,IAAI,MAAM,gDAAgD,CAAA;AAAA,MAClE;AAEA,MAAA,MAAM,UAAA,GAAa,MAAM,qBAAA,CAAsB,cAAA,CAAe,SAAA,EAAW;AAAA,QACvE,MAAA,EAAQ;AAAA,OACT,CAAA;AAGD,MAAA,IAAI;AACF,QAAA,MAAM,gBAAA,GAAmB,SAAA,CAAU,GAAA,CAAI,UAAA,CAAW,YAAA,EAAc;AAAA,UAC9D,MAAA,EAAQ;AAAA,SACT,CAAA;AACD,QAAA,OAAO,gBAAA,CAAiB,WAAW,OAAO,CAAA;AAAA,MAC5C,SAAS,KAAA,EAAO;AAEd,QAAA,MAAM,gBAAA,GAAmB,MAAM,SAAA,CAAU,MAAA;AAAA,UACvC,UAAA,CAAW;AAAA,SACb;AACA,QAAA,OAAO,gBAAA,CAAiB,WAAW,OAAO,CAAA;AAAA,MAC5C;AAAA,IACF;AAAA,IAEA,MAAM,cAAc,OAAA,EAA6C;AAC/D,MAAA,MAAM,SAAA,GAAY,QAAQ,aAAA,EAAe,SAAA;AACzC,MAAA,IAAI,CAAC,SAAA,EAAW;AACd,QAAA,MAAM,IAAI,MAAM,gDAAgD,CAAA;AAAA,MAClE;AAEA,MAAA,MAAM,UAAA,GAAa,MAAM,qBAAA,CAAsB,cAAA,CAAe,SAAA,EAAW;AAAA,QACvE,MAAA,EAAQ;AAAA,OACT,CAAA;AAGD,MAAA,IAAI,gBAAA;AACJ,MAAA,IAAI;AACF,QAAA,gBAAA,GAAmB,SAAA,CAAU,GAAA,CAAI,UAAA,CAAW,YAAA,EAAc;AAAA,UACxD,MAAA,EAAQ;AAAA,SACT,CAAA;AAAA,MACH,SAAS,KAAA,EAAO;AACd,QAAA,gBAAA,GAAmB,MAAM,SAAA,CAAU,MAAA,CAAO,UAAA,CAAW,YAAY,CAAA;AAAA,MACnE;AAEA,MAAA,MAAM,cAAA,GAAiB;AAAA,QACrB,GAAG,OAAA;AAAA,QACH,aAAA,EAAe;AAAA,UACb,GAAG,OAAA,CAAQ,aAAA;AAAA,UACX,WAAW,UAAA,CAAW;AAAA;AACxB,OACF;AAEA,MAAA,OAAO,gBAAA,CAAiB,cAAc,cAAc,CAAA;AAAA,IACtD;AAAA;AAIF,EAAA,MAAA,CAAO,eAAe,aAAA,EAAe,MAAA,EAAQ,EAAE,KAAA,EAAO,WAAW,CAAA;AAEjE,EAAA,OAAO,aAAA;AACT;AAGaC,+BAAN,0BAAA,CAA2B;AAAA,EAChC,OAAO,QAAQ,OAAA,EAAqD;AAClE,IAAA,MAAM,SAAA,GAAwB;AAAA;AAAA,MAE5BC,oBAAA;AAAA;AAAA,MAEA;AAAA,QACE,OAAA,EAASH,sBAAA;AAAA,QACT,UAAA,EAAY,MAAM,IAAIA,sBAAA;AAAe,OACvC;AAAA;AAAA,MAEA;AAAA,QACE,OAAA,EAASC,uBAAA;AAAA,QACT,YAAY,CAAC,cAAA,KACX,IAAIA,uBAAA,CAAgB,gBAAgB,MAAS,CAAA;AAAA,QAC/C,MAAA,EAAQ,CAACD,sBAAc;AAAA,OACzB;AAAA,MACAvD,8BAAA;AAAA,MACAsD,0BAAA;AAAA,MACApD,6BAAA;AAAA,MACAiC,6BAAA;AAAA;AAAA,MAEA;AAAA,QACE,OAAA,EAAS,cAAA;AAAA,QACT,YAAY,MAAM;AAChB,UAAA,MAAM,KAAA,GAAQ,UAAQ,SAAS,CAAA;AAC/B,UAAA,OAAO,IAAI,KAAA,CAAM,OAAA,CAAQ,GAAA,CAAI,aAAa,oBAAoB,CAAA;AAAA,QAChE;AAAA,OACF;AAAA,MACA;AAAA,QACE,OAAA,EAAS,qBAAA;AAAA,QACT,QAAA,EAAU,IAAInB,mBAAAA;AAAS,OACzB;AAAA,MACA;AAAA,QACE,OAAA,EAAS,aAAA;AAAA,QACT,UAAA,EAAY,CAAC,KAAA,KAAe,IAAI,cAAc,KAAK,CAAA;AAAA,QACnD,MAAA,EAAQ,CAAC,cAAc;AAAA,OACzB;AAAA,MACA;AAAA,QACE,OAAA,EAAS,gBAAA;AAAA,QACT,QAAA,EAAU;AAAA,OACZ;AAAA,MACArC,wBAAA;AAAA,MACAI,mCAAA;AAAA,MACA;AAAA,QACE,OAAA,EAAS0B,mBAAA;AAAA,QACT,QAAA,EAAUA;AAAA,OACZ;AAAA,MACA;AAAA,QACE,OAAA,EAASG,uBAAA;AAAA,QACT,QAAA,EAAUA;AAAA,OACZ;AAAA,MACA;AAAA,QACE,OAAA,EAASG,uBAAA;AAAA,QACT,UAAA,EAAY,CAAC,QAAA,KAAuB,IAAIA,wBAAgB,QAAQ,CAAA;AAAA,QAChE,MAAA,EAAQ,CAAC,qBAAqB;AAAA,OAChC;AAAA,MACA;AAAA,QACE,OAAA,EAASM,2BAAA;AAAA,QACT,UAAA,EAAY,CAAC,KAAA,KAAe,IAAIA,4BAAoB,KAAK,CAAA;AAAA,QACzD,MAAA,EAAQ,CAAC,cAAc;AAAA,OACzB;AAAA,MACA;AAAA,QACE,OAAA,EAAShB,0BAAA;AAAA,QACT,UAAA,EAAY,CAAC,KAAA,KAAe,IAAIA,2BAAmB,KAAK,CAAA;AAAA,QACxD,MAAA,EAAQ,CAAC,cAAc;AAAA,OACzB;AAAA,MACA;AAAA,QACE,OAAA,EAASkB,4BAAA;AAAA,QACT,QAAA,EAAUA;AAAA,OACZ;AAAA,MACA;AAAA,QACE,OAAA,EAASC,uBAAA;AAAA,QACT,QAAA,EAAUA;AAAA,OACZ;AAAA,MACA;AAAA,QACE,OAAA,EAASF,4BAAA;AAAA,QACT,YAAY,CAAC,QAAA,EAAgC,QAC3C,IAAIA,4BAAA,CAAqB,UAAU,GAAG,CAAA;AAAA,QACxC,MAAA,EAAQ,CAACC,4BAAA,EAAsBC,uBAAe;AAAA,OAChD;AAAA,MACA;AAAA,QACE,OAAA,EAASjB,2BAAA;AAAA,QACT,UAAA,EAAY,CACV,QAAA,EACA,KAAA,EACA,GAAA,EACA,SACA,OAAA,EACA,WAAA,EACA,kBAAA,EACA,YAAA,KAEA,IAAIA,2BAAA;AAAA,UACF,QAAA;AAAA,UACA,KAAA;AAAA,UACA,GAAA;AAAA,UACA,OAAA;AAAA,UACA,OAAA;AAAA,UACA,WAAA;AAAA,UACA,kBAAA;AAAA,UACA;AAAA,SACF;AAAA,QACF,MAAA,EAAQ;AAAA,UACN,gBAAA;AAAA,UACA,aAAA;AAAA,UACAE,mBAAA;AAAA,UACAG,uBAAA;AAAA,UACAG,uBAAA;AAAA,UACAM,2BAAA;AAAA,UACAhB,0BAAA;AAAA,UACAiB;AAAA;AACF,OACF;AAAA,MACA;AAAA,QACE,OAAA,EAAS,wBAAA;AAAA,QACT,YAAY,CAAC,KAAA,EAAsB,WACjC,IAAI,wBAAA,CAAyB,OAAO,MAAM,CAAA;AAAA,QAC5C,MAAA,EAAQ,CAAC,aAAA,EAAef,2BAAmB;AAAA,OAC7C;AAAA,MACA;AAAA,QACE,OAAA,EAASkB,0BAAA;AAAA,QACT,YAAY,CAAC,KAAA,EAAsB,QACjC,IAAIA,0BAAA,CAAmB,OAAO,GAAG,CAAA;AAAA,QACnC,MAAA,EAAQ,CAAC,aAAA,EAAehB,mBAAW;AAAA,OACrC;AAAA,MACA;AAAA,QACE,OAAA,EAAS,+BAAA;AAAA,QACT,UAAA,EAAY,CAAC,QAAA,KAA+B;AAC1C,UAAA,8BAAA,CAA+B,QAAQ,CAAA;AAAA,QACzC,CAAA;AAAA,QACA,MAAA,EAAQ,CAAC,gBAAgB;AAAA,OAC3B;AAAA,MACA;AAAA,QACE,OAAA,EAAS,cAAA;AAAA,QACT,UAAA,EAAY,CAAC,eAAA,KAAqC,eAAA;AAAA,QAClD,MAAA,EAAQ,CAAC+C,uBAAe;AAAA,OAC1B;AAAA,MACA;AAAA,QACE,OAAA,EAAS,gBAAA;AAAA,QACT,UAAA,EAAY,CAAC,QAAA,KAAqC;AAChD,UAAA,OAAO,SAAS,WAAA,EAAY;AAAA,QAC9B,CAAA;AAAA,QACA,MAAA,EAAQ,CAACxD,8BAAsB;AAAA,OACjC;AAAA,MACA;AAAA,QACE,OAAA,EAAS,eAAA;AAAA,QACT,WAAA,EAAamC;AAAA,OACf;AAAA,MACA;AAAA,QACE,OAAA,EAAS,oBAAA;AAAA,QACT,QAAA,EAAU,OAAA,CAAQ,UAAA,IAAc;AAAC,OACnC;AAAA;AAAA,MAEA;AAAA,QACE,OAAA,EAAS,wBAAA;AAAA,QACT,YAAY,CACV,eAAA,EACA,uBACA,OAAA,EACA,gBAAA,EACA,WACA,gBAAA,KACG;AACH,UAAA,OAAA,CAAQ,GAAA;AAAA,YACN,wDAAA;AAAA,YACA,SAAS,MAAA,IAAU;AAAA,WACrB;AACA,UAAA,OAAA,CAAQ,GAAA,CAAI,gCAAA,EAA2B,CAAC,CAAC,SAAS,CAAA;AAClD,UAAA,OAAA,CAAQ,GAAA,CAAI,sCAAA,EAAiC,CAAC,CAAC,eAAe,CAAA;AAG9D,UAAA,OAAA,CAAQ,OAAA;AAAA,YAAQ,CAAA,MAAA,KACd,qBAAA,CAAsB,kBAAA,CAAmB,MAAM;AAAA,WACjD;AAGA,UAAA,OAAA,CAAQ,QAAQ,CAAA,MAAA,KAAU;AACxB,YAAA,IAAI,SAAA,EAAW;AACb,cAAA,MAAM,kBAAA,GAAqB,iBAAA;AAAA,gBACzB,MAAA;AAAA,gBACA,qBAAA;AAAA,gBACA,SAAA;AAAA,gBACA,gBAAA;AAAA,gBACA;AAAA,eACF;AACA,cAAA,MAAM,aAAA,GAAgB,IAAI,kBAAA,EAAmB;AAC7C,cAAA,OAAA,CAAQ,GAAA;AAAA,gBACN,yCAAA;AAAA,gBACA,MAAA,CAAO;AAAA,eACT;AACA,cAAA,eAAA,CAAgB,gBAAgB,aAAa,CAAA;AAAA,YAC/C,CAAA,MAAO;AAAA,cAEL,MAAM,4BAA4B,oBAAA,CAA0B;AAAA,gBACjD,OAAA,GAAU,QAAA;AAAA,gBAEnB,WAAA,GAAc;AACZ,kBAAA,KAAA,EAAM;AAEN,kBAAC,KAAa,gBAAA,GAAmB,gBAAA;AACjC,kBAAC,KAAa,gBAAA,GAAmB,gBAAA;AAAA,gBACnC;AAAA,gBAEA,IAAI,SAAA,GAAoB;AACtB,kBAAA,OAAO,MAAA,CAAO,aAAA;AAAA,gBAChB;AAAA,gBAEA,MAAM,WAAW,OAAA,EAA4B;AAC3C,kBAAA,MAAM,IAAI,KAAA;AAAA,oBACR;AAAA,mBACF;AAAA,gBACF;AAAA,gBAEA,MAAM,cAAc,OAAA,EAA4B;AAC9C,kBAAA,MAAM,IAAI,KAAA;AAAA,oBACR;AAAA,mBACF;AAAA,gBACF;AAAA;AAGF,cAAA,MAAM,YAAA,GAAe,IAAI,mBAAA,EAAoB;AAC7C,cAAA,OAAA,CAAQ,GAAA;AAAA,gBACN,wCAAA;AAAA,gBACA,MAAA,CAAO,aAAA;AAAA,gBACP;AAAA,eACF;AACA,cAAA,eAAA,CAAgB,gBAAgB,YAAY,CAAA;AAAA,YAC9C;AAAA,UACF,CAAC,CAAA;AAED,UAAA,OAAO,IAAA;AAAA,QACT,CAAA;AAAA,QACA,MAAA,EAAQ;AAAA,UACNnC,8BAAA;AAAA,UACAE,6BAAA;AAAA,UACA,oBAAA;AAAA,UACA,gBAAA;AAAA,UACAyD,cAAA;AAAA,UACAhF;AAAA;AACF;AACF,KACF;AAEA,IAAA,OAAO;AAAA,MACL,MAAA,EAAQ,IAAA;AAAA,MACR,MAAA,EAAQ8E,4BAAA;AAAA,MACR,OAAA,EAAS,CAACG,mBAAA,CAAa,OAAA,CAAQ,EAAE,QAAA,EAAU,IAAA,EAAM,CAAA,EAAGC,oBAAe,CAAA;AAAA,MACnE,WAAA,EAAa,CAACf,uBAAA,EAAiBnB,0BAAA,EAAoBzC,4BAAoB,CAAA;AAAA,MACvE,SAAA;AAAA,MACA,OAAA,EAAS;AAAA,QACP,eAAA;AAAA,QACA,cAAA;AAAA,QACAiD,6BAAA;AAAA,QACAnC,8BAAA;AAAA,QACAE,6BAAA;AAAA,QACA,wBAAA;AAAA,QACA,aAAA;AAAA,QACA,gBAAA;AAAA,QACAvB,wBAAA;AAAA,QACAI;AAAA;AACF,KACF;AAAA,EACF;AACF;AAxQa0E,4BAAA,GAAN,eAAA,CAAA;AAAA,EADNpB,aAAA,CAAO,EAAE;AAAA,CAAA,EACGoB,4BAAA,CAAA;;;AC5Ib,aAAA,EAAA;ACwBO,IAAM,YAAA,GAAN,MAAM,aAAA,CAAa;AAAA,EACP,MAAA,GAAS,IAAI7E,aAAAA,CAAO,aAAA,CAAa,IAAI,CAAA;AAAA,EACrC,aAAA;AAAA,EAEjB,WAAA,CAAY,gBAAwB,uBAAA,EAAyB;AAC3D,IAAA,IAAA,CAAK,aAAA,GAAgB,aAAA;AACrB,IAAA,IAAA,CAAK,MAAA,CAAO,GAAA;AAAA,MACV,CAAA,kFAAA;AAAA,KACF;AAAA,EACF;AAAA;AAAA;AAAA;AAAA;AAAA,EAMQ,gBAAgB,UAAA,EAA+B;AACrD,IAAA,IAAI,CAAC,UAAA,IAAc,OAAO,UAAA,KAAe,QAAA,EAAU;AACjD,MAAA,OAAOkF,MAAE,GAAA,EAAI;AAAA,IACf;AAEA,IAAA,IAAI;AAEF,MAAA,IAAI,UAAA,CAAW,IAAA,KAAS,QAAA,IAAY,UAAA,CAAW,UAAA,EAAY;AACzD,QAAA,MAAM,QAAsC,EAAC;AAE7C,QAAA,KAAA,MAAW,CAAC,KAAK,UAAU,CAAA,IAAK,OAAO,OAAA,CAAQ,UAAA,CAAW,UAAU,CAAA,EAAG;AACrE,UAAA,MAAM,IAAA,GAAO,UAAA;AACb,UAAA,IAAI,OAAA;AAGJ,UAAA,QAAQ,KAAK,IAAA;AAAM,YACjB,KAAK,QAAA;AACH,cAAA,OAAA,GAAUA,MAAE,MAAA,EAAO;AACnB,cAAA;AAAA,YACF,KAAK,QAAA;AACH,cAAA,OAAA,GAAUA,MAAE,MAAA,EAAO;AACnB,cAAA;AAAA,YACF,KAAK,SAAA;AACH,cAAA,OAAA,GAAUA,MAAE,OAAA,EAAQ;AACpB,cAAA;AAAA,YACF,KAAK,SAAA;AACH,cAAA,OAAA,GAAUA,KAAA,CAAE,MAAA,EAAO,CAAE,GAAA,EAAI;AACzB,cAAA;AAAA,YACF,KAAK,OAAA;AACH,cAAA,OAAA,GAAUA,KAAA,CAAE,KAAA,CAAMA,KAAA,CAAE,GAAA,EAAK,CAAA;AACzB,cAAA;AAAA,YACF,KAAK,QAAA;AACH,cAAA,OAAA,GAAUA,KAAA,CAAE,MAAA,CAAOA,KAAA,CAAE,GAAA,EAAK,CAAA;AAC1B,cAAA;AAAA,YACF;AACE,cAAA,OAAA,GAAUA,MAAE,GAAA,EAAI;AAAA;AAIpB,UAAA,IAAI,KAAK,WAAA,EAAa;AACpB,YAAA,OAAA,GAAU,OAAA,CAAQ,QAAA,CAAS,IAAA,CAAK,WAAW,CAAA;AAAA,UAC7C;AAGA,UAAA,IAAI,CAAC,UAAA,CAAW,QAAA,EAAU,QAAA,CAAS,GAAG,CAAA,EAAG;AACvC,YAAA,OAAA,GAAU,QAAQ,QAAA,EAAS;AAAA,UAC7B;AAEA,UAAA,KAAA,CAAM,GAAG,CAAA,GAAI,OAAA;AAAA,QACf;AAEA,QAAA,OAAOA,KAAA,CAAE,OAAO,KAAK,CAAA;AAAA,MACvB;AAGA,MAAA,IAAA,CAAK,MAAA,CAAO,IAAA;AAAA,QACV,CAAA,0DAAA;AAAA,OACF;AACA,MAAA,OAAOA,MAAE,GAAA,EAAI;AAAA,IACf,SAAS,KAAA,EAAO;AACd,MAAA,IAAA,CAAK,MAAA,CAAO,IAAA;AAAA,QACV,2DAA2D,KAAK,CAAA;AAAA,OAClE;AACA,MAAA,OAAOA,MAAE,GAAA,EAAI;AAAA,IACf;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKA,YAAY,OAAA,EAA2C;AACrD,IAAA,MAAMvB,UAAS,IAAA,CAAK,MAAA;AACpB,IAAA,MAAM,gBAAgB,IAAA,CAAK,aAAA;AAI3B,IAAA,IAAI,sBAAsB,OAAA,CAAQ,WAAA;AAElC,IAAA,IAAI,OAAA,CAAQ,aAAa,UAAA,EAAY;AACnC,MAAA,MAAM,oBAA8B,EAAC;AACrC,MAAA,KAAA,MAAW,CAAC,GAAA,EAAK,UAAU,CAAA,IAAK,MAAA,CAAO,OAAA;AAAA,QACrC,QAAQ,WAAA,CAAY;AAAA,OACtB,EAAG;AACD,QAAA,MAAM,IAAA,GAAO,UAAA;AACb,QAAA,IAAI,KAAK,WAAA,EAAa;AACpB,UAAA,MAAM,UAAA,GAAa,OAAA,CAAQ,WAAA,CAAY,QAAA,EAAU,SAAS,GAAG,CAAA;AAC7D,UAAA,iBAAA,CAAkB,IAAA;AAAA,YAChB,CAAA,EAAA,EAAK,GAAG,CAAA,EAAG,UAAA,GAAa,gBAAgB,EAAE,CAAA,EAAA,EAAK,KAAK,WAAW,CAAA;AAAA,WACjE;AAAA,QACF;AAAA,MACF;AAEA,MAAA,IAAI,iBAAA,CAAkB,SAAS,CAAA,EAAG;AAChC,QAAA,mBAAA,GAAsB,CAAA,EAAG,QAAQ,WAAW;;AAAA;AAAA,EAAoB,iBAAA,CAAkB,IAAA,CAAK,IAAI,CAAC,CAAA,CAAA;AAAA,MAC9F;AAAA,IACF;AAEA,IAAA,MAAM,MAAA,GAAS,IAAA,CAAK,eAAA,CAAgB,OAAA,CAAQ,WAAW,CAAA;AAEvD,IAAAA,OAAAA,CAAO,KAAA;AAAA,MACL,CAAA,WAAA,EAAO,QAAQ,IAAI,CAAA,kBAAA,CAAA;AAAA,MACnB,IAAA,CAAK,SAAA,CAAU,OAAA,CAAQ,WAAA,EAAa,MAAM,CAAC;AAAA,KAC7C;AACA,IAAAA,OAAAA,CAAO,KAAA;AAAA,MACL,cAAO,OAAA,CAAQ,IAAI,wBAAyB,MAAA,EAAgB,IAAA,EAAM,YAAY,SAAS,CAAA;AAAA,KACzF;AAGA,IAAA,IACG,QAAgB,IAAA,EAAM,KAAA,IACvB,OAAQ,MAAA,CAAe,IAAA,CAAK,UAAU,UAAA,EACtC;AACA,MAAA,IAAI;AACF,QAAA,MAAM,KAAA,GAAS,MAAA,CAAe,IAAA,CAAK,KAAA,EAAM;AACzC,QAAAA,OAAAA,CAAO,KAAA;AAAA,UACL,CAAA,WAAA,EAAO,QAAQ,IAAI,CAAA,6BAAA,CAAA;AAAA,UACnB,IAAA,CAAK,SAAA;AAAA,YACH,MAAA,CAAO,OAAA,CAAQ,KAAK,CAAA,CAAE,MAAA;AAAA,cACpB,CAAC,GAAA,EAAK,CAAC,GAAA,EAAK,GAAG,CAAA,KAAqB;AAClC,gBAAA,GAAA,CAAI,GAAG,CAAA,GAAI;AAAA,kBACT,IAAA,EAAM,KAAK,IAAA,EAAM,QAAA;AAAA,kBACjB,WAAA,EAAa,KAAK,IAAA,EAAM,WAAA;AAAA,kBACxB,QAAA,EAAU,GAAA,EAAK,IAAA,EAAM,QAAA,KAAa;AAAA,iBACpC;AACA,gBAAA,OAAO,GAAA;AAAA,cACT,CAAA;AAAA,cACA;AAAC,aACH;AAAA,YACA,IAAA;AAAA,YACA;AAAA;AACF,SACF;AAAA,MACF,SAAS,KAAA,EAAO;AACd,QAAAA,OAAAA,CAAO,KAAA;AAAA,UACL,CAAA,WAAA,EAAO,OAAA,CAAQ,IAAI,CAAA,sCAAA,EAAyC,KAAK,CAAA;AAAA,SACnE;AAAA,MACF;AAAA,IACF;AAGA,IAAA,IAAI;AACF,MAAA,MAAM,mBAAA,GAAsBwB,gCAAgB,MAAM,CAAA;AAClD,MAAAxB,OAAAA,CAAO,IAAA;AAAA,QACL,CAAA,WAAA,EAAO,QAAQ,IAAI,CAAA,sCAAA,CAAA;AAAA,QACnB,IAAA,CAAK,SAAA,CAAU,mBAAA,EAAqB,IAAA,EAAM,CAAC;AAAA,OAC7C;AAAA,IACF,SAAS,KAAA,EAAO;AACd,MAAAA,OAAAA,CAAO,IAAA;AAAA,QACL,CAAA,WAAA,EAAO,OAAA,CAAQ,IAAI,CAAA,wCAAA,EAA2C,KAAK,CAAA;AAAA,OACrE;AAAA,IACF;AAEA,IAAA,OAAO,IAAIyB,2BAAA,CAKT;AAAA,MACA,MAAM,OAAA,CAAQ,IAAA;AAAA,MACd,WAAA,EAAa,mBAAA;AAAA,MACb,MAAA;AAAA,MACA,IAAA,EAAM,OACJ,KAAA,EACA,WAAA,EACA,MAAA,KACoB;AACpB,QAAAzB,OAAAA,CAAO,GAAA,CAAI,CAAA,WAAA,EAAO,OAAA,CAAQ,IAAI,gBAAgB,IAAA,CAAK,SAAA,CAAU,KAAK,CAAC,CAAA,CAAE,CAAA;AAGrE,QAAA,MAAM,eAAe,MAAA,EAAQ,YAAA;AAG7B,QAAA,MAAM,OAAA,GAAU;AAAA,UACd,SAAS,YAAA,EAAc,OAAA;AAAA,UACvB,QAAQ,YAAA,EAAc,MAAA;AAAA,UACtB,UAAU,YAAA,EAAc;AAAA,SAC1B;AAEA,QAAAA,OAAAA,CAAO,KAAA;AAAA,UACL,cAAO,OAAA,CAAQ,IAAI,wBAAwB,IAAA,CAAK,SAAA,CAAU,OAAO,CAAC,CAAA;AAAA,SACpE;AAEA,QAAA,IAAI;AACF,UAAA,MAAM,OAAA,GAAgC;AAAA,YACpC,MAAM,OAAA,CAAQ,IAAA;AAAA,YACd,SAAA,EAAW,SAAS,EAAC;AAAA,YACrB;AAAA,WACF;AAEA,UAAAA,OAAAA,CAAO,GAAA,CAAI,CAAA,WAAA,EAAO,OAAA,CAAQ,IAAI,CAAA,wBAAA,CAA0B,CAAA;AAExD,UAAA,MAAM,QAAA,GAAW,MAAM0B,uBAAA,CAAM,IAAA;AAAA,YAC3B,GAAG,aAAa,CAAA,cAAA,CAAA;AAAA,YAChB,OAAA;AAAA,YACA,EAAE,SAAS,GAAA;AAAM,WACnB;AAEA,UAAA,MAAM,SAA8B,QAAA,CAAS,IAAA;AAC7C,UAAA1B,OAAAA,CAAO,GAAA;AAAA,YACL,CAAA,WAAA,EAAO,OAAA,CAAQ,IAAI,CAAA,gCAAA,EAAmC,OAAO,OAAO,CAAA;AAAA,WACtE;AAEA,UAAA,IAAI,CAAC,OAAO,OAAA,EAAS;AACnB,YAAA,MAAM,YAAA,GAAe,OAAO,KAAA,IAAS,uBAAA;AACrC,YAAAA,OAAAA,CAAO,KAAA;AAAA,cACL,CAAA,WAAA,EAAO,OAAA,CAAQ,IAAI,CAAA,qBAAA,EAAwB,YAAY,CAAA;AAAA,aACzD;AACA,YAAA,MAAM,IAAI,MAAM,YAAY,CAAA;AAAA,UAC9B;AAEA,UAAA,MAAM,MAAA,GACJ,OAAO,MAAA,CAAO,MAAA,KAAW,QAAA,GACrB,MAAA,CAAO,MAAA,GACP,IAAA,CAAK,SAAA,CAAU,MAAA,CAAO,MAAA,EAAQ,IAAA,EAAM,CAAC,CAAA;AAE3C,UAAAA,OAAAA,CAAO,GAAA;AAAA,YACL,CAAA,WAAA,EAAO,OAAA,CAAQ,IAAI,CAAA,eAAA,EAAkB,MAAA,CAAO,MAAA,GAAS,GAAA,GAAM,MAAA,CAAO,SAAA,CAAU,CAAA,EAAG,GAAG,CAAA,GAAI,QAAQ,MAAM,CAAA;AAAA,WACtG;AAEA,UAAA,OAAO,MAAA;AAAA,QACT,SAAS,KAAA,EAAO;AACd,UAAAA,OAAAA,CAAO,KAAA;AAAA,YACL,CAAA,WAAA,EAAO,QAAQ,IAAI,CAAA,4BAAA,CAAA;AAAA,YACnB;AAAA,WACF;AACA,UAAA,IAAI0B,uBAAA,CAAM,YAAA,CAAa,KAAK,CAAA,EAAG;AAC7B,YAAA,MAAM,IAAI,KAAA,CAAM,CAAA,mBAAA,EAAsB,KAAA,CAAM,OAAO,CAAA,CAAE,CAAA;AAAA,UACvD;AACA,UAAA,MAAM,iBAAiB,KAAA,GAAQ,KAAA,GAAQ,IAAI,KAAA,CAAM,MAAA,CAAO,KAAK,CAAC,CAAA;AAAA,QAChE;AAAA,MACF;AAAA,KACD,CAAA;AAAA,EACH;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,aAAa,QAAA,EAAyD;AAC1E,IAAA,OAAO,SAAS,GAAA,CAAI,CAAA,IAAA,KAAQ,IAAA,CAAK,WAAA,CAAY,IAAI,CAAC,CAAA;AAAA,EACpD;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,qBACJ,MAAA,EACoC;AACpC,IAAA,IAAI;AACF,MAAA,MAAM,MAAA,GAAS,MAAA,GAAS,EAAE,MAAA,KAAW,EAAC;AACtC,MAAA,MAAM,WAAW,MAAMA,uBAAA,CAAM,IAAI,CAAA,EAAG,IAAA,CAAK,aAAa,CAAA,WAAA,CAAA,EAAe;AAAA,QACnE,MAAA;AAAA,QACA,OAAA,EAAS;AAAA,OACV,CAAA;AAED,MAAA,MAAM,WAAsB,QAAA,CAAS,IAAA;AACrC,MAAA,IAAA,CAAK,MAAA,CAAO,GAAA,CAAI,CAAA,QAAA,EAAW,QAAA,CAAS,MAAM,CAAA,uBAAA,CAAyB,CAAA;AAEnE,MAAA,OAAO,IAAA,CAAK,aAAa,QAAQ,CAAA;AAAA,IACnC,SAAS,KAAA,EAAO;AACd,MAAA,IAAA,CAAK,MAAA,CAAO,KAAA,CAAM,4BAAA,EAA8B,KAAK,CAAA;AACrD,MAAA,MAAM,IAAI,KAAA,CAAM,CAAA,iCAAA,EAAoC,IAAA,CAAK,aAAa,CAAA,CAAE,CAAA;AAAA,IAC1E;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,WAAA,GAAgC;AACpC,IAAA,IAAI;AACF,MAAA,MAAM,QAAA,GAAW,MAAMA,uBAAA,CAAM,GAAA;AAAA,QAC3B,CAAA,EAAG,KAAK,aAAa,CAAA,mBAAA,CAAA;AAAA,QACrB,EAAE,SAAS,GAAA;AAAK,OAClB;AACA,MAAA,OAAO,QAAA,CAAS,KAAK,MAAA,KAAW,IAAA;AAAA,IAClC,CAAA,CAAA,MAAQ;AACN,MAAA,OAAO,KAAA;AAAA,IACT;AAAA,EACF;AACF;ACxTO,IAAM,aAAA,GAAN,MAAM,cAAA,CAAc;AAAA,EAIzB,WAAA,CACmB,aAAA,GAAwB,OAAA,CAAQ,GAAA,CAAI,mBACnD,uBAAA,EACF;AAFiB,IAAA,IAAA,CAAA,aAAA,GAAA,aAAA;AAGjB,IAAA,IAAA,CAAK,YAAA,GAAe,IAAI,YAAA,CAAa,IAAA,CAAK,aAAa,CAAA;AAAA,EACzD;AAAA,EARiB,MAAA,GAAS,IAAIrF,aAAAA,CAAO,cAAA,CAAc,IAAI,CAAA;AAAA,EACtC,YAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAcjB,MAAM,gBAAA,CACJ,WAAA,GAAkC,EAAC,EACR;AAC3B,IAAA,IAAA,CAAK,MAAA,CAAO,KAAA;AAAA,MACV,CAAA,6DAAA,EAAgE,IAAA,CAAK,SAAA,CAAU,WAAW,CAAC,CAAA;AAAA,KAC7F;AACA,IAAA,IAAA,CAAK,MAAA,CAAO,KAAA,CAAM,CAAA,yBAAA,EAA4B,IAAA,CAAK,aAAa,CAAA,CAAE,CAAA;AAElE,IAAA,IAAI,WAAA,CAAY,WAAW,CAAA,EAAG;AAC5B,MAAA,IAAA,CAAK,MAAA,CAAO,MAAM,4CAA4C,CAAA;AAC9D,MAAA,OAAO,EAAC;AAAA,IACV;AAEA,IAAA,IAAI;AAEF,MAAA,IAAA,CAAK,MAAA,CAAO,KAAA;AAAA,QACV,CAAA,qCAAA,EAAwC,KAAK,aAAa,CAAA,cAAA;AAAA,OAC5D;AACA,MAAA,IAAA,CAAK,OAAO,KAAA,CAAM,CAAA,sBAAA,EAAyB,KAAK,SAAA,CAAU,WAAW,CAAC,CAAA,CAAE,CAAA;AAExE,MAAA,MAAM,QAAA,GAAW,MAAMqF,uBAAAA,CAAM,IAAA;AAAA,QAC3B,CAAA,EAAG,KAAK,aAAa,CAAA,cAAA,CAAA;AAAA,QACrB,EAAE,OAAO,WAAA,EAAY;AAAA,QACrB;AAAA,UACE,OAAA,EAAS,GAAA;AAAA,UACT,OAAA,EAAS;AAAA,YACP,cAAA,EAAgB;AAAA;AAClB;AACF,OACF;AAEA,MAAA,IAAA,CAAK,MAAA,CAAO,KAAA;AAAA,QACV,CAAA,8BAAA,EAAiC,QAAA,CAAS,MAAM,CAAA,eAAA,EAAkB,KAAA,CAAM,OAAA,CAAQ,QAAA,CAAS,IAAI,CAAA,GAAI,QAAA,CAAS,IAAA,CAAK,MAAA,GAAS,WAAW,CAAA;AAAA,OACrI;AAEA,MAAA,MAAM,YAAA,GAA0B,MAAM,OAAA,CAAQ,QAAA,CAAS,IAAI,CAAA,GACvD,QAAA,CAAS,OACT,EAAC;AACL,MAAA,IAAA,CAAK,MAAA,CAAO,KAAA;AAAA,QACV,CAAA,UAAA,EAAa,aAAa,MAAM,CAAA,sCAAA;AAAA,OAClC;AAIA,MAAA,MAAM,SAAA,GAA8B;AAAA,QAClC,UAAU,YAAY,YAAA;AAAA,QACtB,WAAA,EAAa,OAAO,IAAA,EAAc,IAAA,EAAW,OAAA,KAAkB;AAC7D,UAAA,IAAA,CAAK,MAAA,CAAO,KAAA,CAAM,CAAA,uBAAA,EAA0B,IAAI,eAAe,IAAI,CAAA;AACnE,UAAA,MAAMC,SAAAA,GAAW,MAAMD,uBAAAA,CAAM,IAAA;AAAA,YAC3B,CAAA,EAAG,KAAK,aAAa,CAAA,cAAA,CAAA;AAAA,YACrB;AAAA,cACE,IAAA;AAAA,cACA,SAAA,EAAW,QAAQ,EAAC;AAAA,cACpB;AAAA;AACF,WACF;AACA,UAAA,OAAOC,SAAAA,CAAS,IAAA;AAAA,QAClB,CAAA;AAAA,QACA,WAAW,YAAY;AAAA,OACzB;AAGA,MAAA,IAAA,CAAK,MAAA,CAAO,GAAA;AAAA,QACV,CAAA,qCAAA,EAAiC,aAAa,MAAM,CAAA,iCAAA;AAAA,OACtD;AACA,MAAA,MAAM,KAAA,GAAQ,MAAM,IAAA,CAAK,YAAA,CAAa,aAAa,YAAY,CAAA;AAC/D,MAAA,IAAA,CAAK,MAAA,CAAO,GAAA;AAAA,QACV,CAAA,2CAAA,EAAuC,MAAM,GAAA,CAAI,CAAA,CAAA,KAAK,EAAE,IAAI,CAAA,CAAE,IAAA,CAAK,IAAI,CAAC,CAAA;AAAA,OAC1E;AAEA,MAAA,IAAA,CAAK,MAAA,CAAO,GAAA;AAAA,QACV,CAAA,WAAA,EAAc,KAAA,CAAM,MAAM,CAAA,8CAAA,EAAiD,YAAA,CAAa,GAAA,CAAI,CAAA,CAAA,KAAK,CAAA,CAAE,IAAI,CAAA,CAAE,IAAA,CAAK,IAAI,CAAC,CAAA;AAAA,OACrH;AACA,MAAA,OAAO,KAAA;AAAA,IACT,SAAS,KAAA,EAAO;AACd,MAAA,MAAM,eACJ,KAAA,YAAiB,KAAA,GAAQ,KAAA,CAAM,OAAA,GAAU,OAAO,KAAK,CAAA;AACvD,MAAA,IAAA,CAAK,MAAA,CAAO,IAAA;AAAA,QACV,CAAA,+DAAA,EAAkE,IAAA,CAAK,aAAa,CAAA,GAAA,EAAM,YAAY,CAAA;AAAA,OACxG;AACA,MAAA,IAAA,CAAK,MAAA,CAAO,KAAK,CAAA,sBAAA,CAAA,EAA0B;AAAA,QACzC,KAAA;AAAA,QACA,KAAA,EAAO,KAAA,YAAiB,KAAA,GAAQ,KAAA,CAAM,KAAA,GAAQ;AAAA,OAC/C,CAAA;AACD,MAAA,OAAO,EAAC;AAAA,IACV;AAAA,EACF;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,MAAM,WAAA,GAAyC;AAC7C,IAAA,IAAI;AACF,MAAA,MAAM,WAAW,MAAMD,uBAAAA,CAAM,IAAI,CAAA,EAAG,IAAA,CAAK,aAAa,CAAA,WAAA,CAAA,EAAe;AAAA,QACnE,OAAA,EAAS;AAAA,OACV,CAAA;AAED,MAAA,MAAM,QAAA,GAAsB,MAAM,OAAA,CAAQ,QAAA,CAAS,IAAI,CAAA,GACnD,QAAA,CAAS,OACT,EAAC;AACL,MAAA,IAAA,CAAK,MAAA,CAAO,KAAA,CAAM,CAAA,UAAA,EAAa,QAAA,CAAS,MAAM,CAAA,gBAAA,CAAkB,CAAA;AAEhE,MAAA,MAAM,SAAA,GAA8B;AAAA,QAClC,UAAU,YAAY,QAAA;AAAA,QACtB,WAAA,EAAa,OAAO,IAAA,EAAc,IAAA,EAAW,OAAA,KAAkB;AAC7D,UAAA,MAAMC,SAAAA,GAAW,MAAMD,uBAAAA,CAAM,IAAA;AAAA,YAC3B,CAAA,EAAG,KAAK,aAAa,CAAA,cAAA,CAAA;AAAA,YACrB;AAAA,cACE,IAAA;AAAA,cACA,SAAA,EAAW,QAAQ,EAAC;AAAA,cACpB;AAAA;AACF,WACF;AACA,UAAA,OAAOC,SAAAA,CAAS,IAAA;AAAA,QAClB,CAAA;AAAA,QACA,WAAW,YAAY;AAAA,OACzB;AAEA,MAAA,MAAM,KAAA,GAAQ,MAAM,IAAA,CAAK,YAAA,CAAa,aAAa,QAAQ,CAAA;AAC3D,MAAA,IAAA,CAAK,MAAA,CAAO,GAAA,CAAI,CAAA,WAAA,EAAc,KAAA,CAAM,MAAM,CAAA,uBAAA,CAAyB,CAAA;AACnE,MAAA,OAAO,KAAA;AAAA,IACT,SAAS,KAAA,EAAO;AACd,MAAA,MAAM,eACJ,KAAA,YAAiB,KAAA,GAAQ,KAAA,CAAM,OAAA,GAAU,OAAO,KAAK,CAAA;AACvD,MAAA,IAAA,CAAK,MAAA,CAAO,IAAA;AAAA,QACV,CAAA,4CAAA,EAA+C,IAAA,CAAK,aAAa,CAAA,GAAA,EAAM,YAAY,CAAA;AAAA,OACrF;AACA,MAAA,OAAO,EAAC;AAAA,IACV;AAAA,EACF;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,MAAM,SAAA,GAA8B;AAClC,IAAA,IAAI;AACF,MAAA,MAAM,QAAA,GAAW,MAAMD,uBAAAA,CAAM,GAAA;AAAA,QAC3B,CAAA,EAAG,KAAK,aAAa,CAAA,mBAAA,CAAA;AAAA,QACrB;AAAA,UACE,OAAA,EAAS;AAAA;AACX,OACF;AACA,MAAA,OAAO,QAAA,CAAS,KAAK,MAAA,KAAW,IAAA;AAAA,IAClC,SAAS,KAAA,EAAO;AACd,MAAA,IAAA,CAAK,MAAA,CAAO,IAAA;AAAA,QACV,oCAAoC,KAAA,YAAiB,KAAA,GAAQ,MAAM,OAAA,GAAU,MAAA,CAAO,KAAK,CAAC,CAAA;AAAA,OAC5F;AACA,MAAA,OAAO,KAAA;AAAA,IACT;AAAA,EACF;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,MAAM,qBAAA,GAA2C;AAC/C,IAAA,IAAI;AACF,MAAA,MAAM,WAAW,MAAMA,uBAAAA,CAAM,IAAI,CAAA,EAAG,IAAA,CAAK,aAAa,CAAA,WAAA,CAAA,EAAe;AAAA,QACnE,OAAA,EAAS;AAAA,OACV,CAAA;AAED,MAAA,MAAM,KAAA,GAAmB,MAAM,OAAA,CAAQ,QAAA,CAAS,IAAI,CAAA,GAChD,QAAA,CAAS,OACT,EAAC;AACL,MAAA,OAAO,KAAA,CAAM,GAAA,CAAI,CAAA,IAAA,KAAQ,IAAA,CAAK,IAAI,CAAA;AAAA,IACpC,SAAS,KAAA,EAAO;AACd,MAAA,IAAA,CAAK,MAAA,CAAO,IAAA;AAAA,QACV,+BAA+B,KAAA,YAAiB,KAAA,GAAQ,MAAM,OAAA,GAAU,MAAA,CAAO,KAAK,CAAC,CAAA;AAAA,OACvF;AACA,MAAA,OAAO,EAAC;AAAA,IACV;AAAA,EACF;AACF;ACvLaE,+BAAN,0BAAA,CAAuD;AAAA,EAC3C,MAAA,GAAS,IAAIvF,aAAAA,CAAOuF,4BAAA,CAAqB,IAAI,CAAA;AAAA,EAC7C,UAAA;AAAA,EACA,OAAA;AAAA,EAEjB,YAAY,aAAA,EAAwB;AAClC,IAAA,IAAA,CAAK,OAAA,GACH,aAAA,IAAiB,OAAA,CAAQ,GAAA,CAAI,eAAA,IAAmB,uBAAA;AAGlD,IAAA,MAAM,OAAA,GAAU,MAAA,CAAO,OAAA,CAAQ,GAAA,CAAI,uBAAuB,GAAM,CAAA;AAEhE,IAAA,IAAA,CAAK,UAAA,GAAaF,wBAAM,MAAA,CAAO;AAAA,MAC7B,SAAS,IAAA,CAAK,OAAA;AAAA,MACd;AAAA,KACD,CAAA;AAED,IAAA,IAAA,CAAK,MAAA,CAAO,GAAA;AAAA,MACV,CAAA,8CAAA,EAAiD,IAAA,CAAK,OAAO,CAAA,WAAA,EAAc,OAAO,CAAA,EAAA;AAAA,KACpF;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,QAAA,GAA+B;AACnC,IAAA,IAAI;AACF,MAAA,IAAA,CAAK,MAAA,CAAO,MAAM,2CAA2C,CAAA;AAC7D,MAAA,MAAM,QAAA,GAAW,MAAM,IAAA,CAAK,UAAA,CAAW,IAAI,aAAa,CAAA;AAExD,MAAA,MAAM,KAAA,GAAQ,MAAM,OAAA,CAAQ,QAAA,CAAS,IAAI,CAAA,GAAI,QAAA,CAAS,OAAO,EAAC;AAC9D,MAAA,IAAA,CAAK,MAAA,CAAO,GAAA,CAAI,CAAA,UAAA,EAAa,KAAA,CAAM,MAAM,CAAA,uBAAA,CAAyB,CAAA;AAClE,MAAA,OAAO,KAAA;AAAA,IACT,SAAS,KAAA,EAAO;AACd,MAAA,IAAA,CAAK,MAAA,CAAO,KAAA,CAAM,yCAAA,EAA2C,KAAK,CAAA;AAClE,MAAA,MAAM,IAAI,KAAA,CAAM,CAAA,uBAAA,EAA0B,KAAA,CAAM,OAAO,CAAA,CAAE,CAAA;AAAA,IAC3D;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,WAAA,CACJ,IAAA,EACA,IAAA,EACA,OAAA,EAC8B;AAC9B,IAAA,IAAI;AACF,MAAA,IAAA,CAAK,MAAA,CAAO,KAAA,CAAM,CAAA,gBAAA,EAAmB,IAAI,eAAe,IAAI,CAAA;AAE5D,MAAA,MAAM,OAAA,GAAe;AAAA,QACnB,IAAA;AAAA,QACA,SAAA,EAAW,QAAQ;AAAC,OACtB;AAGA,MAAA,IAAI,OAAA,EAAS;AACX,QAAA,OAAA,CAAQ,OAAA,GAAU,OAAA;AAAA,MACpB;AAEA,MAAA,MAAM,WAAW,MAAM,IAAA,CAAK,UAAA,CAAW,IAAA,CAAK,kBAAkB,OAAO,CAAA;AAErE,MAAA,IAAA,CAAK,MAAA,CAAO,GAAA,CAAI,CAAA,KAAA,EAAQ,IAAI,CAAA,sBAAA,CAAwB,CAAA;AACpD,MAAA,OAAO,QAAA,CAAS,IAAA;AAAA,IAClB,SAAS,KAAA,EAAO;AACd,MAAA,IAAA,CAAK,MAAA,CAAO,KAAA,CAAM,CAAA,uBAAA,EAA0B,IAAI,KAAK,KAAK,CAAA;AAG1D,MAAA,IAAI,MAAM,QAAA,EAAU;AAClB,QAAA,OAAO;AAAA,UACL,OAAA,EAAS,KAAA;AAAA,UACT,KAAA,EACE,MAAM,QAAA,CAAS,IAAA,CAAK,WACpB,KAAA,CAAM,QAAA,CAAS,KAAK,KAAA,IACpB;AAAA,SACJ;AAAA,MACF;AAEA,MAAA,OAAO;AAAA,QACL,OAAA,EAAS,KAAA;AAAA,QACT,KAAA,EAAO,MAAM,OAAA,IAAW;AAAA,OAC1B;AAAA,IACF;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,YAAA,GAAe;AACnB,IAAA,IAAI;AACF,MAAA,MAAM,QAAA,GAAW,MAAM,IAAA,CAAK,UAAA,CAAW,IAAI,cAAc,CAAA;AACzD,MAAA,OAAO,QAAA,CAAS,IAAA;AAAA,IAClB,SAAS,KAAA,EAAO;AACd,MAAA,IAAA,CAAK,MAAA,CAAO,KAAA,CAAM,6BAAA,EAA+B,KAAK,CAAA;AACtD,MAAA,OAAO,IAAA;AAAA,IACT;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,SAAA,GAA8B;AAClC,IAAA,IAAI;AACF,MAAA,MAAM,QAAA,GAAW,MAAM,IAAA,CAAK,UAAA,CAAW,IAAI,GAAA,EAAK,EAAE,OAAA,EAAS,GAAA,EAAM,CAAA;AACjE,MAAA,OAAO,SAAS,MAAA,KAAW,GAAA;AAAA,IAC7B,SAAS,KAAA,EAAO;AACd,MAAA,IAAA,CAAK,MAAA,CAAO,IAAA,CAAK,kCAAA,EAAoC,KAAA,CAAM,OAAO,CAAA;AAClE,MAAA,OAAO,KAAA;AAAA,IACT;AAAA,EACF;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAWA,MAAM,qBAAA,CACJ,UAAA,EACA,QAAA,EACA,YAAA,EACA,kBACA,MAAA,EACgD;AAEhD,IAAA,MAAM,YAAA,GAAeG,+BAAuB,MAAM,CAAA;AAClD,IAAA,MAAM,eAAA,GAAkBC,uBAAA,CAAgB,SAAA,CAAU,YAAA,CAAa,SAAS,CAAA;AAExE,IAAA,IAAI,UAAA;AAEJ,IAAA,IAAI;AAEF,MAAA,UAAA,GAAa,MAAM,eAAA,EAAiB,eAAA;AAAA,QAClC;AAAA,UACE,IAAA,EAAM,QAAA;AAAA,UACN,EAAA,EAAI,CAAA;AAAA,UACJ,IAAA,EAAM,iBAAA;AAAA,UACN,EAAA,EAAI,CAAC,WAAA,EAAa,OAAA,EAAS,OAAO,QAAQ;AAAA,SAC5C;AAAA,QACA,IAAA,CAAK,UAAU,YAAY,CAAA;AAAA,QAC3B,YAAA,CAAa,KAAA;AAAA,QACb,KAAA,CAAA;AAAA,QACA,YAAA,CAAa,IAAA;AAAA,QACb,YAAA,CAAa,QAAA;AAAA,QACb;AAAA,OACF;AAGA,MAAA,MAAM,MAAA,GAAS,MAAM,IAAA,CAAK,WAAA;AAAA,QACxB,QAAA;AAAA,QACA,YAAA;AAAA,QACA;AAAA,OACF;AAGA,MAAA,MAAM,OAAA,GAAU,MAAA,CAAO,OAAA,GACnB,IAAA,CAAK,SAAA,CAAU,MAAM,CAAA,GACrB,MAAA,CAAO,KAAA,IAAS,IAAA,CAAK,SAAA,CAAU,MAAM,CAAA;AAGzC,MAAA,MAAM,UAAA,EAAY,cAAc,OAAO,CAAA;AAEvC,MAAA,OAAO;AAAA,QACL,OAAA;AAAA,QACA,SAAS,MAAA,CAAO;AAAA,OAClB;AAAA,IACF,SAAS,KAAA,EAAO;AACd,MAAA,IAAA,CAAK,MAAA,CAAO,KAAA,CAAM,CAAA,qBAAA,EAAwB,QAAQ,KAAK,KAAK,CAAA;AAG5D,MAAA,MAAM,UAAA,EAAY,gBAAgB,KAAK,CAAA;AAGvC,MAAA,MAAM,YAAA,GAAe,KAAK,SAAA,CAAU;AAAA,QAClC,OAAA,EAAS,KAAA;AAAA,QACT,KAAA,EAAO,KAAA,YAAiB,KAAA,GAAQ,KAAA,CAAM,OAAA,GAAU;AAAA,OACjD,CAAA;AAED,MAAA,OAAO;AAAA,QACL,OAAA,EAAS,YAAA;AAAA,QACT,OAAA,EAAS;AAAA,OACX;AAAA,IACF;AAAA,EACF;AACF;AA3LaF,4BAAA,GAAN,eAAA,CAAA;AAAA,EADNtF,iBAAAA;AAAW,CAAA,EACCsF,4BAAA,CAAA;;;ACdN,IAAK,aAAA,qBAAAG,cAAAA,KAAL;AACL,EAAAA,eAAA,QAAA,CAAA,GAAS,QAAA;AACT,EAAAA,eAAA,gBAAA,CAAA,GAAiB,gBAAA;AACjB,EAAAA,eAAA,eAAA,CAAA,GAAgB,eAAA;AAChB,EAAAA,eAAA,kBAAA,CAAA,GAAmB,kBAAA;AACnB,EAAAA,eAAA,SAAA,CAAA,GAAU,SAAA;AACV,EAAAA,eAAA,QAAA,CAAA,GAAS,QAAA;AACT,EAAAA,eAAA,WAAA,CAAA,GAAY,WAAA;AACZ,EAAAA,eAAA,KAAA,CAAA,GAAM,KAAA;AACN,EAAAA,eAAA,QAAA,CAAA,GAAS,QAAA;AACT,EAAAA,eAAA,UAAA,CAAA,GAAW,UAAA;AAVD,EAAA,OAAAA,cAAAA;AAAA,CAAA,EAAA,aAAA,IAAA,EAAA;AAaL,IAAK,SAAA,qBAAAC,UAAAA,KAAL;AACL,EAAAA,WAAA,MAAA,CAAA,GAAO,MAAA;AACP,EAAAA,WAAA,QAAA,CAAA,GAAS,QAAA;AACT,EAAAA,WAAA,WAAA,CAAA,GAAY,WAAA;AACZ,EAAAA,WAAA,OAAA,CAAA,GAAQ,OAAA;AACR,EAAAA,WAAA,QAAA,CAAA,GAAS,QAAA;AALC,EAAA,OAAAA,UAAAA;AAAA,CAAA,EAAA,SAAA,IAAA,EAAA;AAQL,IAAK,WAAA,qBAAAC,YAAAA,KAAL;AACL,EAAAA,aAAA,WAAA,CAAA,GAAY,WAAA;AACZ,EAAAA,aAAA,OAAA,CAAA,GAAQ,OAAA;AACR,EAAAA,aAAA,QAAA,CAAA,GAAS,QAAA;AACT,EAAAA,aAAA,kBAAA,CAAA,GAAmB,kBAAA;AACnB,EAAAA,aAAA,WAAA,CAAA,GAAY,WAAA;AALF,EAAA,OAAAA,YAAAA;AAAA,CAAA,EAAA,WAAA,IAAA,EAAA;ACVL,IAAM,cAAA,GAAN,cAA6BC,2CAAA,CAAuB;AAAA,EACjD,MAAA;AAAA,EACA,KAAA;AAAA,EACA,IAAA;AAAA,EACA,UAAA;AAAA,EACA,OAAA,GAAU,oCAAA;AAAA,EAElB,YAAY,MAAA,EAA8B;AACxC,IAAA,KAAA,EAAM;AACN,IAAA,IAAA,CAAK,MAAA,GAAS,MAAA,CAAO,MAAA,IAAU,OAAA,CAAQ,IAAI,gBAAA,IAAoB,EAAA;AAC/D,IAAA,IAAA,CAAK,KAAA,GAAQ,OAAO,KAAA,IAAS,UAAA;AAC7B,IAAA,IAAA,CAAK,IAAA,GAAO,OAAO,IAAA,IAAQ,EAAA;AAC3B,IAAA,IAAA,CAAK,UAAA,GAAa,OAAO,UAAA,IAAc,IAAA;AAEvC,IAAA,IAAI,CAAC,KAAK,MAAA,EAAQ;AAChB,MAAA,MAAM,IAAI,KAAA;AAAA,QACR;AAAA,OACF;AAAA,IACF;AAAA,EACF;AAAA,EAEA,MAAM,iBAAA,CACJ,SAAA,EACA,KAAA,EACA,SAAA,EACqB;AACrB,IAAA,IAAI,SAAA,CAAU,WAAW,CAAA,EAAG;AAC1B,MAAA,OAAO,EAAC;AAAA,IACV;AAEA,IAAA,MAAM,KAAA,GAAQ,SAAA,CAAU,GAAA,CAAI,CAAA,GAAA,KAAO,IAAI,WAAW,CAAA;AAElD,IAAA,IAAI;AACF,MAAA,MAAM,QAAA,GAAW,MAAM,KAAA,CAAM,IAAA,CAAK,OAAA,EAAS;AAAA,QACzC,MAAA,EAAQ,MAAA;AAAA,QACR,OAAA,EAAS;AAAA,UACP,cAAA,EAAgB,kBAAA;AAAA,UAChB,aAAA,EAAe,CAAA,OAAA,EAAU,IAAA,CAAK,MAAM,CAAA;AAAA,SACtC;AAAA,QACA,IAAA,EAAM,KAAK,SAAA,CAAU;AAAA,UACnB,OAAO,IAAA,CAAK,KAAA;AAAA,UACZ,KAAA;AAAA,UACA,SAAA,EAAW,KAAA;AAAA,UACX,OAAO,IAAA,CAAK,GAAA,CAAI,IAAA,CAAK,IAAA,EAAM,UAAU,MAAM,CAAA;AAAA,UAC3C,YAAY,IAAA,CAAK;AAAA,SAClB;AAAA,OACF,CAAA;AAED,MAAA,IAAI,CAAC,SAAS,EAAA,EAAI;AAChB,QAAA,MAAM,KAAA,GAAQ,MAAM,QAAA,CAAS,IAAA,EAAK;AAClC,QAAA,MAAM,IAAI,KAAA,CAAM,CAAA,oBAAA,EAAuB,SAAS,MAAM,CAAA,GAAA,EAAM,KAAK,CAAA,CAAE,CAAA;AAAA,MACrE;AAEA,MAAA,MAAM,IAAA,GAAO,MAAM,QAAA,CAAS,IAAA,EAAK;AAIjC,MAAA,MAAM,eAAA,GAAkB,KAAK,OAAA,CAC1B,IAAA,CAAK,CAAC,CAAA,EAAQ,CAAA,KAAW,EAAE,eAAA,GAAkB,CAAA,CAAE,eAAe,CAAA,CAC9D,KAAA,CAAM,GAAG,IAAA,CAAK,IAAI,EAClB,GAAA,CAAI,CAAC,MAAA,KAAgB,MAAA,CAAO,KAAK,CAAA;AAEpC,MAAA,OAAO,gBAAgB,GAAA,CAAI,CAAC,KAAA,KAAkB,SAAA,CAAU,KAAK,CAAC,CAAA;AAAA,IAChE,SAAS,KAAA,EAAO;AACd,MAAA,OAAA,CAAQ,KAAA,CAAM,sCAAsC,KAAK,CAAA;AAEzD,MAAA,OAAO,SAAA,CAAU,KAAA,CAAM,CAAA,EAAG,IAAA,CAAK,IAAI,CAAA;AAAA,IACrC;AAAA,EACF;AACF;AChEA,SAAS,sBAAA,GAAyB;AAChC,EAAA,MAAMlC,OAAAA,GAAS,IAAI3D,aAAAA,CAAO,wBAAwB,CAAA;AAElD,EAAA2D,OAAAA,CAAO,IAAA;AAAA,IACL,CAAA,iNAAA;AAAA,GACF;AAGA,EAAA,MAAM,UAAA,GAAa;AAAA,IACjBmC,iBAAA,CAAW,SAAA;AAAA,IACXC,2BAAA,CAAgB;AAAA,GAClB;AAEA,EAAA,UAAA,CAAW,OAAA,CAAQ,CAAC,SAAA,EAAW,KAAA,KAAU;AACvC,IAAA,MAAM,SAAA,GAAY,KAAA,KAAU,CAAA,GAAI,YAAA,GAAe,iBAAA;AAC/C,IAAApC,OAAAA,CAAO,IAAA,CAAK,CAAA,SAAA,EAAY,SAAS,CAAA,kBAAA,CAAoB,CAAA;AAGrD,IAAA,MAAM,2BAA2B,SAAA,CAAU,gBAAA;AAE3C,IAAA,IAAI,wBAAA,EAA0B;AAC5B,MAAA,SAAA,CAAU,gBAAA,GAAmB,SAAU,OAAA,EAAc;AACnD,QAAA,MAAM,MAAA,GAAS,wBAAA,CAAyB,IAAA,CAAK,IAAA,EAAM,OAAO,CAAA;AAK1D,QAAA,IACE,MAAA,CAAO,KAAA,KACN,MAAA,CAAO,KAAA,CAAM,QAAA,CAAS,OAAO,CAAA,IAC5B,kBAAA,CAAmB,IAAA,CAAK,MAAA,CAAO,KAAK,CAAA,CAAA,EACtC;AAEA,UAAA,IAAI,MAAA,CAAO,eAAe,MAAA,EAAW;AACnC,YAAA,MAAA,CAAO,wBAAwB,MAAA,CAAO,UAAA;AACtC,YAAA,OAAO,MAAA,CAAO,UAAA;AAAA,UAChB;AAGA,UAAA,IACE,MAAA,CAAO,iBAAA,KAAsB,MAAA,IAC7B,CAAC,OAAO,qBAAA,EACR;AACA,YAAA,MAAA,CAAO,wBAAwB,MAAA,CAAO,iBAAA;AACtC,YAAA,OAAO,MAAA,CAAO,iBAAA;AAAA,UAChB;AAIA,UAAA,MAAM,sBAAsB,MAAA,CAAO,WAAA;AACnC,UAAA,IAAI,MAAA,CAAO,WAAA,KAAgB,MAAA,IAAa,MAAA,CAAO,gBAAgB,CAAA,EAAG;AAChE,YAAA,MAAA,CAAO,WAAA,GAAc,CAAA;AACrB,YAAAA,OAAAA,CAAO,KAAA;AAAA,cACL,CAAA,sBAAA,EAAyB,MAAA,CAAO,KAAK,CAAA,EAAA,EAAK,mBAAmB,CAAA,+CAAA;AAAA,aAC/D;AAAA,UACF;AAAA,QAGF;AAGA,QAAA,IACE,MAAA,CAAO,KAAA,KACN,MAAA,CAAO,KAAA,CAAM,QAAA,CAAS,OAAO,CAAA,IAC5B,kBAAA,CAAmB,IAAA,CAAK,MAAA,CAAO,KAAK,CAAA,CAAA,EACtC;AAEA,UAAA,IAAI,CAAC,OAAO,cAAA,EAAgB;AAC1B,YAAA,MAAA,CAAO,cAAA,GAAiB,EAAE,aAAA,EAAe,IAAA,EAAK;AAC9C,YAAAA,OAAAA,CAAO,IAAA;AAAA,cACL,CAAA,0DAAA,EAA6D,OAAO,KAAK,CAAA;AAAA,aAC3E;AAAA,UACF,CAAA,MAAA,IAAW,MAAA,CAAO,cAAA,CAAe,aAAA,KAAkB,IAAA,EAAM;AACvD,YAAA,MAAA,CAAO,eAAe,aAAA,GAAgB,IAAA;AACtC,YAAAA,OAAAA,CAAO,IAAA;AAAA,cACL,CAAA,4DAAA,EAA+D,OAAO,KAAK,CAAA;AAAA,aAC7E;AAAA,UACF;AAAA,QACF;AAEA,QAAA,OAAO,MAAA;AAAA,MACT,CAAA;AAEA,MAAAA,OAAAA,CAAO,IAAA;AAAA,QACL,wBAAwB,SAAS,CAAA,0DAAA;AAAA,OACnC;AAAA,IACF,CAAA,MAAO;AACL,MAAAA,OAAAA,CAAO,IAAA;AAAA,QACL,sDAAsD,SAAS,CAAA;AAAA,OACjE;AAAA,IACF;AAGA,IAAA,MAAM,8BAA8B,SAAA,CAAU,mBAAA;AAE9C,IAAA,IAAI,2BAAA,EAA6B;AAC/B,MAAA,SAAA,CAAU,mBAAA,GAAsB,eAC9B,OAAA,EACA,OAAA,EACA;AAEA,QAAA,IACE,OAAA,EAAS,KAAA,KACR,OAAA,CAAQ,KAAA,CAAM,QAAA,CAAS,OAAO,CAAA,IAC7B,kBAAA,CAAmB,IAAA,CAAK,OAAA,CAAQ,KAAK,CAAA,CAAA,EACvC;AACA,UAAA,IAAI,UAAA,GAAa,KAAA;AAGjB,UAAA,IAAI,OAAA,CAAQ,eAAe,MAAA,EAAW;AACpC,YAAA,OAAA,CAAQ,wBAAwB,OAAA,CAAQ,UAAA;AACxC,YAAA,OAAO,OAAA,CAAQ,UAAA;AACf,YAAA,UAAA,GAAa,IAAA;AAAA,UACf;AAGA,UAAA,IAAI,OAAA,CAAQ,WAAA,KAAgB,MAAA,IAAa,OAAA,CAAQ,gBAAgB,CAAA,EAAG;AAClE,YAAA,MAAM,eAAe,OAAA,CAAQ,WAAA;AAC7B,YAAA,OAAA,CAAQ,WAAA,GAAc,CAAA;AACtB,YAAAA,OAAAA,CAAO,KAAA;AAAA,cACL,CAAA,6CAAA,EAAgD,OAAA,CAAQ,KAAK,CAAA,EAAA,EAAK,YAAY,CAAA,KAAA;AAAA,aAChF;AACA,YAAA,UAAA,GAAa,IAAA;AAAA,UACf;AAGA,UAAA,IAAI,CAAC,QAAQ,cAAA,EAAgB;AAC3B,YAAA,OAAA,CAAQ,cAAA,GAAiB,EAAE,aAAA,EAAe,IAAA,EAAK;AAC/C,YAAAA,OAAAA,CAAO,KAAA;AAAA,cACL,CAAA,mEAAA,EAAsE,QAAQ,KAAK,CAAA;AAAA,aACrF;AACA,YAAA,UAAA,GAAa,IAAA;AAAA,UACf,CAAA,MAAA,IAAW,OAAA,CAAQ,cAAA,CAAe,aAAA,KAAkB,IAAA,EAAM;AACxD,YAAA,OAAA,CAAQ,eAAe,aAAA,GAAgB,IAAA;AACvC,YAAAA,OAAAA,CAAO,KAAA;AAAA,cACL,CAAA,qEAAA,EAAwE,QAAQ,KAAK,CAAA;AAAA,aACvF;AACA,YAAA,UAAA,GAAa,IAAA;AAAA,UACf;AAEA,UAAA,IAAI,UAAA,EAAY;AACd,YAAAA,OAAAA,CAAO,KAAA;AAAA,cACL,CAAA,gDAAA,EAAmD,QAAQ,KAAK,CAAA;AAAA,aAClE;AAAA,UACF;AAAA,QACF;AAEA,QAAA,MAAM,MAAA,GAAS,MAAM,2BAAA,CAA4B,IAAA;AAAA,UAC/C,IAAA;AAAA,UACA,OAAA;AAAA,UACA;AAAA,SACF;AAGA,QAAA,IACE,OAAA,EAAS,KAAA,KACR,OAAA,CAAQ,KAAA,CAAM,QAAA,CAAS,OAAO,CAAA,IAC7B,kBAAA,CAAmB,IAAA,CAAK,OAAA,CAAQ,KAAK,CAAA,CAAA,EACvC;AACA,UAAAA,OAAAA,CAAO,IAAA;AAAA,YACL,CAAA,wCAAA,EAA2C,QAAQ,KAAK,CAAA,CAAA;AAAA,WAC1D;AACA,UAAAA,OAAAA,CAAO,IAAA,CAAK,CAAA,eAAA,EAAkB,MAAA,CAAO,IAAA,CAAK,MAAA,IAAU,EAAE,CAAA,CAAE,IAAA,CAAK,IAAI,CAAC,CAAA,CAAE,CAAA;AAEpE,UAAA,IAAI,QAAQ,KAAA,EAAO;AACjB,YAAAA,OAAAA,CAAO,IAAA;AAAA,cACL,gBAAgB,IAAA,CAAK,SAAA,CAAU,OAAO,KAAA,EAAO,IAAA,EAAM,CAAC,CAAC,CAAA;AAAA,aACvD;AAAA,UACF,CAAA,MAAO;AACL,YAAAA,OAAAA,CAAO,KAAK,CAAA,0BAAA,CAA4B,CAAA;AAAA,UAC1C;AAEA,UAAA,IAAI,MAAA,EAAQ,OAAA,IAAW,MAAA,CAAO,OAAA,CAAQ,CAAC,CAAA,EAAG;AACxC,YAAAA,OAAAA,CAAO,IAAA;AAAA,cACL,CAAA,mBAAA,EAAsB,MAAA,CAAO,IAAA,CAAK,MAAA,CAAO,OAAA,CAAQ,CAAC,CAAC,CAAA,CAAE,IAAA,CAAK,IAAI,CAAC,CAAA;AAAA,aACjE;AAAA,UACF;AAAA,QACF;AAEA,QAAA,OAAO,MAAA;AAAA,MACT,CAAA;AAEA,MAAAA,OAAAA,CAAO,IAAA;AAAA,QACL,wBAAwB,SAAS,CAAA,6DAAA;AAAA,OACnC;AAAA,IACF;AAGA,IAAA,MAAM,2BAA2B,SAAA,CAAU,gBAAA;AAE3C,IAAA,IAAI,wBAAA,EAA0B;AAC5B,MAAA,SAAA,CAAU,mBAAmB,WAAY;AACvC,QAAA,MAAM,QACJ,IAAA,CAAK,SAAA,IAAa,IAAA,CAAK,KAAA,IAAU,KAAa,SAAA,EAAW,SAAA;AAK3D,QAAA,MAAM,WAAA,GACJ,MAAA,CAAO,IAAA,CAAK,KAAK,CAAA,IACjB,KAAA,CAAM,QAAA,CAAS,OAAO,CAAA,IACtB,gBAAA,CAAiB,IAAA,CAAK,KAAK,CAAA;AAE7B,QAAA,MAAM,cAAA,GAAiB,wBAAA,CAAyB,IAAA,CAAK,IAAI,CAAA;AAEzD,QAAAA,OAAAA,CAAO,IAAA;AAAA,UACL,6CAA6C,KAAK,CAAA,WAAA,EAAc,WAAW,CAAA,WAAA,EAAc,cAAc,eAAe,IAAA,CAAK,SAAS,CAAA,QAAA,EAAY,IAAA,CAAa,KAAK,CAAA,YAAA,EAAe,IAAA,CAAK,UAAW,IAAA,CAAa,SAAA,EAAW,SAAS,CAAC,CAAA;AAAA,SACrO;AAEA,QAAA,OAAO,WAAA;AAAA,MACT,CAAA;AAEA,MAAAA,OAAAA,CAAO,IAAA;AAAA,QACL,wBAAwB,SAAS,CAAA,oEAAA;AAAA,OACnC;AAAA,IACF,CAAA,MAAO;AACL,MAAAA,OAAAA,CAAO,IAAA;AAAA,QACL,sDAAsD,SAAS,CAAA;AAAA,OACjE;AAAA,IACF;AAOA,IAAA,MAAM,iBAAiB,SAAA,CAAU,MAAA;AAEjC,IAAA,IAAI,cAAA,EAAgB;AAClB,MAAA,SAAA,CAAU,MAAA,GAAS,kBAAmB,IAAA,EAAa;AACjD,QAAA,MAAM,QACJ,IAAA,CAAK,SAAA,IAAa,IAAA,CAAK,KAAA,IAAU,KAAa,SAAA,EAAW,SAAA;AAE3D,QAAA,IAAI,KAAA,IAAS,KAAA,CAAM,QAAA,CAAS,OAAO,CAAA,EAAG;AACpC,UAAAA,OAAAA,CAAO,IAAA,CAAK,CAAA,kCAAA,EAAqC,KAAK,CAAA,CAAE,CAAA;AAGxD,UAAA,IAAI,IAAA,CAAK,CAAC,CAAA,EAAG;AACX,YAAA,MAAM,MAAA,GAAS,KAAK,CAAC,CAAA;AACrB,YAAAA,OAAAA,CAAO,IAAA;AAAA,cACL,CAAA,kCAAA,EAAqC,OAAO,IAAA,CAAK,MAAA,IAAU,EAAE,CAAA,CAAE,IAAA,CAAK,IAAI,CAAC,CAAA;AAAA,aAC3E;AACA,YAAA,IAAI,OAAO,KAAA,EAAO;AAChB,cAAAA,OAAAA,CAAO,IAAA;AAAA,gBACL,CAAA,+BAAA,EAAkC,MAAA,CAAO,KAAA,CAAM,MAAM,CAAA,MAAA;AAAA,eACvD;AAAA,YACF;AAAA,UACF;AAGA,UAAA,MAAM,UAAA,GACH,IAAA,CAAa,KAAA,IACb,IAAA,CAAa,cACb,IAAA,CAAa,KAAA;AAChB,UAAA,IAAI,UAAA,EAAY;AACd,YAAAA,OAAAA,CAAO,IAAA;AAAA,cACL,wCAAwC,KAAA,CAAM,OAAA,CAAQ,UAAU,CAAA,GAAI,UAAA,CAAW,SAAS,KAAK,CAAA;AAAA,aAC/F;AAAA,UACF,CAAA,MAAO;AACL,YAAAA,OAAAA,CAAO,KAAK,CAAA,sCAAA,CAAwC,CAAA;AAAA,UACtD;AAAA,QACF;AAEA,QAAA,IAAI,MAAA;AACJ,QAAA,IAAI;AACF,UAAA,MAAA,GAAS,MAAM,cAAA,CAAe,KAAA,CAAM,IAAA,EAAM,IAAI,CAAA;AAAA,QAChD,SAAS,KAAA,EAAO;AACd,UAAA,IAAI,KAAA,IAAS,KAAA,CAAM,QAAA,CAAS,OAAO,CAAA,EAAG;AACpC,YAAAA,OAAAA,CAAO,KAAA;AAAA,cACL,gDAAgD,KAAK,CAAA,CAAA,CAAA;AAAA,cACrD;AAAA,gBACE,cACE,KAAA,YAAiB,KAAA,GAAQ,KAAA,CAAM,OAAA,GAAU,OAAO,KAAK,CAAA;AAAA,gBACvD,UAAA,EAAY,KAAA,YAAiB,KAAA,GAAQ,KAAA,CAAM,KAAA,GAAQ,MAAA;AAAA,gBACnD,SAAA,EAAW,OAAO,WAAA,EAAa,IAAA;AAAA,gBAC/B,MAAM,IAAA,CAAK,MAAA;AAAA,gBACX,SAAA,EAAW,CAAC,CAAC,IAAA,CAAK,CAAC,CAAA;AAAA,gBACnB,UAAA,EAAY,IAAA,CAAK,CAAC,CAAA,GAAI,MAAA,CAAO,IAAA,CAAK,IAAA,CAAK,CAAC,CAAA,IAAK,EAAE,CAAA,GAAI,EAAC;AAAA,gBACpD,KAAA,EAAO,IAAA,CAAK,CAAC,CAAA,EAAG,OAAO,MAAA,IAAU;AAAA;AACnC,aACF;AAAA,UACF;AACA,UAAA,MAAM,KAAA;AAAA,QACR;AAEA,QAAA,IAAI,KAAA,IAAS,KAAA,CAAM,QAAA,CAAS,OAAO,CAAA,EAAG;AACpC,UAAAA,OAAAA,CAAO,IAAA,CAAK,CAAA,6CAAA,EAAgD,KAAK,CAAA,CAAA,CAAG,CAAA;AACpE,UAAAA,OAAAA,CAAO,IAAA,CAAK,CAAA,aAAA,EAAgB,MAAA,CAAO,IAAA,CAAK,MAAA,IAAU,EAAE,CAAA,CAAE,IAAA,CAAK,IAAI,CAAC,CAAA,CAAE,CAAA;AAElE,UAAA,IAAI,MAAA,EAAQ,cAAA,IAAkB,MAAA,EAAQ,aAAA,EAAe;AACnD,YAAA,MAAM,KAAA,GAAQ,MAAA,CAAO,cAAA,IAAkB,MAAA,CAAO,aAAA;AAC9C,YAAAA,OAAAA,CAAO,IAAA;AAAA,cACL,yBAAyB,IAAA,CAAK,SAAA,CAAU,KAAA,EAAO,IAAA,EAAM,CAAC,CAAC,CAAA;AAAA,aACzD;AAAA,UACF;AAEA,UAAA,IAAI,MAAA,EAAQ,iBAAA,IAAqB,MAAA,EAAQ,gBAAA,EAAkB;AACzD,YAAA,MAAM,gBAAA,GACJ,MAAA,CAAO,iBAAA,IAAqB,MAAA,CAAO,gBAAA;AACrC,YAAAA,OAAAA,CAAO,IAAA;AAAA,cACL,4BAA4B,IAAA,CAAK,SAAA,CAAU,gBAAA,EAAkB,IAAA,EAAM,CAAC,CAAC,CAAA;AAAA,aACvE;AAGA,YAAA,IACE,CAAC,MAAA,CAAO,cAAA,IACR,gBAAA,EAAkB,mBAAA,EAClB;AACA,cAAA,MAAM,iBAAiB,gBAAA,CAAiB,mBAAA;AACxC,cAAA,MAAA,CAAO,cAAA,GAAiB;AAAA,gBACtB,YAAA,EAAc,eAAe,YAAA,IAAgB,CAAA;AAAA,gBAC7C,aAAA,EAAe,eAAe,gBAAA,IAAoB,CAAA;AAAA,gBAClD,YAAA,EAAc,eAAe,WAAA,IAAe;AAAA,eAC9C;AAEA,cAAAA,OAAAA,CAAO,IAAA;AAAA,gBACL,kEAAkE,IAAA,CAAK,SAAA,CAAU,OAAO,cAAA,EAAgB,IAAA,EAAM,CAAC,CAAC,CAAA;AAAA,eAClH;AAAA,YACF;AAAA,UACF;AAEA,UAAA,IAAI,CAAC,MAAA,EAAQ,cAAA,IAAkB,CAAC,QAAQ,aAAA,EAAe;AACrD,YAAAA,OAAAA,CAAO,KAAK,CAAA,wCAAA,CAA0C,CAAA;AAAA,UACxD;AAAA,QACF;AAEA,QAAA,OAAO,MAAA;AAAA,MACT,CAAA;AAEA,MAAAA,OAAAA,CAAO,IAAA;AAAA,QACL,wBAAwB,SAAS,CAAA,yDAAA;AAAA,OACnC;AAAA,IACF;AAAA,EACF,CAAC,CAAA;AACH;AAGA,sBAAA,EAAuB;AAqBhB,IAAM,gBAAA,GAAN,MAAM,iBAAA,CAA8C;AAAA,EASzD,WAAA,CACU,eACRA,OAAAA,EACA;AAFQ,IAAA,IAAA,CAAA,aAAA,GAAA,aAAA;AAGR,IAAA,IAAA,CAAK,MAAA,GAASA,OAAAA,IAAU,IAAI3D,aAAAA,CAAO,kBAAiB,IAAI,CAAA;AAAA,EAC1D;AAAA,EAbQ,MAAA;AAAA;AAAA,EAGA,gBAAA,uBAAuB,GAAA,EAAyC;AAAA;AAAA,EAGhE,kBAAA,uBAAyB,GAAA,EAAmB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAgB5C,gBAAgB,WAAA,EAAyC;AAE/D,IAAA,MAAM,MAAA,GAAS,YACZ,GAAA,CAAI,CAAA,CAAA,KAAK,GAAG,CAAA,CAAE,QAAQ,CAAA,CAAA,EAAI,CAAA,CAAE,OAAO,CAAA,CAAA,EAAI,KAAK,SAAA,CAAU,CAAA,CAAE,MAAA,IAAU,EAAE,CAAC,EAAE,CAAA,CACvE,IAAA,EAAK,CACL,IAAA,CAAK,GAAG,CAAA;AAGX,IAAA,OAAO0B,iBAAAA,CAAW,KAAK,CAAA,CAAE,MAAA,CAAO,MAAM,CAAA,CAAE,MAAA,CAAO,KAAK,CAAA,CAAE,KAAA,CAAM,CAAA,EAAG,EAAE,CAAA;AAAA,EACnE;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOQ,sBAAsB,MAAA,EAAiC;AAC7D,IAAA,MAAM,KAAA,GAAQ;AAAA,MACZ,MAAA,CAAO,OAAA;AAAA,MACP,OAAO,WAAA,IAAe,SAAA;AAAA,MACtB,OAAO,SAAA,IAAa;AAAA,KACtB;AAGA,IAAA,IAAI,MAAA,CAAO,WAAA,IAAe,MAAA,CAAO,WAAA,CAAY,SAAS,CAAA,EAAG;AACvD,MAAA,MAAM,SAAA,GAAY,IAAA,CAAK,eAAA,CAAgB,MAAA,CAAO,WAAW,CAAA;AACzD,MAAA,KAAA,CAAM,KAAK,SAAS,CAAA;AAAA,IACtB;AAEA,IAAA,OAAO,KAAA,CAAM,KAAK,GAAG,CAAA;AAAA,EACvB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAgBQ,4BAA4B,SAAA,EAA4B;AAC9D,IAAA,MAAM,cACJ,SAAA,CAAU,QAAA,CAAS,OAAO,CAAA,IAC1B,SAAA,CAAU,SAAS,QAAQ,CAAA,IAC3B,UAAU,QAAA,CAAS,QAAQ,KAC3B,SAAA,CAAU,QAAA,CAAS,QAAQ,CAAA,IAC3B,SAAA,CAAU,SAAS,QAAQ,CAAA;AAAA,IAE3B,mBAAmB,IAAA,CAAK,SAAS,CAAA,IACjC,aAAA,CAAc,KAAK,SAAS,CAAA;AAE9B,IAAA,IAAA,CAAK,MAAA,CAAO,KAAA,CAAM,CAAA,oCAAA,EAAuC,SAAS,CAAA,CAAA,CAAA,EAAK;AAAA,MACrE,SAAA;AAAA,MACA,2BAAA,EAA6B,WAAA;AAAA,MAC7B,MAAA,EAAQ;AAAA,QACN,YAAA,EAAc,SAAA,CAAU,QAAA,CAAS,OAAO,CAAA;AAAA,QACxC,UAAA,EAAY,SAAA,CAAU,QAAA,CAAS,QAAQ,CAAA;AAAA,QACvC,UAAA,EAAY,SAAA,CAAU,QAAA,CAAS,QAAQ,CAAA;AAAA,QACvC,UAAA,EAAY,SAAA,CAAU,QAAA,CAAS,QAAQ,CAAA;AAAA,QACvC,UAAA,EAAY,SAAA,CAAU,QAAA,CAAS,QAAQ,CAAA;AAAA,QACvC,aAAA,EAAe,kBAAA,CAAmB,IAAA,CAAK,SAAS,CAAA;AAAA,QAChD,UAAA,EAAY,aAAA,CAAc,IAAA,CAAK,SAAS;AAAA;AAC1C,KACD,CAAA;AAED,IAAA,OAAO,WAAA;AAAA,EACT;AAAA;AAAA,EAGiB,iBAAA,GAEb;AAAA,IACF,CAAA,QAAA,gBAAwB,CAAC;AAAA,MACvB,SAAA;AAAA,MACA,kBAAA;AAAA,MACA,gBAAA;AAAA,MACA;AAAA,KACF,KAAM;AAEJ,MAAA,IAAI,IAAA,CAAK,2BAAA,CAA4B,SAAS,CAAA,EAAG;AAG/C,QAAA,MAAM,gBAAA,GAAmB,CAAA;AACzB,QAAA,MAAM,MAAA,GAAS;AAAA,UACb,SAAA;AAAA,UACA,WAAA,EAAa,gBAAA;AAAA;AAAA,UACb,mBAAA,EAAqB,gBAAA;AAAA;AAAA,UACrB,SAAA,EAAW,IAAA;AAAA,UACX,YAAA,EAAc,QAAA,IAAY,OAAA,CAAQ,GAAA,CAAI;AAAA,SACxC;AAEA,QAAA,IAAI,uBAAuB,CAAA,EAAG;AAC5B,UAAA,IAAA,CAAK,MAAA,CAAO,KAAA;AAAA,YACV,CAAA,mCAAA,EAAsC,SAAS,CAAA,EAAA,EAAK,kBAAkB,CAAA,gDAAA;AAAA,WACxE;AAAA,QACF;AAIA,QAAA,MAAM,UAAA,GAAa,IAAIoE,iBAAA,CAAW,MAAM,CAAA;AAIxC,QAAA,OAAO,UAAA;AAAA,MACT,CAAA,MAAO;AAEL,QAAA,MAAM,MAAA,GAAS;AAAA,UACb,SAAA;AAAA,UACA,WAAA,EAAa,kBAAA;AAAA,UACb,SAAA,EAAW,gBAAA;AAAA;AAAA,UACX,SAAA,EAAW,IAAA;AAAA,UACX,YAAA,EAAc,QAAA,IAAY,OAAA,CAAQ,GAAA,CAAI;AAAA,SACxC;AAIA,QAAA,MAAM,UAAA,GAAa,IAAIA,iBAAA,CAAW,MAAM,CAAA;AAIxC,QAAA,OAAO,UAAA;AAAA,MACT;AAAA,IACF,CAAA;AAAA,IAEA,CAAA,WAAA,mBAA2B,CAAC;AAAA,MAC1B,SAAA;AAAA,MACA,kBAAA;AAAA,MACA,gBAAA;AAAA,MACA;AAAA,KACF,KACE,IAAIE,uBAAA,CAAc;AAAA,MAChB,SAAA;AAAA,MACA,WAAA,EAAa,kBAAA;AAAA,MACb,SAAA,EAAW,gBAAA;AAAA,MACX,eAAA,EAAiB,QAAA,IAAY,OAAA,CAAQ,GAAA,CAAI;AAAA,KAC1C,CAAA;AAAA,IAEH,CAAA,QAAA,gBAAwB,CAAC;AAAA,MACvB,SAAA;AAAA,MACA,kBAAA;AAAA,MACA,gBAAA;AAAA,MACA;AAAA,KACF,KACE,IAAIC,iBAAA,CAAW;AAAA,MACb,KAAA,EAAO,SAAA;AAAA,MACP,WAAA,EAAa,kBAAA;AAAA;AAAA,MAEb,MAAA,EAAQ,QAAA,IAAY,OAAA,CAAQ,GAAA,CAAI;AAAA,KACjC,CAAA;AAAA,IAEH,CAAA,SAAA,iBAAyB,CAAC;AAAA,MACxB,SAAA;AAAA,MACA,kBAAA;AAAA,MACA,gBAAA;AAAA,MACA;AAAA,KACF,KACE,IAAIC,uBAAA,CAAc;AAAA,MAChB,KAAA,EAAO,SAAA;AAAA,MACP,WAAA,EAAa,kBAAA;AAAA,MACb,SAAA,EAAW,gBAAA;AAAA,MACX,MAAA,EAAQ,QAAA,IAAY,OAAA,CAAQ,GAAA,CAAI;AAAA,KACjC,CAAA;AAAA;AAAA,IAIH,CAAA,eAAA,uBAA+B,CAAC;AAAA,MAC9B,SAAA;AAAA,MACA,kBAAA;AAAA,MACA,gBAAA;AAAA,MACA;AAAA,KACF,KAAM;AAEJ,MAAA,IAAI,IAAA,CAAK,2BAAA,CAA4B,SAAS,CAAA,EAAG;AAG/C,QAAA,MAAM,gBAAA,GAAmB,CAAA;AACzB,QAAA,MAAM,MAAA,GAAS;AAAA,UACb,SAAA;AAAA,UACA,WAAA,EAAa,gBAAA;AAAA;AAAA,UACb,mBAAA,EAAqB,gBAAA;AAAA;AAAA,UACrB,SAAA,EAAW,IAAA;AAAA,UACX,YAAA,EAAc,QAAA,IAAY,OAAA,CAAQ,GAAA,CAAI;AAAA,SACxC;AAEA,QAAA,IAAI,uBAAuB,CAAA,EAAG;AAC5B,UAAA,IAAA,CAAK,MAAA,CAAO,KAAA;AAAA,YACV,CAAA,0CAAA,EAA6C,SAAS,CAAA,EAAA,EAAK,kBAAkB,CAAA,gDAAA;AAAA,WAC/E;AAAA,QACF;AAEA,QAAA,IAAA,CAAK,MAAA,CAAO,MAAM,CAAA,wCAAA,CAAA,EAA4C;AAAA,UAC5D,SAAA;AAAA,UACA,mBAAA,EAAqB,gBAAA;AAAA,UACrB,WAAA,EAAa,gBAAA;AAAA,UACb,mBAAA,EAAqB,kBAAA;AAAA,UACrB,SAAA,EAAW,CAAC,CAAC,MAAA,CAAO;AAAA,SACrB,CAAA;AAED,QAAA,MAAM,UAAA,GAAa,IAAIJ,iBAAA,CAAW,MAAM,CAAA;AAGxC,QAAA,IAAA,CAAK,MAAA,CAAO,MAAM,CAAA,yCAAA,CAAA,EAA6C;AAAA,UAC7D,SAAA;AAAA;AAAA,UACA,WAAY,UAAA,CAAmB,SAAA;AAAA,UAC/B,qBAAsB,UAAA,CAAmB,mBAAA;AAAA,UACzC,aAAa,UAAA,CAAW,WAAA;AAAA,UACxB,WAAW,UAAA,CAAW,SAAA;AAAA;AAAA,UAEtB,cAAe,UAAA,CAAmB,YAAA;AAAA,UAClC,QAAS,UAAA,CAAmB;AAAA,SAC7B,CAAA;AAED,QAAA,OAAO,UAAA;AAAA,MACT,CAAA,MAAO;AAEL,QAAA,MAAM,MAAA,GAAS;AAAA,UACb,SAAA;AAAA,UACA,WAAA,EAAa,kBAAA;AAAA,UACb,SAAA,EAAW,gBAAA;AAAA;AAAA,UACX,SAAA,EAAW,IAAA;AAAA,UACX,YAAA,EAAc,QAAA,IAAY,OAAA,CAAQ,GAAA,CAAI;AAAA,SACxC;AAEA,QAAA,IAAA,CAAK,MAAA,CAAO,MAAM,CAAA,wCAAA,CAAA,EAA4C;AAAA,UAC5D,SAAA;AAAA,UACA,SAAA,EAAW,gBAAA;AAAA,UACX,WAAA,EAAa,kBAAA;AAAA,UACb,SAAA,EAAW,CAAC,CAAC,MAAA,CAAO;AAAA,SACrB,CAAA;AAED,QAAA,MAAM,UAAA,GAAa,IAAIA,iBAAA,CAAW,MAAM,CAAA;AAGxC,QAAA,IAAA,CAAK,MAAA,CAAO,MAAM,CAAA,yCAAA,CAAA,EAA6C;AAAA,UAC7D,SAAA;AAAA;AAAA,UACA,WAAY,UAAA,CAAmB,SAAA;AAAA,UAC/B,qBAAsB,UAAA,CAAmB,mBAAA;AAAA,UACzC,aAAa,UAAA,CAAW,WAAA;AAAA,UACxB,WAAW,UAAA,CAAW,SAAA;AAAA;AAAA,UAEtB,cAAe,UAAA,CAAmB,YAAA;AAAA,UAClC,QAAS,UAAA,CAAmB;AAAA,SAC7B,CAAA;AAED,QAAA,OAAO,UAAA;AAAA,MACT;AAAA,IACF,CAAA;AAAA;AAAA,IAGA,CAAA,QAAA,gBAAwB,MAAM;AAC5B,MAAA,MAAM,IAAI,MAAM,oCAAoC,CAAA;AAAA,IACtD,CAAA;AAAA,IACA,CAAA,gBAAA,wBAAgC,MAAM;AACpC,MAAA,MAAM,IAAI,MAAM,4CAA4C,CAAA;AAAA,IAC9D,CAAA;AAAA,IACA,CAAA,kBAAA,0BAAkC,MAAM;AACtC,MAAA,MAAM,IAAI,MAAM,8CAA8C,CAAA;AAAA,IAChE,CAAA;AAAA,IACA,CAAA,UAAA,kBAA0B,MAAM;AAC9B,MAAA,MAAM,IAAI,MAAM,sCAAsC,CAAA;AAAA,IACxD;AAAA,GACF;AAAA;AAAA,EAGiB,mBAAA,GAGb;AAAA,IACF,yBAAwB,CAAC,EAAE,SAAA,EAAW,QAAA,EAAU,cAAa,KAAM;AACjE,MAAA,OAAO,IAAIK,mBAAA,CAAa;AAAA,QACtB,MAAA,EAAQ,QAAA,IAAY,OAAA,CAAQ,GAAA,CAAI,cAAA;AAAA,QAChC,KAAA,EAAO,SAAA;AAAA,QACP,MAAM,YAAA,IAAgB;AAAA,OACvB,CAAA;AAAA,IACH,CAAA;AAAA,IAEA,6BAA0B,CAAC,EAAE,SAAA,EAAW,QAAA,EAAU,cAAa,KAAM;AACnE,MAAA,OAAO,IAAI,cAAA,CAAe;AAAA,QACxB,MAAA,EAAQ,QAAA,IAAY,OAAA,CAAQ,GAAA,CAAI,gBAAA;AAAA,QAChC,KAAA,EAAO,SAAA;AAAA,QACP,MAAM,YAAA,IAAgB;AAAA,OACvB,CAAA;AAAA,IACH,CAAA;AAAA;AAAA,IAGA,yBAAwB,MAAA;AAAA,IACxB,+BAA2B,MAAA;AAAA,IAC3B,2BAAyB,MAAA;AAAA,IACzB,mBAAqB,MAAA;AAAA,IACrB,yBAAwB,MAAA;AAAA,IACxB,yCAAgC,MAAA;AAAA,IAChC,uCAA+B,MAAA;AAAA,IAC/B,6CAAkC;AAAA,GACpC;AAAA;AAAA,EAGiB,sBAAA,GAGb;AAAA,IACF,CAAA,QAAA,gBAAwB,CAAC,EAAE,WAAW,QAAA,EAAS,KAC7C,IAAIC,uBAAA,CAAiB;AAAA,MACnB,KAAA,EAAO,SAAA;AAAA,MACP,MAAA,EAAQ,QAAA,IAAY,OAAA,CAAQ,GAAA,CAAI;AAAA,KACjC,CAAA;AAAA;AAAA,IAGH,+BAA2B,MAAA;AAAA,IAC3B,yBAAwB,MAAA;AAAA,IACxB,2BAAyB,MAAA;AAAA,IACzB,mBAAqB,MAAA;AAAA,IACrB,yBAAwB,MAAA;AAAA,IACxB,yCAAgC,MAAA;AAAA,IAChC,uCAA+B,MAAA;AAAA,IAC/B,6CAAkC,MAAA;AAAA,IAClC,6BAA0B;AAAA,GAC5B;AAAA,EAEA,MAAM,oBACJ,MAAA,EAIA;AAEA,IAAA,MAAM,QAAA,GAAW,IAAA,CAAK,qBAAA,CAAsB,MAAM,CAAA;AAGlD,IAAA,MAAM,WAAA,GAAc,IAAA,CAAK,kBAAA,CAAmB,GAAA,CAAI,QAAQ,CAAA;AACxD,IAAA,IAAI,WAAA,EAAa;AACf,MAAA,IAAA,CAAK,MAAA,CAAO,KAAA,CAAM,CAAA,kCAAA,EAAqC,QAAQ,CAAA,CAAE,CAAA;AACjE,MAAA,OAAO,WAAA;AAAA,IACT;AAEA,IAAA,MAAM,WAAA,GAAc,MAAM,IAAA,CAAK,sBAAA,CAAuB,OAAO,OAAO,CAAA;AAEpE,IAAA,IAAI,YAAY,SAAA,KAAA,MAAA,aAA8B;AAC5C,MAAA,MAAM,IAAI,KAAA;AAAA,QACR,CAAA,MAAA,EAAS,MAAA,CAAO,OAAO,CAAA,4BAAA,EAA+B,YAAY,SAAS,CAAA,CAAA;AAAA,OAC7E;AAAA,IACF;AAEA,IAAA,MAAM,OAAA,GAAU,IAAA,CAAK,iBAAA,CAAkB,WAAA,CAAY,QAAQ,CAAA;AAC3D,IAAA,IAAI,CAAC,OAAA,EAAS;AACZ,MAAA,MAAM,IAAI,KAAA;AAAA,QACR,CAAA,wCAAA,EAA2C,YAAY,QAAQ,CAAA;AAAA,OACjE;AAAA,IACF;AAGA,IAAA,MAAM,WAAA,GAA2C;AAAA,MAC/C,GAAG,WAAA;AAAA,MACH,kBAAA,EAAoB,MAAA;AAAA,QAClB,MAAA,CAAO,eAAe,WAAA,CAAY;AAAA,OACpC;AAAA,MACA,gBAAA,EAAkB,MAAA;AAAA,QAChB,MAAA,CAAO,aAAa,WAAA,CAAY;AAAA;AAClC,KACF;AAEA,IAAA,IAAA,CAAK,MAAA,CAAO,KAAA,CAAM,CAAA,kCAAA,EAAqC,QAAQ,CAAA,CAAE,CAAA;AACjE,IAAA,MAAM,KAAA,GAAQ,QAAQ,WAAW,CAAA;AAGjC,IAAA,KAAA,CAAM,QAAA,GAAW;AAAA,MACf,GAAG,KAAA,CAAM,QAAA;AAAA,MACT,SAAS,MAAA,CAAO;AAAA,KAClB;AAEA,IAAA,IAAA,CAAK,MAAA,CAAO,MAAM,2CAAA,EAAsC;AAAA,MACtD,SAAS,MAAA,CAAO,OAAA;AAAA,MAChB,cAAc,MAAA,CAAO,IAAA,CAAK,KAAA,CAAM,QAAA,IAAY,EAAE,CAAA;AAAA,MAC9C,UAAA,EAAY,CAAC,CAAC,KAAA,CAAM,QAAA,EAAU;AAAA,KAC/B,CAAA;AAGD,IAAA,IAAA,CAAK,MAAA,CAAO,KAAA;AAAA,MACV,CAAA,kCAAA,EAAqC,CAAC,CAAC,MAAA,CAAO,WAAW,CAAA,sBAAA,EAAyB,CAAC,CAAC,MAAA,CAAO,WAAW,CAAA;AAAA,KACxG;AACA,IAAA,IAAI,OAAO,WAAA,EAAa;AACtB,MAAA,IAAA,CAAK,MAAA,CAAO,KAAA;AAAA,QACV,CAAA,kCAAA,EAAqC,OAAO,WAAA,CAAY,MAAM,cAAc,IAAA,CAAK,SAAA,CAAU,MAAA,CAAO,WAAW,CAAC,CAAA;AAAA,OAChH;AAAA,IACF;AAEA,IAAA,IAAI,MAAA,CAAO,WAAA,IAAe,MAAA,CAAO,WAAA,EAAa;AAC5C,MAAA,IAAA,CAAK,MAAA,CAAO,KAAA;AAAA,QACV,CAAA,mDAAA,EAAsD,IAAA,CAAK,SAAA,CAAU,MAAA,CAAO,WAAW,CAAC,CAAA;AAAA,OAC1F;AACA,MAAA,MAAM,UAAA,GAAa,MAAM,IAAA,CAAK,gBAAA;AAAA,QAC5B,KAAA;AAAA,QACA,MAAA,CAAO,WAAA;AAAA,QACP,MAAA,CAAO;AAAA,OACT;AACA,MAAA,IAAA,CAAK,MAAA,CAAO,MAAM,CAAA,8CAAA,CAAgD,CAAA;AAGlE,MAAA,IAAA,CAAK,kBAAA,CAAmB,GAAA,CAAI,QAAA,EAAU,UAAU,CAAA;AAChD,MAAA,OAAO,UAAA;AAAA,IACT;AAGA,IAAA,IAAA,CAAK,kBAAA,CAAmB,GAAA,CAAI,QAAA,EAAU,KAAK,CAAA;AAE3C,IAAA,OAAO,KAAA;AAAA,EACT;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAWA,MAAc,gBAAA,CACZ,KAAA,EACA,WAAA,EACA,WAAA,EAIA;AACA,IAAA,MAAM,WAA6B,EAAC;AAGpC,IAAA,IAAI,WAAA,IAAe,WAAA,CAAY,MAAA,GAAS,CAAA,EAAG;AACzC,MAAA,IAAI;AAEF,QAAA,MAAM,qBAAqB,WAAA,CAAY,MAAA;AAAA,UACrC,CAAA,EAAA,KAAM,GAAG,OAAA,KAAY;AAAA,SACvB;AAEA,QAAA,IAAI,kBAAA,CAAmB,SAAS,CAAA,EAAG;AACjC,UAAA,IAAA,CAAK,MAAA,CAAO,KAAA;AAAA,YACV,CAAA,SAAA,EAAY,kBAAA,CAAmB,MAAM,CAAA,8CAAA,EAAiD,kBAAA,CAAmB,GAAA,CAAI,CAAA,EAAA,KAAM,EAAA,CAAG,QAAQ,CAAA,CAAE,IAAA,CAAK,IAAI,CAAC,CAAA;AAAA,WAC5I;AAGA,UAAA,MAAM,aAAA,GAAgB,IAAI,aAAA,EAAc;AACxC,UAAA,MAAM,QAAA,GACJ,MAAM,aAAA,CAAc,gBAAA,CAAiB,kBAAkB,CAAA;AAEzD,UAAA,IAAA,CAAK,MAAA,CAAO,KAAA;AAAA,YACV,CAAA,qBAAA,EAAwB,SAAS,MAAM,CAAA,4CAAA;AAAA,WACzC;AAEA,UAAA,QAAA,CAAS,IAAA,CAAK,GAAG,QAAQ,CAAA;AAAA,QAC3B;AAAA,MACF,SAAS,KAAA,EAAO;AACd,QAAA,IAAA,CAAK,MAAA,CAAO,KAAA;AAAA,UACV,2CAA2C,KAAA,YAAiB,KAAA,GAAQ,MAAM,OAAA,GAAU,MAAA,CAAO,KAAK,CAAC,CAAA;AAAA,SACnG;AAAA,MAEF;AAAA,IACF;AAGA,IAAA,IAAI,WAAA,IAAe,WAAA,CAAY,MAAA,GAAS,CAAA,EAAG;AACzC,MAAA,QAAA,CAAS,IAAA,CAAK,GAAG,WAAW,CAAA;AAC5B,MAAA,IAAA,CAAK,MAAA,CAAO,KAAA,CAAM,CAAA,MAAA,EAAS,WAAA,CAAY,MAAM,CAAA,sBAAA,CAAwB,CAAA;AAAA,IACvE;AAGA,IAAA,IAAI,QAAA,CAAS,SAAS,CAAA,EAAG;AACvB,MAAA,IAAA,CAAK,MAAA,CAAO,KAAA,CAAM,CAAA,QAAA,EAAW,QAAA,CAAS,MAAM,CAAA,eAAA,CAAiB,CAAA;AAG7D,MAAA,MAAM,cAAA,GAAiB,KAAA,CAAM,SAAA,CAAU,QAAQ,CAAA;AAC/C,MAAA,OAAO,cAAA;AAAA,IACT;AAEA,IAAA,OAAO,KAAA;AAAA,EACT;AAAA,EAEA,MAAM,sBACJ,MAAA,EACiC;AAEjC,IAAA,MAAM,QAAA,GAAW,IAAA,CAAK,qBAAA,CAAsB,MAAM,CAAA;AAGlD,IAAA,MAAM,WAAA,GAAc,IAAA,CAAK,kBAAA,CAAmB,GAAA,CAAI,QAAQ,CAAA;AACxD,IAAA,IAAI,WAAA,EAAa;AACf,MAAA,IAAA,CAAK,MAAA,CAAO,KAAA,CAAM,CAAA,oCAAA,EAAuC,QAAQ,CAAA,CAAE,CAAA;AACnE,MAAA,OAAO,WAAA;AAAA,IACT;AAEA,IAAA,MAAM,WAAA,GAAc,MAAM,IAAA,CAAK,sBAAA,CAAuB,OAAO,OAAO,CAAA;AAEpE,IAAA,IAAI,YAAY,SAAA,KAAA,QAAA,eAAgC;AAC9C,MAAA,MAAM,IAAI,KAAA;AAAA,QACR,CAAA,MAAA,EAAS,MAAA,CAAO,OAAO,CAAA,8BAAA,EAAiC,YAAY,SAAS,CAAA,CAAA;AAAA,OAC/E;AAAA,IACF;AAEA,IAAA,MAAM,OAAA,GAAU,IAAA,CAAK,mBAAA,CAAoB,WAAA,CAAY,QAAQ,CAAA;AAC7D,IAAA,IAAI,CAAC,OAAA,EAAS;AACZ,MAAA,MAAM,IAAI,KAAA;AAAA,QACR,CAAA,0CAAA,EAA6C,YAAY,QAAQ,CAAA;AAAA,OACnE;AAAA,IACF;AAEA,IAAA,IAAA,CAAK,MAAA,CAAO,KAAA,CAAM,CAAA,oCAAA,EAAuC,QAAQ,CAAA,CAAE,CAAA;AACnE,IAAA,MAAM,KAAA,GAAQ,QAAQ,WAAW,CAAA;AAGjC,IAAC,MAAc,QAAA,GAAW;AAAA,MACxB,GAAI,KAAA,CAAc,QAAA;AAAA,MAClB,SAAS,MAAA,CAAO;AAAA,KAClB;AAGA,IAAA,IAAA,CAAK,kBAAA,CAAmB,GAAA,CAAI,QAAA,EAAU,KAAK,CAAA;AAE3C,IAAA,OAAO,KAAA;AAAA,EACT;AAAA,EAEA,MAAM,yBAAyB,MAAA,EAA8C;AAE3E,IAAA,MAAM,QAAA,GAAW,IAAA,CAAK,qBAAA,CAAsB,MAAM,CAAA;AAGlD,IAAA,MAAM,WAAA,GAAc,IAAA,CAAK,kBAAA,CAAmB,GAAA,CAAI,QAAQ,CAAA;AACxD,IAAA,IAAI,WAAA,EAAa;AACf,MAAA,IAAA,CAAK,MAAA,CAAO,KAAA,CAAM,CAAA,uCAAA,EAA0C,QAAQ,CAAA,CAAE,CAAA;AACtE,MAAA,OAAO,WAAA;AAAA,IACT;AAEA,IAAA,MAAM,WAAA,GAAc,MAAM,IAAA,CAAK,sBAAA,CAAuB,OAAO,OAAO,CAAA;AAEpE,IAAA,IAAI,YAAY,SAAA,KAAA,WAAA,kBAAmC;AACjD,MAAA,MAAM,IAAI,KAAA;AAAA,QACR,CAAA,MAAA,EAAS,MAAA,CAAO,OAAO,CAAA,kCAAA,EAAqC,YAAY,SAAS,CAAA,CAAA;AAAA,OACnF;AAAA,IACF;AAEA,IAAA,MAAM,OAAA,GAAU,IAAA,CAAK,sBAAA,CAAuB,WAAA,CAAY,QAAQ,CAAA;AAChE,IAAA,IAAI,CAAC,OAAA,EAAS;AACZ,MAAA,MAAM,IAAI,KAAA;AAAA,QACR,CAAA,6CAAA,EAAgD,YAAY,QAAQ,CAAA;AAAA,OACtE;AAAA,IACF;AAEA,IAAA,IAAA,CAAK,MAAA,CAAO,KAAA,CAAM,CAAA,uCAAA,EAA0C,QAAQ,CAAA,CAAE,CAAA;AACtE,IAAA,MAAM,KAAA,GAAQ,QAAQ,WAAW,CAAA;AAGjC,IAAC,MAAc,QAAA,GAAW;AAAA,MACxB,GAAI,KAAA,CAAc,QAAA;AAAA,MAClB,SAAS,MAAA,CAAO;AAAA,KAClB;AAGA,IAAA,IAAA,CAAK,kBAAA,CAAmB,GAAA,CAAI,QAAA,EAAU,KAAK,CAAA;AAE3C,IAAA,OAAO,KAAA;AAAA,EACT;AAAA;AAAA,EAIA,MAAM,oBAAoB,OAAA,EAA+C;AACvE,IAAA,MAAM,MAAA,GAAS,MAAM,IAAA,CAAK,sBAAA,CAAuB,OAAO,CAAA;AAExD,IAAA,IAAI,OAAO,SAAA,KAAA,MAAA,aAA8B;AACvC,MAAA,MAAM,IAAI,KAAA;AAAA,QACR,CAAA,MAAA,EAAS,OAAO,CAAA,2BAAA,EAA8B,MAAA,CAAO,SAAS,CAAA;AAAA,OAChE;AAAA,IACF;AAEA,IAAA,OAAO,IAAA,CAAK,oBAAoB,MAAM,CAAA;AAAA,EACxC;AAAA,EAEA,MAAM,sBACJ,OAAA,EACiC;AACjC,IAAA,MAAM,MAAA,GAAS,MAAM,IAAA,CAAK,sBAAA,CAAuB,OAAO,CAAA;AAExD,IAAA,IAAI,OAAO,SAAA,KAAA,QAAA,eAAgC;AACzC,MAAA,MAAM,IAAI,KAAA;AAAA,QACR,CAAA,MAAA,EAAS,OAAO,CAAA,6BAAA,EAAgC,MAAA,CAAO,SAAS,CAAA;AAAA,OAClE;AAAA,IACF;AAEA,IAAA,OAAO,IAAA,CAAK,sBAAsB,MAAM,CAAA;AAAA,EAC1C;AAAA,EAEA,MAAM,yBAAyB,OAAA,EAAsC;AACnE,IAAA,MAAM,MAAA,GAAS,MAAM,IAAA,CAAK,sBAAA,CAAuB,OAAO,CAAA;AAExD,IAAA,IAAI,OAAO,SAAA,KAAA,WAAA,kBAAmC;AAC5C,MAAA,MAAM,IAAI,KAAA;AAAA,QACR,CAAA,MAAA,EAAS,OAAO,CAAA,iCAAA,EAAoC,MAAA,CAAO,SAAS,CAAA;AAAA,OACtE;AAAA,IACF;AAEA,IAAA,OAAO,IAAA,CAAK,yBAAyB,MAAM,CAAA;AAAA,EAC7C;AAAA,EAEA,MAAM,eAAA,CACJ,OAAA,EACA,YAAA,EACgB;AAChB,IAAA,MAAM,MAAA,GAAS,MAAM,IAAA,CAAK,sBAAA,CAAuB,OAAO,CAAA;AAGxD,IAAA,IAAI,YAAA,IAAgB,MAAA,CAAO,SAAA,KAAc,YAAA,EAAc;AACrD,MAAA,MAAM,IAAI,KAAA;AAAA,QACR,SAAS,OAAO,CAAA,gBAAA,EAAmB,YAAY,CAAA,WAAA,EAAc,OAAO,SAAS,CAAA;AAAA,OAC/E;AAAA,IACF;AAEA,IAAA,OAAO,IAAA,CAAK,sBAAsB,MAAM,CAAA;AAAA,EAC1C;AAAA;AAAA,EAIA,MAAM,sBAAsB,MAAA,EAAiD;AAC3E,IAAA,QAAQ,OAAO,SAAA;AAAW,MACxB,KAAA,MAAA;AACE,QAAA,OAAO,IAAA,CAAK,oBAAoB,MAAM,CAAA;AAAA,MAExC,KAAA,QAAA;AACE,QAAA,OAAO,IAAA,CAAK,sBAAsB,MAAM,CAAA;AAAA,MAE1C,KAAA,WAAA;AACE,QAAA,OAAO,IAAA,CAAK,yBAAyB,MAAM,CAAA;AAAA,MAE7C,KAAA,OAAA;AAAA,MACA,KAAA,QAAA;AACE,QAAA,MAAM,IAAI,KAAA,CAAM,CAAA,WAAA,EAAc,MAAA,CAAO,SAAS,CAAA,kBAAA,CAAoB,CAAA;AAAA,MAEpE;AACE,QAAA,MAAM,IAAI,KAAA,CAAM,CAAA,oBAAA,EAAuB,MAAA,CAAO,SAAS,CAAA,CAAE,CAAA;AAAA;AAC7D,EACF;AAAA,EAEA,MAAM,uBACJ,OAAA,EACsC;AAEtC,IAAA,MAAM,YAAA,GAAe,IAAA,CAAK,gBAAA,CAAiB,GAAA,CAAI,OAAO,CAAA;AACtD,IAAA,IAAI,YAAA,EAAc;AAChB,MAAA,IAAA,CAAK,MAAA,CAAO,KAAA,CAAM,CAAA,2BAAA,EAA8B,OAAO,CAAA,CAAE,CAAA;AACzD,MAAA,OAAO,YAAA;AAAA,IACT;AAEA,IAAA,IAAA,CAAK,MAAA,CAAO,KAAA,CAAM,CAAA,uBAAA,EAA0B,OAAO,CAAA,CAAE,CAAA;AAGrD,IAAA,MAAM,UAAA,GAAa,IAAA,CAAK,aAAA,GACpB,MAAM,IAAA,CAAK,aAAA,CAAc,OAAO,CAAA,GAChC,MAAM,IAAA,CAAK,YAAA,CAAa,OAAO,CAAA;AAKnC,IAAA,MAAM,MAAA,GAAS;AAAA,MACb,GAAG,UAAA;AAAA,MACH,WAAY,UAAA,CAAmB,SAAA,IAAA,MAAA;AAAA;AAAA,MAC/B,cAAe,UAAA,CAAmB,YAAA;AAAA,MAClC,YAAa,UAAA,CAAmB,UAAA;AAAA,MAChC,kBAAmB,UAAA,CAAmB;AAAA,KACxC;AAKA,IAAA,IAAA,CAAK,gBAAA,CAAiB,GAAA,CAAI,OAAA,EAAS,MAAM,CAAA;AAEzC,IAAA,OAAO,MAAA;AAAA,EACT;AAAA,EAEA,qBAAqB,SAAA,EAA+B;AAClD,IAAA,OAAO,uEAAsD,CAAE,QAAA;AAAA,MAC7D;AAAA,KACF;AAAA,EACF;AAAA,EAEA,sBAAA,GAAsC;AACpC,IAAA,OAAO,CAAA,MAAA,aAAA,QAAA,eAAA,WAAA,iBAAsD;AAAA,EAC/D;AAAA;AAAA;AAAA;AAAA,EAKA,UAAA,GAAmB;AACjB,IAAA,IAAA,CAAK,MAAA,CAAO,KAAA;AAAA,MACV,oCAAoC,IAAA,CAAK,gBAAA,CAAiB,IAAI,CAAA,UAAA,EAAa,IAAA,CAAK,mBAAmB,IAAI,CAAA,UAAA;AAAA,KACzG;AACA,IAAA,IAAA,CAAK,iBAAiB,KAAA,EAAM;AAC5B,IAAA,IAAA,CAAK,mBAAmB,KAAA,EAAM;AAAA,EAChC;AAAA;AAAA;AAAA;AAAA,EAKA,gBAAgB,OAAA,EAAuB;AACrC,IAAA,IAAA,CAAK,gBAAA,CAAiB,OAAO,OAAO,CAAA;AAGpC,IAAA,MAAM,eAAyB,EAAC;AAChC,IAAA,KAAA,MAAW,CAAC,GAAG,CAAA,IAAK,IAAA,CAAK,kBAAA,CAAmB,SAAQ,EAAG;AACrD,MAAA,IAAI,GAAA,CAAI,UAAA,CAAW,CAAA,EAAG,OAAO,GAAG,CAAA,EAAG;AACjC,QAAA,YAAA,CAAa,KAAK,GAAG,CAAA;AAAA,MACvB;AAAA,IACF;AAEA,IAAA,YAAA,CAAa,QAAQ,CAAA,GAAA,KAAO;AAC1B,MAAA,IAAA,CAAK,kBAAA,CAAmB,OAAO,GAAG,CAAA;AAAA,IACpC,CAAC,CAAA;AAED,IAAA,IAAA,CAAK,MAAA,CAAO,KAAA;AAAA,MACV,CAAA,wBAAA,EAA2B,OAAO,CAAA,EAAA,EAAK,YAAA,CAAa,MAAM,CAAA,UAAA;AAAA,KAC5D;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKA,aAAA,GAAgB;AACd,IAAA,OAAO;AAAA,MACL,eAAA,EAAiB,KAAK,gBAAA,CAAiB,IAAA;AAAA,MACvC,iBAAA,EAAmB,KAAK,kBAAA,CAAmB,IAAA;AAAA,MAC3C,iBAAiB,KAAA,CAAM,IAAA,CAAK,IAAA,CAAK,gBAAA,CAAiB,MAAM,CAAA;AAAA,MACxD,mBAAmB,KAAA,CAAM,IAAA,CAAK,IAAA,CAAK,kBAAA,CAAmB,MAAM;AAAA,KAC9D;AAAA,EACF;AAAA;AAAA,EAGA,MAAc,aACZ,OAAA,EACsC;AACtC,IAAA,MAAM,MAAA,GAAS,QAAQ,GAAA,CAAI,OAAA;AAC3B,IAAA,MAAM,KAAA,GAAQ,QAAQ,GAAA,CAAI,kBAAA;AAE1B,IAAA,IAAI,CAAC,KAAA,EAAO;AACV,MAAA,MAAM,IAAI,MAAM,0CAA0C,CAAA;AAAA,IAC5D;AAEA,IAAA,MAAM,GAAA,GAAM,CAAA,EAAG,MAAM,CAAA,+BAAA,EAAkC,OAAO,CAAA,OAAA,CAAA;AAE9D,IAAA,MAAM,QAAA,GAAW,MAAM,KAAA,CAAM,GAAA,EAAK;AAAA,MAChC,MAAA,EAAQ,KAAA;AAAA,MACR,OAAA,EAAS;AAAA,QACP,kBAAA,EAAoB,KAAA;AAAA,QACpB,cAAA,EAAgB;AAAA;AAClB,KACD,CAAA;AAED,IAAA,IAAI,CAAC,SAAS,EAAA,EAAI;AAChB,MAAA,MAAM,IAAI,KAAA;AAAA,QACR,CAAA,8BAAA,EAAiC,QAAA,CAAS,MAAM,CAAA,CAAA,EAAI,SAAS,UAAU,CAAA;AAAA,OACzE;AAAA,IACF;AAEA,IAAA,MAAM,MAAA,GAAS,MAAM,QAAA,CAAS,IAAA,EAAK;AAEnC,IAAA,OAAA,CAAQ,KAAA;AAAA,MACN,oDAAoD,OAAO,CAAA,CAAA,CAAA;AAAA,MAC3D;AAAA,QACE,GAAA;AAAA,QACA,YAAY,QAAA,CAAS,MAAA;AAAA,QACrB,UAAA,EAAY,MAAA,CAAO,IAAA,CAAK,MAAM,CAAA;AAAA,QAC9B,WAAW,MAAA,CAAO,SAAA;AAAA,QAClB,YAAA,EAAc,CAAC,CAAC,MAAA,CAAO,SAAA;AAAA,QACvB,UAAA,EAAY;AAAA;AACd,KACF;AAGA,IAAA,MAAM,MAAA,GAAS;AAAA,MACb,GAAG,MAAA;AAAA,MACH,WAAW,MAAA,CAAO,SAAA,IAAA,MAAA;AAAA;AAAA,KACpB;AAEA,IAAA,OAAA,CAAQ,MAAM,CAAA,6CAAA,CAAA,EAAiD;AAAA,MAC7D,OAAA;AAAA,MACA,iBAAiB,MAAA,CAAO,SAAA;AAAA,MACxB,YAAA,EAAc,CAAC,MAAA,CAAO,SAAA;AAAA,MACtB,UAAA,EAAY,MAAA,CAAO,IAAA,CAAK,MAAM;AAAA,KAC/B,CAAA;AAED,IAAA,OAAO,MAAA;AAAA,EACT;AACF;;;ACrqCO,IAAK,mBAAA,qBAAAC,oBAAAA,KAAL;AACL,EAAAA,qBAAA,QAAA,CAAA,GAAS,QAAA;AACT,EAAAA,qBAAA,KAAA,CAAA,GAAM,KAAA;AACN,EAAAA,qBAAA,YAAA,CAAA,GAAa,YAAA;AAHH,EAAA,OAAAA,oBAAAA;AAAA,CAAA,EAAA,mBAAA,IAAA,EAAA;AC+BCC,2BAAN,sBAAA,CAAuB;AAAA,EACX,MAAA,GAAS,IAAItG,aAAAA,CAAOsG,wBAAA,CAAiB,IAAI,CAAA;AAAA,EACzC,MAAA;AAAA,EACA,aAAA;AAAA,EACA,OAAA;AAAA,EACA,OAAA;AAAA,EAEjB,WAAA,CAAY,MAAA,GAA0B,EAAC,EAAG;AAIxC,IAAA,IAAA,CAAK,MAAA,GACH,MAAA,CAAO,MAAA,IAAU,OAAA,CAAQ,IAAI,OAAA,IAAW,uBAAA;AAC1C,IAAA,IAAA,CAAK,aAAA,GACH,MAAA,CAAO,aAAA,IAAiB,OAAA,CAAQ,IAAI,kBAAA,IAAsB,EAAA;AAC5D,IAAA,IAAA,CAAK,OAAA,GAAU,OAAO,OAAA,IAAW,GAAA;AACjC,IAAA,IAAA,CAAK,OAAA,GAAU,OAAO,OAAA,IAAW,CAAA;AAEjC,IAAA,IAAI,CAAC,KAAK,aAAA,EAAe;AACvB,MAAA,MAAM,IAAI,MAAM,uDAAuD,CAAA;AAAA,IACzE;AAEA,IAAA,IAAA,CAAK,MAAA,CAAO,GAAA;AAAA,MACV,CAAA,2CAAA,EAA8C,KAAK,MAAM,CAAA;AAAA,KAC3D;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKA,MAAc,WAAA,CACZ,QAAA,EACA,OAAA,GAII,EAAC,EACO;AACZ,IAAA,MAAM,EAAE,MAAA,GAAS,KAAA,EAAO,MAAM,OAAA,GAAU,IAAA,CAAK,SAAQ,GAAI,OAAA;AACzD,IAAA,MAAM,GAAA,GAAM,CAAA,EAAG,IAAA,CAAK,MAAM,GAAG,QAAQ,CAAA,CAAA;AAErC,IAAA,IAAI,SAAA;AAEJ,IAAA,KAAA,IAAS,OAAA,GAAU,CAAA,EAAG,OAAA,IAAW,IAAA,CAAK,SAAS,OAAA,EAAA,EAAW;AACxD,MAAA,IAAI;AACF,QAAA,IAAA,CAAK,MAAA,CAAO,KAAA;AAAA,UACV,CAAA,OAAA,EAAU,MAAM,CAAA,YAAA,EAAe,GAAG,aAAa,OAAO,CAAA,CAAA,EAAI,KAAK,OAAO,CAAA,CAAA;AAAA,SACxE;AAEA,QAAA,MAAM,QAAA,GAAW,MAAM,KAAA,CAAM,GAAA,EAAK;AAAA,UAChC,MAAA;AAAA,UACA,OAAA,EAAS;AAAA,YACP,oBAAoB,IAAA,CAAK,aAAA;AAAA,YACzB,cAAA,EAAgB,kBAAA;AAAA,YAChB,YAAA,EAAc;AAAA,WAChB;AAAA,UACA,IAAA,EAAM,IAAA,GAAO,IAAA,CAAK,SAAA,CAAU,IAAI,CAAA,GAAI,KAAA,CAAA;AAAA,UACpC,MAAA,EAAQ,WAAA,CAAY,OAAA,CAAQ,OAAO;AAAA,SACpC,CAAA;AAED,QAAA,IAAI,CAAC,SAAS,EAAA,EAAI;AAChB,UAAA,MAAM,YAAY,MAAM,QAAA,CAAS,MAAK,CAAE,KAAA,CAAM,MAAM,eAAe,CAAA;AACnE,UAAA,MAAM,IAAI,KAAA;AAAA,YACR,QAAQ,QAAA,CAAS,MAAM,IAAI,QAAA,CAAS,UAAU,KAAK,SAAS,CAAA;AAAA,WAC9D;AAAA,QACF;AAEA,QAAA,MAAM,IAAA,GAAO,MAAM,QAAA,CAAS,IAAA,EAAK;AACjC,QAAA,IAAA,CAAK,MAAA,CAAO,KAAA,GAAQ,CAAA,8BAAA,EAAiC,OAAO,CAAA,CAAE,CAAA;AAC9D,QAAA,OAAO,IAAA;AAAA,MACT,SAAS,KAAA,EAAO;AACd,QAAA,SAAA,GAAY,iBAAiB,KAAA,GAAQ,KAAA,GAAQ,IAAI,KAAA,CAAM,MAAA,CAAO,KAAK,CAAC,CAAA;AAEpE,QAAA,IAAI,OAAA,KAAY,KAAK,OAAA,EAAS;AAC5B,UAAA,IAAA,CAAK,MAAA,CAAO,KAAA;AAAA,YACV,CAAA,qBAAA,EAAwB,IAAA,CAAK,OAAO,CAAA,WAAA,EAAc,UAAU,OAAO,CAAA;AAAA,WACrE;AACA,UAAA;AAAA,QACF;AAEA,QAAA,MAAM,YAAA,GAAe,IAAA,CAAK,GAAA,CAAI,GAAA,GAAO,IAAA,CAAK,IAAI,CAAA,EAAG,OAAA,GAAU,CAAC,CAAA,EAAG,GAAK,CAAA;AACpE,QAAA,IAAA,CAAK,MAAA,CAAO,IAAA;AAAA,UACV,CAAA,wBAAA,EAA2B,OAAO,CAAA,CAAA,EAAI,IAAA,CAAK,OAAO,CAAA,eAAA,EAAkB,YAAY,CAAA,IAAA,EAAO,SAAA,CAAU,OAAO,CAAA;AAAA,SAC1G;AAEA,QAAA,MAAM,IAAI,OAAA,CAAQ,CAAA1E,aAAW,UAAA,CAAWA,QAAAA,EAAS,YAAY,CAAC,CAAA;AAAA,MAChE;AAAA,IACF;AAEA,IAAA,IAAI,CAAC,SAAA,EAAW;AACd,MAAA,MAAM,IAAI,MAAM,mCAAmC,CAAA;AAAA,IACrD;AAEA,IAAA,MAAM,SAAA;AAAA,EACR;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,WAAA,GAAgC;AACpC,IAAA,IAAI;AACF,MAAA,MAAM,KAAK,WAAA,CAAY,SAAA,EAAW,EAAE,OAAA,EAAS,KAAM,CAAA;AACnD,MAAA,OAAO,IAAA;AAAA,IACT,SAAS,KAAA,EAAO;AACd,MAAA,IAAA,CAAK,MAAA,CAAO,IAAA,CAAK,CAAA,qBAAA,EAAwB,KAAK,CAAA,CAAE,CAAA;AAChD,MAAA,OAAO,KAAA;AAAA,IACT;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,MAAA,CACJ,KAAA,EACA,UAAA,EACA,kBACA,OAAA,EAC2B;AAC3B,IAAA,IAAI,CAAC,KAAA,EAAO,IAAA,EAAK,EAAG;AAClB,MAAA,IAAA,CAAK,MAAA,CAAO,KAAK,gCAAgC,CAAA;AACjD,MAAA,OAAO,EAAC;AAAA,IACV;AAEA,IAAA,IAAI,CAAC,kBAAkB,MAAA,EAAQ;AAC7B,MAAA,IAAA,CAAK,MAAA,CAAO,KAAK,gCAAgC,CAAA;AACjD,MAAA,OAAO,EAAC;AAAA,IACV;AAEA,IAAA,MAAM,aAAA,GAAgB;AAAA,MACpB,CAAA,EAAG,SAAS,CAAA,IAAK,EAAA;AAAA,MACjB,SAAA,EAAW,SAAS,SAAA,IAAa,GAAA;AAAA,MACjC,QAAA,EAAU,OAAA,EAAS,QAAA,IAAY;AAAC,KAClC;AAEA,IAAA,IAAA,CAAK,MAAA,CAAO,KAAA,GAAQ,CAAA,sBAAA,EAAyB,KAAK,CAAA,CAAA,CAAA,EAAK;AAAA,MACrD,UAAA;AAAA,MACA,kBAAkB,gBAAA,CAAiB,MAAA;AAAA,MACnC,OAAA,EAAS;AAAA,KACV,CAAA;AAED,IAAA,IAAI;AACF,MAAA,MAAM,QAAA,GAAW,MAAM,IAAA,CAAK,WAAA,CAIzB,iCAAA,EAAmC;AAAA,QACpC,MAAA,EAAQ,MAAA;AAAA,QACR,IAAA,EAAM;AAAA,UACJ,KAAA,EAAO,MAAM,IAAA,EAAK;AAAA,UAClB,UAAA;AAAA,UACA,gBAAA;AAAA,UACA,OAAA,EAAS;AAAA;AACX,OACD,CAAA;AAED,MAAA,MAAM,SAAA,GAAY,QAAA,CAAS,SAAA,IAAa,EAAC;AAEzC,MAAA,IAAA,CAAK,MAAA,CAAO,KAAA;AAAA,QACV,SAAS,SAAA,CAAU,MAAM,CAAA,gBAAA,EAAmB,QAAA,CAAS,cAAc,CAAC,CAAA,cAAA;AAAA,OACtE;AAGA,MAAA,OAAO,SAAA,CAAU,OAAO,CAAA,GAAA,KAAO;AAC7B,QAAA,IAAI,CAAC,GAAA,CAAI,EAAA,IAAM,CAAC,IAAI,OAAA,EAAS;AAC3B,UAAA,IAAA,CAAK,MAAA,CAAO,KAAK,+CAA+C,CAAA;AAChE,UAAA,OAAO,KAAA;AAAA,QACT;AACA,QAAA,OAAO,IAAA;AAAA,MACT,CAAC,CAAA;AAAA,IACH,SAAS,KAAA,EAAO;AACd,MAAA,IAAA,CAAK,MAAA,CAAO,KAAA,CAAM,CAAA,4BAAA,EAA+B,KAAK,CAAA,CAAA,EAAI;AAAA,QACxD,KAAA;AAAA,QACA,UAAA;AAAA,QACA,gBAAA;AAAA,QACA,OAAA,EAAS;AAAA,OACV,CAAA;AAGD,MAAA,OAAO,EAAC;AAAA,IACV;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,kBAAkB,GAAA,EAA0C;AAChE,IAAA,IAAI,CAAC,KAAK,MAAA,EAAQ;AAChB,MAAA,IAAA,CAAK,MAAA,CAAO,KAAK,0BAA0B,CAAA;AAC3C,MAAA,OAAO,EAAC;AAAA,IACV;AAGA,IAAA,MAAM,QAAA,GAAW,GAAA,CACd,MAAA,CAAO,CAAA,EAAA,KAAM;AACZ,MAAA,IAAI,CAAC,MAAM,OAAO,EAAA,KAAO,YAAY,EAAA,CAAG,IAAA,OAAW,EAAA,EAAI;AACrD,QAAA,IAAA,CAAK,MAAA,CAAO,IAAA,CAAK,CAAA,qBAAA,EAAwB,EAAE,CAAA,CAAE,CAAA;AAC7C,QAAA,OAAO,KAAA;AAAA,MACT;AACA,MAAA,OAAO,IAAA;AAAA,IACT,CAAC,CAAA,CACA,GAAA,CAAI,CAAA,EAAA,KAAM,EAAA,CAAG,MAAM,CAAA;AAEtB,IAAA,IAAI,CAAC,SAAS,MAAA,EAAQ;AACpB,MAAA,IAAA,CAAK,MAAA,CAAO,KAAK,gCAAgC,CAAA;AACjD,MAAA,OAAO,EAAC;AAAA,IACV;AAEA,IAAA,IAAA,CAAK,MAAA,CAAO,KAAA,GAAQ,CAAA,SAAA,EAAY,QAAA,CAAS,MAAM,CAAA,iBAAA,CAAmB,CAAA;AAElE,IAAA,IAAI;AACF,MAAA,MAAM,QAAA,GAAW,MAAM,IAAA,CAAK,WAAA,CAEzB,0CAAA,EAA4C;AAAA,QAC7C,MAAA,EAAQ,MAAA;AAAA,QACR,IAAA,EAAM,EAAE,GAAA,EAAK,QAAA;AAAS,OACvB,CAAA;AAED,MAAA,MAAM,SAAA,GAAY,QAAA,CAAS,SAAA,IAAa,EAAC;AAEzC,MAAA,IAAA,CAAK,MAAA,CAAO,KAAA;AAAA,QACV,CAAA,UAAA,EAAa,SAAA,CAAU,MAAM,CAAA,CAAA,EAAI,SAAS,MAAM,CAAA,UAAA;AAAA,OAClD;AAEA,MAAA,OAAO,SAAA;AAAA,IACT,SAAS,KAAA,EAAO;AACd,MAAA,IAAA,CAAK,MAAA,CAAO,KAAA,CAAM,CAAA,gCAAA,EAAmC,KAAK,CAAA,CAAA,EAAI;AAAA,QAC5D,cAAc,QAAA,CAAS;AAAA,OACxB,CAAA;AAED,MAAA,OAAO,EAAC;AAAA,IACV;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,oBAAoB,eAAA,EAA2C;AACnE,IAAA,IAAI,CAAC,eAAA,EAAiB,IAAA,EAAK,EAAG;AAC5B,MAAA,IAAA,CAAK,MAAA,CAAO,KAAK,kCAAkC,CAAA;AACnD,MAAA,OAAO,KAAA;AAAA,IACT;AAEA,IAAA,IAAI;AACF,MAAA,MAAM,QAAA,GAAW,MAAM,IAAA,CAAK,WAAA,CAGzB,4BAA4B,eAAA,CAAgB,IAAA,EAAM,CAAA,OAAA,CAAS,CAAA;AAE9D,MAAA,MAAM,MAAA,GAAS,QAAA,CAAS,MAAA,IAAU,QAAA,CAAS,UAAA;AAE3C,MAAA,IAAA,CAAK,MAAA,CAAO,KAAA;AAAA,QACV,CAAA,eAAA,EAAkB,eAAe,CAAA,CAAA,EAAI,MAAA,GAAS,6BAA6B,qCAAqC,CAAA;AAAA,OAClH;AAEA,MAAA,OAAO,MAAA;AAAA,IACT,SAAS,KAAA,EAAO;AACd,MAAA,IAAA,CAAK,MAAA,CAAO,KAAA,CAAM,CAAA,8BAAA,EAAiC,KAAK,CAAA,CAAA,EAAI;AAAA,QAC1D;AAAA,OACD,CAAA;AAED,MAAA,OAAO,KAAA;AAAA,IACT;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,qBACJ,eAAA,EACmC;AACnC,IAAA,IAAI,CAAC,eAAA,EAAiB,IAAA,EAAK,EAAG;AAC5B,MAAA,IAAA,CAAK,MAAA,CAAO,KAAK,kCAAkC,CAAA;AACnD,MAAA,OAAO,IAAA;AAAA,IACT;AAEA,IAAA,IAAI;AACF,MAAA,MAAM,QAAA,GAAW,MAAM,IAAA,CAAK,WAAA;AAAA,QAC1B,CAAA,yBAAA,EAA4B,eAAA,CAAgB,IAAA,EAAM,CAAA,KAAA;AAAA,OACpD;AAEA,MAAA,IAAA,CAAK,MAAA,CAAO,KAAA,GAAQ,CAAA,sBAAA,EAAyB,eAAe,CAAA,CAAA,EAAI;AAAA,QAC9D,MAAM,QAAA,CAAS,IAAA;AAAA,QACf,gBAAgB,QAAA,CAAS;AAAA,OAC1B,CAAA;AAED,MAAA,OAAO,QAAA;AAAA,IACT,SAAS,KAAA,EAAO;AACd,MAAA,IAAA,CAAK,MAAA,CAAO,KAAA,CAAM,CAAA,uBAAA,EAA0B,KAAK,CAAA,CAAA,EAAI;AAAA,QACnD;AAAA,OACD,CAAA;AAED,MAAA,OAAO,IAAA;AAAA,IACT;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,UAAA,CACJ,KAAA,EACA,gBAAA,EACA,QAAgB,EAAA,EACW;AAC3B,IAAA,IAAI,CAAC,KAAA,EAAO,IAAA,EAAK,EAAG;AAClB,MAAA,IAAA,CAAK,MAAA,CAAO,KAAK,qCAAqC,CAAA;AACtD,MAAA,OAAO,EAAC;AAAA,IACV;AAEA,IAAA,IAAI,CAAC,kBAAkB,MAAA,EAAQ;AAC7B,MAAA,IAAA,CAAK,MAAA,CAAO,KAAK,+CAA+C,CAAA;AAChE,MAAA,OAAO,EAAC;AAAA,IACV;AAEA,IAAA,IAAA,CAAK,MAAA,CAAO,KAAA,GAAQ,CAAA,yBAAA,EAA4B,KAAK,CAAA,CAAA,CAAA,EAAK;AAAA,MACxD,kBAAkB,gBAAA,CAAiB,MAAA;AAAA,MACnC;AAAA,KACD,CAAA;AAED,IAAA,IAAI;AACF,MAAA,MAAM,QAAA,GAAW,MAAM,IAAA,CAAK,WAAA,CAEzB,sCAAA,EAAwC;AAAA,QACzC,MAAA,EAAQ,MAAA;AAAA,QACR,IAAA,EAAM;AAAA,UACJ,KAAA,EAAO,MAAM,IAAA,EAAK;AAAA,UAClB,gBAAA;AAAA,UACA,KAAA,EAAO,KAAK,GAAA,CAAI,CAAA,EAAG,KAAK,GAAA,CAAI,KAAA,EAAO,GAAG,CAAC;AAAA;AAAA;AACzC,OACD,CAAA;AAED,MAAA,MAAM,SAAA,GAAY,QAAA,CAAS,SAAA,IAAa,EAAC;AAEzC,MAAA,IAAA,CAAK,MAAA,CAAO,KAAA,GAAQ,CAAA,kBAAA,EAAqB,SAAA,CAAU,MAAM,CAAA,UAAA,CAAY,CAAA;AAErE,MAAA,OAAO,SAAA;AAAA,IACT,SAAS,KAAA,EAAO;AACd,MAAA,IAAA,CAAK,MAAA,CAAO,KAAA,CAAM,CAAA,+BAAA,EAAkC,KAAK,CAAA,CAAA,EAAI;AAAA,QAC3D,KAAA;AAAA,QACA,gBAAA;AAAA,QACA;AAAA,OACD,CAAA;AAED,MAAA,OAAO,EAAC;AAAA,IACV;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,0BAAA,GAA2D;AAC/D,IAAA,IAAI;AACF,MAAA,MAAM,QAAA,GAAW,MAAM,IAAA,CAAK,WAAA,CAEzB,oCAAoC,CAAA;AAEvC,MAAA,MAAM,GAAA,GAAM,QAAA,CAAS,cAAA,IAAkB,EAAC;AAExC,MAAA,IAAA,CAAK,MAAA,CAAO,KAAA,GAAQ,CAAA,MAAA,EAAS,GAAA,CAAI,MAAM,CAAA,0BAAA,CAA4B,CAAA;AAEnE,MAAA,OAAO,GAAA;AAAA,IACT,SAAS,KAAA,EAAO;AACd,MAAA,IAAA,CAAK,MAAA,CAAO,KAAA,CAAM,CAAA,yCAAA,EAA4C,KAAK,CAAA,CAAE,CAAA;AAErE,MAAA,OAAO,EAAC;AAAA,IACV;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKA,KAAA,GAAgB;AACd,IAAA,OAAO,CAAA,0CAAA,EAA6C,KAAK,MAAM,CAAA,WAAA,EAAc,KAAK,OAAO,CAAA,aAAA,EAAgB,KAAK,OAAO,CAAA,CAAA;AAAA,EACvH;AACF;AArXa0E,wBAAA,GAAN,eAAA,CAAA;AAAA,EADNrG,iBAAAA;AAAW,CAAA,EACCqG,wBAAA,CAAA;;;AClCb,qBAAA,EAAA;;;ACCA,yBAAA,EAAA;ACMaC,0BAAN,qBAAA,CAA0D;AAAA,EAC/D,YACmB,QAAA,EAOjB;AAPiB,IAAA,IAAA,CAAA,QAAA,GAAA,QAAA;AAAA,EAOhB;AAAA;AAAA;AAAA;AAAA,EAKH,MAAM,YAAY,QAAA,EAOhB;AACA,IAAA,OAAO,KAAK,QAAA,CAAS,MAAA;AAAA,MACnB,aACE,OAAA,CAAQ,QAAA,KAAa,QAAA,IAAY,OAAA,CAAQ,UAAU,QAAA,KAAa;AAAA,KACpE;AAAA,EACF;AACF;AA3BaA,uBAAA,GAAN,eAAA,CAAA;AAAA,EADNtG,iBAAAA;AAAW,CAAA,EACCsG,uBAAA,CAAA","file":"index.cjs","sourcesContent":["// packages/sdk/src/decorators/callback.decorators.ts\n\nimport \"reflect-metadata\";\nimport { CallbackContext, CallbackResult } from \"./callback.interface\";\n\n/**\n * Metadata for a registered callback\n */\nexport interface CallbackMetadata {\n handler: string;\n method: string | symbol;\n target: any;\n}\n\n/**\n * Metadata for callback methods\n */\nconst CALLBACK_METADATA_KEY = Symbol(\"callbacks\");\n\n/**\n * Metadata for classes with callbacks\n */\nconst CALLBACK_CLASS_METADATA_KEY = Symbol(\"callback_class\");\n\n/**\n * Extended callback context with access to builder\n */\nexport interface ExtendedCallbackContext extends CallbackContext {\n /** Reference to graph builder for access to its methods and properties */\n builder?: any;\n}\n\n/**\n * Type for basic callback handler\n * Re-export for compatibility\n */\nexport type { CallbackHandler } from \"./callback.interface\";\n\n/**\n * Type for extended callback handler with access to builder\n */\nexport type ExtendedCallbackHandler = (\n context: ExtendedCallbackContext\n) => Promise<CallbackResult>;\n\n/**\n * @Callback decorator for methods\n *\n * @param handler Callback handler name\n *\n * @example\n * ```typescript\n * class LedgerCallbacks {\n * @Callback('approve-transaction')\n * async handleApprove(context: CallbackContext): Promise<CallbackResult> {\n * return { success: true, message: 'Transaction approved' };\n * }\n * }\n * ```\n */\nexport function Callback(handler: string) {\n return function (\n target: any,\n propertyKey: string | symbol,\n descriptor: PropertyDescriptor\n ) {\n // Get existing metadata\n const existingCallbacks: CallbackMetadata[] =\n Reflect.getMetadata(CALLBACK_METADATA_KEY, target.constructor) || [];\n\n // Add new callback\n const callbackMetadata: CallbackMetadata = {\n handler,\n method: propertyKey,\n target: target.constructor,\n };\n\n existingCallbacks.push(callbackMetadata);\n\n // Save updated metadata\n Reflect.defineMetadata(\n CALLBACK_METADATA_KEY,\n existingCallbacks,\n target.constructor\n );\n\n // Validate method signature\n if (descriptor.value && typeof descriptor.value === \"function\") {\n const originalMethod = descriptor.value;\n\n descriptor.value = function (context: CallbackContext) {\n // Additional validation logic can be added here\n return originalMethod.call(this, context);\n };\n }\n\n return descriptor;\n };\n}\n\n/**\n * @WithCallbacks decorator for builder classes\n * Mixin approach: mixes methods from callback class into builder\n *\n * @param CallbacksClass Class with callbacks\n *\n * @example\n * ```typescript\n * @WithCallbacks(LedgerV1Callbacks)\n * export class LedgerV1Builder extends AbstractGraphBuilder {\n * // Callbacks automatically become available as builder methods\n * }\n * ```\n */\nexport function WithCallbacks<T extends { new (...args: any[]): {} }>(\n CallbacksClass: T\n) {\n return function <U extends { new (...args: any[]): {} }>(BuilderClass: U) {\n // Get callback metadata from callbacks class\n const callbackMetadata: CallbackMetadata[] =\n Reflect.getMetadata(CALLBACK_METADATA_KEY, CallbacksClass) || [];\n\n // Create new class extending from builder\n class WithCallbacksBuilder extends BuilderClass {\n constructor(...args: any[]) {\n super(...args);\n\n // Create instance of callbacks class\n const callbacksInstance = new CallbacksClass();\n\n // Mix callback methods into current instance\n callbackMetadata.forEach(({ method, handler }) => {\n const callbackMethod = (callbacksInstance as any)[method];\n if (typeof callbackMethod === \"function\") {\n // Bind method to callbacks instance, but also give access to builder's this\n (this as any)[method] = async (context: CallbackContext) => {\n // Pass builder context to callback through special field\n const enhancedContext = {\n ...context,\n builder: this, // Give access to builder's methods and properties\n };\n return callbackMethod.call(callbacksInstance, enhancedContext);\n };\n }\n });\n }\n }\n\n // Copy callback metadata to new class\n Reflect.defineMetadata(\n CALLBACK_METADATA_KEY,\n callbackMetadata,\n WithCallbacksBuilder\n );\n\n // Mark that class has callbacks\n Reflect.defineMetadata(\n CALLBACK_CLASS_METADATA_KEY,\n true,\n WithCallbacksBuilder\n );\n\n // Copy static properties and methods\n Object.setPrototypeOf(WithCallbacksBuilder, BuilderClass);\n Object.getOwnPropertyNames(BuilderClass).forEach(name => {\n if (name !== \"length\" && name !== \"prototype\" && name !== \"name\") {\n const descriptor = Object.getOwnPropertyDescriptor(BuilderClass, name);\n if (descriptor) {\n Object.defineProperty(WithCallbacksBuilder, name, descriptor);\n }\n }\n });\n\n return WithCallbacksBuilder as any;\n };\n}\n\n/**\n * Gets all registered callbacks for a class\n */\nexport function getCallbackMetadata(target: any): CallbackMetadata[] {\n return Reflect.getMetadata(CALLBACK_METADATA_KEY, target) || [];\n}\n\n/**\n * Checks if a class has callbacks\n */\nexport function hasCallbacks(target: any): boolean {\n return Reflect.getMetadata(CALLBACK_CLASS_METADATA_KEY, target) === true;\n}\n\n/**\n * Finds callback handler method by name\n */\nexport function findCallbackMethod(\n target: any,\n handler: string\n): string | symbol | null {\n const callbacks = getCallbackMetadata(target);\n const callback = callbacks.find(cb => cb.handler === handler);\n return callback ? callback.method : null;\n}\n","import { Injectable, Logger } from \"@nestjs/common\";\nimport { JSONSchema7 } from \"json-schema\";\n\n/**\n * Request context for endpoint calls\n */\nexport interface RequestContext {\n userId: string;\n companyId?: string;\n method: \"GET\" | \"POST\";\n payload?: any;\n channel: string; // 'web', 'webapp'\n platform?: string; // 'telegram', 'slack', 'discord'\n}\n\n/**\n * Universal response envelope\n */\nexport interface DataEnvelope<T = any> {\n schema: string; // Schema name or data type\n data: T; // The actual data\n meta?: {\n total?: number; // For pagination\n page?: number;\n redirect?: string; // For navigation after action\n message?: string; // Message to user\n };\n}\n\n/**\n * Endpoint handler function type\n */\nexport type EndpointHandler = (ctx: RequestContext) => Promise<DataEnvelope>;\n\n/**\n * Endpoint descriptor interface\n */\nexport interface EndpointDescriptor {\n name: string; // \"accounts.list\"\n method: \"GET\" | \"POST\";\n handler: EndpointHandler;\n schema?: JSONSchema7;\n}\n\n/**\n * Registry for graph UI endpoints\n * Similar to CallbackRegistry but for synchronous data operations without TTL\n */\n@Injectable()\nexport class EndpointRegistry {\n private readonly logger = new Logger(EndpointRegistry.name);\n\n // Map<graphType, Map<endpointName, EndpointDescriptor>>\n private readonly endpoints = new Map<\n string,\n Map<string, EndpointDescriptor>\n >();\n\n /**\n * Register an endpoint for a specific graph type\n * @param graphType The graph type (e.g., \"ledger::1.0.0\")\n * @param endpoint The endpoint descriptor\n */\n register(graphType: string, endpoint: EndpointDescriptor): void {\n if (!this.endpoints.has(graphType)) {\n this.endpoints.set(graphType, new Map());\n }\n\n const graphEndpoints = this.endpoints.get(graphType)!;\n graphEndpoints.set(endpoint.name, endpoint);\n\n this.logger.debug(\n `Registered endpoint \"${endpoint.name}\" for graph type \"${graphType}\"`\n );\n }\n\n /**\n * Register multiple endpoints for a graph type\n * @param graphType The graph type\n * @param endpoints Array of endpoint descriptors\n */\n registerMultiple(graphType: string, endpoints: EndpointDescriptor[]): void {\n for (const endpoint of endpoints) {\n this.register(graphType, endpoint);\n }\n }\n\n /**\n * Get an endpoint handler\n * @param graphType The graph type\n * @param endpointName The endpoint name\n * @returns The endpoint descriptor or undefined\n */\n get(graphType: string, endpointName: string): EndpointDescriptor | undefined {\n const graphEndpoints = this.endpoints.get(graphType);\n return graphEndpoints?.get(endpointName);\n }\n\n /**\n * List all endpoints for a graph type\n * @param graphType The graph type\n * @returns Array of endpoint names\n */\n list(graphType: string): string[] {\n const graphEndpoints = this.endpoints.get(graphType);\n if (!graphEndpoints) {\n return [];\n }\n return Array.from(graphEndpoints.keys());\n }\n\n /**\n * Alias for list() method for compatibility\n */\n listEndpoints(graphType: string): string[] {\n return this.list(graphType);\n }\n\n /**\n * List all registered graph types\n * @returns Array of graph type names\n */\n listGraphTypes(): string[] {\n return Array.from(this.endpoints.keys());\n }\n\n /**\n * Call an endpoint\n * @param graphType The graph type\n * @param endpointName The endpoint name\n * @param context The request context\n * @returns The response envelope\n */\n async call(\n graphType: string,\n endpointName: string,\n context: RequestContext\n ): Promise<DataEnvelope> {\n const endpoint = this.get(graphType, endpointName);\n\n if (!endpoint) {\n throw new Error(\n `Endpoint \"${endpointName}\" not found for graph \"${graphType}\"`\n );\n }\n\n // Validate HTTP method matches\n if (endpoint.method !== context.method) {\n throw new Error(\n `Method mismatch: endpoint expects ${endpoint.method}, got ${context.method}`\n );\n }\n\n this.logger.debug(\n `Calling endpoint \"${endpointName}\" for graph \"${graphType}\" with method ${context.method}`\n );\n\n try {\n return await endpoint.handler(context);\n } catch (error) {\n this.logger.error(\n `Error calling endpoint \"${endpointName}\" for graph \"${graphType}\":`,\n error\n );\n throw error;\n }\n }\n\n /**\n * Get statistics about registered endpoints\n */\n getStats(): {\n totalGraphTypes: number;\n totalEndpoints: number;\n endpointsByGraph: Record<string, number>;\n } {\n const stats = {\n totalGraphTypes: this.endpoints.size,\n totalEndpoints: 0,\n endpointsByGraph: {} as Record<string, number>,\n };\n\n for (const [graphType, endpoints] of this.endpoints) {\n const count = endpoints.size;\n stats.totalEndpoints += count;\n stats.endpointsByGraph[graphType] = count;\n }\n\n return stats;\n }\n\n /**\n * Clear all endpoints (mainly for testing)\n */\n clear(): void {\n this.endpoints.clear();\n this.logger.debug(\"Cleared all endpoints from registry\");\n }\n\n /**\n * Clear endpoints for specific graph type (mainly for testing)\n */\n clearGraph(graphType: string): void {\n this.endpoints.delete(graphType);\n this.logger.debug(`Cleared endpoints for graph type \"${graphType}\"`);\n }\n}\n","import \"reflect-metadata\";\nimport { JSONSchema7 } from \"json-schema\";\nimport { EndpointDescriptor } from \"./endpoint.registry\";\n\n/**\n * Metadata key for storing endpoint information\n */\nexport const ENDPOINT_METADATA_KEY = \"graph:endpoints\";\n\n/**\n * Endpoint metadata stored on classes\n */\nexport interface EndpointMetadata {\n name: string;\n method: \"GET\" | \"POST\";\n methodName: string;\n schema?: JSONSchema7;\n}\n\n/**\n * Options for endpoint decorator\n */\nexport interface EndpointOptions {\n method: \"GET\" | \"POST\";\n schema?: JSONSchema7;\n}\n\n/**\n * Decorator to mark a method as a graph endpoint\n * @param name Endpoint name (e.g., \"accounts.list\")\n * @param options Endpoint configuration\n */\nexport function Endpoint(name: string, options: EndpointOptions) {\n return function (\n target: any,\n propertyKey: string,\n descriptor: PropertyDescriptor\n ) {\n // Get existing metadata or initialize empty array\n const existingMetadata: EndpointMetadata[] =\n Reflect.getMetadata(ENDPOINT_METADATA_KEY, target.constructor) || [];\n\n // Add new endpoint metadata\n const metadata: EndpointMetadata = {\n name,\n method: options.method,\n methodName: propertyKey,\n schema: options.schema,\n };\n\n existingMetadata.push(metadata);\n\n // Store updated metadata\n Reflect.defineMetadata(\n ENDPOINT_METADATA_KEY,\n existingMetadata,\n target.constructor\n );\n };\n}\n\n/**\n * Class decorator to mark a class as having endpoints\n * This ensures the metadata is properly initialized\n */\nexport function WithEndpoints(target: any) {\n // Initialize metadata if not exists\n if (!Reflect.hasMetadata(ENDPOINT_METADATA_KEY, target)) {\n Reflect.defineMetadata(ENDPOINT_METADATA_KEY, [], target);\n }\n}\n\n/**\n * Get endpoint metadata from a class constructor\n * @param constructor The class constructor\n * @returns Array of endpoint metadata\n */\nexport function getEndpointMetadata(constructor: any): EndpointMetadata[] {\n return Reflect.getMetadata(ENDPOINT_METADATA_KEY, constructor) || [];\n}\n\n/**\n * Convert endpoint metadata to endpoint descriptors\n * @param instance The class instance\n * @param metadata Array of endpoint metadata\n * @returns Array of endpoint descriptors\n */\nexport function createEndpointDescriptors(\n instance: any,\n metadata: EndpointMetadata[]\n): EndpointDescriptor[] {\n return metadata.map(meta => ({\n name: meta.name,\n method: meta.method,\n schema: meta.schema,\n handler: async ctx => {\n const method = instance[meta.methodName];\n if (typeof method !== \"function\") {\n throw new Error(`Method ${meta.methodName} not found on instance`);\n }\n return method.call(instance, ctx);\n },\n }));\n}\n\n/**\n * Find endpoint method name by endpoint name\n * @param constructor Class constructor\n * @param endpointName Endpoint name to find\n * @returns Method name or undefined\n */\nexport function findEndpointMethod(\n constructor: any,\n endpointName: string\n): string | undefined {\n const metadata = getEndpointMetadata(constructor);\n const endpoint = metadata.find(meta => meta.name === endpointName);\n return endpoint?.methodName;\n}\n\n// === UI ENDPOINTS DECORATORS ===\n\n/**\n * Metadata for UI endpoint classes\n */\nexport interface UIEndpointClassMetadata {\n graphType: string;\n}\n\nexport interface UIEndpointMethodMetadata {\n endpointName: string;\n method: \"GET\" | \"POST\";\n methodName: string | symbol;\n}\n\nconst UI_ENDPOINT_CLASS_METADATA_KEY = Symbol(\"ui_endpoint_class\");\nconst UI_ENDPOINT_METHOD_METADATA_KEY = Symbol(\"ui_endpoint_methods\");\n\n/**\n * Class decorator for UI Endpoints\n * Marks a class as containing UI endpoints for a specific graph type\n *\n * @example\n * ```typescript\n * @WithUIEndpoints('company.financial-ledger::1.0.0')\n * export class LedgerUIEndpoints {\n * @UIEndpoint('accounts.list', 'GET')\n * async listAccounts(ctx: RequestContext): Promise<DataEnvelope> { ... }\n * }\n * ```\n */\nexport function WithUIEndpoints(graphType: string) {\n return function <T extends { new (...args: any[]): {} }>(constructor: T) {\n // Mark class as having UI endpoints\n Reflect.defineMetadata(\n UI_ENDPOINT_CLASS_METADATA_KEY,\n { graphType },\n constructor\n );\n return constructor;\n };\n}\n\n/**\n * Method decorator for individual UI endpoints\n *\n * @param endpointName The endpoint name (e.g., 'accounts.list')\n * @param method HTTP method (GET or POST)\n */\nexport function UIEndpoint(\n endpointName: string,\n method: \"GET\" | \"POST\" = \"GET\"\n) {\n return function (\n target: any,\n propertyKey: string | symbol,\n descriptor: PropertyDescriptor\n ) {\n // Get existing method metadata\n const existingMethods: UIEndpointMethodMetadata[] =\n Reflect.getMetadata(\n UI_ENDPOINT_METHOD_METADATA_KEY,\n target.constructor\n ) || [];\n\n // Add new method metadata\n const methodMetadata: UIEndpointMethodMetadata = {\n endpointName,\n method,\n methodName: propertyKey,\n };\n\n existingMethods.push(methodMetadata);\n\n // Save updated metadata\n Reflect.defineMetadata(\n UI_ENDPOINT_METHOD_METADATA_KEY,\n existingMethods,\n target.constructor\n );\n\n return descriptor;\n };\n}\n\n/**\n * Get UI endpoint class metadata\n */\nexport function getUIEndpointClassMetadata(\n constructor: any\n): UIEndpointClassMetadata | null {\n return (\n Reflect.getMetadata(UI_ENDPOINT_CLASS_METADATA_KEY, constructor) || null\n );\n}\n\n/**\n * Get all UI endpoint methods metadata for a class\n */\nexport function getUIEndpointMethodsMetadata(\n constructor: any\n): UIEndpointMethodMetadata[] {\n return (\n Reflect.getMetadata(UI_ENDPOINT_METHOD_METADATA_KEY, constructor) || []\n );\n}\n\n/**\n * Check if a class has UI endpoints\n */\nexport function hasUIEndpoints(constructor: any): boolean {\n return getUIEndpointClassMetadata(constructor) !== null;\n}\n\n/**\n * Register UI endpoints from a class to the endpoint registry\n * @param endpointRegistry The endpoint registry\n * @param EndpointClass The UI endpoints class constructor\n * @param instance Optional pre-created instance (from DI container)\n */\nexport function registerUIEndpointsFromClass(\n endpointRegistry: any, // EndpointRegistry type\n EndpointClass: any,\n instance?: any\n): void {\n // Check if class has UI endpoints\n const classMetadata = getUIEndpointClassMetadata(EndpointClass);\n if (!classMetadata) {\n return;\n }\n\n // Get method metadata\n const methodsMetadata = getUIEndpointMethodsMetadata(EndpointClass);\n if (methodsMetadata.length === 0) {\n return;\n }\n\n // Use provided instance or create new one (for backward compatibility)\n console.log(\"DEBUG: registerUIEndpointsFromClass\", {\n hasInstance: !!instance,\n willCreateNew: !instance,\n className: EndpointClass.name,\n });\n\n const endpointInstance = instance || new EndpointClass();\n\n // Convert to endpoint descriptors\n const descriptors = methodsMetadata.map(meta => ({\n name: meta.endpointName,\n method: meta.method,\n handler: async (ctx: any) => {\n const method = endpointInstance[meta.methodName as string];\n if (typeof method !== \"function\") {\n throw new Error(\n `Method ${String(meta.methodName)} not found on instance`\n );\n }\n return method.call(endpointInstance, ctx);\n },\n }));\n\n // Register all endpoints\n endpointRegistry.registerMultiple(classMetadata.graphType, descriptors);\n}\n","// packages/sdk/src/endpoint-registry/ui-endpoints.discovery.ts\nimport { Injectable, Logger, OnModuleInit, Optional } from \"@nestjs/common\";\nimport { DiscoveryService, MetadataScanner } from \"@nestjs/core\";\nimport { EndpointRegistry } from \"./endpoint.registry\";\nimport {\n hasUIEndpoints,\n registerUIEndpointsFromClass,\n} from \"./endpoint.decorators\";\n\n/**\n * Service for auto-discovery of UI Endpoints in the application\n * Scans all providers for classes with @WithUIEndpoints decorator\n * and automatically registers them with the EndpointRegistry\n */\n@Injectable()\nexport class UIEndpointsDiscoveryService implements OnModuleInit {\n private readonly logger = new Logger(UIEndpointsDiscoveryService.name);\n\n constructor(\n @Optional() private readonly discoveryService: DiscoveryService,\n @Optional() private readonly metadataScanner: MetadataScanner,\n private readonly endpointRegistry: EndpointRegistry\n ) {}\n\n async onModuleInit() {\n await this.discoverUIEndpoints();\n }\n\n /**\n * Discover and register all UI endpoint classes\n * Called automatically during module initialization\n */\n async discoverUIEndpoints(): Promise<void> {\n this.logger.log(\"Starting UI endpoints discovery...\");\n\n // Check if DiscoveryService is available\n if (!this.discoveryService) {\n this.logger.warn(\n \"DiscoveryService not available, skipping UI endpoints discovery\"\n );\n return;\n }\n\n // Get all providers from the entire application\n const providers = this.discoveryService.getProviders();\n\n let registeredCount = 0;\n let totalEndpoints = 0;\n\n for (const provider of providers) {\n try {\n const { instance, metatype } = provider;\n\n // Skip if no metatype or instance\n if (!metatype || !instance) {\n continue;\n }\n\n // Check if this class has UI endpoints\n if (hasUIEndpoints(metatype)) {\n this.logger.debug(`Found UI endpoints class: ${metatype.name}`);\n console.log(\"DEBUG: Discovery found instance\", {\n className: metatype.name,\n hasInstance: !!instance,\n instanceType: typeof instance,\n });\n\n // Register the endpoints from this class\n registerUIEndpointsFromClass(\n this.endpointRegistry,\n metatype,\n instance\n );\n\n registeredCount++;\n\n // Count endpoints for logging\n const metadata = this.getUIEndpointMethodsCount(metatype);\n totalEndpoints += metadata;\n\n this.logger.log(\n `Registered ${metadata} UI endpoints from ${metatype.name}`\n );\n }\n } catch (error) {\n this.logger.warn(`Failed to process provider: ${error.message}`);\n }\n }\n\n this.logger.log(`UI endpoints discovery completed!`);\n this.logger.log(\n `Stats: ${registeredCount} classes, ${totalEndpoints} endpoints total`\n );\n\n // Log endpoint registry stats\n const stats = this.endpointRegistry.getStats();\n this.logger.log(\n `Registry: ${stats.totalGraphTypes} graph types, ${stats.totalEndpoints} endpoints`\n );\n }\n\n /**\n * Get count of UI endpoint methods in a class\n */\n private getUIEndpointMethodsCount(metatype: any): number {\n const { getUIEndpointMethodsMetadata } = require(\"./endpoint.decorators\");\n const methods = getUIEndpointMethodsMetadata(metatype);\n return methods.length;\n }\n}\n","import {\n Controller,\n Post,\n Get,\n Body,\n Param,\n Headers,\n Logger,\n NotFoundException,\n InternalServerErrorException,\n} from \"@nestjs/common\";\nimport { ApiTags, ApiOperation, ApiResponse } from \"@nestjs/swagger\";\nimport { DataEnvelope, EndpointRegistry, RequestContext } from \"./\";\nimport { BuilderRegistryService } from \"../core/builder-registry.service\";\n\nexport interface UIDispatchDto {\n graphType: string;\n endpoint: string;\n method: \"GET\" | \"POST\";\n data?: any;\n context: {\n userId: string;\n companyId?: string;\n channel?: string;\n platform?: string;\n };\n}\n\n/**\n * Controller for UI endpoint dispatch\n * Handles requests from backend to graph UI endpoints\n */\n@ApiTags(\"UI Dispatch\")\n@Controller(\"api/graph\")\nexport class UIDispatchController {\n private readonly logger = new Logger(UIDispatchController.name);\n\n constructor(\n private readonly endpointRegistry: EndpointRegistry,\n private readonly builderRegistry: BuilderRegistryService\n ) {}\n\n /**\n * Dispatch a request to a UI endpoint\n * Similar to callback dispatch but for synchronous UI operations\n */\n @Post(\"ui/dispatch\")\n @ApiOperation({ summary: \"Dispatch request to UI endpoint\" })\n @ApiResponse({\n status: 200,\n description: \"Successfully dispatched to endpoint\",\n })\n @ApiResponse({ status: 404, description: \"Endpoint not found\" })\n async dispatchUIEndpoint(@Body() dto: UIDispatchDto): Promise<DataEnvelope> {\n this.logger.debug(\n `Dispatching UI request to ${dto.graphType}:${dto.endpoint}`\n );\n\n this.logger.debug(\"UIDispatchController received request\", {\n graphType: dto.graphType,\n endpoint: dto.endpoint,\n method: dto.method,\n data: dto.data,\n context: dto.context,\n });\n\n try {\n // Build request context\n const context: RequestContext = {\n userId: dto.context.userId,\n companyId: dto.context.companyId,\n method: dto.method,\n payload: dto.data,\n channel: dto.context.channel || \"web\",\n platform: dto.context.platform,\n };\n\n this.logger.debug(\"Built RequestContext\", context);\n\n // Call the endpoint through registry\n const result = await this.endpointRegistry.call(\n dto.graphType,\n dto.endpoint,\n context\n );\n\n this.logger.debug(\n `Successfully dispatched to ${dto.graphType}:${dto.endpoint}`\n );\n\n return result;\n } catch (error: any) {\n this.logger.error(\n `Failed to dispatch to ${dto.graphType}:${dto.endpoint}:`,\n error.message\n );\n\n if (error.message.includes(\"not found\")) {\n throw new NotFoundException(error.message);\n }\n\n throw new InternalServerErrorException(\n `Failed to dispatch: ${error.message}`\n );\n }\n }\n\n /**\n * Get manifest for a graph type\n * Returns the graph configuration including UI section\n */\n @Get(\":graphType/manifest\")\n @ApiOperation({ summary: \"Get graph manifest with UI configuration\" })\n @ApiResponse({ status: 200, description: \"Graph manifest\" })\n @ApiResponse({ status: 404, description: \"Graph not found\" })\n async getGraphManifest(\n @Param(\"graphType\") graphType: string,\n @Headers(\"x-user-id\") userId: string\n ): Promise<any> {\n this.logger.debug(`Fetching manifest for graph ${graphType}`);\n\n try {\n // Get builder from registry\n const builder = this.builderRegistry\n .getBuilders()\n .find(b => b.graphType === graphType);\n\n if (!builder) {\n throw new NotFoundException(`Graph ${graphType} not found in registry`);\n }\n\n // Get manifest from builder (it's already loaded from graph.manifest.json)\n const manifest = (builder as any).manifest;\n\n if (!manifest) {\n this.logger.warn(\n `Builder for ${graphType} exists but has no manifest loaded`\n );\n // Fallback: return basic manifest\n return {\n graphType,\n name: graphType,\n version: builder.version,\n ui: {\n enabled: false,\n },\n };\n }\n\n this.logger.debug(\n `Found manifest for ${graphType} with UI enabled: ${!!manifest.ui?.enabled}`\n );\n\n return manifest;\n } catch (error: any) {\n this.logger.error(\n `Failed to get manifest for ${graphType}:`,\n error.message\n );\n throw new NotFoundException(`Graph ${graphType} not found`);\n }\n }\n\n /**\n * List all available UI endpoints for a graph\n * Useful for debugging and discovery\n */\n @Get(\":graphType/endpoints\")\n @ApiOperation({ summary: \"List UI endpoints for a graph\" })\n @ApiResponse({\n status: 200,\n description: \"List of endpoint names\",\n type: [String],\n })\n async listEndpoints(\n @Param(\"graphType\") graphType: string,\n @Headers(\"x-user-id\") userId: string\n ): Promise<string[]> {\n this.logger.debug(`Listing endpoints for graph ${graphType}`);\n\n try {\n const endpoints = this.endpointRegistry.listEndpoints(graphType);\n\n this.logger.debug(`Found ${endpoints.length} endpoints for ${graphType}`);\n\n return endpoints;\n } catch (error: any) {\n this.logger.error(\n `Failed to list endpoints for ${graphType}:`,\n error.message\n );\n return [];\n }\n }\n\n /**\n * Get catalog of all graphs\n * Returns basic info about all registered graphs\n */\n @Get(\"catalog\")\n @ApiOperation({ summary: \"Get catalog of all graphs\" })\n @ApiResponse({\n status: 200,\n description: \"List of graphs with basic info\",\n })\n async getGraphCatalog(\n @Headers(\"x-user-id\") userId: string,\n @Headers(\"x-company-id\") companyId?: string\n ): Promise<any[]> {\n this.logger.debug(\"Fetching graph catalog\");\n\n try {\n // Get all registered graph types\n const graphTypes = this.endpointRegistry.listGraphTypes();\n\n // Build catalog with basic info\n const catalog = graphTypes.map(graphType => ({\n graphType,\n name: graphType,\n ui: {\n enabled: this.endpointRegistry.listEndpoints(graphType).length > 0,\n },\n }));\n\n this.logger.debug(`Returning catalog with ${catalog.length} graphs`);\n\n return catalog;\n } catch (error: any) {\n this.logger.error(\"Failed to get graph catalog:\", error.message);\n return [];\n }\n }\n}\n","export * from \"./endpoint.registry\";\nexport * from \"./endpoint.decorators\";\nexport * from \"./ui-endpoints.discovery\";\nexport * from \"./ui-dispatch.controller\";\n","import { Injectable, Logger } from \"@nestjs/common\";\nimport { ServiceDiscoveryProvider } from \"./service-discovery.provider\";\nimport * as fs from \"fs\";\nimport * as path from \"path\";\nimport * as os from \"os\";\n\ninterface ServiceRegistration {\n name: string;\n address: string;\n port: number;\n metadata: Record<string, any>;\n pid: number;\n timestamp: number;\n graphTypes: string[];\n}\n\n/**\n * File-based service discovery for local development\n * Services are registered in ~/.flutch/services/\n */\n@Injectable()\nexport class FileBasedDiscovery implements ServiceDiscoveryProvider {\n private readonly logger = new Logger(FileBasedDiscovery.name);\n private readonly servicesDir: string;\n\n constructor() {\n this.servicesDir = path.join(os.homedir(), \".flutch\", \"services\");\n this.ensureServicesDirectory();\n this.cleanupStaleServices();\n }\n\n /**\n * Register service\n */\n async registerService(\n name: string,\n address: string,\n port: number,\n metadata: Record<string, any>,\n graphTypes: string[] = []\n ): Promise<void> {\n const registration: ServiceRegistration = {\n name,\n address,\n port,\n metadata,\n pid: process.pid,\n timestamp: Date.now(),\n graphTypes,\n };\n\n const serviceFile = path.join(\n this.servicesDir,\n `${name}-${process.pid}.json`\n );\n\n try {\n await fs.promises.writeFile(\n serviceFile,\n JSON.stringify(registration, null, 2)\n );\n\n this.logger.log(`Registered service: ${name} at ${address}:${port}`);\n\n // Automatic cleanup on process exit\n process.on(\"exit\", () => this.unregisterService(name));\n process.on(\"SIGINT\", () => {\n this.unregisterService(name);\n process.exit(0);\n });\n process.on(\"SIGTERM\", () => {\n this.unregisterService(name);\n process.exit(0);\n });\n } catch (error) {\n this.logger.error(`Failed to register service ${name}: ${error.message}`);\n }\n }\n\n /**\n * Unregister service\n */\n async unregisterService(name: string): Promise<void> {\n const serviceFile = path.join(\n this.servicesDir,\n `${name}-${process.pid}.json`\n );\n\n try {\n if (fs.existsSync(serviceFile)) {\n await fs.promises.unlink(serviceFile);\n this.logger.log(`Unregistered service: ${name}`);\n }\n } catch (error) {\n this.logger.error(\n `Failed to unregister service ${name}: ${error.message}`\n );\n }\n }\n\n /**\n * Get list of services by graph type\n */\n async getServices(graphType: string): Promise<\n Array<{\n name: string;\n address: string;\n port: number;\n metadata: Record<string, any>;\n }>\n > {\n try {\n const files = await fs.promises.readdir(this.servicesDir);\n const services: Array<{\n name: string;\n address: string;\n port: number;\n metadata: Record<string, any>;\n }> = [];\n\n for (const file of files) {\n if (!file.endsWith(\".json\")) continue;\n\n try {\n const serviceFile = path.join(this.servicesDir, file);\n const content = await fs.promises.readFile(serviceFile, \"utf-8\");\n const registration: ServiceRegistration = JSON.parse(content);\n\n // Check if process is still alive\n if (!this.isProcessAlive(registration.pid)) {\n await fs.promises.unlink(serviceFile);\n continue;\n }\n\n // Check if service supports required graph type\n if (\n registration.graphTypes.includes(graphType) ||\n registration.metadata.graphTypes?.includes(graphType)\n ) {\n services.push({\n name: registration.name,\n address: registration.address,\n port: registration.port,\n metadata: registration.metadata,\n });\n }\n } catch (error) {\n this.logger.warn(\n `Failed to parse service file ${file}: ${error.message}`\n );\n }\n }\n\n return services;\n } catch (error) {\n this.logger.error(`Failed to get services: ${error.message}`);\n return [];\n }\n }\n\n /**\n * Find service by name\n */\n async findServiceByName(serviceName: string): Promise<{\n name: string;\n address: string;\n port: number;\n metadata: Record<string, any>;\n } | null> {\n try {\n const files = await fs.promises.readdir(this.servicesDir);\n\n for (const file of files) {\n if (!file.endsWith(\".json\")) continue;\n\n try {\n const serviceFile = path.join(this.servicesDir, file);\n const content = await fs.promises.readFile(serviceFile, \"utf-8\");\n const registration: ServiceRegistration = JSON.parse(content);\n\n if (\n registration.name === serviceName &&\n this.isProcessAlive(registration.pid)\n ) {\n return {\n name: registration.name,\n address: registration.address,\n port: registration.port,\n metadata: registration.metadata,\n };\n }\n } catch (error) {\n this.logger.warn(\n `Failed to parse service file ${file}: ${error.message}`\n );\n }\n }\n\n return null;\n } catch (error) {\n this.logger.error(\n `Failed to find service ${serviceName}: ${error.message}`\n );\n return null;\n }\n }\n\n /**\n * Ensure services directory exists\n */\n private ensureServicesDirectory(): void {\n try {\n const amelieDir = path.join(os.homedir(), \".flutch\");\n if (!fs.existsSync(amelieDir)) {\n fs.mkdirSync(amelieDir, { recursive: true });\n }\n\n if (!fs.existsSync(this.servicesDir)) {\n fs.mkdirSync(this.servicesDir, { recursive: true });\n }\n } catch (error) {\n this.logger.error(\n `Failed to create services directory: ${error.message}`\n );\n }\n }\n\n /**\n * Cleanup stale services\n */\n private async cleanupStaleServices(): Promise<void> {\n try {\n const files = await fs.promises.readdir(this.servicesDir);\n\n for (const file of files) {\n if (!file.endsWith(\".json\")) continue;\n\n try {\n const serviceFile = path.join(this.servicesDir, file);\n const content = await fs.promises.readFile(serviceFile, \"utf-8\");\n const registration: ServiceRegistration = JSON.parse(content);\n\n // Remove dead process entries\n if (!this.isProcessAlive(registration.pid)) {\n await fs.promises.unlink(serviceFile);\n this.logger.debug(`Cleaned up stale service: ${registration.name}`);\n }\n } catch (error) {\n // Remove corrupted files\n try {\n await fs.promises.unlink(path.join(this.servicesDir, file));\n } catch {}\n }\n }\n } catch (error) {\n this.logger.error(`Failed to cleanup stale services: ${error.message}`);\n }\n }\n\n /**\n * Check if process is still alive\n */\n private isProcessAlive(pid: number): boolean {\n try {\n process.kill(pid, 0);\n return true;\n } catch (error) {\n return false;\n }\n }\n}\n","// builder-registry.service.ts\nimport { Injectable } from \"@nestjs/common\";\nimport { AbstractGraphBuilder } from \"../graph/abstract-graph.builder\";\n\n@Injectable()\nexport class BuilderRegistryService {\n private builders: AbstractGraphBuilder<string>[] = [];\n\n registerBuilder(builder: AbstractGraphBuilder<string>) {\n // Check if builder with this graphType is already registered\n const existingBuilder = this.builders.find(\n b => b.graphType === builder.graphType\n );\n\n if (!existingBuilder) {\n this.builders.push(builder);\n }\n // If builder is already registered, simply ignore (avoid duplicates)\n }\n\n getBuilders(): AbstractGraphBuilder<string>[] {\n return this.builders;\n }\n}\n","/**\n * Utilities for working with versioned graph types\n * Format: \"company.name::version\"\n * Examples:\n * - \"global.simple::1.2.0\"\n * - \"company-123.customRag::2.1.0-beta\"\n * - \"global.simple\" (without version)\n * - \"simple\" (legacy format)\n */\nexport class GraphTypeUtils {\n /**\n * Parse full graph type\n * @param fullType - full graph type\n * @returns object with type components\n */\n static parse(fullType: string): {\n companyId: string;\n name: string;\n version?: string;\n } {\n // Check for version presence\n if (fullType.includes(\"::\")) {\n const [baseType, version] = fullType.split(\"::\");\n const [companyId, name] = baseType.split(\".\");\n return { companyId, name, version };\n }\n\n // Without version: \"global.simple\" or legacy format \"simple\"\n const parts = fullType.split(\".\");\n\n // Legacy format: \"simple\" → \"global.simple\"\n if (parts.length === 1) {\n return { companyId: \"global\", name: parts[0] };\n }\n\n // Format without version: \"global.simple\"\n return { companyId: parts[0], name: parts[1] };\n }\n\n /**\n * Build full type from components\n * @param companyId - company ID\n * @param name - graph name\n * @param version - version (optional)\n * @returns full graph type\n */\n static build(companyId: string, name: string, version?: string): string {\n const base = `${companyId}.${name}`;\n return version ? `${base}::${version}` : base;\n }\n\n /**\n * Normalize graph type for backward compatibility\n * @param graphType - graph type in any format\n * @returns normalized type\n */\n static normalize(graphType: string): string {\n const { companyId, name, version } = this.parse(graphType);\n return this.build(companyId, name, version);\n }\n\n /**\n * Get base type without version\n * @param graphType - full graph type\n * @returns base type\n */\n static getBaseType(graphType: string): string {\n if (graphType.includes(\"::\")) {\n return graphType.split(\"::\")[0];\n }\n // Normalize legacy format\n const { companyId, name } = this.parse(graphType);\n return `${companyId}.${name}`;\n }\n\n /**\n * Extract version from graph type\n * @param graphType - full graph type\n * @returns version or undefined\n */\n static getVersion(graphType: string): string | undefined {\n return graphType.includes(\"::\") ? graphType.split(\"::\")[1] : undefined;\n }\n\n /**\n * Validate version (basic semver check)\n * @param version - version to check\n * @returns true if version is valid\n */\n static isValidVersion(version: string): boolean {\n // Basic semver pattern check\n const semverRegex = /^\\d+\\.\\d+\\.\\d+(-[a-zA-Z0-9.-]+)?$/;\n return semverRegex.test(version);\n }\n\n /**\n * Check if type is system (global)\n * @param graphType - graph type\n * @returns true if graph is system\n */\n static isSystemGraph(graphType: string): boolean {\n const { companyId } = this.parse(graphType);\n return companyId === \"global\";\n }\n\n /**\n * Compare versions (simple comparison for sorting)\n * @param a - first version\n * @param b - second version\n * @returns -1, 0, 1 for sorting\n */\n static compareVersions(a: string, b: string): number {\n const parseVersion = (v: string) => {\n const [main, prerelease] = v.split(\"-\");\n const [major, minor, patch] = main.split(\".\").map(Number);\n return { major, minor, patch, prerelease };\n };\n\n const versionA = parseVersion(a);\n const versionB = parseVersion(b);\n\n // Compare major\n if (versionA.major !== versionB.major) {\n return versionA.major - versionB.major;\n }\n\n // Compare minor\n if (versionA.minor !== versionB.minor) {\n return versionA.minor - versionB.minor;\n }\n\n // Compare patch\n if (versionA.patch !== versionB.patch) {\n return versionA.patch - versionB.patch;\n }\n\n // Compare prerelease\n if (versionA.prerelease && !versionB.prerelease) return -1;\n if (!versionA.prerelease && versionB.prerelease) return 1;\n if (versionA.prerelease && versionB.prerelease) {\n return versionA.prerelease.localeCompare(versionB.prerelease);\n }\n\n return 0;\n }\n}\n","// packages/sdk/src/versioning/versioned-graph.service.ts\nimport { Injectable, Logger } from \"@nestjs/common\";\nimport { ModuleRef } from \"@nestjs/core\";\nimport { GraphTypeUtils } from \"../../utils/graph-type.utils\";\nimport { AbstractGraphBuilder } from \"../abstract-graph.builder\";\nimport {\n VersioningConfig,\n VersionRoute,\n VersionResolution,\n VersionResolutionOptions,\n} from \"./versioning.types\";\n\n/**\n * Service for managing graph versions\n * Abstracts versioning logic to the service-mesh level\n */\n@Injectable()\nexport class VersionedGraphService {\n private readonly logger = new Logger(VersionedGraphService.name);\n private readonly versionConfigs = new Map<string, VersioningConfig>();\n\n constructor() {\n // Initialization now happens through UniversalGraphModule\n // ModuleRef will be provided when needed via method parameters\n }\n\n /**\n * Register versioning configuration\n */\n registerVersioning(config: VersioningConfig): void {\n this.versionConfigs.set(config.baseGraphType, config);\n this.logger.log(\n `Registered versioning for ${config.baseGraphType} with ${config.versions.length} versions`\n );\n }\n\n /**\n * Resolve graph version\n */\n async resolveVersion(\n graphType: string,\n options: VersionResolutionOptions = {}\n ): Promise<VersionResolution> {\n const parsed = GraphTypeUtils.parse(graphType);\n const baseType = GraphTypeUtils.getBaseType(graphType);\n const requestedVersion =\n GraphTypeUtils.getVersion(graphType) || options.requestedVersion;\n\n const config = this.versionConfigs.get(baseType);\n if (!config) {\n throw new Error(`No versioning configuration found for ${baseType}`);\n }\n\n // Find suitable version\n const route = this.findBestVersionRoute(config, requestedVersion, options);\n if (!route) {\n throw new Error(\n `No compatible version found for ${graphType} with options: ${JSON.stringify(options)}`\n );\n }\n\n const fullGraphType = GraphTypeUtils.build(\n parsed.companyId,\n parsed.name,\n route.version\n );\n\n return {\n version: route.version,\n builderClass: route.builderClass,\n fullGraphType,\n };\n }\n\n /**\n * Create builder for specified version\n */\n async createVersionedBuilder(\n graphType: string,\n moduleRef?: ModuleRef,\n options: VersionResolutionOptions = {}\n ): Promise<AbstractGraphBuilder<any>> {\n const resolution = await this.resolveVersion(graphType, options);\n\n try {\n if (!moduleRef) {\n throw new Error(\n \"ModuleRef is not available - falling back to direct instantiation\"\n );\n }\n const builder = await moduleRef.create(resolution.builderClass);\n this.logger.debug(\n `Created versioned builder for ${resolution.fullGraphType}`\n );\n return builder;\n } catch (error) {\n this.logger.error(\n `Failed to create builder for ${resolution.fullGraphType}: ${error.message}`\n );\n throw new Error(`Failed to create versioned builder: ${error.message}`);\n }\n }\n\n /**\n * Get all available versions for a graph\n */\n getAvailableVersions(baseGraphType: string): string[] {\n const config = this.versionConfigs.get(baseGraphType);\n if (!config) {\n return [];\n }\n\n return config.versions\n .map(route => route.version)\n .sort((a, b) => GraphTypeUtils.compareVersions(b, a)); // Sort in descending order\n }\n\n /**\n * Check version support\n */\n isVersionSupported(\n graphType: string,\n options: VersionResolutionOptions = {}\n ): boolean {\n try {\n const baseType = GraphTypeUtils.getBaseType(graphType);\n const requestedVersion = GraphTypeUtils.getVersion(graphType);\n const config = this.versionConfigs.get(baseType);\n\n if (!config) {\n return false;\n }\n\n const route = this.findBestVersionRoute(\n config,\n requestedVersion,\n options\n );\n return route !== null;\n } catch {\n return false;\n }\n }\n\n /**\n * Find best version\n */\n private findBestVersionRoute(\n config: VersioningConfig,\n requestedVersion?: string,\n options: VersionResolutionOptions = {}\n ): VersionRoute | null {\n const { strict = false } = options;\n let candidates = [...config.versions];\n\n // If a specific version is requested\n if (requestedVersion) {\n // Exact match\n const exactMatch = candidates.find(\n route => route.version === requestedVersion\n );\n if (exactMatch) {\n return exactMatch;\n }\n\n // In strict mode, don't search for alternatives\n if (strict) {\n return null;\n }\n\n // Find compatible version (semantic versioning)\n const compatibleVersions = candidates.filter(route =>\n this.isVersionCompatible(requestedVersion, route.version)\n );\n\n if (compatibleVersions.length > 0) {\n // Return the newest compatible version\n return compatibleVersions.sort((a, b) =>\n GraphTypeUtils.compareVersions(b.version, a.version)\n )[0];\n }\n }\n\n // Return default version\n const defaultRoute = candidates.find(route => route.isDefault);\n if (defaultRoute) {\n return defaultRoute;\n }\n\n // If there's no explicit default version, use strategy\n if (\n config.defaultVersionStrategy === \"latest\" ||\n !config.defaultVersionStrategy\n ) {\n const sortedVersions = candidates.sort((a, b) =>\n GraphTypeUtils.compareVersions(b.version, a.version)\n );\n return sortedVersions[0] || null;\n }\n\n return null;\n }\n\n /**\n * Check version compatibility (simplified semantics)\n */\n private isVersionCompatible(requested: string, available: string): boolean {\n try {\n const requestedParts = requested.split(\".\").map(Number);\n const availableParts = available.split(\".\").map(Number);\n\n // Major version must match\n if (requestedParts[0] !== availableParts[0]) {\n return false;\n }\n\n // Available version must be >= requested\n return GraphTypeUtils.compareVersions(available, requested) >= 0;\n } catch {\n return false;\n }\n }\n\n /**\n * Get versioning configuration information\n */\n getVersioningInfo(baseGraphType: string): VersioningConfig | null {\n return this.versionConfigs.get(baseGraphType) || null;\n }\n}\n","import { randomBytes } from \"crypto\";\nimport type Redis from \"ioredis\";\nimport { CallbackEntry, CallbackRecord } from \"./callback.interface\";\n\n/**\n * CallbackStore manages callback tokens and their lifecycle.\n *\n * Production mode (NODE_ENV=production):\n * - Uses Lua scripts for atomic operations (better performance, guaranteed consistency)\n * - Prevents race conditions in high-concurrency scenarios\n * - Single network round-trip per operation\n *\n * Development mode (NODE_ENV!=production):\n * - Uses simple Redis operations for ioredis-mock compatibility\n * - Non-atomic operations (acceptable for development/testing)\n * - Better debugging and simpler error handling\n */\nexport class CallbackStore {\n private readonly isProduction: boolean;\n\n constructor(private readonly redis: Redis) {\n this.isProduction = process.env.NODE_ENV === \"production\";\n }\n\n private generateToken(graphType: string): string {\n // Use :: as separator since it's not used in base64url\n // Format: cb::{graphType}::{random}\n // 8 bytes = 64 bits of entropy, practically collision-free for short-lived tokens\n return `cb::${graphType}::${randomBytes(8).toString(\"base64url\")}`;\n }\n\n /**\n * Issues a new callback token and persists its payload.\n */\n async issue(entry: CallbackEntry): Promise<string> {\n const token = this.generateToken(entry.graphType);\n const record: CallbackRecord = {\n ...entry,\n token,\n status: \"pending\",\n createdAt: Date.now(),\n retries: 0,\n };\n const ttl = entry.metadata?.ttlSec ?? 600; // default 10 minutes\n await this.redis.setex(`callback:${token}`, ttl, JSON.stringify(record));\n return token;\n }\n\n /**\n * Atomically fetches callback data and acquires a lock.\n */\n async getAndLock(token: string): Promise<CallbackRecord | null> {\n if (this.isProduction) {\n return this.getAndLockAtomic(token);\n } else {\n return this.getAndLockSimple(token);\n }\n }\n\n /**\n * Production version with Lua script for atomicity\n */\n private async getAndLockAtomic(\n token: string\n ): Promise<CallbackRecord | null> {\n const script = `\n local data = redis.call('GET', KEYS[1])\n if not data then return nil end\n local record = cjson.decode(data)\n if record.status ~= 'pending' then return nil end\n record.status = 'processing'\n redis.call('SET', KEYS[1], cjson.encode(record))\n return cjson.encode(record)\n `;\n const result = await this.redis.eval(script, 1, `callback:${token}`);\n return result ? (JSON.parse(result as string) as CallbackRecord) : null;\n }\n\n /**\n * Development version with simple operations for ioredis-mock compatibility\n */\n private async getAndLockSimple(\n token: string\n ): Promise<CallbackRecord | null> {\n const key = `callback:${token}`;\n const data = await this.redis.get(key);\n\n if (!data) {\n return null;\n }\n\n try {\n const record = JSON.parse(data) as CallbackRecord;\n\n if (record.status !== \"pending\") {\n return null;\n }\n\n // Update status to processing\n record.status = \"processing\";\n await this.redis.set(key, JSON.stringify(record));\n\n return record;\n } catch (error) {\n console.error(\"Failed to parse callback record:\", error);\n return null;\n }\n }\n\n /**\n * Finalizes callback processing by removing token.\n */\n async finalize(token: string): Promise<void> {\n await this.redis.del(`callback:${token}`);\n }\n\n /**\n * Mark callback as failed and store error message.\n */\n async fail(token: string, error: string): Promise<CallbackRecord | null> {\n if (this.isProduction) {\n return this.failAtomic(token, error);\n } else {\n return this.failSimple(token, error);\n }\n }\n\n /**\n * Production version with Lua script for atomicity\n */\n private async failAtomic(\n token: string,\n error: string\n ): Promise<CallbackRecord | null> {\n const script = `\n local data = redis.call('GET', KEYS[1])\n if not data then return nil end\n local record = cjson.decode(data)\n record.status = 'failed'\n record.retries = (record.retries or 0) + 1\n record.lastError = ARGV[1]\n redis.call('SET', KEYS[1], cjson.encode(record))\n return cjson.encode(record)\n `;\n const result = await this.redis.eval(script, 1, `callback:${token}`, error);\n return result ? (JSON.parse(result as string) as CallbackRecord) : null;\n }\n\n /**\n * Development version with simple operations for ioredis-mock compatibility\n */\n private async failSimple(\n token: string,\n error: string\n ): Promise<CallbackRecord | null> {\n const key = `callback:${token}`;\n const data = await this.redis.get(key);\n\n if (!data) {\n return null;\n }\n\n try {\n const record = JSON.parse(data) as CallbackRecord;\n record.status = \"failed\";\n record.retries = (record.retries || 0) + 1;\n record.lastError = error;\n\n await this.redis.set(key, JSON.stringify(record));\n return record;\n } catch (parseError) {\n console.error(\"Failed to parse callback record:\", parseError);\n return null;\n }\n }\n\n /**\n * Reset callback status to pending for retry.\n */\n async retry(token: string): Promise<CallbackRecord | null> {\n if (this.isProduction) {\n return this.retryAtomic(token);\n } else {\n return this.retrySimple(token);\n }\n }\n\n /**\n * Production version with Lua script for atomicity\n */\n private async retryAtomic(token: string): Promise<CallbackRecord | null> {\n const script = `\n local data = redis.call('GET', KEYS[1])\n if not data then return nil end\n local record = cjson.decode(data)\n record.status = 'pending'\n redis.call('SET', KEYS[1], cjson.encode(record))\n return cjson.encode(record)\n `;\n const result = await this.redis.eval(script, 1, `callback:${token}`);\n return result ? (JSON.parse(result as string) as CallbackRecord) : null;\n }\n\n /**\n * Development version with simple operations for ioredis-mock compatibility\n */\n private async retrySimple(token: string): Promise<CallbackRecord | null> {\n const key = `callback:${token}`;\n const data = await this.redis.get(key);\n\n if (!data) {\n return null;\n }\n\n try {\n const record = JSON.parse(data) as CallbackRecord;\n record.status = \"pending\";\n\n await this.redis.set(key, JSON.stringify(record));\n return record;\n } catch (parseError) {\n console.error(\"Failed to parse callback record:\", parseError);\n return null;\n }\n }\n}\n","import { CallbackHandler } from \"./callback.interface\";\n\nexport class CallbackRegistry {\n private handlers = new Map<string, CallbackHandler>();\n\n /**\n * Register a callback with optional graph type for versioning\n * @param handler Handler name (e.g., \"confirm-transaction\")\n * @param callback The callback function\n * @param graphType Optional graph type for version-specific registration\n */\n register(\n handler: string,\n callback: CallbackHandler,\n graphType?: string\n ): void {\n // If graphType provided, use versioned key\n const key = graphType ? `${graphType}::${handler}` : handler;\n this.handlers.set(key, callback);\n\n // Also register without version as fallback (for backward compatibility)\n if (graphType) {\n this.handlers.set(handler, callback);\n }\n }\n\n /**\n * Get a callback handler, with version-aware lookup\n * @param handler Handler name\n * @param graphType Optional graph type for version-specific lookup\n */\n get(handler: string, graphType?: string): CallbackHandler | undefined {\n // First try version-specific lookup if graphType provided\n if (graphType) {\n const versionedHandler = this.handlers.get(`${graphType}::${handler}`);\n if (versionedHandler) {\n return versionedHandler;\n }\n }\n\n // Fallback to non-versioned handler\n return this.handlers.get(handler);\n }\n\n /**\n * List all registered handlers (for debugging)\n */\n listHandlers(): string[] {\n return Array.from(this.handlers.keys());\n }\n}\n","import { Injectable, Logger } from \"@nestjs/common\";\nimport type Redis from \"ioredis\";\nimport { createHash } from \"crypto\";\nimport { CallbackResult } from \"./callback.interface\";\n\nexport interface IdempotencyConfig {\n ttlSeconds: number; // How long to cache results\n keyPrefix: string; // Redis key prefix\n hashPayload: boolean; // Whether to hash the payload for key generation\n includeUserId: boolean; // Include userId in idempotency key\n}\n\nexport interface IdempotencyEntry {\n key: string;\n result: CallbackResult;\n createdAt: number;\n executedAt: number;\n expiresAt: number;\n requestHash: string;\n attempts: number;\n}\n\nexport enum IdempotencyStatus {\n NEW = \"NEW\",\n IN_PROGRESS = \"IN_PROGRESS\",\n COMPLETED = \"COMPLETED\",\n FAILED = \"FAILED\",\n}\n\n/**\n * Manages idempotent callback execution to prevent duplicate operations.\n * Caches results and ensures exactly-once execution semantics.\n */\n@Injectable()\nexport class IdempotencyManager {\n private readonly logger = new Logger(IdempotencyManager.name);\n private readonly defaultConfig: IdempotencyConfig = {\n ttlSeconds: 3600, // 1 hour default\n keyPrefix: \"idempotency\",\n hashPayload: true,\n includeUserId: true,\n };\n\n constructor(private readonly redis: Redis) {}\n\n /**\n * Check if a request is idempotent and return cached result if available.\n * If not, acquire a lock for execution.\n */\n async checkAndLock(\n idempotencyKey: string | undefined,\n requestData: {\n userId?: string;\n graphType: string;\n handler: string;\n params: Record<string, any>;\n },\n config?: Partial<IdempotencyConfig>\n ): Promise<{\n status: IdempotencyStatus;\n result?: CallbackResult;\n key: string;\n }> {\n const cfg = { ...this.defaultConfig, ...config };\n\n // Generate idempotency key if not provided\n const key = idempotencyKey || this.generateKey(requestData, cfg);\n const redisKey = `${cfg.keyPrefix}:${key}`;\n\n // Try to get existing result\n const existing = await this.redis.get(redisKey);\n if (existing) {\n try {\n const entry: IdempotencyEntry = JSON.parse(existing);\n\n // Check if it's still being processed\n if (entry.result === null && entry.executedAt === 0) {\n // Check if it's stuck (processing for more than 5 minutes)\n const processingTime = Date.now() - entry.createdAt;\n if (processingTime > 300000) {\n // Reset stuck entry\n await this.redis.del(redisKey);\n } else {\n return {\n status: IdempotencyStatus.IN_PROGRESS,\n key,\n };\n }\n }\n\n // Return cached result\n this.logger.debug(\n `Returning cached result for idempotency key: ${key}`\n );\n return {\n status: IdempotencyStatus.COMPLETED,\n result: entry.result,\n key,\n };\n } catch (error) {\n this.logger.error(\n `Failed to parse idempotency entry: ${error.message}`\n );\n await this.redis.del(redisKey);\n }\n }\n\n // Try to acquire lock for new execution\n const lockAcquired = await this.acquireLock(redisKey, cfg.ttlSeconds);\n if (!lockAcquired) {\n // Someone else is processing\n return {\n status: IdempotencyStatus.IN_PROGRESS,\n key,\n };\n }\n\n return {\n status: IdempotencyStatus.NEW,\n key,\n };\n }\n\n /**\n * Store the result of an idempotent operation.\n */\n async storeResult(\n key: string,\n result: CallbackResult,\n config?: Partial<IdempotencyConfig>\n ): Promise<void> {\n const cfg = { ...this.defaultConfig, ...config };\n const redisKey = `${cfg.keyPrefix}:${key}`;\n\n const entry: IdempotencyEntry = {\n key,\n result,\n createdAt: Date.now(),\n executedAt: Date.now(),\n expiresAt: Date.now() + cfg.ttlSeconds * 1000,\n requestHash: \"\",\n attempts: 1,\n };\n\n await this.redis.setex(redisKey, cfg.ttlSeconds, JSON.stringify(entry));\n\n this.logger.debug(`Stored idempotent result for key: ${key}`);\n }\n\n /**\n * Mark an idempotent operation as failed.\n */\n async markFailed(\n key: string,\n error: string,\n config?: Partial<IdempotencyConfig>\n ): Promise<void> {\n const cfg = { ...this.defaultConfig, ...config };\n const redisKey = `${cfg.keyPrefix}:${key}`;\n\n // Store failure with shorter TTL (5 minutes)\n const entry: IdempotencyEntry = {\n key,\n result: {\n success: false,\n error,\n },\n createdAt: Date.now(),\n executedAt: Date.now(),\n expiresAt: Date.now() + 300000, // 5 minutes\n requestHash: \"\",\n attempts: 1,\n };\n\n await this.redis.setex(\n redisKey,\n 300, // 5 minutes TTL for failures\n JSON.stringify(entry)\n );\n\n this.logger.debug(`Marked idempotent operation as failed for key: ${key}`);\n }\n\n /**\n * Release lock if operation fails unexpectedly.\n */\n async releaseLock(\n key: string,\n config?: Partial<IdempotencyConfig>\n ): Promise<void> {\n const cfg = { ...this.defaultConfig, ...config };\n const redisKey = `${cfg.keyPrefix}:${key}`;\n await this.redis.del(redisKey);\n this.logger.debug(`Released lock for key: ${key}`);\n }\n\n /**\n * Generate idempotency key from request data.\n */\n private generateKey(\n requestData: {\n userId?: string;\n graphType: string;\n handler: string;\n params: Record<string, any>;\n },\n config: IdempotencyConfig\n ): string {\n const components: string[] = [requestData.graphType, requestData.handler];\n\n if (config.includeUserId && requestData.userId) {\n components.push(requestData.userId);\n }\n\n // Create deterministic string from params\n const paramsStr = this.deterministicStringify(requestData.params);\n\n if (config.hashPayload) {\n // Hash the params for shorter key\n const hash = createHash(\"sha256\")\n .update(paramsStr)\n .digest(\"hex\")\n .substring(0, 16);\n components.push(hash);\n } else {\n components.push(paramsStr);\n }\n\n return components.join(\":\");\n }\n\n /**\n * Acquire lock for idempotent operation.\n */\n private async acquireLock(key: string, ttlSeconds: number): Promise<boolean> {\n // Create lock entry\n const entry: IdempotencyEntry = {\n key,\n result: null as any,\n createdAt: Date.now(),\n executedAt: 0,\n expiresAt: Date.now() + ttlSeconds * 1000,\n requestHash: \"\",\n attempts: 1,\n };\n\n // SET NX - only set if not exists\n const result = await this.redis.set(\n key,\n JSON.stringify(entry),\n \"EX\",\n ttlSeconds,\n \"NX\"\n );\n\n return result === \"OK\";\n }\n\n /**\n * Create deterministic JSON stringify (sorted keys).\n */\n private deterministicStringify(obj: any): string {\n return JSON.stringify(this.sortObject(obj));\n }\n\n /**\n * Recursively sort object keys for deterministic stringification.\n */\n private sortObject(obj: any): any {\n if (obj === null || typeof obj !== \"object\") {\n return obj;\n }\n\n if (Array.isArray(obj)) {\n return obj.map(item => this.sortObject(item));\n }\n\n const sorted: Record<string, any> = {};\n Object.keys(obj)\n .sort()\n .forEach(key => {\n sorted[key] = this.sortObject(obj[key]);\n });\n\n return sorted;\n }\n\n /**\n * Clean up expired idempotency entries.\n */\n async cleanup(): Promise<number> {\n const pattern = `${this.defaultConfig.keyPrefix}:*`;\n const keys = await this.redis.keys(pattern);\n let cleaned = 0;\n\n for (const key of keys) {\n const value = await this.redis.get(key);\n if (value) {\n try {\n const entry: IdempotencyEntry = JSON.parse(value);\n if (entry.expiresAt < Date.now()) {\n await this.redis.del(key);\n cleaned++;\n }\n } catch {\n // Invalid entry, delete it\n await this.redis.del(key);\n cleaned++;\n }\n }\n }\n\n this.logger.log(`Cleaned up ${cleaned} expired idempotency entries`);\n return cleaned;\n }\n\n /**\n * Get statistics about idempotency cache.\n */\n async getStatistics(): Promise<{\n totalEntries: number;\n completedEntries: number;\n inProgressEntries: number;\n failedEntries: number;\n cacheHitRate: number;\n }> {\n const pattern = `${this.defaultConfig.keyPrefix}:*`;\n const keys = await this.redis.keys(pattern);\n\n let completed = 0;\n let inProgress = 0;\n let failed = 0;\n\n for (const key of keys) {\n const value = await this.redis.get(key);\n if (value) {\n try {\n const entry: IdempotencyEntry = JSON.parse(value);\n if (entry.result === null) {\n inProgress++;\n } else if (entry.result.success === false) {\n failed++;\n } else {\n completed++;\n }\n } catch {\n // Skip invalid entries\n }\n }\n }\n\n const total = completed + inProgress + failed;\n const cacheHitRate = total > 0 ? (completed / total) * 100 : 0;\n\n return {\n totalEntries: total,\n completedEntries: completed,\n inProgressEntries: inProgress,\n failedEntries: failed,\n cacheHitRate,\n };\n }\n}\n","import { Injectable, Logger } from \"@nestjs/common\";\nimport { CallbackRegistry } from \"./callback-registry\";\nimport { CallbackRecord, CallbackResult } from \"./callback.interface\";\nimport { CallbackStore } from \"./callback-store\";\nimport { CallbackACL, CallbackUser } from \"./callback-acl.service\";\nimport { CallbackAuditor } from \"./callback-auditor.service\";\nimport { CallbackMetrics } from \"./callback-metrics.service\";\nimport { CallbackRateLimiter } from \"./callback-rate-limiter\";\nimport { IdempotencyManager, IdempotencyStatus } from \"./idempotency-manager\";\nimport { CallbackPatchService } from \"./callback-patch.service\";\n\nexport interface RouterConfig {\n maxRetries?: number;\n retryDelayMs?: number;\n timeoutMs?: number;\n enableCircuitBreaker?: boolean;\n circuitBreakerThreshold?: number;\n circuitBreakerResetMs?: number;\n}\n\ninterface CircuitBreakerState {\n failures: number;\n lastFailure?: number;\n state: \"closed\" | \"open\" | \"half-open\";\n}\n\n/**\n * Enhanced Smart Callback Router with error handling, retry logic,\n * circuit breaker pattern, and comprehensive monitoring.\n */\n@Injectable()\nexport class SmartCallbackRouter {\n private readonly logger = new Logger(SmartCallbackRouter.name);\n private readonly circuitBreakers = new Map<string, CircuitBreakerState>();\n private readonly defaultConfig: RouterConfig = {\n maxRetries: 3,\n retryDelayMs: 1000,\n timeoutMs: 30000,\n enableCircuitBreaker: true,\n circuitBreakerThreshold: 5,\n circuitBreakerResetMs: 60000,\n };\n\n constructor(\n private readonly registry: CallbackRegistry,\n private readonly store: CallbackStore,\n private readonly acl: CallbackACL,\n private readonly auditor: CallbackAuditor,\n private readonly metrics: CallbackMetrics,\n private readonly rateLimiter: CallbackRateLimiter,\n private readonly idempotencyManager: IdempotencyManager,\n private readonly patchService: CallbackPatchService\n ) {}\n\n /**\n * Route and execute callback with full error handling and monitoring.\n */\n async route(\n record: CallbackRecord,\n user: CallbackUser | undefined,\n requestMetadata?: {\n ip?: string;\n userAgent?: string;\n platform?: string;\n platformContext?: any;\n },\n config?: RouterConfig\n ): Promise<CallbackResult> {\n const cfg = { ...this.defaultConfig, ...config };\n const startTime = Date.now();\n const correlationId = await this.auditor.logExecutionStart(record, user);\n let idempotencyCheck: any = null;\n\n try {\n // 1. Check idempotency first\n const idempotencyKey = record.metadata?.idempotencyKey;\n idempotencyCheck = await this.idempotencyManager.checkAndLock(\n idempotencyKey,\n {\n userId: record.userId,\n graphType: record.graphType,\n handler: record.handler,\n params: record.params,\n }\n );\n\n // Return cached result if already executed\n if (idempotencyCheck.status === IdempotencyStatus.COMPLETED) {\n this.logger.debug(`Returning cached result for ${record.token}`);\n return idempotencyCheck.result!;\n }\n\n // Wait if already in progress\n if (idempotencyCheck.status === IdempotencyStatus.IN_PROGRESS) {\n throw new Error(\"Request is already being processed\");\n }\n\n // 2. Check rate limits\n await this.checkRateLimits(user, requestMetadata?.ip);\n\n // ACL permissions already validated by CallbackTokenGuard\n // No need to validate again here\n\n // 3. Record token age\n const tokenAge = Date.now() - record.createdAt;\n this.metrics.recordTokenAge(record.graphType, tokenAge);\n\n // 4. Check circuit breaker\n this.checkCircuitBreaker(record.graphType, record.handler);\n\n // 5. Start execution\n this.metrics.recordExecutionStart(record.graphType, record.handler);\n\n // 6. Execute with timeout and retry\n const result = await this.executeWithRetry(\n record,\n user,\n cfg,\n correlationId\n );\n\n // 7. Record success\n const duration = Date.now() - startTime;\n await this.auditor.logExecutionSuccess(\n record,\n user,\n result,\n duration,\n correlationId\n );\n this.metrics.recordExecutionComplete(\n record.graphType,\n record.handler,\n duration,\n true\n );\n\n // 8. Reset circuit breaker on success\n this.resetCircuitBreaker(record.graphType, record.handler);\n\n // 9. Store idempotent result\n await this.idempotencyManager.storeResult(idempotencyCheck.key, result);\n\n // 10. Finalize token\n await this.store.finalize(record.token);\n\n // 11. Apply patch if provided\n if (result.patch) {\n await this.patchService.apply(\n record,\n result.patch,\n requestMetadata?.platformContext\n );\n }\n\n return result;\n } catch (error) {\n // Record failure\n const duration = Date.now() - startTime;\n await this.auditor.logExecutionFailure(\n record,\n user,\n error,\n duration,\n correlationId\n );\n this.metrics.recordExecutionComplete(\n record.graphType,\n record.handler,\n duration,\n false,\n error.message\n );\n\n // Update circuit breaker\n this.recordCircuitBreakerFailure(record.graphType, record.handler);\n\n // Mark idempotency as failed\n if (idempotencyCheck) {\n await this.idempotencyManager.markFailed(\n idempotencyCheck.key,\n error.message\n );\n }\n\n // Mark token as failed\n await this.store.fail(record.token, error.message);\n\n throw error;\n }\n }\n\n /**\n * Execute callback with retry logic.\n */\n private async executeWithRetry(\n record: CallbackRecord,\n user: CallbackUser | undefined,\n config: RouterConfig,\n correlationId: string\n ): Promise<CallbackResult> {\n let lastError: Error;\n\n for (let attempt = 1; attempt <= config.maxRetries!; attempt++) {\n try {\n if (attempt > 1) {\n // Log retry attempt\n await this.auditor.logRetryAttempt(record, user, attempt);\n this.metrics.recordRetry(record.graphType, record.handler);\n\n // Wait before retry with exponential backoff\n const delay = config.retryDelayMs! * Math.pow(2, attempt - 2);\n await this.sleep(delay);\n }\n\n // Execute with timeout\n return await this.executeWithTimeout(record, config.timeoutMs!);\n } catch (error) {\n lastError = error;\n this.logger.warn(\n `[${correlationId}] Attempt ${attempt}/${config.maxRetries} failed: ${error.message}`\n );\n\n // Don't retry on certain errors\n if (this.isNonRetryableError(error)) {\n throw error;\n }\n }\n }\n\n throw new Error(\n `Callback execution failed after ${config.maxRetries} attempts: ${lastError!.message}`\n );\n }\n\n /**\n * Execute callback with timeout.\n */\n private async executeWithTimeout(\n record: CallbackRecord,\n timeoutMs: number\n ): Promise<CallbackResult> {\n const handler = this.registry.get(record.handler, record.graphType);\n if (!handler) {\n throw new Error(\n `No callback handler registered for ${record.handler} (graphType: ${record.graphType})`\n );\n }\n\n return Promise.race([\n handler({\n userId: record.userId,\n threadId: record.threadId,\n agentId: record.agentId,\n params: record.params,\n platform: record.metadata?.platform,\n metadata: record.metadata,\n }),\n new Promise<never>((_, reject) =>\n setTimeout(\n () =>\n reject(\n new Error(`Callback execution timeout after ${timeoutMs}ms`)\n ),\n timeoutMs\n )\n ),\n ]);\n }\n\n /**\n * Check rate limits for user and IP.\n */\n private async checkRateLimits(\n user: CallbackUser | undefined,\n ip?: string\n ): Promise<void> {\n // Check user rate limit\n if (user) {\n const userLimit = await this.rateLimiter.checkUserLimit(user.userId);\n if (!userLimit.allowed) {\n this.metrics.recordRateLimited(\"user\");\n await this.auditor.logRateLimited(\n `user:${user.userId}`,\n userLimit.retryAfter!\n );\n throw new Error(\n `Rate limit exceeded. Retry after ${userLimit.retryAfter} seconds`\n );\n }\n }\n\n // Check IP rate limit\n if (ip) {\n const ipLimit = await this.rateLimiter.checkIpLimit(ip);\n if (!ipLimit.allowed) {\n this.metrics.recordRateLimited(\"ip\");\n await this.auditor.logRateLimited(`ip:${ip}`, ipLimit.retryAfter!);\n throw new Error(\n `Rate limit exceeded. Retry after ${ipLimit.retryAfter} seconds`\n );\n }\n }\n }\n\n /**\n * Check circuit breaker state.\n */\n private checkCircuitBreaker(graphType: string, handler: string): void {\n const key = `${graphType}::${handler}`;\n const breaker = this.circuitBreakers.get(key);\n\n if (!breaker) return;\n\n if (breaker.state === \"open\") {\n const now = Date.now();\n const resetTime =\n breaker.lastFailure! + this.defaultConfig.circuitBreakerResetMs!;\n\n if (now < resetTime) {\n throw new Error(\n `Circuit breaker is open for ${key}. Service temporarily unavailable.`\n );\n } else {\n // Move to half-open state\n breaker.state = \"half-open\";\n }\n }\n }\n\n /**\n * Record circuit breaker failure.\n */\n private recordCircuitBreakerFailure(\n graphType: string,\n handler: string\n ): void {\n const key = `${graphType}::${handler}`;\n const breaker = this.circuitBreakers.get(key) || {\n failures: 0,\n state: \"closed\",\n };\n\n breaker.failures++;\n breaker.lastFailure = Date.now();\n\n if (breaker.failures >= this.defaultConfig.circuitBreakerThreshold!) {\n breaker.state = \"open\";\n this.logger.error(\n `Circuit breaker opened for ${key} after ${breaker.failures} failures`\n );\n }\n\n this.circuitBreakers.set(key, breaker);\n }\n\n /**\n * Reset circuit breaker on success.\n */\n private resetCircuitBreaker(graphType: string, handler: string): void {\n const key = `${graphType}::${handler}`;\n this.circuitBreakers.delete(key);\n }\n\n /**\n * Check if error is non-retryable.\n */\n private isNonRetryableError(error: Error): boolean {\n const message = error.message.toLowerCase();\n return (\n message.includes(\"forbidden\") ||\n message.includes(\"unauthorized\") ||\n message.includes(\"invalid token\") ||\n message.includes(\"expired\") ||\n message.includes(\"rate limit\")\n );\n }\n\n /**\n * Sleep helper for retry delays.\n */\n private sleep(ms: number): Promise<void> {\n return new Promise(resolve => setTimeout(resolve, ms));\n }\n\n /**\n * Get circuit breaker status.\n */\n getCircuitBreakerStatus(): Map<string, CircuitBreakerState> {\n return new Map(this.circuitBreakers);\n }\n}\n","import { CallbackStore } from \"./callback-store\";\nimport { SmartCallbackRouter } from \"./smart-callback.router\";\nimport { CallbackResult, CallbackRecord } from \"./callback.interface\";\n\nexport class UniversalCallbackService {\n constructor(\n private readonly store: CallbackStore,\n private readonly router: SmartCallbackRouter\n ) {}\n\n async handle(\n record: CallbackRecord,\n user?: any,\n metadata?: {\n ip?: string;\n userAgent?: string;\n platform?: string;\n platformContext?: any;\n }\n ): Promise<CallbackResult> {\n try {\n const result = await this.router.route(record, user, metadata);\n // Note: finalization is now handled by the router\n return result;\n } catch (err: any) {\n return { success: false, error: err?.message || \"Callback error\" };\n }\n }\n}\n","import { CallbackResult } from \"./callback.interface\";\nimport { CallbackRegistry } from \"./callback-registry\";\n\n/**\n * Example finance callback registration demonstrating how graph-specific\n * handlers can integrate with the universal callback system.\n */\nexport function registerFinanceExampleCallback(registry: CallbackRegistry) {\n registry.register(\n \"example\",\n async (): Promise<CallbackResult> => ({\n success: true,\n message: \"Finance callback executed\",\n }),\n \"finance::1.0.0\" // Optional graph type for versioning\n );\n}\n","import { Injectable, ForbiddenException, Logger } from \"@nestjs/common\";\nimport { CallbackRecord } from \"./callback.interface\";\n\nexport interface CallbackUser {\n userId: string;\n roles?: string[];\n permissions?: string[];\n companyId?: string;\n}\n\nexport interface ACLValidationResult {\n allowed: boolean;\n reason?: string;\n requiredScopes?: string[];\n userScopes?: string[];\n}\n\n/**\n * Access Control Layer for callback execution.\n * Validates that the user has permission to execute the callback.\n */\n@Injectable()\nexport class CallbackACL {\n private readonly logger = new Logger(CallbackACL.name);\n\n /**\n * Validates if the user can execute the callback.\n * @throws ForbiddenException if access is denied\n */\n async validate(\n user: CallbackUser | undefined,\n record: CallbackRecord\n ): Promise<ACLValidationResult> {\n const validationStart = Date.now();\n\n try {\n // 1. Check if user is authenticated\n if (!user) {\n this.logger.warn(\n `Unauthenticated access attempt for callback ${record.token}`\n );\n throw new ForbiddenException(\n \"Authentication required for callback execution\"\n );\n }\n\n // 2. Check user ID match\n if (record.userId && record.userId !== user.userId) {\n this.logger.warn(\n `User ${user.userId} attempted to execute callback for user ${record.userId}`\n );\n throw new ForbiddenException(\n \"Cannot execute callback for another user\"\n );\n }\n\n // TODO: Implement proper authorization on backend level\n // - Check access to specific agent (not graph type)\n // - Verify user has permission to use the agent\n // - Check company/organization access\n // - Backend should handle all business logic authorization\n\n this.logger.log(\n `ACL validation simplified: userId match only for callback ${record.token}`\n );\n\n // 6. Additional security checks\n await this.performAdditionalSecurityChecks(user, record);\n\n const validationTime = Date.now() - validationStart;\n this.logger.debug(\n `ACL validation passed for user ${user.userId} on callback ${record.token} ` +\n `(${validationTime}ms)`\n );\n\n return {\n allowed: true,\n };\n } catch (error) {\n const validationTime = Date.now() - validationStart;\n this.logger.error(\n `ACL validation failed for callback ${record.token} (${validationTime}ms): ${error.message}`\n );\n throw error;\n }\n }\n\n /**\n * Validates if user has required scopes/permissions.\n */\n private validateScopes(\n user: CallbackUser,\n requiredScopes: string[]\n ): boolean {\n if (!user.permissions || user.permissions.length === 0) {\n return false;\n }\n\n // Check if user has all required scopes\n return requiredScopes.every(scope => {\n // Support wildcard permissions (e.g., \"finance:*\" matches \"finance:write\")\n const hasExactScope = user.permissions.includes(scope);\n const hasWildcardScope = user.permissions.some(p => {\n if (p.includes(\"*\")) {\n const pattern = p.replace(\"*\", \".*\");\n return new RegExp(`^${pattern}$`).test(scope);\n }\n return false;\n });\n\n return hasExactScope || hasWildcardScope;\n });\n }\n\n /**\n * Validates access to specific graph type.\n * Can be extended to check graph-specific permissions.\n */\n private async validateGraphTypeAccess(\n user: CallbackUser,\n graphType: string\n ): Promise<boolean> {\n // Extract namespace from graphType (e.g., \"finance::1.0.0\" -> \"finance\")\n const [namespace] = graphType.split(\"::\");\n\n // Check if user has access to this graph namespace\n const allowedNamespaces = this.getAllowedGraphNamespaces(user);\n\n this.logger.log(`Graph access check for user ${user.userId}`, {\n graphType,\n namespace,\n allowedNamespaces,\n userRoles: user.roles,\n userPermissions: user.permissions,\n userCompanyId: user.companyId,\n });\n\n // Special case: public graphs are accessible to all authenticated users\n if (namespace === \"public\") {\n return true;\n }\n\n // Check if user has explicit access to this namespace\n if (\n !allowedNamespaces.includes(namespace) &&\n !allowedNamespaces.includes(\"*\")\n ) {\n this.logger.warn(\n `Access denied: namespace \"${namespace}\" not in allowed namespaces: ${allowedNamespaces.join(\", \")}`\n );\n return false;\n }\n\n // Additional graph-specific checks can be added here\n // For example, checking if the graph belongs to user's company\n\n return true;\n }\n\n /**\n * Gets list of graph namespaces user has access to.\n */\n private getAllowedGraphNamespaces(user: CallbackUser): string[] {\n const namespaces: string[] = [];\n\n // Admin users have access to all graphs\n if (user.roles?.includes(\"admin\")) {\n namespaces.push(\"*\");\n }\n\n // Extract namespaces from user permissions\n // e.g., \"graph:finance:read\" -> \"finance\"\n user.permissions?.forEach(permission => {\n const match = permission.match(/^graph:([^:]+):/);\n if (match) {\n namespaces.push(match[1]);\n }\n });\n\n // Users always have access to their company's graphs\n if (user.companyId) {\n namespaces.push(user.companyId);\n }\n\n return [...new Set(namespaces)]; // Remove duplicates\n }\n\n /**\n * Validates company-level access restrictions.\n */\n private validateCompanyAccess(\n user: CallbackUser,\n requiredCompanyId: string\n ): boolean {\n // Users can only access callbacks for their own company\n return user.companyId === requiredCompanyId;\n }\n\n /**\n * Performs additional security checks.\n * Can be extended for custom security requirements.\n */\n private async performAdditionalSecurityChecks(\n user: CallbackUser,\n record: CallbackRecord\n ): Promise<void> {\n // Check if callback is expired (additional safety check)\n const now = Date.now();\n const age = now - record.createdAt;\n const maxAge = (record.metadata?.ttlSec || 600) * 1000;\n\n if (age > maxAge) {\n throw new ForbiddenException(\"Callback token has expired\");\n }\n\n // Check if callback has been retried too many times\n if (record.retries > 3) {\n throw new ForbiddenException(\n \"Callback has exceeded maximum retry attempts\"\n );\n }\n\n // Check for suspicious activity patterns\n // This could be extended to check rate limits, IP restrictions, etc.\n }\n\n /**\n * Checks if a callback can be retried by the user.\n */\n async canRetry(user: CallbackUser, record: CallbackRecord): Promise<boolean> {\n // Only the original user can retry their callbacks\n if (record.userId !== user.userId) {\n return false;\n }\n\n // Check if within retry limit\n if (record.retries >= 3) {\n return false;\n }\n\n // Check if callback is in retryable state\n if (![\"failed\", \"processing\"].includes(record.status)) {\n return false;\n }\n\n return true;\n }\n\n /**\n * Gets detailed permissions for a callback.\n * Useful for debugging and audit logs.\n */\n getPermissionDetails(\n user: CallbackUser,\n record: CallbackRecord\n ): Record<string, any> {\n return {\n userId: user.userId,\n callbackUserId: record.userId,\n userIdMatch: user.userId === record.userId,\n requiredScopes: record.metadata?.scopes || [],\n userScopes: user.permissions || [],\n userRoles: user.roles || [],\n graphType: record.graphType,\n companyId: user.companyId,\n callbackCompanyId: record.metadata?.companyId,\n companyMatch:\n !record.metadata?.companyId ||\n user.companyId === record.metadata.companyId,\n };\n }\n}\n","import { Injectable, Logger } from \"@nestjs/common\";\nimport { CallbackRecord, CallbackResult } from \"./callback.interface\";\nimport { CallbackUser } from \"./callback-acl.service\";\nimport { randomUUID } from \"crypto\";\n\nexport interface AuditEntry {\n id: string;\n correlationId: string;\n timestamp: number;\n action: CallbackAuditAction;\n userId?: string;\n callbackToken: string;\n graphType: string;\n handler: string;\n success: boolean;\n duration?: number;\n error?: string;\n metadata: Record<string, any>;\n ip?: string;\n userAgent?: string;\n}\n\nexport enum CallbackAuditAction {\n TOKEN_ISSUED = \"TOKEN_ISSUED\",\n TOKEN_VALIDATED = \"TOKEN_VALIDATED\",\n TOKEN_LOCKED = \"TOKEN_LOCKED\",\n EXECUTION_STARTED = \"EXECUTION_STARTED\",\n EXECUTION_COMPLETED = \"EXECUTION_COMPLETED\",\n EXECUTION_FAILED = \"EXECUTION_FAILED\",\n TOKEN_EXPIRED = \"TOKEN_EXPIRED\",\n ACCESS_DENIED = \"ACCESS_DENIED\",\n RATE_LIMITED = \"RATE_LIMITED\",\n RETRY_ATTEMPTED = \"RETRY_ATTEMPTED\",\n}\n\n/**\n * Auditor service for callback operations.\n * Logs all callback-related activities for compliance and debugging.\n */\n@Injectable()\nexport class CallbackAuditor {\n private readonly logger = new Logger(CallbackAuditor.name);\n private readonly auditStore: Map<string, AuditEntry> = new Map();\n\n /**\n * Log callback token issuance.\n */\n async logTokenIssued(\n token: string,\n graphType: string,\n handler: string,\n userId: string,\n metadata?: Record<string, any>\n ): Promise<string> {\n const correlationId = this.generateCorrelationId();\n const entry: AuditEntry = {\n id: randomUUID(),\n correlationId,\n timestamp: Date.now(),\n action: CallbackAuditAction.TOKEN_ISSUED,\n userId,\n callbackToken: token,\n graphType,\n handler,\n success: true,\n metadata: {\n ...metadata,\n ttl: metadata?.ttlSec,\n scopes: metadata?.scopes,\n },\n };\n\n await this.persist(entry);\n this.logger.log(\n `[${correlationId}] Token issued: ${token} for ${graphType}::${handler} by user ${userId}`\n );\n\n return correlationId;\n }\n\n /**\n * Log callback execution start.\n */\n async logExecutionStart(\n record: CallbackRecord,\n user: CallbackUser | undefined,\n correlationId?: string\n ): Promise<string> {\n const corrId = correlationId || this.generateCorrelationId();\n const entry: AuditEntry = {\n id: randomUUID(),\n correlationId: corrId,\n timestamp: Date.now(),\n action: CallbackAuditAction.EXECUTION_STARTED,\n userId: user?.userId,\n callbackToken: record.token,\n graphType: record.graphType,\n handler: record.handler,\n success: true,\n metadata: {\n originalUserId: record.userId,\n retries: record.retries,\n age: Date.now() - record.createdAt,\n },\n };\n\n await this.persist(entry);\n this.logger.log(\n `[${corrId}] Execution started: ${record.graphType}::${record.handler} by user ${user?.userId}`\n );\n\n return corrId;\n }\n\n /**\n * Log successful callback execution.\n */\n async logExecutionSuccess(\n record: CallbackRecord,\n user: CallbackUser | undefined,\n result: CallbackResult,\n duration: number,\n correlationId: string\n ): Promise<void> {\n const entry: AuditEntry = {\n id: randomUUID(),\n correlationId,\n timestamp: Date.now(),\n action: CallbackAuditAction.EXECUTION_COMPLETED,\n userId: user?.userId,\n callbackToken: record.token,\n graphType: record.graphType,\n handler: record.handler,\n success: true,\n duration,\n metadata: {\n hasAttachments: !!result.attachments?.length,\n hasPatch: !!result.patch,\n message: result.message,\n },\n };\n\n await this.persist(entry);\n this.logger.log(\n `[${correlationId}] Execution completed: ${record.graphType}::${record.handler} ` +\n `in ${duration}ms`\n );\n }\n\n /**\n * Log failed callback execution.\n */\n async logExecutionFailure(\n record: CallbackRecord,\n user: CallbackUser | undefined,\n error: Error,\n duration: number,\n correlationId: string\n ): Promise<void> {\n const entry: AuditEntry = {\n id: randomUUID(),\n correlationId,\n timestamp: Date.now(),\n action: CallbackAuditAction.EXECUTION_FAILED,\n userId: user?.userId,\n callbackToken: record.token,\n graphType: record.graphType,\n handler: record.handler,\n success: false,\n duration,\n error: error.message,\n metadata: {\n errorName: error.name,\n errorStack: error.stack,\n retries: record.retries,\n },\n };\n\n await this.persist(entry);\n this.logger.error(\n `[${correlationId}] Execution failed: ${record.graphType}::${record.handler} - ${error.message}`,\n error.stack\n );\n }\n\n /**\n * Log access denied event.\n */\n async logAccessDenied(\n token: string,\n userId?: string,\n reason?: string,\n metadata?: Record<string, any>\n ): Promise<void> {\n const correlationId = this.generateCorrelationId();\n const entry: AuditEntry = {\n id: randomUUID(),\n correlationId,\n timestamp: Date.now(),\n action: CallbackAuditAction.ACCESS_DENIED,\n userId,\n callbackToken: token,\n graphType: metadata?.graphType || \"unknown\",\n handler: metadata?.handler || \"unknown\",\n success: false,\n error: reason,\n metadata: metadata || {},\n };\n\n await this.persist(entry);\n this.logger.warn(\n `[${correlationId}] Access denied for token ${token}: ${reason}`\n );\n }\n\n /**\n * Log rate limit exceeded event.\n */\n async logRateLimited(\n identifier: string,\n retryAfter: number,\n metadata?: Record<string, any>\n ): Promise<void> {\n const correlationId = this.generateCorrelationId();\n const entry: AuditEntry = {\n id: randomUUID(),\n correlationId,\n timestamp: Date.now(),\n action: CallbackAuditAction.RATE_LIMITED,\n callbackToken: metadata?.token || \"unknown\",\n graphType: metadata?.graphType || \"unknown\",\n handler: metadata?.handler || \"unknown\",\n success: false,\n metadata: {\n identifier,\n retryAfter,\n ...metadata,\n },\n };\n\n await this.persist(entry);\n this.logger.warn(\n `[${correlationId}] Rate limited: ${identifier}, retry after ${retryAfter}s`\n );\n }\n\n /**\n * Log retry attempt.\n */\n async logRetryAttempt(\n record: CallbackRecord,\n user: CallbackUser | undefined,\n attemptNumber: number\n ): Promise<string> {\n const correlationId = this.generateCorrelationId();\n const entry: AuditEntry = {\n id: randomUUID(),\n correlationId,\n timestamp: Date.now(),\n action: CallbackAuditAction.RETRY_ATTEMPTED,\n userId: user?.userId,\n callbackToken: record.token,\n graphType: record.graphType,\n handler: record.handler,\n success: true,\n metadata: {\n attemptNumber,\n totalRetries: record.retries,\n lastError: record.lastError,\n },\n };\n\n await this.persist(entry);\n this.logger.log(\n `[${correlationId}] Retry attempt #${attemptNumber} for ${record.graphType}::${record.handler}`\n );\n\n return correlationId;\n }\n\n /**\n * Get audit trail for a specific token.\n */\n async getTokenAuditTrail(token: string): Promise<AuditEntry[]> {\n const entries: AuditEntry[] = [];\n for (const entry of this.auditStore.values()) {\n if (entry.callbackToken === token) {\n entries.push(entry);\n }\n }\n return entries.sort((a, b) => a.timestamp - b.timestamp);\n }\n\n /**\n * Get audit trail for a specific user.\n */\n async getUserAuditTrail(\n userId: string,\n startTime?: number,\n endTime?: number\n ): Promise<AuditEntry[]> {\n const entries: AuditEntry[] = [];\n const start = startTime || 0;\n const end = endTime || Date.now();\n\n for (const entry of this.auditStore.values()) {\n if (\n entry.userId === userId &&\n entry.timestamp >= start &&\n entry.timestamp <= end\n ) {\n entries.push(entry);\n }\n }\n return entries.sort((a, b) => a.timestamp - b.timestamp);\n }\n\n /**\n * Get audit statistics for reporting.\n */\n async getStatistics(\n startTime: number,\n endTime: number\n ): Promise<Record<string, any>> {\n const entries: AuditEntry[] = [];\n for (const entry of this.auditStore.values()) {\n if (entry.timestamp >= startTime && entry.timestamp <= endTime) {\n entries.push(entry);\n }\n }\n\n const stats = {\n totalCallbacks: entries.length,\n successfulExecutions: entries.filter(\n e => e.action === CallbackAuditAction.EXECUTION_COMPLETED\n ).length,\n failedExecutions: entries.filter(\n e => e.action === CallbackAuditAction.EXECUTION_FAILED\n ).length,\n accessDenied: entries.filter(\n e => e.action === CallbackAuditAction.ACCESS_DENIED\n ).length,\n rateLimited: entries.filter(\n e => e.action === CallbackAuditAction.RATE_LIMITED\n ).length,\n averageDuration: 0,\n byGraphType: {} as Record<string, number>,\n byHandler: {} as Record<string, number>,\n };\n\n // Calculate average duration\n const durations = entries.filter(e => e.duration).map(e => e.duration!);\n if (durations.length > 0) {\n stats.averageDuration =\n durations.reduce((a, b) => a + b, 0) / durations.length;\n }\n\n // Group by graph type and handler\n entries.forEach(entry => {\n stats.byGraphType[entry.graphType] =\n (stats.byGraphType[entry.graphType] || 0) + 1;\n const key = `${entry.graphType}::${entry.handler}`;\n stats.byHandler[key] = (stats.byHandler[key] || 0) + 1;\n });\n\n return stats;\n }\n\n /**\n * Persist audit entry.\n * In production, this should write to a persistent store (DB, S3, etc.)\n */\n private async persist(entry: AuditEntry): Promise<void> {\n // For now, store in memory. In production, write to database or audit log service\n this.auditStore.set(entry.id, entry);\n\n // Clean up old entries (keep last 10000)\n if (this.auditStore.size > 10000) {\n const entries = Array.from(this.auditStore.entries())\n .sort((a, b) => b[1].timestamp - a[1].timestamp)\n .slice(0, 10000);\n this.auditStore.clear();\n entries.forEach(([id, entry]) => this.auditStore.set(id, entry));\n }\n\n // In production, also send to external audit service\n // await this.sendToAuditService(entry);\n }\n\n /**\n * Generate correlation ID for tracking related events.\n */\n private generateCorrelationId(): string {\n return `cb_${Date.now()}_${randomUUID().slice(0, 8)}`;\n }\n\n /**\n * Export audit logs for compliance.\n */\n async exportAuditLogs(\n startTime: number,\n endTime: number,\n format: \"json\" | \"csv\" = \"json\"\n ): Promise<string> {\n const entries: AuditEntry[] = [];\n for (const entry of this.auditStore.values()) {\n if (entry.timestamp >= startTime && entry.timestamp <= endTime) {\n entries.push(entry);\n }\n }\n\n if (format === \"json\") {\n return JSON.stringify(entries, null, 2);\n } else {\n // CSV format\n const headers = [\n \"id\",\n \"correlationId\",\n \"timestamp\",\n \"action\",\n \"userId\",\n \"callbackToken\",\n \"graphType\",\n \"handler\",\n \"success\",\n \"duration\",\n \"error\",\n ];\n const rows = entries.map(e => [\n e.id,\n e.correlationId,\n new Date(e.timestamp).toISOString(),\n e.action,\n e.userId || \"\",\n e.callbackToken,\n e.graphType,\n e.handler,\n e.success.toString(),\n e.duration?.toString() || \"\",\n e.error || \"\",\n ]);\n return [headers, ...rows].map(row => row.join(\",\")).join(\"\\n\");\n }\n }\n}\n","import { Injectable } from \"@nestjs/common\";\nimport {\n Counter,\n Histogram,\n Gauge,\n Registry,\n collectDefaultMetrics,\n} from \"prom-client\";\n\n/**\n * Prometheus metrics for callback system monitoring.\n */\n@Injectable()\nexport class CallbackMetrics {\n private readonly registry: Registry;\n\n // Counters\n private readonly callbacksTotal: Counter;\n private readonly callbacksSuccess: Counter;\n private readonly callbacksFailed: Counter;\n private readonly callbacksRetried: Counter;\n private readonly accessDenied: Counter;\n private readonly rateLimited: Counter;\n private readonly tokensIssued: Counter;\n private readonly tokensExpired: Counter;\n\n // Histograms\n private readonly executionDuration: Histogram;\n private readonly aclValidationDuration: Histogram;\n private readonly tokenAge: Histogram;\n\n // Gauges\n private readonly activeCallbacks: Gauge;\n private readonly pendingCallbacks: Gauge;\n private readonly queueSize: Gauge;\n\n constructor(registry?: Registry) {\n this.registry = registry ?? new Registry();\n\n // Collect default Node.js metrics\n collectDefaultMetrics({ register: this.registry });\n\n // Initialize counters\n this.callbacksTotal = new Counter({\n name: \"graph_callbacks_total\",\n help: \"Total number of callback executions\",\n labelNames: [\"graph_type\", \"handler\", \"status\"],\n registers: [this.registry],\n });\n\n this.callbacksSuccess = new Counter({\n name: \"graph_callbacks_success_total\",\n help: \"Total number of successful callback executions\",\n labelNames: [\"graph_type\", \"handler\"],\n registers: [this.registry],\n });\n\n this.callbacksFailed = new Counter({\n name: \"graph_callbacks_failed_total\",\n help: \"Total number of failed callback executions\",\n labelNames: [\"graph_type\", \"handler\", \"error_type\"],\n registers: [this.registry],\n });\n\n this.callbacksRetried = new Counter({\n name: \"graph_callbacks_retried_total\",\n help: \"Total number of retried callbacks\",\n labelNames: [\"graph_type\", \"handler\"],\n registers: [this.registry],\n });\n\n this.accessDenied = new Counter({\n name: \"graph_callbacks_access_denied_total\",\n help: \"Total number of access denied events\",\n labelNames: [\"reason\"],\n registers: [this.registry],\n });\n\n this.rateLimited = new Counter({\n name: \"graph_callbacks_rate_limited_total\",\n help: \"Total number of rate limited requests\",\n labelNames: [\"identifier_type\"],\n registers: [this.registry],\n });\n\n this.tokensIssued = new Counter({\n name: \"graph_callback_tokens_issued_total\",\n help: \"Total number of callback tokens issued\",\n labelNames: [\"graph_type\", \"handler\"],\n registers: [this.registry],\n });\n\n this.tokensExpired = new Counter({\n name: \"graph_callback_tokens_expired_total\",\n help: \"Total number of expired callback tokens\",\n labelNames: [\"graph_type\"],\n registers: [this.registry],\n });\n\n // Initialize histograms\n this.executionDuration = new Histogram({\n name: \"graph_callback_execution_duration_seconds\",\n help: \"Duration of callback execution in seconds\",\n labelNames: [\"graph_type\", \"handler\", \"status\"],\n buckets: [0.01, 0.05, 0.1, 0.5, 1, 2, 5, 10],\n registers: [this.registry],\n });\n\n this.aclValidationDuration = new Histogram({\n name: \"graph_callback_acl_validation_duration_seconds\",\n help: \"Duration of ACL validation in seconds\",\n labelNames: [\"result\"],\n buckets: [0.001, 0.005, 0.01, 0.025, 0.05, 0.1],\n registers: [this.registry],\n });\n\n this.tokenAge = new Histogram({\n name: \"graph_callback_token_age_seconds\",\n help: \"Age of callback token when executed\",\n labelNames: [\"graph_type\"],\n buckets: [1, 5, 10, 30, 60, 120, 300, 600],\n registers: [this.registry],\n });\n\n // Initialize gauges\n this.activeCallbacks = new Gauge({\n name: \"graph_callbacks_active\",\n help: \"Number of currently executing callbacks\",\n labelNames: [\"graph_type\"],\n registers: [this.registry],\n });\n\n this.pendingCallbacks = new Gauge({\n name: \"graph_callbacks_pending\",\n help: \"Number of pending callbacks in queue\",\n labelNames: [\"graph_type\"],\n registers: [this.registry],\n });\n\n this.queueSize = new Gauge({\n name: \"graph_callback_queue_size\",\n help: \"Current size of callback queue\",\n registers: [this.registry],\n });\n }\n\n /**\n * Record callback execution start.\n */\n recordExecutionStart(graphType: string, handler?: string): void {\n const labels = { graph_type: graphType };\n this.activeCallbacks.inc(labels);\n this.pendingCallbacks.dec(labels);\n }\n\n /**\n * Record callback execution completion.\n */\n recordExecutionComplete(\n graphType: string,\n handler: string,\n duration: number,\n success: boolean,\n error?: string\n ): void {\n const status = success ? \"success\" : \"failure\";\n\n // Update counters\n this.callbacksTotal.inc({ graph_type: graphType, handler, status });\n\n if (success) {\n this.callbacksSuccess.inc({ graph_type: graphType, handler });\n } else {\n const errorType = this.classifyError(error);\n this.callbacksFailed.inc({\n graph_type: graphType,\n handler,\n error_type: errorType,\n });\n }\n\n // Record duration\n this.executionDuration.observe(\n { graph_type: graphType, handler, status },\n duration / 1000 // Convert to seconds\n );\n\n // Update active callbacks gauge\n this.activeCallbacks.dec({ graph_type: graphType });\n }\n\n /**\n * Record token issuance.\n */\n recordTokenIssued(graphType: string, handler: string): void {\n this.tokensIssued.inc({ graph_type: graphType, handler });\n this.pendingCallbacks.inc({ graph_type: graphType });\n }\n\n /**\n * Record token expiration.\n */\n recordTokenExpired(graphType: string): void {\n this.tokensExpired.inc({ graph_type: graphType });\n this.pendingCallbacks.dec({ graph_type: graphType });\n }\n\n /**\n * Record token age when executed.\n */\n recordTokenAge(graphType: string, ageMs: number): void {\n this.tokenAge.observe({ graph_type: graphType }, ageMs / 1000);\n }\n\n /**\n * Record ACL validation.\n */\n recordAclValidation(allowed: boolean, durationMs: number): void {\n const result = allowed ? \"allowed\" : \"denied\";\n this.aclValidationDuration.observe({ result }, durationMs / 1000);\n\n if (!allowed) {\n this.accessDenied.inc({ reason: \"acl_validation\" });\n }\n }\n\n /**\n * Record access denied event.\n */\n recordAccessDenied(reason: string): void {\n this.accessDenied.inc({ reason });\n }\n\n /**\n * Record rate limiting.\n */\n recordRateLimited(identifierType: \"user\" | \"ip\" | \"token\"): void {\n this.rateLimited.inc({ identifier_type: identifierType });\n }\n\n /**\n * Record retry attempt.\n */\n recordRetry(graphType: string, handler: string): void {\n this.callbacksRetried.inc({ graph_type: graphType, handler });\n }\n\n /**\n * Update queue size.\n */\n updateQueueSize(size: number): void {\n this.queueSize.set(size);\n }\n\n /**\n * Get metrics in Prometheus format.\n */\n async getMetrics(): Promise<string> {\n return this.registry.metrics();\n }\n\n /**\n * Get metrics content type.\n */\n getContentType(): string {\n return this.registry.contentType;\n }\n\n /**\n * Reset all metrics (useful for testing).\n */\n reset(): void {\n this.registry.resetMetrics();\n }\n\n /**\n * Classify error for metrics labeling.\n */\n private classifyError(error?: string): string {\n if (!error) return \"unknown\";\n\n const lowerError = error.toLowerCase();\n\n if (lowerError.includes(\"timeout\")) return \"timeout\";\n if (lowerError.includes(\"network\")) return \"network\";\n if (lowerError.includes(\"validation\")) return \"validation\";\n if (lowerError.includes(\"permission\") || lowerError.includes(\"forbidden\"))\n return \"permission\";\n if (lowerError.includes(\"not found\")) return \"not_found\";\n if (lowerError.includes(\"rate limit\")) return \"rate_limit\";\n if (lowerError.includes(\"retry\")) return \"retry_exhausted\";\n\n return \"application\";\n }\n\n /**\n * Get current metrics summary.\n */\n async getSummary(): Promise<Record<string, any>> {\n const metrics = await this.registry.getMetricsAsJSON();\n const summary: Record<string, any> = {};\n\n metrics.forEach((metric: any) => {\n if (metric.name === \"graph_callbacks_total\") {\n summary.totalCallbacks = metric.values.reduce(\n (sum: number, v: any) => sum + v.value,\n 0\n );\n }\n if (metric.name === \"graph_callbacks_success_total\") {\n summary.successfulCallbacks = metric.values.reduce(\n (sum: number, v: any) => sum + v.value,\n 0\n );\n }\n if (metric.name === \"graph_callbacks_failed_total\") {\n summary.failedCallbacks = metric.values.reduce(\n (sum: number, v: any) => sum + v.value,\n 0\n );\n }\n if (metric.name === \"graph_callbacks_active\") {\n summary.activeCallbacks = metric.values.reduce(\n (sum: number, v: any) => sum + v.value,\n 0\n );\n }\n });\n\n if (summary.totalCallbacks > 0) {\n summary.successRate =\n (summary.successfulCallbacks / summary.totalCallbacks) * 100;\n }\n\n return summary;\n }\n}\n","import { Injectable, Logger } from \"@nestjs/common\";\nimport type Redis from \"ioredis\";\n\nexport interface RateLimitConfig {\n windowMs: number; // Time window in milliseconds\n maxRequests: number; // Max requests per window\n keyPrefix?: string; // Redis key prefix\n skipFailedRequests?: boolean; // Don't count failed requests\n}\n\nexport interface RateLimitResult {\n allowed: boolean;\n limit: number;\n remaining: number;\n resetAt: number;\n retryAfter?: number;\n}\n\n/**\n * Rate limiter for callback execution using sliding window algorithm.\n * Prevents abuse and protects against brute force attacks.\n */\n@Injectable()\nexport class CallbackRateLimiter {\n private readonly logger = new Logger(CallbackRateLimiter.name);\n private readonly defaultConfig: RateLimitConfig = {\n windowMs: 60000, // 1 minute\n maxRequests: 10, // 10 requests per minute\n keyPrefix: \"ratelimit:callback\",\n skipFailedRequests: false,\n };\n\n constructor(private readonly redis: Redis) {}\n\n /**\n * Check if request is allowed based on rate limit.\n */\n async checkLimit(\n identifier: string,\n config?: Partial<RateLimitConfig>\n ): Promise<RateLimitResult> {\n const cfg = { ...this.defaultConfig, ...config };\n const key = `${cfg.keyPrefix}:${identifier}`;\n const now = Date.now();\n const windowStart = now - cfg.windowMs;\n\n // Use Lua script for atomic operation\n const script = `\n local key = KEYS[1]\n local now = tonumber(ARGV[1])\n local window_start = tonumber(ARGV[2])\n local max_requests = tonumber(ARGV[3])\n local window_ms = tonumber(ARGV[4])\n \n -- Remove old entries outside the window\n redis.call('ZREMRANGEBYSCORE', key, 0, window_start)\n \n -- Count requests in current window\n local current_requests = redis.call('ZCARD', key)\n \n if current_requests < max_requests then\n -- Add current request\n redis.call('ZADD', key, now, now)\n -- Set expiry\n redis.call('EXPIRE', key, math.ceil(window_ms / 1000))\n \n return {1, max_requests, max_requests - current_requests - 1, 0}\n else\n -- Get oldest request in window to calculate retry time\n local oldest = redis.call('ZRANGE', key, 0, 0, 'WITHSCORES')\n local reset_at = oldest[2] and (tonumber(oldest[2]) + window_ms) or (now + window_ms)\n \n return {0, max_requests, 0, reset_at}\n end\n `;\n\n const result = (await this.redis.eval(\n script,\n 1,\n key,\n now,\n windowStart,\n cfg.maxRequests,\n cfg.windowMs\n )) as [number, number, number, number];\n\n const [allowed, limit, remaining, resetAt] = result;\n\n const rateLimitResult: RateLimitResult = {\n allowed: allowed === 1,\n limit,\n remaining: Math.max(0, remaining),\n resetAt,\n };\n\n if (!rateLimitResult.allowed) {\n rateLimitResult.retryAfter = Math.ceil((resetAt - now) / 1000);\n this.logger.warn(\n `Rate limit exceeded for ${identifier}. Retry after ${rateLimitResult.retryAfter}s`\n );\n }\n\n return rateLimitResult;\n }\n\n /**\n * Check rate limit for user-specific operations.\n */\n async checkUserLimit(\n userId: string,\n config?: Partial<RateLimitConfig>\n ): Promise<RateLimitResult> {\n return this.checkLimit(`user:${userId}`, {\n windowMs: 60000, // 1 minute\n maxRequests: 20, // 20 requests per minute per user\n ...config,\n });\n }\n\n /**\n * Check rate limit for IP-based operations.\n */\n async checkIpLimit(\n ip: string,\n config?: Partial<RateLimitConfig>\n ): Promise<RateLimitResult> {\n return this.checkLimit(`ip:${ip}`, {\n windowMs: 60000, // 1 minute\n maxRequests: 30, // 30 requests per minute per IP\n ...config,\n });\n }\n\n /**\n * Check rate limit for token validation attempts (stricter).\n */\n async checkTokenLimit(\n identifier: string,\n config?: Partial<RateLimitConfig>\n ): Promise<RateLimitResult> {\n return this.checkLimit(`token:${identifier}`, {\n windowMs: 300000, // 5 minutes\n maxRequests: 5, // 5 attempts per 5 minutes\n ...config,\n });\n }\n\n /**\n * Reset rate limit for an identifier.\n * Useful for admin operations or testing.\n */\n async reset(identifier: string, keyPrefix?: string): Promise<void> {\n const prefix = keyPrefix || this.defaultConfig.keyPrefix;\n const key = `${prefix}:${identifier}`;\n await this.redis.del(key);\n this.logger.debug(`Rate limit reset for ${identifier}`);\n }\n\n /**\n * Get current rate limit status without incrementing counter.\n */\n async getStatus(\n identifier: string,\n config?: Partial<RateLimitConfig>\n ): Promise<RateLimitResult> {\n const cfg = { ...this.defaultConfig, ...config };\n const key = `${cfg.keyPrefix}:${identifier}`;\n const now = Date.now();\n const windowStart = now - cfg.windowMs;\n\n // Remove old entries and count current\n await this.redis.zremrangebyscore(key, 0, windowStart);\n const currentRequests = await this.redis.zcard(key);\n\n const remaining = Math.max(0, cfg.maxRequests - currentRequests);\n const allowed = currentRequests < cfg.maxRequests;\n\n let resetAt = now + cfg.windowMs;\n if (!allowed) {\n const oldest = await this.redis.zrange(key, 0, 0, \"WITHSCORES\");\n if (oldest.length >= 2) {\n resetAt = parseInt(oldest[1]) + cfg.windowMs;\n }\n }\n\n return {\n allowed,\n limit: cfg.maxRequests,\n remaining,\n resetAt,\n retryAfter: allowed ? undefined : Math.ceil((resetAt - now) / 1000),\n };\n }\n\n /**\n * Create rate limit headers for HTTP response.\n */\n createHeaders(result: RateLimitResult): Record<string, string> {\n const headers: Record<string, string> = {\n \"X-RateLimit-Limit\": result.limit.toString(),\n \"X-RateLimit-Remaining\": result.remaining.toString(),\n \"X-RateLimit-Reset\": new Date(result.resetAt).toISOString(),\n };\n\n if (result.retryAfter) {\n headers[\"Retry-After\"] = result.retryAfter.toString();\n }\n\n return headers;\n }\n}\n","import { Injectable, Logger } from \"@nestjs/common\";\nimport { CallbackRecord, CallbackPatch } from \"./callback.interface\";\nimport { TelegramPatchHandler } from \"./telegram-patch.handler\";\nimport { WebPatchHandler } from \"./web-patch.handler\";\n\nexport interface CallbackPatchHandler {\n apply(patch: CallbackPatch, context?: any): Promise<void>;\n}\n\n@Injectable()\nexport class CallbackPatchService {\n private readonly logger = new Logger(CallbackPatchService.name);\n constructor(\n private readonly telegram: TelegramPatchHandler,\n private readonly web: WebPatchHandler\n ) {}\n\n async apply(\n record: CallbackRecord,\n patch: CallbackPatch,\n context?: any\n ): Promise<void> {\n if (!patch) return;\n const platform = record.metadata?.platform;\n try {\n switch (platform) {\n case \"telegram\":\n await this.telegram.apply(patch, context);\n break;\n case \"web\":\n await this.web.apply(patch, context);\n break;\n default:\n this.logger.warn(`Unsupported patch platform: ${platform}`);\n }\n } catch (err) {\n this.logger.error(\n `Failed to apply patch for ${record.graphType}::${record.handler}`,\n err instanceof Error ? err.stack : undefined\n );\n }\n }\n}\n","import { Injectable, Logger } from \"@nestjs/common\";\nimport { CallbackPatch } from \"./callback.interface\";\nimport { CallbackPatchHandler } from \"./callback-patch.service\";\n\n@Injectable()\nexport class TelegramPatchHandler implements CallbackPatchHandler {\n private readonly logger = new Logger(TelegramPatchHandler.name);\n\n async apply(patch: CallbackPatch, context?: any): Promise<void> {\n this.logger.debug(\n `Applying Telegram patch ${JSON.stringify(patch)} with context ${JSON.stringify(\n context\n )}`\n );\n }\n}\n","import { Injectable, Logger } from \"@nestjs/common\";\nimport { CallbackPatch } from \"./callback.interface\";\nimport { CallbackPatchHandler } from \"./callback-patch.service\";\n\n@Injectable()\nexport class WebPatchHandler implements CallbackPatchHandler {\n private readonly logger = new Logger(WebPatchHandler.name);\n\n async apply(patch: CallbackPatch, context?: any): Promise<void> {\n this.logger.debug(\n `Applying Web patch ${JSON.stringify(patch)} with context ${JSON.stringify(\n context\n )}`\n );\n }\n}\n","export * from \"./callback-store\";\nexport * from \"./callback-registry\";\nexport * from \"./smart-callback.router\";\nexport * from \"./universal-callback.service\";\nexport * from \"./example.callback\";\nexport * from \"./callback-acl.service\";\nexport * from \"./callback-auditor.service\";\nexport * from \"./callback-metrics.service\";\nexport * from \"./callback-rate-limiter\";\nexport * from \"./idempotency-manager\";\nexport * from \"./callback-patch.service\";\nexport * from \"./telegram-patch.handler\";\nexport * from \"./web-patch.handler\";\nexport * from \"./callback.decorators\";\nexport * from \"./callback-token.guard\";\nexport * from \"./callback.controller\";\nexport * from \"./callback.interface\";\n","import {\n CanActivate,\n ExecutionContext,\n Injectable,\n UnauthorizedException,\n Logger,\n} from \"@nestjs/common\";\nimport { Request } from \"express\";\nimport { CallbackStore } from \"../callbacks\";\nimport { CallbackRecord } from \"./callback.interface\";\nimport { CallbackACL, CallbackUser } from \"../callbacks/callback-acl.service\";\n\nexport interface CallbackRequest extends Request {\n callbackRecord: CallbackRecord;\n user?: CallbackUser;\n}\n\n@Injectable()\nexport class CallbackTokenGuard implements CanActivate {\n private readonly logger = new Logger(CallbackTokenGuard.name);\n\n constructor(\n private readonly store: CallbackStore,\n private readonly acl: CallbackACL\n ) {}\n\n async canActivate(context: ExecutionContext): Promise<boolean> {\n const request = context.switchToHttp().getRequest<CallbackRequest>();\n const token = request.body?.token;\n if (!token) {\n throw new UnauthorizedException(\"Callback token missing\");\n }\n const record = await this.store.getAndLock(token);\n if (!record) {\n throw new UnauthorizedException(\"Invalid callback token\");\n }\n\n // Extract user from request (assumes JWT auth middleware has run)\n const user = this.extractUser(request);\n\n // Validate ACL permissions\n await this.acl.validate(user, record);\n\n request.callbackRecord = record;\n request.user = user;\n return true;\n }\n\n private extractUser(request: CallbackRequest): CallbackUser | undefined {\n this.logger.log(`Extracting user from request`, {\n hasRequestUser: !!request.user,\n hasPlatformContext: !!request.body?.platformContext,\n platformContextKeys: request.body?.platformContext\n ? Object.keys(request.body.platformContext)\n : [],\n });\n\n // Try to extract user from JWT middleware first (direct API calls)\n if (request.user) {\n this.logger.log(\n `Found user from JWT middleware: ${request.user[\"id\"] || request.user[\"sub\"]}`\n );\n return {\n userId: request.user[\"id\"] || request.user[\"sub\"],\n roles: request.user[\"roles\"],\n permissions: request.user[\"permissions\"],\n companyId: request.user[\"companyId\"],\n };\n }\n\n // For inter-service calls, extract user from platformContext\n const platformContext = request.body?.platformContext;\n if (\n platformContext &&\n platformContext.userId &&\n platformContext.authenticated\n ) {\n this.logger.log(\n `Found user from platformContext: ${platformContext.userId}`\n );\n return {\n userId: platformContext.userId,\n roles: platformContext.roles || [],\n permissions: platformContext.permissions || [],\n companyId: platformContext.companyId,\n };\n }\n\n this.logger.warn(`No user found in request or platformContext`);\n return undefined;\n }\n}\n","import { Controller, Post, Req, UseGuards } from \"@nestjs/common\";\nimport { ApiTags, ApiOperation, ApiResponse } from \"@nestjs/swagger\";\nimport { UniversalCallbackService } from \"../callbacks\";\nimport { CallbackTokenGuard, CallbackRequest } from \"./callback-token.guard\";\n\n@ApiTags(\"Callbacks\")\n@Controller()\nexport class CallbackController {\n constructor(private readonly callbackService: UniversalCallbackService) {}\n\n @Post(\"callback\")\n @UseGuards(CallbackTokenGuard)\n @ApiOperation({ summary: \"Process callback by token\" })\n @ApiResponse({ status: 200, description: \"Callback executed\" })\n async handleCallback(@Req() req: CallbackRequest) {\n return this.callbackService.handle(req.callbackRecord, req.user);\n }\n}\n","// packages/sdk/src/abstract-graph.builder.ts\nimport { Inject, Injectable, Type, Logger, Optional } from \"@nestjs/common\";\nimport { ConfigService } from \"@nestjs/config\";\nimport * as path from \"path\";\n// Remove dependency on legacy BaseGraphService\nimport { IGraphRequestPayload, IGraphResponsePayload, IGraphService } from \".\";\nimport {\n CallbackResult,\n CallbackHandler,\n CallbackRegistry,\n} from \"../callbacks\";\nimport { EndpointRegistry } from \"../agent-ui\";\n\n/**\n * Interface for graph manifest\n */\nexport interface IGraphManifest {\n // === BASIC INFORMATION ===\n companySlug: string;\n name: string;\n title: string;\n description: string;\n detailedDescription: string;\n\n // === METADATA ===\n category?: string;\n author?: string;\n maintainer?: string;\n repository?: string;\n tags?: string[];\n\n // === UI CONFIGURATION (graph level) ===\n ui?: {\n enabled: boolean;\n title: string;\n description?: string;\n defaultScreen: string;\n menu: string[];\n screens: Record<string, any>;\n theme?: Record<string, any>;\n permissions?: Record<string, any>;\n };\n\n // === VERSIONING ===\n versioning: {\n strategy: \"semver\";\n defaultVersion: string;\n supportedVersions: string[];\n };\n\n // === VERSIONS ===\n versions: Record<\n string,\n {\n status: string;\n releaseDate: string;\n isActive: boolean;\n visibility: \"public\" | \"private\";\n configSchemaPath?: string;\n }\n >;\n}\n\n/**\n * Base abstraction for versioned graphs\n * All graphs should specify only version (e.g. \"1.0.0\")\n * Full graphType is auto-generated from baseGraphType + version\n */\nexport abstract class AbstractGraphBuilder<V extends string = string> {\n /**\n * Graph version in semver format (e.g. \"1.0.0\", \"2.1.3\")\n */\n abstract readonly version: V;\n\n protected logger = new Logger(AbstractGraphBuilder.name);\n\n @Inject(CallbackRegistry)\n protected callbackRegistry: CallbackRegistry;\n\n @Inject(EndpointRegistry)\n protected endpointRegistry: EndpointRegistry;\n\n /**\n * Returns full graph type (companySlug.name::version)\n * Auto-generated from manifest's companySlug.name and version\n */\n get graphType(): string {\n // Generate from companySlug.name + version\n if (this.manifest?.companySlug && this.manifest?.name) {\n return `${this.manifest.companySlug}.${this.manifest.name}::${this.version}`;\n }\n\n // Fallback - will be determined when manifest is loaded\n return `unknown::${this.version}`;\n }\n\n /**\n * Path to root graph manifest (defaults to graph.manifest.json in root)\n */\n protected manifestPath: string = path.join(\n process.cwd(),\n \"graph.manifest.json\"\n );\n\n /**\n * Loaded graph manifest\n */\n protected manifest?: IGraphManifest;\n\n constructor() {\n // Load manifest synchronously to get correct graphType\n try {\n this.loadManifestSync();\n if (this.manifest) {\n this.logger.debug(\n `Loaded manifest for ${this.manifest.companySlug}.${this.manifest.name} (${this.constructor.name})`\n );\n }\n } catch (error) {\n this.logger.warn(\n `Failed to load manifest in constructor: ${error.message}`\n );\n }\n\n // Register callbacks and endpoints after the derived class is fully constructed\n setImmediate(() => {\n this.logger.debug(\n `Starting callback and endpoint registration for ${this.constructor.name}`\n );\n\n this.registerCallbacks().catch(error => {\n this.logger.error(\n `Failed to register callbacks in constructor: ${error.message}`\n );\n });\n\n this.registerEndpoints().catch(error => {\n this.logger.error(\n `Failed to register endpoints in constructor: ${error.message}`\n );\n });\n });\n }\n\n /**\n * Build graph\n */\n abstract buildGraph(config: any): Promise<any>;\n\n /**\n * Creates execution context for graph with tracer and usageRecorder\n * This method can be overridden in child classes for customization\n */\n protected createGraphContext(payload: IGraphRequestPayload): {\n messageId?: string;\n threadId: string;\n userId: string;\n agentId: string;\n companyId?: string;\n } {\n return {\n messageId: (payload as any).messageId,\n threadId: payload.threadId,\n userId: payload.userId,\n agentId: payload.agentId,\n companyId: (payload as any).companyId,\n };\n }\n\n /**\n * Basic configuration preparation for graph execution\n * Automatically creates context with tracer and usageRecorder\n * Can be overridden in child classes to add specific logic\n */\n async prepareConfig(payload: IGraphRequestPayload): Promise<any> {\n const context = this.createGraphContext(payload);\n\n return {\n configurable: {\n thread_id: payload.threadId,\n context,\n // Add metadata for compatibility\n metadata: {\n userId: payload.userId,\n agentId: payload.agentId,\n requestId: payload.requestId,\n graphType: this.graphType,\n version: this.version,\n },\n },\n };\n }\n\n /**\n * Load graph manifest (if using manifest-based approach)\n */\n protected async loadManifest(): Promise<IGraphManifest | null> {\n if (!this.manifestPath) {\n return null;\n }\n\n try {\n const fs = await import(\"fs/promises\");\n const path = await import(\"path\");\n\n const manifestFullPath = path.resolve(this.manifestPath);\n const manifestContent = await fs.readFile(manifestFullPath, \"utf-8\");\n const manifest = JSON.parse(manifestContent) as IGraphManifest;\n\n // Manifest validation disabled - new structure is used\n // this.validateManifest(manifest);\n\n this.manifest = manifest;\n return manifest;\n } catch (error) {\n console.error(\n `Failed to load manifest from ${this.manifestPath}: ${error instanceof Error ? error.message : String(error)}`\n );\n return null;\n }\n }\n\n /**\n * Synchronous manifest loading for use in constructor\n */\n protected loadManifestSync(): IGraphManifest | null {\n if (!this.manifestPath) {\n return null;\n }\n\n try {\n const fs = require(\"fs\");\n const path = require(\"path\");\n\n const manifestFullPath = path.resolve(this.manifestPath);\n const manifestContent = fs.readFileSync(manifestFullPath, \"utf-8\");\n const manifest = JSON.parse(manifestContent) as IGraphManifest;\n\n // Manifest validation disabled - new structure is used\n // this.validateManifest(manifest);\n\n this.manifest = manifest;\n return manifest;\n } catch (error) {\n console.error(\n `Failed to load manifest from ${this.manifestPath}: ${error instanceof Error ? error.message : String(error)}`\n );\n return null;\n }\n }\n\n /**\n * Validate graph manifest\n */\n protected validateManifest(manifest: IGraphManifest): void {\n // Validation temporarily disabled for new manifest structure\n // TODO: Create new validator for structure with baseType and versions\n // GraphManifestValidator.validateOrThrow(manifest);\n }\n\n /**\n * Get graph metadata (from manifest or decorator)\n */\n async getGraphMetadata(): Promise<IGraphManifest | null> {\n if (this.manifest) {\n return this.manifest;\n }\n\n return await this.loadManifest();\n }\n\n /**\n * Get specific version configuration of the graph\n */\n async getVersionConfig() {\n const manifest = await this.loadManifest();\n if (!manifest) {\n throw new Error(`Manifest not found at ${this.manifestPath}`);\n }\n\n const versionConfig = manifest.versions[this.version];\n if (!versionConfig) {\n throw new Error(`Version ${this.version} not found in manifest`);\n }\n\n // Load config schema if path is specified\n let configSchema = null;\n if (versionConfig.configSchemaPath) {\n try {\n const fs = await import(\"fs/promises\");\n const schemaPath = path.resolve(\n process.cwd(),\n versionConfig.configSchemaPath\n );\n const schemaContent = await fs.readFile(schemaPath, \"utf-8\");\n const schemaData = JSON.parse(schemaContent);\n configSchema = schemaData.schema;\n } catch (error) {\n this.logger.warn(`Failed to load config schema: ${error.message}`);\n }\n }\n\n return {\n // Basic graph information\n companySlug: manifest.companySlug,\n name: manifest.name,\n title: manifest.title,\n description: manifest.description,\n detailedDescription: manifest.detailedDescription,\n category: manifest.category,\n tags: manifest.tags,\n\n // UI configuration\n ui: manifest.ui,\n\n // Version information\n ...versionConfig,\n\n // Config schema (if exists)\n configSchema,\n\n // Full graphType for compatibility\n graphType: this.graphType,\n version: this.version,\n };\n }\n\n /**\n * Get full graph type\n * REQUIRES baseGraphType - no more legacy support!\n */\n getFullGraphType(baseGraphType: string): string {\n if (!baseGraphType) {\n throw new Error(\"baseGraphType is required for versioned graphs\");\n }\n\n return `${baseGraphType}::${this.version}`;\n }\n\n /**\n * Version validation\n */\n validateVersion(): boolean {\n const versionRegex = /^\\d+\\.\\d+\\.\\d+$/;\n if (!versionRegex.test(this.version)) {\n throw new Error(\n `Invalid version format: ${this.version}. Expected format: X.Y.Z`\n );\n }\n return true;\n }\n\n /**\n * Register callbacks from @Callback decorators\n * This is called automatically after the builder is constructed\n */\n protected async registerCallbacks(): Promise<void> {\n this.logger.log(`CallbackRegistry instance: ${!!this.callbackRegistry}`);\n\n if (!this.callbackRegistry) {\n this.logger.error(\n \"CallbackRegistry not injected! This should not happen.\"\n );\n return;\n }\n\n try {\n // Dynamically import decorator utilities to avoid circular dependencies\n const { getCallbackMetadata } = await import(\n \"../callbacks/callback.decorators.js\"\n );\n\n // Get callback metadata from the current class\n const callbackMetadata = getCallbackMetadata(this.constructor);\n\n this.logger.log(\n `Found ${callbackMetadata?.length || 0} callbacks for ${this.constructor.name}`\n );\n this.logger.log(\n `Callback metadata:`,\n JSON.stringify(callbackMetadata, null, 2)\n );\n\n if (!callbackMetadata || callbackMetadata.length === 0) {\n this.logger.warn(\n `No callbacks found for ${this.constructor.name}. Check @WithCallbacks decorator.`\n );\n return;\n }\n\n // Get the full graph type for versioned registration\n const fullGraphType = this.graphType; // This should return the full type like \"company.financial-ledger::1.0.0\"\n\n // Register each callback with version\n for (const { handler, method } of callbackMetadata) {\n const callbackMethod = (this as any)[method];\n if (typeof callbackMethod === \"function\") {\n // Create a wrapper that binds the method to this instance\n const boundCallback: CallbackHandler = async context => {\n return callbackMethod.call(this, context);\n };\n\n // Register with version-specific key\n this.callbackRegistry.register(handler, boundCallback, fullGraphType);\n\n this.logger.log(\n `Registered callback \"${handler}\" for graph type \"${fullGraphType}\"`\n );\n }\n }\n\n this.logger.log(\n `Registered ${callbackMetadata.length} callbacks for ${this.constructor.name}`\n );\n } catch (error) {\n this.logger.error(\n `Failed to register callbacks: ${error instanceof Error ? error.message : String(error)}`\n );\n }\n }\n\n /**\n * Register endpoints from @Endpoint decorators\n * This is called automatically after the builder is constructed\n */\n protected async registerEndpoints(): Promise<void> {\n this.logger.log(`EndpointRegistry instance: ${!!this.endpointRegistry}`);\n\n if (!this.endpointRegistry) {\n this.logger.error(\n \"EndpointRegistry not injected! This should not happen.\"\n );\n return;\n }\n\n try {\n // Dynamically import decorator utilities to avoid circular dependencies\n const { getEndpointMetadata, createEndpointDescriptors } = await import(\n \"../agent-ui\"\n );\n\n // Get endpoint metadata from the current class\n const endpointMetadata = getEndpointMetadata(this.constructor);\n\n if (!endpointMetadata || endpointMetadata.length === 0) {\n // Only log if we expected endpoints (avoid confusing logs for callback-only builders)\n return;\n }\n\n this.logger.log(\n `Found ${endpointMetadata.length} endpoints for ${this.constructor.name}`\n );\n this.logger.debug(\n `Endpoint metadata:`,\n JSON.stringify(endpointMetadata, null, 2)\n );\n\n // Get the full graph type for versioned registration\n const fullGraphType = this.graphType; // This should return the full type like \"ledger::1.0.0\"\n\n // Create endpoint descriptors and register them\n const endpointDescriptors = createEndpointDescriptors(\n this,\n endpointMetadata\n );\n\n for (const descriptor of endpointDescriptors) {\n this.endpointRegistry.register(fullGraphType, descriptor);\n\n this.logger.log(\n `Registered endpoint \"${descriptor.name}\" for graph type \"${fullGraphType}\"`\n );\n }\n\n this.logger.log(\n `Registered ${endpointDescriptors.length} endpoints for ${this.constructor.name}`\n );\n } catch (error) {\n this.logger.error(\n `Failed to register endpoints: ${error instanceof Error ? error.message : String(error)}`\n );\n }\n }\n\n /**\n * Helper method to manually register endpoints (for classes that don't use decorators)\n * @param endpoints Endpoint descriptors to register\n */\n protected registerEndpointsManually(\n endpoints: import(\"../agent-ui\").EndpointDescriptor[]\n ): void {\n if (!this.endpointRegistry) {\n this.logger.error(\"EndpointRegistry not available\");\n return;\n }\n\n const fullGraphType = this.graphType;\n for (const endpoint of endpoints) {\n this.endpointRegistry.register(fullGraphType, endpoint);\n this.logger.log(\n `Manually registered endpoint \"${endpoint.name}\" for graph type \"${fullGraphType}\"`\n );\n }\n }\n}\n\n/**\n * Interface for graph engine\n */\nexport interface IGraphEngine {\n invokeGraph(graph: any, config: any, signal?: AbortSignal): Promise<any>;\n streamGraph(\n graph: any,\n config: any,\n onPartial: (chunk: string) => void,\n signal?: AbortSignal\n ): Promise<any>;\n}\n\n/**\n * Universal graph service that delegates execution to builder and engine\n */\n@Injectable()\nexport class UniversalGraphService implements IGraphService {\n readonly logger = new Logger(UniversalGraphService.name);\n\n constructor(\n protected readonly configService: ConfigService,\n @Inject(\"GRAPH_BUILDERS\")\n private readonly builders: AbstractGraphBuilder<string>[],\n @Inject(\"GRAPH_ENGINE\")\n private readonly engine: IGraphEngine,\n @Inject(EndpointRegistry)\n private readonly endpointRegistry: EndpointRegistry\n ) {\n this.logger.log(\"UniversalGraphService initialized\");\n if (!this.engine) {\n this.logger.error(\"GRAPH_ENGINE is not properly injected!\");\n }\n }\n\n /**\n * Returns graph types supported by the service\n */\n async getSupportedGraphTypes(): Promise<string[]> {\n // console.log('Registered builders:', this.builders);\n return this.builders.map(builder => {\n // console.log(`Builder: ${builder.constructor.name}, graphType:`, builder.graphType);\n return builder.graphType;\n });\n }\n\n /**\n * Generate answer without streaming\n */\n async generateAnswer(\n payload: IGraphRequestPayload\n ): Promise<IGraphResponsePayload> {\n const builder = this.getBuilderForType(payload.graphType);\n\n // Build graph\n const graph = await builder.buildGraph(payload);\n\n // Prepare execution configuration\n const config = await builder.prepareConfig(payload);\n\n // Track generation cancellation\n const abortController = new AbortController();\n this.registerActiveGeneration(payload.requestId, () => {\n abortController.abort();\n });\n\n try {\n // Execute graph through engine\n const result = await this.engine.invokeGraph(\n graph,\n config,\n abortController.signal\n );\n\n // Form response\n return {\n requestId: payload.requestId,\n text: result.text || \"\",\n attachments: result.attachments || [],\n metadata: result.metadata || {},\n reasoningChains: result.reasoningChains || [], // Add reasoning chains\n };\n } finally {\n this.unregisterActiveGeneration(payload.requestId);\n }\n }\n\n /**\n * Stream answer generation\n */\n async streamAnswer(payload, onPartial) {\n this.logger.debug(\n `>>> Entering streamAnswer with requestId: ${payload.requestId}`\n );\n const abortController = new AbortController();\n\n try {\n // Existing code remains here\n const builder = this.getBuilderForType(payload.graphType);\n this.logger.debug(`Got builder for graph type: ${payload.graphType}`);\n\n // Build graph\n const graph = await builder.buildGraph(payload);\n this.logger.debug(`Graph built for requestId: ${payload.requestId}`);\n\n // Prepare execution configuration\n this.logger.debug(`Preparing config for requestId: ${payload.requestId}`);\n const config = await builder.prepareConfig(payload);\n this.logger.debug(`Config prepared`);\n\n // Track generation cancellation\n this.registerActiveGeneration(payload.requestId, () => {\n abortController.abort();\n });\n this.logger.debug(`Active generation registered: ${payload.requestId}`);\n\n this.logger.debug(\n `Calling engine.streamGraph for requestId: ${payload.requestId}`\n );\n const result = await this.engine.streamGraph(\n graph,\n config,\n onPartial,\n abortController.signal\n );\n\n this.logger.debug(`[STREAM-RESULT] Engine returned:`, {\n hasText: !!result.text,\n textLength: result.text?.length || 0,\n attachmentsCount: result.attachments?.length || 0,\n reasoningChainsCount: result.reasoningChains?.length || 0,\n resultKeys: Object.keys(result || {}),\n });\n\n // Form response\n return {\n requestId: payload.requestId,\n text: result.text || \"\",\n attachments: result.attachments || [],\n metadata: result.metadata || {},\n reasoningChains: result.reasoningChains || [], // Add reasoning chains\n };\n } catch (error) {\n this.logger.error(`Error in streamAnswer: ${error.message}`);\n this.logger.error(`Stack trace: ${error.stack}`);\n throw error; // Rethrow error\n } finally {\n abortController.abort();\n this.unregisterActiveGeneration(payload.requestId);\n }\n }\n\n /**\n * Service health check\n */\n async healthCheck(): Promise<boolean> {\n try {\n // Check that there are registered builders\n if (this.builders.length === 0) {\n this.logger.warn(\"No builders registered\");\n return false;\n }\n\n return true;\n } catch (error) {\n this.logger.error(`Health check failed: ${error.message}`);\n return false;\n }\n }\n\n /**\n * Cancel generation\n */\n async cancelGeneration(requestId: string): Promise<void> {\n const generation = this.activeGenerations.get(requestId);\n\n if (generation) {\n generation.cancel();\n this.activeGenerations.delete(requestId);\n this.logger.log(`Cancelled generation for request: ${requestId}`);\n } else {\n this.logger.warn(`No active generation found for request: ${requestId}`);\n }\n }\n\n // Active generations that can be cancelled\n private readonly activeGenerations = new Map<\n string,\n { cancel: () => void }\n >();\n\n /**\n * Register active generation\n */\n private registerActiveGeneration(\n requestId: string,\n cancel: () => void\n ): void {\n this.activeGenerations.set(requestId, { cancel });\n\n // Automatic cleanup after 10 minutes\n setTimeout(\n () => {\n if (this.activeGenerations.has(requestId)) {\n this.activeGenerations.delete(requestId);\n this.logger.debug(\n `Auto-cleaned generation for request: ${requestId}`\n );\n }\n },\n 10 * 60 * 1000\n );\n }\n\n /**\n * Remove active generation\n */\n private unregisterActiveGeneration(requestId: string): void {\n this.activeGenerations.delete(requestId);\n }\n\n /**\n * Execute callback through decorators\n */\n async executeCallback(\n token: string,\n platform?: string,\n platformContext?: any\n ): Promise<CallbackResult> {\n this.logger.debug(`Executing callback with token: ${token}`);\n\n try {\n // Try to find callback among builders through decorators\n const result = await this.executeCallbackFromDecorators(\n token,\n platform,\n platformContext\n );\n\n if (result) {\n return result;\n }\n\n // If not found through decorators, try old system (SmartCallbackRouter)\n // TODO: integrate with existing callback system if backward compatibility is needed\n\n return {\n success: false,\n error: \"Callback handler not found\",\n };\n } catch (error) {\n this.logger.error(\n `Error executing callback: ${error instanceof Error ? error.message : String(error)}`\n );\n return {\n success: false,\n error: error instanceof Error ? error.message : \"Unknown error\",\n };\n }\n }\n\n /**\n * Execute callback through decorator system\n */\n private async executeCallbackFromDecorators(\n token: string,\n platform?: string,\n platformContext?: any\n ): Promise<CallbackResult | null> {\n // Import functions for working with decorators\n const { getCallbackMetadata, findCallbackMethod } = await import(\n \"../callbacks/callback.decorators.js\"\n );\n\n // Parse token to extract graph type and handler\n const { graphType, handler } = this.parseCallbackToken(token);\n\n // Find builder for this graph type\n const builder = this.builders.find(b => b.graphType === graphType);\n if (!builder) {\n this.logger.warn(`No builder found for graph type: ${graphType}`);\n return null;\n }\n\n // Find callback method in builder\n const methodName = findCallbackMethod(builder.constructor, handler);\n if (!methodName || typeof (builder as any)[methodName] !== \"function\") {\n this.logger.warn(\n `No callback method found for handler: ${handler} in ${graphType}`\n );\n return null;\n }\n\n // Create callback context\n const context = {\n userId: platformContext?.userId || \"unknown\",\n threadId: platformContext?.threadId,\n agentId: platformContext?.agentId,\n params: this.parseCallbackParams(token),\n platform,\n metadata: {\n token,\n platformContext,\n graphType,\n handler,\n },\n };\n\n // Call callback method\n this.logger.debug(`Executing callback ${handler} on builder ${graphType}`);\n const result = await (builder as any)[methodName](context);\n\n return result;\n }\n\n /**\n * Parse callback token to extract information\n * Expected format: cb_{graphName}_{handler}_{encodedParams}\n */\n private parseCallbackToken(token: string): {\n graphType: string;\n handler: string;\n } {\n const parts = token.split(\"_\");\n\n if (parts.length < 4 || parts[0] !== \"cb\") {\n throw new Error(`Invalid callback token format: ${token}`);\n }\n\n const graphName = parts[1];\n const handler = parts[2];\n\n // TODO: Add default version or extract from token\n const graphType = `${graphName}::1.0.0`;\n\n return { graphType, handler };\n }\n\n /**\n * Extract parameters from callback token\n */\n private parseCallbackParams(token: string): Record<string, any> {\n const parts = token.split(\"_\");\n\n if (parts.length < 4) {\n return {};\n }\n\n try {\n // Last part of token contains encoded parameters\n const encodedParams = parts.slice(3).join(\"_\");\n const decodedParams = Buffer.from(encodedParams, \"base64url\").toString(\n \"utf8\"\n );\n return JSON.parse(decodedParams);\n } catch (error) {\n this.logger.warn(\n `Failed to parse callback params from token: ${token}`,\n error\n );\n return {};\n }\n }\n\n /**\n * Call a graph endpoint\n * @param graphType Graph type\n * @param endpointName Endpoint name\n * @param context Request context\n * @returns Response envelope\n */\n async callEndpoint(\n graphType: string,\n endpointName: string,\n context: import(\"../agent-ui\").RequestContext\n ): Promise<import(\"../agent-ui\").DataEnvelope> {\n this.logger.debug(\n `Calling endpoint \"${endpointName}\" for graph \"${graphType}\"`\n );\n\n return await this.endpointRegistry.call(graphType, endpointName, context);\n }\n\n /**\n * List all endpoints for a graph type\n * @param graphType Graph type\n * @returns Array of endpoint names\n */\n listEndpoints(graphType: string): string[] {\n return this.endpointRegistry.list(graphType);\n }\n\n /**\n * List all graph types that have endpoints\n * @returns Array of graph types\n */\n listGraphTypesWithEndpoints(): string[] {\n return this.endpointRegistry.listGraphTypes();\n }\n\n /**\n * Get builder for specified graph type\n */\n private getBuilderForType(graphType: string): AbstractGraphBuilder<string> {\n const builder = this.builders.find(b => b.graphType === graphType);\n\n if (!builder) {\n throw new Error(`No builder found for graph type: ${graphType}`);\n }\n\n return builder;\n }\n}\n","import { NestFactory } from \"@nestjs/core\";\nimport { Logger, ValidationPipe } from \"@nestjs/common\";\nimport { SwaggerModule, DocumentBuilder } from \"@nestjs/swagger\";\nimport * as net from \"net\";\nimport * as fs from \"fs\";\nimport * as path from \"path\";\n\n/**\n * Setup Redis mock for development environment\n * Intercepts ioredis requires and redirects to ioredis-mock\n */\nfunction setupRedisMock() {\n if (\n process.env.NODE_ENV === \"development\" &&\n !process.env.KUBERNETES_SERVICE_HOST\n ) {\n console.log(\"[REDIS_MOCK] Intercepting ioredis requires for development\");\n const Module = require(\"module\");\n const originalRequire = Module.prototype.require;\n\n Module.prototype.require = function (...args: any[]) {\n if (args[0] === \"ioredis\") {\n console.log(\"[REDIS_MOCK] Redirecting ioredis to ioredis-mock\");\n return originalRequire.apply(this, [\"ioredis-mock\"]);\n }\n return originalRequire.apply(this, args);\n };\n }\n}\n\n/**\n * Check port availability\n */\nasync function isPortAvailable(port: number): Promise<boolean> {\n return new Promise(resolve => {\n const server = net.createServer();\n server.listen(port, () => {\n server.close(() => resolve(true));\n });\n server.on(\"error\", () => resolve(false));\n });\n}\n\n/**\n * Find available port starting from the given one\n */\nasync function findAvailablePort(startPort: number): Promise<number> {\n let port = startPort;\n while (port < startPort + 100) {\n // Check up to 100 ports\n if (await isPortAvailable(port)) {\n return port;\n }\n port++;\n }\n throw new Error(\n `No available ports found in range ${startPort}-${startPort + 99}`\n );\n}\n\n/**\n * Automatic service discovery registration\n * NOTE: This feature requires @amelie/graph-service-registry package\n * which is an optional dependency. Commented out for standalone SDK usage.\n * Uncomment and install @amelie/graph-service-registry if needed.\n */\nasync function registerWithServiceDiscovery(\n AppModule: any,\n port: number,\n logger: Logger,\n app?: any\n): Promise<void> {\n try {\n logger.debug(\n \"[SERVICE_DISCOVERY] Starting service discovery registration...\"\n );\n\n // Import FileBasedDiscovery from SDK\n const { FileBasedDiscovery } = await import(\n \"../service-discovery/file-based.discovery\"\n );\n\n logger.debug(\n \"[SERVICE_DISCOVERY] FileBasedDiscovery imported successfully\"\n );\n const discovery = new FileBasedDiscovery();\n logger.debug(\"[SERVICE_DISCOVERY] FileBasedDiscovery instance created\");\n\n // Derive service name from module name\n const serviceName = AppModule.name.replace(\"Module\", \"\").toLowerCase();\n\n // Extract supported graph types from registered builders\n let graphTypes: string[] = [];\n try {\n if (app) {\n // Get BuilderRegistry from application\n const { BuilderRegistryService } = await import(\n \"./builder-registry.service\"\n );\n const builderRegistry = app.get(BuilderRegistryService, {\n strict: false,\n });\n logger.debug(\n `BuilderRegistryService found in DI: ${!!builderRegistry}`\n );\n\n if (builderRegistry) {\n const builders = builderRegistry.getBuilders();\n logger.debug(`Found ${builders.length} builders in registry`);\n const baseGraphTypes = builders.map(builder => builder.graphType);\n logger.debug(`Base graph types: [${baseGraphTypes.join(\", \")}]`);\n\n // Try to get versioned types from VersionedGraphService\n try {\n logger.debug(\"Attempting to import VersionedGraphService...\");\n const { VersionedGraphService } = await import(\n \"../graph/versioning/versioned-graph.service\"\n );\n logger.debug(\"VersionedGraphService imported successfully\");\n\n const versionedService = app.get(VersionedGraphService, {\n strict: false,\n });\n logger.debug(\n `VersionedGraphService found in DI: ${!!versionedService}`\n );\n\n if (versionedService) {\n // Collect all versions for each base type\n const allVersionedTypes: string[] = [];\n for (const baseType of baseGraphTypes) {\n logger.debug(`Getting versions for base type: ${baseType}`);\n const versions =\n versionedService.getAvailableVersions(baseType);\n logger.debug(\n `Found ${versions.length} versions for ${baseType}: [${versions.join(\", \")}]`\n );\n\n if (versions.length > 0) {\n // Add base type and all its versions\n allVersionedTypes.push(baseType);\n versions.forEach(version => {\n allVersionedTypes.push(`${baseType}::${version}`);\n });\n } else {\n // If no versions, add only base type\n allVersionedTypes.push(baseType);\n }\n }\n graphTypes = allVersionedTypes;\n logger.debug(\n `Found ${baseGraphTypes.length} base types with ${graphTypes.length} total versioned types: ${graphTypes.join(\", \")}`\n );\n } else {\n // Fallback to base types if VersionedGraphService is not available\n graphTypes = baseGraphTypes;\n logger.debug(\n `VersionedGraphService not found in DI container, using base types: ${graphTypes.join(\", \")}`\n );\n }\n } catch (error) {\n // Fallback to base types if error getting versions\n graphTypes = baseGraphTypes;\n logger.debug(\n `Failed to get versioned types, using base types: ${error.message}`\n );\n logger.debug(`Stack trace: ${error.stack}`);\n }\n }\n }\n } catch (error) {\n logger.debug(`Failed to get graph types from builders: ${error.message}`);\n }\n\n // Fallback to service name if no builders found\n if (graphTypes.length === 0) {\n logger.debug(\"No builders found, using service name as graph type\");\n graphTypes = [serviceName];\n }\n\n await discovery.registerService(\n serviceName,\n \"localhost\",\n port,\n {\n graphTypes,\n environment: \"development\",\n startTime: new Date().toISOString(),\n version: process.env.npm_package_version || \"1.0.0\",\n },\n graphTypes\n );\n\n logger.log(\n `📡 Service registered with discovery: ${serviceName} (types: ${graphTypes.join(\", \")})`\n );\n } catch (error) {\n logger.warn(`Failed to register with service discovery: ${error.message}`);\n }\n}\n\n/**\n * Bootstrap function for graph microservices\n */\nexport async function bootstrap(\n AppModule: any,\n options: { port?: number; globalPrefix?: string } = {}\n) {\n // Setup Redis mock for development (must be called before any module imports)\n setupRedisMock();\n\n const app = await NestFactory.create(AppModule);\n const logger = new Logger(\"Bootstrap\");\n\n // Configuration\n const requestedPort =\n options.port || parseInt(process.env.PORT || \"3100\", 10);\n const port = await findAvailablePort(requestedPort);\n const globalPrefix = options.globalPrefix;\n\n if (port !== requestedPort) {\n logger.warn(`Port ${requestedPort} is busy, using port ${port} instead`);\n }\n\n // Global prefix (only if specified)\n if (globalPrefix) {\n app.setGlobalPrefix(globalPrefix);\n }\n\n // Global validation pipe\n app.useGlobalPipes(\n new ValidationPipe({\n whitelist: true,\n forbidNonWhitelisted: true,\n transform: true,\n })\n );\n\n // CORS\n app.enableCors({\n origin: true,\n credentials: true,\n });\n\n // Swagger documentation\n const config = new DocumentBuilder()\n .setTitle(\"Graph Service API\")\n .setDescription(\"API for graph service microservice\")\n .setVersion(\"1.0\")\n .addBearerAuth()\n .build();\n\n const document = SwaggerModule.createDocument(app, config);\n SwaggerModule.setup(\"api/docs\", app, document);\n\n // Start the server\n await app.listen(port);\n\n const baseUrl = globalPrefix\n ? `http://localhost:${port}/${globalPrefix}`\n : `http://localhost:${port}`;\n logger.log(`🚀 Graph service is running on: ${baseUrl}`);\n logger.log(`📚 API Documentation: http://localhost:${port}/api/docs`);\n\n // Service Discovery Registration (only in development)\n if (process.env.NODE_ENV !== \"production\") {\n logger.debug(\n `Attempting service discovery registration (NODE_ENV: ${process.env.NODE_ENV || \"undefined\"})`\n );\n await registerWithServiceDiscovery(AppModule, port, logger, app);\n } else {\n logger.debug(\n `Skipping service discovery registration (NODE_ENV: ${process.env.NODE_ENV})`\n );\n }\n\n return app;\n}\n","export * from \"../graph/abstract-graph.builder\";\nexport * from \"./base-entity\";\nexport * from \"./bootstrap\";\nexport * from \"./builder-registry.service\";\nexport * from \"./universal-graph.module\";\n","/**\n * Message attachment types\n */\n\nexport enum AttachmentType {\n IMAGE = \"image\",\n VOICE = \"voice\",\n FILE = \"file\",\n BUTTON = \"button\",\n CITATION = \"citation\",\n SUGGESTION = \"suggestion\",\n WEBAPP = \"webapp\",\n SOURCE = \"source\",\n CARD = \"card\",\n CHART = \"chart\",\n}\n\n/** Attachment interface */\nexport interface IAttachment {\n type: AttachmentType;\n value: any;\n metadata?: Record<string, any>;\n}\n\n/** Citation attachment value */\nexport type CitationValue = {\n source: {\n url: string;\n title: string;\n type: \"webpage\" | \"pdf\" | \"article\";\n articleId?: string;\n knowledgeBaseId?: string;\n };\n};\n","/**\n * Streaming types\n */\n\nexport enum StreamChannel {\n TEXT = \"text\",\n PROCESSING = \"processing\",\n}\n","// packages/sdk/src/interfaces/graph-service.interface.ts\nimport { HumanMessage } from \"@langchain/core/messages\";\nimport { CallbackResult } from \"../callbacks/callback.interface\";\nimport {\n IAttachment,\n IUsageMetrics,\n IReasoningChain,\n IStoredMessageContent,\n} from \"../messages\";\nexport {\n IStoredMessageContent,\n IAttachment,\n IUsageMetrics,\n IReasoningChain,\n} from \"../messages\";\n// Minimal interfaces required for data exchange.\n// In the main system they can be extended with richer types.\n\n/**\n * Base contract for all graph services\n */\nexport interface IGraphService {\n /**\n * Check service availability\n */\n healthCheck(): Promise<boolean>;\n\n /**\n * Get list of supported graph types\n */\n getSupportedGraphTypes(): Promise<string[]>;\n\n /**\n * Generate answer (without streaming)\n */\n generateAnswer(payload: IGraphRequestPayload): Promise<IGraphResponsePayload>;\n\n /**\n * Stream answer generation\n */\n streamAnswer(\n payload: IGraphRequestPayload,\n onPartial: (chunk: string) => void\n ): Promise<IGraphResponsePayload>;\n\n /**\n * Cancel generation\n */\n cancelGeneration(requestId: string): Promise<void>;\n\n /**\n * Execute callback\n */\n executeCallback(\n token: string,\n platform?: string,\n platformContext?: any\n ): Promise<CallbackResult>;\n}\n\n/**\n * Request to graph service\n */\nexport interface IGraphRequestPayload {\n /**\n * Unique request ID\n */\n requestId: string;\n\n /**\n * Thread ID\n */\n threadId: string;\n\n /**\n * User ID\n */\n userId: string;\n\n /**\n * Agent ID\n */\n agentId: string;\n\n /**\n * User message\n */\n message: HumanMessage;\n\n /**\n * Graph type\n */\n graphType: string;\n\n /**\n * Graph settings ID\n */\n graphSettings: any;\n\n /**\n * Additional context (message history, etc)\n */\n context?: Record<string, any>;\n\n metadata?: Record<string, any>;\n}\n\n/**\n * Response from graph service\n */\nexport interface IGraphResponsePayload {\n /**\n * Request ID\n */\n requestId: string;\n\n /**\n * Response text\n */\n text: string;\n\n /**\n * Attachments\n */\n attachments?: IAttachment[];\n\n /**\n * Reasoning chains\n */\n reasoningChains?: IReasoningChain[];\n\n /**\n * Metadata\n */\n metadata: {\n /**\n * Usage metrics (tokens, etc.)\n */\n usageMetrics: IUsageMetrics;\n\n /**\n * Other metadata\n */\n [key: string]: any;\n };\n}\n\n/**\n * Constants for injection tokens\n */\nexport const GraphServiceTokens = {\n REGISTRY: \"GRAPH_SERVICE_REGISTRY\",\n CLIENT: \"GRAPH_SERVICE_CLIENT\",\n SETTINGS_REPOSITORY: \"GRAPH_SERVICE_SETTINGS_REPOSITORY\",\n};\n\n/**\n * Repository for graph settings\n */\nexport interface IGraphSettingsRepository {\n /**\n * Get graph settings by ID\n */\n getSettings(settingsId: string): Promise<any>;\n\n /**\n * Get graph settings by agent and graph type\n */\n getSettingsByAgentAndType(agentId: string, graphType: string): Promise<any>;\n\n /**\n * Save graph settings\n */\n saveSettings(\n agentId: string,\n graphType: string,\n settings: any\n ): Promise<string>;\n}\n","// packages/sdk/src/api/graph.controller.ts\nimport {\n Controller,\n Get,\n Post,\n Body,\n Headers,\n Res,\n HttpStatus,\n HttpException,\n Inject,\n Logger,\n Query,\n Param,\n} from \"@nestjs/common\";\nimport { Response } from \"express\";\nimport {\n ApiTags,\n ApiOperation,\n ApiResponse,\n ApiQuery,\n ApiParam,\n} from \"@nestjs/swagger\";\nimport {\n IGraphRequestPayload,\n IGraphResponsePayload,\n IGraphService,\n} from \"./graph-service.interface\";\nimport { BuilderRegistryService } from \"../core/builder-registry.service\";\n\n/**\n * Unified controller for Graph API\n * Includes core graph operations and registry\n */\n@ApiTags(\"Graphs\")\n@Controller()\nexport class GraphController {\n protected readonly logger = new Logger(GraphController.name);\n\n constructor(\n @Inject(\"GRAPH_SERVICE\")\n protected readonly graphService: IGraphService,\n @Inject(BuilderRegistryService)\n private readonly builderRegistry: BuilderRegistryService\n ) {}\n\n // ========== Core Graph Operations ==========\n\n @Get(\"health\")\n @ApiOperation({ summary: \"Check graph service health\" })\n @ApiResponse({ status: 200, description: \"Service is available\" })\n async healthCheck(): Promise<{ status: string; timestamp: string }> {\n try {\n const isHealthy = await this.graphService.healthCheck();\n return {\n status: isHealthy ? \"healthy\" : \"unhealthy\",\n timestamp: new Date().toISOString(),\n };\n } catch (error) {\n this.logger.error(`Health check failed: ${error.message}`);\n throw new HttpException(\n \"Service unhealthy\",\n HttpStatus.SERVICE_UNAVAILABLE\n );\n }\n }\n\n @Get(\"graph-types\")\n @ApiOperation({ summary: \"Get supported graph types\" })\n @ApiResponse({ status: 200, description: \"List of graph types\" })\n async getSupportedGraphTypes(): Promise<string[]> {\n return this.graphService.getSupportedGraphTypes();\n }\n\n @Post(\"generate\")\n @ApiOperation({ summary: \"Generate answer (non-streaming)\" })\n @ApiResponse({ status: 200, description: \"Answer generated\" })\n async generateAnswer(\n @Body() payload: IGraphRequestPayload\n ): Promise<IGraphResponsePayload> {\n try {\n return await this.graphService.generateAnswer(payload);\n } catch (error) {\n this.logger.error(`Generation failed: ${error.message}`);\n throw new HttpException(\n `Generation failed: ${error.message}`,\n HttpStatus.INTERNAL_SERVER_ERROR\n );\n }\n }\n\n @Post(\"stream\")\n @ApiOperation({ summary: \"Stream answer generation\" })\n @ApiResponse({ status: 200, description: \"Streaming response\" })\n async streamAnswer(\n @Body() payload: IGraphRequestPayload,\n @Res() res: Response\n ): Promise<void> {\n res.setHeader(\"Content-Type\", \"text/event-stream\");\n res.setHeader(\"Transfer-Encoding\", \"chunked\");\n res.setHeader(\"Cache-Control\", \"no-cache\");\n res.setHeader(\"Connection\", \"keep-alive\");\n\n try {\n this.logger.debug(\n `[CONTROLLER] Starting streamAnswer for requestId: ${payload.requestId}`\n );\n\n const result = await this.graphService.streamAnswer(\n payload,\n (chunk: string) => {\n // this.logger.debug(`[CONTROLLER] Sending chunk: ${chunk}`);\n res.write(`event: stream_event\\n`);\n res.write(`data: ${chunk}\\n\\n`);\n }\n );\n\n this.logger.debug(\n `[CONTROLLER] Got final result: ${JSON.stringify(result)}...`\n );\n\n this.logger.debug(`[CONTROLLER] Final result details:`, {\n hasText: !!result.text,\n textLength: result.text?.length || 0,\n attachmentsCount: result.attachments?.length || 0,\n reasoningChainsCount: result.reasoningChains?.length || 0,\n resultKeys: Object.keys(result || {}),\n });\n\n // Send final result as SSE event\n res.write(`event: final\\n`);\n res.write(`data: ${JSON.stringify(result)}\\n\\n`);\n res.end();\n\n this.logger.debug(`[CONTROLLER] Stream completed successfully`);\n } catch (error) {\n this.logger.error(`[CONTROLLER] Streaming failed: ${error.message}`);\n this.logger.error(`[CONTROLLER] Error stack: ${error.stack}`);\n // Send error as SSE event\n res.write(`event: error\\n`);\n res.write(`data: ${JSON.stringify({ message: error.message })}\\n\\n`);\n res.end();\n }\n }\n\n @Post(\"cancel/:requestId\")\n @ApiOperation({ summary: \"Cancel generation\" })\n @ApiParam({ name: \"requestId\", description: \"Request ID to cancel\" })\n @ApiResponse({ status: 200, description: \"Generation cancelled\" })\n async cancelGeneration(\n @Param(\"requestId\") requestId: string\n ): Promise<{ message: string }> {\n try {\n await this.graphService.cancelGeneration(requestId);\n return { message: `Generation ${requestId} cancelled` };\n } catch (error) {\n this.logger.error(`Cancellation failed: ${error.message}`);\n throw new HttpException(\n `Cancellation failed: ${error.message}`,\n HttpStatus.INTERNAL_SERVER_ERROR\n );\n }\n }\n\n // ========== Graph Registry ==========\n\n @Get(\"registry\")\n @ApiOperation({ summary: \"Get all registered graphs\" })\n @ApiResponse({ status: 200, description: \"List of registered graphs\" })\n async getRegisteredGraphs(): Promise<{\n total: number;\n graphs: Array<{ graphType: string; builderName: string }>;\n }> {\n const builders = this.builderRegistry.getBuilders();\n return {\n total: builders.length,\n graphs: builders.map(builder => ({\n graphType: builder.graphType,\n builderName: builder.constructor.name,\n })),\n };\n }\n\n @Get(\"registry/stats\")\n @ApiOperation({ summary: \"Graph registry statistics\" })\n @ApiResponse({ status: 200, description: \"Statistics\" })\n async getRegistryStats(): Promise<{\n totalBuilders: number;\n graphTypes: string[];\n builderTypes: Record<string, number>;\n }> {\n const builders = this.builderRegistry.getBuilders();\n const graphTypes = builders.map(b => b.graphType);\n const builderTypes: Record<string, number> = {};\n\n builders.forEach(builder => {\n const name = builder.constructor.name;\n builderTypes[name] = (builderTypes[name] || 0) + 1;\n });\n\n return {\n totalBuilders: builders.length,\n graphTypes,\n builderTypes,\n };\n }\n}\n","/**\n * JSON Schema for graph manifest validation\n */\nexport const GraphManifestSchema = {\n $schema: \"http://json-schema.org/draft-07/schema#\",\n type: \"object\",\n title: \"Graph Manifest Schema\",\n description: \"Schema for validating graph manifest files\",\n properties: {\n graphType: {\n type: \"string\",\n description: \"Unique identifier for the graph type\",\n pattern: \"^[a-z][a-zA-Z0-9]*$\",\n },\n title: {\n type: \"string\",\n description: \"Human-readable title for the graph\",\n minLength: 1,\n maxLength: 100,\n },\n description: {\n type: \"string\",\n description: \"Short description of the graph\",\n minLength: 1,\n maxLength: 500,\n },\n detailedDescription: {\n type: \"string\",\n description: \"Detailed description with markdown support\",\n minLength: 1,\n },\n category: {\n type: \"string\",\n description: \"Category for grouping graphs\",\n enum: [\"basic\", \"specialized\", \"advanced\", \"experimental\"],\n },\n tags: {\n type: \"array\",\n description: \"Tags for filtering and searching\",\n items: {\n type: \"string\",\n pattern: \"^[a-z][a-zA-Z0-9-]*$\",\n },\n uniqueItems: true,\n },\n hue: {\n type: \"number\",\n description: \"Color hue for UI representation (0-360)\",\n minimum: 0,\n maximum: 360,\n },\n visibility: {\n type: \"string\",\n description: \"Visibility level for the graph\",\n enum: [\"public\", \"private\"],\n default: \"public\",\n },\n isEmbedded: {\n type: \"boolean\",\n description: \"Whether the graph runs in embedded mode\",\n default: true,\n },\n isActive: {\n type: \"boolean\",\n description: \"Whether the graph is currently active\",\n default: true,\n },\n schema: {\n type: \"object\",\n description: \"JSON Schema for graph configuration\",\n properties: {\n type: {\n type: \"string\",\n const: \"object\",\n },\n properties: {\n type: \"object\",\n additionalProperties: {\n type: \"object\",\n properties: {\n type: { type: \"string\" },\n title: { type: \"string\" },\n description: { type: \"string\" },\n default: {},\n minimum: { type: \"number\" },\n maximum: { type: \"number\" },\n minLength: { type: \"number\" },\n maxLength: { type: \"number\" },\n format: { type: \"string\" },\n enum: { type: \"array\" },\n },\n required: [\"type\", \"title\"],\n },\n },\n required: {\n type: \"array\",\n items: { type: \"string\" },\n },\n },\n required: [\"type\", \"properties\", \"required\"],\n additionalProperties: false,\n },\n defaultSettings: {\n type: \"object\",\n description: \"Default settings for the graph\",\n },\n },\n required: [\"graphType\", \"title\", \"description\", \"schema\"],\n additionalProperties: false,\n};\n\n/**\n * Validation functions for graph manifests\n */\nexport class GraphManifestValidator {\n /**\n * Validate a graph manifest against the schema\n */\n static validate(manifest: any): { isValid: boolean; errors: string[] } {\n const errors: string[] = [];\n\n try {\n // Check required fields\n const required = GraphManifestSchema.required as string[];\n for (const field of required) {\n if (!manifest.hasOwnProperty(field)) {\n errors.push(`Missing required field: ${field}`);\n }\n }\n\n // Validate graphType format - allow dots, colons, and hyphens for versioned types\n if (\n manifest.graphType &&\n !/^[a-z][a-zA-Z0-9._:-]*$/.test(manifest.graphType)\n ) {\n errors.push(`graphType must match pattern: ^[a-z][a-zA-Z0-9._:-]*$`);\n }\n\n // Validate category\n if (\n manifest.category &&\n ![\"basic\", \"specialized\", \"advanced\", \"experimental\"].includes(\n manifest.category\n )\n ) {\n errors.push(\n `category must be one of: basic, specialized, advanced, experimental`\n );\n }\n\n // Validate visibility\n if (\n manifest.visibility &&\n ![\"public\", \"private\"].includes(manifest.visibility)\n ) {\n errors.push(`visibility must be one of: public, private`);\n }\n\n // Validate hue range\n if (\n manifest.hue !== undefined &&\n (manifest.hue < 0 || manifest.hue > 360)\n ) {\n errors.push(`hue must be between 0 and 360`);\n }\n\n // Validate schema structure\n if (manifest.schema) {\n if (manifest.schema.type !== \"object\") {\n errors.push(`schema.type must be \"object\"`);\n }\n if (\n !manifest.schema.properties ||\n typeof manifest.schema.properties !== \"object\"\n ) {\n errors.push(`schema.properties must be an object`);\n }\n if (!Array.isArray(manifest.schema.required)) {\n errors.push(`schema.required must be an array`);\n }\n }\n\n // Validate tags\n if (manifest.tags && Array.isArray(manifest.tags)) {\n for (const tag of manifest.tags) {\n if (typeof tag !== \"string\" || !/^[a-z][a-zA-Z0-9-]*$/.test(tag)) {\n errors.push(\n `Invalid tag format: ${tag}. Tags must match pattern: ^[a-z][a-zA-Z0-9-]*$`\n );\n }\n }\n\n // Check for duplicate tags\n const uniqueTags = new Set(manifest.tags);\n if (uniqueTags.size !== manifest.tags.length) {\n errors.push(`Duplicate tags found`);\n }\n }\n\n return {\n isValid: errors.length === 0,\n errors,\n };\n } catch (error: any) {\n return {\n isValid: false,\n errors: [`Validation error: ${error.message}`],\n };\n }\n }\n\n /**\n * Validate and throw if invalid\n */\n static validateOrThrow(manifest: any): void {\n const result = this.validate(manifest);\n if (!result.isValid) {\n throw new Error(\n `Graph manifest validation failed:\\n${result.errors.join(\"\\n\")}`\n );\n }\n }\n}\n","// packages/sdk/src/versioning/index.ts\nexport * from \"./versioned-graph.service\";\nexport * from \"./versioning.types\";\n","import * as LangGraph from \"@langchain/langgraph\";\nimport { Logger } from \"@nestjs/common\";\n\nconst logger = new Logger(\"ApiCallTracer\");\n\nexport interface ApiCallTracerOptions {\n /** Maximum length for string values before truncation (default: 5000) */\n maxStringLength?: number;\n /** Maximum depth for nested object traversal (default: 15) */\n maxDepth?: number;\n}\n\nexport const DEFAULT_TRACER_OPTIONS: Required<ApiCallTracerOptions> = {\n maxStringLength: 5000,\n maxDepth: 15,\n};\n\ntype LangGraphDispatchFn = (\n eventName: string,\n payload?: Record<string, unknown>\n) => void;\n\nlet cachedDispatch: LangGraphDispatchFn | null | undefined;\nlet dispatchUnavailableLogged = false;\n\nexport interface TraceApiCallResult<TResult> {\n /** Result returned from the wrapped API call */\n result: TResult;\n /** Unix timestamp in milliseconds when the call started */\n startedAt: number;\n /** Unix timestamp in milliseconds when the call completed */\n completedAt: number;\n /** Milliseconds spent inside the API call */\n durationMs: number;\n}\n\nexport async function traceApiCall<TResult>(\n execute: () => Promise<TResult>,\n options?: ApiCallTracerOptions\n): Promise<TraceApiCallResult<TResult>> {\n const startedAt = Date.now();\n\n dispatchApiTraceEvent(\"custom_api_call_start\");\n\n try {\n const result = await execute();\n const completedAt = Date.now();\n const durationMs = completedAt - startedAt;\n\n dispatchApiTraceEvent(\"custom_api_call_end\", {\n result: sanitizeTraceData(result, 0, new WeakSet(), options),\n startedAt,\n completedAt,\n durationMs,\n });\n\n return { result, startedAt, completedAt, durationMs };\n } catch (error) {\n const failedAt = Date.now();\n const durationMs = failedAt - startedAt;\n\n dispatchApiTraceEvent(\"custom_api_call_error\", {\n error: sanitizeTraceError(error, options),\n startedAt,\n failedAt,\n durationMs,\n });\n\n throw error;\n }\n}\n\nfunction dispatchApiTraceEvent(\n eventName: string,\n payload?: Record<string, unknown>\n): void {\n const dispatch = getLangGraphDispatch();\n\n if (!dispatch) {\n if (!dispatchUnavailableLogged) {\n logger.debug(\"LangGraph dispatchCustomEvent is not available\");\n dispatchUnavailableLogged = true;\n }\n return;\n }\n\n try {\n dispatch(eventName, payload);\n } catch (error) {\n logger.warn(\"Failed to emit API trace event\", {\n error: error instanceof Error ? error.message : String(error),\n eventName,\n });\n }\n}\n\nfunction getLangGraphDispatch(): LangGraphDispatchFn | null {\n if (cachedDispatch !== undefined) {\n return cachedDispatch;\n }\n\n const { dispatchCustomEvent } = LangGraph as unknown as {\n dispatchCustomEvent?: LangGraphDispatchFn;\n };\n\n cachedDispatch =\n typeof dispatchCustomEvent === \"function\" ? dispatchCustomEvent : null;\n\n return cachedDispatch;\n}\n\nexport function sanitizeTraceData(\n value: unknown,\n depth = 0,\n seen = new WeakSet<object>(),\n options?: ApiCallTracerOptions\n): unknown {\n const opts = { ...DEFAULT_TRACER_OPTIONS, ...options };\n\n if (value === undefined) {\n return undefined;\n }\n\n if (value === null) {\n return null;\n }\n\n if (typeof value === \"string\") {\n // No truncation - we need full tool inputs/outputs for proper processing\n return value;\n }\n\n if (typeof value === \"number\" || typeof value === \"boolean\") {\n return value;\n }\n\n if (typeof value === \"bigint\") {\n return value.toString();\n }\n\n if (value instanceof Date) {\n return value.toISOString();\n }\n\n if (value instanceof Error) {\n return sanitizeTraceError(value, options);\n }\n\n if (depth >= opts.maxDepth) {\n return Array.isArray(value) ? \"[Array]\" : \"[Object]\";\n }\n\n if (typeof value === \"object\") {\n if (seen.has(value as object)) {\n // Skip circular references instead of returning \"[Circular]\" string\n return undefined;\n }\n\n seen.add(value as object);\n\n if (Array.isArray(value)) {\n // Don't truncate arrays - we need all tool calls, all messages, etc.\n return value\n .map(item => sanitizeTraceData(item, depth + 1, seen, options))\n .filter(item => item !== undefined); // Remove circular refs from array\n }\n\n if (value instanceof Set) {\n return Array.from(value)\n .map(item => sanitizeTraceData(item, depth + 1, seen, options))\n .filter(item => item !== undefined);\n }\n\n if (value instanceof Map) {\n const entries: Record<string, unknown> = {};\n for (const [key, entryValue] of value.entries()) {\n const sanitized = sanitizeTraceData(\n entryValue,\n depth + 1,\n seen,\n options\n );\n if (sanitized !== undefined) {\n entries[String(key)] = sanitized;\n }\n }\n return entries;\n }\n\n const result: Record<string, unknown> = {};\n for (const [key, entryValue] of Object.entries(\n value as Record<string, unknown>\n )) {\n const sanitized = sanitizeTraceData(entryValue, depth + 1, seen, options);\n // Skip circular references instead of adding \"[Circular]\" string\n if (sanitized !== undefined) {\n result[key] = sanitized;\n }\n }\n return result;\n }\n\n return String(value);\n}\n\nfunction sanitizeTraceError(\n error: unknown,\n options?: ApiCallTracerOptions\n): Record<string, unknown> {\n const opts = { ...DEFAULT_TRACER_OPTIONS, ...options };\n\n if (error instanceof Error) {\n return {\n name: error.name,\n message: error.message,\n stack: error.stack\n ? sanitizeTraceData(error.stack, 0, new WeakSet(), options)\n : undefined,\n };\n }\n\n if (typeof error === \"string\") {\n return {\n message:\n error.length > opts.maxStringLength\n ? `${error.slice(0, opts.maxStringLength)}…`\n : error,\n };\n }\n\n return {\n message: \"Unknown error\",\n raw: sanitizeTraceData(error, 0, new WeakSet(), options),\n };\n}\n","// packages/sdk/src/graph-engine.factory.ts\nimport { Inject, Injectable } from \"@nestjs/common\";\nimport { IGraphEngine } from \"../graph/abstract-graph.builder\";\nimport { LangGraphEngine } from \"./langgraph/langgraph-engine\";\n\n/**\n * Graph engine type\n */\nexport enum GraphEngineType {\n LANGGRAPH = \"langgraph\",\n LANGFLOW = \"langflow\",\n FLOWISE = \"flowise\",\n}\n\n/**\n * Factory for creating graph engines\n */\n@Injectable()\nexport class GraphEngineFactory {\n constructor(private readonly langgraph: LangGraphEngine) {}\n\n /**\n * Get engine for the specified type\n */\n getEngine(engineType: GraphEngineType): IGraphEngine {\n switch (engineType) {\n case GraphEngineType.LANGGRAPH:\n return this.langgraph;\n // Will add other types in the future\n // case GraphEngineType.LANGFLOW:\n // return new LangFlowEngine();\n // case GraphEngineType.FLOWISE:\n // return new FlowiseEngine();\n default:\n throw new Error(`Unsupported graph engine type: ${engineType}`);\n }\n }\n}\n","/**\n * Universal LangGraph stream processing and result extraction utilities\n */\n\nimport {\n IContentBlock,\n IContentChain,\n StreamChannel,\n IStoredMessageContent,\n IAttachment,\n} from \"../../messages\";\nimport { IGraphTraceEvent } from \"../../graph/tracing\";\nimport { Injectable, Logger } from \"@nestjs/common\";\nimport { sanitizeTraceData } from \"../api-call-tracer.utils\";\n\n/**\n * LLM call record collected from on_chat_model_end events\n */\nexport interface LLMCallRecord {\n modelId: string; // Internal MongoDB model ID\n promptTokens: number;\n completionTokens: number;\n totalTokens: number;\n timestamp: number;\n nodeName?: string; // LangGraph node name\n}\n\n/**\n * State for a single channel\n */\nexport interface ChannelState {\n contentChain: IContentBlock[]; // Accumulated blocks for the chain\n currentBlock: IContentBlock | null; // Block currently being streamed\n pendingToolBlocks: IContentBlock[]; // Tool blocks awaiting on_tool_end output (FIFO queue)\n}\n\n/**\n * Stream accumulator for collecting events during graph execution\n * Each stream creates its own accumulator to ensure thread-safety\n */\nexport interface StreamAccumulator {\n // Per-channel state (unified structure)\n channels: Map<StreamChannel, ChannelState>;\n\n // Common data\n attachments: IAttachment[];\n metadata: Record<string, any>;\n traceEvents: IGraphTraceEvent[];\n traceStartedAt: number | null;\n traceCompletedAt: number | null;\n}\n\n/**\n * Stateless event processor for LangGraph streams\n * Thread-safe: state is passed via accumulator parameter, not stored in class\n */\n@Injectable()\nexport class EventProcessor {\n private readonly logger = new Logger(EventProcessor.name);\n\n /**\n * Create new accumulator for a stream\n */\n createAccumulator(): StreamAccumulator {\n return {\n channels: new Map([\n [\n StreamChannel.TEXT,\n { contentChain: [], currentBlock: null, pendingToolBlocks: [] },\n ],\n [\n StreamChannel.PROCESSING,\n { contentChain: [], currentBlock: null, pendingToolBlocks: [] },\n ],\n ]),\n attachments: [],\n metadata: {},\n traceEvents: [],\n traceStartedAt: null,\n traceCompletedAt: null,\n };\n }\n\n /**\n * Normalize content to unified array of blocks\n * Handles string, array, or single object formats\n *\n * Output format examples:\n * - Text: [{ type: \"text\", text: \"Hello\" }]\n * - Tool call: [{ type: \"tool_use\", id: \"toolu_123\", name: \"get_weather\", input: {...} }]\n * - Tool input delta: [{ type: \"input_json_delta\", input: \"{\\\"city\\\": \\\"\" }]\n * - Mixed: [{ type: \"tool_use\", ... }, { type: \"text\", text: \"...\" }]\n */\n private normalizeContentBlocks(content: any): any[] {\n if (!content) {\n return [];\n }\n\n // Already an array of blocks\n if (Array.isArray(content)) {\n return content;\n }\n\n // String content -> wrap in text block\n if (typeof content === \"string\") {\n return content.trim() ? [{ type: \"text\", text: content }] : [];\n }\n\n // Single object block\n if (typeof content === \"object\") {\n return [content];\n }\n\n return [];\n }\n\n /**\n * Send delta to UI (unified format)\n */\n private sendDelta(\n channel: StreamChannel,\n delta: any,\n onPartial?: (chunk: string) => void\n ): void {\n if (!onPartial) return;\n\n // Debug: log tool-related deltas\n if (\n delta.type === \"step_started\" ||\n delta.type === \"tool_output_chunk\" ||\n delta.type === \"tool_input_chunk\"\n ) {\n this.logger.debug(\n `[DELTA] type=${delta.type} channel=${channel} stepId=${delta.stepId || delta.step?.id} name=${delta.step?.name || \"N/A\"}`\n );\n }\n\n onPartial(\n JSON.stringify({\n channel,\n delta,\n })\n );\n }\n\n /**\n * Process content stream blocks (universal for all channels)\n */\n private processContentStream(\n acc: StreamAccumulator,\n channel: StreamChannel,\n blocks: any[],\n onPartial?: (chunk: string) => void\n ): void {\n const state = acc.channels.get(channel)!;\n\n for (const block of blocks) {\n if (block.type === \"tool_use\" || block.type === \"tool_call\") {\n // Finalize current block if exists\n if (state.currentBlock) {\n state.contentChain.push(state.currentBlock);\n }\n\n // Create new tool block\n state.currentBlock = {\n index: state.contentChain.length,\n type: \"tool_use\",\n name: block.name,\n id: block.id,\n input: block.input || \"\",\n output: \"\",\n };\n\n // Track this tool block for matching with on_tool_end\n state.pendingToolBlocks.push(state.currentBlock);\n\n // Send delta\n this.sendDelta(\n channel,\n {\n type: \"step_started\",\n step: state.currentBlock,\n },\n onPartial\n );\n } else if (block.type === \"input_json_delta\") {\n // Accumulate tool INPUT (parameters)\n if (state.currentBlock && state.currentBlock.type === \"tool_use\") {\n const chunk = block.input || \"\";\n state.currentBlock.input += chunk;\n\n // Send delta\n this.sendDelta(\n channel,\n {\n type: \"tool_input_chunk\",\n stepId: state.currentBlock.id,\n chunk: chunk,\n },\n onPartial\n );\n }\n } else if (block.type === \"text\") {\n const textChunk = block.text || \"\";\n\n // If current block is text, accumulate\n if (state.currentBlock && state.currentBlock.type === \"text\") {\n state.currentBlock.text = (state.currentBlock.text || \"\") + textChunk;\n } else {\n // Finalize previous block (tool)\n if (state.currentBlock) {\n state.contentChain.push(state.currentBlock);\n }\n\n // Create new text block\n state.currentBlock = {\n index: state.contentChain.length,\n type: \"text\",\n text: textChunk,\n };\n }\n\n // Send delta\n this.sendDelta(\n channel,\n {\n type: \"text_chunk\",\n text: textChunk,\n },\n onPartial\n );\n }\n }\n }\n\n /**\n * Groups tool_use and input_json_delta into proper structure\n * tool_use.input → output (tool execution result)\n * input_json_delta.input → output (tool execution result, accumulated)\n * @deprecated This method is for legacy fallback only\n */\n private mapReasoningSteps(rawSteps: any[]): IContentBlock[] {\n const steps: IContentBlock[] = [];\n let currentToolUse: IContentBlock | null = null;\n\n for (const raw of rawSteps) {\n if (raw.type === \"tool_use\" || raw.type === \"tool_call\") {\n // Save previous tool_use if exists\n if (currentToolUse) {\n steps.push(currentToolUse);\n }\n\n // Create new tool_use\n // tool_use.input contains tool execution result (OUT)\n currentToolUse = {\n index: raw.index || 0,\n type: \"tool_use\",\n name: raw.name,\n id: raw.id,\n input: \"\", // Parameters (IN) - filled separately or empty\n output: raw.input || \"\", // Result (OUT) - comes in tool_use.input\n };\n } else if (raw.type === \"input_json_delta\") {\n // input_json_delta.input contains execution result (streaming) → output\n if (currentToolUse) {\n currentToolUse.output =\n (currentToolUse.output || \"\") + (raw.input || \"\");\n }\n } else {\n // Regular step (text, thinking, tool_result)\n if (currentToolUse) {\n steps.push(currentToolUse);\n currentToolUse = null;\n }\n\n steps.push({\n index: raw.index || 0,\n type: raw.type,\n text: raw.text || \"\",\n metadata: raw.metadata,\n });\n }\n }\n\n // Don't forget the last tool_use\n if (currentToolUse) {\n steps.push(currentToolUse);\n }\n\n return steps;\n }\n\n /**\n * Process a LangGraph stream event\n * Mutates accumulator to collect data from different channels\n * @param onPartial Optional callback for streaming chunks to UI (omit for invoke without streaming)\n */\n processEvent(\n acc: StreamAccumulator,\n event: any,\n onPartial?: (chunk: string) => void\n ): void {\n this.captureTraceEvent(acc, event);\n\n // 1. Streaming content (universal for all channels)\n if (event.event === \"on_chat_model_stream\" && event.data?.chunk?.content) {\n const channel =\n (event.metadata?.stream_channel as StreamChannel) ?? StreamChannel.TEXT;\n const blocks = this.normalizeContentBlocks(event.data.chunk.content);\n\n this.processContentStream(acc, channel, blocks, onPartial);\n return;\n }\n\n // 3. Tool events: log tool execution lifecycle\n if (event.event === \"on_tool_start\") {\n this.logger.log(\"🔧 Tool execution started\", {\n toolName: event.name,\n input: event.data?.input,\n runId: event.run_id,\n metadata: event.metadata,\n });\n return;\n }\n\n if (event.event === \"on_tool_end\") {\n const channel =\n (event.metadata?.stream_channel as StreamChannel) ?? StreamChannel.TEXT;\n const state = acc.channels.get(channel);\n\n if (!state) return;\n\n // Find the correct tool block from the pending queue (FIFO order)\n // Tools execute sequentially, so the first pending block matches the first on_tool_end\n this.logger.debug(\n `[on_tool_end] channel=${channel} pendingCount=${state.pendingToolBlocks.length} pendingIds=${state.pendingToolBlocks.map(b => b.id).join(\",\")} currentBlock=${state.currentBlock?.id}`\n );\n const toolBlock = state.pendingToolBlocks.shift();\n\n if (toolBlock && toolBlock.type === \"tool_use\") {\n // Set tool OUTPUT (result of execution)\n const output = event.data?.output;\n const outputString =\n typeof output === \"string\" ? output : JSON.stringify(output, null, 2);\n\n toolBlock.output = outputString;\n\n // Send delta with correct tool block id\n this.sendDelta(\n channel,\n {\n type: \"tool_output_chunk\",\n stepId: toolBlock.id,\n chunk: outputString,\n },\n onPartial\n );\n\n this.logger.log(\"✅ Tool execution completed\", {\n toolName: event.name,\n toolBlockId: toolBlock.id,\n outputPreview:\n outputString.substring(0, 200) +\n (outputString.length > 200 ? \"...\" : \"\"),\n runId: event.run_id,\n });\n } else {\n this.logger.warn(\n \"⚠️ on_tool_end received but no pending tool block found\",\n {\n toolName: event.name,\n runId: event.run_id,\n pendingCount: state.pendingToolBlocks.length,\n }\n );\n }\n return;\n }\n\n if (event.event === \"on_tool_error\") {\n this.logger.error(\"❌ Tool execution failed\", {\n toolName: event.name,\n error: event.data?.error,\n runId: event.run_id,\n });\n return;\n }\n\n // 2. Model end: just log, no finalization needed\n if (event.event === \"on_chat_model_end\") {\n this.logger.debug(\"✅ LLM call completed\", {\n nodeName: event.metadata?.langgraph_node || event.name,\n channel: event.metadata?.stream_channel,\n });\n return;\n }\n\n // 3. Chain end: extract final attachments and metadata (TEXT channel only)\n if (event.event === \"on_chain_end\") {\n const channel =\n (event.metadata?.stream_channel as StreamChannel) ?? StreamChannel.TEXT;\n\n if (channel === StreamChannel.TEXT) {\n const output = event.data.output;\n\n // Extract attachments and metadata from different graph output formats\n // Use merge instead of replace to preserve data from multiple nodes\n if (output?.answer) {\n acc.attachments = [\n ...acc.attachments,\n ...(output.answer.attachments || []),\n ];\n acc.metadata = { ...acc.metadata, ...(output.answer.metadata || {}) };\n } else if (output?.generation) {\n acc.attachments = [\n ...acc.attachments,\n ...(output.generation.attachments || []),\n ];\n acc.metadata = {\n ...acc.metadata,\n ...(output.generation.metadata || {}),\n };\n } else if (output?.attachments || output?.metadata) {\n acc.attachments = [...acc.attachments, ...(output.attachments || [])];\n acc.metadata = { ...acc.metadata, ...(output.metadata || {}) };\n }\n }\n\n return;\n }\n }\n\n /**\n * Build final result from accumulator\n * Returns unified content chains from all channels\n */\n getResult(acc: StreamAccumulator): {\n content: IStoredMessageContent;\n trace: {\n events: IGraphTraceEvent[];\n startedAt: number;\n completedAt: number;\n durationMs: number;\n totalEvents: number;\n } | null;\n } {\n // Build chains from accumulated blocks\n const allChains: IContentChain[] = [];\n\n for (const [channel, state] of acc.channels.entries()) {\n // Finalize current block if exists\n if (state.currentBlock) {\n state.contentChain.push(state.currentBlock);\n }\n\n // Create chain if has blocks\n if (state.contentChain.length > 0) {\n allChains.push({\n channel,\n steps: state.contentChain,\n isComplete: true,\n });\n }\n }\n\n const startedAt = acc.traceStartedAt ?? Date.now();\n const completedAt = acc.traceCompletedAt ?? startedAt;\n\n const trace =\n acc.traceEvents.length > 0\n ? {\n events: acc.traceEvents,\n startedAt,\n completedAt,\n durationMs: Math.max(0, completedAt - startedAt),\n totalEvents: acc.traceEvents.length,\n }\n : null;\n\n // Extract text from text channel for backwards compatibility\n const textChain = allChains.find(c => c.channel === \"text\");\n const text = textChain\n ? textChain.steps\n .filter(step => step.type === \"text\")\n .map(step => step.text || \"\")\n .join(\"\")\n : \"\";\n\n this.logger.log(\"📊 [EventProcessor] Final result assembled\", {\n totalChains: allChains.length,\n textChains: allChains.filter(c => c.channel === \"text\").length,\n processingChains: allChains.filter(c => c.channel === \"processing\")\n .length,\n totalSteps: allChains.reduce((sum, c) => sum + c.steps.length, 0),\n textLength: text.length,\n });\n\n return {\n content: {\n contentChains: allChains.length > 0 ? allChains : undefined,\n attachments: acc.attachments,\n metadata: acc.metadata,\n text, // Add extracted text for backwards compatibility\n },\n trace,\n };\n }\n\n private captureTraceEvent(acc: StreamAccumulator, event: any): void {\n // Normalize the event before storing\n const normalized = this.normalizeTraceEvent(event);\n\n if (!normalized) {\n return; // Skip events that can't be normalized (stream chunks, etc.)\n }\n\n acc.traceEvents.push(normalized);\n this.logger.debug(\n `[TRACE] Captured trace event ${normalized.type} for node ${normalized.nodeName} (${acc.traceEvents.length} total)`\n );\n }\n\n private normalizeTraceEvent(event: any): IGraphTraceEvent | null {\n const type = event?.event ?? event?.type;\n if (!type) {\n return null;\n }\n\n const normalizedType = String(type);\n\n // Debug: Log raw event structure for chain events\n if (normalizedType.includes(\"chain\") && !event?.name) {\n this.logger.debug(`[TRACE] Chain event WITHOUT name field:`, {\n type: normalizedType,\n eventKeys: Object.keys(event || {}).join(\", \"),\n hasMetadata: !!event?.metadata,\n metadataKeys: event?.metadata\n ? Object.keys(event.metadata).join(\", \")\n : \"none\",\n });\n }\n\n // Skip streaming chunk events\n if (normalizedType.toLowerCase() === \"stream_chunk\") {\n return null;\n }\n\n const chunkType = event?.data?.chunk?.type || event?.data?.chunk?.event;\n if (\n typeof chunkType === \"string\" &&\n chunkType.toLowerCase() === \"stream_chunk\"\n ) {\n return null;\n }\n\n // Skip on_chat_model_stream events - they generate too many trace entries\n // We only need on_chat_model_end for token tracking\n if (normalizedType === \"on_chat_model_stream\") {\n return null;\n }\n\n const name = event?.name ? String(event.name) : undefined;\n\n // Skip internal LangGraph infrastructure events first\n if (\n name &&\n (name.includes(\"ChannelWrite\") ||\n name.includes(\"ChannelRead\") ||\n name.includes(\"ChannelInvoke\") ||\n name.includes(\"Branch<\"))\n ) {\n this.logger.debug(\n `[TRACE] Skipping infrastructure event: ${name} (type: ${normalizedType})`\n );\n return null;\n }\n\n // Log events that pass the filter to see what's being stored\n if (normalizedType.includes(\"chain\") && name) {\n this.logger.debug(\n `[TRACE] Accepting event: name=\"${name}\", type=\"${normalizedType}\", hasNode=${!!event?.metadata?.langgraph_node}`\n );\n }\n\n // Skip wrapper LangGraph events (they have no langgraph_node in metadata)\n // These are top-level graph events that duplicate info from inner nodes\n const hasLangGraphNode = event?.metadata?.langgraph_node;\n if (!hasLangGraphNode && type.startsWith(\"on_chain\")) {\n return null; // Skip top-level graph wrapper events\n }\n\n // Use unified sanitization from api-call-tracer\n // NOTE: We sanitize metadata and data, but NOT the events array itself\n // to avoid truncating the array to MAX_COLLECTION_LENGTH (20 items)\n const metadata = sanitizeTraceData(event?.metadata) as\n | Record<string, unknown>\n | undefined;\n const data = sanitizeTraceData(event?.data) as\n | Record<string, unknown>\n | undefined;\n\n const timestampSource =\n event?.timestamp ??\n event?.time ??\n event?.data?.timestamp ??\n event?.data?.ts ??\n Date.now();\n\n const timestamp = Number(timestampSource) || Date.now();\n\n const streamChannel =\n typeof event?.metadata?.stream_channel === \"string\"\n ? event.metadata.stream_channel\n : typeof (metadata as any)?.stream_channel === \"string\"\n ? ((metadata as any).stream_channel as string)\n : undefined;\n\n const nodeNameFromMetadata = (metadata as any)?.langgraph_node;\n const fallbackNodeName = (metadata as any)?.node_name;\n\n return {\n type: normalizedType,\n name,\n channel: streamChannel,\n nodeName:\n (typeof nodeNameFromMetadata === \"string\"\n ? nodeNameFromMetadata\n : typeof fallbackNodeName === \"string\"\n ? fallbackNodeName\n : name) || undefined,\n timestamp,\n metadata,\n data,\n };\n }\n}\n","import { Inject, Injectable, Logger, Optional } from \"@nestjs/common\";\nimport { IGraphEngine } from \"../../core\";\nimport { EventProcessor } from \"./event-processor.utils\";\nimport { ConfigService } from \"@nestjs/config\";\n/**\n * Default recursion limit for LangGraph execution.\n * Prevents infinite loops in agent execution.\n * LangGraph default is 25, we use 40 for complex multi-tool workflows.\n */\nconst DEFAULT_RECURSION_LIMIT = 40;\n\n/**\n * Graph engine implemented using LangGraph.js\n */\n\nprocess.setMaxListeners(0);\n@Injectable()\nexport class LangGraphEngine implements IGraphEngine {\n private readonly logger = new Logger(LangGraphEngine.name);\n\n constructor(\n private readonly eventProcessor: EventProcessor,\n @Optional() private readonly configService?: ConfigService\n ) {\n if (!eventProcessor) {\n this.logger.error(\"EventProcessor is undefined/null!\");\n }\n }\n\n /**\n * Method to invoke LangGraph\n */\n async invokeGraph(\n graph: any,\n config: any,\n signal?: AbortSignal\n ): Promise<any> {\n // Add abort signal to configuration\n if (signal) {\n config.signal = signal;\n }\n\n // Invoke the graph with recursion limit to prevent infinite loops\n const recursionLimit = config.recursionLimit ?? DEFAULT_RECURSION_LIMIT;\n const result = await graph.invoke(config.input || {}, {\n ...config,\n recursionLimit,\n });\n\n // Transform the result\n return this.processGraphResult(result);\n }\n\n async streamGraph(\n graph: any,\n config: any,\n onPartial: (chunk: string) => void,\n signal?: AbortSignal\n ): Promise<any> {\n // Create accumulator BEFORE try block to ensure it's available in finally\n const acc = this.eventProcessor.createAccumulator();\n let streamError: Error | null = null;\n\n try {\n if (signal) {\n config.signal = signal;\n }\n //TODO: migrate to v.1\n const recursionLimit = config.recursionLimit ?? DEFAULT_RECURSION_LIMIT;\n const eventStream = await graph.streamEvents(config.input || {}, {\n ...config,\n version: \"v2\", // Important for correct operation\n recursionLimit, // Prevent GraphRecursionError (default is 25)\n });\n\n // Process the event stream\n for await (const event of eventStream) {\n try {\n this.eventProcessor.processEvent(acc, event, onPartial);\n } catch (error) {\n this.logger.warn(\n `[STREAM-EVENT-ERROR] Error processing event: ${error.message}`\n );\n }\n }\n } catch (error) {\n // Capture error but don't throw yet - we need to send trace first\n streamError = error instanceof Error ? error : new Error(String(error));\n this.logger.error(\n `[STREAM-ERROR] Error in streamGraph: ${streamError.message}`\n );\n this.logger.error(`[STREAM-ERROR] Stack trace: ${streamError.stack}`);\n } finally {\n // ALWAYS try to send trace events, even if graph failed\n // This ensures we capture metrics for billing even on errors\n await this.sendTraceFromAccumulator(acc, config, streamError);\n }\n\n // Get final result from accumulator\n const { content, trace } = this.eventProcessor.getResult(acc);\n\n this.logger.debug(\"[STREAM-RESULT] Got result from EventProcessor\", {\n hasContent: !!content,\n hasContext: !!config.configurable?.context,\n hasTrace: !!trace,\n traceEvents: trace?.events?.length || 0,\n hadError: !!streamError,\n });\n\n // Re-throw the error after sending trace\n if (streamError) {\n throw streamError;\n }\n\n return content;\n }\n\n /**\n * Extract trace from accumulator and send to backend webhook\n * Called in finally block to ensure trace is sent even on errors\n */\n private async sendTraceFromAccumulator(\n acc: ReturnType<EventProcessor[\"createAccumulator\"]>,\n config: any,\n error: Error | null\n ): Promise<void> {\n try {\n const { trace } = this.eventProcessor.getResult(acc);\n\n if (trace && trace.events.length > 0 && config.configurable?.context) {\n const context = config.configurable.context;\n\n this.logger.debug(\"[TRACE-WEBHOOK] Sending trace events batch\", {\n messageId: context.messageId,\n totalEvents: trace.totalEvents,\n eventsArrayLength: trace.events.length,\n firstEventType: trace.events[0]?.type,\n hadError: !!error,\n errorMessage: error?.message,\n });\n\n // Send trace events batch to TimeSeries collection\n await this.sendTraceEventsBatch({\n messageId: context.messageId || \"unknown\",\n threadId: context.threadId || \"unknown\",\n userId: context.userId || \"unknown\",\n agentId: context.agentId || \"unknown\",\n companyId: context.companyId || \"unknown\",\n events: trace.events,\n totalEvents: trace.totalEvents,\n startedAt: trace.startedAt,\n completedAt: trace.completedAt || Date.now(),\n durationMs: trace.durationMs || Date.now() - trace.startedAt,\n status: error ? \"error\" : \"success\",\n error: error\n ? { message: error.message, name: error.name }\n : undefined,\n });\n } else {\n this.logger.debug(\"[TRACE-WEBHOOK] Skipping webhook\", {\n hasTrace: !!trace,\n traceEvents: trace?.events?.length || 0,\n hasContext: !!config.configurable?.context,\n contextKeys: config.configurable?.context\n ? Object.keys(config.configurable.context)\n : [],\n hadError: !!error,\n });\n }\n } catch (webhookError) {\n // Don't throw - webhook failure shouldn't mask the original error\n this.logger.error(\n \"[TRACE-WEBHOOK] Failed to send trace in finally block\",\n {\n error:\n webhookError instanceof Error\n ? webhookError.message\n : String(webhookError),\n originalError: error?.message,\n }\n );\n }\n }\n\n /**\n * Send usage metrics to backend webhook\n */\n private async sendMetricsWebhook(payload: {\n messageId: string;\n threadId: string;\n userId: string;\n agentId: string;\n companyId: string;\n metrics: any;\n }): Promise<void> {\n try {\n const backendUrl =\n this.configService?.get<string>(\"API_URL\") || \"http://amelie-service\";\n const internalToken =\n this.configService?.get<string>(\"INTERNAL_API_TOKEN\");\n\n if (!internalToken) {\n this.logger.warn(\n \"[METRICS-WEBHOOK] INTERNAL_API_TOKEN not configured, skipping webhook\"\n );\n return;\n }\n\n const webhookUrl = `${backendUrl}/internal/usage/metrics`;\n\n this.logger.debug(\"[METRICS-WEBHOOK] Sending metrics to backend\", {\n url: webhookUrl,\n messageId: payload.messageId,\n modelCallsCount: payload.metrics.modelCalls.length,\n });\n\n const response = await fetch(webhookUrl, {\n method: \"POST\",\n headers: {\n \"Content-Type\": \"application/json\",\n \"x-internal-token\": internalToken,\n },\n body: JSON.stringify(payload),\n });\n\n if (!response.ok) {\n throw new Error(\n `Webhook failed with status ${response.status}: ${response.statusText}`\n );\n }\n\n this.logger.log(\"✅ Metrics webhook sent successfully\", {\n messageId: payload.messageId,\n modelCallsCount: payload.metrics.modelCalls.length,\n });\n } catch (error) {\n this.logger.error(\"[METRICS-WEBHOOK] Failed to send metrics webhook\", {\n error: error.message,\n messageId: payload.messageId,\n });\n // Don't throw - metrics webhook failure shouldn't break graph execution\n }\n }\n\n private async sendTraceEventsBatch(payload: {\n messageId: string;\n threadId: string;\n userId: string;\n agentId: string;\n companyId: string;\n events: any[];\n totalEvents: number;\n startedAt: number;\n completedAt: number;\n durationMs: number;\n status?: \"success\" | \"error\";\n error?: { message: string; name: string };\n }): Promise<void> {\n try {\n const backendUrl =\n this.configService?.get<string>(\"API_URL\") || \"http://amelie-service\";\n const internalToken =\n this.configService?.get<string>(\"INTERNAL_API_TOKEN\");\n\n if (!internalToken) {\n this.logger.warn(\n \"[TRACE-EVENTS-BATCH] INTERNAL_API_TOKEN not configured, skipping batch webhook\"\n );\n return;\n }\n\n const webhookUrl = `${backendUrl}/internal/usage/trace-events/batch`;\n\n // Transform events to batch format\n const batchPayload = {\n messageId: payload.messageId,\n threadId: payload.threadId,\n userId: payload.userId,\n agentId: payload.agentId,\n companyId: payload.companyId,\n totalEvents: payload.totalEvents,\n startedAt: payload.startedAt,\n completedAt: payload.completedAt,\n durationMs: payload.durationMs,\n status: payload.status || \"success\",\n error: payload.error,\n events: payload.events.map(event => ({\n timestamp: event.timestamp\n ? new Date(event.timestamp).toISOString()\n : new Date().toISOString(),\n meta: {\n messageId: payload.messageId,\n threadId: payload.threadId,\n userId: payload.userId,\n agentId: payload.agentId,\n companyId: payload.companyId,\n type: event.type,\n nodeName: event.nodeName,\n channel: event.channel,\n },\n event: event,\n })),\n };\n\n this.logger.debug(\"[TRACE-EVENTS-BATCH] Sending batch to backend\", {\n url: webhookUrl,\n messageId: payload.messageId,\n eventsCount: batchPayload.events.length,\n });\n\n const response = await fetch(webhookUrl, {\n method: \"POST\",\n headers: {\n \"Content-Type\": \"application/json\",\n \"x-internal-token\": internalToken,\n },\n body: JSON.stringify(batchPayload),\n });\n\n if (!response.ok) {\n const responseText = await response.text();\n throw new Error(\n `Batch webhook failed with status ${response.status}: ${responseText}`\n );\n }\n\n const responseData = await response.json();\n\n this.logger.log(\"✅ Trace events batch sent successfully\", {\n messageId: payload.messageId,\n sent: batchPayload.events.length,\n stored: responseData.stored,\n });\n } catch (error) {\n this.logger.error(\"[TRACE-EVENTS-BATCH] Failed to send batch webhook\", {\n error: error instanceof Error ? error.message : String(error),\n messageId: payload.messageId,\n eventsCount: payload.events.length,\n });\n // Don't throw - batch webhook failure shouldn't break graph execution\n }\n }\n\n /**\n * Process graph execution result\n */\n private processGraphResult(result: any): any {\n return {\n text: result.text,\n attachments: result.attachments,\n metadata: {\n ...result.metadata,\n usageMetrics: result?.usageRecorder,\n },\n };\n }\n}\n","// packages/sdk/src/universal-graph.module.ts\nimport { DynamicModule, Module, Provider } from \"@nestjs/common\";\nimport { ModuleRef, DiscoveryModule, MetadataScanner } from \"@nestjs/core\";\nimport { ConfigModule } from \"@nestjs/config\";\nimport {\n AbstractGraphBuilder,\n IGraphRequestPayload,\n GraphController,\n UniversalGraphService,\n VersionedGraphService,\n VersioningConfig,\n} from \"../graph\";\nimport {\n EventProcessor,\n GraphEngineFactory,\n GraphEngineType,\n LangGraphEngine,\n} from \"../engines\";\nimport { BuilderRegistryService } from \"./builder-registry.service\";\nimport { Registry } from \"prom-client\";\nimport {\n CallbackStore,\n CallbackRegistry,\n CallbackController,\n CallbackTokenGuard,\n SmartCallbackRouter,\n UniversalCallbackService,\n registerFinanceExampleCallback,\n CallbackACL,\n CallbackAuditor,\n CallbackMetrics,\n CallbackRateLimiter,\n IdempotencyManager,\n CallbackPatchService,\n TelegramPatchHandler,\n WebPatchHandler,\n} from \"../callbacks\";\nimport {\n EndpointRegistry,\n UIEndpointsDiscoveryService,\n UIDispatchController,\n} from \"../agent-ui\";\n\n/**\n * Options for UniversalGraphModule configuration\n */\nexport interface UniversalGraphModuleOptions {\n /** Graph engine type */\n engineType?: GraphEngineType;\n /** Versioning configurations for graphs */\n versioning?: VersioningConfig[];\n}\n\n/**\n * Create simple meta-builder for versioning\n */\nfunction createMetaBuilder(\n config: VersioningConfig,\n versionedGraphService: VersionedGraphService,\n moduleRef: ModuleRef,\n callbackRegistry: CallbackRegistry,\n endpointRegistry: EndpointRegistry\n) {\n // Create dynamic class with meaningful name\n const className = `${config.baseGraphType.replace(/\\./g, \"\")}VersionRouter`;\n\n class VersionRouter extends AbstractGraphBuilder<any> {\n readonly version = \"router\" as any; // Version router\n\n // Inject CallbackRegistry and EndpointRegistry manually since we can't use decorators in dynamic classes\n constructor() {\n super();\n // Manually assign the registry instances\n (this as any).callbackRegistry = callbackRegistry;\n (this as any).endpointRegistry = endpointRegistry;\n }\n\n // Override graphType to display base type\n get graphType(): string {\n return config.baseGraphType;\n }\n\n async buildGraph(payload: IGraphRequestPayload): Promise<any> {\n const graphType = payload.graphSettings?.graphType;\n if (!graphType) {\n throw new Error(\"GraphType is required in payload.graphSettings\");\n }\n\n const resolution = await versionedGraphService.resolveVersion(graphType, {\n strict: false,\n });\n\n // Try to get existing instance, fallback to creating new one\n try {\n const versionedBuilder = moduleRef.get(resolution.builderClass, {\n strict: false,\n });\n return versionedBuilder.buildGraph(payload);\n } catch (error) {\n // Fallback: create instance manually\n const versionedBuilder = await moduleRef.create(\n resolution.builderClass\n );\n return versionedBuilder.buildGraph(payload);\n }\n }\n\n async prepareConfig(payload: IGraphRequestPayload): Promise<any> {\n const graphType = payload.graphSettings?.graphType;\n if (!graphType) {\n throw new Error(\"GraphType is required in payload.graphSettings\");\n }\n\n const resolution = await versionedGraphService.resolveVersion(graphType, {\n strict: false,\n });\n\n // Try to get existing instance, fallback to creating new one\n let versionedBuilder;\n try {\n versionedBuilder = moduleRef.get(resolution.builderClass, {\n strict: false,\n });\n } catch (error) {\n versionedBuilder = await moduleRef.create(resolution.builderClass);\n }\n\n const updatedPayload = {\n ...payload,\n graphSettings: {\n ...payload.graphSettings,\n graphType: resolution.fullGraphType,\n },\n };\n\n return versionedBuilder.prepareConfig(updatedPayload);\n }\n }\n\n // Set meaningful name for the class\n Object.defineProperty(VersionRouter, \"name\", { value: className });\n\n return VersionRouter;\n}\n\n@Module({})\nexport class UniversalGraphModule {\n static forRoot(options: UniversalGraphModuleOptions): DynamicModule {\n const providers: Provider[] = [\n // Discovery services from @nestjs/core\n MetadataScanner,\n // Event processor for stream handling\n {\n provide: EventProcessor,\n useFactory: () => new EventProcessor(),\n },\n // Graph engines\n {\n provide: LangGraphEngine,\n useFactory: (eventProcessor: EventProcessor) =>\n new LangGraphEngine(eventProcessor, undefined),\n inject: [EventProcessor],\n },\n BuilderRegistryService,\n GraphEngineFactory,\n VersionedGraphService,\n UniversalGraphService,\n // Callback infrastructure - Redis client (ioredis or ioredis-mock via main.ts interceptor)\n {\n provide: \"REDIS_CLIENT\",\n useFactory: () => {\n const Redis = require(\"ioredis\");\n return new Redis(process.env.REDIS_URL || \"redis://redis:6379\");\n },\n },\n {\n provide: \"PROMETHEUS_REGISTRY\",\n useValue: new Registry(),\n },\n {\n provide: CallbackStore,\n useFactory: (redis: any) => new CallbackStore(redis),\n inject: [\"REDIS_CLIENT\"],\n },\n {\n provide: CallbackRegistry,\n useClass: CallbackRegistry,\n },\n EndpointRegistry,\n UIEndpointsDiscoveryService,\n {\n provide: CallbackACL,\n useClass: CallbackACL,\n },\n {\n provide: CallbackAuditor,\n useClass: CallbackAuditor,\n },\n {\n provide: CallbackMetrics,\n useFactory: (registry: Registry) => new CallbackMetrics(registry),\n inject: [\"PROMETHEUS_REGISTRY\"],\n },\n {\n provide: CallbackRateLimiter,\n useFactory: (redis: any) => new CallbackRateLimiter(redis),\n inject: [\"REDIS_CLIENT\"],\n },\n {\n provide: IdempotencyManager,\n useFactory: (redis: any) => new IdempotencyManager(redis),\n inject: [\"REDIS_CLIENT\"],\n },\n {\n provide: TelegramPatchHandler,\n useClass: TelegramPatchHandler,\n },\n {\n provide: WebPatchHandler,\n useClass: WebPatchHandler,\n },\n {\n provide: CallbackPatchService,\n useFactory: (telegram: TelegramPatchHandler, web: WebPatchHandler) =>\n new CallbackPatchService(telegram, web),\n inject: [TelegramPatchHandler, WebPatchHandler],\n },\n {\n provide: SmartCallbackRouter,\n useFactory: (\n registry: CallbackRegistry,\n store: CallbackStore,\n acl: CallbackACL,\n auditor: CallbackAuditor,\n metrics: CallbackMetrics,\n rateLimiter: CallbackRateLimiter,\n idempotencyManager: IdempotencyManager,\n patchService: CallbackPatchService\n ) =>\n new SmartCallbackRouter(\n registry,\n store,\n acl,\n auditor,\n metrics,\n rateLimiter,\n idempotencyManager,\n patchService\n ),\n inject: [\n CallbackRegistry,\n CallbackStore,\n CallbackACL,\n CallbackAuditor,\n CallbackMetrics,\n CallbackRateLimiter,\n IdempotencyManager,\n CallbackPatchService,\n ],\n },\n {\n provide: UniversalCallbackService,\n useFactory: (store: CallbackStore, router: SmartCallbackRouter) =>\n new UniversalCallbackService(store, router),\n inject: [CallbackStore, SmartCallbackRouter],\n },\n {\n provide: CallbackTokenGuard,\n useFactory: (store: CallbackStore, acl: CallbackACL) =>\n new CallbackTokenGuard(store, acl),\n inject: [CallbackStore, CallbackACL],\n },\n {\n provide: \"CALLBACK_EXAMPLE_REGISTRATION\",\n useFactory: (registry: CallbackRegistry) => {\n registerFinanceExampleCallback(registry);\n },\n inject: [CallbackRegistry],\n },\n {\n provide: \"GRAPH_ENGINE\",\n useFactory: (langGraphEngine: LangGraphEngine) => langGraphEngine,\n inject: [LangGraphEngine],\n },\n {\n provide: \"GRAPH_BUILDERS\",\n useFactory: (registry: BuilderRegistryService) => {\n return registry.getBuilders(); // Get builders from registry\n },\n inject: [BuilderRegistryService],\n },\n {\n provide: \"GRAPH_SERVICE\",\n useExisting: UniversalGraphService,\n },\n {\n provide: \"VERSIONING_CONFIGS\",\n useValue: options.versioning || [],\n },\n // Automatic versioning initialization (synchronous)\n {\n provide: \"VERSIONING_INITIALIZER\",\n useFactory: (\n builderRegistry: BuilderRegistryService,\n versionedGraphService: VersionedGraphService,\n configs: VersioningConfig[],\n callbackRegistry: CallbackRegistry,\n moduleRef: ModuleRef,\n endpointRegistry: EndpointRegistry\n ) => {\n console.log(\n \"🔧 VERSIONING_INITIALIZER running with configs:\",\n configs?.length || 0\n );\n console.log(\"🔧 ModuleRef available:\", !!moduleRef);\n console.log(\"🔧 BuilderRegistry available:\", !!builderRegistry);\n\n // Deferred initialization - register configurations\n configs.forEach(config =>\n versionedGraphService.registerVersioning(config)\n );\n\n // Create and register version routers synchronously\n configs.forEach(config => {\n if (moduleRef) {\n const VersionRouterClass = createMetaBuilder(\n config,\n versionedGraphService,\n moduleRef,\n callbackRegistry,\n endpointRegistry\n );\n const versionRouter = new VersionRouterClass();\n console.log(\n \"🔧 Registering VersionRouter for\",\n config.baseGraphType\n );\n builderRegistry.registerBuilder(versionRouter);\n } else {\n // Fallback: create simple meta-builder without ModuleRef dependency\n class SimpleVersionRouter extends AbstractGraphBuilder<any> {\n readonly version = \"router\" as any;\n\n constructor() {\n super();\n // Manually assign the registry instances\n (this as any).callbackRegistry = callbackRegistry;\n (this as any).endpointRegistry = endpointRegistry;\n }\n\n get graphType(): string {\n return config.baseGraphType;\n }\n\n async buildGraph(payload: any): Promise<any> {\n throw new Error(\n \"ModuleRef not available - cannot build graph\"\n );\n }\n\n async prepareConfig(payload: any): Promise<any> {\n throw new Error(\n \"ModuleRef not available - cannot prepare config\"\n );\n }\n }\n\n const simpleRouter = new SimpleVersionRouter();\n console.log(\n \"🔧 Registering SimpleRouter for\",\n config.baseGraphType,\n \"(no ModuleRef)\"\n );\n builderRegistry.registerBuilder(simpleRouter);\n }\n });\n\n return true;\n },\n inject: [\n BuilderRegistryService,\n VersionedGraphService,\n \"VERSIONING_CONFIGS\",\n CallbackRegistry,\n ModuleRef,\n EndpointRegistry,\n ],\n },\n ];\n\n return {\n global: true,\n module: UniversalGraphModule,\n imports: [ConfigModule.forRoot({ isGlobal: true }), DiscoveryModule],\n controllers: [GraphController, CallbackController, UIDispatchController],\n providers,\n exports: [\n \"GRAPH_SERVICE\",\n \"GRAPH_ENGINE\",\n UniversalGraphService,\n BuilderRegistryService,\n VersionedGraphService,\n UniversalCallbackService,\n CallbackStore,\n CallbackRegistry,\n EndpointRegistry,\n UIEndpointsDiscoveryService,\n ],\n };\n }\n}\n","// packages/sdk/src/index.ts\n\nexport * from \"./core\";\nexport * from \"./callbacks\";\nexport * from \"./graph\";\nexport * from \"./engines\";\nexport * from \"./agent-ui\";\nexport * from \"./tools\";\nexport * from \"./messages\";\nexport * from \"./models\";\nexport * from \"./retriever\";\nexport * from \"./utils\";\nexport * from \"./service-discovery\";\n\n// ===== LEGACY (for backward compatibility) =====\n// Export aliases for core components\nexport { GraphController as BaseGraphServiceController } from \"./graph/graph.controller\";\nexport { UniversalGraphModule as BaseGraphServiceModule } from \"./core/universal-graph.module\";\n","import { DynamicStructuredTool, StructuredTool } from \"@langchain/core/tools\";\nimport { RunnableConfig } from \"@langchain/core/runnables\";\nimport { z } from \"zod\";\nimport axios from \"axios\";\nimport { Logger } from \"@nestjs/common\";\nimport { zodToJsonSchema } from \"zod-to-json-schema\";\nimport { McpTool } from \"./mcp.interfaces\";\nimport { IGraphConfigurable } from \"../graph/graph-types\";\n\ninterface ToolExecutionRequest {\n name: string;\n arguments: Record<string, any>;\n context?: {\n agentId?: string;\n userId?: string;\n threadId?: string;\n };\n}\n\ninterface ToolExecutionResult {\n success: boolean;\n result?: any;\n error?: string;\n}\n\n/**\n * Converts MCP tools to LangChain DynamicStructuredTools with proper schema support\n */\ntype LangChainStructuredTool = StructuredTool<any, any, any, string>;\n\nexport class McpConverter {\n private readonly logger = new Logger(McpConverter.name);\n private readonly mcpRuntimeUrl: string;\n\n constructor(mcpRuntimeUrl: string = \"http://localhost:3004\") {\n this.mcpRuntimeUrl = mcpRuntimeUrl;\n this.logger.log(\n `🔧 McpConverter initialized with SDK version 0.1.8 (manual jsonSchemaToZod)`\n );\n }\n\n /**\n * Convert JSON Schema to Zod schema manually\n * This creates a standard Zod schema that zodToJsonSchema can convert back properly\n */\n private jsonSchemaToZod(jsonSchema: any): z.ZodTypeAny {\n if (!jsonSchema || typeof jsonSchema !== \"object\") {\n return z.any();\n }\n\n try {\n // Handle object type with properties\n if (jsonSchema.type === \"object\" && jsonSchema.properties) {\n const shape: Record<string, z.ZodTypeAny> = {};\n\n for (const [key, propSchema] of Object.entries(jsonSchema.properties)) {\n const prop = propSchema as any;\n let zodProp: z.ZodTypeAny;\n\n // Convert property based on type\n switch (prop.type) {\n case \"string\":\n zodProp = z.string();\n break;\n case \"number\":\n zodProp = z.number();\n break;\n case \"boolean\":\n zodProp = z.boolean();\n break;\n case \"integer\":\n zodProp = z.number().int();\n break;\n case \"array\":\n zodProp = z.array(z.any());\n break;\n case \"object\":\n zodProp = z.record(z.any());\n break;\n default:\n zodProp = z.any();\n }\n\n // Add description if present\n if (prop.description) {\n zodProp = zodProp.describe(prop.description);\n }\n\n // Make optional if not in required array\n if (!jsonSchema.required?.includes(key)) {\n zodProp = zodProp.optional();\n }\n\n shape[key] = zodProp;\n }\n\n return z.object(shape);\n }\n\n // Fallback to z.any() for other types\n this.logger.warn(\n `Unsupported JSON Schema structure, falling back to z.any()`\n );\n return z.any();\n } catch (error) {\n this.logger.warn(\n `Failed to convert JSON Schema, falling back to z.any(): ${error}`\n );\n return z.any();\n }\n }\n\n /**\n * Convert a single MCP tool to LangChain DynamicStructuredTool\n */\n convertTool(mcpTool: McpTool): LangChainStructuredTool {\n const logger = this.logger;\n const mcpRuntimeUrl = this.mcpRuntimeUrl;\n\n // Enhance tool description with parameter descriptions\n // This is a workaround because zodToJsonSchema doesn't preserve .describe() properly\n let enhancedDescription = mcpTool.description;\n\n if (mcpTool.inputSchema?.properties) {\n const paramDescriptions: string[] = [];\n for (const [key, propSchema] of Object.entries(\n mcpTool.inputSchema.properties\n )) {\n const prop = propSchema as any;\n if (prop.description) {\n const isRequired = mcpTool.inputSchema.required?.includes(key);\n paramDescriptions.push(\n `- ${key}${isRequired ? \" (required)\" : \"\"}: ${prop.description}`\n );\n }\n }\n\n if (paramDescriptions.length > 0) {\n enhancedDescription = `${mcpTool.description}\\n\\nParameters:\\n${paramDescriptions.join(\"\\n\")}`;\n }\n }\n\n const schema = this.jsonSchemaToZod(mcpTool.inputSchema);\n\n logger.debug(\n `🔧 [${mcpTool.name}] Original schema:`,\n JSON.stringify(mcpTool.inputSchema, null, 2)\n );\n logger.debug(\n `🔧 [${mcpTool.name}] Using schema type: ${(schema as any)?._def?.typeName ?? \"unknown\"}`\n );\n\n // Log converted Zod schema details to verify descriptions are preserved\n if (\n (schema as any)?._def?.shape &&\n typeof (schema as any)._def.shape === \"function\"\n ) {\n try {\n const shape = (schema as any)._def.shape();\n logger.debug(\n `🔧 [${mcpTool.name}] Converted Zod schema shape:`,\n JSON.stringify(\n Object.entries(shape).reduce(\n (acc, [key, val]: [string, any]) => {\n acc[key] = {\n type: val?._def?.typeName,\n description: val?._def?.description,\n optional: val?._def?.typeName === \"ZodOptional\",\n };\n return acc;\n },\n {} as Record<string, any>\n ),\n null,\n 2\n )\n );\n } catch (error) {\n logger.debug(\n `🔧 [${mcpTool.name}] Could not extract Zod schema shape: ${error}`\n );\n }\n }\n\n // CRITICAL CHECK: Convert Zod back to JSON Schema to see what LangChain will send to LLM\n try {\n const convertedJsonSchema = zodToJsonSchema(schema);\n logger.warn(\n `🔧 [${mcpTool.name}] JSON Schema that LangChain will use:`,\n JSON.stringify(convertedJsonSchema, null, 2)\n );\n } catch (error) {\n logger.warn(\n `🔧 [${mcpTool.name}] Could not convert Zod to JSON Schema: ${error}`\n );\n }\n\n return new DynamicStructuredTool<\n z.ZodTypeAny,\n Record<string, any>,\n any,\n string\n >({\n name: mcpTool.name,\n description: enhancedDescription,\n schema,\n func: async (\n input: Record<string, any>,\n _runManager,\n config?: RunnableConfig\n ): Promise<string> => {\n logger.log(`🔧 [${mcpTool.name}] LLM INPUT: ${JSON.stringify(input)}`);\n\n // Extract context from RunnableConfig.configurable\n const configurable = config?.configurable as\n | IGraphConfigurable\n | undefined;\n const context = {\n agentId: configurable?.agentId,\n userId: configurable?.userId,\n threadId: configurable?.thread_id,\n };\n\n logger.debug(\n `🔧 [${mcpTool.name}] Execution context: ${JSON.stringify(context)}`\n );\n\n try {\n const request: ToolExecutionRequest = {\n name: mcpTool.name,\n arguments: input ?? {},\n context,\n };\n\n logger.log(`🔧 [${mcpTool.name}] Calling MCP Runtime...`);\n\n const response = await axios.post(\n `${mcpRuntimeUrl}/tools/execute`,\n request,\n { timeout: 30000 }\n );\n\n const result: ToolExecutionResult = response.data;\n logger.log(\n `🔧 [${mcpTool.name}] MCP Runtime response: success=${result.success}`\n );\n\n if (!result.success) {\n const errorMessage = result.error || \"Tool execution failed\";\n logger.error(\n `🔧 [${mcpTool.name}] MCP Runtime error: ${errorMessage}`\n );\n throw new Error(errorMessage);\n }\n\n const output =\n typeof result.result === \"string\"\n ? result.result\n : JSON.stringify(result.result, null, 2);\n\n logger.log(\n `🔧 [${mcpTool.name}] TOOL OUTPUT: ${output.length > 200 ? output.substring(0, 200) + \"...\" : output}`\n );\n\n return output;\n } catch (error) {\n logger.error(\n `🔧 [${mcpTool.name}] Exception during execution`,\n error\n );\n if (axios.isAxiosError(error)) {\n throw new Error(`MCP Runtime error: ${error.message}`);\n }\n throw error instanceof Error ? error : new Error(String(error));\n }\n },\n }) as unknown as LangChainStructuredTool;\n }\n\n /**\n * Convert multiple MCP tools to LangChain tools\n */\n async convertTools(mcpTools: McpTool[]): Promise<LangChainStructuredTool[]> {\n return mcpTools.map(tool => this.convertTool(tool));\n }\n\n /**\n * Fetch and convert tools from MCP Runtime\n */\n async fetchAndConvertTools(\n filter?: string\n ): Promise<LangChainStructuredTool[]> {\n try {\n const params = filter ? { filter } : {};\n const response = await axios.get(`${this.mcpRuntimeUrl}/tools/list`, {\n params,\n timeout: 5000,\n });\n\n const mcpTools: McpTool[] = response.data;\n this.logger.log(`Fetched ${mcpTools.length} tools from MCP Runtime`);\n\n return this.convertTools(mcpTools);\n } catch (error) {\n this.logger.error(\"Failed to fetch MCP tools:\", error);\n throw new Error(`Cannot connect to MCP Runtime at ${this.mcpRuntimeUrl}`);\n }\n }\n\n /**\n * Health check for MCP Runtime\n */\n async healthCheck(): Promise<boolean> {\n try {\n const response = await axios.get(\n `${this.mcpRuntimeUrl}/tools/health/check`,\n { timeout: 5000 }\n );\n return response.data.status === \"ok\";\n } catch {\n return false;\n }\n }\n}\n","import { StructuredTool } from \"@langchain/core/tools\";\nimport { Logger } from \"@nestjs/common\";\nimport axios from \"axios\";\nimport { McpConverter } from \"./mcp-converter\";\nimport { McpTool, McpRuntimeClient } from \"./mcp.interfaces\";\nimport { IAgentToolConfig } from \"./config\";\n\n/**\n * Utility for fetching and filtering MCP tools from runtime\n * Provides efficient tool filtering and conversion to LangChain tools\n */\nexport class McpToolFilter {\n private readonly logger = new Logger(McpToolFilter.name);\n private readonly mcpConverter: McpConverter;\n\n constructor(\n private readonly mcpRuntimeUrl: string = process.env.MCP_RUNTIME_URL ||\n \"http://localhost:3004\"\n ) {\n this.mcpConverter = new McpConverter(this.mcpRuntimeUrl);\n }\n\n /**\n * Fetch available tools from MCP runtime with dynamic schema generation\n * @param toolsConfig Array of tool configurations with dynamic config\n * @returns Array of LangChain Tool instances with dynamic schemas\n */\n async getFilteredTools(\n toolsConfig: IAgentToolConfig[] = []\n ): Promise<StructuredTool[]> {\n this.logger.debug(\n `[DEBUG] Getting filtered tools with dynamic schemas. Config: ${JSON.stringify(toolsConfig)}`\n );\n this.logger.debug(`[DEBUG] MCP Runtime URL: ${this.mcpRuntimeUrl}`);\n\n if (toolsConfig.length === 0) {\n this.logger.debug(\"No tools configured, returning empty array\");\n return [];\n }\n\n try {\n // Call POST /tools/schemas with full configuration for dynamic schema generation\n this.logger.debug(\n `[DEBUG] Making HTTP POST request to: ${this.mcpRuntimeUrl}/tools/schemas`\n );\n this.logger.debug(`[DEBUG] Request body: ${JSON.stringify(toolsConfig)}`);\n\n const response = await axios.post(\n `${this.mcpRuntimeUrl}/tools/schemas`,\n { tools: toolsConfig },\n {\n timeout: 5000,\n headers: {\n \"Content-Type\": \"application/json\",\n },\n }\n );\n\n this.logger.debug(\n `[DEBUG] HTTP response status: ${response.status}, data length: ${Array.isArray(response.data) ? response.data.length : \"not array\"}`\n );\n\n const dynamicTools: McpTool[] = Array.isArray(response.data)\n ? response.data\n : [];\n this.logger.debug(\n `Retrieved ${dynamicTools.length} dynamic tool schemas from MCP Runtime`\n );\n\n // Create a simple MCP client for tool execution\n // Note: context is passed via McpConverter which extracts it from RunnableConfig\n const mcpClient: McpRuntimeClient = {\n getTools: async () => dynamicTools,\n executeTool: async (name: string, args: any, context?: any) => {\n this.logger.debug(`[DEBUG] Executing tool ${name} with args:`, args);\n const response = await axios.post(\n `${this.mcpRuntimeUrl}/tools/execute`,\n {\n name,\n arguments: args || {},\n context,\n }\n );\n return response.data;\n },\n isHealthy: async () => true,\n };\n\n // Convert to LangChain tools\n this.logger.log(\n `🚀 [McpToolFilter] Converting ${dynamicTools.length} dynamic tools using McpConverter`\n );\n const tools = await this.mcpConverter.convertTools(dynamicTools);\n this.logger.log(\n `🚀 [McpToolFilter] Converted tools: ${tools.map(t => t.name).join(\", \")}`\n );\n\n this.logger.log(\n `Configured ${tools.length} tools with dynamic schemas from MCP runtime: ${dynamicTools.map(t => t.name).join(\", \")}`\n );\n return tools;\n } catch (error) {\n const errorMessage =\n error instanceof Error ? error.message : String(error);\n this.logger.warn(\n `[DEBUG] Failed to fetch dynamic tool schemas from MCP runtime (${this.mcpRuntimeUrl}): ${errorMessage}`\n );\n this.logger.warn(`[DEBUG] Error details:`, {\n error,\n stack: error instanceof Error ? error.stack : \"no stack\",\n });\n return [];\n }\n }\n\n /**\n * Get all available tools without filtering\n * @returns Array of LangChain Tool instances\n */\n async getAllTools(): Promise<StructuredTool[]> {\n try {\n const response = await axios.get(`${this.mcpRuntimeUrl}/tools/list`, {\n timeout: 5000,\n });\n\n const allTools: McpTool[] = Array.isArray(response.data)\n ? response.data\n : [];\n this.logger.debug(`Retrieved ${allTools.length} total MCP tools`);\n\n const mcpClient: McpRuntimeClient = {\n getTools: async () => allTools,\n executeTool: async (name: string, args: any, context?: any) => {\n const response = await axios.post(\n `${this.mcpRuntimeUrl}/tools/execute`,\n {\n name,\n arguments: args || {},\n context,\n }\n );\n return response.data;\n },\n isHealthy: async () => true,\n };\n\n const tools = await this.mcpConverter.convertTools(allTools);\n this.logger.log(`Configured ${tools.length} tools from MCP runtime`);\n return tools;\n } catch (error) {\n const errorMessage =\n error instanceof Error ? error.message : String(error);\n this.logger.warn(\n `Failed to fetch all tools from MCP runtime (${this.mcpRuntimeUrl}): ${errorMessage}`\n );\n return [];\n }\n }\n\n /**\n * Check if MCP runtime is healthy\n * @returns boolean indicating health status\n */\n async isHealthy(): Promise<boolean> {\n try {\n const response = await axios.get(\n `${this.mcpRuntimeUrl}/tools/health/check`,\n {\n timeout: 3000,\n }\n );\n return response.data.status === \"ok\";\n } catch (error) {\n this.logger.warn(\n `MCP runtime health check failed: ${error instanceof Error ? error.message : String(error)}`\n );\n return false;\n }\n }\n\n /**\n * Get available tool names from MCP runtime\n * @returns Array of tool names\n */\n async getAvailableToolNames(): Promise<string[]> {\n try {\n const response = await axios.get(`${this.mcpRuntimeUrl}/tools/list`, {\n timeout: 5000,\n });\n\n const tools: McpTool[] = Array.isArray(response.data)\n ? response.data\n : [];\n return tools.map(tool => tool.name);\n } catch (error) {\n this.logger.warn(\n `Failed to fetch tool names: ${error instanceof Error ? error.message : String(error)}`\n );\n return [];\n }\n }\n}\n","import { Injectable, Logger } from \"@nestjs/common\";\nimport axios, { AxiosInstance } from \"axios\";\nimport {\n McpTool,\n ToolExecutionResult,\n McpRuntimeClient,\n} from \"./mcp.interfaces\";\nimport {\n CallbackManager,\n parseCallbackConfigArg,\n} from \"@langchain/core/callbacks/manager\";\nimport { RunnableConfig } from \"@langchain/core/runnables\";\n\n/**\n * HTTP client implementation for MCP Runtime\n * Provides communication with MCP Runtime service via REST API\n */\n@Injectable()\nexport class McpRuntimeHttpClient implements McpRuntimeClient {\n private readonly logger = new Logger(McpRuntimeHttpClient.name);\n private readonly httpClient: AxiosInstance;\n private readonly baseUrl: string;\n\n constructor(mcpRuntimeUrl?: string) {\n this.baseUrl =\n mcpRuntimeUrl || process.env.MCP_RUNTIME_URL || \"http://localhost:3004\";\n\n // Use configurable timeout - tools like call_agent can take a very long time (up to 15 minutes)\n const timeout = Number(process.env.MCP_RUNTIME_TIMEOUT || 900000); // Default: 15 minutes\n\n this.httpClient = axios.create({\n baseURL: this.baseUrl,\n timeout,\n });\n\n this.logger.log(\n `MCP Runtime HTTP Client initialized with URL: ${this.baseUrl}, timeout: ${timeout}ms`\n );\n }\n\n /**\n * Get all available tools from MCP Runtime\n */\n async getTools(): Promise<McpTool[]> {\n try {\n this.logger.debug(\"Fetching available tools from MCP runtime\");\n const response = await this.httpClient.get(\"/tools/list\");\n // MCP Runtime returns array of tools directly, not in wrapper object\n const tools = Array.isArray(response.data) ? response.data : [];\n this.logger.log(`Retrieved ${tools.length} tools from MCP runtime`);\n return tools;\n } catch (error) {\n this.logger.error(\"Failed to fetch tools from MCP runtime:\", error);\n throw new Error(`Failed to fetch tools: ${error.message}`);\n }\n }\n\n /**\n * Execute a tool by name with given arguments\n */\n async executeTool(\n name: string,\n args: any,\n context?: any\n ): Promise<ToolExecutionResult> {\n try {\n this.logger.debug(`Executing tool: ${name} with args:`, args);\n\n const payload: any = {\n name,\n arguments: args || {},\n };\n\n // Add context if provided\n if (context) {\n payload.context = context;\n }\n\n const response = await this.httpClient.post(\"/tools/execute\", payload);\n\n this.logger.log(`Tool ${name} executed successfully`);\n return response.data;\n } catch (error) {\n this.logger.error(`Failed to execute tool ${name}:`, error);\n\n // Handle axios errors\n if (error.response) {\n return {\n success: false,\n error:\n error.response.data.message ||\n error.response.data.error ||\n \"Tool execution failed\",\n };\n }\n\n return {\n success: false,\n error: error.message || \"Unknown error occurred\",\n };\n }\n }\n\n /**\n * Get tool execution statistics from MCP Runtime\n */\n async getToolStats() {\n try {\n const response = await this.httpClient.get(\"/tools/stats\");\n return response.data;\n } catch (error) {\n this.logger.error(\"Failed to fetch tool stats:\", error);\n return null;\n }\n }\n\n /**\n * Health check for MCP Runtime service\n */\n async isHealthy(): Promise<boolean> {\n try {\n const response = await this.httpClient.get(\"/\", { timeout: 5000 });\n return response.status === 200;\n } catch (error) {\n this.logger.warn(\"MCP Runtime health check failed:\", error.message);\n return false;\n }\n }\n\n /**\n * Execute tool with LangChain event emission\n * @param toolCallId - Tool call ID from LLM\n * @param toolName - Tool name\n * @param enrichedArgs - Merged arguments (toolConfig + LLM args)\n * @param executionContext - Execution context (userId, agentId, etc.)\n * @param config - RunnableConfig with callbacks\n * @returns Tool execution result with content\n */\n async executeToolWithEvents(\n toolCallId: string,\n toolName: string,\n enrichedArgs: Record<string, any>,\n executionContext: Record<string, any>,\n config?: RunnableConfig\n ): Promise<{ content: string; success: boolean }> {\n // Parse callback configuration\n const parsedConfig = parseCallbackConfigArg(config);\n const callbackManager = CallbackManager.configure(parsedConfig.callbacks);\n\n let runManager;\n\n try {\n // Emit on_tool_start event\n runManager = await callbackManager?.handleToolStart(\n {\n name: toolName,\n lc: 1,\n type: \"not_implemented\",\n id: [\"langchain\", \"tools\", \"mcp\", toolName],\n },\n JSON.stringify(enrichedArgs),\n parsedConfig.runId,\n undefined,\n parsedConfig.tags,\n parsedConfig.metadata,\n toolName\n );\n\n // Execute tool\n const result = await this.executeTool(\n toolName,\n enrichedArgs,\n executionContext\n );\n\n // Create content\n const content = result.success\n ? JSON.stringify(result)\n : result.error || JSON.stringify(result);\n\n // Emit on_tool_end event\n await runManager?.handleToolEnd(content);\n\n return {\n content,\n success: result.success,\n };\n } catch (error) {\n this.logger.error(`Error executing tool ${toolName}:`, error);\n\n // Emit on_tool_error event\n await runManager?.handleToolError(error);\n\n // Return error result\n const errorContent = JSON.stringify({\n success: false,\n error: error instanceof Error ? error.message : \"Tool execution failed\",\n });\n\n return {\n content: errorContent,\n success: false,\n };\n }\n }\n}\n","/**\n * Model-related enums\n */\n\nexport enum ModelProvider {\n FLUTCH = \"flutch\",\n FLUTCH_MISTRAL = \"flutch-mistral\",\n FLUTCH_OPENAI = \"flutch-openai\",\n FLUTCH_ANTHROPIC = \"flutch-anthropic\",\n MISTRAL = \"mistral\",\n OPENAI = \"openai\",\n ANTHROPIC = \"anthropic\",\n AWS = \"aws\",\n COHERE = \"cohere\",\n VOYAGEAI = \"voyageai\",\n}\n\nexport enum ModelType {\n CHAT = \"chat\", // LLM for text generation\n RERANK = \"rerank\", // Cross-encoder for document reranking\n EMBEDDING = \"embedding\", // Models for vectorization\n IMAGE = \"image\", // Models for image generation\n SPEECH = \"speech\", // Models for TTS/STT\n}\n\nexport enum ChatFeature {\n STREAMING = \"streaming\",\n TOOLS = \"tools\",\n VISION = \"vision\",\n FUNCTION_CALLING = \"function_calling\",\n JSON_MODE = \"json_mode\",\n}\n","import { BaseDocumentCompressor } from \"@langchain/core/retrievers/document_compressors\";\nimport { Document } from \"@langchain/core/documents\";\n\nexport interface VoyageAIRerankConfig {\n apiKey?: string;\n model?: string;\n topN?: number;\n truncation?: boolean;\n}\n\n/**\n * VoyageAI Reranker implementation\n * Note: This is a placeholder implementation until official LangChain.js support is available\n * VoyageAI currently only has Python SDK support for reranking\n */\nexport class VoyageAIRerank extends BaseDocumentCompressor {\n private apiKey: string;\n private model: string;\n private topN: number;\n private truncation: boolean;\n private baseUrl = \"https://api.voyageai.com/v1/rerank\";\n\n constructor(config: VoyageAIRerankConfig) {\n super();\n this.apiKey = config.apiKey || process.env.VOYAGEAI_API_KEY || \"\";\n this.model = config.model || \"rerank-2\";\n this.topN = config.topN || 20;\n this.truncation = config.truncation ?? true;\n\n if (!this.apiKey) {\n throw new Error(\n \"VoyageAI API key is required. Set VOYAGEAI_API_KEY environment variable or pass apiKey in config.\"\n );\n }\n }\n\n async compressDocuments(\n documents: Document[],\n query: string,\n callbacks?: any\n ): Promise<Document[]> {\n if (documents.length === 0) {\n return [];\n }\n\n const texts = documents.map(doc => doc.pageContent);\n\n try {\n const response = await fetch(this.baseUrl, {\n method: \"POST\",\n headers: {\n \"Content-Type\": \"application/json\",\n Authorization: `Bearer ${this.apiKey}`,\n },\n body: JSON.stringify({\n model: this.model,\n query: query,\n documents: texts,\n top_k: Math.min(this.topN, documents.length),\n truncation: this.truncation,\n }),\n });\n\n if (!response.ok) {\n const error = await response.text();\n throw new Error(`VoyageAI API error: ${response.status} - ${error}`);\n }\n\n const data = await response.json();\n\n // VoyageAI returns results with relevance scores\n // Sort by relevance and return top N documents\n const rerankedIndices = data.results\n .sort((a: any, b: any) => b.relevance_score - a.relevance_score)\n .slice(0, this.topN)\n .map((result: any) => result.index);\n\n return rerankedIndices.map((index: number) => documents[index]);\n } catch (error) {\n console.error(\"Error calling VoyageAI rerank API:\", error);\n // Fallback: return original documents if reranking fails\n return documents.slice(0, this.topN);\n }\n }\n}\n","import { BaseChatModel } from \"@langchain/core/language_models/chat_models\";\nimport { BaseDocumentCompressor } from \"@langchain/core/retrievers/document_compressors\";\nimport { Embeddings } from \"@langchain/core/embeddings\";\nimport { ChatOpenAI } from \"@langchain/openai\";\nimport { AzureChatOpenAI } from \"@langchain/azure-openai\";\nimport { Logger } from \"@nestjs/common\";\nimport { StructuredTool, DynamicStructuredTool } from \"@langchain/core/tools\";\nimport { Runnable } from \"@langchain/core/runnables\";\nimport { BaseLanguageModelInput } from \"@langchain/core/language_models/base\";\nimport { AIMessageChunk } from \"@langchain/core/messages\";\nimport { BaseChatModelCallOptions } from \"@langchain/core/language_models/chat_models\";\nimport { McpToolFilter } from \"../tools/mcp-tool-filter\";\nimport { IAgentToolConfig } from \"../tools/config\";\nimport { createHash } from \"crypto\";\n\n// WORKAROUND: Temporary monkey patch for GPT-5 support in LangChain\n// LangChain doesn't yet recognize GPT-5 as a reasoning model and has issues:\n// 1. Uses max_tokens instead of max_completion_tokens\n// 2. Doesn't set mandatory temperature = 1 for GPT-5 models\n// TODO: Remove this patch after official GPT-5 support in LangChain\nfunction patchChatOpenAIForGPT5() {\n const logger = new Logger(\"ModelInitializer.Patch\");\n\n logger.warn(\n `TEMPORARY WORKAROUND: Applying monkey patch for GPT-5 support in LangChain. Fixes: max_tokens->max_completion_tokens, temperature->1. This patch will be removed once LangChain officially supports GPT-5 models.`\n );\n\n // Patch both ChatOpenAI and AzureChatOpenAI\n const prototypes = [\n ChatOpenAI.prototype as any,\n AzureChatOpenAI.prototype as any,\n ];\n\n prototypes.forEach((prototype, index) => {\n const modelName = index === 0 ? \"ChatOpenAI\" : \"AzureChatOpenAI\";\n logger.warn(`Patching ${modelName} for GPT-5 support`);\n\n // Patch the invocationParams method that prepares parameters for the API\n const originalInvocationParams = prototype.invocationParams;\n\n if (originalInvocationParams) {\n prototype.invocationParams = function (options: any) {\n const params = originalInvocationParams.call(this, options);\n\n // Note: GPT-5 patch applied - params will be converted\n\n // If this is a GPT-5 model, apply all necessary patches\n if (\n params.model &&\n (params.model.includes(\"gpt-5\") ||\n /^gpt-(5|6|7|8|9)/.test(params.model))\n ) {\n // 1. Convert max_tokens to max_completion_tokens\n if (params.max_tokens !== undefined) {\n params.max_completion_tokens = params.max_tokens;\n delete params.max_tokens;\n }\n\n // Also check max_output_tokens (may be used in Responses API)\n if (\n params.max_output_tokens !== undefined &&\n !params.max_completion_tokens\n ) {\n params.max_completion_tokens = params.max_output_tokens;\n delete params.max_output_tokens;\n }\n\n // 2. Force set temperature = 1 for GPT-5 models\n // GPT-5 models only support temperature = 1 (default value)\n const originalTemperature = params.temperature;\n if (params.temperature !== undefined && params.temperature !== 1) {\n params.temperature = 1;\n logger.debug(\n `Fixed temperature for ${params.model}: ${originalTemperature} -> 1 (GPT-5 models only support temperature=1)`\n );\n }\n\n // Parameters converted for GPT-5 compatibility\n }\n\n // Add stream_options to get usage information from Azure OpenAI\n if (\n params.model &&\n (params.model.includes(\"gpt-5\") ||\n /^gpt-(5|6|7|8|9)/.test(params.model))\n ) {\n // Enable usage tracking for streaming responses\n if (!params.stream_options) {\n params.stream_options = { include_usage: true };\n logger.warn(\n `[GPT-5 PATCH] Added stream_options.include_usage=true for ${params.model}`\n );\n } else if (params.stream_options.include_usage !== true) {\n params.stream_options.include_usage = true;\n logger.warn(\n `[GPT-5 PATCH] Updated stream_options.include_usage=true for ${params.model}`\n );\n }\n }\n\n return params;\n };\n\n logger.warn(\n `Successfully patched ${modelName}.invocationParams for GPT-5 support (TEMPORARY WORKAROUND)`\n );\n } else {\n logger.warn(\n `Could not find invocationParams method to patch in ${modelName}`\n );\n }\n\n // Additionally patch completionWithRetry for low-level interception\n const originalCompletionWithRetry = prototype.completionWithRetry;\n\n if (originalCompletionWithRetry) {\n prototype.completionWithRetry = async function (\n request: any,\n options?: any\n ) {\n // Check and fix parameters right before sending\n if (\n request?.model &&\n (request.model.includes(\"gpt-5\") ||\n /^gpt-(5|6|7|8|9)/.test(request.model))\n ) {\n let hasChanges = false;\n\n // 1. Fix max_tokens\n if (request.max_tokens !== undefined) {\n request.max_completion_tokens = request.max_tokens;\n delete request.max_tokens;\n hasChanges = true;\n }\n\n // 2. Fix temperature\n if (request.temperature !== undefined && request.temperature !== 1) {\n const originalTemp = request.temperature;\n request.temperature = 1;\n logger.debug(\n `Fixed temperature in completionWithRetry for ${request.model}: ${originalTemp} -> 1`\n );\n hasChanges = true;\n }\n\n // 3. Add stream_options for usage tracking\n if (!request.stream_options) {\n request.stream_options = { include_usage: true };\n logger.debug(\n `Added stream_options.include_usage=true in completionWithRetry for ${request.model}`\n );\n hasChanges = true;\n } else if (request.stream_options.include_usage !== true) {\n request.stream_options.include_usage = true;\n logger.debug(\n `Updated stream_options.include_usage=true in completionWithRetry for ${request.model}`\n );\n hasChanges = true;\n }\n\n if (hasChanges) {\n logger.debug(\n `Fixed request params in completionWithRetry for ${request.model}`\n );\n }\n }\n\n const result = await originalCompletionWithRetry.call(\n this,\n request,\n options\n );\n\n // Log response for usage information debugging\n if (\n request?.model &&\n (request.model.includes(\"gpt-5\") ||\n /^gpt-(5|6|7|8|9)/.test(request.model))\n ) {\n logger.warn(\n `[GPT-5 PATCH] Azure OpenAI Response for ${request.model}:`\n );\n logger.warn(`Response keys: ${Object.keys(result || {}).join(\", \")}`);\n\n if (result?.usage) {\n logger.warn(\n `Usage found: ${JSON.stringify(result.usage, null, 2)}`\n );\n } else {\n logger.warn(`No usage found in response`);\n }\n\n if (result?.choices && result.choices[0]) {\n logger.warn(\n `First choice keys: ${Object.keys(result.choices[0]).join(\", \")}`\n );\n }\n }\n\n return result;\n };\n\n logger.warn(\n `Successfully patched ${modelName}.completionWithRetry for GPT-5 support (TEMPORARY WORKAROUND)`\n );\n }\n\n // Additionally patch isReasoningModel for correct reasoning model detection\n const originalIsReasoningModel = prototype.isReasoningModel;\n\n if (originalIsReasoningModel) {\n prototype.isReasoningModel = function () {\n const model =\n this.modelName || this.model || (this as any).lc_kwargs?.modelName;\n\n // Correct logic for identifying reasoning models:\n // 1. o1, o2, o3, o4 series - these are reasoning models\n // 2. gpt-5+ - these are reasoning models\n const isReasoning =\n /^o\\d/.test(model) ||\n model.includes(\"gpt-5\") ||\n /^gpt-(6|7|8|9)/.test(model);\n\n const originalResult = originalIsReasoningModel.call(this);\n\n logger.warn(\n `[GPT-5 PATCH] isReasoningModel check for \"${model}\": patched=${isReasoning}, original=${originalResult}, modelName=${this.modelName}, model=${(this as any).model}, lc_kwargs=${JSON.stringify((this as any).lc_kwargs?.modelName)}`\n );\n\n return isReasoning;\n };\n\n logger.warn(\n `Successfully patched ${modelName}.isReasoningModel for GPT-5+ reasoning models (TEMPORARY WORKAROUND)`\n );\n } else {\n logger.warn(\n `Could not find isReasoningModel method to patch in ${modelName}`\n );\n }\n\n // Remove bindTools patch - let it work natively\n\n // Remove custom token counting patches - let LangChain handle it\n\n // Patch invoke method for response logging\n const originalInvoke = prototype.invoke;\n\n if (originalInvoke) {\n prototype.invoke = async function (...args: any[]) {\n const model =\n this.modelName || this.model || (this as any).lc_kwargs?.modelName;\n\n if (model && model.includes(\"gpt-5\")) {\n logger.warn(`[GPT-5 PATCH] Starting invoke for ${model}`);\n\n // Log invocation parameters\n if (args[1]) {\n const config = args[1];\n logger.warn(\n `[GPT-5 PATCH] Invoke config keys: ${Object.keys(config || {}).join(\", \")}`\n );\n if (config.tools) {\n logger.warn(\n `[GPT-5 PATCH] Tools in config: ${config.tools.length} tools`\n );\n }\n }\n\n // Log model state\n const boundTools =\n (this as any).bound ||\n (this as any).boundTools ||\n (this as any).tools;\n if (boundTools) {\n logger.warn(\n `[GPT-5 PATCH] Model has bound tools: ${Array.isArray(boundTools) ? boundTools.length : \"yes\"}`\n );\n } else {\n logger.warn(`[GPT-5 PATCH] Model has NO bound tools`);\n }\n }\n\n let result;\n try {\n result = await originalInvoke.apply(this, args);\n } catch (error) {\n if (model && model.includes(\"gpt-5\")) {\n logger.error(\n `[GPT-5 PATCH] Azure OpenAI invoke failed for ${model}:`,\n {\n errorMessage:\n error instanceof Error ? error.message : String(error),\n errorStack: error instanceof Error ? error.stack : undefined,\n errorType: error?.constructor?.name,\n args: args.length,\n hasConfig: !!args[1],\n configKeys: args[1] ? Object.keys(args[1] || {}) : [],\n tools: args[1]?.tools?.length || 0,\n }\n );\n }\n throw error;\n }\n\n if (model && model.includes(\"gpt-5\")) {\n logger.warn(`[GPT-5 PATCH] Azure OpenAI invoke result for ${model}:`);\n logger.warn(`Result keys: ${Object.keys(result || {}).join(\", \")}`);\n\n if (result?.usage_metadata || result?.usageMetadata) {\n const usage = result.usage_metadata || result.usageMetadata;\n logger.warn(\n `Usage metadata found: ${JSON.stringify(usage, null, 2)}`\n );\n }\n\n if (result?.response_metadata || result?.responseMetadata) {\n const responseMetadata =\n result.response_metadata || result.responseMetadata;\n logger.warn(\n `Response metadata found: ${JSON.stringify(responseMetadata, null, 2)}`\n );\n\n // Create usage_metadata from estimatedTokenUsage if not present\n if (\n !result.usage_metadata &&\n responseMetadata?.estimatedTokenUsage\n ) {\n const estimatedUsage = responseMetadata.estimatedTokenUsage;\n result.usage_metadata = {\n input_tokens: estimatedUsage.promptTokens || 0,\n output_tokens: estimatedUsage.completionTokens || 0,\n total_tokens: estimatedUsage.totalTokens || 0,\n };\n\n logger.warn(\n `[GPT-5 PATCH] Created usage_metadata from estimatedTokenUsage: ${JSON.stringify(result.usage_metadata, null, 2)}`\n );\n }\n }\n\n if (!result?.usage_metadata && !result?.usageMetadata) {\n logger.warn(`No usage_metadata found in invoke result`);\n }\n }\n\n return result;\n };\n\n logger.warn(\n `Successfully patched ${modelName}.invoke for GPT-5 response logging (TEMPORARY WORKAROUND)`\n );\n }\n });\n}\n\n// Apply patch on module load\npatchChatOpenAIForGPT5();\nimport { OpenAIEmbeddings } from \"@langchain/openai\";\nimport { ChatAnthropic } from \"@langchain/anthropic\";\nimport { ChatCohere } from \"@langchain/cohere\";\nimport { CohereRerank } from \"@langchain/cohere\";\nimport { VoyageAIRerank } from \"./rerankers/voyageai-rerank\";\nimport { ChatMistralAI } from \"@langchain/mistralai\";\n\nimport { ModelProvider, ModelType } from \"./enums\";\nimport {\n IModelInitializer,\n Model,\n ModelByIdWithTypeConfig,\n ModelConfigWithTokenAndType,\n ChatModelCreator,\n RerankModelCreator,\n EmbeddingModelCreator,\n ChatModelOrRunnable,\n} from \"./model.interface\";\nimport { ModelByIdConfig, ModelConfigFetcher } from \"./llm.types\";\n\nexport class ModelInitializer implements IModelInitializer {\n private logger: Logger;\n\n // Cache for model configurations to avoid repeated API calls\n private modelConfigCache = new Map<string, ModelConfigWithTokenAndType>();\n\n // Cache for model instances to avoid recreating identical models\n private modelInstanceCache = new Map<string, Model>();\n\n constructor(\n private configFetcher?: ModelConfigFetcher,\n logger?: Logger\n ) {\n this.logger = logger || new Logger(ModelInitializer.name);\n }\n\n /**\n * Generate cache key for model instances based on configuration\n */\n /**\n * Generate hash from toolsConfig for cache key\n * Uses MD5 hash to create short, unique identifier\n */\n private hashToolsConfig(toolsConfig: IAgentToolConfig[]): string {\n // Sort by toolName to ensure consistent hash for same config\n const sorted = toolsConfig\n .map(t => `${t.toolName}:${t.enabled}:${JSON.stringify(t.config || {})}`)\n .sort()\n .join(\"|\");\n\n // Generate short MD5 hash (16 chars)\n return createHash(\"md5\").update(sorted).digest(\"hex\").slice(0, 16);\n }\n\n /**\n * Generate cache key from ModelByIdConfig\n * Format: modelId:temperature:maxTokens[:toolsHash]\n * Example: \"model123:0.7:4096\" or \"model123:0.7:4096:a1b2c3d4e5f6g7h8\"\n */\n private generateModelCacheKey(config: ModelByIdConfig): string {\n const parts = [\n config.modelId,\n config.temperature ?? \"default\",\n config.maxTokens ?? \"default\",\n ];\n\n // Add tools hash if toolsConfig provided\n if (config.toolsConfig && config.toolsConfig.length > 0) {\n const toolsHash = this.hashToolsConfig(config.toolsConfig);\n parts.push(toolsHash);\n }\n\n return parts.join(\":\");\n }\n\n /**\n * TEMPORARY SOLUTION for compatibility with new OpenAI models\n *\n * OpenAI changed the API for new models (gpt-5, o-series):\n * - Old models (gpt-3.5, gpt-4, gpt-4o): use maxTokens, support custom temperature\n * - New reasoning models (gpt-5, gpt-o1, gpt-o3, gpt-o4): use maxCompletionTokens, only temperature = 1\n *\n * Patch fixes:\n * 1. max_tokens -> max_completion_tokens for reasoning GPT-5+ models\n * 2. temperature -> 1 (forced) for reasoning GPT-5+ models\n *\n * @param modelName - OpenAI model name\n * @returns true if model requires maxCompletionTokens and temperature = 1\n */\n private requiresMaxCompletionTokens(modelName: string): boolean {\n const requiresNew =\n modelName.includes(\"gpt-5\") ||\n modelName.includes(\"gpt-o1\") ||\n modelName.includes(\"gpt-o2\") ||\n modelName.includes(\"gpt-o3\") ||\n modelName.includes(\"gpt-o4\") ||\n // Add other patterns as new models are released\n /^gpt-(5|6|7|8|9)/.test(modelName) ||\n /^gpt-o[1-4]/.test(modelName);\n\n this.logger.debug(`Checking token parameter for model \"${modelName}\"`, {\n modelName,\n requiresMaxCompletionTokens: requiresNew,\n checks: {\n includesGpt5: modelName.includes(\"gpt-5\"),\n includesO1: modelName.includes(\"gpt-o1\"),\n includesO2: modelName.includes(\"gpt-o2\"),\n includesO3: modelName.includes(\"gpt-o3\"),\n includesO4: modelName.includes(\"gpt-o4\"),\n regexGpt5Plus: /^gpt-(5|6|7|8|9)/.test(modelName),\n regexO1to4: /^gpt-o[1-4]/.test(modelName),\n },\n });\n\n return requiresNew;\n }\n\n // Chat model creators (inherit from original LLMInitializer)\n private readonly chatModelCreators: Partial<\n Record<ModelProvider, ChatModelCreator>\n > = {\n [ModelProvider.OPENAI]: ({\n modelName,\n defaultTemperature,\n defaultMaxTokens,\n apiToken,\n }) => {\n // HARDCODED: Create clean configuration depending on model type for regular OpenAI models\n if (this.requiresMaxCompletionTokens(modelName)) {\n // Configuration for new GPT-5+ models\n // GPT-5+ models only support temperature = 1\n const fixedTemperature = 1;\n const config = {\n modelName,\n temperature: fixedTemperature, // Force set to 1\n maxCompletionTokens: defaultMaxTokens, // Only this parameter for new models\n streaming: true,\n openAIApiKey: apiToken || process.env.OPENAI_API_KEY,\n };\n\n if (defaultTemperature !== 1) {\n this.logger.debug(\n `Fixed temperature for GPT-5+ model ${modelName}: ${defaultTemperature} -> 1 (GPT-5+ models only support temperature=1)`\n );\n }\n\n // Creating GPT-5+ model with fixed parameters\n\n const chatOpenAI = new ChatOpenAI(config);\n\n // ChatOpenAI instance created\n\n return chatOpenAI;\n } else {\n // Configuration for legacy GPT-3.5/GPT-4 models\n const config = {\n modelName,\n temperature: defaultTemperature,\n maxTokens: defaultMaxTokens, // Only this parameter for legacy models\n streaming: true,\n openAIApiKey: apiToken || process.env.OPENAI_API_KEY,\n };\n\n // Creating legacy OpenAI model\n\n const chatOpenAI = new ChatOpenAI(config);\n\n // Legacy ChatOpenAI instance created\n\n return chatOpenAI;\n }\n },\n\n [ModelProvider.ANTHROPIC]: ({\n modelName,\n defaultTemperature,\n defaultMaxTokens,\n apiToken,\n }) =>\n new ChatAnthropic({\n modelName,\n temperature: defaultTemperature,\n maxTokens: defaultMaxTokens,\n anthropicApiKey: apiToken || process.env.ANTHROPIC_API_KEY,\n }) as unknown as BaseChatModel,\n\n [ModelProvider.COHERE]: ({\n modelName,\n defaultTemperature,\n defaultMaxTokens,\n apiToken,\n }) =>\n new ChatCohere({\n model: modelName,\n temperature: defaultTemperature,\n // Cohere uses maxTokens via max_tokens parameter, but it's not supported in ChatCohere API\n apiKey: apiToken || process.env.COHERE_API_KEY,\n }),\n\n [ModelProvider.MISTRAL]: ({\n modelName,\n defaultTemperature,\n defaultMaxTokens,\n apiToken,\n }) =>\n new ChatMistralAI({\n model: modelName,\n temperature: defaultTemperature,\n maxTokens: defaultMaxTokens,\n apiKey: apiToken || process.env.MISTRAL_API_KEY,\n }),\n\n // AWS Bedrock support removed - use Anthropic or OpenAI directly instead\n\n [ModelProvider.FLUTCH_OPENAI]: ({\n modelName,\n defaultTemperature,\n defaultMaxTokens,\n apiToken,\n }) => {\n // HARDCODED: Create clean configuration depending on model type (same as for regular OpenAI)\n if (this.requiresMaxCompletionTokens(modelName)) {\n // Configuration for new GPT-5+ models\n // GPT-5+ models only support temperature = 1\n const fixedTemperature = 1;\n const config = {\n modelName,\n temperature: fixedTemperature, // Force set to 1\n maxCompletionTokens: defaultMaxTokens, // Only this parameter for new models\n streaming: true,\n openAIApiKey: apiToken || process.env.OPENAI_API_KEY,\n };\n\n if (defaultTemperature !== 1) {\n this.logger.debug(\n `Fixed temperature for FLUTCH GPT-5+ model ${modelName}: ${defaultTemperature} -> 1 (GPT-5+ models only support temperature=1)`\n );\n }\n\n this.logger.debug(`Creating FLUTCH GPT-5+ model with config`, {\n modelName,\n maxCompletionTokens: defaultMaxTokens,\n temperature: fixedTemperature,\n originalTemperature: defaultTemperature,\n hasApiKey: !!config.openAIApiKey,\n });\n\n const chatOpenAI = new ChatOpenAI(config);\n\n // Log initialized instance for debugging\n this.logger.debug(`FLUTCH ChatOpenAI GPT-5+ instance created`, {\n modelName: modelName, // Use modelName from parameters\n maxTokens: (chatOpenAI as any).maxTokens,\n maxCompletionTokens: (chatOpenAI as any).maxCompletionTokens,\n temperature: chatOpenAI.temperature,\n streaming: chatOpenAI.streaming,\n // Try to get internal parameters\n clientConfig: (chatOpenAI as any).clientConfig,\n kwargs: (chatOpenAI as any).kwargs,\n });\n\n return chatOpenAI;\n } else {\n // Configuration for legacy GPT-3.5/GPT-4 models\n const config = {\n modelName,\n temperature: defaultTemperature,\n maxTokens: defaultMaxTokens, // Only this parameter for legacy models\n streaming: true,\n openAIApiKey: apiToken || process.env.OPENAI_API_KEY,\n };\n\n this.logger.debug(`Creating FLUTCH legacy model with config`, {\n modelName,\n maxTokens: defaultMaxTokens,\n temperature: defaultTemperature,\n hasApiKey: !!config.openAIApiKey,\n });\n\n const chatOpenAI = new ChatOpenAI(config);\n\n // Log initialized instance for debugging\n this.logger.debug(`FLUTCH ChatOpenAI legacy instance created`, {\n modelName: modelName, // Use modelName from parameters\n maxTokens: (chatOpenAI as any).maxTokens,\n maxCompletionTokens: (chatOpenAI as any).maxCompletionTokens,\n temperature: chatOpenAI.temperature,\n streaming: chatOpenAI.streaming,\n // Try to get internal parameters\n clientConfig: (chatOpenAI as any).clientConfig,\n kwargs: (chatOpenAI as any).kwargs,\n });\n\n return chatOpenAI;\n }\n },\n\n // Other providers not yet implemented for chat\n [ModelProvider.FLUTCH]: () => {\n throw new Error(\"Flutch chat models not implemented\");\n },\n [ModelProvider.FLUTCH_MISTRAL]: () => {\n throw new Error(\"Flutch Mistral chat models not implemented\");\n },\n [ModelProvider.FLUTCH_ANTHROPIC]: () => {\n throw new Error(\"Flutch Anthropic chat models not implemented\");\n },\n [ModelProvider.VOYAGEAI]: () => {\n throw new Error(\"VoyageAI chat models not implemented\");\n },\n };\n\n // Rerank model creators\n private readonly rerankModelCreators: Record<\n ModelProvider,\n RerankModelCreator | undefined\n > = {\n [ModelProvider.COHERE]: ({ modelName, apiToken, maxDocuments }) => {\n return new CohereRerank({\n apiKey: apiToken || process.env.COHERE_API_KEY,\n model: modelName,\n topN: maxDocuments || 20,\n });\n },\n\n [ModelProvider.VOYAGEAI]: ({ modelName, apiToken, maxDocuments }) => {\n return new VoyageAIRerank({\n apiKey: apiToken || process.env.VOYAGEAI_API_KEY,\n model: modelName,\n topN: maxDocuments || 20,\n });\n },\n\n // Other providers don't support rerank yet\n [ModelProvider.OPENAI]: undefined,\n [ModelProvider.ANTHROPIC]: undefined,\n [ModelProvider.MISTRAL]: undefined,\n [ModelProvider.AWS]: undefined,\n [ModelProvider.FLUTCH]: undefined,\n [ModelProvider.FLUTCH_MISTRAL]: undefined,\n [ModelProvider.FLUTCH_OPENAI]: undefined,\n [ModelProvider.FLUTCH_ANTHROPIC]: undefined,\n };\n\n // Embedding model creators\n private readonly embeddingModelCreators: Record<\n ModelProvider,\n EmbeddingModelCreator | undefined\n > = {\n [ModelProvider.OPENAI]: ({ modelName, apiToken }) =>\n new OpenAIEmbeddings({\n model: modelName,\n apiKey: apiToken || process.env.OPENAI_API_KEY,\n }),\n\n // Other providers not yet implemented for embeddings\n [ModelProvider.ANTHROPIC]: undefined,\n [ModelProvider.COHERE]: undefined,\n [ModelProvider.MISTRAL]: undefined,\n [ModelProvider.AWS]: undefined,\n [ModelProvider.FLUTCH]: undefined,\n [ModelProvider.FLUTCH_MISTRAL]: undefined,\n [ModelProvider.FLUTCH_OPENAI]: undefined,\n [ModelProvider.FLUTCH_ANTHROPIC]: undefined,\n [ModelProvider.VOYAGEAI]: undefined,\n };\n\n async initializeChatModel(\n config: ModelByIdConfig\n ): Promise<\n | BaseChatModel\n | Runnable<BaseLanguageModelInput, AIMessageChunk, BaseChatModelCallOptions>\n > {\n // Generate cache key for this specific model configuration (including tools if present)\n const cacheKey = this.generateModelCacheKey(config);\n\n // Check if we already have this exact model instance cached\n const cachedModel = this.modelInstanceCache.get(cacheKey);\n if (cachedModel) {\n this.logger.debug(`Using cached chat model instance: ${cacheKey}`);\n return cachedModel as ChatModelOrRunnable;\n }\n\n const modelConfig = await this.getModelConfigWithType(config.modelId);\n\n if (modelConfig.modelType !== ModelType.CHAT) {\n throw new Error(\n `Model ${config.modelId} is not a chat model (type: ${modelConfig.modelType})`\n );\n }\n\n const creator = this.chatModelCreators[modelConfig.provider];\n if (!creator) {\n throw new Error(\n `Chat models not supported for provider: ${modelConfig.provider}`\n );\n }\n\n // Override parameters from request\n const finalConfig: ModelConfigWithTokenAndType = {\n ...modelConfig,\n defaultTemperature: Number(\n config.temperature ?? modelConfig.defaultTemperature\n ),\n defaultMaxTokens: Number(\n config.maxTokens ?? modelConfig.defaultMaxTokens\n ),\n };\n\n this.logger.debug(`Creating new chat model instance: ${cacheKey}`);\n const model = creator(finalConfig);\n\n // Attach modelId to model metadata - will automatically propagate to all LangChain events\n model.metadata = {\n ...model.metadata,\n modelId: config.modelId,\n };\n\n this.logger.debug(\"🔧 Model initialized with metadata\", {\n modelId: config.modelId,\n metadataKeys: Object.keys(model.metadata || {}),\n hasModelId: !!model.metadata?.modelId,\n });\n\n // Bind tools if provided (toolsConfig or customTools)\n this.logger.debug(\n `[TOOLS CHECK] toolsConfig exists: ${!!config.toolsConfig}, customTools exists: ${!!config.customTools}`\n );\n if (config.toolsConfig) {\n this.logger.debug(\n `[TOOLS CHECK] toolsConfig length: ${config.toolsConfig.length}, content: ${JSON.stringify(config.toolsConfig)}`\n );\n }\n\n if (config.toolsConfig || config.customTools) {\n this.logger.debug(\n `[TOOLS] Calling bindToolsToModel with toolsConfig: ${JSON.stringify(config.toolsConfig)}`\n );\n const boundModel = await this.bindToolsToModel(\n model,\n config.toolsConfig,\n config.customTools\n );\n this.logger.debug(`[TOOLS] bindToolsToModel returned successfully`);\n\n // Cache the model with bound tools\n this.modelInstanceCache.set(cacheKey, boundModel);\n return boundModel;\n }\n\n // Cache the created model instance\n this.modelInstanceCache.set(cacheKey, model);\n\n return model;\n }\n\n /**\n * Bind tools to model (merge toolsConfig and customTools)\n * For toolsConfig: fetch tool executors from MCP Runtime\n * For customTools: use as-is (already prepared DynamicStructuredTool)\n *\n * Returns:\n * - Runnable when tools are bound (model.bindTools returns Runnable)\n * - BaseChatModel when no tools\n */\n private async bindToolsToModel(\n model: BaseChatModel,\n toolsConfig?: IAgentToolConfig[],\n customTools?: DynamicStructuredTool[]\n ): Promise<\n | BaseChatModel\n | Runnable<BaseLanguageModelInput, AIMessageChunk, BaseChatModelCallOptions>\n > {\n const allTools: StructuredTool[] = [];\n\n // Process toolsConfig (fetch dynamic schemas from MCP Runtime)\n if (toolsConfig && toolsConfig.length > 0) {\n try {\n // Filter enabled tools\n const enabledToolsConfig = toolsConfig.filter(\n tc => tc.enabled !== false\n );\n\n if (enabledToolsConfig.length > 0) {\n this.logger.debug(\n `Fetching ${enabledToolsConfig.length} tools with dynamic schemas from MCP Runtime: ${enabledToolsConfig.map(tc => tc.toolName).join(\", \")}`\n );\n\n // Use McpToolFilter to fetch tools with dynamic schemas\n const mcpToolFilter = new McpToolFilter();\n const mcpTools =\n await mcpToolFilter.getFilteredTools(enabledToolsConfig);\n\n this.logger.debug(\n `Successfully fetched ${mcpTools.length} tools with dynamic schemas from MCP Runtime`\n );\n\n allTools.push(...mcpTools);\n }\n } catch (error) {\n this.logger.error(\n `Failed to fetch tools from MCP Runtime: ${error instanceof Error ? error.message : String(error)}`\n );\n // Continue without MCP tools\n }\n }\n\n // Add custom tools (already prepared)\n if (customTools && customTools.length > 0) {\n allTools.push(...customTools);\n this.logger.debug(`Added ${customTools.length} custom tools to model`);\n }\n\n // Bind tools to model if we have any\n if (allTools.length > 0) {\n this.logger.debug(`Binding ${allTools.length} tools to model`);\n\n // bindTools returns Runnable, not BaseChatModel\n const modelWithTools = model.bindTools(allTools);\n return modelWithTools;\n }\n\n return model;\n }\n\n async initializeRerankModel(\n config: ModelByIdConfig\n ): Promise<BaseDocumentCompressor> {\n // Generate cache key for this rerank model configuration\n const cacheKey = this.generateModelCacheKey(config);\n\n // Check if we already have this exact model instance cached\n const cachedModel = this.modelInstanceCache.get(cacheKey);\n if (cachedModel) {\n this.logger.debug(`Using cached rerank model instance: ${cacheKey}`);\n return cachedModel as BaseDocumentCompressor;\n }\n\n const modelConfig = await this.getModelConfigWithType(config.modelId);\n\n if (modelConfig.modelType !== ModelType.RERANK) {\n throw new Error(\n `Model ${config.modelId} is not a rerank model (type: ${modelConfig.modelType})`\n );\n }\n\n const creator = this.rerankModelCreators[modelConfig.provider];\n if (!creator) {\n throw new Error(\n `Rerank models not supported for provider: ${modelConfig.provider}`\n );\n }\n\n this.logger.debug(`Creating new rerank model instance: ${cacheKey}`);\n const model = creator(modelConfig);\n\n // Attach modelId to model metadata - will automatically propagate to all events\n (model as any).metadata = {\n ...(model as any).metadata,\n modelId: config.modelId,\n };\n\n // Cache the created model instance\n this.modelInstanceCache.set(cacheKey, model);\n\n return model;\n }\n\n async initializeEmbeddingModel(config: ModelByIdConfig): Promise<Embeddings> {\n // Generate cache key for this embedding model configuration\n const cacheKey = this.generateModelCacheKey(config);\n\n // Check if we already have this exact model instance cached\n const cachedModel = this.modelInstanceCache.get(cacheKey);\n if (cachedModel) {\n this.logger.debug(`Using cached embedding model instance: ${cacheKey}`);\n return cachedModel as Embeddings;\n }\n\n const modelConfig = await this.getModelConfigWithType(config.modelId);\n\n if (modelConfig.modelType !== ModelType.EMBEDDING) {\n throw new Error(\n `Model ${config.modelId} is not an embedding model (type: ${modelConfig.modelType})`\n );\n }\n\n const creator = this.embeddingModelCreators[modelConfig.provider];\n if (!creator) {\n throw new Error(\n `Embedding models not supported for provider: ${modelConfig.provider}`\n );\n }\n\n this.logger.debug(`Creating new embedding model instance: ${cacheKey}`);\n const model = creator(modelConfig);\n\n // Attach modelId to model metadata - will automatically propagate to all events\n (model as any).metadata = {\n ...(model as any).metadata,\n modelId: config.modelId,\n };\n\n // Cache the created model instance\n this.modelInstanceCache.set(cacheKey, model);\n\n return model;\n }\n\n // === NEW TYPED METHODS ===\n\n async createChatModelById(modelId: string): Promise<ChatModelOrRunnable> {\n const config = await this.getModelConfigWithType(modelId);\n\n if (config.modelType !== ModelType.CHAT) {\n throw new Error(\n `Model ${modelId} is not a chat model, got: ${config.modelType}`\n );\n }\n\n return this.initializeChatModel(config);\n }\n\n async createRerankModelById(\n modelId: string\n ): Promise<BaseDocumentCompressor> {\n const config = await this.getModelConfigWithType(modelId);\n\n if (config.modelType !== ModelType.RERANK) {\n throw new Error(\n `Model ${modelId} is not a rerank model, got: ${config.modelType}`\n );\n }\n\n return this.initializeRerankModel(config);\n }\n\n async createEmbeddingModelById(modelId: string): Promise<Embeddings> {\n const config = await this.getModelConfigWithType(modelId);\n\n if (config.modelType !== ModelType.EMBEDDING) {\n throw new Error(\n `Model ${modelId} is not an embedding model, got: ${config.modelType}`\n );\n }\n\n return this.initializeEmbeddingModel(config);\n }\n\n async createModelById(\n modelId: string,\n expectedType?: ModelType\n ): Promise<Model> {\n const config = await this.getModelConfigWithType(modelId);\n\n // Check if it matches the expected type\n if (expectedType && config.modelType !== expectedType) {\n throw new Error(\n `Model ${modelId} expected to be ${expectedType}, but got: ${config.modelType}`\n );\n }\n\n return this.initializeModelByType(config);\n }\n\n // === LEGACY METHODS ===\n\n async initializeModelByType(config: ModelByIdWithTypeConfig): Promise<Model> {\n switch (config.modelType) {\n case ModelType.CHAT:\n return this.initializeChatModel(config);\n\n case ModelType.RERANK:\n return this.initializeRerankModel(config);\n\n case ModelType.EMBEDDING:\n return this.initializeEmbeddingModel(config);\n\n case ModelType.IMAGE:\n case ModelType.SPEECH:\n throw new Error(`Model type ${config.modelType} not yet supported`);\n\n default:\n throw new Error(`Unknown model type: ${config.modelType}`);\n }\n }\n\n async getModelConfigWithType(\n modelId: string\n ): Promise<ModelConfigWithTokenAndType> {\n // Check if we already have this model config cached\n const cachedConfig = this.modelConfigCache.get(modelId);\n if (cachedConfig) {\n this.logger.debug(`Using cached model config: ${modelId}`);\n return cachedConfig;\n }\n\n this.logger.debug(`Fetching model config: ${modelId}`);\n\n // Get base configuration\n const baseConfig = this.configFetcher\n ? await this.configFetcher(modelId)\n : await this.fetchFromApi(modelId);\n\n // Model config loaded successfully\n\n // Extend with model type and additional fields\n const result = {\n ...baseConfig,\n modelType: (baseConfig as any).modelType || ModelType.CHAT, // Fallback for legacy models\n maxDocuments: (baseConfig as any).maxDocuments,\n dimensions: (baseConfig as any).dimensions,\n supportedFormats: (baseConfig as any).supportedFormats,\n };\n\n // Model type resolved\n\n // Cache the result to avoid repeated API calls\n this.modelConfigCache.set(modelId, result);\n\n return result;\n }\n\n isModelTypeSupported(modelType: ModelType): boolean {\n return [ModelType.CHAT, ModelType.RERANK, ModelType.EMBEDDING].includes(\n modelType\n );\n }\n\n getSupportedModelTypes(): ModelType[] {\n return [ModelType.CHAT, ModelType.RERANK, ModelType.EMBEDDING];\n }\n\n /**\n * Clear all cached model configurations and instances\n */\n clearCache(): void {\n this.logger.debug(\n `Clearing ModelInitializer cache: ${this.modelConfigCache.size} configs, ${this.modelInstanceCache.size} instances`\n );\n this.modelConfigCache.clear();\n this.modelInstanceCache.clear();\n }\n\n /**\n * Clear cached data for a specific model ID\n */\n clearModelCache(modelId: string): void {\n this.modelConfigCache.delete(modelId);\n\n // Clear all instances that use this model ID\n const keysToDelete: string[] = [];\n for (const [key] of this.modelInstanceCache.entries()) {\n if (key.startsWith(`${modelId}:`)) {\n keysToDelete.push(key);\n }\n }\n\n keysToDelete.forEach(key => {\n this.modelInstanceCache.delete(key);\n });\n\n this.logger.debug(\n `Cleared cache for model ${modelId}: ${keysToDelete.length} instances`\n );\n }\n\n /**\n * Get cache statistics for monitoring\n */\n getCacheStats() {\n return {\n configCacheSize: this.modelConfigCache.size,\n instanceCacheSize: this.modelInstanceCache.size,\n configCacheKeys: Array.from(this.modelConfigCache.keys()),\n instanceCacheKeys: Array.from(this.modelInstanceCache.keys()),\n };\n }\n\n // Simple API request for microservices (copy from original LLMInitializer)\n private async fetchFromApi(\n modelId: string\n ): Promise<ModelConfigWithTokenAndType> {\n const apiUrl = process.env.API_URL;\n const token = process.env.INTERNAL_API_TOKEN;\n\n if (!token) {\n throw new Error(\"INTERNAL_API_TOKEN required for API mode\");\n }\n\n const url = `${apiUrl}/internal/model-catalog/models/${modelId}/config`;\n\n const response = await fetch(url, {\n method: \"GET\",\n headers: {\n \"x-internal-token\": token,\n \"Content-Type\": \"application/json\",\n },\n });\n\n if (!response.ok) {\n throw new Error(\n `Failed to fetch model config: ${response.status} ${response.statusText}`\n );\n }\n\n const config = await response.json();\n\n console.debug(\n `ModelInitializer.fetchFromApi - API response for ${modelId}:`,\n {\n url,\n statusCode: response.status,\n configKeys: Object.keys(config),\n modelType: config.modelType,\n hasModelType: !!config.modelType,\n fullConfig: config,\n }\n );\n\n // Extend configuration with model type\n const result = {\n ...config,\n modelType: config.modelType || ModelType.CHAT, // Fallback for compatibility\n };\n\n console.debug(`ModelInitializer.fetchFromApi - final result:`, {\n modelId,\n resultModelType: result.modelType,\n usedFallback: !config.modelType,\n resultKeys: Object.keys(result),\n });\n\n return result;\n }\n}\n","/**\n * Retriever enums\n */\n\nexport enum RetrieverSearchType {\n Search = \"search\",\n MMR = \"mmr\",\n Similarity = \"similarity\",\n}\n","import { Injectable, Logger } from \"@nestjs/common\";\nimport { RetrieverSearchType } from \"./enums\";\nimport {\n CustomDocument,\n RetrieveQueryOptions,\n KnowledgeBaseInfo,\n} from \"./types\";\n\nexport interface RetrieverConfig {\n /**\n * Base URL for the main backend service (k8s endpoint)\n * If not specified, will use environment variable\n */\n apiUrl?: string;\n /**\n * Internal API token for backend communication\n * If not specified, will use environment variable\n */\n internalToken?: string;\n /**\n * Request timeout in milliseconds\n */\n timeout?: number;\n /**\n * Number of retries for failed requests\n */\n retries?: number;\n}\n\n/**\n * Retriever Service\n * HTTP-based service for knowledge base retrieval through main backend\n * Follows the same pattern as LLM initializer for k8s communication\n */\n@Injectable()\nexport class RetrieverService {\n private readonly logger = new Logger(RetrieverService.name);\n private readonly apiUrl: string;\n private readonly internalToken: string;\n private readonly timeout: number;\n private readonly retries: number;\n\n constructor(config: RetrieverConfig = {}) {\n // this.logger = config.logger || new ConsoleLogger();\n\n // Priority: config values > environment variables > defaults\n this.apiUrl =\n config.apiUrl || process.env.API_URL || \"http://amelie-service\";\n this.internalToken =\n config.internalToken || process.env.INTERNAL_API_TOKEN || \"\";\n this.timeout = config.timeout || 30000; // 30 seconds default\n this.retries = config.retries || 3;\n\n if (!this.internalToken) {\n throw new Error(\"INTERNAL_API_TOKEN required for backend communication\");\n }\n\n this.logger.log(\n `RetrieverService initialized with API URL: ${this.apiUrl}`\n );\n }\n\n /**\n * Make HTTP request to backend with retry logic\n */\n private async makeRequest<T>(\n endpoint: string,\n options: {\n method?: \"GET\" | \"POST\";\n body?: any;\n timeout?: number;\n } = {}\n ): Promise<T> {\n const { method = \"GET\", body, timeout = this.timeout } = options;\n const url = `${this.apiUrl}${endpoint}`;\n\n let lastError: Error | undefined;\n\n for (let attempt = 1; attempt <= this.retries; attempt++) {\n try {\n this.logger.debug?.(\n `Making ${method} request to ${url} (attempt ${attempt}/${this.retries})`\n );\n\n const response = await fetch(url, {\n method,\n headers: {\n \"x-internal-token\": this.internalToken,\n \"Content-Type\": \"application/json\",\n \"User-Agent\": \"RetrieverService/1.0.0\",\n },\n body: body ? JSON.stringify(body) : undefined,\n signal: AbortSignal.timeout(timeout),\n });\n\n if (!response.ok) {\n const errorText = await response.text().catch(() => \"Unknown error\");\n throw new Error(\n `HTTP ${response.status} ${response.statusText}: ${errorText}`\n );\n }\n\n const data = await response.json();\n this.logger.debug?.(`Request successful on attempt ${attempt}`);\n return data;\n } catch (error) {\n lastError = error instanceof Error ? error : new Error(String(error));\n\n if (attempt === this.retries) {\n this.logger.error(\n `Request failed after ${this.retries} attempts: ${lastError.message}`\n );\n break;\n }\n\n const backoffDelay = Math.min(1000 * Math.pow(2, attempt - 1), 10000);\n this.logger.warn(\n `Request failed (attempt ${attempt}/${this.retries}), retrying in ${backoffDelay}ms: ${lastError.message}`\n );\n\n await new Promise(resolve => setTimeout(resolve, backoffDelay));\n }\n }\n\n if (!lastError) {\n throw new Error(\"Request failed with unknown error\");\n }\n\n throw lastError;\n }\n\n /**\n * Health check for the service\n */\n async healthCheck(): Promise<boolean> {\n try {\n await this.makeRequest(\"/health\", { timeout: 5000 });\n return true;\n } catch (error) {\n this.logger.warn(`Health check failed: ${error}`);\n return false;\n }\n }\n\n /**\n * Search documents in knowledge base through backend API\n */\n async search(\n query: string,\n searchType: RetrieverSearchType,\n knowledgeBaseIds: string[],\n options?: RetrieveQueryOptions\n ): Promise<CustomDocument[]> {\n if (!query?.trim()) {\n this.logger.warn(\"Empty query provided to search\");\n return [];\n }\n\n if (!knowledgeBaseIds?.length) {\n this.logger.warn(\"No knowledge base IDs provided\");\n return [];\n }\n\n const searchOptions = {\n k: options?.k || 10,\n threshold: options?.threshold || 0.7,\n metadata: options?.metadata || {},\n };\n\n this.logger.debug?.(`Searching documents: \"${query}\"`, {\n searchType,\n knowledgeBaseIds: knowledgeBaseIds.length,\n options: searchOptions,\n });\n\n try {\n const response = await this.makeRequest<{\n documents: CustomDocument[];\n totalFound: number;\n searchType: string;\n }>(\"/internal/knowledge-base/search\", {\n method: \"POST\",\n body: {\n query: query.trim(),\n searchType,\n knowledgeBaseIds,\n options: searchOptions,\n },\n });\n\n const documents = response.documents || [];\n\n this.logger.debug?.(\n `Found ${documents.length} documents from ${response.totalFound || 0} total matches`\n );\n\n // Validate document structure\n return documents.filter(doc => {\n if (!doc.id || !doc.content) {\n this.logger.warn(\"Invalid document structure detected, skipping\");\n return false;\n }\n return true;\n });\n } catch (error) {\n this.logger.error(`Failed to search documents: ${error}`, {\n query,\n searchType,\n knowledgeBaseIds,\n options: searchOptions,\n });\n\n // Return empty array on error to allow graph to continue\n return [];\n }\n }\n\n /**\n * Get documents by their IDs\n */\n async getDocumentsByIds(ids: string[]): Promise<CustomDocument[]> {\n if (!ids?.length) {\n this.logger.warn(\"No document IDs provided\");\n return [];\n }\n\n // Validate IDs format\n const validIds = ids\n .filter(id => {\n if (!id || typeof id !== \"string\" || id.trim() === \"\") {\n this.logger.warn(`Invalid document ID: ${id}`);\n return false;\n }\n return true;\n })\n .map(id => id.trim());\n\n if (!validIds.length) {\n this.logger.warn(\"No valid document IDs provided\");\n return [];\n }\n\n this.logger.debug?.(`Fetching ${validIds.length} documents by IDs`);\n\n try {\n const response = await this.makeRequest<{\n documents: CustomDocument[];\n }>(\"/internal/knowledge-base/documents/batch\", {\n method: \"POST\",\n body: { ids: validIds },\n });\n\n const documents = response.documents || [];\n\n this.logger.debug?.(\n `Retrieved ${documents.length}/${validIds.length} documents`\n );\n\n return documents;\n } catch (error) {\n this.logger.error(`Failed to get documents by IDs: ${error}`, {\n requestedIds: validIds.length,\n });\n\n return [];\n }\n }\n\n /**\n * Check if knowledge base exists and is accessible\n */\n async knowledgeBaseExists(knowledgeBaseId: string): Promise<boolean> {\n if (!knowledgeBaseId?.trim()) {\n this.logger.warn(\"Empty knowledge base ID provided\");\n return false;\n }\n\n try {\n const response = await this.makeRequest<{\n exists: boolean;\n accessible: boolean;\n }>(`/internal/knowledge-base/${knowledgeBaseId.trim()}/status`);\n\n const exists = response.exists && response.accessible;\n\n this.logger.debug?.(\n `Knowledge base ${knowledgeBaseId} ${exists ? \"exists and is accessible\" : \"does not exist or is not accessible\"}`\n );\n\n return exists;\n } catch (error) {\n this.logger.error(`Failed to check KB existence: ${error}`, {\n knowledgeBaseId,\n });\n\n return false;\n }\n }\n\n /**\n * Get knowledge base information\n */\n async getKnowledgeBaseInfo(\n knowledgeBaseId: string\n ): Promise<KnowledgeBaseInfo | null> {\n if (!knowledgeBaseId?.trim()) {\n this.logger.warn(\"Empty knowledge base ID provided\");\n return null;\n }\n\n try {\n const response = await this.makeRequest<KnowledgeBaseInfo>(\n `/internal/knowledge-base/${knowledgeBaseId.trim()}/info`\n );\n\n this.logger.debug?.(`Retrieved KB info for ${knowledgeBaseId}`, {\n name: response.name,\n documentsCount: response.documentsCount,\n });\n\n return response;\n } catch (error) {\n this.logger.error(`Failed to get KB info: ${error}`, {\n knowledgeBaseId,\n });\n\n return null;\n }\n }\n\n /**\n * Simple text search (fallback for when vector search is not available)\n */\n async textSearch(\n query: string,\n knowledgeBaseIds: string[],\n limit: number = 10\n ): Promise<CustomDocument[]> {\n if (!query?.trim()) {\n this.logger.warn(\"Empty query provided to text search\");\n return [];\n }\n\n if (!knowledgeBaseIds?.length) {\n this.logger.warn(\"No knowledge base IDs provided to text search\");\n return [];\n }\n\n this.logger.debug?.(`Performing text search: \"${query}\"`, {\n knowledgeBaseIds: knowledgeBaseIds.length,\n limit,\n });\n\n try {\n const response = await this.makeRequest<{\n documents: CustomDocument[];\n }>(\"/internal/knowledge-base/text-search\", {\n method: \"POST\",\n body: {\n query: query.trim(),\n knowledgeBaseIds,\n limit: Math.max(1, Math.min(limit, 100)), // Ensure reasonable limits\n },\n });\n\n const documents = response.documents || [];\n\n this.logger.debug?.(`Text search found ${documents.length} documents`);\n\n return documents;\n } catch (error) {\n this.logger.error(`Failed to perform text search: ${error}`, {\n query,\n knowledgeBaseIds,\n limit,\n });\n\n return [];\n }\n }\n\n /**\n * Get available knowledge bases for the current context\n */\n async getAvailableKnowledgeBases(): Promise<KnowledgeBaseInfo[]> {\n try {\n const response = await this.makeRequest<{\n knowledgeBases: KnowledgeBaseInfo[];\n }>(\"/internal/knowledge-base/available\");\n\n const kbs = response.knowledgeBases || [];\n\n this.logger.debug?.(`Found ${kbs.length} available knowledge bases`);\n\n return kbs;\n } catch (error) {\n this.logger.error(`Failed to get available knowledge bases: ${error}`);\n\n return [];\n }\n }\n\n /**\n * Check service health and configuration\n */\n check(): string {\n return `RetrieverService configured with API URL: ${this.apiUrl}, timeout: ${this.timeout}ms, retries: ${this.retries}`;\n }\n}\n","// packages/sdk/src/utils/index.ts\nexport * from \"./graph-type.utils\";\n","// Service discovery exports\nexport * from \"./service-discovery.provider\";\nexport * from \"./file-based.discovery\";\nexport * from \"./static.discovery\";\n\n// Optional: Uncomment when consul, @kubernetes/client-node packages are installed\n// export * from \"./consul.discovery\";\n// export * from \"./kubernetes.discovery\";\n// export * from \"./knative.discovery\";\n// export * from \"./knative-service.registry\";\n","// packages/graph-services/graph-service-registry/src/service-discovery/static.discovery.ts\nimport { Injectable } from \"@nestjs/common\";\nimport { ServiceDiscoveryProvider } from \"./service-discovery.provider\";\n\n/**\n * Static service discovery provider (for local development)\n */\n@Injectable()\nexport class StaticDiscovery implements ServiceDiscoveryProvider {\n constructor(\n private readonly services: Array<{\n name: string;\n address: string;\n port: number;\n metadata: Record<string, any>;\n category?: string;\n }>\n ) {}\n\n /**\n * Get list of services by category\n */\n async getServices(category: string): Promise<\n Array<{\n name: string;\n address: string;\n port: number;\n metadata: Record<string, any>;\n }>\n > {\n return this.services.filter(\n service =>\n service.category === category || service.metadata?.category === category\n );\n }\n}\n"]}
1
+ {"version":3,"sources":["../src/callbacks/callback.decorators.ts","../src/agent-ui/endpoint.registry.ts","../src/agent-ui/endpoint.decorators.ts","../src/agent-ui/ui-endpoints.discovery.ts","../src/agent-ui/ui-dispatch.controller.ts","../src/agent-ui/index.ts","../src/service-discovery/file-based.discovery.ts","../src/core/builder-registry.service.ts","../src/utils/graph-type.utils.ts","../src/graph/versioning/versioned-graph.service.ts","../src/callbacks/callback-store.ts","../src/callbacks/callback-registry.ts","../src/callbacks/idempotency-manager.ts","../src/callbacks/smart-callback.router.ts","../src/callbacks/universal-callback.service.ts","../src/callbacks/example.callback.ts","../src/callbacks/callback-acl.service.ts","../src/callbacks/callback-auditor.service.ts","../src/callbacks/callback-metrics.service.ts","../src/callbacks/callback-rate-limiter.ts","../src/callbacks/callback-patch.service.ts","../src/callbacks/telegram-patch.handler.ts","../src/callbacks/web-patch.handler.ts","../src/callbacks/index.ts","../src/callbacks/callback-token.guard.ts","../src/callbacks/callback.controller.ts","../src/graph/abstract-graph.builder.ts","../src/core/bootstrap.ts","../src/core/index.ts","../src/messages/attachments.ts","../src/messages/streaming.ts","../src/graph/graph-service.interface.ts","../src/graph/graph.controller.ts","../src/graph/graph-manifest.schema.ts","../src/graph/versioning/index.ts","../src/engines/api-call-tracer.utils.ts","../src/engines/graph-engine.factory.ts","../src/engines/langgraph/event-processor.utils.ts","../src/engines/langgraph/langgraph-engine.ts","../src/core/universal-graph.module.ts","../src/index.ts","../src/tools/mcp-converter.ts","../src/tools/mcp-tool-filter.ts","../src/tools/mcp-runtime-http.client.ts","../src/models/enums.ts","../src/models/rerankers/voyageai-rerank.ts","../src/models/model.initializer.ts","../src/retriever/enums.ts","../src/retriever/retriever.service.ts","../src/utils/index.ts","../src/service-discovery/index.ts","../src/service-discovery/static.discovery.ts"],"names":["EndpointRegistry","Logger","Injectable","ENDPOINT_METADATA_KEY","UIEndpointsDiscoveryService","getUIEndpointMethodsMetadata","Optional","UIDispatchController","NotFoundException","InternalServerErrorException","Post","ApiOperation","ApiResponse","Body","Get","ApiTags","Controller","FileBasedDiscovery","path2","os","fs","BuilderRegistryService","GraphTypeUtils","VersionedGraphService","randomBytes","IdempotencyStatus","IdempotencyManager","createHash","SmartCallbackRouter","resolve","CallbackACL","ForbiddenException","CallbackAuditAction","CallbackAuditor","randomUUID","entry","CallbackMetrics","Registry","collectDefaultMetrics","Counter","Histogram","Gauge","CallbackRateLimiter","CallbackPatchService","TelegramPatchHandler","WebPatchHandler","CallbackTokenGuard","UnauthorizedException","CallbackController","UseGuards","Req","path","getCallbackMetadata","getEndpointMetadata","createEndpointDescriptors","Inject","UniversalGraphService","findCallbackMethod","Module","net","logger","NestFactory","ValidationPipe","DocumentBuilder","SwaggerModule","AttachmentType","StreamChannel","GraphController","HttpException","HttpStatus","Res","ApiParam","Param","LangGraph","GraphEngineType","GraphEngineFactory","EventProcessor","LangGraphEngine","UniversalGraphModule","MetadataScanner","ModuleRef","ConfigModule","DiscoveryModule","z","zodToJsonSchema","DynamicStructuredTool","axios","response","McpRuntimeHttpClient","parseCallbackConfigArg","CallbackManager","ModelProvider","ModelType","ChatFeature","BaseDocumentCompressor","ChatOpenAI","AzureChatOpenAI","ChatAnthropic","ChatCohere","ChatMistralAI","CohereRerank","OpenAIEmbeddings","RetrieverSearchType","RetrieverService","StaticDiscovery"],"mappings":"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","file":"index.cjs","sourcesContent":["// packages/sdk/src/decorators/callback.decorators.ts\n\nimport \"reflect-metadata\";\nimport { CallbackContext, CallbackResult } from \"./callback.interface\";\n\n/**\n * Metadata for a registered callback\n */\nexport interface CallbackMetadata {\n handler: string;\n method: string | symbol;\n target: any;\n}\n\n/**\n * Metadata for callback methods\n */\nconst CALLBACK_METADATA_KEY = Symbol(\"callbacks\");\n\n/**\n * Metadata for classes with callbacks\n */\nconst CALLBACK_CLASS_METADATA_KEY = Symbol(\"callback_class\");\n\n/**\n * Extended callback context with access to builder\n */\nexport interface ExtendedCallbackContext extends CallbackContext {\n /** Reference to graph builder for access to its methods and properties */\n builder?: any;\n}\n\n/**\n * Type for basic callback handler\n * Re-export for compatibility\n */\nexport type { CallbackHandler } from \"./callback.interface\";\n\n/**\n * Type for extended callback handler with access to builder\n */\nexport type ExtendedCallbackHandler = (\n context: ExtendedCallbackContext\n) => Promise<CallbackResult>;\n\n/**\n * @Callback decorator for methods\n *\n * @param handler Callback handler name\n *\n * @example\n * ```typescript\n * class LedgerCallbacks {\n * @Callback('approve-transaction')\n * async handleApprove(context: CallbackContext): Promise<CallbackResult> {\n * return { success: true, message: 'Transaction approved' };\n * }\n * }\n * ```\n */\nexport function Callback(handler: string) {\n return function (\n target: any,\n propertyKey: string | symbol,\n descriptor: PropertyDescriptor\n ) {\n // Get existing metadata\n const existingCallbacks: CallbackMetadata[] =\n Reflect.getMetadata(CALLBACK_METADATA_KEY, target.constructor) || [];\n\n // Add new callback\n const callbackMetadata: CallbackMetadata = {\n handler,\n method: propertyKey,\n target: target.constructor,\n };\n\n existingCallbacks.push(callbackMetadata);\n\n // Save updated metadata\n Reflect.defineMetadata(\n CALLBACK_METADATA_KEY,\n existingCallbacks,\n target.constructor\n );\n\n // Validate method signature\n if (descriptor.value && typeof descriptor.value === \"function\") {\n const originalMethod = descriptor.value;\n\n descriptor.value = function (context: CallbackContext) {\n // Additional validation logic can be added here\n return originalMethod.call(this, context);\n };\n }\n\n return descriptor;\n };\n}\n\n/**\n * @WithCallbacks decorator for builder classes\n * Mixin approach: mixes methods from callback class into builder\n *\n * @param CallbacksClass Class with callbacks\n *\n * @example\n * ```typescript\n * @WithCallbacks(LedgerV1Callbacks)\n * export class LedgerV1Builder extends AbstractGraphBuilder {\n * // Callbacks automatically become available as builder methods\n * }\n * ```\n */\nexport function WithCallbacks<T extends { new (...args: any[]): {} }>(\n CallbacksClass: T\n) {\n return function <U extends { new (...args: any[]): {} }>(BuilderClass: U) {\n // Get callback metadata from callbacks class\n const callbackMetadata: CallbackMetadata[] =\n Reflect.getMetadata(CALLBACK_METADATA_KEY, CallbacksClass) || [];\n\n // Create new class extending from builder\n class WithCallbacksBuilder extends BuilderClass {\n constructor(...args: any[]) {\n super(...args);\n\n // Create instance of callbacks class\n const callbacksInstance = new CallbacksClass();\n\n // Mix callback methods into current instance\n callbackMetadata.forEach(({ method, handler }) => {\n const callbackMethod = (callbacksInstance as any)[method];\n if (typeof callbackMethod === \"function\") {\n // Bind method to callbacks instance, but also give access to builder's this\n (this as any)[method] = async (context: CallbackContext) => {\n // Pass builder context to callback through special field\n const enhancedContext = {\n ...context,\n builder: this, // Give access to builder's methods and properties\n };\n return callbackMethod.call(callbacksInstance, enhancedContext);\n };\n }\n });\n }\n }\n\n // Copy callback metadata to new class\n Reflect.defineMetadata(\n CALLBACK_METADATA_KEY,\n callbackMetadata,\n WithCallbacksBuilder\n );\n\n // Mark that class has callbacks\n Reflect.defineMetadata(\n CALLBACK_CLASS_METADATA_KEY,\n true,\n WithCallbacksBuilder\n );\n\n // Copy static properties and methods\n Object.setPrototypeOf(WithCallbacksBuilder, BuilderClass);\n Object.getOwnPropertyNames(BuilderClass).forEach(name => {\n if (name !== \"length\" && name !== \"prototype\" && name !== \"name\") {\n const descriptor = Object.getOwnPropertyDescriptor(BuilderClass, name);\n if (descriptor) {\n Object.defineProperty(WithCallbacksBuilder, name, descriptor);\n }\n }\n });\n\n return WithCallbacksBuilder as any;\n };\n}\n\n/**\n * Gets all registered callbacks for a class\n */\nexport function getCallbackMetadata(target: any): CallbackMetadata[] {\n return Reflect.getMetadata(CALLBACK_METADATA_KEY, target) || [];\n}\n\n/**\n * Checks if a class has callbacks\n */\nexport function hasCallbacks(target: any): boolean {\n return Reflect.getMetadata(CALLBACK_CLASS_METADATA_KEY, target) === true;\n}\n\n/**\n * Finds callback handler method by name\n */\nexport function findCallbackMethod(\n target: any,\n handler: string\n): string | symbol | null {\n const callbacks = getCallbackMetadata(target);\n const callback = callbacks.find(cb => cb.handler === handler);\n return callback ? callback.method : null;\n}\n","import { Injectable, Logger } from \"@nestjs/common\";\nimport { JSONSchema7 } from \"json-schema\";\n\n/**\n * Request context for endpoint calls\n */\nexport interface RequestContext {\n userId: string;\n companyId?: string;\n method: \"GET\" | \"POST\";\n payload?: any;\n channel: string; // 'web', 'webapp'\n platform?: string; // 'telegram', 'slack', 'discord'\n}\n\n/**\n * Universal response envelope\n */\nexport interface DataEnvelope<T = any> {\n schema: string; // Schema name or data type\n data: T; // The actual data\n meta?: {\n total?: number; // For pagination\n page?: number;\n redirect?: string; // For navigation after action\n message?: string; // Message to user\n };\n}\n\n/**\n * Endpoint handler function type\n */\nexport type EndpointHandler = (ctx: RequestContext) => Promise<DataEnvelope>;\n\n/**\n * Endpoint descriptor interface\n */\nexport interface EndpointDescriptor {\n name: string; // \"accounts.list\"\n method: \"GET\" | \"POST\";\n handler: EndpointHandler;\n schema?: JSONSchema7;\n}\n\n/**\n * Registry for graph UI endpoints\n * Similar to CallbackRegistry but for synchronous data operations without TTL\n */\n@Injectable()\nexport class EndpointRegistry {\n private readonly logger = new Logger(EndpointRegistry.name);\n\n // Map<graphType, Map<endpointName, EndpointDescriptor>>\n private readonly endpoints = new Map<\n string,\n Map<string, EndpointDescriptor>\n >();\n\n /**\n * Register an endpoint for a specific graph type\n * @param graphType The graph type (e.g., \"ledger::1.0.0\")\n * @param endpoint The endpoint descriptor\n */\n register(graphType: string, endpoint: EndpointDescriptor): void {\n if (!this.endpoints.has(graphType)) {\n this.endpoints.set(graphType, new Map());\n }\n\n const graphEndpoints = this.endpoints.get(graphType)!;\n graphEndpoints.set(endpoint.name, endpoint);\n\n this.logger.debug(\n `Registered endpoint \"${endpoint.name}\" for graph type \"${graphType}\"`\n );\n }\n\n /**\n * Register multiple endpoints for a graph type\n * @param graphType The graph type\n * @param endpoints Array of endpoint descriptors\n */\n registerMultiple(graphType: string, endpoints: EndpointDescriptor[]): void {\n for (const endpoint of endpoints) {\n this.register(graphType, endpoint);\n }\n }\n\n /**\n * Get an endpoint handler\n * @param graphType The graph type\n * @param endpointName The endpoint name\n * @returns The endpoint descriptor or undefined\n */\n get(graphType: string, endpointName: string): EndpointDescriptor | undefined {\n const graphEndpoints = this.endpoints.get(graphType);\n return graphEndpoints?.get(endpointName);\n }\n\n /**\n * List all endpoints for a graph type\n * @param graphType The graph type\n * @returns Array of endpoint names\n */\n list(graphType: string): string[] {\n const graphEndpoints = this.endpoints.get(graphType);\n if (!graphEndpoints) {\n return [];\n }\n return Array.from(graphEndpoints.keys());\n }\n\n /**\n * Alias for list() method for compatibility\n */\n listEndpoints(graphType: string): string[] {\n return this.list(graphType);\n }\n\n /**\n * List all registered graph types\n * @returns Array of graph type names\n */\n listGraphTypes(): string[] {\n return Array.from(this.endpoints.keys());\n }\n\n /**\n * Call an endpoint\n * @param graphType The graph type\n * @param endpointName The endpoint name\n * @param context The request context\n * @returns The response envelope\n */\n async call(\n graphType: string,\n endpointName: string,\n context: RequestContext\n ): Promise<DataEnvelope> {\n const endpoint = this.get(graphType, endpointName);\n\n if (!endpoint) {\n throw new Error(\n `Endpoint \"${endpointName}\" not found for graph \"${graphType}\"`\n );\n }\n\n // Validate HTTP method matches\n if (endpoint.method !== context.method) {\n throw new Error(\n `Method mismatch: endpoint expects ${endpoint.method}, got ${context.method}`\n );\n }\n\n this.logger.debug(\n `Calling endpoint \"${endpointName}\" for graph \"${graphType}\" with method ${context.method}`\n );\n\n try {\n return await endpoint.handler(context);\n } catch (error) {\n this.logger.error(\n `Error calling endpoint \"${endpointName}\" for graph \"${graphType}\":`,\n error\n );\n throw error;\n }\n }\n\n /**\n * Get statistics about registered endpoints\n */\n getStats(): {\n totalGraphTypes: number;\n totalEndpoints: number;\n endpointsByGraph: Record<string, number>;\n } {\n const stats = {\n totalGraphTypes: this.endpoints.size,\n totalEndpoints: 0,\n endpointsByGraph: {} as Record<string, number>,\n };\n\n for (const [graphType, endpoints] of this.endpoints) {\n const count = endpoints.size;\n stats.totalEndpoints += count;\n stats.endpointsByGraph[graphType] = count;\n }\n\n return stats;\n }\n\n /**\n * Clear all endpoints (mainly for testing)\n */\n clear(): void {\n this.endpoints.clear();\n this.logger.debug(\"Cleared all endpoints from registry\");\n }\n\n /**\n * Clear endpoints for specific graph type (mainly for testing)\n */\n clearGraph(graphType: string): void {\n this.endpoints.delete(graphType);\n this.logger.debug(`Cleared endpoints for graph type \"${graphType}\"`);\n }\n}\n","import \"reflect-metadata\";\nimport { JSONSchema7 } from \"json-schema\";\nimport { EndpointDescriptor } from \"./endpoint.registry\";\n\n/**\n * Metadata key for storing endpoint information\n */\nexport const ENDPOINT_METADATA_KEY = \"graph:endpoints\";\n\n/**\n * Endpoint metadata stored on classes\n */\nexport interface EndpointMetadata {\n name: string;\n method: \"GET\" | \"POST\";\n methodName: string;\n schema?: JSONSchema7;\n}\n\n/**\n * Options for endpoint decorator\n */\nexport interface EndpointOptions {\n method: \"GET\" | \"POST\";\n schema?: JSONSchema7;\n}\n\n/**\n * Decorator to mark a method as a graph endpoint\n * @param name Endpoint name (e.g., \"accounts.list\")\n * @param options Endpoint configuration\n */\nexport function Endpoint(name: string, options: EndpointOptions) {\n return function (\n target: any,\n propertyKey: string,\n descriptor: PropertyDescriptor\n ) {\n // Get existing metadata or initialize empty array\n const existingMetadata: EndpointMetadata[] =\n Reflect.getMetadata(ENDPOINT_METADATA_KEY, target.constructor) || [];\n\n // Add new endpoint metadata\n const metadata: EndpointMetadata = {\n name,\n method: options.method,\n methodName: propertyKey,\n schema: options.schema,\n };\n\n existingMetadata.push(metadata);\n\n // Store updated metadata\n Reflect.defineMetadata(\n ENDPOINT_METADATA_KEY,\n existingMetadata,\n target.constructor\n );\n };\n}\n\n/**\n * Class decorator to mark a class as having endpoints\n * This ensures the metadata is properly initialized\n */\nexport function WithEndpoints(target: any) {\n // Initialize metadata if not exists\n if (!Reflect.hasMetadata(ENDPOINT_METADATA_KEY, target)) {\n Reflect.defineMetadata(ENDPOINT_METADATA_KEY, [], target);\n }\n}\n\n/**\n * Get endpoint metadata from a class constructor\n * @param constructor The class constructor\n * @returns Array of endpoint metadata\n */\nexport function getEndpointMetadata(constructor: any): EndpointMetadata[] {\n return Reflect.getMetadata(ENDPOINT_METADATA_KEY, constructor) || [];\n}\n\n/**\n * Convert endpoint metadata to endpoint descriptors\n * @param instance The class instance\n * @param metadata Array of endpoint metadata\n * @returns Array of endpoint descriptors\n */\nexport function createEndpointDescriptors(\n instance: any,\n metadata: EndpointMetadata[]\n): EndpointDescriptor[] {\n return metadata.map(meta => ({\n name: meta.name,\n method: meta.method,\n schema: meta.schema,\n handler: async ctx => {\n const method = instance[meta.methodName];\n if (typeof method !== \"function\") {\n throw new Error(`Method ${meta.methodName} not found on instance`);\n }\n return method.call(instance, ctx);\n },\n }));\n}\n\n/**\n * Find endpoint method name by endpoint name\n * @param constructor Class constructor\n * @param endpointName Endpoint name to find\n * @returns Method name or undefined\n */\nexport function findEndpointMethod(\n constructor: any,\n endpointName: string\n): string | undefined {\n const metadata = getEndpointMetadata(constructor);\n const endpoint = metadata.find(meta => meta.name === endpointName);\n return endpoint?.methodName;\n}\n\n// === UI ENDPOINTS DECORATORS ===\n\n/**\n * Metadata for UI endpoint classes\n */\nexport interface UIEndpointClassMetadata {\n graphType: string;\n}\n\nexport interface UIEndpointMethodMetadata {\n endpointName: string;\n method: \"GET\" | \"POST\";\n methodName: string | symbol;\n}\n\nconst UI_ENDPOINT_CLASS_METADATA_KEY = Symbol(\"ui_endpoint_class\");\nconst UI_ENDPOINT_METHOD_METADATA_KEY = Symbol(\"ui_endpoint_methods\");\n\n/**\n * Class decorator for UI Endpoints\n * Marks a class as containing UI endpoints for a specific graph type\n *\n * @example\n * ```typescript\n * @WithUIEndpoints('company.financial-ledger::1.0.0')\n * export class LedgerUIEndpoints {\n * @UIEndpoint('accounts.list', 'GET')\n * async listAccounts(ctx: RequestContext): Promise<DataEnvelope> { ... }\n * }\n * ```\n */\nexport function WithUIEndpoints(graphType: string) {\n return function <T extends { new (...args: any[]): {} }>(constructor: T) {\n // Mark class as having UI endpoints\n Reflect.defineMetadata(\n UI_ENDPOINT_CLASS_METADATA_KEY,\n { graphType },\n constructor\n );\n return constructor;\n };\n}\n\n/**\n * Method decorator for individual UI endpoints\n *\n * @param endpointName The endpoint name (e.g., 'accounts.list')\n * @param method HTTP method (GET or POST)\n */\nexport function UIEndpoint(\n endpointName: string,\n method: \"GET\" | \"POST\" = \"GET\"\n) {\n return function (\n target: any,\n propertyKey: string | symbol,\n descriptor: PropertyDescriptor\n ) {\n // Get existing method metadata\n const existingMethods: UIEndpointMethodMetadata[] =\n Reflect.getMetadata(\n UI_ENDPOINT_METHOD_METADATA_KEY,\n target.constructor\n ) || [];\n\n // Add new method metadata\n const methodMetadata: UIEndpointMethodMetadata = {\n endpointName,\n method,\n methodName: propertyKey,\n };\n\n existingMethods.push(methodMetadata);\n\n // Save updated metadata\n Reflect.defineMetadata(\n UI_ENDPOINT_METHOD_METADATA_KEY,\n existingMethods,\n target.constructor\n );\n\n return descriptor;\n };\n}\n\n/**\n * Get UI endpoint class metadata\n */\nexport function getUIEndpointClassMetadata(\n constructor: any\n): UIEndpointClassMetadata | null {\n return (\n Reflect.getMetadata(UI_ENDPOINT_CLASS_METADATA_KEY, constructor) || null\n );\n}\n\n/**\n * Get all UI endpoint methods metadata for a class\n */\nexport function getUIEndpointMethodsMetadata(\n constructor: any\n): UIEndpointMethodMetadata[] {\n return (\n Reflect.getMetadata(UI_ENDPOINT_METHOD_METADATA_KEY, constructor) || []\n );\n}\n\n/**\n * Check if a class has UI endpoints\n */\nexport function hasUIEndpoints(constructor: any): boolean {\n return getUIEndpointClassMetadata(constructor) !== null;\n}\n\n/**\n * Register UI endpoints from a class to the endpoint registry\n * @param endpointRegistry The endpoint registry\n * @param EndpointClass The UI endpoints class constructor\n * @param instance Optional pre-created instance (from DI container)\n */\nexport function registerUIEndpointsFromClass(\n endpointRegistry: any, // EndpointRegistry type\n EndpointClass: any,\n instance?: any\n): void {\n // Check if class has UI endpoints\n const classMetadata = getUIEndpointClassMetadata(EndpointClass);\n if (!classMetadata) {\n return;\n }\n\n // Get method metadata\n const methodsMetadata = getUIEndpointMethodsMetadata(EndpointClass);\n if (methodsMetadata.length === 0) {\n return;\n }\n\n // Use provided instance or create new one (for backward compatibility)\n console.log(\"DEBUG: registerUIEndpointsFromClass\", {\n hasInstance: !!instance,\n willCreateNew: !instance,\n className: EndpointClass.name,\n });\n\n const endpointInstance = instance || new EndpointClass();\n\n // Convert to endpoint descriptors\n const descriptors = methodsMetadata.map(meta => ({\n name: meta.endpointName,\n method: meta.method,\n handler: async (ctx: any) => {\n const method = endpointInstance[meta.methodName as string];\n if (typeof method !== \"function\") {\n throw new Error(\n `Method ${String(meta.methodName)} not found on instance`\n );\n }\n return method.call(endpointInstance, ctx);\n },\n }));\n\n // Register all endpoints\n endpointRegistry.registerMultiple(classMetadata.graphType, descriptors);\n}\n","// packages/sdk/src/endpoint-registry/ui-endpoints.discovery.ts\nimport { Injectable, Logger, OnModuleInit, Optional } from \"@nestjs/common\";\nimport { DiscoveryService, MetadataScanner } from \"@nestjs/core\";\nimport { EndpointRegistry } from \"./endpoint.registry\";\nimport {\n hasUIEndpoints,\n registerUIEndpointsFromClass,\n} from \"./endpoint.decorators\";\n\n/**\n * Service for auto-discovery of UI Endpoints in the application\n * Scans all providers for classes with @WithUIEndpoints decorator\n * and automatically registers them with the EndpointRegistry\n */\n@Injectable()\nexport class UIEndpointsDiscoveryService implements OnModuleInit {\n private readonly logger = new Logger(UIEndpointsDiscoveryService.name);\n\n constructor(\n @Optional() private readonly discoveryService: DiscoveryService,\n @Optional() private readonly metadataScanner: MetadataScanner,\n private readonly endpointRegistry: EndpointRegistry\n ) {}\n\n async onModuleInit() {\n await this.discoverUIEndpoints();\n }\n\n /**\n * Discover and register all UI endpoint classes\n * Called automatically during module initialization\n */\n async discoverUIEndpoints(): Promise<void> {\n this.logger.log(\"Starting UI endpoints discovery...\");\n\n // Check if DiscoveryService is available\n if (!this.discoveryService) {\n this.logger.warn(\n \"DiscoveryService not available, skipping UI endpoints discovery\"\n );\n return;\n }\n\n // Get all providers from the entire application\n const providers = this.discoveryService.getProviders();\n\n let registeredCount = 0;\n let totalEndpoints = 0;\n\n for (const provider of providers) {\n try {\n const { instance, metatype } = provider;\n\n // Skip if no metatype or instance\n if (!metatype || !instance) {\n continue;\n }\n\n // Check if this class has UI endpoints\n if (hasUIEndpoints(metatype)) {\n this.logger.debug(`Found UI endpoints class: ${metatype.name}`);\n console.log(\"DEBUG: Discovery found instance\", {\n className: metatype.name,\n hasInstance: !!instance,\n instanceType: typeof instance,\n });\n\n // Register the endpoints from this class\n registerUIEndpointsFromClass(\n this.endpointRegistry,\n metatype,\n instance\n );\n\n registeredCount++;\n\n // Count endpoints for logging\n const metadata = this.getUIEndpointMethodsCount(metatype);\n totalEndpoints += metadata;\n\n this.logger.log(\n `Registered ${metadata} UI endpoints from ${metatype.name}`\n );\n }\n } catch (error) {\n this.logger.warn(`Failed to process provider: ${error.message}`);\n }\n }\n\n this.logger.log(`UI endpoints discovery completed!`);\n this.logger.log(\n `Stats: ${registeredCount} classes, ${totalEndpoints} endpoints total`\n );\n\n // Log endpoint registry stats\n const stats = this.endpointRegistry.getStats();\n this.logger.log(\n `Registry: ${stats.totalGraphTypes} graph types, ${stats.totalEndpoints} endpoints`\n );\n }\n\n /**\n * Get count of UI endpoint methods in a class\n */\n private getUIEndpointMethodsCount(metatype: any): number {\n const { getUIEndpointMethodsMetadata } = require(\"./endpoint.decorators\");\n const methods = getUIEndpointMethodsMetadata(metatype);\n return methods.length;\n }\n}\n","import {\n Controller,\n Post,\n Get,\n Body,\n Param,\n Headers,\n Logger,\n NotFoundException,\n InternalServerErrorException,\n} from \"@nestjs/common\";\nimport { ApiTags, ApiOperation, ApiResponse } from \"@nestjs/swagger\";\nimport { DataEnvelope, EndpointRegistry, RequestContext } from \"./\";\nimport { BuilderRegistryService } from \"../core/builder-registry.service\";\n\nexport interface UIDispatchDto {\n graphType: string;\n endpoint: string;\n method: \"GET\" | \"POST\";\n data?: any;\n context: {\n userId: string;\n companyId?: string;\n channel?: string;\n platform?: string;\n };\n}\n\n/**\n * Controller for UI endpoint dispatch\n * Handles requests from backend to graph UI endpoints\n */\n@ApiTags(\"UI Dispatch\")\n@Controller(\"api/graph\")\nexport class UIDispatchController {\n private readonly logger = new Logger(UIDispatchController.name);\n\n constructor(\n private readonly endpointRegistry: EndpointRegistry,\n private readonly builderRegistry: BuilderRegistryService\n ) {}\n\n /**\n * Dispatch a request to a UI endpoint\n * Similar to callback dispatch but for synchronous UI operations\n */\n @Post(\"ui/dispatch\")\n @ApiOperation({ summary: \"Dispatch request to UI endpoint\" })\n @ApiResponse({\n status: 200,\n description: \"Successfully dispatched to endpoint\",\n })\n @ApiResponse({ status: 404, description: \"Endpoint not found\" })\n async dispatchUIEndpoint(@Body() dto: UIDispatchDto): Promise<DataEnvelope> {\n this.logger.debug(\n `Dispatching UI request to ${dto.graphType}:${dto.endpoint}`\n );\n\n this.logger.debug(\"UIDispatchController received request\", {\n graphType: dto.graphType,\n endpoint: dto.endpoint,\n method: dto.method,\n data: dto.data,\n context: dto.context,\n });\n\n try {\n // Build request context\n const context: RequestContext = {\n userId: dto.context.userId,\n companyId: dto.context.companyId,\n method: dto.method,\n payload: dto.data,\n channel: dto.context.channel || \"web\",\n platform: dto.context.platform,\n };\n\n this.logger.debug(\"Built RequestContext\", context);\n\n // Call the endpoint through registry\n const result = await this.endpointRegistry.call(\n dto.graphType,\n dto.endpoint,\n context\n );\n\n this.logger.debug(\n `Successfully dispatched to ${dto.graphType}:${dto.endpoint}`\n );\n\n return result;\n } catch (error: any) {\n this.logger.error(\n `Failed to dispatch to ${dto.graphType}:${dto.endpoint}:`,\n error.message\n );\n\n if (error.message.includes(\"not found\")) {\n throw new NotFoundException(error.message);\n }\n\n throw new InternalServerErrorException(\n `Failed to dispatch: ${error.message}`\n );\n }\n }\n\n /**\n * Get manifest for a graph type\n * Returns the graph configuration including UI section\n */\n @Get(\":graphType/manifest\")\n @ApiOperation({ summary: \"Get graph manifest with UI configuration\" })\n @ApiResponse({ status: 200, description: \"Graph manifest\" })\n @ApiResponse({ status: 404, description: \"Graph not found\" })\n async getGraphManifest(\n @Param(\"graphType\") graphType: string,\n @Headers(\"x-user-id\") userId: string\n ): Promise<any> {\n this.logger.debug(`Fetching manifest for graph ${graphType}`);\n\n try {\n // Get builder from registry\n const builder = this.builderRegistry\n .getBuilders()\n .find(b => b.graphType === graphType);\n\n if (!builder) {\n throw new NotFoundException(`Graph ${graphType} not found in registry`);\n }\n\n // Get manifest from builder (it's already loaded from graph.manifest.json)\n const manifest = (builder as any).manifest;\n\n if (!manifest) {\n this.logger.warn(\n `Builder for ${graphType} exists but has no manifest loaded`\n );\n // Fallback: return basic manifest\n return {\n graphType,\n name: graphType,\n version: builder.version,\n ui: {\n enabled: false,\n },\n };\n }\n\n this.logger.debug(\n `Found manifest for ${graphType} with UI enabled: ${!!manifest.ui?.enabled}`\n );\n\n return manifest;\n } catch (error: any) {\n this.logger.error(\n `Failed to get manifest for ${graphType}:`,\n error.message\n );\n throw new NotFoundException(`Graph ${graphType} not found`);\n }\n }\n\n /**\n * List all available UI endpoints for a graph\n * Useful for debugging and discovery\n */\n @Get(\":graphType/endpoints\")\n @ApiOperation({ summary: \"List UI endpoints for a graph\" })\n @ApiResponse({\n status: 200,\n description: \"List of endpoint names\",\n type: [String],\n })\n async listEndpoints(\n @Param(\"graphType\") graphType: string,\n @Headers(\"x-user-id\") userId: string\n ): Promise<string[]> {\n this.logger.debug(`Listing endpoints for graph ${graphType}`);\n\n try {\n const endpoints = this.endpointRegistry.listEndpoints(graphType);\n\n this.logger.debug(`Found ${endpoints.length} endpoints for ${graphType}`);\n\n return endpoints;\n } catch (error: any) {\n this.logger.error(\n `Failed to list endpoints for ${graphType}:`,\n error.message\n );\n return [];\n }\n }\n\n /**\n * Get catalog of all graphs\n * Returns basic info about all registered graphs\n */\n @Get(\"catalog\")\n @ApiOperation({ summary: \"Get catalog of all graphs\" })\n @ApiResponse({\n status: 200,\n description: \"List of graphs with basic info\",\n })\n async getGraphCatalog(\n @Headers(\"x-user-id\") userId: string,\n @Headers(\"x-company-id\") companyId?: string\n ): Promise<any[]> {\n this.logger.debug(\"Fetching graph catalog\");\n\n try {\n // Get all registered graph types\n const graphTypes = this.endpointRegistry.listGraphTypes();\n\n // Build catalog with basic info\n const catalog = graphTypes.map(graphType => ({\n graphType,\n name: graphType,\n ui: {\n enabled: this.endpointRegistry.listEndpoints(graphType).length > 0,\n },\n }));\n\n this.logger.debug(`Returning catalog with ${catalog.length} graphs`);\n\n return catalog;\n } catch (error: any) {\n this.logger.error(\"Failed to get graph catalog:\", error.message);\n return [];\n }\n }\n}\n","export * from \"./endpoint.registry\";\nexport * from \"./endpoint.decorators\";\nexport * from \"./ui-endpoints.discovery\";\nexport * from \"./ui-dispatch.controller\";\n","import { Injectable, Logger } from \"@nestjs/common\";\nimport { ServiceDiscoveryProvider } from \"./service-discovery.provider\";\nimport * as fs from \"fs\";\nimport * as path from \"path\";\nimport * as os from \"os\";\n\ninterface ServiceRegistration {\n name: string;\n address: string;\n port: number;\n metadata: Record<string, any>;\n pid: number;\n timestamp: number;\n graphTypes: string[];\n}\n\n/**\n * File-based service discovery for local development\n * Services are registered in ~/.flutch/services/\n */\n@Injectable()\nexport class FileBasedDiscovery implements ServiceDiscoveryProvider {\n private readonly logger = new Logger(FileBasedDiscovery.name);\n private readonly servicesDir: string;\n\n constructor() {\n this.servicesDir = path.join(os.homedir(), \".flutch\", \"services\");\n this.ensureServicesDirectory();\n this.cleanupStaleServices();\n }\n\n /**\n * Register service\n */\n async registerService(\n name: string,\n address: string,\n port: number,\n metadata: Record<string, any>,\n graphTypes: string[] = []\n ): Promise<void> {\n const registration: ServiceRegistration = {\n name,\n address,\n port,\n metadata,\n pid: process.pid,\n timestamp: Date.now(),\n graphTypes,\n };\n\n const serviceFile = path.join(\n this.servicesDir,\n `${name}-${process.pid}.json`\n );\n\n try {\n await fs.promises.writeFile(\n serviceFile,\n JSON.stringify(registration, null, 2)\n );\n\n this.logger.log(`Registered service: ${name} at ${address}:${port}`);\n\n // Automatic cleanup on process exit\n process.on(\"exit\", () => this.unregisterService(name));\n process.on(\"SIGINT\", () => {\n this.unregisterService(name);\n process.exit(0);\n });\n process.on(\"SIGTERM\", () => {\n this.unregisterService(name);\n process.exit(0);\n });\n } catch (error) {\n this.logger.error(`Failed to register service ${name}: ${error.message}`);\n }\n }\n\n /**\n * Unregister service\n */\n async unregisterService(name: string): Promise<void> {\n const serviceFile = path.join(\n this.servicesDir,\n `${name}-${process.pid}.json`\n );\n\n try {\n if (fs.existsSync(serviceFile)) {\n await fs.promises.unlink(serviceFile);\n this.logger.log(`Unregistered service: ${name}`);\n }\n } catch (error) {\n this.logger.error(\n `Failed to unregister service ${name}: ${error.message}`\n );\n }\n }\n\n /**\n * Get list of services by graph type\n */\n async getServices(graphType: string): Promise<\n Array<{\n name: string;\n address: string;\n port: number;\n metadata: Record<string, any>;\n }>\n > {\n try {\n const files = await fs.promises.readdir(this.servicesDir);\n const services: Array<{\n name: string;\n address: string;\n port: number;\n metadata: Record<string, any>;\n }> = [];\n\n for (const file of files) {\n if (!file.endsWith(\".json\")) continue;\n\n try {\n const serviceFile = path.join(this.servicesDir, file);\n const content = await fs.promises.readFile(serviceFile, \"utf-8\");\n const registration: ServiceRegistration = JSON.parse(content);\n\n // Check if process is still alive\n if (!this.isProcessAlive(registration.pid)) {\n await fs.promises.unlink(serviceFile);\n continue;\n }\n\n // Check if service supports required graph type\n if (\n registration.graphTypes.includes(graphType) ||\n registration.metadata.graphTypes?.includes(graphType)\n ) {\n services.push({\n name: registration.name,\n address: registration.address,\n port: registration.port,\n metadata: registration.metadata,\n });\n }\n } catch (error) {\n this.logger.warn(\n `Failed to parse service file ${file}: ${error.message}`\n );\n }\n }\n\n return services;\n } catch (error) {\n this.logger.error(`Failed to get services: ${error.message}`);\n return [];\n }\n }\n\n /**\n * Find service by name\n */\n async findServiceByName(serviceName: string): Promise<{\n name: string;\n address: string;\n port: number;\n metadata: Record<string, any>;\n } | null> {\n try {\n const files = await fs.promises.readdir(this.servicesDir);\n\n for (const file of files) {\n if (!file.endsWith(\".json\")) continue;\n\n try {\n const serviceFile = path.join(this.servicesDir, file);\n const content = await fs.promises.readFile(serviceFile, \"utf-8\");\n const registration: ServiceRegistration = JSON.parse(content);\n\n if (\n registration.name === serviceName &&\n this.isProcessAlive(registration.pid)\n ) {\n return {\n name: registration.name,\n address: registration.address,\n port: registration.port,\n metadata: registration.metadata,\n };\n }\n } catch (error) {\n this.logger.warn(\n `Failed to parse service file ${file}: ${error.message}`\n );\n }\n }\n\n return null;\n } catch (error) {\n this.logger.error(\n `Failed to find service ${serviceName}: ${error.message}`\n );\n return null;\n }\n }\n\n /**\n * Ensure services directory exists\n */\n private ensureServicesDirectory(): void {\n try {\n const amelieDir = path.join(os.homedir(), \".flutch\");\n if (!fs.existsSync(amelieDir)) {\n fs.mkdirSync(amelieDir, { recursive: true });\n }\n\n if (!fs.existsSync(this.servicesDir)) {\n fs.mkdirSync(this.servicesDir, { recursive: true });\n }\n } catch (error) {\n this.logger.error(\n `Failed to create services directory: ${error.message}`\n );\n }\n }\n\n /**\n * Cleanup stale services\n */\n private async cleanupStaleServices(): Promise<void> {\n try {\n const files = await fs.promises.readdir(this.servicesDir);\n\n for (const file of files) {\n if (!file.endsWith(\".json\")) continue;\n\n try {\n const serviceFile = path.join(this.servicesDir, file);\n const content = await fs.promises.readFile(serviceFile, \"utf-8\");\n const registration: ServiceRegistration = JSON.parse(content);\n\n // Remove dead process entries\n if (!this.isProcessAlive(registration.pid)) {\n await fs.promises.unlink(serviceFile);\n this.logger.debug(`Cleaned up stale service: ${registration.name}`);\n }\n } catch (error) {\n // Remove corrupted files\n try {\n await fs.promises.unlink(path.join(this.servicesDir, file));\n } catch {}\n }\n }\n } catch (error) {\n this.logger.error(`Failed to cleanup stale services: ${error.message}`);\n }\n }\n\n /**\n * Check if process is still alive\n */\n private isProcessAlive(pid: number): boolean {\n try {\n process.kill(pid, 0);\n return true;\n } catch (error) {\n return false;\n }\n }\n}\n","// builder-registry.service.ts\nimport { Injectable } from \"@nestjs/common\";\nimport { AbstractGraphBuilder } from \"../graph/abstract-graph.builder\";\n\n@Injectable()\nexport class BuilderRegistryService {\n private builders: AbstractGraphBuilder<string>[] = [];\n\n registerBuilder(builder: AbstractGraphBuilder<string>) {\n // Check if builder with this graphType is already registered\n const existingBuilder = this.builders.find(\n b => b.graphType === builder.graphType\n );\n\n if (!existingBuilder) {\n this.builders.push(builder);\n }\n // If builder is already registered, simply ignore (avoid duplicates)\n }\n\n getBuilders(): AbstractGraphBuilder<string>[] {\n return this.builders;\n }\n}\n","/**\n * Utilities for working with versioned graph types\n * Format: \"company.name::version\"\n * Examples:\n * - \"global.simple::1.2.0\"\n * - \"company-123.customRag::2.1.0-beta\"\n * - \"global.simple\" (without version)\n * - \"simple\" (legacy format)\n */\nexport class GraphTypeUtils {\n /**\n * Parse full graph type\n * @param fullType - full graph type\n * @returns object with type components\n */\n static parse(fullType: string): {\n companyId: string;\n name: string;\n version?: string;\n } {\n // Check for version presence\n if (fullType.includes(\"::\")) {\n const [baseType, version] = fullType.split(\"::\");\n const [companyId, name] = baseType.split(\".\");\n return { companyId, name, version };\n }\n\n // Without version: \"global.simple\" or legacy format \"simple\"\n const parts = fullType.split(\".\");\n\n // Legacy format: \"simple\" → \"global.simple\"\n if (parts.length === 1) {\n return { companyId: \"global\", name: parts[0] };\n }\n\n // Format without version: \"global.simple\"\n return { companyId: parts[0], name: parts[1] };\n }\n\n /**\n * Build full type from components\n * @param companyId - company ID\n * @param name - graph name\n * @param version - version (optional)\n * @returns full graph type\n */\n static build(companyId: string, name: string, version?: string): string {\n const base = `${companyId}.${name}`;\n return version ? `${base}::${version}` : base;\n }\n\n /**\n * Normalize graph type for backward compatibility\n * @param graphType - graph type in any format\n * @returns normalized type\n */\n static normalize(graphType: string): string {\n const { companyId, name, version } = this.parse(graphType);\n return this.build(companyId, name, version);\n }\n\n /**\n * Get base type without version\n * @param graphType - full graph type\n * @returns base type\n */\n static getBaseType(graphType: string): string {\n if (graphType.includes(\"::\")) {\n return graphType.split(\"::\")[0];\n }\n // Normalize legacy format\n const { companyId, name } = this.parse(graphType);\n return `${companyId}.${name}`;\n }\n\n /**\n * Extract version from graph type\n * @param graphType - full graph type\n * @returns version or undefined\n */\n static getVersion(graphType: string): string | undefined {\n return graphType.includes(\"::\") ? graphType.split(\"::\")[1] : undefined;\n }\n\n /**\n * Validate version (basic semver check)\n * @param version - version to check\n * @returns true if version is valid\n */\n static isValidVersion(version: string): boolean {\n // Basic semver pattern check\n const semverRegex = /^\\d+\\.\\d+\\.\\d+(-[a-zA-Z0-9.-]+)?$/;\n return semverRegex.test(version);\n }\n\n /**\n * Check if type is system (global)\n * @param graphType - graph type\n * @returns true if graph is system\n */\n static isSystemGraph(graphType: string): boolean {\n const { companyId } = this.parse(graphType);\n return companyId === \"global\";\n }\n\n /**\n * Compare versions (simple comparison for sorting)\n * @param a - first version\n * @param b - second version\n * @returns -1, 0, 1 for sorting\n */\n static compareVersions(a: string, b: string): number {\n const parseVersion = (v: string) => {\n const [main, prerelease] = v.split(\"-\");\n const [major, minor, patch] = main.split(\".\").map(Number);\n return { major, minor, patch, prerelease };\n };\n\n const versionA = parseVersion(a);\n const versionB = parseVersion(b);\n\n // Compare major\n if (versionA.major !== versionB.major) {\n return versionA.major - versionB.major;\n }\n\n // Compare minor\n if (versionA.minor !== versionB.minor) {\n return versionA.minor - versionB.minor;\n }\n\n // Compare patch\n if (versionA.patch !== versionB.patch) {\n return versionA.patch - versionB.patch;\n }\n\n // Compare prerelease\n if (versionA.prerelease && !versionB.prerelease) return -1;\n if (!versionA.prerelease && versionB.prerelease) return 1;\n if (versionA.prerelease && versionB.prerelease) {\n return versionA.prerelease.localeCompare(versionB.prerelease);\n }\n\n return 0;\n }\n}\n","// packages/sdk/src/versioning/versioned-graph.service.ts\nimport { Injectable, Logger } from \"@nestjs/common\";\nimport { ModuleRef } from \"@nestjs/core\";\nimport { GraphTypeUtils } from \"../../utils/graph-type.utils\";\nimport { AbstractGraphBuilder } from \"../abstract-graph.builder\";\nimport {\n VersioningConfig,\n VersionRoute,\n VersionResolution,\n VersionResolutionOptions,\n} from \"./versioning.types\";\n\n/**\n * Service for managing graph versions\n * Abstracts versioning logic to the service-mesh level\n */\n@Injectable()\nexport class VersionedGraphService {\n private readonly logger = new Logger(VersionedGraphService.name);\n private readonly versionConfigs = new Map<string, VersioningConfig>();\n\n constructor() {\n // Initialization now happens through UniversalGraphModule\n // ModuleRef will be provided when needed via method parameters\n }\n\n /**\n * Register versioning configuration\n */\n registerVersioning(config: VersioningConfig): void {\n this.versionConfigs.set(config.baseGraphType, config);\n this.logger.log(\n `Registered versioning for ${config.baseGraphType} with ${config.versions.length} versions`\n );\n }\n\n /**\n * Resolve graph version\n */\n async resolveVersion(\n graphType: string,\n options: VersionResolutionOptions = {}\n ): Promise<VersionResolution> {\n const parsed = GraphTypeUtils.parse(graphType);\n const baseType = GraphTypeUtils.getBaseType(graphType);\n const requestedVersion =\n GraphTypeUtils.getVersion(graphType) || options.requestedVersion;\n\n const config = this.versionConfigs.get(baseType);\n if (!config) {\n throw new Error(`No versioning configuration found for ${baseType}`);\n }\n\n // Find suitable version\n const route = this.findBestVersionRoute(config, requestedVersion, options);\n if (!route) {\n throw new Error(\n `No compatible version found for ${graphType} with options: ${JSON.stringify(options)}`\n );\n }\n\n const fullGraphType = GraphTypeUtils.build(\n parsed.companyId,\n parsed.name,\n route.version\n );\n\n return {\n version: route.version,\n builderClass: route.builderClass,\n fullGraphType,\n };\n }\n\n /**\n * Create builder for specified version\n */\n async createVersionedBuilder(\n graphType: string,\n moduleRef?: ModuleRef,\n options: VersionResolutionOptions = {}\n ): Promise<AbstractGraphBuilder<any>> {\n const resolution = await this.resolveVersion(graphType, options);\n\n try {\n if (!moduleRef) {\n throw new Error(\n \"ModuleRef is not available - falling back to direct instantiation\"\n );\n }\n const builder = await moduleRef.create(resolution.builderClass);\n this.logger.debug(\n `Created versioned builder for ${resolution.fullGraphType}`\n );\n return builder;\n } catch (error) {\n this.logger.error(\n `Failed to create builder for ${resolution.fullGraphType}: ${error.message}`\n );\n throw new Error(`Failed to create versioned builder: ${error.message}`);\n }\n }\n\n /**\n * Get all available versions for a graph\n */\n getAvailableVersions(baseGraphType: string): string[] {\n const config = this.versionConfigs.get(baseGraphType);\n if (!config) {\n return [];\n }\n\n return config.versions\n .map(route => route.version)\n .sort((a, b) => GraphTypeUtils.compareVersions(b, a)); // Sort in descending order\n }\n\n /**\n * Check version support\n */\n isVersionSupported(\n graphType: string,\n options: VersionResolutionOptions = {}\n ): boolean {\n try {\n const baseType = GraphTypeUtils.getBaseType(graphType);\n const requestedVersion = GraphTypeUtils.getVersion(graphType);\n const config = this.versionConfigs.get(baseType);\n\n if (!config) {\n return false;\n }\n\n const route = this.findBestVersionRoute(\n config,\n requestedVersion,\n options\n );\n return route !== null;\n } catch {\n return false;\n }\n }\n\n /**\n * Find best version\n */\n private findBestVersionRoute(\n config: VersioningConfig,\n requestedVersion?: string,\n options: VersionResolutionOptions = {}\n ): VersionRoute | null {\n const { strict = false } = options;\n let candidates = [...config.versions];\n\n // If a specific version is requested\n if (requestedVersion) {\n // Exact match\n const exactMatch = candidates.find(\n route => route.version === requestedVersion\n );\n if (exactMatch) {\n return exactMatch;\n }\n\n // In strict mode, don't search for alternatives\n if (strict) {\n return null;\n }\n\n // Find compatible version (semantic versioning)\n const compatibleVersions = candidates.filter(route =>\n this.isVersionCompatible(requestedVersion, route.version)\n );\n\n if (compatibleVersions.length > 0) {\n // Return the newest compatible version\n return compatibleVersions.sort((a, b) =>\n GraphTypeUtils.compareVersions(b.version, a.version)\n )[0];\n }\n }\n\n // Return default version\n const defaultRoute = candidates.find(route => route.isDefault);\n if (defaultRoute) {\n return defaultRoute;\n }\n\n // If there's no explicit default version, use strategy\n if (\n config.defaultVersionStrategy === \"latest\" ||\n !config.defaultVersionStrategy\n ) {\n const sortedVersions = candidates.sort((a, b) =>\n GraphTypeUtils.compareVersions(b.version, a.version)\n );\n return sortedVersions[0] || null;\n }\n\n return null;\n }\n\n /**\n * Check version compatibility (simplified semantics)\n */\n private isVersionCompatible(requested: string, available: string): boolean {\n try {\n const requestedParts = requested.split(\".\").map(Number);\n const availableParts = available.split(\".\").map(Number);\n\n // Major version must match\n if (requestedParts[0] !== availableParts[0]) {\n return false;\n }\n\n // Available version must be >= requested\n return GraphTypeUtils.compareVersions(available, requested) >= 0;\n } catch {\n return false;\n }\n }\n\n /**\n * Get versioning configuration information\n */\n getVersioningInfo(baseGraphType: string): VersioningConfig | null {\n return this.versionConfigs.get(baseGraphType) || null;\n }\n}\n","import { randomBytes } from \"crypto\";\nimport type Redis from \"ioredis\";\nimport { CallbackEntry, CallbackRecord } from \"./callback.interface\";\n\n/**\n * CallbackStore manages callback tokens and their lifecycle.\n *\n * Production mode (NODE_ENV=production):\n * - Uses Lua scripts for atomic operations (better performance, guaranteed consistency)\n * - Prevents race conditions in high-concurrency scenarios\n * - Single network round-trip per operation\n *\n * Development mode (NODE_ENV!=production):\n * - Uses simple Redis operations for ioredis-mock compatibility\n * - Non-atomic operations (acceptable for development/testing)\n * - Better debugging and simpler error handling\n */\nexport class CallbackStore {\n private readonly isProduction: boolean;\n\n constructor(private readonly redis: Redis) {\n this.isProduction = process.env.NODE_ENV === \"production\";\n }\n\n private generateToken(graphType: string): string {\n // Use :: as separator since it's not used in base64url\n // Format: cb::{graphType}::{random}\n // 8 bytes = 64 bits of entropy, practically collision-free for short-lived tokens\n return `cb::${graphType}::${randomBytes(8).toString(\"base64url\")}`;\n }\n\n /**\n * Issues a new callback token and persists its payload.\n */\n async issue(entry: CallbackEntry): Promise<string> {\n const token = this.generateToken(entry.graphType);\n const record: CallbackRecord = {\n ...entry,\n token,\n status: \"pending\",\n createdAt: Date.now(),\n retries: 0,\n };\n const ttl = entry.metadata?.ttlSec ?? 600; // default 10 minutes\n await this.redis.setex(`callback:${token}`, ttl, JSON.stringify(record));\n return token;\n }\n\n /**\n * Atomically fetches callback data and acquires a lock.\n */\n async getAndLock(token: string): Promise<CallbackRecord | null> {\n if (this.isProduction) {\n return this.getAndLockAtomic(token);\n } else {\n return this.getAndLockSimple(token);\n }\n }\n\n /**\n * Production version with Lua script for atomicity\n */\n private async getAndLockAtomic(\n token: string\n ): Promise<CallbackRecord | null> {\n const script = `\n local data = redis.call('GET', KEYS[1])\n if not data then return nil end\n local record = cjson.decode(data)\n if record.status ~= 'pending' then return nil end\n record.status = 'processing'\n redis.call('SET', KEYS[1], cjson.encode(record))\n return cjson.encode(record)\n `;\n const result = await this.redis.eval(script, 1, `callback:${token}`);\n return result ? (JSON.parse(result as string) as CallbackRecord) : null;\n }\n\n /**\n * Development version with simple operations for ioredis-mock compatibility\n */\n private async getAndLockSimple(\n token: string\n ): Promise<CallbackRecord | null> {\n const key = `callback:${token}`;\n const data = await this.redis.get(key);\n\n if (!data) {\n return null;\n }\n\n try {\n const record = JSON.parse(data) as CallbackRecord;\n\n if (record.status !== \"pending\") {\n return null;\n }\n\n // Update status to processing\n record.status = \"processing\";\n await this.redis.set(key, JSON.stringify(record));\n\n return record;\n } catch (error) {\n console.error(\"Failed to parse callback record:\", error);\n return null;\n }\n }\n\n /**\n * Finalizes callback processing by removing token.\n */\n async finalize(token: string): Promise<void> {\n await this.redis.del(`callback:${token}`);\n }\n\n /**\n * Mark callback as failed and store error message.\n */\n async fail(token: string, error: string): Promise<CallbackRecord | null> {\n if (this.isProduction) {\n return this.failAtomic(token, error);\n } else {\n return this.failSimple(token, error);\n }\n }\n\n /**\n * Production version with Lua script for atomicity\n */\n private async failAtomic(\n token: string,\n error: string\n ): Promise<CallbackRecord | null> {\n const script = `\n local data = redis.call('GET', KEYS[1])\n if not data then return nil end\n local record = cjson.decode(data)\n record.status = 'failed'\n record.retries = (record.retries or 0) + 1\n record.lastError = ARGV[1]\n redis.call('SET', KEYS[1], cjson.encode(record))\n return cjson.encode(record)\n `;\n const result = await this.redis.eval(script, 1, `callback:${token}`, error);\n return result ? (JSON.parse(result as string) as CallbackRecord) : null;\n }\n\n /**\n * Development version with simple operations for ioredis-mock compatibility\n */\n private async failSimple(\n token: string,\n error: string\n ): Promise<CallbackRecord | null> {\n const key = `callback:${token}`;\n const data = await this.redis.get(key);\n\n if (!data) {\n return null;\n }\n\n try {\n const record = JSON.parse(data) as CallbackRecord;\n record.status = \"failed\";\n record.retries = (record.retries || 0) + 1;\n record.lastError = error;\n\n await this.redis.set(key, JSON.stringify(record));\n return record;\n } catch (parseError) {\n console.error(\"Failed to parse callback record:\", parseError);\n return null;\n }\n }\n\n /**\n * Reset callback status to pending for retry.\n */\n async retry(token: string): Promise<CallbackRecord | null> {\n if (this.isProduction) {\n return this.retryAtomic(token);\n } else {\n return this.retrySimple(token);\n }\n }\n\n /**\n * Production version with Lua script for atomicity\n */\n private async retryAtomic(token: string): Promise<CallbackRecord | null> {\n const script = `\n local data = redis.call('GET', KEYS[1])\n if not data then return nil end\n local record = cjson.decode(data)\n record.status = 'pending'\n redis.call('SET', KEYS[1], cjson.encode(record))\n return cjson.encode(record)\n `;\n const result = await this.redis.eval(script, 1, `callback:${token}`);\n return result ? (JSON.parse(result as string) as CallbackRecord) : null;\n }\n\n /**\n * Development version with simple operations for ioredis-mock compatibility\n */\n private async retrySimple(token: string): Promise<CallbackRecord | null> {\n const key = `callback:${token}`;\n const data = await this.redis.get(key);\n\n if (!data) {\n return null;\n }\n\n try {\n const record = JSON.parse(data) as CallbackRecord;\n record.status = \"pending\";\n\n await this.redis.set(key, JSON.stringify(record));\n return record;\n } catch (parseError) {\n console.error(\"Failed to parse callback record:\", parseError);\n return null;\n }\n }\n}\n","import { CallbackHandler } from \"./callback.interface\";\n\nexport class CallbackRegistry {\n private handlers = new Map<string, CallbackHandler>();\n\n /**\n * Register a callback with optional graph type for versioning\n * @param handler Handler name (e.g., \"confirm-transaction\")\n * @param callback The callback function\n * @param graphType Optional graph type for version-specific registration\n */\n register(\n handler: string,\n callback: CallbackHandler,\n graphType?: string\n ): void {\n // If graphType provided, use versioned key\n const key = graphType ? `${graphType}::${handler}` : handler;\n this.handlers.set(key, callback);\n\n // Also register without version as fallback (for backward compatibility)\n if (graphType) {\n this.handlers.set(handler, callback);\n }\n }\n\n /**\n * Get a callback handler, with version-aware lookup\n * @param handler Handler name\n * @param graphType Optional graph type for version-specific lookup\n */\n get(handler: string, graphType?: string): CallbackHandler | undefined {\n // First try version-specific lookup if graphType provided\n if (graphType) {\n const versionedHandler = this.handlers.get(`${graphType}::${handler}`);\n if (versionedHandler) {\n return versionedHandler;\n }\n }\n\n // Fallback to non-versioned handler\n return this.handlers.get(handler);\n }\n\n /**\n * List all registered handlers (for debugging)\n */\n listHandlers(): string[] {\n return Array.from(this.handlers.keys());\n }\n}\n","import { Injectable, Logger } from \"@nestjs/common\";\nimport type Redis from \"ioredis\";\nimport { createHash } from \"crypto\";\nimport { CallbackResult } from \"./callback.interface\";\n\nexport interface IdempotencyConfig {\n ttlSeconds: number; // How long to cache results\n keyPrefix: string; // Redis key prefix\n hashPayload: boolean; // Whether to hash the payload for key generation\n includeUserId: boolean; // Include userId in idempotency key\n}\n\nexport interface IdempotencyEntry {\n key: string;\n result: CallbackResult;\n createdAt: number;\n executedAt: number;\n expiresAt: number;\n requestHash: string;\n attempts: number;\n}\n\nexport enum IdempotencyStatus {\n NEW = \"NEW\",\n IN_PROGRESS = \"IN_PROGRESS\",\n COMPLETED = \"COMPLETED\",\n FAILED = \"FAILED\",\n}\n\n/**\n * Manages idempotent callback execution to prevent duplicate operations.\n * Caches results and ensures exactly-once execution semantics.\n */\n@Injectable()\nexport class IdempotencyManager {\n private readonly logger = new Logger(IdempotencyManager.name);\n private readonly defaultConfig: IdempotencyConfig = {\n ttlSeconds: 3600, // 1 hour default\n keyPrefix: \"idempotency\",\n hashPayload: true,\n includeUserId: true,\n };\n\n constructor(private readonly redis: Redis) {}\n\n /**\n * Check if a request is idempotent and return cached result if available.\n * If not, acquire a lock for execution.\n */\n async checkAndLock(\n idempotencyKey: string | undefined,\n requestData: {\n userId?: string;\n graphType: string;\n handler: string;\n params: Record<string, any>;\n },\n config?: Partial<IdempotencyConfig>\n ): Promise<{\n status: IdempotencyStatus;\n result?: CallbackResult;\n key: string;\n }> {\n const cfg = { ...this.defaultConfig, ...config };\n\n // Generate idempotency key if not provided\n const key = idempotencyKey || this.generateKey(requestData, cfg);\n const redisKey = `${cfg.keyPrefix}:${key}`;\n\n // Try to get existing result\n const existing = await this.redis.get(redisKey);\n if (existing) {\n try {\n const entry: IdempotencyEntry = JSON.parse(existing);\n\n // Check if it's still being processed\n if (entry.result === null && entry.executedAt === 0) {\n // Check if it's stuck (processing for more than 5 minutes)\n const processingTime = Date.now() - entry.createdAt;\n if (processingTime > 300000) {\n // Reset stuck entry\n await this.redis.del(redisKey);\n } else {\n return {\n status: IdempotencyStatus.IN_PROGRESS,\n key,\n };\n }\n }\n\n // Return cached result\n this.logger.debug(\n `Returning cached result for idempotency key: ${key}`\n );\n return {\n status: IdempotencyStatus.COMPLETED,\n result: entry.result,\n key,\n };\n } catch (error) {\n this.logger.error(\n `Failed to parse idempotency entry: ${error.message}`\n );\n await this.redis.del(redisKey);\n }\n }\n\n // Try to acquire lock for new execution\n const lockAcquired = await this.acquireLock(redisKey, cfg.ttlSeconds);\n if (!lockAcquired) {\n // Someone else is processing\n return {\n status: IdempotencyStatus.IN_PROGRESS,\n key,\n };\n }\n\n return {\n status: IdempotencyStatus.NEW,\n key,\n };\n }\n\n /**\n * Store the result of an idempotent operation.\n */\n async storeResult(\n key: string,\n result: CallbackResult,\n config?: Partial<IdempotencyConfig>\n ): Promise<void> {\n const cfg = { ...this.defaultConfig, ...config };\n const redisKey = `${cfg.keyPrefix}:${key}`;\n\n const entry: IdempotencyEntry = {\n key,\n result,\n createdAt: Date.now(),\n executedAt: Date.now(),\n expiresAt: Date.now() + cfg.ttlSeconds * 1000,\n requestHash: \"\",\n attempts: 1,\n };\n\n await this.redis.setex(redisKey, cfg.ttlSeconds, JSON.stringify(entry));\n\n this.logger.debug(`Stored idempotent result for key: ${key}`);\n }\n\n /**\n * Mark an idempotent operation as failed.\n */\n async markFailed(\n key: string,\n error: string,\n config?: Partial<IdempotencyConfig>\n ): Promise<void> {\n const cfg = { ...this.defaultConfig, ...config };\n const redisKey = `${cfg.keyPrefix}:${key}`;\n\n // Store failure with shorter TTL (5 minutes)\n const entry: IdempotencyEntry = {\n key,\n result: {\n success: false,\n error,\n },\n createdAt: Date.now(),\n executedAt: Date.now(),\n expiresAt: Date.now() + 300000, // 5 minutes\n requestHash: \"\",\n attempts: 1,\n };\n\n await this.redis.setex(\n redisKey,\n 300, // 5 minutes TTL for failures\n JSON.stringify(entry)\n );\n\n this.logger.debug(`Marked idempotent operation as failed for key: ${key}`);\n }\n\n /**\n * Release lock if operation fails unexpectedly.\n */\n async releaseLock(\n key: string,\n config?: Partial<IdempotencyConfig>\n ): Promise<void> {\n const cfg = { ...this.defaultConfig, ...config };\n const redisKey = `${cfg.keyPrefix}:${key}`;\n await this.redis.del(redisKey);\n this.logger.debug(`Released lock for key: ${key}`);\n }\n\n /**\n * Generate idempotency key from request data.\n */\n private generateKey(\n requestData: {\n userId?: string;\n graphType: string;\n handler: string;\n params: Record<string, any>;\n },\n config: IdempotencyConfig\n ): string {\n const components: string[] = [requestData.graphType, requestData.handler];\n\n if (config.includeUserId && requestData.userId) {\n components.push(requestData.userId);\n }\n\n // Create deterministic string from params\n const paramsStr = this.deterministicStringify(requestData.params);\n\n if (config.hashPayload) {\n // Hash the params for shorter key\n const hash = createHash(\"sha256\")\n .update(paramsStr)\n .digest(\"hex\")\n .substring(0, 16);\n components.push(hash);\n } else {\n components.push(paramsStr);\n }\n\n return components.join(\":\");\n }\n\n /**\n * Acquire lock for idempotent operation.\n */\n private async acquireLock(key: string, ttlSeconds: number): Promise<boolean> {\n // Create lock entry\n const entry: IdempotencyEntry = {\n key,\n result: null as any,\n createdAt: Date.now(),\n executedAt: 0,\n expiresAt: Date.now() + ttlSeconds * 1000,\n requestHash: \"\",\n attempts: 1,\n };\n\n // SET NX - only set if not exists\n const result = await this.redis.set(\n key,\n JSON.stringify(entry),\n \"EX\",\n ttlSeconds,\n \"NX\"\n );\n\n return result === \"OK\";\n }\n\n /**\n * Create deterministic JSON stringify (sorted keys).\n */\n private deterministicStringify(obj: any): string {\n return JSON.stringify(this.sortObject(obj));\n }\n\n /**\n * Recursively sort object keys for deterministic stringification.\n */\n private sortObject(obj: any): any {\n if (obj === null || typeof obj !== \"object\") {\n return obj;\n }\n\n if (Array.isArray(obj)) {\n return obj.map(item => this.sortObject(item));\n }\n\n const sorted: Record<string, any> = {};\n Object.keys(obj)\n .sort()\n .forEach(key => {\n sorted[key] = this.sortObject(obj[key]);\n });\n\n return sorted;\n }\n\n /**\n * Clean up expired idempotency entries.\n */\n async cleanup(): Promise<number> {\n const pattern = `${this.defaultConfig.keyPrefix}:*`;\n const keys = await this.redis.keys(pattern);\n let cleaned = 0;\n\n for (const key of keys) {\n const value = await this.redis.get(key);\n if (value) {\n try {\n const entry: IdempotencyEntry = JSON.parse(value);\n if (entry.expiresAt < Date.now()) {\n await this.redis.del(key);\n cleaned++;\n }\n } catch {\n // Invalid entry, delete it\n await this.redis.del(key);\n cleaned++;\n }\n }\n }\n\n this.logger.log(`Cleaned up ${cleaned} expired idempotency entries`);\n return cleaned;\n }\n\n /**\n * Get statistics about idempotency cache.\n */\n async getStatistics(): Promise<{\n totalEntries: number;\n completedEntries: number;\n inProgressEntries: number;\n failedEntries: number;\n cacheHitRate: number;\n }> {\n const pattern = `${this.defaultConfig.keyPrefix}:*`;\n const keys = await this.redis.keys(pattern);\n\n let completed = 0;\n let inProgress = 0;\n let failed = 0;\n\n for (const key of keys) {\n const value = await this.redis.get(key);\n if (value) {\n try {\n const entry: IdempotencyEntry = JSON.parse(value);\n if (entry.result === null) {\n inProgress++;\n } else if (entry.result.success === false) {\n failed++;\n } else {\n completed++;\n }\n } catch {\n // Skip invalid entries\n }\n }\n }\n\n const total = completed + inProgress + failed;\n const cacheHitRate = total > 0 ? (completed / total) * 100 : 0;\n\n return {\n totalEntries: total,\n completedEntries: completed,\n inProgressEntries: inProgress,\n failedEntries: failed,\n cacheHitRate,\n };\n }\n}\n","import { Injectable, Logger } from \"@nestjs/common\";\nimport { CallbackRegistry } from \"./callback-registry\";\nimport { CallbackRecord, CallbackResult } from \"./callback.interface\";\nimport { CallbackStore } from \"./callback-store\";\nimport { CallbackACL, CallbackUser } from \"./callback-acl.service\";\nimport { CallbackAuditor } from \"./callback-auditor.service\";\nimport { CallbackMetrics } from \"./callback-metrics.service\";\nimport { CallbackRateLimiter } from \"./callback-rate-limiter\";\nimport { IdempotencyManager, IdempotencyStatus } from \"./idempotency-manager\";\nimport { CallbackPatchService } from \"./callback-patch.service\";\n\nexport interface RouterConfig {\n maxRetries?: number;\n retryDelayMs?: number;\n timeoutMs?: number;\n enableCircuitBreaker?: boolean;\n circuitBreakerThreshold?: number;\n circuitBreakerResetMs?: number;\n}\n\ninterface CircuitBreakerState {\n failures: number;\n lastFailure?: number;\n state: \"closed\" | \"open\" | \"half-open\";\n}\n\n/**\n * Enhanced Smart Callback Router with error handling, retry logic,\n * circuit breaker pattern, and comprehensive monitoring.\n */\n@Injectable()\nexport class SmartCallbackRouter {\n private readonly logger = new Logger(SmartCallbackRouter.name);\n private readonly circuitBreakers = new Map<string, CircuitBreakerState>();\n private readonly defaultConfig: RouterConfig = {\n maxRetries: 3,\n retryDelayMs: 1000,\n timeoutMs: 30000,\n enableCircuitBreaker: true,\n circuitBreakerThreshold: 5,\n circuitBreakerResetMs: 60000,\n };\n\n constructor(\n private readonly registry: CallbackRegistry,\n private readonly store: CallbackStore,\n private readonly acl: CallbackACL,\n private readonly auditor: CallbackAuditor,\n private readonly metrics: CallbackMetrics,\n private readonly rateLimiter: CallbackRateLimiter,\n private readonly idempotencyManager: IdempotencyManager,\n private readonly patchService: CallbackPatchService\n ) {}\n\n /**\n * Route and execute callback with full error handling and monitoring.\n */\n async route(\n record: CallbackRecord,\n user: CallbackUser | undefined,\n requestMetadata?: {\n ip?: string;\n userAgent?: string;\n platform?: string;\n platformContext?: any;\n },\n config?: RouterConfig\n ): Promise<CallbackResult> {\n const cfg = { ...this.defaultConfig, ...config };\n const startTime = Date.now();\n const correlationId = await this.auditor.logExecutionStart(record, user);\n let idempotencyCheck: any = null;\n\n try {\n // 1. Check idempotency first\n const idempotencyKey = record.metadata?.idempotencyKey;\n idempotencyCheck = await this.idempotencyManager.checkAndLock(\n idempotencyKey,\n {\n userId: record.userId,\n graphType: record.graphType,\n handler: record.handler,\n params: record.params,\n }\n );\n\n // Return cached result if already executed\n if (idempotencyCheck.status === IdempotencyStatus.COMPLETED) {\n this.logger.debug(`Returning cached result for ${record.token}`);\n return idempotencyCheck.result!;\n }\n\n // Wait if already in progress\n if (idempotencyCheck.status === IdempotencyStatus.IN_PROGRESS) {\n throw new Error(\"Request is already being processed\");\n }\n\n // 2. Check rate limits\n await this.checkRateLimits(user, requestMetadata?.ip);\n\n // ACL permissions already validated by CallbackTokenGuard\n // No need to validate again here\n\n // 3. Record token age\n const tokenAge = Date.now() - record.createdAt;\n this.metrics.recordTokenAge(record.graphType, tokenAge);\n\n // 4. Check circuit breaker\n this.checkCircuitBreaker(record.graphType, record.handler);\n\n // 5. Start execution\n this.metrics.recordExecutionStart(record.graphType, record.handler);\n\n // 6. Execute with timeout and retry\n const result = await this.executeWithRetry(\n record,\n user,\n cfg,\n correlationId\n );\n\n // 7. Record success\n const duration = Date.now() - startTime;\n await this.auditor.logExecutionSuccess(\n record,\n user,\n result,\n duration,\n correlationId\n );\n this.metrics.recordExecutionComplete(\n record.graphType,\n record.handler,\n duration,\n true\n );\n\n // 8. Reset circuit breaker on success\n this.resetCircuitBreaker(record.graphType, record.handler);\n\n // 9. Store idempotent result\n await this.idempotencyManager.storeResult(idempotencyCheck.key, result);\n\n // 10. Finalize token\n await this.store.finalize(record.token);\n\n // 11. Apply patch if provided\n if (result.patch) {\n await this.patchService.apply(\n record,\n result.patch,\n requestMetadata?.platformContext\n );\n }\n\n return result;\n } catch (error) {\n // Record failure\n const duration = Date.now() - startTime;\n await this.auditor.logExecutionFailure(\n record,\n user,\n error,\n duration,\n correlationId\n );\n this.metrics.recordExecutionComplete(\n record.graphType,\n record.handler,\n duration,\n false,\n error.message\n );\n\n // Update circuit breaker\n this.recordCircuitBreakerFailure(record.graphType, record.handler);\n\n // Mark idempotency as failed\n if (idempotencyCheck) {\n await this.idempotencyManager.markFailed(\n idempotencyCheck.key,\n error.message\n );\n }\n\n // Mark token as failed\n await this.store.fail(record.token, error.message);\n\n throw error;\n }\n }\n\n /**\n * Execute callback with retry logic.\n */\n private async executeWithRetry(\n record: CallbackRecord,\n user: CallbackUser | undefined,\n config: RouterConfig,\n correlationId: string\n ): Promise<CallbackResult> {\n let lastError: Error;\n\n for (let attempt = 1; attempt <= config.maxRetries!; attempt++) {\n try {\n if (attempt > 1) {\n // Log retry attempt\n await this.auditor.logRetryAttempt(record, user, attempt);\n this.metrics.recordRetry(record.graphType, record.handler);\n\n // Wait before retry with exponential backoff\n const delay = config.retryDelayMs! * Math.pow(2, attempt - 2);\n await this.sleep(delay);\n }\n\n // Execute with timeout\n return await this.executeWithTimeout(record, config.timeoutMs!);\n } catch (error) {\n lastError = error;\n this.logger.warn(\n `[${correlationId}] Attempt ${attempt}/${config.maxRetries} failed: ${error.message}`\n );\n\n // Don't retry on certain errors\n if (this.isNonRetryableError(error)) {\n throw error;\n }\n }\n }\n\n throw new Error(\n `Callback execution failed after ${config.maxRetries} attempts: ${lastError!.message}`\n );\n }\n\n /**\n * Execute callback with timeout.\n */\n private async executeWithTimeout(\n record: CallbackRecord,\n timeoutMs: number\n ): Promise<CallbackResult> {\n const handler = this.registry.get(record.handler, record.graphType);\n if (!handler) {\n throw new Error(\n `No callback handler registered for ${record.handler} (graphType: ${record.graphType})`\n );\n }\n\n return Promise.race([\n handler({\n userId: record.userId,\n threadId: record.threadId,\n agentId: record.agentId,\n params: record.params,\n platform: record.metadata?.platform,\n metadata: record.metadata,\n }),\n new Promise<never>((_, reject) =>\n setTimeout(\n () =>\n reject(\n new Error(`Callback execution timeout after ${timeoutMs}ms`)\n ),\n timeoutMs\n )\n ),\n ]);\n }\n\n /**\n * Check rate limits for user and IP.\n */\n private async checkRateLimits(\n user: CallbackUser | undefined,\n ip?: string\n ): Promise<void> {\n // Check user rate limit\n if (user) {\n const userLimit = await this.rateLimiter.checkUserLimit(user.userId);\n if (!userLimit.allowed) {\n this.metrics.recordRateLimited(\"user\");\n await this.auditor.logRateLimited(\n `user:${user.userId}`,\n userLimit.retryAfter!\n );\n throw new Error(\n `Rate limit exceeded. Retry after ${userLimit.retryAfter} seconds`\n );\n }\n }\n\n // Check IP rate limit\n if (ip) {\n const ipLimit = await this.rateLimiter.checkIpLimit(ip);\n if (!ipLimit.allowed) {\n this.metrics.recordRateLimited(\"ip\");\n await this.auditor.logRateLimited(`ip:${ip}`, ipLimit.retryAfter!);\n throw new Error(\n `Rate limit exceeded. Retry after ${ipLimit.retryAfter} seconds`\n );\n }\n }\n }\n\n /**\n * Check circuit breaker state.\n */\n private checkCircuitBreaker(graphType: string, handler: string): void {\n const key = `${graphType}::${handler}`;\n const breaker = this.circuitBreakers.get(key);\n\n if (!breaker) return;\n\n if (breaker.state === \"open\") {\n const now = Date.now();\n const resetTime =\n breaker.lastFailure! + this.defaultConfig.circuitBreakerResetMs!;\n\n if (now < resetTime) {\n throw new Error(\n `Circuit breaker is open for ${key}. Service temporarily unavailable.`\n );\n } else {\n // Move to half-open state\n breaker.state = \"half-open\";\n }\n }\n }\n\n /**\n * Record circuit breaker failure.\n */\n private recordCircuitBreakerFailure(\n graphType: string,\n handler: string\n ): void {\n const key = `${graphType}::${handler}`;\n const breaker = this.circuitBreakers.get(key) || {\n failures: 0,\n state: \"closed\",\n };\n\n breaker.failures++;\n breaker.lastFailure = Date.now();\n\n if (breaker.failures >= this.defaultConfig.circuitBreakerThreshold!) {\n breaker.state = \"open\";\n this.logger.error(\n `Circuit breaker opened for ${key} after ${breaker.failures} failures`\n );\n }\n\n this.circuitBreakers.set(key, breaker);\n }\n\n /**\n * Reset circuit breaker on success.\n */\n private resetCircuitBreaker(graphType: string, handler: string): void {\n const key = `${graphType}::${handler}`;\n this.circuitBreakers.delete(key);\n }\n\n /**\n * Check if error is non-retryable.\n */\n private isNonRetryableError(error: Error): boolean {\n const message = error.message.toLowerCase();\n return (\n message.includes(\"forbidden\") ||\n message.includes(\"unauthorized\") ||\n message.includes(\"invalid token\") ||\n message.includes(\"expired\") ||\n message.includes(\"rate limit\")\n );\n }\n\n /**\n * Sleep helper for retry delays.\n */\n private sleep(ms: number): Promise<void> {\n return new Promise(resolve => setTimeout(resolve, ms));\n }\n\n /**\n * Get circuit breaker status.\n */\n getCircuitBreakerStatus(): Map<string, CircuitBreakerState> {\n return new Map(this.circuitBreakers);\n }\n}\n","import { CallbackStore } from \"./callback-store\";\nimport { SmartCallbackRouter } from \"./smart-callback.router\";\nimport { CallbackResult, CallbackRecord } from \"./callback.interface\";\n\nexport class UniversalCallbackService {\n constructor(\n private readonly store: CallbackStore,\n private readonly router: SmartCallbackRouter\n ) {}\n\n async handle(\n record: CallbackRecord,\n user?: any,\n metadata?: {\n ip?: string;\n userAgent?: string;\n platform?: string;\n platformContext?: any;\n }\n ): Promise<CallbackResult> {\n try {\n const result = await this.router.route(record, user, metadata);\n // Note: finalization is now handled by the router\n return result;\n } catch (err: any) {\n return { success: false, error: err?.message || \"Callback error\" };\n }\n }\n}\n","import { CallbackResult } from \"./callback.interface\";\nimport { CallbackRegistry } from \"./callback-registry\";\n\n/**\n * Example finance callback registration demonstrating how graph-specific\n * handlers can integrate with the universal callback system.\n */\nexport function registerFinanceExampleCallback(registry: CallbackRegistry) {\n registry.register(\n \"example\",\n async (): Promise<CallbackResult> => ({\n success: true,\n message: \"Finance callback executed\",\n }),\n \"finance::1.0.0\" // Optional graph type for versioning\n );\n}\n","import { Injectable, ForbiddenException, Logger } from \"@nestjs/common\";\nimport { CallbackRecord } from \"./callback.interface\";\n\nexport interface CallbackUser {\n userId: string;\n roles?: string[];\n permissions?: string[];\n companyId?: string;\n}\n\nexport interface ACLValidationResult {\n allowed: boolean;\n reason?: string;\n requiredScopes?: string[];\n userScopes?: string[];\n}\n\n/**\n * Access Control Layer for callback execution.\n * Validates that the user has permission to execute the callback.\n */\n@Injectable()\nexport class CallbackACL {\n private readonly logger = new Logger(CallbackACL.name);\n\n /**\n * Validates if the user can execute the callback.\n * @throws ForbiddenException if access is denied\n */\n async validate(\n user: CallbackUser | undefined,\n record: CallbackRecord\n ): Promise<ACLValidationResult> {\n const validationStart = Date.now();\n\n try {\n // 1. Check if user is authenticated\n if (!user) {\n this.logger.warn(\n `Unauthenticated access attempt for callback ${record.token}`\n );\n throw new ForbiddenException(\n \"Authentication required for callback execution\"\n );\n }\n\n // 2. Check user ID match\n if (record.userId && record.userId !== user.userId) {\n this.logger.warn(\n `User ${user.userId} attempted to execute callback for user ${record.userId}`\n );\n throw new ForbiddenException(\n \"Cannot execute callback for another user\"\n );\n }\n\n // TODO: Implement proper authorization on backend level\n // - Check access to specific agent (not graph type)\n // - Verify user has permission to use the agent\n // - Check company/organization access\n // - Backend should handle all business logic authorization\n\n this.logger.log(\n `ACL validation simplified: userId match only for callback ${record.token}`\n );\n\n // 6. Additional security checks\n await this.performAdditionalSecurityChecks(user, record);\n\n const validationTime = Date.now() - validationStart;\n this.logger.debug(\n `ACL validation passed for user ${user.userId} on callback ${record.token} ` +\n `(${validationTime}ms)`\n );\n\n return {\n allowed: true,\n };\n } catch (error) {\n const validationTime = Date.now() - validationStart;\n this.logger.error(\n `ACL validation failed for callback ${record.token} (${validationTime}ms): ${error.message}`\n );\n throw error;\n }\n }\n\n /**\n * Validates if user has required scopes/permissions.\n */\n private validateScopes(\n user: CallbackUser,\n requiredScopes: string[]\n ): boolean {\n if (!user.permissions || user.permissions.length === 0) {\n return false;\n }\n\n // Check if user has all required scopes\n return requiredScopes.every(scope => {\n // Support wildcard permissions (e.g., \"finance:*\" matches \"finance:write\")\n const hasExactScope = user.permissions.includes(scope);\n const hasWildcardScope = user.permissions.some(p => {\n if (p.includes(\"*\")) {\n const pattern = p.replace(\"*\", \".*\");\n return new RegExp(`^${pattern}$`).test(scope);\n }\n return false;\n });\n\n return hasExactScope || hasWildcardScope;\n });\n }\n\n /**\n * Validates access to specific graph type.\n * Can be extended to check graph-specific permissions.\n */\n private async validateGraphTypeAccess(\n user: CallbackUser,\n graphType: string\n ): Promise<boolean> {\n // Extract namespace from graphType (e.g., \"finance::1.0.0\" -> \"finance\")\n const [namespace] = graphType.split(\"::\");\n\n // Check if user has access to this graph namespace\n const allowedNamespaces = this.getAllowedGraphNamespaces(user);\n\n this.logger.log(`Graph access check for user ${user.userId}`, {\n graphType,\n namespace,\n allowedNamespaces,\n userRoles: user.roles,\n userPermissions: user.permissions,\n userCompanyId: user.companyId,\n });\n\n // Special case: public graphs are accessible to all authenticated users\n if (namespace === \"public\") {\n return true;\n }\n\n // Check if user has explicit access to this namespace\n if (\n !allowedNamespaces.includes(namespace) &&\n !allowedNamespaces.includes(\"*\")\n ) {\n this.logger.warn(\n `Access denied: namespace \"${namespace}\" not in allowed namespaces: ${allowedNamespaces.join(\", \")}`\n );\n return false;\n }\n\n // Additional graph-specific checks can be added here\n // For example, checking if the graph belongs to user's company\n\n return true;\n }\n\n /**\n * Gets list of graph namespaces user has access to.\n */\n private getAllowedGraphNamespaces(user: CallbackUser): string[] {\n const namespaces: string[] = [];\n\n // Admin users have access to all graphs\n if (user.roles?.includes(\"admin\")) {\n namespaces.push(\"*\");\n }\n\n // Extract namespaces from user permissions\n // e.g., \"graph:finance:read\" -> \"finance\"\n user.permissions?.forEach(permission => {\n const match = permission.match(/^graph:([^:]+):/);\n if (match) {\n namespaces.push(match[1]);\n }\n });\n\n // Users always have access to their company's graphs\n if (user.companyId) {\n namespaces.push(user.companyId);\n }\n\n return [...new Set(namespaces)]; // Remove duplicates\n }\n\n /**\n * Validates company-level access restrictions.\n */\n private validateCompanyAccess(\n user: CallbackUser,\n requiredCompanyId: string\n ): boolean {\n // Users can only access callbacks for their own company\n return user.companyId === requiredCompanyId;\n }\n\n /**\n * Performs additional security checks.\n * Can be extended for custom security requirements.\n */\n private async performAdditionalSecurityChecks(\n user: CallbackUser,\n record: CallbackRecord\n ): Promise<void> {\n // Check if callback is expired (additional safety check)\n const now = Date.now();\n const age = now - record.createdAt;\n const maxAge = (record.metadata?.ttlSec || 600) * 1000;\n\n if (age > maxAge) {\n throw new ForbiddenException(\"Callback token has expired\");\n }\n\n // Check if callback has been retried too many times\n if (record.retries > 3) {\n throw new ForbiddenException(\n \"Callback has exceeded maximum retry attempts\"\n );\n }\n\n // Check for suspicious activity patterns\n // This could be extended to check rate limits, IP restrictions, etc.\n }\n\n /**\n * Checks if a callback can be retried by the user.\n */\n async canRetry(user: CallbackUser, record: CallbackRecord): Promise<boolean> {\n // Only the original user can retry their callbacks\n if (record.userId !== user.userId) {\n return false;\n }\n\n // Check if within retry limit\n if (record.retries >= 3) {\n return false;\n }\n\n // Check if callback is in retryable state\n if (![\"failed\", \"processing\"].includes(record.status)) {\n return false;\n }\n\n return true;\n }\n\n /**\n * Gets detailed permissions for a callback.\n * Useful for debugging and audit logs.\n */\n getPermissionDetails(\n user: CallbackUser,\n record: CallbackRecord\n ): Record<string, any> {\n return {\n userId: user.userId,\n callbackUserId: record.userId,\n userIdMatch: user.userId === record.userId,\n requiredScopes: record.metadata?.scopes || [],\n userScopes: user.permissions || [],\n userRoles: user.roles || [],\n graphType: record.graphType,\n companyId: user.companyId,\n callbackCompanyId: record.metadata?.companyId,\n companyMatch:\n !record.metadata?.companyId ||\n user.companyId === record.metadata.companyId,\n };\n }\n}\n","import { Injectable, Logger } from \"@nestjs/common\";\nimport { CallbackRecord, CallbackResult } from \"./callback.interface\";\nimport { CallbackUser } from \"./callback-acl.service\";\nimport { randomUUID } from \"crypto\";\n\nexport interface AuditEntry {\n id: string;\n correlationId: string;\n timestamp: number;\n action: CallbackAuditAction;\n userId?: string;\n callbackToken: string;\n graphType: string;\n handler: string;\n success: boolean;\n duration?: number;\n error?: string;\n metadata: Record<string, any>;\n ip?: string;\n userAgent?: string;\n}\n\nexport enum CallbackAuditAction {\n TOKEN_ISSUED = \"TOKEN_ISSUED\",\n TOKEN_VALIDATED = \"TOKEN_VALIDATED\",\n TOKEN_LOCKED = \"TOKEN_LOCKED\",\n EXECUTION_STARTED = \"EXECUTION_STARTED\",\n EXECUTION_COMPLETED = \"EXECUTION_COMPLETED\",\n EXECUTION_FAILED = \"EXECUTION_FAILED\",\n TOKEN_EXPIRED = \"TOKEN_EXPIRED\",\n ACCESS_DENIED = \"ACCESS_DENIED\",\n RATE_LIMITED = \"RATE_LIMITED\",\n RETRY_ATTEMPTED = \"RETRY_ATTEMPTED\",\n}\n\n/**\n * Auditor service for callback operations.\n * Logs all callback-related activities for compliance and debugging.\n */\n@Injectable()\nexport class CallbackAuditor {\n private readonly logger = new Logger(CallbackAuditor.name);\n private readonly auditStore: Map<string, AuditEntry> = new Map();\n\n /**\n * Log callback token issuance.\n */\n async logTokenIssued(\n token: string,\n graphType: string,\n handler: string,\n userId: string,\n metadata?: Record<string, any>\n ): Promise<string> {\n const correlationId = this.generateCorrelationId();\n const entry: AuditEntry = {\n id: randomUUID(),\n correlationId,\n timestamp: Date.now(),\n action: CallbackAuditAction.TOKEN_ISSUED,\n userId,\n callbackToken: token,\n graphType,\n handler,\n success: true,\n metadata: {\n ...metadata,\n ttl: metadata?.ttlSec,\n scopes: metadata?.scopes,\n },\n };\n\n await this.persist(entry);\n this.logger.log(\n `[${correlationId}] Token issued: ${token} for ${graphType}::${handler} by user ${userId}`\n );\n\n return correlationId;\n }\n\n /**\n * Log callback execution start.\n */\n async logExecutionStart(\n record: CallbackRecord,\n user: CallbackUser | undefined,\n correlationId?: string\n ): Promise<string> {\n const corrId = correlationId || this.generateCorrelationId();\n const entry: AuditEntry = {\n id: randomUUID(),\n correlationId: corrId,\n timestamp: Date.now(),\n action: CallbackAuditAction.EXECUTION_STARTED,\n userId: user?.userId,\n callbackToken: record.token,\n graphType: record.graphType,\n handler: record.handler,\n success: true,\n metadata: {\n originalUserId: record.userId,\n retries: record.retries,\n age: Date.now() - record.createdAt,\n },\n };\n\n await this.persist(entry);\n this.logger.log(\n `[${corrId}] Execution started: ${record.graphType}::${record.handler} by user ${user?.userId}`\n );\n\n return corrId;\n }\n\n /**\n * Log successful callback execution.\n */\n async logExecutionSuccess(\n record: CallbackRecord,\n user: CallbackUser | undefined,\n result: CallbackResult,\n duration: number,\n correlationId: string\n ): Promise<void> {\n const entry: AuditEntry = {\n id: randomUUID(),\n correlationId,\n timestamp: Date.now(),\n action: CallbackAuditAction.EXECUTION_COMPLETED,\n userId: user?.userId,\n callbackToken: record.token,\n graphType: record.graphType,\n handler: record.handler,\n success: true,\n duration,\n metadata: {\n hasAttachments: !!result.attachments?.length,\n hasPatch: !!result.patch,\n message: result.message,\n },\n };\n\n await this.persist(entry);\n this.logger.log(\n `[${correlationId}] Execution completed: ${record.graphType}::${record.handler} ` +\n `in ${duration}ms`\n );\n }\n\n /**\n * Log failed callback execution.\n */\n async logExecutionFailure(\n record: CallbackRecord,\n user: CallbackUser | undefined,\n error: Error,\n duration: number,\n correlationId: string\n ): Promise<void> {\n const entry: AuditEntry = {\n id: randomUUID(),\n correlationId,\n timestamp: Date.now(),\n action: CallbackAuditAction.EXECUTION_FAILED,\n userId: user?.userId,\n callbackToken: record.token,\n graphType: record.graphType,\n handler: record.handler,\n success: false,\n duration,\n error: error.message,\n metadata: {\n errorName: error.name,\n errorStack: error.stack,\n retries: record.retries,\n },\n };\n\n await this.persist(entry);\n this.logger.error(\n `[${correlationId}] Execution failed: ${record.graphType}::${record.handler} - ${error.message}`,\n error.stack\n );\n }\n\n /**\n * Log access denied event.\n */\n async logAccessDenied(\n token: string,\n userId?: string,\n reason?: string,\n metadata?: Record<string, any>\n ): Promise<void> {\n const correlationId = this.generateCorrelationId();\n const entry: AuditEntry = {\n id: randomUUID(),\n correlationId,\n timestamp: Date.now(),\n action: CallbackAuditAction.ACCESS_DENIED,\n userId,\n callbackToken: token,\n graphType: metadata?.graphType || \"unknown\",\n handler: metadata?.handler || \"unknown\",\n success: false,\n error: reason,\n metadata: metadata || {},\n };\n\n await this.persist(entry);\n this.logger.warn(\n `[${correlationId}] Access denied for token ${token}: ${reason}`\n );\n }\n\n /**\n * Log rate limit exceeded event.\n */\n async logRateLimited(\n identifier: string,\n retryAfter: number,\n metadata?: Record<string, any>\n ): Promise<void> {\n const correlationId = this.generateCorrelationId();\n const entry: AuditEntry = {\n id: randomUUID(),\n correlationId,\n timestamp: Date.now(),\n action: CallbackAuditAction.RATE_LIMITED,\n callbackToken: metadata?.token || \"unknown\",\n graphType: metadata?.graphType || \"unknown\",\n handler: metadata?.handler || \"unknown\",\n success: false,\n metadata: {\n identifier,\n retryAfter,\n ...metadata,\n },\n };\n\n await this.persist(entry);\n this.logger.warn(\n `[${correlationId}] Rate limited: ${identifier}, retry after ${retryAfter}s`\n );\n }\n\n /**\n * Log retry attempt.\n */\n async logRetryAttempt(\n record: CallbackRecord,\n user: CallbackUser | undefined,\n attemptNumber: number\n ): Promise<string> {\n const correlationId = this.generateCorrelationId();\n const entry: AuditEntry = {\n id: randomUUID(),\n correlationId,\n timestamp: Date.now(),\n action: CallbackAuditAction.RETRY_ATTEMPTED,\n userId: user?.userId,\n callbackToken: record.token,\n graphType: record.graphType,\n handler: record.handler,\n success: true,\n metadata: {\n attemptNumber,\n totalRetries: record.retries,\n lastError: record.lastError,\n },\n };\n\n await this.persist(entry);\n this.logger.log(\n `[${correlationId}] Retry attempt #${attemptNumber} for ${record.graphType}::${record.handler}`\n );\n\n return correlationId;\n }\n\n /**\n * Get audit trail for a specific token.\n */\n async getTokenAuditTrail(token: string): Promise<AuditEntry[]> {\n const entries: AuditEntry[] = [];\n for (const entry of this.auditStore.values()) {\n if (entry.callbackToken === token) {\n entries.push(entry);\n }\n }\n return entries.sort((a, b) => a.timestamp - b.timestamp);\n }\n\n /**\n * Get audit trail for a specific user.\n */\n async getUserAuditTrail(\n userId: string,\n startTime?: number,\n endTime?: number\n ): Promise<AuditEntry[]> {\n const entries: AuditEntry[] = [];\n const start = startTime || 0;\n const end = endTime || Date.now();\n\n for (const entry of this.auditStore.values()) {\n if (\n entry.userId === userId &&\n entry.timestamp >= start &&\n entry.timestamp <= end\n ) {\n entries.push(entry);\n }\n }\n return entries.sort((a, b) => a.timestamp - b.timestamp);\n }\n\n /**\n * Get audit statistics for reporting.\n */\n async getStatistics(\n startTime: number,\n endTime: number\n ): Promise<Record<string, any>> {\n const entries: AuditEntry[] = [];\n for (const entry of this.auditStore.values()) {\n if (entry.timestamp >= startTime && entry.timestamp <= endTime) {\n entries.push(entry);\n }\n }\n\n const stats = {\n totalCallbacks: entries.length,\n successfulExecutions: entries.filter(\n e => e.action === CallbackAuditAction.EXECUTION_COMPLETED\n ).length,\n failedExecutions: entries.filter(\n e => e.action === CallbackAuditAction.EXECUTION_FAILED\n ).length,\n accessDenied: entries.filter(\n e => e.action === CallbackAuditAction.ACCESS_DENIED\n ).length,\n rateLimited: entries.filter(\n e => e.action === CallbackAuditAction.RATE_LIMITED\n ).length,\n averageDuration: 0,\n byGraphType: {} as Record<string, number>,\n byHandler: {} as Record<string, number>,\n };\n\n // Calculate average duration\n const durations = entries.filter(e => e.duration).map(e => e.duration!);\n if (durations.length > 0) {\n stats.averageDuration =\n durations.reduce((a, b) => a + b, 0) / durations.length;\n }\n\n // Group by graph type and handler\n entries.forEach(entry => {\n stats.byGraphType[entry.graphType] =\n (stats.byGraphType[entry.graphType] || 0) + 1;\n const key = `${entry.graphType}::${entry.handler}`;\n stats.byHandler[key] = (stats.byHandler[key] || 0) + 1;\n });\n\n return stats;\n }\n\n /**\n * Persist audit entry.\n * In production, this should write to a persistent store (DB, S3, etc.)\n */\n private async persist(entry: AuditEntry): Promise<void> {\n // For now, store in memory. In production, write to database or audit log service\n this.auditStore.set(entry.id, entry);\n\n // Clean up old entries (keep last 10000)\n if (this.auditStore.size > 10000) {\n const entries = Array.from(this.auditStore.entries())\n .sort((a, b) => b[1].timestamp - a[1].timestamp)\n .slice(0, 10000);\n this.auditStore.clear();\n entries.forEach(([id, entry]) => this.auditStore.set(id, entry));\n }\n\n // In production, also send to external audit service\n // await this.sendToAuditService(entry);\n }\n\n /**\n * Generate correlation ID for tracking related events.\n */\n private generateCorrelationId(): string {\n return `cb_${Date.now()}_${randomUUID().slice(0, 8)}`;\n }\n\n /**\n * Export audit logs for compliance.\n */\n async exportAuditLogs(\n startTime: number,\n endTime: number,\n format: \"json\" | \"csv\" = \"json\"\n ): Promise<string> {\n const entries: AuditEntry[] = [];\n for (const entry of this.auditStore.values()) {\n if (entry.timestamp >= startTime && entry.timestamp <= endTime) {\n entries.push(entry);\n }\n }\n\n if (format === \"json\") {\n return JSON.stringify(entries, null, 2);\n } else {\n // CSV format\n const headers = [\n \"id\",\n \"correlationId\",\n \"timestamp\",\n \"action\",\n \"userId\",\n \"callbackToken\",\n \"graphType\",\n \"handler\",\n \"success\",\n \"duration\",\n \"error\",\n ];\n const rows = entries.map(e => [\n e.id,\n e.correlationId,\n new Date(e.timestamp).toISOString(),\n e.action,\n e.userId || \"\",\n e.callbackToken,\n e.graphType,\n e.handler,\n e.success.toString(),\n e.duration?.toString() || \"\",\n e.error || \"\",\n ]);\n return [headers, ...rows].map(row => row.join(\",\")).join(\"\\n\");\n }\n }\n}\n","import { Injectable } from \"@nestjs/common\";\nimport {\n Counter,\n Histogram,\n Gauge,\n Registry,\n collectDefaultMetrics,\n} from \"prom-client\";\n\n/**\n * Prometheus metrics for callback system monitoring.\n */\n@Injectable()\nexport class CallbackMetrics {\n private readonly registry: Registry;\n\n // Counters\n private readonly callbacksTotal: Counter;\n private readonly callbacksSuccess: Counter;\n private readonly callbacksFailed: Counter;\n private readonly callbacksRetried: Counter;\n private readonly accessDenied: Counter;\n private readonly rateLimited: Counter;\n private readonly tokensIssued: Counter;\n private readonly tokensExpired: Counter;\n\n // Histograms\n private readonly executionDuration: Histogram;\n private readonly aclValidationDuration: Histogram;\n private readonly tokenAge: Histogram;\n\n // Gauges\n private readonly activeCallbacks: Gauge;\n private readonly pendingCallbacks: Gauge;\n private readonly queueSize: Gauge;\n\n constructor(registry?: Registry) {\n this.registry = registry ?? new Registry();\n\n // Collect default Node.js metrics\n collectDefaultMetrics({ register: this.registry });\n\n // Initialize counters\n this.callbacksTotal = new Counter({\n name: \"graph_callbacks_total\",\n help: \"Total number of callback executions\",\n labelNames: [\"graph_type\", \"handler\", \"status\"],\n registers: [this.registry],\n });\n\n this.callbacksSuccess = new Counter({\n name: \"graph_callbacks_success_total\",\n help: \"Total number of successful callback executions\",\n labelNames: [\"graph_type\", \"handler\"],\n registers: [this.registry],\n });\n\n this.callbacksFailed = new Counter({\n name: \"graph_callbacks_failed_total\",\n help: \"Total number of failed callback executions\",\n labelNames: [\"graph_type\", \"handler\", \"error_type\"],\n registers: [this.registry],\n });\n\n this.callbacksRetried = new Counter({\n name: \"graph_callbacks_retried_total\",\n help: \"Total number of retried callbacks\",\n labelNames: [\"graph_type\", \"handler\"],\n registers: [this.registry],\n });\n\n this.accessDenied = new Counter({\n name: \"graph_callbacks_access_denied_total\",\n help: \"Total number of access denied events\",\n labelNames: [\"reason\"],\n registers: [this.registry],\n });\n\n this.rateLimited = new Counter({\n name: \"graph_callbacks_rate_limited_total\",\n help: \"Total number of rate limited requests\",\n labelNames: [\"identifier_type\"],\n registers: [this.registry],\n });\n\n this.tokensIssued = new Counter({\n name: \"graph_callback_tokens_issued_total\",\n help: \"Total number of callback tokens issued\",\n labelNames: [\"graph_type\", \"handler\"],\n registers: [this.registry],\n });\n\n this.tokensExpired = new Counter({\n name: \"graph_callback_tokens_expired_total\",\n help: \"Total number of expired callback tokens\",\n labelNames: [\"graph_type\"],\n registers: [this.registry],\n });\n\n // Initialize histograms\n this.executionDuration = new Histogram({\n name: \"graph_callback_execution_duration_seconds\",\n help: \"Duration of callback execution in seconds\",\n labelNames: [\"graph_type\", \"handler\", \"status\"],\n buckets: [0.01, 0.05, 0.1, 0.5, 1, 2, 5, 10],\n registers: [this.registry],\n });\n\n this.aclValidationDuration = new Histogram({\n name: \"graph_callback_acl_validation_duration_seconds\",\n help: \"Duration of ACL validation in seconds\",\n labelNames: [\"result\"],\n buckets: [0.001, 0.005, 0.01, 0.025, 0.05, 0.1],\n registers: [this.registry],\n });\n\n this.tokenAge = new Histogram({\n name: \"graph_callback_token_age_seconds\",\n help: \"Age of callback token when executed\",\n labelNames: [\"graph_type\"],\n buckets: [1, 5, 10, 30, 60, 120, 300, 600],\n registers: [this.registry],\n });\n\n // Initialize gauges\n this.activeCallbacks = new Gauge({\n name: \"graph_callbacks_active\",\n help: \"Number of currently executing callbacks\",\n labelNames: [\"graph_type\"],\n registers: [this.registry],\n });\n\n this.pendingCallbacks = new Gauge({\n name: \"graph_callbacks_pending\",\n help: \"Number of pending callbacks in queue\",\n labelNames: [\"graph_type\"],\n registers: [this.registry],\n });\n\n this.queueSize = new Gauge({\n name: \"graph_callback_queue_size\",\n help: \"Current size of callback queue\",\n registers: [this.registry],\n });\n }\n\n /**\n * Record callback execution start.\n */\n recordExecutionStart(graphType: string, handler?: string): void {\n const labels = { graph_type: graphType };\n this.activeCallbacks.inc(labels);\n this.pendingCallbacks.dec(labels);\n }\n\n /**\n * Record callback execution completion.\n */\n recordExecutionComplete(\n graphType: string,\n handler: string,\n duration: number,\n success: boolean,\n error?: string\n ): void {\n const status = success ? \"success\" : \"failure\";\n\n // Update counters\n this.callbacksTotal.inc({ graph_type: graphType, handler, status });\n\n if (success) {\n this.callbacksSuccess.inc({ graph_type: graphType, handler });\n } else {\n const errorType = this.classifyError(error);\n this.callbacksFailed.inc({\n graph_type: graphType,\n handler,\n error_type: errorType,\n });\n }\n\n // Record duration\n this.executionDuration.observe(\n { graph_type: graphType, handler, status },\n duration / 1000 // Convert to seconds\n );\n\n // Update active callbacks gauge\n this.activeCallbacks.dec({ graph_type: graphType });\n }\n\n /**\n * Record token issuance.\n */\n recordTokenIssued(graphType: string, handler: string): void {\n this.tokensIssued.inc({ graph_type: graphType, handler });\n this.pendingCallbacks.inc({ graph_type: graphType });\n }\n\n /**\n * Record token expiration.\n */\n recordTokenExpired(graphType: string): void {\n this.tokensExpired.inc({ graph_type: graphType });\n this.pendingCallbacks.dec({ graph_type: graphType });\n }\n\n /**\n * Record token age when executed.\n */\n recordTokenAge(graphType: string, ageMs: number): void {\n this.tokenAge.observe({ graph_type: graphType }, ageMs / 1000);\n }\n\n /**\n * Record ACL validation.\n */\n recordAclValidation(allowed: boolean, durationMs: number): void {\n const result = allowed ? \"allowed\" : \"denied\";\n this.aclValidationDuration.observe({ result }, durationMs / 1000);\n\n if (!allowed) {\n this.accessDenied.inc({ reason: \"acl_validation\" });\n }\n }\n\n /**\n * Record access denied event.\n */\n recordAccessDenied(reason: string): void {\n this.accessDenied.inc({ reason });\n }\n\n /**\n * Record rate limiting.\n */\n recordRateLimited(identifierType: \"user\" | \"ip\" | \"token\"): void {\n this.rateLimited.inc({ identifier_type: identifierType });\n }\n\n /**\n * Record retry attempt.\n */\n recordRetry(graphType: string, handler: string): void {\n this.callbacksRetried.inc({ graph_type: graphType, handler });\n }\n\n /**\n * Update queue size.\n */\n updateQueueSize(size: number): void {\n this.queueSize.set(size);\n }\n\n /**\n * Get metrics in Prometheus format.\n */\n async getMetrics(): Promise<string> {\n return this.registry.metrics();\n }\n\n /**\n * Get metrics content type.\n */\n getContentType(): string {\n return this.registry.contentType;\n }\n\n /**\n * Reset all metrics (useful for testing).\n */\n reset(): void {\n this.registry.resetMetrics();\n }\n\n /**\n * Classify error for metrics labeling.\n */\n private classifyError(error?: string): string {\n if (!error) return \"unknown\";\n\n const lowerError = error.toLowerCase();\n\n if (lowerError.includes(\"timeout\")) return \"timeout\";\n if (lowerError.includes(\"network\")) return \"network\";\n if (lowerError.includes(\"validation\")) return \"validation\";\n if (lowerError.includes(\"permission\") || lowerError.includes(\"forbidden\"))\n return \"permission\";\n if (lowerError.includes(\"not found\")) return \"not_found\";\n if (lowerError.includes(\"rate limit\")) return \"rate_limit\";\n if (lowerError.includes(\"retry\")) return \"retry_exhausted\";\n\n return \"application\";\n }\n\n /**\n * Get current metrics summary.\n */\n async getSummary(): Promise<Record<string, any>> {\n const metrics = await this.registry.getMetricsAsJSON();\n const summary: Record<string, any> = {};\n\n metrics.forEach((metric: any) => {\n if (metric.name === \"graph_callbacks_total\") {\n summary.totalCallbacks = metric.values.reduce(\n (sum: number, v: any) => sum + v.value,\n 0\n );\n }\n if (metric.name === \"graph_callbacks_success_total\") {\n summary.successfulCallbacks = metric.values.reduce(\n (sum: number, v: any) => sum + v.value,\n 0\n );\n }\n if (metric.name === \"graph_callbacks_failed_total\") {\n summary.failedCallbacks = metric.values.reduce(\n (sum: number, v: any) => sum + v.value,\n 0\n );\n }\n if (metric.name === \"graph_callbacks_active\") {\n summary.activeCallbacks = metric.values.reduce(\n (sum: number, v: any) => sum + v.value,\n 0\n );\n }\n });\n\n if (summary.totalCallbacks > 0) {\n summary.successRate =\n (summary.successfulCallbacks / summary.totalCallbacks) * 100;\n }\n\n return summary;\n }\n}\n","import { Injectable, Logger } from \"@nestjs/common\";\nimport type Redis from \"ioredis\";\n\nexport interface RateLimitConfig {\n windowMs: number; // Time window in milliseconds\n maxRequests: number; // Max requests per window\n keyPrefix?: string; // Redis key prefix\n skipFailedRequests?: boolean; // Don't count failed requests\n}\n\nexport interface RateLimitResult {\n allowed: boolean;\n limit: number;\n remaining: number;\n resetAt: number;\n retryAfter?: number;\n}\n\n/**\n * Rate limiter for callback execution using sliding window algorithm.\n * Prevents abuse and protects against brute force attacks.\n */\n@Injectable()\nexport class CallbackRateLimiter {\n private readonly logger = new Logger(CallbackRateLimiter.name);\n private readonly defaultConfig: RateLimitConfig = {\n windowMs: 60000, // 1 minute\n maxRequests: 10, // 10 requests per minute\n keyPrefix: \"ratelimit:callback\",\n skipFailedRequests: false,\n };\n\n constructor(private readonly redis: Redis) {}\n\n /**\n * Check if request is allowed based on rate limit.\n */\n async checkLimit(\n identifier: string,\n config?: Partial<RateLimitConfig>\n ): Promise<RateLimitResult> {\n const cfg = { ...this.defaultConfig, ...config };\n const key = `${cfg.keyPrefix}:${identifier}`;\n const now = Date.now();\n const windowStart = now - cfg.windowMs;\n\n // Use Lua script for atomic operation\n const script = `\n local key = KEYS[1]\n local now = tonumber(ARGV[1])\n local window_start = tonumber(ARGV[2])\n local max_requests = tonumber(ARGV[3])\n local window_ms = tonumber(ARGV[4])\n \n -- Remove old entries outside the window\n redis.call('ZREMRANGEBYSCORE', key, 0, window_start)\n \n -- Count requests in current window\n local current_requests = redis.call('ZCARD', key)\n \n if current_requests < max_requests then\n -- Add current request\n redis.call('ZADD', key, now, now)\n -- Set expiry\n redis.call('EXPIRE', key, math.ceil(window_ms / 1000))\n \n return {1, max_requests, max_requests - current_requests - 1, 0}\n else\n -- Get oldest request in window to calculate retry time\n local oldest = redis.call('ZRANGE', key, 0, 0, 'WITHSCORES')\n local reset_at = oldest[2] and (tonumber(oldest[2]) + window_ms) or (now + window_ms)\n \n return {0, max_requests, 0, reset_at}\n end\n `;\n\n const result = (await this.redis.eval(\n script,\n 1,\n key,\n now,\n windowStart,\n cfg.maxRequests,\n cfg.windowMs\n )) as [number, number, number, number];\n\n const [allowed, limit, remaining, resetAt] = result;\n\n const rateLimitResult: RateLimitResult = {\n allowed: allowed === 1,\n limit,\n remaining: Math.max(0, remaining),\n resetAt,\n };\n\n if (!rateLimitResult.allowed) {\n rateLimitResult.retryAfter = Math.ceil((resetAt - now) / 1000);\n this.logger.warn(\n `Rate limit exceeded for ${identifier}. Retry after ${rateLimitResult.retryAfter}s`\n );\n }\n\n return rateLimitResult;\n }\n\n /**\n * Check rate limit for user-specific operations.\n */\n async checkUserLimit(\n userId: string,\n config?: Partial<RateLimitConfig>\n ): Promise<RateLimitResult> {\n return this.checkLimit(`user:${userId}`, {\n windowMs: 60000, // 1 minute\n maxRequests: 20, // 20 requests per minute per user\n ...config,\n });\n }\n\n /**\n * Check rate limit for IP-based operations.\n */\n async checkIpLimit(\n ip: string,\n config?: Partial<RateLimitConfig>\n ): Promise<RateLimitResult> {\n return this.checkLimit(`ip:${ip}`, {\n windowMs: 60000, // 1 minute\n maxRequests: 30, // 30 requests per minute per IP\n ...config,\n });\n }\n\n /**\n * Check rate limit for token validation attempts (stricter).\n */\n async checkTokenLimit(\n identifier: string,\n config?: Partial<RateLimitConfig>\n ): Promise<RateLimitResult> {\n return this.checkLimit(`token:${identifier}`, {\n windowMs: 300000, // 5 minutes\n maxRequests: 5, // 5 attempts per 5 minutes\n ...config,\n });\n }\n\n /**\n * Reset rate limit for an identifier.\n * Useful for admin operations or testing.\n */\n async reset(identifier: string, keyPrefix?: string): Promise<void> {\n const prefix = keyPrefix || this.defaultConfig.keyPrefix;\n const key = `${prefix}:${identifier}`;\n await this.redis.del(key);\n this.logger.debug(`Rate limit reset for ${identifier}`);\n }\n\n /**\n * Get current rate limit status without incrementing counter.\n */\n async getStatus(\n identifier: string,\n config?: Partial<RateLimitConfig>\n ): Promise<RateLimitResult> {\n const cfg = { ...this.defaultConfig, ...config };\n const key = `${cfg.keyPrefix}:${identifier}`;\n const now = Date.now();\n const windowStart = now - cfg.windowMs;\n\n // Remove old entries and count current\n await this.redis.zremrangebyscore(key, 0, windowStart);\n const currentRequests = await this.redis.zcard(key);\n\n const remaining = Math.max(0, cfg.maxRequests - currentRequests);\n const allowed = currentRequests < cfg.maxRequests;\n\n let resetAt = now + cfg.windowMs;\n if (!allowed) {\n const oldest = await this.redis.zrange(key, 0, 0, \"WITHSCORES\");\n if (oldest.length >= 2) {\n resetAt = parseInt(oldest[1]) + cfg.windowMs;\n }\n }\n\n return {\n allowed,\n limit: cfg.maxRequests,\n remaining,\n resetAt,\n retryAfter: allowed ? undefined : Math.ceil((resetAt - now) / 1000),\n };\n }\n\n /**\n * Create rate limit headers for HTTP response.\n */\n createHeaders(result: RateLimitResult): Record<string, string> {\n const headers: Record<string, string> = {\n \"X-RateLimit-Limit\": result.limit.toString(),\n \"X-RateLimit-Remaining\": result.remaining.toString(),\n \"X-RateLimit-Reset\": new Date(result.resetAt).toISOString(),\n };\n\n if (result.retryAfter) {\n headers[\"Retry-After\"] = result.retryAfter.toString();\n }\n\n return headers;\n }\n}\n","import { Injectable, Logger } from \"@nestjs/common\";\nimport { CallbackRecord, CallbackPatch } from \"./callback.interface\";\nimport { TelegramPatchHandler } from \"./telegram-patch.handler\";\nimport { WebPatchHandler } from \"./web-patch.handler\";\n\nexport interface CallbackPatchHandler {\n apply(patch: CallbackPatch, context?: any): Promise<void>;\n}\n\n@Injectable()\nexport class CallbackPatchService {\n private readonly logger = new Logger(CallbackPatchService.name);\n constructor(\n private readonly telegram: TelegramPatchHandler,\n private readonly web: WebPatchHandler\n ) {}\n\n async apply(\n record: CallbackRecord,\n patch: CallbackPatch,\n context?: any\n ): Promise<void> {\n if (!patch) return;\n const platform = record.metadata?.platform;\n try {\n switch (platform) {\n case \"telegram\":\n await this.telegram.apply(patch, context);\n break;\n case \"web\":\n await this.web.apply(patch, context);\n break;\n default:\n this.logger.warn(`Unsupported patch platform: ${platform}`);\n }\n } catch (err) {\n this.logger.error(\n `Failed to apply patch for ${record.graphType}::${record.handler}`,\n err instanceof Error ? err.stack : undefined\n );\n }\n }\n}\n","import { Injectable, Logger } from \"@nestjs/common\";\nimport { CallbackPatch } from \"./callback.interface\";\nimport { CallbackPatchHandler } from \"./callback-patch.service\";\n\n@Injectable()\nexport class TelegramPatchHandler implements CallbackPatchHandler {\n private readonly logger = new Logger(TelegramPatchHandler.name);\n\n async apply(patch: CallbackPatch, context?: any): Promise<void> {\n this.logger.debug(\n `Applying Telegram patch ${JSON.stringify(patch)} with context ${JSON.stringify(\n context\n )}`\n );\n }\n}\n","import { Injectable, Logger } from \"@nestjs/common\";\nimport { CallbackPatch } from \"./callback.interface\";\nimport { CallbackPatchHandler } from \"./callback-patch.service\";\n\n@Injectable()\nexport class WebPatchHandler implements CallbackPatchHandler {\n private readonly logger = new Logger(WebPatchHandler.name);\n\n async apply(patch: CallbackPatch, context?: any): Promise<void> {\n this.logger.debug(\n `Applying Web patch ${JSON.stringify(patch)} with context ${JSON.stringify(\n context\n )}`\n );\n }\n}\n","export * from \"./callback-store\";\nexport * from \"./callback-registry\";\nexport * from \"./smart-callback.router\";\nexport * from \"./universal-callback.service\";\nexport * from \"./example.callback\";\nexport * from \"./callback-acl.service\";\nexport * from \"./callback-auditor.service\";\nexport * from \"./callback-metrics.service\";\nexport * from \"./callback-rate-limiter\";\nexport * from \"./idempotency-manager\";\nexport * from \"./callback-patch.service\";\nexport * from \"./telegram-patch.handler\";\nexport * from \"./web-patch.handler\";\nexport * from \"./callback.decorators\";\nexport * from \"./callback-token.guard\";\nexport * from \"./callback.controller\";\nexport * from \"./callback.interface\";\n","import {\n CanActivate,\n ExecutionContext,\n Injectable,\n UnauthorizedException,\n Logger,\n} from \"@nestjs/common\";\nimport { Request } from \"express\";\nimport { CallbackStore } from \"../callbacks\";\nimport { CallbackRecord } from \"./callback.interface\";\nimport { CallbackACL, CallbackUser } from \"../callbacks/callback-acl.service\";\n\nexport interface CallbackRequest extends Request {\n callbackRecord: CallbackRecord;\n user?: CallbackUser;\n}\n\n@Injectable()\nexport class CallbackTokenGuard implements CanActivate {\n private readonly logger = new Logger(CallbackTokenGuard.name);\n\n constructor(\n private readonly store: CallbackStore,\n private readonly acl: CallbackACL\n ) {}\n\n async canActivate(context: ExecutionContext): Promise<boolean> {\n const request = context.switchToHttp().getRequest<CallbackRequest>();\n const token = request.body?.token;\n if (!token) {\n throw new UnauthorizedException(\"Callback token missing\");\n }\n const record = await this.store.getAndLock(token);\n if (!record) {\n throw new UnauthorizedException(\"Invalid callback token\");\n }\n\n // Extract user from request (assumes JWT auth middleware has run)\n const user = this.extractUser(request);\n\n // Validate ACL permissions\n await this.acl.validate(user, record);\n\n request.callbackRecord = record;\n request.user = user;\n return true;\n }\n\n private extractUser(request: CallbackRequest): CallbackUser | undefined {\n this.logger.log(`Extracting user from request`, {\n hasRequestUser: !!request.user,\n hasPlatformContext: !!request.body?.platformContext,\n platformContextKeys: request.body?.platformContext\n ? Object.keys(request.body.platformContext)\n : [],\n });\n\n // Try to extract user from JWT middleware first (direct API calls)\n if (request.user) {\n this.logger.log(\n `Found user from JWT middleware: ${request.user[\"id\"] || request.user[\"sub\"]}`\n );\n return {\n userId: request.user[\"id\"] || request.user[\"sub\"],\n roles: request.user[\"roles\"],\n permissions: request.user[\"permissions\"],\n companyId: request.user[\"companyId\"],\n };\n }\n\n // For inter-service calls, extract user from platformContext\n const platformContext = request.body?.platformContext;\n if (\n platformContext &&\n platformContext.userId &&\n platformContext.authenticated\n ) {\n this.logger.log(\n `Found user from platformContext: ${platformContext.userId}`\n );\n return {\n userId: platformContext.userId,\n roles: platformContext.roles || [],\n permissions: platformContext.permissions || [],\n companyId: platformContext.companyId,\n };\n }\n\n this.logger.warn(`No user found in request or platformContext`);\n return undefined;\n }\n}\n","import { Controller, Post, Req, UseGuards } from \"@nestjs/common\";\nimport { ApiTags, ApiOperation, ApiResponse } from \"@nestjs/swagger\";\nimport { UniversalCallbackService } from \"../callbacks\";\nimport { CallbackTokenGuard, CallbackRequest } from \"./callback-token.guard\";\n\n@ApiTags(\"Callbacks\")\n@Controller()\nexport class CallbackController {\n constructor(private readonly callbackService: UniversalCallbackService) {}\n\n @Post(\"callback\")\n @UseGuards(CallbackTokenGuard)\n @ApiOperation({ summary: \"Process callback by token\" })\n @ApiResponse({ status: 200, description: \"Callback executed\" })\n async handleCallback(@Req() req: CallbackRequest) {\n return this.callbackService.handle(req.callbackRecord, req.user);\n }\n}\n","// packages/sdk/src/abstract-graph.builder.ts\nimport { Inject, Injectable, Type, Logger, Optional } from \"@nestjs/common\";\nimport { ConfigService } from \"@nestjs/config\";\nimport * as path from \"path\";\n// Remove dependency on legacy BaseGraphService\nimport { IGraphRequestPayload, IGraphResponsePayload, IGraphService } from \".\";\nimport {\n CallbackResult,\n CallbackHandler,\n CallbackRegistry,\n} from \"../callbacks\";\nimport { EndpointRegistry } from \"../agent-ui\";\n\n/**\n * Interface for graph manifest\n */\nexport interface IGraphManifest {\n // === BASIC INFORMATION ===\n companySlug: string;\n name: string;\n title: string;\n description: string;\n detailedDescription: string;\n\n // === METADATA ===\n category?: string;\n author?: string;\n maintainer?: string;\n repository?: string;\n tags?: string[];\n\n // === UI CONFIGURATION (graph level) ===\n ui?: {\n enabled: boolean;\n title: string;\n description?: string;\n defaultScreen: string;\n menu: string[];\n screens: Record<string, any>;\n theme?: Record<string, any>;\n permissions?: Record<string, any>;\n };\n\n // === VERSIONING ===\n versioning: {\n strategy: \"semver\";\n defaultVersion: string;\n supportedVersions: string[];\n };\n\n // === VERSIONS ===\n versions: Record<\n string,\n {\n status: string;\n releaseDate: string;\n isActive: boolean;\n visibility: \"public\" | \"private\";\n configSchemaPath?: string;\n }\n >;\n}\n\n/**\n * Base abstraction for versioned graphs\n * All graphs should specify only version (e.g. \"1.0.0\")\n * Full graphType is auto-generated from baseGraphType + version\n */\nexport abstract class AbstractGraphBuilder<V extends string = string> {\n /**\n * Graph version in semver format (e.g. \"1.0.0\", \"2.1.3\")\n */\n abstract readonly version: V;\n\n protected logger = new Logger(AbstractGraphBuilder.name);\n\n @Inject(CallbackRegistry)\n protected callbackRegistry: CallbackRegistry;\n\n @Inject(EndpointRegistry)\n protected endpointRegistry: EndpointRegistry;\n\n /**\n * Returns full graph type (companySlug.name::version)\n * Auto-generated from manifest's companySlug.name and version\n */\n get graphType(): string {\n // Generate from companySlug.name + version\n if (this.manifest?.companySlug && this.manifest?.name) {\n return `${this.manifest.companySlug}.${this.manifest.name}::${this.version}`;\n }\n\n // Fallback - will be determined when manifest is loaded\n return `unknown::${this.version}`;\n }\n\n /**\n * Path to root graph manifest (defaults to graph.manifest.json in root)\n */\n protected manifestPath: string = path.join(\n process.cwd(),\n \"graph.manifest.json\"\n );\n\n /**\n * Loaded graph manifest\n */\n protected manifest?: IGraphManifest;\n\n constructor() {\n // Load manifest synchronously to get correct graphType\n try {\n this.loadManifestSync();\n if (this.manifest) {\n this.logger.debug(\n `Loaded manifest for ${this.manifest.companySlug}.${this.manifest.name} (${this.constructor.name})`\n );\n }\n } catch (error) {\n this.logger.warn(\n `Failed to load manifest in constructor: ${error.message}`\n );\n }\n\n // Register callbacks and endpoints after the derived class is fully constructed\n setImmediate(() => {\n this.logger.debug(\n `Starting callback and endpoint registration for ${this.constructor.name}`\n );\n\n this.registerCallbacks().catch(error => {\n this.logger.error(\n `Failed to register callbacks in constructor: ${error.message}`\n );\n });\n\n this.registerEndpoints().catch(error => {\n this.logger.error(\n `Failed to register endpoints in constructor: ${error.message}`\n );\n });\n });\n }\n\n /**\n * Build graph\n */\n abstract buildGraph(config: any): Promise<any>;\n\n /**\n * Creates execution context for graph with tracer and usageRecorder\n * This method can be overridden in child classes for customization\n */\n protected createGraphContext(payload: IGraphRequestPayload): {\n messageId?: string;\n threadId: string;\n userId: string;\n agentId: string;\n companyId?: string;\n } {\n return {\n messageId: (payload as any).messageId,\n threadId: payload.threadId,\n userId: payload.userId,\n agentId: payload.agentId,\n companyId: (payload as any).companyId,\n };\n }\n\n /**\n * Basic configuration preparation for graph execution\n * Automatically creates context with tracer and usageRecorder\n * Can be overridden in child classes to add specific logic\n */\n async prepareConfig(payload: IGraphRequestPayload): Promise<any> {\n const context = this.createGraphContext(payload);\n\n return {\n configurable: {\n thread_id: payload.threadId,\n context,\n // Add metadata for compatibility\n metadata: {\n userId: payload.userId,\n agentId: payload.agentId,\n requestId: payload.requestId,\n graphType: this.graphType,\n version: this.version,\n },\n },\n };\n }\n\n /**\n * Load graph manifest (if using manifest-based approach)\n */\n protected async loadManifest(): Promise<IGraphManifest | null> {\n if (!this.manifestPath) {\n return null;\n }\n\n try {\n const fs = await import(\"fs/promises\");\n const path = await import(\"path\");\n\n const manifestFullPath = path.resolve(this.manifestPath);\n const manifestContent = await fs.readFile(manifestFullPath, \"utf-8\");\n const manifest = JSON.parse(manifestContent) as IGraphManifest;\n\n // Manifest validation disabled - new structure is used\n // this.validateManifest(manifest);\n\n this.manifest = manifest;\n return manifest;\n } catch (error) {\n console.error(\n `Failed to load manifest from ${this.manifestPath}: ${error instanceof Error ? error.message : String(error)}`\n );\n return null;\n }\n }\n\n /**\n * Synchronous manifest loading for use in constructor\n */\n protected loadManifestSync(): IGraphManifest | null {\n if (!this.manifestPath) {\n return null;\n }\n\n try {\n const fs = require(\"fs\");\n const path = require(\"path\");\n\n const manifestFullPath = path.resolve(this.manifestPath);\n const manifestContent = fs.readFileSync(manifestFullPath, \"utf-8\");\n const manifest = JSON.parse(manifestContent) as IGraphManifest;\n\n // Manifest validation disabled - new structure is used\n // this.validateManifest(manifest);\n\n this.manifest = manifest;\n return manifest;\n } catch (error) {\n console.error(\n `Failed to load manifest from ${this.manifestPath}: ${error instanceof Error ? error.message : String(error)}`\n );\n return null;\n }\n }\n\n /**\n * Validate graph manifest\n */\n protected validateManifest(manifest: IGraphManifest): void {\n // Validation temporarily disabled for new manifest structure\n // TODO: Create new validator for structure with baseType and versions\n // GraphManifestValidator.validateOrThrow(manifest);\n }\n\n /**\n * Get graph metadata (from manifest or decorator)\n */\n async getGraphMetadata(): Promise<IGraphManifest | null> {\n if (this.manifest) {\n return this.manifest;\n }\n\n return await this.loadManifest();\n }\n\n /**\n * Get specific version configuration of the graph\n */\n async getVersionConfig() {\n const manifest = await this.loadManifest();\n if (!manifest) {\n throw new Error(`Manifest not found at ${this.manifestPath}`);\n }\n\n const versionConfig = manifest.versions[this.version];\n if (!versionConfig) {\n throw new Error(`Version ${this.version} not found in manifest`);\n }\n\n // Load config schema if path is specified\n let configSchema = null;\n if (versionConfig.configSchemaPath) {\n try {\n const fs = await import(\"fs/promises\");\n const schemaPath = path.resolve(\n process.cwd(),\n versionConfig.configSchemaPath\n );\n const schemaContent = await fs.readFile(schemaPath, \"utf-8\");\n const schemaData = JSON.parse(schemaContent);\n configSchema = schemaData.schema;\n } catch (error) {\n this.logger.warn(`Failed to load config schema: ${error.message}`);\n }\n }\n\n return {\n // Basic graph information\n companySlug: manifest.companySlug,\n name: manifest.name,\n title: manifest.title,\n description: manifest.description,\n detailedDescription: manifest.detailedDescription,\n category: manifest.category,\n tags: manifest.tags,\n\n // UI configuration\n ui: manifest.ui,\n\n // Version information\n ...versionConfig,\n\n // Config schema (if exists)\n configSchema,\n\n // Full graphType for compatibility\n graphType: this.graphType,\n version: this.version,\n };\n }\n\n /**\n * Get full graph type\n * REQUIRES baseGraphType - no more legacy support!\n */\n getFullGraphType(baseGraphType: string): string {\n if (!baseGraphType) {\n throw new Error(\"baseGraphType is required for versioned graphs\");\n }\n\n return `${baseGraphType}::${this.version}`;\n }\n\n /**\n * Version validation\n */\n validateVersion(): boolean {\n const versionRegex = /^\\d+\\.\\d+\\.\\d+$/;\n if (!versionRegex.test(this.version)) {\n throw new Error(\n `Invalid version format: ${this.version}. Expected format: X.Y.Z`\n );\n }\n return true;\n }\n\n /**\n * Register callbacks from @Callback decorators\n * This is called automatically after the builder is constructed\n */\n protected async registerCallbacks(): Promise<void> {\n this.logger.log(`CallbackRegistry instance: ${!!this.callbackRegistry}`);\n\n if (!this.callbackRegistry) {\n this.logger.error(\n \"CallbackRegistry not injected! This should not happen.\"\n );\n return;\n }\n\n try {\n // Dynamically import decorator utilities to avoid circular dependencies\n const { getCallbackMetadata } = await import(\n \"../callbacks/callback.decorators.js\"\n );\n\n // Get callback metadata from the current class\n const callbackMetadata = getCallbackMetadata(this.constructor);\n\n this.logger.log(\n `Found ${callbackMetadata?.length || 0} callbacks for ${this.constructor.name}`\n );\n this.logger.log(\n `Callback metadata:`,\n JSON.stringify(callbackMetadata, null, 2)\n );\n\n if (!callbackMetadata || callbackMetadata.length === 0) {\n this.logger.warn(\n `No callbacks found for ${this.constructor.name}. Check @WithCallbacks decorator.`\n );\n return;\n }\n\n // Get the full graph type for versioned registration\n const fullGraphType = this.graphType; // This should return the full type like \"company.financial-ledger::1.0.0\"\n\n // Register each callback with version\n for (const { handler, method } of callbackMetadata) {\n const callbackMethod = (this as any)[method];\n if (typeof callbackMethod === \"function\") {\n // Create a wrapper that binds the method to this instance\n const boundCallback: CallbackHandler = async context => {\n return callbackMethod.call(this, context);\n };\n\n // Register with version-specific key\n this.callbackRegistry.register(handler, boundCallback, fullGraphType);\n\n this.logger.log(\n `Registered callback \"${handler}\" for graph type \"${fullGraphType}\"`\n );\n }\n }\n\n this.logger.log(\n `Registered ${callbackMetadata.length} callbacks for ${this.constructor.name}`\n );\n } catch (error) {\n this.logger.error(\n `Failed to register callbacks: ${error instanceof Error ? error.message : String(error)}`\n );\n }\n }\n\n /**\n * Register endpoints from @Endpoint decorators\n * This is called automatically after the builder is constructed\n */\n protected async registerEndpoints(): Promise<void> {\n this.logger.log(`EndpointRegistry instance: ${!!this.endpointRegistry}`);\n\n if (!this.endpointRegistry) {\n this.logger.error(\n \"EndpointRegistry not injected! This should not happen.\"\n );\n return;\n }\n\n try {\n // Dynamically import decorator utilities to avoid circular dependencies\n const { getEndpointMetadata, createEndpointDescriptors } = await import(\n \"../agent-ui\"\n );\n\n // Get endpoint metadata from the current class\n const endpointMetadata = getEndpointMetadata(this.constructor);\n\n if (!endpointMetadata || endpointMetadata.length === 0) {\n // Only log if we expected endpoints (avoid confusing logs for callback-only builders)\n return;\n }\n\n this.logger.log(\n `Found ${endpointMetadata.length} endpoints for ${this.constructor.name}`\n );\n this.logger.debug(\n `Endpoint metadata:`,\n JSON.stringify(endpointMetadata, null, 2)\n );\n\n // Get the full graph type for versioned registration\n const fullGraphType = this.graphType; // This should return the full type like \"ledger::1.0.0\"\n\n // Create endpoint descriptors and register them\n const endpointDescriptors = createEndpointDescriptors(\n this,\n endpointMetadata\n );\n\n for (const descriptor of endpointDescriptors) {\n this.endpointRegistry.register(fullGraphType, descriptor);\n\n this.logger.log(\n `Registered endpoint \"${descriptor.name}\" for graph type \"${fullGraphType}\"`\n );\n }\n\n this.logger.log(\n `Registered ${endpointDescriptors.length} endpoints for ${this.constructor.name}`\n );\n } catch (error) {\n this.logger.error(\n `Failed to register endpoints: ${error instanceof Error ? error.message : String(error)}`\n );\n }\n }\n\n /**\n * Helper method to manually register endpoints (for classes that don't use decorators)\n * @param endpoints Endpoint descriptors to register\n */\n protected registerEndpointsManually(\n endpoints: import(\"../agent-ui\").EndpointDescriptor[]\n ): void {\n if (!this.endpointRegistry) {\n this.logger.error(\"EndpointRegistry not available\");\n return;\n }\n\n const fullGraphType = this.graphType;\n for (const endpoint of endpoints) {\n this.endpointRegistry.register(fullGraphType, endpoint);\n this.logger.log(\n `Manually registered endpoint \"${endpoint.name}\" for graph type \"${fullGraphType}\"`\n );\n }\n }\n}\n\n/**\n * Interface for graph engine\n */\nexport interface IGraphEngine {\n invokeGraph(graph: any, config: any, signal?: AbortSignal): Promise<any>;\n streamGraph(\n graph: any,\n config: any,\n onPartial: (chunk: string) => void,\n signal?: AbortSignal\n ): Promise<any>;\n}\n\n/**\n * Universal graph service that delegates execution to builder and engine\n */\n@Injectable()\nexport class UniversalGraphService implements IGraphService {\n readonly logger = new Logger(UniversalGraphService.name);\n\n constructor(\n protected readonly configService: ConfigService,\n @Inject(\"GRAPH_BUILDERS\")\n private readonly builders: AbstractGraphBuilder<string>[],\n @Inject(\"GRAPH_ENGINE\")\n private readonly engine: IGraphEngine,\n @Inject(EndpointRegistry)\n private readonly endpointRegistry: EndpointRegistry\n ) {\n this.logger.log(\"UniversalGraphService initialized\");\n if (!this.engine) {\n this.logger.error(\"GRAPH_ENGINE is not properly injected!\");\n }\n }\n\n /**\n * Returns graph types supported by the service\n */\n async getSupportedGraphTypes(): Promise<string[]> {\n // console.log('Registered builders:', this.builders);\n return this.builders.map(builder => {\n // console.log(`Builder: ${builder.constructor.name}, graphType:`, builder.graphType);\n return builder.graphType;\n });\n }\n\n /**\n * Generate answer without streaming\n */\n async generateAnswer(\n payload: IGraphRequestPayload\n ): Promise<IGraphResponsePayload> {\n const builder = this.getBuilderForType(payload.graphType);\n\n // Build graph\n const graph = await builder.buildGraph(payload);\n\n // Prepare execution configuration\n const config = await builder.prepareConfig(payload);\n\n // Track generation cancellation\n const abortController = new AbortController();\n this.registerActiveGeneration(payload.requestId, () => {\n abortController.abort();\n });\n\n try {\n // Execute graph through engine\n const result = await this.engine.invokeGraph(\n graph,\n config,\n abortController.signal\n );\n\n // Form response\n return {\n requestId: payload.requestId,\n text: result.text || \"\",\n attachments: result.attachments || [],\n metadata: result.metadata || {},\n reasoningChains: result.reasoningChains || [], // Add reasoning chains\n };\n } finally {\n this.unregisterActiveGeneration(payload.requestId);\n }\n }\n\n /**\n * Stream answer generation\n */\n async streamAnswer(payload, onPartial) {\n this.logger.debug(\n `>>> Entering streamAnswer with requestId: ${payload.requestId}`\n );\n const abortController = new AbortController();\n\n try {\n // Existing code remains here\n const builder = this.getBuilderForType(payload.graphType);\n this.logger.debug(`Got builder for graph type: ${payload.graphType}`);\n\n // Build graph\n const graph = await builder.buildGraph(payload);\n this.logger.debug(`Graph built for requestId: ${payload.requestId}`);\n\n // Prepare execution configuration\n this.logger.debug(`Preparing config for requestId: ${payload.requestId}`);\n const config = await builder.prepareConfig(payload);\n this.logger.debug(`Config prepared`);\n\n // Track generation cancellation\n this.registerActiveGeneration(payload.requestId, () => {\n abortController.abort();\n });\n this.logger.debug(`Active generation registered: ${payload.requestId}`);\n\n this.logger.debug(\n `Calling engine.streamGraph for requestId: ${payload.requestId}`\n );\n const result = await this.engine.streamGraph(\n graph,\n config,\n onPartial,\n abortController.signal\n );\n\n this.logger.debug(`[STREAM-RESULT] Engine returned:`, {\n hasText: !!result.text,\n textLength: result.text?.length || 0,\n attachmentsCount: result.attachments?.length || 0,\n reasoningChainsCount: result.reasoningChains?.length || 0,\n resultKeys: Object.keys(result || {}),\n });\n\n // Form response\n return {\n requestId: payload.requestId,\n text: result.text || \"\",\n attachments: result.attachments || [],\n metadata: result.metadata || {},\n reasoningChains: result.reasoningChains || [], // Add reasoning chains\n };\n } catch (error) {\n this.logger.error(`Error in streamAnswer: ${error.message}`);\n this.logger.error(`Stack trace: ${error.stack}`);\n throw error; // Rethrow error\n } finally {\n abortController.abort();\n this.unregisterActiveGeneration(payload.requestId);\n }\n }\n\n /**\n * Service health check\n */\n async healthCheck(): Promise<boolean> {\n try {\n // Check that there are registered builders\n if (this.builders.length === 0) {\n this.logger.warn(\"No builders registered\");\n return false;\n }\n\n return true;\n } catch (error) {\n this.logger.error(`Health check failed: ${error.message}`);\n return false;\n }\n }\n\n /**\n * Cancel generation\n */\n async cancelGeneration(requestId: string): Promise<void> {\n const generation = this.activeGenerations.get(requestId);\n\n if (generation) {\n generation.cancel();\n this.activeGenerations.delete(requestId);\n this.logger.log(`Cancelled generation for request: ${requestId}`);\n } else {\n this.logger.warn(`No active generation found for request: ${requestId}`);\n }\n }\n\n // Active generations that can be cancelled\n private readonly activeGenerations = new Map<\n string,\n { cancel: () => void }\n >();\n\n /**\n * Register active generation\n */\n private registerActiveGeneration(\n requestId: string,\n cancel: () => void\n ): void {\n this.activeGenerations.set(requestId, { cancel });\n\n // Automatic cleanup after 10 minutes\n setTimeout(\n () => {\n if (this.activeGenerations.has(requestId)) {\n this.activeGenerations.delete(requestId);\n this.logger.debug(\n `Auto-cleaned generation for request: ${requestId}`\n );\n }\n },\n 10 * 60 * 1000\n );\n }\n\n /**\n * Remove active generation\n */\n private unregisterActiveGeneration(requestId: string): void {\n this.activeGenerations.delete(requestId);\n }\n\n /**\n * Execute callback through decorators\n */\n async executeCallback(\n token: string,\n platform?: string,\n platformContext?: any\n ): Promise<CallbackResult> {\n this.logger.debug(`Executing callback with token: ${token}`);\n\n try {\n // Try to find callback among builders through decorators\n const result = await this.executeCallbackFromDecorators(\n token,\n platform,\n platformContext\n );\n\n if (result) {\n return result;\n }\n\n // If not found through decorators, try old system (SmartCallbackRouter)\n // TODO: integrate with existing callback system if backward compatibility is needed\n\n return {\n success: false,\n error: \"Callback handler not found\",\n };\n } catch (error) {\n this.logger.error(\n `Error executing callback: ${error instanceof Error ? error.message : String(error)}`\n );\n return {\n success: false,\n error: error instanceof Error ? error.message : \"Unknown error\",\n };\n }\n }\n\n /**\n * Execute callback through decorator system\n */\n private async executeCallbackFromDecorators(\n token: string,\n platform?: string,\n platformContext?: any\n ): Promise<CallbackResult | null> {\n // Import functions for working with decorators\n const { getCallbackMetadata, findCallbackMethod } = await import(\n \"../callbacks/callback.decorators.js\"\n );\n\n // Parse token to extract graph type and handler\n const { graphType, handler } = this.parseCallbackToken(token);\n\n // Find builder for this graph type\n const builder = this.builders.find(b => b.graphType === graphType);\n if (!builder) {\n this.logger.warn(`No builder found for graph type: ${graphType}`);\n return null;\n }\n\n // Find callback method in builder\n const methodName = findCallbackMethod(builder.constructor, handler);\n if (!methodName || typeof (builder as any)[methodName] !== \"function\") {\n this.logger.warn(\n `No callback method found for handler: ${handler} in ${graphType}`\n );\n return null;\n }\n\n // Create callback context\n const context = {\n userId: platformContext?.userId || \"unknown\",\n threadId: platformContext?.threadId,\n agentId: platformContext?.agentId,\n params: this.parseCallbackParams(token),\n platform,\n metadata: {\n token,\n platformContext,\n graphType,\n handler,\n },\n };\n\n // Call callback method\n this.logger.debug(`Executing callback ${handler} on builder ${graphType}`);\n const result = await (builder as any)[methodName](context);\n\n return result;\n }\n\n /**\n * Parse callback token to extract information\n * Expected format: cb_{graphName}_{handler}_{encodedParams}\n */\n private parseCallbackToken(token: string): {\n graphType: string;\n handler: string;\n } {\n const parts = token.split(\"_\");\n\n if (parts.length < 4 || parts[0] !== \"cb\") {\n throw new Error(`Invalid callback token format: ${token}`);\n }\n\n const graphName = parts[1];\n const handler = parts[2];\n\n // TODO: Add default version or extract from token\n const graphType = `${graphName}::1.0.0`;\n\n return { graphType, handler };\n }\n\n /**\n * Extract parameters from callback token\n */\n private parseCallbackParams(token: string): Record<string, any> {\n const parts = token.split(\"_\");\n\n if (parts.length < 4) {\n return {};\n }\n\n try {\n // Last part of token contains encoded parameters\n const encodedParams = parts.slice(3).join(\"_\");\n const decodedParams = Buffer.from(encodedParams, \"base64url\").toString(\n \"utf8\"\n );\n return JSON.parse(decodedParams);\n } catch (error) {\n this.logger.warn(\n `Failed to parse callback params from token: ${token}`,\n error\n );\n return {};\n }\n }\n\n /**\n * Call a graph endpoint\n * @param graphType Graph type\n * @param endpointName Endpoint name\n * @param context Request context\n * @returns Response envelope\n */\n async callEndpoint(\n graphType: string,\n endpointName: string,\n context: import(\"../agent-ui\").RequestContext\n ): Promise<import(\"../agent-ui\").DataEnvelope> {\n this.logger.debug(\n `Calling endpoint \"${endpointName}\" for graph \"${graphType}\"`\n );\n\n return await this.endpointRegistry.call(graphType, endpointName, context);\n }\n\n /**\n * List all endpoints for a graph type\n * @param graphType Graph type\n * @returns Array of endpoint names\n */\n listEndpoints(graphType: string): string[] {\n return this.endpointRegistry.list(graphType);\n }\n\n /**\n * List all graph types that have endpoints\n * @returns Array of graph types\n */\n listGraphTypesWithEndpoints(): string[] {\n return this.endpointRegistry.listGraphTypes();\n }\n\n /**\n * Get builder for specified graph type\n */\n private getBuilderForType(graphType: string): AbstractGraphBuilder<string> {\n const builder = this.builders.find(b => b.graphType === graphType);\n\n if (!builder) {\n throw new Error(`No builder found for graph type: ${graphType}`);\n }\n\n return builder;\n }\n}\n","import { NestFactory } from \"@nestjs/core\";\nimport { Logger, ValidationPipe } from \"@nestjs/common\";\nimport { SwaggerModule, DocumentBuilder } from \"@nestjs/swagger\";\nimport * as net from \"net\";\nimport * as fs from \"fs\";\nimport * as path from \"path\";\n\n/**\n * Setup Redis mock for development environment\n * Intercepts ioredis requires and redirects to ioredis-mock\n */\nfunction setupRedisMock() {\n if (\n process.env.NODE_ENV === \"development\" &&\n !process.env.KUBERNETES_SERVICE_HOST\n ) {\n console.log(\"[REDIS_MOCK] Intercepting ioredis requires for development\");\n const Module = require(\"module\");\n const originalRequire = Module.prototype.require;\n\n Module.prototype.require = function (...args: any[]) {\n if (args[0] === \"ioredis\") {\n console.log(\"[REDIS_MOCK] Redirecting ioredis to ioredis-mock\");\n return originalRequire.apply(this, [\"ioredis-mock\"]);\n }\n return originalRequire.apply(this, args);\n };\n }\n}\n\n/**\n * Check port availability\n */\nasync function isPortAvailable(port: number): Promise<boolean> {\n return new Promise(resolve => {\n const server = net.createServer();\n server.listen(port, () => {\n server.close(() => resolve(true));\n });\n server.on(\"error\", () => resolve(false));\n });\n}\n\n/**\n * Find available port starting from the given one\n */\nasync function findAvailablePort(startPort: number): Promise<number> {\n let port = startPort;\n while (port < startPort + 100) {\n // Check up to 100 ports\n if (await isPortAvailable(port)) {\n return port;\n }\n port++;\n }\n throw new Error(\n `No available ports found in range ${startPort}-${startPort + 99}`\n );\n}\n\n/**\n * Automatic service discovery registration\n * NOTE: This feature requires @amelie/graph-service-registry package\n * which is an optional dependency. Commented out for standalone SDK usage.\n * Uncomment and install @amelie/graph-service-registry if needed.\n */\nasync function registerWithServiceDiscovery(\n AppModule: any,\n port: number,\n logger: Logger,\n app?: any\n): Promise<void> {\n try {\n logger.debug(\n \"[SERVICE_DISCOVERY] Starting service discovery registration...\"\n );\n\n // Import FileBasedDiscovery from SDK\n const { FileBasedDiscovery } = await import(\n \"../service-discovery/file-based.discovery\"\n );\n\n logger.debug(\n \"[SERVICE_DISCOVERY] FileBasedDiscovery imported successfully\"\n );\n const discovery = new FileBasedDiscovery();\n logger.debug(\"[SERVICE_DISCOVERY] FileBasedDiscovery instance created\");\n\n // Derive service name from module name\n const serviceName = AppModule.name.replace(\"Module\", \"\").toLowerCase();\n\n // Extract supported graph types from registered builders\n let graphTypes: string[] = [];\n try {\n if (app) {\n // Get BuilderRegistry from application\n const { BuilderRegistryService } = await import(\n \"./builder-registry.service\"\n );\n const builderRegistry = app.get(BuilderRegistryService, {\n strict: false,\n });\n logger.debug(\n `BuilderRegistryService found in DI: ${!!builderRegistry}`\n );\n\n if (builderRegistry) {\n const builders = builderRegistry.getBuilders();\n logger.debug(`Found ${builders.length} builders in registry`);\n const baseGraphTypes = builders.map(builder => builder.graphType);\n logger.debug(`Base graph types: [${baseGraphTypes.join(\", \")}]`);\n\n // Try to get versioned types from VersionedGraphService\n try {\n logger.debug(\"Attempting to import VersionedGraphService...\");\n const { VersionedGraphService } = await import(\n \"../graph/versioning/versioned-graph.service\"\n );\n logger.debug(\"VersionedGraphService imported successfully\");\n\n const versionedService = app.get(VersionedGraphService, {\n strict: false,\n });\n logger.debug(\n `VersionedGraphService found in DI: ${!!versionedService}`\n );\n\n if (versionedService) {\n // Collect all versions for each base type\n const allVersionedTypes: string[] = [];\n for (const baseType of baseGraphTypes) {\n logger.debug(`Getting versions for base type: ${baseType}`);\n const versions =\n versionedService.getAvailableVersions(baseType);\n logger.debug(\n `Found ${versions.length} versions for ${baseType}: [${versions.join(\", \")}]`\n );\n\n if (versions.length > 0) {\n // Add base type and all its versions\n allVersionedTypes.push(baseType);\n versions.forEach(version => {\n allVersionedTypes.push(`${baseType}::${version}`);\n });\n } else {\n // If no versions, add only base type\n allVersionedTypes.push(baseType);\n }\n }\n graphTypes = allVersionedTypes;\n logger.debug(\n `Found ${baseGraphTypes.length} base types with ${graphTypes.length} total versioned types: ${graphTypes.join(\", \")}`\n );\n } else {\n // Fallback to base types if VersionedGraphService is not available\n graphTypes = baseGraphTypes;\n logger.debug(\n `VersionedGraphService not found in DI container, using base types: ${graphTypes.join(\", \")}`\n );\n }\n } catch (error) {\n // Fallback to base types if error getting versions\n graphTypes = baseGraphTypes;\n logger.debug(\n `Failed to get versioned types, using base types: ${error.message}`\n );\n logger.debug(`Stack trace: ${error.stack}`);\n }\n }\n }\n } catch (error) {\n logger.debug(`Failed to get graph types from builders: ${error.message}`);\n }\n\n // Fallback to service name if no builders found\n if (graphTypes.length === 0) {\n logger.debug(\"No builders found, using service name as graph type\");\n graphTypes = [serviceName];\n }\n\n await discovery.registerService(\n serviceName,\n \"localhost\",\n port,\n {\n graphTypes,\n environment: \"development\",\n startTime: new Date().toISOString(),\n version: process.env.npm_package_version || \"1.0.0\",\n },\n graphTypes\n );\n\n logger.log(\n `📡 Service registered with discovery: ${serviceName} (types: ${graphTypes.join(\", \")})`\n );\n } catch (error) {\n logger.warn(`Failed to register with service discovery: ${error.message}`);\n }\n}\n\n/**\n * Bootstrap function for graph microservices\n */\nexport async function bootstrap(\n AppModule: any,\n options: { port?: number; globalPrefix?: string } = {}\n) {\n // Setup Redis mock for development (must be called before any module imports)\n setupRedisMock();\n\n const app = await NestFactory.create(AppModule);\n const logger = new Logger(\"Bootstrap\");\n\n // Configuration\n const requestedPort =\n options.port || parseInt(process.env.PORT || \"3100\", 10);\n const port = await findAvailablePort(requestedPort);\n const globalPrefix = options.globalPrefix;\n\n if (port !== requestedPort) {\n logger.warn(`Port ${requestedPort} is busy, using port ${port} instead`);\n }\n\n // Global prefix (only if specified)\n if (globalPrefix) {\n app.setGlobalPrefix(globalPrefix);\n }\n\n // Global validation pipe\n app.useGlobalPipes(\n new ValidationPipe({\n whitelist: true,\n forbidNonWhitelisted: true,\n transform: true,\n })\n );\n\n // CORS\n app.enableCors({\n origin: true,\n credentials: true,\n });\n\n // Swagger documentation\n const config = new DocumentBuilder()\n .setTitle(\"Graph Service API\")\n .setDescription(\"API for graph service microservice\")\n .setVersion(\"1.0\")\n .addBearerAuth()\n .build();\n\n const document = SwaggerModule.createDocument(app, config);\n SwaggerModule.setup(\"api/docs\", app, document);\n\n // Start the server\n await app.listen(port);\n\n const baseUrl = globalPrefix\n ? `http://localhost:${port}/${globalPrefix}`\n : `http://localhost:${port}`;\n logger.log(`🚀 Graph service is running on: ${baseUrl}`);\n logger.log(`📚 API Documentation: http://localhost:${port}/api/docs`);\n\n // Service Discovery Registration (only in development)\n if (process.env.NODE_ENV !== \"production\") {\n logger.debug(\n `Attempting service discovery registration (NODE_ENV: ${process.env.NODE_ENV || \"undefined\"})`\n );\n await registerWithServiceDiscovery(AppModule, port, logger, app);\n } else {\n logger.debug(\n `Skipping service discovery registration (NODE_ENV: ${process.env.NODE_ENV})`\n );\n }\n\n return app;\n}\n","export * from \"../graph/abstract-graph.builder\";\nexport * from \"./base-entity\";\nexport * from \"./bootstrap\";\nexport * from \"./builder-registry.service\";\nexport * from \"./universal-graph.module\";\n","/**\n * Message attachment types\n */\n\nexport enum AttachmentType {\n IMAGE = \"image\",\n VOICE = \"voice\",\n FILE = \"file\",\n BUTTON = \"button\",\n CITATION = \"citation\",\n SUGGESTION = \"suggestion\",\n WEBAPP = \"webapp\",\n SOURCE = \"source\",\n CARD = \"card\",\n CHART = \"chart\",\n}\n\n/** Attachment interface */\nexport interface IAttachment {\n type: AttachmentType;\n value: any;\n metadata?: Record<string, any>;\n}\n\n/** Citation attachment value */\nexport type CitationValue = {\n source: {\n url: string;\n title: string;\n type: \"webpage\" | \"pdf\" | \"article\";\n articleId?: string;\n knowledgeBaseId?: string;\n };\n};\n","/**\n * Streaming types\n */\n\nexport enum StreamChannel {\n TEXT = \"text\",\n PROCESSING = \"processing\",\n}\n","// packages/sdk/src/interfaces/graph-service.interface.ts\nimport { HumanMessage } from \"@langchain/core/messages\";\nimport { CallbackResult } from \"../callbacks/callback.interface\";\nimport {\n IAttachment,\n IUsageMetrics,\n IReasoningChain,\n IStoredMessageContent,\n} from \"../messages\";\nexport {\n IStoredMessageContent,\n IAttachment,\n IUsageMetrics,\n IReasoningChain,\n} from \"../messages\";\n// Minimal interfaces required for data exchange.\n// In the main system they can be extended with richer types.\n\n/**\n * Base contract for all graph services\n */\nexport interface IGraphService {\n /**\n * Check service availability\n */\n healthCheck(): Promise<boolean>;\n\n /**\n * Get list of supported graph types\n */\n getSupportedGraphTypes(): Promise<string[]>;\n\n /**\n * Generate answer (without streaming)\n */\n generateAnswer(payload: IGraphRequestPayload): Promise<IGraphResponsePayload>;\n\n /**\n * Stream answer generation\n */\n streamAnswer(\n payload: IGraphRequestPayload,\n onPartial: (chunk: string) => void\n ): Promise<IGraphResponsePayload>;\n\n /**\n * Cancel generation\n */\n cancelGeneration(requestId: string): Promise<void>;\n\n /**\n * Execute callback\n */\n executeCallback(\n token: string,\n platform?: string,\n platformContext?: any\n ): Promise<CallbackResult>;\n}\n\n/**\n * Request to graph service\n */\nexport interface IGraphRequestPayload {\n /**\n * Unique request ID\n */\n requestId: string;\n\n /**\n * Thread ID\n */\n threadId: string;\n\n /**\n * User ID\n */\n userId: string;\n\n /**\n * Agent ID\n */\n agentId: string;\n\n /**\n * User message\n */\n message: HumanMessage;\n\n /**\n * Graph type\n */\n graphType: string;\n\n /**\n * Graph settings ID\n */\n graphSettings: any;\n\n /**\n * Additional context (message history, etc)\n */\n context?: Record<string, any>;\n\n metadata?: Record<string, any>;\n}\n\n/**\n * Response from graph service\n */\nexport interface IGraphResponsePayload {\n /**\n * Request ID\n */\n requestId: string;\n\n /**\n * Response text\n */\n text: string;\n\n /**\n * Attachments\n */\n attachments?: IAttachment[];\n\n /**\n * Reasoning chains\n */\n reasoningChains?: IReasoningChain[];\n\n /**\n * Metadata\n */\n metadata: {\n /**\n * Usage metrics (tokens, etc.)\n */\n usageMetrics: IUsageMetrics;\n\n /**\n * Other metadata\n */\n [key: string]: any;\n };\n}\n\n/**\n * Constants for injection tokens\n */\nexport const GraphServiceTokens = {\n REGISTRY: \"GRAPH_SERVICE_REGISTRY\",\n CLIENT: \"GRAPH_SERVICE_CLIENT\",\n SETTINGS_REPOSITORY: \"GRAPH_SERVICE_SETTINGS_REPOSITORY\",\n};\n\n/**\n * Repository for graph settings\n */\nexport interface IGraphSettingsRepository {\n /**\n * Get graph settings by ID\n */\n getSettings(settingsId: string): Promise<any>;\n\n /**\n * Get graph settings by agent and graph type\n */\n getSettingsByAgentAndType(agentId: string, graphType: string): Promise<any>;\n\n /**\n * Save graph settings\n */\n saveSettings(\n agentId: string,\n graphType: string,\n settings: any\n ): Promise<string>;\n}\n","// packages/sdk/src/api/graph.controller.ts\nimport {\n Controller,\n Get,\n Post,\n Body,\n Headers,\n Res,\n HttpStatus,\n HttpException,\n Inject,\n Logger,\n Query,\n Param,\n} from \"@nestjs/common\";\nimport { Response } from \"express\";\nimport {\n ApiTags,\n ApiOperation,\n ApiResponse,\n ApiQuery,\n ApiParam,\n} from \"@nestjs/swagger\";\nimport {\n IGraphRequestPayload,\n IGraphResponsePayload,\n IGraphService,\n} from \"./graph-service.interface\";\nimport { BuilderRegistryService } from \"../core/builder-registry.service\";\n\n/**\n * Unified controller for Graph API\n * Includes core graph operations and registry\n */\n@ApiTags(\"Graphs\")\n@Controller()\nexport class GraphController {\n protected readonly logger = new Logger(GraphController.name);\n\n constructor(\n @Inject(\"GRAPH_SERVICE\")\n protected readonly graphService: IGraphService,\n @Inject(BuilderRegistryService)\n private readonly builderRegistry: BuilderRegistryService\n ) {}\n\n // ========== Core Graph Operations ==========\n\n @Get(\"health\")\n @ApiOperation({ summary: \"Check graph service health\" })\n @ApiResponse({ status: 200, description: \"Service is available\" })\n async healthCheck(): Promise<{ status: string; timestamp: string }> {\n try {\n const isHealthy = await this.graphService.healthCheck();\n return {\n status: isHealthy ? \"healthy\" : \"unhealthy\",\n timestamp: new Date().toISOString(),\n };\n } catch (error) {\n this.logger.error(`Health check failed: ${error.message}`);\n throw new HttpException(\n \"Service unhealthy\",\n HttpStatus.SERVICE_UNAVAILABLE\n );\n }\n }\n\n @Get(\"graph-types\")\n @ApiOperation({ summary: \"Get supported graph types\" })\n @ApiResponse({ status: 200, description: \"List of graph types\" })\n async getSupportedGraphTypes(): Promise<string[]> {\n return this.graphService.getSupportedGraphTypes();\n }\n\n @Post(\"generate\")\n @ApiOperation({ summary: \"Generate answer (non-streaming)\" })\n @ApiResponse({ status: 200, description: \"Answer generated\" })\n async generateAnswer(\n @Body() payload: IGraphRequestPayload\n ): Promise<IGraphResponsePayload> {\n try {\n return await this.graphService.generateAnswer(payload);\n } catch (error) {\n this.logger.error(`Generation failed: ${error.message}`);\n throw new HttpException(\n `Generation failed: ${error.message}`,\n HttpStatus.INTERNAL_SERVER_ERROR\n );\n }\n }\n\n @Post(\"stream\")\n @ApiOperation({ summary: \"Stream answer generation\" })\n @ApiResponse({ status: 200, description: \"Streaming response\" })\n async streamAnswer(\n @Body() payload: IGraphRequestPayload,\n @Res() res: Response\n ): Promise<void> {\n res.setHeader(\"Content-Type\", \"text/event-stream\");\n res.setHeader(\"Transfer-Encoding\", \"chunked\");\n res.setHeader(\"Cache-Control\", \"no-cache\");\n res.setHeader(\"Connection\", \"keep-alive\");\n\n try {\n this.logger.debug(\n `[CONTROLLER] Starting streamAnswer for requestId: ${payload.requestId}`\n );\n\n const result = await this.graphService.streamAnswer(\n payload,\n (chunk: string) => {\n // this.logger.debug(`[CONTROLLER] Sending chunk: ${chunk}`);\n res.write(`event: stream_event\\n`);\n res.write(`data: ${chunk}\\n\\n`);\n }\n );\n\n this.logger.debug(\n `[CONTROLLER] Got final result: ${JSON.stringify(result)}...`\n );\n\n this.logger.debug(`[CONTROLLER] Final result details:`, {\n hasText: !!result.text,\n textLength: result.text?.length || 0,\n attachmentsCount: result.attachments?.length || 0,\n reasoningChainsCount: result.reasoningChains?.length || 0,\n resultKeys: Object.keys(result || {}),\n });\n\n // Send final result as SSE event\n res.write(`event: final\\n`);\n res.write(`data: ${JSON.stringify(result)}\\n\\n`);\n res.end();\n\n this.logger.debug(`[CONTROLLER] Stream completed successfully`);\n } catch (error) {\n this.logger.error(`[CONTROLLER] Streaming failed: ${error.message}`);\n this.logger.error(`[CONTROLLER] Error stack: ${error.stack}`);\n // Send error as SSE event\n res.write(`event: error\\n`);\n res.write(`data: ${JSON.stringify({ message: error.message })}\\n\\n`);\n res.end();\n }\n }\n\n @Post(\"cancel/:requestId\")\n @ApiOperation({ summary: \"Cancel generation\" })\n @ApiParam({ name: \"requestId\", description: \"Request ID to cancel\" })\n @ApiResponse({ status: 200, description: \"Generation cancelled\" })\n async cancelGeneration(\n @Param(\"requestId\") requestId: string\n ): Promise<{ message: string }> {\n try {\n await this.graphService.cancelGeneration(requestId);\n return { message: `Generation ${requestId} cancelled` };\n } catch (error) {\n this.logger.error(`Cancellation failed: ${error.message}`);\n throw new HttpException(\n `Cancellation failed: ${error.message}`,\n HttpStatus.INTERNAL_SERVER_ERROR\n );\n }\n }\n\n // ========== Graph Registry ==========\n\n @Get(\"registry\")\n @ApiOperation({ summary: \"Get all registered graphs\" })\n @ApiResponse({ status: 200, description: \"List of registered graphs\" })\n async getRegisteredGraphs(): Promise<{\n total: number;\n graphs: Array<{ graphType: string; builderName: string }>;\n }> {\n const builders = this.builderRegistry.getBuilders();\n return {\n total: builders.length,\n graphs: builders.map(builder => ({\n graphType: builder.graphType,\n builderName: builder.constructor.name,\n })),\n };\n }\n\n @Get(\"registry/stats\")\n @ApiOperation({ summary: \"Graph registry statistics\" })\n @ApiResponse({ status: 200, description: \"Statistics\" })\n async getRegistryStats(): Promise<{\n totalBuilders: number;\n graphTypes: string[];\n builderTypes: Record<string, number>;\n }> {\n const builders = this.builderRegistry.getBuilders();\n const graphTypes = builders.map(b => b.graphType);\n const builderTypes: Record<string, number> = {};\n\n builders.forEach(builder => {\n const name = builder.constructor.name;\n builderTypes[name] = (builderTypes[name] || 0) + 1;\n });\n\n return {\n totalBuilders: builders.length,\n graphTypes,\n builderTypes,\n };\n }\n}\n","/**\n * JSON Schema for graph manifest validation\n */\nexport const GraphManifestSchema = {\n $schema: \"http://json-schema.org/draft-07/schema#\",\n type: \"object\",\n title: \"Graph Manifest Schema\",\n description: \"Schema for validating graph manifest files\",\n properties: {\n graphType: {\n type: \"string\",\n description: \"Unique identifier for the graph type\",\n pattern: \"^[a-z][a-zA-Z0-9]*$\",\n },\n title: {\n type: \"string\",\n description: \"Human-readable title for the graph\",\n minLength: 1,\n maxLength: 100,\n },\n description: {\n type: \"string\",\n description: \"Short description of the graph\",\n minLength: 1,\n maxLength: 500,\n },\n detailedDescription: {\n type: \"string\",\n description: \"Detailed description with markdown support\",\n minLength: 1,\n },\n category: {\n type: \"string\",\n description: \"Category for grouping graphs\",\n enum: [\"basic\", \"specialized\", \"advanced\", \"experimental\"],\n },\n tags: {\n type: \"array\",\n description: \"Tags for filtering and searching\",\n items: {\n type: \"string\",\n pattern: \"^[a-z][a-zA-Z0-9-]*$\",\n },\n uniqueItems: true,\n },\n hue: {\n type: \"number\",\n description: \"Color hue for UI representation (0-360)\",\n minimum: 0,\n maximum: 360,\n },\n visibility: {\n type: \"string\",\n description: \"Visibility level for the graph\",\n enum: [\"public\", \"private\"],\n default: \"public\",\n },\n isEmbedded: {\n type: \"boolean\",\n description: \"Whether the graph runs in embedded mode\",\n default: true,\n },\n isActive: {\n type: \"boolean\",\n description: \"Whether the graph is currently active\",\n default: true,\n },\n schema: {\n type: \"object\",\n description: \"JSON Schema for graph configuration\",\n properties: {\n type: {\n type: \"string\",\n const: \"object\",\n },\n properties: {\n type: \"object\",\n additionalProperties: {\n type: \"object\",\n properties: {\n type: { type: \"string\" },\n title: { type: \"string\" },\n description: { type: \"string\" },\n default: {},\n minimum: { type: \"number\" },\n maximum: { type: \"number\" },\n minLength: { type: \"number\" },\n maxLength: { type: \"number\" },\n format: { type: \"string\" },\n enum: { type: \"array\" },\n },\n required: [\"type\", \"title\"],\n },\n },\n required: {\n type: \"array\",\n items: { type: \"string\" },\n },\n },\n required: [\"type\", \"properties\", \"required\"],\n additionalProperties: false,\n },\n defaultSettings: {\n type: \"object\",\n description: \"Default settings for the graph\",\n },\n },\n required: [\"graphType\", \"title\", \"description\", \"schema\"],\n additionalProperties: false,\n};\n\n/**\n * Validation functions for graph manifests\n */\nexport class GraphManifestValidator {\n /**\n * Validate a graph manifest against the schema\n */\n static validate(manifest: any): { isValid: boolean; errors: string[] } {\n const errors: string[] = [];\n\n try {\n // Check required fields\n const required = GraphManifestSchema.required as string[];\n for (const field of required) {\n if (!manifest.hasOwnProperty(field)) {\n errors.push(`Missing required field: ${field}`);\n }\n }\n\n // Validate graphType format - allow dots, colons, and hyphens for versioned types\n if (\n manifest.graphType &&\n !/^[a-z][a-zA-Z0-9._:-]*$/.test(manifest.graphType)\n ) {\n errors.push(`graphType must match pattern: ^[a-z][a-zA-Z0-9._:-]*$`);\n }\n\n // Validate category\n if (\n manifest.category &&\n ![\"basic\", \"specialized\", \"advanced\", \"experimental\"].includes(\n manifest.category\n )\n ) {\n errors.push(\n `category must be one of: basic, specialized, advanced, experimental`\n );\n }\n\n // Validate visibility\n if (\n manifest.visibility &&\n ![\"public\", \"private\"].includes(manifest.visibility)\n ) {\n errors.push(`visibility must be one of: public, private`);\n }\n\n // Validate hue range\n if (\n manifest.hue !== undefined &&\n (manifest.hue < 0 || manifest.hue > 360)\n ) {\n errors.push(`hue must be between 0 and 360`);\n }\n\n // Validate schema structure\n if (manifest.schema) {\n if (manifest.schema.type !== \"object\") {\n errors.push(`schema.type must be \"object\"`);\n }\n if (\n !manifest.schema.properties ||\n typeof manifest.schema.properties !== \"object\"\n ) {\n errors.push(`schema.properties must be an object`);\n }\n if (!Array.isArray(manifest.schema.required)) {\n errors.push(`schema.required must be an array`);\n }\n }\n\n // Validate tags\n if (manifest.tags && Array.isArray(manifest.tags)) {\n for (const tag of manifest.tags) {\n if (typeof tag !== \"string\" || !/^[a-z][a-zA-Z0-9-]*$/.test(tag)) {\n errors.push(\n `Invalid tag format: ${tag}. Tags must match pattern: ^[a-z][a-zA-Z0-9-]*$`\n );\n }\n }\n\n // Check for duplicate tags\n const uniqueTags = new Set(manifest.tags);\n if (uniqueTags.size !== manifest.tags.length) {\n errors.push(`Duplicate tags found`);\n }\n }\n\n return {\n isValid: errors.length === 0,\n errors,\n };\n } catch (error: any) {\n return {\n isValid: false,\n errors: [`Validation error: ${error.message}`],\n };\n }\n }\n\n /**\n * Validate and throw if invalid\n */\n static validateOrThrow(manifest: any): void {\n const result = this.validate(manifest);\n if (!result.isValid) {\n throw new Error(\n `Graph manifest validation failed:\\n${result.errors.join(\"\\n\")}`\n );\n }\n }\n}\n","// packages/sdk/src/versioning/index.ts\nexport * from \"./versioned-graph.service\";\nexport * from \"./versioning.types\";\n","import * as LangGraph from \"@langchain/langgraph\";\nimport { Logger } from \"@nestjs/common\";\n\nconst logger = new Logger(\"ApiCallTracer\");\n\nexport interface ApiCallTracerOptions {\n /** Maximum length for string values before truncation (default: 5000) */\n maxStringLength?: number;\n /** Maximum depth for nested object traversal (default: 15) */\n maxDepth?: number;\n}\n\nexport const DEFAULT_TRACER_OPTIONS: Required<ApiCallTracerOptions> = {\n maxStringLength: 5000,\n maxDepth: 15,\n};\n\ntype LangGraphDispatchFn = (\n eventName: string,\n payload?: Record<string, unknown>\n) => void;\n\nlet cachedDispatch: LangGraphDispatchFn | null | undefined;\nlet dispatchUnavailableLogged = false;\n\nexport interface TraceApiCallResult<TResult> {\n /** Result returned from the wrapped API call */\n result: TResult;\n /** Unix timestamp in milliseconds when the call started */\n startedAt: number;\n /** Unix timestamp in milliseconds when the call completed */\n completedAt: number;\n /** Milliseconds spent inside the API call */\n durationMs: number;\n}\n\nexport async function traceApiCall<TResult>(\n execute: () => Promise<TResult>,\n options?: ApiCallTracerOptions\n): Promise<TraceApiCallResult<TResult>> {\n const startedAt = Date.now();\n\n dispatchApiTraceEvent(\"custom_api_call_start\");\n\n try {\n const result = await execute();\n const completedAt = Date.now();\n const durationMs = completedAt - startedAt;\n\n dispatchApiTraceEvent(\"custom_api_call_end\", {\n result: sanitizeTraceData(result, 0, new WeakSet(), options),\n startedAt,\n completedAt,\n durationMs,\n });\n\n return { result, startedAt, completedAt, durationMs };\n } catch (error) {\n const failedAt = Date.now();\n const durationMs = failedAt - startedAt;\n\n dispatchApiTraceEvent(\"custom_api_call_error\", {\n error: sanitizeTraceError(error, options),\n startedAt,\n failedAt,\n durationMs,\n });\n\n throw error;\n }\n}\n\nfunction dispatchApiTraceEvent(\n eventName: string,\n payload?: Record<string, unknown>\n): void {\n const dispatch = getLangGraphDispatch();\n\n if (!dispatch) {\n if (!dispatchUnavailableLogged) {\n logger.debug(\"LangGraph dispatchCustomEvent is not available\");\n dispatchUnavailableLogged = true;\n }\n return;\n }\n\n try {\n dispatch(eventName, payload);\n } catch (error) {\n logger.warn(\"Failed to emit API trace event\", {\n error: error instanceof Error ? error.message : String(error),\n eventName,\n });\n }\n}\n\nfunction getLangGraphDispatch(): LangGraphDispatchFn | null {\n if (cachedDispatch !== undefined) {\n return cachedDispatch;\n }\n\n const { dispatchCustomEvent } = LangGraph as unknown as {\n dispatchCustomEvent?: LangGraphDispatchFn;\n };\n\n cachedDispatch =\n typeof dispatchCustomEvent === \"function\" ? dispatchCustomEvent : null;\n\n return cachedDispatch;\n}\n\nexport function sanitizeTraceData(\n value: unknown,\n depth = 0,\n seen = new WeakSet<object>(),\n options?: ApiCallTracerOptions\n): unknown {\n const opts = { ...DEFAULT_TRACER_OPTIONS, ...options };\n\n if (value === undefined) {\n return undefined;\n }\n\n if (value === null) {\n return null;\n }\n\n if (typeof value === \"string\") {\n // No truncation - we need full tool inputs/outputs for proper processing\n return value;\n }\n\n if (typeof value === \"number\" || typeof value === \"boolean\") {\n return value;\n }\n\n if (typeof value === \"bigint\") {\n return value.toString();\n }\n\n if (value instanceof Date) {\n return value.toISOString();\n }\n\n if (value instanceof Error) {\n return sanitizeTraceError(value, options);\n }\n\n if (depth >= opts.maxDepth) {\n return Array.isArray(value) ? \"[Array]\" : \"[Object]\";\n }\n\n if (typeof value === \"object\") {\n if (seen.has(value as object)) {\n // Skip circular references instead of returning \"[Circular]\" string\n return undefined;\n }\n\n seen.add(value as object);\n\n if (Array.isArray(value)) {\n // Don't truncate arrays - we need all tool calls, all messages, etc.\n return value\n .map(item => sanitizeTraceData(item, depth + 1, seen, options))\n .filter(item => item !== undefined); // Remove circular refs from array\n }\n\n if (value instanceof Set) {\n return Array.from(value)\n .map(item => sanitizeTraceData(item, depth + 1, seen, options))\n .filter(item => item !== undefined);\n }\n\n if (value instanceof Map) {\n const entries: Record<string, unknown> = {};\n for (const [key, entryValue] of value.entries()) {\n const sanitized = sanitizeTraceData(\n entryValue,\n depth + 1,\n seen,\n options\n );\n if (sanitized !== undefined) {\n entries[String(key)] = sanitized;\n }\n }\n return entries;\n }\n\n const result: Record<string, unknown> = {};\n for (const [key, entryValue] of Object.entries(\n value as Record<string, unknown>\n )) {\n const sanitized = sanitizeTraceData(entryValue, depth + 1, seen, options);\n // Skip circular references instead of adding \"[Circular]\" string\n if (sanitized !== undefined) {\n result[key] = sanitized;\n }\n }\n return result;\n }\n\n return String(value);\n}\n\nfunction sanitizeTraceError(\n error: unknown,\n options?: ApiCallTracerOptions\n): Record<string, unknown> {\n const opts = { ...DEFAULT_TRACER_OPTIONS, ...options };\n\n if (error instanceof Error) {\n return {\n name: error.name,\n message: error.message,\n stack: error.stack\n ? sanitizeTraceData(error.stack, 0, new WeakSet(), options)\n : undefined,\n };\n }\n\n if (typeof error === \"string\") {\n return {\n message:\n error.length > opts.maxStringLength\n ? `${error.slice(0, opts.maxStringLength)}…`\n : error,\n };\n }\n\n return {\n message: \"Unknown error\",\n raw: sanitizeTraceData(error, 0, new WeakSet(), options),\n };\n}\n","// packages/sdk/src/graph-engine.factory.ts\nimport { Inject, Injectable } from \"@nestjs/common\";\nimport { IGraphEngine } from \"../graph/abstract-graph.builder\";\nimport { LangGraphEngine } from \"./langgraph/langgraph-engine\";\n\n/**\n * Graph engine type\n */\nexport enum GraphEngineType {\n LANGGRAPH = \"langgraph\",\n LANGFLOW = \"langflow\",\n FLOWISE = \"flowise\",\n}\n\n/**\n * Factory for creating graph engines\n */\n@Injectable()\nexport class GraphEngineFactory {\n constructor(private readonly langgraph: LangGraphEngine) {}\n\n /**\n * Get engine for the specified type\n */\n getEngine(engineType: GraphEngineType): IGraphEngine {\n switch (engineType) {\n case GraphEngineType.LANGGRAPH:\n return this.langgraph;\n // Will add other types in the future\n // case GraphEngineType.LANGFLOW:\n // return new LangFlowEngine();\n // case GraphEngineType.FLOWISE:\n // return new FlowiseEngine();\n default:\n throw new Error(`Unsupported graph engine type: ${engineType}`);\n }\n }\n}\n","/**\n * Universal LangGraph stream processing and result extraction utilities\n */\n\nimport {\n IContentBlock,\n IContentChain,\n StreamChannel,\n IStoredMessageContent,\n IAttachment,\n} from \"../../messages\";\nimport { IGraphTraceEvent } from \"../../graph/tracing\";\nimport { Injectable, Logger } from \"@nestjs/common\";\nimport { sanitizeTraceData } from \"../api-call-tracer.utils\";\n\n/**\n * LLM call record collected from on_chat_model_end events\n */\nexport interface LLMCallRecord {\n modelId: string; // Internal MongoDB model ID\n promptTokens: number;\n completionTokens: number;\n totalTokens: number;\n timestamp: number;\n nodeName?: string; // LangGraph node name\n}\n\n/**\n * State for a single channel\n */\nexport interface ChannelState {\n contentChain: IContentBlock[]; // Accumulated blocks for the chain\n currentBlock: IContentBlock | null; // Block currently being streamed\n pendingToolBlocks: IContentBlock[]; // Tool blocks awaiting on_tool_end output (FIFO queue)\n}\n\n/**\n * Stream accumulator for collecting events during graph execution\n * Each stream creates its own accumulator to ensure thread-safety\n */\nexport interface StreamAccumulator {\n // Per-channel state (unified structure)\n channels: Map<StreamChannel, ChannelState>;\n\n // Common data\n attachments: IAttachment[];\n metadata: Record<string, any>;\n traceEvents: IGraphTraceEvent[];\n traceStartedAt: number | null;\n traceCompletedAt: number | null;\n}\n\n/**\n * Stateless event processor for LangGraph streams\n * Thread-safe: state is passed via accumulator parameter, not stored in class\n */\n@Injectable()\nexport class EventProcessor {\n private readonly logger = new Logger(EventProcessor.name);\n\n /**\n * Create new accumulator for a stream\n */\n createAccumulator(): StreamAccumulator {\n return {\n channels: new Map([\n [\n StreamChannel.TEXT,\n { contentChain: [], currentBlock: null, pendingToolBlocks: [] },\n ],\n [\n StreamChannel.PROCESSING,\n { contentChain: [], currentBlock: null, pendingToolBlocks: [] },\n ],\n ]),\n attachments: [],\n metadata: {},\n traceEvents: [],\n traceStartedAt: null,\n traceCompletedAt: null,\n };\n }\n\n /**\n * Normalize content to unified array of blocks\n * Handles string, array, or single object formats\n *\n * Output format examples:\n * - Text: [{ type: \"text\", text: \"Hello\" }]\n * - Tool call: [{ type: \"tool_use\", id: \"toolu_123\", name: \"get_weather\", input: {...} }]\n * - Tool input delta: [{ type: \"input_json_delta\", input: \"{\\\"city\\\": \\\"\" }]\n * - Mixed: [{ type: \"tool_use\", ... }, { type: \"text\", text: \"...\" }]\n */\n private normalizeContentBlocks(content: any): any[] {\n if (!content) {\n return [];\n }\n\n // Already an array of blocks\n if (Array.isArray(content)) {\n return content;\n }\n\n // String content -> wrap in text block\n if (typeof content === \"string\") {\n return content.trim() ? [{ type: \"text\", text: content }] : [];\n }\n\n // Single object block\n if (typeof content === \"object\") {\n return [content];\n }\n\n return [];\n }\n\n /**\n * Send delta to UI (unified format)\n */\n private sendDelta(\n channel: StreamChannel,\n delta: any,\n onPartial?: (chunk: string) => void\n ): void {\n if (!onPartial) return;\n\n onPartial(\n JSON.stringify({\n channel,\n delta,\n })\n );\n }\n\n /**\n * Process content stream blocks (universal for all channels)\n */\n private processContentStream(\n acc: StreamAccumulator,\n channel: StreamChannel,\n blocks: any[],\n onPartial?: (chunk: string) => void\n ): void {\n const state = acc.channels.get(channel)!;\n\n for (const block of blocks) {\n if (block.type === \"tool_use\" || block.type === \"tool_call\") {\n // Finalize current block if exists\n if (state.currentBlock) {\n state.contentChain.push(state.currentBlock);\n }\n\n // Create new tool block\n state.currentBlock = {\n index: state.contentChain.length,\n type: \"tool_use\",\n name: block.name,\n id: block.id,\n input: block.input || \"\",\n output: \"\",\n };\n\n // Track this tool block for matching with on_tool_end\n state.pendingToolBlocks.push(state.currentBlock);\n\n // Send delta\n this.sendDelta(\n channel,\n {\n type: \"step_started\",\n step: state.currentBlock,\n },\n onPartial\n );\n } else if (block.type === \"input_json_delta\") {\n // Accumulate tool INPUT (parameters)\n if (state.currentBlock && state.currentBlock.type === \"tool_use\") {\n const chunk = block.input || \"\";\n state.currentBlock.input += chunk;\n\n // Send delta\n this.sendDelta(\n channel,\n {\n type: \"tool_input_chunk\",\n stepId: state.currentBlock.id,\n chunk: chunk,\n },\n onPartial\n );\n }\n } else if (block.type === \"text\") {\n const textChunk = block.text || \"\";\n\n // If current block is text, accumulate\n if (state.currentBlock && state.currentBlock.type === \"text\") {\n state.currentBlock.text = (state.currentBlock.text || \"\") + textChunk;\n } else {\n // Finalize previous block (tool)\n if (state.currentBlock) {\n state.contentChain.push(state.currentBlock);\n }\n\n // Create new text block\n state.currentBlock = {\n index: state.contentChain.length,\n type: \"text\",\n text: textChunk,\n };\n }\n\n // Send delta\n this.sendDelta(\n channel,\n {\n type: \"text_chunk\",\n text: textChunk,\n },\n onPartial\n );\n }\n }\n }\n\n /**\n * Groups tool_use and input_json_delta into proper structure\n * tool_use.input → output (tool execution result)\n * input_json_delta.input → output (tool execution result, accumulated)\n * @deprecated This method is for legacy fallback only\n */\n private mapReasoningSteps(rawSteps: any[]): IContentBlock[] {\n const steps: IContentBlock[] = [];\n let currentToolUse: IContentBlock | null = null;\n\n for (const raw of rawSteps) {\n if (raw.type === \"tool_use\" || raw.type === \"tool_call\") {\n // Save previous tool_use if exists\n if (currentToolUse) {\n steps.push(currentToolUse);\n }\n\n // Create new tool_use\n // tool_use.input contains tool execution result (OUT)\n currentToolUse = {\n index: raw.index || 0,\n type: \"tool_use\",\n name: raw.name,\n id: raw.id,\n input: \"\", // Parameters (IN) - filled separately or empty\n output: raw.input || \"\", // Result (OUT) - comes in tool_use.input\n };\n } else if (raw.type === \"input_json_delta\") {\n // input_json_delta.input contains execution result (streaming) → output\n if (currentToolUse) {\n currentToolUse.output =\n (currentToolUse.output || \"\") + (raw.input || \"\");\n }\n } else {\n // Regular step (text, thinking, tool_result)\n if (currentToolUse) {\n steps.push(currentToolUse);\n currentToolUse = null;\n }\n\n steps.push({\n index: raw.index || 0,\n type: raw.type,\n text: raw.text || \"\",\n metadata: raw.metadata,\n });\n }\n }\n\n // Don't forget the last tool_use\n if (currentToolUse) {\n steps.push(currentToolUse);\n }\n\n return steps;\n }\n\n /**\n * Process a LangGraph stream event\n * Mutates accumulator to collect data from different channels\n * @param onPartial Optional callback for streaming chunks to UI (omit for invoke without streaming)\n */\n processEvent(\n acc: StreamAccumulator,\n event: any,\n onPartial?: (chunk: string) => void\n ): void {\n this.captureTraceEvent(acc, event);\n\n // 1. Streaming content (universal for all channels)\n if (event.event === \"on_chat_model_stream\" && event.data?.chunk?.content) {\n const channel =\n (event.metadata?.stream_channel as StreamChannel) ?? StreamChannel.TEXT;\n const blocks = this.normalizeContentBlocks(event.data.chunk.content);\n\n this.processContentStream(acc, channel, blocks, onPartial);\n return;\n }\n\n // 3. Tool events: log tool execution lifecycle\n if (event.event === \"on_tool_start\") {\n this.logger.log(\"🔧 Tool execution started\", {\n toolName: event.name,\n input: event.data?.input,\n runId: event.run_id,\n metadata: event.metadata,\n });\n return;\n }\n\n if (event.event === \"on_tool_end\") {\n const channel =\n (event.metadata?.stream_channel as StreamChannel) ?? StreamChannel.TEXT;\n const state = acc.channels.get(channel);\n\n if (!state) return;\n\n // Find the correct tool block from the pending queue (FIFO order)\n // Tools execute sequentially, so the first pending block matches the first on_tool_end\n const toolBlock = state.pendingToolBlocks.shift();\n\n if (toolBlock && toolBlock.type === \"tool_use\") {\n // Set tool OUTPUT (result of execution)\n const output = event.data?.output;\n const outputString =\n typeof output === \"string\" ? output : JSON.stringify(output, null, 2);\n\n toolBlock.output = outputString;\n\n // Send delta with correct tool block id\n this.sendDelta(\n channel,\n {\n type: \"tool_output_chunk\",\n stepId: toolBlock.id,\n chunk: outputString,\n },\n onPartial\n );\n\n this.logger.log(\"✅ Tool execution completed\", {\n toolName: event.name,\n toolBlockId: toolBlock.id,\n outputPreview:\n outputString.substring(0, 200) +\n (outputString.length > 200 ? \"...\" : \"\"),\n runId: event.run_id,\n });\n } else {\n this.logger.warn(\n \"⚠️ on_tool_end received but no pending tool block found\",\n {\n toolName: event.name,\n runId: event.run_id,\n pendingCount: state.pendingToolBlocks.length,\n }\n );\n }\n return;\n }\n\n if (event.event === \"on_tool_error\") {\n this.logger.error(\"❌ Tool execution failed\", {\n toolName: event.name,\n error: event.data?.error,\n runId: event.run_id,\n });\n return;\n }\n\n // 2. Model end: just log, no finalization needed\n if (event.event === \"on_chat_model_end\") {\n this.logger.debug(\"✅ LLM call completed\", {\n nodeName: event.metadata?.langgraph_node || event.name,\n channel: event.metadata?.stream_channel,\n });\n return;\n }\n\n // 3. Chain end: extract final attachments and metadata (TEXT channel only)\n if (event.event === \"on_chain_end\") {\n const channel =\n (event.metadata?.stream_channel as StreamChannel) ?? StreamChannel.TEXT;\n\n if (channel === StreamChannel.TEXT) {\n const output = event.data.output;\n\n // Extract attachments and metadata from different graph output formats\n // Use merge instead of replace to preserve data from multiple nodes\n if (output?.answer) {\n acc.attachments = [\n ...acc.attachments,\n ...(output.answer.attachments || []),\n ];\n acc.metadata = { ...acc.metadata, ...(output.answer.metadata || {}) };\n } else if (output?.generation) {\n acc.attachments = [\n ...acc.attachments,\n ...(output.generation.attachments || []),\n ];\n acc.metadata = {\n ...acc.metadata,\n ...(output.generation.metadata || {}),\n };\n } else if (output?.attachments || output?.metadata) {\n acc.attachments = [...acc.attachments, ...(output.attachments || [])];\n acc.metadata = { ...acc.metadata, ...(output.metadata || {}) };\n }\n }\n\n return;\n }\n }\n\n /**\n * Build final result from accumulator\n * Returns unified content chains from all channels\n */\n getResult(acc: StreamAccumulator): {\n content: IStoredMessageContent;\n trace: {\n events: IGraphTraceEvent[];\n startedAt: number;\n completedAt: number;\n durationMs: number;\n totalEvents: number;\n } | null;\n } {\n // Build chains from accumulated blocks\n const allChains: IContentChain[] = [];\n\n for (const [channel, state] of acc.channels.entries()) {\n // Finalize current block if exists\n if (state.currentBlock) {\n state.contentChain.push(state.currentBlock);\n }\n\n // Create chain if has blocks\n if (state.contentChain.length > 0) {\n allChains.push({\n channel,\n steps: state.contentChain,\n isComplete: true,\n });\n }\n }\n\n const startedAt = acc.traceStartedAt ?? Date.now();\n const completedAt = acc.traceCompletedAt ?? startedAt;\n\n const trace =\n acc.traceEvents.length > 0\n ? {\n events: acc.traceEvents,\n startedAt,\n completedAt,\n durationMs: Math.max(0, completedAt - startedAt),\n totalEvents: acc.traceEvents.length,\n }\n : null;\n\n // Extract text from text channel for backwards compatibility\n const textChain = allChains.find(c => c.channel === \"text\");\n const text = textChain\n ? textChain.steps\n .filter(step => step.type === \"text\")\n .map(step => step.text || \"\")\n .join(\"\")\n : \"\";\n\n this.logger.log(\"📊 [EventProcessor] Final result assembled\", {\n totalChains: allChains.length,\n textChains: allChains.filter(c => c.channel === \"text\").length,\n processingChains: allChains.filter(c => c.channel === \"processing\")\n .length,\n totalSteps: allChains.reduce((sum, c) => sum + c.steps.length, 0),\n textLength: text.length,\n });\n\n return {\n content: {\n contentChains: allChains.length > 0 ? allChains : undefined,\n attachments: acc.attachments,\n metadata: acc.metadata,\n text, // Add extracted text for backwards compatibility\n },\n trace,\n };\n }\n\n private captureTraceEvent(acc: StreamAccumulator, event: any): void {\n // Normalize the event before storing\n const normalized = this.normalizeTraceEvent(event);\n\n if (!normalized) {\n return; // Skip events that can't be normalized (stream chunks, etc.)\n }\n\n acc.traceEvents.push(normalized);\n this.logger.debug(\n `[TRACE] Captured trace event ${normalized.type} for node ${normalized.nodeName} (${acc.traceEvents.length} total)`\n );\n }\n\n private normalizeTraceEvent(event: any): IGraphTraceEvent | null {\n const type = event?.event ?? event?.type;\n if (!type) {\n return null;\n }\n\n const normalizedType = String(type);\n\n // Debug: Log raw event structure for chain events\n if (normalizedType.includes(\"chain\") && !event?.name) {\n this.logger.debug(`[TRACE] Chain event WITHOUT name field:`, {\n type: normalizedType,\n eventKeys: Object.keys(event || {}).join(\", \"),\n hasMetadata: !!event?.metadata,\n metadataKeys: event?.metadata\n ? Object.keys(event.metadata).join(\", \")\n : \"none\",\n });\n }\n\n // Skip streaming chunk events\n if (normalizedType.toLowerCase() === \"stream_chunk\") {\n return null;\n }\n\n const chunkType = event?.data?.chunk?.type || event?.data?.chunk?.event;\n if (\n typeof chunkType === \"string\" &&\n chunkType.toLowerCase() === \"stream_chunk\"\n ) {\n return null;\n }\n\n // Skip on_chat_model_stream events - they generate too many trace entries\n // We only need on_chat_model_end for token tracking\n if (normalizedType === \"on_chat_model_stream\") {\n return null;\n }\n\n const name = event?.name ? String(event.name) : undefined;\n\n // Skip internal LangGraph infrastructure events first\n if (\n name &&\n (name.includes(\"ChannelWrite\") ||\n name.includes(\"ChannelRead\") ||\n name.includes(\"ChannelInvoke\") ||\n name.includes(\"Branch<\"))\n ) {\n this.logger.debug(\n `[TRACE] Skipping infrastructure event: ${name} (type: ${normalizedType})`\n );\n return null;\n }\n\n // Log events that pass the filter to see what's being stored\n if (normalizedType.includes(\"chain\") && name) {\n this.logger.debug(\n `[TRACE] Accepting event: name=\"${name}\", type=\"${normalizedType}\", hasNode=${!!event?.metadata?.langgraph_node}`\n );\n }\n\n // Skip wrapper LangGraph events (they have no langgraph_node in metadata)\n // These are top-level graph events that duplicate info from inner nodes\n const hasLangGraphNode = event?.metadata?.langgraph_node;\n if (!hasLangGraphNode && type.startsWith(\"on_chain\")) {\n return null; // Skip top-level graph wrapper events\n }\n\n // Use unified sanitization from api-call-tracer\n // NOTE: We sanitize metadata and data, but NOT the events array itself\n // to avoid truncating the array to MAX_COLLECTION_LENGTH (20 items)\n const metadata = sanitizeTraceData(event?.metadata) as\n | Record<string, unknown>\n | undefined;\n const data = sanitizeTraceData(event?.data) as\n | Record<string, unknown>\n | undefined;\n\n const timestampSource =\n event?.timestamp ??\n event?.time ??\n event?.data?.timestamp ??\n event?.data?.ts ??\n Date.now();\n\n const timestamp = Number(timestampSource) || Date.now();\n\n const streamChannel =\n typeof event?.metadata?.stream_channel === \"string\"\n ? event.metadata.stream_channel\n : typeof (metadata as any)?.stream_channel === \"string\"\n ? ((metadata as any).stream_channel as string)\n : undefined;\n\n const nodeNameFromMetadata = (metadata as any)?.langgraph_node;\n const fallbackNodeName = (metadata as any)?.node_name;\n\n return {\n type: normalizedType,\n name,\n channel: streamChannel,\n nodeName:\n (typeof nodeNameFromMetadata === \"string\"\n ? nodeNameFromMetadata\n : typeof fallbackNodeName === \"string\"\n ? fallbackNodeName\n : name) || undefined,\n timestamp,\n metadata,\n data,\n };\n }\n}\n","import { Inject, Injectable, Logger, Optional } from \"@nestjs/common\";\nimport { IGraphEngine } from \"../../core\";\nimport { EventProcessor } from \"./event-processor.utils\";\nimport { ConfigService } from \"@nestjs/config\";\n/**\n * Default recursion limit for LangGraph execution.\n * Prevents infinite loops in agent execution.\n * LangGraph default is 25, we use 40 for complex multi-tool workflows.\n */\nconst DEFAULT_RECURSION_LIMIT = 40;\n\n/**\n * Graph engine implemented using LangGraph.js\n */\n\nprocess.setMaxListeners(0);\n@Injectable()\nexport class LangGraphEngine implements IGraphEngine {\n private readonly logger = new Logger(LangGraphEngine.name);\n\n constructor(\n private readonly eventProcessor: EventProcessor,\n @Optional() private readonly configService?: ConfigService\n ) {\n if (!eventProcessor) {\n this.logger.error(\"EventProcessor is undefined/null!\");\n }\n }\n\n /**\n * Method to invoke LangGraph\n */\n async invokeGraph(\n graph: any,\n config: any,\n signal?: AbortSignal\n ): Promise<any> {\n // Add abort signal to configuration\n if (signal) {\n config.signal = signal;\n }\n\n // Invoke the graph with recursion limit to prevent infinite loops\n const recursionLimit = config.recursionLimit ?? DEFAULT_RECURSION_LIMIT;\n const result = await graph.invoke(config.input || {}, {\n ...config,\n recursionLimit,\n });\n\n // Transform the result\n return this.processGraphResult(result);\n }\n\n async streamGraph(\n graph: any,\n config: any,\n onPartial: (chunk: string) => void,\n signal?: AbortSignal\n ): Promise<any> {\n // Create accumulator BEFORE try block to ensure it's available in finally\n const acc = this.eventProcessor.createAccumulator();\n let streamError: Error | null = null;\n\n try {\n if (signal) {\n config.signal = signal;\n }\n //TODO: migrate to v.1\n const recursionLimit = config.recursionLimit ?? DEFAULT_RECURSION_LIMIT;\n const eventStream = await graph.streamEvents(config.input || {}, {\n ...config,\n version: \"v2\", // Important for correct operation\n recursionLimit, // Prevent GraphRecursionError (default is 25)\n });\n\n // Process the event stream\n for await (const event of eventStream) {\n try {\n this.eventProcessor.processEvent(acc, event, onPartial);\n } catch (error) {\n this.logger.warn(\n `[STREAM-EVENT-ERROR] Error processing event: ${error.message}`\n );\n }\n }\n } catch (error) {\n // Capture error but don't throw yet - we need to send trace first\n streamError = error instanceof Error ? error : new Error(String(error));\n this.logger.error(\n `[STREAM-ERROR] Error in streamGraph: ${streamError.message}`\n );\n this.logger.error(`[STREAM-ERROR] Stack trace: ${streamError.stack}`);\n } finally {\n // ALWAYS try to send trace events, even if graph failed\n // This ensures we capture metrics for billing even on errors\n await this.sendTraceFromAccumulator(acc, config, streamError);\n }\n\n // Get final result from accumulator\n const { content, trace } = this.eventProcessor.getResult(acc);\n\n this.logger.debug(\"[STREAM-RESULT] Got result from EventProcessor\", {\n hasContent: !!content,\n hasContext: !!config.configurable?.context,\n hasTrace: !!trace,\n traceEvents: trace?.events?.length || 0,\n hadError: !!streamError,\n });\n\n // Re-throw the error after sending trace\n if (streamError) {\n throw streamError;\n }\n\n return content;\n }\n\n /**\n * Extract trace from accumulator and send to backend webhook\n * Called in finally block to ensure trace is sent even on errors\n */\n private async sendTraceFromAccumulator(\n acc: ReturnType<EventProcessor[\"createAccumulator\"]>,\n config: any,\n error: Error | null\n ): Promise<void> {\n try {\n const { trace } = this.eventProcessor.getResult(acc);\n\n if (trace && trace.events.length > 0 && config.configurable?.context) {\n const context = config.configurable.context;\n\n this.logger.debug(\"[TRACE-WEBHOOK] Sending trace events batch\", {\n messageId: context.messageId,\n totalEvents: trace.totalEvents,\n eventsArrayLength: trace.events.length,\n firstEventType: trace.events[0]?.type,\n hadError: !!error,\n errorMessage: error?.message,\n });\n\n // Send trace events batch to TimeSeries collection\n await this.sendTraceEventsBatch({\n messageId: context.messageId || \"unknown\",\n threadId: context.threadId || \"unknown\",\n userId: context.userId || \"unknown\",\n agentId: context.agentId || \"unknown\",\n companyId: context.companyId || \"unknown\",\n events: trace.events,\n totalEvents: trace.totalEvents,\n startedAt: trace.startedAt,\n completedAt: trace.completedAt || Date.now(),\n durationMs: trace.durationMs || Date.now() - trace.startedAt,\n status: error ? \"error\" : \"success\",\n error: error\n ? { message: error.message, name: error.name }\n : undefined,\n });\n } else {\n this.logger.debug(\"[TRACE-WEBHOOK] Skipping webhook\", {\n hasTrace: !!trace,\n traceEvents: trace?.events?.length || 0,\n hasContext: !!config.configurable?.context,\n contextKeys: config.configurable?.context\n ? Object.keys(config.configurable.context)\n : [],\n hadError: !!error,\n });\n }\n } catch (webhookError) {\n // Don't throw - webhook failure shouldn't mask the original error\n this.logger.error(\n \"[TRACE-WEBHOOK] Failed to send trace in finally block\",\n {\n error:\n webhookError instanceof Error\n ? webhookError.message\n : String(webhookError),\n originalError: error?.message,\n }\n );\n }\n }\n\n /**\n * Send usage metrics to backend webhook\n */\n private async sendMetricsWebhook(payload: {\n messageId: string;\n threadId: string;\n userId: string;\n agentId: string;\n companyId: string;\n metrics: any;\n }): Promise<void> {\n try {\n const backendUrl =\n this.configService?.get<string>(\"API_URL\") || \"http://amelie-service\";\n const internalToken =\n this.configService?.get<string>(\"INTERNAL_API_TOKEN\");\n\n if (!internalToken) {\n this.logger.warn(\n \"[METRICS-WEBHOOK] INTERNAL_API_TOKEN not configured, skipping webhook\"\n );\n return;\n }\n\n const webhookUrl = `${backendUrl}/internal/usage/metrics`;\n\n this.logger.debug(\"[METRICS-WEBHOOK] Sending metrics to backend\", {\n url: webhookUrl,\n messageId: payload.messageId,\n modelCallsCount: payload.metrics.modelCalls.length,\n });\n\n const response = await fetch(webhookUrl, {\n method: \"POST\",\n headers: {\n \"Content-Type\": \"application/json\",\n \"x-internal-token\": internalToken,\n },\n body: JSON.stringify(payload),\n });\n\n if (!response.ok) {\n throw new Error(\n `Webhook failed with status ${response.status}: ${response.statusText}`\n );\n }\n\n this.logger.log(\"✅ Metrics webhook sent successfully\", {\n messageId: payload.messageId,\n modelCallsCount: payload.metrics.modelCalls.length,\n });\n } catch (error) {\n this.logger.error(\"[METRICS-WEBHOOK] Failed to send metrics webhook\", {\n error: error.message,\n messageId: payload.messageId,\n });\n // Don't throw - metrics webhook failure shouldn't break graph execution\n }\n }\n\n private async sendTraceEventsBatch(payload: {\n messageId: string;\n threadId: string;\n userId: string;\n agentId: string;\n companyId: string;\n events: any[];\n totalEvents: number;\n startedAt: number;\n completedAt: number;\n durationMs: number;\n status?: \"success\" | \"error\";\n error?: { message: string; name: string };\n }): Promise<void> {\n try {\n const backendUrl =\n this.configService?.get<string>(\"API_URL\") || \"http://amelie-service\";\n const internalToken =\n this.configService?.get<string>(\"INTERNAL_API_TOKEN\");\n\n if (!internalToken) {\n this.logger.warn(\n \"[TRACE-EVENTS-BATCH] INTERNAL_API_TOKEN not configured, skipping batch webhook\"\n );\n return;\n }\n\n const webhookUrl = `${backendUrl}/internal/usage/trace-events/batch`;\n\n // Transform events to batch format\n const batchPayload = {\n messageId: payload.messageId,\n threadId: payload.threadId,\n userId: payload.userId,\n agentId: payload.agentId,\n companyId: payload.companyId,\n totalEvents: payload.totalEvents,\n startedAt: payload.startedAt,\n completedAt: payload.completedAt,\n durationMs: payload.durationMs,\n status: payload.status || \"success\",\n error: payload.error,\n events: payload.events.map(event => ({\n timestamp: event.timestamp\n ? new Date(event.timestamp).toISOString()\n : new Date().toISOString(),\n meta: {\n messageId: payload.messageId,\n threadId: payload.threadId,\n userId: payload.userId,\n agentId: payload.agentId,\n companyId: payload.companyId,\n type: event.type,\n nodeName: event.nodeName,\n channel: event.channel,\n },\n event: event,\n })),\n };\n\n this.logger.debug(\"[TRACE-EVENTS-BATCH] Sending batch to backend\", {\n url: webhookUrl,\n messageId: payload.messageId,\n eventsCount: batchPayload.events.length,\n });\n\n const response = await fetch(webhookUrl, {\n method: \"POST\",\n headers: {\n \"Content-Type\": \"application/json\",\n \"x-internal-token\": internalToken,\n },\n body: JSON.stringify(batchPayload),\n });\n\n if (!response.ok) {\n const responseText = await response.text();\n throw new Error(\n `Batch webhook failed with status ${response.status}: ${responseText}`\n );\n }\n\n const responseData = await response.json();\n\n this.logger.log(\"✅ Trace events batch sent successfully\", {\n messageId: payload.messageId,\n sent: batchPayload.events.length,\n stored: responseData.stored,\n });\n } catch (error) {\n this.logger.error(\"[TRACE-EVENTS-BATCH] Failed to send batch webhook\", {\n error: error instanceof Error ? error.message : String(error),\n messageId: payload.messageId,\n eventsCount: payload.events.length,\n });\n // Don't throw - batch webhook failure shouldn't break graph execution\n }\n }\n\n /**\n * Process graph execution result\n */\n private processGraphResult(result: any): any {\n return {\n text: result.text,\n attachments: result.attachments,\n metadata: {\n ...result.metadata,\n usageMetrics: result?.usageRecorder,\n },\n };\n }\n}\n","// packages/sdk/src/universal-graph.module.ts\nimport { DynamicModule, Module, Provider } from \"@nestjs/common\";\nimport { ModuleRef, DiscoveryModule, MetadataScanner } from \"@nestjs/core\";\nimport { ConfigModule } from \"@nestjs/config\";\nimport {\n AbstractGraphBuilder,\n IGraphRequestPayload,\n GraphController,\n UniversalGraphService,\n VersionedGraphService,\n VersioningConfig,\n} from \"../graph\";\nimport {\n EventProcessor,\n GraphEngineFactory,\n GraphEngineType,\n LangGraphEngine,\n} from \"../engines\";\nimport { BuilderRegistryService } from \"./builder-registry.service\";\nimport { Registry } from \"prom-client\";\nimport {\n CallbackStore,\n CallbackRegistry,\n CallbackController,\n CallbackTokenGuard,\n SmartCallbackRouter,\n UniversalCallbackService,\n registerFinanceExampleCallback,\n CallbackACL,\n CallbackAuditor,\n CallbackMetrics,\n CallbackRateLimiter,\n IdempotencyManager,\n CallbackPatchService,\n TelegramPatchHandler,\n WebPatchHandler,\n} from \"../callbacks\";\nimport {\n EndpointRegistry,\n UIEndpointsDiscoveryService,\n UIDispatchController,\n} from \"../agent-ui\";\n\n/**\n * Options for UniversalGraphModule configuration\n */\nexport interface UniversalGraphModuleOptions {\n /** Graph engine type */\n engineType?: GraphEngineType;\n /** Versioning configurations for graphs */\n versioning?: VersioningConfig[];\n}\n\n/**\n * Create simple meta-builder for versioning\n */\nfunction createMetaBuilder(\n config: VersioningConfig,\n versionedGraphService: VersionedGraphService,\n moduleRef: ModuleRef,\n callbackRegistry: CallbackRegistry,\n endpointRegistry: EndpointRegistry\n) {\n // Create dynamic class with meaningful name\n const className = `${config.baseGraphType.replace(/\\./g, \"\")}VersionRouter`;\n\n class VersionRouter extends AbstractGraphBuilder<any> {\n readonly version = \"router\" as any; // Version router\n\n // Inject CallbackRegistry and EndpointRegistry manually since we can't use decorators in dynamic classes\n constructor() {\n super();\n // Manually assign the registry instances\n (this as any).callbackRegistry = callbackRegistry;\n (this as any).endpointRegistry = endpointRegistry;\n }\n\n // Override graphType to display base type\n get graphType(): string {\n return config.baseGraphType;\n }\n\n async buildGraph(payload: IGraphRequestPayload): Promise<any> {\n const graphType = payload.graphSettings?.graphType;\n if (!graphType) {\n throw new Error(\"GraphType is required in payload.graphSettings\");\n }\n\n const resolution = await versionedGraphService.resolveVersion(graphType, {\n strict: false,\n });\n\n // Try to get existing instance, fallback to creating new one\n try {\n const versionedBuilder = moduleRef.get(resolution.builderClass, {\n strict: false,\n });\n return versionedBuilder.buildGraph(payload);\n } catch (error) {\n // Fallback: create instance manually\n const versionedBuilder = await moduleRef.create(\n resolution.builderClass\n );\n return versionedBuilder.buildGraph(payload);\n }\n }\n\n async prepareConfig(payload: IGraphRequestPayload): Promise<any> {\n const graphType = payload.graphSettings?.graphType;\n if (!graphType) {\n throw new Error(\"GraphType is required in payload.graphSettings\");\n }\n\n const resolution = await versionedGraphService.resolveVersion(graphType, {\n strict: false,\n });\n\n // Try to get existing instance, fallback to creating new one\n let versionedBuilder;\n try {\n versionedBuilder = moduleRef.get(resolution.builderClass, {\n strict: false,\n });\n } catch (error) {\n versionedBuilder = await moduleRef.create(resolution.builderClass);\n }\n\n const updatedPayload = {\n ...payload,\n graphSettings: {\n ...payload.graphSettings,\n graphType: resolution.fullGraphType,\n },\n };\n\n return versionedBuilder.prepareConfig(updatedPayload);\n }\n }\n\n // Set meaningful name for the class\n Object.defineProperty(VersionRouter, \"name\", { value: className });\n\n return VersionRouter;\n}\n\n@Module({})\nexport class UniversalGraphModule {\n static forRoot(options: UniversalGraphModuleOptions): DynamicModule {\n const providers: Provider[] = [\n // Discovery services from @nestjs/core\n MetadataScanner,\n // Event processor for stream handling\n {\n provide: EventProcessor,\n useFactory: () => new EventProcessor(),\n },\n // Graph engines\n {\n provide: LangGraphEngine,\n useFactory: (eventProcessor: EventProcessor) =>\n new LangGraphEngine(eventProcessor, undefined),\n inject: [EventProcessor],\n },\n BuilderRegistryService,\n GraphEngineFactory,\n VersionedGraphService,\n UniversalGraphService,\n // Callback infrastructure - Redis client (ioredis or ioredis-mock via main.ts interceptor)\n {\n provide: \"REDIS_CLIENT\",\n useFactory: () => {\n const Redis = require(\"ioredis\");\n return new Redis(process.env.REDIS_URL || \"redis://redis:6379\");\n },\n },\n {\n provide: \"PROMETHEUS_REGISTRY\",\n useValue: new Registry(),\n },\n {\n provide: CallbackStore,\n useFactory: (redis: any) => new CallbackStore(redis),\n inject: [\"REDIS_CLIENT\"],\n },\n {\n provide: CallbackRegistry,\n useClass: CallbackRegistry,\n },\n EndpointRegistry,\n UIEndpointsDiscoveryService,\n {\n provide: CallbackACL,\n useClass: CallbackACL,\n },\n {\n provide: CallbackAuditor,\n useClass: CallbackAuditor,\n },\n {\n provide: CallbackMetrics,\n useFactory: (registry: Registry) => new CallbackMetrics(registry),\n inject: [\"PROMETHEUS_REGISTRY\"],\n },\n {\n provide: CallbackRateLimiter,\n useFactory: (redis: any) => new CallbackRateLimiter(redis),\n inject: [\"REDIS_CLIENT\"],\n },\n {\n provide: IdempotencyManager,\n useFactory: (redis: any) => new IdempotencyManager(redis),\n inject: [\"REDIS_CLIENT\"],\n },\n {\n provide: TelegramPatchHandler,\n useClass: TelegramPatchHandler,\n },\n {\n provide: WebPatchHandler,\n useClass: WebPatchHandler,\n },\n {\n provide: CallbackPatchService,\n useFactory: (telegram: TelegramPatchHandler, web: WebPatchHandler) =>\n new CallbackPatchService(telegram, web),\n inject: [TelegramPatchHandler, WebPatchHandler],\n },\n {\n provide: SmartCallbackRouter,\n useFactory: (\n registry: CallbackRegistry,\n store: CallbackStore,\n acl: CallbackACL,\n auditor: CallbackAuditor,\n metrics: CallbackMetrics,\n rateLimiter: CallbackRateLimiter,\n idempotencyManager: IdempotencyManager,\n patchService: CallbackPatchService\n ) =>\n new SmartCallbackRouter(\n registry,\n store,\n acl,\n auditor,\n metrics,\n rateLimiter,\n idempotencyManager,\n patchService\n ),\n inject: [\n CallbackRegistry,\n CallbackStore,\n CallbackACL,\n CallbackAuditor,\n CallbackMetrics,\n CallbackRateLimiter,\n IdempotencyManager,\n CallbackPatchService,\n ],\n },\n {\n provide: UniversalCallbackService,\n useFactory: (store: CallbackStore, router: SmartCallbackRouter) =>\n new UniversalCallbackService(store, router),\n inject: [CallbackStore, SmartCallbackRouter],\n },\n {\n provide: CallbackTokenGuard,\n useFactory: (store: CallbackStore, acl: CallbackACL) =>\n new CallbackTokenGuard(store, acl),\n inject: [CallbackStore, CallbackACL],\n },\n {\n provide: \"CALLBACK_EXAMPLE_REGISTRATION\",\n useFactory: (registry: CallbackRegistry) => {\n registerFinanceExampleCallback(registry);\n },\n inject: [CallbackRegistry],\n },\n {\n provide: \"GRAPH_ENGINE\",\n useFactory: (langGraphEngine: LangGraphEngine) => langGraphEngine,\n inject: [LangGraphEngine],\n },\n {\n provide: \"GRAPH_BUILDERS\",\n useFactory: (registry: BuilderRegistryService) => {\n return registry.getBuilders(); // Get builders from registry\n },\n inject: [BuilderRegistryService],\n },\n {\n provide: \"GRAPH_SERVICE\",\n useExisting: UniversalGraphService,\n },\n {\n provide: \"VERSIONING_CONFIGS\",\n useValue: options.versioning || [],\n },\n // Automatic versioning initialization (synchronous)\n {\n provide: \"VERSIONING_INITIALIZER\",\n useFactory: (\n builderRegistry: BuilderRegistryService,\n versionedGraphService: VersionedGraphService,\n configs: VersioningConfig[],\n callbackRegistry: CallbackRegistry,\n moduleRef: ModuleRef,\n endpointRegistry: EndpointRegistry\n ) => {\n console.log(\n \"🔧 VERSIONING_INITIALIZER running with configs:\",\n configs?.length || 0\n );\n console.log(\"🔧 ModuleRef available:\", !!moduleRef);\n console.log(\"🔧 BuilderRegistry available:\", !!builderRegistry);\n\n // Deferred initialization - register configurations\n configs.forEach(config =>\n versionedGraphService.registerVersioning(config)\n );\n\n // Create and register version routers synchronously\n configs.forEach(config => {\n if (moduleRef) {\n const VersionRouterClass = createMetaBuilder(\n config,\n versionedGraphService,\n moduleRef,\n callbackRegistry,\n endpointRegistry\n );\n const versionRouter = new VersionRouterClass();\n console.log(\n \"🔧 Registering VersionRouter for\",\n config.baseGraphType\n );\n builderRegistry.registerBuilder(versionRouter);\n } else {\n // Fallback: create simple meta-builder without ModuleRef dependency\n class SimpleVersionRouter extends AbstractGraphBuilder<any> {\n readonly version = \"router\" as any;\n\n constructor() {\n super();\n // Manually assign the registry instances\n (this as any).callbackRegistry = callbackRegistry;\n (this as any).endpointRegistry = endpointRegistry;\n }\n\n get graphType(): string {\n return config.baseGraphType;\n }\n\n async buildGraph(payload: any): Promise<any> {\n throw new Error(\n \"ModuleRef not available - cannot build graph\"\n );\n }\n\n async prepareConfig(payload: any): Promise<any> {\n throw new Error(\n \"ModuleRef not available - cannot prepare config\"\n );\n }\n }\n\n const simpleRouter = new SimpleVersionRouter();\n console.log(\n \"🔧 Registering SimpleRouter for\",\n config.baseGraphType,\n \"(no ModuleRef)\"\n );\n builderRegistry.registerBuilder(simpleRouter);\n }\n });\n\n return true;\n },\n inject: [\n BuilderRegistryService,\n VersionedGraphService,\n \"VERSIONING_CONFIGS\",\n CallbackRegistry,\n ModuleRef,\n EndpointRegistry,\n ],\n },\n ];\n\n return {\n global: true,\n module: UniversalGraphModule,\n imports: [ConfigModule.forRoot({ isGlobal: true }), DiscoveryModule],\n controllers: [GraphController, CallbackController, UIDispatchController],\n providers,\n exports: [\n \"GRAPH_SERVICE\",\n \"GRAPH_ENGINE\",\n UniversalGraphService,\n BuilderRegistryService,\n VersionedGraphService,\n UniversalCallbackService,\n CallbackStore,\n CallbackRegistry,\n EndpointRegistry,\n UIEndpointsDiscoveryService,\n ],\n };\n }\n}\n","// packages/sdk/src/index.ts\n\nexport * from \"./core\";\nexport * from \"./callbacks\";\nexport * from \"./graph\";\nexport * from \"./engines\";\nexport * from \"./agent-ui\";\nexport * from \"./tools\";\nexport * from \"./messages\";\nexport * from \"./models\";\nexport * from \"./retriever\";\nexport * from \"./utils\";\nexport * from \"./service-discovery\";\n\n// ===== LEGACY (for backward compatibility) =====\n// Export aliases for core components\nexport { GraphController as BaseGraphServiceController } from \"./graph/graph.controller\";\nexport { UniversalGraphModule as BaseGraphServiceModule } from \"./core/universal-graph.module\";\n","import { DynamicStructuredTool, StructuredTool } from \"@langchain/core/tools\";\nimport { RunnableConfig } from \"@langchain/core/runnables\";\nimport { z } from \"zod\";\nimport axios from \"axios\";\nimport { Logger } from \"@nestjs/common\";\nimport { zodToJsonSchema } from \"zod-to-json-schema\";\nimport { McpTool } from \"./mcp.interfaces\";\nimport { IGraphConfigurable } from \"../graph/graph-types\";\n\ninterface ToolExecutionRequest {\n name: string;\n arguments: Record<string, any>;\n context?: {\n agentId?: string;\n userId?: string;\n threadId?: string;\n };\n}\n\ninterface ToolExecutionResult {\n success: boolean;\n result?: any;\n error?: string;\n}\n\n/**\n * Converts MCP tools to LangChain DynamicStructuredTools with proper schema support\n */\ntype LangChainStructuredTool = StructuredTool<any, any, any, string>;\n\nexport class McpConverter {\n private readonly logger = new Logger(McpConverter.name);\n private readonly mcpRuntimeUrl: string;\n\n constructor(mcpRuntimeUrl: string = \"http://localhost:3004\") {\n this.mcpRuntimeUrl = mcpRuntimeUrl;\n this.logger.log(\n `🔧 McpConverter initialized with SDK version 0.1.8 (manual jsonSchemaToZod)`\n );\n }\n\n /**\n * Convert JSON Schema to Zod schema manually\n * This creates a standard Zod schema that zodToJsonSchema can convert back properly\n */\n private jsonSchemaToZod(jsonSchema: any): z.ZodTypeAny {\n if (!jsonSchema || typeof jsonSchema !== \"object\") {\n return z.any();\n }\n\n try {\n // Handle object type with properties\n if (jsonSchema.type === \"object\" && jsonSchema.properties) {\n const shape: Record<string, z.ZodTypeAny> = {};\n\n for (const [key, propSchema] of Object.entries(jsonSchema.properties)) {\n const prop = propSchema as any;\n let zodProp: z.ZodTypeAny;\n\n // Convert property based on type\n switch (prop.type) {\n case \"string\":\n zodProp = z.string();\n break;\n case \"number\":\n zodProp = z.number();\n break;\n case \"boolean\":\n zodProp = z.boolean();\n break;\n case \"integer\":\n zodProp = z.number().int();\n break;\n case \"array\":\n zodProp = z.array(z.any());\n break;\n case \"object\":\n zodProp = z.record(z.any());\n break;\n default:\n zodProp = z.any();\n }\n\n // Add description if present\n if (prop.description) {\n zodProp = zodProp.describe(prop.description);\n }\n\n // Make optional if not in required array\n if (!jsonSchema.required?.includes(key)) {\n zodProp = zodProp.optional();\n }\n\n shape[key] = zodProp;\n }\n\n return z.object(shape);\n }\n\n // Fallback to z.any() for other types\n this.logger.warn(\n `Unsupported JSON Schema structure, falling back to z.any()`\n );\n return z.any();\n } catch (error) {\n this.logger.warn(\n `Failed to convert JSON Schema, falling back to z.any(): ${error}`\n );\n return z.any();\n }\n }\n\n /**\n * Convert a single MCP tool to LangChain DynamicStructuredTool\n */\n convertTool(mcpTool: McpTool): LangChainStructuredTool {\n const logger = this.logger;\n const mcpRuntimeUrl = this.mcpRuntimeUrl;\n\n // Enhance tool description with parameter descriptions\n // This is a workaround because zodToJsonSchema doesn't preserve .describe() properly\n let enhancedDescription = mcpTool.description;\n\n if (mcpTool.inputSchema?.properties) {\n const paramDescriptions: string[] = [];\n for (const [key, propSchema] of Object.entries(\n mcpTool.inputSchema.properties\n )) {\n const prop = propSchema as any;\n if (prop.description) {\n const isRequired = mcpTool.inputSchema.required?.includes(key);\n paramDescriptions.push(\n `- ${key}${isRequired ? \" (required)\" : \"\"}: ${prop.description}`\n );\n }\n }\n\n if (paramDescriptions.length > 0) {\n enhancedDescription = `${mcpTool.description}\\n\\nParameters:\\n${paramDescriptions.join(\"\\n\")}`;\n }\n }\n\n const schema = this.jsonSchemaToZod(mcpTool.inputSchema);\n\n logger.debug(\n `🔧 [${mcpTool.name}] Original schema:`,\n JSON.stringify(mcpTool.inputSchema, null, 2)\n );\n logger.debug(\n `🔧 [${mcpTool.name}] Using schema type: ${(schema as any)?._def?.typeName ?? \"unknown\"}`\n );\n\n // Log converted Zod schema details to verify descriptions are preserved\n if (\n (schema as any)?._def?.shape &&\n typeof (schema as any)._def.shape === \"function\"\n ) {\n try {\n const shape = (schema as any)._def.shape();\n logger.debug(\n `🔧 [${mcpTool.name}] Converted Zod schema shape:`,\n JSON.stringify(\n Object.entries(shape).reduce(\n (acc, [key, val]: [string, any]) => {\n acc[key] = {\n type: val?._def?.typeName,\n description: val?._def?.description,\n optional: val?._def?.typeName === \"ZodOptional\",\n };\n return acc;\n },\n {} as Record<string, any>\n ),\n null,\n 2\n )\n );\n } catch (error) {\n logger.debug(\n `🔧 [${mcpTool.name}] Could not extract Zod schema shape: ${error}`\n );\n }\n }\n\n // CRITICAL CHECK: Convert Zod back to JSON Schema to see what LangChain will send to LLM\n try {\n const convertedJsonSchema = zodToJsonSchema(schema);\n logger.warn(\n `🔧 [${mcpTool.name}] JSON Schema that LangChain will use:`,\n JSON.stringify(convertedJsonSchema, null, 2)\n );\n } catch (error) {\n logger.warn(\n `🔧 [${mcpTool.name}] Could not convert Zod to JSON Schema: ${error}`\n );\n }\n\n return new DynamicStructuredTool<\n z.ZodTypeAny,\n Record<string, any>,\n any,\n string\n >({\n name: mcpTool.name,\n description: enhancedDescription,\n schema,\n func: async (\n input: Record<string, any>,\n _runManager,\n config?: RunnableConfig\n ): Promise<string> => {\n logger.log(`🔧 [${mcpTool.name}] LLM INPUT: ${JSON.stringify(input)}`);\n\n // Extract context from RunnableConfig.configurable\n const configurable = config?.configurable as\n | IGraphConfigurable\n | undefined;\n const context = {\n agentId: configurable?.agentId,\n userId: configurable?.userId,\n threadId: configurable?.thread_id,\n };\n\n logger.debug(\n `🔧 [${mcpTool.name}] Execution context: ${JSON.stringify(context)}`\n );\n\n try {\n const request: ToolExecutionRequest = {\n name: mcpTool.name,\n arguments: input ?? {},\n context,\n };\n\n logger.log(`🔧 [${mcpTool.name}] Calling MCP Runtime...`);\n\n const response = await axios.post(\n `${mcpRuntimeUrl}/tools/execute`,\n request,\n { timeout: 30000 }\n );\n\n const result: ToolExecutionResult = response.data;\n logger.log(\n `🔧 [${mcpTool.name}] MCP Runtime response: success=${result.success}`\n );\n\n if (!result.success) {\n const errorMessage = result.error || \"Tool execution failed\";\n logger.error(\n `🔧 [${mcpTool.name}] MCP Runtime error: ${errorMessage}`\n );\n throw new Error(errorMessage);\n }\n\n const output =\n typeof result.result === \"string\"\n ? result.result\n : JSON.stringify(result.result, null, 2);\n\n logger.log(\n `🔧 [${mcpTool.name}] TOOL OUTPUT: ${output.length > 200 ? output.substring(0, 200) + \"...\" : output}`\n );\n\n return output;\n } catch (error) {\n logger.error(\n `🔧 [${mcpTool.name}] Exception during execution`,\n error\n );\n if (axios.isAxiosError(error)) {\n throw new Error(`MCP Runtime error: ${error.message}`);\n }\n throw error instanceof Error ? error : new Error(String(error));\n }\n },\n }) as unknown as LangChainStructuredTool;\n }\n\n /**\n * Convert multiple MCP tools to LangChain tools\n */\n async convertTools(mcpTools: McpTool[]): Promise<LangChainStructuredTool[]> {\n return mcpTools.map(tool => this.convertTool(tool));\n }\n\n /**\n * Fetch and convert tools from MCP Runtime\n */\n async fetchAndConvertTools(\n filter?: string\n ): Promise<LangChainStructuredTool[]> {\n try {\n const params = filter ? { filter } : {};\n const response = await axios.get(`${this.mcpRuntimeUrl}/tools/list`, {\n params,\n timeout: 5000,\n });\n\n const mcpTools: McpTool[] = response.data;\n this.logger.log(`Fetched ${mcpTools.length} tools from MCP Runtime`);\n\n return this.convertTools(mcpTools);\n } catch (error) {\n this.logger.error(\"Failed to fetch MCP tools:\", error);\n throw new Error(`Cannot connect to MCP Runtime at ${this.mcpRuntimeUrl}`);\n }\n }\n\n /**\n * Health check for MCP Runtime\n */\n async healthCheck(): Promise<boolean> {\n try {\n const response = await axios.get(\n `${this.mcpRuntimeUrl}/tools/health/check`,\n { timeout: 5000 }\n );\n return response.data.status === \"ok\";\n } catch {\n return false;\n }\n }\n}\n","import { StructuredTool } from \"@langchain/core/tools\";\nimport { Logger } from \"@nestjs/common\";\nimport axios from \"axios\";\nimport { McpConverter } from \"./mcp-converter\";\nimport { McpTool, McpRuntimeClient } from \"./mcp.interfaces\";\nimport { IAgentToolConfig } from \"./config\";\n\n/**\n * Utility for fetching and filtering MCP tools from runtime\n * Provides efficient tool filtering and conversion to LangChain tools\n */\nexport class McpToolFilter {\n private readonly logger = new Logger(McpToolFilter.name);\n private readonly mcpConverter: McpConverter;\n\n constructor(\n private readonly mcpRuntimeUrl: string = process.env.MCP_RUNTIME_URL ||\n \"http://localhost:3004\"\n ) {\n this.mcpConverter = new McpConverter(this.mcpRuntimeUrl);\n }\n\n /**\n * Fetch available tools from MCP runtime with dynamic schema generation\n * @param toolsConfig Array of tool configurations with dynamic config\n * @returns Array of LangChain Tool instances with dynamic schemas\n */\n async getFilteredTools(\n toolsConfig: IAgentToolConfig[] = []\n ): Promise<StructuredTool[]> {\n this.logger.debug(\n `[DEBUG] Getting filtered tools with dynamic schemas. Config: ${JSON.stringify(toolsConfig)}`\n );\n this.logger.debug(`[DEBUG] MCP Runtime URL: ${this.mcpRuntimeUrl}`);\n\n if (toolsConfig.length === 0) {\n this.logger.debug(\"No tools configured, returning empty array\");\n return [];\n }\n\n try {\n // Call POST /tools/schemas with full configuration for dynamic schema generation\n this.logger.debug(\n `[DEBUG] Making HTTP POST request to: ${this.mcpRuntimeUrl}/tools/schemas`\n );\n this.logger.debug(`[DEBUG] Request body: ${JSON.stringify(toolsConfig)}`);\n\n const response = await axios.post(\n `${this.mcpRuntimeUrl}/tools/schemas`,\n { tools: toolsConfig },\n {\n timeout: 5000,\n headers: {\n \"Content-Type\": \"application/json\",\n },\n }\n );\n\n this.logger.debug(\n `[DEBUG] HTTP response status: ${response.status}, data length: ${Array.isArray(response.data) ? response.data.length : \"not array\"}`\n );\n\n const dynamicTools: McpTool[] = Array.isArray(response.data)\n ? response.data\n : [];\n this.logger.debug(\n `Retrieved ${dynamicTools.length} dynamic tool schemas from MCP Runtime`\n );\n\n // Create a simple MCP client for tool execution\n // Note: context is passed via McpConverter which extracts it from RunnableConfig\n const mcpClient: McpRuntimeClient = {\n getTools: async () => dynamicTools,\n executeTool: async (name: string, args: any, context?: any) => {\n this.logger.debug(`[DEBUG] Executing tool ${name} with args:`, args);\n const response = await axios.post(\n `${this.mcpRuntimeUrl}/tools/execute`,\n {\n name,\n arguments: args || {},\n context,\n }\n );\n return response.data;\n },\n isHealthy: async () => true,\n };\n\n // Convert to LangChain tools\n this.logger.log(\n `🚀 [McpToolFilter] Converting ${dynamicTools.length} dynamic tools using McpConverter`\n );\n const tools = await this.mcpConverter.convertTools(dynamicTools);\n this.logger.log(\n `🚀 [McpToolFilter] Converted tools: ${tools.map(t => t.name).join(\", \")}`\n );\n\n this.logger.log(\n `Configured ${tools.length} tools with dynamic schemas from MCP runtime: ${dynamicTools.map(t => t.name).join(\", \")}`\n );\n return tools;\n } catch (error) {\n const errorMessage =\n error instanceof Error ? error.message : String(error);\n this.logger.warn(\n `[DEBUG] Failed to fetch dynamic tool schemas from MCP runtime (${this.mcpRuntimeUrl}): ${errorMessage}`\n );\n this.logger.warn(`[DEBUG] Error details:`, {\n error,\n stack: error instanceof Error ? error.stack : \"no stack\",\n });\n return [];\n }\n }\n\n /**\n * Get all available tools without filtering\n * @returns Array of LangChain Tool instances\n */\n async getAllTools(): Promise<StructuredTool[]> {\n try {\n const response = await axios.get(`${this.mcpRuntimeUrl}/tools/list`, {\n timeout: 5000,\n });\n\n const allTools: McpTool[] = Array.isArray(response.data)\n ? response.data\n : [];\n this.logger.debug(`Retrieved ${allTools.length} total MCP tools`);\n\n const mcpClient: McpRuntimeClient = {\n getTools: async () => allTools,\n executeTool: async (name: string, args: any, context?: any) => {\n const response = await axios.post(\n `${this.mcpRuntimeUrl}/tools/execute`,\n {\n name,\n arguments: args || {},\n context,\n }\n );\n return response.data;\n },\n isHealthy: async () => true,\n };\n\n const tools = await this.mcpConverter.convertTools(allTools);\n this.logger.log(`Configured ${tools.length} tools from MCP runtime`);\n return tools;\n } catch (error) {\n const errorMessage =\n error instanceof Error ? error.message : String(error);\n this.logger.warn(\n `Failed to fetch all tools from MCP runtime (${this.mcpRuntimeUrl}): ${errorMessage}`\n );\n return [];\n }\n }\n\n /**\n * Check if MCP runtime is healthy\n * @returns boolean indicating health status\n */\n async isHealthy(): Promise<boolean> {\n try {\n const response = await axios.get(\n `${this.mcpRuntimeUrl}/tools/health/check`,\n {\n timeout: 3000,\n }\n );\n return response.data.status === \"ok\";\n } catch (error) {\n this.logger.warn(\n `MCP runtime health check failed: ${error instanceof Error ? error.message : String(error)}`\n );\n return false;\n }\n }\n\n /**\n * Get available tool names from MCP runtime\n * @returns Array of tool names\n */\n async getAvailableToolNames(): Promise<string[]> {\n try {\n const response = await axios.get(`${this.mcpRuntimeUrl}/tools/list`, {\n timeout: 5000,\n });\n\n const tools: McpTool[] = Array.isArray(response.data)\n ? response.data\n : [];\n return tools.map(tool => tool.name);\n } catch (error) {\n this.logger.warn(\n `Failed to fetch tool names: ${error instanceof Error ? error.message : String(error)}`\n );\n return [];\n }\n }\n}\n","import { Injectable, Logger } from \"@nestjs/common\";\nimport axios, { AxiosInstance } from \"axios\";\nimport {\n McpTool,\n ToolExecutionResult,\n McpRuntimeClient,\n} from \"./mcp.interfaces\";\nimport {\n CallbackManager,\n parseCallbackConfigArg,\n} from \"@langchain/core/callbacks/manager\";\nimport { RunnableConfig } from \"@langchain/core/runnables\";\n\n/**\n * HTTP client implementation for MCP Runtime\n * Provides communication with MCP Runtime service via REST API\n */\n@Injectable()\nexport class McpRuntimeHttpClient implements McpRuntimeClient {\n private readonly logger = new Logger(McpRuntimeHttpClient.name);\n private readonly httpClient: AxiosInstance;\n private readonly baseUrl: string;\n\n constructor(mcpRuntimeUrl?: string) {\n this.baseUrl =\n mcpRuntimeUrl || process.env.MCP_RUNTIME_URL || \"http://localhost:3004\";\n\n // Use configurable timeout - tools like call_agent can take a very long time (up to 15 minutes)\n const timeout = Number(process.env.MCP_RUNTIME_TIMEOUT || 900000); // Default: 15 minutes\n\n this.httpClient = axios.create({\n baseURL: this.baseUrl,\n timeout,\n });\n\n this.logger.log(\n `MCP Runtime HTTP Client initialized with URL: ${this.baseUrl}, timeout: ${timeout}ms`\n );\n }\n\n /**\n * Get all available tools from MCP Runtime\n */\n async getTools(): Promise<McpTool[]> {\n try {\n this.logger.debug(\"Fetching available tools from MCP runtime\");\n const response = await this.httpClient.get(\"/tools/list\");\n // MCP Runtime returns array of tools directly, not in wrapper object\n const tools = Array.isArray(response.data) ? response.data : [];\n this.logger.log(`Retrieved ${tools.length} tools from MCP runtime`);\n return tools;\n } catch (error) {\n this.logger.error(\"Failed to fetch tools from MCP runtime:\", error);\n throw new Error(`Failed to fetch tools: ${error.message}`);\n }\n }\n\n /**\n * Execute a tool by name with given arguments\n */\n async executeTool(\n name: string,\n args: any,\n context?: any\n ): Promise<ToolExecutionResult> {\n try {\n this.logger.debug(`Executing tool: ${name} with args:`, args);\n\n const payload: any = {\n name,\n arguments: args || {},\n };\n\n // Add context if provided\n if (context) {\n payload.context = context;\n }\n\n const response = await this.httpClient.post(\"/tools/execute\", payload);\n\n this.logger.log(`Tool ${name} executed successfully`);\n return response.data;\n } catch (error) {\n this.logger.error(`Failed to execute tool ${name}:`, error);\n\n // Handle axios errors\n if (error.response) {\n return {\n success: false,\n error:\n error.response.data.message ||\n error.response.data.error ||\n \"Tool execution failed\",\n };\n }\n\n return {\n success: false,\n error: error.message || \"Unknown error occurred\",\n };\n }\n }\n\n /**\n * Get tool execution statistics from MCP Runtime\n */\n async getToolStats() {\n try {\n const response = await this.httpClient.get(\"/tools/stats\");\n return response.data;\n } catch (error) {\n this.logger.error(\"Failed to fetch tool stats:\", error);\n return null;\n }\n }\n\n /**\n * Health check for MCP Runtime service\n */\n async isHealthy(): Promise<boolean> {\n try {\n const response = await this.httpClient.get(\"/\", { timeout: 5000 });\n return response.status === 200;\n } catch (error) {\n this.logger.warn(\"MCP Runtime health check failed:\", error.message);\n return false;\n }\n }\n\n /**\n * Execute tool with LangChain event emission\n * @param toolCallId - Tool call ID from LLM\n * @param toolName - Tool name\n * @param enrichedArgs - Merged arguments (toolConfig + LLM args)\n * @param executionContext - Execution context (userId, agentId, etc.)\n * @param config - RunnableConfig with callbacks\n * @returns Tool execution result with content\n */\n async executeToolWithEvents(\n toolCallId: string,\n toolName: string,\n enrichedArgs: Record<string, any>,\n executionContext: Record<string, any>,\n config?: RunnableConfig\n ): Promise<{ content: string; success: boolean }> {\n // Parse callback configuration\n const parsedConfig = parseCallbackConfigArg(config);\n const callbackManager = CallbackManager.configure(parsedConfig.callbacks);\n\n let runManager;\n\n try {\n // Emit on_tool_start event\n runManager = await callbackManager?.handleToolStart(\n {\n name: toolName,\n lc: 1,\n type: \"not_implemented\",\n id: [\"langchain\", \"tools\", \"mcp\", toolName],\n },\n JSON.stringify(enrichedArgs),\n parsedConfig.runId,\n undefined,\n parsedConfig.tags,\n parsedConfig.metadata,\n toolName\n );\n\n // Execute tool\n const result = await this.executeTool(\n toolName,\n enrichedArgs,\n executionContext\n );\n\n // Create content\n const content = result.success\n ? JSON.stringify(result)\n : result.error || JSON.stringify(result);\n\n // Emit on_tool_end event\n await runManager?.handleToolEnd(content);\n\n return {\n content,\n success: result.success,\n };\n } catch (error) {\n this.logger.error(`Error executing tool ${toolName}:`, error);\n\n // Emit on_tool_error event\n await runManager?.handleToolError(error);\n\n // Return error result\n const errorContent = JSON.stringify({\n success: false,\n error: error instanceof Error ? error.message : \"Tool execution failed\",\n });\n\n return {\n content: errorContent,\n success: false,\n };\n }\n }\n}\n","/**\n * Model-related enums\n */\n\nexport enum ModelProvider {\n FLUTCH = \"flutch\",\n FLUTCH_MISTRAL = \"flutch-mistral\",\n FLUTCH_OPENAI = \"flutch-openai\",\n FLUTCH_ANTHROPIC = \"flutch-anthropic\",\n MISTRAL = \"mistral\",\n OPENAI = \"openai\",\n ANTHROPIC = \"anthropic\",\n AWS = \"aws\",\n COHERE = \"cohere\",\n VOYAGEAI = \"voyageai\",\n}\n\nexport enum ModelType {\n CHAT = \"chat\", // LLM for text generation\n RERANK = \"rerank\", // Cross-encoder for document reranking\n EMBEDDING = \"embedding\", // Models for vectorization\n IMAGE = \"image\", // Models for image generation\n SPEECH = \"speech\", // Models for TTS/STT\n}\n\nexport enum ChatFeature {\n STREAMING = \"streaming\",\n TOOLS = \"tools\",\n VISION = \"vision\",\n FUNCTION_CALLING = \"function_calling\",\n JSON_MODE = \"json_mode\",\n}\n","import { BaseDocumentCompressor } from \"@langchain/core/retrievers/document_compressors\";\nimport { Document } from \"@langchain/core/documents\";\n\nexport interface VoyageAIRerankConfig {\n apiKey?: string;\n model?: string;\n topN?: number;\n truncation?: boolean;\n}\n\n/**\n * VoyageAI Reranker implementation\n * Note: This is a placeholder implementation until official LangChain.js support is available\n * VoyageAI currently only has Python SDK support for reranking\n */\nexport class VoyageAIRerank extends BaseDocumentCompressor {\n private apiKey: string;\n private model: string;\n private topN: number;\n private truncation: boolean;\n private baseUrl = \"https://api.voyageai.com/v1/rerank\";\n\n constructor(config: VoyageAIRerankConfig) {\n super();\n this.apiKey = config.apiKey || process.env.VOYAGEAI_API_KEY || \"\";\n this.model = config.model || \"rerank-2\";\n this.topN = config.topN || 20;\n this.truncation = config.truncation ?? true;\n\n if (!this.apiKey) {\n throw new Error(\n \"VoyageAI API key is required. Set VOYAGEAI_API_KEY environment variable or pass apiKey in config.\"\n );\n }\n }\n\n async compressDocuments(\n documents: Document[],\n query: string,\n callbacks?: any\n ): Promise<Document[]> {\n if (documents.length === 0) {\n return [];\n }\n\n const texts = documents.map(doc => doc.pageContent);\n\n try {\n const response = await fetch(this.baseUrl, {\n method: \"POST\",\n headers: {\n \"Content-Type\": \"application/json\",\n Authorization: `Bearer ${this.apiKey}`,\n },\n body: JSON.stringify({\n model: this.model,\n query: query,\n documents: texts,\n top_k: Math.min(this.topN, documents.length),\n truncation: this.truncation,\n }),\n });\n\n if (!response.ok) {\n const error = await response.text();\n throw new Error(`VoyageAI API error: ${response.status} - ${error}`);\n }\n\n const data = await response.json();\n\n // VoyageAI returns results with relevance scores\n // Sort by relevance and return top N documents\n const rerankedIndices = data.results\n .sort((a: any, b: any) => b.relevance_score - a.relevance_score)\n .slice(0, this.topN)\n .map((result: any) => result.index);\n\n return rerankedIndices.map((index: number) => documents[index]);\n } catch (error) {\n console.error(\"Error calling VoyageAI rerank API:\", error);\n // Fallback: return original documents if reranking fails\n return documents.slice(0, this.topN);\n }\n }\n}\n","import { BaseChatModel } from \"@langchain/core/language_models/chat_models\";\nimport { BaseDocumentCompressor } from \"@langchain/core/retrievers/document_compressors\";\nimport { Embeddings } from \"@langchain/core/embeddings\";\nimport { ChatOpenAI } from \"@langchain/openai\";\nimport { AzureChatOpenAI } from \"@langchain/azure-openai\";\nimport { Logger } from \"@nestjs/common\";\nimport { StructuredTool, DynamicStructuredTool } from \"@langchain/core/tools\";\nimport { Runnable } from \"@langchain/core/runnables\";\nimport { BaseLanguageModelInput } from \"@langchain/core/language_models/base\";\nimport { AIMessageChunk } from \"@langchain/core/messages\";\nimport { BaseChatModelCallOptions } from \"@langchain/core/language_models/chat_models\";\nimport { McpToolFilter } from \"../tools/mcp-tool-filter\";\nimport { IAgentToolConfig } from \"../tools/config\";\nimport { createHash } from \"crypto\";\n\n// WORKAROUND: Temporary monkey patch for GPT-5 support in LangChain\n// LangChain doesn't yet recognize GPT-5 as a reasoning model and has issues:\n// 1. Uses max_tokens instead of max_completion_tokens\n// 2. Doesn't set mandatory temperature = 1 for GPT-5 models\n// TODO: Remove this patch after official GPT-5 support in LangChain\nfunction patchChatOpenAIForGPT5() {\n const logger = new Logger(\"ModelInitializer.Patch\");\n\n logger.warn(\n `TEMPORARY WORKAROUND: Applying monkey patch for GPT-5 support in LangChain. Fixes: max_tokens->max_completion_tokens, temperature->1. This patch will be removed once LangChain officially supports GPT-5 models.`\n );\n\n // Patch both ChatOpenAI and AzureChatOpenAI\n const prototypes = [\n ChatOpenAI.prototype as any,\n AzureChatOpenAI.prototype as any,\n ];\n\n prototypes.forEach((prototype, index) => {\n const modelName = index === 0 ? \"ChatOpenAI\" : \"AzureChatOpenAI\";\n logger.warn(`Patching ${modelName} for GPT-5 support`);\n\n // Patch the invocationParams method that prepares parameters for the API\n const originalInvocationParams = prototype.invocationParams;\n\n if (originalInvocationParams) {\n prototype.invocationParams = function (options: any) {\n const params = originalInvocationParams.call(this, options);\n\n // Note: GPT-5 patch applied - params will be converted\n\n // If this is a GPT-5 model, apply all necessary patches\n if (\n params.model &&\n (params.model.includes(\"gpt-5\") ||\n /^gpt-(5|6|7|8|9)/.test(params.model))\n ) {\n // 1. Convert max_tokens to max_completion_tokens\n if (params.max_tokens !== undefined) {\n params.max_completion_tokens = params.max_tokens;\n delete params.max_tokens;\n }\n\n // Also check max_output_tokens (may be used in Responses API)\n if (\n params.max_output_tokens !== undefined &&\n !params.max_completion_tokens\n ) {\n params.max_completion_tokens = params.max_output_tokens;\n delete params.max_output_tokens;\n }\n\n // 2. Force set temperature = 1 for GPT-5 models\n // GPT-5 models only support temperature = 1 (default value)\n const originalTemperature = params.temperature;\n if (params.temperature !== undefined && params.temperature !== 1) {\n params.temperature = 1;\n logger.debug(\n `Fixed temperature for ${params.model}: ${originalTemperature} -> 1 (GPT-5 models only support temperature=1)`\n );\n }\n\n // Parameters converted for GPT-5 compatibility\n }\n\n // Add stream_options to get usage information from Azure OpenAI\n if (\n params.model &&\n (params.model.includes(\"gpt-5\") ||\n /^gpt-(5|6|7|8|9)/.test(params.model))\n ) {\n // Enable usage tracking for streaming responses\n if (!params.stream_options) {\n params.stream_options = { include_usage: true };\n logger.warn(\n `[GPT-5 PATCH] Added stream_options.include_usage=true for ${params.model}`\n );\n } else if (params.stream_options.include_usage !== true) {\n params.stream_options.include_usage = true;\n logger.warn(\n `[GPT-5 PATCH] Updated stream_options.include_usage=true for ${params.model}`\n );\n }\n }\n\n return params;\n };\n\n logger.warn(\n `Successfully patched ${modelName}.invocationParams for GPT-5 support (TEMPORARY WORKAROUND)`\n );\n } else {\n logger.warn(\n `Could not find invocationParams method to patch in ${modelName}`\n );\n }\n\n // Additionally patch completionWithRetry for low-level interception\n const originalCompletionWithRetry = prototype.completionWithRetry;\n\n if (originalCompletionWithRetry) {\n prototype.completionWithRetry = async function (\n request: any,\n options?: any\n ) {\n // Check and fix parameters right before sending\n if (\n request?.model &&\n (request.model.includes(\"gpt-5\") ||\n /^gpt-(5|6|7|8|9)/.test(request.model))\n ) {\n let hasChanges = false;\n\n // 1. Fix max_tokens\n if (request.max_tokens !== undefined) {\n request.max_completion_tokens = request.max_tokens;\n delete request.max_tokens;\n hasChanges = true;\n }\n\n // 2. Fix temperature\n if (request.temperature !== undefined && request.temperature !== 1) {\n const originalTemp = request.temperature;\n request.temperature = 1;\n logger.debug(\n `Fixed temperature in completionWithRetry for ${request.model}: ${originalTemp} -> 1`\n );\n hasChanges = true;\n }\n\n // 3. Add stream_options for usage tracking\n if (!request.stream_options) {\n request.stream_options = { include_usage: true };\n logger.debug(\n `Added stream_options.include_usage=true in completionWithRetry for ${request.model}`\n );\n hasChanges = true;\n } else if (request.stream_options.include_usage !== true) {\n request.stream_options.include_usage = true;\n logger.debug(\n `Updated stream_options.include_usage=true in completionWithRetry for ${request.model}`\n );\n hasChanges = true;\n }\n\n if (hasChanges) {\n logger.debug(\n `Fixed request params in completionWithRetry for ${request.model}`\n );\n }\n }\n\n const result = await originalCompletionWithRetry.call(\n this,\n request,\n options\n );\n\n // Log response for usage information debugging\n if (\n request?.model &&\n (request.model.includes(\"gpt-5\") ||\n /^gpt-(5|6|7|8|9)/.test(request.model))\n ) {\n logger.warn(\n `[GPT-5 PATCH] Azure OpenAI Response for ${request.model}:`\n );\n logger.warn(`Response keys: ${Object.keys(result || {}).join(\", \")}`);\n\n if (result?.usage) {\n logger.warn(\n `Usage found: ${JSON.stringify(result.usage, null, 2)}`\n );\n } else {\n logger.warn(`No usage found in response`);\n }\n\n if (result?.choices && result.choices[0]) {\n logger.warn(\n `First choice keys: ${Object.keys(result.choices[0]).join(\", \")}`\n );\n }\n }\n\n return result;\n };\n\n logger.warn(\n `Successfully patched ${modelName}.completionWithRetry for GPT-5 support (TEMPORARY WORKAROUND)`\n );\n }\n\n // Additionally patch isReasoningModel for correct reasoning model detection\n const originalIsReasoningModel = prototype.isReasoningModel;\n\n if (originalIsReasoningModel) {\n prototype.isReasoningModel = function () {\n const model =\n this.modelName || this.model || (this as any).lc_kwargs?.modelName;\n\n // Correct logic for identifying reasoning models:\n // 1. o1, o2, o3, o4 series - these are reasoning models\n // 2. gpt-5+ - these are reasoning models\n const isReasoning =\n /^o\\d/.test(model) ||\n model.includes(\"gpt-5\") ||\n /^gpt-(6|7|8|9)/.test(model);\n\n const originalResult = originalIsReasoningModel.call(this);\n\n logger.warn(\n `[GPT-5 PATCH] isReasoningModel check for \"${model}\": patched=${isReasoning}, original=${originalResult}, modelName=${this.modelName}, model=${(this as any).model}, lc_kwargs=${JSON.stringify((this as any).lc_kwargs?.modelName)}`\n );\n\n return isReasoning;\n };\n\n logger.warn(\n `Successfully patched ${modelName}.isReasoningModel for GPT-5+ reasoning models (TEMPORARY WORKAROUND)`\n );\n } else {\n logger.warn(\n `Could not find isReasoningModel method to patch in ${modelName}`\n );\n }\n\n // Remove bindTools patch - let it work natively\n\n // Remove custom token counting patches - let LangChain handle it\n\n // Patch invoke method for response logging\n const originalInvoke = prototype.invoke;\n\n if (originalInvoke) {\n prototype.invoke = async function (...args: any[]) {\n const model =\n this.modelName || this.model || (this as any).lc_kwargs?.modelName;\n\n if (model && model.includes(\"gpt-5\")) {\n logger.warn(`[GPT-5 PATCH] Starting invoke for ${model}`);\n\n // Log invocation parameters\n if (args[1]) {\n const config = args[1];\n logger.warn(\n `[GPT-5 PATCH] Invoke config keys: ${Object.keys(config || {}).join(\", \")}`\n );\n if (config.tools) {\n logger.warn(\n `[GPT-5 PATCH] Tools in config: ${config.tools.length} tools`\n );\n }\n }\n\n // Log model state\n const boundTools =\n (this as any).bound ||\n (this as any).boundTools ||\n (this as any).tools;\n if (boundTools) {\n logger.warn(\n `[GPT-5 PATCH] Model has bound tools: ${Array.isArray(boundTools) ? boundTools.length : \"yes\"}`\n );\n } else {\n logger.warn(`[GPT-5 PATCH] Model has NO bound tools`);\n }\n }\n\n let result;\n try {\n result = await originalInvoke.apply(this, args);\n } catch (error) {\n if (model && model.includes(\"gpt-5\")) {\n logger.error(\n `[GPT-5 PATCH] Azure OpenAI invoke failed for ${model}:`,\n {\n errorMessage:\n error instanceof Error ? error.message : String(error),\n errorStack: error instanceof Error ? error.stack : undefined,\n errorType: error?.constructor?.name,\n args: args.length,\n hasConfig: !!args[1],\n configKeys: args[1] ? Object.keys(args[1] || {}) : [],\n tools: args[1]?.tools?.length || 0,\n }\n );\n }\n throw error;\n }\n\n if (model && model.includes(\"gpt-5\")) {\n logger.warn(`[GPT-5 PATCH] Azure OpenAI invoke result for ${model}:`);\n logger.warn(`Result keys: ${Object.keys(result || {}).join(\", \")}`);\n\n if (result?.usage_metadata || result?.usageMetadata) {\n const usage = result.usage_metadata || result.usageMetadata;\n logger.warn(\n `Usage metadata found: ${JSON.stringify(usage, null, 2)}`\n );\n }\n\n if (result?.response_metadata || result?.responseMetadata) {\n const responseMetadata =\n result.response_metadata || result.responseMetadata;\n logger.warn(\n `Response metadata found: ${JSON.stringify(responseMetadata, null, 2)}`\n );\n\n // Create usage_metadata from estimatedTokenUsage if not present\n if (\n !result.usage_metadata &&\n responseMetadata?.estimatedTokenUsage\n ) {\n const estimatedUsage = responseMetadata.estimatedTokenUsage;\n result.usage_metadata = {\n input_tokens: estimatedUsage.promptTokens || 0,\n output_tokens: estimatedUsage.completionTokens || 0,\n total_tokens: estimatedUsage.totalTokens || 0,\n };\n\n logger.warn(\n `[GPT-5 PATCH] Created usage_metadata from estimatedTokenUsage: ${JSON.stringify(result.usage_metadata, null, 2)}`\n );\n }\n }\n\n if (!result?.usage_metadata && !result?.usageMetadata) {\n logger.warn(`No usage_metadata found in invoke result`);\n }\n }\n\n return result;\n };\n\n logger.warn(\n `Successfully patched ${modelName}.invoke for GPT-5 response logging (TEMPORARY WORKAROUND)`\n );\n }\n });\n}\n\n// Apply patch on module load\npatchChatOpenAIForGPT5();\nimport { OpenAIEmbeddings } from \"@langchain/openai\";\nimport { ChatAnthropic } from \"@langchain/anthropic\";\nimport { ChatCohere } from \"@langchain/cohere\";\nimport { CohereRerank } from \"@langchain/cohere\";\nimport { VoyageAIRerank } from \"./rerankers/voyageai-rerank\";\nimport { ChatMistralAI } from \"@langchain/mistralai\";\n\nimport { ModelProvider, ModelType } from \"./enums\";\nimport {\n IModelInitializer,\n Model,\n ModelByIdWithTypeConfig,\n ModelConfigWithTokenAndType,\n ChatModelCreator,\n RerankModelCreator,\n EmbeddingModelCreator,\n ChatModelOrRunnable,\n} from \"./model.interface\";\nimport { ModelByIdConfig, ModelConfigFetcher } from \"./llm.types\";\n\nexport class ModelInitializer implements IModelInitializer {\n private logger: Logger;\n\n // Cache for model configurations to avoid repeated API calls\n private modelConfigCache = new Map<string, ModelConfigWithTokenAndType>();\n\n // Cache for model instances to avoid recreating identical models\n private modelInstanceCache = new Map<string, Model>();\n\n constructor(\n private configFetcher?: ModelConfigFetcher,\n logger?: Logger\n ) {\n this.logger = logger || new Logger(ModelInitializer.name);\n }\n\n /**\n * Generate cache key for model instances based on configuration\n */\n /**\n * Generate hash from toolsConfig for cache key\n * Uses MD5 hash to create short, unique identifier\n */\n private hashToolsConfig(toolsConfig: IAgentToolConfig[]): string {\n // Sort by toolName to ensure consistent hash for same config\n const sorted = toolsConfig\n .map(t => `${t.toolName}:${t.enabled}:${JSON.stringify(t.config || {})}`)\n .sort()\n .join(\"|\");\n\n // Generate short MD5 hash (16 chars)\n return createHash(\"md5\").update(sorted).digest(\"hex\").slice(0, 16);\n }\n\n /**\n * Generate cache key from ModelByIdConfig\n * Format: modelId:temperature:maxTokens[:toolsHash]\n * Example: \"model123:0.7:4096\" or \"model123:0.7:4096:a1b2c3d4e5f6g7h8\"\n */\n private generateModelCacheKey(config: ModelByIdConfig): string {\n const parts = [\n config.modelId,\n config.temperature ?? \"default\",\n config.maxTokens ?? \"default\",\n ];\n\n // Add tools hash if toolsConfig provided\n if (config.toolsConfig && config.toolsConfig.length > 0) {\n const toolsHash = this.hashToolsConfig(config.toolsConfig);\n parts.push(toolsHash);\n }\n\n return parts.join(\":\");\n }\n\n /**\n * TEMPORARY SOLUTION for compatibility with new OpenAI models\n *\n * OpenAI changed the API for new models (gpt-5, o-series):\n * - Old models (gpt-3.5, gpt-4, gpt-4o): use maxTokens, support custom temperature\n * - New reasoning models (gpt-5, gpt-o1, gpt-o3, gpt-o4): use maxCompletionTokens, only temperature = 1\n *\n * Patch fixes:\n * 1. max_tokens -> max_completion_tokens for reasoning GPT-5+ models\n * 2. temperature -> 1 (forced) for reasoning GPT-5+ models\n *\n * @param modelName - OpenAI model name\n * @returns true if model requires maxCompletionTokens and temperature = 1\n */\n private requiresMaxCompletionTokens(modelName: string): boolean {\n const requiresNew =\n modelName.includes(\"gpt-5\") ||\n modelName.includes(\"gpt-o1\") ||\n modelName.includes(\"gpt-o2\") ||\n modelName.includes(\"gpt-o3\") ||\n modelName.includes(\"gpt-o4\") ||\n // Add other patterns as new models are released\n /^gpt-(5|6|7|8|9)/.test(modelName) ||\n /^gpt-o[1-4]/.test(modelName);\n\n this.logger.debug(`Checking token parameter for model \"${modelName}\"`, {\n modelName,\n requiresMaxCompletionTokens: requiresNew,\n checks: {\n includesGpt5: modelName.includes(\"gpt-5\"),\n includesO1: modelName.includes(\"gpt-o1\"),\n includesO2: modelName.includes(\"gpt-o2\"),\n includesO3: modelName.includes(\"gpt-o3\"),\n includesO4: modelName.includes(\"gpt-o4\"),\n regexGpt5Plus: /^gpt-(5|6|7|8|9)/.test(modelName),\n regexO1to4: /^gpt-o[1-4]/.test(modelName),\n },\n });\n\n return requiresNew;\n }\n\n // Chat model creators (inherit from original LLMInitializer)\n private readonly chatModelCreators: Partial<\n Record<ModelProvider, ChatModelCreator>\n > = {\n [ModelProvider.OPENAI]: ({\n modelName,\n defaultTemperature,\n defaultMaxTokens,\n apiToken,\n }) => {\n // HARDCODED: Create clean configuration depending on model type for regular OpenAI models\n if (this.requiresMaxCompletionTokens(modelName)) {\n // Configuration for new GPT-5+ models\n // GPT-5+ models only support temperature = 1\n const fixedTemperature = 1;\n const config = {\n modelName,\n temperature: fixedTemperature, // Force set to 1\n maxCompletionTokens: defaultMaxTokens, // Only this parameter for new models\n streaming: true,\n openAIApiKey: apiToken || process.env.OPENAI_API_KEY,\n };\n\n if (defaultTemperature !== 1) {\n this.logger.debug(\n `Fixed temperature for GPT-5+ model ${modelName}: ${defaultTemperature} -> 1 (GPT-5+ models only support temperature=1)`\n );\n }\n\n // Creating GPT-5+ model with fixed parameters\n\n const chatOpenAI = new ChatOpenAI(config);\n\n // ChatOpenAI instance created\n\n return chatOpenAI;\n } else {\n // Configuration for legacy GPT-3.5/GPT-4 models\n const config = {\n modelName,\n temperature: defaultTemperature,\n maxTokens: defaultMaxTokens, // Only this parameter for legacy models\n streaming: true,\n openAIApiKey: apiToken || process.env.OPENAI_API_KEY,\n };\n\n // Creating legacy OpenAI model\n\n const chatOpenAI = new ChatOpenAI(config);\n\n // Legacy ChatOpenAI instance created\n\n return chatOpenAI;\n }\n },\n\n [ModelProvider.ANTHROPIC]: ({\n modelName,\n defaultTemperature,\n defaultMaxTokens,\n apiToken,\n }) =>\n new ChatAnthropic({\n modelName,\n temperature: defaultTemperature,\n maxTokens: defaultMaxTokens,\n anthropicApiKey: apiToken || process.env.ANTHROPIC_API_KEY,\n }) as unknown as BaseChatModel,\n\n [ModelProvider.COHERE]: ({\n modelName,\n defaultTemperature,\n defaultMaxTokens,\n apiToken,\n }) =>\n new ChatCohere({\n model: modelName,\n temperature: defaultTemperature,\n // Cohere uses maxTokens via max_tokens parameter, but it's not supported in ChatCohere API\n apiKey: apiToken || process.env.COHERE_API_KEY,\n }),\n\n [ModelProvider.MISTRAL]: ({\n modelName,\n defaultTemperature,\n defaultMaxTokens,\n apiToken,\n }) =>\n new ChatMistralAI({\n model: modelName,\n temperature: defaultTemperature,\n maxTokens: defaultMaxTokens,\n apiKey: apiToken || process.env.MISTRAL_API_KEY,\n }),\n\n // AWS Bedrock support removed - use Anthropic or OpenAI directly instead\n\n [ModelProvider.FLUTCH_OPENAI]: ({\n modelName,\n defaultTemperature,\n defaultMaxTokens,\n apiToken,\n }) => {\n // HARDCODED: Create clean configuration depending on model type (same as for regular OpenAI)\n if (this.requiresMaxCompletionTokens(modelName)) {\n // Configuration for new GPT-5+ models\n // GPT-5+ models only support temperature = 1\n const fixedTemperature = 1;\n const config = {\n modelName,\n temperature: fixedTemperature, // Force set to 1\n maxCompletionTokens: defaultMaxTokens, // Only this parameter for new models\n streaming: true,\n openAIApiKey: apiToken || process.env.OPENAI_API_KEY,\n };\n\n if (defaultTemperature !== 1) {\n this.logger.debug(\n `Fixed temperature for FLUTCH GPT-5+ model ${modelName}: ${defaultTemperature} -> 1 (GPT-5+ models only support temperature=1)`\n );\n }\n\n this.logger.debug(`Creating FLUTCH GPT-5+ model with config`, {\n modelName,\n maxCompletionTokens: defaultMaxTokens,\n temperature: fixedTemperature,\n originalTemperature: defaultTemperature,\n hasApiKey: !!config.openAIApiKey,\n });\n\n const chatOpenAI = new ChatOpenAI(config);\n\n // Log initialized instance for debugging\n this.logger.debug(`FLUTCH ChatOpenAI GPT-5+ instance created`, {\n modelName: modelName, // Use modelName from parameters\n maxTokens: (chatOpenAI as any).maxTokens,\n maxCompletionTokens: (chatOpenAI as any).maxCompletionTokens,\n temperature: chatOpenAI.temperature,\n streaming: chatOpenAI.streaming,\n // Try to get internal parameters\n clientConfig: (chatOpenAI as any).clientConfig,\n kwargs: (chatOpenAI as any).kwargs,\n });\n\n return chatOpenAI;\n } else {\n // Configuration for legacy GPT-3.5/GPT-4 models\n const config = {\n modelName,\n temperature: defaultTemperature,\n maxTokens: defaultMaxTokens, // Only this parameter for legacy models\n streaming: true,\n openAIApiKey: apiToken || process.env.OPENAI_API_KEY,\n };\n\n this.logger.debug(`Creating FLUTCH legacy model with config`, {\n modelName,\n maxTokens: defaultMaxTokens,\n temperature: defaultTemperature,\n hasApiKey: !!config.openAIApiKey,\n });\n\n const chatOpenAI = new ChatOpenAI(config);\n\n // Log initialized instance for debugging\n this.logger.debug(`FLUTCH ChatOpenAI legacy instance created`, {\n modelName: modelName, // Use modelName from parameters\n maxTokens: (chatOpenAI as any).maxTokens,\n maxCompletionTokens: (chatOpenAI as any).maxCompletionTokens,\n temperature: chatOpenAI.temperature,\n streaming: chatOpenAI.streaming,\n // Try to get internal parameters\n clientConfig: (chatOpenAI as any).clientConfig,\n kwargs: (chatOpenAI as any).kwargs,\n });\n\n return chatOpenAI;\n }\n },\n\n // Other providers not yet implemented for chat\n [ModelProvider.FLUTCH]: () => {\n throw new Error(\"Flutch chat models not implemented\");\n },\n [ModelProvider.FLUTCH_MISTRAL]: () => {\n throw new Error(\"Flutch Mistral chat models not implemented\");\n },\n [ModelProvider.FLUTCH_ANTHROPIC]: () => {\n throw new Error(\"Flutch Anthropic chat models not implemented\");\n },\n [ModelProvider.VOYAGEAI]: () => {\n throw new Error(\"VoyageAI chat models not implemented\");\n },\n };\n\n // Rerank model creators\n private readonly rerankModelCreators: Record<\n ModelProvider,\n RerankModelCreator | undefined\n > = {\n [ModelProvider.COHERE]: ({ modelName, apiToken, maxDocuments }) => {\n return new CohereRerank({\n apiKey: apiToken || process.env.COHERE_API_KEY,\n model: modelName,\n topN: maxDocuments || 20,\n });\n },\n\n [ModelProvider.VOYAGEAI]: ({ modelName, apiToken, maxDocuments }) => {\n return new VoyageAIRerank({\n apiKey: apiToken || process.env.VOYAGEAI_API_KEY,\n model: modelName,\n topN: maxDocuments || 20,\n });\n },\n\n // Other providers don't support rerank yet\n [ModelProvider.OPENAI]: undefined,\n [ModelProvider.ANTHROPIC]: undefined,\n [ModelProvider.MISTRAL]: undefined,\n [ModelProvider.AWS]: undefined,\n [ModelProvider.FLUTCH]: undefined,\n [ModelProvider.FLUTCH_MISTRAL]: undefined,\n [ModelProvider.FLUTCH_OPENAI]: undefined,\n [ModelProvider.FLUTCH_ANTHROPIC]: undefined,\n };\n\n // Embedding model creators\n private readonly embeddingModelCreators: Record<\n ModelProvider,\n EmbeddingModelCreator | undefined\n > = {\n [ModelProvider.OPENAI]: ({ modelName, apiToken }) =>\n new OpenAIEmbeddings({\n model: modelName,\n apiKey: apiToken || process.env.OPENAI_API_KEY,\n }),\n\n // Other providers not yet implemented for embeddings\n [ModelProvider.ANTHROPIC]: undefined,\n [ModelProvider.COHERE]: undefined,\n [ModelProvider.MISTRAL]: undefined,\n [ModelProvider.AWS]: undefined,\n [ModelProvider.FLUTCH]: undefined,\n [ModelProvider.FLUTCH_MISTRAL]: undefined,\n [ModelProvider.FLUTCH_OPENAI]: undefined,\n [ModelProvider.FLUTCH_ANTHROPIC]: undefined,\n [ModelProvider.VOYAGEAI]: undefined,\n };\n\n async initializeChatModel(\n config: ModelByIdConfig\n ): Promise<\n | BaseChatModel\n | Runnable<BaseLanguageModelInput, AIMessageChunk, BaseChatModelCallOptions>\n > {\n // Generate cache key for this specific model configuration (including tools if present)\n const cacheKey = this.generateModelCacheKey(config);\n\n // Check if we already have this exact model instance cached\n const cachedModel = this.modelInstanceCache.get(cacheKey);\n if (cachedModel) {\n this.logger.debug(`Using cached chat model instance: ${cacheKey}`);\n return cachedModel as ChatModelOrRunnable;\n }\n\n const modelConfig = await this.getModelConfigWithType(config.modelId);\n\n if (modelConfig.modelType !== ModelType.CHAT) {\n throw new Error(\n `Model ${config.modelId} is not a chat model (type: ${modelConfig.modelType})`\n );\n }\n\n const creator = this.chatModelCreators[modelConfig.provider];\n if (!creator) {\n throw new Error(\n `Chat models not supported for provider: ${modelConfig.provider}`\n );\n }\n\n // Override parameters from request\n const finalConfig: ModelConfigWithTokenAndType = {\n ...modelConfig,\n defaultTemperature: Number(\n config.temperature ?? modelConfig.defaultTemperature\n ),\n defaultMaxTokens: Number(\n config.maxTokens ?? modelConfig.defaultMaxTokens\n ),\n };\n\n this.logger.debug(`Creating new chat model instance: ${cacheKey}`);\n const model = creator(finalConfig);\n\n // Attach modelId to model metadata - will automatically propagate to all LangChain events\n model.metadata = {\n ...model.metadata,\n modelId: config.modelId,\n };\n\n this.logger.debug(\"🔧 Model initialized with metadata\", {\n modelId: config.modelId,\n metadataKeys: Object.keys(model.metadata || {}),\n hasModelId: !!model.metadata?.modelId,\n });\n\n // Bind tools if provided (toolsConfig or customTools)\n this.logger.debug(\n `[TOOLS CHECK] toolsConfig exists: ${!!config.toolsConfig}, customTools exists: ${!!config.customTools}`\n );\n if (config.toolsConfig) {\n this.logger.debug(\n `[TOOLS CHECK] toolsConfig length: ${config.toolsConfig.length}, content: ${JSON.stringify(config.toolsConfig)}`\n );\n }\n\n if (config.toolsConfig || config.customTools) {\n this.logger.debug(\n `[TOOLS] Calling bindToolsToModel with toolsConfig: ${JSON.stringify(config.toolsConfig)}`\n );\n const boundModel = await this.bindToolsToModel(\n model,\n config.toolsConfig,\n config.customTools\n );\n this.logger.debug(`[TOOLS] bindToolsToModel returned successfully`);\n\n // Cache the model with bound tools\n this.modelInstanceCache.set(cacheKey, boundModel);\n return boundModel;\n }\n\n // Cache the created model instance\n this.modelInstanceCache.set(cacheKey, model);\n\n return model;\n }\n\n /**\n * Bind tools to model (merge toolsConfig and customTools)\n * For toolsConfig: fetch tool executors from MCP Runtime\n * For customTools: use as-is (already prepared DynamicStructuredTool)\n *\n * Returns:\n * - Runnable when tools are bound (model.bindTools returns Runnable)\n * - BaseChatModel when no tools\n */\n private async bindToolsToModel(\n model: BaseChatModel,\n toolsConfig?: IAgentToolConfig[],\n customTools?: DynamicStructuredTool[]\n ): Promise<\n | BaseChatModel\n | Runnable<BaseLanguageModelInput, AIMessageChunk, BaseChatModelCallOptions>\n > {\n const allTools: StructuredTool[] = [];\n\n // Process toolsConfig (fetch dynamic schemas from MCP Runtime)\n if (toolsConfig && toolsConfig.length > 0) {\n try {\n // Filter enabled tools\n const enabledToolsConfig = toolsConfig.filter(\n tc => tc.enabled !== false\n );\n\n if (enabledToolsConfig.length > 0) {\n this.logger.debug(\n `Fetching ${enabledToolsConfig.length} tools with dynamic schemas from MCP Runtime: ${enabledToolsConfig.map(tc => tc.toolName).join(\", \")}`\n );\n\n // Use McpToolFilter to fetch tools with dynamic schemas\n const mcpToolFilter = new McpToolFilter();\n const mcpTools =\n await mcpToolFilter.getFilteredTools(enabledToolsConfig);\n\n this.logger.debug(\n `Successfully fetched ${mcpTools.length} tools with dynamic schemas from MCP Runtime`\n );\n\n allTools.push(...mcpTools);\n }\n } catch (error) {\n this.logger.error(\n `Failed to fetch tools from MCP Runtime: ${error instanceof Error ? error.message : String(error)}`\n );\n // Continue without MCP tools\n }\n }\n\n // Add custom tools (already prepared)\n if (customTools && customTools.length > 0) {\n allTools.push(...customTools);\n this.logger.debug(`Added ${customTools.length} custom tools to model`);\n }\n\n // Bind tools to model if we have any\n if (allTools.length > 0) {\n this.logger.debug(`Binding ${allTools.length} tools to model`);\n\n // bindTools returns Runnable, not BaseChatModel\n const modelWithTools = model.bindTools(allTools);\n return modelWithTools;\n }\n\n return model;\n }\n\n async initializeRerankModel(\n config: ModelByIdConfig\n ): Promise<BaseDocumentCompressor> {\n // Generate cache key for this rerank model configuration\n const cacheKey = this.generateModelCacheKey(config);\n\n // Check if we already have this exact model instance cached\n const cachedModel = this.modelInstanceCache.get(cacheKey);\n if (cachedModel) {\n this.logger.debug(`Using cached rerank model instance: ${cacheKey}`);\n return cachedModel as BaseDocumentCompressor;\n }\n\n const modelConfig = await this.getModelConfigWithType(config.modelId);\n\n if (modelConfig.modelType !== ModelType.RERANK) {\n throw new Error(\n `Model ${config.modelId} is not a rerank model (type: ${modelConfig.modelType})`\n );\n }\n\n const creator = this.rerankModelCreators[modelConfig.provider];\n if (!creator) {\n throw new Error(\n `Rerank models not supported for provider: ${modelConfig.provider}`\n );\n }\n\n this.logger.debug(`Creating new rerank model instance: ${cacheKey}`);\n const model = creator(modelConfig);\n\n // Attach modelId to model metadata - will automatically propagate to all events\n (model as any).metadata = {\n ...(model as any).metadata,\n modelId: config.modelId,\n };\n\n // Cache the created model instance\n this.modelInstanceCache.set(cacheKey, model);\n\n return model;\n }\n\n async initializeEmbeddingModel(config: ModelByIdConfig): Promise<Embeddings> {\n // Generate cache key for this embedding model configuration\n const cacheKey = this.generateModelCacheKey(config);\n\n // Check if we already have this exact model instance cached\n const cachedModel = this.modelInstanceCache.get(cacheKey);\n if (cachedModel) {\n this.logger.debug(`Using cached embedding model instance: ${cacheKey}`);\n return cachedModel as Embeddings;\n }\n\n const modelConfig = await this.getModelConfigWithType(config.modelId);\n\n if (modelConfig.modelType !== ModelType.EMBEDDING) {\n throw new Error(\n `Model ${config.modelId} is not an embedding model (type: ${modelConfig.modelType})`\n );\n }\n\n const creator = this.embeddingModelCreators[modelConfig.provider];\n if (!creator) {\n throw new Error(\n `Embedding models not supported for provider: ${modelConfig.provider}`\n );\n }\n\n this.logger.debug(`Creating new embedding model instance: ${cacheKey}`);\n const model = creator(modelConfig);\n\n // Attach modelId to model metadata - will automatically propagate to all events\n (model as any).metadata = {\n ...(model as any).metadata,\n modelId: config.modelId,\n };\n\n // Cache the created model instance\n this.modelInstanceCache.set(cacheKey, model);\n\n return model;\n }\n\n // === NEW TYPED METHODS ===\n\n async createChatModelById(modelId: string): Promise<ChatModelOrRunnable> {\n const config = await this.getModelConfigWithType(modelId);\n\n if (config.modelType !== ModelType.CHAT) {\n throw new Error(\n `Model ${modelId} is not a chat model, got: ${config.modelType}`\n );\n }\n\n return this.initializeChatModel(config);\n }\n\n async createRerankModelById(\n modelId: string\n ): Promise<BaseDocumentCompressor> {\n const config = await this.getModelConfigWithType(modelId);\n\n if (config.modelType !== ModelType.RERANK) {\n throw new Error(\n `Model ${modelId} is not a rerank model, got: ${config.modelType}`\n );\n }\n\n return this.initializeRerankModel(config);\n }\n\n async createEmbeddingModelById(modelId: string): Promise<Embeddings> {\n const config = await this.getModelConfigWithType(modelId);\n\n if (config.modelType !== ModelType.EMBEDDING) {\n throw new Error(\n `Model ${modelId} is not an embedding model, got: ${config.modelType}`\n );\n }\n\n return this.initializeEmbeddingModel(config);\n }\n\n async createModelById(\n modelId: string,\n expectedType?: ModelType\n ): Promise<Model> {\n const config = await this.getModelConfigWithType(modelId);\n\n // Check if it matches the expected type\n if (expectedType && config.modelType !== expectedType) {\n throw new Error(\n `Model ${modelId} expected to be ${expectedType}, but got: ${config.modelType}`\n );\n }\n\n return this.initializeModelByType(config);\n }\n\n // === LEGACY METHODS ===\n\n async initializeModelByType(config: ModelByIdWithTypeConfig): Promise<Model> {\n switch (config.modelType) {\n case ModelType.CHAT:\n return this.initializeChatModel(config);\n\n case ModelType.RERANK:\n return this.initializeRerankModel(config);\n\n case ModelType.EMBEDDING:\n return this.initializeEmbeddingModel(config);\n\n case ModelType.IMAGE:\n case ModelType.SPEECH:\n throw new Error(`Model type ${config.modelType} not yet supported`);\n\n default:\n throw new Error(`Unknown model type: ${config.modelType}`);\n }\n }\n\n async getModelConfigWithType(\n modelId: string\n ): Promise<ModelConfigWithTokenAndType> {\n // Check if we already have this model config cached\n const cachedConfig = this.modelConfigCache.get(modelId);\n if (cachedConfig) {\n this.logger.debug(`Using cached model config: ${modelId}`);\n return cachedConfig;\n }\n\n this.logger.debug(`Fetching model config: ${modelId}`);\n\n // Get base configuration\n const baseConfig = this.configFetcher\n ? await this.configFetcher(modelId)\n : await this.fetchFromApi(modelId);\n\n // Model config loaded successfully\n\n // Extend with model type and additional fields\n const result = {\n ...baseConfig,\n modelType: (baseConfig as any).modelType || ModelType.CHAT, // Fallback for legacy models\n maxDocuments: (baseConfig as any).maxDocuments,\n dimensions: (baseConfig as any).dimensions,\n supportedFormats: (baseConfig as any).supportedFormats,\n };\n\n // Model type resolved\n\n // Cache the result to avoid repeated API calls\n this.modelConfigCache.set(modelId, result);\n\n return result;\n }\n\n isModelTypeSupported(modelType: ModelType): boolean {\n return [ModelType.CHAT, ModelType.RERANK, ModelType.EMBEDDING].includes(\n modelType\n );\n }\n\n getSupportedModelTypes(): ModelType[] {\n return [ModelType.CHAT, ModelType.RERANK, ModelType.EMBEDDING];\n }\n\n /**\n * Clear all cached model configurations and instances\n */\n clearCache(): void {\n this.logger.debug(\n `Clearing ModelInitializer cache: ${this.modelConfigCache.size} configs, ${this.modelInstanceCache.size} instances`\n );\n this.modelConfigCache.clear();\n this.modelInstanceCache.clear();\n }\n\n /**\n * Clear cached data for a specific model ID\n */\n clearModelCache(modelId: string): void {\n this.modelConfigCache.delete(modelId);\n\n // Clear all instances that use this model ID\n const keysToDelete: string[] = [];\n for (const [key] of this.modelInstanceCache.entries()) {\n if (key.startsWith(`${modelId}:`)) {\n keysToDelete.push(key);\n }\n }\n\n keysToDelete.forEach(key => {\n this.modelInstanceCache.delete(key);\n });\n\n this.logger.debug(\n `Cleared cache for model ${modelId}: ${keysToDelete.length} instances`\n );\n }\n\n /**\n * Get cache statistics for monitoring\n */\n getCacheStats() {\n return {\n configCacheSize: this.modelConfigCache.size,\n instanceCacheSize: this.modelInstanceCache.size,\n configCacheKeys: Array.from(this.modelConfigCache.keys()),\n instanceCacheKeys: Array.from(this.modelInstanceCache.keys()),\n };\n }\n\n // Simple API request for microservices (copy from original LLMInitializer)\n private async fetchFromApi(\n modelId: string\n ): Promise<ModelConfigWithTokenAndType> {\n const apiUrl = process.env.API_URL;\n const token = process.env.INTERNAL_API_TOKEN;\n\n if (!token) {\n throw new Error(\"INTERNAL_API_TOKEN required for API mode\");\n }\n\n const url = `${apiUrl}/internal/model-catalog/models/${modelId}/config`;\n\n const response = await fetch(url, {\n method: \"GET\",\n headers: {\n \"x-internal-token\": token,\n \"Content-Type\": \"application/json\",\n },\n });\n\n if (!response.ok) {\n throw new Error(\n `Failed to fetch model config: ${response.status} ${response.statusText}`\n );\n }\n\n const config = await response.json();\n\n console.debug(\n `ModelInitializer.fetchFromApi - API response for ${modelId}:`,\n {\n url,\n statusCode: response.status,\n configKeys: Object.keys(config),\n modelType: config.modelType,\n hasModelType: !!config.modelType,\n fullConfig: config,\n }\n );\n\n // Extend configuration with model type\n const result = {\n ...config,\n modelType: config.modelType || ModelType.CHAT, // Fallback for compatibility\n };\n\n console.debug(`ModelInitializer.fetchFromApi - final result:`, {\n modelId,\n resultModelType: result.modelType,\n usedFallback: !config.modelType,\n resultKeys: Object.keys(result),\n });\n\n return result;\n }\n}\n","/**\n * Retriever enums\n */\n\nexport enum RetrieverSearchType {\n Search = \"search\",\n MMR = \"mmr\",\n Similarity = \"similarity\",\n}\n","import { Injectable, Logger } from \"@nestjs/common\";\nimport { RetrieverSearchType } from \"./enums\";\nimport {\n CustomDocument,\n RetrieveQueryOptions,\n KnowledgeBaseInfo,\n} from \"./types\";\n\nexport interface RetrieverConfig {\n /**\n * Base URL for the main backend service (k8s endpoint)\n * If not specified, will use environment variable\n */\n apiUrl?: string;\n /**\n * Internal API token for backend communication\n * If not specified, will use environment variable\n */\n internalToken?: string;\n /**\n * Request timeout in milliseconds\n */\n timeout?: number;\n /**\n * Number of retries for failed requests\n */\n retries?: number;\n}\n\n/**\n * Retriever Service\n * HTTP-based service for knowledge base retrieval through main backend\n * Follows the same pattern as LLM initializer for k8s communication\n */\n@Injectable()\nexport class RetrieverService {\n private readonly logger = new Logger(RetrieverService.name);\n private readonly apiUrl: string;\n private readonly internalToken: string;\n private readonly timeout: number;\n private readonly retries: number;\n\n constructor(config: RetrieverConfig = {}) {\n // this.logger = config.logger || new ConsoleLogger();\n\n // Priority: config values > environment variables > defaults\n this.apiUrl =\n config.apiUrl || process.env.API_URL || \"http://amelie-service\";\n this.internalToken =\n config.internalToken || process.env.INTERNAL_API_TOKEN || \"\";\n this.timeout = config.timeout || 30000; // 30 seconds default\n this.retries = config.retries || 3;\n\n if (!this.internalToken) {\n throw new Error(\"INTERNAL_API_TOKEN required for backend communication\");\n }\n\n this.logger.log(\n `RetrieverService initialized with API URL: ${this.apiUrl}`\n );\n }\n\n /**\n * Make HTTP request to backend with retry logic\n */\n private async makeRequest<T>(\n endpoint: string,\n options: {\n method?: \"GET\" | \"POST\";\n body?: any;\n timeout?: number;\n } = {}\n ): Promise<T> {\n const { method = \"GET\", body, timeout = this.timeout } = options;\n const url = `${this.apiUrl}${endpoint}`;\n\n let lastError: Error | undefined;\n\n for (let attempt = 1; attempt <= this.retries; attempt++) {\n try {\n this.logger.debug?.(\n `Making ${method} request to ${url} (attempt ${attempt}/${this.retries})`\n );\n\n const response = await fetch(url, {\n method,\n headers: {\n \"x-internal-token\": this.internalToken,\n \"Content-Type\": \"application/json\",\n \"User-Agent\": \"RetrieverService/1.0.0\",\n },\n body: body ? JSON.stringify(body) : undefined,\n signal: AbortSignal.timeout(timeout),\n });\n\n if (!response.ok) {\n const errorText = await response.text().catch(() => \"Unknown error\");\n throw new Error(\n `HTTP ${response.status} ${response.statusText}: ${errorText}`\n );\n }\n\n const data = await response.json();\n this.logger.debug?.(`Request successful on attempt ${attempt}`);\n return data;\n } catch (error) {\n lastError = error instanceof Error ? error : new Error(String(error));\n\n if (attempt === this.retries) {\n this.logger.error(\n `Request failed after ${this.retries} attempts: ${lastError.message}`\n );\n break;\n }\n\n const backoffDelay = Math.min(1000 * Math.pow(2, attempt - 1), 10000);\n this.logger.warn(\n `Request failed (attempt ${attempt}/${this.retries}), retrying in ${backoffDelay}ms: ${lastError.message}`\n );\n\n await new Promise(resolve => setTimeout(resolve, backoffDelay));\n }\n }\n\n if (!lastError) {\n throw new Error(\"Request failed with unknown error\");\n }\n\n throw lastError;\n }\n\n /**\n * Health check for the service\n */\n async healthCheck(): Promise<boolean> {\n try {\n await this.makeRequest(\"/health\", { timeout: 5000 });\n return true;\n } catch (error) {\n this.logger.warn(`Health check failed: ${error}`);\n return false;\n }\n }\n\n /**\n * Search documents in knowledge base through backend API\n */\n async search(\n query: string,\n searchType: RetrieverSearchType,\n knowledgeBaseIds: string[],\n options?: RetrieveQueryOptions\n ): Promise<CustomDocument[]> {\n if (!query?.trim()) {\n this.logger.warn(\"Empty query provided to search\");\n return [];\n }\n\n if (!knowledgeBaseIds?.length) {\n this.logger.warn(\"No knowledge base IDs provided\");\n return [];\n }\n\n const searchOptions = {\n k: options?.k || 10,\n threshold: options?.threshold || 0.7,\n metadata: options?.metadata || {},\n };\n\n this.logger.debug?.(`Searching documents: \"${query}\"`, {\n searchType,\n knowledgeBaseIds: knowledgeBaseIds.length,\n options: searchOptions,\n });\n\n try {\n const response = await this.makeRequest<{\n documents: CustomDocument[];\n totalFound: number;\n searchType: string;\n }>(\"/internal/knowledge-base/search\", {\n method: \"POST\",\n body: {\n query: query.trim(),\n searchType,\n knowledgeBaseIds,\n options: searchOptions,\n },\n });\n\n const documents = response.documents || [];\n\n this.logger.debug?.(\n `Found ${documents.length} documents from ${response.totalFound || 0} total matches`\n );\n\n // Validate document structure\n return documents.filter(doc => {\n if (!doc.id || !doc.content) {\n this.logger.warn(\"Invalid document structure detected, skipping\");\n return false;\n }\n return true;\n });\n } catch (error) {\n this.logger.error(`Failed to search documents: ${error}`, {\n query,\n searchType,\n knowledgeBaseIds,\n options: searchOptions,\n });\n\n // Return empty array on error to allow graph to continue\n return [];\n }\n }\n\n /**\n * Get documents by their IDs\n */\n async getDocumentsByIds(ids: string[]): Promise<CustomDocument[]> {\n if (!ids?.length) {\n this.logger.warn(\"No document IDs provided\");\n return [];\n }\n\n // Validate IDs format\n const validIds = ids\n .filter(id => {\n if (!id || typeof id !== \"string\" || id.trim() === \"\") {\n this.logger.warn(`Invalid document ID: ${id}`);\n return false;\n }\n return true;\n })\n .map(id => id.trim());\n\n if (!validIds.length) {\n this.logger.warn(\"No valid document IDs provided\");\n return [];\n }\n\n this.logger.debug?.(`Fetching ${validIds.length} documents by IDs`);\n\n try {\n const response = await this.makeRequest<{\n documents: CustomDocument[];\n }>(\"/internal/knowledge-base/documents/batch\", {\n method: \"POST\",\n body: { ids: validIds },\n });\n\n const documents = response.documents || [];\n\n this.logger.debug?.(\n `Retrieved ${documents.length}/${validIds.length} documents`\n );\n\n return documents;\n } catch (error) {\n this.logger.error(`Failed to get documents by IDs: ${error}`, {\n requestedIds: validIds.length,\n });\n\n return [];\n }\n }\n\n /**\n * Check if knowledge base exists and is accessible\n */\n async knowledgeBaseExists(knowledgeBaseId: string): Promise<boolean> {\n if (!knowledgeBaseId?.trim()) {\n this.logger.warn(\"Empty knowledge base ID provided\");\n return false;\n }\n\n try {\n const response = await this.makeRequest<{\n exists: boolean;\n accessible: boolean;\n }>(`/internal/knowledge-base/${knowledgeBaseId.trim()}/status`);\n\n const exists = response.exists && response.accessible;\n\n this.logger.debug?.(\n `Knowledge base ${knowledgeBaseId} ${exists ? \"exists and is accessible\" : \"does not exist or is not accessible\"}`\n );\n\n return exists;\n } catch (error) {\n this.logger.error(`Failed to check KB existence: ${error}`, {\n knowledgeBaseId,\n });\n\n return false;\n }\n }\n\n /**\n * Get knowledge base information\n */\n async getKnowledgeBaseInfo(\n knowledgeBaseId: string\n ): Promise<KnowledgeBaseInfo | null> {\n if (!knowledgeBaseId?.trim()) {\n this.logger.warn(\"Empty knowledge base ID provided\");\n return null;\n }\n\n try {\n const response = await this.makeRequest<KnowledgeBaseInfo>(\n `/internal/knowledge-base/${knowledgeBaseId.trim()}/info`\n );\n\n this.logger.debug?.(`Retrieved KB info for ${knowledgeBaseId}`, {\n name: response.name,\n documentsCount: response.documentsCount,\n });\n\n return response;\n } catch (error) {\n this.logger.error(`Failed to get KB info: ${error}`, {\n knowledgeBaseId,\n });\n\n return null;\n }\n }\n\n /**\n * Simple text search (fallback for when vector search is not available)\n */\n async textSearch(\n query: string,\n knowledgeBaseIds: string[],\n limit: number = 10\n ): Promise<CustomDocument[]> {\n if (!query?.trim()) {\n this.logger.warn(\"Empty query provided to text search\");\n return [];\n }\n\n if (!knowledgeBaseIds?.length) {\n this.logger.warn(\"No knowledge base IDs provided to text search\");\n return [];\n }\n\n this.logger.debug?.(`Performing text search: \"${query}\"`, {\n knowledgeBaseIds: knowledgeBaseIds.length,\n limit,\n });\n\n try {\n const response = await this.makeRequest<{\n documents: CustomDocument[];\n }>(\"/internal/knowledge-base/text-search\", {\n method: \"POST\",\n body: {\n query: query.trim(),\n knowledgeBaseIds,\n limit: Math.max(1, Math.min(limit, 100)), // Ensure reasonable limits\n },\n });\n\n const documents = response.documents || [];\n\n this.logger.debug?.(`Text search found ${documents.length} documents`);\n\n return documents;\n } catch (error) {\n this.logger.error(`Failed to perform text search: ${error}`, {\n query,\n knowledgeBaseIds,\n limit,\n });\n\n return [];\n }\n }\n\n /**\n * Get available knowledge bases for the current context\n */\n async getAvailableKnowledgeBases(): Promise<KnowledgeBaseInfo[]> {\n try {\n const response = await this.makeRequest<{\n knowledgeBases: KnowledgeBaseInfo[];\n }>(\"/internal/knowledge-base/available\");\n\n const kbs = response.knowledgeBases || [];\n\n this.logger.debug?.(`Found ${kbs.length} available knowledge bases`);\n\n return kbs;\n } catch (error) {\n this.logger.error(`Failed to get available knowledge bases: ${error}`);\n\n return [];\n }\n }\n\n /**\n * Check service health and configuration\n */\n check(): string {\n return `RetrieverService configured with API URL: ${this.apiUrl}, timeout: ${this.timeout}ms, retries: ${this.retries}`;\n }\n}\n","// packages/sdk/src/utils/index.ts\nexport * from \"./graph-type.utils\";\n","// Service discovery exports\nexport * from \"./service-discovery.provider\";\nexport * from \"./file-based.discovery\";\nexport * from \"./static.discovery\";\n\n// Optional: Uncomment when consul, @kubernetes/client-node packages are installed\n// export * from \"./consul.discovery\";\n// export * from \"./kubernetes.discovery\";\n// export * from \"./knative.discovery\";\n// export * from \"./knative-service.registry\";\n","// packages/graph-services/graph-service-registry/src/service-discovery/static.discovery.ts\nimport { Injectable } from \"@nestjs/common\";\nimport { ServiceDiscoveryProvider } from \"./service-discovery.provider\";\n\n/**\n * Static service discovery provider (for local development)\n */\n@Injectable()\nexport class StaticDiscovery implements ServiceDiscoveryProvider {\n constructor(\n private readonly services: Array<{\n name: string;\n address: string;\n port: number;\n metadata: Record<string, any>;\n category?: string;\n }>\n ) {}\n\n /**\n * Get list of services by category\n */\n async getServices(category: string): Promise<\n Array<{\n name: string;\n address: string;\n port: number;\n metadata: Record<string, any>;\n }>\n > {\n return this.services.filter(\n service =>\n service.category === category || service.metadata?.category === category\n );\n }\n}\n"]}