@astralibx/call-log-engine 0.3.0 → 0.3.2

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/schemas/pipeline.schema.ts","../src/schemas/call-log.schema.ts","../src/constants/index.ts","../src/schemas/call-log-settings.schema.ts","../src/errors/index.ts","../src/services/settings.service.ts","../src/validation/pipeline.validator.ts","../src/services/pipeline.service.ts","../src/services/timeline.service.ts","../src/services/call-log.service.ts","../src/services/call-log-lifecycle.service.ts","../src/services/analytics.service.ts","../src/services/pipeline-analytics.service.ts","../src/services/export.service.ts","../src/routes/pipeline.routes.ts","../src/routes/call-log.routes.ts","../src/routes/contact.routes.ts","../src/routes/analytics.routes.ts","../src/routes/settings.routes.ts","../src/routes/index.ts","../src/workers/follow-up.worker.ts","../src/index.ts"],"names":["crypto","Schema","CallPriority","TimelineEntryType","Router","sendSuccess","sendError","getScopedAgentId"],"mappings":"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","file":"index.mjs","sourcesContent":["import crypto from 'node:crypto';\nimport { Schema, Document, Model } from 'mongoose';\nimport type mongoose from 'mongoose';\nimport type { IPipeline, IPipelineStage } from '@astralibx/call-log-types';\n\n// ── Document interfaces ──────────────────────────────────────────────────────\n\nexport interface IPipelineStageDocument extends IPipelineStage, Document {}\n\nexport interface IPipelineDocument extends IPipeline, Document {}\n\n// ── Sub-document schema ──────────────────────────────────────────────────────\n\nexport const PipelineStageSchema = new Schema<IPipelineStageDocument>(\n {\n stageId: { type: String, required: true, default: () => crypto.randomUUID() },\n name: { type: String, required: true },\n color: { type: String, required: true },\n order: { type: Number, required: true },\n isTerminal: { type: Boolean, default: false },\n isDefault: { type: Boolean, default: false },\n },\n { _id: false },\n);\n\n// ── Main schema ──────────────────────────────────────────────────────────────\n\nexport const PipelineSchema = new Schema<IPipelineDocument>(\n {\n pipelineId: { type: String, required: true, unique: true, default: () => crypto.randomUUID() },\n name: { type: String, required: true },\n description: { type: String },\n stages: { type: [PipelineStageSchema], required: true },\n isActive: { type: Boolean, default: true, index: true },\n isDeleted: { type: Boolean, default: false },\n isDefault: { type: Boolean, default: false },\n createdBy: { type: String, required: true },\n tenantId: { type: String, sparse: true },\n metadata: { type: Schema.Types.Mixed },\n },\n {\n timestamps: true,\n },\n);\n\n// Note: pipelineId unique index is defined inline via `unique: true`.\n// isActive index is defined inline via `index: true`.\n// tenantId sparse index is defined inline via `sparse: true`.\n// No additional schema.index() calls needed for these fields.\n\n// ── Factory ──────────────────────────────────────────────────────────────────\n\nexport function createPipelineModel(\n connection: mongoose.Connection,\n prefix?: string,\n): Model<IPipelineDocument> {\n const collectionName = prefix ? `${prefix}_pipelines` : 'pipelines';\n return connection.model<IPipelineDocument>('Pipeline', PipelineSchema, collectionName);\n}\n","import crypto from 'node:crypto';\nimport { Schema, Document, Model } from 'mongoose';\nimport type mongoose from 'mongoose';\nimport { CallDirection, CallPriority, TimelineEntryType } from '@astralibx/call-log-types';\nimport type { ICallLog, IContactRef, ITimelineEntry, IStageChange } from '@astralibx/call-log-types';\n\n// ── Document interface ───────────────────────────────────────────────────────\n\nexport interface ICallLogDocument extends Omit<ICallLog, 'agentId'>, Document {\n agentId: mongoose.Types.ObjectId;\n}\n\n// ── Sub-document schemas ─────────────────────────────────────────────────────\n\nexport const ContactRefSchema = new Schema<IContactRef>(\n {\n externalId: { type: String, required: true },\n displayName: { type: String, required: true },\n phone: { type: String },\n email: { type: String },\n },\n { _id: false },\n);\n\nexport const TimelineEntrySchema = new Schema<ITimelineEntry>(\n {\n entryId: { type: String, required: true, default: () => crypto.randomUUID() },\n type: {\n type: String,\n required: true,\n enum: Object.values(TimelineEntryType),\n },\n content: { type: String },\n authorId: { type: String },\n authorName: { type: String },\n fromStageId: { type: String },\n fromStageName: { type: String },\n toStageId: { type: String },\n toStageName: { type: String },\n fromAgentId: { type: String },\n fromAgentName: { type: String },\n toAgentId: { type: String },\n toAgentName: { type: String },\n createdAt: { type: Date, default: Date.now },\n },\n { _id: false },\n);\n\nexport const StageChangeSchema = new Schema<IStageChange>(\n {\n fromStageId: { type: String, required: true },\n toStageId: { type: String, required: true },\n fromStageName: { type: String, required: true },\n toStageName: { type: String, required: true },\n changedBy: { type: String, required: true },\n changedAt: { type: Date, required: true },\n timeInStageMs: { type: Number, required: true },\n },\n { _id: false },\n);\n\n// ── Main schema ──────────────────────────────────────────────────────────────\n\nexport const CallLogSchema = new Schema<ICallLogDocument>(\n {\n callLogId: { type: String, required: true, unique: true, default: () => crypto.randomUUID() },\n pipelineId: { type: String, required: true, index: true },\n currentStageId: { type: String, required: true, index: true },\n contactRef: { type: ContactRefSchema, required: true },\n direction: {\n type: String,\n required: true,\n enum: Object.values(CallDirection),\n },\n callDate: { type: Date, required: true, index: true },\n nextFollowUpDate: { type: Date, index: true },\n followUpNotifiedAt: { type: Date },\n priority: {\n type: String,\n required: true,\n enum: Object.values(CallPriority),\n default: CallPriority.Medium,\n },\n agentId: { type: Schema.Types.ObjectId, required: true, index: true },\n assignedBy: { type: String },\n tags: { type: [String], default: [], index: true },\n category: { type: String },\n timeline: { type: [TimelineEntrySchema], default: [] },\n stageHistory: { type: [StageChangeSchema], default: [] },\n durationMinutes: { type: Number, min: 0 },\n channel: { type: String, default: 'phone', index: true },\n outcome: { type: String, default: 'pending', index: true },\n isFollowUp: { type: Boolean, default: false, index: true },\n isDeleted: { type: Boolean, default: false },\n deletedAt: { type: Date },\n isClosed: { type: Boolean, default: false, index: true },\n closedAt: { type: Date },\n tenantId: { type: String, sparse: true },\n metadata: { type: Schema.Types.Mixed },\n },\n {\n timestamps: true,\n },\n);\n\n// callLogId unique index is defined inline via `unique: true`.\n// tenantId sparse index is defined inline via `sparse: true`.\n// Compound and additional indexes:\nCallLogSchema.index({ 'contactRef.externalId': 1 });\nCallLogSchema.index({ pipelineId: 1, currentStageId: 1 });\nCallLogSchema.index({ agentId: 1, isClosed: 1 });\nCallLogSchema.index({ isDeleted: 1, isClosed: 1 });\n\n// ── Factory ──────────────────────────────────────────────────────────────────\n\nexport function createCallLogModel(\n connection: mongoose.Connection,\n prefix?: string,\n): Model<ICallLogDocument> {\n const collectionName = prefix ? `${prefix}_call_logs` : 'call_logs';\n return connection.model<ICallLogDocument>('CallLog', CallLogSchema, collectionName);\n}\n","// Error Codes\nexport const ERROR_CODE = {\n PipelineNotFound: 'CALL_PIPELINE_NOT_FOUND',\n InvalidPipeline: 'CALL_INVALID_PIPELINE',\n StageNotFound: 'CALL_STAGE_NOT_FOUND',\n StageInUse: 'CALL_STAGE_IN_USE',\n CallLogNotFound: 'CALL_LOG_NOT_FOUND',\n CallLogClosed: 'CALL_LOG_CLOSED',\n CallLogDeleted: 'CALL_LOG_DELETED',\n ContactNotFound: 'CALL_CONTACT_NOT_FOUND',\n AgentCapacityFull: 'CALL_AGENT_CAPACITY_FULL',\n InvalidConfig: 'CALL_INVALID_CONFIG',\n AuthFailed: 'CALL_AUTH_FAILED',\n} as const;\n\nexport type ErrorCode = (typeof ERROR_CODE)[keyof typeof ERROR_CODE];\n\n// Error Messages\nexport const ERROR_MESSAGE = {\n PipelineNotFound: 'Pipeline not found',\n PipelineNoDefaultStage: 'Pipeline must have exactly one default stage',\n PipelineNoTerminalStage: 'Pipeline must have at least one terminal stage',\n PipelineDuplicateStageNames: 'Stage names must be unique within a pipeline',\n StageNotFound: 'Stage not found in pipeline',\n StageInUse: 'Cannot remove stage that has active calls',\n CallLogNotFound: 'Call log not found',\n CallLogClosed: 'Cannot modify a closed call log',\n CallLogDeleted: 'Call log has been deleted',\n ContactNotFound: 'Contact not found',\n AgentCapacityFull: 'Agent has reached maximum concurrent calls',\n AuthFailed: 'Authentication failed',\n} as const;\n\n// Pipeline Defaults\nexport const PIPELINE_DEFAULTS = {\n MaxStages: 20,\n} as const;\n\n// Call Log Defaults\nexport const CALL_LOG_DEFAULTS = {\n MaxTimelineEntries: 200,\n DefaultFollowUpDays: 3,\n TimelinePageSize: 20,\n} as const;\n\n// Agent Call Defaults\nexport const AGENT_CALL_DEFAULTS = {\n MaxConcurrentCalls: 10,\n} as const;\n\n// System Timeline Messages\nexport const SYSTEM_TIMELINE = {\n CallCreated: 'Call log created',\n CallClosed: 'Call closed',\n CallReopened: 'Call reopened',\n FollowUpCompleted: 'Follow-up completed',\n} as const;\n\nexport const SYSTEM_TIMELINE_FN = {\n stageChanged: (from: string, to: string) => `Stage changed from \"${from}\" to \"${to}\"`,\n callAssigned: (agentName: string) => `Call assigned to ${agentName}`,\n callReassigned: (from: string, to: string) => `Call reassigned from ${from} to ${to}`,\n followUpSet: (date: string) => `Follow-up scheduled for ${date}`,\n callDeleted: (agentName: string) => `Call deleted by ${agentName}`,\n followUpCallCreated: () => 'This call is a follow-up to a previous interaction',\n} as const;\n","import { Schema, Document, Model } from 'mongoose';\nimport type mongoose from 'mongoose';\nimport { CallPriority } from '@astralibx/call-log-types';\nimport type { ICallLogSettings, IPriorityConfig } from '@astralibx/call-log-types';\nimport { CALL_LOG_DEFAULTS, AGENT_CALL_DEFAULTS } from '../constants/index.js';\n\n// ── Document interface ───────────────────────────────────────────────────────\n\nexport interface ICallLogSettingsDocument extends ICallLogSettings, Document {}\n\n// ── Default priority levels ──────────────────────────────────────────────────\n\nconst DEFAULT_PRIORITY_LEVELS: IPriorityConfig[] = [\n { value: CallPriority.Low, label: 'Low', color: '#6b7280', order: 1 },\n { value: CallPriority.Medium, label: 'Medium', color: '#3b82f6', order: 2 },\n { value: CallPriority.High, label: 'High', color: '#f59e0b', order: 3 },\n { value: CallPriority.Urgent, label: 'Urgent', color: '#ef4444', order: 4 },\n];\n\n// ── Sub-document schema ──────────────────────────────────────────────────────\n\nconst PriorityConfigSchema = new Schema<IPriorityConfig>(\n {\n value: { type: String, required: true },\n label: { type: String, required: true },\n color: { type: String, required: true },\n order: { type: Number, required: true },\n },\n { _id: false },\n);\n\n// ── Main schema ──────────────────────────────────────────────────────────────\n\nexport const CallLogSettingsSchema = new Schema<ICallLogSettingsDocument>(\n {\n key: { type: String, required: true, default: 'global' },\n availableTags: { type: [String], default: [] },\n availableCategories: { type: [String], default: [] },\n availableChannels: { type: [String], default: ['phone', 'whatsapp', 'telegram', 'in_app_chat'] },\n availableOutcomes: { type: [String], default: ['pending', 'interested', 'not_interested', 'no_answer', 'busy', 'callback_requested', 'subscribed', 'complaint'] },\n priorityLevels: {\n type: [PriorityConfigSchema],\n default: () => DEFAULT_PRIORITY_LEVELS.map((p) => ({ ...p })),\n },\n defaultFollowUpDays: {\n type: Number,\n default: CALL_LOG_DEFAULTS.DefaultFollowUpDays,\n },\n followUpReminderEnabled: { type: Boolean, default: true },\n defaultPipelineId: { type: String },\n timelinePageSize: {\n type: Number,\n default: CALL_LOG_DEFAULTS.TimelinePageSize,\n },\n maxConcurrentCalls: {\n type: Number,\n default: AGENT_CALL_DEFAULTS.MaxConcurrentCalls,\n },\n tenantId: { type: String, sparse: true },\n metadata: { type: Schema.Types.Mixed },\n },\n {\n timestamps: true,\n },\n);\n\nCallLogSettingsSchema.index({ key: 1, tenantId: 1 }, { unique: true });\n\n// ── Factory ──────────────────────────────────────────────────────────────────\n\nexport function createCallLogSettingsModel(\n connection: mongoose.Connection,\n prefix?: string,\n): Model<ICallLogSettingsDocument> {\n const collectionName = prefix ? `${prefix}_call_log_settings` : 'call_log_settings';\n return connection.model<ICallLogSettingsDocument>(\n 'CallLogSettings',\n CallLogSettingsSchema,\n collectionName,\n );\n}\n","import { AlxError } from '@astralibx/core';\nimport { ERROR_CODE } from '../constants/index.js';\n\n// ── Base ────────────────────────────────────────────────────────────────────\n\nexport class AlxCallLogError extends AlxError {\n constructor(message: string, code: string, public readonly context?: Record<string, unknown>) {\n super(message, code);\n this.name = 'AlxCallLogError';\n }\n}\n\n// ── Domain errors ───────────────────────────────────────────────────────────\n\nexport class PipelineNotFoundError extends AlxCallLogError {\n constructor(public readonly pipelineId: string) {\n super(`Pipeline not found: ${pipelineId}`, ERROR_CODE.PipelineNotFound, { pipelineId });\n this.name = 'PipelineNotFoundError';\n }\n}\n\nexport class InvalidPipelineError extends AlxCallLogError {\n constructor(\n public readonly reason: string,\n public readonly pipelineId?: string,\n ) {\n super(\n pipelineId\n ? `Invalid pipeline \"${pipelineId}\": ${reason}`\n : `Invalid pipeline: ${reason}`,\n ERROR_CODE.InvalidPipeline,\n { pipelineId, reason },\n );\n this.name = 'InvalidPipelineError';\n }\n}\n\nexport class StageNotFoundError extends AlxCallLogError {\n constructor(\n public readonly pipelineId: string,\n public readonly stageId: string,\n ) {\n super(\n `Stage \"${stageId}\" not found in pipeline \"${pipelineId}\"`,\n ERROR_CODE.StageNotFound,\n { pipelineId, stageId },\n );\n this.name = 'StageNotFoundError';\n }\n}\n\nexport class StageInUseError extends AlxCallLogError {\n constructor(\n public readonly pipelineId: string,\n public readonly stageId: string,\n public readonly activeCallCount: number,\n ) {\n super(\n `Cannot remove stage \"${stageId}\" in pipeline \"${pipelineId}\": ${activeCallCount} active call(s)`,\n ERROR_CODE.StageInUse,\n { pipelineId, stageId, activeCallCount },\n );\n this.name = 'StageInUseError';\n }\n}\n\nexport class CallLogNotFoundError extends AlxCallLogError {\n constructor(public readonly callLogId: string) {\n super(`Call log not found: ${callLogId}`, ERROR_CODE.CallLogNotFound, { callLogId });\n this.name = 'CallLogNotFoundError';\n }\n}\n\nexport class CallLogClosedError extends AlxCallLogError {\n constructor(\n public readonly callLogId: string,\n public readonly attemptedAction: string,\n ) {\n super(\n `Cannot ${attemptedAction} on closed call log \"${callLogId}\"`,\n ERROR_CODE.CallLogClosed,\n { callLogId, attemptedAction },\n );\n this.name = 'CallLogClosedError';\n }\n}\n\nexport class ContactNotFoundError extends AlxCallLogError {\n constructor(public readonly contactQuery: Record<string, unknown>) {\n super(\n `Contact not found: ${JSON.stringify(contactQuery)}`,\n ERROR_CODE.ContactNotFound,\n { contactQuery },\n );\n this.name = 'ContactNotFoundError';\n }\n}\n\nexport class AgentCapacityError extends AlxCallLogError {\n constructor(\n public readonly agentId: string,\n public readonly currentCalls: number,\n public readonly maxCalls: number,\n ) {\n super(\n `Agent ${agentId} at capacity (${currentCalls}/${maxCalls})`,\n ERROR_CODE.AgentCapacityFull,\n { agentId, currentCalls, maxCalls },\n );\n this.name = 'AgentCapacityError';\n }\n}\n\nexport class InvalidConfigError extends AlxCallLogError {\n constructor(\n public readonly field: string,\n public readonly reason: string,\n ) {\n super(`Invalid config for \"${field}\": ${reason}`, ERROR_CODE.InvalidConfig, { field, reason });\n this.name = 'InvalidConfigError';\n }\n}\n\nexport class AuthFailedError extends AlxCallLogError {\n constructor(public readonly reason?: string) {\n super(\n reason ? `Authentication failed: ${reason}` : 'Authentication failed',\n ERROR_CODE.AuthFailed,\n { reason },\n );\n this.name = 'AuthFailedError';\n }\n}\n","import type { Model } from 'mongoose';\nimport type { LogAdapter } from '@astralibx/core';\nimport type { ICallLogSettings, IPriorityConfig } from '@astralibx/call-log-types';\nimport type { ICallLogSettingsDocument } from '../schemas/call-log-settings.schema.js';\nimport { InvalidConfigError } from '../errors/index.js';\nimport { CALL_LOG_DEFAULTS, AGENT_CALL_DEFAULTS } from '../constants/index.js';\n\n\n// ── Private validation helpers ────────────────────────────────────────────────\n\nfunction validateIntegerRange(value: unknown, field: string, min: number, max: number): void {\n if (typeof value !== 'number' || !Number.isInteger(value) || value < min || value > max) {\n throw new InvalidConfigError(field, `Must be an integer between ${min} and ${max}`);\n }\n}\n\n// ── Service ───────────────────────────────────────────────────────────────────\n\nexport class SettingsService {\n constructor(\n private CallLogSettings: Model<ICallLogSettingsDocument>,\n private logger: LogAdapter,\n private tenantId?: string,\n ) {}\n\n private get settingsFilter(): Record<string, unknown> {\n const filter: Record<string, unknown> = { key: 'global' };\n if (this.tenantId) filter.tenantId = this.tenantId;\n return filter;\n }\n\n private buildDefaults(): Record<string, unknown> {\n const defaults: Record<string, unknown> = {\n key: 'global',\n availableTags: [],\n availableCategories: [],\n priorityLevels: [],\n defaultFollowUpDays: CALL_LOG_DEFAULTS.DefaultFollowUpDays,\n followUpReminderEnabled: true,\n timelinePageSize: CALL_LOG_DEFAULTS.TimelinePageSize,\n maxConcurrentCalls: AGENT_CALL_DEFAULTS.MaxConcurrentCalls,\n };\n if (this.tenantId) defaults.tenantId = this.tenantId;\n return defaults;\n }\n\n async get(): Promise<ICallLogSettingsDocument> {\n return this.CallLogSettings.findOneAndUpdate(\n this.settingsFilter,\n { $setOnInsert: this.buildDefaults() },\n { upsert: true, new: true },\n ) as Promise<ICallLogSettingsDocument>;\n }\n\n async update(data: Partial<{\n availableTags: string[];\n availableCategories: string[];\n priorityLevels: IPriorityConfig[];\n defaultFollowUpDays: number;\n followUpReminderEnabled: boolean;\n defaultPipelineId: string;\n timelinePageSize: number;\n maxConcurrentCalls: number;\n metadata: Record<string, unknown>;\n }>): Promise<ICallLogSettingsDocument> {\n if (data.defaultFollowUpDays != null) {\n validateIntegerRange(data.defaultFollowUpDays, 'defaultFollowUpDays', 1, 30);\n }\n if (data.timelinePageSize != null) {\n validateIntegerRange(data.timelinePageSize, 'timelinePageSize', 5, 100);\n }\n if (data.maxConcurrentCalls != null) {\n validateIntegerRange(data.maxConcurrentCalls, 'maxConcurrentCalls', 1, 50);\n }\n\n const settings = await this.CallLogSettings.findOneAndUpdate(\n this.settingsFilter,\n { $set: data },\n { upsert: true, new: true },\n );\n this.logger.info('Call log settings updated', { fields: Object.keys(data) });\n return settings!;\n }\n}\n","import type { IPipelineStage } from '@astralibx/call-log-types';\nimport { InvalidPipelineError } from '../errors/index.js';\nimport { PIPELINE_DEFAULTS } from '../constants/index.js';\n\n/**\n * Validates a pipeline's stages array against all business rules.\n *\n * @param stages - The array of pipeline stages to validate.\n * @param pipelineId - Optional pipeline identifier used in error messages.\n * @throws InvalidPipelineError when any rule is violated.\n */\nexport function validatePipelineStages(stages: IPipelineStage[], pipelineId?: string): void {\n // Rule 1: Must have at least one stage\n if (stages.length === 0) {\n throw new InvalidPipelineError('Pipeline must have at least one stage', pipelineId);\n }\n\n // Rule 2 & 3: Must have exactly one default stage\n const defaultStages = stages.filter((s) => s.isDefault);\n if (defaultStages.length === 0) {\n throw new InvalidPipelineError(\n 'Pipeline must have exactly one default stage',\n pipelineId,\n );\n }\n if (defaultStages.length > 1) {\n throw new InvalidPipelineError(\n 'Pipeline must have exactly one default stage',\n pipelineId,\n );\n }\n\n // Rule 4: Must have at least one terminal stage\n const terminalStages = stages.filter((s) => s.isTerminal);\n if (terminalStages.length === 0) {\n throw new InvalidPipelineError(\n 'Pipeline must have at least one terminal stage',\n pipelineId,\n );\n }\n\n // Rule 5: Stage names must be unique\n const names = stages.map((s) => s.name);\n const uniqueNames = new Set(names);\n if (uniqueNames.size !== names.length) {\n throw new InvalidPipelineError(\n 'Stage names must be unique within a pipeline',\n pipelineId,\n );\n }\n\n // Rule 6: Cannot exceed max stages\n if (stages.length > PIPELINE_DEFAULTS.MaxStages) {\n throw new InvalidPipelineError(\n `Pipeline cannot have more than ${PIPELINE_DEFAULTS.MaxStages} stages`,\n pipelineId,\n );\n }\n}\n","import crypto from 'node:crypto';\nimport type { Model } from 'mongoose';\nimport type { LogAdapter } from '@astralibx/core';\nimport type { IPipelineStage } from '@astralibx/call-log-types';\nimport type { IPipelineDocument } from '../schemas/pipeline.schema.js';\nimport type { ICallLogDocument } from '../schemas/call-log.schema.js';\nimport {\n PipelineNotFoundError,\n StageNotFoundError,\n StageInUseError,\n InvalidPipelineError,\n} from '../errors/index.js';\nimport { validatePipelineStages } from '../validation/pipeline.validator.js';\n\n// ── Input types ───────────────────────────────────────────────────────────────\n\nexport interface CreatePipelineInput {\n name: string;\n description?: string;\n stages: Omit<IPipelineStage, 'stageId'>[];\n isDefault?: boolean;\n createdBy: string;\n tenantId?: string;\n metadata?: Record<string, unknown>;\n}\n\nexport interface UpdatePipelineInput {\n name?: string;\n description?: string;\n isActive?: boolean;\n isDefault?: boolean;\n metadata?: Record<string, unknown>;\n}\n\n// ── Service ───────────────────────────────────────────────────────────────────\n\nexport class PipelineService {\n constructor(\n private Pipeline: Model<IPipelineDocument>,\n private CallLog: Model<ICallLogDocument>,\n private logger: LogAdapter,\n private tenantId?: string,\n ) {}\n\n private get tenantFilter(): Record<string, unknown> {\n if (this.tenantId) return { tenantId: this.tenantId };\n return {};\n }\n\n async create(data: CreatePipelineInput): Promise<IPipelineDocument> {\n // Assign UUIDs to each stage\n const stages: IPipelineStage[] = data.stages.map((s) => ({\n ...s,\n stageId: crypto.randomUUID(),\n }));\n\n validatePipelineStages(stages);\n\n const pipelineId = crypto.randomUUID();\n\n // If this is marked as default, unset others\n if (data.isDefault) {\n await this.Pipeline.updateMany(\n { ...this.tenantFilter, isDefault: true },\n { $set: { isDefault: false } },\n );\n }\n\n const pipeline = await this.Pipeline.create({\n pipelineId,\n name: data.name,\n description: data.description,\n stages,\n isDefault: data.isDefault ?? false,\n isActive: true,\n isDeleted: false,\n createdBy: data.createdBy,\n ...(data.tenantId ? { tenantId: data.tenantId } : this.tenantId ? { tenantId: this.tenantId } : {}),\n metadata: data.metadata,\n });\n\n this.logger.info('Pipeline created', { pipelineId, name: data.name });\n return pipeline;\n }\n\n async update(pipelineId: string, data: UpdatePipelineInput): Promise<IPipelineDocument> {\n const pipeline = await this.Pipeline.findOne({ pipelineId, isDeleted: false, ...this.tenantFilter });\n if (!pipeline) throw new PipelineNotFoundError(pipelineId);\n\n // If setting as default, unset others\n if (data.isDefault) {\n await this.Pipeline.updateMany(\n { ...this.tenantFilter, isDefault: true, pipelineId: { $ne: pipelineId } },\n { $set: { isDefault: false } },\n );\n }\n\n const updated = await this.Pipeline.findOneAndUpdate(\n { pipelineId, isDeleted: false },\n { $set: data },\n { new: true },\n );\n\n if (!updated) throw new PipelineNotFoundError(pipelineId);\n this.logger.info('Pipeline updated', { pipelineId, fields: Object.keys(data) });\n return updated;\n }\n\n async delete(pipelineId: string): Promise<void> {\n const pipeline = await this.Pipeline.findOne({ pipelineId, isDeleted: false, ...this.tenantFilter });\n if (!pipeline) throw new PipelineNotFoundError(pipelineId);\n\n const activeCallCount = await this.CallLog.countDocuments({ pipelineId, isClosed: false });\n if (activeCallCount > 0) {\n throw new InvalidPipelineError(`Cannot delete pipeline with ${activeCallCount} active (non-closed) calls`, pipelineId);\n }\n\n await this.Pipeline.findOneAndUpdate(\n { pipelineId, ...this.tenantFilter },\n { $set: { isDeleted: true, isActive: false } },\n );\n\n this.logger.info('Pipeline deleted', { pipelineId });\n }\n\n async list(filter?: { isActive?: boolean }): Promise<IPipelineDocument[]> {\n const query: Record<string, unknown> = { isDeleted: false, ...this.tenantFilter };\n if (filter?.isActive !== undefined) {\n query.isActive = filter.isActive;\n }\n return this.Pipeline.find(query).sort({ createdAt: 1 });\n }\n\n async get(pipelineId: string): Promise<IPipelineDocument> {\n const pipeline = await this.Pipeline.findOne({ pipelineId, isDeleted: false, ...this.tenantFilter });\n if (!pipeline) throw new PipelineNotFoundError(pipelineId);\n return pipeline;\n }\n\n async addStage(pipelineId: string, stage: Omit<IPipelineStage, 'stageId'>): Promise<IPipelineDocument> {\n const pipeline = await this.get(pipelineId);\n\n const newStage: IPipelineStage = {\n ...stage,\n stageId: crypto.randomUUID(),\n };\n\n const updatedStages = [...pipeline.stages, newStage];\n validatePipelineStages(updatedStages, pipelineId);\n\n const updated = await this.Pipeline.findOneAndUpdate(\n { pipelineId },\n { $push: { stages: newStage } },\n { new: true },\n );\n\n if (!updated) throw new PipelineNotFoundError(pipelineId);\n this.logger.info('Stage added to pipeline', { pipelineId, stageId: newStage.stageId });\n return updated;\n }\n\n async removeStage(pipelineId: string, stageId: string): Promise<IPipelineDocument> {\n const pipeline = await this.get(pipelineId);\n\n const stageExists = pipeline.stages.some((s) => s.stageId === stageId);\n if (!stageExists) throw new StageNotFoundError(pipelineId, stageId);\n\n const activeCallCount = await this.CallLog.countDocuments({ pipelineId, currentStageId: stageId, isClosed: false });\n if (activeCallCount > 0) {\n throw new StageInUseError(pipelineId, stageId, activeCallCount);\n }\n\n const updatedStages = pipeline.stages.filter((s) => s.stageId !== stageId);\n validatePipelineStages(updatedStages, pipelineId);\n\n const updated = await this.Pipeline.findOneAndUpdate(\n { pipelineId },\n { $pull: { stages: { stageId } } },\n { new: true },\n );\n\n if (!updated) throw new PipelineNotFoundError(pipelineId);\n this.logger.info('Stage removed from pipeline', { pipelineId, stageId });\n return updated;\n }\n\n async updateStage(\n pipelineId: string,\n stageId: string,\n data: Partial<IPipelineStage>,\n ): Promise<IPipelineDocument> {\n const pipeline = await this.get(pipelineId);\n\n const stageIndex = pipeline.stages.findIndex((s) => s.stageId === stageId);\n if (stageIndex === -1) throw new StageNotFoundError(pipelineId, stageId);\n\n // Build updated stages array for validation\n const updatedStages = pipeline.stages.map((s) => {\n const plain = (s as unknown as { toObject?(): IPipelineStage }).toObject?.() ?? s;\n if (s.stageId === stageId) {\n return { ...plain, ...data, stageId };\n }\n return plain;\n }) as IPipelineStage[];\n\n validatePipelineStages(updatedStages, pipelineId);\n\n // Build dotted path $set for the specific stage array element\n const setFields: Record<string, unknown> = {};\n for (const [key, value] of Object.entries(data)) {\n if (key !== 'stageId') {\n setFields[`stages.${stageIndex}.${key}`] = value;\n }\n }\n\n const updated = await this.Pipeline.findOneAndUpdate(\n { pipelineId },\n { $set: setFields },\n { new: true },\n );\n\n if (!updated) throw new PipelineNotFoundError(pipelineId);\n this.logger.info('Stage updated in pipeline', { pipelineId, stageId, fields: Object.keys(data) });\n return updated;\n }\n\n async reorderStages(pipelineId: string, stageIds: string[]): Promise<IPipelineDocument> {\n const pipeline = await this.get(pipelineId);\n\n // Validate all stageIds exist\n const existingIds = new Set(pipeline.stages.map((s) => s.stageId));\n for (const id of stageIds) {\n if (!existingIds.has(id)) throw new StageNotFoundError(pipelineId, id);\n }\n\n if (stageIds.length !== pipeline.stages.length) {\n throw new InvalidPipelineError(\n `reorderStages must include all ${pipeline.stages.length} stage IDs`,\n pipelineId,\n );\n }\n\n // Build reordered stages with updated order fields\n const stageMap = new Map(pipeline.stages.map((s) => [s.stageId, s]));\n const reorderedStages: IPipelineStage[] = stageIds.map((id, index) => {\n const s = stageMap.get(id)!;\n const plain = (s as unknown as { toObject?(): IPipelineStage }).toObject?.() ?? s;\n return { ...plain, order: index + 1 };\n });\n\n validatePipelineStages(reorderedStages, pipelineId);\n\n const updated = await this.Pipeline.findOneAndUpdate(\n { pipelineId },\n { $set: { stages: reorderedStages } },\n { new: true },\n );\n\n if (!updated) throw new PipelineNotFoundError(pipelineId);\n this.logger.info('Stages reordered in pipeline', { pipelineId });\n return updated;\n }\n}\n","import crypto from 'node:crypto';\nimport type { Model } from 'mongoose';\nimport type { LogAdapter } from '@astralibx/core';\nimport type { ITimelineEntry } from '@astralibx/call-log-types';\nimport { TimelineEntryType } from '@astralibx/call-log-types';\nimport type { ICallLogDocument } from '../schemas/call-log.schema.js';\nimport type { ResolvedOptions } from '@astralibx/call-log-types';\nimport { CallLogNotFoundError, CallLogClosedError } from '../errors/index.js';\n\n// ── Service ───────────────────────────────────────────────────────────────────\n\nexport class TimelineService {\n constructor(\n private CallLog: Model<ICallLogDocument>,\n private logger: LogAdapter,\n private options: ResolvedOptions,\n ) {}\n\n async addNote(\n callLogId: string,\n content: string,\n authorId: string,\n authorName: string,\n ): Promise<ITimelineEntry> {\n const callLog = await this.CallLog.findOne({ callLogId });\n if (!callLog) throw new CallLogNotFoundError(callLogId);\n if (callLog.isClosed) throw new CallLogClosedError(callLogId, 'add note');\n\n const entry: ITimelineEntry = {\n entryId: crypto.randomUUID(),\n type: TimelineEntryType.Note,\n content,\n authorId,\n authorName,\n createdAt: new Date(),\n };\n\n await this.CallLog.updateOne(\n { callLogId },\n {\n $push: {\n timeline: {\n $each: [entry],\n $slice: -this.options.maxTimelineEntries,\n },\n },\n },\n );\n\n this.logger.info('Note added to call log', { callLogId, entryId: entry.entryId });\n return entry;\n }\n\n async addSystemEntry(callLogId: string, content: string): Promise<ITimelineEntry> {\n const callLog = await this.CallLog.findOne({ callLogId });\n if (!callLog) throw new CallLogNotFoundError(callLogId);\n\n const entry: ITimelineEntry = {\n entryId: crypto.randomUUID(),\n type: TimelineEntryType.System,\n content,\n createdAt: new Date(),\n };\n\n await this.CallLog.updateOne(\n { callLogId },\n {\n $push: {\n timeline: {\n $each: [entry],\n $slice: -this.options.maxTimelineEntries,\n },\n },\n },\n );\n\n this.logger.info('System entry added to call log', { callLogId, entryId: entry.entryId });\n return entry;\n }\n\n async getTimeline(\n callLogId: string,\n pagination: { page: number; limit: number },\n ): Promise<{ entries: ITimelineEntry[]; total: number }> {\n const callLog = await this.CallLog.findOne({ callLogId });\n if (!callLog) throw new CallLogNotFoundError(callLogId);\n\n const total = callLog.timeline.length;\n const { page, limit } = pagination;\n const skip = (page - 1) * limit;\n\n // Return in reverse chronological order (newest first), paginated\n const reversed = [...callLog.timeline].reverse();\n const entries = reversed.slice(skip, skip + limit) as ITimelineEntry[];\n\n return { entries, total };\n }\n\n async getContactTimeline(\n externalId: string,\n pagination: { page: number; limit: number },\n ): Promise<{ entries: (ITimelineEntry & { callLogId: string })[]; total: number }> {\n const { page, limit } = pagination;\n const skip = (page - 1) * limit;\n\n const countResult = await this.CallLog.aggregate<{ total: number }>([\n { $match: { 'contactRef.externalId': externalId } },\n { $unwind: '$timeline' },\n { $count: 'total' },\n ]);\n const total = countResult[0]?.total ?? 0;\n\n const results = await this.CallLog.aggregate<ITimelineEntry & { callLogId: string }>([\n { $match: { 'contactRef.externalId': externalId } },\n { $unwind: '$timeline' },\n { $sort: { 'timeline.createdAt': -1 } },\n { $skip: skip },\n { $limit: limit },\n {\n $addFields: {\n 'timeline.callLogId': '$callLogId',\n },\n },\n { $replaceRoot: { newRoot: '$timeline' } },\n ]);\n\n this.logger.info('Contact timeline fetched', { externalId, total, page, limit });\n return { entries: results, total };\n }\n}\n","import crypto from 'node:crypto';\nimport type { Model } from 'mongoose';\nimport type { LogAdapter } from '@astralibx/core';\nimport type {\n ICallLog,\n ITimelineEntry,\n ResolvedOptions,\n CallLogEngineConfig,\n DateRange,\n} from '@astralibx/call-log-types';\nimport { TimelineEntryType, CallPriority } from '@astralibx/call-log-types';\nimport type { ICallLogDocument } from '../schemas/call-log.schema.js';\nimport type { IPipelineDocument } from '../schemas/pipeline.schema.js';\nimport type { TimelineService } from './timeline.service.js';\nimport { CallLogNotFoundError, CallLogClosedError, PipelineNotFoundError } from '../errors/index.js';\nimport { SYSTEM_TIMELINE, SYSTEM_TIMELINE_FN } from '../constants/index.js';\n\n// ── Input types ───────────────────────────────────────────────────────────────\n\nexport interface CreateCallLogInput {\n pipelineId: string;\n contactRef: ICallLog['contactRef'];\n direction: ICallLog['direction'];\n channel: string;\n outcome: string;\n callDate?: Date | string;\n agentId: string;\n priority?: ICallLog['priority'];\n tags?: string[];\n category?: string;\n nextFollowUpDate?: Date;\n durationMinutes?: number;\n isFollowUp?: boolean;\n tenantId?: string;\n metadata?: Record<string, unknown>;\n}\n\nexport interface UpdateCallLogInput {\n priority?: ICallLog['priority'];\n tags?: string[];\n category?: string;\n nextFollowUpDate?: Date;\n durationMinutes?: number;\n channel?: string;\n outcome?: string;\n isFollowUp?: boolean;\n}\n\nexport interface ListCallLogsFilter {\n pipelineId?: string;\n currentStageId?: string;\n agentId?: string;\n tags?: string[];\n category?: string;\n isClosed?: boolean;\n includeDeleted?: boolean;\n contactExternalId?: string;\n contactName?: string;\n contactPhone?: string;\n contactEmail?: string;\n priority?: ICallLog['priority'];\n direction?: ICallLog['direction'];\n channel?: string;\n outcome?: string;\n isFollowUp?: boolean;\n dateRange?: DateRange;\n page?: number;\n limit?: number;\n sort?: Record<string, 1 | -1>;\n}\n\nexport interface ListCallLogsResult {\n callLogs: ICallLogDocument[];\n total: number;\n page: number;\n limit: number;\n}\n\nexport interface BulkChangeStageResult {\n succeeded: string[];\n failed: { callLogId: string; error: string }[];\n total: number;\n}\n\ntype ResolvedHooks = NonNullable<CallLogEngineConfig['hooks']>;\n\n// ── Service ───────────────────────────────────────────────────────────────────\n\nexport class CallLogService {\n constructor(\n private CallLog: Model<ICallLogDocument>,\n private Pipeline: Model<IPipelineDocument>,\n private timeline: TimelineService,\n private logger: LogAdapter,\n private hooks: ResolvedHooks,\n private options: ResolvedOptions,\n ) {}\n\n async create(data: CreateCallLogInput): Promise<ICallLogDocument> {\n const pipeline = await this.Pipeline.findOne({ pipelineId: data.pipelineId, isDeleted: false });\n if (!pipeline) throw new PipelineNotFoundError(data.pipelineId);\n\n const defaultStage = pipeline.stages.find((s) => s.isDefault);\n if (!defaultStage) throw new PipelineNotFoundError(data.pipelineId);\n\n const callLogId = crypto.randomUUID();\n\n const initialEntry: ITimelineEntry = {\n entryId: crypto.randomUUID(),\n type: TimelineEntryType.System,\n content: SYSTEM_TIMELINE.CallCreated,\n createdAt: new Date(),\n };\n\n const timelineEntries: ITimelineEntry[] = [initialEntry];\n\n // If this is a follow-up call, add a system timeline entry\n if (data.isFollowUp) {\n const followUpEntry: ITimelineEntry = {\n entryId: crypto.randomUUID(),\n type: TimelineEntryType.System,\n content: SYSTEM_TIMELINE_FN.followUpCallCreated(),\n createdAt: new Date(),\n };\n timelineEntries.push(followUpEntry);\n }\n\n const callLog = await this.CallLog.create({\n callLogId,\n pipelineId: data.pipelineId,\n currentStageId: defaultStage.stageId,\n contactRef: data.contactRef,\n direction: data.direction,\n callDate: data.callDate ? new Date(data.callDate) : new Date(),\n agentId: data.agentId,\n priority: data.priority ?? CallPriority.Medium,\n tags: data.tags ?? [],\n category: data.category,\n nextFollowUpDate: data.nextFollowUpDate,\n durationMinutes: data.durationMinutes,\n channel: data.channel,\n outcome: data.outcome,\n isFollowUp: data.isFollowUp ?? false,\n timeline: timelineEntries,\n stageHistory: [],\n isClosed: false,\n ...(data.tenantId ? { tenantId: data.tenantId } : {}),\n metadata: data.metadata,\n });\n\n this.logger.info('Call log created', { callLogId, pipelineId: data.pipelineId });\n\n if (this.hooks.onCallCreated) {\n await this.hooks.onCallCreated(callLog as unknown as ICallLog);\n }\n\n return callLog;\n }\n\n async update(callLogId: string, data: UpdateCallLogInput): Promise<ICallLogDocument> {\n const callLog = await this.CallLog.findOne({ callLogId });\n if (!callLog) throw new CallLogNotFoundError(callLogId);\n if (callLog.isClosed) throw new CallLogClosedError(callLogId, 'update');\n\n const setFields: Record<string, unknown> = {};\n const pushEntries: ITimelineEntry[] = [];\n\n if (data.priority !== undefined) setFields.priority = data.priority;\n if (data.tags !== undefined) setFields.tags = data.tags;\n if (data.category !== undefined) setFields.category = data.category;\n if (data.durationMinutes !== undefined) setFields.durationMinutes = data.durationMinutes;\n if (data.channel !== undefined) setFields.channel = data.channel;\n if (data.outcome !== undefined) setFields.outcome = data.outcome;\n if (data.isFollowUp !== undefined) setFields.isFollowUp = data.isFollowUp;\n\n if (data.nextFollowUpDate !== undefined) {\n const prevDate = callLog.nextFollowUpDate?.toISOString();\n const newDate = data.nextFollowUpDate?.toISOString();\n if (prevDate !== newDate) {\n setFields.nextFollowUpDate = data.nextFollowUpDate;\n if (data.nextFollowUpDate) {\n const followUpEntry: ITimelineEntry = {\n entryId: crypto.randomUUID(),\n type: TimelineEntryType.FollowUpSet,\n content: SYSTEM_TIMELINE_FN.followUpSet(new Date(data.nextFollowUpDate).toISOString()),\n createdAt: new Date(),\n };\n pushEntries.push(followUpEntry);\n }\n }\n }\n\n const updateOp: Record<string, unknown> = { $set: setFields };\n if (pushEntries.length > 0) {\n updateOp.$push = {\n timeline: {\n $each: pushEntries,\n $slice: -this.options.maxTimelineEntries,\n },\n };\n }\n\n const updated = await this.CallLog.findOneAndUpdate(\n { callLogId },\n updateOp,\n { new: true },\n );\n\n if (!updated) throw new CallLogNotFoundError(callLogId);\n this.logger.info('Call log updated', { callLogId, fields: Object.keys(data) });\n return updated;\n }\n\n async list(filter: ListCallLogsFilter = {}): Promise<ListCallLogsResult> {\n const query: Record<string, unknown> = {};\n\n if (filter.pipelineId) query.pipelineId = filter.pipelineId;\n if (filter.currentStageId) query.currentStageId = filter.currentStageId;\n if (filter.agentId) query.agentId = filter.agentId;\n if (filter.tags && filter.tags.length > 0) query.tags = { $in: filter.tags };\n if (filter.category) query.category = filter.category;\n if (filter.isClosed !== undefined) query.isClosed = filter.isClosed;\n if (filter.contactExternalId) query['contactRef.externalId'] = filter.contactExternalId;\n if (filter.contactName) query['contactRef.displayName'] = { $regex: filter.contactName, $options: 'i' };\n if (filter.contactPhone) query['contactRef.phone'] = { $regex: `^${filter.contactPhone}` };\n if (filter.contactEmail) query['contactRef.email'] = filter.contactEmail;\n if (filter.priority) query.priority = filter.priority;\n if (filter.direction) query.direction = filter.direction;\n if (filter.channel) query.channel = filter.channel;\n if (filter.outcome) query.outcome = filter.outcome;\n if (filter.isFollowUp !== undefined) query.isFollowUp = filter.isFollowUp;\n\n // Exclude deleted by default unless includeDeleted is explicitly true\n if (!filter.includeDeleted) query.isDeleted = { $ne: true };\n\n if (filter.dateRange?.from || filter.dateRange?.to) {\n const dateFilter: Record<string, unknown> = {};\n if (filter.dateRange.from) dateFilter.$gte = new Date(filter.dateRange.from);\n if (filter.dateRange.to) dateFilter.$lte = new Date(filter.dateRange.to);\n query.callDate = dateFilter;\n }\n\n const page = filter.page ?? 1;\n const limit = filter.limit ?? 20;\n const skip = (page - 1) * limit;\n const sort = filter.sort ?? { callDate: -1 };\n\n const [callLogs, total] = await Promise.all([\n this.CallLog.find(query).sort(sort).skip(skip).limit(limit),\n this.CallLog.countDocuments(query),\n ]);\n\n return { callLogs, total, page, limit };\n }\n\n async get(callLogId: string): Promise<ICallLogDocument> {\n const callLog = await this.CallLog.findOne({ callLogId, isDeleted: { $ne: true } });\n if (!callLog) throw new CallLogNotFoundError(callLogId);\n return callLog;\n }\n\n async getByContact(externalId: string): Promise<ICallLogDocument[]> {\n return this.CallLog.find({ 'contactRef.externalId': externalId, isDeleted: { $ne: true } }).sort({ callDate: -1 });\n }\n}\n","import crypto from 'node:crypto';\nimport type { Model } from 'mongoose';\nimport type { LogAdapter } from '@astralibx/core';\nimport type {\n ICallLog,\n ITimelineEntry,\n IStageChange,\n ResolvedOptions,\n CallLogEngineConfig,\n DateRange,\n} from '@astralibx/call-log-types';\nimport { TimelineEntryType } from '@astralibx/call-log-types';\nimport type { ICallLogDocument } from '../schemas/call-log.schema.js';\nimport type { IPipelineDocument } from '../schemas/pipeline.schema.js';\nimport type { TimelineService } from './timeline.service.js';\nimport { CallLogNotFoundError, CallLogClosedError, PipelineNotFoundError, StageNotFoundError } from '../errors/index.js';\nimport { SYSTEM_TIMELINE, SYSTEM_TIMELINE_FN } from '../constants/index.js';\nimport type { BulkChangeStageResult } from './call-log.service.js';\n\n// ── Re-export for convenience ─────────────────────────────────────────────────\nexport type { BulkChangeStageResult };\n\ntype ResolvedHooks = NonNullable<CallLogEngineConfig['hooks']>;\n\n// ── Service ───────────────────────────────────────────────────────────────────\n\nexport class CallLogLifecycleService {\n constructor(\n private CallLog: Model<ICallLogDocument>,\n private Pipeline: Model<IPipelineDocument>,\n private timeline: TimelineService,\n private logger: LogAdapter,\n private hooks: ResolvedHooks,\n private options: ResolvedOptions,\n ) {}\n\n async changeStage(callLogId: string, newStageId: string, agentId: string): Promise<ICallLogDocument> {\n // First read current state for optimistic lock value and computation\n const callLog = await this.CallLog.findOne({ callLogId });\n if (!callLog) throw new CallLogNotFoundError(callLogId);\n if (callLog.isClosed) throw new CallLogClosedError(callLogId, 'change stage');\n\n const currentStageId = callLog.currentStageId;\n\n // Lookup pipeline and validate stages\n const pipeline = await this.Pipeline.findOne({ pipelineId: callLog.pipelineId, isDeleted: false });\n if (!pipeline) throw new PipelineNotFoundError(callLog.pipelineId);\n\n const currentStage = pipeline.stages.find((s) => s.stageId === currentStageId);\n if (!currentStage) throw new StageNotFoundError(callLog.pipelineId, currentStageId);\n\n const newStage = pipeline.stages.find((s) => s.stageId === newStageId);\n if (!newStage) throw new StageNotFoundError(callLog.pipelineId, newStageId);\n\n // Compute time in current stage\n const now = new Date();\n const lastHistory = callLog.stageHistory[callLog.stageHistory.length - 1];\n const stageStartTime = lastHistory?.changedAt?.getTime() ?? (callLog as unknown as { createdAt: Date }).createdAt?.getTime() ?? now.getTime();\n const timeInStageMs = now.getTime() - stageStartTime;\n\n const stageChangeEntry: ITimelineEntry = {\n entryId: crypto.randomUUID(),\n type: TimelineEntryType.StageChange,\n content: SYSTEM_TIMELINE_FN.stageChanged(currentStage.name, newStage.name),\n fromStageId: currentStageId,\n fromStageName: currentStage.name,\n toStageId: newStageId,\n toStageName: newStage.name,\n authorId: agentId,\n createdAt: now,\n };\n\n const stageHistoryEntry: IStageChange = {\n fromStageId: currentStageId,\n toStageId: newStageId,\n fromStageName: currentStage.name,\n toStageName: newStage.name,\n changedBy: agentId,\n changedAt: now,\n timeInStageMs,\n };\n\n const isTerminal = newStage.isTerminal;\n\n const closeFields: Record<string, unknown> = isTerminal\n ? { currentStageId: newStageId, isClosed: true, closedAt: now }\n : { currentStageId: newStageId };\n\n // Atomic update with optimistic concurrency check\n const result = await this.CallLog.findOneAndUpdate(\n { callLogId, currentStageId },\n {\n $set: closeFields,\n $push: {\n stageHistory: stageHistoryEntry,\n timeline: stageChangeEntry,\n },\n },\n { new: true },\n );\n\n if (!result) {\n // Concurrent change detected\n throw new CallLogClosedError(callLogId, 'change stage (concurrent modification detected)');\n }\n\n this.logger.info('Call log stage changed', { callLogId, from: currentStageId, to: newStageId });\n\n if (isTerminal && this.hooks.onCallClosed) {\n await this.hooks.onCallClosed(result as unknown as ICallLog);\n }\n\n if (this.hooks.onStageChanged) {\n await this.hooks.onStageChanged(result as unknown as ICallLog, currentStage.name, newStage.name);\n }\n\n return result;\n }\n\n async assign(callLogId: string, agentId: string, assignedBy: string): Promise<ICallLogDocument> {\n const callLog = await this.CallLog.findOne({ callLogId });\n if (!callLog) throw new CallLogNotFoundError(callLogId);\n\n const previousAgentId = callLog.agentId?.toString();\n\n const assignmentEntry: ITimelineEntry = {\n entryId: crypto.randomUUID(),\n type: TimelineEntryType.Assignment,\n content: previousAgentId\n ? SYSTEM_TIMELINE_FN.callReassigned(previousAgentId, agentId)\n : SYSTEM_TIMELINE_FN.callAssigned(agentId),\n toAgentId: agentId,\n fromAgentId: previousAgentId,\n authorId: assignedBy,\n createdAt: new Date(),\n };\n\n const updated = await this.CallLog.findOneAndUpdate(\n { callLogId },\n {\n $set: { agentId, assignedBy },\n $push: {\n timeline: {\n $each: [assignmentEntry],\n $slice: -this.options.maxTimelineEntries,\n },\n },\n },\n { new: true },\n );\n\n if (!updated) throw new CallLogNotFoundError(callLogId);\n this.logger.info('Call log assigned', { callLogId, agentId, assignedBy });\n\n if (this.hooks.onCallAssigned) {\n await this.hooks.onCallAssigned(updated as unknown as ICallLog, previousAgentId);\n }\n\n return updated;\n }\n\n async close(callLogId: string, agentId: string): Promise<ICallLogDocument> {\n const callLog = await this.CallLog.findOne({ callLogId });\n if (!callLog) throw new CallLogNotFoundError(callLogId);\n if (callLog.isClosed) throw new CallLogClosedError(callLogId, 'close');\n\n const now = new Date();\n const closeEntry: ITimelineEntry = {\n entryId: crypto.randomUUID(),\n type: TimelineEntryType.System,\n content: SYSTEM_TIMELINE.CallClosed,\n authorId: agentId,\n createdAt: now,\n };\n\n const updated = await this.CallLog.findOneAndUpdate(\n { callLogId },\n {\n $set: { isClosed: true, closedAt: now },\n $push: {\n timeline: {\n $each: [closeEntry],\n $slice: -this.options.maxTimelineEntries,\n },\n },\n },\n { new: true },\n );\n\n if (!updated) throw new CallLogNotFoundError(callLogId);\n this.logger.info('Call log closed', { callLogId, agentId });\n\n if (this.hooks.onCallClosed) {\n await this.hooks.onCallClosed(updated as unknown as ICallLog);\n }\n\n return updated;\n }\n\n async reopen(callLogId: string, agentId: string): Promise<ICallLogDocument> {\n const callLog = await this.CallLog.findOne({ callLogId });\n if (!callLog) throw new CallLogNotFoundError(callLogId);\n if (!callLog.isClosed) throw new CallLogClosedError(callLogId, 'reopen');\n\n const now = new Date();\n const reopenEntry: ITimelineEntry = {\n entryId: crypto.randomUUID(),\n type: TimelineEntryType.System,\n content: SYSTEM_TIMELINE.CallReopened,\n authorId: agentId,\n createdAt: now,\n };\n\n const updated = await this.CallLog.findOneAndUpdate(\n { callLogId },\n {\n $set: { isClosed: false, closedAt: undefined },\n $push: {\n timeline: {\n $each: [reopenEntry],\n $slice: -this.options.maxTimelineEntries,\n },\n },\n },\n { new: true },\n );\n\n if (!updated) throw new CallLogNotFoundError(callLogId);\n this.logger.info('Call log reopened', { callLogId, agentId });\n\n return updated;\n }\n\n async bulkChangeStage(\n callLogIds: string[],\n newStageId: string,\n agentId: string,\n ): Promise<BulkChangeStageResult> {\n const succeeded: string[] = [];\n const failed: { callLogId: string; error: string }[] = [];\n\n for (const callLogId of callLogIds) {\n try {\n await this.changeStage(callLogId, newStageId, agentId);\n succeeded.push(callLogId);\n } catch (err) {\n failed.push({\n callLogId,\n error: err instanceof Error ? err.message : String(err),\n });\n }\n }\n\n this.logger.info('Bulk stage change completed', {\n total: callLogIds.length,\n succeeded: succeeded.length,\n failed: failed.length,\n });\n\n return { succeeded, failed, total: callLogIds.length };\n }\n\n async getFollowUpsDue(agentId?: string, dateRange?: DateRange): Promise<ICallLogDocument[]> {\n const now = new Date();\n const query: Record<string, unknown> = {\n nextFollowUpDate: { $lte: now },\n isClosed: false,\n followUpNotifiedAt: null,\n isDeleted: { $ne: true },\n };\n\n if (agentId) query.agentId = agentId;\n\n if (dateRange?.from || dateRange?.to) {\n const dateFilter: Record<string, unknown> = {};\n if (dateRange.from) dateFilter.$gte = new Date(dateRange.from);\n if (dateRange.to) dateFilter.$lte = new Date(dateRange.to);\n // Override the nextFollowUpDate filter to include the range\n query.nextFollowUpDate = { ...(query.nextFollowUpDate as object), ...dateFilter };\n }\n\n return this.CallLog.find(query).sort({ nextFollowUpDate: 1 });\n }\n\n async softDelete(callLogId: string, agentId?: string, agentName?: string): Promise<ICallLogDocument> {\n const callLog = await this.CallLog.findOne({ callLogId });\n if (!callLog) throw new CallLogNotFoundError(callLogId);\n\n const now = new Date();\n const deleteEntry: ITimelineEntry = {\n entryId: crypto.randomUUID(),\n type: TimelineEntryType.System,\n content: agentName\n ? SYSTEM_TIMELINE_FN.callDeleted(agentName)\n : SYSTEM_TIMELINE_FN.callDeleted(agentId ?? 'unknown'),\n authorId: agentId,\n createdAt: now,\n };\n\n const updated = await this.CallLog.findOneAndUpdate(\n { callLogId },\n {\n $set: { isDeleted: true, deletedAt: now },\n $push: {\n timeline: {\n $each: [deleteEntry],\n $slice: -this.options.maxTimelineEntries,\n },\n },\n },\n { new: true },\n );\n\n if (!updated) throw new CallLogNotFoundError(callLogId);\n this.logger.info('Call log soft deleted', { callLogId });\n return updated;\n }\n}\n","import type { Model } from 'mongoose';\nimport type { LogAdapter } from '@astralibx/core';\nimport type {\n AgentCallStats,\n DailyReport,\n OverallCallReport,\n DateRange,\n AgentInfo,\n DashboardStats,\n ChannelDistribution,\n OutcomeDistribution,\n} from '@astralibx/call-log-types';\nimport type { ICallLogDocument } from '../schemas/call-log.schema.js';\nimport type { IPipelineDocument } from '../schemas/pipeline.schema.js';\n\n// ── Internal aggregate result helpers ────────────────────────────────────────\n\ninterface AggIdCount {\n _id: string | number | null;\n count: number;\n}\n\ninterface AgentAggResult {\n _id: string;\n totalCalls: number;\n callsClosed: number;\n followUpsCompleted: number;\n overdueFollowUps: number;\n pipelineCounts: { pipelineId: string; count: number }[];\n}\n\ninterface WeeklySummary {\n week: string;\n year: number;\n totalCalls: number;\n closedCalls: number;\n}\n\nexport interface TeamStats {\n teamId: string | null;\n agentStats: AgentCallStats[];\n totalCalls: number;\n}\n\n// ── Service ───────────────────────────────────────────────────────────────────\n\nexport class AnalyticsService {\n constructor(\n private CallLog: Model<ICallLogDocument>,\n private Pipeline: Model<IPipelineDocument>,\n private logger: LogAdapter,\n private resolveAgent?: (agentId: string) => Promise<AgentInfo | null>,\n ) {}\n\n private async getAgentName(agentId: string): Promise<string> {\n if (!this.resolveAgent) return String(agentId);\n try {\n const agent = await this.resolveAgent(String(agentId));\n return agent?.displayName ?? String(agentId);\n } catch {\n return String(agentId);\n }\n }\n\n private buildDateMatch(dateRange: DateRange, field = 'callDate'): Record<string, unknown> {\n if (!dateRange.from && !dateRange.to) return {};\n const dateFilter: Record<string, unknown> = {};\n if (dateRange.from) dateFilter.$gte = new Date(dateRange.from);\n if (dateRange.to) dateFilter.$lte = new Date(dateRange.to);\n return { [field]: dateFilter };\n }\n\n async getAgentStats(agentId: string, dateRange: DateRange): Promise<AgentCallStats> {\n const now = new Date();\n const matchStage: Record<string, unknown> = {\n agentId,\n isDeleted: { $ne: true },\n ...this.buildDateMatch(dateRange),\n };\n\n const pipeline = [\n { $match: matchStage },\n {\n $group: {\n _id: '$agentId',\n totalCalls: { $sum: 1 },\n callsClosed: {\n $sum: { $cond: [{ $eq: ['$isClosed', true] }, 1, 0] },\n },\n followUpsCompleted: {\n $sum: {\n $cond: [\n {\n $and: [\n { $ne: ['$nextFollowUpDate', null] },\n { $eq: ['$isClosed', true] },\n ],\n },\n 1,\n 0,\n ],\n },\n },\n overdueFollowUps: {\n $sum: {\n $cond: [\n {\n $and: [\n { $ne: ['$nextFollowUpDate', null] },\n { $lt: ['$nextFollowUpDate', now] },\n { $eq: ['$isClosed', false] },\n ],\n },\n 1,\n 0,\n ],\n },\n },\n },\n },\n ];\n\n const [results, pipelineCounts] = await Promise.all([\n this.CallLog.aggregate<AgentAggResult>(pipeline),\n this.CallLog.aggregate<{ _id: string; count: number }>([\n { $match: matchStage },\n { $group: { _id: '$pipelineId', count: { $sum: 1 } } },\n ]),\n ]);\n\n const stat = results[0];\n const agentName = await this.getAgentName(agentId);\n if (!stat) {\n return {\n agentId,\n agentName,\n totalCalls: 0,\n avgCallsPerDay: 0,\n followUpsCompleted: 0,\n overdueFollowUps: 0,\n callsByPipeline: [],\n callsClosed: 0,\n closeRate: 0,\n };\n }\n\n // Compute avgCallsPerDay\n let avgCallsPerDay = 0;\n if (dateRange.from && dateRange.to) {\n const days = Math.max(\n 1,\n Math.ceil((new Date(dateRange.to).getTime() - new Date(dateRange.from).getTime()) / 86_400_000),\n );\n avgCallsPerDay = Math.round((stat.totalCalls / days) * 100) / 100;\n }\n\n const callsByPipeline = pipelineCounts.map((p) => ({\n pipelineId: p._id,\n pipelineName: p._id,\n count: p.count,\n }));\n\n return {\n agentId,\n agentName,\n totalCalls: stat.totalCalls,\n avgCallsPerDay,\n followUpsCompleted: stat.followUpsCompleted,\n overdueFollowUps: stat.overdueFollowUps,\n callsByPipeline,\n callsClosed: stat.callsClosed,\n closeRate: stat.totalCalls > 0\n ? Math.round((stat.callsClosed / stat.totalCalls) * 10000) / 100\n : 0,\n };\n }\n\n async getAgentLeaderboard(dateRange: DateRange): Promise<AgentCallStats[]> {\n const now = new Date();\n const matchStage: Record<string, unknown> = {\n isDeleted: { $ne: true },\n ...this.buildDateMatch(dateRange),\n };\n\n const pipeline = [\n { $match: matchStage },\n {\n $group: {\n _id: '$agentId',\n totalCalls: { $sum: 1 },\n callsClosed: {\n $sum: { $cond: [{ $eq: ['$isClosed', true] }, 1, 0] },\n },\n followUpsCompleted: {\n $sum: {\n $cond: [\n {\n $and: [\n { $ne: ['$nextFollowUpDate', null] },\n { $eq: ['$isClosed', true] },\n ],\n },\n 1,\n 0,\n ],\n },\n },\n overdueFollowUps: {\n $sum: {\n $cond: [\n {\n $and: [\n { $ne: ['$nextFollowUpDate', null] },\n { $lt: ['$nextFollowUpDate', now] },\n { $eq: ['$isClosed', false] },\n ],\n },\n 1,\n 0,\n ],\n },\n },\n },\n },\n { $sort: { totalCalls: -1 as const } },\n ];\n\n const results = await this.CallLog.aggregate<AgentAggResult>(pipeline);\n\n return Promise.all(results.map(async (stat) => ({\n agentId: String(stat._id),\n agentName: await this.getAgentName(String(stat._id)),\n totalCalls: stat.totalCalls,\n avgCallsPerDay: 0,\n followUpsCompleted: stat.followUpsCompleted,\n overdueFollowUps: stat.overdueFollowUps,\n callsByPipeline: [],\n callsClosed: stat.callsClosed,\n closeRate: stat.totalCalls > 0\n ? Math.round((stat.callsClosed / stat.totalCalls) * 10000) / 100\n : 0,\n })));\n }\n\n async getTeamStats(teamId?: string, dateRange: DateRange = {}): Promise<TeamStats> {\n const now = new Date();\n const matchStage: Record<string, unknown> = {\n isDeleted: { $ne: true },\n ...this.buildDateMatch(dateRange),\n };\n\n // Aggregate agent stats without filtering by team (team resolution requires external agent collection)\n const pipeline = [\n { $match: matchStage },\n {\n $group: {\n _id: '$agentId',\n totalCalls: { $sum: 1 },\n callsClosed: {\n $sum: { $cond: [{ $eq: ['$isClosed', true] }, 1, 0] },\n },\n followUpsCompleted: {\n $sum: {\n $cond: [\n {\n $and: [\n { $ne: ['$nextFollowUpDate', null] },\n { $eq: ['$isClosed', true] },\n ],\n },\n 1,\n 0,\n ],\n },\n },\n overdueFollowUps: {\n $sum: {\n $cond: [\n {\n $and: [\n { $ne: ['$nextFollowUpDate', null] },\n { $lt: ['$nextFollowUpDate', now] },\n { $eq: ['$isClosed', false] },\n ],\n },\n 1,\n 0,\n ],\n },\n },\n },\n },\n ];\n\n const results = await this.CallLog.aggregate<AgentAggResult>(pipeline);\n\n const agentStats: AgentCallStats[] = await Promise.all(results.map(async (stat) => ({\n agentId: String(stat._id),\n agentName: await this.getAgentName(String(stat._id)),\n totalCalls: stat.totalCalls,\n avgCallsPerDay: 0,\n followUpsCompleted: stat.followUpsCompleted,\n overdueFollowUps: stat.overdueFollowUps,\n callsByPipeline: [],\n callsClosed: stat.callsClosed,\n closeRate: stat.totalCalls > 0\n ? Math.round((stat.callsClosed / stat.totalCalls) * 10000) / 100\n : 0,\n })));\n\n const totalCalls = agentStats.reduce((sum, a) => sum + a.totalCalls, 0);\n\n return { teamId: teamId ?? null, agentStats, totalCalls };\n }\n\n async getDailyReport(dateRange: DateRange, agentId?: string): Promise<DailyReport[]> {\n const matchStage: Record<string, unknown> = {\n isDeleted: { $ne: true },\n ...this.buildDateMatch(dateRange),\n };\n if (agentId) matchStage['agentId'] = agentId;\n\n const [dailyAgg, directionAgg, pipelineAgg, agentAgg] = await Promise.all([\n this.CallLog.aggregate<{ _id: string; count: number }>([\n { $match: matchStage },\n {\n $group: {\n _id: { $dateToString: { format: '%Y-%m-%d', date: '$callDate' } },\n count: { $sum: 1 },\n },\n },\n { $sort: { _id: 1 as const } },\n ]),\n this.CallLog.aggregate<{ _id: { date: string; direction: string }; count: number }>([\n { $match: matchStage },\n {\n $group: {\n _id: {\n date: { $dateToString: { format: '%Y-%m-%d', date: '$callDate' } },\n direction: '$direction',\n },\n count: { $sum: 1 },\n },\n },\n ]),\n this.CallLog.aggregate<{ _id: { date: string; pipelineId: string }; count: number }>([\n { $match: matchStage },\n {\n $group: {\n _id: {\n date: { $dateToString: { format: '%Y-%m-%d', date: '$callDate' } },\n pipelineId: '$pipelineId',\n },\n count: { $sum: 1 },\n },\n },\n ]),\n this.CallLog.aggregate<{ _id: { date: string; agentId: string }; count: number }>([\n { $match: matchStage },\n {\n $group: {\n _id: {\n date: { $dateToString: { format: '%Y-%m-%d', date: '$callDate' } },\n agentId: { $toString: '$agentId' },\n },\n count: { $sum: 1 },\n },\n },\n ]),\n ]);\n\n // Build lookup maps\n const directionByDate = new Map<string, { direction: string; count: number }[]>();\n for (const r of directionAgg) {\n const date = r._id.date;\n if (!directionByDate.has(date)) directionByDate.set(date, []);\n directionByDate.get(date)!.push({ direction: r._id.direction, count: r.count });\n }\n\n const pipelineByDate = new Map<string, { pipelineId: string; pipelineName: string; count: number }[]>();\n for (const r of pipelineAgg) {\n const date = r._id.date;\n if (!pipelineByDate.has(date)) pipelineByDate.set(date, []);\n pipelineByDate.get(date)!.push({ pipelineId: r._id.pipelineId, pipelineName: r._id.pipelineId, count: r.count });\n }\n\n const agentByDate = new Map<string, { agentId: string; agentName: string; count: number }[]>();\n await Promise.all(agentAgg.map(async (r) => {\n const date = r._id.date;\n if (!agentByDate.has(date)) agentByDate.set(date, []);\n const agentName = await this.getAgentName(r._id.agentId);\n agentByDate.get(date)!.push({ agentId: r._id.agentId, agentName, count: r.count });\n }));\n\n return dailyAgg.map((d) => ({\n date: d._id,\n total: d.count,\n byDirection: directionByDate.get(d._id) ?? [],\n byPipeline: pipelineByDate.get(d._id) ?? [],\n byAgent: agentByDate.get(d._id) ?? [],\n }));\n }\n\n async getDashboardStats(): Promise<DashboardStats> {\n const now = new Date();\n const midnight = new Date(now.getFullYear(), now.getMonth(), now.getDate());\n\n const [openCalls, closedToday, overdueFollowUps, callsToday] = await Promise.all([\n this.CallLog.countDocuments({ isClosed: false, isDeleted: { $ne: true } }),\n this.CallLog.countDocuments({ closedAt: { $gte: midnight }, isDeleted: { $ne: true } }),\n this.CallLog.countDocuments({\n nextFollowUpDate: { $lt: now },\n isClosed: false,\n isDeleted: { $ne: true },\n }),\n this.CallLog.countDocuments({ callDate: { $gte: midnight }, isDeleted: { $ne: true } }),\n ]);\n\n return {\n openCalls,\n closedToday,\n overdueFollowUps,\n totalAgents: 0,\n callsToday,\n };\n }\n\n async getWeeklyTrends(weeks: number): Promise<WeeklySummary[]> {\n const now = new Date();\n const from = new Date(now.getTime() - weeks * 7 * 24 * 60 * 60 * 1000);\n\n const results = await this.CallLog.aggregate<WeeklySummary>([\n { $match: { callDate: { $gte: from, $lte: now }, isDeleted: { $ne: true } } },\n {\n $group: {\n _id: {\n week: { $isoWeek: '$callDate' },\n year: { $isoWeekYear: '$callDate' },\n },\n totalCalls: { $sum: 1 },\n closedCalls: {\n $sum: { $cond: [{ $eq: ['$isClosed', true] }, 1, 0] },\n },\n },\n },\n { $sort: { '_id.year': 1 as const, '_id.week': 1 as const } },\n {\n $project: {\n _id: 0,\n week: { $toString: '$_id.week' },\n year: '$_id.year',\n totalCalls: 1,\n closedCalls: 1,\n },\n },\n ]);\n\n return results;\n }\n\n async getOverallReport(dateRange: DateRange): Promise<OverallCallReport> {\n const matchStage: Record<string, unknown> = {\n isDeleted: { $ne: true },\n ...this.buildDateMatch(dateRange),\n };\n\n const [summaryAgg, tagAgg, categoryAgg, peakHoursAgg, followUpAgg, channelAgg, outcomeAgg] = await Promise.all([\n this.CallLog.aggregate<{\n _id: null;\n totalCalls: number;\n closedCalls: number;\n avgTimeToCloseMs: number;\n }>([\n { $match: matchStage },\n {\n $group: {\n _id: null,\n totalCalls: { $sum: 1 },\n closedCalls: {\n $sum: { $cond: [{ $eq: ['$isClosed', true] }, 1, 0] },\n },\n avgTimeToCloseMs: {\n $avg: {\n $cond: [\n { $and: [{ $eq: ['$isClosed', true] }, { $ne: ['$closedAt', null] }] },\n { $subtract: ['$closedAt', '$createdAt'] },\n null,\n ],\n },\n },\n },\n },\n ]),\n this.CallLog.aggregate<AggIdCount>([\n { $match: { ...matchStage, tags: { $exists: true, $ne: [] } } },\n { $unwind: '$tags' },\n { $group: { _id: '$tags', count: { $sum: 1 } } },\n { $sort: { count: -1 as const } },\n ]),\n this.CallLog.aggregate<AggIdCount>([\n { $match: { ...matchStage, category: { $exists: true, $ne: null } } },\n { $group: { _id: '$category', count: { $sum: 1 } } },\n { $sort: { count: -1 as const } },\n ]),\n this.CallLog.aggregate<AggIdCount>([\n { $match: matchStage },\n { $group: { _id: { $hour: '$callDate' }, count: { $sum: 1 } } },\n { $sort: { _id: 1 as const } },\n ]),\n this.CallLog.aggregate<{ _id: null; total: number; withFollowUp: number; completed: number }>([\n { $match: matchStage },\n {\n $group: {\n _id: null,\n total: { $sum: 1 },\n withFollowUp: {\n $sum: { $cond: [{ $eq: ['$isFollowUp', true] }, 1, 0] },\n },\n completed: {\n $sum: {\n $cond: [\n {\n $and: [\n { $eq: ['$isFollowUp', true] },\n { $eq: ['$isClosed', true] },\n ],\n },\n 1,\n 0,\n ],\n },\n },\n },\n },\n ]),\n this.CallLog.aggregate<AggIdCount>([\n { $match: matchStage },\n { $group: { _id: '$channel', count: { $sum: 1 } } },\n { $sort: { count: -1 as const } },\n ]),\n this.CallLog.aggregate<AggIdCount>([\n { $match: matchStage },\n { $group: { _id: '$outcome', count: { $sum: 1 } } },\n { $sort: { count: -1 as const } },\n ]),\n ]);\n\n const summary = summaryAgg[0] ?? { totalCalls: 0, closedCalls: 0, avgTimeToCloseMs: 0 };\n const followUp = followUpAgg[0] ?? { total: 0, withFollowUp: 0, completed: 0 };\n\n const followUpComplianceRate = followUp.withFollowUp > 0\n ? Math.round((followUp.completed / followUp.withFollowUp) * 10000) / 100\n : 0;\n\n const followUpCalls = followUp.withFollowUp;\n const followUpRatio =\n followUp.total > 0 ? Math.round((followUp.withFollowUp / followUp.total) * 10000) / 100 : 0;\n\n const channelDistribution: ChannelDistribution[] = channelAgg.map((r) => ({\n channel: r._id != null ? String(r._id) : 'unknown',\n count: r.count,\n }));\n\n const outcomeDistribution: OutcomeDistribution[] = outcomeAgg.map((r) => ({\n outcome: r._id != null ? String(r._id) : 'unknown',\n count: r.count,\n }));\n\n return {\n totalCalls: summary.totalCalls,\n closedCalls: summary.closedCalls,\n avgTimeToCloseMs: Math.round(summary.avgTimeToCloseMs ?? 0),\n followUpComplianceRate,\n tagDistribution: tagAgg.map((r) => ({ tag: String(r._id), count: r.count })),\n categoryDistribution: categoryAgg.map((r) => ({ category: String(r._id), count: r.count })),\n peakCallHours: peakHoursAgg.map((r) => ({ hour: Number(r._id), count: r.count })),\n channelDistribution,\n outcomeDistribution,\n followUpCalls,\n followUpRatio,\n };\n }\n}\n","import type { Model } from 'mongoose';\nimport type { LogAdapter } from '@astralibx/core';\nimport type {\n PipelineReport,\n PipelineFunnel,\n DateRange,\n AgentInfo,\n ChannelDistribution,\n OutcomeDistribution,\n FollowUpStats,\n} from '@astralibx/call-log-types';\nimport type { ICallLogDocument } from '../schemas/call-log.schema.js';\nimport type { IPipelineDocument } from '../schemas/pipeline.schema.js';\n\n// ── Internal aggregate result helpers ────────────────────────────────────────\n\ninterface AggIdCount {\n _id: string | number | null;\n count: number;\n}\n\ninterface PipelineStageAggResult {\n stageId: string;\n count: number;\n totalTimeMs: number;\n}\n\n// ── Service ───────────────────────────────────────────────────────────────────\n\nexport class PipelineAnalyticsService {\n constructor(\n private CallLog: Model<ICallLogDocument>,\n private Pipeline: Model<IPipelineDocument>,\n private logger: LogAdapter,\n private resolveAgent?: (agentId: string) => Promise<AgentInfo | null>,\n private tenantId?: string,\n ) {}\n\n private buildDateMatch(dateRange: DateRange, field = 'callDate'): Record<string, unknown> {\n if (!dateRange.from && !dateRange.to) return {};\n const dateFilter: Record<string, unknown> = {};\n if (dateRange.from) dateFilter.$gte = new Date(dateRange.from);\n if (dateRange.to) dateFilter.$lte = new Date(dateRange.to);\n return { [field]: dateFilter };\n }\n\n async getPipelineStats(pipelineId: string, dateRange: DateRange): Promise<PipelineReport> {\n const pipeline = await this.Pipeline.findOne({ pipelineId, isDeleted: false });\n const pipelineName = pipeline?.name ?? pipelineId;\n const stages = pipeline?.stages ?? [];\n\n const matchStage: Record<string, unknown> = {\n pipelineId,\n isDeleted: { $ne: true },\n ...this.buildDateMatch(dateRange),\n };\n\n const [totalResult, stageAgg] = await Promise.all([\n this.CallLog.countDocuments(matchStage),\n this.CallLog.aggregate<PipelineStageAggResult>([\n { $match: matchStage },\n { $unwind: { path: '$stageHistory', preserveNullAndEmptyArrays: false } },\n {\n $group: {\n _id: '$stageHistory.toStageId',\n count: { $sum: 1 },\n totalTimeMs: { $sum: '$stageHistory.timeInStageMs' },\n },\n },\n {\n $project: {\n stageId: '$_id',\n count: 1,\n totalTimeMs: 1,\n },\n },\n ]),\n ]);\n\n const totalCalls = totalResult;\n const stageMap = new Map(stageAgg.map((s) => [s.stageId, s]));\n\n let bottleneckStage: string | null = null;\n let maxAvgTime = 0;\n\n const stageStats = stages.map((s) => {\n const agg = stageMap.get(s.stageId);\n const count = agg?.count ?? 0;\n const avgTimeMs = count > 0 ? Math.round((agg?.totalTimeMs ?? 0) / count) : 0;\n const conversionRate = totalCalls > 0 ? Math.round((count / totalCalls) * 10000) / 100 : 0;\n\n if (avgTimeMs > maxAvgTime) {\n maxAvgTime = avgTimeMs;\n bottleneckStage = s.stageId;\n }\n\n return {\n stageId: s.stageId,\n stageName: s.name,\n count,\n avgTimeMs,\n conversionRate,\n };\n });\n\n this.logger.info('Pipeline stats computed', { pipelineId, totalCalls });\n\n return {\n pipelineId,\n pipelineName,\n totalCalls,\n stages: stageStats,\n bottleneckStage,\n };\n }\n\n async getPipelineFunnel(pipelineId: string, dateRange: DateRange): Promise<PipelineFunnel> {\n const pipeline = await this.Pipeline.findOne({ pipelineId, isDeleted: false });\n const pipelineName = pipeline?.name ?? pipelineId;\n const stages = pipeline?.stages ?? [];\n\n const matchStage: Record<string, unknown> = {\n pipelineId,\n isDeleted: { $ne: true },\n ...this.buildDateMatch(dateRange),\n };\n\n const [enteredAgg, exitedAgg] = await Promise.all([\n this.CallLog.aggregate<AggIdCount>([\n { $match: matchStage },\n { $unwind: '$stageHistory' },\n { $group: { _id: '$stageHistory.toStageId', count: { $sum: 1 } } },\n ]),\n this.CallLog.aggregate<AggIdCount>([\n { $match: matchStage },\n { $unwind: '$stageHistory' },\n { $group: { _id: '$stageHistory.fromStageId', count: { $sum: 1 } } },\n ]),\n ]);\n\n const enteredMap = new Map(enteredAgg.map((r) => [String(r._id), r.count]));\n const exitedMap = new Map(exitedAgg.map((r) => [String(r._id), r.count]));\n\n const funnelStages = stages.map((s) => {\n const entered = enteredMap.get(s.stageId) ?? 0;\n const exited = exitedMap.get(s.stageId) ?? 0;\n return {\n stageId: s.stageId,\n stageName: s.name,\n entered,\n exited,\n dropOff: Math.max(0, entered - exited),\n };\n });\n\n return { pipelineId, pipelineName, stages: funnelStages };\n }\n\n async getChannelDistribution(dateRange: DateRange): Promise<ChannelDistribution[]> {\n const matchStage: Record<string, unknown> = {\n isDeleted: { $ne: true },\n ...this.buildDateMatch(dateRange),\n };\n\n const results = await this.CallLog.aggregate<AggIdCount>([\n { $match: matchStage },\n { $group: { _id: '$channel', count: { $sum: 1 } } },\n { $sort: { count: -1 as const } },\n ]);\n\n return results.map((r) => ({\n channel: r._id != null ? String(r._id) : 'unknown',\n count: r.count,\n }));\n }\n\n async getOutcomeDistribution(dateRange: DateRange): Promise<OutcomeDistribution[]> {\n const matchStage: Record<string, unknown> = {\n isDeleted: { $ne: true },\n ...this.buildDateMatch(dateRange),\n };\n\n const results = await this.CallLog.aggregate<AggIdCount>([\n { $match: matchStage },\n { $group: { _id: '$outcome', count: { $sum: 1 } } },\n { $sort: { count: -1 as const } },\n ]);\n\n return results.map((r) => ({\n outcome: r._id != null ? String(r._id) : 'unknown',\n count: r.count,\n }));\n }\n\n async getFollowUpStats(dateRange: DateRange): Promise<FollowUpStats> {\n const matchStage: Record<string, unknown> = {\n isDeleted: { $ne: true },\n ...this.buildDateMatch(dateRange),\n };\n\n const results = await this.CallLog.aggregate<{ _id: null; total: number; followUpCalls: number }>([\n { $match: matchStage },\n {\n $group: {\n _id: null,\n total: { $sum: 1 },\n followUpCalls: {\n $sum: { $cond: [{ $eq: ['$isFollowUp', true] }, 1, 0] },\n },\n },\n },\n ]);\n\n const stat = results[0] ?? { total: 0, followUpCalls: 0 };\n const followUpRatio =\n stat.total > 0 ? Math.round((stat.followUpCalls / stat.total) * 10000) / 100 : 0;\n\n return {\n followUpCalls: stat.followUpCalls,\n totalCalls: stat.total,\n followUpRatio,\n };\n }\n}\n","import type { Model } from 'mongoose';\nimport type { LogAdapter } from '@astralibx/core';\nimport type { ExportFormat, ExportFilter, DateRange } from '@astralibx/call-log-types';\nimport type { ICallLogDocument } from '../schemas/call-log.schema.js';\nimport type { PipelineAnalyticsService } from './pipeline-analytics.service.js';\nimport { CallLogNotFoundError } from '../errors/index.js';\n\n// ── CSV columns ───────────────────────────────────────────────────────────────\n\nconst CSV_HEADER = 'callLogId,contactName,contactPhone,contactEmail,direction,pipelineId,currentStageId,priority,agentId,callDate,isClosed,tags';\n\n// ── Service ───────────────────────────────────────────────────────────────────\n\nexport class ExportService {\n constructor(\n private CallLog: Model<ICallLogDocument>,\n private pipelineAnalytics: PipelineAnalyticsService,\n private logger: LogAdapter,\n ) {}\n\n async exportCallLog(callLogId: string, format: ExportFormat): Promise<string> {\n const callLog = await this.CallLog.findOne({ callLogId });\n if (!callLog) throw new CallLogNotFoundError(callLogId);\n\n if (format === 'csv') {\n return this.toCSV([callLog]);\n }\n\n return JSON.stringify(\n (callLog as unknown as { toObject(): unknown }).toObject\n ? (callLog as unknown as { toObject(): unknown }).toObject()\n : callLog,\n null,\n 2,\n );\n }\n\n async exportCallLogs(filter: ExportFilter, format: ExportFormat): Promise<string> {\n const query: Record<string, unknown> = {};\n\n if (filter.pipelineId) query.pipelineId = filter.pipelineId;\n if (filter.stageId) query.currentStageId = filter.stageId;\n if (filter.agentId) query.agentId = filter.agentId;\n if (filter.tags && filter.tags.length > 0) query.tags = { $in: filter.tags };\n if (filter.category) query.category = filter.category;\n if (filter.isClosed !== undefined) query.isClosed = filter.isClosed;\n\n if (filter.dateFrom || filter.dateTo) {\n const dateFilter: Record<string, unknown> = {};\n if (filter.dateFrom) dateFilter.$gte = new Date(filter.dateFrom);\n if (filter.dateTo) dateFilter.$lte = new Date(filter.dateTo);\n query.callDate = dateFilter;\n }\n\n const callLogs = await this.CallLog.find(query).sort({ callDate: -1 });\n\n if (format === 'csv') {\n return this.toCSV(callLogs);\n }\n\n return JSON.stringify(\n callLogs.map((c) =>\n (c as unknown as { toObject(): unknown }).toObject\n ? (c as unknown as { toObject(): unknown }).toObject()\n : c,\n ),\n null,\n 2,\n );\n }\n\n async exportPipelineReport(pipelineId: string, dateRange: DateRange, format: ExportFormat): Promise<string> {\n const report = await this.pipelineAnalytics.getPipelineStats(pipelineId, dateRange);\n\n if (format === 'csv') {\n const header = 'pipelineId,pipelineName,totalCalls,stageId,stageName,count,avgTimeMs,conversionRate,bottleneckStage';\n const rows: string[] = [header];\n for (const stage of report.stages) {\n rows.push(\n [\n this.escapeCSV(report.pipelineId),\n this.escapeCSV(report.pipelineName),\n String(report.totalCalls),\n this.escapeCSV(stage.stageId),\n this.escapeCSV(stage.stageName),\n String(stage.count),\n String(stage.avgTimeMs),\n String(stage.conversionRate),\n this.escapeCSV(report.bottleneckStage ?? ''),\n ].join(','),\n );\n }\n this.logger.info('Pipeline report exported as CSV', { pipelineId });\n return rows.join('\\n');\n }\n\n this.logger.info('Pipeline report exported as JSON', { pipelineId });\n return JSON.stringify(report, null, 2);\n }\n\n private toCSV(callLogs: ICallLogDocument[]): string {\n const rows: string[] = [CSV_HEADER];\n\n for (const c of callLogs) {\n const row = [\n this.escapeCSV(c.callLogId),\n this.escapeCSV(c.contactRef?.displayName ?? ''),\n this.escapeCSV(c.contactRef?.phone ?? ''),\n this.escapeCSV(c.contactRef?.email ?? ''),\n this.escapeCSV(c.direction ?? ''),\n this.escapeCSV(c.pipelineId ?? ''),\n this.escapeCSV(c.currentStageId ?? ''),\n this.escapeCSV(c.priority ?? ''),\n this.escapeCSV(c.agentId?.toString() ?? ''),\n c.callDate ? new Date(c.callDate).toISOString() : '',\n String(c.isClosed ?? false),\n this.escapeCSV((c.tags ?? []).join(';')),\n ].join(',');\n rows.push(row);\n }\n\n return rows.join('\\n');\n }\n\n private escapeCSV(value: string): string {\n if (value.includes(',') || value.includes('\"') || value.includes('\\n')) {\n return `\"${value.replace(/\"/g, '\"\"')}\"`;\n }\n return value;\n }\n}\n","import { Router } from 'express';\nimport type { Request, Response } from 'express';\nimport { sendSuccess, sendError } from '@astralibx/core';\nimport type { LogAdapter } from '@astralibx/core';\nimport type { PipelineService } from '../services/pipeline.service.js';\nimport { AlxCallLogError } from '../errors/index.js';\n\nexport function createPipelineRoutes(\n pipeline: PipelineService,\n logger: LogAdapter,\n): Router {\n const router = Router();\n\n // GET / — list pipelines\n router.get('/', async (req: Request, res: Response) => {\n try {\n const isActive = req.query['isActive'] !== undefined\n ? req.query['isActive'] === 'true'\n : undefined;\n const result = await pipeline.list({ isActive });\n sendSuccess(res, result);\n } catch (error: unknown) {\n const message = error instanceof Error ? error.message : 'Unknown error';\n logger.error('Failed to list pipelines', { error: message });\n sendError(res, message, 500);\n }\n });\n\n // POST / — create pipeline\n router.post('/', async (req: Request, res: Response) => {\n try {\n const result = await pipeline.create(req.body);\n sendSuccess(res, result, 201);\n } catch (error: unknown) {\n if (error instanceof AlxCallLogError) {\n sendError(res, error.message, 400);\n return;\n }\n const message = error instanceof Error ? error.message : 'Unknown error';\n logger.error('Failed to create pipeline', { error: message });\n sendError(res, message, 500);\n }\n });\n\n // GET /:id — get pipeline\n router.get('/:id', async (req: Request, res: Response) => {\n try {\n const result = await pipeline.get(req.params['id']!);\n sendSuccess(res, result);\n } catch (error: unknown) {\n if (error instanceof AlxCallLogError) {\n sendError(res, error.message, 404);\n return;\n }\n const message = error instanceof Error ? error.message : 'Unknown error';\n logger.error('Failed to get pipeline', { id: req.params['id'], error: message });\n sendError(res, message, 500);\n }\n });\n\n // PUT /:id — update pipeline\n router.put('/:id', async (req: Request, res: Response) => {\n try {\n const result = await pipeline.update(req.params['id']!, req.body);\n sendSuccess(res, result);\n } catch (error: unknown) {\n if (error instanceof AlxCallLogError) {\n sendError(res, error.message, 400);\n return;\n }\n const message = error instanceof Error ? error.message : 'Unknown error';\n logger.error('Failed to update pipeline', { id: req.params['id'], error: message });\n sendError(res, message, 500);\n }\n });\n\n // DELETE /:id — delete pipeline\n router.delete('/:id', async (req: Request, res: Response) => {\n try {\n await pipeline.delete(req.params['id']!);\n sendSuccess(res, undefined);\n } catch (error: unknown) {\n if (error instanceof AlxCallLogError) {\n sendError(res, error.message, 400);\n return;\n }\n const message = error instanceof Error ? error.message : 'Unknown error';\n logger.error('Failed to delete pipeline', { id: req.params['id'], error: message });\n sendError(res, message, 500);\n }\n });\n\n // POST /:id/stages — add stage\n router.post('/:id/stages', async (req: Request, res: Response) => {\n try {\n const result = await pipeline.addStage(req.params['id']!, req.body);\n sendSuccess(res, result, 201);\n } catch (error: unknown) {\n if (error instanceof AlxCallLogError) {\n sendError(res, error.message, 400);\n return;\n }\n const message = error instanceof Error ? error.message : 'Unknown error';\n logger.error('Failed to add stage', { id: req.params['id'], error: message });\n sendError(res, message, 500);\n }\n });\n\n // PUT /:id/stages/reorder — reorder stages (must be BEFORE /:id/stages/:stageId)\n router.put('/:id/stages/reorder', async (req: Request, res: Response) => {\n try {\n const { stageIds } = req.body as { stageIds: string[] };\n const result = await pipeline.reorderStages(req.params['id']!, stageIds);\n sendSuccess(res, result);\n } catch (error: unknown) {\n if (error instanceof AlxCallLogError) {\n sendError(res, error.message, 400);\n return;\n }\n const message = error instanceof Error ? error.message : 'Unknown error';\n logger.error('Failed to reorder stages', { id: req.params['id'], error: message });\n sendError(res, message, 500);\n }\n });\n\n // PUT /:id/stages/:stageId — update stage\n router.put('/:id/stages/:stageId', async (req: Request, res: Response) => {\n try {\n const result = await pipeline.updateStage(req.params['id']!, req.params['stageId']!, req.body);\n sendSuccess(res, result);\n } catch (error: unknown) {\n if (error instanceof AlxCallLogError) {\n sendError(res, error.message, 400);\n return;\n }\n const message = error instanceof Error ? error.message : 'Unknown error';\n logger.error('Failed to update stage', { id: req.params['id'], stageId: req.params['stageId'], error: message });\n sendError(res, message, 500);\n }\n });\n\n // DELETE /:id/stages/:stageId — remove stage\n router.delete('/:id/stages/:stageId', async (req: Request, res: Response) => {\n try {\n await pipeline.removeStage(req.params['id']!, req.params['stageId']!);\n sendSuccess(res, undefined);\n } catch (error: unknown) {\n if (error instanceof AlxCallLogError) {\n sendError(res, error.message, 400);\n return;\n }\n const message = error instanceof Error ? error.message : 'Unknown error';\n logger.error('Failed to remove stage', { id: req.params['id'], stageId: req.params['stageId'], error: message });\n sendError(res, message, 500);\n }\n });\n\n return router;\n}\n","import { Router } from 'express';\nimport type { Request, Response } from 'express';\nimport { sendSuccess, sendError } from '@astralibx/core';\nimport type { LogAdapter } from '@astralibx/core';\nimport type { CallLogService } from '../services/call-log.service.js';\nimport type { CallLogLifecycleService } from '../services/call-log-lifecycle.service.js';\nimport type { TimelineService } from '../services/timeline.service.js';\nimport { AlxCallLogError } from '../errors/index.js';\n\nfunction getScopedAgentId(req: Request, enableAgentScoping: boolean): string | undefined {\n if (!enableAgentScoping) return undefined;\n const user = (req as unknown as { user?: { adminUserId?: string; role?: string } }).user;\n if (!user) return undefined;\n if (user.role === 'owner') return undefined;\n return user.adminUserId;\n}\n\nexport function createCallLogRoutes(\n services: { callLogs: CallLogService; lifecycle: CallLogLifecycleService; timeline: TimelineService },\n logger: LogAdapter,\n enableAgentScoping = false,\n): Router {\n const router = Router();\n const { callLogs, lifecycle, timeline } = services;\n\n // Static routes BEFORE parameterized routes\n\n // GET /follow-ups — list due follow-ups (BEFORE /:id)\n router.get('/follow-ups', async (req: Request, res: Response) => {\n try {\n const scopedAgentId = getScopedAgentId(req, enableAgentScoping);\n const agentId = scopedAgentId ?? (req.query['agentId'] as string | undefined);\n const dateRange = {\n from: req.query['from'] as string | undefined,\n to: req.query['to'] as string | undefined,\n };\n const result = await lifecycle.getFollowUpsDue(agentId, dateRange);\n sendSuccess(res, result);\n } catch (error: unknown) {\n const message = error instanceof Error ? error.message : 'Unknown error';\n logger.error('Failed to get follow-ups', { error: message });\n sendError(res, message, 500);\n }\n });\n\n // PUT /-/bulk/stage — bulk stage change (BEFORE /:id)\n router.put('/-/bulk/stage', async (req: Request, res: Response) => {\n try {\n const { callLogIds, newStageId, agentId } = req.body as {\n callLogIds: string[];\n newStageId: string;\n agentId: string;\n };\n const result = await lifecycle.bulkChangeStage(callLogIds, newStageId, agentId);\n sendSuccess(res, result);\n } catch (error: unknown) {\n if (error instanceof AlxCallLogError) {\n sendError(res, error.message, 400);\n return;\n }\n const message = error instanceof Error ? error.message : 'Unknown error';\n logger.error('Failed to bulk change stage', { error: message });\n sendError(res, message, 500);\n }\n });\n\n // GET / — list call logs\n router.get('/', async (req: Request, res: Response) => {\n try {\n const query = req.query as Record<string, string | undefined>;\n const filter: Record<string, unknown> = {};\n if (query['pipelineId']) filter['pipelineId'] = query['pipelineId'];\n if (query['currentStageId']) filter['currentStageId'] = query['currentStageId'];\n // Agent scoping: inject agentId if scoping enabled and user is not owner\n const scopedAgentId = getScopedAgentId(req, enableAgentScoping);\n if (scopedAgentId) {\n filter['agentId'] = scopedAgentId;\n } else if (query['agentId']) {\n filter['agentId'] = query['agentId'];\n }\n if (query['category']) filter['category'] = query['category'];\n if (query['isClosed'] !== undefined) filter['isClosed'] = query['isClosed'] === 'true';\n if (query['contactExternalId']) filter['contactExternalId'] = query['contactExternalId'];\n if (query['contactName']) filter['contactName'] = query['contactName'];\n if (query['contactPhone']) filter['contactPhone'] = query['contactPhone'];\n if (query['contactEmail']) filter['contactEmail'] = query['contactEmail'];\n if (query['priority']) filter['priority'] = query['priority'];\n if (query['direction']) filter['direction'] = query['direction'];\n // New query params: channel, outcome, isFollowUp, includeDeleted\n const channel = query['channel'];\n const outcome = query['outcome'];\n const isFollowUp = query['isFollowUp'] !== undefined ? query['isFollowUp'] === 'true' : undefined;\n const includeDeleted = query['includeDeleted'] === 'true';\n if (channel) filter['channel'] = channel;\n if (outcome) filter['outcome'] = outcome;\n if (isFollowUp !== undefined) filter['isFollowUp'] = isFollowUp;\n if (includeDeleted) filter['includeDeleted'] = true;\n if (query['page']) filter['page'] = parseInt(query['page']!, 10);\n if (query['limit']) filter['limit'] = parseInt(query['limit']!, 10);\n if (query['from'] || query['to']) {\n filter['dateRange'] = { from: query['from'], to: query['to'] };\n }\n const result = await callLogs.list(filter as Parameters<typeof callLogs.list>[0]);\n sendSuccess(res, result);\n } catch (error: unknown) {\n const message = error instanceof Error ? error.message : 'Unknown error';\n logger.error('Failed to list call logs', { error: message });\n sendError(res, message, 500);\n }\n });\n\n // POST / — create call log\n router.post('/', async (req: Request, res: Response) => {\n try {\n const result = await callLogs.create(req.body);\n sendSuccess(res, result, 201);\n } catch (error: unknown) {\n if (error instanceof AlxCallLogError) {\n sendError(res, error.message, 400);\n return;\n }\n const message = error instanceof Error ? error.message : 'Unknown error';\n logger.error('Failed to create call log', { error: message });\n sendError(res, message, 500);\n }\n });\n\n // GET /:id — get call log\n router.get('/:id', async (req: Request, res: Response) => {\n try {\n const result = await callLogs.get(req.params['id']!);\n sendSuccess(res, result);\n } catch (error: unknown) {\n if (error instanceof AlxCallLogError) {\n sendError(res, error.message, 404);\n return;\n }\n const message = error instanceof Error ? error.message : 'Unknown error';\n logger.error('Failed to get call log', { id: req.params['id'], error: message });\n sendError(res, message, 500);\n }\n });\n\n // PUT /:id — update call log\n router.put('/:id', async (req: Request, res: Response) => {\n try {\n const result = await callLogs.update(req.params['id']!, req.body);\n sendSuccess(res, result);\n } catch (error: unknown) {\n if (error instanceof AlxCallLogError) {\n sendError(res, error.message, 400);\n return;\n }\n const message = error instanceof Error ? error.message : 'Unknown error';\n logger.error('Failed to update call log', { id: req.params['id'], error: message });\n sendError(res, message, 500);\n }\n });\n\n // DELETE /:id — soft delete call log\n router.delete('/:id', async (req: Request, res: Response) => {\n try {\n const agentId = (req as unknown as { user?: { adminUserId?: string } }).user?.adminUserId;\n const agentName = (req as unknown as { user?: { displayName?: string } }).user?.displayName;\n const result = await lifecycle.softDelete(req.params['id']!, agentId, agentName);\n sendSuccess(res, result);\n } catch (error: unknown) {\n if (error instanceof AlxCallLogError) {\n sendError(res, error.message, 404);\n return;\n }\n const message = error instanceof Error ? error.message : 'Unknown error';\n logger.error('Failed to soft delete call log', { id: req.params['id'], error: message });\n sendError(res, message, 500);\n }\n });\n\n // PUT /:id/stage — change stage\n router.put('/:id/stage', async (req: Request, res: Response) => {\n try {\n const { newStageId, agentId } = req.body as { newStageId: string; agentId: string };\n const result = await lifecycle.changeStage(req.params['id']!, newStageId, agentId);\n sendSuccess(res, result);\n } catch (error: unknown) {\n if (error instanceof AlxCallLogError) {\n sendError(res, error.message, 400);\n return;\n }\n const message = error instanceof Error ? error.message : 'Unknown error';\n logger.error('Failed to change stage', { id: req.params['id'], error: message });\n sendError(res, message, 500);\n }\n });\n\n // PUT /:id/assign — reassign\n router.put('/:id/assign', async (req: Request, res: Response) => {\n try {\n const { agentId, assignedBy } = req.body as { agentId: string; assignedBy: string };\n const result = await lifecycle.assign(req.params['id']!, agentId, assignedBy);\n sendSuccess(res, result);\n } catch (error: unknown) {\n if (error instanceof AlxCallLogError) {\n sendError(res, error.message, 400);\n return;\n }\n const message = error instanceof Error ? error.message : 'Unknown error';\n logger.error('Failed to assign call log', { id: req.params['id'], error: message });\n sendError(res, message, 500);\n }\n });\n\n // PUT /:id/close — manual close\n router.put('/:id/close', async (req: Request, res: Response) => {\n try {\n const { agentId } = req.body as { agentId: string };\n const result = await lifecycle.close(req.params['id']!, agentId);\n sendSuccess(res, result);\n } catch (error: unknown) {\n if (error instanceof AlxCallLogError) {\n sendError(res, error.message, 400);\n return;\n }\n const message = error instanceof Error ? error.message : 'Unknown error';\n logger.error('Failed to close call log', { id: req.params['id'], error: message });\n sendError(res, message, 500);\n }\n });\n\n // PUT /:id/reopen — reopen a closed call\n router.put('/:id/reopen', async (req: Request, res: Response) => {\n try {\n const { agentId } = req.body as { agentId: string };\n const result = await lifecycle.reopen(req.params['id']!, agentId);\n sendSuccess(res, result);\n } catch (error: unknown) {\n if (error instanceof AlxCallLogError) {\n sendError(res, error.message, 400);\n return;\n }\n const message = error instanceof Error ? error.message : 'Unknown error';\n logger.error('Failed to reopen call log', { id: req.params['id'], error: message });\n sendError(res, message, 500);\n }\n });\n\n // POST /:id/notes — add timeline note\n router.post('/:id/notes', async (req: Request, res: Response) => {\n try {\n const { content, authorId, authorName } = req.body as {\n content: string;\n authorId: string;\n authorName: string;\n };\n const result = await timeline.addNote(req.params['id']!, content, authorId, authorName);\n sendSuccess(res, result, 201);\n } catch (error: unknown) {\n if (error instanceof AlxCallLogError) {\n sendError(res, error.message, 400);\n return;\n }\n const message = error instanceof Error ? error.message : 'Unknown error';\n logger.error('Failed to add timeline note', { id: req.params['id'], error: message });\n sendError(res, message, 500);\n }\n });\n\n // GET /:id/timeline — paginated timeline\n router.get('/:id/timeline', async (req: Request, res: Response) => {\n try {\n const page = parseInt(req.query['page'] as string || '1', 10);\n const limit = parseInt(req.query['limit'] as string || '50', 10);\n const result = await timeline.getTimeline(req.params['id']!, { page, limit });\n sendSuccess(res, result);\n } catch (error: unknown) {\n if (error instanceof AlxCallLogError) {\n sendError(res, error.message, 404);\n return;\n }\n const message = error instanceof Error ? error.message : 'Unknown error';\n logger.error('Failed to get timeline', { id: req.params['id'], error: message });\n sendError(res, message, 500);\n }\n });\n\n return router;\n}\n","import { Router } from 'express';\nimport type { Request, Response } from 'express';\nimport { sendSuccess, sendError } from '@astralibx/core';\nimport type { LogAdapter } from '@astralibx/core';\nimport type { CallLogService } from '../services/call-log.service.js';\nimport type { TimelineService } from '../services/timeline.service.js';\nimport { AlxCallLogError } from '../errors/index.js';\n\nexport function createContactRoutes(\n services: { callLogs: CallLogService; timeline: TimelineService },\n logger: LogAdapter,\n): Router {\n const router = Router();\n const { callLogs, timeline } = services;\n\n // GET /:externalId/calls — all calls for contact\n router.get('/:externalId/calls', async (req: Request, res: Response) => {\n try {\n const result = await callLogs.getByContact(req.params['externalId']!);\n sendSuccess(res, result);\n } catch (error: unknown) {\n if (error instanceof AlxCallLogError) {\n sendError(res, error.message, 404);\n return;\n }\n const message = error instanceof Error ? error.message : 'Unknown error';\n logger.error('Failed to get calls for contact', { externalId: req.params['externalId'], error: message });\n sendError(res, message, 500);\n }\n });\n\n // GET /:externalId/timeline — merged contact timeline\n router.get('/:externalId/timeline', async (req: Request, res: Response) => {\n try {\n const page = parseInt(req.query['page'] as string || '1', 10);\n const limit = parseInt(req.query['limit'] as string || '20', 10);\n const result = await timeline.getContactTimeline(req.params['externalId']!, { page, limit });\n sendSuccess(res, result);\n } catch (error: unknown) {\n if (error instanceof AlxCallLogError) {\n sendError(res, error.message, 404);\n return;\n }\n const message = error instanceof Error ? error.message : 'Unknown error';\n logger.error('Failed to get contact timeline', { externalId: req.params['externalId'], error: message });\n sendError(res, message, 500);\n }\n });\n\n return router;\n}\n","import { Router } from 'express';\nimport type { Request, Response } from 'express';\nimport { sendSuccess, sendError } from '@astralibx/core';\nimport type { LogAdapter } from '@astralibx/core';\nimport type { AnalyticsService } from '../services/analytics.service.js';\nimport type { PipelineAnalyticsService } from '../services/pipeline-analytics.service.js';\nimport { AlxCallLogError } from '../errors/index.js';\n\nexport function createAnalyticsRoutes(\n analytics: AnalyticsService,\n pipelineAnalytics: PipelineAnalyticsService,\n logger: LogAdapter,\n enableAgentScoping = false,\n): Router {\n const router = Router();\n\n function getScopedAgentId(req: Request): string | undefined {\n if (!enableAgentScoping) return undefined;\n const user = (req as unknown as { user?: { adminUserId?: string; role?: string } }).user;\n if (!user) return undefined;\n if (user.role === 'owner') return undefined;\n return user.adminUserId;\n }\n\n function parseDateRange(query: Record<string, string | undefined>) {\n return {\n from: query['from'],\n to: query['to'],\n };\n }\n\n // GET /stats — quick dashboard stats\n router.get('/stats', async (req: Request, res: Response) => {\n try {\n const result = await analytics.getDashboardStats();\n sendSuccess(res, result);\n } catch (error: unknown) {\n const message = error instanceof Error ? error.message : 'Unknown error';\n logger.error('Failed to get dashboard stats', { error: message });\n sendError(res, message, 500);\n }\n });\n\n // GET /agent/:agentId — agent stats\n router.get('/agent/:agentId', async (req: Request, res: Response) => {\n try {\n const scopedAgentId = getScopedAgentId(req);\n // Non-owners can only view their own stats\n if (scopedAgentId && scopedAgentId !== req.params['agentId']) {\n sendError(res, 'Forbidden: you may only view your own agent stats', 403);\n return;\n }\n const dateRange = parseDateRange(req.query as Record<string, string | undefined>);\n const result = await analytics.getAgentStats(req.params['agentId']!, dateRange);\n sendSuccess(res, result);\n } catch (error: unknown) {\n if (error instanceof AlxCallLogError) {\n sendError(res, error.message, 400);\n return;\n }\n const message = error instanceof Error ? error.message : 'Unknown error';\n logger.error('Failed to get agent stats', { agentId: req.params['agentId'], error: message });\n sendError(res, message, 500);\n }\n });\n\n // GET /agent-leaderboard — ranking\n router.get('/agent-leaderboard', async (req: Request, res: Response) => {\n try {\n const dateRange = parseDateRange(req.query as Record<string, string | undefined>);\n const result = await analytics.getAgentLeaderboard(dateRange);\n sendSuccess(res, result);\n } catch (error: unknown) {\n const message = error instanceof Error ? error.message : 'Unknown error';\n logger.error('Failed to get agent leaderboard', { error: message });\n sendError(res, message, 500);\n }\n });\n\n // GET /pipeline/:id — pipeline stats (delegated to PipelineAnalyticsService)\n router.get('/pipeline/:id', async (req: Request, res: Response) => {\n try {\n const dateRange = parseDateRange(req.query as Record<string, string | undefined>);\n const result = await pipelineAnalytics.getPipelineStats(req.params['id']!, dateRange);\n sendSuccess(res, result);\n } catch (error: unknown) {\n if (error instanceof AlxCallLogError) {\n sendError(res, error.message, 400);\n return;\n }\n const message = error instanceof Error ? error.message : 'Unknown error';\n logger.error('Failed to get pipeline stats', { id: req.params['id'], error: message });\n sendError(res, message, 500);\n }\n });\n\n // GET /pipeline/:id/funnel — funnel (delegated to PipelineAnalyticsService)\n router.get('/pipeline/:id/funnel', async (req: Request, res: Response) => {\n try {\n const dateRange = parseDateRange(req.query as Record<string, string | undefined>);\n const result = await pipelineAnalytics.getPipelineFunnel(req.params['id']!, dateRange);\n sendSuccess(res, result);\n } catch (error: unknown) {\n if (error instanceof AlxCallLogError) {\n sendError(res, error.message, 400);\n return;\n }\n const message = error instanceof Error ? error.message : 'Unknown error';\n logger.error('Failed to get pipeline funnel', { id: req.params['id'], error: message });\n sendError(res, message, 500);\n }\n });\n\n // GET /channel-distribution — channel distribution\n router.get('/channel-distribution', async (req: Request, res: Response) => {\n try {\n const dateRange = parseDateRange(req.query as Record<string, string | undefined>);\n const result = await pipelineAnalytics.getChannelDistribution(dateRange);\n sendSuccess(res, result);\n } catch (error: unknown) {\n const message = error instanceof Error ? error.message : 'Unknown error';\n logger.error('Failed to get channel distribution', { error: message });\n sendError(res, message, 500);\n }\n });\n\n // GET /outcome-distribution — outcome distribution\n router.get('/outcome-distribution', async (req: Request, res: Response) => {\n try {\n const dateRange = parseDateRange(req.query as Record<string, string | undefined>);\n const result = await pipelineAnalytics.getOutcomeDistribution(dateRange);\n sendSuccess(res, result);\n } catch (error: unknown) {\n const message = error instanceof Error ? error.message : 'Unknown error';\n logger.error('Failed to get outcome distribution', { error: message });\n sendError(res, message, 500);\n }\n });\n\n // GET /follow-up-stats — follow-up ratio stats\n router.get('/follow-up-stats', async (req: Request, res: Response) => {\n try {\n const dateRange = parseDateRange(req.query as Record<string, string | undefined>);\n const result = await pipelineAnalytics.getFollowUpStats(dateRange);\n sendSuccess(res, result);\n } catch (error: unknown) {\n const message = error instanceof Error ? error.message : 'Unknown error';\n logger.error('Failed to get follow-up stats', { error: message });\n sendError(res, message, 500);\n }\n });\n\n // GET /team — team stats\n router.get('/team', async (req: Request, res: Response) => {\n try {\n const { teamId } = req.query as { teamId?: string };\n const dateRange = parseDateRange(req.query as Record<string, string | undefined>);\n const result = await analytics.getTeamStats(teamId, dateRange);\n sendSuccess(res, result);\n } catch (error: unknown) {\n const message = error instanceof Error ? error.message : 'Unknown error';\n logger.error('Failed to get team stats', { error: message });\n sendError(res, message, 500);\n }\n });\n\n // GET /daily — daily report\n router.get('/daily', async (req: Request, res: Response) => {\n try {\n const scopedAgentId = getScopedAgentId(req);\n const dateRange = parseDateRange(req.query as Record<string, string | undefined>);\n const result = await analytics.getDailyReport(dateRange, scopedAgentId);\n sendSuccess(res, result);\n } catch (error: unknown) {\n const message = error instanceof Error ? error.message : 'Unknown error';\n logger.error('Failed to get daily report', { error: message });\n sendError(res, message, 500);\n }\n });\n\n // GET /weekly-trends — weekly trends\n router.get('/weekly-trends', async (req: Request, res: Response) => {\n try {\n const weeks = parseInt(req.query['weeks'] as string || '4', 10);\n const result = await analytics.getWeeklyTrends(weeks);\n sendSuccess(res, result);\n } catch (error: unknown) {\n const message = error instanceof Error ? error.message : 'Unknown error';\n logger.error('Failed to get weekly trends', { error: message });\n sendError(res, message, 500);\n }\n });\n\n // GET /overall — overall report\n router.get('/overall', async (req: Request, res: Response) => {\n try {\n const dateRange = parseDateRange(req.query as Record<string, string | undefined>);\n const result = await analytics.getOverallReport(dateRange);\n sendSuccess(res, result);\n } catch (error: unknown) {\n const message = error instanceof Error ? error.message : 'Unknown error';\n logger.error('Failed to get overall report', { error: message });\n sendError(res, message, 500);\n }\n });\n\n return router;\n}\n","import { Router } from 'express';\nimport type { Request, Response } from 'express';\nimport { sendSuccess, sendError } from '@astralibx/core';\nimport type { LogAdapter } from '@astralibx/core';\nimport type { SettingsService } from '../services/settings.service.js';\nimport type { ExportService } from '../services/export.service.js';\nimport { AlxCallLogError } from '../errors/index.js';\n\nexport function createSettingsRoutes(\n settings: SettingsService,\n exportSvc: ExportService,\n logger: LogAdapter,\n): Router {\n const router = Router();\n\n // NOTE: These are mounted at root level (not under /settings prefix)\n\n // GET /settings — get settings\n router.get('/settings', async (_req: Request, res: Response) => {\n try {\n const result = await settings.get();\n sendSuccess(res, result);\n } catch (error: unknown) {\n const message = error instanceof Error ? error.message : 'Unknown error';\n logger.error('Failed to get settings', { error: message });\n sendError(res, message, 500);\n }\n });\n\n // PUT /settings — update settings\n router.put('/settings', async (req: Request, res: Response) => {\n try {\n const result = await settings.update(req.body);\n sendSuccess(res, result);\n } catch (error: unknown) {\n if (error instanceof AlxCallLogError) {\n sendError(res, error.message, 400);\n return;\n }\n const message = error instanceof Error ? error.message : 'Unknown error';\n logger.error('Failed to update settings', { error: message });\n sendError(res, message, 500);\n }\n });\n\n // GET /export/calls — bulk export\n router.get('/export/calls', async (req: Request, res: Response) => {\n try {\n const { format = 'json', ...filterParams } = req.query as Record<string, string | undefined>;\n const filter: Record<string, unknown> = {};\n if (filterParams['pipelineId']) filter['pipelineId'] = filterParams['pipelineId'];\n if (filterParams['agentId']) filter['agentId'] = filterParams['agentId'];\n if (filterParams['isClosed'] !== undefined) filter['isClosed'] = filterParams['isClosed'] === 'true';\n if (filterParams['from'] || filterParams['to']) {\n filter['dateRange'] = { from: filterParams['from'], to: filterParams['to'] };\n }\n const result = await exportSvc.exportCallLogs(\n filter as Parameters<typeof exportSvc.exportCallLogs>[0],\n format as 'json' | 'csv',\n );\n const contentType = format === 'csv' ? 'text/csv' : 'application/json';\n res.setHeader('Content-Type', contentType);\n res.send(result);\n } catch (error: unknown) {\n const message = error instanceof Error ? error.message : 'Unknown error';\n logger.error('Failed to export call logs', { error: message });\n sendError(res, message, 500);\n }\n });\n\n // GET /export/calls/:id — single call export\n router.get('/export/calls/:id', async (req: Request, res: Response) => {\n try {\n const format = (req.query['format'] as string || 'json') as 'json' | 'csv';\n const result = await exportSvc.exportCallLog(req.params['id']!, format);\n const contentType = format === 'csv' ? 'text/csv' : 'application/json';\n res.setHeader('Content-Type', contentType);\n res.send(result);\n } catch (error: unknown) {\n if (error instanceof AlxCallLogError) {\n sendError(res, error.message, 404);\n return;\n }\n const message = error instanceof Error ? error.message : 'Unknown error';\n logger.error('Failed to export call log', { id: req.params['id'], error: message });\n sendError(res, message, 500);\n }\n });\n\n // GET /export/pipeline/:id — pipeline report export\n router.get('/export/pipeline/:id', async (req: Request, res: Response) => {\n try {\n const format = (req.query['format'] as string || 'json') as 'json' | 'csv';\n const dateRange = {\n from: req.query['from'] as string | undefined,\n to: req.query['to'] as string | undefined,\n };\n const result = await exportSvc.exportPipelineReport(req.params['id']!, dateRange, format);\n const contentType = format === 'csv' ? 'text/csv' : 'application/json';\n res.setHeader('Content-Type', contentType);\n res.send(result);\n } catch (error: unknown) {\n if (error instanceof AlxCallLogError) {\n sendError(res, error.message, 400);\n return;\n }\n const message = error instanceof Error ? error.message : 'Unknown error';\n logger.error('Failed to export pipeline report', { id: req.params['id'], error: message });\n sendError(res, message, 500);\n }\n });\n\n return router;\n}\n","import { Router } from 'express';\nimport type { Request, Response, NextFunction, RequestHandler } from 'express';\nimport { sendSuccess, sendError } from '@astralibx/core';\nimport type { LogAdapter } from '@astralibx/core';\nimport type { AuthResult } from '@astralibx/call-log-types';\nimport type { PipelineService } from '../services/pipeline.service.js';\nimport type { CallLogService } from '../services/call-log.service.js';\nimport type { CallLogLifecycleService } from '../services/call-log-lifecycle.service.js';\nimport type { TimelineService } from '../services/timeline.service.js';\nimport type { AnalyticsService } from '../services/analytics.service.js';\nimport type { PipelineAnalyticsService } from '../services/pipeline-analytics.service.js';\nimport type { SettingsService } from '../services/settings.service.js';\nimport type { ExportService } from '../services/export.service.js';\nimport { createPipelineRoutes } from './pipeline.routes.js';\nimport { createCallLogRoutes } from './call-log.routes.js';\nimport { createContactRoutes } from './contact.routes.js';\nimport { createAnalyticsRoutes } from './analytics.routes.js';\nimport { createSettingsRoutes } from './settings.routes.js';\n\nexport interface RouteServices {\n pipelines: PipelineService;\n callLogs: CallLogService;\n lifecycle: CallLogLifecycleService;\n timeline: TimelineService;\n analytics: AnalyticsService;\n pipelineAnalytics: PipelineAnalyticsService;\n settings: SettingsService;\n export: ExportService;\n}\n\nexport interface RouteOptions {\n authenticateRequest?: (req: Request) => Promise<AuthResult | null>;\n logger: LogAdapter;\n enableAgentScoping?: boolean;\n}\n\nexport function createRoutes(services: RouteServices, options: RouteOptions): Router {\n const router = Router();\n const { logger, authenticateRequest, enableAgentScoping = false } = options;\n\n // Build auth middleware\n let authMiddleware: RequestHandler | undefined;\n if (authenticateRequest) {\n authMiddleware = async (req: Request, res: Response, next: NextFunction): Promise<void> => {\n try {\n const result = await authenticateRequest(req);\n if (!result) {\n sendError(res, 'Unauthorized', 401);\n return;\n }\n (req as Request & { user: AuthResult }).user = result;\n next();\n } catch (error: unknown) {\n const message = error instanceof Error ? error.message : 'Authentication failed';\n sendError(res, message, 401);\n }\n };\n }\n\n const protectedRouter = Router();\n\n protectedRouter.use('/pipelines', createPipelineRoutes(services.pipelines, logger));\n protectedRouter.use('/calls', createCallLogRoutes({ callLogs: services.callLogs, lifecycle: services.lifecycle, timeline: services.timeline }, logger, enableAgentScoping));\n protectedRouter.use('/contacts', createContactRoutes({ callLogs: services.callLogs, timeline: services.timeline }, logger));\n protectedRouter.use('/analytics', createAnalyticsRoutes(services.analytics, services.pipelineAnalytics, logger, enableAgentScoping));\n protectedRouter.use('/', createSettingsRoutes(services.settings, services.export, logger));\n\n if (authMiddleware) {\n router.use(authMiddleware, protectedRouter);\n } else {\n router.use(protectedRouter);\n }\n\n return router;\n}\n","import crypto from 'node:crypto';\nimport type { Model } from 'mongoose';\nimport type { LogAdapter } from '@astralibx/core';\nimport type { ICallLog, ResolvedOptions } from '@astralibx/call-log-types';\nimport { TimelineEntryType } from '@astralibx/call-log-types';\nimport type { ICallLogDocument } from '../schemas/call-log.schema.js';\nimport { SYSTEM_TIMELINE } from '../constants/index.js';\n\n// ── Deps interface ────────────────────────────────────────────────────────────\n\nexport interface FollowUpWorkerDeps {\n CallLog: Model<ICallLogDocument>;\n hooks: { onFollowUpDue?: (callLog: ICallLog) => void | Promise<void> };\n logger: LogAdapter;\n options: ResolvedOptions;\n}\n\n// ── Worker ────────────────────────────────────────────────────────────────────\n\nexport class FollowUpWorker {\n private intervalId: NodeJS.Timeout | null = null;\n private running = false;\n\n constructor(private deps: FollowUpWorkerDeps) {}\n\n start(): void {\n if (this.intervalId) return;\n\n this.intervalId = setInterval(() => {\n this.tick().catch((err) => {\n this.deps.logger.error('Follow-up worker tick failed', {\n error: err instanceof Error ? err.message : 'Unknown error',\n });\n });\n }, this.deps.options.followUpCheckIntervalMs);\n\n this.deps.logger.info('Follow-up worker started', {\n intervalMs: this.deps.options.followUpCheckIntervalMs,\n });\n }\n\n stop(): void {\n if (this.intervalId) {\n clearInterval(this.intervalId);\n this.intervalId = null;\n }\n this.deps.logger.info('Follow-up worker stopped');\n }\n\n private async tick(): Promise<void> {\n if (this.running) return;\n this.running = true;\n\n try {\n const dueCallLogs = await this.deps.CallLog.find({\n nextFollowUpDate: { $lte: new Date() },\n isClosed: false,\n followUpNotifiedAt: null,\n });\n\n for (const callLog of dueCallLogs) {\n try {\n if (this.deps.hooks.onFollowUpDue) {\n await this.deps.hooks.onFollowUpDue(callLog as unknown as ICallLog);\n }\n\n await this.deps.CallLog.findOneAndUpdate(\n { _id: callLog._id },\n {\n $set: { followUpNotifiedAt: new Date() },\n $push: {\n timeline: {\n entryId: crypto.randomUUID(),\n type: TimelineEntryType.FollowUpCompleted,\n content: SYSTEM_TIMELINE.FollowUpCompleted,\n createdAt: new Date(),\n },\n },\n },\n );\n\n this.deps.logger.info('Follow-up notification fired', {\n callLogId: callLog.callLogId,\n });\n } catch (err) {\n this.deps.logger.error('Failed to process follow-up for call log', {\n callLogId: callLog.callLogId,\n error: err instanceof Error ? err.message : 'Unknown error',\n });\n }\n }\n } finally {\n this.running = false;\n }\n }\n}\n","import { z } from 'zod';\nimport { noopLogger } from '@astralibx/core';\nimport type { Router } from 'express';\nimport type { Model } from 'mongoose';\nimport type { CallLogEngineConfig, ResolvedOptions } from '@astralibx/call-log-types';\nimport { DEFAULT_OPTIONS } from '@astralibx/call-log-types';\nimport {\n createPipelineModel,\n type IPipelineDocument,\n} from './schemas/pipeline.schema.js';\nimport {\n createCallLogModel,\n type ICallLogDocument,\n} from './schemas/call-log.schema.js';\nimport {\n createCallLogSettingsModel,\n type ICallLogSettingsDocument,\n} from './schemas/call-log-settings.schema.js';\nimport { SettingsService } from './services/settings.service.js';\nimport { PipelineService } from './services/pipeline.service.js';\nimport { TimelineService } from './services/timeline.service.js';\nimport { CallLogService } from './services/call-log.service.js';\nimport { CallLogLifecycleService } from './services/call-log-lifecycle.service.js';\nimport { AnalyticsService } from './services/analytics.service.js';\nimport { PipelineAnalyticsService } from './services/pipeline-analytics.service.js';\nimport { ExportService } from './services/export.service.js';\nimport { createRoutes } from './routes/index.js';\nimport { FollowUpWorker } from './workers/follow-up.worker.js';\n\n// ── Zod validation schema ─────────────────────────────────────────────────────\n\nconst CallLogEngineConfigSchema = z.object({\n db: z.object({\n connection: z.unknown(),\n collectionPrefix: z.string().optional(),\n }),\n logger: z\n .object({\n info: z.function(),\n warn: z.function(),\n error: z.function(),\n debug: z.function(),\n })\n .optional(),\n agents: z\n .object({\n collectionName: z.string().optional(),\n resolveAgent: z.function().optional(),\n })\n .optional()\n .default({}),\n adapters: z.object({\n lookupContact: z.function(),\n addContact: z.function().optional(),\n authenticateAgent: z.function(),\n }),\n hooks: z\n .object({\n onCallCreated: z.function().optional(),\n onStageChanged: z.function().optional(),\n onCallClosed: z.function().optional(),\n onCallAssigned: z.function().optional(),\n onFollowUpDue: z.function().optional(),\n onMetric: z.function().optional(),\n })\n .optional(),\n options: z\n .object({\n maxTimelineEntries: z.number().int().positive().optional(),\n followUpCheckIntervalMs: z.number().int().positive().optional(),\n enableAgentScoping: z.boolean().optional(),\n })\n .optional(),\n});\n\n// ── Return type ───────────────────────────────────────────────────────────────\n\nexport interface CallLogEngine {\n pipelines: PipelineService;\n callLogs: CallLogService;\n lifecycle: CallLogLifecycleService;\n timeline: TimelineService;\n analytics: AnalyticsService;\n pipelineAnalytics: PipelineAnalyticsService;\n settings: SettingsService;\n export: ExportService;\n routes: Router;\n models: {\n Pipeline: Model<IPipelineDocument>;\n CallLog: Model<ICallLogDocument>;\n CallLogSettings: Model<ICallLogSettingsDocument>;\n };\n destroy: () => Promise<void>;\n}\n\n// ── Factory ───────────────────────────────────────────────────────────────────\n\nexport function createCallLogEngine(config: CallLogEngineConfig): CallLogEngine {\n // 1. Validate config with Zod\n const parseResult = CallLogEngineConfigSchema.safeParse(config);\n if (!parseResult.success) {\n const issues = parseResult.error.issues\n .map((i) => `${i.path.join('.')}: ${i.message}`)\n .join(', ');\n throw new Error(`Invalid CallLogEngineConfig: ${issues}`);\n }\n\n // 2. Resolve options\n const resolvedOptions: ResolvedOptions = {\n ...DEFAULT_OPTIONS,\n ...config.options,\n };\n\n // 3. Set up logger\n const logger = config.logger ?? noopLogger;\n\n // 4. Register models\n const conn = config.db.connection as import('mongoose').Connection;\n const prefix = config.db.collectionPrefix;\n\n const Pipeline = createPipelineModel(conn, prefix);\n const CallLog = createCallLogModel(conn, prefix);\n const CallLogSettings = createCallLogSettingsModel(conn, prefix);\n\n // 5. Create services\n const settingsService = new SettingsService(CallLogSettings, logger);\n\n const pipelineService = new PipelineService(Pipeline, CallLog, logger);\n\n const timelineService = new TimelineService(CallLog, logger, resolvedOptions);\n\n const callLogService = new CallLogService(\n CallLog,\n Pipeline,\n timelineService,\n logger,\n config.hooks ?? {},\n resolvedOptions,\n );\n\n const callLogLifecycleService = new CallLogLifecycleService(\n CallLog,\n Pipeline,\n timelineService,\n logger,\n config.hooks ?? {},\n resolvedOptions,\n );\n\n const analyticsService = new AnalyticsService(CallLog, Pipeline, logger, config.agents?.resolveAgent);\n\n const pipelineAnalyticsService = new PipelineAnalyticsService(\n CallLog,\n Pipeline,\n logger,\n config.agents?.resolveAgent,\n );\n\n const exportService = new ExportService(CallLog, pipelineAnalyticsService, logger);\n\n // 6. Create routes\n const routes = createRoutes(\n {\n pipelines: pipelineService,\n callLogs: callLogService,\n lifecycle: callLogLifecycleService,\n timeline: timelineService,\n analytics: analyticsService,\n pipelineAnalytics: pipelineAnalyticsService,\n settings: settingsService,\n export: exportService,\n },\n {\n authenticateRequest: config.adapters.authenticateAgent\n ? async (req) => {\n const expressReq = req as unknown as { headers: Record<string, string | undefined> };\n const authHeader = expressReq.headers?.['authorization'];\n const token = authHeader?.startsWith('Bearer ')\n ? authHeader.slice(7)\n : authHeader;\n if (!token) return null;\n return config.adapters.authenticateAgent(token);\n }\n : undefined,\n logger,\n enableAgentScoping: resolvedOptions.enableAgentScoping,\n },\n );\n\n // 7. Start FollowUpWorker\n const followUpWorker = new FollowUpWorker({\n CallLog,\n hooks: { onFollowUpDue: config.hooks?.onFollowUpDue },\n logger,\n options: resolvedOptions,\n });\n\n followUpWorker.start();\n\n // 8. Return engine object\n async function destroy(): Promise<void> {\n followUpWorker.stop();\n logger.info('CallLogEngine destroyed');\n }\n\n return {\n pipelines: pipelineService,\n callLogs: callLogService,\n lifecycle: callLogLifecycleService,\n timeline: timelineService,\n analytics: analyticsService,\n pipelineAnalytics: pipelineAnalyticsService,\n settings: settingsService,\n export: exportService,\n routes,\n models: { Pipeline, CallLog, CallLogSettings },\n destroy,\n };\n}\n\n// ── Barrel re-exports ─────────────────────────────────────────────────────────\n\nexport * from './constants/index.js';\nexport * from './errors/index.js';\nexport * from './schemas/pipeline.schema.js';\nexport * from './schemas/call-log.schema.js';\nexport * from './schemas/call-log-settings.schema.js';\nexport * from './validation/pipeline.validator.js';\nexport { SettingsService } from './services/settings.service.js';\nexport { PipelineService } from './services/pipeline.service.js';\nexport { TimelineService } from './services/timeline.service.js';\nexport { CallLogService } from './services/call-log.service.js';\nexport { CallLogLifecycleService } from './services/call-log-lifecycle.service.js';\nexport { AnalyticsService } from './services/analytics.service.js';\nexport { PipelineAnalyticsService } from './services/pipeline-analytics.service.js';\nexport { ExportService } from './services/export.service.js';\nexport { FollowUpWorker } from './workers/follow-up.worker.js';\nexport { createRoutes } from './routes/index.js';\nexport type { CallLogEngineConfig, ResolvedOptions } from '@astralibx/call-log-types';\nexport { DEFAULT_OPTIONS } from '@astralibx/call-log-types';\n"]}
1
+ {"version":3,"sources":["../src/schemas/pipeline.schema.ts","../src/schemas/call-log.schema.ts","../src/constants/index.ts","../src/schemas/call-log-settings.schema.ts","../src/errors/index.ts","../src/services/settings.service.ts","../src/validation/pipeline.validator.ts","../src/services/pipeline.service.ts","../src/services/timeline.service.ts","../src/services/call-log.service.ts","../src/services/call-log-lifecycle.service.ts","../src/services/analytics.service.ts","../src/services/pipeline-analytics.service.ts","../src/services/export.service.ts","../src/routes/pipeline.routes.ts","../src/routes/call-log.routes.ts","../src/routes/contact.routes.ts","../src/routes/analytics.routes.ts","../src/routes/settings.routes.ts","../src/routes/index.ts","../src/workers/follow-up.worker.ts","../src/index.ts"],"names":["crypto","Schema","CallPriority","TimelineEntryType","Router","sendSuccess","sendError","getScopedAgentId"],"mappings":";;;;;;;;;AAaO,IAAM,sBAAsB,IAAI,MAAA;AAAA,EACrC;AAAA,IACE,OAAA,EAAS,EAAE,IAAA,EAAM,MAAA,EAAQ,QAAA,EAAU,MAAM,OAAA,EAAS,MAAMA,OAAA,CAAO,UAAA,EAAW,EAAE;AAAA,IAC5E,IAAA,EAAM,EAAE,IAAA,EAAM,MAAA,EAAQ,UAAU,IAAA,EAAK;AAAA,IACrC,KAAA,EAAO,EAAE,IAAA,EAAM,MAAA,EAAQ,UAAU,IAAA,EAAK;AAAA,IACtC,KAAA,EAAO,EAAE,IAAA,EAAM,MAAA,EAAQ,UAAU,IAAA,EAAK;AAAA,IACtC,UAAA,EAAY,EAAE,IAAA,EAAM,OAAA,EAAS,SAAS,KAAA,EAAM;AAAA,IAC5C,SAAA,EAAW,EAAE,IAAA,EAAM,OAAA,EAAS,SAAS,KAAA;AAAM,GAC7C;AAAA,EACA,EAAE,KAAK,KAAA;AACT;AAIO,IAAM,iBAAiB,IAAI,MAAA;AAAA,EAChC;AAAA,IACE,UAAA,EAAY,EAAE,IAAA,EAAM,MAAA,EAAQ,QAAA,EAAU,IAAA,EAAM,MAAA,EAAQ,IAAA,EAAM,OAAA,EAAS,MAAMA,OAAA,CAAO,UAAA,EAAW,EAAE;AAAA,IAC7F,IAAA,EAAM,EAAE,IAAA,EAAM,MAAA,EAAQ,UAAU,IAAA,EAAK;AAAA,IACrC,WAAA,EAAa,EAAE,IAAA,EAAM,MAAA,EAAO;AAAA,IAC5B,QAAQ,EAAE,IAAA,EAAM,CAAC,mBAAmB,CAAA,EAAG,UAAU,IAAA,EAAK;AAAA,IACtD,UAAU,EAAE,IAAA,EAAM,SAAS,OAAA,EAAS,IAAA,EAAM,OAAO,IAAA,EAAK;AAAA,IACtD,SAAA,EAAW,EAAE,IAAA,EAAM,OAAA,EAAS,SAAS,KAAA,EAAM;AAAA,IAC3C,SAAA,EAAW,EAAE,IAAA,EAAM,OAAA,EAAS,SAAS,KAAA,EAAM;AAAA,IAC3C,SAAA,EAAW,EAAE,IAAA,EAAM,MAAA,EAAQ,UAAU,IAAA,EAAK;AAAA,IAC1C,QAAA,EAAU,EAAE,IAAA,EAAM,MAAA,EAAQ,QAAQ,IAAA,EAAK;AAAA,IACvC,QAAA,EAAU,EAAE,IAAA,EAAM,MAAA,CAAO,MAAM,KAAA;AAAM,GACvC;AAAA,EACA;AAAA,IACE,UAAA,EAAY;AAAA;AAEhB;AASO,SAAS,mBAAA,CACd,YACA,MAAA,EAC0B;AAC1B,EAAA,MAAM,cAAA,GAAiB,MAAA,GAAS,CAAA,EAAG,MAAM,CAAA,UAAA,CAAA,GAAe,WAAA;AACxD,EAAA,OAAO,UAAA,CAAW,KAAA,CAAyB,UAAA,EAAY,cAAA,EAAgB,cAAc,CAAA;AACvF;AC5CO,IAAM,mBAAmB,IAAIC,MAAAA;AAAA,EAClC;AAAA,IACE,UAAA,EAAY,EAAE,IAAA,EAAM,MAAA,EAAQ,UAAU,IAAA,EAAK;AAAA,IAC3C,WAAA,EAAa,EAAE,IAAA,EAAM,MAAA,EAAQ,UAAU,IAAA,EAAK;AAAA,IAC5C,KAAA,EAAO,EAAE,IAAA,EAAM,MAAA,EAAO;AAAA,IACtB,KAAA,EAAO,EAAE,IAAA,EAAM,MAAA;AAAO,GACxB;AAAA,EACA,EAAE,KAAK,KAAA;AACT;AAEO,IAAM,sBAAsB,IAAIA,MAAAA;AAAA,EACrC;AAAA,IACE,OAAA,EAAS,EAAE,IAAA,EAAM,MAAA,EAAQ,QAAA,EAAU,MAAM,OAAA,EAAS,MAAMD,OAAAA,CAAO,UAAA,EAAW,EAAE;AAAA,IAC5E,IAAA,EAAM;AAAA,MACJ,IAAA,EAAM,MAAA;AAAA,MACN,QAAA,EAAU,IAAA;AAAA,MACV,IAAA,EAAM,MAAA,CAAO,MAAA,CAAO,iBAAiB;AAAA,KACvC;AAAA,IACA,OAAA,EAAS,EAAE,IAAA,EAAM,MAAA,EAAO;AAAA,IACxB,QAAA,EAAU,EAAE,IAAA,EAAM,MAAA,EAAO;AAAA,IACzB,UAAA,EAAY,EAAE,IAAA,EAAM,MAAA,EAAO;AAAA,IAC3B,WAAA,EAAa,EAAE,IAAA,EAAM,MAAA,EAAO;AAAA,IAC5B,aAAA,EAAe,EAAE,IAAA,EAAM,MAAA,EAAO;AAAA,IAC9B,SAAA,EAAW,EAAE,IAAA,EAAM,MAAA,EAAO;AAAA,IAC1B,WAAA,EAAa,EAAE,IAAA,EAAM,MAAA,EAAO;AAAA,IAC5B,WAAA,EAAa,EAAE,IAAA,EAAM,MAAA,EAAO;AAAA,IAC5B,aAAA,EAAe,EAAE,IAAA,EAAM,MAAA,EAAO;AAAA,IAC9B,SAAA,EAAW,EAAE,IAAA,EAAM,MAAA,EAAO;AAAA,IAC1B,WAAA,EAAa,EAAE,IAAA,EAAM,MAAA,EAAO;AAAA,IAC5B,WAAW,EAAE,IAAA,EAAM,IAAA,EAAM,OAAA,EAAS,KAAK,GAAA;AAAI,GAC7C;AAAA,EACA,EAAE,KAAK,KAAA;AACT;AAEO,IAAM,oBAAoB,IAAIC,MAAAA;AAAA,EACnC;AAAA,IACE,WAAA,EAAa,EAAE,IAAA,EAAM,MAAA,EAAQ,UAAU,IAAA,EAAK;AAAA,IAC5C,SAAA,EAAW,EAAE,IAAA,EAAM,MAAA,EAAQ,UAAU,IAAA,EAAK;AAAA,IAC1C,aAAA,EAAe,EAAE,IAAA,EAAM,MAAA,EAAQ,UAAU,IAAA,EAAK;AAAA,IAC9C,WAAA,EAAa,EAAE,IAAA,EAAM,MAAA,EAAQ,UAAU,IAAA,EAAK;AAAA,IAC5C,SAAA,EAAW,EAAE,IAAA,EAAM,MAAA,EAAQ,UAAU,IAAA,EAAK;AAAA,IAC1C,SAAA,EAAW,EAAE,IAAA,EAAM,IAAA,EAAM,UAAU,IAAA,EAAK;AAAA,IACxC,aAAA,EAAe,EAAE,IAAA,EAAM,MAAA,EAAQ,UAAU,IAAA;AAAK,GAChD;AAAA,EACA,EAAE,KAAK,KAAA;AACT;AAIO,IAAM,gBAAgB,IAAIA,MAAAA;AAAA,EAC/B;AAAA,IACE,SAAA,EAAW,EAAE,IAAA,EAAM,MAAA,EAAQ,QAAA,EAAU,IAAA,EAAM,MAAA,EAAQ,IAAA,EAAM,OAAA,EAAS,MAAMD,OAAAA,CAAO,UAAA,EAAW,EAAE;AAAA,IAC5F,YAAY,EAAE,IAAA,EAAM,QAAQ,QAAA,EAAU,IAAA,EAAM,OAAO,IAAA,EAAK;AAAA,IACxD,gBAAgB,EAAE,IAAA,EAAM,QAAQ,QAAA,EAAU,IAAA,EAAM,OAAO,IAAA,EAAK;AAAA,IAC5D,UAAA,EAAY,EAAE,IAAA,EAAM,gBAAA,EAAkB,UAAU,IAAA,EAAK;AAAA,IACrD,SAAA,EAAW;AAAA,MACT,IAAA,EAAM,MAAA;AAAA,MACN,QAAA,EAAU,IAAA;AAAA,MACV,IAAA,EAAM,MAAA,CAAO,MAAA,CAAO,aAAa;AAAA,KACnC;AAAA,IACA,UAAU,EAAE,IAAA,EAAM,MAAM,QAAA,EAAU,IAAA,EAAM,OAAO,IAAA,EAAK;AAAA,IACpD,gBAAA,EAAkB,EAAE,IAAA,EAAM,IAAA,EAAM,OAAO,IAAA,EAAK;AAAA,IAC5C,kBAAA,EAAoB,EAAE,IAAA,EAAM,IAAA,EAAK;AAAA,IACjC,QAAA,EAAU;AAAA,MACR,IAAA,EAAM,MAAA;AAAA,MACN,QAAA,EAAU,IAAA;AAAA,MACV,IAAA,EAAM,MAAA,CAAO,MAAA,CAAO,YAAY,CAAA;AAAA,MAChC,SAAS,YAAA,CAAa;AAAA,KACxB;AAAA,IACA,OAAA,EAAS,EAAE,IAAA,EAAMC,MAAAA,CAAO,MAAM,QAAA,EAAU,QAAA,EAAU,IAAA,EAAM,KAAA,EAAO,IAAA,EAAK;AAAA,IACpE,UAAA,EAAY,EAAE,IAAA,EAAM,MAAA,EAAO;AAAA,IAC3B,IAAA,EAAM,EAAE,IAAA,EAAM,CAAC,MAAM,GAAG,OAAA,EAAS,EAAC,EAAG,KAAA,EAAO,IAAA,EAAK;AAAA,IACjD,QAAA,EAAU,EAAE,IAAA,EAAM,MAAA,EAAO;AAAA,IACzB,QAAA,EAAU,EAAE,IAAA,EAAM,CAAC,mBAAmB,CAAA,EAAG,OAAA,EAAS,EAAC,EAAE;AAAA,IACrD,YAAA,EAAc,EAAE,IAAA,EAAM,CAAC,iBAAiB,CAAA,EAAG,OAAA,EAAS,EAAC,EAAE;AAAA,IACvD,eAAA,EAAiB,EAAE,IAAA,EAAM,MAAA,EAAQ,KAAK,CAAA,EAAE;AAAA,IACxC,SAAS,EAAE,IAAA,EAAM,QAAQ,OAAA,EAAS,OAAA,EAAS,OAAO,IAAA,EAAK;AAAA,IACvD,SAAS,EAAE,IAAA,EAAM,QAAQ,OAAA,EAAS,SAAA,EAAW,OAAO,IAAA,EAAK;AAAA,IACzD,YAAY,EAAE,IAAA,EAAM,SAAS,OAAA,EAAS,KAAA,EAAO,OAAO,IAAA,EAAK;AAAA,IACzD,SAAA,EAAW,EAAE,IAAA,EAAM,OAAA,EAAS,SAAS,KAAA,EAAM;AAAA,IAC3C,SAAA,EAAW,EAAE,IAAA,EAAM,IAAA,EAAK;AAAA,IACxB,UAAU,EAAE,IAAA,EAAM,SAAS,OAAA,EAAS,KAAA,EAAO,OAAO,IAAA,EAAK;AAAA,IACvD,QAAA,EAAU,EAAE,IAAA,EAAM,IAAA,EAAK;AAAA,IACvB,QAAA,EAAU,EAAE,IAAA,EAAM,MAAA,EAAQ,QAAQ,IAAA,EAAK;AAAA,IACvC,QAAA,EAAU,EAAE,IAAA,EAAMA,MAAAA,CAAO,MAAM,KAAA;AAAM,GACvC;AAAA,EACA;AAAA,IACE,UAAA,EAAY;AAAA;AAEhB;AAKA,aAAA,CAAc,KAAA,CAAM,EAAE,uBAAA,EAAyB,CAAA,EAAG,CAAA;AAClD,aAAA,CAAc,MAAM,EAAE,UAAA,EAAY,CAAA,EAAG,cAAA,EAAgB,GAAG,CAAA;AACxD,aAAA,CAAc,MAAM,EAAE,OAAA,EAAS,CAAA,EAAG,QAAA,EAAU,GAAG,CAAA;AAC/C,aAAA,CAAc,MAAM,EAAE,SAAA,EAAW,CAAA,EAAG,QAAA,EAAU,GAAG,CAAA;AAI1C,SAAS,kBAAA,CACd,YACA,MAAA,EACyB;AACzB,EAAA,MAAM,cAAA,GAAiB,MAAA,GAAS,CAAA,EAAG,MAAM,CAAA,UAAA,CAAA,GAAe,WAAA;AACxD,EAAA,OAAO,UAAA,CAAW,KAAA,CAAwB,SAAA,EAAW,aAAA,EAAe,cAAc,CAAA;AACpF;;;ACxHO,IAAM,UAAA,GAAa;AAAA,EACxB,gBAAA,EAAkB,yBAAA;AAAA,EAClB,eAAA,EAAiB,uBAAA;AAAA,EACjB,aAAA,EAAe,sBAAA;AAAA,EACf,UAAA,EAAY,mBAAA;AAAA,EACZ,eAAA,EAAiB,oBAAA;AAAA,EACjB,aAAA,EAAe,iBAAA;AAAA,EACf,cAAA,EAAgB,kBAAA;AAAA,EAChB,eAAA,EAAiB,wBAAA;AAAA,EACjB,iBAAA,EAAmB,0BAAA;AAAA,EACnB,aAAA,EAAe,qBAAA;AAAA,EACf,UAAA,EAAY;AACd;AAKO,IAAM,aAAA,GAAgB;AAAA,EAC3B,gBAAA,EAAkB,oBAAA;AAAA,EAClB,sBAAA,EAAwB,8CAAA;AAAA,EACxB,uBAAA,EAAyB,gDAAA;AAAA,EACzB,2BAAA,EAA6B,8CAAA;AAAA,EAC7B,aAAA,EAAe,6BAAA;AAAA,EACf,UAAA,EAAY,2CAAA;AAAA,EACZ,eAAA,EAAiB,oBAAA;AAAA,EACjB,aAAA,EAAe,iCAAA;AAAA,EACf,cAAA,EAAgB,2BAAA;AAAA,EAChB,eAAA,EAAiB,mBAAA;AAAA,EACjB,iBAAA,EAAmB,4CAAA;AAAA,EACnB,UAAA,EAAY;AACd;AAGO,IAAM,iBAAA,GAAoB;AAAA,EAC/B,SAAA,EAAW;AACb;AAGO,IAAM,iBAAA,GAAoB;AAAA,EAC/B,kBAAA,EAAoB,GAAA;AAAA,EACpB,mBAAA,EAAqB,CAAA;AAAA,EACrB,gBAAA,EAAkB;AACpB;AAGO,IAAM,mBAAA,GAAsB;AAAA,EACjC,kBAAA,EAAoB;AACtB;AAGO,IAAM,eAAA,GAAkB;AAAA,EAC7B,WAAA,EAAa,kBAAA;AAAA,EACb,UAAA,EAAY,aAAA;AAAA,EACZ,YAAA,EAAc,eAAA;AAAA,EACd,iBAAA,EAAmB;AACrB;AAEO,IAAM,kBAAA,GAAqB;AAAA,EAChC,cAAc,CAAC,IAAA,EAAc,OAAe,CAAA,oBAAA,EAAuB,IAAI,SAAS,EAAE,CAAA,CAAA,CAAA;AAAA,EAClF,YAAA,EAAc,CAAC,SAAA,KAAsB,CAAA,iBAAA,EAAoB,SAAS,CAAA,CAAA;AAAA,EAClE,gBAAgB,CAAC,IAAA,EAAc,OAAe,CAAA,qBAAA,EAAwB,IAAI,OAAO,EAAE,CAAA,CAAA;AAAA,EACnF,WAAA,EAAa,CAAC,IAAA,KAAiB,CAAA,wBAAA,EAA2B,IAAI,CAAA,CAAA;AAAA,EAC9D,WAAA,EAAa,CAAC,SAAA,KAAsB,CAAA,gBAAA,EAAmB,SAAS,CAAA,CAAA;AAAA,EAChE,qBAAqB,MAAM;AAC7B;;;ACrDA,IAAM,uBAAA,GAA6C;AAAA,EACjD,EAAE,OAAOC,YAAAA,CAAa,GAAA,EAAK,OAAO,KAAA,EAAO,KAAA,EAAO,SAAA,EAAW,KAAA,EAAO,CAAA,EAAE;AAAA,EACpE,EAAE,OAAOA,YAAAA,CAAa,MAAA,EAAQ,OAAO,QAAA,EAAU,KAAA,EAAO,SAAA,EAAW,KAAA,EAAO,CAAA,EAAE;AAAA,EAC1E,EAAE,OAAOA,YAAAA,CAAa,IAAA,EAAM,OAAO,MAAA,EAAQ,KAAA,EAAO,SAAA,EAAW,KAAA,EAAO,CAAA,EAAE;AAAA,EACtE,EAAE,OAAOA,YAAAA,CAAa,MAAA,EAAQ,OAAO,QAAA,EAAU,KAAA,EAAO,SAAA,EAAW,KAAA,EAAO,CAAA;AAC1E,CAAA;AAIA,IAAM,uBAAuB,IAAID,MAAAA;AAAA,EAC/B;AAAA,IACE,KAAA,EAAO,EAAE,IAAA,EAAM,MAAA,EAAQ,UAAU,IAAA,EAAK;AAAA,IACtC,KAAA,EAAO,EAAE,IAAA,EAAM,MAAA,EAAQ,UAAU,IAAA,EAAK;AAAA,IACtC,KAAA,EAAO,EAAE,IAAA,EAAM,MAAA,EAAQ,UAAU,IAAA,EAAK;AAAA,IACtC,KAAA,EAAO,EAAE,IAAA,EAAM,MAAA,EAAQ,UAAU,IAAA;AAAK,GACxC;AAAA,EACA,EAAE,KAAK,KAAA;AACT,CAAA;AAIO,IAAM,wBAAwB,IAAIA,MAAAA;AAAA,EACvC;AAAA,IACE,KAAK,EAAE,IAAA,EAAM,QAAQ,QAAA,EAAU,IAAA,EAAM,SAAS,QAAA,EAAS;AAAA,IACvD,aAAA,EAAe,EAAE,IAAA,EAAM,CAAC,MAAM,CAAA,EAAG,OAAA,EAAS,EAAC,EAAE;AAAA,IAC7C,mBAAA,EAAqB,EAAE,IAAA,EAAM,CAAC,MAAM,CAAA,EAAG,OAAA,EAAS,EAAC,EAAE;AAAA,IACnD,iBAAA,EAAmB,EAAE,IAAA,EAAM,CAAC,MAAM,CAAA,EAAG,OAAA,EAAS,CAAC,OAAA,EAAS,UAAA,EAAY,UAAA,EAAY,aAAa,CAAA,EAAE;AAAA,IAC/F,mBAAmB,EAAE,IAAA,EAAM,CAAC,MAAM,GAAG,OAAA,EAAS,CAAC,SAAA,EAAW,YAAA,EAAc,kBAAkB,WAAA,EAAa,MAAA,EAAQ,oBAAA,EAAsB,YAAA,EAAc,WAAW,CAAA,EAAE;AAAA,IAChK,cAAA,EAAgB;AAAA,MACd,IAAA,EAAM,CAAC,oBAAoB,CAAA;AAAA,MAC3B,OAAA,EAAS,MAAM,uBAAA,CAAwB,GAAA,CAAI,CAAC,CAAA,MAAO,EAAE,GAAG,CAAA,EAAE,CAAE;AAAA,KAC9D;AAAA,IACA,mBAAA,EAAqB;AAAA,MACnB,IAAA,EAAM,MAAA;AAAA,MACN,SAAS,iBAAA,CAAkB;AAAA,KAC7B;AAAA,IACA,uBAAA,EAAyB,EAAE,IAAA,EAAM,OAAA,EAAS,SAAS,IAAA,EAAK;AAAA,IACxD,iBAAA,EAAmB,EAAE,IAAA,EAAM,MAAA,EAAO;AAAA,IAClC,gBAAA,EAAkB;AAAA,MAChB,IAAA,EAAM,MAAA;AAAA,MACN,SAAS,iBAAA,CAAkB;AAAA,KAC7B;AAAA,IACA,kBAAA,EAAoB;AAAA,MAClB,IAAA,EAAM,MAAA;AAAA,MACN,SAAS,mBAAA,CAAoB;AAAA,KAC/B;AAAA,IACA,QAAA,EAAU,EAAE,IAAA,EAAM,MAAA,EAAQ,QAAQ,IAAA,EAAK;AAAA,IACvC,QAAA,EAAU,EAAE,IAAA,EAAMA,MAAAA,CAAO,MAAM,KAAA;AAAM,GACvC;AAAA,EACA;AAAA,IACE,UAAA,EAAY;AAAA;AAEhB;AAEA,qBAAA,CAAsB,KAAA,CAAM,EAAE,GAAA,EAAK,CAAA,EAAG,QAAA,EAAU,GAAE,EAAG,EAAE,MAAA,EAAQ,IAAA,EAAM,CAAA;AAI9D,SAAS,0BAAA,CACd,YACA,MAAA,EACiC;AACjC,EAAA,MAAM,cAAA,GAAiB,MAAA,GAAS,CAAA,EAAG,MAAM,CAAA,kBAAA,CAAA,GAAuB,mBAAA;AAChE,EAAA,OAAO,UAAA,CAAW,KAAA;AAAA,IAChB,iBAAA;AAAA,IACA,qBAAA;AAAA,IACA;AAAA,GACF;AACF;AC3EO,IAAM,eAAA,GAAN,cAA8B,QAAA,CAAS;AAAA,EAC5C,WAAA,CAAY,OAAA,EAAiB,IAAA,EAA8B,OAAA,EAAmC;AAC5F,IAAA,KAAA,CAAM,SAAS,IAAI,CAAA;AADsC,IAAA,IAAA,CAAA,OAAA,GAAA,OAAA;AAEzD,IAAA,IAAA,CAAK,IAAA,GAAO,iBAAA;AAAA,EACd;AACF;AAIO,IAAM,qBAAA,GAAN,cAAoC,eAAA,CAAgB;AAAA,EACzD,YAA4B,UAAA,EAAoB;AAC9C,IAAA,KAAA,CAAM,uBAAuB,UAAU,CAAA,CAAA,EAAI,WAAW,gBAAA,EAAkB,EAAE,YAAY,CAAA;AAD5D,IAAA,IAAA,CAAA,UAAA,GAAA,UAAA;AAE1B,IAAA,IAAA,CAAK,IAAA,GAAO,uBAAA;AAAA,EACd;AACF;AAEO,IAAM,oBAAA,GAAN,cAAmC,eAAA,CAAgB;AAAA,EACxD,WAAA,CACkB,QACA,UAAA,EAChB;AACA,IAAA,KAAA;AAAA,MACE,aACI,CAAA,kBAAA,EAAqB,UAAU,MAAM,MAAM,CAAA,CAAA,GAC3C,qBAAqB,MAAM,CAAA,CAAA;AAAA,MAC/B,UAAA,CAAW,eAAA;AAAA,MACX,EAAE,YAAY,MAAA;AAAO,KACvB;AATgB,IAAA,IAAA,CAAA,MAAA,GAAA,MAAA;AACA,IAAA,IAAA,CAAA,UAAA,GAAA,UAAA;AAShB,IAAA,IAAA,CAAK,IAAA,GAAO,sBAAA;AAAA,EACd;AACF;AAEO,IAAM,kBAAA,GAAN,cAAiC,eAAA,CAAgB;AAAA,EACtD,WAAA,CACkB,YACA,OAAA,EAChB;AACA,IAAA,KAAA;AAAA,MACE,CAAA,OAAA,EAAU,OAAO,CAAA,yBAAA,EAA4B,UAAU,CAAA,CAAA,CAAA;AAAA,MACvD,UAAA,CAAW,aAAA;AAAA,MACX,EAAE,YAAY,OAAA;AAAQ,KACxB;AAPgB,IAAA,IAAA,CAAA,UAAA,GAAA,UAAA;AACA,IAAA,IAAA,CAAA,OAAA,GAAA,OAAA;AAOhB,IAAA,IAAA,CAAK,IAAA,GAAO,oBAAA;AAAA,EACd;AACF;AAEO,IAAM,eAAA,GAAN,cAA8B,eAAA,CAAgB;AAAA,EACnD,WAAA,CACkB,UAAA,EACA,OAAA,EACA,eAAA,EAChB;AACA,IAAA,KAAA;AAAA,MACE,CAAA,qBAAA,EAAwB,OAAO,CAAA,eAAA,EAAkB,UAAU,MAAM,eAAe,CAAA,eAAA,CAAA;AAAA,MAChF,UAAA,CAAW,UAAA;AAAA,MACX,EAAE,UAAA,EAAY,OAAA,EAAS,eAAA;AAAgB,KACzC;AARgB,IAAA,IAAA,CAAA,UAAA,GAAA,UAAA;AACA,IAAA,IAAA,CAAA,OAAA,GAAA,OAAA;AACA,IAAA,IAAA,CAAA,eAAA,GAAA,eAAA;AAOhB,IAAA,IAAA,CAAK,IAAA,GAAO,iBAAA;AAAA,EACd;AACF;AAEO,IAAM,oBAAA,GAAN,cAAmC,eAAA,CAAgB;AAAA,EACxD,YAA4B,SAAA,EAAmB;AAC7C,IAAA,KAAA,CAAM,uBAAuB,SAAS,CAAA,CAAA,EAAI,WAAW,eAAA,EAAiB,EAAE,WAAW,CAAA;AADzD,IAAA,IAAA,CAAA,SAAA,GAAA,SAAA;AAE1B,IAAA,IAAA,CAAK,IAAA,GAAO,sBAAA;AAAA,EACd;AACF;AAEO,IAAM,kBAAA,GAAN,cAAiC,eAAA,CAAgB;AAAA,EACtD,WAAA,CACkB,WACA,eAAA,EAChB;AACA,IAAA,KAAA;AAAA,MACE,CAAA,OAAA,EAAU,eAAe,CAAA,qBAAA,EAAwB,SAAS,CAAA,CAAA,CAAA;AAAA,MAC1D,UAAA,CAAW,aAAA;AAAA,MACX,EAAE,WAAW,eAAA;AAAgB,KAC/B;AAPgB,IAAA,IAAA,CAAA,SAAA,GAAA,SAAA;AACA,IAAA,IAAA,CAAA,eAAA,GAAA,eAAA;AAOhB,IAAA,IAAA,CAAK,IAAA,GAAO,oBAAA;AAAA,EACd;AACF;AAEO,IAAM,oBAAA,GAAN,cAAmC,eAAA,CAAgB;AAAA,EACxD,YAA4B,YAAA,EAAuC;AACjE,IAAA,KAAA;AAAA,MACE,CAAA,mBAAA,EAAsB,IAAA,CAAK,SAAA,CAAU,YAAY,CAAC,CAAA,CAAA;AAAA,MAClD,UAAA,CAAW,eAAA;AAAA,MACX,EAAE,YAAA;AAAa,KACjB;AAL0B,IAAA,IAAA,CAAA,YAAA,GAAA,YAAA;AAM1B,IAAA,IAAA,CAAK,IAAA,GAAO,sBAAA;AAAA,EACd;AACF;AAEO,IAAM,kBAAA,GAAN,cAAiC,eAAA,CAAgB;AAAA,EACtD,WAAA,CACkB,OAAA,EACA,YAAA,EACA,QAAA,EAChB;AACA,IAAA,KAAA;AAAA,MACE,CAAA,MAAA,EAAS,OAAO,CAAA,cAAA,EAAiB,YAAY,IAAI,QAAQ,CAAA,CAAA,CAAA;AAAA,MACzD,UAAA,CAAW,iBAAA;AAAA,MACX,EAAE,OAAA,EAAS,YAAA,EAAc,QAAA;AAAS,KACpC;AARgB,IAAA,IAAA,CAAA,OAAA,GAAA,OAAA;AACA,IAAA,IAAA,CAAA,YAAA,GAAA,YAAA;AACA,IAAA,IAAA,CAAA,QAAA,GAAA,QAAA;AAOhB,IAAA,IAAA,CAAK,IAAA,GAAO,oBAAA;AAAA,EACd;AACF;AAEO,IAAM,kBAAA,GAAN,cAAiC,eAAA,CAAgB;AAAA,EACtD,WAAA,CACkB,OACA,MAAA,EAChB;AACA,IAAA,KAAA,CAAM,CAAA,oBAAA,EAAuB,KAAK,CAAA,GAAA,EAAM,MAAM,CAAA,CAAA,EAAI,WAAW,aAAA,EAAe,EAAE,KAAA,EAAO,MAAA,EAAQ,CAAA;AAH7E,IAAA,IAAA,CAAA,KAAA,GAAA,KAAA;AACA,IAAA,IAAA,CAAA,MAAA,GAAA,MAAA;AAGhB,IAAA,IAAA,CAAK,IAAA,GAAO,oBAAA;AAAA,EACd;AACF;AAEO,IAAM,eAAA,GAAN,cAA8B,eAAA,CAAgB;AAAA,EACnD,YAA4B,MAAA,EAAiB;AAC3C,IAAA,KAAA;AAAA,MACE,MAAA,GAAS,CAAA,uBAAA,EAA0B,MAAM,CAAA,CAAA,GAAK,uBAAA;AAAA,MAC9C,UAAA,CAAW,UAAA;AAAA,MACX,EAAE,MAAA;AAAO,KACX;AAL0B,IAAA,IAAA,CAAA,MAAA,GAAA,MAAA;AAM1B,IAAA,IAAA,CAAK,IAAA,GAAO,iBAAA;AAAA,EACd;AACF;;;AC1HA,SAAS,oBAAA,CAAqB,KAAA,EAAgB,KAAA,EAAe,GAAA,EAAa,GAAA,EAAmB;AAC3F,EAAA,IAAI,OAAO,KAAA,KAAU,QAAA,IAAY,CAAC,MAAA,CAAO,SAAA,CAAU,KAAK,CAAA,IAAK,KAAA,GAAQ,GAAA,IAAO,KAAA,GAAQ,GAAA,EAAK;AACvF,IAAA,MAAM,IAAI,kBAAA,CAAmB,KAAA,EAAO,8BAA8B,GAAG,CAAA,KAAA,EAAQ,GAAG,CAAA,CAAE,CAAA;AAAA,EACpF;AACF;AAIO,IAAM,kBAAN,MAAsB;AAAA,EAC3B,WAAA,CACU,eAAA,EACA,MAAA,EACA,QAAA,EACR;AAHQ,IAAA,IAAA,CAAA,eAAA,GAAA,eAAA;AACA,IAAA,IAAA,CAAA,MAAA,GAAA,MAAA;AACA,IAAA,IAAA,CAAA,QAAA,GAAA,QAAA;AAAA,EACP;AAAA,EAEH,IAAY,cAAA,GAA0C;AACpD,IAAA,MAAM,MAAA,GAAkC,EAAE,GAAA,EAAK,QAAA,EAAS;AACxD,IAAA,IAAI,IAAA,CAAK,QAAA,EAAU,MAAA,CAAO,QAAA,GAAW,IAAA,CAAK,QAAA;AAC1C,IAAA,OAAO,MAAA;AAAA,EACT;AAAA,EAEQ,aAAA,GAAyC;AAC/C,IAAA,MAAM,QAAA,GAAoC;AAAA,MACxC,GAAA,EAAK,QAAA;AAAA,MACL,eAAe,EAAC;AAAA,MAChB,qBAAqB,EAAC;AAAA,MACtB,gBAAgB,EAAC;AAAA,MACjB,qBAAqB,iBAAA,CAAkB,mBAAA;AAAA,MACvC,uBAAA,EAAyB,IAAA;AAAA,MACzB,kBAAkB,iBAAA,CAAkB,gBAAA;AAAA,MACpC,oBAAoB,mBAAA,CAAoB;AAAA,KAC1C;AACA,IAAA,IAAI,IAAA,CAAK,QAAA,EAAU,QAAA,CAAS,QAAA,GAAW,IAAA,CAAK,QAAA;AAC5C,IAAA,OAAO,QAAA;AAAA,EACT;AAAA,EAEA,MAAM,GAAA,GAAyC;AAC7C,IAAA,OAAO,KAAK,eAAA,CAAgB,gBAAA;AAAA,MAC1B,IAAA,CAAK,cAAA;AAAA,MACL,EAAE,YAAA,EAAc,IAAA,CAAK,aAAA,EAAc,EAAE;AAAA,MACrC,EAAE,MAAA,EAAQ,IAAA,EAAM,GAAA,EAAK,IAAA;AAAK,KAC5B;AAAA,EACF;AAAA,EAEA,MAAM,OAAO,IAAA,EAY0B;AACrC,IAAA,IAAI,IAAA,CAAK,uBAAuB,IAAA,EAAM;AACpC,MAAA,oBAAA,CAAqB,IAAA,CAAK,mBAAA,EAAqB,qBAAA,EAAuB,CAAA,EAAG,EAAE,CAAA;AAAA,IAC7E;AACA,IAAA,IAAI,IAAA,CAAK,oBAAoB,IAAA,EAAM;AACjC,MAAA,oBAAA,CAAqB,IAAA,CAAK,gBAAA,EAAkB,kBAAA,EAAoB,CAAA,EAAG,GAAG,CAAA;AAAA,IACxE;AACA,IAAA,IAAI,IAAA,CAAK,sBAAsB,IAAA,EAAM;AACnC,MAAA,oBAAA,CAAqB,IAAA,CAAK,kBAAA,EAAoB,oBAAA,EAAsB,CAAA,EAAG,EAAE,CAAA;AAAA,IAC3E;AAEA,IAAA,MAAM,QAAA,GAAW,MAAM,IAAA,CAAK,eAAA,CAAgB,gBAAA;AAAA,MAC1C,IAAA,CAAK,cAAA;AAAA,MACL,EAAE,MAAM,IAAA,EAAK;AAAA,MACb,EAAE,MAAA,EAAQ,IAAA,EAAM,GAAA,EAAK,IAAA;AAAK,KAC5B;AACA,IAAA,IAAA,CAAK,MAAA,CAAO,KAAK,2BAAA,EAA6B,EAAE,QAAQ,MAAA,CAAO,IAAA,CAAK,IAAI,CAAA,EAAG,CAAA;AAC3E,IAAA,OAAO,QAAA;AAAA,EACT;AACF;;;AC1EO,SAAS,sBAAA,CAAuB,QAA0B,UAAA,EAA2B;AAE1F,EAAA,IAAI,MAAA,CAAO,WAAW,CAAA,EAAG;AACvB,IAAA,MAAM,IAAI,oBAAA,CAAqB,uCAAA,EAAyC,UAAU,CAAA;AAAA,EACpF;AAGA,EAAA,MAAM,gBAAgB,MAAA,CAAO,MAAA,CAAO,CAAC,CAAA,KAAM,EAAE,SAAS,CAAA;AACtD,EAAA,IAAI,aAAA,CAAc,WAAW,CAAA,EAAG;AAC9B,IAAA,MAAM,IAAI,oBAAA;AAAA,MACR,8CAAA;AAAA,MACA;AAAA,KACF;AAAA,EACF;AACA,EAAA,IAAI,aAAA,CAAc,SAAS,CAAA,EAAG;AAC5B,IAAA,MAAM,IAAI,oBAAA;AAAA,MACR,8CAAA;AAAA,MACA;AAAA,KACF;AAAA,EACF;AAGA,EAAA,MAAM,iBAAiB,MAAA,CAAO,MAAA,CAAO,CAAC,CAAA,KAAM,EAAE,UAAU,CAAA;AACxD,EAAA,IAAI,cAAA,CAAe,WAAW,CAAA,EAAG;AAC/B,IAAA,MAAM,IAAI,oBAAA;AAAA,MACR,gDAAA;AAAA,MACA;AAAA,KACF;AAAA,EACF;AAGA,EAAA,MAAM,QAAQ,MAAA,CAAO,GAAA,CAAI,CAAC,CAAA,KAAM,EAAE,IAAI,CAAA;AACtC,EAAA,MAAM,WAAA,GAAc,IAAI,GAAA,CAAI,KAAK,CAAA;AACjC,EAAA,IAAI,WAAA,CAAY,IAAA,KAAS,KAAA,CAAM,MAAA,EAAQ;AACrC,IAAA,MAAM,IAAI,oBAAA;AAAA,MACR,8CAAA;AAAA,MACA;AAAA,KACF;AAAA,EACF;AAGA,EAAA,IAAI,MAAA,CAAO,MAAA,GAAS,iBAAA,CAAkB,SAAA,EAAW;AAC/C,IAAA,MAAM,IAAI,oBAAA;AAAA,MACR,CAAA,+BAAA,EAAkC,kBAAkB,SAAS,CAAA,OAAA,CAAA;AAAA,MAC7D;AAAA,KACF;AAAA,EACF;AACF;;;ACtBO,IAAM,kBAAN,MAAsB;AAAA,EAC3B,WAAA,CACU,QAAA,EACA,OAAA,EACA,MAAA,EACA,QAAA,EACR;AAJQ,IAAA,IAAA,CAAA,QAAA,GAAA,QAAA;AACA,IAAA,IAAA,CAAA,OAAA,GAAA,OAAA;AACA,IAAA,IAAA,CAAA,MAAA,GAAA,MAAA;AACA,IAAA,IAAA,CAAA,QAAA,GAAA,QAAA;AAAA,EACP;AAAA,EAEH,IAAY,YAAA,GAAwC;AAClD,IAAA,IAAI,KAAK,QAAA,EAAU,OAAO,EAAE,QAAA,EAAU,KAAK,QAAA,EAAS;AACpD,IAAA,OAAO,EAAC;AAAA,EACV;AAAA,EAEA,MAAM,OAAO,IAAA,EAAuD;AAElE,IAAA,MAAM,MAAA,GAA2B,IAAA,CAAK,MAAA,CAAO,GAAA,CAAI,CAAC,CAAA,MAAO;AAAA,MACvD,GAAG,CAAA;AAAA,MACH,OAAA,EAASD,QAAO,UAAA;AAAW,KAC7B,CAAE,CAAA;AAEF,IAAA,sBAAA,CAAuB,MAAM,CAAA;AAE7B,IAAA,MAAM,UAAA,GAAaA,QAAO,UAAA,EAAW;AAGrC,IAAA,IAAI,KAAK,SAAA,EAAW;AAClB,MAAA,MAAM,KAAK,QAAA,CAAS,UAAA;AAAA,QAClB,EAAE,GAAG,IAAA,CAAK,YAAA,EAAc,WAAW,IAAA,EAAK;AAAA,QACxC,EAAE,IAAA,EAAM,EAAE,SAAA,EAAW,OAAM;AAAE,OAC/B;AAAA,IACF;AAEA,IAAA,MAAM,QAAA,GAAW,MAAM,IAAA,CAAK,QAAA,CAAS,MAAA,CAAO;AAAA,MAC1C,UAAA;AAAA,MACA,MAAM,IAAA,CAAK,IAAA;AAAA,MACX,aAAa,IAAA,CAAK,WAAA;AAAA,MAClB,MAAA;AAAA,MACA,SAAA,EAAW,KAAK,SAAA,IAAa,KAAA;AAAA,MAC7B,QAAA,EAAU,IAAA;AAAA,MACV,SAAA,EAAW,KAAA;AAAA,MACX,WAAW,IAAA,CAAK,SAAA;AAAA,MAChB,GAAI,IAAA,CAAK,QAAA,GAAW,EAAE,UAAU,IAAA,CAAK,QAAA,EAAS,GAAI,IAAA,CAAK,WAAW,EAAE,QAAA,EAAU,IAAA,CAAK,QAAA,KAAa,EAAC;AAAA,MACjG,UAAU,IAAA,CAAK;AAAA,KAChB,CAAA;AAED,IAAA,IAAA,CAAK,MAAA,CAAO,KAAK,kBAAA,EAAoB,EAAE,YAAY,IAAA,EAAM,IAAA,CAAK,MAAM,CAAA;AACpE,IAAA,OAAO,QAAA;AAAA,EACT;AAAA,EAEA,MAAM,MAAA,CAAO,UAAA,EAAoB,IAAA,EAAuD;AACtF,IAAA,MAAM,QAAA,GAAW,MAAM,IAAA,CAAK,QAAA,CAAS,OAAA,CAAQ,EAAE,UAAA,EAAY,SAAA,EAAW,KAAA,EAAO,GAAG,IAAA,CAAK,YAAA,EAAc,CAAA;AACnG,IAAA,IAAI,CAAC,QAAA,EAAU,MAAM,IAAI,sBAAsB,UAAU,CAAA;AAGzD,IAAA,IAAI,KAAK,SAAA,EAAW;AAClB,MAAA,MAAM,KAAK,QAAA,CAAS,UAAA;AAAA,QAClB,EAAE,GAAG,IAAA,CAAK,YAAA,EAAc,SAAA,EAAW,MAAM,UAAA,EAAY,EAAE,GAAA,EAAK,UAAA,EAAW,EAAE;AAAA,QACzE,EAAE,IAAA,EAAM,EAAE,SAAA,EAAW,OAAM;AAAE,OAC/B;AAAA,IACF;AAEA,IAAA,MAAM,OAAA,GAAU,MAAM,IAAA,CAAK,QAAA,CAAS,gBAAA;AAAA,MAClC,EAAE,UAAA,EAAY,SAAA,EAAW,KAAA,EAAM;AAAA,MAC/B,EAAE,MAAM,IAAA,EAAK;AAAA,MACb,EAAE,KAAK,IAAA;AAAK,KACd;AAEA,IAAA,IAAI,CAAC,OAAA,EAAS,MAAM,IAAI,sBAAsB,UAAU,CAAA;AACxD,IAAA,IAAA,CAAK,MAAA,CAAO,IAAA,CAAK,kBAAA,EAAoB,EAAE,UAAA,EAAY,QAAQ,MAAA,CAAO,IAAA,CAAK,IAAI,CAAA,EAAG,CAAA;AAC9E,IAAA,OAAO,OAAA;AAAA,EACT;AAAA,EAEA,MAAM,OAAO,UAAA,EAAmC;AAC9C,IAAA,MAAM,QAAA,GAAW,MAAM,IAAA,CAAK,QAAA,CAAS,OAAA,CAAQ,EAAE,UAAA,EAAY,SAAA,EAAW,KAAA,EAAO,GAAG,IAAA,CAAK,YAAA,EAAc,CAAA;AACnG,IAAA,IAAI,CAAC,QAAA,EAAU,MAAM,IAAI,sBAAsB,UAAU,CAAA;AAEzD,IAAA,MAAM,eAAA,GAAkB,MAAM,IAAA,CAAK,OAAA,CAAQ,eAAe,EAAE,UAAA,EAAY,QAAA,EAAU,KAAA,EAAO,CAAA;AACzF,IAAA,IAAI,kBAAkB,CAAA,EAAG;AACvB,MAAA,MAAM,IAAI,oBAAA,CAAqB,CAAA,4BAAA,EAA+B,eAAe,8BAA8B,UAAU,CAAA;AAAA,IACvH;AAEA,IAAA,MAAM,KAAK,QAAA,CAAS,gBAAA;AAAA,MAClB,EAAE,UAAA,EAAY,GAAG,IAAA,CAAK,YAAA,EAAa;AAAA,MACnC,EAAE,IAAA,EAAM,EAAE,WAAW,IAAA,EAAM,QAAA,EAAU,OAAM;AAAE,KAC/C;AAEA,IAAA,IAAA,CAAK,MAAA,CAAO,IAAA,CAAK,kBAAA,EAAoB,EAAE,YAAY,CAAA;AAAA,EACrD;AAAA,EAEA,MAAM,KAAK,MAAA,EAA+D;AACxE,IAAA,MAAM,QAAiC,EAAE,SAAA,EAAW,KAAA,EAAO,GAAG,KAAK,YAAA,EAAa;AAChF,IAAA,IAAI,MAAA,EAAQ,aAAa,MAAA,EAAW;AAClC,MAAA,KAAA,CAAM,WAAW,MAAA,CAAO,QAAA;AAAA,IAC1B;AACA,IAAA,OAAO,IAAA,CAAK,SAAS,IAAA,CAAK,KAAK,EAAE,IAAA,CAAK,EAAE,SAAA,EAAW,CAAA,EAAG,CAAA;AAAA,EACxD;AAAA,EAEA,MAAM,IAAI,UAAA,EAAgD;AACxD,IAAA,MAAM,QAAA,GAAW,MAAM,IAAA,CAAK,QAAA,CAAS,OAAA,CAAQ,EAAE,UAAA,EAAY,SAAA,EAAW,KAAA,EAAO,GAAG,IAAA,CAAK,YAAA,EAAc,CAAA;AACnG,IAAA,IAAI,CAAC,QAAA,EAAU,MAAM,IAAI,sBAAsB,UAAU,CAAA;AACzD,IAAA,OAAO,QAAA;AAAA,EACT;AAAA,EAEA,MAAM,QAAA,CAAS,UAAA,EAAoB,KAAA,EAAoE;AACrG,IAAA,MAAM,QAAA,GAAW,MAAM,IAAA,CAAK,GAAA,CAAI,UAAU,CAAA;AAE1C,IAAA,MAAM,QAAA,GAA2B;AAAA,MAC/B,GAAG,KAAA;AAAA,MACH,OAAA,EAASA,QAAO,UAAA;AAAW,KAC7B;AAEA,IAAA,MAAM,aAAA,GAAgB,CAAC,GAAG,QAAA,CAAS,QAAQ,QAAQ,CAAA;AACnD,IAAA,sBAAA,CAAuB,eAAe,UAAU,CAAA;AAEhD,IAAA,MAAM,OAAA,GAAU,MAAM,IAAA,CAAK,QAAA,CAAS,gBAAA;AAAA,MAClC,EAAE,UAAA,EAAW;AAAA,MACb,EAAE,KAAA,EAAO,EAAE,MAAA,EAAQ,UAAS,EAAE;AAAA,MAC9B,EAAE,KAAK,IAAA;AAAK,KACd;AAEA,IAAA,IAAI,CAAC,OAAA,EAAS,MAAM,IAAI,sBAAsB,UAAU,CAAA;AACxD,IAAA,IAAA,CAAK,MAAA,CAAO,KAAK,yBAAA,EAA2B,EAAE,YAAY,OAAA,EAAS,QAAA,CAAS,SAAS,CAAA;AACrF,IAAA,OAAO,OAAA;AAAA,EACT;AAAA,EAEA,MAAM,WAAA,CAAY,UAAA,EAAoB,OAAA,EAA6C;AACjF,IAAA,MAAM,QAAA,GAAW,MAAM,IAAA,CAAK,GAAA,CAAI,UAAU,CAAA;AAE1C,IAAA,MAAM,WAAA,GAAc,SAAS,MAAA,CAAO,IAAA,CAAK,CAAC,CAAA,KAAM,CAAA,CAAE,YAAY,OAAO,CAAA;AACrE,IAAA,IAAI,CAAC,WAAA,EAAa,MAAM,IAAI,kBAAA,CAAmB,YAAY,OAAO,CAAA;AAElE,IAAA,MAAM,eAAA,GAAkB,MAAM,IAAA,CAAK,OAAA,CAAQ,cAAA,CAAe,EAAE,UAAA,EAAY,cAAA,EAAgB,OAAA,EAAS,QAAA,EAAU,KAAA,EAAO,CAAA;AAClH,IAAA,IAAI,kBAAkB,CAAA,EAAG;AACvB,MAAA,MAAM,IAAI,eAAA,CAAgB,UAAA,EAAY,OAAA,EAAS,eAAe,CAAA;AAAA,IAChE;AAEA,IAAA,MAAM,aAAA,GAAgB,SAAS,MAAA,CAAO,MAAA,CAAO,CAAC,CAAA,KAAM,CAAA,CAAE,YAAY,OAAO,CAAA;AACzE,IAAA,sBAAA,CAAuB,eAAe,UAAU,CAAA;AAEhD,IAAA,MAAM,OAAA,GAAU,MAAM,IAAA,CAAK,QAAA,CAAS,gBAAA;AAAA,MAClC,EAAE,UAAA,EAAW;AAAA,MACb,EAAE,KAAA,EAAO,EAAE,QAAQ,EAAE,OAAA,IAAU,EAAE;AAAA,MACjC,EAAE,KAAK,IAAA;AAAK,KACd;AAEA,IAAA,IAAI,CAAC,OAAA,EAAS,MAAM,IAAI,sBAAsB,UAAU,CAAA;AACxD,IAAA,IAAA,CAAK,OAAO,IAAA,CAAK,6BAAA,EAA+B,EAAE,UAAA,EAAY,SAAS,CAAA;AACvE,IAAA,OAAO,OAAA;AAAA,EACT;AAAA,EAEA,MAAM,WAAA,CACJ,UAAA,EACA,OAAA,EACA,IAAA,EAC4B;AAC5B,IAAA,MAAM,QAAA,GAAW,MAAM,IAAA,CAAK,GAAA,CAAI,UAAU,CAAA;AAE1C,IAAA,MAAM,UAAA,GAAa,SAAS,MAAA,CAAO,SAAA,CAAU,CAAC,CAAA,KAAM,CAAA,CAAE,YAAY,OAAO,CAAA;AACzE,IAAA,IAAI,eAAe,EAAA,EAAI,MAAM,IAAI,kBAAA,CAAmB,YAAY,OAAO,CAAA;AAGvE,IAAA,MAAM,aAAA,GAAgB,QAAA,CAAS,MAAA,CAAO,GAAA,CAAI,CAAC,CAAA,KAAM;AAC/C,MAAA,MAAM,KAAA,GAAS,CAAA,CAAiD,QAAA,IAAW,IAAK,CAAA;AAChF,MAAA,IAAI,CAAA,CAAE,YAAY,OAAA,EAAS;AACzB,QAAA,OAAO,EAAE,GAAG,KAAA,EAAO,GAAG,MAAM,OAAA,EAAQ;AAAA,MACtC;AACA,MAAA,OAAO,KAAA;AAAA,IACT,CAAC,CAAA;AAED,IAAA,sBAAA,CAAuB,eAAe,UAAU,CAAA;AAGhD,IAAA,MAAM,YAAqC,EAAC;AAC5C,IAAA,KAAA,MAAW,CAAC,GAAA,EAAK,KAAK,KAAK,MAAA,CAAO,OAAA,CAAQ,IAAI,CAAA,EAAG;AAC/C,MAAA,IAAI,QAAQ,SAAA,EAAW;AACrB,QAAA,SAAA,CAAU,CAAA,OAAA,EAAU,UAAU,CAAA,CAAA,EAAI,GAAG,EAAE,CAAA,GAAI,KAAA;AAAA,MAC7C;AAAA,IACF;AAEA,IAAA,MAAM,OAAA,GAAU,MAAM,IAAA,CAAK,QAAA,CAAS,gBAAA;AAAA,MAClC,EAAE,UAAA,EAAW;AAAA,MACb,EAAE,MAAM,SAAA,EAAU;AAAA,MAClB,EAAE,KAAK,IAAA;AAAK,KACd;AAEA,IAAA,IAAI,CAAC,OAAA,EAAS,MAAM,IAAI,sBAAsB,UAAU,CAAA;AACxD,IAAA,IAAA,CAAK,MAAA,CAAO,IAAA,CAAK,2BAAA,EAA6B,EAAE,UAAA,EAAY,OAAA,EAAS,MAAA,EAAQ,MAAA,CAAO,IAAA,CAAK,IAAI,CAAA,EAAG,CAAA;AAChG,IAAA,OAAO,OAAA;AAAA,EACT;AAAA,EAEA,MAAM,aAAA,CAAc,UAAA,EAAoB,QAAA,EAAgD;AACtF,IAAA,MAAM,QAAA,GAAW,MAAM,IAAA,CAAK,GAAA,CAAI,UAAU,CAAA;AAG1C,IAAA,MAAM,WAAA,GAAc,IAAI,GAAA,CAAI,QAAA,CAAS,MAAA,CAAO,IAAI,CAAC,CAAA,KAAM,CAAA,CAAE,OAAO,CAAC,CAAA;AACjE,IAAA,KAAA,MAAW,MAAM,QAAA,EAAU;AACzB,MAAA,IAAI,CAAC,YAAY,GAAA,CAAI,EAAE,GAAG,MAAM,IAAI,kBAAA,CAAmB,UAAA,EAAY,EAAE,CAAA;AAAA,IACvE;AAEA,IAAA,IAAI,QAAA,CAAS,MAAA,KAAW,QAAA,CAAS,MAAA,CAAO,MAAA,EAAQ;AAC9C,MAAA,MAAM,IAAI,oBAAA;AAAA,QACR,CAAA,+BAAA,EAAkC,QAAA,CAAS,MAAA,CAAO,MAAM,CAAA,UAAA,CAAA;AAAA,QACxD;AAAA,OACF;AAAA,IACF;AAGA,IAAA,MAAM,QAAA,GAAW,IAAI,GAAA,CAAI,QAAA,CAAS,MAAA,CAAO,GAAA,CAAI,CAAC,CAAA,KAAM,CAAC,CAAA,CAAE,OAAA,EAAS,CAAC,CAAC,CAAC,CAAA;AACnE,IAAA,MAAM,eAAA,GAAoC,QAAA,CAAS,GAAA,CAAI,CAAC,IAAI,KAAA,KAAU;AACpE,MAAA,MAAM,CAAA,GAAI,QAAA,CAAS,GAAA,CAAI,EAAE,CAAA;AACzB,MAAA,MAAM,KAAA,GAAS,CAAA,CAAiD,QAAA,IAAW,IAAK,CAAA;AAChF,MAAA,OAAO,EAAE,GAAG,KAAA,EAAO,KAAA,EAAO,QAAQ,CAAA,EAAE;AAAA,IACtC,CAAC,CAAA;AAED,IAAA,sBAAA,CAAuB,iBAAiB,UAAU,CAAA;AAElD,IAAA,MAAM,OAAA,GAAU,MAAM,IAAA,CAAK,QAAA,CAAS,gBAAA;AAAA,MAClC,EAAE,UAAA,EAAW;AAAA,MACb,EAAE,IAAA,EAAM,EAAE,MAAA,EAAQ,iBAAgB,EAAE;AAAA,MACpC,EAAE,KAAK,IAAA;AAAK,KACd;AAEA,IAAA,IAAI,CAAC,OAAA,EAAS,MAAM,IAAI,sBAAsB,UAAU,CAAA;AACxD,IAAA,IAAA,CAAK,MAAA,CAAO,IAAA,CAAK,8BAAA,EAAgC,EAAE,YAAY,CAAA;AAC/D,IAAA,OAAO,OAAA;AAAA,EACT;AACF;AC3PO,IAAM,kBAAN,MAAsB;AAAA,EAC3B,WAAA,CACU,OAAA,EACA,MAAA,EACA,OAAA,EACR;AAHQ,IAAA,IAAA,CAAA,OAAA,GAAA,OAAA;AACA,IAAA,IAAA,CAAA,MAAA,GAAA,MAAA;AACA,IAAA,IAAA,CAAA,OAAA,GAAA,OAAA;AAAA,EACP;AAAA,EAEH,MAAM,OAAA,CACJ,SAAA,EACA,OAAA,EACA,UACA,UAAA,EACyB;AACzB,IAAA,MAAM,UAAU,MAAM,IAAA,CAAK,QAAQ,OAAA,CAAQ,EAAE,WAAW,CAAA;AACxD,IAAA,IAAI,CAAC,OAAA,EAAS,MAAM,IAAI,qBAAqB,SAAS,CAAA;AACtD,IAAA,IAAI,QAAQ,QAAA,EAAU,MAAM,IAAI,kBAAA,CAAmB,WAAW,UAAU,CAAA;AAExE,IAAA,MAAM,KAAA,GAAwB;AAAA,MAC5B,OAAA,EAASA,QAAO,UAAA,EAAW;AAAA,MAC3B,MAAMG,iBAAAA,CAAkB,IAAA;AAAA,MACxB,OAAA;AAAA,MACA,QAAA;AAAA,MACA,UAAA;AAAA,MACA,SAAA,sBAAe,IAAA;AAAK,KACtB;AAEA,IAAA,MAAM,KAAK,OAAA,CAAQ,SAAA;AAAA,MACjB,EAAE,SAAA,EAAU;AAAA,MACZ;AAAA,QACE,KAAA,EAAO;AAAA,UACL,QAAA,EAAU;AAAA,YACR,KAAA,EAAO,CAAC,KAAK,CAAA;AAAA,YACb,MAAA,EAAQ,CAAC,IAAA,CAAK,OAAA,CAAQ;AAAA;AACxB;AACF;AACF,KACF;AAEA,IAAA,IAAA,CAAK,MAAA,CAAO,KAAK,wBAAA,EAA0B,EAAE,WAAW,OAAA,EAAS,KAAA,CAAM,SAAS,CAAA;AAChF,IAAA,OAAO,KAAA;AAAA,EACT;AAAA,EAEA,MAAM,cAAA,CAAe,SAAA,EAAmB,OAAA,EAA0C;AAChF,IAAA,MAAM,UAAU,MAAM,IAAA,CAAK,QAAQ,OAAA,CAAQ,EAAE,WAAW,CAAA;AACxD,IAAA,IAAI,CAAC,OAAA,EAAS,MAAM,IAAI,qBAAqB,SAAS,CAAA;AAEtD,IAAA,MAAM,KAAA,GAAwB;AAAA,MAC5B,OAAA,EAASH,QAAO,UAAA,EAAW;AAAA,MAC3B,MAAMG,iBAAAA,CAAkB,MAAA;AAAA,MACxB,OAAA;AAAA,MACA,SAAA,sBAAe,IAAA;AAAK,KACtB;AAEA,IAAA,MAAM,KAAK,OAAA,CAAQ,SAAA;AAAA,MACjB,EAAE,SAAA,EAAU;AAAA,MACZ;AAAA,QACE,KAAA,EAAO;AAAA,UACL,QAAA,EAAU;AAAA,YACR,KAAA,EAAO,CAAC,KAAK,CAAA;AAAA,YACb,MAAA,EAAQ,CAAC,IAAA,CAAK,OAAA,CAAQ;AAAA;AACxB;AACF;AACF,KACF;AAEA,IAAA,IAAA,CAAK,MAAA,CAAO,KAAK,gCAAA,EAAkC,EAAE,WAAW,OAAA,EAAS,KAAA,CAAM,SAAS,CAAA;AACxF,IAAA,OAAO,KAAA;AAAA,EACT;AAAA,EAEA,MAAM,WAAA,CACJ,SAAA,EACA,UAAA,EACuD;AACvD,IAAA,MAAM,UAAU,MAAM,IAAA,CAAK,QAAQ,OAAA,CAAQ,EAAE,WAAW,CAAA;AACxD,IAAA,IAAI,CAAC,OAAA,EAAS,MAAM,IAAI,qBAAqB,SAAS,CAAA;AAEtD,IAAA,MAAM,KAAA,GAAQ,QAAQ,QAAA,CAAS,MAAA;AAC/B,IAAA,MAAM,EAAE,IAAA,EAAM,KAAA,EAAM,GAAI,UAAA;AACxB,IAAA,MAAM,IAAA,GAAA,CAAQ,OAAO,CAAA,IAAK,KAAA;AAG1B,IAAA,MAAM,WAAW,CAAC,GAAG,OAAA,CAAQ,QAAQ,EAAE,OAAA,EAAQ;AAC/C,IAAA,MAAM,OAAA,GAAU,QAAA,CAAS,KAAA,CAAM,IAAA,EAAM,OAAO,KAAK,CAAA;AAEjD,IAAA,OAAO,EAAE,SAAS,KAAA,EAAM;AAAA,EAC1B;AAAA,EAEA,MAAM,kBAAA,CACJ,UAAA,EACA,UAAA,EACiF;AACjF,IAAA,MAAM,EAAE,IAAA,EAAM,KAAA,EAAM,GAAI,UAAA;AACxB,IAAA,MAAM,IAAA,GAAA,CAAQ,OAAO,CAAA,IAAK,KAAA;AAE1B,IAAA,MAAM,WAAA,GAAc,MAAM,IAAA,CAAK,OAAA,CAAQ,SAAA,CAA6B;AAAA,MAClE,EAAE,MAAA,EAAQ,EAAE,uBAAA,EAAyB,YAAW,EAAE;AAAA,MAClD,EAAE,SAAS,WAAA,EAAY;AAAA,MACvB,EAAE,QAAQ,OAAA;AAAQ,KACnB,CAAA;AACD,IAAA,MAAM,KAAA,GAAQ,WAAA,CAAY,CAAC,CAAA,EAAG,KAAA,IAAS,CAAA;AAEvC,IAAA,MAAM,OAAA,GAAU,MAAM,IAAA,CAAK,OAAA,CAAQ,SAAA,CAAkD;AAAA,MACnF,EAAE,MAAA,EAAQ,EAAE,uBAAA,EAAyB,YAAW,EAAE;AAAA,MAClD,EAAE,SAAS,WAAA,EAAY;AAAA,MACvB,EAAE,KAAA,EAAO,EAAE,oBAAA,EAAsB,IAAG,EAAE;AAAA,MACtC,EAAE,OAAO,IAAA,EAAK;AAAA,MACd,EAAE,QAAQ,KAAA,EAAM;AAAA,MAChB;AAAA,QACE,UAAA,EAAY;AAAA,UACV,oBAAA,EAAsB;AAAA;AACxB,OACF;AAAA,MACA,EAAE,YAAA,EAAc,EAAE,OAAA,EAAS,aAAY;AAAE,KAC1C,CAAA;AAED,IAAA,IAAA,CAAK,MAAA,CAAO,KAAK,0BAAA,EAA4B,EAAE,YAAY,KAAA,EAAO,IAAA,EAAM,OAAO,CAAA;AAC/E,IAAA,OAAO,EAAE,OAAA,EAAS,OAAA,EAAS,KAAA,EAAM;AAAA,EACnC;AACF;ACzCO,IAAM,iBAAN,MAAqB;AAAA,EAC1B,YACU,OAAA,EACA,QAAA,EACA,QAAA,EACA,MAAA,EACA,OACA,OAAA,EACR;AANQ,IAAA,IAAA,CAAA,OAAA,GAAA,OAAA;AACA,IAAA,IAAA,CAAA,QAAA,GAAA,QAAA;AACA,IAAA,IAAA,CAAA,QAAA,GAAA,QAAA;AACA,IAAA,IAAA,CAAA,MAAA,GAAA,MAAA;AACA,IAAA,IAAA,CAAA,KAAA,GAAA,KAAA;AACA,IAAA,IAAA,CAAA,OAAA,GAAA,OAAA;AAAA,EACP;AAAA,EAEH,MAAM,OAAO,IAAA,EAAqD;AAChE,IAAA,MAAM,QAAA,GAAW,MAAM,IAAA,CAAK,QAAA,CAAS,OAAA,CAAQ,EAAE,UAAA,EAAY,IAAA,CAAK,UAAA,EAAY,SAAA,EAAW,KAAA,EAAO,CAAA;AAC9F,IAAA,IAAI,CAAC,QAAA,EAAU,MAAM,IAAI,qBAAA,CAAsB,KAAK,UAAU,CAAA;AAE9D,IAAA,MAAM,eAAe,QAAA,CAAS,MAAA,CAAO,KAAK,CAAC,CAAA,KAAM,EAAE,SAAS,CAAA;AAC5D,IAAA,IAAI,CAAC,YAAA,EAAc,MAAM,IAAI,qBAAA,CAAsB,KAAK,UAAU,CAAA;AAElE,IAAA,MAAM,SAAA,GAAYH,QAAO,UAAA,EAAW;AAEpC,IAAA,MAAM,YAAA,GAA+B;AAAA,MACnC,OAAA,EAASA,QAAO,UAAA,EAAW;AAAA,MAC3B,MAAMG,iBAAAA,CAAkB,MAAA;AAAA,MACxB,SAAS,eAAA,CAAgB,WAAA;AAAA,MACzB,SAAA,sBAAe,IAAA;AAAK,KACtB;AAEA,IAAA,MAAM,eAAA,GAAoC,CAAC,YAAY,CAAA;AAGvD,IAAA,IAAI,KAAK,UAAA,EAAY;AACnB,MAAA,MAAM,aAAA,GAAgC;AAAA,QACpC,OAAA,EAASH,QAAO,UAAA,EAAW;AAAA,QAC3B,MAAMG,iBAAAA,CAAkB,MAAA;AAAA,QACxB,OAAA,EAAS,mBAAmB,mBAAA,EAAoB;AAAA,QAChD,SAAA,sBAAe,IAAA;AAAK,OACtB;AACA,MAAA,eAAA,CAAgB,KAAK,aAAa,CAAA;AAAA,IACpC;AAEA,IAAA,MAAM,OAAA,GAAU,MAAM,IAAA,CAAK,OAAA,CAAQ,MAAA,CAAO;AAAA,MACxC,SAAA;AAAA,MACA,YAAY,IAAA,CAAK,UAAA;AAAA,MACjB,gBAAgB,YAAA,CAAa,OAAA;AAAA,MAC7B,YAAY,IAAA,CAAK,UAAA;AAAA,MACjB,WAAW,IAAA,CAAK,SAAA;AAAA,MAChB,QAAA,EAAU,KAAK,QAAA,GAAW,IAAI,KAAK,IAAA,CAAK,QAAQ,CAAA,mBAAI,IAAI,IAAA,EAAK;AAAA,MAC7D,SAAS,IAAA,CAAK,OAAA;AAAA,MACd,QAAA,EAAU,IAAA,CAAK,QAAA,IAAYD,YAAAA,CAAa,MAAA;AAAA,MACxC,IAAA,EAAM,IAAA,CAAK,IAAA,IAAQ,EAAC;AAAA,MACpB,UAAU,IAAA,CAAK,QAAA;AAAA,MACf,kBAAkB,IAAA,CAAK,gBAAA;AAAA,MACvB,iBAAiB,IAAA,CAAK,eAAA;AAAA,MACtB,SAAS,IAAA,CAAK,OAAA;AAAA,MACd,SAAS,IAAA,CAAK,OAAA;AAAA,MACd,UAAA,EAAY,KAAK,UAAA,IAAc,KAAA;AAAA,MAC/B,QAAA,EAAU,eAAA;AAAA,MACV,cAAc,EAAC;AAAA,MACf,QAAA,EAAU,KAAA;AAAA,MACV,GAAI,KAAK,QAAA,GAAW,EAAE,UAAU,IAAA,CAAK,QAAA,KAAa,EAAC;AAAA,MACnD,UAAU,IAAA,CAAK;AAAA,KAChB,CAAA;AAED,IAAA,IAAA,CAAK,MAAA,CAAO,KAAK,kBAAA,EAAoB,EAAE,WAAW,UAAA,EAAY,IAAA,CAAK,YAAY,CAAA;AAE/E,IAAA,IAAI,IAAA,CAAK,MAAM,aAAA,EAAe;AAC5B,MAAA,MAAM,IAAA,CAAK,KAAA,CAAM,aAAA,CAAc,OAA8B,CAAA;AAAA,IAC/D;AAEA,IAAA,OAAO,OAAA;AAAA,EACT;AAAA,EAEA,MAAM,MAAA,CAAO,SAAA,EAAmB,IAAA,EAAqD;AACnF,IAAA,MAAM,UAAU,MAAM,IAAA,CAAK,QAAQ,OAAA,CAAQ,EAAE,WAAW,CAAA;AACxD,IAAA,IAAI,CAAC,OAAA,EAAS,MAAM,IAAI,qBAAqB,SAAS,CAAA;AACtD,IAAA,IAAI,QAAQ,QAAA,EAAU,MAAM,IAAI,kBAAA,CAAmB,WAAW,QAAQ,CAAA;AAEtE,IAAA,MAAM,YAAqC,EAAC;AAC5C,IAAA,MAAM,cAAgC,EAAC;AAEvC,IAAA,IAAI,IAAA,CAAK,QAAA,KAAa,MAAA,EAAW,SAAA,CAAU,WAAW,IAAA,CAAK,QAAA;AAC3D,IAAA,IAAI,IAAA,CAAK,IAAA,KAAS,MAAA,EAAW,SAAA,CAAU,OAAO,IAAA,CAAK,IAAA;AACnD,IAAA,IAAI,IAAA,CAAK,QAAA,KAAa,MAAA,EAAW,SAAA,CAAU,WAAW,IAAA,CAAK,QAAA;AAC3D,IAAA,IAAI,IAAA,CAAK,eAAA,KAAoB,MAAA,EAAW,SAAA,CAAU,kBAAkB,IAAA,CAAK,eAAA;AACzE,IAAA,IAAI,IAAA,CAAK,OAAA,KAAY,MAAA,EAAW,SAAA,CAAU,UAAU,IAAA,CAAK,OAAA;AACzD,IAAA,IAAI,IAAA,CAAK,OAAA,KAAY,MAAA,EAAW,SAAA,CAAU,UAAU,IAAA,CAAK,OAAA;AACzD,IAAA,IAAI,IAAA,CAAK,UAAA,KAAe,MAAA,EAAW,SAAA,CAAU,aAAa,IAAA,CAAK,UAAA;AAE/D,IAAA,IAAI,IAAA,CAAK,qBAAqB,MAAA,EAAW;AACvC,MAAA,MAAM,QAAA,GAAW,OAAA,CAAQ,gBAAA,EAAkB,WAAA,EAAY;AACvD,MAAA,MAAM,OAAA,GAAU,IAAA,CAAK,gBAAA,EAAkB,WAAA,EAAY;AACnD,MAAA,IAAI,aAAa,OAAA,EAAS;AACxB,QAAA,SAAA,CAAU,mBAAmB,IAAA,CAAK,gBAAA;AAClC,QAAA,IAAI,KAAK,gBAAA,EAAkB;AACzB,UAAA,MAAM,aAAA,GAAgC;AAAA,YACpC,OAAA,EAASF,QAAO,UAAA,EAAW;AAAA,YAC3B,MAAMG,iBAAAA,CAAkB,WAAA;AAAA,YACxB,OAAA,EAAS,mBAAmB,WAAA,CAAY,IAAI,KAAK,IAAA,CAAK,gBAAgB,CAAA,CAAE,WAAA,EAAa,CAAA;AAAA,YACrF,SAAA,sBAAe,IAAA;AAAK,WACtB;AACA,UAAA,WAAA,CAAY,KAAK,aAAa,CAAA;AAAA,QAChC;AAAA,MACF;AAAA,IACF;AAEA,IAAA,MAAM,QAAA,GAAoC,EAAE,IAAA,EAAM,SAAA,EAAU;AAC5D,IAAA,IAAI,WAAA,CAAY,SAAS,CAAA,EAAG;AAC1B,MAAA,QAAA,CAAS,KAAA,GAAQ;AAAA,QACf,QAAA,EAAU;AAAA,UACR,KAAA,EAAO,WAAA;AAAA,UACP,MAAA,EAAQ,CAAC,IAAA,CAAK,OAAA,CAAQ;AAAA;AACxB,OACF;AAAA,IACF;AAEA,IAAA,MAAM,OAAA,GAAU,MAAM,IAAA,CAAK,OAAA,CAAQ,gBAAA;AAAA,MACjC,EAAE,SAAA,EAAU;AAAA,MACZ,QAAA;AAAA,MACA,EAAE,KAAK,IAAA;AAAK,KACd;AAEA,IAAA,IAAI,CAAC,OAAA,EAAS,MAAM,IAAI,qBAAqB,SAAS,CAAA;AACtD,IAAA,IAAA,CAAK,MAAA,CAAO,IAAA,CAAK,kBAAA,EAAoB,EAAE,SAAA,EAAW,QAAQ,MAAA,CAAO,IAAA,CAAK,IAAI,CAAA,EAAG,CAAA;AAC7E,IAAA,OAAO,OAAA;AAAA,EACT;AAAA,EAEA,MAAM,IAAA,CAAK,MAAA,GAA6B,EAAC,EAAgC;AACvE,IAAA,MAAM,QAAiC,EAAC;AAExC,IAAA,IAAI,MAAA,CAAO,UAAA,EAAY,KAAA,CAAM,UAAA,GAAa,MAAA,CAAO,UAAA;AACjD,IAAA,IAAI,MAAA,CAAO,cAAA,EAAgB,KAAA,CAAM,cAAA,GAAiB,MAAA,CAAO,cAAA;AACzD,IAAA,IAAI,MAAA,CAAO,OAAA,EAAS,KAAA,CAAM,OAAA,GAAU,MAAA,CAAO,OAAA;AAC3C,IAAA,IAAI,MAAA,CAAO,IAAA,IAAQ,MAAA,CAAO,IAAA,CAAK,MAAA,GAAS,CAAA,EAAG,KAAA,CAAM,IAAA,GAAO,EAAE,GAAA,EAAK,MAAA,CAAO,IAAA,EAAK;AAC3E,IAAA,IAAI,MAAA,CAAO,QAAA,EAAU,KAAA,CAAM,QAAA,GAAW,MAAA,CAAO,QAAA;AAC7C,IAAA,IAAI,MAAA,CAAO,QAAA,KAAa,MAAA,EAAW,KAAA,CAAM,WAAW,MAAA,CAAO,QAAA;AAC3D,IAAA,IAAI,MAAA,CAAO,iBAAA,EAAmB,KAAA,CAAM,uBAAuB,IAAI,MAAA,CAAO,iBAAA;AACtE,IAAA,IAAI,MAAA,CAAO,WAAA,EAAa,KAAA,CAAM,wBAAwB,CAAA,GAAI,EAAE,MAAA,EAAQ,MAAA,CAAO,WAAA,EAAa,QAAA,EAAU,GAAA,EAAI;AACtG,IAAA,IAAI,MAAA,CAAO,YAAA,EAAc,KAAA,CAAM,kBAAkB,CAAA,GAAI,EAAE,MAAA,EAAQ,CAAA,CAAA,EAAI,MAAA,CAAO,YAAY,CAAA,CAAA,EAAG;AACzF,IAAA,IAAI,MAAA,CAAO,YAAA,EAAc,KAAA,CAAM,kBAAkB,IAAI,MAAA,CAAO,YAAA;AAC5D,IAAA,IAAI,MAAA,CAAO,QAAA,EAAU,KAAA,CAAM,QAAA,GAAW,MAAA,CAAO,QAAA;AAC7C,IAAA,IAAI,MAAA,CAAO,SAAA,EAAW,KAAA,CAAM,SAAA,GAAY,MAAA,CAAO,SAAA;AAC/C,IAAA,IAAI,MAAA,CAAO,OAAA,EAAS,KAAA,CAAM,OAAA,GAAU,MAAA,CAAO,OAAA;AAC3C,IAAA,IAAI,MAAA,CAAO,OAAA,EAAS,KAAA,CAAM,OAAA,GAAU,MAAA,CAAO,OAAA;AAC3C,IAAA,IAAI,MAAA,CAAO,UAAA,KAAe,MAAA,EAAW,KAAA,CAAM,aAAa,MAAA,CAAO,UAAA;AAG/D,IAAA,IAAI,CAAC,MAAA,CAAO,cAAA,QAAsB,SAAA,GAAY,EAAE,KAAK,IAAA,EAAK;AAE1D,IAAA,IAAI,MAAA,CAAO,SAAA,EAAW,IAAA,IAAQ,MAAA,CAAO,WAAW,EAAA,EAAI;AAClD,MAAA,MAAM,aAAsC,EAAC;AAC7C,MAAA,IAAI,MAAA,CAAO,UAAU,IAAA,EAAM,UAAA,CAAW,OAAO,IAAI,IAAA,CAAK,MAAA,CAAO,SAAA,CAAU,IAAI,CAAA;AAC3E,MAAA,IAAI,MAAA,CAAO,UAAU,EAAA,EAAI,UAAA,CAAW,OAAO,IAAI,IAAA,CAAK,MAAA,CAAO,SAAA,CAAU,EAAE,CAAA;AACvE,MAAA,KAAA,CAAM,QAAA,GAAW,UAAA;AAAA,IACnB;AAEA,IAAA,MAAM,IAAA,GAAO,OAAO,IAAA,IAAQ,CAAA;AAC5B,IAAA,MAAM,KAAA,GAAQ,OAAO,KAAA,IAAS,EAAA;AAC9B,IAAA,MAAM,IAAA,GAAA,CAAQ,OAAO,CAAA,IAAK,KAAA;AAC1B,IAAA,MAAM,IAAA,GAAO,MAAA,CAAO,IAAA,IAAQ,EAAE,UAAU,EAAA,EAAG;AAE3C,IAAA,MAAM,CAAC,QAAA,EAAU,KAAK,CAAA,GAAI,MAAM,QAAQ,GAAA,CAAI;AAAA,MAC1C,IAAA,CAAK,OAAA,CAAQ,IAAA,CAAK,KAAK,CAAA,CAAE,IAAA,CAAK,IAAI,CAAA,CAAE,IAAA,CAAK,IAAI,CAAA,CAAE,KAAA,CAAM,KAAK,CAAA;AAAA,MAC1D,IAAA,CAAK,OAAA,CAAQ,cAAA,CAAe,KAAK;AAAA,KAClC,CAAA;AAED,IAAA,OAAO,EAAE,QAAA,EAAU,KAAA,EAAO,IAAA,EAAM,KAAA,EAAM;AAAA,EACxC;AAAA,EAEA,MAAM,IAAI,SAAA,EAA8C;AACtD,IAAA,MAAM,OAAA,GAAU,MAAM,IAAA,CAAK,OAAA,CAAQ,OAAA,CAAQ,EAAE,SAAA,EAAW,SAAA,EAAW,EAAE,GAAA,EAAK,IAAA,EAAK,EAAG,CAAA;AAClF,IAAA,IAAI,CAAC,OAAA,EAAS,MAAM,IAAI,qBAAqB,SAAS,CAAA;AACtD,IAAA,OAAO,OAAA;AAAA,EACT;AAAA,EAEA,MAAM,aAAa,UAAA,EAAiD;AAClE,IAAA,OAAO,KAAK,OAAA,CAAQ,IAAA,CAAK,EAAE,uBAAA,EAAyB,YAAY,SAAA,EAAW,EAAE,GAAA,EAAK,IAAA,IAAQ,CAAA,CAAE,KAAK,EAAE,QAAA,EAAU,IAAI,CAAA;AAAA,EACnH;AACF;AC9OO,IAAM,0BAAN,MAA8B;AAAA,EACnC,YACU,OAAA,EACA,QAAA,EACA,QAAA,EACA,MAAA,EACA,OACA,OAAA,EACR;AANQ,IAAA,IAAA,CAAA,OAAA,GAAA,OAAA;AACA,IAAA,IAAA,CAAA,QAAA,GAAA,QAAA;AACA,IAAA,IAAA,CAAA,QAAA,GAAA,QAAA;AACA,IAAA,IAAA,CAAA,MAAA,GAAA,MAAA;AACA,IAAA,IAAA,CAAA,KAAA,GAAA,KAAA;AACA,IAAA,IAAA,CAAA,OAAA,GAAA,OAAA;AAAA,EACP;AAAA,EAEH,MAAM,WAAA,CAAY,SAAA,EAAmB,UAAA,EAAoB,OAAA,EAA4C;AAEnG,IAAA,MAAM,UAAU,MAAM,IAAA,CAAK,QAAQ,OAAA,CAAQ,EAAE,WAAW,CAAA;AACxD,IAAA,IAAI,CAAC,OAAA,EAAS,MAAM,IAAI,qBAAqB,SAAS,CAAA;AACtD,IAAA,IAAI,QAAQ,QAAA,EAAU,MAAM,IAAI,kBAAA,CAAmB,WAAW,cAAc,CAAA;AAE5E,IAAA,MAAM,iBAAiB,OAAA,CAAQ,cAAA;AAG/B,IAAA,MAAM,QAAA,GAAW,MAAM,IAAA,CAAK,QAAA,CAAS,OAAA,CAAQ,EAAE,UAAA,EAAY,OAAA,CAAQ,UAAA,EAAY,SAAA,EAAW,KAAA,EAAO,CAAA;AACjG,IAAA,IAAI,CAAC,QAAA,EAAU,MAAM,IAAI,qBAAA,CAAsB,QAAQ,UAAU,CAAA;AAEjE,IAAA,MAAM,YAAA,GAAe,SAAS,MAAA,CAAO,IAAA,CAAK,CAAC,CAAA,KAAM,CAAA,CAAE,YAAY,cAAc,CAAA;AAC7E,IAAA,IAAI,CAAC,YAAA,EAAc,MAAM,IAAI,kBAAA,CAAmB,OAAA,CAAQ,YAAY,cAAc,CAAA;AAElF,IAAA,MAAM,QAAA,GAAW,SAAS,MAAA,CAAO,IAAA,CAAK,CAAC,CAAA,KAAM,CAAA,CAAE,YAAY,UAAU,CAAA;AACrE,IAAA,IAAI,CAAC,QAAA,EAAU,MAAM,IAAI,kBAAA,CAAmB,OAAA,CAAQ,YAAY,UAAU,CAAA;AAG1E,IAAA,MAAM,GAAA,uBAAU,IAAA,EAAK;AACrB,IAAA,MAAM,cAAc,OAAA,CAAQ,YAAA,CAAa,OAAA,CAAQ,YAAA,CAAa,SAAS,CAAC,CAAA;AACxE,IAAA,MAAM,cAAA,GAAiB,WAAA,EAAa,SAAA,EAAW,OAAA,EAAQ,IAAM,QAA2C,SAAA,EAAW,OAAA,EAAQ,IAAK,GAAA,CAAI,OAAA,EAAQ;AAC5I,IAAA,MAAM,aAAA,GAAgB,GAAA,CAAI,OAAA,EAAQ,GAAI,cAAA;AAEtC,IAAA,MAAM,gBAAA,GAAmC;AAAA,MACvC,OAAA,EAASH,QAAO,UAAA,EAAW;AAAA,MAC3B,MAAMG,iBAAAA,CAAkB,WAAA;AAAA,MACxB,SAAS,kBAAA,CAAmB,YAAA,CAAa,YAAA,CAAa,IAAA,EAAM,SAAS,IAAI,CAAA;AAAA,MACzE,WAAA,EAAa,cAAA;AAAA,MACb,eAAe,YAAA,CAAa,IAAA;AAAA,MAC5B,SAAA,EAAW,UAAA;AAAA,MACX,aAAa,QAAA,CAAS,IAAA;AAAA,MACtB,QAAA,EAAU,OAAA;AAAA,MACV,SAAA,EAAW;AAAA,KACb;AAEA,IAAA,MAAM,iBAAA,GAAkC;AAAA,MACtC,WAAA,EAAa,cAAA;AAAA,MACb,SAAA,EAAW,UAAA;AAAA,MACX,eAAe,YAAA,CAAa,IAAA;AAAA,MAC5B,aAAa,QAAA,CAAS,IAAA;AAAA,MACtB,SAAA,EAAW,OAAA;AAAA,MACX,SAAA,EAAW,GAAA;AAAA,MACX;AAAA,KACF;AAEA,IAAA,MAAM,aAAa,QAAA,CAAS,UAAA;AAE5B,IAAA,MAAM,WAAA,GAAuC,UAAA,GACzC,EAAE,cAAA,EAAgB,UAAA,EAAY,QAAA,EAAU,IAAA,EAAM,QAAA,EAAU,GAAA,EAAI,GAC5D,EAAE,cAAA,EAAgB,UAAA,EAAW;AAGjC,IAAA,MAAM,MAAA,GAAS,MAAM,IAAA,CAAK,OAAA,CAAQ,gBAAA;AAAA,MAChC,EAAE,WAAW,cAAA,EAAe;AAAA,MAC5B;AAAA,QACE,IAAA,EAAM,WAAA;AAAA,QACN,KAAA,EAAO;AAAA,UACL,YAAA,EAAc,iBAAA;AAAA,UACd,QAAA,EAAU;AAAA;AACZ,OACF;AAAA,MACA,EAAE,KAAK,IAAA;AAAK,KACd;AAEA,IAAA,IAAI,CAAC,MAAA,EAAQ;AAEX,MAAA,MAAM,IAAI,kBAAA,CAAmB,SAAA,EAAW,iDAAiD,CAAA;AAAA,IAC3F;AAEA,IAAA,IAAA,CAAK,MAAA,CAAO,KAAK,wBAAA,EAA0B,EAAE,WAAW,IAAA,EAAM,cAAA,EAAgB,EAAA,EAAI,UAAA,EAAY,CAAA;AAE9F,IAAA,IAAI,UAAA,IAAc,IAAA,CAAK,KAAA,CAAM,YAAA,EAAc;AACzC,MAAA,MAAM,IAAA,CAAK,KAAA,CAAM,YAAA,CAAa,MAA6B,CAAA;AAAA,IAC7D;AAEA,IAAA,IAAI,IAAA,CAAK,MAAM,cAAA,EAAgB;AAC7B,MAAA,MAAM,KAAK,KAAA,CAAM,cAAA,CAAe,QAA+B,YAAA,CAAa,IAAA,EAAM,SAAS,IAAI,CAAA;AAAA,IACjG;AAEA,IAAA,OAAO,MAAA;AAAA,EACT;AAAA,EAEA,MAAM,MAAA,CAAO,SAAA,EAAmB,OAAA,EAAiB,UAAA,EAA+C;AAC9F,IAAA,MAAM,UAAU,MAAM,IAAA,CAAK,QAAQ,OAAA,CAAQ,EAAE,WAAW,CAAA;AACxD,IAAA,IAAI,CAAC,OAAA,EAAS,MAAM,IAAI,qBAAqB,SAAS,CAAA;AAEtD,IAAA,MAAM,eAAA,GAAkB,OAAA,CAAQ,OAAA,EAAS,QAAA,EAAS;AAElD,IAAA,MAAM,eAAA,GAAkC;AAAA,MACtC,OAAA,EAASH,QAAO,UAAA,EAAW;AAAA,MAC3B,MAAMG,iBAAAA,CAAkB,UAAA;AAAA,MACxB,OAAA,EAAS,kBACL,kBAAA,CAAmB,cAAA,CAAe,iBAAiB,OAAO,CAAA,GAC1D,kBAAA,CAAmB,YAAA,CAAa,OAAO,CAAA;AAAA,MAC3C,SAAA,EAAW,OAAA;AAAA,MACX,WAAA,EAAa,eAAA;AAAA,MACb,QAAA,EAAU,UAAA;AAAA,MACV,SAAA,sBAAe,IAAA;AAAK,KACtB;AAEA,IAAA,MAAM,OAAA,GAAU,MAAM,IAAA,CAAK,OAAA,CAAQ,gBAAA;AAAA,MACjC,EAAE,SAAA,EAAU;AAAA,MACZ;AAAA,QACE,IAAA,EAAM,EAAE,OAAA,EAAS,UAAA,EAAW;AAAA,QAC5B,KAAA,EAAO;AAAA,UACL,QAAA,EAAU;AAAA,YACR,KAAA,EAAO,CAAC,eAAe,CAAA;AAAA,YACvB,MAAA,EAAQ,CAAC,IAAA,CAAK,OAAA,CAAQ;AAAA;AACxB;AACF,OACF;AAAA,MACA,EAAE,KAAK,IAAA;AAAK,KACd;AAEA,IAAA,IAAI,CAAC,OAAA,EAAS,MAAM,IAAI,qBAAqB,SAAS,CAAA;AACtD,IAAA,IAAA,CAAK,OAAO,IAAA,CAAK,mBAAA,EAAqB,EAAE,SAAA,EAAW,OAAA,EAAS,YAAY,CAAA;AAExE,IAAA,IAAI,IAAA,CAAK,MAAM,cAAA,EAAgB;AAC7B,MAAA,MAAM,IAAA,CAAK,KAAA,CAAM,cAAA,CAAe,OAAA,EAAgC,eAAe,CAAA;AAAA,IACjF;AAEA,IAAA,OAAO,OAAA;AAAA,EACT;AAAA,EAEA,MAAM,KAAA,CAAM,SAAA,EAAmB,OAAA,EAA4C;AACzE,IAAA,MAAM,UAAU,MAAM,IAAA,CAAK,QAAQ,OAAA,CAAQ,EAAE,WAAW,CAAA;AACxD,IAAA,IAAI,CAAC,OAAA,EAAS,MAAM,IAAI,qBAAqB,SAAS,CAAA;AACtD,IAAA,IAAI,QAAQ,QAAA,EAAU,MAAM,IAAI,kBAAA,CAAmB,WAAW,OAAO,CAAA;AAErE,IAAA,MAAM,GAAA,uBAAU,IAAA,EAAK;AACrB,IAAA,MAAM,UAAA,GAA6B;AAAA,MACjC,OAAA,EAASH,QAAO,UAAA,EAAW;AAAA,MAC3B,MAAMG,iBAAAA,CAAkB,MAAA;AAAA,MACxB,SAAS,eAAA,CAAgB,UAAA;AAAA,MACzB,QAAA,EAAU,OAAA;AAAA,MACV,SAAA,EAAW;AAAA,KACb;AAEA,IAAA,MAAM,OAAA,GAAU,MAAM,IAAA,CAAK,OAAA,CAAQ,gBAAA;AAAA,MACjC,EAAE,SAAA,EAAU;AAAA,MACZ;AAAA,QACE,IAAA,EAAM,EAAE,QAAA,EAAU,IAAA,EAAM,UAAU,GAAA,EAAI;AAAA,QACtC,KAAA,EAAO;AAAA,UACL,QAAA,EAAU;AAAA,YACR,KAAA,EAAO,CAAC,UAAU,CAAA;AAAA,YAClB,MAAA,EAAQ,CAAC,IAAA,CAAK,OAAA,CAAQ;AAAA;AACxB;AACF,OACF;AAAA,MACA,EAAE,KAAK,IAAA;AAAK,KACd;AAEA,IAAA,IAAI,CAAC,OAAA,EAAS,MAAM,IAAI,qBAAqB,SAAS,CAAA;AACtD,IAAA,IAAA,CAAK,OAAO,IAAA,CAAK,iBAAA,EAAmB,EAAE,SAAA,EAAW,SAAS,CAAA;AAE1D,IAAA,IAAI,IAAA,CAAK,MAAM,YAAA,EAAc;AAC3B,MAAA,MAAM,IAAA,CAAK,KAAA,CAAM,YAAA,CAAa,OAA8B,CAAA;AAAA,IAC9D;AAEA,IAAA,OAAO,OAAA;AAAA,EACT;AAAA,EAEA,MAAM,MAAA,CAAO,SAAA,EAAmB,OAAA,EAA4C;AAC1E,IAAA,MAAM,UAAU,MAAM,IAAA,CAAK,QAAQ,OAAA,CAAQ,EAAE,WAAW,CAAA;AACxD,IAAA,IAAI,CAAC,OAAA,EAAS,MAAM,IAAI,qBAAqB,SAAS,CAAA;AACtD,IAAA,IAAI,CAAC,OAAA,CAAQ,QAAA,QAAgB,IAAI,kBAAA,CAAmB,WAAW,QAAQ,CAAA;AAEvE,IAAA,MAAM,GAAA,uBAAU,IAAA,EAAK;AACrB,IAAA,MAAM,WAAA,GAA8B;AAAA,MAClC,OAAA,EAASH,QAAO,UAAA,EAAW;AAAA,MAC3B,MAAMG,iBAAAA,CAAkB,MAAA;AAAA,MACxB,SAAS,eAAA,CAAgB,YAAA;AAAA,MACzB,QAAA,EAAU,OAAA;AAAA,MACV,SAAA,EAAW;AAAA,KACb;AAEA,IAAA,MAAM,OAAA,GAAU,MAAM,IAAA,CAAK,OAAA,CAAQ,gBAAA;AAAA,MACjC,EAAE,SAAA,EAAU;AAAA,MACZ;AAAA,QACE,IAAA,EAAM,EAAE,QAAA,EAAU,KAAA,EAAO,UAAU,MAAA,EAAU;AAAA,QAC7C,KAAA,EAAO;AAAA,UACL,QAAA,EAAU;AAAA,YACR,KAAA,EAAO,CAAC,WAAW,CAAA;AAAA,YACnB,MAAA,EAAQ,CAAC,IAAA,CAAK,OAAA,CAAQ;AAAA;AACxB;AACF,OACF;AAAA,MACA,EAAE,KAAK,IAAA;AAAK,KACd;AAEA,IAAA,IAAI,CAAC,OAAA,EAAS,MAAM,IAAI,qBAAqB,SAAS,CAAA;AACtD,IAAA,IAAA,CAAK,OAAO,IAAA,CAAK,mBAAA,EAAqB,EAAE,SAAA,EAAW,SAAS,CAAA;AAE5D,IAAA,OAAO,OAAA;AAAA,EACT;AAAA,EAEA,MAAM,eAAA,CACJ,UAAA,EACA,UAAA,EACA,OAAA,EACgC;AAChC,IAAA,MAAM,YAAsB,EAAC;AAC7B,IAAA,MAAM,SAAiD,EAAC;AAExD,IAAA,KAAA,MAAW,aAAa,UAAA,EAAY;AAClC,MAAA,IAAI;AACF,QAAA,MAAM,IAAA,CAAK,WAAA,CAAY,SAAA,EAAW,UAAA,EAAY,OAAO,CAAA;AACrD,QAAA,SAAA,CAAU,KAAK,SAAS,CAAA;AAAA,MAC1B,SAAS,GAAA,EAAK;AACZ,QAAA,MAAA,CAAO,IAAA,CAAK;AAAA,UACV,SAAA;AAAA,UACA,OAAO,GAAA,YAAe,KAAA,GAAQ,GAAA,CAAI,OAAA,GAAU,OAAO,GAAG;AAAA,SACvD,CAAA;AAAA,MACH;AAAA,IACF;AAEA,IAAA,IAAA,CAAK,MAAA,CAAO,KAAK,6BAAA,EAA+B;AAAA,MAC9C,OAAO,UAAA,CAAW,MAAA;AAAA,MAClB,WAAW,SAAA,CAAU,MAAA;AAAA,MACrB,QAAQ,MAAA,CAAO;AAAA,KAChB,CAAA;AAED,IAAA,OAAO,EAAE,SAAA,EAAW,MAAA,EAAQ,KAAA,EAAO,WAAW,MAAA,EAAO;AAAA,EACvD;AAAA,EAEA,MAAM,eAAA,CAAgB,OAAA,EAAkB,SAAA,EAAoD;AAC1F,IAAA,MAAM,GAAA,uBAAU,IAAA,EAAK;AACrB,IAAA,MAAM,KAAA,GAAiC;AAAA,MACrC,gBAAA,EAAkB,EAAE,IAAA,EAAM,GAAA,EAAI;AAAA,MAC9B,QAAA,EAAU,KAAA;AAAA,MACV,kBAAA,EAAoB,IAAA;AAAA,MACpB,SAAA,EAAW,EAAE,GAAA,EAAK,IAAA;AAAK,KACzB;AAEA,IAAA,IAAI,OAAA,QAAe,OAAA,GAAU,OAAA;AAE7B,IAAA,IAAI,SAAA,EAAW,IAAA,IAAQ,SAAA,EAAW,EAAA,EAAI;AACpC,MAAA,MAAM,aAAsC,EAAC;AAC7C,MAAA,IAAI,UAAU,IAAA,EAAM,UAAA,CAAW,OAAO,IAAI,IAAA,CAAK,UAAU,IAAI,CAAA;AAC7D,MAAA,IAAI,UAAU,EAAA,EAAI,UAAA,CAAW,OAAO,IAAI,IAAA,CAAK,UAAU,EAAE,CAAA;AAEzD,MAAA,KAAA,CAAM,mBAAmB,EAAE,GAAI,KAAA,CAAM,gBAAA,EAA6B,GAAG,UAAA,EAAW;AAAA,IAClF;AAEA,IAAA,OAAO,IAAA,CAAK,QAAQ,IAAA,CAAK,KAAK,EAAE,IAAA,CAAK,EAAE,gBAAA,EAAkB,CAAA,EAAG,CAAA;AAAA,EAC9D;AAAA,EAEA,MAAM,UAAA,CAAW,SAAA,EAAmB,OAAA,EAAkB,SAAA,EAA+C;AACnG,IAAA,MAAM,UAAU,MAAM,IAAA,CAAK,QAAQ,OAAA,CAAQ,EAAE,WAAW,CAAA;AACxD,IAAA,IAAI,CAAC,OAAA,EAAS,MAAM,IAAI,qBAAqB,SAAS,CAAA;AAEtD,IAAA,MAAM,GAAA,uBAAU,IAAA,EAAK;AACrB,IAAA,MAAM,WAAA,GAA8B;AAAA,MAClC,OAAA,EAASH,QAAO,UAAA,EAAW;AAAA,MAC3B,MAAMG,iBAAAA,CAAkB,MAAA;AAAA,MACxB,OAAA,EAAS,YACL,kBAAA,CAAmB,WAAA,CAAY,SAAS,CAAA,GACxC,kBAAA,CAAmB,WAAA,CAAY,OAAA,IAAW,SAAS,CAAA;AAAA,MACvD,QAAA,EAAU,OAAA;AAAA,MACV,SAAA,EAAW;AAAA,KACb;AAEA,IAAA,MAAM,OAAA,GAAU,MAAM,IAAA,CAAK,OAAA,CAAQ,gBAAA;AAAA,MACjC,EAAE,SAAA,EAAU;AAAA,MACZ;AAAA,QACE,IAAA,EAAM,EAAE,SAAA,EAAW,IAAA,EAAM,WAAW,GAAA,EAAI;AAAA,QACxC,KAAA,EAAO;AAAA,UACL,QAAA,EAAU;AAAA,YACR,KAAA,EAAO,CAAC,WAAW,CAAA;AAAA,YACnB,MAAA,EAAQ,CAAC,IAAA,CAAK,OAAA,CAAQ;AAAA;AACxB;AACF,OACF;AAAA,MACA,EAAE,KAAK,IAAA;AAAK,KACd;AAEA,IAAA,IAAI,CAAC,OAAA,EAAS,MAAM,IAAI,qBAAqB,SAAS,CAAA;AACtD,IAAA,IAAA,CAAK,MAAA,CAAO,IAAA,CAAK,uBAAA,EAAyB,EAAE,WAAW,CAAA;AACvD,IAAA,OAAO,OAAA;AAAA,EACT;AACF;;;AC/QO,IAAM,mBAAN,MAAuB;AAAA,EAC5B,WAAA,CACU,OAAA,EACA,QAAA,EACA,MAAA,EACA,YAAA,EACR;AAJQ,IAAA,IAAA,CAAA,OAAA,GAAA,OAAA;AACA,IAAA,IAAA,CAAA,QAAA,GAAA,QAAA;AACA,IAAA,IAAA,CAAA,MAAA,GAAA,MAAA;AACA,IAAA,IAAA,CAAA,YAAA,GAAA,YAAA;AAAA,EACP;AAAA,EAEH,MAAc,aAAa,OAAA,EAAkC;AAC3D,IAAA,IAAI,CAAC,IAAA,CAAK,YAAA,EAAc,OAAO,OAAO,OAAO,CAAA;AAC7C,IAAA,IAAI;AACF,MAAA,MAAM,QAAQ,MAAM,IAAA,CAAK,YAAA,CAAa,MAAA,CAAO,OAAO,CAAC,CAAA;AACrD,MAAA,OAAO,KAAA,EAAO,WAAA,IAAe,MAAA,CAAO,OAAO,CAAA;AAAA,IAC7C,CAAA,CAAA,MAAQ;AACN,MAAA,OAAO,OAAO,OAAO,CAAA;AAAA,IACvB;AAAA,EACF;AAAA,EAEQ,cAAA,CAAe,SAAA,EAAsB,KAAA,GAAQ,UAAA,EAAqC;AACxF,IAAA,IAAI,CAAC,SAAA,CAAU,IAAA,IAAQ,CAAC,SAAA,CAAU,EAAA,SAAW,EAAC;AAC9C,IAAA,MAAM,aAAsC,EAAC;AAC7C,IAAA,IAAI,UAAU,IAAA,EAAM,UAAA,CAAW,OAAO,IAAI,IAAA,CAAK,UAAU,IAAI,CAAA;AAC7D,IAAA,IAAI,UAAU,EAAA,EAAI,UAAA,CAAW,OAAO,IAAI,IAAA,CAAK,UAAU,EAAE,CAAA;AACzD,IAAA,OAAO,EAAE,CAAC,KAAK,GAAG,UAAA,EAAW;AAAA,EAC/B;AAAA,EAEA,MAAM,aAAA,CAAc,OAAA,EAAiB,SAAA,EAA+C;AAClF,IAAA,MAAM,GAAA,uBAAU,IAAA,EAAK;AACrB,IAAA,MAAM,UAAA,GAAsC;AAAA,MAC1C,OAAA;AAAA,MACA,SAAA,EAAW,EAAE,GAAA,EAAK,IAAA,EAAK;AAAA,MACvB,GAAG,IAAA,CAAK,cAAA,CAAe,SAAS;AAAA,KAClC;AAEA,IAAA,MAAM,QAAA,GAAW;AAAA,MACf,EAAE,QAAQ,UAAA,EAAW;AAAA,MACrB;AAAA,QACE,MAAA,EAAQ;AAAA,UACN,GAAA,EAAK,UAAA;AAAA,UACL,UAAA,EAAY,EAAE,IAAA,EAAM,CAAA,EAAE;AAAA,UACtB,WAAA,EAAa;AAAA,YACX,IAAA,EAAM,EAAE,KAAA,EAAO,CAAC,EAAE,GAAA,EAAK,CAAC,WAAA,EAAa,IAAI,CAAA,EAAE,EAAG,CAAA,EAAG,CAAC,CAAA;AAAE,WACtD;AAAA,UACA,kBAAA,EAAoB;AAAA,YAClB,IAAA,EAAM;AAAA,cACJ,KAAA,EAAO;AAAA,gBACL;AAAA,kBACE,IAAA,EAAM;AAAA,oBACJ,EAAE,GAAA,EAAK,CAAC,mBAAA,EAAqB,IAAI,CAAA,EAAE;AAAA,oBACnC,EAAE,GAAA,EAAK,CAAC,WAAA,EAAa,IAAI,CAAA;AAAE;AAC7B,iBACF;AAAA,gBACA,CAAA;AAAA,gBACA;AAAA;AACF;AACF,WACF;AAAA,UACA,gBAAA,EAAkB;AAAA,YAChB,IAAA,EAAM;AAAA,cACJ,KAAA,EAAO;AAAA,gBACL;AAAA,kBACE,IAAA,EAAM;AAAA,oBACJ,EAAE,GAAA,EAAK,CAAC,mBAAA,EAAqB,IAAI,CAAA,EAAE;AAAA,oBACnC,EAAE,GAAA,EAAK,CAAC,mBAAA,EAAqB,GAAG,CAAA,EAAE;AAAA,oBAClC,EAAE,GAAA,EAAK,CAAC,WAAA,EAAa,KAAK,CAAA;AAAE;AAC9B,iBACF;AAAA,gBACA,CAAA;AAAA,gBACA;AAAA;AACF;AACF;AACF;AACF;AACF,KACF;AAEA,IAAA,MAAM,CAAC,OAAA,EAAS,cAAc,CAAA,GAAI,MAAM,QAAQ,GAAA,CAAI;AAAA,MAClD,IAAA,CAAK,OAAA,CAAQ,SAAA,CAA0B,QAAQ,CAAA;AAAA,MAC/C,IAAA,CAAK,QAAQ,SAAA,CAA0C;AAAA,QACrD,EAAE,QAAQ,UAAA,EAAW;AAAA,QACrB,EAAE,MAAA,EAAQ,EAAE,GAAA,EAAK,aAAA,EAAe,OAAO,EAAE,IAAA,EAAM,CAAA,EAAE,EAAE;AAAE,OACtD;AAAA,KACF,CAAA;AAED,IAAA,MAAM,IAAA,GAAO,QAAQ,CAAC,CAAA;AACtB,IAAA,MAAM,SAAA,GAAY,MAAM,IAAA,CAAK,YAAA,CAAa,OAAO,CAAA;AACjD,IAAA,IAAI,CAAC,IAAA,EAAM;AACT,MAAA,OAAO;AAAA,QACL,OAAA;AAAA,QACA,SAAA;AAAA,QACA,UAAA,EAAY,CAAA;AAAA,QACZ,cAAA,EAAgB,CAAA;AAAA,QAChB,kBAAA,EAAoB,CAAA;AAAA,QACpB,gBAAA,EAAkB,CAAA;AAAA,QAClB,iBAAiB,EAAC;AAAA,QAClB,WAAA,EAAa,CAAA;AAAA,QACb,SAAA,EAAW;AAAA,OACb;AAAA,IACF;AAGA,IAAA,IAAI,cAAA,GAAiB,CAAA;AACrB,IAAA,IAAI,SAAA,CAAU,IAAA,IAAQ,SAAA,CAAU,EAAA,EAAI;AAClC,MAAA,MAAM,OAAO,IAAA,CAAK,GAAA;AAAA,QAChB,CAAA;AAAA,QACA,KAAK,IAAA,CAAA,CAAM,IAAI,IAAA,CAAK,SAAA,CAAU,EAAE,CAAA,CAAE,OAAA,EAAQ,GAAI,IAAI,KAAK,SAAA,CAAU,IAAI,CAAA,CAAE,OAAA,MAAa,KAAU;AAAA,OAChG;AACA,MAAA,cAAA,GAAiB,KAAK,KAAA,CAAO,IAAA,CAAK,UAAA,GAAa,IAAA,GAAQ,GAAG,CAAA,GAAI,GAAA;AAAA,IAChE;AAEA,IAAA,MAAM,eAAA,GAAkB,cAAA,CAAe,GAAA,CAAI,CAAC,CAAA,MAAO;AAAA,MACjD,YAAY,CAAA,CAAE,GAAA;AAAA,MACd,cAAc,CAAA,CAAE,GAAA;AAAA,MAChB,OAAO,CAAA,CAAE;AAAA,KACX,CAAE,CAAA;AAEF,IAAA,OAAO;AAAA,MACL,OAAA;AAAA,MACA,SAAA;AAAA,MACA,YAAY,IAAA,CAAK,UAAA;AAAA,MACjB,cAAA;AAAA,MACA,oBAAoB,IAAA,CAAK,kBAAA;AAAA,MACzB,kBAAkB,IAAA,CAAK,gBAAA;AAAA,MACvB,eAAA;AAAA,MACA,aAAa,IAAA,CAAK,WAAA;AAAA,MAClB,SAAA,EAAW,IAAA,CAAK,UAAA,GAAa,CAAA,GACzB,IAAA,CAAK,KAAA,CAAO,IAAA,CAAK,WAAA,GAAc,IAAA,CAAK,UAAA,GAAc,GAAK,CAAA,GAAI,GAAA,GAC3D;AAAA,KACN;AAAA,EACF;AAAA,EAEA,MAAM,oBAAoB,SAAA,EAAiD;AACzE,IAAA,MAAM,GAAA,uBAAU,IAAA,EAAK;AACrB,IAAA,MAAM,UAAA,GAAsC;AAAA,MAC1C,SAAA,EAAW,EAAE,GAAA,EAAK,IAAA,EAAK;AAAA,MACvB,GAAG,IAAA,CAAK,cAAA,CAAe,SAAS;AAAA,KAClC;AAEA,IAAA,MAAM,QAAA,GAAW;AAAA,MACf,EAAE,QAAQ,UAAA,EAAW;AAAA,MACrB;AAAA,QACE,MAAA,EAAQ;AAAA,UACN,GAAA,EAAK,UAAA;AAAA,UACL,UAAA,EAAY,EAAE,IAAA,EAAM,CAAA,EAAE;AAAA,UACtB,WAAA,EAAa;AAAA,YACX,IAAA,EAAM,EAAE,KAAA,EAAO,CAAC,EAAE,GAAA,EAAK,CAAC,WAAA,EAAa,IAAI,CAAA,EAAE,EAAG,CAAA,EAAG,CAAC,CAAA;AAAE,WACtD;AAAA,UACA,kBAAA,EAAoB;AAAA,YAClB,IAAA,EAAM;AAAA,cACJ,KAAA,EAAO;AAAA,gBACL;AAAA,kBACE,IAAA,EAAM;AAAA,oBACJ,EAAE,GAAA,EAAK,CAAC,mBAAA,EAAqB,IAAI,CAAA,EAAE;AAAA,oBACnC,EAAE,GAAA,EAAK,CAAC,WAAA,EAAa,IAAI,CAAA;AAAE;AAC7B,iBACF;AAAA,gBACA,CAAA;AAAA,gBACA;AAAA;AACF;AACF,WACF;AAAA,UACA,gBAAA,EAAkB;AAAA,YAChB,IAAA,EAAM;AAAA,cACJ,KAAA,EAAO;AAAA,gBACL;AAAA,kBACE,IAAA,EAAM;AAAA,oBACJ,EAAE,GAAA,EAAK,CAAC,mBAAA,EAAqB,IAAI,CAAA,EAAE;AAAA,oBACnC,EAAE,GAAA,EAAK,CAAC,mBAAA,EAAqB,GAAG,CAAA,EAAE;AAAA,oBAClC,EAAE,GAAA,EAAK,CAAC,WAAA,EAAa,KAAK,CAAA;AAAE;AAC9B,iBACF;AAAA,gBACA,CAAA;AAAA,gBACA;AAAA;AACF;AACF;AACF;AACF,OACF;AAAA,MACA,EAAE,KAAA,EAAO,EAAE,UAAA,EAAY,IAAY;AAAE,KACvC;AAEA,IAAA,MAAM,OAAA,GAAU,MAAM,IAAA,CAAK,OAAA,CAAQ,UAA0B,QAAQ,CAAA;AAErE,IAAA,OAAO,OAAA,CAAQ,GAAA,CAAI,OAAA,CAAQ,GAAA,CAAI,OAAO,IAAA,MAAU;AAAA,MAC9C,OAAA,EAAS,MAAA,CAAO,IAAA,CAAK,GAAG,CAAA;AAAA,MACxB,WAAW,MAAM,IAAA,CAAK,aAAa,MAAA,CAAO,IAAA,CAAK,GAAG,CAAC,CAAA;AAAA,MACnD,YAAY,IAAA,CAAK,UAAA;AAAA,MACjB,cAAA,EAAgB,CAAA;AAAA,MAChB,oBAAoB,IAAA,CAAK,kBAAA;AAAA,MACzB,kBAAkB,IAAA,CAAK,gBAAA;AAAA,MACvB,iBAAiB,EAAC;AAAA,MAClB,aAAa,IAAA,CAAK,WAAA;AAAA,MAClB,SAAA,EAAW,IAAA,CAAK,UAAA,GAAa,CAAA,GACzB,IAAA,CAAK,KAAA,CAAO,IAAA,CAAK,WAAA,GAAc,IAAA,CAAK,UAAA,GAAc,GAAK,CAAA,GAAI,GAAA,GAC3D;AAAA,MACJ,CAAC,CAAA;AAAA,EACL;AAAA,EAEA,MAAM,YAAA,CAAa,MAAA,EAAiB,SAAA,GAAuB,EAAC,EAAuB;AACjF,IAAA,MAAM,GAAA,uBAAU,IAAA,EAAK;AACrB,IAAA,MAAM,UAAA,GAAsC;AAAA,MAC1C,SAAA,EAAW,EAAE,GAAA,EAAK,IAAA,EAAK;AAAA,MACvB,GAAG,IAAA,CAAK,cAAA,CAAe,SAAS;AAAA,KAClC;AAGA,IAAA,MAAM,QAAA,GAAW;AAAA,MACf,EAAE,QAAQ,UAAA,EAAW;AAAA,MACrB;AAAA,QACE,MAAA,EAAQ;AAAA,UACN,GAAA,EAAK,UAAA;AAAA,UACL,UAAA,EAAY,EAAE,IAAA,EAAM,CAAA,EAAE;AAAA,UACtB,WAAA,EAAa;AAAA,YACX,IAAA,EAAM,EAAE,KAAA,EAAO,CAAC,EAAE,GAAA,EAAK,CAAC,WAAA,EAAa,IAAI,CAAA,EAAE,EAAG,CAAA,EAAG,CAAC,CAAA;AAAE,WACtD;AAAA,UACA,kBAAA,EAAoB;AAAA,YAClB,IAAA,EAAM;AAAA,cACJ,KAAA,EAAO;AAAA,gBACL;AAAA,kBACE,IAAA,EAAM;AAAA,oBACJ,EAAE,GAAA,EAAK,CAAC,mBAAA,EAAqB,IAAI,CAAA,EAAE;AAAA,oBACnC,EAAE,GAAA,EAAK,CAAC,WAAA,EAAa,IAAI,CAAA;AAAE;AAC7B,iBACF;AAAA,gBACA,CAAA;AAAA,gBACA;AAAA;AACF;AACF,WACF;AAAA,UACA,gBAAA,EAAkB;AAAA,YAChB,IAAA,EAAM;AAAA,cACJ,KAAA,EAAO;AAAA,gBACL;AAAA,kBACE,IAAA,EAAM;AAAA,oBACJ,EAAE,GAAA,EAAK,CAAC,mBAAA,EAAqB,IAAI,CAAA,EAAE;AAAA,oBACnC,EAAE,GAAA,EAAK,CAAC,mBAAA,EAAqB,GAAG,CAAA,EAAE;AAAA,oBAClC,EAAE,GAAA,EAAK,CAAC,WAAA,EAAa,KAAK,CAAA;AAAE;AAC9B,iBACF;AAAA,gBACA,CAAA;AAAA,gBACA;AAAA;AACF;AACF;AACF;AACF;AACF,KACF;AAEA,IAAA,MAAM,OAAA,GAAU,MAAM,IAAA,CAAK,OAAA,CAAQ,UAA0B,QAAQ,CAAA;AAErE,IAAA,MAAM,aAA+B,MAAM,OAAA,CAAQ,IAAI,OAAA,CAAQ,GAAA,CAAI,OAAO,IAAA,MAAU;AAAA,MAClF,OAAA,EAAS,MAAA,CAAO,IAAA,CAAK,GAAG,CAAA;AAAA,MACxB,WAAW,MAAM,IAAA,CAAK,aAAa,MAAA,CAAO,IAAA,CAAK,GAAG,CAAC,CAAA;AAAA,MACnD,YAAY,IAAA,CAAK,UAAA;AAAA,MACjB,cAAA,EAAgB,CAAA;AAAA,MAChB,oBAAoB,IAAA,CAAK,kBAAA;AAAA,MACzB,kBAAkB,IAAA,CAAK,gBAAA;AAAA,MACvB,iBAAiB,EAAC;AAAA,MAClB,aAAa,IAAA,CAAK,WAAA;AAAA,MAClB,SAAA,EAAW,IAAA,CAAK,UAAA,GAAa,CAAA,GACzB,IAAA,CAAK,KAAA,CAAO,IAAA,CAAK,WAAA,GAAc,IAAA,CAAK,UAAA,GAAc,GAAK,CAAA,GAAI,GAAA,GAC3D;AAAA,MACJ,CAAC,CAAA;AAEH,IAAA,MAAM,UAAA,GAAa,WAAW,MAAA,CAAO,CAAC,KAAK,CAAA,KAAM,GAAA,GAAM,CAAA,CAAE,UAAA,EAAY,CAAC,CAAA;AAEtE,IAAA,OAAO,EAAE,MAAA,EAAQ,MAAA,IAAU,IAAA,EAAM,YAAY,UAAA,EAAW;AAAA,EAC1D;AAAA,EAEA,MAAM,cAAA,CAAe,SAAA,EAAsB,OAAA,EAA0C;AACnF,IAAA,MAAM,UAAA,GAAsC;AAAA,MAC1C,SAAA,EAAW,EAAE,GAAA,EAAK,IAAA,EAAK;AAAA,MACvB,GAAG,IAAA,CAAK,cAAA,CAAe,SAAS;AAAA,KAClC;AACA,IAAA,IAAI,OAAA,EAAS,UAAA,CAAW,SAAS,CAAA,GAAI,OAAA;AAErC,IAAA,MAAM,CAAC,UAAU,YAAA,EAAc,WAAA,EAAa,QAAQ,CAAA,GAAI,MAAM,QAAQ,GAAA,CAAI;AAAA,MACxE,IAAA,CAAK,QAAQ,SAAA,CAA0C;AAAA,QACrD,EAAE,QAAQ,UAAA,EAAW;AAAA,QACrB;AAAA,UACE,MAAA,EAAQ;AAAA,YACN,GAAA,EAAK,EAAE,aAAA,EAAe,EAAE,QAAQ,UAAA,EAAY,IAAA,EAAM,aAAY,EAAE;AAAA,YAChE,KAAA,EAAO,EAAE,IAAA,EAAM,CAAA;AAAE;AACnB,SACF;AAAA,QACA,EAAE,KAAA,EAAO,EAAE,GAAA,EAAK,GAAW;AAAE,OAC9B,CAAA;AAAA,MACD,IAAA,CAAK,QAAQ,SAAA,CAAuE;AAAA,QAClF,EAAE,QAAQ,UAAA,EAAW;AAAA,QACrB;AAAA,UACE,MAAA,EAAQ;AAAA,YACN,GAAA,EAAK;AAAA,cACH,IAAA,EAAM,EAAE,aAAA,EAAe,EAAE,QAAQ,UAAA,EAAY,IAAA,EAAM,aAAY,EAAE;AAAA,cACjE,SAAA,EAAW;AAAA,aACb;AAAA,YACA,KAAA,EAAO,EAAE,IAAA,EAAM,CAAA;AAAE;AACnB;AACF,OACD,CAAA;AAAA,MACD,IAAA,CAAK,QAAQ,SAAA,CAAwE;AAAA,QACnF,EAAE,QAAQ,UAAA,EAAW;AAAA,QACrB;AAAA,UACE,MAAA,EAAQ;AAAA,YACN,GAAA,EAAK;AAAA,cACH,IAAA,EAAM,EAAE,aAAA,EAAe,EAAE,QAAQ,UAAA,EAAY,IAAA,EAAM,aAAY,EAAE;AAAA,cACjE,UAAA,EAAY;AAAA,aACd;AAAA,YACA,KAAA,EAAO,EAAE,IAAA,EAAM,CAAA;AAAE;AACnB;AACF,OACD,CAAA;AAAA,MACD,IAAA,CAAK,QAAQ,SAAA,CAAqE;AAAA,QAChF,EAAE,QAAQ,UAAA,EAAW;AAAA,QACrB;AAAA,UACE,MAAA,EAAQ;AAAA,YACN,GAAA,EAAK;AAAA,cACH,IAAA,EAAM,EAAE,aAAA,EAAe,EAAE,QAAQ,UAAA,EAAY,IAAA,EAAM,aAAY,EAAE;AAAA,cACjE,OAAA,EAAS,EAAE,SAAA,EAAW,UAAA;AAAW,aACnC;AAAA,YACA,KAAA,EAAO,EAAE,IAAA,EAAM,CAAA;AAAE;AACnB;AACF,OACD;AAAA,KACF,CAAA;AAGD,IAAA,MAAM,eAAA,uBAAsB,GAAA,EAAoD;AAChF,IAAA,KAAA,MAAW,KAAK,YAAA,EAAc;AAC5B,MAAA,MAAM,IAAA,GAAO,EAAE,GAAA,CAAI,IAAA;AACnB,MAAA,IAAI,CAAC,gBAAgB,GAAA,CAAI,IAAI,GAAG,eAAA,CAAgB,GAAA,CAAI,IAAA,EAAM,EAAE,CAAA;AAC5D,MAAA,eAAA,CAAgB,GAAA,CAAI,IAAI,CAAA,CAAG,IAAA,CAAK,EAAE,SAAA,EAAW,CAAA,CAAE,GAAA,CAAI,SAAA,EAAW,KAAA,EAAO,CAAA,CAAE,KAAA,EAAO,CAAA;AAAA,IAChF;AAEA,IAAA,MAAM,cAAA,uBAAqB,GAAA,EAA2E;AACtG,IAAA,KAAA,MAAW,KAAK,WAAA,EAAa;AAC3B,MAAA,MAAM,IAAA,GAAO,EAAE,GAAA,CAAI,IAAA;AACnB,MAAA,IAAI,CAAC,eAAe,GAAA,CAAI,IAAI,GAAG,cAAA,CAAe,GAAA,CAAI,IAAA,EAAM,EAAE,CAAA;AAC1D,MAAA,cAAA,CAAe,IAAI,IAAI,CAAA,CAAG,IAAA,CAAK,EAAE,YAAY,CAAA,CAAE,GAAA,CAAI,UAAA,EAAY,YAAA,EAAc,EAAE,GAAA,CAAI,UAAA,EAAY,KAAA,EAAO,CAAA,CAAE,OAAO,CAAA;AAAA,IACjH;AAEA,IAAA,MAAM,WAAA,uBAAkB,GAAA,EAAqE;AAC7F,IAAA,MAAM,OAAA,CAAQ,GAAA,CAAI,QAAA,CAAS,GAAA,CAAI,OAAO,CAAA,KAAM;AAC1C,MAAA,MAAM,IAAA,GAAO,EAAE,GAAA,CAAI,IAAA;AACnB,MAAA,IAAI,CAAC,YAAY,GAAA,CAAI,IAAI,GAAG,WAAA,CAAY,GAAA,CAAI,IAAA,EAAM,EAAE,CAAA;AACpD,MAAA,MAAM,YAAY,MAAM,IAAA,CAAK,YAAA,CAAa,CAAA,CAAE,IAAI,OAAO,CAAA;AACvD,MAAA,WAAA,CAAY,GAAA,CAAI,IAAI,CAAA,CAAG,IAAA,CAAK,EAAE,OAAA,EAAS,CAAA,CAAE,GAAA,CAAI,OAAA,EAAS,SAAA,EAAW,KAAA,EAAO,CAAA,CAAE,OAAO,CAAA;AAAA,IACnF,CAAC,CAAC,CAAA;AAEF,IAAA,OAAO,QAAA,CAAS,GAAA,CAAI,CAAC,CAAA,MAAO;AAAA,MAC1B,MAAM,CAAA,CAAE,GAAA;AAAA,MACR,OAAO,CAAA,CAAE,KAAA;AAAA,MACT,aAAa,eAAA,CAAgB,GAAA,CAAI,CAAA,CAAE,GAAG,KAAK,EAAC;AAAA,MAC5C,YAAY,cAAA,CAAe,GAAA,CAAI,CAAA,CAAE,GAAG,KAAK,EAAC;AAAA,MAC1C,SAAS,WAAA,CAAY,GAAA,CAAI,CAAA,CAAE,GAAG,KAAK;AAAC,KACtC,CAAE,CAAA;AAAA,EACJ;AAAA,EAEA,MAAM,iBAAA,GAA6C;AACjD,IAAA,MAAM,GAAA,uBAAU,IAAA,EAAK;AACrB,IAAA,MAAM,QAAA,GAAW,IAAI,IAAA,CAAK,GAAA,CAAI,WAAA,EAAY,EAAG,GAAA,CAAI,QAAA,EAAS,EAAG,GAAA,CAAI,OAAA,EAAS,CAAA;AAE1E,IAAA,MAAM,CAAC,WAAW,WAAA,EAAa,gBAAA,EAAkB,UAAU,CAAA,GAAI,MAAM,QAAQ,GAAA,CAAI;AAAA,MAC/E,IAAA,CAAK,OAAA,CAAQ,cAAA,CAAe,EAAE,QAAA,EAAU,KAAA,EAAO,SAAA,EAAW,EAAE,GAAA,EAAK,IAAA,EAAK,EAAG,CAAA;AAAA,MACzE,IAAA,CAAK,OAAA,CAAQ,cAAA,CAAe,EAAE,UAAU,EAAE,IAAA,EAAM,QAAA,EAAS,EAAG,SAAA,EAAW,EAAE,GAAA,EAAK,IAAA,IAAQ,CAAA;AAAA,MACtF,IAAA,CAAK,QAAQ,cAAA,CAAe;AAAA,QAC1B,gBAAA,EAAkB,EAAE,GAAA,EAAK,GAAA,EAAI;AAAA,QAC7B,QAAA,EAAU,KAAA;AAAA,QACV,SAAA,EAAW,EAAE,GAAA,EAAK,IAAA;AAAK,OACxB,CAAA;AAAA,MACD,IAAA,CAAK,OAAA,CAAQ,cAAA,CAAe,EAAE,UAAU,EAAE,IAAA,EAAM,QAAA,EAAS,EAAG,SAAA,EAAW,EAAE,GAAA,EAAK,IAAA,IAAQ;AAAA,KACvF,CAAA;AAED,IAAA,OAAO;AAAA,MACL,SAAA;AAAA,MACA,WAAA;AAAA,MACA,gBAAA;AAAA,MACA,WAAA,EAAa,CAAA;AAAA,MACb;AAAA,KACF;AAAA,EACF;AAAA,EAEA,MAAM,gBAAgB,KAAA,EAAyC;AAC7D,IAAA,MAAM,GAAA,uBAAU,IAAA,EAAK;AACrB,IAAA,MAAM,IAAA,GAAO,IAAI,IAAA,CAAK,GAAA,CAAI,OAAA,EAAQ,GAAI,KAAA,GAAQ,CAAA,GAAI,EAAA,GAAK,EAAA,GAAK,EAAA,GAAK,GAAI,CAAA;AAErE,IAAA,MAAM,OAAA,GAAU,MAAM,IAAA,CAAK,OAAA,CAAQ,SAAA,CAAyB;AAAA,MAC1D,EAAE,MAAA,EAAQ,EAAE,QAAA,EAAU,EAAE,IAAA,EAAM,IAAA,EAAM,IAAA,EAAM,GAAA,IAAO,SAAA,EAAW,EAAE,GAAA,EAAK,IAAA,IAAO,EAAE;AAAA,MAC5E;AAAA,QACE,MAAA,EAAQ;AAAA,UACN,GAAA,EAAK;AAAA,YACH,IAAA,EAAM,EAAE,QAAA,EAAU,WAAA,EAAY;AAAA,YAC9B,IAAA,EAAM,EAAE,YAAA,EAAc,WAAA;AAAY,WACpC;AAAA,UACA,UAAA,EAAY,EAAE,IAAA,EAAM,CAAA,EAAE;AAAA,UACtB,WAAA,EAAa;AAAA,YACX,IAAA,EAAM,EAAE,KAAA,EAAO,CAAC,EAAE,GAAA,EAAK,CAAC,WAAA,EAAa,IAAI,CAAA,EAAE,EAAG,CAAA,EAAG,CAAC,CAAA;AAAE;AACtD;AACF,OACF;AAAA,MACA,EAAE,KAAA,EAAO,EAAE,YAAY,CAAA,EAAY,UAAA,EAAY,GAAW,EAAE;AAAA,MAC5D;AAAA,QACE,QAAA,EAAU;AAAA,UACR,GAAA,EAAK,CAAA;AAAA,UACL,IAAA,EAAM,EAAE,SAAA,EAAW,WAAA,EAAY;AAAA,UAC/B,IAAA,EAAM,WAAA;AAAA,UACN,UAAA,EAAY,CAAA;AAAA,UACZ,WAAA,EAAa;AAAA;AACf;AACF,KACD,CAAA;AAED,IAAA,OAAO,OAAA;AAAA,EACT;AAAA,EAEA,MAAM,iBAAiB,SAAA,EAAkD;AACvE,IAAA,MAAM,UAAA,GAAsC;AAAA,MAC1C,SAAA,EAAW,EAAE,GAAA,EAAK,IAAA,EAAK;AAAA,MACvB,GAAG,IAAA,CAAK,cAAA,CAAe,SAAS;AAAA,KAClC;AAEA,IAAA,MAAM,CAAC,UAAA,EAAY,MAAA,EAAQ,WAAA,EAAa,YAAA,EAAc,WAAA,EAAa,UAAA,EAAY,UAAU,CAAA,GAAI,MAAM,OAAA,CAAQ,GAAA,CAAI;AAAA,MAC7G,IAAA,CAAK,QAAQ,SAAA,CAKV;AAAA,QACD,EAAE,QAAQ,UAAA,EAAW;AAAA,QACrB;AAAA,UACE,MAAA,EAAQ;AAAA,YACN,GAAA,EAAK,IAAA;AAAA,YACL,UAAA,EAAY,EAAE,IAAA,EAAM,CAAA,EAAE;AAAA,YACtB,WAAA,EAAa;AAAA,cACX,IAAA,EAAM,EAAE,KAAA,EAAO,CAAC,EAAE,GAAA,EAAK,CAAC,WAAA,EAAa,IAAI,CAAA,EAAE,EAAG,CAAA,EAAG,CAAC,CAAA;AAAE,aACtD;AAAA,YACA,gBAAA,EAAkB;AAAA,cAChB,IAAA,EAAM;AAAA,gBACJ,KAAA,EAAO;AAAA,kBACL,EAAE,IAAA,EAAM,CAAC,EAAE,GAAA,EAAK,CAAC,WAAA,EAAa,IAAI,CAAA,EAAE,EAAG,EAAE,GAAA,EAAK,CAAC,aAAa,IAAI,CAAA,EAAG,CAAA,EAAE;AAAA,kBACrE,EAAE,SAAA,EAAW,CAAC,WAAA,EAAa,YAAY,CAAA,EAAE;AAAA,kBACzC;AAAA;AACF;AACF;AACF;AACF;AACF,OACD,CAAA;AAAA,MACD,IAAA,CAAK,QAAQ,SAAA,CAAsB;AAAA,QACjC,EAAE,MAAA,EAAQ,EAAE,GAAG,UAAA,EAAY,IAAA,EAAM,EAAE,OAAA,EAAS,IAAA,EAAM,GAAA,EAAK,EAAC,IAAI,EAAE;AAAA,QAC9D,EAAE,SAAS,OAAA,EAAQ;AAAA,QACnB,EAAE,MAAA,EAAQ,EAAE,GAAA,EAAK,OAAA,EAAS,OAAO,EAAE,IAAA,EAAM,CAAA,EAAE,EAAE,EAAE;AAAA,QAC/C,EAAE,KAAA,EAAO,EAAE,KAAA,EAAO,IAAY;AAAE,OACjC,CAAA;AAAA,MACD,IAAA,CAAK,QAAQ,SAAA,CAAsB;AAAA,QACjC,EAAE,MAAA,EAAQ,EAAE,GAAG,UAAA,EAAY,QAAA,EAAU,EAAE,OAAA,EAAS,IAAA,EAAM,GAAA,EAAK,IAAA,EAAK,EAAE,EAAE;AAAA,QACpE,EAAE,MAAA,EAAQ,EAAE,GAAA,EAAK,WAAA,EAAa,OAAO,EAAE,IAAA,EAAM,CAAA,EAAE,EAAE,EAAE;AAAA,QACnD,EAAE,KAAA,EAAO,EAAE,KAAA,EAAO,IAAY;AAAE,OACjC,CAAA;AAAA,MACD,IAAA,CAAK,QAAQ,SAAA,CAAsB;AAAA,QACjC,EAAE,QAAQ,UAAA,EAAW;AAAA,QACrB,EAAE,MAAA,EAAQ,EAAE,GAAA,EAAK,EAAE,KAAA,EAAO,WAAA,EAAY,EAAG,KAAA,EAAO,EAAE,IAAA,EAAM,CAAA,IAAI,EAAE;AAAA,QAC9D,EAAE,KAAA,EAAO,EAAE,GAAA,EAAK,GAAW;AAAE,OAC9B,CAAA;AAAA,MACD,IAAA,CAAK,QAAQ,SAAA,CAAiF;AAAA,QAC5F,EAAE,QAAQ,UAAA,EAAW;AAAA,QACrB;AAAA,UACE,MAAA,EAAQ;AAAA,YACN,GAAA,EAAK,IAAA;AAAA,YACL,KAAA,EAAO,EAAE,IAAA,EAAM,CAAA,EAAE;AAAA,YACjB,YAAA,EAAc;AAAA,cACZ,IAAA,EAAM,EAAE,KAAA,EAAO,CAAC,EAAE,GAAA,EAAK,CAAC,aAAA,EAAe,IAAI,CAAA,EAAE,EAAG,CAAA,EAAG,CAAC,CAAA;AAAE,aACxD;AAAA,YACA,SAAA,EAAW;AAAA,cACT,IAAA,EAAM;AAAA,gBACJ,KAAA,EAAO;AAAA,kBACL;AAAA,oBACE,IAAA,EAAM;AAAA,sBACJ,EAAE,GAAA,EAAK,CAAC,aAAA,EAAe,IAAI,CAAA,EAAE;AAAA,sBAC7B,EAAE,GAAA,EAAK,CAAC,WAAA,EAAa,IAAI,CAAA;AAAE;AAC7B,mBACF;AAAA,kBACA,CAAA;AAAA,kBACA;AAAA;AACF;AACF;AACF;AACF;AACF,OACD,CAAA;AAAA,MACD,IAAA,CAAK,QAAQ,SAAA,CAAsB;AAAA,QACjC,EAAE,QAAQ,UAAA,EAAW;AAAA,QACrB,EAAE,MAAA,EAAQ,EAAE,GAAA,EAAK,UAAA,EAAY,OAAO,EAAE,IAAA,EAAM,CAAA,EAAE,EAAE,EAAE;AAAA,QAClD,EAAE,KAAA,EAAO,EAAE,KAAA,EAAO,IAAY;AAAE,OACjC,CAAA;AAAA,MACD,IAAA,CAAK,QAAQ,SAAA,CAAsB;AAAA,QACjC,EAAE,QAAQ,UAAA,EAAW;AAAA,QACrB,EAAE,MAAA,EAAQ,EAAE,GAAA,EAAK,UAAA,EAAY,OAAO,EAAE,IAAA,EAAM,CAAA,EAAE,EAAE,EAAE;AAAA,QAClD,EAAE,KAAA,EAAO,EAAE,KAAA,EAAO,IAAY;AAAE,OACjC;AAAA,KACF,CAAA;AAED,IAAA,MAAM,OAAA,GAAU,UAAA,CAAW,CAAC,CAAA,IAAK,EAAE,YAAY,CAAA,EAAG,WAAA,EAAa,CAAA,EAAG,gBAAA,EAAkB,CAAA,EAAE;AACtF,IAAA,MAAM,QAAA,GAAW,WAAA,CAAY,CAAC,CAAA,IAAK,EAAE,OAAO,CAAA,EAAG,YAAA,EAAc,CAAA,EAAG,SAAA,EAAW,CAAA,EAAE;AAE7E,IAAA,MAAM,sBAAA,GAAyB,QAAA,CAAS,YAAA,GAAe,CAAA,GACnD,IAAA,CAAK,KAAA,CAAO,QAAA,CAAS,SAAA,GAAY,QAAA,CAAS,YAAA,GAAgB,GAAK,CAAA,GAAI,GAAA,GACnE,CAAA;AAEJ,IAAA,MAAM,gBAAgB,QAAA,CAAS,YAAA;AAC/B,IAAA,MAAM,aAAA,GACJ,QAAA,CAAS,KAAA,GAAQ,CAAA,GAAI,IAAA,CAAK,KAAA,CAAO,QAAA,CAAS,YAAA,GAAe,QAAA,CAAS,KAAA,GAAS,GAAK,CAAA,GAAI,GAAA,GAAM,CAAA;AAE5F,IAAA,MAAM,mBAAA,GAA6C,UAAA,CAAW,GAAA,CAAI,CAAC,CAAA,MAAO;AAAA,MACxE,SAAS,CAAA,CAAE,GAAA,IAAO,OAAO,MAAA,CAAO,CAAA,CAAE,GAAG,CAAA,GAAI,SAAA;AAAA,MACzC,OAAO,CAAA,CAAE;AAAA,KACX,CAAE,CAAA;AAEF,IAAA,MAAM,mBAAA,GAA6C,UAAA,CAAW,GAAA,CAAI,CAAC,CAAA,MAAO;AAAA,MACxE,SAAS,CAAA,CAAE,GAAA,IAAO,OAAO,MAAA,CAAO,CAAA,CAAE,GAAG,CAAA,GAAI,SAAA;AAAA,MACzC,OAAO,CAAA,CAAE;AAAA,KACX,CAAE,CAAA;AAEF,IAAA,OAAO;AAAA,MACL,YAAY,OAAA,CAAQ,UAAA;AAAA,MACpB,aAAa,OAAA,CAAQ,WAAA;AAAA,MACrB,gBAAA,EAAkB,IAAA,CAAK,KAAA,CAAM,OAAA,CAAQ,oBAAoB,CAAC,CAAA;AAAA,MAC1D,sBAAA;AAAA,MACA,eAAA,EAAiB,MAAA,CAAO,GAAA,CAAI,CAAC,OAAO,EAAE,GAAA,EAAK,MAAA,CAAO,CAAA,CAAE,GAAG,CAAA,EAAG,KAAA,EAAO,CAAA,CAAE,OAAM,CAAE,CAAA;AAAA,MAC3E,oBAAA,EAAsB,WAAA,CAAY,GAAA,CAAI,CAAC,OAAO,EAAE,QAAA,EAAU,MAAA,CAAO,CAAA,CAAE,GAAG,CAAA,EAAG,KAAA,EAAO,CAAA,CAAE,OAAM,CAAE,CAAA;AAAA,MAC1F,aAAA,EAAe,YAAA,CAAa,GAAA,CAAI,CAAC,OAAO,EAAE,IAAA,EAAM,MAAA,CAAO,CAAA,CAAE,GAAG,CAAA,EAAG,KAAA,EAAO,CAAA,CAAE,OAAM,CAAE,CAAA;AAAA,MAChF,mBAAA;AAAA,MACA,mBAAA;AAAA,MACA,aAAA;AAAA,MACA;AAAA,KACF;AAAA,EACF;AACF;;;ACziBO,IAAM,2BAAN,MAA+B;AAAA,EACpC,WAAA,CACU,OAAA,EACA,QAAA,EACA,MAAA,EACA,cACA,QAAA,EACR;AALQ,IAAA,IAAA,CAAA,OAAA,GAAA,OAAA;AACA,IAAA,IAAA,CAAA,QAAA,GAAA,QAAA;AACA,IAAA,IAAA,CAAA,MAAA,GAAA,MAAA;AACA,IAAA,IAAA,CAAA,YAAA,GAAA,YAAA;AACA,IAAA,IAAA,CAAA,QAAA,GAAA,QAAA;AAAA,EACP;AAAA,EAEK,cAAA,CAAe,SAAA,EAAsB,KAAA,GAAQ,UAAA,EAAqC;AACxF,IAAA,IAAI,CAAC,SAAA,CAAU,IAAA,IAAQ,CAAC,SAAA,CAAU,EAAA,SAAW,EAAC;AAC9C,IAAA,MAAM,aAAsC,EAAC;AAC7C,IAAA,IAAI,UAAU,IAAA,EAAM,UAAA,CAAW,OAAO,IAAI,IAAA,CAAK,UAAU,IAAI,CAAA;AAC7D,IAAA,IAAI,UAAU,EAAA,EAAI,UAAA,CAAW,OAAO,IAAI,IAAA,CAAK,UAAU,EAAE,CAAA;AACzD,IAAA,OAAO,EAAE,CAAC,KAAK,GAAG,UAAA,EAAW;AAAA,EAC/B;AAAA,EAEA,MAAM,gBAAA,CAAiB,UAAA,EAAoB,SAAA,EAA+C;AACxF,IAAA,MAAM,QAAA,GAAW,MAAM,IAAA,CAAK,QAAA,CAAS,QAAQ,EAAE,UAAA,EAAY,SAAA,EAAW,KAAA,EAAO,CAAA;AAC7E,IAAA,MAAM,YAAA,GAAe,UAAU,IAAA,IAAQ,UAAA;AACvC,IAAA,MAAM,MAAA,GAAS,QAAA,EAAU,MAAA,IAAU,EAAC;AAEpC,IAAA,MAAM,UAAA,GAAsC;AAAA,MAC1C,UAAA;AAAA,MACA,SAAA,EAAW,EAAE,GAAA,EAAK,IAAA,EAAK;AAAA,MACvB,GAAG,IAAA,CAAK,cAAA,CAAe,SAAS;AAAA,KAClC;AAEA,IAAA,MAAM,CAAC,WAAA,EAAa,QAAQ,CAAA,GAAI,MAAM,QAAQ,GAAA,CAAI;AAAA,MAChD,IAAA,CAAK,OAAA,CAAQ,cAAA,CAAe,UAAU,CAAA;AAAA,MACtC,IAAA,CAAK,QAAQ,SAAA,CAAkC;AAAA,QAC7C,EAAE,QAAQ,UAAA,EAAW;AAAA,QACrB,EAAE,OAAA,EAAS,EAAE,MAAM,eAAA,EAAiB,0BAAA,EAA4B,OAAM,EAAE;AAAA,QACxE;AAAA,UACE,MAAA,EAAQ;AAAA,YACN,GAAA,EAAK,yBAAA;AAAA,YACL,KAAA,EAAO,EAAE,IAAA,EAAM,CAAA,EAAE;AAAA,YACjB,WAAA,EAAa,EAAE,IAAA,EAAM,6BAAA;AAA8B;AACrD,SACF;AAAA,QACA;AAAA,UACE,QAAA,EAAU;AAAA,YACR,OAAA,EAAS,MAAA;AAAA,YACT,KAAA,EAAO,CAAA;AAAA,YACP,WAAA,EAAa;AAAA;AACf;AACF,OACD;AAAA,KACF,CAAA;AAED,IAAA,MAAM,UAAA,GAAa,WAAA;AACnB,IAAA,MAAM,QAAA,GAAW,IAAI,GAAA,CAAI,QAAA,CAAS,GAAA,CAAI,CAAC,CAAA,KAAM,CAAC,CAAA,CAAE,OAAA,EAAS,CAAC,CAAC,CAAC,CAAA;AAE5D,IAAA,IAAI,eAAA,GAAiC,IAAA;AACrC,IAAA,IAAI,UAAA,GAAa,CAAA;AAEjB,IAAA,MAAM,UAAA,GAAa,MAAA,CAAO,GAAA,CAAI,CAAC,CAAA,KAAM;AACnC,MAAA,MAAM,GAAA,GAAM,QAAA,CAAS,GAAA,CAAI,CAAA,CAAE,OAAO,CAAA;AAClC,MAAA,MAAM,KAAA,GAAQ,KAAK,KAAA,IAAS,CAAA;AAC5B,MAAA,MAAM,SAAA,GAAY,QAAQ,CAAA,GAAI,IAAA,CAAK,OAAO,GAAA,EAAK,WAAA,IAAe,CAAA,IAAK,KAAK,CAAA,GAAI,CAAA;AAC5E,MAAA,MAAM,cAAA,GAAiB,aAAa,CAAA,GAAI,IAAA,CAAK,MAAO,KAAA,GAAQ,UAAA,GAAc,GAAK,CAAA,GAAI,GAAA,GAAM,CAAA;AAEzF,MAAA,IAAI,YAAY,UAAA,EAAY;AAC1B,QAAA,UAAA,GAAa,SAAA;AACb,QAAA,eAAA,GAAkB,CAAA,CAAE,OAAA;AAAA,MACtB;AAEA,MAAA,OAAO;AAAA,QACL,SAAS,CAAA,CAAE,OAAA;AAAA,QACX,WAAW,CAAA,CAAE,IAAA;AAAA,QACb,KAAA;AAAA,QACA,SAAA;AAAA,QACA;AAAA,OACF;AAAA,IACF,CAAC,CAAA;AAED,IAAA,IAAA,CAAK,OAAO,IAAA,CAAK,yBAAA,EAA2B,EAAE,UAAA,EAAY,YAAY,CAAA;AAEtE,IAAA,OAAO;AAAA,MACL,UAAA;AAAA,MACA,YAAA;AAAA,MACA,UAAA;AAAA,MACA,MAAA,EAAQ,UAAA;AAAA,MACR;AAAA,KACF;AAAA,EACF;AAAA,EAEA,MAAM,iBAAA,CAAkB,UAAA,EAAoB,SAAA,EAA+C;AACzF,IAAA,MAAM,QAAA,GAAW,MAAM,IAAA,CAAK,QAAA,CAAS,QAAQ,EAAE,UAAA,EAAY,SAAA,EAAW,KAAA,EAAO,CAAA;AAC7E,IAAA,MAAM,YAAA,GAAe,UAAU,IAAA,IAAQ,UAAA;AACvC,IAAA,MAAM,MAAA,GAAS,QAAA,EAAU,MAAA,IAAU,EAAC;AAEpC,IAAA,MAAM,UAAA,GAAsC;AAAA,MAC1C,UAAA;AAAA,MACA,SAAA,EAAW,EAAE,GAAA,EAAK,IAAA,EAAK;AAAA,MACvB,GAAG,IAAA,CAAK,cAAA,CAAe,SAAS;AAAA,KAClC;AAEA,IAAA,MAAM,CAAC,UAAA,EAAY,SAAS,CAAA,GAAI,MAAM,QAAQ,GAAA,CAAI;AAAA,MAChD,IAAA,CAAK,QAAQ,SAAA,CAAsB;AAAA,QACjC,EAAE,QAAQ,UAAA,EAAW;AAAA,QACrB,EAAE,SAAS,eAAA,EAAgB;AAAA,QAC3B,EAAE,MAAA,EAAQ,EAAE,GAAA,EAAK,yBAAA,EAA2B,OAAO,EAAE,IAAA,EAAM,CAAA,EAAE,EAAE;AAAE,OAClE,CAAA;AAAA,MACD,IAAA,CAAK,QAAQ,SAAA,CAAsB;AAAA,QACjC,EAAE,QAAQ,UAAA,EAAW;AAAA,QACrB,EAAE,SAAS,eAAA,EAAgB;AAAA,QAC3B,EAAE,MAAA,EAAQ,EAAE,GAAA,EAAK,2BAAA,EAA6B,OAAO,EAAE,IAAA,EAAM,CAAA,EAAE,EAAE;AAAE,OACpE;AAAA,KACF,CAAA;AAED,IAAA,MAAM,UAAA,GAAa,IAAI,GAAA,CAAI,UAAA,CAAW,IAAI,CAAC,CAAA,KAAM,CAAC,MAAA,CAAO,EAAE,GAAG,CAAA,EAAG,CAAA,CAAE,KAAK,CAAC,CAAC,CAAA;AAC1E,IAAA,MAAM,SAAA,GAAY,IAAI,GAAA,CAAI,SAAA,CAAU,IAAI,CAAC,CAAA,KAAM,CAAC,MAAA,CAAO,EAAE,GAAG,CAAA,EAAG,CAAA,CAAE,KAAK,CAAC,CAAC,CAAA;AAExE,IAAA,MAAM,YAAA,GAAe,MAAA,CAAO,GAAA,CAAI,CAAC,CAAA,KAAM;AACrC,MAAA,MAAM,OAAA,GAAU,UAAA,CAAW,GAAA,CAAI,CAAA,CAAE,OAAO,CAAA,IAAK,CAAA;AAC7C,MAAA,MAAM,MAAA,GAAS,SAAA,CAAU,GAAA,CAAI,CAAA,CAAE,OAAO,CAAA,IAAK,CAAA;AAC3C,MAAA,OAAO;AAAA,QACL,SAAS,CAAA,CAAE,OAAA;AAAA,QACX,WAAW,CAAA,CAAE,IAAA;AAAA,QACb,OAAA;AAAA,QACA,MAAA;AAAA,QACA,OAAA,EAAS,IAAA,CAAK,GAAA,CAAI,CAAA,EAAG,UAAU,MAAM;AAAA,OACvC;AAAA,IACF,CAAC,CAAA;AAED,IAAA,OAAO,EAAE,UAAA,EAAY,YAAA,EAAc,MAAA,EAAQ,YAAA,EAAa;AAAA,EAC1D;AAAA,EAEA,MAAM,uBAAuB,SAAA,EAAsD;AACjF,IAAA,MAAM,UAAA,GAAsC;AAAA,MAC1C,SAAA,EAAW,EAAE,GAAA,EAAK,IAAA,EAAK;AAAA,MACvB,GAAG,IAAA,CAAK,cAAA,CAAe,SAAS;AAAA,KAClC;AAEA,IAAA,MAAM,OAAA,GAAU,MAAM,IAAA,CAAK,OAAA,CAAQ,SAAA,CAAsB;AAAA,MACvD,EAAE,QAAQ,UAAA,EAAW;AAAA,MACrB,EAAE,MAAA,EAAQ,EAAE,GAAA,EAAK,UAAA,EAAY,OAAO,EAAE,IAAA,EAAM,CAAA,EAAE,EAAE,EAAE;AAAA,MAClD,EAAE,KAAA,EAAO,EAAE,KAAA,EAAO,IAAY;AAAE,KACjC,CAAA;AAED,IAAA,OAAO,OAAA,CAAQ,GAAA,CAAI,CAAC,CAAA,MAAO;AAAA,MACzB,SAAS,CAAA,CAAE,GAAA,IAAO,OAAO,MAAA,CAAO,CAAA,CAAE,GAAG,CAAA,GAAI,SAAA;AAAA,MACzC,OAAO,CAAA,CAAE;AAAA,KACX,CAAE,CAAA;AAAA,EACJ;AAAA,EAEA,MAAM,uBAAuB,SAAA,EAAsD;AACjF,IAAA,MAAM,UAAA,GAAsC;AAAA,MAC1C,SAAA,EAAW,EAAE,GAAA,EAAK,IAAA,EAAK;AAAA,MACvB,GAAG,IAAA,CAAK,cAAA,CAAe,SAAS;AAAA,KAClC;AAEA,IAAA,MAAM,OAAA,GAAU,MAAM,IAAA,CAAK,OAAA,CAAQ,SAAA,CAAsB;AAAA,MACvD,EAAE,QAAQ,UAAA,EAAW;AAAA,MACrB,EAAE,MAAA,EAAQ,EAAE,GAAA,EAAK,UAAA,EAAY,OAAO,EAAE,IAAA,EAAM,CAAA,EAAE,EAAE,EAAE;AAAA,MAClD,EAAE,KAAA,EAAO,EAAE,KAAA,EAAO,IAAY;AAAE,KACjC,CAAA;AAED,IAAA,OAAO,OAAA,CAAQ,GAAA,CAAI,CAAC,CAAA,MAAO;AAAA,MACzB,SAAS,CAAA,CAAE,GAAA,IAAO,OAAO,MAAA,CAAO,CAAA,CAAE,GAAG,CAAA,GAAI,SAAA;AAAA,MACzC,OAAO,CAAA,CAAE;AAAA,KACX,CAAE,CAAA;AAAA,EACJ;AAAA,EAEA,MAAM,iBAAiB,SAAA,EAA8C;AACnE,IAAA,MAAM,UAAA,GAAsC;AAAA,MAC1C,SAAA,EAAW,EAAE,GAAA,EAAK,IAAA,EAAK;AAAA,MACvB,GAAG,IAAA,CAAK,cAAA,CAAe,SAAS;AAAA,KAClC;AAEA,IAAA,MAAM,OAAA,GAAU,MAAM,IAAA,CAAK,OAAA,CAAQ,SAAA,CAA+D;AAAA,MAChG,EAAE,QAAQ,UAAA,EAAW;AAAA,MACrB;AAAA,QACE,MAAA,EAAQ;AAAA,UACN,GAAA,EAAK,IAAA;AAAA,UACL,KAAA,EAAO,EAAE,IAAA,EAAM,CAAA,EAAE;AAAA,UACjB,aAAA,EAAe;AAAA,YACb,IAAA,EAAM,EAAE,KAAA,EAAO,CAAC,EAAE,GAAA,EAAK,CAAC,aAAA,EAAe,IAAI,CAAA,EAAE,EAAG,CAAA,EAAG,CAAC,CAAA;AAAE;AACxD;AACF;AACF,KACD,CAAA;AAED,IAAA,MAAM,IAAA,GAAO,QAAQ,CAAC,CAAA,IAAK,EAAE,KAAA,EAAO,CAAA,EAAG,eAAe,CAAA,EAAE;AACxD,IAAA,MAAM,aAAA,GACJ,IAAA,CAAK,KAAA,GAAQ,CAAA,GAAI,IAAA,CAAK,KAAA,CAAO,IAAA,CAAK,aAAA,GAAgB,IAAA,CAAK,KAAA,GAAS,GAAK,CAAA,GAAI,GAAA,GAAM,CAAA;AAEjF,IAAA,OAAO;AAAA,MACL,eAAe,IAAA,CAAK,aAAA;AAAA,MACpB,YAAY,IAAA,CAAK,KAAA;AAAA,MACjB;AAAA,KACF;AAAA,EACF;AACF;;;ACtNA,IAAM,UAAA,GAAa,6HAAA;AAIZ,IAAM,gBAAN,MAAoB;AAAA,EACzB,WAAA,CACU,OAAA,EACA,iBAAA,EACA,MAAA,EACR;AAHQ,IAAA,IAAA,CAAA,OAAA,GAAA,OAAA;AACA,IAAA,IAAA,CAAA,iBAAA,GAAA,iBAAA;AACA,IAAA,IAAA,CAAA,MAAA,GAAA,MAAA;AAAA,EACP;AAAA,EAEH,MAAM,aAAA,CAAc,SAAA,EAAmB,MAAA,EAAuC;AAC5E,IAAA,MAAM,UAAU,MAAM,IAAA,CAAK,QAAQ,OAAA,CAAQ,EAAE,WAAW,CAAA;AACxD,IAAA,IAAI,CAAC,OAAA,EAAS,MAAM,IAAI,qBAAqB,SAAS,CAAA;AAEtD,IAAA,IAAI,WAAW,KAAA,EAAO;AACpB,MAAA,OAAO,IAAA,CAAK,KAAA,CAAM,CAAC,OAAO,CAAC,CAAA;AAAA,IAC7B;AAEA,IAAA,OAAO,IAAA,CAAK,SAAA;AAAA,MACT,OAAA,CAA+C,QAAA,GAC3C,OAAA,CAA+C,QAAA,EAAS,GACzD,OAAA;AAAA,MACJ,IAAA;AAAA,MACA;AAAA,KACF;AAAA,EACF;AAAA,EAEA,MAAM,cAAA,CAAe,MAAA,EAAsB,MAAA,EAAuC;AAChF,IAAA,MAAM,QAAiC,EAAC;AAExC,IAAA,IAAI,MAAA,CAAO,UAAA,EAAY,KAAA,CAAM,UAAA,GAAa,MAAA,CAAO,UAAA;AACjD,IAAA,IAAI,MAAA,CAAO,OAAA,EAAS,KAAA,CAAM,cAAA,GAAiB,MAAA,CAAO,OAAA;AAClD,IAAA,IAAI,MAAA,CAAO,OAAA,EAAS,KAAA,CAAM,OAAA,GAAU,MAAA,CAAO,OAAA;AAC3C,IAAA,IAAI,MAAA,CAAO,IAAA,IAAQ,MAAA,CAAO,IAAA,CAAK,MAAA,GAAS,CAAA,EAAG,KAAA,CAAM,IAAA,GAAO,EAAE,GAAA,EAAK,MAAA,CAAO,IAAA,EAAK;AAC3E,IAAA,IAAI,MAAA,CAAO,QAAA,EAAU,KAAA,CAAM,QAAA,GAAW,MAAA,CAAO,QAAA;AAC7C,IAAA,IAAI,MAAA,CAAO,QAAA,KAAa,MAAA,EAAW,KAAA,CAAM,WAAW,MAAA,CAAO,QAAA;AAE3D,IAAA,IAAI,MAAA,CAAO,QAAA,IAAY,MAAA,CAAO,MAAA,EAAQ;AACpC,MAAA,MAAM,aAAsC,EAAC;AAC7C,MAAA,IAAI,OAAO,QAAA,EAAU,UAAA,CAAW,OAAO,IAAI,IAAA,CAAK,OAAO,QAAQ,CAAA;AAC/D,MAAA,IAAI,OAAO,MAAA,EAAQ,UAAA,CAAW,OAAO,IAAI,IAAA,CAAK,OAAO,MAAM,CAAA;AAC3D,MAAA,KAAA,CAAM,QAAA,GAAW,UAAA;AAAA,IACnB;AAEA,IAAA,MAAM,QAAA,GAAW,MAAM,IAAA,CAAK,OAAA,CAAQ,IAAA,CAAK,KAAK,CAAA,CAAE,IAAA,CAAK,EAAE,QAAA,EAAU,EAAA,EAAI,CAAA;AAErE,IAAA,IAAI,WAAW,KAAA,EAAO;AACpB,MAAA,OAAO,IAAA,CAAK,MAAM,QAAQ,CAAA;AAAA,IAC5B;AAEA,IAAA,OAAO,IAAA,CAAK,SAAA;AAAA,MACV,QAAA,CAAS,GAAA;AAAA,QAAI,CAAC,CAAA,KACX,CAAA,CAAyC,QAAA,GACrC,CAAA,CAAyC,UAAS,GACnD;AAAA,OACN;AAAA,MACA,IAAA;AAAA,MACA;AAAA,KACF;AAAA,EACF;AAAA,EAEA,MAAM,oBAAA,CAAqB,UAAA,EAAoB,SAAA,EAAsB,MAAA,EAAuC;AAC1G,IAAA,MAAM,SAAS,MAAM,IAAA,CAAK,iBAAA,CAAkB,gBAAA,CAAiB,YAAY,SAAS,CAAA;AAElF,IAAA,IAAI,WAAW,KAAA,EAAO;AACpB,MAAA,MAAM,MAAA,GAAS,qGAAA;AACf,MAAA,MAAM,IAAA,GAAiB,CAAC,MAAM,CAAA;AAC9B,MAAA,KAAA,MAAW,KAAA,IAAS,OAAO,MAAA,EAAQ;AACjC,QAAA,IAAA,CAAK,IAAA;AAAA,UACH;AAAA,YACE,IAAA,CAAK,SAAA,CAAU,MAAA,CAAO,UAAU,CAAA;AAAA,YAChC,IAAA,CAAK,SAAA,CAAU,MAAA,CAAO,YAAY,CAAA;AAAA,YAClC,MAAA,CAAO,OAAO,UAAU,CAAA;AAAA,YACxB,IAAA,CAAK,SAAA,CAAU,KAAA,CAAM,OAAO,CAAA;AAAA,YAC5B,IAAA,CAAK,SAAA,CAAU,KAAA,CAAM,SAAS,CAAA;AAAA,YAC9B,MAAA,CAAO,MAAM,KAAK,CAAA;AAAA,YAClB,MAAA,CAAO,MAAM,SAAS,CAAA;AAAA,YACtB,MAAA,CAAO,MAAM,cAAc,CAAA;AAAA,YAC3B,IAAA,CAAK,SAAA,CAAU,MAAA,CAAO,eAAA,IAAmB,EAAE;AAAA,WAC7C,CAAE,KAAK,GAAG;AAAA,SACZ;AAAA,MACF;AACA,MAAA,IAAA,CAAK,MAAA,CAAO,IAAA,CAAK,iCAAA,EAAmC,EAAE,YAAY,CAAA;AAClE,MAAA,OAAO,IAAA,CAAK,KAAK,IAAI,CAAA;AAAA,IACvB;AAEA,IAAA,IAAA,CAAK,MAAA,CAAO,IAAA,CAAK,kCAAA,EAAoC,EAAE,YAAY,CAAA;AACnE,IAAA,OAAO,IAAA,CAAK,SAAA,CAAU,MAAA,EAAQ,IAAA,EAAM,CAAC,CAAA;AAAA,EACvC;AAAA,EAEQ,MAAM,QAAA,EAAsC;AAClD,IAAA,MAAM,IAAA,GAAiB,CAAC,UAAU,CAAA;AAElC,IAAA,KAAA,MAAW,KAAK,QAAA,EAAU;AACxB,MAAA,MAAM,GAAA,GAAM;AAAA,QACV,IAAA,CAAK,SAAA,CAAU,CAAA,CAAE,SAAS,CAAA;AAAA,QAC1B,IAAA,CAAK,SAAA,CAAU,CAAA,CAAE,UAAA,EAAY,eAAe,EAAE,CAAA;AAAA,QAC9C,IAAA,CAAK,SAAA,CAAU,CAAA,CAAE,UAAA,EAAY,SAAS,EAAE,CAAA;AAAA,QACxC,IAAA,CAAK,SAAA,CAAU,CAAA,CAAE,UAAA,EAAY,SAAS,EAAE,CAAA;AAAA,QACxC,IAAA,CAAK,SAAA,CAAU,CAAA,CAAE,SAAA,IAAa,EAAE,CAAA;AAAA,QAChC,IAAA,CAAK,SAAA,CAAU,CAAA,CAAE,UAAA,IAAc,EAAE,CAAA;AAAA,QACjC,IAAA,CAAK,SAAA,CAAU,CAAA,CAAE,cAAA,IAAkB,EAAE,CAAA;AAAA,QACrC,IAAA,CAAK,SAAA,CAAU,CAAA,CAAE,QAAA,IAAY,EAAE,CAAA;AAAA,QAC/B,KAAK,SAAA,CAAU,CAAA,CAAE,OAAA,EAAS,QAAA,MAAc,EAAE,CAAA;AAAA,QAC1C,CAAA,CAAE,WAAW,IAAI,IAAA,CAAK,EAAE,QAAQ,CAAA,CAAE,aAAY,GAAI,EAAA;AAAA,QAClD,MAAA,CAAO,CAAA,CAAE,QAAA,IAAY,KAAK,CAAA;AAAA,QAC1B,IAAA,CAAK,WAAW,CAAA,CAAE,IAAA,IAAQ,EAAC,EAAG,IAAA,CAAK,GAAG,CAAC;AAAA,OACzC,CAAE,KAAK,GAAG,CAAA;AACV,MAAA,IAAA,CAAK,KAAK,GAAG,CAAA;AAAA,IACf;AAEA,IAAA,OAAO,IAAA,CAAK,KAAK,IAAI,CAAA;AAAA,EACvB;AAAA,EAEQ,UAAU,KAAA,EAAuB;AACvC,IAAA,IAAI,KAAA,CAAM,QAAA,CAAS,GAAG,CAAA,IAAK,KAAA,CAAM,QAAA,CAAS,GAAG,CAAA,IAAK,KAAA,CAAM,QAAA,CAAS,IAAI,CAAA,EAAG;AACtE,MAAA,OAAO,CAAA,CAAA,EAAI,KAAA,CAAM,OAAA,CAAQ,IAAA,EAAM,IAAI,CAAC,CAAA,CAAA,CAAA;AAAA,IACtC;AACA,IAAA,OAAO,KAAA;AAAA,EACT;AACF;AC3HO,SAAS,oBAAA,CACd,UACA,MAAA,EACQ;AACR,EAAA,MAAM,SAAS,MAAA,EAAO;AAGtB,EAAA,MAAA,CAAO,GAAA,CAAI,GAAA,EAAK,OAAO,GAAA,EAAc,GAAA,KAAkB;AACrD,IAAA,IAAI;AACF,MAAA,MAAM,QAAA,GAAW,GAAA,CAAI,KAAA,CAAM,UAAU,CAAA,KAAM,SACvC,GAAA,CAAI,KAAA,CAAM,UAAU,CAAA,KAAM,MAAA,GAC1B,KAAA,CAAA;AACJ,MAAA,MAAM,SAAS,MAAM,QAAA,CAAS,IAAA,CAAK,EAAE,UAAU,CAAA;AAC/C,MAAA,WAAA,CAAY,KAAK,MAAM,CAAA;AAAA,IACzB,SAAS,KAAA,EAAgB;AACvB,MAAA,MAAM,OAAA,GAAU,KAAA,YAAiB,KAAA,GAAQ,KAAA,CAAM,OAAA,GAAU,eAAA;AACzD,MAAA,MAAA,CAAO,KAAA,CAAM,0BAAA,EAA4B,EAAE,KAAA,EAAO,SAAS,CAAA;AAC3D,MAAA,SAAA,CAAU,GAAA,EAAK,SAAS,GAAG,CAAA;AAAA,IAC7B;AAAA,EACF,CAAC,CAAA;AAGD,EAAA,MAAA,CAAO,IAAA,CAAK,GAAA,EAAK,OAAO,GAAA,EAAc,GAAA,KAAkB;AACtD,IAAA,IAAI;AACF,MAAA,MAAM,MAAA,GAAS,MAAM,QAAA,CAAS,MAAA,CAAO,IAAI,IAAI,CAAA;AAC7C,MAAA,WAAA,CAAY,GAAA,EAAK,QAAQ,GAAG,CAAA;AAAA,IAC9B,SAAS,KAAA,EAAgB;AACvB,MAAA,IAAI,iBAAiB,eAAA,EAAiB;AACpC,QAAA,SAAA,CAAU,GAAA,EAAK,KAAA,CAAM,OAAA,EAAS,GAAG,CAAA;AACjC,QAAA;AAAA,MACF;AACA,MAAA,MAAM,OAAA,GAAU,KAAA,YAAiB,KAAA,GAAQ,KAAA,CAAM,OAAA,GAAU,eAAA;AACzD,MAAA,MAAA,CAAO,KAAA,CAAM,2BAAA,EAA6B,EAAE,KAAA,EAAO,SAAS,CAAA;AAC5D,MAAA,SAAA,CAAU,GAAA,EAAK,SAAS,GAAG,CAAA;AAAA,IAC7B;AAAA,EACF,CAAC,CAAA;AAGD,EAAA,MAAA,CAAO,GAAA,CAAI,MAAA,EAAQ,OAAO,GAAA,EAAc,GAAA,KAAkB;AACxD,IAAA,IAAI;AACF,MAAA,MAAM,SAAS,MAAM,QAAA,CAAS,IAAI,GAAA,CAAI,MAAA,CAAO,IAAI,CAAE,CAAA;AACnD,MAAA,WAAA,CAAY,KAAK,MAAM,CAAA;AAAA,IACzB,SAAS,KAAA,EAAgB;AACvB,MAAA,IAAI,iBAAiB,eAAA,EAAiB;AACpC,QAAA,SAAA,CAAU,GAAA,EAAK,KAAA,CAAM,OAAA,EAAS,GAAG,CAAA;AACjC,QAAA;AAAA,MACF;AACA,MAAA,MAAM,OAAA,GAAU,KAAA,YAAiB,KAAA,GAAQ,KAAA,CAAM,OAAA,GAAU,eAAA;AACzD,MAAA,MAAA,CAAO,KAAA,CAAM,wBAAA,EAA0B,EAAE,EAAA,EAAI,GAAA,CAAI,OAAO,IAAI,CAAA,EAAG,KAAA,EAAO,OAAA,EAAS,CAAA;AAC/E,MAAA,SAAA,CAAU,GAAA,EAAK,SAAS,GAAG,CAAA;AAAA,IAC7B;AAAA,EACF,CAAC,CAAA;AAGD,EAAA,MAAA,CAAO,GAAA,CAAI,MAAA,EAAQ,OAAO,GAAA,EAAc,GAAA,KAAkB;AACxD,IAAA,IAAI;AACF,MAAA,MAAM,MAAA,GAAS,MAAM,QAAA,CAAS,MAAA,CAAO,IAAI,MAAA,CAAO,IAAI,CAAA,EAAI,GAAA,CAAI,IAAI,CAAA;AAChE,MAAA,WAAA,CAAY,KAAK,MAAM,CAAA;AAAA,IACzB,SAAS,KAAA,EAAgB;AACvB,MAAA,IAAI,iBAAiB,eAAA,EAAiB;AACpC,QAAA,SAAA,CAAU,GAAA,EAAK,KAAA,CAAM,OAAA,EAAS,GAAG,CAAA;AACjC,QAAA;AAAA,MACF;AACA,MAAA,MAAM,OAAA,GAAU,KAAA,YAAiB,KAAA,GAAQ,KAAA,CAAM,OAAA,GAAU,eAAA;AACzD,MAAA,MAAA,CAAO,KAAA,CAAM,2BAAA,EAA6B,EAAE,EAAA,EAAI,GAAA,CAAI,OAAO,IAAI,CAAA,EAAG,KAAA,EAAO,OAAA,EAAS,CAAA;AAClF,MAAA,SAAA,CAAU,GAAA,EAAK,SAAS,GAAG,CAAA;AAAA,IAC7B;AAAA,EACF,CAAC,CAAA;AAGD,EAAA,MAAA,CAAO,MAAA,CAAO,MAAA,EAAQ,OAAO,GAAA,EAAc,GAAA,KAAkB;AAC3D,IAAA,IAAI;AACF,MAAA,MAAM,QAAA,CAAS,MAAA,CAAO,GAAA,CAAI,MAAA,CAAO,IAAI,CAAE,CAAA;AACvC,MAAA,WAAA,CAAY,KAAK,KAAA,CAAS,CAAA;AAAA,IAC5B,SAAS,KAAA,EAAgB;AACvB,MAAA,IAAI,iBAAiB,eAAA,EAAiB;AACpC,QAAA,SAAA,CAAU,GAAA,EAAK,KAAA,CAAM,OAAA,EAAS,GAAG,CAAA;AACjC,QAAA;AAAA,MACF;AACA,MAAA,MAAM,OAAA,GAAU,KAAA,YAAiB,KAAA,GAAQ,KAAA,CAAM,OAAA,GAAU,eAAA;AACzD,MAAA,MAAA,CAAO,KAAA,CAAM,2BAAA,EAA6B,EAAE,EAAA,EAAI,GAAA,CAAI,OAAO,IAAI,CAAA,EAAG,KAAA,EAAO,OAAA,EAAS,CAAA;AAClF,MAAA,SAAA,CAAU,GAAA,EAAK,SAAS,GAAG,CAAA;AAAA,IAC7B;AAAA,EACF,CAAC,CAAA;AAGD,EAAA,MAAA,CAAO,IAAA,CAAK,aAAA,EAAe,OAAO,GAAA,EAAc,GAAA,KAAkB;AAChE,IAAA,IAAI;AACF,MAAA,MAAM,MAAA,GAAS,MAAM,QAAA,CAAS,QAAA,CAAS,IAAI,MAAA,CAAO,IAAI,CAAA,EAAI,GAAA,CAAI,IAAI,CAAA;AAClE,MAAA,WAAA,CAAY,GAAA,EAAK,QAAQ,GAAG,CAAA;AAAA,IAC9B,SAAS,KAAA,EAAgB;AACvB,MAAA,IAAI,iBAAiB,eAAA,EAAiB;AACpC,QAAA,SAAA,CAAU,GAAA,EAAK,KAAA,CAAM,OAAA,EAAS,GAAG,CAAA;AACjC,QAAA;AAAA,MACF;AACA,MAAA,MAAM,OAAA,GAAU,KAAA,YAAiB,KAAA,GAAQ,KAAA,CAAM,OAAA,GAAU,eAAA;AACzD,MAAA,MAAA,CAAO,KAAA,CAAM,qBAAA,EAAuB,EAAE,EAAA,EAAI,GAAA,CAAI,OAAO,IAAI,CAAA,EAAG,KAAA,EAAO,OAAA,EAAS,CAAA;AAC5E,MAAA,SAAA,CAAU,GAAA,EAAK,SAAS,GAAG,CAAA;AAAA,IAC7B;AAAA,EACF,CAAC,CAAA;AAGD,EAAA,MAAA,CAAO,GAAA,CAAI,qBAAA,EAAuB,OAAO,GAAA,EAAc,GAAA,KAAkB;AACvE,IAAA,IAAI;AACF,MAAA,MAAM,EAAE,QAAA,EAAS,GAAI,GAAA,CAAI,IAAA;AACzB,MAAA,MAAM,MAAA,GAAS,MAAM,QAAA,CAAS,aAAA,CAAc,IAAI,MAAA,CAAO,IAAI,GAAI,QAAQ,CAAA;AACvE,MAAA,WAAA,CAAY,KAAK,MAAM,CAAA;AAAA,IACzB,SAAS,KAAA,EAAgB;AACvB,MAAA,IAAI,iBAAiB,eAAA,EAAiB;AACpC,QAAA,SAAA,CAAU,GAAA,EAAK,KAAA,CAAM,OAAA,EAAS,GAAG,CAAA;AACjC,QAAA;AAAA,MACF;AACA,MAAA,MAAM,OAAA,GAAU,KAAA,YAAiB,KAAA,GAAQ,KAAA,CAAM,OAAA,GAAU,eAAA;AACzD,MAAA,MAAA,CAAO,KAAA,CAAM,0BAAA,EAA4B,EAAE,EAAA,EAAI,GAAA,CAAI,OAAO,IAAI,CAAA,EAAG,KAAA,EAAO,OAAA,EAAS,CAAA;AACjF,MAAA,SAAA,CAAU,GAAA,EAAK,SAAS,GAAG,CAAA;AAAA,IAC7B;AAAA,EACF,CAAC,CAAA;AAGD,EAAA,MAAA,CAAO,GAAA,CAAI,sBAAA,EAAwB,OAAO,GAAA,EAAc,GAAA,KAAkB;AACxE,IAAA,IAAI;AACF,MAAA,MAAM,MAAA,GAAS,MAAM,QAAA,CAAS,WAAA,CAAY,GAAA,CAAI,MAAA,CAAO,IAAI,CAAA,EAAI,GAAA,CAAI,MAAA,CAAO,SAAS,CAAA,EAAI,IAAI,IAAI,CAAA;AAC7F,MAAA,WAAA,CAAY,KAAK,MAAM,CAAA;AAAA,IACzB,SAAS,KAAA,EAAgB;AACvB,MAAA,IAAI,iBAAiB,eAAA,EAAiB;AACpC,QAAA,SAAA,CAAU,GAAA,EAAK,KAAA,CAAM,OAAA,EAAS,GAAG,CAAA;AACjC,QAAA;AAAA,MACF;AACA,MAAA,MAAM,OAAA,GAAU,KAAA,YAAiB,KAAA,GAAQ,KAAA,CAAM,OAAA,GAAU,eAAA;AACzD,MAAA,MAAA,CAAO,KAAA,CAAM,wBAAA,EAA0B,EAAE,EAAA,EAAI,IAAI,MAAA,CAAO,IAAI,CAAA,EAAG,OAAA,EAAS,IAAI,MAAA,CAAO,SAAS,CAAA,EAAG,KAAA,EAAO,SAAS,CAAA;AAC/G,MAAA,SAAA,CAAU,GAAA,EAAK,SAAS,GAAG,CAAA;AAAA,IAC7B;AAAA,EACF,CAAC,CAAA;AAGD,EAAA,MAAA,CAAO,MAAA,CAAO,sBAAA,EAAwB,OAAO,GAAA,EAAc,GAAA,KAAkB;AAC3E,IAAA,IAAI;AACF,MAAA,MAAM,QAAA,CAAS,YAAY,GAAA,CAAI,MAAA,CAAO,IAAI,CAAA,EAAI,GAAA,CAAI,MAAA,CAAO,SAAS,CAAE,CAAA;AACpE,MAAA,WAAA,CAAY,KAAK,KAAA,CAAS,CAAA;AAAA,IAC5B,SAAS,KAAA,EAAgB;AACvB,MAAA,IAAI,iBAAiB,eAAA,EAAiB;AACpC,QAAA,SAAA,CAAU,GAAA,EAAK,KAAA,CAAM,OAAA,EAAS,GAAG,CAAA;AACjC,QAAA;AAAA,MACF;AACA,MAAA,MAAM,OAAA,GAAU,KAAA,YAAiB,KAAA,GAAQ,KAAA,CAAM,OAAA,GAAU,eAAA;AACzD,MAAA,MAAA,CAAO,KAAA,CAAM,wBAAA,EAA0B,EAAE,EAAA,EAAI,IAAI,MAAA,CAAO,IAAI,CAAA,EAAG,OAAA,EAAS,IAAI,MAAA,CAAO,SAAS,CAAA,EAAG,KAAA,EAAO,SAAS,CAAA;AAC/G,MAAA,SAAA,CAAU,GAAA,EAAK,SAAS,GAAG,CAAA;AAAA,IAC7B;AAAA,EACF,CAAC,CAAA;AAED,EAAA,OAAO,MAAA;AACT;ACrJA,SAAS,gBAAA,CAAiB,KAAc,kBAAA,EAAiD;AACvF,EAAA,IAAI,CAAC,oBAAoB,OAAO,MAAA;AAChC,EAAA,MAAM,OAAQ,GAAA,CAAsE,IAAA;AACpF,EAAA,IAAI,CAAC,MAAM,OAAO,MAAA;AAClB,EAAA,IAAI,IAAA,CAAK,IAAA,KAAS,OAAA,EAAS,OAAO,MAAA;AAClC,EAAA,OAAO,IAAA,CAAK,WAAA;AACd;AAEO,SAAS,mBAAA,CACd,QAAA,EACA,MAAA,EACA,kBAAA,GAAqB,KAAA,EACb;AACR,EAAA,MAAM,SAASC,MAAAA,EAAO;AACtB,EAAA,MAAM,EAAE,QAAA,EAAU,SAAA,EAAW,QAAA,EAAS,GAAI,QAAA;AAK1C,EAAA,MAAA,CAAO,GAAA,CAAI,aAAA,EAAe,OAAO,GAAA,EAAc,GAAA,KAAkB;AAC/D,IAAA,IAAI;AACF,MAAA,MAAM,aAAA,GAAgB,gBAAA,CAAiB,GAAA,EAAK,kBAAkB,CAAA;AAC9D,MAAA,MAAM,OAAA,GAAU,aAAA,IAAkB,GAAA,CAAI,KAAA,CAAM,SAAS,CAAA;AACrD,MAAA,MAAM,SAAA,GAAY;AAAA,QAChB,IAAA,EAAM,GAAA,CAAI,KAAA,CAAM,MAAM,CAAA;AAAA,QACtB,EAAA,EAAI,GAAA,CAAI,KAAA,CAAM,IAAI;AAAA,OACpB;AACA,MAAA,MAAM,MAAA,GAAS,MAAM,SAAA,CAAU,eAAA,CAAgB,SAAS,SAAS,CAAA;AACjE,MAAAC,WAAAA,CAAY,KAAK,MAAM,CAAA;AAAA,IACzB,SAAS,KAAA,EAAgB;AACvB,MAAA,MAAM,OAAA,GAAU,KAAA,YAAiB,KAAA,GAAQ,KAAA,CAAM,OAAA,GAAU,eAAA;AACzD,MAAA,MAAA,CAAO,KAAA,CAAM,0BAAA,EAA4B,EAAE,KAAA,EAAO,SAAS,CAAA;AAC3D,MAAAC,SAAAA,CAAU,GAAA,EAAK,OAAA,EAAS,GAAG,CAAA;AAAA,IAC7B;AAAA,EACF,CAAC,CAAA;AAGD,EAAA,MAAA,CAAO,GAAA,CAAI,eAAA,EAAiB,OAAO,GAAA,EAAc,GAAA,KAAkB;AACjE,IAAA,IAAI;AACF,MAAA,MAAM,EAAE,UAAA,EAAY,UAAA,EAAY,OAAA,KAAY,GAAA,CAAI,IAAA;AAKhD,MAAA,MAAM,SAAS,MAAM,SAAA,CAAU,eAAA,CAAgB,UAAA,EAAY,YAAY,OAAO,CAAA;AAC9E,MAAAD,WAAAA,CAAY,KAAK,MAAM,CAAA;AAAA,IACzB,SAAS,KAAA,EAAgB;AACvB,MAAA,IAAI,iBAAiB,eAAA,EAAiB;AACpC,QAAAC,SAAAA,CAAU,GAAA,EAAK,KAAA,CAAM,OAAA,EAAS,GAAG,CAAA;AACjC,QAAA;AAAA,MACF;AACA,MAAA,MAAM,OAAA,GAAU,KAAA,YAAiB,KAAA,GAAQ,KAAA,CAAM,OAAA,GAAU,eAAA;AACzD,MAAA,MAAA,CAAO,KAAA,CAAM,6BAAA,EAA+B,EAAE,KAAA,EAAO,SAAS,CAAA;AAC9D,MAAAA,SAAAA,CAAU,GAAA,EAAK,OAAA,EAAS,GAAG,CAAA;AAAA,IAC7B;AAAA,EACF,CAAC,CAAA;AAGD,EAAA,MAAA,CAAO,GAAA,CAAI,GAAA,EAAK,OAAO,GAAA,EAAc,GAAA,KAAkB;AACrD,IAAA,IAAI;AACF,MAAA,MAAM,QAAQ,GAAA,CAAI,KAAA;AAClB,MAAA,MAAM,SAAkC,EAAC;AACzC,MAAA,IAAI,MAAM,YAAY,CAAA,SAAU,YAAY,CAAA,GAAI,MAAM,YAAY,CAAA;AAClE,MAAA,IAAI,MAAM,gBAAgB,CAAA,SAAU,gBAAgB,CAAA,GAAI,MAAM,gBAAgB,CAAA;AAE9E,MAAA,MAAM,aAAA,GAAgB,gBAAA,CAAiB,GAAA,EAAK,kBAAkB,CAAA;AAC9D,MAAA,IAAI,aAAA,EAAe;AACjB,QAAA,MAAA,CAAO,SAAS,CAAA,GAAI,aAAA;AAAA,MACtB,CAAA,MAAA,IAAW,KAAA,CAAM,SAAS,CAAA,EAAG;AAC3B,QAAA,MAAA,CAAO,SAAS,CAAA,GAAI,KAAA,CAAM,SAAS,CAAA;AAAA,MACrC;AACA,MAAA,IAAI,MAAM,UAAU,CAAA,SAAU,UAAU,CAAA,GAAI,MAAM,UAAU,CAAA;AAC5D,MAAA,IAAI,KAAA,CAAM,UAAU,CAAA,KAAM,KAAA,CAAA,SAAkB,UAAU,CAAA,GAAI,KAAA,CAAM,UAAU,CAAA,KAAM,MAAA;AAChF,MAAA,IAAI,MAAM,mBAAmB,CAAA,SAAU,mBAAmB,CAAA,GAAI,MAAM,mBAAmB,CAAA;AACvF,MAAA,IAAI,MAAM,aAAa,CAAA,SAAU,aAAa,CAAA,GAAI,MAAM,aAAa,CAAA;AACrE,MAAA,IAAI,MAAM,cAAc,CAAA,SAAU,cAAc,CAAA,GAAI,MAAM,cAAc,CAAA;AACxE,MAAA,IAAI,MAAM,cAAc,CAAA,SAAU,cAAc,CAAA,GAAI,MAAM,cAAc,CAAA;AACxE,MAAA,IAAI,MAAM,UAAU,CAAA,SAAU,UAAU,CAAA,GAAI,MAAM,UAAU,CAAA;AAC5D,MAAA,IAAI,MAAM,WAAW,CAAA,SAAU,WAAW,CAAA,GAAI,MAAM,WAAW,CAAA;AAE/D,MAAA,MAAM,OAAA,GAAU,MAAM,SAAS,CAAA;AAC/B,MAAA,MAAM,OAAA,GAAU,MAAM,SAAS,CAAA;AAC/B,MAAA,MAAM,UAAA,GAAa,MAAM,YAAY,CAAA,KAAM,SAAY,KAAA,CAAM,YAAY,MAAM,MAAA,GAAS,KAAA,CAAA;AACxF,MAAA,MAAM,cAAA,GAAiB,KAAA,CAAM,gBAAgB,CAAA,KAAM,MAAA;AACnD,MAAA,IAAI,OAAA,EAAS,MAAA,CAAO,SAAS,CAAA,GAAI,OAAA;AACjC,MAAA,IAAI,OAAA,EAAS,MAAA,CAAO,SAAS,CAAA,GAAI,OAAA;AACjC,MAAA,IAAI,UAAA,KAAe,KAAA,CAAA,EAAW,MAAA,CAAO,YAAY,CAAA,GAAI,UAAA;AACrD,MAAA,IAAI,cAAA,EAAgB,MAAA,CAAO,gBAAgB,CAAA,GAAI,IAAA;AAC/C,MAAA,IAAI,KAAA,CAAM,MAAM,CAAA,EAAG,MAAA,CAAO,MAAM,IAAI,QAAA,CAAS,KAAA,CAAM,MAAM,CAAA,EAAI,EAAE,CAAA;AAC/D,MAAA,IAAI,KAAA,CAAM,OAAO,CAAA,EAAG,MAAA,CAAO,OAAO,IAAI,QAAA,CAAS,KAAA,CAAM,OAAO,CAAA,EAAI,EAAE,CAAA;AAClE,MAAA,IAAI,KAAA,CAAM,MAAM,CAAA,IAAK,KAAA,CAAM,IAAI,CAAA,EAAG;AAChC,QAAA,MAAA,CAAO,WAAW,CAAA,GAAI,EAAE,IAAA,EAAM,KAAA,CAAM,MAAM,CAAA,EAAG,EAAA,EAAI,KAAA,CAAM,IAAI,CAAA,EAAE;AAAA,MAC/D;AACA,MAAA,MAAM,MAAA,GAAS,MAAM,QAAA,CAAS,IAAA,CAAK,MAA6C,CAAA;AAChF,MAAAD,WAAAA,CAAY,KAAK,MAAM,CAAA;AAAA,IACzB,SAAS,KAAA,EAAgB;AACvB,MAAA,MAAM,OAAA,GAAU,KAAA,YAAiB,KAAA,GAAQ,KAAA,CAAM,OAAA,GAAU,eAAA;AACzD,MAAA,MAAA,CAAO,KAAA,CAAM,0BAAA,EAA4B,EAAE,KAAA,EAAO,SAAS,CAAA;AAC3D,MAAAC,SAAAA,CAAU,GAAA,EAAK,OAAA,EAAS,GAAG,CAAA;AAAA,IAC7B;AAAA,EACF,CAAC,CAAA;AAGD,EAAA,MAAA,CAAO,IAAA,CAAK,GAAA,EAAK,OAAO,GAAA,EAAc,GAAA,KAAkB;AACtD,IAAA,IAAI;AACF,MAAA,MAAM,MAAA,GAAS,MAAM,QAAA,CAAS,MAAA,CAAO,IAAI,IAAI,CAAA;AAC7C,MAAAD,WAAAA,CAAY,GAAA,EAAK,MAAA,EAAQ,GAAG,CAAA;AAAA,IAC9B,SAAS,KAAA,EAAgB;AACvB,MAAA,IAAI,iBAAiB,eAAA,EAAiB;AACpC,QAAAC,SAAAA,CAAU,GAAA,EAAK,KAAA,CAAM,OAAA,EAAS,GAAG,CAAA;AACjC,QAAA;AAAA,MACF;AACA,MAAA,MAAM,OAAA,GAAU,KAAA,YAAiB,KAAA,GAAQ,KAAA,CAAM,OAAA,GAAU,eAAA;AACzD,MAAA,MAAA,CAAO,KAAA,CAAM,2BAAA,EAA6B,EAAE,KAAA,EAAO,SAAS,CAAA;AAC5D,MAAAA,SAAAA,CAAU,GAAA,EAAK,OAAA,EAAS,GAAG,CAAA;AAAA,IAC7B;AAAA,EACF,CAAC,CAAA;AAGD,EAAA,MAAA,CAAO,GAAA,CAAI,MAAA,EAAQ,OAAO,GAAA,EAAc,GAAA,KAAkB;AACxD,IAAA,IAAI;AACF,MAAA,MAAM,SAAS,MAAM,QAAA,CAAS,IAAI,GAAA,CAAI,MAAA,CAAO,IAAI,CAAE,CAAA;AACnD,MAAAD,WAAAA,CAAY,KAAK,MAAM,CAAA;AAAA,IACzB,SAAS,KAAA,EAAgB;AACvB,MAAA,IAAI,iBAAiB,eAAA,EAAiB;AACpC,QAAAC,SAAAA,CAAU,GAAA,EAAK,KAAA,CAAM,OAAA,EAAS,GAAG,CAAA;AACjC,QAAA;AAAA,MACF;AACA,MAAA,MAAM,OAAA,GAAU,KAAA,YAAiB,KAAA,GAAQ,KAAA,CAAM,OAAA,GAAU,eAAA;AACzD,MAAA,MAAA,CAAO,KAAA,CAAM,wBAAA,EAA0B,EAAE,EAAA,EAAI,GAAA,CAAI,OAAO,IAAI,CAAA,EAAG,KAAA,EAAO,OAAA,EAAS,CAAA;AAC/E,MAAAA,SAAAA,CAAU,GAAA,EAAK,OAAA,EAAS,GAAG,CAAA;AAAA,IAC7B;AAAA,EACF,CAAC,CAAA;AAGD,EAAA,MAAA,CAAO,GAAA,CAAI,MAAA,EAAQ,OAAO,GAAA,EAAc,GAAA,KAAkB;AACxD,IAAA,IAAI;AACF,MAAA,MAAM,MAAA,GAAS,MAAM,QAAA,CAAS,MAAA,CAAO,IAAI,MAAA,CAAO,IAAI,CAAA,EAAI,GAAA,CAAI,IAAI,CAAA;AAChE,MAAAD,WAAAA,CAAY,KAAK,MAAM,CAAA;AAAA,IACzB,SAAS,KAAA,EAAgB;AACvB,MAAA,IAAI,iBAAiB,eAAA,EAAiB;AACpC,QAAAC,SAAAA,CAAU,GAAA,EAAK,KAAA,CAAM,OAAA,EAAS,GAAG,CAAA;AACjC,QAAA;AAAA,MACF;AACA,MAAA,MAAM,OAAA,GAAU,KAAA,YAAiB,KAAA,GAAQ,KAAA,CAAM,OAAA,GAAU,eAAA;AACzD,MAAA,MAAA,CAAO,KAAA,CAAM,2BAAA,EAA6B,EAAE,EAAA,EAAI,GAAA,CAAI,OAAO,IAAI,CAAA,EAAG,KAAA,EAAO,OAAA,EAAS,CAAA;AAClF,MAAAA,SAAAA,CAAU,GAAA,EAAK,OAAA,EAAS,GAAG,CAAA;AAAA,IAC7B;AAAA,EACF,CAAC,CAAA;AAGD,EAAA,MAAA,CAAO,MAAA,CAAO,MAAA,EAAQ,OAAO,GAAA,EAAc,GAAA,KAAkB;AAC3D,IAAA,IAAI;AACF,MAAA,MAAM,OAAA,GAAW,IAAuD,IAAA,EAAM,WAAA;AAC9E,MAAA,MAAM,SAAA,GAAa,IAAuD,IAAA,EAAM,WAAA;AAChF,MAAA,MAAM,MAAA,GAAS,MAAM,SAAA,CAAU,UAAA,CAAW,IAAI,MAAA,CAAO,IAAI,CAAA,EAAI,OAAA,EAAS,SAAS,CAAA;AAC/E,MAAAD,WAAAA,CAAY,KAAK,MAAM,CAAA;AAAA,IACzB,SAAS,KAAA,EAAgB;AACvB,MAAA,IAAI,iBAAiB,eAAA,EAAiB;AACpC,QAAAC,SAAAA,CAAU,GAAA,EAAK,KAAA,CAAM,OAAA,EAAS,GAAG,CAAA;AACjC,QAAA;AAAA,MACF;AACA,MAAA,MAAM,OAAA,GAAU,KAAA,YAAiB,KAAA,GAAQ,KAAA,CAAM,OAAA,GAAU,eAAA;AACzD,MAAA,MAAA,CAAO,KAAA,CAAM,gCAAA,EAAkC,EAAE,EAAA,EAAI,GAAA,CAAI,OAAO,IAAI,CAAA,EAAG,KAAA,EAAO,OAAA,EAAS,CAAA;AACvF,MAAAA,SAAAA,CAAU,GAAA,EAAK,OAAA,EAAS,GAAG,CAAA;AAAA,IAC7B;AAAA,EACF,CAAC,CAAA;AAGD,EAAA,MAAA,CAAO,GAAA,CAAI,YAAA,EAAc,OAAO,GAAA,EAAc,GAAA,KAAkB;AAC9D,IAAA,IAAI;AACF,MAAA,MAAM,EAAE,UAAA,EAAY,OAAA,EAAQ,GAAI,GAAA,CAAI,IAAA;AACpC,MAAA,MAAM,MAAA,GAAS,MAAM,SAAA,CAAU,WAAA,CAAY,IAAI,MAAA,CAAO,IAAI,CAAA,EAAI,UAAA,EAAY,OAAO,CAAA;AACjF,MAAAD,WAAAA,CAAY,KAAK,MAAM,CAAA;AAAA,IACzB,SAAS,KAAA,EAAgB;AACvB,MAAA,IAAI,iBAAiB,eAAA,EAAiB;AACpC,QAAAC,SAAAA,CAAU,GAAA,EAAK,KAAA,CAAM,OAAA,EAAS,GAAG,CAAA;AACjC,QAAA;AAAA,MACF;AACA,MAAA,MAAM,OAAA,GAAU,KAAA,YAAiB,KAAA,GAAQ,KAAA,CAAM,OAAA,GAAU,eAAA;AACzD,MAAA,MAAA,CAAO,KAAA,CAAM,wBAAA,EAA0B,EAAE,EAAA,EAAI,GAAA,CAAI,OAAO,IAAI,CAAA,EAAG,KAAA,EAAO,OAAA,EAAS,CAAA;AAC/E,MAAAA,SAAAA,CAAU,GAAA,EAAK,OAAA,EAAS,GAAG,CAAA;AAAA,IAC7B;AAAA,EACF,CAAC,CAAA;AAGD,EAAA,MAAA,CAAO,GAAA,CAAI,aAAA,EAAe,OAAO,GAAA,EAAc,GAAA,KAAkB;AAC/D,IAAA,IAAI;AACF,MAAA,MAAM,EAAE,OAAA,EAAS,UAAA,EAAW,GAAI,GAAA,CAAI,IAAA;AACpC,MAAA,MAAM,MAAA,GAAS,MAAM,SAAA,CAAU,MAAA,CAAO,IAAI,MAAA,CAAO,IAAI,CAAA,EAAI,OAAA,EAAS,UAAU,CAAA;AAC5E,MAAAD,WAAAA,CAAY,KAAK,MAAM,CAAA;AAAA,IACzB,SAAS,KAAA,EAAgB;AACvB,MAAA,IAAI,iBAAiB,eAAA,EAAiB;AACpC,QAAAC,SAAAA,CAAU,GAAA,EAAK,KAAA,CAAM,OAAA,EAAS,GAAG,CAAA;AACjC,QAAA;AAAA,MACF;AACA,MAAA,MAAM,OAAA,GAAU,KAAA,YAAiB,KAAA,GAAQ,KAAA,CAAM,OAAA,GAAU,eAAA;AACzD,MAAA,MAAA,CAAO,KAAA,CAAM,2BAAA,EAA6B,EAAE,EAAA,EAAI,GAAA,CAAI,OAAO,IAAI,CAAA,EAAG,KAAA,EAAO,OAAA,EAAS,CAAA;AAClF,MAAAA,SAAAA,CAAU,GAAA,EAAK,OAAA,EAAS,GAAG,CAAA;AAAA,IAC7B;AAAA,EACF,CAAC,CAAA;AAGD,EAAA,MAAA,CAAO,GAAA,CAAI,YAAA,EAAc,OAAO,GAAA,EAAc,GAAA,KAAkB;AAC9D,IAAA,IAAI;AACF,MAAA,MAAM,EAAE,OAAA,EAAQ,GAAI,GAAA,CAAI,IAAA;AACxB,MAAA,MAAM,MAAA,GAAS,MAAM,SAAA,CAAU,KAAA,CAAM,IAAI,MAAA,CAAO,IAAI,GAAI,OAAO,CAAA;AAC/D,MAAAD,WAAAA,CAAY,KAAK,MAAM,CAAA;AAAA,IACzB,SAAS,KAAA,EAAgB;AACvB,MAAA,IAAI,iBAAiB,eAAA,EAAiB;AACpC,QAAAC,SAAAA,CAAU,GAAA,EAAK,KAAA,CAAM,OAAA,EAAS,GAAG,CAAA;AACjC,QAAA;AAAA,MACF;AACA,MAAA,MAAM,OAAA,GAAU,KAAA,YAAiB,KAAA,GAAQ,KAAA,CAAM,OAAA,GAAU,eAAA;AACzD,MAAA,MAAA,CAAO,KAAA,CAAM,0BAAA,EAA4B,EAAE,EAAA,EAAI,GAAA,CAAI,OAAO,IAAI,CAAA,EAAG,KAAA,EAAO,OAAA,EAAS,CAAA;AACjF,MAAAA,SAAAA,CAAU,GAAA,EAAK,OAAA,EAAS,GAAG,CAAA;AAAA,IAC7B;AAAA,EACF,CAAC,CAAA;AAGD,EAAA,MAAA,CAAO,GAAA,CAAI,aAAA,EAAe,OAAO,GAAA,EAAc,GAAA,KAAkB;AAC/D,IAAA,IAAI;AACF,MAAA,MAAM,EAAE,OAAA,EAAQ,GAAI,GAAA,CAAI,IAAA;AACxB,MAAA,MAAM,MAAA,GAAS,MAAM,SAAA,CAAU,MAAA,CAAO,IAAI,MAAA,CAAO,IAAI,GAAI,OAAO,CAAA;AAChE,MAAAD,WAAAA,CAAY,KAAK,MAAM,CAAA;AAAA,IACzB,SAAS,KAAA,EAAgB;AACvB,MAAA,IAAI,iBAAiB,eAAA,EAAiB;AACpC,QAAAC,SAAAA,CAAU,GAAA,EAAK,KAAA,CAAM,OAAA,EAAS,GAAG,CAAA;AACjC,QAAA;AAAA,MACF;AACA,MAAA,MAAM,OAAA,GAAU,KAAA,YAAiB,KAAA,GAAQ,KAAA,CAAM,OAAA,GAAU,eAAA;AACzD,MAAA,MAAA,CAAO,KAAA,CAAM,2BAAA,EAA6B,EAAE,EAAA,EAAI,GAAA,CAAI,OAAO,IAAI,CAAA,EAAG,KAAA,EAAO,OAAA,EAAS,CAAA;AAClF,MAAAA,SAAAA,CAAU,GAAA,EAAK,OAAA,EAAS,GAAG,CAAA;AAAA,IAC7B;AAAA,EACF,CAAC,CAAA;AAGD,EAAA,MAAA,CAAO,IAAA,CAAK,YAAA,EAAc,OAAO,GAAA,EAAc,GAAA,KAAkB;AAC/D,IAAA,IAAI;AACF,MAAA,MAAM,EAAE,OAAA,EAAS,QAAA,EAAU,UAAA,KAAe,GAAA,CAAI,IAAA;AAK9C,MAAA,MAAM,MAAA,GAAS,MAAM,QAAA,CAAS,OAAA,CAAQ,GAAA,CAAI,OAAO,IAAI,CAAA,EAAI,OAAA,EAAS,QAAA,EAAU,UAAU,CAAA;AACtF,MAAAD,WAAAA,CAAY,GAAA,EAAK,MAAA,EAAQ,GAAG,CAAA;AAAA,IAC9B,SAAS,KAAA,EAAgB;AACvB,MAAA,IAAI,iBAAiB,eAAA,EAAiB;AACpC,QAAAC,SAAAA,CAAU,GAAA,EAAK,KAAA,CAAM,OAAA,EAAS,GAAG,CAAA;AACjC,QAAA;AAAA,MACF;AACA,MAAA,MAAM,OAAA,GAAU,KAAA,YAAiB,KAAA,GAAQ,KAAA,CAAM,OAAA,GAAU,eAAA;AACzD,MAAA,MAAA,CAAO,KAAA,CAAM,6BAAA,EAA+B,EAAE,EAAA,EAAI,GAAA,CAAI,OAAO,IAAI,CAAA,EAAG,KAAA,EAAO,OAAA,EAAS,CAAA;AACpF,MAAAA,SAAAA,CAAU,GAAA,EAAK,OAAA,EAAS,GAAG,CAAA;AAAA,IAC7B;AAAA,EACF,CAAC,CAAA;AAGD,EAAA,MAAA,CAAO,GAAA,CAAI,eAAA,EAAiB,OAAO,GAAA,EAAc,GAAA,KAAkB;AACjE,IAAA,IAAI;AACF,MAAA,MAAM,OAAO,QAAA,CAAS,GAAA,CAAI,MAAM,MAAM,CAAA,IAAe,KAAK,EAAE,CAAA;AAC5D,MAAA,MAAM,QAAQ,QAAA,CAAS,GAAA,CAAI,MAAM,OAAO,CAAA,IAAe,MAAM,EAAE,CAAA;AAC/D,MAAA,MAAM,MAAA,GAAS,MAAM,QAAA,CAAS,WAAA,CAAY,GAAA,CAAI,MAAA,CAAO,IAAI,CAAA,EAAI,EAAE,IAAA,EAAM,KAAA,EAAO,CAAA;AAC5E,MAAAD,WAAAA,CAAY,KAAK,MAAM,CAAA;AAAA,IACzB,SAAS,KAAA,EAAgB;AACvB,MAAA,IAAI,iBAAiB,eAAA,EAAiB;AACpC,QAAAC,SAAAA,CAAU,GAAA,EAAK,KAAA,CAAM,OAAA,EAAS,GAAG,CAAA;AACjC,QAAA;AAAA,MACF;AACA,MAAA,MAAM,OAAA,GAAU,KAAA,YAAiB,KAAA,GAAQ,KAAA,CAAM,OAAA,GAAU,eAAA;AACzD,MAAA,MAAA,CAAO,KAAA,CAAM,wBAAA,EAA0B,EAAE,EAAA,EAAI,GAAA,CAAI,OAAO,IAAI,CAAA,EAAG,KAAA,EAAO,OAAA,EAAS,CAAA;AAC/E,MAAAA,SAAAA,CAAU,GAAA,EAAK,OAAA,EAAS,GAAG,CAAA;AAAA,IAC7B;AAAA,EACF,CAAC,CAAA;AAED,EAAA,OAAO,MAAA;AACT;ACrRO,SAAS,mBAAA,CACd,UACA,MAAA,EACQ;AACR,EAAA,MAAM,SAASF,MAAAA,EAAO;AACtB,EAAA,MAAM,EAAE,QAAA,EAAU,QAAA,EAAS,GAAI,QAAA;AAG/B,EAAA,MAAA,CAAO,GAAA,CAAI,oBAAA,EAAsB,OAAO,GAAA,EAAc,GAAA,KAAkB;AACtE,IAAA,IAAI;AACF,MAAA,MAAM,SAAS,MAAM,QAAA,CAAS,aAAa,GAAA,CAAI,MAAA,CAAO,YAAY,CAAE,CAAA;AACpE,MAAAC,WAAAA,CAAY,KAAK,MAAM,CAAA;AAAA,IACzB,SAAS,KAAA,EAAgB;AACvB,MAAA,IAAI,iBAAiB,eAAA,EAAiB;AACpC,QAAAC,SAAAA,CAAU,GAAA,EAAK,KAAA,CAAM,OAAA,EAAS,GAAG,CAAA;AACjC,QAAA;AAAA,MACF;AACA,MAAA,MAAM,OAAA,GAAU,KAAA,YAAiB,KAAA,GAAQ,KAAA,CAAM,OAAA,GAAU,eAAA;AACzD,MAAA,MAAA,CAAO,KAAA,CAAM,iCAAA,EAAmC,EAAE,UAAA,EAAY,GAAA,CAAI,OAAO,YAAY,CAAA,EAAG,KAAA,EAAO,OAAA,EAAS,CAAA;AACxG,MAAAA,SAAAA,CAAU,GAAA,EAAK,OAAA,EAAS,GAAG,CAAA;AAAA,IAC7B;AAAA,EACF,CAAC,CAAA;AAGD,EAAA,MAAA,CAAO,GAAA,CAAI,uBAAA,EAAyB,OAAO,GAAA,EAAc,GAAA,KAAkB;AACzE,IAAA,IAAI;AACF,MAAA,MAAM,OAAO,QAAA,CAAS,GAAA,CAAI,MAAM,MAAM,CAAA,IAAe,KAAK,EAAE,CAAA;AAC5D,MAAA,MAAM,QAAQ,QAAA,CAAS,GAAA,CAAI,MAAM,OAAO,CAAA,IAAe,MAAM,EAAE,CAAA;AAC/D,MAAA,MAAM,MAAA,GAAS,MAAM,QAAA,CAAS,kBAAA,CAAmB,GAAA,CAAI,MAAA,CAAO,YAAY,CAAA,EAAI,EAAE,IAAA,EAAM,KAAA,EAAO,CAAA;AAC3F,MAAAD,WAAAA,CAAY,KAAK,MAAM,CAAA;AAAA,IACzB,SAAS,KAAA,EAAgB;AACvB,MAAA,IAAI,iBAAiB,eAAA,EAAiB;AACpC,QAAAC,SAAAA,CAAU,GAAA,EAAK,KAAA,CAAM,OAAA,EAAS,GAAG,CAAA;AACjC,QAAA;AAAA,MACF;AACA,MAAA,MAAM,OAAA,GAAU,KAAA,YAAiB,KAAA,GAAQ,KAAA,CAAM,OAAA,GAAU,eAAA;AACzD,MAAA,MAAA,CAAO,KAAA,CAAM,gCAAA,EAAkC,EAAE,UAAA,EAAY,GAAA,CAAI,OAAO,YAAY,CAAA,EAAG,KAAA,EAAO,OAAA,EAAS,CAAA;AACvG,MAAAA,SAAAA,CAAU,GAAA,EAAK,OAAA,EAAS,GAAG,CAAA;AAAA,IAC7B;AAAA,EACF,CAAC,CAAA;AAED,EAAA,OAAO,MAAA;AACT;AC1CO,SAAS,qBAAA,CACd,SAAA,EACA,iBAAA,EACA,MAAA,EACA,qBAAqB,KAAA,EACb;AACR,EAAA,MAAM,SAASF,MAAAA,EAAO;AAEtB,EAAA,SAASG,kBAAiB,GAAA,EAAkC;AAC1D,IAAA,IAAI,CAAC,oBAAoB,OAAO,MAAA;AAChC,IAAA,MAAM,OAAQ,GAAA,CAAsE,IAAA;AACpF,IAAA,IAAI,CAAC,MAAM,OAAO,MAAA;AAClB,IAAA,IAAI,IAAA,CAAK,IAAA,KAAS,OAAA,EAAS,OAAO,MAAA;AAClC,IAAA,OAAO,IAAA,CAAK,WAAA;AAAA,EACd;AAEA,EAAA,SAAS,eAAe,KAAA,EAA2C;AACjE,IAAA,OAAO;AAAA,MACL,IAAA,EAAM,MAAM,MAAM,CAAA;AAAA,MAClB,EAAA,EAAI,MAAM,IAAI;AAAA,KAChB;AAAA,EACF;AAGA,EAAA,MAAA,CAAO,GAAA,CAAI,QAAA,EAAU,OAAO,GAAA,EAAc,GAAA,KAAkB;AAC1D,IAAA,IAAI;AACF,MAAA,MAAM,MAAA,GAAS,MAAM,SAAA,CAAU,iBAAA,EAAkB;AACjD,MAAAF,WAAAA,CAAY,KAAK,MAAM,CAAA;AAAA,IACzB,SAAS,KAAA,EAAgB;AACvB,MAAA,MAAM,OAAA,GAAU,KAAA,YAAiB,KAAA,GAAQ,KAAA,CAAM,OAAA,GAAU,eAAA;AACzD,MAAA,MAAA,CAAO,KAAA,CAAM,+BAAA,EAAiC,EAAE,KAAA,EAAO,SAAS,CAAA;AAChE,MAAAC,SAAAA,CAAU,GAAA,EAAK,OAAA,EAAS,GAAG,CAAA;AAAA,IAC7B;AAAA,EACF,CAAC,CAAA;AAGD,EAAA,MAAA,CAAO,GAAA,CAAI,iBAAA,EAAmB,OAAO,GAAA,EAAc,GAAA,KAAkB;AACnE,IAAA,IAAI;AACF,MAAA,MAAM,aAAA,GAAgBC,kBAAiB,GAAG,CAAA;AAE1C,MAAA,IAAI,aAAA,IAAiB,aAAA,KAAkB,GAAA,CAAI,MAAA,CAAO,SAAS,CAAA,EAAG;AAC5D,QAAAD,SAAAA,CAAU,GAAA,EAAK,mDAAA,EAAqD,GAAG,CAAA;AACvE,QAAA;AAAA,MACF;AACA,MAAA,MAAM,SAAA,GAAY,cAAA,CAAe,GAAA,CAAI,KAA2C,CAAA;AAChF,MAAA,MAAM,MAAA,GAAS,MAAM,SAAA,CAAU,aAAA,CAAc,IAAI,MAAA,CAAO,SAAS,GAAI,SAAS,CAAA;AAC9E,MAAAD,WAAAA,CAAY,KAAK,MAAM,CAAA;AAAA,IACzB,SAAS,KAAA,EAAgB;AACvB,MAAA,IAAI,iBAAiB,eAAA,EAAiB;AACpC,QAAAC,SAAAA,CAAU,GAAA,EAAK,KAAA,CAAM,OAAA,EAAS,GAAG,CAAA;AACjC,QAAA;AAAA,MACF;AACA,MAAA,MAAM,OAAA,GAAU,KAAA,YAAiB,KAAA,GAAQ,KAAA,CAAM,OAAA,GAAU,eAAA;AACzD,MAAA,MAAA,CAAO,KAAA,CAAM,2BAAA,EAA6B,EAAE,OAAA,EAAS,GAAA,CAAI,OAAO,SAAS,CAAA,EAAG,KAAA,EAAO,OAAA,EAAS,CAAA;AAC5F,MAAAA,SAAAA,CAAU,GAAA,EAAK,OAAA,EAAS,GAAG,CAAA;AAAA,IAC7B;AAAA,EACF,CAAC,CAAA;AAGD,EAAA,MAAA,CAAO,GAAA,CAAI,oBAAA,EAAsB,OAAO,GAAA,EAAc,GAAA,KAAkB;AACtE,IAAA,IAAI;AACF,MAAA,MAAM,SAAA,GAAY,cAAA,CAAe,GAAA,CAAI,KAA2C,CAAA;AAChF,MAAA,MAAM,MAAA,GAAS,MAAM,SAAA,CAAU,mBAAA,CAAoB,SAAS,CAAA;AAC5D,MAAAD,WAAAA,CAAY,KAAK,MAAM,CAAA;AAAA,IACzB,SAAS,KAAA,EAAgB;AACvB,MAAA,MAAM,OAAA,GAAU,KAAA,YAAiB,KAAA,GAAQ,KAAA,CAAM,OAAA,GAAU,eAAA;AACzD,MAAA,MAAA,CAAO,KAAA,CAAM,iCAAA,EAAmC,EAAE,KAAA,EAAO,SAAS,CAAA;AAClE,MAAAC,SAAAA,CAAU,GAAA,EAAK,OAAA,EAAS,GAAG,CAAA;AAAA,IAC7B;AAAA,EACF,CAAC,CAAA;AAGD,EAAA,MAAA,CAAO,GAAA,CAAI,eAAA,EAAiB,OAAO,GAAA,EAAc,GAAA,KAAkB;AACjE,IAAA,IAAI;AACF,MAAA,MAAM,SAAA,GAAY,cAAA,CAAe,GAAA,CAAI,KAA2C,CAAA;AAChF,MAAA,MAAM,MAAA,GAAS,MAAM,iBAAA,CAAkB,gBAAA,CAAiB,IAAI,MAAA,CAAO,IAAI,GAAI,SAAS,CAAA;AACpF,MAAAD,WAAAA,CAAY,KAAK,MAAM,CAAA;AAAA,IACzB,SAAS,KAAA,EAAgB;AACvB,MAAA,IAAI,iBAAiB,eAAA,EAAiB;AACpC,QAAAC,SAAAA,CAAU,GAAA,EAAK,KAAA,CAAM,OAAA,EAAS,GAAG,CAAA;AACjC,QAAA;AAAA,MACF;AACA,MAAA,MAAM,OAAA,GAAU,KAAA,YAAiB,KAAA,GAAQ,KAAA,CAAM,OAAA,GAAU,eAAA;AACzD,MAAA,MAAA,CAAO,KAAA,CAAM,8BAAA,EAAgC,EAAE,EAAA,EAAI,GAAA,CAAI,OAAO,IAAI,CAAA,EAAG,KAAA,EAAO,OAAA,EAAS,CAAA;AACrF,MAAAA,SAAAA,CAAU,GAAA,EAAK,OAAA,EAAS,GAAG,CAAA;AAAA,IAC7B;AAAA,EACF,CAAC,CAAA;AAGD,EAAA,MAAA,CAAO,GAAA,CAAI,sBAAA,EAAwB,OAAO,GAAA,EAAc,GAAA,KAAkB;AACxE,IAAA,IAAI;AACF,MAAA,MAAM,SAAA,GAAY,cAAA,CAAe,GAAA,CAAI,KAA2C,CAAA;AAChF,MAAA,MAAM,MAAA,GAAS,MAAM,iBAAA,CAAkB,iBAAA,CAAkB,IAAI,MAAA,CAAO,IAAI,GAAI,SAAS,CAAA;AACrF,MAAAD,WAAAA,CAAY,KAAK,MAAM,CAAA;AAAA,IACzB,SAAS,KAAA,EAAgB;AACvB,MAAA,IAAI,iBAAiB,eAAA,EAAiB;AACpC,QAAAC,SAAAA,CAAU,GAAA,EAAK,KAAA,CAAM,OAAA,EAAS,GAAG,CAAA;AACjC,QAAA;AAAA,MACF;AACA,MAAA,MAAM,OAAA,GAAU,KAAA,YAAiB,KAAA,GAAQ,KAAA,CAAM,OAAA,GAAU,eAAA;AACzD,MAAA,MAAA,CAAO,KAAA,CAAM,+BAAA,EAAiC,EAAE,EAAA,EAAI,GAAA,CAAI,OAAO,IAAI,CAAA,EAAG,KAAA,EAAO,OAAA,EAAS,CAAA;AACtF,MAAAA,SAAAA,CAAU,GAAA,EAAK,OAAA,EAAS,GAAG,CAAA;AAAA,IAC7B;AAAA,EACF,CAAC,CAAA;AAGD,EAAA,MAAA,CAAO,GAAA,CAAI,uBAAA,EAAyB,OAAO,GAAA,EAAc,GAAA,KAAkB;AACzE,IAAA,IAAI;AACF,MAAA,MAAM,SAAA,GAAY,cAAA,CAAe,GAAA,CAAI,KAA2C,CAAA;AAChF,MAAA,MAAM,MAAA,GAAS,MAAM,iBAAA,CAAkB,sBAAA,CAAuB,SAAS,CAAA;AACvE,MAAAD,WAAAA,CAAY,KAAK,MAAM,CAAA;AAAA,IACzB,SAAS,KAAA,EAAgB;AACvB,MAAA,MAAM,OAAA,GAAU,KAAA,YAAiB,KAAA,GAAQ,KAAA,CAAM,OAAA,GAAU,eAAA;AACzD,MAAA,MAAA,CAAO,KAAA,CAAM,oCAAA,EAAsC,EAAE,KAAA,EAAO,SAAS,CAAA;AACrE,MAAAC,SAAAA,CAAU,GAAA,EAAK,OAAA,EAAS,GAAG,CAAA;AAAA,IAC7B;AAAA,EACF,CAAC,CAAA;AAGD,EAAA,MAAA,CAAO,GAAA,CAAI,uBAAA,EAAyB,OAAO,GAAA,EAAc,GAAA,KAAkB;AACzE,IAAA,IAAI;AACF,MAAA,MAAM,SAAA,GAAY,cAAA,CAAe,GAAA,CAAI,KAA2C,CAAA;AAChF,MAAA,MAAM,MAAA,GAAS,MAAM,iBAAA,CAAkB,sBAAA,CAAuB,SAAS,CAAA;AACvE,MAAAD,WAAAA,CAAY,KAAK,MAAM,CAAA;AAAA,IACzB,SAAS,KAAA,EAAgB;AACvB,MAAA,MAAM,OAAA,GAAU,KAAA,YAAiB,KAAA,GAAQ,KAAA,CAAM,OAAA,GAAU,eAAA;AACzD,MAAA,MAAA,CAAO,KAAA,CAAM,oCAAA,EAAsC,EAAE,KAAA,EAAO,SAAS,CAAA;AACrE,MAAAC,SAAAA,CAAU,GAAA,EAAK,OAAA,EAAS,GAAG,CAAA;AAAA,IAC7B;AAAA,EACF,CAAC,CAAA;AAGD,EAAA,MAAA,CAAO,GAAA,CAAI,kBAAA,EAAoB,OAAO,GAAA,EAAc,GAAA,KAAkB;AACpE,IAAA,IAAI;AACF,MAAA,MAAM,SAAA,GAAY,cAAA,CAAe,GAAA,CAAI,KAA2C,CAAA;AAChF,MAAA,MAAM,MAAA,GAAS,MAAM,iBAAA,CAAkB,gBAAA,CAAiB,SAAS,CAAA;AACjE,MAAAD,WAAAA,CAAY,KAAK,MAAM,CAAA;AAAA,IACzB,SAAS,KAAA,EAAgB;AACvB,MAAA,MAAM,OAAA,GAAU,KAAA,YAAiB,KAAA,GAAQ,KAAA,CAAM,OAAA,GAAU,eAAA;AACzD,MAAA,MAAA,CAAO,KAAA,CAAM,+BAAA,EAAiC,EAAE,KAAA,EAAO,SAAS,CAAA;AAChE,MAAAC,SAAAA,CAAU,GAAA,EAAK,OAAA,EAAS,GAAG,CAAA;AAAA,IAC7B;AAAA,EACF,CAAC,CAAA;AAGD,EAAA,MAAA,CAAO,GAAA,CAAI,OAAA,EAAS,OAAO,GAAA,EAAc,GAAA,KAAkB;AACzD,IAAA,IAAI;AACF,MAAA,MAAM,EAAE,MAAA,EAAO,GAAI,GAAA,CAAI,KAAA;AACvB,MAAA,MAAM,SAAA,GAAY,cAAA,CAAe,GAAA,CAAI,KAA2C,CAAA;AAChF,MAAA,MAAM,MAAA,GAAS,MAAM,SAAA,CAAU,YAAA,CAAa,QAAQ,SAAS,CAAA;AAC7D,MAAAD,WAAAA,CAAY,KAAK,MAAM,CAAA;AAAA,IACzB,SAAS,KAAA,EAAgB;AACvB,MAAA,MAAM,OAAA,GAAU,KAAA,YAAiB,KAAA,GAAQ,KAAA,CAAM,OAAA,GAAU,eAAA;AACzD,MAAA,MAAA,CAAO,KAAA,CAAM,0BAAA,EAA4B,EAAE,KAAA,EAAO,SAAS,CAAA;AAC3D,MAAAC,SAAAA,CAAU,GAAA,EAAK,OAAA,EAAS,GAAG,CAAA;AAAA,IAC7B;AAAA,EACF,CAAC,CAAA;AAGD,EAAA,MAAA,CAAO,GAAA,CAAI,QAAA,EAAU,OAAO,GAAA,EAAc,GAAA,KAAkB;AAC1D,IAAA,IAAI;AACF,MAAA,MAAM,aAAA,GAAgBC,kBAAiB,GAAG,CAAA;AAC1C,MAAA,MAAM,SAAA,GAAY,cAAA,CAAe,GAAA,CAAI,KAA2C,CAAA;AAChF,MAAA,MAAM,MAAA,GAAS,MAAM,SAAA,CAAU,cAAA,CAAe,WAAW,aAAa,CAAA;AACtE,MAAAF,WAAAA,CAAY,KAAK,MAAM,CAAA;AAAA,IACzB,SAAS,KAAA,EAAgB;AACvB,MAAA,MAAM,OAAA,GAAU,KAAA,YAAiB,KAAA,GAAQ,KAAA,CAAM,OAAA,GAAU,eAAA;AACzD,MAAA,MAAA,CAAO,KAAA,CAAM,4BAAA,EAA8B,EAAE,KAAA,EAAO,SAAS,CAAA;AAC7D,MAAAC,SAAAA,CAAU,GAAA,EAAK,OAAA,EAAS,GAAG,CAAA;AAAA,IAC7B;AAAA,EACF,CAAC,CAAA;AAGD,EAAA,MAAA,CAAO,GAAA,CAAI,gBAAA,EAAkB,OAAO,GAAA,EAAc,GAAA,KAAkB;AAClE,IAAA,IAAI;AACF,MAAA,MAAM,QAAQ,QAAA,CAAS,GAAA,CAAI,MAAM,OAAO,CAAA,IAAe,KAAK,EAAE,CAAA;AAC9D,MAAA,MAAM,MAAA,GAAS,MAAM,SAAA,CAAU,eAAA,CAAgB,KAAK,CAAA;AACpD,MAAAD,WAAAA,CAAY,KAAK,MAAM,CAAA;AAAA,IACzB,SAAS,KAAA,EAAgB;AACvB,MAAA,MAAM,OAAA,GAAU,KAAA,YAAiB,KAAA,GAAQ,KAAA,CAAM,OAAA,GAAU,eAAA;AACzD,MAAA,MAAA,CAAO,KAAA,CAAM,6BAAA,EAA+B,EAAE,KAAA,EAAO,SAAS,CAAA;AAC9D,MAAAC,SAAAA,CAAU,GAAA,EAAK,OAAA,EAAS,GAAG,CAAA;AAAA,IAC7B;AAAA,EACF,CAAC,CAAA;AAGD,EAAA,MAAA,CAAO,GAAA,CAAI,UAAA,EAAY,OAAO,GAAA,EAAc,GAAA,KAAkB;AAC5D,IAAA,IAAI;AACF,MAAA,MAAM,SAAA,GAAY,cAAA,CAAe,GAAA,CAAI,KAA2C,CAAA;AAChF,MAAA,MAAM,MAAA,GAAS,MAAM,SAAA,CAAU,gBAAA,CAAiB,SAAS,CAAA;AACzD,MAAAD,WAAAA,CAAY,KAAK,MAAM,CAAA;AAAA,IACzB,SAAS,KAAA,EAAgB;AACvB,MAAA,MAAM,OAAA,GAAU,KAAA,YAAiB,KAAA,GAAQ,KAAA,CAAM,OAAA,GAAU,eAAA;AACzD,MAAA,MAAA,CAAO,KAAA,CAAM,8BAAA,EAAgC,EAAE,KAAA,EAAO,SAAS,CAAA;AAC/D,MAAAC,SAAAA,CAAU,GAAA,EAAK,OAAA,EAAS,GAAG,CAAA;AAAA,IAC7B;AAAA,EACF,CAAC,CAAA;AAED,EAAA,OAAO,MAAA;AACT;ACvMO,SAAS,oBAAA,CACd,QAAA,EACA,SAAA,EACA,MAAA,EACQ;AACR,EAAA,MAAM,SAASF,MAAAA,EAAO;AAKtB,EAAA,MAAA,CAAO,GAAA,CAAI,WAAA,EAAa,OAAO,IAAA,EAAe,GAAA,KAAkB;AAC9D,IAAA,IAAI;AACF,MAAA,MAAM,MAAA,GAAS,MAAM,QAAA,CAAS,GAAA,EAAI;AAClC,MAAAC,WAAAA,CAAY,KAAK,MAAM,CAAA;AAAA,IACzB,SAAS,KAAA,EAAgB;AACvB,MAAA,MAAM,OAAA,GAAU,KAAA,YAAiB,KAAA,GAAQ,KAAA,CAAM,OAAA,GAAU,eAAA;AACzD,MAAA,MAAA,CAAO,KAAA,CAAM,wBAAA,EAA0B,EAAE,KAAA,EAAO,SAAS,CAAA;AACzD,MAAAC,SAAAA,CAAU,GAAA,EAAK,OAAA,EAAS,GAAG,CAAA;AAAA,IAC7B;AAAA,EACF,CAAC,CAAA;AAGD,EAAA,MAAA,CAAO,GAAA,CAAI,WAAA,EAAa,OAAO,GAAA,EAAc,GAAA,KAAkB;AAC7D,IAAA,IAAI;AACF,MAAA,MAAM,MAAA,GAAS,MAAM,QAAA,CAAS,MAAA,CAAO,IAAI,IAAI,CAAA;AAC7C,MAAAD,WAAAA,CAAY,KAAK,MAAM,CAAA;AAAA,IACzB,SAAS,KAAA,EAAgB;AACvB,MAAA,IAAI,iBAAiB,eAAA,EAAiB;AACpC,QAAAC,SAAAA,CAAU,GAAA,EAAK,KAAA,CAAM,OAAA,EAAS,GAAG,CAAA;AACjC,QAAA;AAAA,MACF;AACA,MAAA,MAAM,OAAA,GAAU,KAAA,YAAiB,KAAA,GAAQ,KAAA,CAAM,OAAA,GAAU,eAAA;AACzD,MAAA,MAAA,CAAO,KAAA,CAAM,2BAAA,EAA6B,EAAE,KAAA,EAAO,SAAS,CAAA;AAC5D,MAAAA,SAAAA,CAAU,GAAA,EAAK,OAAA,EAAS,GAAG,CAAA;AAAA,IAC7B;AAAA,EACF,CAAC,CAAA;AAGD,EAAA,MAAA,CAAO,GAAA,CAAI,eAAA,EAAiB,OAAO,GAAA,EAAc,GAAA,KAAkB;AACjE,IAAA,IAAI;AACF,MAAA,MAAM,EAAE,MAAA,GAAS,MAAA,EAAQ,GAAG,YAAA,KAAiB,GAAA,CAAI,KAAA;AACjD,MAAA,MAAM,SAAkC,EAAC;AACzC,MAAA,IAAI,aAAa,YAAY,CAAA,SAAU,YAAY,CAAA,GAAI,aAAa,YAAY,CAAA;AAChF,MAAA,IAAI,aAAa,SAAS,CAAA,SAAU,SAAS,CAAA,GAAI,aAAa,SAAS,CAAA;AACvE,MAAA,IAAI,YAAA,CAAa,UAAU,CAAA,KAAM,KAAA,CAAA,SAAkB,UAAU,CAAA,GAAI,YAAA,CAAa,UAAU,CAAA,KAAM,MAAA;AAC9F,MAAA,IAAI,YAAA,CAAa,MAAM,CAAA,IAAK,YAAA,CAAa,IAAI,CAAA,EAAG;AAC9C,QAAA,MAAA,CAAO,WAAW,CAAA,GAAI,EAAE,IAAA,EAAM,YAAA,CAAa,MAAM,CAAA,EAAG,EAAA,EAAI,YAAA,CAAa,IAAI,CAAA,EAAE;AAAA,MAC7E;AACA,MAAA,MAAM,MAAA,GAAS,MAAM,SAAA,CAAU,cAAA;AAAA,QAC7B,MAAA;AAAA,QACA;AAAA,OACF;AACA,MAAA,MAAM,WAAA,GAAc,MAAA,KAAW,KAAA,GAAQ,UAAA,GAAa,kBAAA;AACpD,MAAA,GAAA,CAAI,SAAA,CAAU,gBAAgB,WAAW,CAAA;AACzC,MAAA,GAAA,CAAI,KAAK,MAAM,CAAA;AAAA,IACjB,SAAS,KAAA,EAAgB;AACvB,MAAA,MAAM,OAAA,GAAU,KAAA,YAAiB,KAAA,GAAQ,KAAA,CAAM,OAAA,GAAU,eAAA;AACzD,MAAA,MAAA,CAAO,KAAA,CAAM,4BAAA,EAA8B,EAAE,KAAA,EAAO,SAAS,CAAA;AAC7D,MAAAA,SAAAA,CAAU,GAAA,EAAK,OAAA,EAAS,GAAG,CAAA;AAAA,IAC7B;AAAA,EACF,CAAC,CAAA;AAGD,EAAA,MAAA,CAAO,GAAA,CAAI,mBAAA,EAAqB,OAAO,GAAA,EAAc,GAAA,KAAkB;AACrE,IAAA,IAAI;AACF,MAAA,MAAM,MAAA,GAAU,GAAA,CAAI,KAAA,CAAM,QAAQ,CAAA,IAAe,MAAA;AACjD,MAAA,MAAM,MAAA,GAAS,MAAM,SAAA,CAAU,aAAA,CAAc,IAAI,MAAA,CAAO,IAAI,GAAI,MAAM,CAAA;AACtE,MAAA,MAAM,WAAA,GAAc,MAAA,KAAW,KAAA,GAAQ,UAAA,GAAa,kBAAA;AACpD,MAAA,GAAA,CAAI,SAAA,CAAU,gBAAgB,WAAW,CAAA;AACzC,MAAA,GAAA,CAAI,KAAK,MAAM,CAAA;AAAA,IACjB,SAAS,KAAA,EAAgB;AACvB,MAAA,IAAI,iBAAiB,eAAA,EAAiB;AACpC,QAAAA,SAAAA,CAAU,GAAA,EAAK,KAAA,CAAM,OAAA,EAAS,GAAG,CAAA;AACjC,QAAA;AAAA,MACF;AACA,MAAA,MAAM,OAAA,GAAU,KAAA,YAAiB,KAAA,GAAQ,KAAA,CAAM,OAAA,GAAU,eAAA;AACzD,MAAA,MAAA,CAAO,KAAA,CAAM,2BAAA,EAA6B,EAAE,EAAA,EAAI,GAAA,CAAI,OAAO,IAAI,CAAA,EAAG,KAAA,EAAO,OAAA,EAAS,CAAA;AAClF,MAAAA,SAAAA,CAAU,GAAA,EAAK,OAAA,EAAS,GAAG,CAAA;AAAA,IAC7B;AAAA,EACF,CAAC,CAAA;AAGD,EAAA,MAAA,CAAO,GAAA,CAAI,sBAAA,EAAwB,OAAO,GAAA,EAAc,GAAA,KAAkB;AACxE,IAAA,IAAI;AACF,MAAA,MAAM,MAAA,GAAU,GAAA,CAAI,KAAA,CAAM,QAAQ,CAAA,IAAe,MAAA;AACjD,MAAA,MAAM,SAAA,GAAY;AAAA,QAChB,IAAA,EAAM,GAAA,CAAI,KAAA,CAAM,MAAM,CAAA;AAAA,QACtB,EAAA,EAAI,GAAA,CAAI,KAAA,CAAM,IAAI;AAAA,OACpB;AACA,MAAA,MAAM,MAAA,GAAS,MAAM,SAAA,CAAU,oBAAA,CAAqB,IAAI,MAAA,CAAO,IAAI,CAAA,EAAI,SAAA,EAAW,MAAM,CAAA;AACxF,MAAA,MAAM,WAAA,GAAc,MAAA,KAAW,KAAA,GAAQ,UAAA,GAAa,kBAAA;AACpD,MAAA,GAAA,CAAI,SAAA,CAAU,gBAAgB,WAAW,CAAA;AACzC,MAAA,GAAA,CAAI,KAAK,MAAM,CAAA;AAAA,IACjB,SAAS,KAAA,EAAgB;AACvB,MAAA,IAAI,iBAAiB,eAAA,EAAiB;AACpC,QAAAA,SAAAA,CAAU,GAAA,EAAK,KAAA,CAAM,OAAA,EAAS,GAAG,CAAA;AACjC,QAAA;AAAA,MACF;AACA,MAAA,MAAM,OAAA,GAAU,KAAA,YAAiB,KAAA,GAAQ,KAAA,CAAM,OAAA,GAAU,eAAA;AACzD,MAAA,MAAA,CAAO,KAAA,CAAM,kCAAA,EAAoC,EAAE,EAAA,EAAI,GAAA,CAAI,OAAO,IAAI,CAAA,EAAG,KAAA,EAAO,OAAA,EAAS,CAAA;AACzF,MAAAA,SAAAA,CAAU,GAAA,EAAK,OAAA,EAAS,GAAG,CAAA;AAAA,IAC7B;AAAA,EACF,CAAC,CAAA;AAED,EAAA,OAAO,MAAA;AACT;;;AC7EO,SAAS,YAAA,CAAa,UAAyB,OAAA,EAA+B;AACnF,EAAA,MAAM,SAASF,MAAAA,EAAO;AACtB,EAAA,MAAM,EAAE,MAAA,EAAQ,mBAAA,EAAqB,kBAAA,GAAqB,OAAM,GAAI,OAAA;AAGpE,EAAA,IAAI,cAAA;AACJ,EAAA,IAAI,mBAAA,EAAqB;AACvB,IAAA,cAAA,GAAiB,OAAO,GAAA,EAAc,GAAA,EAAe,IAAA,KAAsC;AACzF,MAAA,IAAI;AACF,QAAA,MAAM,MAAA,GAAS,MAAM,mBAAA,CAAoB,GAAG,CAAA;AAC5C,QAAA,IAAI,CAAC,MAAA,EAAQ;AACX,UAAAE,SAAAA,CAAU,GAAA,EAAK,cAAA,EAAgB,GAAG,CAAA;AAClC,UAAA;AAAA,QACF;AACA,QAAC,IAAuC,IAAA,GAAO,MAAA;AAC/C,QAAA,IAAA,EAAK;AAAA,MACP,SAAS,KAAA,EAAgB;AACvB,QAAA,MAAM,OAAA,GAAU,KAAA,YAAiB,KAAA,GAAQ,KAAA,CAAM,OAAA,GAAU,uBAAA;AACzD,QAAAA,SAAAA,CAAU,GAAA,EAAK,OAAA,EAAS,GAAG,CAAA;AAAA,MAC7B;AAAA,IACF,CAAA;AAAA,EACF;AAEA,EAAA,MAAM,kBAAkBF,MAAAA,EAAO;AAE/B,EAAA,eAAA,CAAgB,IAAI,YAAA,EAAc,oBAAA,CAAqB,QAAA,CAAS,SAAA,EAAW,MAAM,CAAC,CAAA;AAClF,EAAA,eAAA,CAAgB,IAAI,QAAA,EAAU,mBAAA,CAAoB,EAAE,QAAA,EAAU,SAAS,QAAA,EAAU,SAAA,EAAW,QAAA,CAAS,SAAA,EAAW,UAAU,QAAA,CAAS,QAAA,EAAS,EAAG,MAAA,EAAQ,kBAAkB,CAAC,CAAA;AAC1K,EAAA,eAAA,CAAgB,GAAA,CAAI,WAAA,EAAa,mBAAA,CAAoB,EAAE,QAAA,EAAU,QAAA,CAAS,QAAA,EAAU,QAAA,EAAU,QAAA,CAAS,QAAA,EAAS,EAAG,MAAM,CAAC,CAAA;AAC1H,EAAA,eAAA,CAAgB,GAAA,CAAI,cAAc,qBAAA,CAAsB,QAAA,CAAS,WAAW,QAAA,CAAS,iBAAA,EAAmB,MAAA,EAAQ,kBAAkB,CAAC,CAAA;AACnI,EAAA,eAAA,CAAgB,GAAA,CAAI,KAAK,oBAAA,CAAqB,QAAA,CAAS,UAAU,QAAA,CAAS,MAAA,EAAQ,MAAM,CAAC,CAAA;AAEzF,EAAA,IAAI,cAAA,EAAgB;AAClB,IAAA,MAAA,CAAO,GAAA,CAAI,gBAAgB,eAAe,CAAA;AAAA,EAC5C,CAAA,MAAO;AACL,IAAA,MAAA,CAAO,IAAI,eAAe,CAAA;AAAA,EAC5B;AAEA,EAAA,OAAO,MAAA;AACT;ACvDO,IAAM,iBAAN,MAAqB;AAAA,EAI1B,YAAoB,IAAA,EAA0B;AAA1B,IAAA,IAAA,CAAA,IAAA,GAAA,IAAA;AAAA,EAA2B;AAAA,EAHvC,UAAA,GAAoC,IAAA;AAAA,EACpC,OAAA,GAAU,KAAA;AAAA,EAIlB,KAAA,GAAc;AACZ,IAAA,IAAI,KAAK,UAAA,EAAY;AAErB,IAAA,IAAA,CAAK,UAAA,GAAa,YAAY,MAAM;AAClC,MAAA,IAAA,CAAK,IAAA,EAAK,CAAE,KAAA,CAAM,CAAC,GAAA,KAAQ;AACzB,QAAA,IAAA,CAAK,IAAA,CAAK,MAAA,CAAO,KAAA,CAAM,8BAAA,EAAgC;AAAA,UACrD,KAAA,EAAO,GAAA,YAAe,KAAA,GAAQ,GAAA,CAAI,OAAA,GAAU;AAAA,SAC7C,CAAA;AAAA,MACH,CAAC,CAAA;AAAA,IACH,CAAA,EAAG,IAAA,CAAK,IAAA,CAAK,OAAA,CAAQ,uBAAuB,CAAA;AAE5C,IAAA,IAAA,CAAK,IAAA,CAAK,MAAA,CAAO,IAAA,CAAK,0BAAA,EAA4B;AAAA,MAChD,UAAA,EAAY,IAAA,CAAK,IAAA,CAAK,OAAA,CAAQ;AAAA,KAC/B,CAAA;AAAA,EACH;AAAA,EAEA,IAAA,GAAa;AACX,IAAA,IAAI,KAAK,UAAA,EAAY;AACnB,MAAA,aAAA,CAAc,KAAK,UAAU,CAAA;AAC7B,MAAA,IAAA,CAAK,UAAA,GAAa,IAAA;AAAA,IACpB;AACA,IAAA,IAAA,CAAK,IAAA,CAAK,MAAA,CAAO,IAAA,CAAK,0BAA0B,CAAA;AAAA,EAClD;AAAA,EAEA,MAAc,IAAA,GAAsB;AAClC,IAAA,IAAI,KAAK,OAAA,EAAS;AAClB,IAAA,IAAA,CAAK,OAAA,GAAU,IAAA;AAEf,IAAA,IAAI;AACF,MAAA,MAAM,WAAA,GAAc,MAAM,IAAA,CAAK,IAAA,CAAK,QAAQ,IAAA,CAAK;AAAA,QAC/C,gBAAA,EAAkB,EAAE,IAAA,kBAAM,IAAI,MAAK,EAAE;AAAA,QACrC,QAAA,EAAU,KAAA;AAAA,QACV,kBAAA,EAAoB;AAAA,OACrB,CAAA;AAED,MAAA,KAAA,MAAW,WAAW,WAAA,EAAa;AACjC,QAAA,IAAI;AACF,UAAA,IAAI,IAAA,CAAK,IAAA,CAAK,KAAA,CAAM,aAAA,EAAe;AACjC,YAAA,MAAM,IAAA,CAAK,IAAA,CAAK,KAAA,CAAM,aAAA,CAAc,OAA8B,CAAA;AAAA,UACpE;AAEA,UAAA,MAAM,IAAA,CAAK,KAAK,OAAA,CAAQ,gBAAA;AAAA,YACtB,EAAE,GAAA,EAAK,OAAA,CAAQ,GAAA,EAAI;AAAA,YACnB;AAAA,cACE,IAAA,EAAM,EAAE,kBAAA,kBAAoB,IAAI,MAAK,EAAE;AAAA,cACvC,KAAA,EAAO;AAAA,gBACL,QAAA,EAAU;AAAA,kBACR,OAAA,EAASJ,QAAO,UAAA,EAAW;AAAA,kBAC3B,MAAMG,iBAAAA,CAAkB,iBAAA;AAAA,kBACxB,SAAS,eAAA,CAAgB,iBAAA;AAAA,kBACzB,SAAA,sBAAe,IAAA;AAAK;AACtB;AACF;AACF,WACF;AAEA,UAAA,IAAA,CAAK,IAAA,CAAK,MAAA,CAAO,IAAA,CAAK,8BAAA,EAAgC;AAAA,YACpD,WAAW,OAAA,CAAQ;AAAA,WACpB,CAAA;AAAA,QACH,SAAS,GAAA,EAAK;AACZ,UAAA,IAAA,CAAK,IAAA,CAAK,MAAA,CAAO,KAAA,CAAM,0CAAA,EAA4C;AAAA,YACjE,WAAW,OAAA,CAAQ,SAAA;AAAA,YACnB,KAAA,EAAO,GAAA,YAAe,KAAA,GAAQ,GAAA,CAAI,OAAA,GAAU;AAAA,WAC7C,CAAA;AAAA,QACH;AAAA,MACF;AAAA,IACF,CAAA,SAAE;AACA,MAAA,IAAA,CAAK,OAAA,GAAU,KAAA;AAAA,IACjB;AAAA,EACF;AACF;AChEA,IAAM,yBAAA,GAA4B,EAAE,MAAA,CAAO;AAAA,EACzC,EAAA,EAAI,EAAE,MAAA,CAAO;AAAA,IACX,UAAA,EAAY,EAAE,OAAA,EAAQ;AAAA,IACtB,gBAAA,EAAkB,CAAA,CAAE,MAAA,EAAO,CAAE,QAAA;AAAS,GACvC,CAAA;AAAA,EACD,MAAA,EAAQ,EACL,MAAA,CAAO;AAAA,IACN,IAAA,EAAM,EAAE,QAAA,EAAS;AAAA,IACjB,IAAA,EAAM,EAAE,QAAA,EAAS;AAAA,IACjB,KAAA,EAAO,EAAE,QAAA,EAAS;AAAA,IAClB,KAAA,EAAO,EAAE,QAAA;AAAS,GACnB,EACA,QAAA,EAAS;AAAA,EACZ,MAAA,EAAQ,EACL,MAAA,CAAO;AAAA,IACN,cAAA,EAAgB,CAAA,CAAE,MAAA,EAAO,CAAE,QAAA,EAAS;AAAA,IACpC,YAAA,EAAc,CAAA,CAAE,QAAA,EAAS,CAAE,QAAA;AAAS,GACrC,CAAA,CACA,QAAA,EAAS,CACT,OAAA,CAAQ,EAAE,CAAA;AAAA,EACb,QAAA,EAAU,EAAE,MAAA,CAAO;AAAA,IACjB,aAAA,EAAe,EAAE,QAAA,EAAS;AAAA,IAC1B,UAAA,EAAY,CAAA,CAAE,QAAA,EAAS,CAAE,QAAA,EAAS;AAAA,IAClC,iBAAA,EAAmB,EAAE,QAAA;AAAS,GAC/B,CAAA;AAAA,EACD,KAAA,EAAO,EACJ,MAAA,CAAO;AAAA,IACN,aAAA,EAAe,CAAA,CAAE,QAAA,EAAS,CAAE,QAAA,EAAS;AAAA,IACrC,cAAA,EAAgB,CAAA,CAAE,QAAA,EAAS,CAAE,QAAA,EAAS;AAAA,IACtC,YAAA,EAAc,CAAA,CAAE,QAAA,EAAS,CAAE,QAAA,EAAS;AAAA,IACpC,cAAA,EAAgB,CAAA,CAAE,QAAA,EAAS,CAAE,QAAA,EAAS;AAAA,IACtC,aAAA,EAAe,CAAA,CAAE,QAAA,EAAS,CAAE,QAAA,EAAS;AAAA,IACrC,QAAA,EAAU,CAAA,CAAE,QAAA,EAAS,CAAE,QAAA;AAAS,GACjC,EACA,QAAA,EAAS;AAAA,EACZ,OAAA,EAAS,EACN,MAAA,CAAO;AAAA,IACN,kBAAA,EAAoB,EAAE,MAAA,EAAO,CAAE,KAAI,CAAE,QAAA,GAAW,QAAA,EAAS;AAAA,IACzD,uBAAA,EAAyB,EAAE,MAAA,EAAO,CAAE,KAAI,CAAE,QAAA,GAAW,QAAA,EAAS;AAAA,IAC9D,kBAAA,EAAoB,CAAA,CAAE,OAAA,EAAQ,CAAE,QAAA;AAAS,GAC1C,EACA,QAAA;AACL,CAAC,CAAA;AAwBM,SAAS,oBAAoB,MAAA,EAA4C;AAE9E,EAAA,MAAM,WAAA,GAAc,yBAAA,CAA0B,SAAA,CAAU,MAAM,CAAA;AAC9D,EAAA,IAAI,CAAC,YAAY,OAAA,EAAS;AACxB,IAAA,MAAM,SAAS,WAAA,CAAY,KAAA,CAAM,OAC9B,GAAA,CAAI,CAAC,MAAM,CAAA,EAAG,CAAA,CAAE,KAAK,IAAA,CAAK,GAAG,CAAC,CAAA,EAAA,EAAK,CAAA,CAAE,OAAO,CAAA,CAAE,CAAA,CAC9C,KAAK,IAAI,CAAA;AACZ,IAAA,MAAM,IAAI,KAAA,CAAM,CAAA,6BAAA,EAAgC,MAAM,CAAA,CAAE,CAAA;AAAA,EAC1D;AAGA,EAAA,MAAM,eAAA,GAAmC;AAAA,IACvC,GAAG,eAAA;AAAA,IACH,GAAG,MAAA,CAAO;AAAA,GACZ;AAGA,EAAA,MAAM,MAAA,GAAS,OAAO,MAAA,IAAU,UAAA;AAGhC,EAAA,MAAM,IAAA,GAAO,OAAO,EAAA,CAAG,UAAA;AACvB,EAAA,MAAM,MAAA,GAAS,OAAO,EAAA,CAAG,gBAAA;AAEzB,EAAA,MAAM,QAAA,GAAW,mBAAA,CAAoB,IAAA,EAAM,MAAM,CAAA;AACjD,EAAA,MAAM,OAAA,GAAU,kBAAA,CAAmB,IAAA,EAAM,MAAM,CAAA;AAC/C,EAAA,MAAM,eAAA,GAAkB,0BAAA,CAA2B,IAAA,EAAM,MAAM,CAAA;AAG/D,EAAA,MAAM,eAAA,GAAkB,IAAI,eAAA,CAAgB,eAAA,EAAiB,MAAM,CAAA;AAEnE,EAAA,MAAM,eAAA,GAAkB,IAAI,eAAA,CAAgB,QAAA,EAAU,SAAS,MAAM,CAAA;AAErE,EAAA,MAAM,eAAA,GAAkB,IAAI,eAAA,CAAgB,OAAA,EAAS,QAAQ,eAAe,CAAA;AAE5E,EAAA,MAAM,iBAAiB,IAAI,cAAA;AAAA,IACzB,OAAA;AAAA,IACA,QAAA;AAAA,IACA,eAAA;AAAA,IACA,MAAA;AAAA,IACA,MAAA,CAAO,SAAS,EAAC;AAAA,IACjB;AAAA,GACF;AAEA,EAAA,MAAM,0BAA0B,IAAI,uBAAA;AAAA,IAClC,OAAA;AAAA,IACA,QAAA;AAAA,IACA,eAAA;AAAA,IACA,MAAA;AAAA,IACA,MAAA,CAAO,SAAS,EAAC;AAAA,IACjB;AAAA,GACF;AAEA,EAAA,MAAM,gBAAA,GAAmB,IAAI,gBAAA,CAAiB,OAAA,EAAS,UAAU,MAAA,EAAQ,MAAA,CAAO,QAAQ,YAAY,CAAA;AAEpG,EAAA,MAAM,2BAA2B,IAAI,wBAAA;AAAA,IACnC,OAAA;AAAA,IACA,QAAA;AAAA,IACA,MAAA;AAAA,IACA,OAAO,MAAA,EAAQ;AAAA,GACjB;AAEA,EAAA,MAAM,aAAA,GAAgB,IAAI,aAAA,CAAc,OAAA,EAAS,0BAA0B,MAAM,CAAA;AAGjF,EAAA,MAAM,MAAA,GAAS,YAAA;AAAA,IACb;AAAA,MACE,SAAA,EAAW,eAAA;AAAA,MACX,QAAA,EAAU,cAAA;AAAA,MACV,SAAA,EAAW,uBAAA;AAAA,MACX,QAAA,EAAU,eAAA;AAAA,MACV,SAAA,EAAW,gBAAA;AAAA,MACX,iBAAA,EAAmB,wBAAA;AAAA,MACnB,QAAA,EAAU,eAAA;AAAA,MACV,MAAA,EAAQ;AAAA,KACV;AAAA,IACA;AAAA,MACE,mBAAA,EAAqB,MAAA,CAAO,QAAA,CAAS,iBAAA,GACjC,OAAO,GAAA,KAAQ;AACb,QAAA,MAAM,UAAA,GAAa,GAAA;AACnB,QAAA,MAAM,UAAA,GAAa,UAAA,CAAW,OAAA,GAAU,eAAe,CAAA;AACvD,QAAA,MAAM,KAAA,GAAQ,YAAY,UAAA,CAAW,SAAS,IAC1C,UAAA,CAAW,KAAA,CAAM,CAAC,CAAA,GAClB,UAAA;AACJ,QAAA,IAAI,CAAC,OAAO,OAAO,IAAA;AACnB,QAAA,OAAO,MAAA,CAAO,QAAA,CAAS,iBAAA,CAAkB,KAAK,CAAA;AAAA,MAChD,CAAA,GACA,MAAA;AAAA,MACJ,MAAA;AAAA,MACA,oBAAoB,eAAA,CAAgB;AAAA;AACtC,GACF;AAGA,EAAA,MAAM,cAAA,GAAiB,IAAI,cAAA,CAAe;AAAA,IACxC,OAAA;AAAA,IACA,KAAA,EAAO,EAAE,aAAA,EAAe,MAAA,CAAO,OAAO,aAAA,EAAc;AAAA,IACpD,MAAA;AAAA,IACA,OAAA,EAAS;AAAA,GACV,CAAA;AAED,EAAA,cAAA,CAAe,KAAA,EAAM;AAGrB,EAAA,eAAe,OAAA,GAAyB;AACtC,IAAA,cAAA,CAAe,IAAA,EAAK;AACpB,IAAA,MAAA,CAAO,KAAK,yBAAyB,CAAA;AAAA,EACvC;AAEA,EAAA,OAAO;AAAA,IACL,SAAA,EAAW,eAAA;AAAA,IACX,QAAA,EAAU,cAAA;AAAA,IACV,SAAA,EAAW,uBAAA;AAAA,IACX,QAAA,EAAU,eAAA;AAAA,IACV,SAAA,EAAW,gBAAA;AAAA,IACX,iBAAA,EAAmB,wBAAA;AAAA,IACnB,QAAA,EAAU,eAAA;AAAA,IACV,MAAA,EAAQ,aAAA;AAAA,IACR,MAAA;AAAA,IACA,MAAA,EAAQ,EAAE,QAAA,EAAU,OAAA,EAAS,eAAA,EAAgB;AAAA,IAC7C;AAAA,GACF;AACF","file":"index.mjs","sourcesContent":["import crypto from 'node:crypto';\nimport { Schema, Document, Model } from 'mongoose';\nimport type mongoose from 'mongoose';\nimport type { IPipeline, IPipelineStage } from '@astralibx/call-log-types';\n\n// ── Document interfaces ──────────────────────────────────────────────────────\n\nexport interface IPipelineStageDocument extends IPipelineStage, Document {}\n\nexport interface IPipelineDocument extends IPipeline, Document {}\n\n// ── Sub-document schema ──────────────────────────────────────────────────────\n\nexport const PipelineStageSchema = new Schema<IPipelineStageDocument>(\n {\n stageId: { type: String, required: true, default: () => crypto.randomUUID() },\n name: { type: String, required: true },\n color: { type: String, required: true },\n order: { type: Number, required: true },\n isTerminal: { type: Boolean, default: false },\n isDefault: { type: Boolean, default: false },\n },\n { _id: false },\n);\n\n// ── Main schema ──────────────────────────────────────────────────────────────\n\nexport const PipelineSchema = new Schema<IPipelineDocument>(\n {\n pipelineId: { type: String, required: true, unique: true, default: () => crypto.randomUUID() },\n name: { type: String, required: true },\n description: { type: String },\n stages: { type: [PipelineStageSchema], required: true },\n isActive: { type: Boolean, default: true, index: true },\n isDeleted: { type: Boolean, default: false },\n isDefault: { type: Boolean, default: false },\n createdBy: { type: String, required: true },\n tenantId: { type: String, sparse: true },\n metadata: { type: Schema.Types.Mixed },\n },\n {\n timestamps: true,\n },\n);\n\n// Note: pipelineId unique index is defined inline via `unique: true`.\n// isActive index is defined inline via `index: true`.\n// tenantId sparse index is defined inline via `sparse: true`.\n// No additional schema.index() calls needed for these fields.\n\n// ── Factory ──────────────────────────────────────────────────────────────────\n\nexport function createPipelineModel(\n connection: mongoose.Connection,\n prefix?: string,\n): Model<IPipelineDocument> {\n const collectionName = prefix ? `${prefix}_pipelines` : 'pipelines';\n return connection.model<IPipelineDocument>('Pipeline', PipelineSchema, collectionName);\n}\n","import crypto from 'node:crypto';\nimport { Schema, Document, Model } from 'mongoose';\nimport type mongoose from 'mongoose';\nimport { CallDirection, CallPriority, TimelineEntryType } from '@astralibx/call-log-types';\nimport type { ICallLog, IContactRef, ITimelineEntry, IStageChange } from '@astralibx/call-log-types';\n\n// ── Document interface ───────────────────────────────────────────────────────\n\nexport interface ICallLogDocument extends Omit<ICallLog, 'agentId'>, Document {\n agentId: mongoose.Types.ObjectId;\n}\n\n// ── Sub-document schemas ─────────────────────────────────────────────────────\n\nexport const ContactRefSchema = new Schema<IContactRef>(\n {\n externalId: { type: String, required: true },\n displayName: { type: String, required: true },\n phone: { type: String },\n email: { type: String },\n },\n { _id: false },\n);\n\nexport const TimelineEntrySchema = new Schema<ITimelineEntry>(\n {\n entryId: { type: String, required: true, default: () => crypto.randomUUID() },\n type: {\n type: String,\n required: true,\n enum: Object.values(TimelineEntryType),\n },\n content: { type: String },\n authorId: { type: String },\n authorName: { type: String },\n fromStageId: { type: String },\n fromStageName: { type: String },\n toStageId: { type: String },\n toStageName: { type: String },\n fromAgentId: { type: String },\n fromAgentName: { type: String },\n toAgentId: { type: String },\n toAgentName: { type: String },\n createdAt: { type: Date, default: Date.now },\n },\n { _id: false },\n);\n\nexport const StageChangeSchema = new Schema<IStageChange>(\n {\n fromStageId: { type: String, required: true },\n toStageId: { type: String, required: true },\n fromStageName: { type: String, required: true },\n toStageName: { type: String, required: true },\n changedBy: { type: String, required: true },\n changedAt: { type: Date, required: true },\n timeInStageMs: { type: Number, required: true },\n },\n { _id: false },\n);\n\n// ── Main schema ──────────────────────────────────────────────────────────────\n\nexport const CallLogSchema = new Schema<ICallLogDocument>(\n {\n callLogId: { type: String, required: true, unique: true, default: () => crypto.randomUUID() },\n pipelineId: { type: String, required: true, index: true },\n currentStageId: { type: String, required: true, index: true },\n contactRef: { type: ContactRefSchema, required: true },\n direction: {\n type: String,\n required: true,\n enum: Object.values(CallDirection),\n },\n callDate: { type: Date, required: true, index: true },\n nextFollowUpDate: { type: Date, index: true },\n followUpNotifiedAt: { type: Date },\n priority: {\n type: String,\n required: true,\n enum: Object.values(CallPriority),\n default: CallPriority.Medium,\n },\n agentId: { type: Schema.Types.ObjectId, required: true, index: true },\n assignedBy: { type: String },\n tags: { type: [String], default: [], index: true },\n category: { type: String },\n timeline: { type: [TimelineEntrySchema], default: [] },\n stageHistory: { type: [StageChangeSchema], default: [] },\n durationMinutes: { type: Number, min: 0 },\n channel: { type: String, default: 'phone', index: true },\n outcome: { type: String, default: 'pending', index: true },\n isFollowUp: { type: Boolean, default: false, index: true },\n isDeleted: { type: Boolean, default: false },\n deletedAt: { type: Date },\n isClosed: { type: Boolean, default: false, index: true },\n closedAt: { type: Date },\n tenantId: { type: String, sparse: true },\n metadata: { type: Schema.Types.Mixed },\n },\n {\n timestamps: true,\n },\n);\n\n// callLogId unique index is defined inline via `unique: true`.\n// tenantId sparse index is defined inline via `sparse: true`.\n// Compound and additional indexes:\nCallLogSchema.index({ 'contactRef.externalId': 1 });\nCallLogSchema.index({ pipelineId: 1, currentStageId: 1 });\nCallLogSchema.index({ agentId: 1, isClosed: 1 });\nCallLogSchema.index({ isDeleted: 1, isClosed: 1 });\n\n// ── Factory ──────────────────────────────────────────────────────────────────\n\nexport function createCallLogModel(\n connection: mongoose.Connection,\n prefix?: string,\n): Model<ICallLogDocument> {\n const collectionName = prefix ? `${prefix}_call_logs` : 'call_logs';\n return connection.model<ICallLogDocument>('CallLog', CallLogSchema, collectionName);\n}\n","// Error Codes\nexport const ERROR_CODE = {\n PipelineNotFound: 'CALL_PIPELINE_NOT_FOUND',\n InvalidPipeline: 'CALL_INVALID_PIPELINE',\n StageNotFound: 'CALL_STAGE_NOT_FOUND',\n StageInUse: 'CALL_STAGE_IN_USE',\n CallLogNotFound: 'CALL_LOG_NOT_FOUND',\n CallLogClosed: 'CALL_LOG_CLOSED',\n CallLogDeleted: 'CALL_LOG_DELETED',\n ContactNotFound: 'CALL_CONTACT_NOT_FOUND',\n AgentCapacityFull: 'CALL_AGENT_CAPACITY_FULL',\n InvalidConfig: 'CALL_INVALID_CONFIG',\n AuthFailed: 'CALL_AUTH_FAILED',\n} as const;\n\nexport type ErrorCode = (typeof ERROR_CODE)[keyof typeof ERROR_CODE];\n\n// Error Messages\nexport const ERROR_MESSAGE = {\n PipelineNotFound: 'Pipeline not found',\n PipelineNoDefaultStage: 'Pipeline must have exactly one default stage',\n PipelineNoTerminalStage: 'Pipeline must have at least one terminal stage',\n PipelineDuplicateStageNames: 'Stage names must be unique within a pipeline',\n StageNotFound: 'Stage not found in pipeline',\n StageInUse: 'Cannot remove stage that has active calls',\n CallLogNotFound: 'Call log not found',\n CallLogClosed: 'Cannot modify a closed call log',\n CallLogDeleted: 'Call log has been deleted',\n ContactNotFound: 'Contact not found',\n AgentCapacityFull: 'Agent has reached maximum concurrent calls',\n AuthFailed: 'Authentication failed',\n} as const;\n\n// Pipeline Defaults\nexport const PIPELINE_DEFAULTS = {\n MaxStages: 20,\n} as const;\n\n// Call Log Defaults\nexport const CALL_LOG_DEFAULTS = {\n MaxTimelineEntries: 200,\n DefaultFollowUpDays: 3,\n TimelinePageSize: 20,\n} as const;\n\n// Agent Call Defaults\nexport const AGENT_CALL_DEFAULTS = {\n MaxConcurrentCalls: 10,\n} as const;\n\n// System Timeline Messages\nexport const SYSTEM_TIMELINE = {\n CallCreated: 'Call log created',\n CallClosed: 'Call closed',\n CallReopened: 'Call reopened',\n FollowUpCompleted: 'Follow-up completed',\n} as const;\n\nexport const SYSTEM_TIMELINE_FN = {\n stageChanged: (from: string, to: string) => `Stage changed from \"${from}\" to \"${to}\"`,\n callAssigned: (agentName: string) => `Call assigned to ${agentName}`,\n callReassigned: (from: string, to: string) => `Call reassigned from ${from} to ${to}`,\n followUpSet: (date: string) => `Follow-up scheduled for ${date}`,\n callDeleted: (agentName: string) => `Call deleted by ${agentName}`,\n followUpCallCreated: () => 'This call is a follow-up to a previous interaction',\n} as const;\n","import { Schema, Document, Model } from 'mongoose';\nimport type mongoose from 'mongoose';\nimport { CallPriority } from '@astralibx/call-log-types';\nimport type { ICallLogSettings, IPriorityConfig } from '@astralibx/call-log-types';\nimport { CALL_LOG_DEFAULTS, AGENT_CALL_DEFAULTS } from '../constants/index.js';\n\n// ── Document interface ───────────────────────────────────────────────────────\n\nexport interface ICallLogSettingsDocument extends ICallLogSettings, Document {}\n\n// ── Default priority levels ──────────────────────────────────────────────────\n\nconst DEFAULT_PRIORITY_LEVELS: IPriorityConfig[] = [\n { value: CallPriority.Low, label: 'Low', color: '#6b7280', order: 1 },\n { value: CallPriority.Medium, label: 'Medium', color: '#3b82f6', order: 2 },\n { value: CallPriority.High, label: 'High', color: '#f59e0b', order: 3 },\n { value: CallPriority.Urgent, label: 'Urgent', color: '#ef4444', order: 4 },\n];\n\n// ── Sub-document schema ──────────────────────────────────────────────────────\n\nconst PriorityConfigSchema = new Schema<IPriorityConfig>(\n {\n value: { type: String, required: true },\n label: { type: String, required: true },\n color: { type: String, required: true },\n order: { type: Number, required: true },\n },\n { _id: false },\n);\n\n// ── Main schema ──────────────────────────────────────────────────────────────\n\nexport const CallLogSettingsSchema = new Schema<ICallLogSettingsDocument>(\n {\n key: { type: String, required: true, default: 'global' },\n availableTags: { type: [String], default: [] },\n availableCategories: { type: [String], default: [] },\n availableChannels: { type: [String], default: ['phone', 'whatsapp', 'telegram', 'in_app_chat'] },\n availableOutcomes: { type: [String], default: ['pending', 'interested', 'not_interested', 'no_answer', 'busy', 'callback_requested', 'subscribed', 'complaint'] },\n priorityLevels: {\n type: [PriorityConfigSchema],\n default: () => DEFAULT_PRIORITY_LEVELS.map((p) => ({ ...p })),\n },\n defaultFollowUpDays: {\n type: Number,\n default: CALL_LOG_DEFAULTS.DefaultFollowUpDays,\n },\n followUpReminderEnabled: { type: Boolean, default: true },\n defaultPipelineId: { type: String },\n timelinePageSize: {\n type: Number,\n default: CALL_LOG_DEFAULTS.TimelinePageSize,\n },\n maxConcurrentCalls: {\n type: Number,\n default: AGENT_CALL_DEFAULTS.MaxConcurrentCalls,\n },\n tenantId: { type: String, sparse: true },\n metadata: { type: Schema.Types.Mixed },\n },\n {\n timestamps: true,\n },\n);\n\nCallLogSettingsSchema.index({ key: 1, tenantId: 1 }, { unique: true });\n\n// ── Factory ──────────────────────────────────────────────────────────────────\n\nexport function createCallLogSettingsModel(\n connection: mongoose.Connection,\n prefix?: string,\n): Model<ICallLogSettingsDocument> {\n const collectionName = prefix ? `${prefix}_call_log_settings` : 'call_log_settings';\n return connection.model<ICallLogSettingsDocument>(\n 'CallLogSettings',\n CallLogSettingsSchema,\n collectionName,\n );\n}\n","import { AlxError } from '@astralibx/core';\nimport { ERROR_CODE } from '../constants/index.js';\n\n// ── Base ────────────────────────────────────────────────────────────────────\n\nexport class AlxCallLogError extends AlxError {\n constructor(message: string, code: string, public readonly context?: Record<string, unknown>) {\n super(message, code);\n this.name = 'AlxCallLogError';\n }\n}\n\n// ── Domain errors ───────────────────────────────────────────────────────────\n\nexport class PipelineNotFoundError extends AlxCallLogError {\n constructor(public readonly pipelineId: string) {\n super(`Pipeline not found: ${pipelineId}`, ERROR_CODE.PipelineNotFound, { pipelineId });\n this.name = 'PipelineNotFoundError';\n }\n}\n\nexport class InvalidPipelineError extends AlxCallLogError {\n constructor(\n public readonly reason: string,\n public readonly pipelineId?: string,\n ) {\n super(\n pipelineId\n ? `Invalid pipeline \"${pipelineId}\": ${reason}`\n : `Invalid pipeline: ${reason}`,\n ERROR_CODE.InvalidPipeline,\n { pipelineId, reason },\n );\n this.name = 'InvalidPipelineError';\n }\n}\n\nexport class StageNotFoundError extends AlxCallLogError {\n constructor(\n public readonly pipelineId: string,\n public readonly stageId: string,\n ) {\n super(\n `Stage \"${stageId}\" not found in pipeline \"${pipelineId}\"`,\n ERROR_CODE.StageNotFound,\n { pipelineId, stageId },\n );\n this.name = 'StageNotFoundError';\n }\n}\n\nexport class StageInUseError extends AlxCallLogError {\n constructor(\n public readonly pipelineId: string,\n public readonly stageId: string,\n public readonly activeCallCount: number,\n ) {\n super(\n `Cannot remove stage \"${stageId}\" in pipeline \"${pipelineId}\": ${activeCallCount} active call(s)`,\n ERROR_CODE.StageInUse,\n { pipelineId, stageId, activeCallCount },\n );\n this.name = 'StageInUseError';\n }\n}\n\nexport class CallLogNotFoundError extends AlxCallLogError {\n constructor(public readonly callLogId: string) {\n super(`Call log not found: ${callLogId}`, ERROR_CODE.CallLogNotFound, { callLogId });\n this.name = 'CallLogNotFoundError';\n }\n}\n\nexport class CallLogClosedError extends AlxCallLogError {\n constructor(\n public readonly callLogId: string,\n public readonly attemptedAction: string,\n ) {\n super(\n `Cannot ${attemptedAction} on closed call log \"${callLogId}\"`,\n ERROR_CODE.CallLogClosed,\n { callLogId, attemptedAction },\n );\n this.name = 'CallLogClosedError';\n }\n}\n\nexport class ContactNotFoundError extends AlxCallLogError {\n constructor(public readonly contactQuery: Record<string, unknown>) {\n super(\n `Contact not found: ${JSON.stringify(contactQuery)}`,\n ERROR_CODE.ContactNotFound,\n { contactQuery },\n );\n this.name = 'ContactNotFoundError';\n }\n}\n\nexport class AgentCapacityError extends AlxCallLogError {\n constructor(\n public readonly agentId: string,\n public readonly currentCalls: number,\n public readonly maxCalls: number,\n ) {\n super(\n `Agent ${agentId} at capacity (${currentCalls}/${maxCalls})`,\n ERROR_CODE.AgentCapacityFull,\n { agentId, currentCalls, maxCalls },\n );\n this.name = 'AgentCapacityError';\n }\n}\n\nexport class InvalidConfigError extends AlxCallLogError {\n constructor(\n public readonly field: string,\n public readonly reason: string,\n ) {\n super(`Invalid config for \"${field}\": ${reason}`, ERROR_CODE.InvalidConfig, { field, reason });\n this.name = 'InvalidConfigError';\n }\n}\n\nexport class AuthFailedError extends AlxCallLogError {\n constructor(public readonly reason?: string) {\n super(\n reason ? `Authentication failed: ${reason}` : 'Authentication failed',\n ERROR_CODE.AuthFailed,\n { reason },\n );\n this.name = 'AuthFailedError';\n }\n}\n","import type { Model } from 'mongoose';\nimport type { LogAdapter } from '@astralibx/core';\nimport type { ICallLogSettings, IPriorityConfig } from '@astralibx/call-log-types';\nimport type { ICallLogSettingsDocument } from '../schemas/call-log-settings.schema.js';\nimport { InvalidConfigError } from '../errors/index.js';\nimport { CALL_LOG_DEFAULTS, AGENT_CALL_DEFAULTS } from '../constants/index.js';\n\n\n// ── Private validation helpers ────────────────────────────────────────────────\n\nfunction validateIntegerRange(value: unknown, field: string, min: number, max: number): void {\n if (typeof value !== 'number' || !Number.isInteger(value) || value < min || value > max) {\n throw new InvalidConfigError(field, `Must be an integer between ${min} and ${max}`);\n }\n}\n\n// ── Service ───────────────────────────────────────────────────────────────────\n\nexport class SettingsService {\n constructor(\n private CallLogSettings: Model<ICallLogSettingsDocument>,\n private logger: LogAdapter,\n private tenantId?: string,\n ) {}\n\n private get settingsFilter(): Record<string, unknown> {\n const filter: Record<string, unknown> = { key: 'global' };\n if (this.tenantId) filter.tenantId = this.tenantId;\n return filter;\n }\n\n private buildDefaults(): Record<string, unknown> {\n const defaults: Record<string, unknown> = {\n key: 'global',\n availableTags: [],\n availableCategories: [],\n priorityLevels: [],\n defaultFollowUpDays: CALL_LOG_DEFAULTS.DefaultFollowUpDays,\n followUpReminderEnabled: true,\n timelinePageSize: CALL_LOG_DEFAULTS.TimelinePageSize,\n maxConcurrentCalls: AGENT_CALL_DEFAULTS.MaxConcurrentCalls,\n };\n if (this.tenantId) defaults.tenantId = this.tenantId;\n return defaults;\n }\n\n async get(): Promise<ICallLogSettingsDocument> {\n return this.CallLogSettings.findOneAndUpdate(\n this.settingsFilter,\n { $setOnInsert: this.buildDefaults() },\n { upsert: true, new: true },\n ) as Promise<ICallLogSettingsDocument>;\n }\n\n async update(data: Partial<{\n availableTags: string[];\n availableCategories: string[];\n availableChannels: string[];\n availableOutcomes: string[];\n priorityLevels: IPriorityConfig[];\n defaultFollowUpDays: number;\n followUpReminderEnabled: boolean;\n defaultPipelineId: string;\n timelinePageSize: number;\n maxConcurrentCalls: number;\n metadata: Record<string, unknown>;\n }>): Promise<ICallLogSettingsDocument> {\n if (data.defaultFollowUpDays != null) {\n validateIntegerRange(data.defaultFollowUpDays, 'defaultFollowUpDays', 1, 30);\n }\n if (data.timelinePageSize != null) {\n validateIntegerRange(data.timelinePageSize, 'timelinePageSize', 5, 100);\n }\n if (data.maxConcurrentCalls != null) {\n validateIntegerRange(data.maxConcurrentCalls, 'maxConcurrentCalls', 1, 50);\n }\n\n const settings = await this.CallLogSettings.findOneAndUpdate(\n this.settingsFilter,\n { $set: data },\n { upsert: true, new: true },\n );\n this.logger.info('Call log settings updated', { fields: Object.keys(data) });\n return settings!;\n }\n}\n","import type { IPipelineStage } from '@astralibx/call-log-types';\nimport { InvalidPipelineError } from '../errors/index.js';\nimport { PIPELINE_DEFAULTS } from '../constants/index.js';\n\n/**\n * Validates a pipeline's stages array against all business rules.\n *\n * @param stages - The array of pipeline stages to validate.\n * @param pipelineId - Optional pipeline identifier used in error messages.\n * @throws InvalidPipelineError when any rule is violated.\n */\nexport function validatePipelineStages(stages: IPipelineStage[], pipelineId?: string): void {\n // Rule 1: Must have at least one stage\n if (stages.length === 0) {\n throw new InvalidPipelineError('Pipeline must have at least one stage', pipelineId);\n }\n\n // Rule 2 & 3: Must have exactly one default stage\n const defaultStages = stages.filter((s) => s.isDefault);\n if (defaultStages.length === 0) {\n throw new InvalidPipelineError(\n 'Pipeline must have exactly one default stage',\n pipelineId,\n );\n }\n if (defaultStages.length > 1) {\n throw new InvalidPipelineError(\n 'Pipeline must have exactly one default stage',\n pipelineId,\n );\n }\n\n // Rule 4: Must have at least one terminal stage\n const terminalStages = stages.filter((s) => s.isTerminal);\n if (terminalStages.length === 0) {\n throw new InvalidPipelineError(\n 'Pipeline must have at least one terminal stage',\n pipelineId,\n );\n }\n\n // Rule 5: Stage names must be unique\n const names = stages.map((s) => s.name);\n const uniqueNames = new Set(names);\n if (uniqueNames.size !== names.length) {\n throw new InvalidPipelineError(\n 'Stage names must be unique within a pipeline',\n pipelineId,\n );\n }\n\n // Rule 6: Cannot exceed max stages\n if (stages.length > PIPELINE_DEFAULTS.MaxStages) {\n throw new InvalidPipelineError(\n `Pipeline cannot have more than ${PIPELINE_DEFAULTS.MaxStages} stages`,\n pipelineId,\n );\n }\n}\n","import crypto from 'node:crypto';\nimport type { Model } from 'mongoose';\nimport type { LogAdapter } from '@astralibx/core';\nimport type { IPipelineStage } from '@astralibx/call-log-types';\nimport type { IPipelineDocument } from '../schemas/pipeline.schema.js';\nimport type { ICallLogDocument } from '../schemas/call-log.schema.js';\nimport {\n PipelineNotFoundError,\n StageNotFoundError,\n StageInUseError,\n InvalidPipelineError,\n} from '../errors/index.js';\nimport { validatePipelineStages } from '../validation/pipeline.validator.js';\n\n// ── Input types ───────────────────────────────────────────────────────────────\n\nexport interface CreatePipelineInput {\n name: string;\n description?: string;\n stages: Omit<IPipelineStage, 'stageId'>[];\n isDefault?: boolean;\n createdBy: string;\n tenantId?: string;\n metadata?: Record<string, unknown>;\n}\n\nexport interface UpdatePipelineInput {\n name?: string;\n description?: string;\n isActive?: boolean;\n isDefault?: boolean;\n metadata?: Record<string, unknown>;\n}\n\n// ── Service ───────────────────────────────────────────────────────────────────\n\nexport class PipelineService {\n constructor(\n private Pipeline: Model<IPipelineDocument>,\n private CallLog: Model<ICallLogDocument>,\n private logger: LogAdapter,\n private tenantId?: string,\n ) {}\n\n private get tenantFilter(): Record<string, unknown> {\n if (this.tenantId) return { tenantId: this.tenantId };\n return {};\n }\n\n async create(data: CreatePipelineInput): Promise<IPipelineDocument> {\n // Assign UUIDs to each stage\n const stages: IPipelineStage[] = data.stages.map((s) => ({\n ...s,\n stageId: crypto.randomUUID(),\n }));\n\n validatePipelineStages(stages);\n\n const pipelineId = crypto.randomUUID();\n\n // If this is marked as default, unset others\n if (data.isDefault) {\n await this.Pipeline.updateMany(\n { ...this.tenantFilter, isDefault: true },\n { $set: { isDefault: false } },\n );\n }\n\n const pipeline = await this.Pipeline.create({\n pipelineId,\n name: data.name,\n description: data.description,\n stages,\n isDefault: data.isDefault ?? false,\n isActive: true,\n isDeleted: false,\n createdBy: data.createdBy,\n ...(data.tenantId ? { tenantId: data.tenantId } : this.tenantId ? { tenantId: this.tenantId } : {}),\n metadata: data.metadata,\n });\n\n this.logger.info('Pipeline created', { pipelineId, name: data.name });\n return pipeline;\n }\n\n async update(pipelineId: string, data: UpdatePipelineInput): Promise<IPipelineDocument> {\n const pipeline = await this.Pipeline.findOne({ pipelineId, isDeleted: false, ...this.tenantFilter });\n if (!pipeline) throw new PipelineNotFoundError(pipelineId);\n\n // If setting as default, unset others\n if (data.isDefault) {\n await this.Pipeline.updateMany(\n { ...this.tenantFilter, isDefault: true, pipelineId: { $ne: pipelineId } },\n { $set: { isDefault: false } },\n );\n }\n\n const updated = await this.Pipeline.findOneAndUpdate(\n { pipelineId, isDeleted: false },\n { $set: data },\n { new: true },\n );\n\n if (!updated) throw new PipelineNotFoundError(pipelineId);\n this.logger.info('Pipeline updated', { pipelineId, fields: Object.keys(data) });\n return updated;\n }\n\n async delete(pipelineId: string): Promise<void> {\n const pipeline = await this.Pipeline.findOne({ pipelineId, isDeleted: false, ...this.tenantFilter });\n if (!pipeline) throw new PipelineNotFoundError(pipelineId);\n\n const activeCallCount = await this.CallLog.countDocuments({ pipelineId, isClosed: false });\n if (activeCallCount > 0) {\n throw new InvalidPipelineError(`Cannot delete pipeline with ${activeCallCount} active (non-closed) calls`, pipelineId);\n }\n\n await this.Pipeline.findOneAndUpdate(\n { pipelineId, ...this.tenantFilter },\n { $set: { isDeleted: true, isActive: false } },\n );\n\n this.logger.info('Pipeline deleted', { pipelineId });\n }\n\n async list(filter?: { isActive?: boolean }): Promise<IPipelineDocument[]> {\n const query: Record<string, unknown> = { isDeleted: false, ...this.tenantFilter };\n if (filter?.isActive !== undefined) {\n query.isActive = filter.isActive;\n }\n return this.Pipeline.find(query).sort({ createdAt: 1 });\n }\n\n async get(pipelineId: string): Promise<IPipelineDocument> {\n const pipeline = await this.Pipeline.findOne({ pipelineId, isDeleted: false, ...this.tenantFilter });\n if (!pipeline) throw new PipelineNotFoundError(pipelineId);\n return pipeline;\n }\n\n async addStage(pipelineId: string, stage: Omit<IPipelineStage, 'stageId'>): Promise<IPipelineDocument> {\n const pipeline = await this.get(pipelineId);\n\n const newStage: IPipelineStage = {\n ...stage,\n stageId: crypto.randomUUID(),\n };\n\n const updatedStages = [...pipeline.stages, newStage];\n validatePipelineStages(updatedStages, pipelineId);\n\n const updated = await this.Pipeline.findOneAndUpdate(\n { pipelineId },\n { $push: { stages: newStage } },\n { new: true },\n );\n\n if (!updated) throw new PipelineNotFoundError(pipelineId);\n this.logger.info('Stage added to pipeline', { pipelineId, stageId: newStage.stageId });\n return updated;\n }\n\n async removeStage(pipelineId: string, stageId: string): Promise<IPipelineDocument> {\n const pipeline = await this.get(pipelineId);\n\n const stageExists = pipeline.stages.some((s) => s.stageId === stageId);\n if (!stageExists) throw new StageNotFoundError(pipelineId, stageId);\n\n const activeCallCount = await this.CallLog.countDocuments({ pipelineId, currentStageId: stageId, isClosed: false });\n if (activeCallCount > 0) {\n throw new StageInUseError(pipelineId, stageId, activeCallCount);\n }\n\n const updatedStages = pipeline.stages.filter((s) => s.stageId !== stageId);\n validatePipelineStages(updatedStages, pipelineId);\n\n const updated = await this.Pipeline.findOneAndUpdate(\n { pipelineId },\n { $pull: { stages: { stageId } } },\n { new: true },\n );\n\n if (!updated) throw new PipelineNotFoundError(pipelineId);\n this.logger.info('Stage removed from pipeline', { pipelineId, stageId });\n return updated;\n }\n\n async updateStage(\n pipelineId: string,\n stageId: string,\n data: Partial<IPipelineStage>,\n ): Promise<IPipelineDocument> {\n const pipeline = await this.get(pipelineId);\n\n const stageIndex = pipeline.stages.findIndex((s) => s.stageId === stageId);\n if (stageIndex === -1) throw new StageNotFoundError(pipelineId, stageId);\n\n // Build updated stages array for validation\n const updatedStages = pipeline.stages.map((s) => {\n const plain = (s as unknown as { toObject?(): IPipelineStage }).toObject?.() ?? s;\n if (s.stageId === stageId) {\n return { ...plain, ...data, stageId };\n }\n return plain;\n }) as IPipelineStage[];\n\n validatePipelineStages(updatedStages, pipelineId);\n\n // Build dotted path $set for the specific stage array element\n const setFields: Record<string, unknown> = {};\n for (const [key, value] of Object.entries(data)) {\n if (key !== 'stageId') {\n setFields[`stages.${stageIndex}.${key}`] = value;\n }\n }\n\n const updated = await this.Pipeline.findOneAndUpdate(\n { pipelineId },\n { $set: setFields },\n { new: true },\n );\n\n if (!updated) throw new PipelineNotFoundError(pipelineId);\n this.logger.info('Stage updated in pipeline', { pipelineId, stageId, fields: Object.keys(data) });\n return updated;\n }\n\n async reorderStages(pipelineId: string, stageIds: string[]): Promise<IPipelineDocument> {\n const pipeline = await this.get(pipelineId);\n\n // Validate all stageIds exist\n const existingIds = new Set(pipeline.stages.map((s) => s.stageId));\n for (const id of stageIds) {\n if (!existingIds.has(id)) throw new StageNotFoundError(pipelineId, id);\n }\n\n if (stageIds.length !== pipeline.stages.length) {\n throw new InvalidPipelineError(\n `reorderStages must include all ${pipeline.stages.length} stage IDs`,\n pipelineId,\n );\n }\n\n // Build reordered stages with updated order fields\n const stageMap = new Map(pipeline.stages.map((s) => [s.stageId, s]));\n const reorderedStages: IPipelineStage[] = stageIds.map((id, index) => {\n const s = stageMap.get(id)!;\n const plain = (s as unknown as { toObject?(): IPipelineStage }).toObject?.() ?? s;\n return { ...plain, order: index + 1 };\n });\n\n validatePipelineStages(reorderedStages, pipelineId);\n\n const updated = await this.Pipeline.findOneAndUpdate(\n { pipelineId },\n { $set: { stages: reorderedStages } },\n { new: true },\n );\n\n if (!updated) throw new PipelineNotFoundError(pipelineId);\n this.logger.info('Stages reordered in pipeline', { pipelineId });\n return updated;\n }\n}\n","import crypto from 'node:crypto';\nimport type { Model } from 'mongoose';\nimport type { LogAdapter } from '@astralibx/core';\nimport type { ITimelineEntry } from '@astralibx/call-log-types';\nimport { TimelineEntryType } from '@astralibx/call-log-types';\nimport type { ICallLogDocument } from '../schemas/call-log.schema.js';\nimport type { ResolvedOptions } from '@astralibx/call-log-types';\nimport { CallLogNotFoundError, CallLogClosedError } from '../errors/index.js';\n\n// ── Service ───────────────────────────────────────────────────────────────────\n\nexport class TimelineService {\n constructor(\n private CallLog: Model<ICallLogDocument>,\n private logger: LogAdapter,\n private options: ResolvedOptions,\n ) {}\n\n async addNote(\n callLogId: string,\n content: string,\n authorId: string,\n authorName: string,\n ): Promise<ITimelineEntry> {\n const callLog = await this.CallLog.findOne({ callLogId });\n if (!callLog) throw new CallLogNotFoundError(callLogId);\n if (callLog.isClosed) throw new CallLogClosedError(callLogId, 'add note');\n\n const entry: ITimelineEntry = {\n entryId: crypto.randomUUID(),\n type: TimelineEntryType.Note,\n content,\n authorId,\n authorName,\n createdAt: new Date(),\n };\n\n await this.CallLog.updateOne(\n { callLogId },\n {\n $push: {\n timeline: {\n $each: [entry],\n $slice: -this.options.maxTimelineEntries,\n },\n },\n },\n );\n\n this.logger.info('Note added to call log', { callLogId, entryId: entry.entryId });\n return entry;\n }\n\n async addSystemEntry(callLogId: string, content: string): Promise<ITimelineEntry> {\n const callLog = await this.CallLog.findOne({ callLogId });\n if (!callLog) throw new CallLogNotFoundError(callLogId);\n\n const entry: ITimelineEntry = {\n entryId: crypto.randomUUID(),\n type: TimelineEntryType.System,\n content,\n createdAt: new Date(),\n };\n\n await this.CallLog.updateOne(\n { callLogId },\n {\n $push: {\n timeline: {\n $each: [entry],\n $slice: -this.options.maxTimelineEntries,\n },\n },\n },\n );\n\n this.logger.info('System entry added to call log', { callLogId, entryId: entry.entryId });\n return entry;\n }\n\n async getTimeline(\n callLogId: string,\n pagination: { page: number; limit: number },\n ): Promise<{ entries: ITimelineEntry[]; total: number }> {\n const callLog = await this.CallLog.findOne({ callLogId });\n if (!callLog) throw new CallLogNotFoundError(callLogId);\n\n const total = callLog.timeline.length;\n const { page, limit } = pagination;\n const skip = (page - 1) * limit;\n\n // Return in reverse chronological order (newest first), paginated\n const reversed = [...callLog.timeline].reverse();\n const entries = reversed.slice(skip, skip + limit) as ITimelineEntry[];\n\n return { entries, total };\n }\n\n async getContactTimeline(\n externalId: string,\n pagination: { page: number; limit: number },\n ): Promise<{ entries: (ITimelineEntry & { callLogId: string })[]; total: number }> {\n const { page, limit } = pagination;\n const skip = (page - 1) * limit;\n\n const countResult = await this.CallLog.aggregate<{ total: number }>([\n { $match: { 'contactRef.externalId': externalId } },\n { $unwind: '$timeline' },\n { $count: 'total' },\n ]);\n const total = countResult[0]?.total ?? 0;\n\n const results = await this.CallLog.aggregate<ITimelineEntry & { callLogId: string }>([\n { $match: { 'contactRef.externalId': externalId } },\n { $unwind: '$timeline' },\n { $sort: { 'timeline.createdAt': -1 } },\n { $skip: skip },\n { $limit: limit },\n {\n $addFields: {\n 'timeline.callLogId': '$callLogId',\n },\n },\n { $replaceRoot: { newRoot: '$timeline' } },\n ]);\n\n this.logger.info('Contact timeline fetched', { externalId, total, page, limit });\n return { entries: results, total };\n }\n}\n","import crypto from 'node:crypto';\nimport type { Model } from 'mongoose';\nimport type { LogAdapter } from '@astralibx/core';\nimport type {\n ICallLog,\n ITimelineEntry,\n ResolvedOptions,\n CallLogEngineConfig,\n DateRange,\n} from '@astralibx/call-log-types';\nimport { TimelineEntryType, CallPriority } from '@astralibx/call-log-types';\nimport type { ICallLogDocument } from '../schemas/call-log.schema.js';\nimport type { IPipelineDocument } from '../schemas/pipeline.schema.js';\nimport type { TimelineService } from './timeline.service.js';\nimport { CallLogNotFoundError, CallLogClosedError, PipelineNotFoundError } from '../errors/index.js';\nimport { SYSTEM_TIMELINE, SYSTEM_TIMELINE_FN } from '../constants/index.js';\n\n// ── Input types ───────────────────────────────────────────────────────────────\n\nexport interface CreateCallLogInput {\n pipelineId: string;\n contactRef: ICallLog['contactRef'];\n direction: ICallLog['direction'];\n channel: string;\n outcome: string;\n callDate?: Date | string;\n agentId: string;\n priority?: ICallLog['priority'];\n tags?: string[];\n category?: string;\n nextFollowUpDate?: Date;\n durationMinutes?: number;\n isFollowUp?: boolean;\n tenantId?: string;\n metadata?: Record<string, unknown>;\n}\n\nexport interface UpdateCallLogInput {\n priority?: ICallLog['priority'];\n tags?: string[];\n category?: string;\n nextFollowUpDate?: Date;\n durationMinutes?: number;\n channel?: string;\n outcome?: string;\n isFollowUp?: boolean;\n}\n\nexport interface ListCallLogsFilter {\n pipelineId?: string;\n currentStageId?: string;\n agentId?: string;\n tags?: string[];\n category?: string;\n isClosed?: boolean;\n includeDeleted?: boolean;\n contactExternalId?: string;\n contactName?: string;\n contactPhone?: string;\n contactEmail?: string;\n priority?: ICallLog['priority'];\n direction?: ICallLog['direction'];\n channel?: string;\n outcome?: string;\n isFollowUp?: boolean;\n dateRange?: DateRange;\n page?: number;\n limit?: number;\n sort?: Record<string, 1 | -1>;\n}\n\nexport interface ListCallLogsResult {\n callLogs: ICallLogDocument[];\n total: number;\n page: number;\n limit: number;\n}\n\nexport interface BulkChangeStageResult {\n succeeded: string[];\n failed: { callLogId: string; error: string }[];\n total: number;\n}\n\ntype ResolvedHooks = NonNullable<CallLogEngineConfig['hooks']>;\n\n// ── Service ───────────────────────────────────────────────────────────────────\n\nexport class CallLogService {\n constructor(\n private CallLog: Model<ICallLogDocument>,\n private Pipeline: Model<IPipelineDocument>,\n private timeline: TimelineService,\n private logger: LogAdapter,\n private hooks: ResolvedHooks,\n private options: ResolvedOptions,\n ) {}\n\n async create(data: CreateCallLogInput): Promise<ICallLogDocument> {\n const pipeline = await this.Pipeline.findOne({ pipelineId: data.pipelineId, isDeleted: false });\n if (!pipeline) throw new PipelineNotFoundError(data.pipelineId);\n\n const defaultStage = pipeline.stages.find((s) => s.isDefault);\n if (!defaultStage) throw new PipelineNotFoundError(data.pipelineId);\n\n const callLogId = crypto.randomUUID();\n\n const initialEntry: ITimelineEntry = {\n entryId: crypto.randomUUID(),\n type: TimelineEntryType.System,\n content: SYSTEM_TIMELINE.CallCreated,\n createdAt: new Date(),\n };\n\n const timelineEntries: ITimelineEntry[] = [initialEntry];\n\n // If this is a follow-up call, add a system timeline entry\n if (data.isFollowUp) {\n const followUpEntry: ITimelineEntry = {\n entryId: crypto.randomUUID(),\n type: TimelineEntryType.System,\n content: SYSTEM_TIMELINE_FN.followUpCallCreated(),\n createdAt: new Date(),\n };\n timelineEntries.push(followUpEntry);\n }\n\n const callLog = await this.CallLog.create({\n callLogId,\n pipelineId: data.pipelineId,\n currentStageId: defaultStage.stageId,\n contactRef: data.contactRef,\n direction: data.direction,\n callDate: data.callDate ? new Date(data.callDate) : new Date(),\n agentId: data.agentId,\n priority: data.priority ?? CallPriority.Medium,\n tags: data.tags ?? [],\n category: data.category,\n nextFollowUpDate: data.nextFollowUpDate,\n durationMinutes: data.durationMinutes,\n channel: data.channel,\n outcome: data.outcome,\n isFollowUp: data.isFollowUp ?? false,\n timeline: timelineEntries,\n stageHistory: [],\n isClosed: false,\n ...(data.tenantId ? { tenantId: data.tenantId } : {}),\n metadata: data.metadata,\n });\n\n this.logger.info('Call log created', { callLogId, pipelineId: data.pipelineId });\n\n if (this.hooks.onCallCreated) {\n await this.hooks.onCallCreated(callLog as unknown as ICallLog);\n }\n\n return callLog;\n }\n\n async update(callLogId: string, data: UpdateCallLogInput): Promise<ICallLogDocument> {\n const callLog = await this.CallLog.findOne({ callLogId });\n if (!callLog) throw new CallLogNotFoundError(callLogId);\n if (callLog.isClosed) throw new CallLogClosedError(callLogId, 'update');\n\n const setFields: Record<string, unknown> = {};\n const pushEntries: ITimelineEntry[] = [];\n\n if (data.priority !== undefined) setFields.priority = data.priority;\n if (data.tags !== undefined) setFields.tags = data.tags;\n if (data.category !== undefined) setFields.category = data.category;\n if (data.durationMinutes !== undefined) setFields.durationMinutes = data.durationMinutes;\n if (data.channel !== undefined) setFields.channel = data.channel;\n if (data.outcome !== undefined) setFields.outcome = data.outcome;\n if (data.isFollowUp !== undefined) setFields.isFollowUp = data.isFollowUp;\n\n if (data.nextFollowUpDate !== undefined) {\n const prevDate = callLog.nextFollowUpDate?.toISOString();\n const newDate = data.nextFollowUpDate?.toISOString();\n if (prevDate !== newDate) {\n setFields.nextFollowUpDate = data.nextFollowUpDate;\n if (data.nextFollowUpDate) {\n const followUpEntry: ITimelineEntry = {\n entryId: crypto.randomUUID(),\n type: TimelineEntryType.FollowUpSet,\n content: SYSTEM_TIMELINE_FN.followUpSet(new Date(data.nextFollowUpDate).toISOString()),\n createdAt: new Date(),\n };\n pushEntries.push(followUpEntry);\n }\n }\n }\n\n const updateOp: Record<string, unknown> = { $set: setFields };\n if (pushEntries.length > 0) {\n updateOp.$push = {\n timeline: {\n $each: pushEntries,\n $slice: -this.options.maxTimelineEntries,\n },\n };\n }\n\n const updated = await this.CallLog.findOneAndUpdate(\n { callLogId },\n updateOp,\n { new: true },\n );\n\n if (!updated) throw new CallLogNotFoundError(callLogId);\n this.logger.info('Call log updated', { callLogId, fields: Object.keys(data) });\n return updated;\n }\n\n async list(filter: ListCallLogsFilter = {}): Promise<ListCallLogsResult> {\n const query: Record<string, unknown> = {};\n\n if (filter.pipelineId) query.pipelineId = filter.pipelineId;\n if (filter.currentStageId) query.currentStageId = filter.currentStageId;\n if (filter.agentId) query.agentId = filter.agentId;\n if (filter.tags && filter.tags.length > 0) query.tags = { $in: filter.tags };\n if (filter.category) query.category = filter.category;\n if (filter.isClosed !== undefined) query.isClosed = filter.isClosed;\n if (filter.contactExternalId) query['contactRef.externalId'] = filter.contactExternalId;\n if (filter.contactName) query['contactRef.displayName'] = { $regex: filter.contactName, $options: 'i' };\n if (filter.contactPhone) query['contactRef.phone'] = { $regex: `^${filter.contactPhone}` };\n if (filter.contactEmail) query['contactRef.email'] = filter.contactEmail;\n if (filter.priority) query.priority = filter.priority;\n if (filter.direction) query.direction = filter.direction;\n if (filter.channel) query.channel = filter.channel;\n if (filter.outcome) query.outcome = filter.outcome;\n if (filter.isFollowUp !== undefined) query.isFollowUp = filter.isFollowUp;\n\n // Exclude deleted by default unless includeDeleted is explicitly true\n if (!filter.includeDeleted) query.isDeleted = { $ne: true };\n\n if (filter.dateRange?.from || filter.dateRange?.to) {\n const dateFilter: Record<string, unknown> = {};\n if (filter.dateRange.from) dateFilter.$gte = new Date(filter.dateRange.from);\n if (filter.dateRange.to) dateFilter.$lte = new Date(filter.dateRange.to);\n query.callDate = dateFilter;\n }\n\n const page = filter.page ?? 1;\n const limit = filter.limit ?? 20;\n const skip = (page - 1) * limit;\n const sort = filter.sort ?? { callDate: -1 };\n\n const [callLogs, total] = await Promise.all([\n this.CallLog.find(query).sort(sort).skip(skip).limit(limit),\n this.CallLog.countDocuments(query),\n ]);\n\n return { callLogs, total, page, limit };\n }\n\n async get(callLogId: string): Promise<ICallLogDocument> {\n const callLog = await this.CallLog.findOne({ callLogId, isDeleted: { $ne: true } });\n if (!callLog) throw new CallLogNotFoundError(callLogId);\n return callLog;\n }\n\n async getByContact(externalId: string): Promise<ICallLogDocument[]> {\n return this.CallLog.find({ 'contactRef.externalId': externalId, isDeleted: { $ne: true } }).sort({ callDate: -1 });\n }\n}\n","import crypto from 'node:crypto';\nimport type { Model } from 'mongoose';\nimport type { LogAdapter } from '@astralibx/core';\nimport type {\n ICallLog,\n ITimelineEntry,\n IStageChange,\n ResolvedOptions,\n CallLogEngineConfig,\n DateRange,\n} from '@astralibx/call-log-types';\nimport { TimelineEntryType } from '@astralibx/call-log-types';\nimport type { ICallLogDocument } from '../schemas/call-log.schema.js';\nimport type { IPipelineDocument } from '../schemas/pipeline.schema.js';\nimport type { TimelineService } from './timeline.service.js';\nimport { CallLogNotFoundError, CallLogClosedError, PipelineNotFoundError, StageNotFoundError } from '../errors/index.js';\nimport { SYSTEM_TIMELINE, SYSTEM_TIMELINE_FN } from '../constants/index.js';\nimport type { BulkChangeStageResult } from './call-log.service.js';\n\n// ── Re-export for convenience ─────────────────────────────────────────────────\nexport type { BulkChangeStageResult };\n\ntype ResolvedHooks = NonNullable<CallLogEngineConfig['hooks']>;\n\n// ── Service ───────────────────────────────────────────────────────────────────\n\nexport class CallLogLifecycleService {\n constructor(\n private CallLog: Model<ICallLogDocument>,\n private Pipeline: Model<IPipelineDocument>,\n private timeline: TimelineService,\n private logger: LogAdapter,\n private hooks: ResolvedHooks,\n private options: ResolvedOptions,\n ) {}\n\n async changeStage(callLogId: string, newStageId: string, agentId: string): Promise<ICallLogDocument> {\n // First read current state for optimistic lock value and computation\n const callLog = await this.CallLog.findOne({ callLogId });\n if (!callLog) throw new CallLogNotFoundError(callLogId);\n if (callLog.isClosed) throw new CallLogClosedError(callLogId, 'change stage');\n\n const currentStageId = callLog.currentStageId;\n\n // Lookup pipeline and validate stages\n const pipeline = await this.Pipeline.findOne({ pipelineId: callLog.pipelineId, isDeleted: false });\n if (!pipeline) throw new PipelineNotFoundError(callLog.pipelineId);\n\n const currentStage = pipeline.stages.find((s) => s.stageId === currentStageId);\n if (!currentStage) throw new StageNotFoundError(callLog.pipelineId, currentStageId);\n\n const newStage = pipeline.stages.find((s) => s.stageId === newStageId);\n if (!newStage) throw new StageNotFoundError(callLog.pipelineId, newStageId);\n\n // Compute time in current stage\n const now = new Date();\n const lastHistory = callLog.stageHistory[callLog.stageHistory.length - 1];\n const stageStartTime = lastHistory?.changedAt?.getTime() ?? (callLog as unknown as { createdAt: Date }).createdAt?.getTime() ?? now.getTime();\n const timeInStageMs = now.getTime() - stageStartTime;\n\n const stageChangeEntry: ITimelineEntry = {\n entryId: crypto.randomUUID(),\n type: TimelineEntryType.StageChange,\n content: SYSTEM_TIMELINE_FN.stageChanged(currentStage.name, newStage.name),\n fromStageId: currentStageId,\n fromStageName: currentStage.name,\n toStageId: newStageId,\n toStageName: newStage.name,\n authorId: agentId,\n createdAt: now,\n };\n\n const stageHistoryEntry: IStageChange = {\n fromStageId: currentStageId,\n toStageId: newStageId,\n fromStageName: currentStage.name,\n toStageName: newStage.name,\n changedBy: agentId,\n changedAt: now,\n timeInStageMs,\n };\n\n const isTerminal = newStage.isTerminal;\n\n const closeFields: Record<string, unknown> = isTerminal\n ? { currentStageId: newStageId, isClosed: true, closedAt: now }\n : { currentStageId: newStageId };\n\n // Atomic update with optimistic concurrency check\n const result = await this.CallLog.findOneAndUpdate(\n { callLogId, currentStageId },\n {\n $set: closeFields,\n $push: {\n stageHistory: stageHistoryEntry,\n timeline: stageChangeEntry,\n },\n },\n { new: true },\n );\n\n if (!result) {\n // Concurrent change detected\n throw new CallLogClosedError(callLogId, 'change stage (concurrent modification detected)');\n }\n\n this.logger.info('Call log stage changed', { callLogId, from: currentStageId, to: newStageId });\n\n if (isTerminal && this.hooks.onCallClosed) {\n await this.hooks.onCallClosed(result as unknown as ICallLog);\n }\n\n if (this.hooks.onStageChanged) {\n await this.hooks.onStageChanged(result as unknown as ICallLog, currentStage.name, newStage.name);\n }\n\n return result;\n }\n\n async assign(callLogId: string, agentId: string, assignedBy: string): Promise<ICallLogDocument> {\n const callLog = await this.CallLog.findOne({ callLogId });\n if (!callLog) throw new CallLogNotFoundError(callLogId);\n\n const previousAgentId = callLog.agentId?.toString();\n\n const assignmentEntry: ITimelineEntry = {\n entryId: crypto.randomUUID(),\n type: TimelineEntryType.Assignment,\n content: previousAgentId\n ? SYSTEM_TIMELINE_FN.callReassigned(previousAgentId, agentId)\n : SYSTEM_TIMELINE_FN.callAssigned(agentId),\n toAgentId: agentId,\n fromAgentId: previousAgentId,\n authorId: assignedBy,\n createdAt: new Date(),\n };\n\n const updated = await this.CallLog.findOneAndUpdate(\n { callLogId },\n {\n $set: { agentId, assignedBy },\n $push: {\n timeline: {\n $each: [assignmentEntry],\n $slice: -this.options.maxTimelineEntries,\n },\n },\n },\n { new: true },\n );\n\n if (!updated) throw new CallLogNotFoundError(callLogId);\n this.logger.info('Call log assigned', { callLogId, agentId, assignedBy });\n\n if (this.hooks.onCallAssigned) {\n await this.hooks.onCallAssigned(updated as unknown as ICallLog, previousAgentId);\n }\n\n return updated;\n }\n\n async close(callLogId: string, agentId: string): Promise<ICallLogDocument> {\n const callLog = await this.CallLog.findOne({ callLogId });\n if (!callLog) throw new CallLogNotFoundError(callLogId);\n if (callLog.isClosed) throw new CallLogClosedError(callLogId, 'close');\n\n const now = new Date();\n const closeEntry: ITimelineEntry = {\n entryId: crypto.randomUUID(),\n type: TimelineEntryType.System,\n content: SYSTEM_TIMELINE.CallClosed,\n authorId: agentId,\n createdAt: now,\n };\n\n const updated = await this.CallLog.findOneAndUpdate(\n { callLogId },\n {\n $set: { isClosed: true, closedAt: now },\n $push: {\n timeline: {\n $each: [closeEntry],\n $slice: -this.options.maxTimelineEntries,\n },\n },\n },\n { new: true },\n );\n\n if (!updated) throw new CallLogNotFoundError(callLogId);\n this.logger.info('Call log closed', { callLogId, agentId });\n\n if (this.hooks.onCallClosed) {\n await this.hooks.onCallClosed(updated as unknown as ICallLog);\n }\n\n return updated;\n }\n\n async reopen(callLogId: string, agentId: string): Promise<ICallLogDocument> {\n const callLog = await this.CallLog.findOne({ callLogId });\n if (!callLog) throw new CallLogNotFoundError(callLogId);\n if (!callLog.isClosed) throw new CallLogClosedError(callLogId, 'reopen');\n\n const now = new Date();\n const reopenEntry: ITimelineEntry = {\n entryId: crypto.randomUUID(),\n type: TimelineEntryType.System,\n content: SYSTEM_TIMELINE.CallReopened,\n authorId: agentId,\n createdAt: now,\n };\n\n const updated = await this.CallLog.findOneAndUpdate(\n { callLogId },\n {\n $set: { isClosed: false, closedAt: undefined },\n $push: {\n timeline: {\n $each: [reopenEntry],\n $slice: -this.options.maxTimelineEntries,\n },\n },\n },\n { new: true },\n );\n\n if (!updated) throw new CallLogNotFoundError(callLogId);\n this.logger.info('Call log reopened', { callLogId, agentId });\n\n return updated;\n }\n\n async bulkChangeStage(\n callLogIds: string[],\n newStageId: string,\n agentId: string,\n ): Promise<BulkChangeStageResult> {\n const succeeded: string[] = [];\n const failed: { callLogId: string; error: string }[] = [];\n\n for (const callLogId of callLogIds) {\n try {\n await this.changeStage(callLogId, newStageId, agentId);\n succeeded.push(callLogId);\n } catch (err) {\n failed.push({\n callLogId,\n error: err instanceof Error ? err.message : String(err),\n });\n }\n }\n\n this.logger.info('Bulk stage change completed', {\n total: callLogIds.length,\n succeeded: succeeded.length,\n failed: failed.length,\n });\n\n return { succeeded, failed, total: callLogIds.length };\n }\n\n async getFollowUpsDue(agentId?: string, dateRange?: DateRange): Promise<ICallLogDocument[]> {\n const now = new Date();\n const query: Record<string, unknown> = {\n nextFollowUpDate: { $lte: now },\n isClosed: false,\n followUpNotifiedAt: null,\n isDeleted: { $ne: true },\n };\n\n if (agentId) query.agentId = agentId;\n\n if (dateRange?.from || dateRange?.to) {\n const dateFilter: Record<string, unknown> = {};\n if (dateRange.from) dateFilter.$gte = new Date(dateRange.from);\n if (dateRange.to) dateFilter.$lte = new Date(dateRange.to);\n // Override the nextFollowUpDate filter to include the range\n query.nextFollowUpDate = { ...(query.nextFollowUpDate as object), ...dateFilter };\n }\n\n return this.CallLog.find(query).sort({ nextFollowUpDate: 1 });\n }\n\n async softDelete(callLogId: string, agentId?: string, agentName?: string): Promise<ICallLogDocument> {\n const callLog = await this.CallLog.findOne({ callLogId });\n if (!callLog) throw new CallLogNotFoundError(callLogId);\n\n const now = new Date();\n const deleteEntry: ITimelineEntry = {\n entryId: crypto.randomUUID(),\n type: TimelineEntryType.System,\n content: agentName\n ? SYSTEM_TIMELINE_FN.callDeleted(agentName)\n : SYSTEM_TIMELINE_FN.callDeleted(agentId ?? 'unknown'),\n authorId: agentId,\n createdAt: now,\n };\n\n const updated = await this.CallLog.findOneAndUpdate(\n { callLogId },\n {\n $set: { isDeleted: true, deletedAt: now },\n $push: {\n timeline: {\n $each: [deleteEntry],\n $slice: -this.options.maxTimelineEntries,\n },\n },\n },\n { new: true },\n );\n\n if (!updated) throw new CallLogNotFoundError(callLogId);\n this.logger.info('Call log soft deleted', { callLogId });\n return updated;\n }\n}\n","import type { Model } from 'mongoose';\nimport type { LogAdapter } from '@astralibx/core';\nimport type {\n AgentCallStats,\n DailyReport,\n OverallCallReport,\n DateRange,\n AgentInfo,\n DashboardStats,\n ChannelDistribution,\n OutcomeDistribution,\n} from '@astralibx/call-log-types';\nimport type { ICallLogDocument } from '../schemas/call-log.schema.js';\nimport type { IPipelineDocument } from '../schemas/pipeline.schema.js';\n\n// ── Internal aggregate result helpers ────────────────────────────────────────\n\ninterface AggIdCount {\n _id: string | number | null;\n count: number;\n}\n\ninterface AgentAggResult {\n _id: string;\n totalCalls: number;\n callsClosed: number;\n followUpsCompleted: number;\n overdueFollowUps: number;\n pipelineCounts: { pipelineId: string; count: number }[];\n}\n\ninterface WeeklySummary {\n week: string;\n year: number;\n totalCalls: number;\n closedCalls: number;\n}\n\nexport interface TeamStats {\n teamId: string | null;\n agentStats: AgentCallStats[];\n totalCalls: number;\n}\n\n// ── Service ───────────────────────────────────────────────────────────────────\n\nexport class AnalyticsService {\n constructor(\n private CallLog: Model<ICallLogDocument>,\n private Pipeline: Model<IPipelineDocument>,\n private logger: LogAdapter,\n private resolveAgent?: (agentId: string) => Promise<AgentInfo | null>,\n ) {}\n\n private async getAgentName(agentId: string): Promise<string> {\n if (!this.resolveAgent) return String(agentId);\n try {\n const agent = await this.resolveAgent(String(agentId));\n return agent?.displayName ?? String(agentId);\n } catch {\n return String(agentId);\n }\n }\n\n private buildDateMatch(dateRange: DateRange, field = 'callDate'): Record<string, unknown> {\n if (!dateRange.from && !dateRange.to) return {};\n const dateFilter: Record<string, unknown> = {};\n if (dateRange.from) dateFilter.$gte = new Date(dateRange.from);\n if (dateRange.to) dateFilter.$lte = new Date(dateRange.to);\n return { [field]: dateFilter };\n }\n\n async getAgentStats(agentId: string, dateRange: DateRange): Promise<AgentCallStats> {\n const now = new Date();\n const matchStage: Record<string, unknown> = {\n agentId,\n isDeleted: { $ne: true },\n ...this.buildDateMatch(dateRange),\n };\n\n const pipeline = [\n { $match: matchStage },\n {\n $group: {\n _id: '$agentId',\n totalCalls: { $sum: 1 },\n callsClosed: {\n $sum: { $cond: [{ $eq: ['$isClosed', true] }, 1, 0] },\n },\n followUpsCompleted: {\n $sum: {\n $cond: [\n {\n $and: [\n { $ne: ['$nextFollowUpDate', null] },\n { $eq: ['$isClosed', true] },\n ],\n },\n 1,\n 0,\n ],\n },\n },\n overdueFollowUps: {\n $sum: {\n $cond: [\n {\n $and: [\n { $ne: ['$nextFollowUpDate', null] },\n { $lt: ['$nextFollowUpDate', now] },\n { $eq: ['$isClosed', false] },\n ],\n },\n 1,\n 0,\n ],\n },\n },\n },\n },\n ];\n\n const [results, pipelineCounts] = await Promise.all([\n this.CallLog.aggregate<AgentAggResult>(pipeline),\n this.CallLog.aggregate<{ _id: string; count: number }>([\n { $match: matchStage },\n { $group: { _id: '$pipelineId', count: { $sum: 1 } } },\n ]),\n ]);\n\n const stat = results[0];\n const agentName = await this.getAgentName(agentId);\n if (!stat) {\n return {\n agentId,\n agentName,\n totalCalls: 0,\n avgCallsPerDay: 0,\n followUpsCompleted: 0,\n overdueFollowUps: 0,\n callsByPipeline: [],\n callsClosed: 0,\n closeRate: 0,\n };\n }\n\n // Compute avgCallsPerDay\n let avgCallsPerDay = 0;\n if (dateRange.from && dateRange.to) {\n const days = Math.max(\n 1,\n Math.ceil((new Date(dateRange.to).getTime() - new Date(dateRange.from).getTime()) / 86_400_000),\n );\n avgCallsPerDay = Math.round((stat.totalCalls / days) * 100) / 100;\n }\n\n const callsByPipeline = pipelineCounts.map((p) => ({\n pipelineId: p._id,\n pipelineName: p._id,\n count: p.count,\n }));\n\n return {\n agentId,\n agentName,\n totalCalls: stat.totalCalls,\n avgCallsPerDay,\n followUpsCompleted: stat.followUpsCompleted,\n overdueFollowUps: stat.overdueFollowUps,\n callsByPipeline,\n callsClosed: stat.callsClosed,\n closeRate: stat.totalCalls > 0\n ? Math.round((stat.callsClosed / stat.totalCalls) * 10000) / 100\n : 0,\n };\n }\n\n async getAgentLeaderboard(dateRange: DateRange): Promise<AgentCallStats[]> {\n const now = new Date();\n const matchStage: Record<string, unknown> = {\n isDeleted: { $ne: true },\n ...this.buildDateMatch(dateRange),\n };\n\n const pipeline = [\n { $match: matchStage },\n {\n $group: {\n _id: '$agentId',\n totalCalls: { $sum: 1 },\n callsClosed: {\n $sum: { $cond: [{ $eq: ['$isClosed', true] }, 1, 0] },\n },\n followUpsCompleted: {\n $sum: {\n $cond: [\n {\n $and: [\n { $ne: ['$nextFollowUpDate', null] },\n { $eq: ['$isClosed', true] },\n ],\n },\n 1,\n 0,\n ],\n },\n },\n overdueFollowUps: {\n $sum: {\n $cond: [\n {\n $and: [\n { $ne: ['$nextFollowUpDate', null] },\n { $lt: ['$nextFollowUpDate', now] },\n { $eq: ['$isClosed', false] },\n ],\n },\n 1,\n 0,\n ],\n },\n },\n },\n },\n { $sort: { totalCalls: -1 as const } },\n ];\n\n const results = await this.CallLog.aggregate<AgentAggResult>(pipeline);\n\n return Promise.all(results.map(async (stat) => ({\n agentId: String(stat._id),\n agentName: await this.getAgentName(String(stat._id)),\n totalCalls: stat.totalCalls,\n avgCallsPerDay: 0,\n followUpsCompleted: stat.followUpsCompleted,\n overdueFollowUps: stat.overdueFollowUps,\n callsByPipeline: [],\n callsClosed: stat.callsClosed,\n closeRate: stat.totalCalls > 0\n ? Math.round((stat.callsClosed / stat.totalCalls) * 10000) / 100\n : 0,\n })));\n }\n\n async getTeamStats(teamId?: string, dateRange: DateRange = {}): Promise<TeamStats> {\n const now = new Date();\n const matchStage: Record<string, unknown> = {\n isDeleted: { $ne: true },\n ...this.buildDateMatch(dateRange),\n };\n\n // Aggregate agent stats without filtering by team (team resolution requires external agent collection)\n const pipeline = [\n { $match: matchStage },\n {\n $group: {\n _id: '$agentId',\n totalCalls: { $sum: 1 },\n callsClosed: {\n $sum: { $cond: [{ $eq: ['$isClosed', true] }, 1, 0] },\n },\n followUpsCompleted: {\n $sum: {\n $cond: [\n {\n $and: [\n { $ne: ['$nextFollowUpDate', null] },\n { $eq: ['$isClosed', true] },\n ],\n },\n 1,\n 0,\n ],\n },\n },\n overdueFollowUps: {\n $sum: {\n $cond: [\n {\n $and: [\n { $ne: ['$nextFollowUpDate', null] },\n { $lt: ['$nextFollowUpDate', now] },\n { $eq: ['$isClosed', false] },\n ],\n },\n 1,\n 0,\n ],\n },\n },\n },\n },\n ];\n\n const results = await this.CallLog.aggregate<AgentAggResult>(pipeline);\n\n const agentStats: AgentCallStats[] = await Promise.all(results.map(async (stat) => ({\n agentId: String(stat._id),\n agentName: await this.getAgentName(String(stat._id)),\n totalCalls: stat.totalCalls,\n avgCallsPerDay: 0,\n followUpsCompleted: stat.followUpsCompleted,\n overdueFollowUps: stat.overdueFollowUps,\n callsByPipeline: [],\n callsClosed: stat.callsClosed,\n closeRate: stat.totalCalls > 0\n ? Math.round((stat.callsClosed / stat.totalCalls) * 10000) / 100\n : 0,\n })));\n\n const totalCalls = agentStats.reduce((sum, a) => sum + a.totalCalls, 0);\n\n return { teamId: teamId ?? null, agentStats, totalCalls };\n }\n\n async getDailyReport(dateRange: DateRange, agentId?: string): Promise<DailyReport[]> {\n const matchStage: Record<string, unknown> = {\n isDeleted: { $ne: true },\n ...this.buildDateMatch(dateRange),\n };\n if (agentId) matchStage['agentId'] = agentId;\n\n const [dailyAgg, directionAgg, pipelineAgg, agentAgg] = await Promise.all([\n this.CallLog.aggregate<{ _id: string; count: number }>([\n { $match: matchStage },\n {\n $group: {\n _id: { $dateToString: { format: '%Y-%m-%d', date: '$callDate' } },\n count: { $sum: 1 },\n },\n },\n { $sort: { _id: 1 as const } },\n ]),\n this.CallLog.aggregate<{ _id: { date: string; direction: string }; count: number }>([\n { $match: matchStage },\n {\n $group: {\n _id: {\n date: { $dateToString: { format: '%Y-%m-%d', date: '$callDate' } },\n direction: '$direction',\n },\n count: { $sum: 1 },\n },\n },\n ]),\n this.CallLog.aggregate<{ _id: { date: string; pipelineId: string }; count: number }>([\n { $match: matchStage },\n {\n $group: {\n _id: {\n date: { $dateToString: { format: '%Y-%m-%d', date: '$callDate' } },\n pipelineId: '$pipelineId',\n },\n count: { $sum: 1 },\n },\n },\n ]),\n this.CallLog.aggregate<{ _id: { date: string; agentId: string }; count: number }>([\n { $match: matchStage },\n {\n $group: {\n _id: {\n date: { $dateToString: { format: '%Y-%m-%d', date: '$callDate' } },\n agentId: { $toString: '$agentId' },\n },\n count: { $sum: 1 },\n },\n },\n ]),\n ]);\n\n // Build lookup maps\n const directionByDate = new Map<string, { direction: string; count: number }[]>();\n for (const r of directionAgg) {\n const date = r._id.date;\n if (!directionByDate.has(date)) directionByDate.set(date, []);\n directionByDate.get(date)!.push({ direction: r._id.direction, count: r.count });\n }\n\n const pipelineByDate = new Map<string, { pipelineId: string; pipelineName: string; count: number }[]>();\n for (const r of pipelineAgg) {\n const date = r._id.date;\n if (!pipelineByDate.has(date)) pipelineByDate.set(date, []);\n pipelineByDate.get(date)!.push({ pipelineId: r._id.pipelineId, pipelineName: r._id.pipelineId, count: r.count });\n }\n\n const agentByDate = new Map<string, { agentId: string; agentName: string; count: number }[]>();\n await Promise.all(agentAgg.map(async (r) => {\n const date = r._id.date;\n if (!agentByDate.has(date)) agentByDate.set(date, []);\n const agentName = await this.getAgentName(r._id.agentId);\n agentByDate.get(date)!.push({ agentId: r._id.agentId, agentName, count: r.count });\n }));\n\n return dailyAgg.map((d) => ({\n date: d._id,\n total: d.count,\n byDirection: directionByDate.get(d._id) ?? [],\n byPipeline: pipelineByDate.get(d._id) ?? [],\n byAgent: agentByDate.get(d._id) ?? [],\n }));\n }\n\n async getDashboardStats(): Promise<DashboardStats> {\n const now = new Date();\n const midnight = new Date(now.getFullYear(), now.getMonth(), now.getDate());\n\n const [openCalls, closedToday, overdueFollowUps, callsToday] = await Promise.all([\n this.CallLog.countDocuments({ isClosed: false, isDeleted: { $ne: true } }),\n this.CallLog.countDocuments({ closedAt: { $gte: midnight }, isDeleted: { $ne: true } }),\n this.CallLog.countDocuments({\n nextFollowUpDate: { $lt: now },\n isClosed: false,\n isDeleted: { $ne: true },\n }),\n this.CallLog.countDocuments({ callDate: { $gte: midnight }, isDeleted: { $ne: true } }),\n ]);\n\n return {\n openCalls,\n closedToday,\n overdueFollowUps,\n totalAgents: 0,\n callsToday,\n };\n }\n\n async getWeeklyTrends(weeks: number): Promise<WeeklySummary[]> {\n const now = new Date();\n const from = new Date(now.getTime() - weeks * 7 * 24 * 60 * 60 * 1000);\n\n const results = await this.CallLog.aggregate<WeeklySummary>([\n { $match: { callDate: { $gte: from, $lte: now }, isDeleted: { $ne: true } } },\n {\n $group: {\n _id: {\n week: { $isoWeek: '$callDate' },\n year: { $isoWeekYear: '$callDate' },\n },\n totalCalls: { $sum: 1 },\n closedCalls: {\n $sum: { $cond: [{ $eq: ['$isClosed', true] }, 1, 0] },\n },\n },\n },\n { $sort: { '_id.year': 1 as const, '_id.week': 1 as const } },\n {\n $project: {\n _id: 0,\n week: { $toString: '$_id.week' },\n year: '$_id.year',\n totalCalls: 1,\n closedCalls: 1,\n },\n },\n ]);\n\n return results;\n }\n\n async getOverallReport(dateRange: DateRange): Promise<OverallCallReport> {\n const matchStage: Record<string, unknown> = {\n isDeleted: { $ne: true },\n ...this.buildDateMatch(dateRange),\n };\n\n const [summaryAgg, tagAgg, categoryAgg, peakHoursAgg, followUpAgg, channelAgg, outcomeAgg] = await Promise.all([\n this.CallLog.aggregate<{\n _id: null;\n totalCalls: number;\n closedCalls: number;\n avgTimeToCloseMs: number;\n }>([\n { $match: matchStage },\n {\n $group: {\n _id: null,\n totalCalls: { $sum: 1 },\n closedCalls: {\n $sum: { $cond: [{ $eq: ['$isClosed', true] }, 1, 0] },\n },\n avgTimeToCloseMs: {\n $avg: {\n $cond: [\n { $and: [{ $eq: ['$isClosed', true] }, { $ne: ['$closedAt', null] }] },\n { $subtract: ['$closedAt', '$createdAt'] },\n null,\n ],\n },\n },\n },\n },\n ]),\n this.CallLog.aggregate<AggIdCount>([\n { $match: { ...matchStage, tags: { $exists: true, $ne: [] } } },\n { $unwind: '$tags' },\n { $group: { _id: '$tags', count: { $sum: 1 } } },\n { $sort: { count: -1 as const } },\n ]),\n this.CallLog.aggregate<AggIdCount>([\n { $match: { ...matchStage, category: { $exists: true, $ne: null } } },\n { $group: { _id: '$category', count: { $sum: 1 } } },\n { $sort: { count: -1 as const } },\n ]),\n this.CallLog.aggregate<AggIdCount>([\n { $match: matchStage },\n { $group: { _id: { $hour: '$callDate' }, count: { $sum: 1 } } },\n { $sort: { _id: 1 as const } },\n ]),\n this.CallLog.aggregate<{ _id: null; total: number; withFollowUp: number; completed: number }>([\n { $match: matchStage },\n {\n $group: {\n _id: null,\n total: { $sum: 1 },\n withFollowUp: {\n $sum: { $cond: [{ $eq: ['$isFollowUp', true] }, 1, 0] },\n },\n completed: {\n $sum: {\n $cond: [\n {\n $and: [\n { $eq: ['$isFollowUp', true] },\n { $eq: ['$isClosed', true] },\n ],\n },\n 1,\n 0,\n ],\n },\n },\n },\n },\n ]),\n this.CallLog.aggregate<AggIdCount>([\n { $match: matchStage },\n { $group: { _id: '$channel', count: { $sum: 1 } } },\n { $sort: { count: -1 as const } },\n ]),\n this.CallLog.aggregate<AggIdCount>([\n { $match: matchStage },\n { $group: { _id: '$outcome', count: { $sum: 1 } } },\n { $sort: { count: -1 as const } },\n ]),\n ]);\n\n const summary = summaryAgg[0] ?? { totalCalls: 0, closedCalls: 0, avgTimeToCloseMs: 0 };\n const followUp = followUpAgg[0] ?? { total: 0, withFollowUp: 0, completed: 0 };\n\n const followUpComplianceRate = followUp.withFollowUp > 0\n ? Math.round((followUp.completed / followUp.withFollowUp) * 10000) / 100\n : 0;\n\n const followUpCalls = followUp.withFollowUp;\n const followUpRatio =\n followUp.total > 0 ? Math.round((followUp.withFollowUp / followUp.total) * 10000) / 100 : 0;\n\n const channelDistribution: ChannelDistribution[] = channelAgg.map((r) => ({\n channel: r._id != null ? String(r._id) : 'unknown',\n count: r.count,\n }));\n\n const outcomeDistribution: OutcomeDistribution[] = outcomeAgg.map((r) => ({\n outcome: r._id != null ? String(r._id) : 'unknown',\n count: r.count,\n }));\n\n return {\n totalCalls: summary.totalCalls,\n closedCalls: summary.closedCalls,\n avgTimeToCloseMs: Math.round(summary.avgTimeToCloseMs ?? 0),\n followUpComplianceRate,\n tagDistribution: tagAgg.map((r) => ({ tag: String(r._id), count: r.count })),\n categoryDistribution: categoryAgg.map((r) => ({ category: String(r._id), count: r.count })),\n peakCallHours: peakHoursAgg.map((r) => ({ hour: Number(r._id), count: r.count })),\n channelDistribution,\n outcomeDistribution,\n followUpCalls,\n followUpRatio,\n };\n }\n}\n","import type { Model } from 'mongoose';\nimport type { LogAdapter } from '@astralibx/core';\nimport type {\n PipelineReport,\n PipelineFunnel,\n DateRange,\n AgentInfo,\n ChannelDistribution,\n OutcomeDistribution,\n FollowUpStats,\n} from '@astralibx/call-log-types';\nimport type { ICallLogDocument } from '../schemas/call-log.schema.js';\nimport type { IPipelineDocument } from '../schemas/pipeline.schema.js';\n\n// ── Internal aggregate result helpers ────────────────────────────────────────\n\ninterface AggIdCount {\n _id: string | number | null;\n count: number;\n}\n\ninterface PipelineStageAggResult {\n stageId: string;\n count: number;\n totalTimeMs: number;\n}\n\n// ── Service ───────────────────────────────────────────────────────────────────\n\nexport class PipelineAnalyticsService {\n constructor(\n private CallLog: Model<ICallLogDocument>,\n private Pipeline: Model<IPipelineDocument>,\n private logger: LogAdapter,\n private resolveAgent?: (agentId: string) => Promise<AgentInfo | null>,\n private tenantId?: string,\n ) {}\n\n private buildDateMatch(dateRange: DateRange, field = 'callDate'): Record<string, unknown> {\n if (!dateRange.from && !dateRange.to) return {};\n const dateFilter: Record<string, unknown> = {};\n if (dateRange.from) dateFilter.$gte = new Date(dateRange.from);\n if (dateRange.to) dateFilter.$lte = new Date(dateRange.to);\n return { [field]: dateFilter };\n }\n\n async getPipelineStats(pipelineId: string, dateRange: DateRange): Promise<PipelineReport> {\n const pipeline = await this.Pipeline.findOne({ pipelineId, isDeleted: false });\n const pipelineName = pipeline?.name ?? pipelineId;\n const stages = pipeline?.stages ?? [];\n\n const matchStage: Record<string, unknown> = {\n pipelineId,\n isDeleted: { $ne: true },\n ...this.buildDateMatch(dateRange),\n };\n\n const [totalResult, stageAgg] = await Promise.all([\n this.CallLog.countDocuments(matchStage),\n this.CallLog.aggregate<PipelineStageAggResult>([\n { $match: matchStage },\n { $unwind: { path: '$stageHistory', preserveNullAndEmptyArrays: false } },\n {\n $group: {\n _id: '$stageHistory.toStageId',\n count: { $sum: 1 },\n totalTimeMs: { $sum: '$stageHistory.timeInStageMs' },\n },\n },\n {\n $project: {\n stageId: '$_id',\n count: 1,\n totalTimeMs: 1,\n },\n },\n ]),\n ]);\n\n const totalCalls = totalResult;\n const stageMap = new Map(stageAgg.map((s) => [s.stageId, s]));\n\n let bottleneckStage: string | null = null;\n let maxAvgTime = 0;\n\n const stageStats = stages.map((s) => {\n const agg = stageMap.get(s.stageId);\n const count = agg?.count ?? 0;\n const avgTimeMs = count > 0 ? Math.round((agg?.totalTimeMs ?? 0) / count) : 0;\n const conversionRate = totalCalls > 0 ? Math.round((count / totalCalls) * 10000) / 100 : 0;\n\n if (avgTimeMs > maxAvgTime) {\n maxAvgTime = avgTimeMs;\n bottleneckStage = s.stageId;\n }\n\n return {\n stageId: s.stageId,\n stageName: s.name,\n count,\n avgTimeMs,\n conversionRate,\n };\n });\n\n this.logger.info('Pipeline stats computed', { pipelineId, totalCalls });\n\n return {\n pipelineId,\n pipelineName,\n totalCalls,\n stages: stageStats,\n bottleneckStage,\n };\n }\n\n async getPipelineFunnel(pipelineId: string, dateRange: DateRange): Promise<PipelineFunnel> {\n const pipeline = await this.Pipeline.findOne({ pipelineId, isDeleted: false });\n const pipelineName = pipeline?.name ?? pipelineId;\n const stages = pipeline?.stages ?? [];\n\n const matchStage: Record<string, unknown> = {\n pipelineId,\n isDeleted: { $ne: true },\n ...this.buildDateMatch(dateRange),\n };\n\n const [enteredAgg, exitedAgg] = await Promise.all([\n this.CallLog.aggregate<AggIdCount>([\n { $match: matchStage },\n { $unwind: '$stageHistory' },\n { $group: { _id: '$stageHistory.toStageId', count: { $sum: 1 } } },\n ]),\n this.CallLog.aggregate<AggIdCount>([\n { $match: matchStage },\n { $unwind: '$stageHistory' },\n { $group: { _id: '$stageHistory.fromStageId', count: { $sum: 1 } } },\n ]),\n ]);\n\n const enteredMap = new Map(enteredAgg.map((r) => [String(r._id), r.count]));\n const exitedMap = new Map(exitedAgg.map((r) => [String(r._id), r.count]));\n\n const funnelStages = stages.map((s) => {\n const entered = enteredMap.get(s.stageId) ?? 0;\n const exited = exitedMap.get(s.stageId) ?? 0;\n return {\n stageId: s.stageId,\n stageName: s.name,\n entered,\n exited,\n dropOff: Math.max(0, entered - exited),\n };\n });\n\n return { pipelineId, pipelineName, stages: funnelStages };\n }\n\n async getChannelDistribution(dateRange: DateRange): Promise<ChannelDistribution[]> {\n const matchStage: Record<string, unknown> = {\n isDeleted: { $ne: true },\n ...this.buildDateMatch(dateRange),\n };\n\n const results = await this.CallLog.aggregate<AggIdCount>([\n { $match: matchStage },\n { $group: { _id: '$channel', count: { $sum: 1 } } },\n { $sort: { count: -1 as const } },\n ]);\n\n return results.map((r) => ({\n channel: r._id != null ? String(r._id) : 'unknown',\n count: r.count,\n }));\n }\n\n async getOutcomeDistribution(dateRange: DateRange): Promise<OutcomeDistribution[]> {\n const matchStage: Record<string, unknown> = {\n isDeleted: { $ne: true },\n ...this.buildDateMatch(dateRange),\n };\n\n const results = await this.CallLog.aggregate<AggIdCount>([\n { $match: matchStage },\n { $group: { _id: '$outcome', count: { $sum: 1 } } },\n { $sort: { count: -1 as const } },\n ]);\n\n return results.map((r) => ({\n outcome: r._id != null ? String(r._id) : 'unknown',\n count: r.count,\n }));\n }\n\n async getFollowUpStats(dateRange: DateRange): Promise<FollowUpStats> {\n const matchStage: Record<string, unknown> = {\n isDeleted: { $ne: true },\n ...this.buildDateMatch(dateRange),\n };\n\n const results = await this.CallLog.aggregate<{ _id: null; total: number; followUpCalls: number }>([\n { $match: matchStage },\n {\n $group: {\n _id: null,\n total: { $sum: 1 },\n followUpCalls: {\n $sum: { $cond: [{ $eq: ['$isFollowUp', true] }, 1, 0] },\n },\n },\n },\n ]);\n\n const stat = results[0] ?? { total: 0, followUpCalls: 0 };\n const followUpRatio =\n stat.total > 0 ? Math.round((stat.followUpCalls / stat.total) * 10000) / 100 : 0;\n\n return {\n followUpCalls: stat.followUpCalls,\n totalCalls: stat.total,\n followUpRatio,\n };\n }\n}\n","import type { Model } from 'mongoose';\nimport type { LogAdapter } from '@astralibx/core';\nimport type { ExportFormat, ExportFilter, DateRange } from '@astralibx/call-log-types';\nimport type { ICallLogDocument } from '../schemas/call-log.schema.js';\nimport type { PipelineAnalyticsService } from './pipeline-analytics.service.js';\nimport { CallLogNotFoundError } from '../errors/index.js';\n\n// ── CSV columns ───────────────────────────────────────────────────────────────\n\nconst CSV_HEADER = 'callLogId,contactName,contactPhone,contactEmail,direction,pipelineId,currentStageId,priority,agentId,callDate,isClosed,tags';\n\n// ── Service ───────────────────────────────────────────────────────────────────\n\nexport class ExportService {\n constructor(\n private CallLog: Model<ICallLogDocument>,\n private pipelineAnalytics: PipelineAnalyticsService,\n private logger: LogAdapter,\n ) {}\n\n async exportCallLog(callLogId: string, format: ExportFormat): Promise<string> {\n const callLog = await this.CallLog.findOne({ callLogId });\n if (!callLog) throw new CallLogNotFoundError(callLogId);\n\n if (format === 'csv') {\n return this.toCSV([callLog]);\n }\n\n return JSON.stringify(\n (callLog as unknown as { toObject(): unknown }).toObject\n ? (callLog as unknown as { toObject(): unknown }).toObject()\n : callLog,\n null,\n 2,\n );\n }\n\n async exportCallLogs(filter: ExportFilter, format: ExportFormat): Promise<string> {\n const query: Record<string, unknown> = {};\n\n if (filter.pipelineId) query.pipelineId = filter.pipelineId;\n if (filter.stageId) query.currentStageId = filter.stageId;\n if (filter.agentId) query.agentId = filter.agentId;\n if (filter.tags && filter.tags.length > 0) query.tags = { $in: filter.tags };\n if (filter.category) query.category = filter.category;\n if (filter.isClosed !== undefined) query.isClosed = filter.isClosed;\n\n if (filter.dateFrom || filter.dateTo) {\n const dateFilter: Record<string, unknown> = {};\n if (filter.dateFrom) dateFilter.$gte = new Date(filter.dateFrom);\n if (filter.dateTo) dateFilter.$lte = new Date(filter.dateTo);\n query.callDate = dateFilter;\n }\n\n const callLogs = await this.CallLog.find(query).sort({ callDate: -1 });\n\n if (format === 'csv') {\n return this.toCSV(callLogs);\n }\n\n return JSON.stringify(\n callLogs.map((c) =>\n (c as unknown as { toObject(): unknown }).toObject\n ? (c as unknown as { toObject(): unknown }).toObject()\n : c,\n ),\n null,\n 2,\n );\n }\n\n async exportPipelineReport(pipelineId: string, dateRange: DateRange, format: ExportFormat): Promise<string> {\n const report = await this.pipelineAnalytics.getPipelineStats(pipelineId, dateRange);\n\n if (format === 'csv') {\n const header = 'pipelineId,pipelineName,totalCalls,stageId,stageName,count,avgTimeMs,conversionRate,bottleneckStage';\n const rows: string[] = [header];\n for (const stage of report.stages) {\n rows.push(\n [\n this.escapeCSV(report.pipelineId),\n this.escapeCSV(report.pipelineName),\n String(report.totalCalls),\n this.escapeCSV(stage.stageId),\n this.escapeCSV(stage.stageName),\n String(stage.count),\n String(stage.avgTimeMs),\n String(stage.conversionRate),\n this.escapeCSV(report.bottleneckStage ?? ''),\n ].join(','),\n );\n }\n this.logger.info('Pipeline report exported as CSV', { pipelineId });\n return rows.join('\\n');\n }\n\n this.logger.info('Pipeline report exported as JSON', { pipelineId });\n return JSON.stringify(report, null, 2);\n }\n\n private toCSV(callLogs: ICallLogDocument[]): string {\n const rows: string[] = [CSV_HEADER];\n\n for (const c of callLogs) {\n const row = [\n this.escapeCSV(c.callLogId),\n this.escapeCSV(c.contactRef?.displayName ?? ''),\n this.escapeCSV(c.contactRef?.phone ?? ''),\n this.escapeCSV(c.contactRef?.email ?? ''),\n this.escapeCSV(c.direction ?? ''),\n this.escapeCSV(c.pipelineId ?? ''),\n this.escapeCSV(c.currentStageId ?? ''),\n this.escapeCSV(c.priority ?? ''),\n this.escapeCSV(c.agentId?.toString() ?? ''),\n c.callDate ? new Date(c.callDate).toISOString() : '',\n String(c.isClosed ?? false),\n this.escapeCSV((c.tags ?? []).join(';')),\n ].join(',');\n rows.push(row);\n }\n\n return rows.join('\\n');\n }\n\n private escapeCSV(value: string): string {\n if (value.includes(',') || value.includes('\"') || value.includes('\\n')) {\n return `\"${value.replace(/\"/g, '\"\"')}\"`;\n }\n return value;\n }\n}\n","import { Router } from 'express';\nimport type { Request, Response } from 'express';\nimport { sendSuccess, sendError } from '@astralibx/core';\nimport type { LogAdapter } from '@astralibx/core';\nimport type { PipelineService } from '../services/pipeline.service.js';\nimport { AlxCallLogError } from '../errors/index.js';\n\nexport function createPipelineRoutes(\n pipeline: PipelineService,\n logger: LogAdapter,\n): Router {\n const router = Router();\n\n // GET / — list pipelines\n router.get('/', async (req: Request, res: Response) => {\n try {\n const isActive = req.query['isActive'] !== undefined\n ? req.query['isActive'] === 'true'\n : undefined;\n const result = await pipeline.list({ isActive });\n sendSuccess(res, result);\n } catch (error: unknown) {\n const message = error instanceof Error ? error.message : 'Unknown error';\n logger.error('Failed to list pipelines', { error: message });\n sendError(res, message, 500);\n }\n });\n\n // POST / — create pipeline\n router.post('/', async (req: Request, res: Response) => {\n try {\n const result = await pipeline.create(req.body);\n sendSuccess(res, result, 201);\n } catch (error: unknown) {\n if (error instanceof AlxCallLogError) {\n sendError(res, error.message, 400);\n return;\n }\n const message = error instanceof Error ? error.message : 'Unknown error';\n logger.error('Failed to create pipeline', { error: message });\n sendError(res, message, 500);\n }\n });\n\n // GET /:id — get pipeline\n router.get('/:id', async (req: Request, res: Response) => {\n try {\n const result = await pipeline.get(req.params['id']!);\n sendSuccess(res, result);\n } catch (error: unknown) {\n if (error instanceof AlxCallLogError) {\n sendError(res, error.message, 404);\n return;\n }\n const message = error instanceof Error ? error.message : 'Unknown error';\n logger.error('Failed to get pipeline', { id: req.params['id'], error: message });\n sendError(res, message, 500);\n }\n });\n\n // PUT /:id — update pipeline\n router.put('/:id', async (req: Request, res: Response) => {\n try {\n const result = await pipeline.update(req.params['id']!, req.body);\n sendSuccess(res, result);\n } catch (error: unknown) {\n if (error instanceof AlxCallLogError) {\n sendError(res, error.message, 400);\n return;\n }\n const message = error instanceof Error ? error.message : 'Unknown error';\n logger.error('Failed to update pipeline', { id: req.params['id'], error: message });\n sendError(res, message, 500);\n }\n });\n\n // DELETE /:id — delete pipeline\n router.delete('/:id', async (req: Request, res: Response) => {\n try {\n await pipeline.delete(req.params['id']!);\n sendSuccess(res, undefined);\n } catch (error: unknown) {\n if (error instanceof AlxCallLogError) {\n sendError(res, error.message, 400);\n return;\n }\n const message = error instanceof Error ? error.message : 'Unknown error';\n logger.error('Failed to delete pipeline', { id: req.params['id'], error: message });\n sendError(res, message, 500);\n }\n });\n\n // POST /:id/stages — add stage\n router.post('/:id/stages', async (req: Request, res: Response) => {\n try {\n const result = await pipeline.addStage(req.params['id']!, req.body);\n sendSuccess(res, result, 201);\n } catch (error: unknown) {\n if (error instanceof AlxCallLogError) {\n sendError(res, error.message, 400);\n return;\n }\n const message = error instanceof Error ? error.message : 'Unknown error';\n logger.error('Failed to add stage', { id: req.params['id'], error: message });\n sendError(res, message, 500);\n }\n });\n\n // PUT /:id/stages/reorder — reorder stages (must be BEFORE /:id/stages/:stageId)\n router.put('/:id/stages/reorder', async (req: Request, res: Response) => {\n try {\n const { stageIds } = req.body as { stageIds: string[] };\n const result = await pipeline.reorderStages(req.params['id']!, stageIds);\n sendSuccess(res, result);\n } catch (error: unknown) {\n if (error instanceof AlxCallLogError) {\n sendError(res, error.message, 400);\n return;\n }\n const message = error instanceof Error ? error.message : 'Unknown error';\n logger.error('Failed to reorder stages', { id: req.params['id'], error: message });\n sendError(res, message, 500);\n }\n });\n\n // PUT /:id/stages/:stageId — update stage\n router.put('/:id/stages/:stageId', async (req: Request, res: Response) => {\n try {\n const result = await pipeline.updateStage(req.params['id']!, req.params['stageId']!, req.body);\n sendSuccess(res, result);\n } catch (error: unknown) {\n if (error instanceof AlxCallLogError) {\n sendError(res, error.message, 400);\n return;\n }\n const message = error instanceof Error ? error.message : 'Unknown error';\n logger.error('Failed to update stage', { id: req.params['id'], stageId: req.params['stageId'], error: message });\n sendError(res, message, 500);\n }\n });\n\n // DELETE /:id/stages/:stageId — remove stage\n router.delete('/:id/stages/:stageId', async (req: Request, res: Response) => {\n try {\n await pipeline.removeStage(req.params['id']!, req.params['stageId']!);\n sendSuccess(res, undefined);\n } catch (error: unknown) {\n if (error instanceof AlxCallLogError) {\n sendError(res, error.message, 400);\n return;\n }\n const message = error instanceof Error ? error.message : 'Unknown error';\n logger.error('Failed to remove stage', { id: req.params['id'], stageId: req.params['stageId'], error: message });\n sendError(res, message, 500);\n }\n });\n\n return router;\n}\n","import { Router } from 'express';\nimport type { Request, Response } from 'express';\nimport { sendSuccess, sendError } from '@astralibx/core';\nimport type { LogAdapter } from '@astralibx/core';\nimport type { CallLogService } from '../services/call-log.service.js';\nimport type { CallLogLifecycleService } from '../services/call-log-lifecycle.service.js';\nimport type { TimelineService } from '../services/timeline.service.js';\nimport { AlxCallLogError } from '../errors/index.js';\n\nfunction getScopedAgentId(req: Request, enableAgentScoping: boolean): string | undefined {\n if (!enableAgentScoping) return undefined;\n const user = (req as unknown as { user?: { adminUserId?: string; role?: string } }).user;\n if (!user) return undefined;\n if (user.role === 'owner') return undefined;\n return user.adminUserId;\n}\n\nexport function createCallLogRoutes(\n services: { callLogs: CallLogService; lifecycle: CallLogLifecycleService; timeline: TimelineService },\n logger: LogAdapter,\n enableAgentScoping = false,\n): Router {\n const router = Router();\n const { callLogs, lifecycle, timeline } = services;\n\n // Static routes BEFORE parameterized routes\n\n // GET /follow-ups — list due follow-ups (BEFORE /:id)\n router.get('/follow-ups', async (req: Request, res: Response) => {\n try {\n const scopedAgentId = getScopedAgentId(req, enableAgentScoping);\n const agentId = scopedAgentId ?? (req.query['agentId'] as string | undefined);\n const dateRange = {\n from: req.query['from'] as string | undefined,\n to: req.query['to'] as string | undefined,\n };\n const result = await lifecycle.getFollowUpsDue(agentId, dateRange);\n sendSuccess(res, result);\n } catch (error: unknown) {\n const message = error instanceof Error ? error.message : 'Unknown error';\n logger.error('Failed to get follow-ups', { error: message });\n sendError(res, message, 500);\n }\n });\n\n // PUT /-/bulk/stage — bulk stage change (BEFORE /:id)\n router.put('/-/bulk/stage', async (req: Request, res: Response) => {\n try {\n const { callLogIds, newStageId, agentId } = req.body as {\n callLogIds: string[];\n newStageId: string;\n agentId: string;\n };\n const result = await lifecycle.bulkChangeStage(callLogIds, newStageId, agentId);\n sendSuccess(res, result);\n } catch (error: unknown) {\n if (error instanceof AlxCallLogError) {\n sendError(res, error.message, 400);\n return;\n }\n const message = error instanceof Error ? error.message : 'Unknown error';\n logger.error('Failed to bulk change stage', { error: message });\n sendError(res, message, 500);\n }\n });\n\n // GET / — list call logs\n router.get('/', async (req: Request, res: Response) => {\n try {\n const query = req.query as Record<string, string | undefined>;\n const filter: Record<string, unknown> = {};\n if (query['pipelineId']) filter['pipelineId'] = query['pipelineId'];\n if (query['currentStageId']) filter['currentStageId'] = query['currentStageId'];\n // Agent scoping: inject agentId if scoping enabled and user is not owner\n const scopedAgentId = getScopedAgentId(req, enableAgentScoping);\n if (scopedAgentId) {\n filter['agentId'] = scopedAgentId;\n } else if (query['agentId']) {\n filter['agentId'] = query['agentId'];\n }\n if (query['category']) filter['category'] = query['category'];\n if (query['isClosed'] !== undefined) filter['isClosed'] = query['isClosed'] === 'true';\n if (query['contactExternalId']) filter['contactExternalId'] = query['contactExternalId'];\n if (query['contactName']) filter['contactName'] = query['contactName'];\n if (query['contactPhone']) filter['contactPhone'] = query['contactPhone'];\n if (query['contactEmail']) filter['contactEmail'] = query['contactEmail'];\n if (query['priority']) filter['priority'] = query['priority'];\n if (query['direction']) filter['direction'] = query['direction'];\n // New query params: channel, outcome, isFollowUp, includeDeleted\n const channel = query['channel'];\n const outcome = query['outcome'];\n const isFollowUp = query['isFollowUp'] !== undefined ? query['isFollowUp'] === 'true' : undefined;\n const includeDeleted = query['includeDeleted'] === 'true';\n if (channel) filter['channel'] = channel;\n if (outcome) filter['outcome'] = outcome;\n if (isFollowUp !== undefined) filter['isFollowUp'] = isFollowUp;\n if (includeDeleted) filter['includeDeleted'] = true;\n if (query['page']) filter['page'] = parseInt(query['page']!, 10);\n if (query['limit']) filter['limit'] = parseInt(query['limit']!, 10);\n if (query['from'] || query['to']) {\n filter['dateRange'] = { from: query['from'], to: query['to'] };\n }\n const result = await callLogs.list(filter as Parameters<typeof callLogs.list>[0]);\n sendSuccess(res, result);\n } catch (error: unknown) {\n const message = error instanceof Error ? error.message : 'Unknown error';\n logger.error('Failed to list call logs', { error: message });\n sendError(res, message, 500);\n }\n });\n\n // POST / — create call log\n router.post('/', async (req: Request, res: Response) => {\n try {\n const result = await callLogs.create(req.body);\n sendSuccess(res, result, 201);\n } catch (error: unknown) {\n if (error instanceof AlxCallLogError) {\n sendError(res, error.message, 400);\n return;\n }\n const message = error instanceof Error ? error.message : 'Unknown error';\n logger.error('Failed to create call log', { error: message });\n sendError(res, message, 500);\n }\n });\n\n // GET /:id — get call log\n router.get('/:id', async (req: Request, res: Response) => {\n try {\n const result = await callLogs.get(req.params['id']!);\n sendSuccess(res, result);\n } catch (error: unknown) {\n if (error instanceof AlxCallLogError) {\n sendError(res, error.message, 404);\n return;\n }\n const message = error instanceof Error ? error.message : 'Unknown error';\n logger.error('Failed to get call log', { id: req.params['id'], error: message });\n sendError(res, message, 500);\n }\n });\n\n // PUT /:id — update call log\n router.put('/:id', async (req: Request, res: Response) => {\n try {\n const result = await callLogs.update(req.params['id']!, req.body);\n sendSuccess(res, result);\n } catch (error: unknown) {\n if (error instanceof AlxCallLogError) {\n sendError(res, error.message, 400);\n return;\n }\n const message = error instanceof Error ? error.message : 'Unknown error';\n logger.error('Failed to update call log', { id: req.params['id'], error: message });\n sendError(res, message, 500);\n }\n });\n\n // DELETE /:id — soft delete call log\n router.delete('/:id', async (req: Request, res: Response) => {\n try {\n const agentId = (req as unknown as { user?: { adminUserId?: string } }).user?.adminUserId;\n const agentName = (req as unknown as { user?: { displayName?: string } }).user?.displayName;\n const result = await lifecycle.softDelete(req.params['id']!, agentId, agentName);\n sendSuccess(res, result);\n } catch (error: unknown) {\n if (error instanceof AlxCallLogError) {\n sendError(res, error.message, 404);\n return;\n }\n const message = error instanceof Error ? error.message : 'Unknown error';\n logger.error('Failed to soft delete call log', { id: req.params['id'], error: message });\n sendError(res, message, 500);\n }\n });\n\n // PUT /:id/stage — change stage\n router.put('/:id/stage', async (req: Request, res: Response) => {\n try {\n const { newStageId, agentId } = req.body as { newStageId: string; agentId: string };\n const result = await lifecycle.changeStage(req.params['id']!, newStageId, agentId);\n sendSuccess(res, result);\n } catch (error: unknown) {\n if (error instanceof AlxCallLogError) {\n sendError(res, error.message, 400);\n return;\n }\n const message = error instanceof Error ? error.message : 'Unknown error';\n logger.error('Failed to change stage', { id: req.params['id'], error: message });\n sendError(res, message, 500);\n }\n });\n\n // PUT /:id/assign — reassign\n router.put('/:id/assign', async (req: Request, res: Response) => {\n try {\n const { agentId, assignedBy } = req.body as { agentId: string; assignedBy: string };\n const result = await lifecycle.assign(req.params['id']!, agentId, assignedBy);\n sendSuccess(res, result);\n } catch (error: unknown) {\n if (error instanceof AlxCallLogError) {\n sendError(res, error.message, 400);\n return;\n }\n const message = error instanceof Error ? error.message : 'Unknown error';\n logger.error('Failed to assign call log', { id: req.params['id'], error: message });\n sendError(res, message, 500);\n }\n });\n\n // PUT /:id/close — manual close\n router.put('/:id/close', async (req: Request, res: Response) => {\n try {\n const { agentId } = req.body as { agentId: string };\n const result = await lifecycle.close(req.params['id']!, agentId);\n sendSuccess(res, result);\n } catch (error: unknown) {\n if (error instanceof AlxCallLogError) {\n sendError(res, error.message, 400);\n return;\n }\n const message = error instanceof Error ? error.message : 'Unknown error';\n logger.error('Failed to close call log', { id: req.params['id'], error: message });\n sendError(res, message, 500);\n }\n });\n\n // PUT /:id/reopen — reopen a closed call\n router.put('/:id/reopen', async (req: Request, res: Response) => {\n try {\n const { agentId } = req.body as { agentId: string };\n const result = await lifecycle.reopen(req.params['id']!, agentId);\n sendSuccess(res, result);\n } catch (error: unknown) {\n if (error instanceof AlxCallLogError) {\n sendError(res, error.message, 400);\n return;\n }\n const message = error instanceof Error ? error.message : 'Unknown error';\n logger.error('Failed to reopen call log', { id: req.params['id'], error: message });\n sendError(res, message, 500);\n }\n });\n\n // POST /:id/notes — add timeline note\n router.post('/:id/notes', async (req: Request, res: Response) => {\n try {\n const { content, authorId, authorName } = req.body as {\n content: string;\n authorId: string;\n authorName: string;\n };\n const result = await timeline.addNote(req.params['id']!, content, authorId, authorName);\n sendSuccess(res, result, 201);\n } catch (error: unknown) {\n if (error instanceof AlxCallLogError) {\n sendError(res, error.message, 400);\n return;\n }\n const message = error instanceof Error ? error.message : 'Unknown error';\n logger.error('Failed to add timeline note', { id: req.params['id'], error: message });\n sendError(res, message, 500);\n }\n });\n\n // GET /:id/timeline — paginated timeline\n router.get('/:id/timeline', async (req: Request, res: Response) => {\n try {\n const page = parseInt(req.query['page'] as string || '1', 10);\n const limit = parseInt(req.query['limit'] as string || '50', 10);\n const result = await timeline.getTimeline(req.params['id']!, { page, limit });\n sendSuccess(res, result);\n } catch (error: unknown) {\n if (error instanceof AlxCallLogError) {\n sendError(res, error.message, 404);\n return;\n }\n const message = error instanceof Error ? error.message : 'Unknown error';\n logger.error('Failed to get timeline', { id: req.params['id'], error: message });\n sendError(res, message, 500);\n }\n });\n\n return router;\n}\n","import { Router } from 'express';\nimport type { Request, Response } from 'express';\nimport { sendSuccess, sendError } from '@astralibx/core';\nimport type { LogAdapter } from '@astralibx/core';\nimport type { CallLogService } from '../services/call-log.service.js';\nimport type { TimelineService } from '../services/timeline.service.js';\nimport { AlxCallLogError } from '../errors/index.js';\n\nexport function createContactRoutes(\n services: { callLogs: CallLogService; timeline: TimelineService },\n logger: LogAdapter,\n): Router {\n const router = Router();\n const { callLogs, timeline } = services;\n\n // GET /:externalId/calls — all calls for contact\n router.get('/:externalId/calls', async (req: Request, res: Response) => {\n try {\n const result = await callLogs.getByContact(req.params['externalId']!);\n sendSuccess(res, result);\n } catch (error: unknown) {\n if (error instanceof AlxCallLogError) {\n sendError(res, error.message, 404);\n return;\n }\n const message = error instanceof Error ? error.message : 'Unknown error';\n logger.error('Failed to get calls for contact', { externalId: req.params['externalId'], error: message });\n sendError(res, message, 500);\n }\n });\n\n // GET /:externalId/timeline — merged contact timeline\n router.get('/:externalId/timeline', async (req: Request, res: Response) => {\n try {\n const page = parseInt(req.query['page'] as string || '1', 10);\n const limit = parseInt(req.query['limit'] as string || '20', 10);\n const result = await timeline.getContactTimeline(req.params['externalId']!, { page, limit });\n sendSuccess(res, result);\n } catch (error: unknown) {\n if (error instanceof AlxCallLogError) {\n sendError(res, error.message, 404);\n return;\n }\n const message = error instanceof Error ? error.message : 'Unknown error';\n logger.error('Failed to get contact timeline', { externalId: req.params['externalId'], error: message });\n sendError(res, message, 500);\n }\n });\n\n return router;\n}\n","import { Router } from 'express';\nimport type { Request, Response } from 'express';\nimport { sendSuccess, sendError } from '@astralibx/core';\nimport type { LogAdapter } from '@astralibx/core';\nimport type { AnalyticsService } from '../services/analytics.service.js';\nimport type { PipelineAnalyticsService } from '../services/pipeline-analytics.service.js';\nimport { AlxCallLogError } from '../errors/index.js';\n\nexport function createAnalyticsRoutes(\n analytics: AnalyticsService,\n pipelineAnalytics: PipelineAnalyticsService,\n logger: LogAdapter,\n enableAgentScoping = false,\n): Router {\n const router = Router();\n\n function getScopedAgentId(req: Request): string | undefined {\n if (!enableAgentScoping) return undefined;\n const user = (req as unknown as { user?: { adminUserId?: string; role?: string } }).user;\n if (!user) return undefined;\n if (user.role === 'owner') return undefined;\n return user.adminUserId;\n }\n\n function parseDateRange(query: Record<string, string | undefined>) {\n return {\n from: query['from'],\n to: query['to'],\n };\n }\n\n // GET /stats — quick dashboard stats\n router.get('/stats', async (req: Request, res: Response) => {\n try {\n const result = await analytics.getDashboardStats();\n sendSuccess(res, result);\n } catch (error: unknown) {\n const message = error instanceof Error ? error.message : 'Unknown error';\n logger.error('Failed to get dashboard stats', { error: message });\n sendError(res, message, 500);\n }\n });\n\n // GET /agent/:agentId — agent stats\n router.get('/agent/:agentId', async (req: Request, res: Response) => {\n try {\n const scopedAgentId = getScopedAgentId(req);\n // Non-owners can only view their own stats\n if (scopedAgentId && scopedAgentId !== req.params['agentId']) {\n sendError(res, 'Forbidden: you may only view your own agent stats', 403);\n return;\n }\n const dateRange = parseDateRange(req.query as Record<string, string | undefined>);\n const result = await analytics.getAgentStats(req.params['agentId']!, dateRange);\n sendSuccess(res, result);\n } catch (error: unknown) {\n if (error instanceof AlxCallLogError) {\n sendError(res, error.message, 400);\n return;\n }\n const message = error instanceof Error ? error.message : 'Unknown error';\n logger.error('Failed to get agent stats', { agentId: req.params['agentId'], error: message });\n sendError(res, message, 500);\n }\n });\n\n // GET /agent-leaderboard — ranking\n router.get('/agent-leaderboard', async (req: Request, res: Response) => {\n try {\n const dateRange = parseDateRange(req.query as Record<string, string | undefined>);\n const result = await analytics.getAgentLeaderboard(dateRange);\n sendSuccess(res, result);\n } catch (error: unknown) {\n const message = error instanceof Error ? error.message : 'Unknown error';\n logger.error('Failed to get agent leaderboard', { error: message });\n sendError(res, message, 500);\n }\n });\n\n // GET /pipeline/:id — pipeline stats (delegated to PipelineAnalyticsService)\n router.get('/pipeline/:id', async (req: Request, res: Response) => {\n try {\n const dateRange = parseDateRange(req.query as Record<string, string | undefined>);\n const result = await pipelineAnalytics.getPipelineStats(req.params['id']!, dateRange);\n sendSuccess(res, result);\n } catch (error: unknown) {\n if (error instanceof AlxCallLogError) {\n sendError(res, error.message, 400);\n return;\n }\n const message = error instanceof Error ? error.message : 'Unknown error';\n logger.error('Failed to get pipeline stats', { id: req.params['id'], error: message });\n sendError(res, message, 500);\n }\n });\n\n // GET /pipeline/:id/funnel — funnel (delegated to PipelineAnalyticsService)\n router.get('/pipeline/:id/funnel', async (req: Request, res: Response) => {\n try {\n const dateRange = parseDateRange(req.query as Record<string, string | undefined>);\n const result = await pipelineAnalytics.getPipelineFunnel(req.params['id']!, dateRange);\n sendSuccess(res, result);\n } catch (error: unknown) {\n if (error instanceof AlxCallLogError) {\n sendError(res, error.message, 400);\n return;\n }\n const message = error instanceof Error ? error.message : 'Unknown error';\n logger.error('Failed to get pipeline funnel', { id: req.params['id'], error: message });\n sendError(res, message, 500);\n }\n });\n\n // GET /channel-distribution — channel distribution\n router.get('/channel-distribution', async (req: Request, res: Response) => {\n try {\n const dateRange = parseDateRange(req.query as Record<string, string | undefined>);\n const result = await pipelineAnalytics.getChannelDistribution(dateRange);\n sendSuccess(res, result);\n } catch (error: unknown) {\n const message = error instanceof Error ? error.message : 'Unknown error';\n logger.error('Failed to get channel distribution', { error: message });\n sendError(res, message, 500);\n }\n });\n\n // GET /outcome-distribution — outcome distribution\n router.get('/outcome-distribution', async (req: Request, res: Response) => {\n try {\n const dateRange = parseDateRange(req.query as Record<string, string | undefined>);\n const result = await pipelineAnalytics.getOutcomeDistribution(dateRange);\n sendSuccess(res, result);\n } catch (error: unknown) {\n const message = error instanceof Error ? error.message : 'Unknown error';\n logger.error('Failed to get outcome distribution', { error: message });\n sendError(res, message, 500);\n }\n });\n\n // GET /follow-up-stats — follow-up ratio stats\n router.get('/follow-up-stats', async (req: Request, res: Response) => {\n try {\n const dateRange = parseDateRange(req.query as Record<string, string | undefined>);\n const result = await pipelineAnalytics.getFollowUpStats(dateRange);\n sendSuccess(res, result);\n } catch (error: unknown) {\n const message = error instanceof Error ? error.message : 'Unknown error';\n logger.error('Failed to get follow-up stats', { error: message });\n sendError(res, message, 500);\n }\n });\n\n // GET /team — team stats\n router.get('/team', async (req: Request, res: Response) => {\n try {\n const { teamId } = req.query as { teamId?: string };\n const dateRange = parseDateRange(req.query as Record<string, string | undefined>);\n const result = await analytics.getTeamStats(teamId, dateRange);\n sendSuccess(res, result);\n } catch (error: unknown) {\n const message = error instanceof Error ? error.message : 'Unknown error';\n logger.error('Failed to get team stats', { error: message });\n sendError(res, message, 500);\n }\n });\n\n // GET /daily — daily report\n router.get('/daily', async (req: Request, res: Response) => {\n try {\n const scopedAgentId = getScopedAgentId(req);\n const dateRange = parseDateRange(req.query as Record<string, string | undefined>);\n const result = await analytics.getDailyReport(dateRange, scopedAgentId);\n sendSuccess(res, result);\n } catch (error: unknown) {\n const message = error instanceof Error ? error.message : 'Unknown error';\n logger.error('Failed to get daily report', { error: message });\n sendError(res, message, 500);\n }\n });\n\n // GET /weekly-trends — weekly trends\n router.get('/weekly-trends', async (req: Request, res: Response) => {\n try {\n const weeks = parseInt(req.query['weeks'] as string || '4', 10);\n const result = await analytics.getWeeklyTrends(weeks);\n sendSuccess(res, result);\n } catch (error: unknown) {\n const message = error instanceof Error ? error.message : 'Unknown error';\n logger.error('Failed to get weekly trends', { error: message });\n sendError(res, message, 500);\n }\n });\n\n // GET /overall — overall report\n router.get('/overall', async (req: Request, res: Response) => {\n try {\n const dateRange = parseDateRange(req.query as Record<string, string | undefined>);\n const result = await analytics.getOverallReport(dateRange);\n sendSuccess(res, result);\n } catch (error: unknown) {\n const message = error instanceof Error ? error.message : 'Unknown error';\n logger.error('Failed to get overall report', { error: message });\n sendError(res, message, 500);\n }\n });\n\n return router;\n}\n","import { Router } from 'express';\nimport type { Request, Response } from 'express';\nimport { sendSuccess, sendError } from '@astralibx/core';\nimport type { LogAdapter } from '@astralibx/core';\nimport type { SettingsService } from '../services/settings.service.js';\nimport type { ExportService } from '../services/export.service.js';\nimport { AlxCallLogError } from '../errors/index.js';\n\nexport function createSettingsRoutes(\n settings: SettingsService,\n exportSvc: ExportService,\n logger: LogAdapter,\n): Router {\n const router = Router();\n\n // NOTE: These are mounted at root level (not under /settings prefix)\n\n // GET /settings — get settings\n router.get('/settings', async (_req: Request, res: Response) => {\n try {\n const result = await settings.get();\n sendSuccess(res, result);\n } catch (error: unknown) {\n const message = error instanceof Error ? error.message : 'Unknown error';\n logger.error('Failed to get settings', { error: message });\n sendError(res, message, 500);\n }\n });\n\n // PUT /settings — update settings\n router.put('/settings', async (req: Request, res: Response) => {\n try {\n const result = await settings.update(req.body);\n sendSuccess(res, result);\n } catch (error: unknown) {\n if (error instanceof AlxCallLogError) {\n sendError(res, error.message, 400);\n return;\n }\n const message = error instanceof Error ? error.message : 'Unknown error';\n logger.error('Failed to update settings', { error: message });\n sendError(res, message, 500);\n }\n });\n\n // GET /export/calls — bulk export\n router.get('/export/calls', async (req: Request, res: Response) => {\n try {\n const { format = 'json', ...filterParams } = req.query as Record<string, string | undefined>;\n const filter: Record<string, unknown> = {};\n if (filterParams['pipelineId']) filter['pipelineId'] = filterParams['pipelineId'];\n if (filterParams['agentId']) filter['agentId'] = filterParams['agentId'];\n if (filterParams['isClosed'] !== undefined) filter['isClosed'] = filterParams['isClosed'] === 'true';\n if (filterParams['from'] || filterParams['to']) {\n filter['dateRange'] = { from: filterParams['from'], to: filterParams['to'] };\n }\n const result = await exportSvc.exportCallLogs(\n filter as Parameters<typeof exportSvc.exportCallLogs>[0],\n format as 'json' | 'csv',\n );\n const contentType = format === 'csv' ? 'text/csv' : 'application/json';\n res.setHeader('Content-Type', contentType);\n res.send(result);\n } catch (error: unknown) {\n const message = error instanceof Error ? error.message : 'Unknown error';\n logger.error('Failed to export call logs', { error: message });\n sendError(res, message, 500);\n }\n });\n\n // GET /export/calls/:id — single call export\n router.get('/export/calls/:id', async (req: Request, res: Response) => {\n try {\n const format = (req.query['format'] as string || 'json') as 'json' | 'csv';\n const result = await exportSvc.exportCallLog(req.params['id']!, format);\n const contentType = format === 'csv' ? 'text/csv' : 'application/json';\n res.setHeader('Content-Type', contentType);\n res.send(result);\n } catch (error: unknown) {\n if (error instanceof AlxCallLogError) {\n sendError(res, error.message, 404);\n return;\n }\n const message = error instanceof Error ? error.message : 'Unknown error';\n logger.error('Failed to export call log', { id: req.params['id'], error: message });\n sendError(res, message, 500);\n }\n });\n\n // GET /export/pipeline/:id — pipeline report export\n router.get('/export/pipeline/:id', async (req: Request, res: Response) => {\n try {\n const format = (req.query['format'] as string || 'json') as 'json' | 'csv';\n const dateRange = {\n from: req.query['from'] as string | undefined,\n to: req.query['to'] as string | undefined,\n };\n const result = await exportSvc.exportPipelineReport(req.params['id']!, dateRange, format);\n const contentType = format === 'csv' ? 'text/csv' : 'application/json';\n res.setHeader('Content-Type', contentType);\n res.send(result);\n } catch (error: unknown) {\n if (error instanceof AlxCallLogError) {\n sendError(res, error.message, 400);\n return;\n }\n const message = error instanceof Error ? error.message : 'Unknown error';\n logger.error('Failed to export pipeline report', { id: req.params['id'], error: message });\n sendError(res, message, 500);\n }\n });\n\n return router;\n}\n","import { Router } from 'express';\nimport type { Request, Response, NextFunction, RequestHandler } from 'express';\nimport { sendSuccess, sendError } from '@astralibx/core';\nimport type { LogAdapter } from '@astralibx/core';\nimport type { AuthResult } from '@astralibx/call-log-types';\nimport type { PipelineService } from '../services/pipeline.service.js';\nimport type { CallLogService } from '../services/call-log.service.js';\nimport type { CallLogLifecycleService } from '../services/call-log-lifecycle.service.js';\nimport type { TimelineService } from '../services/timeline.service.js';\nimport type { AnalyticsService } from '../services/analytics.service.js';\nimport type { PipelineAnalyticsService } from '../services/pipeline-analytics.service.js';\nimport type { SettingsService } from '../services/settings.service.js';\nimport type { ExportService } from '../services/export.service.js';\nimport { createPipelineRoutes } from './pipeline.routes.js';\nimport { createCallLogRoutes } from './call-log.routes.js';\nimport { createContactRoutes } from './contact.routes.js';\nimport { createAnalyticsRoutes } from './analytics.routes.js';\nimport { createSettingsRoutes } from './settings.routes.js';\n\nexport interface RouteServices {\n pipelines: PipelineService;\n callLogs: CallLogService;\n lifecycle: CallLogLifecycleService;\n timeline: TimelineService;\n analytics: AnalyticsService;\n pipelineAnalytics: PipelineAnalyticsService;\n settings: SettingsService;\n export: ExportService;\n}\n\nexport interface RouteOptions {\n authenticateRequest?: (req: Request) => Promise<AuthResult | null>;\n logger: LogAdapter;\n enableAgentScoping?: boolean;\n}\n\nexport function createRoutes(services: RouteServices, options: RouteOptions): Router {\n const router = Router();\n const { logger, authenticateRequest, enableAgentScoping = false } = options;\n\n // Build auth middleware\n let authMiddleware: RequestHandler | undefined;\n if (authenticateRequest) {\n authMiddleware = async (req: Request, res: Response, next: NextFunction): Promise<void> => {\n try {\n const result = await authenticateRequest(req);\n if (!result) {\n sendError(res, 'Unauthorized', 401);\n return;\n }\n (req as Request & { user: AuthResult }).user = result;\n next();\n } catch (error: unknown) {\n const message = error instanceof Error ? error.message : 'Authentication failed';\n sendError(res, message, 401);\n }\n };\n }\n\n const protectedRouter = Router();\n\n protectedRouter.use('/pipelines', createPipelineRoutes(services.pipelines, logger));\n protectedRouter.use('/calls', createCallLogRoutes({ callLogs: services.callLogs, lifecycle: services.lifecycle, timeline: services.timeline }, logger, enableAgentScoping));\n protectedRouter.use('/contacts', createContactRoutes({ callLogs: services.callLogs, timeline: services.timeline }, logger));\n protectedRouter.use('/analytics', createAnalyticsRoutes(services.analytics, services.pipelineAnalytics, logger, enableAgentScoping));\n protectedRouter.use('/', createSettingsRoutes(services.settings, services.export, logger));\n\n if (authMiddleware) {\n router.use(authMiddleware, protectedRouter);\n } else {\n router.use(protectedRouter);\n }\n\n return router;\n}\n","import crypto from 'node:crypto';\nimport type { Model } from 'mongoose';\nimport type { LogAdapter } from '@astralibx/core';\nimport type { ICallLog, ResolvedOptions } from '@astralibx/call-log-types';\nimport { TimelineEntryType } from '@astralibx/call-log-types';\nimport type { ICallLogDocument } from '../schemas/call-log.schema.js';\nimport { SYSTEM_TIMELINE } from '../constants/index.js';\n\n// ── Deps interface ────────────────────────────────────────────────────────────\n\nexport interface FollowUpWorkerDeps {\n CallLog: Model<ICallLogDocument>;\n hooks: { onFollowUpDue?: (callLog: ICallLog) => void | Promise<void> };\n logger: LogAdapter;\n options: ResolvedOptions;\n}\n\n// ── Worker ────────────────────────────────────────────────────────────────────\n\nexport class FollowUpWorker {\n private intervalId: NodeJS.Timeout | null = null;\n private running = false;\n\n constructor(private deps: FollowUpWorkerDeps) {}\n\n start(): void {\n if (this.intervalId) return;\n\n this.intervalId = setInterval(() => {\n this.tick().catch((err) => {\n this.deps.logger.error('Follow-up worker tick failed', {\n error: err instanceof Error ? err.message : 'Unknown error',\n });\n });\n }, this.deps.options.followUpCheckIntervalMs);\n\n this.deps.logger.info('Follow-up worker started', {\n intervalMs: this.deps.options.followUpCheckIntervalMs,\n });\n }\n\n stop(): void {\n if (this.intervalId) {\n clearInterval(this.intervalId);\n this.intervalId = null;\n }\n this.deps.logger.info('Follow-up worker stopped');\n }\n\n private async tick(): Promise<void> {\n if (this.running) return;\n this.running = true;\n\n try {\n const dueCallLogs = await this.deps.CallLog.find({\n nextFollowUpDate: { $lte: new Date() },\n isClosed: false,\n followUpNotifiedAt: null,\n });\n\n for (const callLog of dueCallLogs) {\n try {\n if (this.deps.hooks.onFollowUpDue) {\n await this.deps.hooks.onFollowUpDue(callLog as unknown as ICallLog);\n }\n\n await this.deps.CallLog.findOneAndUpdate(\n { _id: callLog._id },\n {\n $set: { followUpNotifiedAt: new Date() },\n $push: {\n timeline: {\n entryId: crypto.randomUUID(),\n type: TimelineEntryType.FollowUpCompleted,\n content: SYSTEM_TIMELINE.FollowUpCompleted,\n createdAt: new Date(),\n },\n },\n },\n );\n\n this.deps.logger.info('Follow-up notification fired', {\n callLogId: callLog.callLogId,\n });\n } catch (err) {\n this.deps.logger.error('Failed to process follow-up for call log', {\n callLogId: callLog.callLogId,\n error: err instanceof Error ? err.message : 'Unknown error',\n });\n }\n }\n } finally {\n this.running = false;\n }\n }\n}\n","import { z } from 'zod';\nimport { noopLogger } from '@astralibx/core';\nimport type { Router } from 'express';\nimport type { Model } from 'mongoose';\nimport type { CallLogEngineConfig, ResolvedOptions } from '@astralibx/call-log-types';\nimport { DEFAULT_OPTIONS } from '@astralibx/call-log-types';\nimport {\n createPipelineModel,\n type IPipelineDocument,\n} from './schemas/pipeline.schema.js';\nimport {\n createCallLogModel,\n type ICallLogDocument,\n} from './schemas/call-log.schema.js';\nimport {\n createCallLogSettingsModel,\n type ICallLogSettingsDocument,\n} from './schemas/call-log-settings.schema.js';\nimport { SettingsService } from './services/settings.service.js';\nimport { PipelineService } from './services/pipeline.service.js';\nimport { TimelineService } from './services/timeline.service.js';\nimport { CallLogService } from './services/call-log.service.js';\nimport { CallLogLifecycleService } from './services/call-log-lifecycle.service.js';\nimport { AnalyticsService } from './services/analytics.service.js';\nimport { PipelineAnalyticsService } from './services/pipeline-analytics.service.js';\nimport { ExportService } from './services/export.service.js';\nimport { createRoutes } from './routes/index.js';\nimport { FollowUpWorker } from './workers/follow-up.worker.js';\n\n// ── Zod validation schema ─────────────────────────────────────────────────────\n\nconst CallLogEngineConfigSchema = z.object({\n db: z.object({\n connection: z.unknown(),\n collectionPrefix: z.string().optional(),\n }),\n logger: z\n .object({\n info: z.function(),\n warn: z.function(),\n error: z.function(),\n debug: z.function(),\n })\n .optional(),\n agents: z\n .object({\n collectionName: z.string().optional(),\n resolveAgent: z.function().optional(),\n })\n .optional()\n .default({}),\n adapters: z.object({\n lookupContact: z.function(),\n addContact: z.function().optional(),\n authenticateAgent: z.function(),\n }),\n hooks: z\n .object({\n onCallCreated: z.function().optional(),\n onStageChanged: z.function().optional(),\n onCallClosed: z.function().optional(),\n onCallAssigned: z.function().optional(),\n onFollowUpDue: z.function().optional(),\n onMetric: z.function().optional(),\n })\n .optional(),\n options: z\n .object({\n maxTimelineEntries: z.number().int().positive().optional(),\n followUpCheckIntervalMs: z.number().int().positive().optional(),\n enableAgentScoping: z.boolean().optional(),\n })\n .optional(),\n});\n\n// ── Return type ───────────────────────────────────────────────────────────────\n\nexport interface CallLogEngine {\n pipelines: PipelineService;\n callLogs: CallLogService;\n lifecycle: CallLogLifecycleService;\n timeline: TimelineService;\n analytics: AnalyticsService;\n pipelineAnalytics: PipelineAnalyticsService;\n settings: SettingsService;\n export: ExportService;\n routes: Router;\n models: {\n Pipeline: Model<IPipelineDocument>;\n CallLog: Model<ICallLogDocument>;\n CallLogSettings: Model<ICallLogSettingsDocument>;\n };\n destroy: () => Promise<void>;\n}\n\n// ── Factory ───────────────────────────────────────────────────────────────────\n\nexport function createCallLogEngine(config: CallLogEngineConfig): CallLogEngine {\n // 1. Validate config with Zod\n const parseResult = CallLogEngineConfigSchema.safeParse(config);\n if (!parseResult.success) {\n const issues = parseResult.error.issues\n .map((i) => `${i.path.join('.')}: ${i.message}`)\n .join(', ');\n throw new Error(`Invalid CallLogEngineConfig: ${issues}`);\n }\n\n // 2. Resolve options\n const resolvedOptions: ResolvedOptions = {\n ...DEFAULT_OPTIONS,\n ...config.options,\n };\n\n // 3. Set up logger\n const logger = config.logger ?? noopLogger;\n\n // 4. Register models\n const conn = config.db.connection as import('mongoose').Connection;\n const prefix = config.db.collectionPrefix;\n\n const Pipeline = createPipelineModel(conn, prefix);\n const CallLog = createCallLogModel(conn, prefix);\n const CallLogSettings = createCallLogSettingsModel(conn, prefix);\n\n // 5. Create services\n const settingsService = new SettingsService(CallLogSettings, logger);\n\n const pipelineService = new PipelineService(Pipeline, CallLog, logger);\n\n const timelineService = new TimelineService(CallLog, logger, resolvedOptions);\n\n const callLogService = new CallLogService(\n CallLog,\n Pipeline,\n timelineService,\n logger,\n config.hooks ?? {},\n resolvedOptions,\n );\n\n const callLogLifecycleService = new CallLogLifecycleService(\n CallLog,\n Pipeline,\n timelineService,\n logger,\n config.hooks ?? {},\n resolvedOptions,\n );\n\n const analyticsService = new AnalyticsService(CallLog, Pipeline, logger, config.agents?.resolveAgent);\n\n const pipelineAnalyticsService = new PipelineAnalyticsService(\n CallLog,\n Pipeline,\n logger,\n config.agents?.resolveAgent,\n );\n\n const exportService = new ExportService(CallLog, pipelineAnalyticsService, logger);\n\n // 6. Create routes\n const routes = createRoutes(\n {\n pipelines: pipelineService,\n callLogs: callLogService,\n lifecycle: callLogLifecycleService,\n timeline: timelineService,\n analytics: analyticsService,\n pipelineAnalytics: pipelineAnalyticsService,\n settings: settingsService,\n export: exportService,\n },\n {\n authenticateRequest: config.adapters.authenticateAgent\n ? async (req) => {\n const expressReq = req as unknown as { headers: Record<string, string | undefined> };\n const authHeader = expressReq.headers?.['authorization'];\n const token = authHeader?.startsWith('Bearer ')\n ? authHeader.slice(7)\n : authHeader;\n if (!token) return null;\n return config.adapters.authenticateAgent(token);\n }\n : undefined,\n logger,\n enableAgentScoping: resolvedOptions.enableAgentScoping,\n },\n );\n\n // 7. Start FollowUpWorker\n const followUpWorker = new FollowUpWorker({\n CallLog,\n hooks: { onFollowUpDue: config.hooks?.onFollowUpDue },\n logger,\n options: resolvedOptions,\n });\n\n followUpWorker.start();\n\n // 8. Return engine object\n async function destroy(): Promise<void> {\n followUpWorker.stop();\n logger.info('CallLogEngine destroyed');\n }\n\n return {\n pipelines: pipelineService,\n callLogs: callLogService,\n lifecycle: callLogLifecycleService,\n timeline: timelineService,\n analytics: analyticsService,\n pipelineAnalytics: pipelineAnalyticsService,\n settings: settingsService,\n export: exportService,\n routes,\n models: { Pipeline, CallLog, CallLogSettings },\n destroy,\n };\n}\n\n// ── Barrel re-exports ─────────────────────────────────────────────────────────\n\nexport * from './constants/index.js';\nexport * from './errors/index.js';\nexport * from './schemas/pipeline.schema.js';\nexport * from './schemas/call-log.schema.js';\nexport * from './schemas/call-log-settings.schema.js';\nexport * from './validation/pipeline.validator.js';\nexport { SettingsService } from './services/settings.service.js';\nexport { PipelineService } from './services/pipeline.service.js';\nexport { TimelineService } from './services/timeline.service.js';\nexport { CallLogService } from './services/call-log.service.js';\nexport { CallLogLifecycleService } from './services/call-log-lifecycle.service.js';\nexport { AnalyticsService } from './services/analytics.service.js';\nexport { PipelineAnalyticsService } from './services/pipeline-analytics.service.js';\nexport { ExportService } from './services/export.service.js';\nexport { FollowUpWorker } from './workers/follow-up.worker.js';\nexport { createRoutes } from './routes/index.js';\nexport type { CallLogEngineConfig, ResolvedOptions } from '@astralibx/call-log-types';\nexport { DEFAULT_OPTIONS } from '@astralibx/call-log-types';\n"]}