From b195cccb01747b78af0041d55b4e04d0ddc48ecc Mon Sep 17 00:00:00 2001 From: Joel Date: Fri, 30 Jan 2026 02:22:26 -0600 Subject: [PATCH 1/4] Phase 1: Multi-channel queue system in Rust with IPC and TS bridge Rust engine (4 new files, 1839 lines): - channel_types.rs: ActivityDomain enum, QueueItemBehavior trait with RTOS aging - channel_items.rs: Voice (always urgent, never kicked), Chat (per-room consolidation), Task (dependency-aware, overdue urgency) + ChannelEnqueueRequest discriminated union - channel_queue.rs: Generic priority queue with capacity kick management - channel_registry.rs: Domain routing, service_cycle() with state-gated scheduling IPC layer (5 new commands): - channel/enqueue, channel/dequeue, channel/status, channel/service-cycle, channel/clear - Per-persona registry auto-creation with Arc> TypeScript bridge: - RustCoreIPC.ts: 5 low-level IPC methods - RustCognitionBridge.ts: 4 high-level bridge methods with forensic logging - PersonaInbox.ts: Rust-first routing with TS fallback - QueueItemTypes.ts: toChannelEnqueueRequest() factory - 6 ts-rs generated type exports 232 tests pass, zero clippy warnings in new code. --- .../generated/persona/ActivityDomain.ts | 7 + .../persona/ChannelEnqueueRequest.ts | 6 + .../persona/ChannelRegistryStatus.ts | 7 + .../shared/generated/persona/ChannelStatus.ts | 7 + .../generated/persona/ConsolidatedContext.ts | 6 + .../generated/persona/ServiceCycleResult.ts | 28 + .../jtag/shared/generated/persona/index.ts | 8 + .../user/server/modules/PersonaInbox.ts | 45 +- .../user/server/modules/QueueItemTypes.ts | 63 ++ .../server/modules/RustCognitionBridge.ts | 106 +++ .../continuum-core/bindings/RustCoreIPC.ts | 110 +++ .../workers/continuum-core/src/ipc/mod.rs | 264 ++++++- .../src/persona/channel_items.rs | 709 ++++++++++++++++++ .../src/persona/channel_queue.rs | 463 ++++++++++++ .../src/persona/channel_registry.rs | 433 +++++++++++ .../src/persona/channel_types.rs | 234 ++++++ .../workers/continuum-core/src/persona/mod.rs | 14 +- 17 files changed, 2506 insertions(+), 4 deletions(-) create mode 100644 src/debug/jtag/shared/generated/persona/ActivityDomain.ts create mode 100644 src/debug/jtag/shared/generated/persona/ChannelEnqueueRequest.ts create mode 100644 src/debug/jtag/shared/generated/persona/ChannelRegistryStatus.ts create mode 100644 src/debug/jtag/shared/generated/persona/ChannelStatus.ts create mode 100644 src/debug/jtag/shared/generated/persona/ConsolidatedContext.ts create mode 100644 src/debug/jtag/shared/generated/persona/ServiceCycleResult.ts create mode 100644 src/debug/jtag/workers/continuum-core/src/persona/channel_items.rs create mode 100644 src/debug/jtag/workers/continuum-core/src/persona/channel_queue.rs create mode 100644 src/debug/jtag/workers/continuum-core/src/persona/channel_registry.rs create mode 100644 src/debug/jtag/workers/continuum-core/src/persona/channel_types.rs diff --git a/src/debug/jtag/shared/generated/persona/ActivityDomain.ts b/src/debug/jtag/shared/generated/persona/ActivityDomain.ts new file mode 100644 index 000000000..83b423021 --- /dev/null +++ b/src/debug/jtag/shared/generated/persona/ActivityDomain.ts @@ -0,0 +1,7 @@ +// This file was generated by [ts-rs](https://github.com/Aleph-Alpha/ts-rs). Do not edit this file manually. + +/** + * Activity domain for channel routing. + * Each domain has one ChannelQueue. Items route to their domain's queue. + */ +export type ActivityDomain = "AUDIO" | "CHAT" | "BACKGROUND"; diff --git a/src/debug/jtag/shared/generated/persona/ChannelEnqueueRequest.ts b/src/debug/jtag/shared/generated/persona/ChannelEnqueueRequest.ts new file mode 100644 index 000000000..b32f31d2b --- /dev/null +++ b/src/debug/jtag/shared/generated/persona/ChannelEnqueueRequest.ts @@ -0,0 +1,6 @@ +// This file was generated by [ts-rs](https://github.com/Aleph-Alpha/ts-rs). Do not edit this file manually. + +/** + * IPC request to enqueue any item type. Discriminated by `item_type` field. + */ +export type ChannelEnqueueRequest = { "item_type": "voice", id: string, room_id: string, content: string, sender_id: string, sender_name: string, sender_type: string, voice_session_id: string, timestamp: number, priority: number, } | { "item_type": "chat", id: string, room_id: string, content: string, sender_id: string, sender_name: string, sender_type: string, mentions: boolean, timestamp: number, priority: number, } | { "item_type": "task", id: string, task_id: string, assignee_id: string, created_by: string, task_domain: string, task_type: string, context_id: string, description: string, priority: number, status: string, timestamp: number, due_date: bigint | null, estimated_duration: bigint | null, depends_on: Array, blocked_by: Array, }; diff --git a/src/debug/jtag/shared/generated/persona/ChannelRegistryStatus.ts b/src/debug/jtag/shared/generated/persona/ChannelRegistryStatus.ts new file mode 100644 index 000000000..353cd5425 --- /dev/null +++ b/src/debug/jtag/shared/generated/persona/ChannelRegistryStatus.ts @@ -0,0 +1,7 @@ +// This file was generated by [ts-rs](https://github.com/Aleph-Alpha/ts-rs). Do not edit this file manually. +import type { ChannelStatus } from "./ChannelStatus"; + +/** + * Full channel registry status + */ +export type ChannelRegistryStatus = { channels: Array, total_size: number, has_urgent_work: boolean, has_work: boolean, }; diff --git a/src/debug/jtag/shared/generated/persona/ChannelStatus.ts b/src/debug/jtag/shared/generated/persona/ChannelStatus.ts new file mode 100644 index 000000000..3f6e0ebb6 --- /dev/null +++ b/src/debug/jtag/shared/generated/persona/ChannelStatus.ts @@ -0,0 +1,7 @@ +// This file was generated by [ts-rs](https://github.com/Aleph-Alpha/ts-rs). Do not edit this file manually. +import type { ActivityDomain } from "./ActivityDomain"; + +/** + * Per-channel status snapshot + */ +export type ChannelStatus = { domain: ActivityDomain, size: number, has_urgent: boolean, has_work: boolean, }; diff --git a/src/debug/jtag/shared/generated/persona/ConsolidatedContext.ts b/src/debug/jtag/shared/generated/persona/ConsolidatedContext.ts new file mode 100644 index 000000000..8268efd04 --- /dev/null +++ b/src/debug/jtag/shared/generated/persona/ConsolidatedContext.ts @@ -0,0 +1,6 @@ +// This file was generated by [ts-rs](https://github.com/Aleph-Alpha/ts-rs). Do not edit this file manually. + +/** + * Context from a prior message consolidated into this chat item. + */ +export type ConsolidatedContext = { sender_id: string, sender_name: string, content: string, timestamp: bigint, }; diff --git a/src/debug/jtag/shared/generated/persona/ServiceCycleResult.ts b/src/debug/jtag/shared/generated/persona/ServiceCycleResult.ts new file mode 100644 index 000000000..93c252152 --- /dev/null +++ b/src/debug/jtag/shared/generated/persona/ServiceCycleResult.ts @@ -0,0 +1,28 @@ +// This file was generated by [ts-rs](https://github.com/Aleph-Alpha/ts-rs). Do not edit this file manually. +import type { ActivityDomain } from "./ActivityDomain"; +import type { ChannelRegistryStatus } from "./ChannelRegistryStatus"; + +/** + * Result from service_cycle() β€” what the TS loop should do next + */ +export type ServiceCycleResult = { +/** + * Should TS process an item? + */ +should_process: boolean, +/** + * The item to process (serialized). Null if should_process is false. + */ +item?: any, +/** + * Which domain the item came from + */ +channel?: ActivityDomain, +/** + * How long TS should sleep if no work (adaptive cadence from PersonaState) + */ +wait_ms: bigint, +/** + * Current channel sizes for monitoring + */ +stats: ChannelRegistryStatus, }; diff --git a/src/debug/jtag/shared/generated/persona/index.ts b/src/debug/jtag/shared/generated/persona/index.ts index 1e71ac738..b1237e645 100644 --- a/src/debug/jtag/shared/generated/persona/index.ts +++ b/src/debug/jtag/shared/generated/persona/index.ts @@ -18,3 +18,11 @@ export type { PersonaState } from './PersonaState'; export type { CognitionDecision } from './CognitionDecision'; export type { PriorityScore } from './PriorityScore'; export type { PriorityFactors } from './PriorityFactors'; + +// Channel system types +export type { ActivityDomain } from './ActivityDomain'; +export type { ChannelStatus } from './ChannelStatus'; +export type { ChannelRegistryStatus } from './ChannelRegistryStatus'; +export type { ChannelEnqueueRequest } from './ChannelEnqueueRequest'; +export type { ServiceCycleResult } from './ServiceCycleResult'; +export type { ConsolidatedContext } from './ConsolidatedContext'; diff --git a/src/debug/jtag/system/user/server/modules/PersonaInbox.ts b/src/debug/jtag/system/user/server/modules/PersonaInbox.ts index b991b9732..c45592552 100644 --- a/src/debug/jtag/system/user/server/modules/PersonaInbox.ts +++ b/src/debug/jtag/system/user/server/modules/PersonaInbox.ts @@ -17,9 +17,10 @@ import { EventEmitter } from 'events'; import type { UUID } from '../../../core/types/CrossPlatformUUID'; import type { QueueItem, InboxMessage, InboxTask } from './QueueItemTypes'; -import { isInboxMessage, isInboxTask, toChannelItem } from './QueueItemTypes'; +import { isInboxMessage, isInboxTask, toChannelItem, toChannelEnqueueRequest } from './QueueItemTypes'; import { getChatCoordinator } from '../../../coordination/server/ChatCoordinationStream'; import type { ChannelRegistry } from './channels/ChannelRegistry'; +import type { RustCognitionBridge } from './RustCognitionBridge'; // Re-export types for backward compatibility and external use export type { QueueItem, InboxMessage, InboxTask } from './QueueItemTypes'; @@ -82,6 +83,9 @@ export class PersonaInbox { // Multi-channel routing: items converted to BaseQueueItem subclasses and routed to channels private channelRegistry: ChannelRegistry | null = null; + // Rust-backed channel routing (Phase 1): when set, enqueue routes through Rust IPC + private rustBridge: RustCognitionBridge | null = null; + // Load-aware deduplication (feedback-driven) private queueStatsProvider: (() => { queueSize: number; activeRequests: number; maxConcurrent: number; load: number }) | null = null; private readonly DEDUP_WINDOW_MS = 3000; // Look back 3s for duplicates @@ -120,6 +124,16 @@ export class PersonaInbox { this.log(`πŸ”— Channel registry connected (${registry.domains().length} channels, signals wired)`); } + /** + * Set Rust cognition bridge for Rust-backed channel routing. + * When set, enqueue() routes items through Rust's multi-channel queue system + * instead of the TS ChannelRegistry. + */ + setRustBridge(bridge: RustCognitionBridge): void { + this.rustBridge = bridge; + this.log(`πŸ¦€ Rust bridge connected β€” enqueue routes through Rust channel system`); + } + /** * Add item to inbox (non-blocking) * Accepts both messages and tasks @@ -141,7 +155,34 @@ export class PersonaInbox { } } - // MULTI-CHANNEL PATH: Route to per-domain channel if registry available + // RUST CHANNEL PATH: Route through Rust IPC if bridge available + if (this.rustBridge) { + const enqueueRequest = toChannelEnqueueRequest(item); + try { + const result = await this.rustBridge.channelEnqueue(enqueueRequest); + + // Log with type-specific details + if (isInboxMessage(item)) { + const senderIdPreview = item.senderId?.slice(0, 8) ?? '[no-senderId]'; + this.log(`πŸ¦€ Routed ${enqueueRequest.item_type} β†’ Rust ${result.routed_to}: ${senderIdPreview} (priority=${item.priority.toFixed(2)}, total=${result.status.total_size})`); + if (item.sourceModality === 'voice') { + console.log(`πŸŽ™οΈπŸ”Š VOICE-DEBUG [Inbox] Routed VOICE β†’ Rust ${result.routed_to}: voiceSessionId=${item.voiceSessionId?.slice(0, 8) || 'undefined'}`); + } + } else if (isInboxTask(item)) { + this.log(`πŸ¦€ Routed task β†’ Rust ${result.routed_to}: ${item.taskType} (priority=${item.priority.toFixed(2)}, total=${result.status.total_size})`); + } + + // Signal TS service loop that work is available + this.signal.emit('work-available'); + + return true; // Item routed to Rust channel + } catch (error) { + this.log(`⚠️ Rust channel enqueue failed, falling through: ${error}`); + // Fall through to TS channel or legacy path + } + } + + // TS MULTI-CHANNEL PATH: Route to per-domain channel if registry available if (this.channelRegistry) { const channelItem = toChannelItem(item); const channel = this.channelRegistry.route(channelItem); diff --git a/src/debug/jtag/system/user/server/modules/QueueItemTypes.ts b/src/debug/jtag/system/user/server/modules/QueueItemTypes.ts index e8ba4dbbc..13a3e4df0 100644 --- a/src/debug/jtag/system/user/server/modules/QueueItemTypes.ts +++ b/src/debug/jtag/system/user/server/modules/QueueItemTypes.ts @@ -7,6 +7,7 @@ import type { UUID } from '../../../core/types/CrossPlatformUUID'; import type { TaskDomain, TaskType, TaskStatus } from '../../../data/entities/TaskEntity'; +import type { ChannelEnqueueRequest } from '../../../../shared/generated'; // Re-export TaskStatus for use in PersonaUser export type { TaskStatus }; @@ -309,3 +310,65 @@ export function taskEntityToInboxTask(task: { metadata: task.metadata }; } + +/** + * Convert QueueItem to ChannelEnqueueRequest for Rust IPC. + * Maps TS queue items to the discriminated union expected by Rust's channel system. + */ +export function toChannelEnqueueRequest(item: QueueItem): ChannelEnqueueRequest { + if (isInboxMessage(item)) { + // Voice messages + if (item.sourceModality === 'voice' && item.voiceSessionId) { + return { + item_type: 'voice', + id: item.id, + room_id: item.roomId, + content: item.content, + sender_id: item.senderId, + sender_name: item.senderName, + sender_type: item.senderType, + voice_session_id: item.voiceSessionId, + timestamp: item.timestamp, + priority: item.priority, + }; + } + + // Chat messages + return { + item_type: 'chat', + id: item.id, + room_id: item.roomId, + content: item.content, + sender_id: item.senderId, + sender_name: item.senderName, + sender_type: item.senderType, + mentions: item.mentions ?? false, + timestamp: item.timestamp, + priority: item.priority, + }; + } + + if (isInboxTask(item)) { + return { + item_type: 'task', + id: item.id, + task_id: item.taskId, + assignee_id: item.assigneeId, + created_by: item.createdBy, + task_domain: item.domain, + task_type: item.taskType, + context_id: item.contextId, + description: item.description, + priority: item.priority, + status: item.status, + timestamp: item.timestamp, + due_date: item.dueDate != null ? BigInt(item.dueDate) : null, + estimated_duration: item.estimatedDuration != null ? BigInt(item.estimatedDuration) : null, + depends_on: item.dependsOn ?? [], + blocked_by: item.blockedBy ?? [], + }; + } + + const _exhaustive: never = item; + throw new Error(`Unknown queue item type: ${(item as QueueItem).type}`); +} diff --git a/src/debug/jtag/system/user/server/modules/RustCognitionBridge.ts b/src/debug/jtag/system/user/server/modules/RustCognitionBridge.ts index ebd01c345..c6e9d1791 100644 --- a/src/debug/jtag/system/user/server/modules/RustCognitionBridge.ts +++ b/src/debug/jtag/system/user/server/modules/RustCognitionBridge.ts @@ -22,6 +22,9 @@ import type { PriorityScore, PersonaState, SenderType, + ActivityDomain, + ChannelRegistryStatus, + ChannelEnqueueRequest, } from '../../../../shared/generated'; import type { UUID } from '../../../core/types/CrossPlatformUUID'; import { SubsystemLogger } from './being/logging/SubsystemLogger'; @@ -254,6 +257,109 @@ export class RustCognitionBridge { } } + // ======================================================================== + // Channel System β€” Multi-domain queue management in Rust + // ======================================================================== + + /** + * Enqueue an item into Rust's channel system. + * Routes to correct domain (AUDIO/CHAT/BACKGROUND) based on item type. + * THROWS on failure + */ + async channelEnqueue(item: ChannelEnqueueRequest): Promise<{ routed_to: ActivityDomain; status: ChannelRegistryStatus }> { + this.assertReady('channelEnqueue'); + const start = performance.now(); + + try { + const result = await this.client.channelEnqueue(this.personaId, item); + const elapsed = performance.now() - start; + + this.logger.info(`Channel enqueue: routed to ${result.routed_to}, total=${result.status.total_size} (${elapsed.toFixed(2)}ms)`); + return result; + } catch (error) { + const elapsed = performance.now() - start; + this.logger.error(`channelEnqueue FAILED after ${elapsed.toFixed(2)}ms`); + this.logger.error(`Error: ${error}`); + throw error; + } + } + + /** + * Run one service cycle: consolidate + dequeue next item to process. + * This is the main scheduling entry point replacing TS-side channel iteration. + * THROWS on failure + */ + async serviceCycle(): Promise<{ + should_process: boolean; + item: any | null; + channel: ActivityDomain | null; + wait_ms: number; + stats: ChannelRegistryStatus; + }> { + this.assertReady('serviceCycle'); + const start = performance.now(); + + try { + const result = await this.client.channelServiceCycle(this.personaId); + const elapsed = performance.now() - start; + + if (result.should_process) { + this.logger.info(`Service cycle: process ${result.channel} item (${elapsed.toFixed(2)}ms) total=${result.stats.total_size}`); + } else if (elapsed > 5) { + this.logger.warn(`Service cycle SLOW idle: ${elapsed.toFixed(2)}ms (target <1ms) wait=${result.wait_ms}ms`); + } + + return result; + } catch (error) { + const elapsed = performance.now() - start; + this.logger.error(`serviceCycle FAILED after ${elapsed.toFixed(2)}ms`); + this.logger.error(`Error: ${error}`); + throw error; + } + } + + /** + * Get per-channel status snapshot + * THROWS on failure + */ + async channelStatus(): Promise { + this.assertReady('channelStatus'); + const start = performance.now(); + + try { + const result = await this.client.channelStatus(this.personaId); + const elapsed = performance.now() - start; + + this.logger.info(`Channel status: total=${result.total_size}, urgent=${result.has_urgent_work} (${elapsed.toFixed(2)}ms)`); + return result; + } catch (error) { + const elapsed = performance.now() - start; + this.logger.error(`channelStatus FAILED after ${elapsed.toFixed(2)}ms`); + this.logger.error(`Error: ${error}`); + throw error; + } + } + + /** + * Clear all channel queues + * THROWS on failure + */ + async channelClear(): Promise { + this.assertReady('channelClear'); + const start = performance.now(); + + try { + await this.client.channelClear(this.personaId); + const elapsed = performance.now() - start; + this.logger.info(`Channels cleared (${elapsed.toFixed(2)}ms)`); + } catch (error) { + const elapsed = performance.now() - start; + this.logger.error(`channelClear FAILED after ${elapsed.toFixed(2)}ms`); + this.logger.error(`Error: ${error}`); + throw error; + } + } + /** * Get bridge stats for debugging */ diff --git a/src/debug/jtag/workers/continuum-core/bindings/RustCoreIPC.ts b/src/debug/jtag/workers/continuum-core/bindings/RustCoreIPC.ts index 290284e16..f7cf6149f 100644 --- a/src/debug/jtag/workers/continuum-core/bindings/RustCoreIPC.ts +++ b/src/debug/jtag/workers/continuum-core/bindings/RustCoreIPC.ts @@ -22,6 +22,10 @@ import type { CognitionDecision, PriorityScore, PersonaState, + ActivityDomain, + ChannelRegistryStatus, + ChannelEnqueueRequest, + ServiceCycleResult, } from '../../../shared/generated'; // ============================================================================ @@ -461,6 +465,112 @@ export class RustCoreIPCClient extends EventEmitter { return response.result as PersonaState & { service_cadence_ms: number }; } + // ======================================================================== + // Channel System Methods + // ======================================================================== + + /** + * Enqueue an item into the channel system. + * Item is routed to the correct domain channel (AUDIO/CHAT/BACKGROUND). + */ + async channelEnqueue( + personaId: string, + item: ChannelEnqueueRequest + ): Promise<{ routed_to: ActivityDomain; status: ChannelRegistryStatus }> { + const response = await this.request({ + command: 'channel/enqueue', + persona_id: personaId, + item, + }); + + if (!response.success) { + throw new Error(response.error || 'Failed to enqueue channel item'); + } + + return response.result as { routed_to: ActivityDomain; status: ChannelRegistryStatus }; + } + + /** + * Dequeue highest-priority item from a specific domain or any domain. + */ + async channelDequeue( + personaId: string, + domain?: ActivityDomain + ): Promise<{ item: any | null; has_more: boolean }> { + const response = await this.request({ + command: 'channel/dequeue', + persona_id: personaId, + domain: domain ?? null, + }); + + if (!response.success) { + throw new Error(response.error || 'Failed to dequeue channel item'); + } + + return response.result as { item: any | null; has_more: boolean }; + } + + /** + * Get per-channel status snapshot. + */ + async channelStatus(personaId: string): Promise { + const response = await this.request({ + command: 'channel/status', + persona_id: personaId, + }); + + if (!response.success) { + throw new Error(response.error || 'Failed to get channel status'); + } + + return response.result as ChannelRegistryStatus; + } + + /** + * Run one service cycle: consolidate all channels, return next item to process. + * This is the main scheduling entry point β€” replaces TS-side channel iteration. + */ + async channelServiceCycle(personaId: string): Promise<{ + should_process: boolean; + item: any | null; + channel: ActivityDomain | null; + wait_ms: number; + stats: ChannelRegistryStatus; + }> { + const response = await this.request({ + command: 'channel/service-cycle', + persona_id: personaId, + }); + + if (!response.success) { + throw new Error(response.error || 'Failed to run service cycle'); + } + + // Convert bigint wait_ms to number (Rust u64 β†’ ts-rs bigint β†’ JS number) + const result = response.result; + return { + should_process: result.should_process, + item: result.item ?? null, + channel: result.channel ?? null, + wait_ms: Number(result.wait_ms), + stats: result.stats, + }; + } + + /** + * Clear all channel queues for a persona. + */ + async channelClear(personaId: string): Promise { + const response = await this.request({ + command: 'channel/clear', + persona_id: personaId, + }); + + if (!response.success) { + throw new Error(response.error || 'Failed to clear channels'); + } + } + /** * Disconnect from server */ diff --git a/src/debug/jtag/workers/continuum-core/src/ipc/mod.rs b/src/debug/jtag/workers/continuum-core/src/ipc/mod.rs index 93c9e963e..c488955d6 100644 --- a/src/debug/jtag/workers/continuum-core/src/ipc/mod.rs +++ b/src/debug/jtag/workers/continuum-core/src/ipc/mod.rs @@ -9,7 +9,7 @@ /// - JSON protocol (JTAGRequest/JTAGResponse) /// - Performance timing on every request use crate::voice::{UtteranceEvent, VoiceParticipant}; -use crate::persona::{PersonaInbox, PersonaCognitionEngine, InboxMessage, SenderType, Modality}; +use crate::persona::{PersonaInbox, PersonaCognitionEngine, InboxMessage, SenderType, Modality, ChannelRegistry, ChannelEnqueueRequest, ActivityDomain, PersonaState}; use crate::rag::RagEngine; use crate::logging::TimingGuard; use ts_rs::TS; @@ -190,6 +190,42 @@ enum Request { #[serde(rename = "cognition/get-state")] CognitionGetState { persona_id: String }, + // ======================================================================== + // Channel Commands + // ======================================================================== + + /// Route an item to its domain channel queue + #[serde(rename = "channel/enqueue")] + ChannelEnqueue { + persona_id: String, + item: ChannelEnqueueRequest, + }, + + /// Pop the highest-priority item from a specific domain channel + #[serde(rename = "channel/dequeue")] + ChannelDequeue { + persona_id: String, + domain: Option, // "AUDIO", "CHAT", "BACKGROUND" or null for any + }, + + /// Get per-channel status snapshot + #[serde(rename = "channel/status")] + ChannelStatus { + persona_id: String, + }, + + /// Run one service cycle: consolidate + return next item to process + #[serde(rename = "channel/service-cycle")] + ChannelServiceCycle { + persona_id: String, + }, + + /// Clear all channel queues + #[serde(rename = "channel/clear")] + ChannelClear { + persona_id: String, + }, + #[serde(rename = "health-check")] HealthCheck, @@ -242,6 +278,7 @@ struct ServerState { voice_service: Arc, inboxes: Arc>>, cognition_engines: Arc>>, + channel_registries: Arc>>, rag_engine: Arc, /// Shared CallManager for direct audio injection (speak-in-call). /// Audio never leaves Rust β€” IPC only returns metadata. @@ -259,6 +296,7 @@ impl ServerState { voice_service: Arc::new(crate::voice::voice_service::VoiceService::new()), inboxes: Arc::new(Mutex::new(HashMap::new())), cognition_engines: Arc::new(Mutex::new(HashMap::new())), + channel_registries: Arc::new(Mutex::new(HashMap::new())), rag_engine: Arc::new(RagEngine::new()), call_manager, audio_pool: Arc::new(crate::voice::audio_buffer::AudioBufferPool::new()), @@ -757,6 +795,172 @@ impl ServerState { }))) } + // ================================================================ + // Channel Handlers + // ================================================================ + + Request::ChannelEnqueue { persona_id, item } => { + let _timer = TimingGuard::new("ipc", "channel_enqueue"); + + let persona_uuid = match Uuid::parse_str(&persona_id) { + Ok(u) => u, + Err(e) => return HandleResult::Json(Response::error(format!("Invalid persona_id: {e}"))), + }; + + let queue_item = match item.to_queue_item() { + Ok(qi) => qi, + Err(e) => return HandleResult::Json(Response::error(e)), + }; + + let mut registries = match self.channel_registries.lock() { + Ok(r) => r, + Err(e) => return HandleResult::Json(Response::error(format!("Lock poisoned: {e}"))), + }; + + let (registry, _state) = registries + .entry(persona_uuid) + .or_insert_with(|| (ChannelRegistry::new(), PersonaState::new())); + + match registry.route(queue_item) { + Ok(domain) => { + let status = registry.status(); + HandleResult::Json(Response::success(serde_json::json!({ + "routed_to": domain, + "status": status, + }))) + } + Err(e) => HandleResult::Json(Response::error(e)), + } + } + + Request::ChannelDequeue { persona_id, domain } => { + let _timer = TimingGuard::new("ipc", "channel_dequeue"); + + let persona_uuid = match Uuid::parse_str(&persona_id) { + Ok(u) => u, + Err(e) => return HandleResult::Json(Response::error(format!("Invalid persona_id: {e}"))), + }; + + let mut registries = match self.channel_registries.lock() { + Ok(r) => r, + Err(e) => return HandleResult::Json(Response::error(format!("Lock poisoned: {e}"))), + }; + + let (registry, _state) = match registries.get_mut(&persona_uuid) { + Some(r) => r, + None => return HandleResult::Json(Response::error(format!("No channel registry for {persona_id}"))), + }; + + // Parse optional domain filter + let target_domain: Option = match &domain { + Some(d) => match serde_json::from_value::(serde_json::json!(d)) { + Ok(ad) => Some(ad), + Err(e) => return HandleResult::Json(Response::error(format!("Invalid domain '{d}': {e}"))), + }, + None => None, + }; + + let item = match target_domain { + Some(d) => registry.get_mut(d).and_then(|ch| ch.pop()), + None => { + // Pop from highest-priority channel that has work + use crate::persona::channel_types::DOMAIN_PRIORITY_ORDER; + let mut popped = None; + for &d in DOMAIN_PRIORITY_ORDER { + if let Some(ch) = registry.get_mut(d) { + if ch.has_work() { + popped = ch.pop(); + break; + } + } + } + popped + } + }; + + match item { + Some(qi) => HandleResult::Json(Response::success(serde_json::json!({ + "item": qi.to_json(), + "has_more": registry.has_work(), + }))), + None => HandleResult::Json(Response::success(serde_json::json!({ + "item": null, + "has_more": false, + }))), + } + } + + Request::ChannelStatus { persona_id } => { + let _timer = TimingGuard::new("ipc", "channel_status"); + + let persona_uuid = match Uuid::parse_str(&persona_id) { + Ok(u) => u, + Err(e) => return HandleResult::Json(Response::error(format!("Invalid persona_id: {e}"))), + }; + + let registries = match self.channel_registries.lock() { + Ok(r) => r, + Err(e) => return HandleResult::Json(Response::error(format!("Lock poisoned: {e}"))), + }; + + let (registry, _state) = match registries.get(&persona_uuid) { + Some(r) => r, + None => { + // Return empty status if no registry exists yet + return HandleResult::Json(Response::success(serde_json::json!({ + "channels": [], + "total_size": 0, + "has_urgent_work": false, + "has_work": false, + }))); + } + }; + + let status = registry.status(); + HandleResult::Json(Response::success(serde_json::to_value(&status).unwrap_or_default())) + } + + Request::ChannelServiceCycle { persona_id } => { + let _timer = TimingGuard::new("ipc", "channel_service_cycle"); + + let persona_uuid = match Uuid::parse_str(&persona_id) { + Ok(u) => u, + Err(e) => return HandleResult::Json(Response::error(format!("Invalid persona_id: {e}"))), + }; + + let mut registries = match self.channel_registries.lock() { + Ok(r) => r, + Err(e) => return HandleResult::Json(Response::error(format!("Lock poisoned: {e}"))), + }; + + let (registry, state) = registries + .entry(persona_uuid) + .or_insert_with(|| (ChannelRegistry::new(), PersonaState::new())); + + let result = registry.service_cycle(state); + HandleResult::Json(Response::success(serde_json::to_value(&result).unwrap_or_default())) + } + + Request::ChannelClear { persona_id } => { + let _timer = TimingGuard::new("ipc", "channel_clear"); + + let persona_uuid = match Uuid::parse_str(&persona_id) { + Ok(u) => u, + Err(e) => return HandleResult::Json(Response::error(format!("Invalid persona_id: {e}"))), + }; + + let mut registries = match self.channel_registries.lock() { + Ok(r) => r, + Err(e) => return HandleResult::Json(Response::error(format!("Lock poisoned: {e}"))), + }; + + if let Some((registry, _state)) = registries.get_mut(&persona_uuid) { + registry.clear_all(); + } + + HandleResult::Json(Response::success(serde_json::json!({ "cleared": true }))) + } + Request::HealthCheck => { HandleResult::Json(Response::success(serde_json::json!({ "healthy": true }))) } @@ -1162,6 +1366,64 @@ mod tests { } } + // ======================================================================== + // Channel Command Deserialization Tests + // ======================================================================== + + #[test] + fn test_request_deserialization_channel_enqueue_chat() { + let json = r#"{ + "command": "channel/enqueue", + "persona_id": "550e8400-e29b-41d4-a716-446655440000", + "item": { + "item_type": "chat", + "id": "660e8400-e29b-41d4-a716-446655440000", + "room_id": "770e8400-e29b-41d4-a716-446655440000", + "content": "Hello team", + "sender_id": "880e8400-e29b-41d4-a716-446655440000", + "sender_name": "Joel", + "sender_type": "human", + "mentions": true, + "timestamp": 1234567890, + "priority": 0.7 + } + }"#; + let request: Request = serde_json::from_str(json).expect("Should parse channel/enqueue"); + match request { + Request::ChannelEnqueue { persona_id, item } => { + assert_eq!(persona_id, "550e8400-e29b-41d4-a716-446655440000"); + let queue_item = item.to_queue_item().expect("Should convert to queue item"); + assert_eq!(queue_item.item_type(), "chat"); + assert!(queue_item.is_urgent()); // mentions = true + } + _ => panic!("Expected ChannelEnqueue variant"), + } + } + + #[test] + fn test_request_deserialization_channel_service_cycle() { + let json = r#"{"command":"channel/service-cycle","persona_id":"550e8400-e29b-41d4-a716-446655440000"}"#; + let request: Request = serde_json::from_str(json).expect("Should parse channel/service-cycle"); + match request { + Request::ChannelServiceCycle { persona_id } => { + assert_eq!(persona_id, "550e8400-e29b-41d4-a716-446655440000"); + } + _ => panic!("Expected ChannelServiceCycle variant"), + } + } + + #[test] + fn test_request_deserialization_channel_status() { + let json = r#"{"command":"channel/status","persona_id":"550e8400-e29b-41d4-a716-446655440000"}"#; + let request: Request = serde_json::from_str(json).expect("Should parse channel/status"); + match request { + Request::ChannelStatus { persona_id } => { + assert_eq!(persona_id, "550e8400-e29b-41d4-a716-446655440000"); + } + _ => panic!("Expected ChannelStatus variant"), + } + } + // ======================================================================== // Integration Test: Full IPC Round-Trip via Unix Socket // Requires: continuum-core-server running (cargo test --ignored) diff --git a/src/debug/jtag/workers/continuum-core/src/persona/channel_items.rs b/src/debug/jtag/workers/continuum-core/src/persona/channel_items.rs new file mode 100644 index 000000000..e439e238a --- /dev/null +++ b/src/debug/jtag/workers/continuum-core/src/persona/channel_items.rs @@ -0,0 +1,709 @@ +//! Concrete Queue Item Structs +//! +//! Three item types implementing QueueItemBehavior trait: +//! - VoiceQueueItem: Always urgent, never consolidates, never kicked +//! - ChatQueueItem: Per-room consolidation, mention urgency, RTOS aging +//! - TaskQueueItem: Dependency-aware, overdue urgency, related-task consolidation +//! +//! Each item carries all data needed for TS processing after dequeue. +//! Serialization via to_json() sends full item data through IPC. + +use super::channel_types::{ActivityDomain, QueueItemBehavior}; +use super::types::SenderType; +use serde::{Deserialize, Serialize}; +use std::any::Any; +use std::time::{SystemTime, UNIX_EPOCH}; +use ts_rs::TS; +use uuid::Uuid; + +fn now_ms() -> u64 { + SystemTime::now() + .duration_since(UNIX_EPOCH) + .unwrap_or_default() + .as_millis() as u64 +} + +//============================================================================= +// VOICE QUEUE ITEM +//============================================================================= + +/// Voice: always urgent, never consolidates, never kicked. +/// Every utterance is unique and time-critical. FIFO within the channel. +#[derive(Debug, Clone, Serialize, Deserialize)] +pub struct VoiceQueueItem { + pub id: Uuid, + pub room_id: Uuid, + pub content: String, + pub sender_id: Uuid, + pub sender_name: String, + pub sender_type: SenderType, + pub voice_session_id: Uuid, + pub timestamp: u64, + pub enqueued_at: u64, + pub priority: f32, +} + +impl QueueItemBehavior for VoiceQueueItem { + fn item_type(&self) -> &'static str { "voice" } + fn domain(&self) -> ActivityDomain { ActivityDomain::Audio } + fn id(&self) -> Uuid { self.id } + fn timestamp(&self) -> u64 { self.timestamp } + fn base_priority(&self) -> f32 { 1.0 } + + // No aging needed β€” already max priority + fn aging_boost_ms(&self) -> f32 { 30_000.0 } + fn max_aging_boost(&self) -> f32 { 0.0 } + + // Always urgent β€” bypasses cognitive scheduler + fn is_urgent(&self) -> bool { true } + + // Never kicked β€” dropping voice mid-conversation is unacceptable + fn can_be_kicked(&self) -> bool { false } + fn kick_resistance(&self, _now_ms: u64, _enqueued_at_ms: u64) -> f32 { f32::INFINITY } + + fn as_any(&self) -> &dyn Any { self } + + fn to_json(&self) -> serde_json::Value { + serde_json::json!({ + "type": "voice", + "id": self.id.to_string(), + "roomId": self.room_id.to_string(), + "content": self.content, + "senderId": self.sender_id.to_string(), + "senderName": self.sender_name, + "senderType": self.sender_type, + "voiceSessionId": self.voice_session_id.to_string(), + "timestamp": self.timestamp, + "priority": self.priority, + }) + } +} + +//============================================================================= +// CHAT QUEUE ITEM +//============================================================================= + +/// Context from a prior message consolidated into this chat item. +#[derive(Debug, Clone, Serialize, Deserialize, TS)] +#[ts(export, export_to = "../../../shared/generated/persona/ConsolidatedContext.ts")] +pub struct ConsolidatedContext { + #[ts(type = "string")] + pub sender_id: Uuid, + pub sender_name: String, + pub content: String, + pub timestamp: u64, +} + +/// Chat: per-room consolidation, mention-based urgency, standard RTOS aging. +/// +/// When multiple messages from the same room are queued, they consolidate. +/// The latest message is the "trigger" (what the AI responds to). +/// Prior messages become consolidated_context (the AI has full room context). +#[derive(Debug, Clone, Serialize, Deserialize)] +pub struct ChatQueueItem { + pub id: Uuid, + pub room_id: Uuid, + pub content: String, + pub sender_id: Uuid, + pub sender_name: String, + pub sender_type: SenderType, + pub mentions: bool, + pub timestamp: u64, + pub enqueued_at: u64, + pub priority: f32, + /// Prior messages consolidated into this item (empty if not consolidated) + pub consolidated_context: Vec, +} + +impl QueueItemBehavior for ChatQueueItem { + fn item_type(&self) -> &'static str { "chat" } + fn domain(&self) -> ActivityDomain { ActivityDomain::Chat } + fn id(&self) -> Uuid { self.id } + fn timestamp(&self) -> u64 { self.timestamp } + fn base_priority(&self) -> f32 { self.priority } + + // Standard RTOS aging from defaults (30s to reach +0.5 boost) + + // Urgent only if persona is directly mentioned by name + fn is_urgent(&self) -> bool { self.mentions } + + // Consolidate with other chat items from the SAME ROOM + fn should_consolidate_with(&self, other: &dyn QueueItemBehavior) -> bool { + if other.item_type() != "chat" { + return false; + } + // Downcast to check room_id + if let Some(other_chat) = other.as_any().downcast_ref::() { + other_chat.room_id == self.room_id + } else { + false + } + } + + fn as_any(&self) -> &dyn Any { self } + + fn to_json(&self) -> serde_json::Value { + serde_json::json!({ + "type": "chat", + "id": self.id.to_string(), + "roomId": self.room_id.to_string(), + "content": self.content, + "senderId": self.sender_id.to_string(), + "senderName": self.sender_name, + "senderType": self.sender_type, + "mentions": self.mentions, + "timestamp": self.timestamp, + "priority": self.priority, + "consolidatedContext": self.consolidated_context, + "consolidatedCount": self.consolidated_context.len() + 1, + }) + } +} + +impl ChatQueueItem { + /// Consolidate this item with others from the same room. + /// Returns a new ChatQueueItem with merged context. + /// + /// Self = latest message (trigger). Others = prior context. + /// The AI responds to the trigger but has full room context. + pub fn consolidate_with_items(&self, others: &[&ChatQueueItem]) -> ChatQueueItem { + // Collect all messages (self + others), sort by timestamp + let mut all_messages: Vec<&ChatQueueItem> = others.to_vec(); + all_messages.push(self); + all_messages.sort_by_key(|m| m.timestamp); + + // Latest message is the trigger + let trigger = all_messages.last().unwrap(); + let prior = &all_messages[..all_messages.len() - 1]; + + // Build consolidated context + let mut context: Vec = self.consolidated_context.clone(); + for msg in prior { + context.push(ConsolidatedContext { + sender_id: msg.sender_id, + sender_name: msg.sender_name.clone(), + content: msg.content.clone(), + timestamp: msg.timestamp, + }); + } + context.sort_by_key(|c| c.timestamp); + + // Highest priority, carry forward mentions + let max_priority = all_messages.iter() + .map(|m| m.priority) + .fold(f32::NEG_INFINITY, f32::max); + let has_mentions = self.mentions || others.iter().any(|m| m.mentions); + + ChatQueueItem { + id: trigger.id, + room_id: trigger.room_id, + content: trigger.content.clone(), + sender_id: trigger.sender_id, + sender_name: trigger.sender_name.clone(), + sender_type: trigger.sender_type, + mentions: has_mentions, + timestamp: trigger.timestamp, + enqueued_at: self.enqueued_at, // Preserve original enqueue time for aging + priority: max_priority, + consolidated_context: context, + } + } +} + +//============================================================================= +// TASK QUEUE ITEM +//============================================================================= + +/// Task: dependency-aware, overdue urgency, related-task consolidation. +#[derive(Debug, Clone, Serialize, Deserialize)] +pub struct TaskQueueItem { + pub id: Uuid, + pub task_id: Uuid, + pub assignee_id: Uuid, + pub created_by: Uuid, + pub task_domain: String, + pub task_type: String, + pub context_id: Uuid, + pub description: String, + pub priority: f32, + pub status: String, // "pending", "in_progress", "completed", "blocked" + pub timestamp: u64, + pub enqueued_at: u64, + pub due_date: Option, + pub estimated_duration: Option, + pub depends_on: Vec, + pub blocked_by: Vec, + pub related_task_ids: Vec, + pub consolidated_count: u32, +} + +impl QueueItemBehavior for TaskQueueItem { + fn item_type(&self) -> &'static str { "task" } + fn domain(&self) -> ActivityDomain { ActivityDomain::Background } + fn id(&self) -> Uuid { self.id } + fn timestamp(&self) -> u64 { self.timestamp } + fn base_priority(&self) -> f32 { self.priority } + + // Urgent if past due date + fn is_urgent(&self) -> bool { + self.due_date.is_some_and(|d| d < now_ms()) + } + + // Don't kick in-progress tasks + fn can_be_kicked(&self) -> bool { + self.status != "in_progress" + } + + // Blocked tasks have zero kick resistance (kick blocked tasks first) + fn kick_resistance(&self, now_ms: u64, enqueued_at_ms: u64) -> f32 { + if !self.blocked_by.is_empty() { + return 0.0; + } + self.effective_priority(now_ms, enqueued_at_ms) + } + + // Consolidate related tasks: same task domain AND same context + fn should_consolidate_with(&self, other: &dyn QueueItemBehavior) -> bool { + if other.item_type() != "task" { + return false; + } + if let Some(other_task) = other.as_any().downcast_ref::() { + other_task.task_domain == self.task_domain + && other_task.context_id == self.context_id + } else { + false + } + } + + fn as_any(&self) -> &dyn Any { self } + + fn to_json(&self) -> serde_json::Value { + serde_json::json!({ + "type": "task", + "id": self.id.to_string(), + "taskId": self.task_id.to_string(), + "assigneeId": self.assignee_id.to_string(), + "createdBy": self.created_by.to_string(), + "taskDomain": self.task_domain, + "taskType": self.task_type, + "contextId": self.context_id.to_string(), + "description": self.description, + "priority": self.priority, + "status": self.status, + "timestamp": self.timestamp, + "dueDate": self.due_date, + "estimatedDuration": self.estimated_duration, + "dependsOn": self.depends_on.iter().map(|u| u.to_string()).collect::>(), + "blockedBy": self.blocked_by.iter().map(|u| u.to_string()).collect::>(), + "relatedTaskIds": self.related_task_ids.iter().map(|u| u.to_string()).collect::>(), + "consolidatedCount": self.consolidated_count, + }) + } +} + +impl TaskQueueItem { + /// Consolidate related tasks: keep highest priority as primary. + pub fn consolidate_with_items(&self, others: &[&TaskQueueItem]) -> TaskQueueItem { + let mut all_tasks: Vec<&TaskQueueItem> = others.to_vec(); + all_tasks.push(self); + all_tasks.sort_by(|a, b| b.priority.partial_cmp(&a.priority).unwrap_or(std::cmp::Ordering::Equal)); + + let primary = all_tasks[0]; + + let related: Vec = all_tasks.iter() + .filter(|t| t.id != primary.id) + .map(|t| t.task_id) + .collect(); + + TaskQueueItem { + id: primary.id, + task_id: primary.task_id, + assignee_id: primary.assignee_id, + created_by: primary.created_by, + task_domain: primary.task_domain.clone(), + task_type: primary.task_type.clone(), + context_id: primary.context_id, + description: primary.description.clone(), + priority: primary.priority, + status: primary.status.clone(), + timestamp: primary.timestamp, + enqueued_at: self.enqueued_at, + due_date: primary.due_date, + estimated_duration: primary.estimated_duration, + depends_on: primary.depends_on.clone(), + blocked_by: primary.blocked_by.clone(), + related_task_ids: related, + consolidated_count: all_tasks.len() as u32, + } + } +} + +//============================================================================= +// IPC REQUEST TYPES β€” For receiving items from TypeScript +//============================================================================= + +/// IPC request to enqueue any item type. Discriminated by `item_type` field. +#[derive(Debug, Clone, Serialize, Deserialize, TS)] +#[serde(tag = "item_type")] +#[ts(export, export_to = "../../../shared/generated/persona/ChannelEnqueueRequest.ts")] +pub enum ChannelEnqueueRequest { + #[serde(rename = "voice")] + Voice { + id: String, + room_id: String, + content: String, + sender_id: String, + sender_name: String, + sender_type: String, + voice_session_id: String, + #[ts(type = "number")] + timestamp: u64, + priority: f32, + }, + #[serde(rename = "chat")] + Chat { + id: String, + room_id: String, + content: String, + sender_id: String, + sender_name: String, + sender_type: String, + mentions: bool, + #[ts(type = "number")] + timestamp: u64, + priority: f32, + }, + #[serde(rename = "task")] + Task { + id: String, + task_id: String, + assignee_id: String, + created_by: String, + task_domain: String, + task_type: String, + context_id: String, + description: String, + priority: f32, + status: String, + #[ts(type = "number")] + timestamp: u64, + due_date: Option, + estimated_duration: Option, + depends_on: Vec, + blocked_by: Vec, + }, +} + +impl ChannelEnqueueRequest { + /// Convert IPC request to a boxed queue item. + /// Returns Err if UUIDs are invalid. + pub fn to_queue_item(&self) -> Result, String> { + let now = now_ms(); + match self { + ChannelEnqueueRequest::Voice { + id, room_id, content, sender_id, sender_name, + sender_type, voice_session_id, timestamp, priority, + } => { + Ok(Box::new(VoiceQueueItem { + id: parse_uuid(id, "id")?, + room_id: parse_uuid(room_id, "room_id")?, + content: content.clone(), + sender_id: parse_uuid(sender_id, "sender_id")?, + sender_name: sender_name.clone(), + sender_type: parse_sender_type(sender_type)?, + voice_session_id: parse_uuid(voice_session_id, "voice_session_id")?, + timestamp: *timestamp, + enqueued_at: now, + priority: *priority, + })) + } + ChannelEnqueueRequest::Chat { + id, room_id, content, sender_id, sender_name, + sender_type, mentions, timestamp, priority, + } => { + Ok(Box::new(ChatQueueItem { + id: parse_uuid(id, "id")?, + room_id: parse_uuid(room_id, "room_id")?, + content: content.clone(), + sender_id: parse_uuid(sender_id, "sender_id")?, + sender_name: sender_name.clone(), + sender_type: parse_sender_type(sender_type)?, + mentions: *mentions, + timestamp: *timestamp, + enqueued_at: now, + priority: *priority, + consolidated_context: Vec::new(), + })) + } + ChannelEnqueueRequest::Task { + id, task_id, assignee_id, created_by, task_domain, + task_type, context_id, description, priority, status, + timestamp, due_date, estimated_duration, depends_on, blocked_by, + } => { + let depends_on_uuids: Result, String> = depends_on.iter() + .map(|s| parse_uuid(s, "depends_on")) + .collect(); + let blocked_by_uuids: Result, String> = blocked_by.iter() + .map(|s| parse_uuid(s, "blocked_by")) + .collect(); + + Ok(Box::new(TaskQueueItem { + id: parse_uuid(id, "id")?, + task_id: parse_uuid(task_id, "task_id")?, + assignee_id: parse_uuid(assignee_id, "assignee_id")?, + created_by: parse_uuid(created_by, "created_by")?, + task_domain: task_domain.clone(), + task_type: task_type.clone(), + context_id: parse_uuid(context_id, "context_id")?, + description: description.clone(), + priority: *priority, + status: status.clone(), + timestamp: *timestamp, + enqueued_at: now, + due_date: *due_date, + estimated_duration: *estimated_duration, + depends_on: depends_on_uuids?, + blocked_by: blocked_by_uuids?, + related_task_ids: Vec::new(), + consolidated_count: 1, + })) + } + } + } +} + +fn parse_uuid(s: &str, field: &str) -> Result { + Uuid::parse_str(s).map_err(|e| format!("Invalid UUID for {field}: {e}")) +} + +fn parse_sender_type(s: &str) -> Result { + match s { + "human" => Ok(SenderType::Human), + "persona" => Ok(SenderType::Persona), + "agent" => Ok(SenderType::Agent), + "system" => Ok(SenderType::System), + _ => Err(format!("Invalid sender_type: {s}")), + } +} + +//============================================================================= +// TESTS +//============================================================================= + +#[cfg(test)] +mod tests { + use super::*; + + fn make_voice() -> VoiceQueueItem { + VoiceQueueItem { + id: Uuid::new_v4(), + room_id: Uuid::new_v4(), + content: "Hello from voice".into(), + sender_id: Uuid::new_v4(), + sender_name: "Joel".into(), + sender_type: SenderType::Human, + voice_session_id: Uuid::new_v4(), + timestamp: now_ms(), + enqueued_at: now_ms(), + priority: 1.0, + } + } + + fn make_chat(room_id: Uuid, mentions: bool, priority: f32) -> ChatQueueItem { + ChatQueueItem { + id: Uuid::new_v4(), + room_id, + content: "Chat message".into(), + sender_id: Uuid::new_v4(), + sender_name: "User".into(), + sender_type: SenderType::Human, + mentions, + timestamp: now_ms(), + enqueued_at: now_ms(), + priority, + consolidated_context: Vec::new(), + } + } + + fn make_task(domain: &str, context_id: Uuid) -> TaskQueueItem { + TaskQueueItem { + id: Uuid::new_v4(), + task_id: Uuid::new_v4(), + assignee_id: Uuid::new_v4(), + created_by: Uuid::new_v4(), + task_domain: domain.into(), + task_type: "review".into(), + context_id, + description: "Test task".into(), + priority: 0.5, + status: "pending".into(), + timestamp: now_ms(), + enqueued_at: now_ms(), + due_date: None, + estimated_duration: None, + depends_on: Vec::new(), + blocked_by: Vec::new(), + related_task_ids: Vec::new(), + consolidated_count: 1, + } + } + + #[test] + fn test_voice_always_urgent() { + let voice = make_voice(); + assert!(voice.is_urgent()); + assert!(!voice.can_be_kicked()); + assert_eq!(voice.base_priority(), 1.0); + assert_eq!(voice.max_aging_boost(), 0.0); + assert_eq!(voice.item_type(), "voice"); + assert_eq!(voice.domain(), ActivityDomain::Audio); + } + + #[test] + fn test_chat_mention_urgency() { + let room = Uuid::new_v4(); + let with_mention = make_chat(room, true, 0.8); + let without_mention = make_chat(room, false, 0.5); + + assert!(with_mention.is_urgent()); + assert!(!without_mention.is_urgent()); + } + + #[test] + fn test_chat_same_room_consolidation() { + let room = Uuid::new_v4(); + let other_room = Uuid::new_v4(); + let chat1 = make_chat(room, false, 0.5); + let chat2 = make_chat(room, false, 0.7); + let chat3 = make_chat(other_room, false, 0.6); + + // Same room: should consolidate + assert!(chat1.should_consolidate_with(&chat2)); + // Different room: should NOT consolidate + assert!(!chat1.should_consolidate_with(&chat3)); + } + + #[test] + fn test_chat_consolidation_merges() { + let room = Uuid::new_v4(); + let mut chat1 = make_chat(room, false, 0.5); + chat1.content = "First message".into(); + chat1.timestamp = 1000; + + let mut chat2 = make_chat(room, true, 0.8); + chat2.content = "Second message with @mention".into(); + chat2.timestamp = 2000; + + let consolidated = chat1.consolidate_with_items(&[&chat2]); + + // Trigger is the latest message (chat2, timestamp 2000) + assert_eq!(consolidated.timestamp, 2000); + assert_eq!(consolidated.content, "Second message with @mention"); + // Highest priority + assert_eq!(consolidated.priority, 0.8); + // Mentions carried forward + assert!(consolidated.mentions); + // Prior message is in context + assert_eq!(consolidated.consolidated_context.len(), 1); + assert_eq!(consolidated.consolidated_context[0].content, "First message"); + } + + #[test] + fn test_task_overdue_urgency() { + let ctx = Uuid::new_v4(); + let mut task = make_task("code", ctx); + assert!(!task.is_urgent()); // No due date + + task.due_date = Some(now_ms() + 60_000); // Due in 1 min + assert!(!task.is_urgent()); // Not yet overdue + + task.due_date = Some(now_ms() - 1000); // 1 second overdue + assert!(task.is_urgent()); + } + + #[test] + fn test_task_in_progress_not_kickable() { + let ctx = Uuid::new_v4(); + let mut task = make_task("code", ctx); + assert!(task.can_be_kicked()); // pending + + task.status = "in_progress".into(); + assert!(!task.can_be_kicked()); // in progress + } + + #[test] + fn test_task_same_domain_context_consolidation() { + let ctx = Uuid::new_v4(); + let task1 = make_task("code", ctx); + let task2 = make_task("code", ctx); + let task3 = make_task("memory", ctx); + let task4 = make_task("code", Uuid::new_v4()); + + // Same domain + context: consolidate + assert!(task1.should_consolidate_with(&task2)); + // Different domain: no + assert!(!task1.should_consolidate_with(&task3)); + // Different context: no + assert!(!task1.should_consolidate_with(&task4)); + } + + #[test] + fn test_effective_priority_aging() { + let room = Uuid::new_v4(); + let chat = make_chat(room, false, 0.3); + + let now = now_ms(); + let enqueued = now; // Just enqueued β€” no aging + let p0 = chat.effective_priority(now, enqueued); + assert!((p0 - 0.3).abs() < 0.01, "No aging expected, got {p0}"); + + // After 15s (half of 30s aging window) β†’ 0.25 boost + let p15 = chat.effective_priority(now + 15_000, enqueued); + assert!((p15 - 0.55).abs() < 0.05, "Expected ~0.55, got {p15}"); + + // After 30s (full aging) β†’ 0.5 boost β†’ capped at 0.8 + let p30 = chat.effective_priority(now + 30_000, enqueued); + assert!((p30 - 0.8).abs() < 0.05, "Expected ~0.8, got {p30}"); + + // After 60s β†’ still capped at 0.8 (max boost is 0.5) + let p60 = chat.effective_priority(now + 60_000, enqueued); + assert!((p60 - 0.8).abs() < 0.05, "Expected ~0.8 (capped), got {p60}"); + } + + #[test] + fn test_voice_no_aging() { + let voice = make_voice(); + let now = now_ms(); + let p0 = voice.effective_priority(now, now); + let p60 = voice.effective_priority(now + 60_000, now); + assert_eq!(p0, 1.0); + assert_eq!(p60, 1.0); // No aging boost + } + + #[test] + fn test_voice_does_not_consolidate_with_chat() { + let voice = make_voice(); + let chat = make_chat(Uuid::new_v4(), false, 0.5); + assert!(!voice.should_consolidate_with(&chat)); + } + + #[test] + fn test_ipc_request_roundtrip() { + let req = ChannelEnqueueRequest::Chat { + id: Uuid::new_v4().to_string(), + room_id: Uuid::new_v4().to_string(), + content: "Hello".into(), + sender_id: Uuid::new_v4().to_string(), + sender_name: "Joel".into(), + sender_type: "human".into(), + mentions: true, + timestamp: now_ms(), + priority: 0.8, + }; + + let item = req.to_queue_item().unwrap(); + assert_eq!(item.item_type(), "chat"); + assert!(item.is_urgent()); // mentions = true + assert_eq!(item.domain(), ActivityDomain::Chat); + } +} diff --git a/src/debug/jtag/workers/continuum-core/src/persona/channel_queue.rs b/src/debug/jtag/workers/continuum-core/src/persona/channel_queue.rs new file mode 100644 index 000000000..34fc80d1f --- /dev/null +++ b/src/debug/jtag/workers/continuum-core/src/persona/channel_queue.rs @@ -0,0 +1,463 @@ +//! ChannelQueue β€” Generic queue container that delegates all decisions to items +//! +//! This module has ZERO item-type-specific logic. It asks items: +//! - How to sort? β†’ item.effective_priority() +//! - Is this urgent? β†’ item.is_urgent() +//! - Can this be dropped? β†’ item.can_be_kicked() / item.kick_resistance() +//! - Should items merge? β†’ item.should_consolidate_with() +//! +//! One ChannelQueue per ActivityDomain. The CNS iterates channels in priority order. + +use super::channel_items::{ChatQueueItem, TaskQueueItem}; +use super::channel_types::{ActivityDomain, ChannelStatus, QueueItemBehavior}; +use std::time::{SystemTime, UNIX_EPOCH}; +use tracing::debug; + +fn now_ms() -> u64 { + SystemTime::now() + .duration_since(UNIX_EPOCH) + .unwrap_or_default() + .as_millis() as u64 +} + +/// Configuration for a channel queue +pub struct ChannelQueueConfig { + pub domain: ActivityDomain, + pub max_size: usize, + pub name: String, +} + +/// Generic queue container β€” delegates ALL behavioral decisions to items. +pub struct ChannelQueue { + domain: ActivityDomain, + name: String, + max_size: usize, + items: Vec>, +} + +impl ChannelQueue { + pub fn new(config: ChannelQueueConfig) -> Self { + Self { + domain: config.domain, + name: config.name, + max_size: config.max_size, + items: Vec::new(), + } + } + + // ========================================================================= + // ENQUEUE β€” Items decide their own kick policy + // ========================================================================= + + /// Add item to this channel's queue. + /// Sorts by effective_priority. If over capacity, kicks items that allow it + /// (lowest kick_resistance first). + pub fn enqueue(&mut self, item: Box) { + self.items.push(item); + self.sort(); + + // Capacity management: ASK ITEMS if they can be kicked + while self.items.len() > self.max_size { + let now = now_ms(); + // Find kickable items sorted by resistance (lowest first) + let mut kickable_indices: Vec<(usize, f32)> = self.items.iter() + .enumerate() + .filter(|(_, item)| item.can_be_kicked()) + .map(|(i, item)| { + (i, item.kick_resistance(now, item.timestamp())) + }) + .collect(); + + if kickable_indices.is_empty() { + break; // Nothing can be kicked β€” queue stays oversized + } + + // Sort by resistance ascending (lowest kicked first) + kickable_indices.sort_by(|a, b| a.1.partial_cmp(&b.1).unwrap_or(std::cmp::Ordering::Equal)); + + let kick_idx = kickable_indices[0].0; + let kicked = self.items.remove(kick_idx); + debug!( + "Kicked item {} (type={}, resistance={:.2}) from {} channel (size={})", + kicked.id(), + kicked.item_type(), + kickable_indices[0].1, + self.name, + self.items.len() + ); + } + } + + // ========================================================================= + // CONSOLIDATION β€” Items decide their own merge policy + // ========================================================================= + + /// Consolidate items in this channel. + /// Items decide: should_consolidate_with() determines groups. + /// Type-specific consolidation methods merge the groups. + /// + /// Called once per CNS service cycle before processing. + pub fn consolidate(&mut self) { + self.consolidate_rebuild(); + } + + /// Cleaner consolidation: collect groups, then rebuild in one pass. + fn consolidate_rebuild(&mut self) { + if self.items.len() <= 1 { + return; + } + + let mut consumed = vec![false; self.items.len()]; + let mut groups: Vec<(usize, Vec)> = Vec::new(); // (anchor_idx, group_member_indices) + + // Phase 1: identify groups + for i in 0..self.items.len() { + if consumed[i] { + continue; + } + + let mut group: Vec = Vec::new(); + #[allow(clippy::needless_range_loop)] // j indexes both consumed[] and self.items[] + for j in (i + 1)..self.items.len() { + if !consumed[j] && self.items[i].should_consolidate_with(self.items[j].as_ref()) { + group.push(j); + consumed[j] = true; + } + } + + if !group.is_empty() { + consumed[i] = true; + groups.push((i, group)); + } + } + + if groups.is_empty() { + return; // Nothing to consolidate + } + + // Phase 2: build consolidated items + let mut consolidated_items: Vec> = Vec::new(); + let mut all_consumed: Vec = vec![false; self.items.len()]; + + for (anchor_idx, group_indices) in &groups { + all_consumed[*anchor_idx] = true; + for &idx in group_indices { + all_consumed[idx] = true; + } + + let item_type = self.items[*anchor_idx].item_type(); + match item_type { + "chat" => { + if let Some(c) = self.consolidate_chat_group(*anchor_idx, group_indices) { + consolidated_items.push(c); + } + } + "task" => { + if let Some(c) = self.consolidate_task_group(*anchor_idx, group_indices) { + consolidated_items.push(c); + } + } + _ => { + // Can't consolidate unknown types β€” they stay unconsumed + all_consumed[*anchor_idx] = false; + for &idx in group_indices { + all_consumed[idx] = false; + } + } + } + } + + // Phase 3: rebuild items list + let old_items = std::mem::take(&mut self.items); + let mut new_items: Vec> = Vec::new(); + + // Add unconsumed items (singletons) + for (i, item) in old_items.into_iter().enumerate() { + if !all_consumed[i] { + new_items.push(item); + } + } + + // Add consolidated items + new_items.extend(consolidated_items); + + self.items = new_items; + self.sort(); + } + + /// Consolidate a group of chat items + fn consolidate_chat_group( + &self, + anchor_idx: usize, + group_indices: &[usize], + ) -> Option> { + let anchor = self.items[anchor_idx].as_any().downcast_ref::()?; + let others: Vec<&ChatQueueItem> = group_indices.iter() + .filter_map(|&idx| self.items[idx].as_any().downcast_ref::()) + .collect(); + + Some(Box::new(anchor.consolidate_with_items(&others))) + } + + /// Consolidate a group of task items + fn consolidate_task_group( + &self, + anchor_idx: usize, + group_indices: &[usize], + ) -> Option> { + let anchor = self.items[anchor_idx].as_any().downcast_ref::()?; + let others: Vec<&TaskQueueItem> = group_indices.iter() + .filter_map(|&idx| self.items[idx].as_any().downcast_ref::()) + .collect(); + + Some(Box::new(anchor.consolidate_with_items(&others))) + } + + // ========================================================================= + // ACCESSORS β€” All delegate to item properties + // ========================================================================= + + /// Any item in this channel reports itself as urgent + pub fn has_urgent_work(&self) -> bool { + self.items.iter().any(|i| i.is_urgent()) + } + + /// Channel has any items at all + pub fn has_work(&self) -> bool { + !self.items.is_empty() + } + + /// Number of items in this channel + pub fn size(&self) -> usize { + self.items.len() + } + + /// Look at the highest-priority item without removing it + pub fn peek(&self) -> Option<&dyn QueueItemBehavior> { + self.items.first().map(|i| i.as_ref()) + } + + /// Get the priority of the highest-priority item (for state gating check) + pub fn peek_priority(&self) -> f32 { + let now = now_ms(); + self.items.first() + .map(|i| i.effective_priority(now, i.timestamp())) + .unwrap_or(0.0) + } + + /// Remove and return the highest-priority item + pub fn pop(&mut self) -> Option> { + if self.items.is_empty() { + return None; + } + // Re-sort before popping (aging changes order) + self.sort(); + Some(self.items.remove(0)) + } + + /// Get channel status snapshot + pub fn status(&self) -> ChannelStatus { + ChannelStatus { + domain: self.domain, + size: self.items.len() as u32, + has_urgent: self.has_urgent_work(), + has_work: self.has_work(), + } + } + + /// Channel domain + pub fn domain(&self) -> ActivityDomain { + self.domain + } + + /// Clear all items + pub fn clear(&mut self) { + self.items.clear(); + } + + // ========================================================================= + // INTERNALS + // ========================================================================= + + fn sort(&mut self) { + let now = now_ms(); + self.items.sort_by(|a, b| { + // Use item timestamp as enqueued_at proxy (items set enqueued_at = now on construction) + let pa = a.effective_priority(now, a.timestamp()); + let pb = b.effective_priority(now, b.timestamp()); + // Higher priority first + pb.partial_cmp(&pa).unwrap_or(std::cmp::Ordering::Equal) + }); + } +} + +//============================================================================= +// TESTS +//============================================================================= + +#[cfg(test)] +mod tests { + use super::*; + use super::super::channel_items::*; + use super::super::types::SenderType; + use uuid::Uuid; + + fn make_chat_queue() -> ChannelQueue { + ChannelQueue::new(ChannelQueueConfig { + domain: ActivityDomain::Chat, + max_size: 10, + name: "chat".into(), + }) + } + + fn boxed_chat(room: Uuid, mentions: bool, priority: f32) -> Box { + Box::new(ChatQueueItem { + id: Uuid::new_v4(), + room_id: room, + content: format!("Message p={priority}"), + sender_id: Uuid::new_v4(), + sender_name: "User".into(), + sender_type: SenderType::Human, + mentions, + timestamp: now_ms(), + enqueued_at: now_ms(), + priority, + consolidated_context: Vec::new(), + }) + } + + fn boxed_voice() -> Box { + Box::new(VoiceQueueItem { + id: Uuid::new_v4(), + room_id: Uuid::new_v4(), + content: "Voice".into(), + sender_id: Uuid::new_v4(), + sender_name: "Joel".into(), + sender_type: SenderType::Human, + voice_session_id: Uuid::new_v4(), + timestamp: now_ms(), + enqueued_at: now_ms(), + priority: 1.0, + }) + } + + #[test] + fn test_enqueue_and_pop_priority_order() { + let mut queue = make_chat_queue(); + let room = Uuid::new_v4(); + + queue.enqueue(boxed_chat(room, false, 0.3)); + queue.enqueue(boxed_chat(room, false, 0.9)); + queue.enqueue(boxed_chat(room, false, 0.5)); + + assert_eq!(queue.size(), 3); + assert!(queue.has_work()); + + // Should pop highest priority first + let first = queue.pop().unwrap(); + assert!((first.base_priority() - 0.9).abs() < 0.01); + + let second = queue.pop().unwrap(); + assert!((second.base_priority() - 0.5).abs() < 0.01); + + let third = queue.pop().unwrap(); + assert!((third.base_priority() - 0.3).abs() < 0.01); + + assert!(!queue.has_work()); + } + + #[test] + fn test_capacity_kick() { + let mut queue = ChannelQueue::new(ChannelQueueConfig { + domain: ActivityDomain::Chat, + max_size: 3, + name: "small-chat".into(), + }); + let room = Uuid::new_v4(); + + queue.enqueue(boxed_chat(room, false, 0.9)); + queue.enqueue(boxed_chat(room, false, 0.5)); + queue.enqueue(boxed_chat(room, false, 0.3)); + assert_eq!(queue.size(), 3); + + // Adding a 4th should kick the lowest priority + queue.enqueue(boxed_chat(room, false, 0.7)); + assert_eq!(queue.size(), 3); // Still 3 after kick + } + + #[test] + fn test_voice_never_kicked() { + let mut queue = ChannelQueue::new(ChannelQueueConfig { + domain: ActivityDomain::Audio, + max_size: 2, + name: "audio".into(), + }); + + queue.enqueue(boxed_voice()); + queue.enqueue(boxed_voice()); + queue.enqueue(boxed_voice()); // Over capacity + + // Voice items can't be kicked, so queue stays oversized + assert_eq!(queue.size(), 3); + } + + #[test] + fn test_has_urgent_work() { + let mut queue = make_chat_queue(); + let room = Uuid::new_v4(); + + queue.enqueue(boxed_chat(room, false, 0.5)); + assert!(!queue.has_urgent_work()); + + queue.enqueue(boxed_chat(room, true, 0.8)); // mention = urgent + assert!(queue.has_urgent_work()); + } + + #[test] + fn test_chat_consolidation() { + let mut queue = make_chat_queue(); + let room = Uuid::new_v4(); + let other_room = Uuid::new_v4(); + + queue.enqueue(boxed_chat(room, false, 0.5)); + queue.enqueue(boxed_chat(room, false, 0.7)); + queue.enqueue(boxed_chat(room, false, 0.3)); + queue.enqueue(boxed_chat(other_room, false, 0.6)); + + assert_eq!(queue.size(), 4); + + queue.consolidate(); + + // 3 same-room messages β†’ 1 consolidated + 1 other-room = 2 + assert_eq!(queue.size(), 2); + } + + #[test] + fn test_peek_priority() { + let mut queue = make_chat_queue(); + let room = Uuid::new_v4(); + + queue.enqueue(boxed_chat(room, false, 0.3)); + queue.enqueue(boxed_chat(room, false, 0.9)); + + let p = queue.peek_priority(); + assert!((p - 0.9).abs() < 0.05, "Expected ~0.9, got {p}"); + } + + #[test] + fn test_status_snapshot() { + let mut queue = make_chat_queue(); + let room = Uuid::new_v4(); + + let status = queue.status(); + assert_eq!(status.size, 0); + assert!(!status.has_work); + assert!(!status.has_urgent); + + queue.enqueue(boxed_chat(room, true, 0.8)); + let status = queue.status(); + assert_eq!(status.size, 1); + assert!(status.has_work); + assert!(status.has_urgent); + } +} diff --git a/src/debug/jtag/workers/continuum-core/src/persona/channel_registry.rs b/src/debug/jtag/workers/continuum-core/src/persona/channel_registry.rs new file mode 100644 index 000000000..131e06b24 --- /dev/null +++ b/src/debug/jtag/workers/continuum-core/src/persona/channel_registry.rs @@ -0,0 +1,433 @@ +//! ChannelRegistry β€” Routes queue items to per-domain ChannelQueues +//! +//! The registry doesn't know item types β€” it routes by item.routing_domain(). +//! Each ActivityDomain has at most one ChannelQueue. +//! +//! Pattern: HashMap with global Notify signal. +//! When any channel receives work, the global signal wakes the service loop. + +use super::channel_queue::{ChannelQueue, ChannelQueueConfig}; +use super::channel_types::{ + ActivityDomain, ChannelRegistryStatus, QueueItemBehavior, ServiceCycleResult, + DOMAIN_PRIORITY_ORDER, +}; +use super::types::PersonaState; +use std::collections::HashMap; +use tracing::{debug, info}; + +/// Channel registry β€” routes items to per-domain queues. +/// Owns all channel queues and provides the service_cycle() entry point. +pub struct ChannelRegistry { + channels: HashMap, +} + +impl ChannelRegistry { + /// Create a new registry with default channels + pub fn new() -> Self { + let mut registry = Self { + channels: HashMap::new(), + }; + + // Register default channels with sizes matching TS implementation + registry.register(ChannelQueue::new(ChannelQueueConfig { + domain: ActivityDomain::Audio, + max_size: 50, + name: "AUDIO".into(), + })); + registry.register(ChannelQueue::new(ChannelQueueConfig { + domain: ActivityDomain::Chat, + max_size: 500, + name: "CHAT".into(), + })); + registry.register(ChannelQueue::new(ChannelQueueConfig { + domain: ActivityDomain::Background, + max_size: 200, + name: "BACKGROUND".into(), + })); + + info!( + "ChannelRegistry initialized with {} channels: {:?}", + registry.channels.len(), + registry.channels.keys().collect::>() + ); + + registry + } + + /// Register a channel queue for its domain + pub fn register(&mut self, queue: ChannelQueue) { + let domain = queue.domain(); + self.channels.insert(domain, queue); + } + + /// Route an item to its channel based on item.routing_domain(). + /// Returns Ok(domain) on success, Err if no channel registered. + pub fn route(&mut self, item: Box) -> Result { + let domain = item.routing_domain(); + match self.channels.get_mut(&domain) { + Some(queue) => { + debug!( + "Routing {} item {} to {} channel", + item.item_type(), + item.id(), + domain_name(domain) + ); + queue.enqueue(item); + Ok(domain) + } + None => Err(format!("No channel registered for domain {domain:?}")), + } + } + + /// Get channel by domain (immutable) + pub fn get(&self, domain: ActivityDomain) -> Option<&ChannelQueue> { + self.channels.get(&domain) + } + + /// Get channel by domain (mutable β€” for pop/consolidate) + pub fn get_mut(&mut self, domain: ActivityDomain) -> Option<&mut ChannelQueue> { + self.channels.get_mut(&domain) + } + + /// Does ANY channel have urgent work? + pub fn has_urgent_work(&self) -> bool { + self.channels.values().any(|c| c.has_urgent_work()) + } + + /// Does ANY channel have work? + pub fn has_work(&self) -> bool { + self.channels.values().any(|c| c.has_work()) + } + + /// Total items across all channels + pub fn total_size(&self) -> usize { + self.channels.values().map(|c| c.size()).sum() + } + + /// Consolidate all channels (items decide how) + pub fn consolidate_all(&mut self) { + for channel in self.channels.values_mut() { + channel.consolidate(); + } + } + + /// Get full status snapshot + pub fn status(&self) -> ChannelRegistryStatus { + let channels: Vec<_> = DOMAIN_PRIORITY_ORDER + .iter() + .filter_map(|domain| self.channels.get(domain).map(|c| c.status())) + .collect(); + + let total_size: u32 = channels.iter().map(|c| c.size).sum(); + let has_urgent = channels.iter().any(|c| c.has_urgent); + let has_work = channels.iter().any(|c| c.has_work); + + ChannelRegistryStatus { + channels, + total_size, + has_urgent_work: has_urgent, + has_work, + } + } + + /// Clear all channels + pub fn clear_all(&mut self) { + for channel in self.channels.values_mut() { + channel.clear(); + } + } + + // ========================================================================= + // SERVICE CYCLE β€” The main scheduling entry point + // ========================================================================= + + /// Execute one service cycle. + /// + /// 1. Consolidate all channels (items decide how) + /// 2. Update PersonaState (inbox_load, mood) + /// 3. Check urgent channels first (AUDIO β†’ CHAT β†’ BACKGROUND) + /// 4. Check non-urgent channels with state gating + /// 5. Return next item to process, or idle cadence + /// + /// This is the Rust equivalent of the TS CNS.serviceChannels() method. + pub fn service_cycle(&mut self, state: &mut PersonaState) -> ServiceCycleResult { + // 1. Consolidate all channels + self.consolidate_all(); + + // 2. Update state + state.inbox_load = self.total_size() as u32; + state.calculate_mood(); + + let stats = self.status(); + + // 3. Check urgent channels first (priority order) + for &domain in DOMAIN_PRIORITY_ORDER { + if let Some(channel) = self.channels.get(&domain) { + if channel.has_urgent_work() { + if let Some(item) = self.channels.get_mut(&domain).and_then(|c| c.pop()) { + debug!( + "Service cycle: urgent {} item from {:?} channel", + item.item_type(), + domain + ); + return ServiceCycleResult { + should_process: true, + item: Some(item.to_json()), + channel: Some(domain), + wait_ms: 0, + stats, + }; + } + } + } + } + + // 4. Non-urgent: check with state gating (skip Audio β€” already checked for urgent) + for &domain in &DOMAIN_PRIORITY_ORDER[1..] { + if let Some(channel) = self.channels.get(&domain) { + if channel.has_work() { + let peek_priority = channel.peek_priority(); + if state.should_engage(peek_priority) { + if let Some(item) = self.channels.get_mut(&domain).and_then(|c| c.pop()) { + debug!( + "Service cycle: non-urgent {} item from {:?} channel (priority {:.2})", + item.item_type(), + domain, + peek_priority + ); + return ServiceCycleResult { + should_process: true, + item: Some(item.to_json()), + channel: Some(domain), + wait_ms: 0, + stats, + }; + } + } + } + } + } + + // 5. No work β€” return adaptive cadence + ServiceCycleResult { + should_process: false, + item: None, + channel: None, + wait_ms: state.service_cadence_ms(), + stats, + } + } +} + +impl Default for ChannelRegistry { + fn default() -> Self { + Self::new() + } +} + +fn domain_name(domain: ActivityDomain) -> &'static str { + match domain { + ActivityDomain::Audio => "AUDIO", + ActivityDomain::Chat => "CHAT", + ActivityDomain::Background => "BACKGROUND", + } +} + +//============================================================================= +// TESTS +//============================================================================= + +#[cfg(test)] +mod tests { + use super::*; + use super::super::channel_items::*; + use super::super::types::SenderType; + use uuid::Uuid; + + fn now_ms() -> u64 { + std::time::SystemTime::now() + .duration_since(std::time::UNIX_EPOCH) + .unwrap_or_default() + .as_millis() as u64 + } + + fn boxed_chat(room: Uuid, mentions: bool, priority: f32) -> Box { + Box::new(ChatQueueItem { + id: Uuid::new_v4(), + room_id: room, + content: format!("Message p={priority}"), + sender_id: Uuid::new_v4(), + sender_name: "User".into(), + sender_type: SenderType::Human, + mentions, + timestamp: now_ms(), + enqueued_at: now_ms(), + priority, + consolidated_context: Vec::new(), + }) + } + + fn boxed_voice() -> Box { + Box::new(VoiceQueueItem { + id: Uuid::new_v4(), + room_id: Uuid::new_v4(), + content: "Voice".into(), + sender_id: Uuid::new_v4(), + sender_name: "Joel".into(), + sender_type: SenderType::Human, + voice_session_id: Uuid::new_v4(), + timestamp: now_ms(), + enqueued_at: now_ms(), + priority: 1.0, + }) + } + + #[test] + fn test_registry_default_channels() { + let registry = ChannelRegistry::new(); + assert!(registry.get(ActivityDomain::Audio).is_some()); + assert!(registry.get(ActivityDomain::Chat).is_some()); + assert!(registry.get(ActivityDomain::Background).is_some()); + } + + #[test] + fn test_route_to_correct_channel() { + let mut registry = ChannelRegistry::new(); + let room = Uuid::new_v4(); + + let domain = registry.route(boxed_chat(room, false, 0.5)).unwrap(); + assert_eq!(domain, ActivityDomain::Chat); + assert_eq!(registry.get(ActivityDomain::Chat).unwrap().size(), 1); + assert_eq!(registry.get(ActivityDomain::Audio).unwrap().size(), 0); + + let domain = registry.route(boxed_voice()).unwrap(); + assert_eq!(domain, ActivityDomain::Audio); + assert_eq!(registry.get(ActivityDomain::Audio).unwrap().size(), 1); + } + + #[test] + fn test_total_size() { + let mut registry = ChannelRegistry::new(); + let room = Uuid::new_v4(); + + registry.route(boxed_chat(room, false, 0.5)).unwrap(); + registry.route(boxed_chat(room, false, 0.7)).unwrap(); + registry.route(boxed_voice()).unwrap(); + + assert_eq!(registry.total_size(), 3); + } + + #[test] + fn test_has_urgent_work() { + let mut registry = ChannelRegistry::new(); + let room = Uuid::new_v4(); + + assert!(!registry.has_urgent_work()); + + registry.route(boxed_chat(room, false, 0.5)).unwrap(); + assert!(!registry.has_urgent_work()); // No mentions + + registry.route(boxed_voice()).unwrap(); + assert!(registry.has_urgent_work()); // Voice is always urgent + } + + #[test] + fn test_status_snapshot() { + let mut registry = ChannelRegistry::new(); + let room = Uuid::new_v4(); + + registry.route(boxed_chat(room, false, 0.5)).unwrap(); + registry.route(boxed_voice()).unwrap(); + + let status = registry.status(); + assert_eq!(status.total_size, 2); + assert!(status.has_urgent_work); + assert!(status.has_work); + assert_eq!(status.channels.len(), 3); // All domains reported + } + + #[test] + fn test_service_cycle_urgent_first() { + let mut registry = ChannelRegistry::new(); + let mut state = PersonaState::new(); + let room = Uuid::new_v4(); + + // Add chat first (non-urgent) + registry.route(boxed_chat(room, false, 0.5)).unwrap(); + // Add voice (urgent) + registry.route(boxed_voice()).unwrap(); + + // Service cycle should return voice first (urgent) + let result = registry.service_cycle(&mut state); + assert!(result.should_process); + assert_eq!(result.channel, Some(ActivityDomain::Audio)); + + // Next cycle returns chat + let result = registry.service_cycle(&mut state); + assert!(result.should_process); + assert_eq!(result.channel, Some(ActivityDomain::Chat)); + + // Empty β€” idle + let result = registry.service_cycle(&mut state); + assert!(!result.should_process); + assert!(result.wait_ms > 0); + } + + #[test] + fn test_service_cycle_state_gating() { + let mut registry = ChannelRegistry::new(); + let mut state = PersonaState::new(); + let room = Uuid::new_v4(); + + // Low priority chat + registry.route(boxed_chat(room, false, 0.3)).unwrap(); + + // Active mood β€” should engage with everything + let result = registry.service_cycle(&mut state); + assert!(result.should_process); + + // Force overwhelmed: compute_budget < 0.2 triggers Overwhelmed in calculate_mood() + // (can't just set mood directly since service_cycle calls calculate_mood) + state.compute_budget = 0.1; + registry.route(boxed_chat(room, false, 0.3)).unwrap(); + + let result = registry.service_cycle(&mut state); + // Overwhelmed skips low priority (0.3 < 0.8) + assert!(!result.should_process); + } + + #[test] + fn test_service_cycle_consolidates() { + let mut registry = ChannelRegistry::new(); + let mut state = PersonaState::new(); + let room = Uuid::new_v4(); + + // 3 messages from same room + registry.route(boxed_chat(room, false, 0.5)).unwrap(); + registry.route(boxed_chat(room, false, 0.7)).unwrap(); + registry.route(boxed_chat(room, false, 0.3)).unwrap(); + + assert_eq!(registry.total_size(), 3); + + // Service cycle consolidates before processing + let result = registry.service_cycle(&mut state); + assert!(result.should_process); + + // After consolidation + pop, should have fewer items + assert!(registry.total_size() < 3); + } + + #[test] + fn test_clear_all() { + let mut registry = ChannelRegistry::new(); + let room = Uuid::new_v4(); + + registry.route(boxed_chat(room, false, 0.5)).unwrap(); + registry.route(boxed_voice()).unwrap(); + + assert_eq!(registry.total_size(), 2); + + registry.clear_all(); + assert_eq!(registry.total_size(), 0); + } +} diff --git a/src/debug/jtag/workers/continuum-core/src/persona/channel_types.rs b/src/debug/jtag/workers/continuum-core/src/persona/channel_types.rs new file mode 100644 index 000000000..ccdf0157c --- /dev/null +++ b/src/debug/jtag/workers/continuum-core/src/persona/channel_types.rs @@ -0,0 +1,234 @@ +//! Channel Queue Types β€” ActivityDomain + QueueItemBehavior trait +//! +//! Mirrors the TypeScript BaseQueueItem abstract class as a Rust trait. +//! Items control their own behavior: urgency, consolidation, kick resistance, aging. +//! The queue is a generic container that delegates all decisions to items. +//! +//! Pattern: Template method via default trait implementations. +//! Subclasses (VoiceQueueItem, ChatQueueItem, TaskQueueItem) override only what differs. + +use serde::{Deserialize, Serialize}; +use std::any::Any; +use ts_rs::TS; +use uuid::Uuid; + +//============================================================================= +// ACTIVITY DOMAIN β€” Which channel an item routes to +//============================================================================= + +/// Activity domain for channel routing. +/// Each domain has one ChannelQueue. Items route to their domain's queue. +#[derive(Debug, Clone, Copy, Hash, Eq, PartialEq, Serialize, Deserialize, TS)] +#[serde(rename_all = "SCREAMING_SNAKE_CASE")] +#[ts(export, export_to = "../../../shared/generated/persona/ActivityDomain.ts")] +pub enum ActivityDomain { + /// Voice/audio: always urgent, never kicked, no consolidation + Audio, + /// Chat messages: per-room consolidation, mention urgency, RTOS aging + Chat, + /// Background tasks: dependency-aware, overdue urgency + Background, + // Future domains: + // RealtimeGame, + // Code, + // Music, + // RobotControl, +} + +/// All currently registered domains in priority order (highest first). +/// Used by service_cycle() to iterate channels. +pub const DOMAIN_PRIORITY_ORDER: &[ActivityDomain] = &[ + ActivityDomain::Audio, + ActivityDomain::Chat, + ActivityDomain::Background, +]; + +//============================================================================= +// QUEUE ITEM BEHAVIOR β€” Trait replacing TS BaseQueueItem abstract class +//============================================================================= + +/// Core trait for queue items. Items control their own destiny. +/// +/// The queue/channel is a generic container that asks items: +/// - How to sort? β†’ effective_priority() +/// - Is this urgent? β†’ is_urgent() +/// - Can it be dropped? β†’ can_be_kicked() / kick_resistance() +/// - Should items merge? β†’ should_consolidate_with() +/// +/// Default implementations provide sensible RTOS-style behavior. +/// Subclasses override only what differs (e.g., Voice: always urgent, never kicked). +pub trait QueueItemBehavior: Send + Sync + Any { + /// Runtime type discriminator (e.g., "voice", "chat", "task") + fn item_type(&self) -> &'static str; + + /// Which activity domain this item belongs to + fn domain(&self) -> ActivityDomain; + + /// Unique identifier for this item + fn id(&self) -> Uuid; + + /// Creation timestamp (Unix ms) + fn timestamp(&self) -> u64; + + /// Base priority (0.0-1.0). Subclasses define their own scale. + fn base_priority(&self) -> f32; + + // ========================================================================= + // RTOS AGING (Template Method Pattern) + // ========================================================================= + + /// Time in milliseconds for aging boost to reach maximum. + /// Override to change aging speed. Set very high to effectively disable. + /// Default: 30,000ms (30 seconds) + fn aging_boost_ms(&self) -> f32 { + 30_000.0 + } + + /// Maximum priority boost from queue aging (0.0-1.0). + /// Override to 0 to disable aging entirely (e.g., voice). + /// Default: 0.5 + fn max_aging_boost(&self) -> f32 { + 0.5 + } + + /// Effective priority = base_priority + aging boost. + /// RTOS-style: items waiting longer get higher effective priority. + /// This prevents starvation β€” every item eventually gets serviced. + /// + /// Subclasses rarely override this; instead override aging_boost_ms/max_aging_boost. + fn effective_priority(&self, now_ms: u64, enqueued_at_ms: u64) -> f32 { + let wait_ms = now_ms.saturating_sub(enqueued_at_ms) as f32; + let aging_ms = self.aging_boost_ms(); + if aging_ms <= 0.0 { + return self.base_priority().min(1.0); + } + let boost = (wait_ms / aging_ms * self.max_aging_boost()).min(self.max_aging_boost()); + (self.base_priority() + boost).min(1.0) + } + + // ========================================================================= + // URGENCY + // ========================================================================= + + /// Is this item time-critical? Urgent items bypass the cognitive scheduler. + /// Default: false. Voice overrides to true. Chat overrides for mentions. + fn is_urgent(&self) -> bool { + false + } + + // ========================================================================= + // QUEUE MANAGEMENT (KICKING) + // ========================================================================= + + /// Can this item be dropped when the queue is at capacity? + /// Default: true. Voice overrides to false (never drop voice). + fn can_be_kicked(&self) -> bool { + true + } + + /// Resistance to being kicked. Lower values are kicked first. + /// Default: effective_priority (low priority items kicked first). + /// Voice overrides to f32::INFINITY (never kicked). + fn kick_resistance(&self, now_ms: u64, enqueued_at_ms: u64) -> f32 { + self.effective_priority(now_ms, enqueued_at_ms) + } + + // ========================================================================= + // ROUTING + // ========================================================================= + + /// Which channel should this item be routed to? + /// Default: self.domain(). Override for items that belong to a different + /// channel than their logical domain. + fn routing_domain(&self) -> ActivityDomain { + self.domain() + } + + // ========================================================================= + // CONSOLIDATION + // ========================================================================= + + /// Can this item be merged with another item in the same channel? + /// Items decide their own consolidation rules. + /// + /// Default: false (no consolidation). + /// Chat overrides to consolidate same-room messages. + /// Task overrides to consolidate related tasks. + fn should_consolidate_with(&self, _other: &dyn QueueItemBehavior) -> bool { + false + } + + /// Downcast to Any for type-specific consolidation checks + fn as_any(&self) -> &dyn Any; + + // ========================================================================= + // SERIALIZATION β€” For IPC transport back to TypeScript + // ========================================================================= + + /// Serialize this item to JSON for IPC transport. + /// Each item type includes its discriminator and all fields. + fn to_json(&self) -> serde_json::Value; +} + +//============================================================================= +// CHANNEL STATUS β€” Returned by IPC for monitoring +//============================================================================= + +/// Per-channel status snapshot +#[derive(Debug, Clone, Serialize, Deserialize, TS)] +#[ts(export, export_to = "../../../shared/generated/persona/ChannelStatus.ts")] +pub struct ChannelStatus { + pub domain: ActivityDomain, + pub size: u32, + pub has_urgent: bool, + pub has_work: bool, +} + +/// Full channel registry status +#[derive(Debug, Clone, Serialize, Deserialize, TS)] +#[ts(export, export_to = "../../../shared/generated/persona/ChannelRegistryStatus.ts")] +pub struct ChannelRegistryStatus { + pub channels: Vec, + pub total_size: u32, + pub has_urgent_work: bool, + pub has_work: bool, +} + +/// Result from service_cycle() β€” what the TS loop should do next +#[derive(Debug, Clone, Serialize, Deserialize, TS)] +#[ts(export, export_to = "../../../shared/generated/persona/ServiceCycleResult.ts")] +pub struct ServiceCycleResult { + /// Should TS process an item? + pub should_process: bool, + /// The item to process (serialized). Null if should_process is false. + #[ts(optional, type = "any")] + pub item: Option, + /// Which domain the item came from + #[ts(optional)] + pub channel: Option, + /// How long TS should sleep if no work (adaptive cadence from PersonaState) + pub wait_ms: u64, + /// Current channel sizes for monitoring + pub stats: ChannelRegistryStatus, +} + +#[cfg(test)] +mod tests { + use super::*; + + #[test] + fn test_activity_domain_serde() { + let json = serde_json::to_string(&ActivityDomain::Audio).unwrap(); + assert_eq!(json, "\"AUDIO\""); + + let parsed: ActivityDomain = serde_json::from_str("\"CHAT\"").unwrap(); + assert_eq!(parsed, ActivityDomain::Chat); + } + + #[test] + fn test_domain_priority_order() { + assert_eq!(DOMAIN_PRIORITY_ORDER[0], ActivityDomain::Audio); + assert_eq!(DOMAIN_PRIORITY_ORDER[1], ActivityDomain::Chat); + assert_eq!(DOMAIN_PRIORITY_ORDER[2], ActivityDomain::Background); + } +} diff --git a/src/debug/jtag/workers/continuum-core/src/persona/mod.rs b/src/debug/jtag/workers/continuum-core/src/persona/mod.rs index 0dd932ba7..0003fed28 100644 --- a/src/debug/jtag/workers/continuum-core/src/persona/mod.rs +++ b/src/debug/jtag/workers/continuum-core/src/persona/mod.rs @@ -1,14 +1,26 @@ //! Persona Cognition Module //! //! Core persona intelligence in Rust: -//! - PersonaInbox: Priority queue for messages/tasks +//! - PersonaInbox: Priority queue for messages/tasks (flat, legacy) //! - PersonaCognitionEngine: Fast decision making //! - PersonaState: Energy, mood, attention tracking +//! - Channel system: Multi-channel queue with item polymorphism (replaces flat inbox) +//! - channel_types: ActivityDomain enum + QueueItemBehavior trait +//! - channel_items: Voice, Chat, Task concrete item structs +//! - channel_queue: Generic per-domain queue container +//! - channel_registry: Domain-to-queue routing + service_cycle() +pub mod channel_items; +pub mod channel_queue; +pub mod channel_registry; +pub mod channel_types; pub mod cognition; pub mod inbox; pub mod types; +pub use channel_items::ChannelEnqueueRequest; +pub use channel_registry::ChannelRegistry; +pub use channel_types::{ActivityDomain, ChannelRegistryStatus, ChannelStatus, ServiceCycleResult}; pub use cognition::{CognitionDecision, PersonaCognitionEngine, PriorityFactors, PriorityScore}; pub use inbox::PersonaInbox; pub use types::*; From d2030c7f9a33facd47128bf364a5ad5e40737fea Mon Sep 17 00:00:00 2001 From: Joel Date: Fri, 30 Jan 2026 02:36:31 -0600 Subject: [PATCH 2/4] =?UTF-8?q?Phase=202:=20Service=20loop=20delegation=20?= =?UTF-8?q?=E2=80=94=20CNS=20scheduling=20delegates=20to=20Rust?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit CNS service cycle now asks Rust "what should I process next?" via IPC: - serviceViaRust(): calls rustBridge.serviceCycle() for <1ms scheduling - Rust handles consolidation, state gating, urgent-first ordering - TS just executes what Rust decided (LLM calls, DB, tools) - Falls back to TS channels if Rust bridge unavailable Wiring: - CNSTypes.ts: added optional rustBridge to CNSConfig - CNSFactory.ts: passes rustCognitionBridge from PersonaUser - PersonaUser.ts: added nullable rustCognitionBridge getter, wired inbox.setRustBridge() after bridge initialization - QueueItemTypes.ts: added fromRustServiceItem() converter (Rust camelCase JSON β†’ TS QueueItem discriminated union) 232 Rust tests pass, TypeScript builds clean. --- .../jtag/system/user/server/PersonaUser.ts | 14 +++- .../user/server/modules/QueueItemTypes.ts | 58 +++++++++++++ .../central-nervous-system/CNSFactory.ts | 6 ++ .../central-nervous-system/CNSTypes.ts | 4 + .../PersonaCentralNervousSystem.ts | 84 +++++++++++++++---- 5 files changed, 150 insertions(+), 16 deletions(-) diff --git a/src/debug/jtag/system/user/server/PersonaUser.ts b/src/debug/jtag/system/user/server/PersonaUser.ts index 799377c12..1b6605ad6 100644 --- a/src/debug/jtag/system/user/server/PersonaUser.ts +++ b/src/debug/jtag/system/user/server/PersonaUser.ts @@ -213,6 +213,14 @@ export class PersonaUser extends AIUser { return this._rustCognition; } + /** + * Nullable accessor for Rust bridge (used by CNSFactory during construction). + * Unlike rustCognition getter, this returns null instead of throwing. + */ + public get rustCognitionBridge(): RustCognitionBridge | null { + return this._rustCognition; + } + // NEUROANATOMY: Delegate to limbic for memory/genome/training/hippocampus public get memory(): PersonaMemory { if (!this.limbic) throw new Error('Limbic system not initialized'); @@ -562,9 +570,13 @@ export class PersonaUser extends AIUser { // STEP 1.5.1: Initialize Rust cognition bridge (connects to continuum-core IPC) // This enables fast-path decisions (<1ms) for should-respond, priority, deduplication + // Also wires the bridge to inbox for Rust-backed channel routing try { await this._rustCognition?.initialize(); - this.log.info(`πŸ¦€ ${this.displayName}: Rust cognition bridge connected`); + if (this._rustCognition) { + this.inbox.setRustBridge(this._rustCognition); + } + this.log.info(`πŸ¦€ ${this.displayName}: Rust cognition bridge connected (inbox routing enabled)`); } catch (error) { this.log.error(`πŸ¦€ ${this.displayName}: Rust cognition init failed (messages will error):`, error); // Don't throw - let persona initialize, but message handling will fail loudly diff --git a/src/debug/jtag/system/user/server/modules/QueueItemTypes.ts b/src/debug/jtag/system/user/server/modules/QueueItemTypes.ts index 13a3e4df0..27a3d3eaf 100644 --- a/src/debug/jtag/system/user/server/modules/QueueItemTypes.ts +++ b/src/debug/jtag/system/user/server/modules/QueueItemTypes.ts @@ -247,6 +247,64 @@ export function toChannelItem(item: QueueItem): ChannelBaseQueueItem { throw new Error(`Unknown queue item type: ${(item as QueueItem).type}`); } +/** + * Convert a Rust service cycle JSON item back to TS QueueItem. + * + * Rust to_json() produces camelCase items with `type: "voice"|"chat"|"task"`. + * This maps them to TS discriminated union: `type: "message"|"task"`. + * + * Returns null if the JSON is invalid or has an unknown type. + */ +export function fromRustServiceItem(json: Record): QueueItem | null { + const itemType = json.type as string; + + if (itemType === 'voice' || itemType === 'chat') { + // Map Rust voice/chat β†’ TS InboxMessage + const msg: InboxMessage = { + id: json.id as UUID, + type: 'message', + roomId: json.roomId as UUID, + content: json.content as string, + senderId: json.senderId as UUID, + senderName: json.senderName as string, + senderType: json.senderType as InboxMessage['senderType'], + mentions: (json.mentions as boolean) ?? false, + timestamp: json.timestamp as number, + priority: json.priority as number, + domain: 'chat' as TaskDomain, + enqueuedAt: json.timestamp as number, + sourceModality: itemType === 'voice' ? 'voice' : 'text', + voiceSessionId: json.voiceSessionId as UUID | undefined, + }; + return msg; + } + + if (itemType === 'task') { + const task: InboxTask = { + id: json.id as UUID, + type: 'task', + taskId: json.taskId as UUID, + assigneeId: json.assigneeId as UUID, + createdBy: json.createdBy as UUID, + domain: json.taskDomain as TaskDomain, + taskType: json.taskType as TaskType, + contextId: json.contextId as UUID, + description: json.description as string, + priority: json.priority as number, + status: json.status as TaskStatus, + timestamp: json.timestamp as number, + enqueuedAt: json.timestamp as number, + dueDate: json.dueDate != null ? Number(json.dueDate) : undefined, + estimatedDuration: json.estimatedDuration != null ? Number(json.estimatedDuration) : undefined, + dependsOn: (json.dependsOn as UUID[]) ?? [], + blockedBy: (json.blockedBy as UUID[]) ?? [], + }; + return task; + } + + return null; +} + /** * Convert TaskEntity to InboxTask (lightweight queue representation) */ diff --git a/src/debug/jtag/system/user/server/modules/central-nervous-system/CNSFactory.ts b/src/debug/jtag/system/user/server/modules/central-nervous-system/CNSFactory.ts index aa24b2a9f..655d883e2 100644 --- a/src/debug/jtag/system/user/server/modules/central-nervous-system/CNSFactory.ts +++ b/src/debug/jtag/system/user/server/modules/central-nervous-system/CNSFactory.ts @@ -26,6 +26,9 @@ import type { BaseQueueItem } from '../channels/BaseQueueItem'; // Import QueueItem type for handleChatMessageFromCNS signature import type { QueueItem } from '../PersonaInbox'; +// Import RustCognitionBridge type for Phase 2 delegation +import type { RustCognitionBridge } from '../RustCognitionBridge'; + // Type for PersonaUser (avoid circular dependency) // Matches PersonaUser's interface for CNS creation // Uses actual class types to ensure compile-time safety @@ -46,6 +49,8 @@ interface PersonaUserLike { memory: { genome: PersonaGenome; // Phase 2: genome moved inside memory module }; + // Rust cognition bridge (Phase 2): scheduling delegates to Rust when available + rustCognitionBridge: RustCognitionBridge | null; handleChatMessageFromCNS: (item: QueueItem) => Promise; handleQueueItemFromCNS: (item: BaseQueueItem) => Promise; pollTasksFromCNS: () => Promise; @@ -205,6 +210,7 @@ export class CNSFactory { personaState: persona.prefrontal.personaState, genome: persona.memory.genome, channelRegistry, + rustBridge: persona.rustCognitionBridge ?? undefined, personaId: persona.entity.id, personaName, uniqueId: persona.entity.uniqueId, diff --git a/src/debug/jtag/system/user/server/modules/central-nervous-system/CNSTypes.ts b/src/debug/jtag/system/user/server/modules/central-nervous-system/CNSTypes.ts index 3a5d2f9c7..7e3a08fec 100644 --- a/src/debug/jtag/system/user/server/modules/central-nervous-system/CNSTypes.ts +++ b/src/debug/jtag/system/user/server/modules/central-nervous-system/CNSTypes.ts @@ -12,6 +12,7 @@ import type { PersonaStateManager } from '../PersonaState'; import type { PersonaGenome } from '../PersonaGenome'; import type { ChannelRegistry } from '../channels/ChannelRegistry'; import type { BaseQueueItem } from '../channels/BaseQueueItem'; +import type { RustCognitionBridge } from '../RustCognitionBridge'; /** * Configuration for PersonaCentralNervousSystem @@ -37,6 +38,9 @@ export interface CNSConfig { readonly pollTasks: () => Promise; readonly generateSelfTasks: () => Promise; + // Rust cognition bridge (Phase 2): when available, scheduling delegates to Rust + readonly rustBridge?: RustCognitionBridge; + // Domain configuration readonly enabledDomains: ReadonlyArray; readonly allowBackgroundThreads: boolean; diff --git a/src/debug/jtag/system/user/server/modules/central-nervous-system/PersonaCentralNervousSystem.ts b/src/debug/jtag/system/user/server/modules/central-nervous-system/PersonaCentralNervousSystem.ts index 1e73fe2d1..c9ac0a0b7 100644 --- a/src/debug/jtag/system/user/server/modules/central-nervous-system/PersonaCentralNervousSystem.ts +++ b/src/debug/jtag/system/user/server/modules/central-nervous-system/PersonaCentralNervousSystem.ts @@ -2,16 +2,15 @@ * PersonaCentralNervousSystem * * Orchestration layer that coordinates multi-domain attention for PersonaUser. - * Uses item-centric OOP: items control their own urgency, consolidation, kick policy. - * The CNS iterates over channels in scheduler-determined priority order. * - * Service cycle: - * 1. Poll tasks, generate self-tasks + * Service cycle (Rust-delegated, Phase 2): + * 1. Poll tasks, generate self-tasks (TS β€” DB access) * 2. Wait for work (signal-based) - * 3. Consolidate all channels (items decide how) - * 4. Get domain priority from scheduler - * 5. Service channels: urgent first, then scheduler-approved - * 6. Fall back to legacy flat-queue path for non-channel items + * 3. Rust service_cycle() β†’ consolidate, state-gate, schedule, return next item + * 4. Dispatch item to handler + * + * Fallback (TS channels): + * If Rust bridge unavailable, falls back to TS channel registry + legacy queue. */ import type { CNSConfig } from './CNSTypes'; @@ -19,6 +18,7 @@ import type { CognitiveContext } from '../cognitive-schedulers/ICognitiveSchedul import { ActivityDomain } from '../cognitive-schedulers/ICognitiveScheduler'; import { SubsystemLogger } from '../being/logging/SubsystemLogger'; import { getEffectivePriority } from '../PersonaInbox'; +import { fromRustServiceItem } from '../QueueItemTypes'; export class PersonaCentralNervousSystem { private readonly config: CNSConfig; @@ -31,15 +31,16 @@ export class PersonaCentralNervousSystem { this.logger.info(`Initialized CNS with ${config.scheduler.name} scheduler`); this.logger.info(`Enabled domains: ${config.enabledDomains.join(', ')}`); this.logger.info(`Channels registered: ${config.channelRegistry.domains().join(', ')}`); + this.logger.info(`Rust bridge: ${config.rustBridge ? 'connected' : 'not available (TS fallback)'}`); this.logger.info(`Background threads: ${config.allowBackgroundThreads ? 'enabled' : 'disabled'}`); } /** * Single service cycle β€” the heart of the autonomous entity. * - * Combines legacy flat-queue path with new multi-channel path: - * - If channels have work β†’ use channel-based service (new) - * - Otherwise fall back to legacy inbox peek/pop (backward compat) + * Phase 2: Delegates scheduling to Rust when bridge available. + * - Rust handles: consolidation, state gating, priority ordering, item selection + * - TS handles: task polling, self-task generation, item execution (LLM, DB, tools) */ async serviceCycle(): Promise { // STEP 0a: Poll task database for pending tasks assigned to this persona @@ -57,20 +58,73 @@ export class PersonaCentralNervousSystem { return; } - // STEP 2: Try multi-channel service first (new path) + // STEP 2: Try Rust-delegated scheduling (Phase 2) + if (this.config.rustBridge) { + await this.serviceViaRust(); + return; + } + + // STEP 3: Fallback to TS channel service const channelRegistry = this.config.channelRegistry; if (channelRegistry.hasWork()) { await this.serviceChannels(); return; } - // STEP 3: Fall back to legacy flat-queue path - // This handles items not yet routed to channels (transition period) + // STEP 4: Fall back to legacy flat-queue path await this.serviceLegacyQueue(); } /** - * Multi-channel service loop. + * Rust-delegated service cycle (Phase 2). + * + * Rust's service_cycle() does ALL scheduling work in <1ms: + * - Consolidates all channels (items decide merge policy) + * - Updates persona state (inbox_load, mood) + * - Checks urgent channels first (AUDIO β†’ CHAT β†’ BACKGROUND) + * - State-gates non-urgent items (mood/energy threshold) + * - Returns next item to process or adaptive wait cadence + * + * TS just executes what Rust decided. + */ + private async serviceViaRust(): Promise { + const bridge = this.config.rustBridge!; + + try { + const result = await bridge.serviceCycle(); + + if (result.should_process && result.item) { + // Convert Rust JSON item β†’ TS QueueItem + const queueItem = fromRustServiceItem(result.item as Record); + if (!queueItem) { + this.logger.warn(`Rust returned unparseable item: ${JSON.stringify(result.item).slice(0, 200)}`); + return; + } + + const channelName = result.channel ?? 'unknown'; + this.logger.info(`[rust:${channelName}] Processing ${queueItem.type} (priority=${queueItem.priority.toFixed(2)}, stats=${result.stats.total_size} total)`); + + // Delegate to PersonaUser via callback (same as TS channel path) + await this.config.handleChatMessage(queueItem); + } else { + // No work β€” Rust says rest for wait_ms + // Note: wait_ms is advisory; the outer loop will call waitForWork() next cycle + // which provides signal-based wakeup if new work arrives before wait_ms + this.logger.debug(`Rust service cycle: no work (wait_ms=${result.wait_ms}, stats=${result.stats.total_size} total)`); + } + } catch (error) { + this.logger.warn(`Rust service cycle failed, falling back to TS channels: ${error}`); + // Fallback: try TS channels + if (this.config.channelRegistry.hasWork()) { + await this.serviceChannels(); + } else { + await this.serviceLegacyQueue(); + } + } + } + + /** + * Multi-channel service loop (TS fallback). * * Items control their own destiny: * - consolidate(): items decide if/how they merge From 543167897fdcf1a9eef27769e0d29839506a0541 Mon Sep 17 00:00:00 2001 From: Joel Date: Fri, 30 Jan 2026 03:59:46 -0600 Subject: [PATCH 3/4] Remove dead TS cognition code, fix @reactive() decorator, fix caption forwarding MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - Delete 9 dead TS files: channel queue system (6 files) and cognitive schedulers (3 files) now fully replaced by Rust cognition engine - Slim down CNS, PersonaInbox, PersonaAutonomousLoop, PersonaUser to remove all fallback/legacy TS scheduling paths - Fix @reactive() and @attr() decorators: TC39 class fields shadow Lit's prototype accessor from createProperty(), preventing re-renders. queueMicrotask removes the own property after init so Lit's setter triggers requestUpdate() automatically. - Forward all transcription captions to all participants (including speaker's own) β€” captions confirm system is working, audio echo is handled by mix-minus in the Rust mixer, not transcription filtering. --- .../screenshots/livewidget-voice-call.png | Bin 9 -> 790956 bytes src/debug/jtag/generated-command-schemas.json | 2 +- src/debug/jtag/package-lock.json | 4 +- src/debug/jtag/package.json | 2 +- src/debug/jtag/shared/version.ts | 2 +- .../jtag/system/user/server/PersonaUser.ts | 11 - .../server/modules/PersonaAutonomousLoop.ts | 129 ------- .../user/server/modules/PersonaInbox.ts | 89 +---- .../user/server/modules/QueueItemTypes.ts | 98 ----- .../central-nervous-system/CNSFactory.ts | 136 ++----- .../central-nervous-system/CNSTypes.ts | 21 +- .../PersonaCentralNervousSystem.ts | 211 ++--------- .../server/modules/channels/BaseQueueItem.ts | 183 ---------- .../server/modules/channels/ChannelQueue.ts | 192 ---------- .../modules/channels/ChannelRegistry.ts | 95 ----- .../server/modules/channels/ChatQueueItem.ts | 145 -------- .../server/modules/channels/TaskQueueItem.ts | 148 -------- .../server/modules/channels/VoiceQueueItem.ts | 61 ---- .../DeterministicCognitiveScheduler.ts | 90 ----- .../HeuristicCognitiveScheduler.ts | 185 ---------- .../ICognitiveScheduler.ts | 338 ------------------ .../jtag/widgets/shared/ReactiveWidget.ts | 33 +- .../continuum-core/src/voice/call_server.rs | 3 +- 23 files changed, 111 insertions(+), 2067 deletions(-) delete mode 100644 src/debug/jtag/system/user/server/modules/channels/BaseQueueItem.ts delete mode 100644 src/debug/jtag/system/user/server/modules/channels/ChannelQueue.ts delete mode 100644 src/debug/jtag/system/user/server/modules/channels/ChannelRegistry.ts delete mode 100644 src/debug/jtag/system/user/server/modules/channels/ChatQueueItem.ts delete mode 100644 src/debug/jtag/system/user/server/modules/channels/TaskQueueItem.ts delete mode 100644 src/debug/jtag/system/user/server/modules/channels/VoiceQueueItem.ts delete mode 100644 src/debug/jtag/system/user/server/modules/cognitive-schedulers/DeterministicCognitiveScheduler.ts delete mode 100644 src/debug/jtag/system/user/server/modules/cognitive-schedulers/HeuristicCognitiveScheduler.ts delete mode 100644 src/debug/jtag/system/user/server/modules/cognitive-schedulers/ICognitiveScheduler.ts diff --git a/src/debug/jtag/docs/screenshots/livewidget-voice-call.png b/src/debug/jtag/docs/screenshots/livewidget-voice-call.png index 8537307691275bdf5dd2c646e3775649643ccecf..77313118325d436deb77acc065c8bc63c0136ca8 100644 GIT binary patch literal 790956 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≈aJ}+q#lPvE<}@k;`9g^3xr<*9^(~ z!C7IVCGX)XGd7*u_#a6OeiVc*qPu5NJ16s)@v{i9r-R)8kJcaqGWPFQ$$rQS`-0a=<{#(U3c4k*gB)F^oSNJ z)H=X1o`>F3U;~lyp_gIFGNH_oU01oGyV)PEwd5)2o-Y!A*@Ji8&@iJn>a>i~G# z(<0NCPr-~?Bs`lEGH%a756=4#Lt^~_*r0WE+f34l@wpJb+HSxYbtSv#7@b|KQ zUq7wxi|U%CVJ+wP@&F#0E5b70y<={y(ccL2CF=*lOBLjCF{rh;ld__f(9fEsG7Q`X zOj>Z+g>x^(0M)e`2^OJfOA%IdI5s15a^R7kzGV*7h&Bw?hJv;Sm)AIpER~ea-PPGk zG|dqG?(?gBj{dq_f4Tg^671?p!!O9*{c`hC855#(F&psAzO$D1f;2JrB)j&^|ALs> zvjYye3mAj1qFh{0y_B#>zVke5d11d;O}#h>^1bH|V7(j8>uugk`AdU;^}_B2*U!}b?z5knr^OF!tH%^|bteh-bAzWV%qWG>+>y^^3#P{&JS7{fIZ6h1DD`eA@~J0Nuin5U)tu1>3-*DpiPTnklAkbprA$I*luz-S+V#?|k<0K!7T#xI+~(J{BEzp#2F`uAnk| z-H1R&qMrPjg9n5QI1vaLWzX;#mr5=GsU-gjB_VkQ$Q02Xf=Y)tlyzxsFwyB&c(wM=-=rW$b0SkncM=kc)vM*ajXewggUnx@5TMZ8Mty>NQVl;EHUWg zkM^6>F^)zNOr-(LB}M9fTief7dg-{|6?!M=-ivMsvmp5%XIVb{=JLgXp?~e9rhFwc zB_7oq!n4$_^tJnRhjBS}kuGBwOG0c7?J4ZX_!>Kb!vbR1`4C#_|p{HL*DCb9%;9L`wX@Y~s*8R24Wm;l}Y>n#dQe9k0{z_)YE&8=<6#0pdXH2e=P- zl-T#@fU&JTqN|^`w-l~d^GrpAh}T2Gdx?yhxz}}hNTdFlX#n~0)yYpEpH3XjQL}j0 zUq+|Qch>Z|>g(B2vGeO(2>1T1B_7?zgcQW`_`Sf)#fE){ZyjoC#w!EvQ~!!S0SA7m znO~iN$M72q!ZyLILL3a7)-TcM1Z{0)3FoFk7Y$=%xO7d~UtamtQ_ z&@1|6K|RgBxk;~nZ&QT&_#iPl^S=Xm{~s=aEgh(Du-uP9<-^Kx;+`3S20g-Uz$#F*r zPk1d=-jX8u5<@zKV_F<#^3(6}@N(i1G~gemKZ8Fezr2In%mre9g*i}X z7Go|{;PeX^%w{Vk4NUftlaPiuQh;J?X4J_4NWFdYQd!XidfZdbN8h&FFonuO^Yi4o z4_c7OHMwoPL4C{|`vM5bYTMJ&sPXar;`luC8+h`@eUsn=ecBa!eU8@znmlOdSFeOB zE__pZrs#bT>e%)fb-=umXqj<6a$&3`_BN!k=Vt}DF@0Su_51 zJMzXgPKt^oIaChI;$RIiLu)zYjPsVt)IY&nh_R_yHQ-0B6^-;3L;!c1hS|7lNI?~* z`^|}L+yMMz|K$Cw%wXMDjE(eQaOsFWP%NL0=8}pg@9}7X%T+fO{Ct=P#Y3h;sNf7e zr|QjET~F_iRmqU^VMJl?k}xoAnzbDygR?2MqF?5C&5*+N@%nVj*##0lURk7%@0fcM zSYC8J<-AwoI7H3kYob#A+PnTP@<&U+g;wT$Z~Tt21*$e^Qx5Yo)tnebI3&uq7|;_Lg%yQ$3m#)aN5L3d9#Z3qB% z(SY|;u1P92%5ozAd?x#Zch5dn(Eg8*983(`>B2O9E_u1F@~2#Pc2V9{jw0&bTSLz= zR|@AG3&bN0BA-u;pM~P}s?h&a;MA}J= z@ZalfwgiX#1cuBF-U(|eNIh6=vSn9%bM*^|K@v8oYz6{>uKn#(UgF_FreXwjN#K8)_TGfJsJXQ`|I2zbZ&LLPaPXrm}znC$2FY&4)I$WDiNPISFX%4MW+}n4H)U zb472lsW?i2_a-n{5-l z;VJ?stl6?M+J>D$HXW30H=QJ-*wh<&00h!n0+_2pSdz2%?Ex%Bi*c?6@S^@EvY2V8 z751p{I`B zUXd_pBR0}G6X}o(0~R1cmb!AEgm!u;zUy>?6cMOlZDn2@;)`L6$irO1r(*H~HSC0D zd5WjBtOa1zKgi(*2V~~tkS~6@lO&ysd$WiOn;#xn37U|6pan2qAS)-3vvenMjJ*qP zYfwm#H^aUa?w0%KBGDxA&AOk4tP~3~(CG~u*w z51D$tG+Nu!A`&@w)fluHTi9$lexU2`e{`E7t)`HbkQ9CHr|z#o^+#P;gFM4W}E#pQWdjPI47 z_tlyYL!2S(sJ^icP4$f{#%_2)Djp2l4WM#(`kgd^snR3zhnm*2yrBQ?PvE>3dfXZF zt(@j-$k_ik%+ucy>zfWrIaY`!o@Z^$g1+a2jg+`exu3K{32ttB$@-HX@_fc3%psg#+YEn1%%Q_LHGO9$np;My?F{`A#yTf?aSY65OBinMFZ%(vH4{{mg5`^ zGNmg`FuH2nlAtQToA+FqQW<9NG-qurGU5u~2zPf=AHG)jCe}2Nv$YGQ6a-w*-Z)w- zTb)P(r&{;DK@xlsCk&DmbSK0sYCKd8GNK<`RY?(!5h~b)d5zSSyxC$j5J@RB3Sg}J z{lO+h9o+bti-Wcaqnk`2W09%9SjU;Dv=b^c*MMY={ecFR6?h+7q5c3`lEtt^gA%V^ zEcRMeKX4CsU5FNO6FQjWSF{`xQeoE0@?+^#jqURv_nQ! z@Z~+(_xK>)+pSqO8WdM|cWeya1f0qYBA-l_iQL|II71zAJgJWbDVUcR|HPjWM?_QN zy^^G#fJt`$gq(&s7z+>!17U5#oiG3P2p%=?e68Pqc2MZLU+zv!b?i!nk=)_{BqT5W zAEvq!FOIk?Htx>@p0VoBx7v!!h*HQzSJu)x&z|$29iI2rpGxp0QAOx|AeJr{-B0W< z4fs?F8G1gnYJ9n4r!#LAIKdGOEIdgb-A|+g#IsLoNfj{ZzLj{u+4{?HcXEl&F~@RR zSQ;s6W0shYpta$Xtrhu_5Ut>!C0XClc&Vu#=W-L4-kHPMLOnqX?50VloT0v^(KvoY z*d=b2Fks}L5JT0O`}%If|KxmLWpK|O6}Dc-O@3nNCtpQZYgrX?J)KtZ+k4bMKU zM0pAx?x-rT4B`+;;w0lQwI-{vP5?bfIUc2S8nW{Wf$}VyG}d5cT13__N%YVi4hE!d zF$RQ_k~_BR;4c4cBdk&rACjp?Hm`GdR`C6YKc}CwojT;J0j94MfkcMDc%XSfJn4Nc zWB>b%cQ<%h^XF;rv?v7mkBRBCq_tv6W9$%b@$l9>VY)b2Nd^OnHZYD0Q;Ll&*Qgu) zyAF4S@qumSnXt>4tdC?^#0NrsIhP^+aR-(1NYA`+qRQ2sd&hSjL!r9^$g)>=CEc`1 ze%!OO5TGZ`+pQ>?;_F`6@9mM#A2|6diIv$@Uvlz96A(ICIEXp{{!}*N!j10HIv&Y~-TPgR@h=dk%BhyUP-PU z|KGomU*n+aU5iOAZf9-uI_IZ1$z47Q3;S_54>??DL^FqtkAJuG#*JQn8_keQDnaFp z1PEWHMf@B3hp!iJ@_0ylWloD5TOQVIJX*9yD*3+2XFx-aC6(Y&0xM{|W7z6iZnY0fwBzPLrw+wuFG33p>Z!olvhJDhiL}Lys_aI+*wSZ#nj^$>rFz zU~z1Nn|G?gKHV0E=0dovQOv)BOL5Kve{sgpbI||Vg4-1w^M;>C#Y>S(V>Sf3O?Tv6 zIBRlrDF9mi2i4bcPRVRTght4daI!yFZB_we#yxX}Y0H3Hs)A<=W!(?&Vj zWcj}W;s0M<+=C(erXD9%vK)ILnU=3ak-t@I{)(RjLG6pI1FWd6a<#;X8%+XyCe{3mwc9bYUe`>(B?^CQhe%@G~Oo!OEn>VueiN_!Mj3N=ON1dNG4)Tw`#s=!h z2lA$}?eg|!+#EO!O+=r6{P;rCupIV!xEqZO*&cG=H#Yn{$(21x7HVRxY=UR8orfEwz7dX~g8ygAAg_fw)_1fbCr>E%;igm%U}>@d6IzFS-S2ee23AmIxfwDSiH1)LsT z;*s~d$~h(2n;82$pn&j@*+o6$d}tI!C=kQ()9ZyO!W-^s?b=hyd1 zHNL@sRmud;=DG5=h8a0jR(VKm>`_ifPak;Xou`xhjP4Mqbzy5b(@y`t4(UH!eR|4i z)s5_wnNt$L0suknQMtgwAc{*cJ4N_X3)_Wg_qU!lA2$aKKVFfEJW(=nue|)1zT)-a8)M$tQFaNJ&T-em(FCtsH5?+6A{x#G%>c6B`+3l z*-L|cuOShjOTXOT_2B>y&^!Cg>0A-C*&v7-PD=XwIoz35a$@yZrrF6&G^DdbqHr)) z?D##xHRoMsdaae{q;K_o2jP#42MUX=>G_vy|Ai@e4#AF^WzL8Nn`NR2@axJbNEEPC z#X#_x?H~ggE|vv`d8O}93M20=)L}NSi+i*y0kwri)Ycki(~95Kbb0w{$2B@G9gB-~ zIg~7iQaU+cAIJ>do;^&lHy}QLdD<_t2_Bcj9nQ(46Q30VjO?D>+&BKy{qjHhD-gg* zcSGl~;mB>kI(Ikzu7$;|8RFbn1w4~Sc0QalH_u>M%DO! zkJr}BPoLM)(y~;de9pq%U1c;jGn2%+5qhT^Zskfy>A=%i{{STUCh0MIK zTAJZDuXzh|AZGDLRg!0=>uV2*=83H@+C%vmm#dy?G`aF)Pwh7;aPQ|wS~5S!(Z4M6 zxrwihf-B)s=+~jyumU<95P|igvWm(#Sryz9Rfza_!2K1;k=i);2~O>O|CeN`?#=$D zLL~j>DiC+Qq=bNxkcmr7jIQ0u{HX~1q@IK-a1sWk#**8fO4#oW4xe7J86nJ$6@NJm z-GRb0kmLHEhh7f9cC^*Wcif3~7)ouwIQ=kW6|SBC6C=b=vjpBC%O+q(8SQo0LkC z%?WMjhK3~uV&u7UQjr_IP3tmfG;IV0M&ywOrf3=+bTJhmxU8G<=r@?}w=M1L-Z6yk zR);%|&RxZ%DAGFU6Plx4rmM40RwZ^s$`xrMqDocgYha6GQHWxfMi+Jw%V(@Uz1Fky z)Q!xv8rECN%BsOtUm)+`uO2KTMr@8t1wztM?v9J#$93Igx%kuLyMX~9PxKa7M+3bp zM?+e;?9|wp&{5Hw>q*?cFw&KGFQf%3$HiKLR{hKjAWYjC;F;&QJ09oWi=YM3aiK6N zpYGt3vyW>?wCb8Vw#s^bs5$KX8BX!W?p&>)MR{-0JcFaP?JDac$eS2_Xat8YH-DaM!|uySoQ> z2<{%--GjTkySuvxR>%5RP$> zE<2Rz!gn}}3~lE&y(U0owwKHM+~i`_z#)y>-_2boyYTEZWpT#^f6c_2`G4_dxyHXo ziphT>#f$me%h-+OMs>!V_RCnyqoZxv+rW|$+xsBJ|3fGum|N|eDe2YIER`_n!NNz_ z3@GW+0boxi6CC+p&>dFx*xX^dB27|EC-pe;LT*c349$4>`T4mZE+yS@i6FT{l5R!s z_)29ObKVrT#VQ`b!7n?z4<_RR2i@x{V`^0bf2@k_d^K65Z*EsyEF{l~#S;u`V5N*d zW8>h&3FQ(6@t(lg*EMt?IusWA2NnP^R$y|KsL&g%Tfn(#%w-D#1b*^=`>fg0q2D+V zQ+SPF1;eBwvukP$p6=I*N;O!Rm?~HK(W%hoZQ&m@81`1Scn}akdXQ_v#P9DI;hggy zt6wx1|57(j@xLh+QkF2WlH#W0n#swYF2UPA5?T;5xr(L8LhUS0*mKJ4X*8$8aw4l4 z@P6tM0I?nEx4w$tjTk#rt!f5=)CVKLE2p_d|4A`%t-<>G>zFE+wLDasF9TrM97gFKww(^DTI zjBrR4?^h@z5;mQ`!xT+AmXhkGb+N7?k7j0SD%D`7ZbEaHWhL+}*xN2xOw<6=T6>~e z#K^$yahqT_*ud~S^%t`Sxoy2caWwR7GST0`9JYj?FUyO{Boujl0q&mn`=RCZ3}cwm ztunpyt4G5zc-_Bo8(e9+_ff3Fa-%E?ND%Amlt%+-!%7RMr{!@1r@udI1YKqwp^A2V z*?um{L5X(&qJR-3K6~x4QObl&|Hhcxi4xKI40Ss*Zwu=;j3_u)0k5bg!5!ho8KH&) zVcHyQ)Fab6mJQ%{EU{$Tu4ul&`N`&GEux<_L&#a0nJwT$!{eg^Z871p6nn6!;Mb$` zQ;g$mAMs~*m0$10T`Q6hiZo%nPiB?QS{we0dD~pQy>Z4Jw|erAsev|!jXM=W9gk&M z7w-k@+UNfsJ8}?w)cm0E#NyMWlq95adyP`CQm9(JQArgQKoU$2{U|Z+A!oI$JSvZvy3nAq&>JeOWQq&WXWyZuK>TK5 z!25$tM%;B89cSW0?0T_s*@>_TEWrM;kNp!OCQO=k9#=h0y@~1$WyoR4?FUv{2O`V+ z0>x`qv%fPjX_8ucTgpD1JL2lKM3yN&geHp?cVUHh;H~@w&Q>a1fHfE*8sGs)Zr>3K6R#lUy1fhVABIHGXgfU*Zc=3WMrVA|) z@rkyaU=76a`@V}?kjy}<@_DkyGI+fR_(%jB%vPdC3+8O~-g4j0t=a)#W12&MlAtX- zL7{!AVn+KipN3!{Q*Cz*J5PNSzGqHq@M#x@w+1~|MZGNHdU?ln ziN^VY0;!E9_N*SNnd?#&7PWR|Y|+7mQj7Hcb`oODs2TfIgDxJ=%BsA}%*jeinkQV_ zp_f28rS{7bYn2O;CbeN%Dh-gHuI1Y}nv#a7TxiO4GHZH1m3*Ru*YnCTKd{ z+(ObDMc_jemZC@_=m6dqCB!pDxBv_$n&3udWmPOM|@MnkU`>@q0o-3?;h9kGZcCzDQ{J3Pc-XV=V)2bsQ z2J{Fr318i%-dOjwouVJ%I`|<_j#J1Z$nf;nJ|6OLCS|CoaqxWoV^vbSRH$ZuHq| zgN5fSUEd&)rxp2(Pw4O$oLBP7el$F$QXG->Po=(&lvsqy6r7M#8TYDG>N zF{s%kegB6GAjs=k6Dk7BiDqQ?tDj|{?~5P8;jNj4{klpwuP19bVaCQ&mp@w0MWinNH-x~jeuia&r6yT7KAFgVSN#L9s&ow+?>Q!vYMw<=7hr3MLV;rd` zl^ft)Hcj=~Hz>$kc!(a~u&A+FGmY!ld8n6t`ZNDY=Dm{hP%C`|nKiE_i-iF?UMifD zmu`*cJ!i6}KNl7^Q4GRSpR0DkLc?KnO}A_@%f?^)`FhErbZI_gE0I4-ZsPpCb=;_iNw+Qxx#LvlQ^BP zKHz_9e7h)E*DmDA8i609@5h}6%X;*@yBs{y&2soM5oCQ*k>2V0X&$Bd02YtZ^!MEQ z3>mZQR>L^VzzX9|Lgg=_Q{G7 z{_7wb__5|~zS80PuA8JNKN>zl1Ijytw4!NcOKZyv?N8KVGy;j%X*Q7jaGvagwkUwz$ScPtyG~S1Rt7!mSII$exF) zYWk8wJRTFTByE9Bb@8a2qQx1!e6sZ87dTK=q1{ed(K1Mbr@5D}{l>CvxNG(NUT`Rv zodJm}FfDtm-I*rT2tlzXIxNw%>^1w`E9P~oH;wrJ1%mXed_OwdR*D5&YnYr&>W28b zWu1SkNBVan2#)oq<4^)(hkQE%e<65e>Z@Pv-@X#S2~ZFG%t}H*GnC9nhCFt*>#EBn zhxtm@@R=8l@G^XGBP{NmLnuDFM_)mfxO_6dF_<+uDQf975IFiI*w9ezD0X>N#sb&N4wQhuuo5^xArQiMds~!!f^rL?zauiX+;p*DWO!i zc-@f#m$nssI3_6Ut$3LSamh`eqsy=xY>E>v#lLqf&D-sB6tcjL7BqU@wLL>L5&rl4 z+F-pC#7&-`wBG#_pDKBv-eob*^BH4F24RM=FLHnPBgz~x1-73b5;+suC~N$(EFx#K z8y5@c{pIuipzSo`Y2hcBZ~_S{xlcoIG##0{6Aj2G>~y<9rv!^U;K-Paok|Dto>)R5 z3AvTHUGa=MY0PD99u+MGwIvDxnG)j^AoO_LGaM-E+!oXH9}YN1XnH8W1GGYs5J6o> zjl3FGM6#;%K=vi>rr`w?ZF-kU=tuBzXw%t~UKDNLPHqz0Bf@uC>I2*(PB&Eg6~D=3WtL>(X6MC!ZXXf@C|V?j=`1D3 z^^I>>?bVT3vFy8M=BEwV5&qxK*1yc^-NwY*sGJjeo9nqYJ^#35zcL|T{wNi*BX8w0 z##sK0^j`6GQ_fZMNxjvGT_)L&lz|D;gXa28#wn+%7fJcsvn&|s;GGT8ujV87L;pVD zG*m#`#Y;G+80x2-_)4*UW*?eH*&-QElz)yn>H;frzB{MnxbOWS_tCjnm7shm7@U0& z;L0E7sgPE1TaO#++eDptN{OWrw@)>pw58yyEL&>2$-K_n@E^B^71eDY-@NH!X!*I{ zDc-8YZ}|GHA90}uO|>R#!LA<%=Rh_G2Vx&N;CDbH;ao-$72R*nNC>qg;qxks5MnR3 zRfHAgtMdQR%D*dOYDhC1)fW>OS8K!yE(opW9ZC46TWpBvm67xB>gLu#xG<>im$oxbG2rm;f~5 z3}rtu8uH^jK{nS_exeTCO+78GSF`1Rpq|>SP&Qt_?^wYWYZKy4=3=4NP2O?Km2COi zv{E}n3?Uxa)TT8AnAMg3{c!Q~J^t82Zel+XLGEdsx;=Dp!wWY5y|cY-h(#!H`DsH7R) zY|k_7gzTpE8ntX5UXSpf!~5Wu{Laj;BHVD6hMcy%AaLg<{(_cgs=2n`=@?6HF>RXrp2_R+V0jwzJvFM+|{ zT&)74*nYkb6TjCt?f1GM^%5yt3Ar$HJtM6PKs({7 z=|bF)BozPHphQ)0(f7>Wd9tOx1#zEt&{kJGoKIu(sBA^nmIvy5_jD~P`0kAa#coSq z%-HeOLbv+{3X`!sWV#&n?)1Yq0Fg^vXyDg(l%<8IWZ^-Pv5~vZVwXnjnWk(nm#yEY z*U0th(p;QL0hw8)0OnUa)k4CF(d{cn>EfO=`HE8DOjpWUgRB9Wlsp|?n#oP7DUZe8 z4BQcU<9Xorvx5*?+rJdr0(!8V*&OutF+_{DJ!wsTls^%1Y`Nz5$?RuG&=)5KvGKEG zRz|oqven}wDJ>nE<6_-wC{WFqgKJC{7dVhQ!eaY(7=GE3BLwN!qILE(mowjzRCg$! z`@EVguU;-E{+p02!F}}Ja#N-AuYjMqJfjv4*sA-#?rZ?|R+lHBE2G0Q8wP2*Pt43w z>5wjXw)G!NR0|R~eQs{Fm&-fuCKn@y zz)Fbsm0RaCW@hE*o;&K4HrYAzKUM_+SB$7}s3`*J!I*{)+;j+AS_wz$(n;PgieXby zF*NQFd<#}VxbyURPsIzcor1~1Avv^62G~ZSG5d0~M^+T4y8FO?t>QveE{t+bO)hzs z$NgAVawcoDa+1(*Nn>lWi;bhIKfTjin{8L^_0@j%M7TB`TK1F=Nh!W2C7)7>`9)t; z(TLNVl`=Fpusy6jVIx^fa@#e5N2+G@q(9Le;J#*S=u%)=Vq8d>7_!SkY-{*4?y z1=S}qB)ByF49jnqK|6I!1bqimR_LHkjx~-CEl#ueI=Vc%1Wf$fUqY0dQ z@9bol#WBr|m!1vtbKa7riyw87-S%mml*aWQ|Hhd2X!;Q(I#HA>>bY;wm)B3Z`CS;GUc*fD{%i)0YS+7*rIaGW2`owBa zJ0vLjP(hL*3no~D^V}@^Kbv>@+q43wmPP;T91(W*c zK5&O+yWbd?%st-f@~0|3>WDjei32546f=xxPuN`xpCF zu7`=J4me9oyVo`|N7Hb%Czp|uJh>vziL#FaLk6niq=~4NRvU> z!#P}PC&!OONfG!Kf8`xg%JDnZphR>|cOfZ@&7UMpp(09X!7ZDNtjGadNtvs=tWMk; zZN<%NvXYw_Ty7ASZ5cgVU96h5d&mhJ;p%ZbQ7go@Z}IYkdl(mOb-^N+GIZ}9-_B8^ z4z)kw`%~~wNT2RRMWjSeYt_Z-;uOaNhYEjP=@QGF9JZ}R+FG@DmNQsRSNN5MIJhGb z?)zM^{%hb}j%Le`6|aP{mcI5GWpZ0myC}4k(0?zan(qf6XeC(O9%N&PxN|NN1CkRg zgVJ$e1RyQp+GVijl#bdTTWTgVK;<(G!H^f`rbkT&eN-l>D;7Fxt5CW~cB{IX!vo^MpVsp0I)qX9yX7xLLhpu+Rx996 z*T*4wazsufjDI#y}oH4r@Xd`=(2u1`?F;8+IjTcw&0A0HAh~WJmJ8~|uva%K@iPX=2M^Mr;tg}b-n?&6uPvHy? zxySZ9EZ*Ql9X3fd+cCIpp{9S#L%ga;poseJ=+DHdNS12zjeA2T`NP27D{V!Kv+Et> zlY0^%i((4M&v3{_=*gcUVG`t~00CE(0}Kd0hC3sYlbv24DDM|Tiwhc@ zc*fF-)1w)YHzu3@>ZvcZiS46FgC=J0FD;AMO+bBp(btH39--yE$o zGKy&C;rPT%=#3(yg#dM*nS07~gLo?%^f(f*pw;ZJIk}I`S=UFb#t& zaM%9VLCDKqgcRml^JL1oZnItSTFU2FZr7Ue!%@Y4>lT&Rx++bO(_Yqml?rebgUWuh zlV*w#ka#a4CduQ*<$6=AjO*kEzRg{KIrlnVzuXbe2u6Pf;~bIDhDRia7Yy)|MI(Ry zTj|;^EvCQ$>#{nX==05C3NNz}Vt{#KDryk?RraNsE51_hlF|gyqtx?w*0)Qlm#M|5 z-k)lKEQ$Q<1=Og#<(v3`%dx*7PReDOB~hbCkl_`eLxm92^aKxJrosL!o6`)}DB`#l z?;V92)yK#|>lN2$((ou1D2+cy6h69CKQhH6pIYp8CCMUM7lq~jy^HBvJGKHn4Ax{Z z+hO2mfXePy5+*e|ghY;d{e7`C9a6#&LUMC%C+n6H0}Xr1yXeQepbJw{-UPHYQ1d7~u!*sgPIf19e!OjFwqY^X-Qfpvvu5B^YL_ZagR zL=nP*dj%gcLeM!|f|c*k5_UsyU$ACA7BEF9d84aElZi76-ODJ2TouVC?@x38YEUyc zisPN0wf=4k4u6Nj-D&9WLB8koyqv}#O~>x@1A_+ZLW)4(CWiglNepVe67fArVc9G^ zL1*@>GV!L*V*_$gz{hkJ>IW*GYqnPEyIsNuV`8aSgE_AqLrZBS`!!34r~$?1JL3`` zl=m)So4W0a=Y@WfIJc;^L4=A-9m&KO9k;82Pc2TbrB;MzlCKuRS^OUKuk;vzlmH>Y z&su{5ZUL`LR%Pk-UV?ktE;oN@ll{p?$AKh_I_9g$g;JU8${IV4sdVUU!3P@U+7vp1 z8uwr5^OzGZx4DLYLVnpb1}xfU2Pn~EL;@qX1IRQtm+hqq7fpM6>(5wQ6s)r;2$FlG zRG&Z9jG|SI9pR4P2>0N2#hxph8U2v7nH#gleX?=dyvORSLj<{fo@929VCW;=MpcJ` z>VwOzX`eyM9nO`fUxcr9GS-qzjLXQt8=bSwl6=FspJ^E9-1tmRXLuz02<@CQy;Xqn zvB@WcpXhx<%hcQ+dOi7oQyOVuSX}3P?qC3$)+PGI0elyl@xGM`T6&q~Tuy>`6NdaY z3a__7S}SkZKPvlnjCWrUmVAWQ*nG7l0=?eYm14+BhU8_GKyvwy8Bh?TsI!M9xXTX< zPyn6|YP10>@#mnZdHMyW%YI8{=iGfL@=m&4y*hCTOVY#+8+?sSHR-rijhNWgd*`ib z#-{B24O=6WK}%J8xIUr2zk~ANAtW+V0OM}-Il*G%*CHSZ1CFJxda^PK^NDCfM=$Cd zASZ!-3Gq~Ftb(|+zzv&QYpvOc3eG5)RnZ2s2H&>rTYI$Fotw8%K9)(La5Rkj()-z6 z!CJxig>U&Q#QYDJJ*d(Kem_?Nmj}y^DgGxu9Ur8c4B3-eR&d2VDGXeUsne6lpaL^!iEx zjje0v-xea@iFPzhjsdjECiCu980LA%S;);eZ^CB60&fUYOhz91S~$H4ggYhu1W#pS zM*H~2%`L5yT_-TFe2PK)ERF*ZOsLV?4(**uJf~RnEe;xlehKors6{2_Nu`$b4n|Ko z$=Sb)R^||+O&P2GD)ZtBJNasphP-lWnu(n6kFz2F(ja;Fm~j2Z@`Q z!vBJhz~zXEMBz+sgVnDu{o$INj11rT!{6^bQw_|mo;@RCL}T&U`%RnATshQ^cvboe zjOwaq!fw{GLeRNfW^NAEr8~W3iH>f=1BTe9e=wM)eq19sNXkfm;1O))1Ra=z-pz;? z>Qrc3+l{4oI%7|`23aF5WPG1BUM;&8LoxHDfktLXD<>78F`e9M{n}s;#ffl<>DNz+KkREyy+G&q^len=WbA{{NZJutEHNwu4#326^Ii|o3&$s8C`RKDuP?Bsv*zc4J^~ve zHvAfsaiHjmKR2r%^6mS-Rg4l~}``;bRYmVnV zXiOd*@0bqbcLcT7+xgrULE36Bv8^_qX<+)zbgLKEof9_+2B?b^doG#L@5~4yM1YV1 z@zGJ<^`6;0gV51*T0MpHjD&j~lQrWV4Ne5z3%vM8Gxf!q*=s=#tFPu@T31Sj^JbAz z1)E+*9GO_!Ei&)g8Au;{x(dN~nzy==!-cXc&45O1_A{iUP1mjp_NHb>;24+9`HZQL z^`z+%W6ZTJAw0#{@FAi)+#P3O!3^9D^#v7-u7*0l3`hTw=5HWxBjbrd&wcrdU#Q!1 zXYx0A&A6&ij!)!~;oDZTWKkPO64 z667Z;sq|)b-J`ydgQYExch{T~-z_pYn9m)DQ)MK%(F_uNrou990R;&}&4$@$jAs;# zvlc~q5Q?+h+iy>d4XtPy5VWv*(9HqAw?pZP<6(Fc=VIt5a2yn1AMS2%d`DyD44-MI zBlX9^EE>`=LE=&GmQ~sUIXGySy>Q}w%yh{wd0PWVwq=`S9A(JrObB;vMwgL}*jIWg zca6mdmz@q$4rJfoOH1-dOBHpH_7*PsE+4uXD|pMU$(qYy-TL)p%o$>yB=x?|GtOc3iPjZuZxhb&e8&eyE?E`k(khuP4d8vz%H z1x)b%ggs3A%I%`81al+W?oBy&rM^br&@vd*-VAary0>=^H!2 zt%!yWZu+|@DY)=5;Cv2>#=&(b@&5w}bM;@$?_ZVI-5=w8dr^xh|jr`{z7D);!m~<--9b`pK_73`d zb!)V51BMv%3&{1vGcHOh@9~Mnru|g!bHyn`{ArHnsetLH%a+ekqB5swWZu?W)=l|N z?l1

YGQ&pt+>Ixqn|$}JuK7|)nF4rZyIhIu{wHwj4uNNPIG^v zqrNy~m6RYm}7KGV3PjUBbZr((o>A|7{!;JX8>Uw*+K?yb&v3lb5NUy!F?BveVt$0= zjf+uRyfr=Zn+tbTd5w~W*=&)P<0v?nb;ixEC36Ni0FEjD3akPW9##?d?96YT+Ion8IlGA(|yG^bX1q}sS7*tiGis`wOkdGMKCggH!1$1@^q39RAb)Lv5Nh?&?hHW&g5yG$wTd@KZ}~vv zz6lX$+*O5J@q#j3XWFDF8a6ir1-C24r zY7h8%-T)?Cm*cr!Hf?Uq2jgX*=NoP)k2l+MjBJv_)z!Z?OiG{yC{1(Ac*rS8Tf{Ge z{G3AletgtP%+E~jnA{;huH!o4enW4-HAI8jZ6H~{ien=QM z-$XK|aw78EaLw(9YNcuLzeeG{W@Q0M8OzS_=w%qPlQ@%$L5`~JyW>jVt?Nd)TnM-= zA&fY)=$NJ565j%{u%ZRpQH~^YeHjXF3S48^FxYgAWb%ZRDa(|MBPB@IW(O$DH89zo zQw<&z?tTV^B<}R_LdBzO2To^xZG}h}KR%w3==)S08!I`#_#Lj3qEJHr1<*&p>tUSh z0xID(^lZ>jraz0Nt4=boY3uN0J(#Blv?4^%ciCUBf!_C<+_-t6=%F+`m*h3f$K(dc z!$EPU;pv)M^@-CGjE2|nc=*(tcd+H({S-^cw6wGoX;kyoY2c@5#aEpcc@yX6l(=|! zw0;~PoL={^3*4xd$E&w$WKfNVYh{2$WX%5d?)`jeHM6Jm=NA0+YTheB>Ao+OINF|l zH`{(PnZ|E@tRhRJr>jeYHsUhJ3Q=3Yp%*nz$~O3ZGUhnHn?E{2#Zf+P9C$p|@K3nb z6V04U*a7abQjv2+@^0VzT`;LJOP?;Qr^^XdibC778$60j1CW)|3J55w z5#X062tJI`GE>8eY)u$5Cgzt=+P2#PMCnO6tgnKoY$^yS-OnV5j?;{1^O8Q>pM5&* zT^^XKaKYr=Xio?InD|Y3Er#P%UeZS0x~Ew+Dp9~73opk%G^469zF_~?$h2m*Hdc$N zu4RJ6n}%bd;aVNYcfQcq8TM|xyt)yGQ_t5@M(9#7~=VucJ*G)o4DX)Ezt%_$+uJ*aonah*s zM_R;wA$q%;Q0@jgfXeEQ#^rBhUOOemU9D!LIr)aDqY4{(z= zhbl1rijz-@uT&KFfP1AecR&i%kBRZ@=l2=oNOB;r*-el0rdy}6VX~&WB0hq5={~p; zi5C_Q>EOXUj3hCU6!5+Wci-MsXBHW@L`U~3IwxYIy@g{? z%q_caf_rSF291ggLE$AyM{A2VVP=lmZnK%}!RmQo=#rgGcm`Eh z=w~e@po56;rzc|e@^JI|P6OAugfiCDu-9yLViZ_P4{nSfphAk^R}F@(Ep)g``cHl; z3^DdlW^%B}f;WX@>TD+I2UC?kNpPE-EBU};%ca<$7w^9SobT4L`dMsW9oOs>!HlNd zmxYO6<_e`qC7%h<2GhgCPm#ys_ZeNl(tY6v3NC5902yACD{FQgo@M6VPScC}vA|;# zctx3BLq#yH(*RdRg+trF7mjz%nkfthjY10(NX z(6L8*>)xyhlMNj_9u31i68%_#)Qf}XZ(2D5e&*3X=N0%Z-Z#N#mwNt&Bn(4CVxXfP zJ~!}wXnmR=Xut-Y#ukZQFE)LtN~%DcEu^H2)00{*i&w-uHl4#}WOEacz@hW)VSne- zJ5gTjSaQ`U2DlZ4WQa0^;&tqBDqquf7}vI)UMrIB_&&$eym3F>wlm3eDr@ZiqSN!V zg2NaK*deeQ&HtpV+rgb+xl}cJTGeHO{&ON;$qjT{((Zb#NUzsHLeAUK`E<~!@TlGS z+qb<9v<(q^#oK{g=Y{B({ooL=t(1?Wj3&T+ez?ESU%B`Tq2%1}BwMP| zP5wcZELr#knZW;ovbLjxPOVDY5924s_eLP~iO)|!v>rBjRAh3O903$JYPqt7V$~88 zDZJ`h@jj2|laMBzRhQ^oi=oD5`%N02Aupfj`~u55;DTxPm$AH#Y8Og z97TmHRvD9|J14OO;}BeLT|J~E4fvz)9CYd-GW+#!B|I>}L3xw*dd>N+=mO*GV_8I^ z8*OfJ+sN_O3VXdsOCC<~-KV>(FoaFpN^#o($e!DA0p;(lfiso^0!Y5z*}G6}b*JDa zD=(dO6-a3#ziEr&NG-KF>TrVMF}&1q_WN{A{_)@SV$dAUWOUN9DG}e4T(|w9qy3@I z8uP{PN`HWwYAZx#KDCe;gMkI+s=Z(=yDJzL1v!c-)Ap+oy9Wn&-J#)kj1NGrsDi=# zm2wQ^IFprUEu+Stv#)i^dbvB7uaVH{bf8ANs9~CMqKI8$lVP@oPPa-~-7+)2WXI-w zP(EjxvoL&jy0qV6+x7l6`25j;%Cb?q*yJMkrWWg+UjI}#o{pFF2|QaV{&&W`l|jgV z0s_3;_9oL)q_OtvooG1RoA$#Q0P*qfa-ZrYY|b^)uiDQ#ywVD`7-3Ob9JXT>T2&)6 zBQ>{!(C<5>wz!t7mY5R?>l1|2jT1Dd`D9g9VMjIYJI>}p}kGNa`pfK;j>x_i4WQGyTCR^NrMeGEPM9CG} zBfU0f;Z0wtH&(+2KQ5`6{hmmdTO~|2#&Y{LB>=h*@CD~yPk%VwKlo@ zwOu}L4^nRTVCoNuw7}W7%n6H^s9iaiSvHw;SsGG_>xAq30%Q&z+OY?M=>-c~`rI9r(MWuP+lNr#PPak>i^>lJt1-#y)ob7QoUbS-;uDM1S z-m=IPL~xXq1n(kHxpk6r*ml93riBo7 zK?6rpJwYRv`tNx0%l6l(dHo(?%Pd?D+Yz9poQi>Z}1{|a+UVLB~GXO z@YrOLJSTp~2YN)Mi=FG5^|yn~rzGpOHLdE~7QawMIl%Kf5bzG9QZ1lYx{XlHYsMST z(De*ITK#1TgW})&0SQKfnP!3ZRYLWe6~oBhkAC3mF0j#U5d)C_on_FU z$$=1f3v5`j8S8qf;~!9OCi8hp_9178*8PhNqxBM$c-#jC{f@4)@9W#w`W`%2h%k2g zp2C|8cSncRHyl|!%|MtZ9PJwt9%uQWt_6IJgbsbLbB2{rv7oiNNzR`LB@NET+A2nla1!MI>EFc#URb$?z03;n>*=)&k{<)C$q&SL{Txy9#S6Q{8x+a^m^bf_TqQbfGo+kx=Y0E5rx z&s%hLk(*nPbGe$kO(VCPN&KfJA5c{!1~%P@D|_5+$RUZ$7~f}0ELDs3*()^k9Ay}l zQMRY_w@1Q>vDdd-eh4yXj~`-Wh5s0OtOt<_H;>KCh*~y%B^LlTgeP5^(v#$Qdo5cQ z4@t$su2*AGAS$`AhCGlXzNd8l_UAnG^yc8T+vjWByq!xO=-%g!N&fZvlO-{k)E?|2w~X8EBUA0&djqyN&J?Q&zeLEO|K^vw`gURM5gV0ir9cVjWWmuY z`(A4Yn=_f-=#;&Gqx;@wz)<#m*h*7zk9`q7+jAkxixpzJFwGo-)%PMFKNENG@Rnmj z8{{2cv8+p?hqacOnZa)0c7roneB9kiY1*hqs^ifnuioQ+V5$E7{QRspy3V(l)_*qm z@Z)uBSj9~BWqNx*7Y`#db66#2f^`3obV3dh3ElcdB<4?Ys}j}99BHb&=IyCka3T`4 znS#88OmnM@RU2o?;Z~PHxms4-AZ~k>zHim1R$iVOCNE7?((n`k<(fluz zMo)KykiIt>{&#@m*yJV>*x2pu^%A!XPxE#C^$daPySdjMMxbNB`LB#y&^L@r$~dGL z?1$BFy%EAYD^pZZ384weG%VKGB?f_mNK;hGHKra5Yl;fGt7@xyf6pOuom?<~2L+Xz z|4D){q3Rls%a7v&VTM|HAn`xnTFo1-71xz@TOEuy>MPm+QQ_s+ymW)BlqtF|Bl+#p zribYX-b&XBAo&*|bx-x>!XrJ=4w^6Xh(8>)wbh@?gUNH>f#KH5Hl=Ojwegxs_a74z zPlg7?SoD6VZOfO`B77F@Pz~|l>!-!MygW~>Tg!4y`uZ3p7sIQy}f3P_JYj6^0 zPh*m$-^QjneC3H`bNBN!vu{tyD&+n%IvYc^%nH*Q}^m9>SU?jI{VV6{hmIc~9dfP^{miopYah~Ntygm@^iyrR7nShrZU_s3X!)Jog@ZN}Ph$IZu z*^5d>z|AC&?cVzwZ_MYZ>P-dkd_>yfv={98vSB->_j;!{wgtJp9M_QEFXrI<QxABeu=*4V-pO-*bKG#^Fo9tI@*(oTgTDQ?DLxRk1`?#Wq zFk$tS_ntLn@JZ8L{;MwK!%1Q0mOc2|EswL9hrS~k_f=>f--jUkk(5y?T>(%U@e8n4 zl`*N9bs!N}<{-F1He)j<2}GmwZ`P$eKGTwW@!* zu|A=*K7(v;wt>1MPGwR!EH}N1$Xw>Vnov3aVNA*EWl3;lSQs2dOF{Z z-ZDsYIGKpfzl%g7B<3mXN%Vw`R$Xu6i|7ZzXLK{?=x+6DFlh~@1!-kr^%8(>fGheb-P`u#n) zIzqpew_u%$h#43mlCNb2rhDiKnuB^X@EvXjt>c4DBQtt-4|@7uKqEzjMm)9j2@Gyr z+yK@jzV{SRgsaE_@k>k7r0hO=So*oUif;Gr0ah3Ia{~QV9LHuei+uC#{_z|o)kBNI zY|PSoGHb5S)7a7BB`jR#1aB<$*>&Fdiz=&I%4)p=B%V?Z_(8G)m!mS3QS&fk_iOg+ z>!%jayI^z$ibS!`R-cvz`~b8suu0riNYVLAss&gHvXe_e29HnGkEGqs`zcQ|$UbJP z&sh9#1@?|yG^lMRo}Pzom$?jE2~&UGnvbB^NS1!<>#(QegIRsU8%2^64{#DQnmfLE z1!SJLT2-!l@BXK0!v{NF)^G6A#t{16_|QTAl3rq*1(6H49k9*NEu$Smyvc(mP>0i~ydrZd?C-f;uYx}T?7MSE-O?4Y3E z`@VR;Fdi%0#u=YV9LJpI(3YOH-AW+pS$;}A?0R&xDE!Z$N?y+^6vi3mwWHR0;tv?4cfsYK}6KVo1j+u;e1%wEE*1>4sosM6NkxSdX(I^2Q$ zLf=jfL|$(&%39?H z`)ImD0hLSFBidSe2jgK-eazw26?p<6d-x0g;|EV|w!=_7{I0l{2g2`~>JZEXzWU8$ zgCC6yfVc7f^UF(Y?=jAy;7=_<6(z-X&%5DMh=}V*k&-!zOboVyg17j1x^kykrt&y^ z?zh8Mh9U#gNR7E3hgvQ|#9&Oz9Iq(#+^yeF-G!>k;E7#kYgGorlI0nhmjWYFD-!WdHg7zn zG|>%vb1!W$irpGO>f9{a$>nU#VZnwi5#eOjUZV97p&h_+SfKS1We7Cnv~4k;EZX}q zD#LO)cReU)C)%``PQUf6WR4qEwlXe9dH|Z+CscD*+*JlN-%{uVw}Qt{DBr*(>lti5 ztFxB;J1HZh%i>zNvVBwK)@3(eo6a=G>~AQ0s*HrpRWx#Ubb|}u_;l91HIw&9EXJj^ zg5_LL{V+7QufX5^NPvk7vhDtgfm((5o#i9M=)~=u(|Yek!aG4=TE)a<8l^g`O?n+b z8tM?4PCd)OvX+Hj+X$gfS8mGdc#LVZ1wmwR=Hp~cPoL@-H-L+2EpBH4MJvA}#zQ76 z{gYIR$sFD`pjLVEZk!FErlHwuLzvCwhP+e8}JJon4b$lelV?aMzoVRz?&3mBEjN4+(X zR}L}qFkD))bWF>e{ww`QC>FujmA~I;sXYZ1)Xms4LBl}*$}by0EXy8Y&wUb~cX*rx zJ$zjD>aj{*%Rh-hQ%CgS#e8#%Z#^-WwQNVB#5%v6dzXf38RixEIymYGfixCl@khTO z(PB;6BX?;~A~{3UFxu@hs9y=TL$2Vm-pmaQmw0KJBaJf#JIO%&8}+Pj(q^O}9nEsI zzwR16?IiXcQCC{L@H+jWokvS~Cu$GFj$N2iqhTw^|42f}lMB61-^=8KbsFnylve$8 z;?Y&^={1k&{f;CdayG3DGDD66_NR{)on0O*t&OSv9v@U)c@Idy`)17xm5cnL#swuvfMCDgT(+hBeubZn?IcncK-;L!xj5?77^_b1^r=syWkR*>7$_pS*7`}2(+NZ&qj;fLfOABLU-0d#VI+Y z)<07q9@*F;!j4^@ z2HA7!U{JaBPifEqx|Wc@K&Plvx{v#dyTKourzDDYcM5b&RI^O_a87aqfhv_Vv_znL zdhL_b^OE_>oeAW=_Wldj{1Dk5|HUciNkLS@faWOqab)*%vz5ux50mEVTa*G2u8I4b z+wme&YP)^soi_qrU?~X7|2>!CVWDZHv=g+9o{*~DQ$YksdNUrfoMK;Rv1p%FUVwslfmBh1|b zcY3zT&;?FySrO#vXU6yEl(?|N+rHKMVQ~p%=$rDZm69pYcr-W_L4^$_vfLl|qAS%I zceW(y`W8)m#a<5%0c-Xdn&&PQY;BrLG@~Ojmo`)jTFsgWu9H&_E$YkPK0b+I8k(6>2bn6(j*BmR>HOW@iX~?Exfu|SbgUb+S3<(OvDzliDGNxQSFQ8-BPB=1a{9q)F2!;+tEcfA zG6(+1cV+h3_mp%nj)Aga>6RWhpLNW-btiu;TR*Mg|7QWnJvR85JK273>l(g18&goo z*cZ%)3WGIx==FEINTUPBG>fG>e6lQTTdnkaz7XSAUs`!IZT?vWap(5Rj5W*2IXvsX^=#nF}pOrot@!su69f&sRYLi*!FtFl`jEa8kz$Cw^5U9Sent`oe z*_{dL?ZiBD&BK~Nr{TSoTWBAS)mjm6nP4{^YC33bHJ{6ZutOI}4C5zzOmb==BFU?) z;hi3Szs(%Kt zy*|jT&{-yl;nb80IQHsi*Gt{sfbw3Qo3Gy3LB58u!Z_Gl+#c)paxpPw_r1j2GA}47 zvSc$;3>EMzegVsOD=ZBWk0kfOUrbCoTbQPwpcMBN zp>e{^r}P+_d${I!uEYYX0P7${FTUGMFoGm@EhO7lC>@31E||q;-fedn;x_B$?~e7i z&C8t^gEyK4lcbt?IAH^XPMNZ4ewze)z5Z$WrbK~X*1;Urd`7DO^f?&2+e5IFAyTGO zOuAPQMm3uW`T(QtD~|0{`mTH9nU6**0M$pF(qQ42BkNX=5;0+;YOWi0z?rT^ran21 z3TNBy@QoBiPOfzopx&#QTR>9D?w*J?*{XVm;bqZrXjoC*?C{M7IiOkyEuj_4j%i>5osG@;93OcbR{J`8 zK!(>}7Y4Sh_TNqdYd?^jH%_e67xb^YTHVr zZc9A&e*v?o)<6G}agpByNV3Ixd&j7DkO9D&Z7{XVVMHXXVkMuiUqT*de@;+82?H$( ztZX%=68_U%5hL(kx)5sV_vDaS6bp#6w~vPTepO+MxG=ML9ootV; zhmDp+jj?sgzy>^e$kj1=HN86I&E4N)1EfBgz|x`zMzh;Z_KpWeqFn|IdNMYizQMyJ zn*q@QPeI@Pxok>Y&O1Eo#>Cv+KIjQAU0VB^h1o$3Av>)p)(Qhw{UKtJj$_p zYI>jKdY(AVr=IqV+`h#$GK76%j?wK&wIl3Q^1#Y*MUU(_NZa5^7mY99^^2fyCO8HN zKQ7gqoMY&2_5}~7dD@k_c5u!Juz+im#=3+2PkKE( ze+Uh4A4TobtTt<6;f>TXv5enb&A%SbvbrVhH;zxy>XbdNnhkX?-dDC+odXh9JXL)b z9>tO$+=k)nq&qq@=QjL&qQ30GPQ4&UI%S%mZ;Yb#o6P0t-iF#Y47eWM*f>_;B2aOvU&%ed1Go6|{;^6PR_ZFt%3$f%~DhM_S=o^dvmj7a%07r4)CY z^e@HQ?}Xj(u-l8Cu)-v>(^c*kIxF$@#gF{`;eo3l#`@*%@Q4pDHC0Np2f=DueXk!u z`)gt2cKxBNQ?Aj0BDdjqHBU8U*-UIWa;Dr*AbJSQ^Md@n?Ztr4q=kDIrnmkCUu`=F z3YVhsL$1^h92j!oJlanghtyq=BBS{HBy|RV#(|H(gd$gB2KxOpbyN0k(@$0{voyqr ziH&7Je!RhM>rP(_TP{ooDF~GT0Xen^&%b$>Pg`t{QkDVoI`5q(s;o+y`gN$45ER4cSrv0b0IeG+s&hR-{wDr4Q0-gmWk|HrmZ zJXQ!5lx6T|5rVCa2FHxyjQU%*E9z1|$)bX)%EF~i6gM>kv!3zWZ&#dBd+mfaOvalE z(&XW=B3w9c+kb^q`*Y|Gv#W=mLd=s28Jax;d}NRYREJIiN08N~is8(*8XqxaMZerf zeKBU&SG_fZ+3vLxI^phWo-L5Q*6cppak-JBh>-sna*laud#=+qR*yy=mIMIo{vB1+ zPluFrbChOeY2IX3!^5#~XaycQkLj1ehsmaYA@FUxSOwZ3jb-!^D3}P8GKEnYMf?Zc zd=MUI&aR8r=ungD)&Du-BqDBC`$#H0CdW3hurVRGCj4vc(SBlM?>=aM`Apw*i`#Bb zF}BueXKI3yC&Mu{7`|9kpP;^ccbU)bJNI?sNb;#|b#WG^M&^S;U4Vl2Z_0dSZEK$B zT8j!b+sCf&AISe?6|4xLULCoaX3w|p{N3bgjqNzBoIH%W+83Lm za4TulBK64+xfM2X=&u}~q}BKFbjQA!nmuXmay}bVVxhrL>unNZHj&O8iqhJOYEHWQ zpS=bywige%6_b5YNCI0>W(?~hp(l~66a=zDF7;9OutIza!ifw>NeQ>(S89cw1uQXy zPWfn)g5N*B_GptQgkF3vgohK#=3b353~bPO_C5XY;(>i`3tJiy{_Mx3IsGxqqKVN} zs|mM-jL}KU>S}ij`1)>HJm4kU*Hr&aNq{|JuV}mnAO`nk1q9;(HwWc**DnMqdp>&kW{rvnKee@w=J{|X9`VjNHKptB7?rOA^7pT1!;8Oh4*^BpVDHzOagnIAC1+aG-8{}^M z?*L?4-Za``1X_LHv3QygCBw3Bp$gSv+w4?hq&EIclF{ zU+cCliY5h>G@R3=LAZvvMYvKr!#JeP&CZY z3^jo@S5~eLu~R<;f`?=m_KJ5b8N|7wT!w2Mhd>e=^aQXke@73LfpS#TvzG(JN5@L9 zj}!9@199h31bsduK($MbqMt?zrgX#|^7wr$VtXr*<-I&7bPY*nkKd2DC265+^>{P{ z2jr|V^;Ee9r6xK_5RdugovxgIrF%VQ>D{S zBY z{+<0>2u4#gcx0CkQ7r*5^0QHnGep_yBviYnp^)W_Fp93Q{^&wmy3}bs`27p^5;pW+ zbpqQH{_%cWJAhc}ck38MHE?G)3YFT#Qle9KcX~X@YA+2oZ#5)Ll}|G`2>v8OCq3Yp zG6P~7kbGa0BBWJbHClIa`%b60ng+BHD9@lGqrQ}tulG?P;h|@lpCHkM6}yM;u~Z7X zF?^;)hr2&WS7+=z?2O!Y#n0O<>sDdtV|CgMhHq~f1gqt;8=@lD_iyi=hEt0hW-YbT z^-oco^`mx_X2l1G=`v3(TC7%9ozj+Ua+E#N%!j)ep_NyN9X&R@hg$k`(E>`dGsA9L zU5{$=O>XkbyYg4F^PU2X3U@LNZ~ySGIGf@R%)cQUV~5LTWIjX=es0aGZd&?rFKiW` zK-Rr8anJ$#Ww0zegN!#S`ezimXp4T;6kmHZ(efE{OjIKnX0KD}G+MaEBVzi_Z zI^|@au8d5N{TBxKN0oDB>$ru_YvTZF>L%9pK?t_(L>yZg&8+Y5d?4Z78r8fnztw6{ zEnpwk$HLqeYP7`)ioda)V7LVmfNR%M{L~l9oRA8@8PNKvklai8C zP?gkpOIoz?v=AL2;MWOj1K{+SS0b0(?=3N4F4aO*xKr4uEwW>|jhKdVAQ8JdDywVg zJ0!Iz=bw+nRjCjinT^qiE-6isFEA@ZLU_?235A^H=j$U0Dyt~|%)+%_cu-PPw8Q9DoTJL*R>~nngrrhkM@bL6@om1#? zE9;)u`*7#~NV!bs&*cAvsRT&@r0m_?FqQuv-Hjq|NYg9( znsRnBUIkc7maU-nfGzU{K0Kxghka1M#RKxDfTr6=s$qSEj8v~5xRC~U>pKI^O!4#0 zTX@zP5XaBu$5!vz$=g1fO0RekGl16kiW?06zOlLYr5c>J#(FuU7@CWkD?>7{{2d5r;XX{gYuP-3wt;)EV zw(=v{rln-(GW0=d1;wdWa*`x&#KVD=P|(s6VbYh5ruOFzJqOvk#d!Y!Dwxk)vPqVr zvxix$#Tz=oWB0HZnZ35LnRI@BKJHZaRmlHQzI{p6ZYFQc-9Y7zlYtRG(%JEB8*#3I$EJzNT9h195^lqQ=rT-rm`DKexoD{d`oZL7nNtNm4tMoAzU6d=@pCDF@ z?$yaw$WBhx=E-+;sOM!t#AE@oUC-7$yjnkQC<%U#N|yaGs6ixIC7;EN5&i^g?Y29% z28|wqQRyJ-{9>(P2n<2_3W%+-DIgAje(>(@0$0$sRL?^$T%`n`@3CY{a7lKF7?Q6V z>@CCJ3yv#i>Yq36O$>mbC=uCJswy#C1gMB~`zxyda`NQq{rFWwh>g(i=W_Sx{{8@E zM~<=CZ-;iOClFVV;3bKrJ+N2W%JLoVnIr^rzL4RI%X3MC&Yp9=Qf>i^Bb%}nQRWRQ z8}}eFPwxd3e;$3=;IgnT)ed*jGRQEmKDLd_xWS|urzhI&h_)q~ z6(efWsqU!WDSbF4syNH5WpZ8VDPBd4RF=M;$&>6X^iF6;__U5Fv>7%Al4E7*ptPok zdhT#x0)TYG7WqidB_C&W`>q;|0C&`IA+VDt5J=;BOElj9!vUAqpH1>Az&5{CPnX|uly&#!+RO?tIXmRiH?Vf9x8Lgqtr>ZiBJ=rPiOtiVZ2!y_#p;2v?;9vkg&xyiZ z!b#$IJyq?7NJ&MqTy6KL32HMlbUV!UMt7dpZj4HMLw*%;g42{Oic-Z`!!x6lI z)#5oW7OuW&FAe8bdv#Uxr+cAVAToEe*sARgx3XhFamu;%*lfHzyTLBUp#Cu9BqunB zJZ0Y77rCs0x780_sX;D#-6;JbD~Ts-t4zS=wXtZCEx#HHdZJN)=Zf`62oGp(YTxVc z)~cRa!W=1iLEY7;lcszdJ8!HWQ*h%l(mbGC;hEC_+G;&Tx4W;kpRKplZJ-gv*xEcv zr8m9I8xR7VN~Km+3}y=Ns!5T&7A1lw1kUGssvi?nW5>p5dFXr?BNb0+RL<&;bR_uB z_*0l@?3PRKOsYexf&`5$p0ORDx>PH-kM5WkMC#54D+01Y)%|9s*bj9v`FnKS*_rXm&9o(n_=5#Gs)o4T`!fDr3+KF z$o->IgnVLHIAS+@!Ek|UZv_i@7DPaysrq*4t|z%IhGywoFhAPgDga_Dn;>XGa$O5t_?SPFmL!u0 zJzlr{oa?N%ZtEmO-jbO2dw6`tva>TYYG`P<5D5-u`cT}lU2#nqlTqyyl&c@{))r9V zZoe8Ubv4-*WaLAZpPd}tw(w1q9E~WwxKY`+S@{b8t+HeVl;`N<^eySQlG-Qt@AB8^ z?z0DM#}kaNKARN}<9B>CpK`}Omea`+$v4qY1`%8GJA+%m)OgK-miAZ0m>=CrsNN4r zs-E5!hH_XQMSrPuD6I|BP;3f1-NkUiRL^~;!^aAvrF6}o3-_A%0As+?b2kwIBBSt0hK*8Ztk7`M|cV^U|n2QRyN&x`b7d~S9K-#eN-1SU4F_1 zh4*@5fMVx8c-%lNpS$@w;X%Q6v&SCqBXQ{|9Ra1%Jko!Emj_e5;#6uoEBEU+b`u*3 zQ|NBtRGO52KP2@tnFwa#BGu#aaeB{a9H>q!QWwIsSo$Y_d6PX61?W&JXO4|XdbBH1 zL4(4n(||8ugK0x4CPLVWZwzkA{wy7`w34VE+B5O&L?}7a{fQlOjQ>#WzZ#N0%)(jN zWIo%w=t=d=&U+1YVUK`mXtFXX1?Yg(vrSDoDe_?nN=dK_ep`Hf&!tfx!xly`va}>$ zCl$Nkv&hXZHfK}D_5zW=8~C-?!}5=A2)q8&4PDaI*zR zZEhhe(s$7^6}p2Gp*Qnj{Y$h=m@F@8hIq0b`-=2VqIUXGlufLUM4JeaKFufZdq0%- zy0~sWz^AX-;xGGNo_bj#gSwru9A9D9%$`H(zmEiM&_;`$WLM?Cc-DwkCtP2R_J>~((bYF{i}OCf28^il zG8$*KN_ABowqpKFKZFUWg(NZ16I)e`510NThB0pCYdgY^fD+nC&eq?-o#Gy`bC&yy zhj=q4gaj~PCVHW3`6nBYV;<2H=#ajL{ev20odOX7>q?EWr2^?QPw_GDRyE9v*3V=P zY;>*}xX0;Pq9MxJ7B}e@&tEm%+fTi^w=(C4ZhgXF?n{BAhrG+YG!C3nGdf!|;=?o* z;`9#>eCiu$=Sx+QK)2sU$5O&bq&CH(c_>t3*kf@zEKD@Ee`6RTA1o#YvQ-283U!&} z+Gdh%M_fal)_rT}I6xvtdyu>Z&g9bsWeQM=9-Sd&6S z5r?uXrwJ`*<3E}P31;821?QR^ZvAzsLxyj^#ey)aHcw?RB3Kv%%My5u7jPd#XQz4! zo^T+Rfv63yV;JzkRAvr=4dK*bO;T~1JVjp!=JLD);0rVd+gLc0QZLi*;CLOnDU!I> zKA`vLq9?QeBJJ`6#lH^GMrwmv7C(gj-Fo-FDDMN+-(xM0KeyKVSk=U=|N30N#$LHL zSD(tZsVAqfWXm0!t3jFQ!yj|e>19jluJCDDWNUl!;=>@Al{vpmLstmoR$!9$s>PN) zqvuz>8DJL;Cg5AL6pIKc(ryG}z+*2`v!t_`w^a4nnRMQKd@O}vqEuuZ&gz;^>cco? zF0$iJ1?oqWgx*S}DEtzq>KHn=;UWdE%vB@mhlI%*Ie&tcB?vfk)9%g5YL=)3I-Q(l zVq&%Ds{=etRrSz;4Aqf&bhf_o&YW23lEdGw$w7vWtgonO;NX1EwRk>qI>bx*-j;XB z==!Yx7ogFJl}mOrweXKyrLD}~b*yz5t&w}^V-#ktNIdUE!=qZXkCpbVgG9|(8ER>N`yPh>`Z- zFltIS$b|JxMcySePqVK&vN^>jvzLaoFowO*?9D)1xpd*m`(+>0F>V#V-{~lo*Gkf% zB@(C`pDtJh;$HW`>z}w=cphc~mVkd*1wad~9R_p`T98Sk&3J|s=5a09j(I|%CwZ^f z+&*G`-|rLi!j#C&dy%wGL?HM;0X-IBQ5U97CVc+-7DV&0`Et(KIt_iNWFH@;U(H z*~>ce%W-uoqr-i3q%DB|#gO#&Be$Yb9cg)Nqxiu6KdSMU7lNzeVGj9j#>y@SMb6$Z z#^TaMwbgsy;APQh6?Jih;*S~TTwxLi!f}CO8*Ph8hVQAwg^wM#y-5ax3F;VI-nXMf z+tKY-CKI?~oDLkQo@7p_0~I!`-Lz|kZG`;_5S)FAH^lfI{#*Fmp#NrJEKL&mx~@tUl-^t2l|Qe>Bi&Z@nqciO5?Mp6+K& zIRiFPwU+Lg>bW7(rwZaxKNNS~xEs7`fQ=MaHTaflK0DCx+Q5~`A=35S6)1WJ(mXRjNLA44YOm=PI#;GN2%kK4dW;7B7n+xkFpYmr||lRjXsw0$zY6u zoP{Ajd!60Pmb*{-FDvKa9BrQ{Od1<}%cbk}n8%|f#ZcB`=KA=?rz5E>!6eCei`qKG zats*-g~~lX{12a6Xuf&%Jg3L&KhQ3g)}k zPHqW$S{UVy137{~=OMg+S{#IhWlYWfUc8X{skkYVw*hs^o!~6G2ss0sq>Q6@k&V^r z%kO)!x9DyIONwKy#KXZ>MxEYHV(|Xau-PN|u9^jnCY#Kdwzm0rDOJpAIhuiamlM4k(sif7!8Y=L5B(!@yzy&7 zdrCOl{#ycuS;PAxB99gjQOWKver=`uZ0e@A%v7ExM~)=y59rqxO(PSo4G>gnDKH{Q z^{B?#cyv=CwHT&QW@f)0D!myUb^+O*uqGEi-{(uk&^UeDi-nBfRF7o=UgAy` zWu5Ol0AmAFg30!tJeix4~x0rf)L?6N2+G>yAW4o-VQLK5W5l zv}Si!m@d_l#UwL7lHpVB>!FB>Ik)I>=Z~54@a|tJP(=}b7>9AZLa?%*?%HiTc2%NO z$7P^V-Q%Zl>u@5A1nP5D6d^zU?QZ>UG&4kuB&ceYn$-fAWB6MvDm{MNi#`$xLtNG= zN^PF1buFzF6*`MlI4(lWD;H6NFP|S69S;-;x@H;HfMdxh)s?N)-s!T}NXeN?Esy{k z!DH3Ze3ON#OQ~}>J-qZY{5Kew54Zoi#7iP1ν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�p!H7e6jT2vc1csbHMSp|NA>@ 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

nrvU|_ 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�sk_4(#d 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
  • u9@izSlems221wqCj|RYoVv*7+ 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 LS>CNPaF72t7l~)_ literal 9 QcmeavFHvyIFU?B<01xB?P5=M^ diff --git a/src/debug/jtag/generated-command-schemas.json b/src/debug/jtag/generated-command-schemas.json index 665c07dff..76c7e040f 100644 --- a/src/debug/jtag/generated-command-schemas.json +++ b/src/debug/jtag/generated-command-schemas.json @@ -1,5 +1,5 @@ { - "generated": "2026-01-30T05:40:56.725Z", + "generated": "2026-01-30T09:54:52.328Z", "version": "1.0.0", "commands": [ { diff --git a/src/debug/jtag/package-lock.json b/src/debug/jtag/package-lock.json index ce6c1697e..2be7c3815 100644 --- a/src/debug/jtag/package-lock.json +++ b/src/debug/jtag/package-lock.json @@ -1,12 +1,12 @@ { "name": "@continuum/jtag", - "version": "1.0.7467", + "version": "1.0.7471", "lockfileVersion": 3, "requires": true, "packages": { "": { "name": "@continuum/jtag", - "version": "1.0.7467", + "version": "1.0.7471", "hasInstallScript": true, "license": "MIT", "dependencies": { diff --git a/src/debug/jtag/package.json b/src/debug/jtag/package.json index d353bbe4f..ca3ded0c6 100644 --- a/src/debug/jtag/package.json +++ b/src/debug/jtag/package.json @@ -1,6 +1,6 @@ { "name": "@continuum/jtag", - "version": "1.0.7467", + "version": "1.0.7471", "description": "Global CLI debugging system for any Node.js project. Install once globally, use anywhere: npm install -g @continuum/jtag", "config": { "active_example": "widget-ui", diff --git a/src/debug/jtag/shared/version.ts b/src/debug/jtag/shared/version.ts index ce2adee58..273fa1e3c 100644 --- a/src/debug/jtag/shared/version.ts +++ b/src/debug/jtag/shared/version.ts @@ -3,5 +3,5 @@ * DO NOT EDIT MANUALLY */ -export const VERSION = '1.0.7467'; +export const VERSION = '1.0.7471'; export const PACKAGE_NAME = '@continuum/jtag'; diff --git a/src/debug/jtag/system/user/server/PersonaUser.ts b/src/debug/jtag/system/user/server/PersonaUser.ts index 1b6605ad6..e3f6f9aca 100644 --- a/src/debug/jtag/system/user/server/PersonaUser.ts +++ b/src/debug/jtag/system/user/server/PersonaUser.ts @@ -83,7 +83,6 @@ import { PersonaGenome, type PersonaGenomeConfig } from './modules/PersonaGenome import type { PersonaCentralNervousSystem } from './modules/central-nervous-system/PersonaCentralNervousSystem'; import { CNSFactory } from './modules/central-nervous-system/CNSFactory'; import type { QueueItem } from './modules/PersonaInbox'; -import type { BaseQueueItem } from './modules/channels/BaseQueueItem'; import { PersonaMemory } from './modules/cognitive/memory/PersonaMemory'; // NOTE: DecisionAdapterChain removed - Rust cognition engine handles fast-path decisions // See: workers/continuum-core/src/persona/cognition.rs @@ -1776,16 +1775,6 @@ export class PersonaUser extends AIUser { await this.autonomousLoop.handleChatMessageFromCNS(item); } - /** - * CNS callback: Handle channel-routed queue item from CNS orchestrator - * - * This is called by PersonaCentralNervousSystem.serviceChannels() via callback pattern. - * Dispatches by item type to appropriate processing pipeline (voice, chat, task). - */ - public async handleQueueItemFromCNS(item: BaseQueueItem): Promise { - await this.autonomousLoop.handleQueueItemFromCNS(item); - } - /** * PHASE 5: Execute a task based on its type * diff --git a/src/debug/jtag/system/user/server/modules/PersonaAutonomousLoop.ts b/src/debug/jtag/system/user/server/modules/PersonaAutonomousLoop.ts index 0d50f74f5..65ac76bff 100644 --- a/src/debug/jtag/system/user/server/modules/PersonaAutonomousLoop.ts +++ b/src/debug/jtag/system/user/server/modules/PersonaAutonomousLoop.ts @@ -19,11 +19,6 @@ import { DataDaemon } from '../../../../daemons/data-daemon/shared/DataDaemon'; import { COLLECTIONS } from '../../../shared/Constants'; import type { TaskEntity } from '../../../data/entities/TaskEntity'; import { taskEntityToInboxTask, inboxMessageToProcessable, type InboxTask, type QueueItem } from './QueueItemTypes'; -import type { BaseQueueItem } from './channels/BaseQueueItem'; -import { VoiceQueueItem } from './channels/VoiceQueueItem'; -import { ChatQueueItem } from './channels/ChatQueueItem'; -import { TaskQueueItem } from './channels/TaskQueueItem'; -import type { ProcessableMessage } from './QueueItemTypes'; // Import PersonaUser directly - circular dependency is fine for type-only imports import type { PersonaUser } from '../PersonaUser'; @@ -242,130 +237,6 @@ export class PersonaAutonomousLoop { // Loop naturally adapts: fast when busy (instant signal), slow when idle (blocked on wait) } - /** - * CNS callback: Handle a channel-routed queue item (new multi-channel path). - * - * Dispatches by itemType to the appropriate processing pipeline. - * Items are BaseQueueItem subclasses (VoiceQueueItem, ChatQueueItem, TaskQueueItem). - */ - async handleQueueItemFromCNS(item: BaseQueueItem): Promise { - // Activate LoRA adapter based on domain - const domainToAdapter: Record = { - 'chat': 'conversational', - 'audio': 'conversational', // Voice uses same conversational adapter - 'code_review': 'typescript-expertise', - 'background': 'self-improvement', - }; - const adapterName = domainToAdapter[item.domain] || 'conversational'; - await this.personaUser.memory.genome.activateSkill(adapterName); - - // Dispatch by concrete item type - if (item instanceof VoiceQueueItem) { - await this.handleVoiceItem(item); - } else if (item instanceof ChatQueueItem) { - await this.handleChatItem(item); - } else if (item instanceof TaskQueueItem) { - await this.handleTaskItem(item); - } else { - this.log(`⚠️ ${this.personaUser.displayName}: Unknown queue item type: ${item.itemType}`); - } - - // Update inbox load in state (affects mood calculation) - this.personaUser.personaState.updateInboxLoad( - this.personaUser.inbox.getSize() - ); - } - - /** - * Handle a voice queue item β€” convert to ProcessableMessage with voice modality. - */ - private async handleVoiceItem(item: VoiceQueueItem): Promise { - const processable: ProcessableMessage = { - id: item.id, - roomId: item.roomId, - senderId: item.senderId, - senderName: item.senderName, - senderType: item.senderType, - content: { text: item.content }, - timestamp: item.timestamp, - sourceModality: 'voice', - voiceSessionId: item.voiceSessionId, - }; - - const senderIsHuman = item.senderType === 'human'; - console.log(`πŸŽ™οΈ [${this.personaUser.displayName}] Channel: Processing VOICE item, voiceSessionId=${item.voiceSessionId.slice(0, 8)}`); - - await this.personaUser.evaluateAndPossiblyRespondWithCognition( - processable, senderIsHuman, item.content - ); - - await this.personaUser.updateMessageBookmark(item.roomId, item.timestamp, item.id); - } - - /** - * Handle a chat queue item β€” convert to ProcessableMessage with text modality. - * If consolidated, logs how many messages were merged. - */ - private async handleChatItem(item: ChatQueueItem): Promise { - if (item.consolidatedCount > 1) { - this.log(`πŸ“¦ ${this.personaUser.displayName}: Processing consolidated chat (${item.consolidatedCount} messages from room ${item.roomId.slice(0, 8)})`); - } - - const processable: ProcessableMessage = { - id: item.id, - roomId: item.roomId, - senderId: item.senderId, - senderName: item.senderName, - senderType: item.senderType, - content: { text: item.content }, - timestamp: item.timestamp, - sourceModality: 'text', - }; - - const senderIsHuman = item.senderType === 'human'; - - await this.personaUser.evaluateAndPossiblyRespondWithCognition( - processable, senderIsHuman, item.content - ); - - await this.personaUser.updateMessageBookmark(item.roomId, item.timestamp, item.id); - } - - /** - * Handle a task queue item β€” update status and delegate to task executor. - */ - private async handleTaskItem(item: TaskQueueItem): Promise { - // Mark as in_progress in database (prevents re-polling) - await DataDaemon.update( - COLLECTIONS.TASKS, - item.taskId, - { status: 'in_progress', startedAt: new Date() } - ); - - // Convert to InboxTask for backward compatibility with task executor - const inboxTask: InboxTask = { - id: item.id, - type: 'task', - taskId: item.taskId, - assigneeId: item.assigneeId, - createdBy: item.createdBy, - domain: item.taskDomain, - taskType: item.taskType, - contextId: item.contextId, - description: item.description, - priority: item.basePriority, - status: item.status, - timestamp: item.timestamp, - dueDate: item.dueDate, - estimatedDuration: item.estimatedDuration, - dependsOn: item.dependsOn, - blockedBy: item.blockedBy, - metadata: item.metadata as InboxTask['metadata'], - }; - - await this.executeTask(inboxTask); - } - /** * PHASE 3: Service inbox (one iteration) * diff --git a/src/debug/jtag/system/user/server/modules/PersonaInbox.ts b/src/debug/jtag/system/user/server/modules/PersonaInbox.ts index c45592552..fafd25e2b 100644 --- a/src/debug/jtag/system/user/server/modules/PersonaInbox.ts +++ b/src/debug/jtag/system/user/server/modules/PersonaInbox.ts @@ -17,9 +17,8 @@ import { EventEmitter } from 'events'; import type { UUID } from '../../../core/types/CrossPlatformUUID'; import type { QueueItem, InboxMessage, InboxTask } from './QueueItemTypes'; -import { isInboxMessage, isInboxTask, toChannelItem, toChannelEnqueueRequest } from './QueueItemTypes'; +import { isInboxMessage, isInboxTask, toChannelEnqueueRequest } from './QueueItemTypes'; import { getChatCoordinator } from '../../../coordination/server/ChatCoordinationStream'; -import type { ChannelRegistry } from './channels/ChannelRegistry'; import type { RustCognitionBridge } from './RustCognitionBridge'; // Re-export types for backward compatibility and external use @@ -80,10 +79,7 @@ export class PersonaInbox { private readonly personaName: string; private readonly signal: EventEmitter; - // Multi-channel routing: items converted to BaseQueueItem subclasses and routed to channels - private channelRegistry: ChannelRegistry | null = null; - - // Rust-backed channel routing (Phase 1): when set, enqueue routes through Rust IPC + // Rust-backed channel routing: enqueue routes through Rust IPC private rustBridge: RustCognitionBridge | null = null; // Load-aware deduplication (feedback-driven) @@ -107,23 +103,6 @@ export class PersonaInbox { this.queueStatsProvider = provider; } - /** - * Inject channel registry for multi-channel routing. - * Items are converted to BaseQueueItem subclasses and routed to per-domain channels. - * Each channel's signal is wired to this inbox's signal emitter for unified wakeup. - */ - setChannelRegistry(registry: ChannelRegistry): void { - this.channelRegistry = registry; - - // Wire each channel's signal to this inbox's signal emitter - // When items are added to channels, the service loop wakes up - for (const channel of registry.all()) { - channel.setSignal(this.signal); - } - - this.log(`πŸ”— Channel registry connected (${registry.domains().length} channels, signals wired)`); - } - /** * Set Rust cognition bridge for Rust-backed channel routing. * When set, enqueue() routes items through Rust's multi-channel queue system @@ -155,58 +134,29 @@ export class PersonaInbox { } } - // RUST CHANNEL PATH: Route through Rust IPC if bridge available + // RUST CHANNEL PATH: Route through Rust IPC if (this.rustBridge) { const enqueueRequest = toChannelEnqueueRequest(item); - try { - const result = await this.rustBridge.channelEnqueue(enqueueRequest); - - // Log with type-specific details - if (isInboxMessage(item)) { - const senderIdPreview = item.senderId?.slice(0, 8) ?? '[no-senderId]'; - this.log(`πŸ¦€ Routed ${enqueueRequest.item_type} β†’ Rust ${result.routed_to}: ${senderIdPreview} (priority=${item.priority.toFixed(2)}, total=${result.status.total_size})`); - if (item.sourceModality === 'voice') { - console.log(`πŸŽ™οΈπŸ”Š VOICE-DEBUG [Inbox] Routed VOICE β†’ Rust ${result.routed_to}: voiceSessionId=${item.voiceSessionId?.slice(0, 8) || 'undefined'}`); - } - } else if (isInboxTask(item)) { - this.log(`πŸ¦€ Routed task β†’ Rust ${result.routed_to}: ${item.taskType} (priority=${item.priority.toFixed(2)}, total=${result.status.total_size})`); - } + const result = await this.rustBridge.channelEnqueue(enqueueRequest); - // Signal TS service loop that work is available - this.signal.emit('work-available'); - - return true; // Item routed to Rust channel - } catch (error) { - this.log(`⚠️ Rust channel enqueue failed, falling through: ${error}`); - // Fall through to TS channel or legacy path + // Log with type-specific details + if (isInboxMessage(item)) { + const senderIdPreview = item.senderId?.slice(0, 8) ?? '[no-senderId]'; + this.log(`πŸ¦€ Routed ${enqueueRequest.item_type} β†’ Rust ${result.routed_to}: ${senderIdPreview} (priority=${item.priority.toFixed(2)}, total=${result.status.total_size})`); + if (item.sourceModality === 'voice') { + console.log(`πŸŽ™οΈπŸ”Š VOICE-DEBUG [Inbox] Routed VOICE β†’ Rust ${result.routed_to}: voiceSessionId=${item.voiceSessionId?.slice(0, 8) || 'undefined'}`); + } + } else if (isInboxTask(item)) { + this.log(`πŸ¦€ Routed task β†’ Rust ${result.routed_to}: ${item.taskType} (priority=${item.priority.toFixed(2)}, total=${result.status.total_size})`); } - } - // TS MULTI-CHANNEL PATH: Route to per-domain channel if registry available - if (this.channelRegistry) { - const channelItem = toChannelItem(item); - const channel = this.channelRegistry.route(channelItem); - if (channel) { - // Channel's enqueue stamps enqueuedAt, sorts, handles kicks, and emits signal - channel.enqueue(channelItem); - - // Log with type-specific details - if (isInboxMessage(item)) { - const senderIdPreview = item.senderId?.slice(0, 8) ?? '[no-senderId]'; - this.log(`πŸ“¬ Routed ${channelItem.itemType} β†’ ${channel.name}: ${senderIdPreview} (priority=${item.priority.toFixed(2)}, channelSize=${channel.size})`); - if (item.sourceModality === 'voice') { - console.log(`πŸŽ™οΈπŸ”Š VOICE-DEBUG [Inbox] Routed VOICE β†’ ${channel.name}: voiceSessionId=${item.voiceSessionId?.slice(0, 8) || 'undefined'}`); - } - } else if (isInboxTask(item)) { - this.log(`πŸ“¬ Routed task β†’ ${channel.name}: ${item.taskType} (priority=${item.priority.toFixed(2)}, channelSize=${channel.size})`); - } + // Signal TS service loop that work is available + this.signal.emit('work-available'); - return true; // Item routed to channel β€” not added to legacy queue - } - // No channel registered for this domain β€” fall through to legacy queue + return true; // Item routed to Rust channel } - // LEGACY PATH: Flat priority queue (for items without a channel) + // LEGACY PATH: Flat priority queue (Rust bridge not yet initialized during startup) // Check if over capacity if (this.queue.length >= this.config.maxSize) { @@ -381,13 +331,10 @@ export class PersonaInbox { * Otherwise blocks until signal received or timeout */ async waitForWork(timeoutMs: number = 30000): Promise { - // Immediate check - if work available in legacy queue OR channels, return instantly + // Immediate check - if work available in legacy queue, return instantly if (this.queue.length > 0) { return true; } - if (this.channelRegistry?.hasWork()) { - return true; - } // Wait for signal with race condition protection return new Promise((resolve) => { diff --git a/src/debug/jtag/system/user/server/modules/QueueItemTypes.ts b/src/debug/jtag/system/user/server/modules/QueueItemTypes.ts index 27a3d3eaf..a0aa0e93f 100644 --- a/src/debug/jtag/system/user/server/modules/QueueItemTypes.ts +++ b/src/debug/jtag/system/user/server/modules/QueueItemTypes.ts @@ -149,104 +149,6 @@ export function isInboxTask(item: QueueItem): item is InboxTask { return item.type === 'task'; } -// ═══════════════════════════════════════════════════════════════════ -// CHANNEL ITEM FACTORIES -// Bridge from existing data interfaces β†’ new behavioral class hierarchy -// External code constructs InboxMessage/InboxTask; factories wrap them. -// ═══════════════════════════════════════════════════════════════════ - -import { BaseQueueItem as ChannelBaseQueueItem } from './channels/BaseQueueItem'; -import { VoiceQueueItem } from './channels/VoiceQueueItem'; -import { ChatQueueItem } from './channels/ChatQueueItem'; -import { TaskQueueItem } from './channels/TaskQueueItem'; - -// Re-export for external use -export { ChannelBaseQueueItem, VoiceQueueItem, ChatQueueItem, TaskQueueItem }; - -/** - * Convert InboxMessage β†’ VoiceQueueItem (for voice modality messages) - */ -export function toVoiceQueueItem(msg: InboxMessage): VoiceQueueItem { - return new VoiceQueueItem({ - id: msg.id, - timestamp: msg.timestamp, - enqueuedAt: msg.enqueuedAt, - roomId: msg.roomId, - content: msg.content, - senderId: msg.senderId, - senderName: msg.senderName, - senderType: msg.senderType, - voiceSessionId: msg.voiceSessionId!, // Voice messages must have voiceSessionId - }); -} - -/** - * Convert InboxMessage β†’ ChatQueueItem (for text modality messages) - */ -export function toChatQueueItem(msg: InboxMessage): ChatQueueItem { - return new ChatQueueItem({ - id: msg.id, - timestamp: msg.timestamp, - enqueuedAt: msg.enqueuedAt, - roomId: msg.roomId, - content: msg.content, - senderId: msg.senderId, - senderName: msg.senderName, - senderType: msg.senderType, - mentions: msg.mentions ?? false, - priority: msg.priority, - }); -} - -/** - * Convert InboxTask β†’ TaskQueueItem - */ -export function toTaskQueueItem(task: InboxTask): TaskQueueItem { - return new TaskQueueItem({ - id: task.id, - timestamp: task.timestamp, - enqueuedAt: task.enqueuedAt, - taskId: task.taskId, - assigneeId: task.assigneeId, - createdBy: task.createdBy, - taskDomain: task.domain, - taskType: task.taskType, - contextId: task.contextId, - description: task.description, - priority: task.priority, - status: task.status, - dueDate: task.dueDate, - estimatedDuration: task.estimatedDuration, - dependsOn: task.dependsOn, - blockedBy: task.blockedBy, - metadata: task.metadata as Record | undefined, - }); -} - -/** - * Route any QueueItem to the appropriate channel item class. - * This is the main entry point for converting legacy data interfaces - * to behavioral class instances. - */ -export function toChannelItem(item: QueueItem): ChannelBaseQueueItem { - if (isInboxMessage(item)) { - // Voice messages route to VoiceQueueItem - if (item.sourceModality === 'voice' && item.voiceSessionId) { - return toVoiceQueueItem(item); - } - // Text messages route to ChatQueueItem - return toChatQueueItem(item); - } - - if (isInboxTask(item)) { - return toTaskQueueItem(item); - } - - // Exhaustive check β€” should never reach here with proper discriminated union - const _exhaustive: never = item; - throw new Error(`Unknown queue item type: ${(item as QueueItem).type}`); -} - /** * Convert a Rust service cycle JSON item back to TS QueueItem. * diff --git a/src/debug/jtag/system/user/server/modules/central-nervous-system/CNSFactory.ts b/src/debug/jtag/system/user/server/modules/central-nervous-system/CNSFactory.ts index 655d883e2..db1041654 100644 --- a/src/debug/jtag/system/user/server/modules/central-nervous-system/CNSFactory.ts +++ b/src/debug/jtag/system/user/server/modules/central-nervous-system/CNSFactory.ts @@ -1,108 +1,73 @@ /** - * CNSFactory - Capability-based factory for creating PersonaCentralNervousSystem instances + * CNSFactory - Creates PersonaCentralNervousSystem instances * - * Selects appropriate CNS tier (Deterministic/Heuristic/Neural) based on model capabilities, - * NOT intelligence thresholds. This allows flexible configuration (e.g., high-intelligence - * model doing simple status messages, or mid-tier model with full capabilities). + * All scheduling is delegated to Rust. The factory wires the Rust bridge + * and callbacks into the CNS config. */ -/* eslint-disable @typescript-eslint/prefer-nullish-coalescing */ -// Note: Using || instead of ?? because strictNullChecks is not enabled globally - // Note: Avoiding direct PersonaUser import to prevent circular dependency -// PersonaUser will import CNSFactory, so we use type-only reference import type { ModelCapabilities } from './CNSTypes'; import { CNSTier } from './CNSTypes'; import { PersonaCentralNervousSystem } from './PersonaCentralNervousSystem'; -import { ActivityDomain } from '../cognitive-schedulers/ICognitiveScheduler'; -import { DeterministicCognitiveScheduler } from '../cognitive-schedulers/DeterministicCognitiveScheduler'; import type { PersonaInbox } from '../PersonaInbox'; import type { PersonaStateManager } from '../PersonaState'; -import type { PersonaGenome } from '../PersonaGenome'; -import { ChannelRegistry } from '../channels/ChannelRegistry'; -import { ChannelQueue } from '../channels/ChannelQueue'; -import type { BaseQueueItem } from '../channels/BaseQueueItem'; // Import QueueItem type for handleChatMessageFromCNS signature import type { QueueItem } from '../PersonaInbox'; -// Import RustCognitionBridge type for Phase 2 delegation +// Import RustCognitionBridge type import type { RustCognitionBridge } from '../RustCognitionBridge'; // Type for PersonaUser (avoid circular dependency) -// Matches PersonaUser's interface for CNS creation -// Uses actual class types to ensure compile-time safety interface PersonaUserLike { entity: { id: string; - displayName?: string; // UserEntity uses displayName, not name - uniqueId: string; // Format: {name}-{shortId} for log paths + displayName?: string; + uniqueId: string; modelConfig?: { - capabilities?: readonly string[]; // AI capabilities (e.g., ['advanced-reasoning']) + capabilities?: readonly string[]; }; }; - homeDirectory: string; // Persona's $HOME directory inbox: PersonaInbox; prefrontal: { - personaState: PersonaStateManager; // NEUROANATOMY: personaState in PrefrontalCortex - } | null; // Nullable during construction, but must be non-null when CNS is created - memory: { - genome: PersonaGenome; // Phase 2: genome moved inside memory module - }; - // Rust cognition bridge (Phase 2): scheduling delegates to Rust when available + personaState: PersonaStateManager; + } | null; + // Rust cognition bridge (required for scheduling) rustCognitionBridge: RustCognitionBridge | null; handleChatMessageFromCNS: (item: QueueItem) => Promise; - handleQueueItemFromCNS: (item: BaseQueueItem) => Promise; pollTasksFromCNS: () => Promise; generateSelfTasksFromCNS: () => Promise; } export class CNSFactory { /** - * Create CNS instance with appropriate scheduler based on persona's capabilities + * Create CNS instance based on persona's capabilities */ static create(persona: PersonaUserLike): PersonaCentralNervousSystem { - // Map string[] capabilities from modelConfig to ModelCapabilities object const capabilities = this.parseCapabilities(persona.entity.modelConfig?.capabilities); const tier = this.selectTier(capabilities); - switch (tier) { - case CNSTier.DETERMINISTIC: - return this.createDeterministicCNS(persona); - - case CNSTier.HEURISTIC: - // TODO: Phase 2 - Implement HeuristicCognitiveScheduler - console.warn(`⚠️ Heuristic CNS not yet implemented, falling back to deterministic for ${persona.entity.displayName || persona.entity.id}`); - return this.createDeterministicCNS(persona); - - case CNSTier.NEURAL: - // TODO: Phase 3 - Implement NeuralCognitiveScheduler - console.warn(`⚠️ Neural CNS not yet implemented, falling back to deterministic for ${persona.entity.displayName || persona.entity.id}`); - return this.createDeterministicCNS(persona); - - default: - console.warn(`⚠️ Unknown CNS tier: ${tier}, falling back to deterministic for ${persona.entity.displayName || persona.entity.id}`); - return this.createDeterministicCNS(persona); + // All tiers currently use the same Rust-delegated CNS + // Future: tier could influence Rust scheduling parameters + if (tier !== CNSTier.DETERMINISTIC) { + console.warn(`CNS tier ${tier} not yet differentiated, using Rust-delegated scheduling for ${persona.entity.displayName || persona.entity.id}`); } + + return this.createRustDelegatedCNS(persona); } /** * Parse string[] capabilities from modelConfig into ModelCapabilities object - * Maps UserEntity.modelConfig.capabilities (string[]) to CNS ModelCapabilities */ private static parseCapabilities(capabilitiesArray: readonly string[] | undefined): ModelCapabilities | undefined { if (!capabilitiesArray || capabilitiesArray.length === 0) { return undefined; } - // Build capabilities object with readonly properties const capabilities: Partial = {}; for (const cap of capabilitiesArray) { - // Map string capabilities to ModelCapabilities keys - // Use type assertion since we're building the object const mutableCaps = capabilities as Record; - switch (cap) { case 'advanced-reasoning': mutableCaps['advanced-reasoning'] = true; @@ -132,105 +97,56 @@ export class CNSFactory { } /** - * Select CNS tier based on model capabilities (NOT intelligence thresholds) + * Select CNS tier based on model capabilities */ private static selectTier(capabilities: ModelCapabilities | undefined): CNSTier { if (!capabilities) { return CNSTier.DETERMINISTIC; } - // Neural tier: Frontier models with advanced reasoning and meta-cognition if (capabilities['advanced-reasoning'] && capabilities['meta-cognition']) { return CNSTier.NEURAL; } - // Heuristic tier: Mid-tier models with moderate reasoning and pattern recognition if (capabilities['moderate-reasoning'] && capabilities['pattern-recognition']) { return CNSTier.HEURISTIC; } - // Deterministic tier: Simple models with fast inference or template responses return CNSTier.DETERMINISTIC; } /** - * Create per-domain channel queues and register in a ChannelRegistry. - * Each domain gets its own ChannelQueue β€” items control behavior via polymorphism. - */ - private static createChannelRegistry(personaName: string): ChannelRegistry { - const registry = new ChannelRegistry(); - - // Voice channel: instant processing, never consolidate, never kick - registry.register(ActivityDomain.AUDIO, new ChannelQueue({ - domain: ActivityDomain.AUDIO, - name: `${personaName}:voice`, - maxSize: 50, // Voice shouldn't queue up β€” if it does, something is wrong - })); - - // Chat channel: per-room consolidation, RTOS aging, mention urgency - registry.register(ActivityDomain.CHAT, new ChannelQueue({ - domain: ActivityDomain.CHAT, - name: `${personaName}:chat`, - maxSize: 500, // Can handle many messages (consolidation reduces effective count) - })); - - // Background/Task channel: dependency-aware, lower priority - registry.register(ActivityDomain.BACKGROUND, new ChannelQueue({ - domain: ActivityDomain.BACKGROUND, - name: `${personaName}:tasks`, - maxSize: 200, - })); - - return registry; - } - - /** - * Create Deterministic CNS (Phase 1 - simplest scheduler) - * Works with ANY model - no capability requirements + * Create Rust-delegated CNS + * All scheduling decisions made by Rust via IPC. */ - private static createDeterministicCNS(persona: PersonaUserLike): PersonaCentralNervousSystem { - const scheduler = new DeterministicCognitiveScheduler(); - - // Assert non-null: prefrontal must be initialized before CNS creation + private static createRustDelegatedCNS(persona: PersonaUserLike): PersonaCentralNervousSystem { if (!persona.prefrontal) { throw new Error('CNSFactory.create() called before PrefrontalCortex initialized'); } - const personaName = persona.entity.displayName || 'Unknown'; - - // Create channel registry with per-domain queues - const channelRegistry = this.createChannelRegistry(personaName); + if (!persona.rustCognitionBridge) { + throw new Error('CNSFactory.create() called without Rust cognition bridge β€” Rust bridge is required'); + } - // Wire channels to inbox: items routed to channels on enqueue, signals unified - persona.inbox.setChannelRegistry(channelRegistry); + const personaName = persona.entity.displayName || 'Unknown'; return new PersonaCentralNervousSystem({ - scheduler, inbox: persona.inbox, personaState: persona.prefrontal.personaState, - genome: persona.memory.genome, - channelRegistry, - rustBridge: persona.rustCognitionBridge ?? undefined, + rustBridge: persona.rustCognitionBridge, personaId: persona.entity.id, personaName, uniqueId: persona.entity.uniqueId, handleChatMessage: async (item: QueueItem): Promise => { await persona.handleChatMessageFromCNS(item); }, - handleQueueItem: async (item: BaseQueueItem): Promise => { - await persona.handleQueueItemFromCNS(item); - }, pollTasks: async (): Promise => { await persona.pollTasksFromCNS(); }, generateSelfTasks: async (): Promise => { await persona.generateSelfTasksFromCNS(); }, - enabledDomains: [ActivityDomain.CHAT, ActivityDomain.AUDIO, ActivityDomain.BACKGROUND], allowBackgroundThreads: false, }); } - - // TODO: Phase 2 - Add createHeuristicCNS - // TODO: Phase 3 - Add createNeuralCNS } diff --git a/src/debug/jtag/system/user/server/modules/central-nervous-system/CNSTypes.ts b/src/debug/jtag/system/user/server/modules/central-nervous-system/CNSTypes.ts index 7e3a08fec..a7470b0b8 100644 --- a/src/debug/jtag/system/user/server/modules/central-nervous-system/CNSTypes.ts +++ b/src/debug/jtag/system/user/server/modules/central-nervous-system/CNSTypes.ts @@ -6,26 +6,22 @@ */ import type { UUID } from '../../../../../system/core/types/CrossPlatformUUID'; -import type { ICognitiveScheduler, ActivityDomain } from '../cognitive-schedulers/ICognitiveScheduler'; import type { PersonaInbox, QueueItem } from '../PersonaInbox'; import type { PersonaStateManager } from '../PersonaState'; -import type { PersonaGenome } from '../PersonaGenome'; -import type { ChannelRegistry } from '../channels/ChannelRegistry'; -import type { BaseQueueItem } from '../channels/BaseQueueItem'; import type { RustCognitionBridge } from '../RustCognitionBridge'; /** * Configuration for PersonaCentralNervousSystem + * + * All scheduling is delegated to Rust. TS handles execution. */ export interface CNSConfig { - // Core modules (existing) - readonly scheduler: ICognitiveScheduler; + // Core modules readonly inbox: PersonaInbox; readonly personaState: PersonaStateManager; - readonly genome: PersonaGenome; - // Channel system (new: item-centric OOP) - readonly channelRegistry: ChannelRegistry; + // Rust cognition bridge (required β€” all scheduling delegates to Rust) + readonly rustBridge: RustCognitionBridge; // Persona reference (for delegating chat handling) readonly personaId: UUID; @@ -34,15 +30,10 @@ export interface CNSConfig { // Callbacks for delegating to PersonaUser (avoids circular dependency) readonly handleChatMessage: (item: QueueItem) => Promise; - readonly handleQueueItem: (item: BaseQueueItem) => Promise; readonly pollTasks: () => Promise; readonly generateSelfTasks: () => Promise; - // Rust cognition bridge (Phase 2): when available, scheduling delegates to Rust - readonly rustBridge?: RustCognitionBridge; - - // Domain configuration - readonly enabledDomains: ReadonlyArray; + // Configuration readonly allowBackgroundThreads: boolean; readonly maxBackgroundThreads?: number; } diff --git a/src/debug/jtag/system/user/server/modules/central-nervous-system/PersonaCentralNervousSystem.ts b/src/debug/jtag/system/user/server/modules/central-nervous-system/PersonaCentralNervousSystem.ts index c9ac0a0b7..aa746dc7f 100644 --- a/src/debug/jtag/system/user/server/modules/central-nervous-system/PersonaCentralNervousSystem.ts +++ b/src/debug/jtag/system/user/server/modules/central-nervous-system/PersonaCentralNervousSystem.ts @@ -3,21 +3,17 @@ * * Orchestration layer that coordinates multi-domain attention for PersonaUser. * - * Service cycle (Rust-delegated, Phase 2): + * Service cycle (Rust-delegated): * 1. Poll tasks, generate self-tasks (TS β€” DB access) * 2. Wait for work (signal-based) * 3. Rust service_cycle() β†’ consolidate, state-gate, schedule, return next item * 4. Dispatch item to handler * - * Fallback (TS channels): - * If Rust bridge unavailable, falls back to TS channel registry + legacy queue. + * ALL scheduling logic lives in Rust. TS executes what Rust decides. */ import type { CNSConfig } from './CNSTypes'; -import type { CognitiveContext } from '../cognitive-schedulers/ICognitiveScheduler'; -import { ActivityDomain } from '../cognitive-schedulers/ICognitiveScheduler'; import { SubsystemLogger } from '../being/logging/SubsystemLogger'; -import { getEffectivePriority } from '../PersonaInbox'; import { fromRustServiceItem } from '../QueueItemTypes'; export class PersonaCentralNervousSystem { @@ -28,17 +24,15 @@ export class PersonaCentralNervousSystem { this.config = config; this.logger = new SubsystemLogger('cns', config.personaId, config.uniqueId); - this.logger.info(`Initialized CNS with ${config.scheduler.name} scheduler`); - this.logger.info(`Enabled domains: ${config.enabledDomains.join(', ')}`); - this.logger.info(`Channels registered: ${config.channelRegistry.domains().join(', ')}`); - this.logger.info(`Rust bridge: ${config.rustBridge ? 'connected' : 'not available (TS fallback)'}`); + this.logger.info(`Initialized CNS with Rust-delegated scheduling`); + this.logger.info(`Rust bridge: connected`); this.logger.info(`Background threads: ${config.allowBackgroundThreads ? 'enabled' : 'disabled'}`); } /** * Single service cycle β€” the heart of the autonomous entity. * - * Phase 2: Delegates scheduling to Rust when bridge available. + * Delegates ALL scheduling to Rust: * - Rust handles: consolidation, state gating, priority ordering, item selection * - TS handles: task polling, self-task generation, item execution (LLM, DB, tools) */ @@ -58,25 +52,12 @@ export class PersonaCentralNervousSystem { return; } - // STEP 2: Try Rust-delegated scheduling (Phase 2) - if (this.config.rustBridge) { - await this.serviceViaRust(); - return; - } - - // STEP 3: Fallback to TS channel service - const channelRegistry = this.config.channelRegistry; - if (channelRegistry.hasWork()) { - await this.serviceChannels(); - return; - } - - // STEP 4: Fall back to legacy flat-queue path - await this.serviceLegacyQueue(); + // STEP 2: Rust-delegated scheduling + await this.serviceViaRust(); } /** - * Rust-delegated service cycle (Phase 2). + * Rust-delegated service cycle. * * Rust's service_cycle() does ALL scheduling work in <1ms: * - Consolidates all channels (items decide merge policy) @@ -88,180 +69,36 @@ export class PersonaCentralNervousSystem { * TS just executes what Rust decided. */ private async serviceViaRust(): Promise { - const bridge = this.config.rustBridge!; - - try { - const result = await bridge.serviceCycle(); + const bridge = this.config.rustBridge; - if (result.should_process && result.item) { - // Convert Rust JSON item β†’ TS QueueItem - const queueItem = fromRustServiceItem(result.item as Record); - if (!queueItem) { - this.logger.warn(`Rust returned unparseable item: ${JSON.stringify(result.item).slice(0, 200)}`); - return; - } + const result = await bridge.serviceCycle(); - const channelName = result.channel ?? 'unknown'; - this.logger.info(`[rust:${channelName}] Processing ${queueItem.type} (priority=${queueItem.priority.toFixed(2)}, stats=${result.stats.total_size} total)`); - - // Delegate to PersonaUser via callback (same as TS channel path) - await this.config.handleChatMessage(queueItem); - } else { - // No work β€” Rust says rest for wait_ms - // Note: wait_ms is advisory; the outer loop will call waitForWork() next cycle - // which provides signal-based wakeup if new work arrives before wait_ms - this.logger.debug(`Rust service cycle: no work (wait_ms=${result.wait_ms}, stats=${result.stats.total_size} total)`); - } - } catch (error) { - this.logger.warn(`Rust service cycle failed, falling back to TS channels: ${error}`); - // Fallback: try TS channels - if (this.config.channelRegistry.hasWork()) { - await this.serviceChannels(); - } else { - await this.serviceLegacyQueue(); + if (result.should_process && result.item) { + // Convert Rust JSON item β†’ TS QueueItem + const queueItem = fromRustServiceItem(result.item as Record); + if (!queueItem) { + this.logger.warn(`Rust returned unparseable item: ${JSON.stringify(result.item).slice(0, 200)}`); + return; } - } - } - - /** - * Multi-channel service loop (TS fallback). - * - * Items control their own destiny: - * - consolidate(): items decide if/how they merge - * - hasUrgentWork: items decide what's urgent - * - pop(): items decide sort order via compareTo() - */ - private async serviceChannels(): Promise { - const registry = this.config.channelRegistry; - - // STEP 1: Consolidate all channels (items decide how) - for (const channel of registry.all()) { - channel.consolidate(); - } - - // STEP 2: Build cognitive context for scheduler decisions - const context = this.buildCognitiveContext(); - - // STEP 3: Get domain priority from scheduler - const priorities = this.config.scheduler.getDomainPriority(context); - - // STEP 4: Service channels in priority order - for (const domain of priorities) { - const channel = registry.get(domain); - if (!channel || !channel.hasWork) continue; - - // Urgent work bypasses scheduler (items said so β€” e.g., voice is always urgent) - const shouldService = channel.hasUrgentWork - || await this.config.scheduler.shouldServiceDomain(domain, context); - - if (!shouldService) { - this.logger.debug(`Skipping ${channel.name} channel (scheduler declined, size=${channel.size})`); - continue; - } - - // Peek to check engagement threshold (mood/energy gating) - const candidate = channel.peek(); - if (!candidate) continue; - - // Urgent items bypass mood/energy check - if (!candidate.isUrgent && !this.config.personaState.shouldEngage(candidate.effectivePriority)) { - this.logger.debug(`Skipping ${channel.name} item (priority=${candidate.effectivePriority.toFixed(2)}, below engagement threshold)`); - const restCadence = this.config.personaState.getCadence(); - await this.config.personaState.rest(restCadence); - continue; - } - - // Pop and process - const item = channel.pop(); - if (!item) continue; - const waitMs = item.enqueuedAt ? Date.now() - item.enqueuedAt : 0; - this.logger.info(`[${channel.name}] Processing ${item.itemType} (priority=${item.effectivePriority.toFixed(2)}, waitMs=${waitMs}, urgent=${item.isUrgent}, channelSize=${channel.size})`); + const channelName = result.channel ?? 'unknown'; + this.logger.info(`[rust:${channelName}] Processing ${queueItem.type} (priority=${queueItem.priority.toFixed(2)}, stats=${result.stats.total_size} total)`); // Delegate to PersonaUser via callback - await this.config.handleQueueItem(item); + await this.config.handleChatMessage(queueItem); + } else { + // No work β€” Rust says rest for wait_ms + // Note: wait_ms is advisory; the outer loop will call waitForWork() next cycle + // which provides signal-based wakeup if new work arrives before wait_ms + this.logger.debug(`Rust service cycle: no work (wait_ms=${result.wait_ms}, stats=${result.stats.total_size} total)`); } } - /** - * Legacy flat-queue service path (backward compatibility). - * Handles items that haven't been routed to channels yet. - * Will be removed once all items flow through channels. - */ - private async serviceLegacyQueue(): Promise { - const context = this.buildCognitiveContext(); - - const shouldServiceChat = await this.config.scheduler.shouldServiceDomain( - ActivityDomain.CHAT, - context - ); - - if (!shouldServiceChat) { - this.logger.debug('Scheduler decided not to service chat (legacy path)'); - return; - } - - // Peek at highest priority message from legacy inbox - const candidates = await this.config.inbox.peek(1); - if (candidates.length === 0) return; - - const message = candidates[0]; - const effectivePriority = getEffectivePriority(message); - - if (!this.config.personaState.shouldEngage(effectivePriority)) { - this.logger.debug(`Skipping message (legacy path, effective=${effectivePriority.toFixed(2)})`); - const cadence = this.config.personaState.getCadence(); - await this.config.personaState.rest(cadence); - return; - } - - await this.config.inbox.pop(0); - - const waitMs = message.enqueuedAt ? Date.now() - message.enqueuedAt : 0; - this.logger.info(`[legacy] Processing message (effective=${effectivePriority.toFixed(2)}, waitMs=${waitMs})`); - - await this.config.handleChatMessage(message); - } - - /** - * Build cognitive context for scheduler decisions. - * Uses both legacy inbox stats and channel registry stats. - */ - private buildCognitiveContext(): CognitiveContext { - const state = this.config.personaState.getState(); - const registry = this.config.channelRegistry; - - return { - energy: state.energy, - mood: state.mood, - - // Activity levels from channels - activeGames: 0, - unreadMessages: (registry.get(ActivityDomain.CHAT)?.size ?? 0) - + (registry.get(ActivityDomain.AUDIO)?.size ?? 0) - + this.config.inbox.getSize(), // Include legacy inbox - pendingReviews: 0, - backgroundTasksPending: registry.get(ActivityDomain.BACKGROUND)?.size ?? 0, - - // Performance - avgResponseTime: 0, - queueBacklog: registry.totalSize() + this.config.inbox.getSize(), - - // System - cpuPressure: 0, - memoryPressure: 0, - - // Model capabilities - modelCapabilities: new Set(['text']) - }; - } - /** * Shutdown CNS subsystem (cleanup) */ shutdown(): void { this.logger.info('CNS subsystem shutting down...'); - this.config.channelRegistry.clearAll(); this.logger.close(); } } diff --git a/src/debug/jtag/system/user/server/modules/channels/BaseQueueItem.ts b/src/debug/jtag/system/user/server/modules/channels/BaseQueueItem.ts deleted file mode 100644 index 45b50ad65..000000000 --- a/src/debug/jtag/system/user/server/modules/channels/BaseQueueItem.ts +++ /dev/null @@ -1,183 +0,0 @@ -/** - * BaseQueueItem - Abstract base class for all inbox queue items - * - * Philosophy: Items control their own destiny. A VoiceQueueItem KNOWS it's urgent. - * A ChatQueueItem KNOWS it consolidates per-room. Only the item class can really - * know what to do with itself. - * - * The queue/channel is a generic container that delegates all behavioral decisions - * to item polymorphism via this abstract class. - * - * Pattern: Template Method (protected hooks for aging, urgency, consolidation, kicking) - * Subclasses override only what differs. Defaults handle the common case. - */ - -import type { UUID } from '../../../../core/types/CrossPlatformUUID'; -import { ActivityDomain } from '../cognitive-schedulers/ICognitiveScheduler'; - -// Re-export for subclass convenience -export { ActivityDomain }; - -/** - * Construction parameters for BaseQueueItem. - * Subclasses extend this with their own fields. - */ -export interface BaseQueueItemParams { - id: UUID; - timestamp: number; - enqueuedAt?: number; -} - -/** - * Abstract base class for all queue items in the CNS channel system. - * - * Provides sensible defaults for RTOS aging, kick resistance, consolidation, - * urgency, and sorting. Subclasses override only what differs from the default. - * - * Abstract (MUST implement): - * - itemType: string discriminator - * - domain: ActivityDomain for routing - * - basePriority: number (0.0-1.0) - * - * Protected hooks (CAN override): - * - agingBoostMs: time to reach max aging (default: 30s) - * - maxAgingBoost: maximum priority boost from aging (default: 0.5) - * - * Public behavioral (CAN override): - * - isUrgent: bypass scheduler (default: false) - * - canBeKicked: droppable under pressure (default: true) - * - kickResistance: lower = kicked first (default: effectivePriority) - * - shouldConsolidateWith(other): mergeable (default: false) - * - consolidateWith(others): merge logic (default: return self) - * - compareTo(other): sort order (default: effectivePriority desc) - * - routingDomain: which channel to route to (default: this.domain) - */ -export abstract class BaseQueueItem { - // === Identity === - readonly id: UUID; - readonly timestamp: number; - enqueuedAt?: number; - - /** Discriminator string for runtime type identification (e.g., 'voice', 'chat', 'task') */ - abstract readonly itemType: string; - - /** Which CNS activity domain this item belongs to */ - abstract readonly domain: ActivityDomain; - - constructor(params: BaseQueueItemParams) { - this.id = params.id; - this.timestamp = params.timestamp; - this.enqueuedAt = params.enqueuedAt; - } - - // ═══════════════════════════════════════════════════════════════════ - // PRIORITY (Template Method Pattern) - // ═══════════════════════════════════════════════════════════════════ - - /** Base priority for this item (0.0-1.0). Subclasses define their own scale. */ - abstract get basePriority(): number; - - /** - * Time in milliseconds for aging boost to reach maximum. - * Override to change aging speed. Set very high to effectively disable. - * Default: 30,000ms (30 seconds) - */ - protected get agingBoostMs(): number { return 30_000; } - - /** - * Maximum priority boost from queue aging. - * Override to 0 to disable aging entirely (e.g., voice). - * Default: 0.5 - */ - protected get maxAgingBoost(): number { return 0.5; } - - /** - * Effective priority = basePriority + aging boost. - * RTOS-style: items waiting longer get higher effective priority. - * This prevents starvation - every item eventually gets serviced. - * - * Subclasses rarely override this; instead override agingBoostMs/maxAgingBoost. - */ - get effectivePriority(): number { - const waitMs = Date.now() - (this.enqueuedAt ?? this.timestamp); - const boost = Math.min( - this.maxAgingBoost, - (waitMs / this.agingBoostMs) * this.maxAgingBoost - ); - return Math.min(1.0, this.basePriority + boost); - } - - // ═══════════════════════════════════════════════════════════════════ - // URGENCY - // ═══════════════════════════════════════════════════════════════════ - - /** - * Is this item time-critical? Urgent items bypass the cognitive scheduler. - * Default: false. Voice overrides to true. Chat overrides for mentions. - */ - get isUrgent(): boolean { return false; } - - // ═══════════════════════════════════════════════════════════════════ - // CONSOLIDATION - // ═══════════════════════════════════════════════════════════════════ - - /** - * Can this item be merged with another item in the same channel? - * Items decide their own consolidation rules. - * - * Default: false (no consolidation). - * Chat overrides to consolidate same-room messages. - * Task overrides to consolidate related tasks. - */ - shouldConsolidateWith(_other: BaseQueueItem): boolean { return false; } - - /** - * Merge this item with compatible items. Returns the consolidated item. - * Called only when shouldConsolidateWith() returned true for the group. - * - * Default: return self (no-op). - * Chat overrides to merge messages into context + latest trigger. - */ - consolidateWith(_others: BaseQueueItem[]): BaseQueueItem { return this; } - - // ═══════════════════════════════════════════════════════════════════ - // QUEUE MANAGEMENT (KICKING) - // ═══════════════════════════════════════════════════════════════════ - - /** - * Can this item be dropped when the queue is at capacity? - * Default: true. Voice overrides to false (never drop voice). - * Task overrides to protect in-progress tasks. - */ - get canBeKicked(): boolean { return true; } - - /** - * Resistance to being kicked. Lower values are kicked first. - * Default: effectivePriority (low priority items kicked first). - * Voice overrides to Infinity (never kicked). - */ - get kickResistance(): number { return this.effectivePriority; } - - // ═══════════════════════════════════════════════════════════════════ - // SORTING - // ═══════════════════════════════════════════════════════════════════ - - /** - * Compare for queue ordering. Higher effectivePriority = serviced first. - * Returns negative if this should come BEFORE other (higher priority). - */ - compareTo(other: BaseQueueItem): number { - return other.effectivePriority - this.effectivePriority; - } - - // ═══════════════════════════════════════════════════════════════════ - // ROUTING - // ═══════════════════════════════════════════════════════════════════ - - /** - * Which channel should this item be routed to? - * Default: this.domain. Override for items that belong to a different - * channel than their logical domain. - */ - get routingDomain(): ActivityDomain { return this.domain; } -} diff --git a/src/debug/jtag/system/user/server/modules/channels/ChannelQueue.ts b/src/debug/jtag/system/user/server/modules/channels/ChannelQueue.ts deleted file mode 100644 index 236c578ee..000000000 --- a/src/debug/jtag/system/user/server/modules/channels/ChannelQueue.ts +++ /dev/null @@ -1,192 +0,0 @@ -/** - * ChannelQueue - Generic queue container that delegates all behavioral decisions to items - * - * This class has ZERO item-type-specific logic. It asks items: - * - How to sort? β†’ item.compareTo() - * - Is this urgent? β†’ item.isUrgent - * - Can this be dropped? β†’ item.canBeKicked / item.kickResistance - * - Should items merge? β†’ item.shouldConsolidateWith() / item.consolidateWith() - * - * One ChannelQueue instance per ActivityDomain. The CNS iterates over channels - * in scheduler-determined priority order. - * - * Rust equivalent: struct ChannelQueue { items: Vec> } - */ - -import { EventEmitter } from 'events'; -import type { ActivityDomain } from '../cognitive-schedulers/ICognitiveScheduler'; -import { BaseQueueItem } from './BaseQueueItem'; - -export interface ChannelQueueConfig { - /** Which activity domain this channel serves */ - domain: ActivityDomain; - /** Maximum number of items before kicking begins */ - maxSize: number; - /** Human-readable name for logging */ - name: string; -} - -export class ChannelQueue { - private items: BaseQueueItem[] = []; - readonly domain: ActivityDomain; - readonly name: string; - private readonly maxSize: number; - - /** - * Signal emitter for notifying upstream (PersonaInbox) that work is available. - * External code sets this via setSignal() during wiring. - */ - private signal: EventEmitter | null = null; - - constructor(config: ChannelQueueConfig) { - this.domain = config.domain; - this.name = config.name; - this.maxSize = config.maxSize; - } - - /** - * Connect this channel's work signal to the inbox's signal emitter. - * When items are enqueued, the signal wakes up the service loop. - */ - setSignal(signal: EventEmitter): void { - this.signal = signal; - } - - // ═══════════════════════════════════════════════════════════════════ - // ENQUEUE β€” Items decide their own kick policy - // ═══════════════════════════════════════════════════════════════════ - - /** - * Add item to this channel's queue. - * Sorts by item.compareTo(). If over capacity, kicks items that allow it - * (lowest kickResistance first). - */ - enqueue(item: BaseQueueItem): void { - item.enqueuedAt = Date.now(); - this.items.push(item); - this.sort(); - - // Capacity management: ASK ITEMS if they can be kicked - while (this.items.length > this.maxSize) { - const kickable = this.items - .filter(i => i.canBeKicked) - .sort((a, b) => a.kickResistance - b.kickResistance); - - if (kickable.length === 0) break; // Nothing can be kicked β€” queue stays oversized - this.remove(kickable[0]); - } - - // Signal that work is available (wakes service loop) - if (this.signal) { - this.signal.emit('work-available'); - } - } - - // ═══════════════════════════════════════════════════════════════════ - // CONSOLIDATION β€” Items decide their own merge policy - // ═══════════════════════════════════════════════════════════════════ - - /** - * Consolidate items in this channel. - * Items decide: shouldConsolidateWith() determines groups, consolidateWith() merges. - * - * Called once per CNS service cycle before processing. - * Voice: no-op (items return false for shouldConsolidateWith). - * Chat: merges same-room messages into single work unit. - * Task: groups related tasks by domain+context. - */ - consolidate(): void { - if (this.items.length <= 1) return; // Nothing to consolidate - - const result: BaseQueueItem[] = []; - const consumed = new Set(); - - for (const item of this.items) { - if (consumed.has(item.id)) continue; - - // Find all items that this item says it should consolidate with - const group = this.items.filter(other => - other !== item - && !consumed.has(other.id) - && item.shouldConsolidateWith(other) - ); - - if (group.length > 0) { - // Item decides how to merge - const consolidated = item.consolidateWith(group); - result.push(consolidated); - for (const g of group) { - consumed.add(g.id); - } - } else { - result.push(item); - } - consumed.add(item.id); - } - - this.items = result; - this.sort(); - } - - // ═══════════════════════════════════════════════════════════════════ - // ACCESSORS β€” All delegate to item properties - // ═══════════════════════════════════════════════════════════════════ - - /** Any item in this channel reports itself as urgent */ - get hasUrgentWork(): boolean { - return this.items.some(i => i.isUrgent); - } - - /** Channel has any items at all */ - get hasWork(): boolean { - return this.items.length > 0; - } - - /** Number of items in this channel */ - get size(): number { - return this.items.length; - } - - /** Look at the highest-priority item without removing it */ - peek(): BaseQueueItem | undefined { - // Re-sort before peeking (aging changes order over time) - this.sort(); - return this.items[0]; - } - - /** Remove and return the highest-priority item */ - pop(): BaseQueueItem | undefined { - this.sort(); - return this.items.shift(); - } - - /** Get all urgent items (for batch processing) */ - peekUrgent(): BaseQueueItem[] { - return this.items.filter(i => i.isUrgent); - } - - /** Get channel load as a fraction (0.0 = empty, 1.0 = at capacity) */ - get load(): number { - return this.items.length / this.maxSize; - } - - /** Clear all items (for testing/reset) */ - clear(): void { - this.items = []; - } - - // ═══════════════════════════════════════════════════════════════════ - // INTERNALS - // ═══════════════════════════════════════════════════════════════════ - - private sort(): void { - this.items.sort((a, b) => a.compareTo(b)); - } - - private remove(item: BaseQueueItem): void { - const idx = this.items.indexOf(item); - if (idx !== -1) { - this.items.splice(idx, 1); - } - } -} diff --git a/src/debug/jtag/system/user/server/modules/channels/ChannelRegistry.ts b/src/debug/jtag/system/user/server/modules/channels/ChannelRegistry.ts deleted file mode 100644 index 8449bd7f0..000000000 --- a/src/debug/jtag/system/user/server/modules/channels/ChannelRegistry.ts +++ /dev/null @@ -1,95 +0,0 @@ -/** - * ChannelRegistry - Routes queue items to per-domain ChannelQueues - * - * The registry doesn't know item types β€” it routes by item.routingDomain. - * Each ActivityDomain has at most one ChannelQueue. - * - * Pattern: follows AdapterProviderRegistry (singleton registry, dynamic lookup) - * - * Rust equivalent: struct ChannelRegistry { channels: HashMap } - */ - -import type { ActivityDomain } from '../cognitive-schedulers/ICognitiveScheduler'; -import type { BaseQueueItem } from './BaseQueueItem'; -import { ChannelQueue } from './ChannelQueue'; - -export class ChannelRegistry { - private readonly channels: Map = new Map(); - - /** - * Register a channel queue for a domain. - * One queue per domain. Re-registration replaces. - */ - register(domain: ActivityDomain, queue: ChannelQueue): void { - this.channels.set(domain, queue); - } - - /** - * Route an item to its channel based on item.routingDomain. - * Returns undefined if no channel registered for that domain. - */ - route(item: BaseQueueItem): ChannelQueue | undefined { - return this.channels.get(item.routingDomain); - } - - /** - * Get channel by domain. - */ - get(domain: ActivityDomain): ChannelQueue | undefined { - return this.channels.get(domain); - } - - /** - * Get all registered channels (for iteration in service cycle). - */ - all(): ChannelQueue[] { - return Array.from(this.channels.values()); - } - - /** - * Get all registered domains. - */ - domains(): ActivityDomain[] { - return Array.from(this.channels.keys()); - } - - /** - * Does ANY channel have urgent work? - */ - hasUrgentWork(): boolean { - for (const channel of this.channels.values()) { - if (channel.hasUrgentWork) return true; - } - return false; - } - - /** - * Does ANY channel have work? - */ - hasWork(): boolean { - for (const channel of this.channels.values()) { - if (channel.hasWork) return true; - } - return false; - } - - /** - * Total items across all channels. - */ - totalSize(): number { - let total = 0; - for (const channel of this.channels.values()) { - total += channel.size; - } - return total; - } - - /** - * Clear all channels (for testing/reset). - */ - clearAll(): void { - for (const channel of this.channels.values()) { - channel.clear(); - } - } -} diff --git a/src/debug/jtag/system/user/server/modules/channels/ChatQueueItem.ts b/src/debug/jtag/system/user/server/modules/channels/ChatQueueItem.ts deleted file mode 100644 index 201517203..000000000 --- a/src/debug/jtag/system/user/server/modules/channels/ChatQueueItem.ts +++ /dev/null @@ -1,145 +0,0 @@ -/** - * ChatQueueItem - Queue item for text chat messages - * - * Chat is the most complex channel: per-room consolidation, mention-based urgency, - * standard RTOS aging from base class. - * - * Consolidation Strategy: - * When multiple messages from the same room are queued, they consolidate into - * a single work unit. The latest message becomes the "trigger" (what the AI - * responds to), and prior messages become context. The persona reads the full - * context but only needs to respond once. - * - * Overrides from BaseQueueItem: - * - isUrgent: true when persona is mentioned by name - * - shouldConsolidateWith: true for same-room ChatQueueItems - * - consolidateWith: merges messages, keeps latest as trigger - */ - -import type { UUID } from '../../../../core/types/CrossPlatformUUID'; -import { BaseQueueItem, ActivityDomain, type BaseQueueItemParams } from './BaseQueueItem'; - -export interface ChatQueueItemParams extends BaseQueueItemParams { - roomId: UUID; - content: string; - senderId: UUID; - senderName: string; - senderType: 'human' | 'persona' | 'agent' | 'system'; - mentions: boolean; - priority: number; -} - -/** - * A consolidated message representing prior context for the trigger message. - * Not sent as a separate queue item β€” attached to the consolidated ChatQueueItem. - */ -export interface ConsolidatedContext { - senderId: UUID; - senderName: string; - content: string; - timestamp: number; -} - -export class ChatQueueItem extends BaseQueueItem { - readonly itemType = 'chat' as const; - readonly domain = ActivityDomain.CHAT; - - readonly roomId: UUID; - readonly content: string; - readonly senderId: UUID; - readonly senderName: string; - readonly senderType: 'human' | 'persona' | 'agent' | 'system'; - readonly mentions: boolean; - - /** Prior messages consolidated into this item (empty if not consolidated) */ - readonly consolidatedContext: ConsolidatedContext[]; - - private readonly _basePriority: number; - - constructor(params: ChatQueueItemParams, consolidatedContext: ConsolidatedContext[] = []) { - super(params); - this.roomId = params.roomId; - this.content = params.content; - this.senderId = params.senderId; - this.senderName = params.senderName; - this.senderType = params.senderType; - this.mentions = params.mentions; - this._basePriority = params.priority; - this.consolidatedContext = consolidatedContext; - } - - // Priority set by calculateMessagePriority (existing logic) - get basePriority(): number { return this._basePriority; } - - // Urgent ONLY if persona is directly mentioned by name - get isUrgent(): boolean { return this.mentions; } - - // Consolidate with other chat items from the SAME ROOM - shouldConsolidateWith(other: BaseQueueItem): boolean { - return other instanceof ChatQueueItem && other.roomId === this.roomId; - } - - /** - * Merge with compatible items from the same room. - * Self = latest message (trigger). Others = prior context. - * - * Returns a new ChatQueueItem with consolidated context attached. - * The AI responds to the trigger but has full room context. - */ - consolidateWith(others: BaseQueueItem[]): ChatQueueItem { - // Collect all messages (self + others), sort by timestamp - const chatOthers = others.filter( - (o): o is ChatQueueItem => o instanceof ChatQueueItem - ); - - // Build context from older messages - const allMessages = [...chatOthers, this].sort( - (a, b) => a.timestamp - b.timestamp - ); - - // Latest message is the trigger (self, since we're the consolidation anchor) - const trigger = allMessages[allMessages.length - 1]; - const priorMessages = allMessages.slice(0, -1); - - // Convert prior messages to context records - const context: ConsolidatedContext[] = [ - // Carry forward any existing consolidated context - ...this.consolidatedContext, - // Add prior messages as new context - ...priorMessages.map(msg => ({ - senderId: msg.senderId, - senderName: msg.senderName, - content: msg.content, - timestamp: msg.timestamp, - })), - ]; - - // Sort context chronologically - context.sort((a, b) => a.timestamp - b.timestamp); - - // Return new item with trigger data + consolidated context - // Use highest priority and most recent timestamp, carry forward mentions - const hasMentions = this.mentions || chatOthers.some(m => m.mentions); - - return new ChatQueueItem( - { - id: trigger.id, - timestamp: trigger.timestamp, - enqueuedAt: this.enqueuedAt, // Preserve original enqueue time for aging - roomId: trigger.roomId, - content: trigger.content, - senderId: trigger.senderId, - senderName: trigger.senderName, - senderType: trigger.senderType, - mentions: hasMentions, - priority: Math.max(this._basePriority, ...chatOthers.map(m => m._basePriority)), - }, - context - ); - } - - /** Number of messages consolidated into this item (including self) */ - get consolidatedCount(): number { - return this.consolidatedContext.length + 1; - } -} diff --git a/src/debug/jtag/system/user/server/modules/channels/TaskQueueItem.ts b/src/debug/jtag/system/user/server/modules/channels/TaskQueueItem.ts deleted file mode 100644 index 0ee8f7ac8..000000000 --- a/src/debug/jtag/system/user/server/modules/channels/TaskQueueItem.ts +++ /dev/null @@ -1,148 +0,0 @@ -/** - * TaskQueueItem - Queue item for tasks assigned to the persona - * - * Tasks are dependency-aware and can consolidate related tasks. - * - * Overrides from BaseQueueItem: - * - isUrgent: true when past due date - * - canBeKicked: false for in-progress tasks - * - shouldConsolidateWith: true for same domain + context - */ - -import type { UUID } from '../../../../core/types/CrossPlatformUUID'; -import type { TaskDomain, TaskType, TaskStatus } from '../../../../data/entities/TaskEntity'; -import { BaseQueueItem, ActivityDomain, type BaseQueueItemParams } from './BaseQueueItem'; - -export interface TaskQueueItemParams extends BaseQueueItemParams { - taskId: UUID; - assigneeId: UUID; - createdBy: UUID; - taskDomain: TaskDomain; - taskType: TaskType; - contextId: UUID; - description: string; - priority: number; - status: TaskStatus; - dueDate?: number; - estimatedDuration?: number; - dependsOn?: UUID[]; - blockedBy?: UUID[]; - metadata?: Record; -} - -export class TaskQueueItem extends BaseQueueItem { - readonly itemType = 'task' as const; - readonly domain = ActivityDomain.BACKGROUND; - - readonly taskId: UUID; - readonly assigneeId: UUID; - readonly createdBy: UUID; - readonly taskDomain: TaskDomain; - readonly taskType: TaskType; - readonly contextId: UUID; - readonly description: string; - readonly status: TaskStatus; - readonly dueDate?: number; - readonly estimatedDuration?: number; - readonly dependsOn?: UUID[]; - readonly blockedBy?: UUID[]; - readonly metadata?: Record; - - private readonly _basePriority: number; - - constructor(params: TaskQueueItemParams) { - super(params); - this.taskId = params.taskId; - this.assigneeId = params.assigneeId; - this.createdBy = params.createdBy; - this.taskDomain = params.taskDomain; - this.taskType = params.taskType; - this.contextId = params.contextId; - this.description = params.description; - this._basePriority = params.priority; - this.status = params.status; - this.dueDate = params.dueDate; - this.estimatedDuration = params.estimatedDuration; - this.dependsOn = params.dependsOn; - this.blockedBy = params.blockedBy; - this.metadata = params.metadata; - } - - get basePriority(): number { return this._basePriority; } - - // Urgent if past due date - get isUrgent(): boolean { - return this.dueDate != null && this.dueDate < Date.now(); - } - - // Don't kick in-progress tasks β€” dropping mid-work is wrong - get canBeKicked(): boolean { - return this.status !== 'in_progress'; - } - - // Blocked tasks have zero kick resistance (kick blocked tasks first) - get kickResistance(): number { - if (this.isBlocked) return 0; - return this.effectivePriority; - } - - /** Is this task blocked by unfinished dependencies? */ - get isBlocked(): boolean { - return (this.blockedBy != null && this.blockedBy.length > 0); - } - - // Consolidate related tasks: same task domain AND same context - shouldConsolidateWith(other: BaseQueueItem): boolean { - if (!(other instanceof TaskQueueItem)) return false; - return other.taskDomain === this.taskDomain - && other.contextId === this.contextId; - } - - /** - * Consolidate related tasks: keep highest priority task as primary, - * attach others as related work. - */ - consolidateWith(others: BaseQueueItem[]): TaskQueueItem { - const taskOthers = others.filter( - (o): o is TaskQueueItem => o instanceof TaskQueueItem - ); - - // Find highest priority task (including self) - const allTasks = [this, ...taskOthers].sort( - (a, b) => b._basePriority - a._basePriority - ); - - const primary = allTasks[0]; - - // Use primary's data but combine metadata with related task IDs - const relatedTaskIds = allTasks - .filter(t => t !== primary) - .map(t => t.taskId); - - return new TaskQueueItem({ - ...{ - id: primary.id, - timestamp: primary.timestamp, - enqueuedAt: this.enqueuedAt, - taskId: primary.taskId, - assigneeId: primary.assigneeId, - createdBy: primary.createdBy, - taskDomain: primary.taskDomain, - taskType: primary.taskType, - contextId: primary.contextId, - description: primary.description, - priority: primary._basePriority, - status: primary.status, - dueDate: primary.dueDate, - estimatedDuration: primary.estimatedDuration, - dependsOn: primary.dependsOn, - blockedBy: primary.blockedBy, - metadata: { - ...primary.metadata, - relatedTaskIds, - consolidatedCount: allTasks.length, - }, - } - }); - } -} diff --git a/src/debug/jtag/system/user/server/modules/channels/VoiceQueueItem.ts b/src/debug/jtag/system/user/server/modules/channels/VoiceQueueItem.ts deleted file mode 100644 index df6bc9833..000000000 --- a/src/debug/jtag/system/user/server/modules/channels/VoiceQueueItem.ts +++ /dev/null @@ -1,61 +0,0 @@ -/** - * VoiceQueueItem - Queue item for voice/audio messages - * - * Voice is the simplest channel: always urgent, never consolidates, never kicked. - * Every utterance is unique and time-critical. FIFO ordering within the channel. - * - * Overrides from BaseQueueItem: - * - basePriority: 1.0 (max) - * - maxAgingBoost: 0 (no aging needed, already max priority) - * - isUrgent: true (always bypasses scheduler) - * - canBeKicked: false (never dropped) - * - kickResistance: Infinity (absolute protection) - */ - -import type { UUID } from '../../../../core/types/CrossPlatformUUID'; -import { BaseQueueItem, ActivityDomain, type BaseQueueItemParams } from './BaseQueueItem'; - -export interface VoiceQueueItemParams extends BaseQueueItemParams { - roomId: UUID; - content: string; - senderId: UUID; - senderName: string; - senderType: 'human' | 'persona' | 'agent' | 'system'; - voiceSessionId: UUID; -} - -export class VoiceQueueItem extends BaseQueueItem { - readonly itemType = 'voice' as const; - readonly domain = ActivityDomain.AUDIO; - - readonly roomId: UUID; - readonly content: string; - readonly senderId: UUID; - readonly senderName: string; - readonly senderType: 'human' | 'persona' | 'agent' | 'system'; - readonly voiceSessionId: UUID; - - constructor(params: VoiceQueueItemParams) { - super(params); - this.roomId = params.roomId; - this.content = params.content; - this.senderId = params.senderId; - this.senderName = params.senderName; - this.senderType = params.senderType; - this.voiceSessionId = params.voiceSessionId; - } - - // Voice is always max priority β€” no aging needed - get basePriority(): number { return 1.0; } - protected get maxAgingBoost(): number { return 0; } - - // Voice is ALWAYS urgent β€” bypasses cognitive scheduler - get isUrgent(): boolean { return true; } - - // Voice NEVER consolidates β€” every utterance is unique and time-sensitive - shouldConsolidateWith(): boolean { return false; } - - // Voice NEVER gets kicked β€” dropping voice mid-conversation is unacceptable - get canBeKicked(): boolean { return false; } - get kickResistance(): number { return Infinity; } -} diff --git a/src/debug/jtag/system/user/server/modules/cognitive-schedulers/DeterministicCognitiveScheduler.ts b/src/debug/jtag/system/user/server/modules/cognitive-schedulers/DeterministicCognitiveScheduler.ts deleted file mode 100644 index 4f75eebbe..000000000 --- a/src/debug/jtag/system/user/server/modules/cognitive-schedulers/DeterministicCognitiveScheduler.ts +++ /dev/null @@ -1,90 +0,0 @@ -/** - * Deterministic Cognitive Scheduler - * - * Simplest possible scheduler - NO adaptation, NO learning, NO intelligence. - * Fixed rules for basic models (GPT-2, tiny models, status bots). - * - * Strategy: If chat messages exist, service chat. Otherwise, do nothing. - * - Instant allocation (no computation) - * - Predictable (same every time) - * - Zero overhead - * - No training required - */ - -import { - BaseCognitiveScheduler, - ActivityDomain, - type CognitiveContext, - type AttentionAllocation, - type ServiceResult -} from './ICognitiveScheduler'; -import type { UUID } from '../../../../../system/core/types/CrossPlatformUUID'; - -export class DeterministicCognitiveScheduler extends BaseCognitiveScheduler { - readonly name = 'deterministic'; - readonly requiredCapabilities = new Set(); // Works with ANY model (even GPT-2) - - async initialize(personaId: UUID, personaName: string): Promise { - await super.initialize(personaId, personaName); - console.log(`🧠 ${personaName}: Initialized DeterministicCognitiveScheduler (fixed rules, no adaptation)`); - } - - /** - * Fixed attention allocation - no intelligence needed - */ - async allocateAttention( - budget: number, - context: CognitiveContext - ): Promise { - const allocations = new Map(); - - // RULE 1: If chat messages exist, allocate 100% to chat - if (context.unreadMessages > 0) { - allocations.set(ActivityDomain.CHAT, budget); - } else { - // RULE 2: If idle, allocate to background (maintenance only) - allocations.set(ActivityDomain.BACKGROUND, budget); - } - - return { allocations, totalBudget: budget }; - } - - /** - * Fixed service interval - no adaptation - */ - getNextServiceInterval(_context: CognitiveContext): number { - return 5000; // Fixed 5 second cadence - } - - /** - * Deterministic scheduler: only external interactive + maintenance domains. - * No internal cognitive domains (dreaming, reflecting, etc.) for simple models. - * Inherits base class defaults for domain ordering (time-critical first). - */ - private static readonly ALLOWED_DOMAINS = new Set([ - ActivityDomain.AUDIO, - ActivityDomain.CHAT, - ActivityDomain.BACKGROUND, - ]); - - async shouldServiceDomain( - domain: ActivityDomain, - _context: CognitiveContext - ): Promise { - if (!this.isDomainAllowed(domain)) { - return false; - } - return DeterministicCognitiveScheduler.ALLOWED_DOMAINS.has(domain); - } - - // getDomainPriority() inherited from BaseCognitiveScheduler - // Returns ALL domains in priority order β€” shouldServiceDomain gates which are active - - /** - * No learning - deterministic doesn't adapt - */ - async updatePolicy(_results: Map): Promise { - // NO-OP: Deterministic schedulers don't learn - // Fixed rules forever - } -} diff --git a/src/debug/jtag/system/user/server/modules/cognitive-schedulers/HeuristicCognitiveScheduler.ts b/src/debug/jtag/system/user/server/modules/cognitive-schedulers/HeuristicCognitiveScheduler.ts deleted file mode 100644 index 559cef41d..000000000 --- a/src/debug/jtag/system/user/server/modules/cognitive-schedulers/HeuristicCognitiveScheduler.ts +++ /dev/null @@ -1,185 +0,0 @@ -/** - * Heuristic Cognitive Scheduler - * - * Simple rule-based attention allocation - NO machine learning required. - * This is the default scheduler that works for all models. - * - * Strategy: Fixed rules based on context (energy, queue backlogs, activity) - * - Fast (instant allocation) - * - Predictable (same context = same allocation) - * - Safe (bounded behavior) - * - No training required - */ - -import { - BaseCognitiveScheduler, - ActivityDomain, - type CognitiveContext, - type AttentionAllocation, - type ServiceResult -} from './ICognitiveScheduler'; -import type { UUID } from '../../../../../system/core/types/CrossPlatformUUID'; - -export class HeuristicCognitiveScheduler extends BaseCognitiveScheduler { - readonly name = 'heuristic'; - readonly requiredCapabilities = new Set(); // Works with ANY model - - async initialize(personaId: UUID, personaName: string): Promise { - await super.initialize(personaId, personaName); - console.log(`🧠 ${personaName}: Initialized HeuristicCognitiveScheduler (rule-based, no ML)`); - } - - /** - * Allocate attention budget using simple heuristic rules - */ - async allocateAttention( - budget: number, - context: CognitiveContext - ): Promise { - const allocations = new Map(); - - // RULE 1: If in realtime game, prioritize game (80%) but still multitask - if (context.activeGames > 0) { - allocations.set(ActivityDomain.REALTIME_GAME, budget * 0.80); - allocations.set(ActivityDomain.CHAT, budget * 0.08); - allocations.set(ActivityDomain.SIMULATING, budget * 0.05); // Think during game - allocations.set(ActivityDomain.TRAINING, budget * 0.03); // Train in background - allocations.set(ActivityDomain.BACKGROUND, budget * 0.02); - allocations.set(ActivityDomain.DREAMING, budget * 0.02); - return { allocations, totalBudget: budget }; - } - - // RULE 2: If chat backlog high (>10 messages), prioritize chat - if (context.unreadMessages > 10) { - allocations.set(ActivityDomain.CHAT, budget * 0.60); - allocations.set(ActivityDomain.SIMULATING, budget * 0.15); // Think before responding - allocations.set(ActivityDomain.TRAINING, budget * 0.10); - allocations.set(ActivityDomain.REFLECTING, budget * 0.05); // Analyze why backlog formed - allocations.set(ActivityDomain.CODE_REVIEW, budget * 0.05); - allocations.set(ActivityDomain.BACKGROUND, budget * 0.05); - return { allocations, totalBudget: budget }; - } - - // RULE 3: If code review backlog high, prioritize deep work - if (context.pendingReviews > 5) { - allocations.set(ActivityDomain.CODE_REVIEW, budget * 0.50); - allocations.set(ActivityDomain.SIMULATING, budget * 0.20); // Plan review strategy - allocations.set(ActivityDomain.CHAT, budget * 0.15); - allocations.set(ActivityDomain.TRAINING, budget * 0.10); - allocations.set(ActivityDomain.BACKGROUND, budget * 0.05); - return { allocations, totalBudget: budget }; - } - - // RULE 4: If idle (no immediate work), focus on internal cognitive processes - if (context.unreadMessages === 0 && context.queueBacklog < 3) { - allocations.set(ActivityDomain.DREAMING, budget * 0.30); // Consolidate memories - allocations.set(ActivityDomain.TRAINING, budget * 0.25); // Continuous learning - allocations.set(ActivityDomain.REFLECTING, budget * 0.20); // Self-analysis - allocations.set(ActivityDomain.SIMULATING, budget * 0.10); // Explore possibilities - allocations.set(ActivityDomain.BACKGROUND, budget * 0.10); - allocations.set(ActivityDomain.CHAT, budget * 0.05); // Stay responsive - return { allocations, totalBudget: budget }; - } - - // RULE 5: Default balanced allocation (normal operation) - allocations.set(ActivityDomain.CHAT, budget * 0.40); - allocations.set(ActivityDomain.SIMULATING, budget * 0.15); // Always think before acting - allocations.set(ActivityDomain.TRAINING, budget * 0.15); // Continuous learning - allocations.set(ActivityDomain.CODE_REVIEW, budget * 0.10); - allocations.set(ActivityDomain.DREAMING, budget * 0.08); - allocations.set(ActivityDomain.REFLECTING, budget * 0.07); - allocations.set(ActivityDomain.BACKGROUND, budget * 0.05); - - return { allocations, totalBudget: budget }; - } - - /** - * Determine next service interval based on context - * Adaptive cadence: faster when energized, slower when tired - */ - getNextServiceInterval(context: CognitiveContext): number { - // If in realtime game, service every 16ms (60 FPS) - if (context.activeGames > 0) { - return 16; - } - - // If high chat backlog, service frequently - if (context.unreadMessages > 10) { - return 1000; // 1 second - } - - // Adaptive based on energy (same as current PersonaState logic) - if (context.energy > 0.7) { - return 3000; // 3 seconds when energized - } - - if (context.energy > 0.3) { - return 5000; // 5 seconds normal - } - - if (context.energy > 0.1) { - return 7000; // 7 seconds when tired - } - - // Very low energy - rest longer - return 10000; // 10 seconds when exhausted - } - - /** - * Should we service a specific domain right now? - */ - async shouldServiceDomain( - domain: ActivityDomain, - context: CognitiveContext - ): Promise { - // Check system overrides first (authoritative control) - if (!this.isDomainAllowed(domain)) { - return false; - } - - // Energy gating - only honor critical contracts when exhausted - if (context.energy < 0.2) { - // When exhausted, only honor realtime contracts (games and voice) - return domain === ActivityDomain.REALTIME_GAME || domain === ActivityDomain.AUDIO; - } - - if (context.energy < 0.4) { - // When tired, defer internal cognitive processes - return domain !== ActivityDomain.DREAMING && domain !== ActivityDomain.REFLECTING; - } - - // Under system pressure, defer non-critical domains - if (context.cpuPressure > 0.8 || context.memoryPressure > 0.9) { - const criticalDomains = [ - ActivityDomain.REALTIME_GAME, - ActivityDomain.AUDIO, - ActivityDomain.CHAT - ]; - return criticalDomains.includes(domain); - } - - // Default: service all domains - return true; - } - - // getDomainPriority() inherited from BaseCognitiveScheduler - // Returns ALL domains in priority order (time-critical β†’ interactive β†’ cognitive β†’ maintenance) - // Energy gating in shouldServiceDomain() controls which domains are actually serviced - - /** - * Update policy (no-op for heuristic scheduler) - * Heuristic schedulers don't learn - they use fixed rules - */ - async updatePolicy(results: Map): Promise { - // NO-OP: Heuristic schedulers don't learn from experience - // This method exists for interface compatibility - // Advanced schedulers (RL, GAN, etc.) will implement learning here - } - - /** - * Log diagnostic info - */ - private log(message: string): void { - console.log(`🧠 ${this.personaName} [Heuristic]: ${message}`); - } -} diff --git a/src/debug/jtag/system/user/server/modules/cognitive-schedulers/ICognitiveScheduler.ts b/src/debug/jtag/system/user/server/modules/cognitive-schedulers/ICognitiveScheduler.ts deleted file mode 100644 index 5d671dcd6..000000000 --- a/src/debug/jtag/system/user/server/modules/cognitive-schedulers/ICognitiveScheduler.ts +++ /dev/null @@ -1,338 +0,0 @@ -/** - * Cognitive Scheduler Interface - Adapter Pattern - * - * Different models have different cognitive capabilities and need - * different attention management strategies: - * - * - Simple models: Heuristic scheduler (fast, rule-based) - * - Advanced models: Neural scheduler (learned, adaptive) - * - Visual models: Prioritize vision domains - * - Audio models: Prioritize speech domains - * - Fast models: Can handle realtime domains - * - Slow models: Async domains only - */ - -import type { UUID } from '../../../../../system/core/types/CrossPlatformUUID'; - -/** - * Activity domains that personas can engage in - * - * Domains are divided into: - * - EXTERNAL: Interacting with the world (chat, games, etc.) - * - INTERNAL: Private cognitive processes (dreaming, simulating, reflecting) - */ -export enum ActivityDomain { - // EXTERNAL DOMAINS (interacting with world) - REALTIME_GAME = 'realtime_game', // 16ms target, requires fast inference - CHAT = 'chat', // 5s target, text-based - CODE_REVIEW = 'code_review', // 60s target, deep analysis - VISION = 'vision', // Image processing (requires vision model) - AUDIO = 'audio', // Speech/sound (requires audio model) - - // INTERNAL COGNITIVE DOMAINS (private mental processes) - DREAMING = 'dreaming', // Memory consolidation, latent space exploration - TRAINING = 'training', // Fine-tune LoRA adapters, continuous learning - SIMULATING = 'simulating', // Internal "what-if" scenarios, planning - REFLECTING = 'reflecting', // Metacognition, self-analysis, self-improvement - PLANNING = 'planning', // Long-term goal setting, strategic thinking - BACKGROUND = 'background' // Housekeeping, maintenance -} - -/** - * Queue item in a domain - */ -export interface QueueItem { - id: UUID; - type: 'message' | 'task' | 'event'; - domain: ActivityDomain; - priority: number; // 0.0-1.0 - timestamp: number; - payload: any; -} - -/** - * Domain-specific queue configuration - */ -export interface DomainQueueConfig { - domain: ActivityDomain; - targetCadence: number; // Target service interval (ms) - minCadence: number; // Minimum safe interval (ms) - maxCadence: number; // Maximum acceptable interval (ms) - attentionRequired: number; // Focus needed (0.0-1.0) - canDefer: boolean; // Can be delayed under load - requiresCapability?: string; // Optional capability requirement -} - -/** - * Service result for a domain - */ -export interface ServiceResult { - serviced: number; // Items processed - skipped?: boolean; // Domain skipped - deferred?: boolean; // Domain deferred - reason?: string; // Why skipped/deferred - timeUsed: number; // Milliseconds spent - energyUsed: number; // Energy consumed -} - -/** - * Attention allocation across domains - */ -export interface AttentionAllocation { - allocations: Map; // Domain -> attention weight (0.0-1.0) - totalBudget: number; // Total available attention -} - -/** - * Context for attention decision - */ -export interface CognitiveContext { - // State - energy: number; // 0.0-1.0 - mood: string; // 'focused' | 'tired' | 'stressed' | 'idle' - - // Activity levels - activeGames: number; - unreadMessages: number; - pendingReviews: number; - backgroundTasksPending: number; - - // Performance - avgResponseTime: number; // Recent average (ms) - queueBacklog: number; // Total items across all queues - - // System - cpuPressure: number; // 0.0-1.0 - memoryPressure: number; // 0.0-1.0 - - // Model capabilities - modelCapabilities: Set; // e.g., ['text', 'vision', 'fast-inference'] -} - -/** - * Universal Cognitive Scheduler Interface - * - * Adapters implement different attention management strategies - * based on model capabilities and personality. - */ -export interface ICognitiveScheduler { - /** - * Scheduler name for debugging - */ - readonly name: string; - - /** - * Model capabilities this scheduler requires - */ - readonly requiredCapabilities: Set; - - /** - * Initialize scheduler with persona identity - */ - initialize(personaId: UUID, personaName: string): Promise; - - /** - * Determine which domains this scheduler can handle - * based on model capabilities - */ - getSupportedDomains(capabilities: Set): ActivityDomain[]; - - /** - * Allocate attention budget across domains - * - * This is where different schedulers differ: - * - HeuristicScheduler: Fixed rules - * - NeuralScheduler: Learned weights - * - VisualScheduler: Prioritizes vision - */ - allocateAttention( - budget: number, - context: CognitiveContext - ): Promise; - - /** - * Determine next service interval (adaptive) - * - * Returns milliseconds until next service cycle - */ - getNextServiceInterval(context: CognitiveContext): number; - - /** - * Should a specific domain be serviced now? - * - * Considers: energy, queue state, system pressure, timing constraints - */ - shouldServiceDomain( - domain: ActivityDomain, - context: CognitiveContext - ): Promise; - - /** - * Get priority order for domains (which to service first) - */ - getDomainPriority(context: CognitiveContext): readonly ActivityDomain[]; - - /** - * Update scheduler policy based on results (learning) - * - * For HeuristicScheduler: No-op - * For NeuralScheduler: Gradient descent on attention weights - */ - updatePolicy(results: Map): Promise; - - /** - * System override - defer domains under pressure - */ - deferDomains(domains: ActivityDomain[]): void; - - /** - * System override - only allow specific domains - */ - allowDomainsOnly(domains: ActivityDomain[]): void; - - /** - * Clear all overrides - */ - clearOverrides(): void; -} - -/** - * Base cognitive scheduler with common functionality - */ -export abstract class BaseCognitiveScheduler implements ICognitiveScheduler { - abstract readonly name: string; - abstract readonly requiredCapabilities: Set; - - protected personaId!: UUID; - protected personaName!: string; - - // System overrides - protected deferredDomains: Set = new Set(); - protected allowedDomains: Set | null = null; - - async initialize(personaId: UUID, personaName: string): Promise { - this.personaId = personaId; - this.personaName = personaName; - } - - /** - * Default supported domains (text-based only) - */ - getSupportedDomains(capabilities: Set): ActivityDomain[] { - const supported: ActivityDomain[] = [ - ActivityDomain.CHAT, - ActivityDomain.CODE_REVIEW, - ActivityDomain.BACKGROUND, - ActivityDomain.TRAINING - ]; - - // Add realtime if model supports fast inference - if (capabilities.has('fast-inference')) { - supported.push(ActivityDomain.REALTIME_GAME); - } - - // Add vision if model supports it - if (capabilities.has('vision')) { - supported.push(ActivityDomain.VISION); - } - - // Add audio if model supports it - if (capabilities.has('audio')) { - supported.push(ActivityDomain.AUDIO); - } - - return supported; - } - - /** - * Check if domain is currently allowed (after system overrides) - */ - protected isDomainAllowed(domain: ActivityDomain): boolean { - // Check deferred list - if (this.deferredDomains.has(domain)) { - return false; - } - - // Check allow list (if set, only these domains allowed) - if (this.allowedDomains !== null && !this.allowedDomains.has(domain)) { - return false; - } - - return true; - } - - deferDomains(domains: ActivityDomain[]): void { - for (const domain of domains) { - this.deferredDomains.add(domain); - } - console.log(`🚫 ${this.personaName}: Deferred domains: ${Array.from(this.deferredDomains).join(', ')}`); - } - - allowDomainsOnly(domains: ActivityDomain[]): void { - this.allowedDomains = new Set(domains); - console.log(`βœ… ${this.personaName}: Only allowed domains: ${Array.from(this.allowedDomains).join(', ')}`); - } - - clearOverrides(): void { - this.deferredDomains.clear(); - this.allowedDomains = null; - console.log(`πŸ”“ ${this.personaName}: Cleared all overrides`); - } - - // Abstract methods that subclasses must implement - abstract allocateAttention( - budget: number, - context: CognitiveContext - ): Promise; - - abstract getNextServiceInterval(context: CognitiveContext): number; - - /** - * Default: service ALL allowed domains. - * Subclasses override to add energy gating, capability checks, etc. - * New domains are automatically included β€” opt-out, not opt-in. - */ - async shouldServiceDomain( - domain: ActivityDomain, - _context: CognitiveContext - ): Promise { - return this.isDomainAllowed(domain); - } - - /** - * Default: return ALL ActivityDomain values in a sensible priority order. - * Time-critical domains first, internal cognitive last. - * Subclasses override to reorder β€” but all domains are included by default. - * New domains added to the enum are automatically scheduled. - */ - getDomainPriority(_context: CognitiveContext): readonly ActivityDomain[] { - return BaseCognitiveScheduler.ALL_DOMAINS_BY_PRIORITY; - } - - /** - * Default priority ordering for all domains. - * Time-critical β†’ interactive β†’ deep work β†’ internal cognitive β†’ maintenance. - * This is the structural guarantee: new enum values added here are automatically - * available to all schedulers that don't override getDomainPriority(). - */ - static readonly ALL_DOMAINS_BY_PRIORITY: readonly ActivityDomain[] = [ - // Time-critical (realtime contracts) - ActivityDomain.REALTIME_GAME, - ActivityDomain.AUDIO, - // Interactive (social presence) - ActivityDomain.CHAT, - // Deep work - ActivityDomain.CODE_REVIEW, - ActivityDomain.VISION, - // Internal cognitive - ActivityDomain.SIMULATING, - ActivityDomain.PLANNING, - ActivityDomain.TRAINING, - ActivityDomain.REFLECTING, - ActivityDomain.DREAMING, - // Maintenance - ActivityDomain.BACKGROUND, - ]; - - abstract updatePolicy(results: Map): Promise; -} diff --git a/src/debug/jtag/widgets/shared/ReactiveWidget.ts b/src/debug/jtag/widgets/shared/ReactiveWidget.ts index eec729201..961380aa0 100644 --- a/src/debug/jtag/widgets/shared/ReactiveWidget.ts +++ b/src/debug/jtag/widgets/shared/ReactiveWidget.ts @@ -103,20 +103,36 @@ export { html, css, unsafeCSS, type TemplateResult, type CSSResultGroup }; export type { InteractionHint }; /** - * Property decorator that works with TC39 standard decorators + * Property decorator that works with TC39 standard decorators. * Use: @reactive() myProp = initialValue; - * NOTE: Must call requestUpdate() after changing state until decorator is fixed + * + * TC39 class fields shadow Lit's prototype accessor (from createProperty), + * so we schedule a microtask to remove the own property after field + * initialization completes. This makes Lit's reactive setter visible, + * and subsequent assignments trigger requestUpdate() automatically. */ export function reactive(options?: PropertyDeclaration) { return function(target: undefined, context: ClassFieldDecoratorContext) { const fieldName = String(context.name); context.addInitializer(function(this: unknown) { - // Register as reactive property on the class + // Register as reactive property on the class (creates prototype accessor) const ctor = (this as { constructor: typeof ReactiveWidget }).constructor; ctor.createProperty(fieldName, { ...options, state: true // Internal state, not reflected to attribute }); + + // Fix TC39 class field shadowing: after field initialization completes, + // the own property shadows Lit's prototype accessor. Remove it so + // Lit's reactive setter becomes visible and triggers re-renders. + const instance = this as Record; + queueMicrotask(() => { + if (Object.prototype.hasOwnProperty.call(instance, fieldName)) { + const value = instance[fieldName]; + delete instance[fieldName]; + instance[fieldName] = value; // Now goes through Lit's accessor + } + }); }); }; } @@ -124,6 +140,8 @@ export function reactive(options?: PropertyDeclaration) { /** * Attribute property decorator - reflects to/from HTML attribute * Use: @attr() label = 'default'; + * + * Same TC39 field shadowing fix as @reactive(). */ export function attr(options?: PropertyDeclaration) { return function(target: undefined, context: ClassFieldDecoratorContext) { @@ -134,6 +152,15 @@ export function attr(options?: PropertyDeclaration) { ...options, reflect: true }); + + const instance = this as Record; + queueMicrotask(() => { + if (Object.prototype.hasOwnProperty.call(instance, fieldName)) { + const value = instance[fieldName]; + delete instance[fieldName]; + instance[fieldName] = value; + } + }); }); }; } diff --git a/src/debug/jtag/workers/continuum-core/src/voice/call_server.rs b/src/debug/jtag/workers/continuum-core/src/voice/call_server.rs index 551d506a1..13995a40f 100644 --- a/src/debug/jtag/workers/continuum-core/src/voice/call_server.rs +++ b/src/debug/jtag/workers/continuum-core/src/voice/call_server.rs @@ -916,13 +916,14 @@ async fn handle_connection(stream: TcpStream, addr: SocketAddr, manager: Arc()); - // Send transcription to all participants let msg = CallMessage::Transcription { user_id: event.user_id, display_name: event.display_name, From e65e4c190727e2d04822e5fc54717dae9be97c22 Mon Sep 17 00:00:00 2001 From: Joel Date: Fri, 30 Jan 2026 17:10:50 -0600 Subject: [PATCH 4/4] Rust memory engine: 6-layer parallel recall with full ORM integration MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Phase A: Built complete memory system in Rust (corpus, recall, consciousness) - MemoryCorpus: per-persona in-memory data (memories + embeddings + timeline events) - 6-layer multi-recall: Core, Semantic, Temporal, Associative, DecayResurface, CrossContext - Consciousness context: temporal awareness + cross-context peripheral awareness - DashMap> concurrency: lock-free reads, COW writes - Deterministic embeddings for offline recall (no external model dependency) - 293 tests passing (277 lib + 16 recall accuracy integration tests) Phase B: Wired Rust ↔ TypeScript via IPC - Cleaned dead TS methods (memoryInit/Store/Recall/RecordEvent/Consolidate) - Added memoryLoadCorpus: bulk ORM β†’ Rust at startup - Added memoryAppendMemory/Event: incremental COW updates on DB writes - Hippocampus: appends to Rust corpus after every DataCreate to longterm.db - UnifiedConsciousness: appends timeline events to Rust corpus after recording - PersonaUser: loads full corpus from ORM at startup, wires bridge to consciousness - SemanticMemorySource + GlobalAwarenessSource: call Rust recall (sub-ms response) --- src/debug/jtag/.gitignore | 1 + src/debug/jtag/generated-command-schemas.json | 2 +- src/debug/jtag/package-lock.json | 4 +- src/debug/jtag/package.json | 2 +- src/debug/jtag/shared/version.ts | 2 +- .../rag/sources/GlobalAwarenessSource.ts | 201 ++--- .../rag/sources/SemanticMemorySource.ts | 199 +---- .../jtag/system/user/server/PersonaUser.ts | 145 +++- .../server/modules/PersonaAutonomousLoop.ts | 52 +- .../user/server/modules/PersonaInbox.ts | 41 +- .../server/modules/PersonaMessageEvaluator.ts | 89 +- .../user/server/modules/PersonaState.ts | 30 +- .../server/modules/RustCognitionBridge.ts | 194 +++++ .../central-nervous-system/CNSFactory.ts | 15 +- .../central-nervous-system/CNSTypes.ts | 19 +- .../PersonaCentralNervousSystem.ts | 86 +- .../modules/cognitive/memory/Hippocampus.ts | 30 + .../consciousness/UnifiedConsciousness.ts | 38 + .../jtag/workers/continuum-core/Cargo.toml | 3 + .../bindings/ConsciousnessContextRequest.ts | 6 + .../bindings/ConsciousnessContextResponse.ts | 7 + .../continuum-core/bindings/CorpusMemory.ts | 7 + .../bindings/CorpusTimelineEvent.ts | 7 + .../continuum-core/bindings/LayerTiming.ts | 6 + .../bindings/LoadCorpusResponse.ts | 6 + .../bindings/MemoryRecallResponse.ts | 8 + .../continuum-core/bindings/MemoryRecord.ts | 15 + .../bindings/MultiLayerRecallRequest.ts | 10 + .../continuum-core/bindings/RustCoreIPC.ts | 152 ++++ .../continuum-core/bindings/TemporalInfo.ts | 6 + .../continuum-core/bindings/TimelineEvent.ts | 6 + .../workers/continuum-core/src/ipc/mod.rs | 356 ++++++-- .../jtag/workers/continuum-core/src/lib.rs | 1 + .../continuum-core/src/logging/timing.rs | 14 +- .../jtag/workers/continuum-core/src/main.rs | 22 +- .../continuum-core/src/memory/cache.rs | 140 +++ .../src/memory/consciousness.rs | 235 +++++ .../continuum-core/src/memory/corpus.rs | 422 +++++++++ .../continuum-core/src/memory/embedding.rs | 326 +++++++ .../workers/continuum-core/src/memory/mod.rs | 489 +++++++++++ .../continuum-core/src/memory/recall.rs | 687 +++++++++++++++ .../continuum-core/src/memory/timeline.rs | 111 +++ .../continuum-core/src/memory/types.rs | 148 ++++ .../continuum-core/src/persona/types.rs | 11 +- .../tests/call_server_integration.rs | 6 +- .../continuum-core/tests/common/mod.rs | 149 ++++ .../tests/logger_integration.rs | 41 +- .../tests/memory_recall_accuracy.rs | 817 ++++++++++++++++++ .../continuum-core/tests/tts_only_test.rs | 156 ++-- .../continuum-core/tests/tts_stt_roundtrip.rs | 273 +++--- .../tests/tts_timing_benchmark.rs | 87 +- 51 files changed, 5074 insertions(+), 806 deletions(-) create mode 100644 src/debug/jtag/workers/continuum-core/bindings/ConsciousnessContextRequest.ts create mode 100644 src/debug/jtag/workers/continuum-core/bindings/ConsciousnessContextResponse.ts create mode 100644 src/debug/jtag/workers/continuum-core/bindings/CorpusMemory.ts create mode 100644 src/debug/jtag/workers/continuum-core/bindings/CorpusTimelineEvent.ts create mode 100644 src/debug/jtag/workers/continuum-core/bindings/LayerTiming.ts create mode 100644 src/debug/jtag/workers/continuum-core/bindings/LoadCorpusResponse.ts create mode 100644 src/debug/jtag/workers/continuum-core/bindings/MemoryRecallResponse.ts create mode 100644 src/debug/jtag/workers/continuum-core/bindings/MemoryRecord.ts create mode 100644 src/debug/jtag/workers/continuum-core/bindings/MultiLayerRecallRequest.ts create mode 100644 src/debug/jtag/workers/continuum-core/bindings/TemporalInfo.ts create mode 100644 src/debug/jtag/workers/continuum-core/bindings/TimelineEvent.ts create mode 100644 src/debug/jtag/workers/continuum-core/src/memory/cache.rs create mode 100644 src/debug/jtag/workers/continuum-core/src/memory/consciousness.rs create mode 100644 src/debug/jtag/workers/continuum-core/src/memory/corpus.rs create mode 100644 src/debug/jtag/workers/continuum-core/src/memory/embedding.rs create mode 100644 src/debug/jtag/workers/continuum-core/src/memory/mod.rs create mode 100644 src/debug/jtag/workers/continuum-core/src/memory/recall.rs create mode 100644 src/debug/jtag/workers/continuum-core/src/memory/timeline.rs create mode 100644 src/debug/jtag/workers/continuum-core/src/memory/types.rs create mode 100644 src/debug/jtag/workers/continuum-core/tests/common/mod.rs create mode 100644 src/debug/jtag/workers/continuum-core/tests/memory_recall_accuracy.rs diff --git a/src/debug/jtag/.gitignore b/src/debug/jtag/.gitignore index 254afc313..e3cafa747 100644 --- a/src/debug/jtag/.gitignore +++ b/src/debug/jtag/.gitignore @@ -47,3 +47,4 @@ Cargo.lock # Rust backup files **/*.rs.bk **/*.rs.bk.* +.fastembed_cache/ diff --git a/src/debug/jtag/generated-command-schemas.json b/src/debug/jtag/generated-command-schemas.json index 76c7e040f..9014bbc2d 100644 --- a/src/debug/jtag/generated-command-schemas.json +++ b/src/debug/jtag/generated-command-schemas.json @@ -1,5 +1,5 @@ { - "generated": "2026-01-30T09:54:52.328Z", + "generated": "2026-01-30T23:05:41.816Z", "version": "1.0.0", "commands": [ { diff --git a/src/debug/jtag/package-lock.json b/src/debug/jtag/package-lock.json index 2be7c3815..187549edb 100644 --- a/src/debug/jtag/package-lock.json +++ b/src/debug/jtag/package-lock.json @@ -1,12 +1,12 @@ { "name": "@continuum/jtag", - "version": "1.0.7471", + "version": "1.0.7478", "lockfileVersion": 3, "requires": true, "packages": { "": { "name": "@continuum/jtag", - "version": "1.0.7471", + "version": "1.0.7478", "hasInstallScript": true, "license": "MIT", "dependencies": { diff --git a/src/debug/jtag/package.json b/src/debug/jtag/package.json index ca3ded0c6..d6265bea7 100644 --- a/src/debug/jtag/package.json +++ b/src/debug/jtag/package.json @@ -1,6 +1,6 @@ { "name": "@continuum/jtag", - "version": "1.0.7471", + "version": "1.0.7478", "description": "Global CLI debugging system for any Node.js project. Install once globally, use anywhere: npm install -g @continuum/jtag", "config": { "active_example": "widget-ui", diff --git a/src/debug/jtag/shared/version.ts b/src/debug/jtag/shared/version.ts index 273fa1e3c..2693d979c 100644 --- a/src/debug/jtag/shared/version.ts +++ b/src/debug/jtag/shared/version.ts @@ -3,5 +3,5 @@ * DO NOT EDIT MANUALLY */ -export const VERSION = '1.0.7471'; +export const VERSION = '1.0.7478'; export const PACKAGE_NAME = '@continuum/jtag'; diff --git a/src/debug/jtag/system/rag/sources/GlobalAwarenessSource.ts b/src/debug/jtag/system/rag/sources/GlobalAwarenessSource.ts index 95ce9eb52..ed1d99bcd 100644 --- a/src/debug/jtag/system/rag/sources/GlobalAwarenessSource.ts +++ b/src/debug/jtag/system/rag/sources/GlobalAwarenessSource.ts @@ -1,82 +1,39 @@ /** - * GlobalAwarenessSource - Injects cross-context awareness into RAG + * GlobalAwarenessSource - Injects cross-context awareness into RAG via Rust IPC * - * This is the bridge between UnifiedConsciousness and the RAG pipeline. - * It provides the persona with: - * - Temporal continuity (what was I doing before?) - * - Cross-context knowledge (relevant info from other rooms) - * - Active intentions/goals - * - Peripheral awareness (what's happening elsewhere) + * Delegates to Rust's consciousness context builder which runs: + * - Temporal continuity queries (what was I doing before?) + * - Cross-context event aggregation (what happened in other rooms?) + * - Active intention detection (interrupted tasks) + * - Peripheral activity check * - * Priority 85 - After identity (95), before conversation history (80). - * This ensures the persona knows WHO they are first, then WHERE they've been, - * then WHAT's been said in this room. + * All queries run concurrently in Rust with separate SQLite read connections, + * bypassing the Node.js event loop entirely. + * + * Previous implementation used TS UnifiedConsciousness through the event loop + * (3-60s under load, frequently timing out). * - * PERFORMANCE: Caches consciousness context per persona+room for 30 seconds - * to reduce DB query load when multiple personas process messages concurrently. + * Priority 85 - After identity (95), before conversation history (80). */ import type { RAGSource, RAGSourceContext, RAGSection } from '../shared/RAGSource'; import { Logger } from '../../core/logging/Logger'; -import { - UnifiedConsciousness, - formatConsciousnessForPrompt, - type ConsciousnessContext -} from '../../user/server/modules/consciousness/UnifiedConsciousness'; const log = Logger.create('GlobalAwarenessSource', 'rag'); /** - * Cache entry for consciousness context - */ -interface CachedContext { - context: ConsciousnessContext; - formattedPrompt: string | undefined; - cachedAt: number; -} - -/** - * Cache TTL in milliseconds (30 seconds) - * Cross-context awareness doesn't change rapidly, so caching is safe - */ -const CACHE_TTL_MS = 30_000; - -/** - * Cache for consciousness contexts by persona+room key - * Key format: `${personaId}:${roomId}` - */ -const contextCache = new Map(); - -/** - * Registry to store UnifiedConsciousness instances by personaId - * This allows the RAG source to access the consciousness for any persona + * Registry for consciousness instances β€” kept for backward compatibility. + * The actual consciousness context is now built in Rust via IPC, + * but we still need the registry to check if a persona has been initialized. */ -const consciousnessRegistry = new Map(); +const initializedPersonas = new Set(); /** - * Clear expired cache entries + * Register a persona as having consciousness initialized. + * Called during PersonaUser startup after memory/init succeeds. */ -function clearExpiredCache(): void { - const now = Date.now(); - for (const [key, entry] of contextCache) { - if (now - entry.cachedAt > CACHE_TTL_MS) { - contextCache.delete(key); - } - } -} - -/** - * Get cache key for persona+room - */ -function getCacheKey(personaId: string, roomId: string): string { - return `${personaId}:${roomId}`; -} - -/** - * Register a persona's consciousness for RAG access - */ -export function registerConsciousness(personaId: string, consciousness: UnifiedConsciousness): void { - consciousnessRegistry.set(personaId, consciousness); +export function registerConsciousness(personaId: string, _consciousness?: any): void { + initializedPersonas.add(personaId); log.debug(`Registered consciousness for persona ${personaId}`); } @@ -84,15 +41,15 @@ export function registerConsciousness(personaId: string, consciousness: UnifiedC * Unregister a persona's consciousness */ export function unregisterConsciousness(personaId: string): void { - consciousnessRegistry.delete(personaId); + initializedPersonas.delete(personaId); log.debug(`Unregistered consciousness for persona ${personaId}`); } /** - * Get a persona's consciousness + * Check if a persona has consciousness registered */ -export function getConsciousness(personaId: string): UnifiedConsciousness | undefined { - return consciousnessRegistry.get(personaId); +export function getConsciousness(personaId: string): boolean { + return initializedPersonas.has(personaId); } export class GlobalAwarenessSource implements RAGSource { @@ -101,104 +58,71 @@ export class GlobalAwarenessSource implements RAGSource { readonly defaultBudgetPercent = 10; isApplicable(context: RAGSourceContext): boolean { - // Applicable if we have consciousness registered for this persona - const hasConsciousness = consciousnessRegistry.has(context.personaId); - console.log(`[GlobalAwarenessSource] isApplicable: personaId=${context.personaId}, has=${hasConsciousness}, registrySize=${consciousnessRegistry.size}`); - return hasConsciousness; + return initializedPersonas.has(context.personaId); } async load(context: RAGSourceContext, _allocatedBudget: number): Promise { const startTime = performance.now(); try { - const consciousness = consciousnessRegistry.get(context.personaId); + // Get PersonaUser to access Rust bridge + const { UserDaemonServer } = await import('../../../daemons/user-daemon/server/UserDaemonServer'); + const userDaemon = UserDaemonServer.getInstance(); - if (!consciousness) { - log.debug(`No consciousness found for persona ${context.personaId}`); + if (!userDaemon) { + log.debug('UserDaemon not available, skipping awareness'); return this.emptySection(startTime); } - // Check cache first (reduces DB queries from ~4 per request to ~4 per 30s) - const cacheKey = getCacheKey(context.personaId, context.roomId); - const cached = contextCache.get(cacheKey); - const now = Date.now(); - - if (cached && now - cached.cachedAt < CACHE_TTL_MS) { - // Cache hit - return cached result immediately (no logging to avoid overhead) - const loadTimeMs = performance.now() - startTime; - - if (!cached.formattedPrompt) { - return this.emptySection(startTime); - } - - return { - sourceName: this.name, - tokenCount: this.estimateTokens(cached.formattedPrompt), - loadTimeMs, - systemPromptSection: cached.formattedPrompt, - metadata: { ...this.buildMetadata(cached.context), cached: true } - }; + const personaUser = userDaemon.getPersonaUser(context.personaId); + if (!personaUser) { + return this.emptySection(startTime); } - // Clear expired entries periodically - if (contextCache.size > 50) { - clearExpiredCache(); + // Access the Rust cognition bridge (nullable getter β€” no throw) + const bridge = (personaUser as any).rustCognitionBridge; + if (!bridge) { + log.debug('Rust cognition bridge not available, skipping awareness'); + return this.emptySection(startTime); } - // Cache miss - fetch consciousness context - const currentMessage = context.options.currentMessage?.content; - - // Detect voice mode - skip expensive semantic search for faster response + // Detect voice mode β€” skip expensive semantic search for faster response const voiceSessionId = (context.options as any)?.voiceSessionId; const isVoiceMode = !!voiceSessionId; - if (isVoiceMode) { - log.debug(`VOICE MODE detected - skipping semantic search for faster response`); - } - // TIMEOUT: GlobalAwarenessSource was taking 60+ seconds without this! - // The consciousness.getContext() calls multiple DB queries that can hang - // under lock contention when multiple personas respond concurrently. - const CONSCIOUSNESS_TIMEOUT_MS = 3000; // 3 second hard limit + const currentMessage = context.options.currentMessage?.content; - const contextPromise = consciousness.getContext( + // Single IPC call β†’ Rust builds consciousness context with concurrent SQLite reads + // Rust handles its own 30s TTL cache internally + const result = await bridge.memoryConsciousnessContext( context.roomId, currentMessage, - { skipSemanticSearch: isVoiceMode } // Skip slow embedding search for voice + isVoiceMode // skipSemanticSearch ); - const timeoutPromise = new Promise((_, reject) => - setTimeout(() => reject(new Error('Consciousness context timeout')), CONSCIOUSNESS_TIMEOUT_MS) - ); - - // Build consciousness context with timeout (fast path for voice mode) - const consciousnessContext = await Promise.race([contextPromise, timeoutPromise]); - - // Format for prompt injection - const systemPromptSection = formatConsciousnessForPrompt(consciousnessContext); - - // Cache the result - contextCache.set(cacheKey, { - context: consciousnessContext, - formattedPrompt: systemPromptSection, - cachedAt: now - }); - - if (!systemPromptSection) { - log.debug(`Cache miss, no cross-context content for room ${context.roomId}`); + if (!result.formatted_prompt) { + log.debug(`No cross-context content for room ${context.roomId}`); return this.emptySection(startTime); } const loadTimeMs = performance.now() - startTime; - const tokenCount = this.estimateTokens(systemPromptSection); + const tokenCount = this.estimateTokens(result.formatted_prompt); - log.debug(`Loaded global awareness in ${loadTimeMs.toFixed(1)}ms (${tokenCount} tokens)`); + log.debug(`Loaded global awareness in ${loadTimeMs.toFixed(1)}ms (${tokenCount} tokens) rust=${result.build_time_ms.toFixed(1)}ms`); return { sourceName: this.name, tokenCount, loadTimeMs, - systemPromptSection, - metadata: this.buildMetadata(consciousnessContext) + systemPromptSection: result.formatted_prompt, + metadata: { + crossContextEventCount: result.cross_context_event_count, + activeIntentionCount: result.active_intention_count, + hasPeripheralActivity: result.has_peripheral_activity, + wasInterrupted: result.temporal.was_interrupted, + lastActiveContext: result.temporal.last_active_context_name, + rustBuildMs: result.build_time_ms + } }; } catch (error: any) { @@ -225,17 +149,6 @@ export class GlobalAwarenessSource implements RAGSource { }; } - private buildMetadata(ctx: ConsciousnessContext): Record { - return { - crossContextEventCount: ctx.crossContext.relevantEvents.length, - activeIntentionCount: ctx.intentions.active.length, - relevantIntentionCount: ctx.intentions.relevantHere.length, - hasPeripheralActivity: ctx.crossContext.peripheralSummary !== 'Other contexts: Quiet', - wasInterrupted: ctx.temporal.wasInterrupted, - lastActiveContext: ctx.temporal.lastActiveContextName - }; - } - private estimateTokens(text: string): number { return Math.ceil(text.length / 4); } diff --git a/src/debug/jtag/system/rag/sources/SemanticMemorySource.ts b/src/debug/jtag/system/rag/sources/SemanticMemorySource.ts index ed83abfd3..284f41b86 100644 --- a/src/debug/jtag/system/rag/sources/SemanticMemorySource.ts +++ b/src/debug/jtag/system/rag/sources/SemanticMemorySource.ts @@ -1,14 +1,15 @@ /** - * SemanticMemorySource - Loads private memories for RAG context + * SemanticMemorySource - Loads private memories for RAG context via Rust IPC * - * Features: - * - Core memory recall (high-importance learnings that should never be forgotten) - * - Semantic recall (contextually relevant memories based on query) - * - Deduplication between core and semantic results - * - Graceful fallback if no semantic query provided + * Delegates to Rust's 6-layer multi-recall algorithm which runs in parallel: + * Core (importance >= 0.8) | Semantic (embedding cosine similarity) + * Temporal (recent 2h) | Associative (tag/relatedTo graph) + * Decay Resurface (spaced repetition) | Cross-Context (other rooms) * - * PERFORMANCE: Caches core memories per persona for 30 seconds to reduce DB load. - * Semantic recall is NOT cached since it depends on the specific query. + * All layers execute concurrently via Rayon in ~30ms total, + * bypassing the Node.js event loop entirely. + * + * Previous implementation used TS Hippocampus through the event loop (3-10s under load). */ import type { RAGSource, RAGSourceContext, RAGSection } from '../shared/RAGSource'; @@ -20,37 +21,6 @@ const log = Logger.create('SemanticMemorySource', 'rag'); // Memory tokens are usually dense - estimate higher const TOKENS_PER_MEMORY_ESTIMATE = 80; -/** - * Cache entry for core memories - */ -interface CoreMemoriesCache { - memories: any[]; - cachedAt: number; -} - -/** - * Cache TTL for core memories (30 seconds) - * Core memories are high-importance and don't change frequently - */ -const CORE_MEMORY_CACHE_TTL_MS = 30_000; - -/** - * Cache for core memories by personaId - */ -const coreMemoriesCache = new Map(); - -/** - * Clear expired core memory cache entries - */ -function clearExpiredCoreMemoryCache(): void { - const now = Date.now(); - for (const [key, entry] of coreMemoriesCache) { - if (now - entry.cachedAt > CORE_MEMORY_CACHE_TTL_MS) { - coreMemoriesCache.delete(key); - } - } -} - export class SemanticMemorySource implements RAGSource { readonly name = 'semantic-memory'; readonly priority = 60; // Medium-high - memories inform persona behavior @@ -67,7 +37,7 @@ export class SemanticMemorySource implements RAGSource { const maxMemories = Math.max(3, Math.floor(allocatedBudget / TOKENS_PER_MEMORY_ESTIMATE)); try { - // Get UserDaemon to access PersonaUser + // Get PersonaUser to access Rust bridge const { UserDaemonServer } = await import('../../../daemons/user-daemon/server/UserDaemonServer'); const userDaemon = UserDaemonServer.getInstance(); @@ -76,145 +46,50 @@ export class SemanticMemorySource implements RAGSource { return this.emptySection(startTime); } - // Get PersonaUser instance const personaUser = userDaemon.getPersonaUser(context.personaId); if (!personaUser) { - // Not a PersonaUser (humans, agents don't have memories) return this.emptySection(startTime); } - // Check for recallMemories capability (duck-typing) - if (!('recallMemories' in personaUser) || typeof (personaUser as any).recallMemories !== 'function') { + // Access the Rust cognition bridge (nullable getter β€” no throw) + const bridge = (personaUser as any).rustCognitionBridge; + if (!bridge) { + log.debug('Rust cognition bridge not available, skipping memories'); return this.emptySection(startTime); } - const recallableUser = personaUser as { - recallMemories: (params: any) => Promise; - semanticRecallMemories?: (query: string, params: any) => Promise; - }; - - let memories: any[] = []; - let coreMemoryCount = 0; - const RECALL_TIMEOUT_MS = 3000; // 3 second timeout for any memory operation - const now = Date.now(); + // Build semantic query from current message + const queryText = this.buildSemanticQuery(context); - // Clear expired cache entries periodically - if (coreMemoriesCache.size > 50) { - clearExpiredCoreMemoryCache(); - } - - // 1. ALWAYS fetch core memories first (high-importance learnings) - // These are tool usage learnings, key insights, etc. that should never be forgotten - // Check cache first to reduce DB load - const cached = coreMemoriesCache.get(context.personaId); - if (cached && now - cached.cachedAt < CORE_MEMORY_CACHE_TTL_MS) { - // Cache hit for core memories (no logging to avoid overhead) - if (cached.memories.length > 0) { - memories = [...cached.memories]; - coreMemoryCount = cached.memories.length; - } - } else { - // Cache miss - fetch from DB - try { - const corePromise = recallableUser.recallMemories({ - minImportance: 0.8, - limit: Math.min(3, maxMemories), - since: new Date(Date.now() - 30 * 24 * 60 * 60 * 1000).toISOString() - }); - const coreTimeout = new Promise((_, reject) => - setTimeout(() => reject(new Error('Core memory recall timeout')), RECALL_TIMEOUT_MS) - ); - const coreMemories = await Promise.race([corePromise, coreTimeout]); - - // Cache the result - coreMemoriesCache.set(context.personaId, { - memories: coreMemories, - cachedAt: now - }); - - if (coreMemories.length > 0) { - log.debug(`Core memories loaded: ${coreMemories.length} (importance >= 0.8)`); - memories = [...coreMemories]; - coreMemoryCount = coreMemories.length; - } - } catch (e: any) { - log.warn(`Core memory recall failed (${e.message}), continuing without core memories`); - } - } - - // 2. Semantic recall if query available (with timeout to prevent blocking) - // Build semantic query from recent messages (options.currentMessage or last message context) - const remainingSlots = maxMemories - memories.length; - const semanticQuery = this.buildSemanticQuery(context); - - if (remainingSlots > 0 && semanticQuery && semanticQuery.length > 10) { - if (recallableUser.semanticRecallMemories) { - try { - // Timeout after 3 seconds - embedding generation can hang - const SEMANTIC_TIMEOUT_MS = 3000; - const semanticPromise = recallableUser.semanticRecallMemories(semanticQuery, { - limit: remainingSlots, - semanticThreshold: 0.5, - minImportance: 0.4 - }); - - const timeoutPromise = new Promise((_, reject) => - setTimeout(() => reject(new Error('Semantic recall timeout')), SEMANTIC_TIMEOUT_MS) - ); - - const semanticMemories = await Promise.race([semanticPromise, timeoutPromise]); - - // Dedupe by id - const seenIds = new Set(memories.map((m: any) => m.id)); - for (const mem of semanticMemories) { - if (!seenIds.has(mem.id)) { - memories.push(mem); - seenIds.add(mem.id); - } - } - - log.debug(`Semantic recall: "${semanticQuery.slice(0, 30)}..." β†’ ${semanticMemories.length} found`); - } catch (e: any) { - // Timeout or error - fall back to core memories only - log.warn(`Semantic recall failed (${e.message}), using core memories only`); - } - } - } - - // 3. Fallback if still empty (also with timeout) - if (memories.length === 0) { - try { - const fallbackPromise = recallableUser.recallMemories({ - minImportance: 0.6, - limit: maxMemories, - since: new Date(Date.now() - 7 * 24 * 60 * 60 * 1000).toISOString() - }); - const fallbackTimeout = new Promise((_, reject) => - setTimeout(() => reject(new Error('Fallback memory recall timeout')), RECALL_TIMEOUT_MS) - ); - memories = await Promise.race([fallbackPromise, fallbackTimeout]); - } catch (e: any) { - log.warn(`Fallback memory recall failed (${e.message})`); - } - } + // Single IPC call β†’ Rust runs all 6 recall layers in parallel via Rayon + const result = await bridge.memoryMultiLayerRecall({ + query_text: queryText ?? null, + room_id: context.roomId, + max_results: maxMemories, + layers: null, // All layers + }); - if (memories.length === 0) { + if (result.memories.length === 0) { return this.emptySection(startTime); } - // Convert to PersonaMemory format - const personaMemories: PersonaMemory[] = memories.map((mem: any) => ({ + // Convert Rust MemoryRecord to PersonaMemory format + const personaMemories: PersonaMemory[] = result.memories.map((mem: any) => ({ id: mem.id, - type: this.mapMemoryType(mem.type), + type: this.mapMemoryType(mem.memory_type), content: mem.content, timestamp: new Date(mem.timestamp), - relevanceScore: mem.importance + relevanceScore: mem.relevance_score ?? mem.importance })); const loadTimeMs = performance.now() - startTime; const tokenCount = personaMemories.reduce((sum, m) => sum + this.estimateTokens(m.content), 0); - log.debug(`Loaded ${personaMemories.length} memories in ${loadTimeMs.toFixed(1)}ms (~${tokenCount} tokens)`); + // Log layer-level detail for performance monitoring + const layerSummary = result.layer_timings + .map((l: any) => `${l.layer}(${l.results_found})`) + .join(', '); + log.debug(`Loaded ${personaMemories.length} memories in ${loadTimeMs.toFixed(1)}ms (~${tokenCount} tokens) layers=[${layerSummary}] rust=${result.recall_time_ms.toFixed(1)}ms`); return { sourceName: this.name, @@ -223,8 +98,10 @@ export class SemanticMemorySource implements RAGSource { memories: personaMemories, metadata: { memoryCount: personaMemories.length, - coreCount: coreMemoryCount, - semanticQuery: semanticQuery?.slice(0, 50) + totalCandidates: result.total_candidates, + rustRecallMs: result.recall_time_ms, + semanticQuery: queryText?.slice(0, 50), + layers: layerSummary } }; } catch (error: any) { @@ -234,11 +111,9 @@ export class SemanticMemorySource implements RAGSource { } private buildSemanticQuery(context: RAGSourceContext): string | undefined { - // Use currentMessage from options if available if (context.options.currentMessage?.content) { return context.options.currentMessage.content; } - // Otherwise caller should populate via widgetContext or similar return context.options.widgetContext?.slice(0, 200); } diff --git a/src/debug/jtag/system/user/server/PersonaUser.ts b/src/debug/jtag/system/user/server/PersonaUser.ts index e3f6f9aca..c1086b17f 100644 --- a/src/debug/jtag/system/user/server/PersonaUser.ts +++ b/src/debug/jtag/system/user/server/PersonaUser.ts @@ -69,7 +69,7 @@ import { import { Events } from '../../core/shared/Events'; import { EVENT_SCOPES } from '../../events/shared/EventSystemConstants'; import { ROOM_UNIQUE_IDS } from '../../data/constants/RoomConstants'; -import type { DataListParams, DataListResult } from '../../../commands/data/list/shared/DataListTypes'; +import { DataList, type DataListParams, type DataListResult } from '../../../commands/data/list/shared/DataListTypes'; import type { StageCompleteEvent } from '../../conversation/shared/CognitionEventTypes'; import { calculateSpeedScore, getStageStatus, COGNITION_EVENTS } from '../../conversation/shared/CognitionEventTypes'; import { RateLimiter } from './modules/RateLimiter'; @@ -83,6 +83,7 @@ import { PersonaGenome, type PersonaGenomeConfig } from './modules/PersonaGenome import type { PersonaCentralNervousSystem } from './modules/central-nervous-system/PersonaCentralNervousSystem'; import { CNSFactory } from './modules/central-nervous-system/CNSFactory'; import type { QueueItem } from './modules/PersonaInbox'; +import type { FastPathDecision } from './modules/central-nervous-system/CNSTypes'; import { PersonaMemory } from './modules/cognitive/memory/PersonaMemory'; // NOTE: DecisionAdapterChain removed - Rust cognition engine handles fast-path decisions // See: workers/continuum-core/src/persona/cognition.rs @@ -117,6 +118,9 @@ import { SystemPaths } from '../../core/config/SystemPaths'; import { UnifiedConsciousness } from './modules/consciousness/UnifiedConsciousness'; import { registerConsciousness, unregisterConsciousness } from '../../rag/sources/GlobalAwarenessSource'; import { DATA_COMMANDS } from '@commands/data/shared/DataCommandConstants'; +import { DataOpen } from '../../../commands/data/open/shared/DataOpenTypes'; +import type { CorpusMemory } from '../../../workers/continuum-core/bindings/CorpusMemory'; +import type { CorpusTimelineEvent } from '../../../workers/continuum-core/bindings/CorpusTimelineEvent'; /** * PersonaUser - Our internal AI citizens @@ -446,6 +450,10 @@ export class PersonaUser extends AIUser { ); // Register with GlobalAwarenessSource so RAG can access consciousness registerConsciousness(this.id, this._consciousness); + // Wire Rust bridge into consciousness for timeline event corpus coherence + if (this._rustCognition) { + this._consciousness.setRustBridge(this._rustCognition); + } this.log.info(`🧠 ${this.displayName}: UnifiedConsciousness initialized (cross-context awareness enabled)`); // Logger for cognition.log (used by task executor and other modules) @@ -581,6 +589,22 @@ export class PersonaUser extends AIUser { // Don't throw - let persona initialize, but message handling will fail loudly } + // STEP 1.5.2: Load memory corpus into Rust compute engine + // Bulk-loads all memories + timeline events from ORM (longterm.db) into Rust's + // in-memory corpus. This enables sub-millisecond 6-layer parallel recall. + // Data path: ORM (DataOpen/DataList) β†’ map to Rust types β†’ IPC β†’ DashMap> + // Must happen AFTER bridge.initialize() and BEFORE any RAG/recall usage. + if (this._rustCognition) { + try { + const { memories, events } = await this.loadCorpusFromORM(); + const corpusResult = await this._rustCognition.memoryLoadCorpus(memories, events); + this.log.info(`${this.displayName}: Rust corpus loaded β€” ${corpusResult.memory_count} memories (${corpusResult.embedded_memory_count} embedded), ${corpusResult.timeline_event_count} events (${corpusResult.embedded_event_count} embedded) in ${corpusResult.load_time_ms.toFixed(1)}ms`); + } catch (error) { + this.log.error(`${this.displayName}: Corpus load failed:`, error); + // Non-fatal β€” recall will return empty results until corpus is loaded + } + } + // STEP 1.6: Register with ResourceManager for holistic resource allocation try { const { getResourceManager } = await import('../../resources/shared/ResourceManager.js'); @@ -676,6 +700,116 @@ export class PersonaUser extends AIUser { await this.limbic!.loadGenomeFromDatabase(); } + // ════════════════════════════════════════════════════════════════════════════ + // Corpus Loading β€” ORM β†’ Rust compute engine + // ════════════════════════════════════════════════════════════════════════════ + + /** + * Load all memories + timeline events from the persona's longterm.db via ORM, + * map from camelCase ORM entities to snake_case Rust types. + * + * Opens a read-only ORM handle to longterm.db, queries both collections in + * parallel, maps entity fields, and returns typed corpus data ready for IPC. + * + * Data flow: longterm.db β†’ DataOpen β†’ DataList β†’ field mapping β†’ CorpusMemory[] / CorpusTimelineEvent[] + */ + private async loadCorpusFromORM(): Promise<{ memories: CorpusMemory[], events: CorpusTimelineEvent[] }> { + const dbPath = SystemPaths.personas.longterm(this.entity.uniqueId); + + const openResult = await DataOpen.execute({ + adapter: 'sqlite', + config: { path: dbPath, mode: 'readwrite', wal: true, foreignKeys: true } + }); + + if (!openResult.success || !openResult.dbHandle) { + this.log.warn(`${this.displayName}: Could not open longterm.db for corpus: ${openResult.error}`); + return { memories: [], events: [] }; + } + + const dbHandle = openResult.dbHandle; + + // Parallel ORM queries β€” both are read-only against the same DB handle + const [memResult, evtResult] = await Promise.all([ + DataList.execute({ + dbHandle, + collection: 'memories', + orderBy: [{ field: 'timestamp', direction: 'desc' }], + limit: 100000, + }), + DataList.execute({ + dbHandle, + collection: 'timeline_events', + orderBy: [{ field: 'timestamp', direction: 'desc' }], + limit: 100000, + }), + ]); + + // Map ORM entities (camelCase) β†’ Rust types (snake_case) + const memories: CorpusMemory[] = (memResult.success && memResult.items) + ? (memResult.items as unknown as MemoryEntity[]).map(mem => this.mapMemoryToCorpus(mem)) + : []; + + const events: CorpusTimelineEvent[] = (evtResult.success && evtResult.items) + ? (evtResult.items as unknown as Record[]).map(evt => this.mapTimelineEventToCorpus(evt)) + : []; + + return { memories, events }; + } + + /** + * Map a single MemoryEntity (camelCase ORM) to CorpusMemory (snake_case Rust). + * Handles field renaming, default values, and embedding extraction. + */ + private mapMemoryToCorpus(mem: MemoryEntity): CorpusMemory { + return { + record: { + id: mem.id, + persona_id: mem.personaId ?? this.entity.uniqueId, + memory_type: mem.type, + content: mem.content, + context: mem.context ?? {}, + timestamp: typeof mem.timestamp === 'string' + ? mem.timestamp + : new Date(mem.timestamp as unknown as number).toISOString(), + importance: mem.importance ?? 0.5, + access_count: mem.accessCount ?? 0, + tags: mem.tags ?? [], + related_to: mem.relatedTo ?? [], + source: mem.source ?? null, + last_accessed_at: mem.lastAccessedAt ?? null, + layer: null, // Set by recall layers, not on input + relevance_score: null, // Set by semantic recall, not on input + }, + embedding: mem.embedding ?? null, + }; + } + + /** + * Map a single TimelineEventEntity (camelCase ORM) to CorpusTimelineEvent (snake_case Rust). + * Uses Record because DataList returns plain objects, not class instances. + */ + private mapTimelineEventToCorpus(evt: Record): CorpusTimelineEvent { + return { + event: { + id: evt.id as string, + persona_id: (evt.personaId as string) ?? this.entity.uniqueId, + timestamp: typeof evt.timestamp === 'string' + ? evt.timestamp + : new Date(evt.timestamp as number).toISOString(), + context_type: (evt.contextType as string) ?? 'room', + context_id: (evt.contextId as string) ?? '', + context_name: (evt.contextName as string) ?? '', + event_type: (evt.eventType as string) ?? 'observation', + actor_id: (evt.actorId as string) ?? '', + actor_name: (evt.actorName as string) ?? '', + content: (evt.content as string) ?? '', + importance: (evt.importance as number) ?? 0.5, + topics: (evt.topics as string[]) ?? [], + }, + embedding: (evt.embedding as number[]) ?? null, + }; + } + /** * Override loadMyRooms to also populate room name cache for timeline events */ @@ -1116,9 +1250,10 @@ export class PersonaUser extends AIUser { public async evaluateAndPossiblyRespondWithCognition( message: ProcessableMessage, senderIsHuman: boolean, - messageText: string + messageText: string, + preComputedDecision?: FastPathDecision ): Promise { - return await this.messageEvaluator.evaluateAndPossiblyRespondWithCognition(message, senderIsHuman, messageText); + return await this.messageEvaluator.evaluateAndPossiblyRespondWithCognition(message, senderIsHuman, messageText, preComputedDecision); } /** @@ -1771,8 +1906,8 @@ export class PersonaUser extends AIUser { * This is called by PersonaCentralNervousSystem.serviceChatDomain() via callback pattern. * Preserves existing message handling logic (evaluation, RAG, AI response, posting). */ - public async handleChatMessageFromCNS(item: QueueItem): Promise { - await this.autonomousLoop.handleChatMessageFromCNS(item); + public async handleChatMessageFromCNS(item: QueueItem, decision?: FastPathDecision): Promise { + await this.autonomousLoop.handleChatMessageFromCNS(item, decision); } /** diff --git a/src/debug/jtag/system/user/server/modules/PersonaAutonomousLoop.ts b/src/debug/jtag/system/user/server/modules/PersonaAutonomousLoop.ts index 65ac76bff..30941155f 100644 --- a/src/debug/jtag/system/user/server/modules/PersonaAutonomousLoop.ts +++ b/src/debug/jtag/system/user/server/modules/PersonaAutonomousLoop.ts @@ -19,6 +19,7 @@ import { DataDaemon } from '../../../../daemons/data-daemon/shared/DataDaemon'; import { COLLECTIONS } from '../../../shared/Constants'; import type { TaskEntity } from '../../../data/entities/TaskEntity'; import { taskEntityToInboxTask, inboxMessageToProcessable, type InboxTask, type QueueItem } from './QueueItemTypes'; +import type { FastPathDecision } from './central-nervous-system/CNSTypes'; // Import PersonaUser directly - circular dependency is fine for type-only imports import type { PersonaUser } from '../PersonaUser'; @@ -26,6 +27,8 @@ import type { PersonaUser } from '../PersonaUser'; export class PersonaAutonomousLoop { private servicingLoopActive: boolean = false; private trainingCheckLoop: NodeJS.Timeout | null = null; + private taskPollLoop: NodeJS.Timeout | null = null; + private selfTaskLoop: NodeJS.Timeout | null = null; private log: (message: string) => void; constructor(private readonly personaUser: PersonaUser, logger?: (message: string) => void) { @@ -33,16 +36,18 @@ export class PersonaAutonomousLoop { } /** - * PHASE 3: Start autonomous servicing loop + * Start autonomous servicing loop * * Creates: * 1. Continuous async service loop (signal-based waiting, not polling) - * 2. Training readiness check loop (every 60 seconds) + * 2. Task poll loop (every 10 seconds) β€” OFF the hot path + * 3. Self-task generation loop (every 30 seconds) β€” OFF the hot path + * 4. Training readiness check loop (every 60 seconds) * * Architecture: + * - Hot path is ONLY: wait for signal β†’ Rust service_cycle β†’ execute β†’ drain β†’ repeat + * - DB queries and self-task generation run on their own timers, never blocking the hot path * - Loop uses signal/mutex pattern (RTOS-style, performant, no CPU spinning) - * - CNS handles intelligence (priority, mood, coordination) - * - Inbox provides EventEmitter-based signaling */ startAutonomousServicing(): void { this.log(`πŸ”„ ${this.personaUser.displayName}: Starting autonomous servicing (SIGNAL-BASED WAITING)`); @@ -53,8 +58,17 @@ export class PersonaAutonomousLoop { this.log(`❌ ${this.personaUser.displayName}: Service loop crashed: ${error}`); }); - // PHASE 7.5.1: Create training check loop (every 60 seconds) - // Checks less frequently than inbox servicing to avoid overhead + // Task polling on separate timer (OFF hot path β€” was previously called every service cycle) + this.taskPollLoop = setInterval(async () => { + await this.pollTasks(); + }, 10000); // 10 seconds + + // Self-task generation on separate timer (OFF hot path) + this.selfTaskLoop = setInterval(async () => { + await this.generateSelfTasksFromCNS(); + }, 30000); // 30 seconds + + // Training readiness checks (every 60 seconds) this.log(`🧬 ${this.personaUser.displayName}: Starting training readiness checks (every 60s)`); this.trainingCheckLoop = setInterval(async () => { await this.checkTrainingReadiness(); @@ -184,7 +198,9 @@ export class PersonaAutonomousLoop { * This is called by PersonaCentralNervousSystem.serviceChatDomain() via callback pattern. * Preserves existing message handling logic (evaluation, RAG, AI response, posting). */ - async handleChatMessageFromCNS(item: QueueItem): Promise { + async handleChatMessageFromCNS(item: QueueItem, decision?: FastPathDecision): Promise { + const handlerStart = performance.now(); + // If this is a task, update status to 'in_progress' in database (prevents re-polling) if (item.type === 'task') { await DataDaemon.update( @@ -210,6 +226,8 @@ export class PersonaAutonomousLoop { } } + const setupMs = performance.now() - handlerStart; + // Type-safe handling: Check if this is a message or task if (item.type === 'message') { // Convert InboxMessage β†’ ProcessableMessage (typed, no `any`) @@ -220,11 +238,17 @@ export class PersonaAutonomousLoop { console.log(`πŸŽ™οΈπŸ”Š VOICE-DEBUG [${this.personaUser.displayName}] CNS->handleChatMessageFromCNS: sourceModality=${processable.sourceModality}, voiceSessionId=${processable.voiceSessionId?.slice(0, 8) ?? 'none'}`); // Process message using cognition-enhanced evaluation logic - await this.personaUser.evaluateAndPossiblyRespondWithCognition(processable, senderIsHuman, messageText); + // Pass pre-computed decision from Rust serviceCycleFull (eliminates separate IPC call) + const evalStart = performance.now(); + await this.personaUser.evaluateAndPossiblyRespondWithCognition(processable, senderIsHuman, messageText, decision); + const evalMs = performance.now() - evalStart; // Update bookmark AFTER processing complete - enables true pause/resume // Shutdown mid-processing will re-query this message on restart await this.personaUser.updateMessageBookmark(item.roomId, item.timestamp, item.id); + + const totalMs = performance.now() - handlerStart; + this.log(`[TIMING] ${this.personaUser.displayName}: handleChatMessage total=${totalMs.toFixed(1)}ms (setup=${setupMs.toFixed(1)}ms, eval=${evalMs.toFixed(1)}ms, hasDecision=${!!decision})`); } else if (item.type === 'task') { // PHASE 5: Task execution based on task type await this.executeTask(item); @@ -267,11 +291,19 @@ export class PersonaAutonomousLoop { this.servicingLoopActive = false; this.log(`πŸ”„ ${this.personaUser.displayName}: Stopped autonomous servicing loop`); - // Stop training check loop (interval-based) + // Stop all interval-based loops + if (this.taskPollLoop) { + clearInterval(this.taskPollLoop); + this.taskPollLoop = null; + } + if (this.selfTaskLoop) { + clearInterval(this.selfTaskLoop); + this.selfTaskLoop = null; + } if (this.trainingCheckLoop) { clearInterval(this.trainingCheckLoop); this.trainingCheckLoop = null; - this.log(`🧬 ${this.personaUser.displayName}: Stopped training readiness check loop`); } + this.log(`🧬 ${this.personaUser.displayName}: Stopped all background loops`); } } diff --git a/src/debug/jtag/system/user/server/modules/PersonaInbox.ts b/src/debug/jtag/system/user/server/modules/PersonaInbox.ts index fafd25e2b..08dc97497 100644 --- a/src/debug/jtag/system/user/server/modules/PersonaInbox.ts +++ b/src/debug/jtag/system/user/server/modules/PersonaInbox.ts @@ -134,26 +134,37 @@ export class PersonaInbox { } } - // RUST CHANNEL PATH: Route through Rust IPC + // RUST CHANNEL PATH: Route through Rust IPC (fire-and-forget β€” don't block event loop) if (this.rustBridge) { const enqueueRequest = toChannelEnqueueRequest(item); - const result = await this.rustBridge.channelEnqueue(enqueueRequest); - - // Log with type-specific details - if (isInboxMessage(item)) { - const senderIdPreview = item.senderId?.slice(0, 8) ?? '[no-senderId]'; - this.log(`πŸ¦€ Routed ${enqueueRequest.item_type} β†’ Rust ${result.routed_to}: ${senderIdPreview} (priority=${item.priority.toFixed(2)}, total=${result.status.total_size})`); - if (item.sourceModality === 'voice') { - console.log(`πŸŽ™οΈπŸ”Š VOICE-DEBUG [Inbox] Routed VOICE β†’ Rust ${result.routed_to}: voiceSessionId=${item.voiceSessionId?.slice(0, 8) || 'undefined'}`); - } - } else if (isInboxTask(item)) { - this.log(`πŸ¦€ Routed task β†’ Rust ${result.routed_to}: ${item.taskType} (priority=${item.priority.toFixed(2)}, total=${result.status.total_size})`); - } + const enqueueStart = performance.now(); + + // Fire-and-forget: send IPC request but don't await response + // The response will be processed async via the pendingRequests map (requestId matching). + // Rust processes requests sequentially per socket, so the item WILL be enqueued + // before the next serviceCycleFull() call on the same connection. + this.rustBridge.channelEnqueue(enqueueRequest) + .then(result => { + const enqueueMs = performance.now() - enqueueStart; + // Async logging β€” not on critical path + if (isInboxMessage(item)) { + const senderIdPreview = item.senderId?.slice(0, 8) ?? '[no-senderId]'; + this.log(`πŸ¦€ Routed ${enqueueRequest.item_type} β†’ Rust ${result.routed_to}: ${senderIdPreview} (priority=${item.priority.toFixed(2)}, total=${result.status.total_size}, ipc=${enqueueMs.toFixed(1)}ms)`); + if (item.sourceModality === 'voice') { + console.log(`πŸŽ™οΈπŸ”Š VOICE-DEBUG [Inbox] Routed VOICE β†’ Rust ${result.routed_to}: voiceSessionId=${item.voiceSessionId?.slice(0, 8) || 'undefined'}`); + } + } else if (isInboxTask(item)) { + this.log(`πŸ¦€ Routed task β†’ Rust ${result.routed_to}: ${item.taskType} (priority=${item.priority.toFixed(2)}, total=${result.status.total_size}, ipc=${enqueueMs.toFixed(1)}ms)`); + } + }) + .catch(error => { + this.log(`❌ channelEnqueue FAILED: ${error}`); + }); - // Signal TS service loop that work is available + // Signal TS service loop IMMEDIATELY β€” don't wait for IPC response this.signal.emit('work-available'); - return true; // Item routed to Rust channel + return true; // Item sent to Rust channel (fire-and-forget) } // LEGACY PATH: Flat priority queue (Rust bridge not yet initialized during startup) diff --git a/src/debug/jtag/system/user/server/modules/PersonaMessageEvaluator.ts b/src/debug/jtag/system/user/server/modules/PersonaMessageEvaluator.ts index 7f539cd2f..d0017c87a 100644 --- a/src/debug/jtag/system/user/server/modules/PersonaMessageEvaluator.ts +++ b/src/debug/jtag/system/user/server/modules/PersonaMessageEvaluator.ts @@ -35,6 +35,7 @@ import { getChatCoordinator } from '../../../coordination/server/ChatCoordinatio import { calculateMessagePriority } from './PersonaInbox'; import { toInboxMessageRequest } from './RustCognitionBridge'; import type { SenderType } from '../../../../shared/generated'; +import type { FastPathDecision } from './central-nervous-system/CNSTypes'; import { personaSleepManager } from '@commands/ai/sleep/server/AiSleepServerCommand'; import { AI_DECISION_EVENTS, @@ -189,7 +190,8 @@ export class PersonaMessageEvaluator { async evaluateAndPossiblyRespondWithCognition( messageEntity: ProcessableMessage, senderIsHuman: boolean, - messageText: string + messageText: string, + preComputedDecision?: FastPathDecision ): Promise { // Defensive: ensure messageText is always a string (prevents slice errors) const safeMessageText = messageText ?? ''; @@ -292,7 +294,7 @@ export class PersonaMessageEvaluator { plan.steps[0].completedAt = Date.now(); // Execute step 2: "Generate thoughtful response" (existing logic) - await this.evaluateAndPossiblyRespond(messageEntity, senderIsHuman, safeMessageText); + await this.evaluateAndPossiblyRespond(messageEntity, senderIsHuman, safeMessageText, preComputedDecision); // If we got here, response was generated (or decision was SILENT) plan.steps[1].completed = true; @@ -374,7 +376,8 @@ export class PersonaMessageEvaluator { async evaluateAndPossiblyRespond( messageEntity: ProcessableMessage, senderIsHuman: boolean, - safeMessageText: string + safeMessageText: string, + preComputedDecision?: FastPathDecision ): Promise { // STEP 2: Check response cap (prevent infinite loops) if (this.personaUser.rateLimiter.hasReachedResponseCap(messageEntity.roomId)) { @@ -453,7 +456,7 @@ export class PersonaMessageEvaluator { ); } - const gatingResult = await this.evaluateShouldRespond(messageEntity, senderIsHuman, isMentioned); + const gatingResult = await this.evaluateShouldRespond(messageEntity, senderIsHuman, isMentioned, preComputedDecision); // FULL TRANSPARENCY LOGGING this.log(`\n${'='.repeat(80)}`); @@ -1067,7 +1070,8 @@ export class PersonaMessageEvaluator { async evaluateShouldRespond( message: ProcessableMessage, senderIsHuman: boolean, - isMentioned: boolean + isMentioned: boolean, + preComputedDecision?: FastPathDecision ): Promise<{ shouldRespond: boolean; confidence: number; @@ -1088,41 +1092,53 @@ export class PersonaMessageEvaluator { const startTime = Date.now(); try { - // RUST COGNITION: Fast-path decision via IPC (<1ms target) - // Handles mention detection, deduplication, state-based gating - const senderType: SenderType = senderIsHuman ? 'human' : 'persona'; - const priority = calculateMessagePriority( - { - content: message.content?.text ?? '', - timestamp: this.personaUser.timestampToNumber(message.timestamp), - roomId: message.roomId - }, - { - displayName: this.personaUser.displayName, - id: this.personaUser.id - } - ); + // RUST COGNITION: Fast-path decision + // If pre-computed from serviceCycleFull, skip the separate IPC call entirely + let rustDecision: { should_respond: boolean; confidence: number; reason: string; decision_time_ms: number; fast_path_used: boolean }; + + if (preComputedDecision) { + // Decision already computed by Rust in serviceCycleFull (saves one IPC round-trip) + rustDecision = preComputedDecision; + this.log(`πŸ¦€ ${this.personaUser.displayName}: Using pre-computed decision (saved IPC call): ${rustDecision.should_respond ? 'RESPOND' : 'SILENT'} (${rustDecision.decision_time_ms.toFixed(2)}ms, fast_path=${rustDecision.fast_path_used})`); + } else { + // Fallback: make separate IPC call (for code paths that don't go through CNS) + const senderType: SenderType = senderIsHuman ? 'human' : 'persona'; + const priority = calculateMessagePriority( + { + content: message.content?.text ?? '', + timestamp: this.personaUser.timestampToNumber(message.timestamp), + roomId: message.roomId + }, + { + displayName: this.personaUser.displayName, + id: this.personaUser.id + } + ); - const inboxRequest = toInboxMessageRequest( - { - id: message.id, - roomId: message.roomId, - senderId: message.senderId, - senderName: message.senderName, - content: message.content?.text ?? '', - timestamp: this.personaUser.timestampToNumber(message.timestamp) - }, - senderType, - priority, - 'chat' - ); + const inboxRequest = toInboxMessageRequest( + { + id: message.id, + roomId: message.roomId, + senderId: message.senderId, + senderName: message.senderName, + content: message.content?.text ?? '', + timestamp: this.personaUser.timestampToNumber(message.timestamp) + }, + senderType, + priority, + 'chat' + ); - const rustDecision = await this.personaUser.rustCognition.fastPathDecision(inboxRequest); + const ipcStart = performance.now(); + rustDecision = await this.personaUser.rustCognition.fastPathDecision(inboxRequest); + const ipcMs = performance.now() - ipcStart; - this.log(`πŸ¦€ ${this.personaUser.displayName}: Rust decision: ${rustDecision.should_respond ? 'RESPOND' : 'SILENT'} (${rustDecision.decision_time_ms.toFixed(2)}ms, fast_path=${rustDecision.fast_path_used})`); + this.log(`πŸ¦€ ${this.personaUser.displayName}: Rust decision (separate IPC, ${ipcMs.toFixed(1)}ms): ${rustDecision.should_respond ? 'RESPOND' : 'SILENT'} (${rustDecision.decision_time_ms.toFixed(2)}ms, fast_path=${rustDecision.fast_path_used})`); + } // Build RAG context for decision logging // IMPORTANT: Exclude processed tool results to prevent infinite loops + const ragStart = performance.now(); const ragBuilder = new ChatRAGBuilder(this.log.bind(this)); const ragContext = await ragBuilder.buildContext( message.roomId, @@ -1141,6 +1157,10 @@ export class PersonaMessageEvaluator { } } ); + const ragMs = performance.now() - ragStart; + const totalMs = Date.now() - startTime; + + this.log(`[TIMING] ${this.personaUser.displayName}: evaluateShouldRespond total=${totalMs}ms (rag=${ragMs.toFixed(1)}ms, preComputed=${!!preComputedDecision})`); return { shouldRespond: rustDecision.should_respond, @@ -1155,7 +1175,6 @@ export class PersonaMessageEvaluator { } }; - } catch (error: any) { this.log(`❌ ${this.personaUser.displayName}: Should-respond evaluation failed:`, error); diff --git a/src/debug/jtag/system/user/server/modules/PersonaState.ts b/src/debug/jtag/system/user/server/modules/PersonaState.ts index ff9fd6549..803ccb7a5 100644 --- a/src/debug/jtag/system/user/server/modules/PersonaState.ts +++ b/src/debug/jtag/system/user/server/modules/PersonaState.ts @@ -163,13 +163,17 @@ export class PersonaStateManager { } /** - * Get cadence (how often to check inbox) + * Get cadence (max wait time for signal before timeout, in ms) + * + * This is NOT a polling interval β€” the service loop uses signal-based wakeup. + * Cadence is the MAXIMUM time to wait if no signal arrives. + * Actual response is near-instant when a signal fires. * * Adaptive timing based on mood: - * - Overwhelmed: 10s (back pressure) - * - Tired: 7s (moderate pace) - * - Active: 5s (normal pace) - * - Idle: 3s (eager, stay responsive) + * - Idle: 1s (first message gets fast response) + * - Active: 500ms (stay responsive during conversations) + * - Tired: 2s (moderate pace) + * - Overwhelmed: 3s (back pressure, but still responsive) * * Constrained by compute budget (slow down when limited) */ @@ -177,17 +181,17 @@ export class PersonaStateManager { let cadence: number; switch (this.state.mood) { - case 'overwhelmed': - cadence = 10000; // 10 seconds (back pressure) - break; - case 'tired': - cadence = 7000; // 7 seconds (moderate) + case 'idle': + cadence = 1000; // 1s β€” quick to respond to first message break; case 'active': - cadence = 5000; // 5 seconds (normal) + cadence = 500; // 500ms β€” stay responsive during active conversations break; - case 'idle': - cadence = 3000; // 3 seconds (eager) + case 'tired': + cadence = 2000; // 2s β€” moderate pace + break; + case 'overwhelmed': + cadence = 3000; // 3s β€” back pressure break; } diff --git a/src/debug/jtag/system/user/server/modules/RustCognitionBridge.ts b/src/debug/jtag/system/user/server/modules/RustCognitionBridge.ts index c6e9d1791..47e761d97 100644 --- a/src/debug/jtag/system/user/server/modules/RustCognitionBridge.ts +++ b/src/debug/jtag/system/user/server/modules/RustCognitionBridge.ts @@ -29,6 +29,14 @@ import type { import type { UUID } from '../../../core/types/CrossPlatformUUID'; import { SubsystemLogger } from './being/logging/SubsystemLogger'; +// Memory subsystem types (Hippocampus in Rust β€” corpus-based, no SQL) +import type { CorpusMemory } from '../../../../workers/continuum-core/bindings/CorpusMemory'; +import type { CorpusTimelineEvent } from '../../../../workers/continuum-core/bindings/CorpusTimelineEvent'; +import type { LoadCorpusResponse } from '../../../../workers/continuum-core/bindings/LoadCorpusResponse'; +import type { MemoryRecallResponse } from '../../../../workers/continuum-core/bindings/MemoryRecallResponse'; +import type { MultiLayerRecallRequest } from '../../../../workers/continuum-core/bindings/MultiLayerRecallRequest'; +import type { ConsciousnessContextResponse } from '../../../../workers/continuum-core/bindings/ConsciousnessContextResponse'; + const SOCKET_PATH = '/tmp/continuum-core.sock'; /** @@ -318,6 +326,43 @@ export class RustCognitionBridge { } } + /** + * Service cycle + fast-path decision in ONE IPC call. + * Eliminates a separate IPC round-trip for fastPathDecision. + * Returns scheduling result + cognition decision together. + * THROWS on failure + */ + async serviceCycleFull(): Promise<{ + should_process: boolean; + item: any | null; + channel: ActivityDomain | null; + wait_ms: number; + stats: ChannelRegistryStatus; + decision: { should_respond: boolean; confidence: number; reason: string; decision_time_ms: number; fast_path_used: boolean } | null; + }> { + this.assertReady('serviceCycleFull'); + const start = performance.now(); + + try { + const result = await this.client.channelServiceCycleFull(this.personaId); + const elapsed = performance.now() - start; + + if (result.should_process) { + const decisionStr = result.decision + ? `respond=${result.decision.should_respond}, reason="${result.decision.reason}"` + : 'no-decision'; + this.logger.info(`Service cycle full: process ${result.channel} item [${decisionStr}] (${elapsed.toFixed(2)}ms) total=${result.stats.total_size}`); + } + + return result; + } catch (error) { + const elapsed = performance.now() - start; + this.logger.error(`serviceCycleFull FAILED after ${elapsed.toFixed(2)}ms`); + this.logger.error(`Error: ${error}`); + throw error; + } + } + /** * Get per-channel status snapshot * THROWS on failure @@ -360,6 +405,155 @@ export class RustCognitionBridge { } } + // ======================================================================== + // Memory Subsystem (Hippocampus in Rust β€” corpus-based, no SQL) + // Corpus loaded at startup, recall/consciousness bypass TS event loop + // ======================================================================== + + /** + * Load a persona's full memory corpus into Rust's in-memory cache. + * Called at persona startup β€” sends all memories + timeline events from TS ORM. + * Subsequent recall/consciousness operations run on this cached corpus. + * THROWS on failure + */ + async memoryLoadCorpus( + memories: CorpusMemory[], + events: CorpusTimelineEvent[] + ): Promise { + this.assertReady('memoryLoadCorpus'); + const start = performance.now(); + + try { + const result = await this.client.memoryLoadCorpus(this.personaId, memories, events); + const elapsed = performance.now() - start; + + this.logger.info(`Corpus loaded: ${result.memory_count} memories (${result.embedded_memory_count} embedded), ${result.timeline_event_count} events (${result.embedded_event_count} embedded) in ${result.load_time_ms.toFixed(1)}ms (ipc=${elapsed.toFixed(1)}ms)`); + return result; + } catch (error) { + const elapsed = performance.now() - start; + this.logger.error(`memoryLoadCorpus FAILED after ${elapsed.toFixed(2)}ms`); + this.logger.error(`memories=${memories.length}, events=${events.length}`); + this.logger.error(`Error: ${error}`); + throw error; + } + } + + /** + * Append a single memory to the cached corpus (incremental update). + * Called after Hippocampus stores a new memory to the DB. + * Keeps Rust cache coherent with the ORM without full reload. + * THROWS on failure + */ + async memoryAppendMemory(memory: CorpusMemory): Promise { + this.assertReady('memoryAppendMemory'); + const start = performance.now(); + + try { + await this.client.memoryAppendMemory(this.personaId, memory); + const elapsed = performance.now() - start; + + this.logger.info(`Memory appended: ${memory.record.id} type=${memory.record.memory_type} embedded=${!!memory.embedding} (${elapsed.toFixed(1)}ms)`); + } catch (error) { + const elapsed = performance.now() - start; + this.logger.error(`memoryAppendMemory FAILED after ${elapsed.toFixed(2)}ms`); + this.logger.error(`memory_id=${memory.record.id}`); + this.logger.error(`Error: ${error}`); + throw error; + } + } + + /** + * Append a single timeline event to the cached corpus (incremental update). + * THROWS on failure + */ + async memoryAppendEvent(event: CorpusTimelineEvent): Promise { + this.assertReady('memoryAppendEvent'); + const start = performance.now(); + + try { + await this.client.memoryAppendEvent(this.personaId, event); + const elapsed = performance.now() - start; + + this.logger.info(`Event appended: ${event.event.id} type=${event.event.event_type} embedded=${!!event.embedding} (${elapsed.toFixed(1)}ms)`); + } catch (error) { + const elapsed = performance.now() - start; + this.logger.error(`memoryAppendEvent FAILED after ${elapsed.toFixed(2)}ms`); + this.logger.error(`event_id=${event.event.id}`); + this.logger.error(`Error: ${error}`); + throw error; + } + } + + /** + * 6-layer parallel multi-recall β€” the primary recall API + * Runs Core, Semantic, Temporal, Associative, DecayResurface, CrossContext in parallel + * THROWS on failure + */ + async memoryMultiLayerRecall(params: MultiLayerRecallRequest): Promise { + this.assertReady('memoryMultiLayerRecall'); + const start = performance.now(); + + try { + const result = await this.client.memoryMultiLayerRecall(this.personaId, params); + const elapsed = performance.now() - start; + + const layerSummary = result.layer_timings + .map(l => `${l.layer}(${l.results_found}/${l.time_ms.toFixed(1)}ms)`) + .join(', '); + this.logger.info(`Multi-layer recall: ${result.memories.length}/${result.total_candidates} memories, layers=[${layerSummary}] total=${result.recall_time_ms.toFixed(1)}ms (ipc=${elapsed.toFixed(1)}ms)`); + + if (elapsed > 100) { + this.logger.warn(`Multi-layer recall SLOW: ${elapsed.toFixed(1)}ms (target <50ms)`); + } + + return result; + } catch (error) { + const elapsed = performance.now() - start; + this.logger.error(`memoryMultiLayerRecall FAILED after ${elapsed.toFixed(2)}ms`); + this.logger.error(`query="${params.query_text}", room=${params.room_id}`); + this.logger.error(`Error: ${error}`); + throw error; + } + } + + /** + * Build consciousness context for RAG injection + * Replaces UnifiedConsciousness.getContext() β€” temporal + cross-context + intentions + * THROWS on failure + */ + async memoryConsciousnessContext( + roomId: string, + currentMessage?: string, + skipSemanticSearch?: boolean + ): Promise { + this.assertReady('memoryConsciousnessContext'); + const start = performance.now(); + + try { + const result = await this.client.memoryConsciousnessContext( + this.personaId, + roomId, + currentMessage, + skipSemanticSearch + ); + const elapsed = performance.now() - start; + + this.logger.info(`Consciousness context: events=${result.cross_context_event_count}, intentions=${result.active_intention_count}, peripheral=${result.has_peripheral_activity} (build=${result.build_time_ms.toFixed(1)}ms, ipc=${elapsed.toFixed(1)}ms)`); + + if (elapsed > 100) { + this.logger.warn(`Consciousness context SLOW: ${elapsed.toFixed(1)}ms (target <20ms)`); + } + + return result; + } catch (error) { + const elapsed = performance.now() - start; + this.logger.error(`memoryConsciousnessContext FAILED after ${elapsed.toFixed(2)}ms`); + this.logger.error(`roomId=${roomId}`); + this.logger.error(`Error: ${error}`); + throw error; + } + } + /** * Get bridge stats for debugging */ diff --git a/src/debug/jtag/system/user/server/modules/central-nervous-system/CNSFactory.ts b/src/debug/jtag/system/user/server/modules/central-nervous-system/CNSFactory.ts index db1041654..0aa46ed24 100644 --- a/src/debug/jtag/system/user/server/modules/central-nervous-system/CNSFactory.ts +++ b/src/debug/jtag/system/user/server/modules/central-nervous-system/CNSFactory.ts @@ -14,6 +14,7 @@ import type { PersonaStateManager } from '../PersonaState'; // Import QueueItem type for handleChatMessageFromCNS signature import type { QueueItem } from '../PersonaInbox'; +import type { FastPathDecision } from './CNSTypes'; // Import RustCognitionBridge type import type { RustCognitionBridge } from '../RustCognitionBridge'; @@ -34,9 +35,7 @@ interface PersonaUserLike { } | null; // Rust cognition bridge (required for scheduling) rustCognitionBridge: RustCognitionBridge | null; - handleChatMessageFromCNS: (item: QueueItem) => Promise; - pollTasksFromCNS: () => Promise; - generateSelfTasksFromCNS: () => Promise; + handleChatMessageFromCNS: (item: QueueItem, decision?: FastPathDecision) => Promise; } export class CNSFactory { @@ -137,14 +136,8 @@ export class CNSFactory { personaId: persona.entity.id, personaName, uniqueId: persona.entity.uniqueId, - handleChatMessage: async (item: QueueItem): Promise => { - await persona.handleChatMessageFromCNS(item); - }, - pollTasks: async (): Promise => { - await persona.pollTasksFromCNS(); - }, - generateSelfTasks: async (): Promise => { - await persona.generateSelfTasksFromCNS(); + handleChatMessage: async (item: QueueItem, decision?: FastPathDecision): Promise => { + await persona.handleChatMessageFromCNS(item, decision); }, allowBackgroundThreads: false, }); diff --git a/src/debug/jtag/system/user/server/modules/central-nervous-system/CNSTypes.ts b/src/debug/jtag/system/user/server/modules/central-nervous-system/CNSTypes.ts index a7470b0b8..64a5b9941 100644 --- a/src/debug/jtag/system/user/server/modules/central-nervous-system/CNSTypes.ts +++ b/src/debug/jtag/system/user/server/modules/central-nervous-system/CNSTypes.ts @@ -10,6 +10,18 @@ import type { PersonaInbox, QueueItem } from '../PersonaInbox'; import type { PersonaStateManager } from '../PersonaState'; import type { RustCognitionBridge } from '../RustCognitionBridge'; +/** + * Pre-computed fast-path decision from Rust's serviceCycleFull. + * Eliminates a separate fastPathDecision IPC round-trip. + */ +export interface FastPathDecision { + should_respond: boolean; + confidence: number; + reason: string; + decision_time_ms: number; + fast_path_used: boolean; +} + /** * Configuration for PersonaCentralNervousSystem * @@ -28,10 +40,9 @@ export interface CNSConfig { readonly personaName: string; readonly uniqueId: string; // Format: {name}-{shortId} for log paths - // Callbacks for delegating to PersonaUser (avoids circular dependency) - readonly handleChatMessage: (item: QueueItem) => Promise; - readonly pollTasks: () => Promise; - readonly generateSelfTasks: () => Promise; + // Callback for delegating to PersonaUser (avoids circular dependency) + // decision is the pre-computed fast-path decision from Rust's serviceCycleFull + readonly handleChatMessage: (item: QueueItem, decision?: FastPathDecision) => Promise; // Configuration readonly allowBackgroundThreads: boolean; diff --git a/src/debug/jtag/system/user/server/modules/central-nervous-system/PersonaCentralNervousSystem.ts b/src/debug/jtag/system/user/server/modules/central-nervous-system/PersonaCentralNervousSystem.ts index aa746dc7f..245c58786 100644 --- a/src/debug/jtag/system/user/server/modules/central-nervous-system/PersonaCentralNervousSystem.ts +++ b/src/debug/jtag/system/user/server/modules/central-nervous-system/PersonaCentralNervousSystem.ts @@ -32,66 +32,96 @@ export class PersonaCentralNervousSystem { /** * Single service cycle β€” the heart of the autonomous entity. * - * Delegates ALL scheduling to Rust: - * - Rust handles: consolidation, state gating, priority ordering, item selection - * - TS handles: task polling, self-task generation, item execution (LLM, DB, tools) + * HOT PATH ONLY: wait β†’ Rust schedule β†’ execute β†’ drain β†’ repeat. + * DB polling and self-task generation run on separate timers (see PersonaAutonomousLoop). + * + * Drain loop: after processing one item, immediately check for more. + * Only returns to waitForWork when Rust says the queue is empty. */ async serviceCycle(): Promise { - // STEP 0a: Poll task database for pending tasks assigned to this persona - await this.config.pollTasks(); - - // STEP 0b: Generate self-tasks for autonomous work creation - await this.config.generateSelfTasks(); - // STEP 1: Wait for work (signal-based, delegates to inbox) const cadence = this.config.personaState.getCadence(); const hasWork = await this.config.inbox.waitForWork(cadence); if (!hasWork) { - await this.config.personaState.rest(cadence); - return; + return; // No work β€” loop will call us again } - // STEP 2: Rust-delegated scheduling - await this.serviceViaRust(); + // STEP 2: Drain loop β€” process all queued items before returning to wait + await this.drainQueue(); } /** - * Rust-delegated service cycle. + * Drain all queued items from Rust. + * Keeps calling Rust service_cycle() until no more work is available. + * This eliminates the overhead of re-entering waitForWork between items. + */ + private async drainQueue(): Promise { + let itemsProcessed = 0; + const MAX_DRAIN = 20; // Safety cap β€” don't monopolize the event loop forever + + while (itemsProcessed < MAX_DRAIN) { + const processed = await this.serviceViaRust(); + if (!processed) { + break; // Queue empty, return to wait + } + itemsProcessed++; + } + + if (itemsProcessed > 1) { + this.logger.info(`Drained ${itemsProcessed} items in burst`); + } + } + + /** + * Rust-delegated service cycle (MERGED: schedule + fast-path decision in ONE IPC call). * - * Rust's service_cycle() does ALL scheduling work in <1ms: + * Rust's serviceCycleFull() does ALL scheduling + cognition in <1ms: * - Consolidates all channels (items decide merge policy) * - Updates persona state (inbox_load, mood) * - Checks urgent channels first (AUDIO β†’ CHAT β†’ BACKGROUND) * - State-gates non-urgent items (mood/energy threshold) - * - Returns next item to process or adaptive wait cadence + * - Runs fast-path decision on the dequeued item (dedup, mention detection, state gating) + * - Returns next item + decision in ONE IPC round-trip * * TS just executes what Rust decided. + * Returns true if an item was processed (drain loop continues). */ - private async serviceViaRust(): Promise { + private async serviceViaRust(): Promise { const bridge = this.config.rustBridge; + const ipcStart = performance.now(); + + const result = await bridge.serviceCycleFull(); - const result = await bridge.serviceCycle(); + const ipcMs = performance.now() - ipcStart; if (result.should_process && result.item) { // Convert Rust JSON item β†’ TS QueueItem + const parseStart = performance.now(); const queueItem = fromRustServiceItem(result.item as Record); + const parseMs = performance.now() - parseStart; + if (!queueItem) { this.logger.warn(`Rust returned unparseable item: ${JSON.stringify(result.item).slice(0, 200)}`); - return; + return false; } const channelName = result.channel ?? 'unknown'; - this.logger.info(`[rust:${channelName}] Processing ${queueItem.type} (priority=${queueItem.priority.toFixed(2)}, stats=${result.stats.total_size} total)`); - - // Delegate to PersonaUser via callback - await this.config.handleChatMessage(queueItem); - } else { - // No work β€” Rust says rest for wait_ms - // Note: wait_ms is advisory; the outer loop will call waitForWork() next cycle - // which provides signal-based wakeup if new work arrives before wait_ms - this.logger.debug(`Rust service cycle: no work (wait_ms=${result.wait_ms}, stats=${result.stats.total_size} total)`); + const decisionStr = result.decision + ? `respond=${result.decision.should_respond}` + : 'no-decision'; + this.logger.info(`[rust:${channelName}] Processing ${queueItem.type} (priority=${queueItem.priority.toFixed(2)}, stats=${result.stats.total_size} total) [ipc=${ipcMs.toFixed(1)}ms, parse=${parseMs.toFixed(1)}ms, ${decisionStr}]`); + + // Delegate to PersonaUser via callback β€” pass pre-computed decision + const handlerStart = performance.now(); + await this.config.handleChatMessage(queueItem, result.decision ?? undefined); + const handlerMs = performance.now() - handlerStart; + + this.logger.info(`[rust:${channelName}] Handler complete (${handlerMs.toFixed(1)}ms total, ipc=${ipcMs.toFixed(1)}ms)`); + return true; } + + return false; } /** diff --git a/src/debug/jtag/system/user/server/modules/cognitive/memory/Hippocampus.ts b/src/debug/jtag/system/user/server/modules/cognitive/memory/Hippocampus.ts index 53cde39a1..70e1d5e8e 100644 --- a/src/debug/jtag/system/user/server/modules/cognitive/memory/Hippocampus.ts +++ b/src/debug/jtag/system/user/server/modules/cognitive/memory/Hippocampus.ts @@ -47,6 +47,8 @@ import { DataOpen } from '../../../../../../commands/data/open/shared/DataOpenTy import { VectorSearch } from '../../../../../../commands/data/vector-search/shared/VectorSearchCommandTypes'; import { DataList } from '../../../../../../commands/data/list/shared/DataListTypes'; import { DataCreate } from '../../../../../../commands/data/create/shared/DataCreateTypes'; +import type { CorpusMemory } from '../../../../../../workers/continuum-core/bindings/CorpusMemory'; + /** * Snapshot of persona state at tick time * Used for logging and consolidation decisions @@ -485,6 +487,34 @@ export class Hippocampus extends PersonaContinuousSubprocess { consolidatedIds.push(matchingThought.id); } } + + // Append to Rust corpus β€” keeps in-memory cache coherent with longterm.db + // Without this, Rust recall is blind to memories created after startup. + const bridge = this.persona.rustCognitionBridge; + if (bridge) { + const corpusMemory: CorpusMemory = { + record: { + id: memory.id, + persona_id: memory.personaId, + memory_type: memory.type, + content: memory.content, + context: memory.context ?? {}, + timestamp: typeof memory.timestamp === 'string' + ? memory.timestamp + : new Date(memory.timestamp as unknown as number).toISOString(), + importance: memory.importance ?? 0.5, + access_count: memory.accessCount ?? 0, + tags: memory.tags ?? [], + related_to: memory.relatedTo ?? [], + source: memory.source ?? null, + last_accessed_at: memory.lastAccessedAt ?? null, + layer: null, + relevance_score: null, + }, + embedding: memory.embedding ?? null, + }; + await bridge.memoryAppendMemory(corpusMemory); + } } else { failedCount++; this.log(`ERROR: Failed to store memory ${memory.id}: ${result.error}`); diff --git a/src/debug/jtag/system/user/server/modules/consciousness/UnifiedConsciousness.ts b/src/debug/jtag/system/user/server/modules/consciousness/UnifiedConsciousness.ts index cfd582825..4bfb57732 100644 --- a/src/debug/jtag/system/user/server/modules/consciousness/UnifiedConsciousness.ts +++ b/src/debug/jtag/system/user/server/modules/consciousness/UnifiedConsciousness.ts @@ -19,6 +19,8 @@ import type { UUID } from '../../../../core/types/CrossPlatformUUID'; import { PersonaTimeline, type RecordEventParams, type ConsciousnessLogger, type TemporalThread, type ContextualEvent } from './PersonaTimeline'; import type { ContextType, TimelineEventType } from '../../../../data/entities/TimelineEventEntity'; import { truncate } from '../../../../../shared/utils/StringUtils'; +import type { RustCognitionBridge } from '../RustCognitionBridge'; +import type { CorpusTimelineEvent } from '../../../../../workers/continuum-core/bindings/CorpusTimelineEvent'; /** * Self-model - the persona's understanding of their own state @@ -106,6 +108,9 @@ export class UnifiedConsciousness { private currentFocusContextId: UUID | null = null; private lastContextSwitchTime: Date | null = null; + // Rust cognition bridge for corpus cache coherence (set post-construction) + private _rustBridge: RustCognitionBridge | null = null; + constructor( personaId: UUID, uniqueId: string, // e.g., "together", "helper" - matches folder name @@ -134,6 +139,16 @@ export class UnifiedConsciousness { }; } + /** + * Set the Rust cognition bridge for corpus cache coherence. + * Called after PersonaUser creates both consciousness and bridge. + * When set, newly recorded timeline events are appended to Rust's in-memory corpus + * so recall stays coherent with longterm.db without requiring a full reload. + */ + setRustBridge(bridge: RustCognitionBridge): void { + this._rustBridge = bridge; + } + /** * Record an event in the global timeline * Called whenever anything significant happens @@ -142,6 +157,29 @@ export class UnifiedConsciousness { try { const event = await this.timeline.recordEvent(params); + // Append to Rust corpus β€” keeps in-memory cache coherent with longterm.db + // Without this, Rust recall is blind to events created after startup. + if (this._rustBridge) { + const corpusEvent: CorpusTimelineEvent = { + event: { + id: event.id, + persona_id: event.personaId, + timestamp: event.timestamp, + context_type: event.contextType, + context_id: event.contextId, + context_name: event.contextName, + event_type: event.eventType, + actor_id: event.actorId, + actor_name: event.actorName, + content: event.content, + importance: event.importance, + topics: event.topics, + }, + embedding: event.embedding ?? null, + }; + await this._rustBridge.memoryAppendEvent(corpusEvent); + } + // Update focus tracking if we're switching contexts if (params.actorId === this.personaId) { if (this.currentFocusContextId !== params.contextId) { diff --git a/src/debug/jtag/workers/continuum-core/Cargo.toml b/src/debug/jtag/workers/continuum-core/Cargo.toml index 47baa6408..849a93390 100644 --- a/src/debug/jtag/workers/continuum-core/Cargo.toml +++ b/src/debug/jtag/workers/continuum-core/Cargo.toml @@ -50,5 +50,8 @@ tracing-subscriber.workspace = true rand.workspace = true # For test audio generation ts-rs.workspace = true # TypeScript type generation +# Memory/Hippocampus β€” pure compute engine (data from TS ORM via IPC) +fastembed.workspace = true # Inline ONNX embedding (~5ms per embed, no IPC hop) + [dev-dependencies] tokio-test = "0.4" diff --git a/src/debug/jtag/workers/continuum-core/bindings/ConsciousnessContextRequest.ts b/src/debug/jtag/workers/continuum-core/bindings/ConsciousnessContextRequest.ts new file mode 100644 index 000000000..a1454f09e --- /dev/null +++ b/src/debug/jtag/workers/continuum-core/bindings/ConsciousnessContextRequest.ts @@ -0,0 +1,6 @@ +// This file was generated by [ts-rs](https://github.com/Aleph-Alpha/ts-rs). Do not edit this file manually. + +/** + * Request to build consciousness context (replaces TS UnifiedConsciousness.getContext). + */ +export type ConsciousnessContextRequest = { room_id: string, current_message: string | null, skip_semantic_search: boolean, }; diff --git a/src/debug/jtag/workers/continuum-core/bindings/ConsciousnessContextResponse.ts b/src/debug/jtag/workers/continuum-core/bindings/ConsciousnessContextResponse.ts new file mode 100644 index 000000000..c695905bc --- /dev/null +++ b/src/debug/jtag/workers/continuum-core/bindings/ConsciousnessContextResponse.ts @@ -0,0 +1,7 @@ +// This file was generated by [ts-rs](https://github.com/Aleph-Alpha/ts-rs). Do not edit this file manually. +import type { TemporalInfo } from "./TemporalInfo"; + +/** + * Response with formatted consciousness context for RAG injection. + */ +export type ConsciousnessContextResponse = { formatted_prompt: string | null, build_time_ms: number, temporal: TemporalInfo, cross_context_event_count: number, active_intention_count: number, has_peripheral_activity: boolean, }; diff --git a/src/debug/jtag/workers/continuum-core/bindings/CorpusMemory.ts b/src/debug/jtag/workers/continuum-core/bindings/CorpusMemory.ts new file mode 100644 index 000000000..c0a94fc2e --- /dev/null +++ b/src/debug/jtag/workers/continuum-core/bindings/CorpusMemory.ts @@ -0,0 +1,7 @@ +// This file was generated by [ts-rs](https://github.com/Aleph-Alpha/ts-rs). Do not edit this file manually. +import type { MemoryRecord } from "./MemoryRecord"; + +/** + * A memory with its optional embedding vector β€” sent from TS ORM to Rust. + */ +export type CorpusMemory = { record: MemoryRecord, embedding: Array | null, }; diff --git a/src/debug/jtag/workers/continuum-core/bindings/CorpusTimelineEvent.ts b/src/debug/jtag/workers/continuum-core/bindings/CorpusTimelineEvent.ts new file mode 100644 index 000000000..d20c57da4 --- /dev/null +++ b/src/debug/jtag/workers/continuum-core/bindings/CorpusTimelineEvent.ts @@ -0,0 +1,7 @@ +// This file was generated by [ts-rs](https://github.com/Aleph-Alpha/ts-rs). Do not edit this file manually. +import type { TimelineEvent } from "./TimelineEvent"; + +/** + * A timeline event with its optional embedding vector β€” sent from TS ORM to Rust. + */ +export type CorpusTimelineEvent = { event: TimelineEvent, embedding: Array | null, }; diff --git a/src/debug/jtag/workers/continuum-core/bindings/LayerTiming.ts b/src/debug/jtag/workers/continuum-core/bindings/LayerTiming.ts new file mode 100644 index 000000000..13f3ed0e5 --- /dev/null +++ b/src/debug/jtag/workers/continuum-core/bindings/LayerTiming.ts @@ -0,0 +1,6 @@ +// This file was generated by [ts-rs](https://github.com/Aleph-Alpha/ts-rs). Do not edit this file manually. + +/** + * Timing for a single recall layer. + */ +export type LayerTiming = { layer: string, time_ms: number, results_found: number, }; diff --git a/src/debug/jtag/workers/continuum-core/bindings/LoadCorpusResponse.ts b/src/debug/jtag/workers/continuum-core/bindings/LoadCorpusResponse.ts new file mode 100644 index 000000000..1399765e5 --- /dev/null +++ b/src/debug/jtag/workers/continuum-core/bindings/LoadCorpusResponse.ts @@ -0,0 +1,6 @@ +// This file was generated by [ts-rs](https://github.com/Aleph-Alpha/ts-rs). Do not edit this file manually. + +/** + * Response from corpus loading. + */ +export type LoadCorpusResponse = { memory_count: number, embedded_memory_count: number, timeline_event_count: number, embedded_event_count: number, load_time_ms: number, }; diff --git a/src/debug/jtag/workers/continuum-core/bindings/MemoryRecallResponse.ts b/src/debug/jtag/workers/continuum-core/bindings/MemoryRecallResponse.ts new file mode 100644 index 000000000..6a436df9a --- /dev/null +++ b/src/debug/jtag/workers/continuum-core/bindings/MemoryRecallResponse.ts @@ -0,0 +1,8 @@ +// This file was generated by [ts-rs](https://github.com/Aleph-Alpha/ts-rs). Do not edit this file manually. +import type { LayerTiming } from "./LayerTiming"; +import type { MemoryRecord } from "./MemoryRecord"; + +/** + * Response from any recall operation. + */ +export type MemoryRecallResponse = { memories: Array, recall_time_ms: number, layer_timings: Array, total_candidates: number, }; diff --git a/src/debug/jtag/workers/continuum-core/bindings/MemoryRecord.ts b/src/debug/jtag/workers/continuum-core/bindings/MemoryRecord.ts new file mode 100644 index 000000000..82a3963c5 --- /dev/null +++ b/src/debug/jtag/workers/continuum-core/bindings/MemoryRecord.ts @@ -0,0 +1,15 @@ +// This file was generated by [ts-rs](https://github.com/Aleph-Alpha/ts-rs). Do not edit this file manually. + +/** + * A single memory record β€” comes from the TS ORM, not SQL. + * Used as both input (corpus loading) and output (recall results). + */ +export type MemoryRecord = { id: string, persona_id: string, memory_type: string, content: string, context: Record, timestamp: string, importance: number, access_count: number, tags: Array, related_to: Array, source: string | null, last_accessed_at: string | null, +/** + * Set by recall layers β€” indicates which layer found this memory + */ +layer: string | null, +/** + * Set by semantic recall β€” cosine similarity score + */ +relevance_score: number | null, }; diff --git a/src/debug/jtag/workers/continuum-core/bindings/MultiLayerRecallRequest.ts b/src/debug/jtag/workers/continuum-core/bindings/MultiLayerRecallRequest.ts new file mode 100644 index 000000000..0e5687428 --- /dev/null +++ b/src/debug/jtag/workers/continuum-core/bindings/MultiLayerRecallRequest.ts @@ -0,0 +1,10 @@ +// This file was generated by [ts-rs](https://github.com/Aleph-Alpha/ts-rs). Do not edit this file manually. + +/** + * Multi-layer recall request β€” the primary recall API. + */ +export type MultiLayerRecallRequest = { query_text: string | null, room_id: string, max_results: number, +/** + * Which layers to run (empty = all layers) + */ +layers: Array | null, }; diff --git a/src/debug/jtag/workers/continuum-core/bindings/RustCoreIPC.ts b/src/debug/jtag/workers/continuum-core/bindings/RustCoreIPC.ts index f7cf6149f..1e3220bf8 100644 --- a/src/debug/jtag/workers/continuum-core/bindings/RustCoreIPC.ts +++ b/src/debug/jtag/workers/continuum-core/bindings/RustCoreIPC.ts @@ -28,6 +28,14 @@ import type { ServiceCycleResult, } from '../../../shared/generated'; +// Memory subsystem types (Hippocampus in Rust β€” corpus-based, no SQL) +import type { CorpusMemory } from './CorpusMemory'; +import type { CorpusTimelineEvent } from './CorpusTimelineEvent'; +import type { LoadCorpusResponse } from './LoadCorpusResponse'; +import type { MemoryRecallResponse } from './MemoryRecallResponse'; +import type { MultiLayerRecallRequest } from './MultiLayerRecallRequest'; +import type { ConsciousnessContextResponse } from './ConsciousnessContextResponse'; + // ============================================================================ // Types // ============================================================================ @@ -557,6 +565,39 @@ export class RustCoreIPCClient extends EventEmitter { }; } + /** + * Service cycle + fast-path decision in ONE IPC call. + * Eliminates a separate round-trip for fastPathDecision. + * Returns service_cycle result + optional cognition decision. + */ + async channelServiceCycleFull(personaId: string): Promise<{ + should_process: boolean; + item: any | null; + channel: ActivityDomain | null; + wait_ms: number; + stats: ChannelRegistryStatus; + decision: CognitionDecision | null; + }> { + const response = await this.request({ + command: 'channel/service-cycle-full', + persona_id: personaId, + }); + + if (!response.success) { + throw new Error(response.error || 'Failed to run full service cycle'); + } + + const result = response.result; + return { + should_process: result.should_process, + item: result.item ?? null, + channel: result.channel ?? null, + wait_ms: Number(result.wait_ms), + stats: result.stats, + decision: result.decision ?? null, + }; + } + /** * Clear all channel queues for a persona. */ @@ -571,6 +612,117 @@ export class RustCoreIPCClient extends EventEmitter { } } + // ======================================================================== + // Memory Subsystem (Hippocampus in Rust β€” corpus-based, no SQL) + // ======================================================================== + + /** + * Load a persona's full memory corpus into Rust's in-memory cache. + * Called at persona startup β€” sends all memories + timeline events from TS ORM. + * Subsequent recall operations run on this cached corpus. + */ + async memoryLoadCorpus( + personaId: string, + memories: CorpusMemory[], + events: CorpusTimelineEvent[] + ): Promise { + const response = await this.request({ + command: 'memory/load-corpus', + persona_id: personaId, + memories, + events, + }); + + if (!response.success) { + throw new Error(response.error || 'Failed to load memory corpus'); + } + + return response.result as LoadCorpusResponse; + } + + /** + * Append a single memory to the cached corpus (incremental update). + * Called after Hippocampus stores a new memory to the DB. + * Keeps Rust cache coherent with the ORM without full reload. + */ + async memoryAppendMemory( + personaId: string, + memory: CorpusMemory + ): Promise { + const response = await this.request({ + command: 'memory/append-memory', + persona_id: personaId, + memory, + }); + + if (!response.success) { + throw new Error(response.error || 'Failed to append memory to corpus'); + } + } + + /** + * Append a single timeline event to the cached corpus (incremental update). + */ + async memoryAppendEvent( + personaId: string, + event: CorpusTimelineEvent + ): Promise { + const response = await this.request({ + command: 'memory/append-event', + persona_id: personaId, + event, + }); + + if (!response.success) { + throw new Error(response.error || 'Failed to append event to corpus'); + } + } + + /** + * 6-layer parallel multi-recall (the big improvement) + */ + async memoryMultiLayerRecall( + personaId: string, + params: MultiLayerRecallRequest + ): Promise { + const response = await this.request({ + command: 'memory/multi-layer-recall', + persona_id: personaId, + ...params, + }); + + if (!response.success) { + throw new Error(response.error || 'Failed to run multi-layer recall'); + } + + return response.result as MemoryRecallResponse; + } + + /** + * Build consciousness context for RAG injection + * Replaces UnifiedConsciousness.getContext() in TS + */ + async memoryConsciousnessContext( + personaId: string, + roomId: string, + currentMessage?: string, + skipSemanticSearch?: boolean + ): Promise { + const response = await this.request({ + command: 'memory/consciousness-context', + persona_id: personaId, + room_id: roomId, + current_message: currentMessage ?? null, + skip_semantic_search: skipSemanticSearch ?? false, + }); + + if (!response.success) { + throw new Error(response.error || 'Failed to build consciousness context'); + } + + return response.result as ConsciousnessContextResponse; + } + /** * Disconnect from server */ diff --git a/src/debug/jtag/workers/continuum-core/bindings/TemporalInfo.ts b/src/debug/jtag/workers/continuum-core/bindings/TemporalInfo.ts new file mode 100644 index 000000000..7c240d99d --- /dev/null +++ b/src/debug/jtag/workers/continuum-core/bindings/TemporalInfo.ts @@ -0,0 +1,6 @@ +// This file was generated by [ts-rs](https://github.com/Aleph-Alpha/ts-rs). Do not edit this file manually. + +/** + * Temporal continuity information β€” "what was I doing before?" + */ +export type TemporalInfo = { last_active_context: string | null, last_active_context_name: string | null, time_away_ms: bigint, was_interrupted: boolean, interrupted_task: string | null, }; diff --git a/src/debug/jtag/workers/continuum-core/bindings/TimelineEvent.ts b/src/debug/jtag/workers/continuum-core/bindings/TimelineEvent.ts new file mode 100644 index 000000000..f24426135 --- /dev/null +++ b/src/debug/jtag/workers/continuum-core/bindings/TimelineEvent.ts @@ -0,0 +1,6 @@ +// This file was generated by [ts-rs](https://github.com/Aleph-Alpha/ts-rs). Do not edit this file manually. + +/** + * A timeline event β€” records cross-context activity for consciousness. + */ +export type TimelineEvent = { id: string, persona_id: string, timestamp: string, context_type: string, context_id: string, context_name: string, event_type: string, actor_id: string, actor_name: string, content: string, importance: number, topics: Array, }; diff --git a/src/debug/jtag/workers/continuum-core/src/ipc/mod.rs b/src/debug/jtag/workers/continuum-core/src/ipc/mod.rs index c488955d6..6c03a187d 100644 --- a/src/debug/jtag/workers/continuum-core/src/ipc/mod.rs +++ b/src/debug/jtag/workers/continuum-core/src/ipc/mod.rs @@ -15,12 +15,12 @@ use crate::logging::TimingGuard; use ts_rs::TS; use crate::{log_debug, log_info, log_error}; use serde::{Deserialize, Serialize}; -use std::collections::HashMap; use std::io::{BufRead, BufReader, Write}; use std::os::unix::net::{UnixListener, UnixStream}; use std::path::Path; -use std::sync::{Arc, Mutex}; +use std::sync::Arc; use uuid::Uuid; +use dashmap::DashMap; // ============================================================================ // Response Field Names - Single Source of Truth @@ -220,12 +220,70 @@ enum Request { persona_id: String, }, + /// Service cycle + fast-path decision in ONE call. + /// Eliminates a separate IPC round-trip for fastPathDecision. + /// Returns: service_cycle result + optional cognition decision. + #[serde(rename = "channel/service-cycle-full")] + ChannelServiceCycleFull { + persona_id: String, + }, + /// Clear all channel queues #[serde(rename = "channel/clear")] ChannelClear { persona_id: String, }, + // ======================================================================== + // Memory / Hippocampus Commands + // ======================================================================== + + /// Load a persona's memory corpus from the TS ORM. + /// Rust is a pure compute engine β€” data comes from the ORM via IPC. + #[serde(rename = "memory/load-corpus")] + MemoryLoadCorpus { + persona_id: String, + memories: Vec, + events: Vec, + }, + + /// 6-layer parallel multi-recall β€” the improved recall algorithm. + /// Operates on in-memory MemoryCorpus data. Zero SQL. + #[serde(rename = "memory/multi-layer-recall")] + MemoryMultiLayerRecall { + persona_id: String, + query_text: Option, + room_id: String, + max_results: usize, + layers: Option>, + }, + + /// Build consciousness context (temporal + cross-context + intentions). + /// Operates on in-memory MemoryCorpus data. Zero SQL. + #[serde(rename = "memory/consciousness-context")] + MemoryConsciousnessContext { + persona_id: String, + room_id: String, + current_message: Option, + skip_semantic_search: bool, + }, + + /// Append a single memory to a persona's cached corpus. + /// Copy-on-write: O(n) clone, but appends are rare (~1/min/persona). + /// Keeps Rust cache coherent with the TS ORM without full reload. + #[serde(rename = "memory/append-memory")] + MemoryAppendMemory { + persona_id: String, + memory: crate::memory::CorpusMemory, + }, + + /// Append a single timeline event to a persona's cached corpus. + #[serde(rename = "memory/append-event")] + MemoryAppendEvent { + persona_id: String, + event: crate::memory::CorpusTimelineEvent, + }, + #[serde(rename = "health-check")] HealthCheck, @@ -276,9 +334,13 @@ impl Response { struct ServerState { voice_service: Arc, - inboxes: Arc>>, - cognition_engines: Arc>>, - channel_registries: Arc>>, + /// Per-persona inboxes β€” DashMap for per-key locking (no cross-persona contention). + inboxes: Arc>, + /// Per-persona cognition engines β€” DashMap: all hot-path ops are &self (read-only). + cognition_engines: Arc>, + /// Per-persona channel registries + state β€” DashMap: hot-path ops are &mut self. + /// 14 personas across DashMap's shards = near-zero contention. + channel_registries: Arc>, rag_engine: Arc, /// Shared CallManager for direct audio injection (speak-in-call). /// Audio never leaves Rust β€” IPC only returns metadata. @@ -288,19 +350,27 @@ struct ServerState { audio_pool: Arc, /// Tokio runtime handle for calling async CallManager methods from IPC threads. rt_handle: tokio::runtime::Handle, + /// Per-persona memory manager β€” pure compute on in-memory MemoryCorpus. + /// Data comes from the TS ORM via IPC. Zero SQL access. + memory_manager: Arc, } impl ServerState { - fn new(call_manager: Arc, rt_handle: tokio::runtime::Handle) -> Self { + fn new( + call_manager: Arc, + rt_handle: tokio::runtime::Handle, + memory_manager: Arc, + ) -> Self { Self { voice_service: Arc::new(crate::voice::voice_service::VoiceService::new()), - inboxes: Arc::new(Mutex::new(HashMap::new())), - cognition_engines: Arc::new(Mutex::new(HashMap::new())), - channel_registries: Arc::new(Mutex::new(HashMap::new())), + inboxes: Arc::new(DashMap::new()), + cognition_engines: Arc::new(DashMap::new()), + channel_registries: Arc::new(DashMap::new()), rag_engine: Arc::new(RagEngine::new()), call_manager, audio_pool: Arc::new(crate::voice::audio_buffer::AudioBufferPool::new()), rt_handle, + memory_manager, } } @@ -615,11 +685,7 @@ impl ServerState { }; let inbox = PersonaInbox::new(persona_uuid); - let mut inboxes = match self.inboxes.lock() { - Ok(i) => i, - Err(e) => return HandleResult::Json(Response::error(format!("Lock poisoned: {e}"))), - }; - inboxes.insert(persona_uuid, inbox); + self.inboxes.insert(persona_uuid, inbox); HandleResult::Json(Response::success(serde_json::json!({ "created": true }))) } @@ -644,11 +710,7 @@ impl ServerState { shutdown_rx, ); - let mut engines = match self.cognition_engines.lock() { - Ok(e) => e, - Err(e) => return HandleResult::Json(Response::error(format!("Lock poisoned: {e}"))), - }; - engines.insert(persona_uuid, engine); + self.cognition_engines.insert(persona_uuid, engine); log_info!("ipc", "cognition", "Created cognition engine for {}", persona_id); HandleResult::Json(Response::success(serde_json::json!({ "created": true }))) @@ -677,12 +739,7 @@ impl ServerState { _ => return HandleResult::Json(Response::error(format!("Invalid sender_type: {}", sender_type))), }; - let engines = match self.cognition_engines.lock() { - Ok(e) => e, - Err(e) => return HandleResult::Json(Response::error(format!("Lock poisoned: {e}"))), - }; - - let engine = match engines.get(&persona_uuid) { + let engine = match self.cognition_engines.get(&persona_uuid) { Some(e) => e, None => return HandleResult::Json(Response::error(format!("No cognition engine for {}", persona_id))), }; @@ -714,12 +771,7 @@ impl ServerState { Err(e) => return HandleResult::Json(Response::error(e)), }; - let engines = match self.cognition_engines.lock() { - Ok(e) => e, - Err(e) => return HandleResult::Json(Response::error(format!("Lock poisoned: {e}"))), - }; - - let engine = match engines.get(&persona_uuid) { + let engine = match self.cognition_engines.get(&persona_uuid) { Some(e) => e, None => return HandleResult::Json(Response::error(format!("No cognition engine for {}", persona_id))), }; @@ -748,12 +800,7 @@ impl ServerState { Err(e) => return HandleResult::Json(Response::error(e)), }; - let engines = match self.cognition_engines.lock() { - Ok(e) => e, - Err(e) => return HandleResult::Json(Response::error(format!("Lock poisoned: {e}"))), - }; - - let engine = match engines.get(&persona_uuid) { + let engine = match self.cognition_engines.get(&persona_uuid) { Some(e) => e, None => return HandleResult::Json(Response::error(format!("No cognition engine for {}", persona_id))), }; @@ -771,12 +818,7 @@ impl ServerState { Err(e) => return HandleResult::Json(Response::error(format!("Invalid persona_id: {e}"))), }; - let engines = match self.cognition_engines.lock() { - Ok(e) => e, - Err(e) => return HandleResult::Json(Response::error(format!("Lock poisoned: {e}"))), - }; - - let engine = match engines.get(&persona_uuid) { + let engine = match self.cognition_engines.get(&persona_uuid) { Some(e) => e, None => return HandleResult::Json(Response::error(format!("No cognition engine for {}", persona_id))), }; @@ -812,14 +854,10 @@ impl ServerState { Err(e) => return HandleResult::Json(Response::error(e)), }; - let mut registries = match self.channel_registries.lock() { - Ok(r) => r, - Err(e) => return HandleResult::Json(Response::error(format!("Lock poisoned: {e}"))), - }; - - let (registry, _state) = registries + let mut entry = self.channel_registries .entry(persona_uuid) .or_insert_with(|| (ChannelRegistry::new(), PersonaState::new())); + let (registry, _state) = entry.value_mut(); match registry.route(queue_item) { Ok(domain) => { @@ -841,15 +879,11 @@ impl ServerState { Err(e) => return HandleResult::Json(Response::error(format!("Invalid persona_id: {e}"))), }; - let mut registries = match self.channel_registries.lock() { - Ok(r) => r, - Err(e) => return HandleResult::Json(Response::error(format!("Lock poisoned: {e}"))), - }; - - let (registry, _state) = match registries.get_mut(&persona_uuid) { + let mut entry = match self.channel_registries.get_mut(&persona_uuid) { Some(r) => r, None => return HandleResult::Json(Response::error(format!("No channel registry for {persona_id}"))), }; + let (registry, _state) = entry.value_mut(); // Parse optional domain filter let target_domain: Option = match &domain { @@ -898,12 +932,7 @@ impl ServerState { Err(e) => return HandleResult::Json(Response::error(format!("Invalid persona_id: {e}"))), }; - let registries = match self.channel_registries.lock() { - Ok(r) => r, - Err(e) => return HandleResult::Json(Response::error(format!("Lock poisoned: {e}"))), - }; - - let (registry, _state) = match registries.get(&persona_uuid) { + let entry = match self.channel_registries.get(&persona_uuid) { Some(r) => r, None => { // Return empty status if no registry exists yet @@ -915,6 +944,7 @@ impl ServerState { }))); } }; + let (registry, _state) = entry.value(); let status = registry.status(); HandleResult::Json(Response::success(serde_json::to_value(&status).unwrap_or_default())) @@ -928,39 +958,216 @@ impl ServerState { Err(e) => return HandleResult::Json(Response::error(format!("Invalid persona_id: {e}"))), }; - let mut registries = match self.channel_registries.lock() { - Ok(r) => r, - Err(e) => return HandleResult::Json(Response::error(format!("Lock poisoned: {e}"))), - }; - - let (registry, state) = registries + let mut entry = self.channel_registries .entry(persona_uuid) .or_insert_with(|| (ChannelRegistry::new(), PersonaState::new())); + let (registry, state) = entry.value_mut(); let result = registry.service_cycle(state); HandleResult::Json(Response::success(serde_json::to_value(&result).unwrap_or_default())) } - Request::ChannelClear { persona_id } => { - let _timer = TimingGuard::new("ipc", "channel_clear"); + Request::ChannelServiceCycleFull { persona_id } => { + let _timer = TimingGuard::new("ipc", "channel_service_cycle_full"); let persona_uuid = match Uuid::parse_str(&persona_id) { Ok(u) => u, Err(e) => return HandleResult::Json(Response::error(format!("Invalid persona_id: {e}"))), }; - let mut registries = match self.channel_registries.lock() { - Ok(r) => r, - Err(e) => return HandleResult::Json(Response::error(format!("Lock poisoned: {e}"))), + // Step 1: Service cycle β€” consolidate, schedule, return next item + let mut entry = self.channel_registries + .entry(persona_uuid) + .or_insert_with(|| (ChannelRegistry::new(), PersonaState::new())); + let (registry, state) = entry.value_mut(); + let service_result = registry.service_cycle(state); + drop(entry); // Release channel_registries lock before acquiring cognition_engines + + // Step 2: If item returned, run fast_path_decision in the SAME IPC call + let decision = if service_result.should_process { + if let Some(ref item_json) = service_result.item { + // Reconstruct InboxMessage from queue item JSON + let id = item_json.get("id") + .and_then(|v| v.as_str()) + .and_then(|s| Uuid::parse_str(s).ok()) + .unwrap_or_default(); + let sender_id = item_json.get("senderId") + .and_then(|v| v.as_str()) + .and_then(|s| Uuid::parse_str(s).ok()) + .unwrap_or_default(); + let room_id = item_json.get("roomId") + .and_then(|v| v.as_str()) + .and_then(|s| Uuid::parse_str(s).ok()) + .unwrap_or_default(); + let sender_name = item_json.get("senderName") + .and_then(|v| v.as_str()) + .unwrap_or("Unknown") + .to_string(); + let sender_type_str = item_json.get("senderType") + .and_then(|v| v.as_str()) + .unwrap_or("system"); + let content = item_json.get("content") + .and_then(|v| v.as_str()) + .unwrap_or("") + .to_string(); + let priority = item_json.get("priority") + .and_then(|v| v.as_f64()) + .unwrap_or(0.5) as f32; + let timestamp = item_json.get("timestamp") + .and_then(|v| v.as_u64()) + .unwrap_or(0); + + let sender_type = match sender_type_str { + "human" => SenderType::Human, + "persona" => SenderType::Persona, + "agent" => SenderType::Agent, + _ => SenderType::System, + }; + + let inbox_msg = InboxMessage { + id, + room_id, + sender_id, + sender_name, + sender_type, + content, + timestamp, + priority, + source_modality: None, + voice_session_id: None, + }; + + // Run fast_path_decision on cognition engine + if let Some(engine) = self.cognition_engines.get(&persona_uuid) { + let d = engine.fast_path_decision(&inbox_msg); + Some(serde_json::json!({ + "should_respond": d.should_respond, + "confidence": d.confidence, + "reason": d.reason, + "decision_time_ms": d.decision_time_ms, + "fast_path_used": d.fast_path_used, + })) + } else { + None + } + } else { + None + } + } else { + None + }; + + // Return combined result: service cycle + optional decision + let mut result_json = serde_json::to_value(&service_result).unwrap_or_default(); + if let Some(decision_val) = decision { + result_json["decision"] = decision_val; + } + HandleResult::Json(Response::success(result_json)) + } + + Request::ChannelClear { persona_id } => { + let _timer = TimingGuard::new("ipc", "channel_clear"); + + let persona_uuid = match Uuid::parse_str(&persona_id) { + Ok(u) => u, + Err(e) => return HandleResult::Json(Response::error(format!("Invalid persona_id: {e}"))), }; - if let Some((registry, _state)) = registries.get_mut(&persona_uuid) { + if let Some(mut entry) = self.channel_registries.get_mut(&persona_uuid) { + let (registry, _state) = entry.value_mut(); registry.clear_all(); } HandleResult::Json(Response::success(serde_json::json!({ "cleared": true }))) } + // ================================================================ + // Memory / Hippocampus Handlers + // ================================================================ + + Request::MemoryLoadCorpus { persona_id, memories, events } => { + let _timer = TimingGuard::new("ipc", "memory_load_corpus"); + + let resp = self.memory_manager.load_corpus(&persona_id, memories, events); + log_info!( + "ipc", "memory_load_corpus", + "Loaded corpus for {}: {} memories ({} embedded), {} events ({} embedded), {:.1}ms", + persona_id, resp.memory_count, resp.embedded_memory_count, + resp.timeline_event_count, resp.embedded_event_count, resp.load_time_ms + ); + HandleResult::Json(Response::success(serde_json::to_value(&resp).unwrap_or_default())) + } + + Request::MemoryMultiLayerRecall { persona_id, query_text, room_id, max_results, layers } => { + let _timer = TimingGuard::new("ipc", "memory_multi_layer_recall"); + + let req = crate::memory::MultiLayerRecallRequest { + query_text, + room_id, + max_results, + layers, + }; + + HandleResult::Json(match self.memory_manager.multi_layer_recall(&persona_id, &req) { + Ok(resp) => { + log_info!( + "ipc", "memory_multi_layer_recall", + "Multi-layer recall for {}: {} memories in {:.1}ms ({} candidates from {} layers)", + persona_id, resp.memories.len(), resp.recall_time_ms, + resp.total_candidates, resp.layer_timings.len() + ); + Response::success(serde_json::to_value(&resp).unwrap_or_default()) + } + Err(e) => Response::error(format!("memory/multi-layer-recall failed: {e}")), + }) + } + + Request::MemoryConsciousnessContext { persona_id, room_id, current_message, skip_semantic_search } => { + let _timer = TimingGuard::new("ipc", "memory_consciousness_context"); + + let req = crate::memory::ConsciousnessContextRequest { + room_id, + current_message, + skip_semantic_search, + }; + + HandleResult::Json(match self.memory_manager.consciousness_context(&persona_id, &req) { + Ok(resp) => { + log_info!( + "ipc", "memory_consciousness_context", + "Consciousness context for {}: {:.1}ms, {} cross-context events, {} intentions", + persona_id, resp.build_time_ms, resp.cross_context_event_count, resp.active_intention_count + ); + Response::success(serde_json::to_value(&resp).unwrap_or_default()) + } + Err(e) => Response::error(format!("memory/consciousness-context failed: {e}")), + }) + } + + Request::MemoryAppendMemory { persona_id, memory } => { + let _timer = TimingGuard::new("ipc", "memory_append_memory"); + + HandleResult::Json(match self.memory_manager.append_memory(&persona_id, memory) { + Ok(()) => { + log_debug!("ipc", "memory_append_memory", "Appended memory to corpus for {}", persona_id); + Response::success(serde_json::json!({ "appended": true })) + } + Err(e) => Response::error(format!("memory/append-memory failed: {e}")), + }) + } + + Request::MemoryAppendEvent { persona_id, event } => { + let _timer = TimingGuard::new("ipc", "memory_append_event"); + + HandleResult::Json(match self.memory_manager.append_event(&persona_id, event) { + Ok(()) => { + log_debug!("ipc", "memory_append_event", "Appended event to corpus for {}", persona_id); + Response::success(serde_json::json!({ "appended": true })) + } + Err(e) => Response::error(format!("memory/append-event failed: {e}")), + }) + } + Request::HealthCheck => { HandleResult::Json(Response::success(serde_json::json!({ "healthy": true }))) } @@ -1534,6 +1741,7 @@ pub fn start_server( socket_path: &str, call_manager: Arc, rt_handle: tokio::runtime::Handle, + memory_manager: Arc, ) -> std::io::Result<()> { // Remove socket file if it exists if Path::new(socket_path).exists() { @@ -1543,7 +1751,7 @@ pub fn start_server( log_info!("ipc", "server", "Starting IPC server on {}", socket_path); let listener = UnixListener::bind(socket_path)?; - let state = Arc::new(ServerState::new(call_manager, rt_handle)); + let state = Arc::new(ServerState::new(call_manager, rt_handle, memory_manager)); log_info!("ipc", "server", "IPC server ready"); diff --git a/src/debug/jtag/workers/continuum-core/src/lib.rs b/src/debug/jtag/workers/continuum-core/src/lib.rs index abc3ac0cf..9bcf967f7 100644 --- a/src/debug/jtag/workers/continuum-core/src/lib.rs +++ b/src/debug/jtag/workers/continuum-core/src/lib.rs @@ -19,6 +19,7 @@ pub mod ipc; pub mod ffi; pub mod utils; pub mod rag; +pub mod memory; pub use audio_constants::*; diff --git a/src/debug/jtag/workers/continuum-core/src/logging/timing.rs b/src/debug/jtag/workers/continuum-core/src/logging/timing.rs index 00e8ea64f..b743aa6f9 100644 --- a/src/debug/jtag/workers/continuum-core/src/logging/timing.rs +++ b/src/debug/jtag/workers/continuum-core/src/logging/timing.rs @@ -104,9 +104,10 @@ impl Drop for TimingGuard { /// /// Usage: /// ``` +/// use continuum_core::time_section; /// time_section!("voice", "utterance_processing", { -/// // Your code here -/// process_utterance(event); +/// // timed code here +/// let _ = 1 + 1; /// }); /// ``` #[macro_export] @@ -121,9 +122,12 @@ macro_rules! time_section { /// /// Usage: /// ``` -/// let result = time_async!("voice", "arbitration", async { -/// select_responder(event, candidates).await -/// }); +/// use continuum_core::time_async; +/// async fn example() { +/// let result = time_async!("voice", "arbitration", async { +/// 42 +/// }); +/// } /// ``` #[macro_export] macro_rules! time_async { diff --git a/src/debug/jtag/workers/continuum-core/src/main.rs b/src/debug/jtag/workers/continuum-core/src/main.rs index edbabc79d..f98002543 100644 --- a/src/debug/jtag/workers/continuum-core/src/main.rs +++ b/src/debug/jtag/workers/continuum-core/src/main.rs @@ -9,6 +9,7 @@ /// Example: continuum-core-server /tmp/continuum-core.sock /tmp/jtag-logger-worker.sock use continuum_core::{init_logger, start_server, CallManager}; +use continuum_core::memory::{EmbeddingProvider, FastEmbedProvider, PersonaMemoryManager}; use std::env; use std::sync::Arc; use tracing::{info, Level}; @@ -60,13 +61,32 @@ async fn main() -> Result<(), Box> { // Audio never leaves the Rust process. let call_manager = Arc::new(CallManager::new()); + // Initialize Hippocampus memory subsystem β€” inline embedding for query vectors. + // Rust is a pure compute engine. Memory data comes from the TS ORM via IPC. + // Embedding model loads once (~100ms), then ~5ms per embed (no IPC hop). + info!("🧠 Initializing Hippocampus embedding provider..."); + let embedding_provider: Arc = match FastEmbedProvider::new() { + Ok(provider) => { + info!("βœ… Hippocampus embedding ready: {} ({}D)", provider.name(), provider.dimensions()); + Arc::new(provider) + } + Err(e) => { + tracing::error!("❌ Failed to load embedding model: {}", e); + tracing::error!(" Memory operations will not have semantic search."); + tracing::error!(" Ensure fastembed model cache is available."); + std::process::exit(1); + } + }; + let memory_manager = Arc::new(PersonaMemoryManager::new(embedding_provider)); + // Capture tokio runtime handle for IPC thread to call async CallManager methods let rt_handle = tokio::runtime::Handle::current(); // Start IPC server in background thread FIRST (creates socket immediately) let ipc_call_manager = call_manager.clone(); + let ipc_memory_manager = memory_manager.clone(); let ipc_handle = std::thread::spawn(move || { - if let Err(e) = start_server(&socket_path, ipc_call_manager, rt_handle) { + if let Err(e) = start_server(&socket_path, ipc_call_manager, rt_handle, ipc_memory_manager) { tracing::error!("❌ IPC server error: {}", e); } }); diff --git a/src/debug/jtag/workers/continuum-core/src/memory/cache.rs b/src/debug/jtag/workers/continuum-core/src/memory/cache.rs new file mode 100644 index 000000000..525a58b32 --- /dev/null +++ b/src/debug/jtag/workers/continuum-core/src/memory/cache.rs @@ -0,0 +1,140 @@ +//! TTL-based memory cache β€” per-persona caching for hot data. +//! +//! Avoids redundant SQLite queries for frequently accessed data: +//! - Core memories (importance >= 0.8) β€” cached 30s +//! - Consciousness context β€” cached 30s +//! - Embedding vectors β€” cached until invalidated + +use parking_lot::Mutex; +use std::collections::HashMap; +use std::time::{Duration, Instant}; + +// ─── MemoryCache ─────────────────────────────────────────────────────────────── + +/// Thread-safe TTL cache with automatic expiry. +/// Clone bound on T because values are returned by clone (cache retains ownership). +pub struct MemoryCache { + entries: Mutex>>, + ttl: Duration, +} + +struct CacheEntry { + value: T, + inserted_at: Instant, +} + +impl MemoryCache { + pub fn new(ttl: Duration) -> Self { + Self { + entries: Mutex::new(HashMap::new()), + ttl, + } + } + + /// Get a cached value if it exists and hasn't expired. + pub fn get(&self, key: &str) -> Option { + let entries = self.entries.lock(); + entries.get(key).and_then(|entry| { + if entry.inserted_at.elapsed() < self.ttl { + Some(entry.value.clone()) + } else { + None + } + }) + } + + /// Store a value in the cache. + pub fn set(&self, key: String, value: T) { + let mut entries = self.entries.lock(); + entries.insert( + key, + CacheEntry { + value, + inserted_at: Instant::now(), + }, + ); + } + + /// Remove a specific key. + pub fn invalidate(&self, key: &str) { + let mut entries = self.entries.lock(); + entries.remove(key); + } + + /// Remove all entries. + pub fn clear(&self) { + let mut entries = self.entries.lock(); + entries.clear(); + } + + /// Evict expired entries (call periodically to free memory). + pub fn evict_expired(&self) { + let ttl = self.ttl; + let mut entries = self.entries.lock(); + entries.retain(|_, entry| entry.inserted_at.elapsed() < ttl); + } + + /// Number of entries (including expired ones not yet evicted). + pub fn len(&self) -> usize { + self.entries.lock().len() + } +} + +// ─── Tests ───────────────────────────────────────────────────────────────────── + +#[cfg(test)] +mod tests { + use super::*; + + #[test] + fn test_cache_get_set() { + let cache = MemoryCache::new(Duration::from_secs(60)); + cache.set("key1".to_string(), "value1".to_string()); + assert_eq!(cache.get("key1"), Some("value1".to_string())); + assert_eq!(cache.get("key2"), None); + } + + #[test] + fn test_cache_expiry() { + let cache = MemoryCache::new(Duration::from_millis(100)); + cache.set("key1".to_string(), "value1".to_string()); + assert_eq!(cache.get("key1"), Some("value1".to_string())); + + std::thread::sleep(Duration::from_millis(150)); + assert_eq!(cache.get("key1"), None); + } + + #[test] + fn test_cache_invalidate() { + let cache = MemoryCache::new(Duration::from_secs(60)); + cache.set("key1".to_string(), 42); + assert_eq!(cache.get("key1"), Some(42)); + + cache.invalidate("key1"); + assert_eq!(cache.get("key1"), None); + } + + #[test] + fn test_cache_evict_expired() { + let cache = MemoryCache::new(Duration::from_millis(100)); + cache.set("key1".to_string(), 1); + cache.set("key2".to_string(), 2); + assert_eq!(cache.len(), 2); + + std::thread::sleep(Duration::from_millis(150)); + cache.evict_expired(); + assert_eq!(cache.len(), 0); + } + + #[test] + fn test_cache_clear() { + let cache = MemoryCache::new(Duration::from_secs(60)); + cache.set("a".to_string(), 1); + cache.set("b".to_string(), 2); + cache.set("c".to_string(), 3); + assert_eq!(cache.len(), 3); + + cache.clear(); + assert_eq!(cache.len(), 0); + } +} diff --git a/src/debug/jtag/workers/continuum-core/src/memory/consciousness.rs b/src/debug/jtag/workers/continuum-core/src/memory/consciousness.rs new file mode 100644 index 000000000..f9572daa7 --- /dev/null +++ b/src/debug/jtag/workers/continuum-core/src/memory/consciousness.rs @@ -0,0 +1,235 @@ +//! Consciousness context builder β€” assembles RAG context from timeline + memory. +//! +//! Replaces TS UnifiedConsciousness.getContext() which times out due to +//! event loop saturation. All operations run on in-memory MemoryCorpus data. +//! +//! The consciousness context provides: +//! - Temporal continuity: "what was I doing before?" +//! - Cross-context awareness: "what happened in other rooms?" +//! - Active intentions: "what am I working on?" +//! - Peripheral activity: "is anything happening elsewhere?" + +use crate::memory::corpus::MemoryCorpus; +use crate::memory::timeline; +use crate::memory::types::*; +use std::time::Instant; + +// ─── Consciousness Context Builder ────────────────────────────────────────── + +/// Build a complete consciousness context for a persona in a specific room. +/// +/// All queries operate on the in-memory MemoryCorpus β€” no SQL, no filesystem. +/// Total target: <20ms (was 3+ seconds in TS). +pub fn build_consciousness_context( + corpus: &MemoryCorpus, + req: &ConsciousnessContextRequest, +) -> ConsciousnessContextResponse { + let start = Instant::now(); + + // 1. Temporal continuity + let temporal = timeline::build_temporal_info(corpus, &req.room_id); + + // 2. Cross-context events + let since_24h = chrono::Utc::now() + .checked_sub_signed(chrono::Duration::hours(24)) + .map(|t| t.to_rfc3339()) + .unwrap_or_default(); + + let cross_context_events = corpus.cross_context_events(&req.room_id, &since_24h, 10); + let cross_context_event_count = cross_context_events.len(); + + // 3. Active intentions + peripheral activity + let active_intention_count = timeline::count_active_intentions(corpus); + let has_peripheral = timeline::has_peripheral_activity(corpus, &req.room_id); + + // 4. Format prompt + let formatted_prompt = format_consciousness_prompt( + &temporal, + &cross_context_events, + active_intention_count, + has_peripheral, + ); + + let build_time_ms = start.elapsed().as_secs_f64() * 1000.0; + + ConsciousnessContextResponse { + formatted_prompt: if formatted_prompt.is_empty() { + None + } else { + Some(formatted_prompt) + }, + build_time_ms, + temporal, + cross_context_event_count, + active_intention_count, + has_peripheral_activity: has_peripheral, + } +} + +// ─── Prompt Formatting ─────────────────────────────────────────────────────── + +fn format_consciousness_prompt( + temporal: &TemporalInfo, + cross_context_events: &[&TimelineEvent], + active_intention_count: usize, + has_peripheral: bool, +) -> String { + let mut sections = Vec::new(); + + // Temporal continuity + if let Some(ref context_name) = temporal.last_active_context_name { + let away_desc = format_time_away(temporal.time_away_ms); + sections.push(format!( + "Last active in: #{} ({})", + context_name, away_desc + )); + + if temporal.was_interrupted { + if let Some(ref task) = temporal.interrupted_task { + sections.push(format!("Interrupted task: {}", task)); + } + } + } + + // Cross-context awareness + if !cross_context_events.is_empty() { + let event_summaries: Vec = cross_context_events + .iter() + .take(5) + .map(|e| { + format!( + "- [#{}] {}: {}", + e.context_name, + e.actor_name, + truncate_content(&e.content, 80) + ) + }) + .collect(); + sections.push(format!( + "Activity in other contexts:\n{}", + event_summaries.join("\n") + )); + } + + // Active intentions + if active_intention_count > 0 { + sections.push(format!( + "Active intentions: {} task(s) in progress", + active_intention_count + )); + } + + // Peripheral activity indicator + if has_peripheral { + sections.push("Background activity detected in other contexts.".into()); + } + + if sections.is_empty() { + return String::new(); + } + + format!("[CONSCIOUSNESS CONTEXT]\n{}", sections.join("\n")) +} + +fn format_time_away(ms: i64) -> String { + if ms < 0 { + return "just now".into(); + } + let seconds = ms / 1000; + let minutes = seconds / 60; + let hours = minutes / 60; + let days = hours / 24; + + if days > 0 { + format!("{} day(s) ago", days) + } else if hours > 0 { + format!("{} hour(s) ago", hours) + } else if minutes > 0 { + format!("{} minute(s) ago", minutes) + } else { + "just now".into() + } +} + +fn truncate_content(content: &str, max_len: usize) -> String { + if content.len() <= max_len { + content.to_string() + } else { + format!("{}...", &content[..max_len]) + } +} + +// ─── Tests ─────────────────────────────────────────────────────────────────── + +#[cfg(test)] +mod tests { + use super::*; + + #[test] + fn test_format_time_away() { + assert_eq!(format_time_away(0), "just now"); + assert_eq!(format_time_away(5000), "just now"); // 5s + assert_eq!(format_time_away(120_000), "2 minute(s) ago"); + assert_eq!(format_time_away(7_200_000), "2 hour(s) ago"); + assert_eq!(format_time_away(172_800_000), "2 day(s) ago"); + } + + #[test] + fn test_truncate_content() { + assert_eq!(truncate_content("short", 80), "short"); + let long = "x".repeat(100); + let truncated = truncate_content(&long, 80); + assert_eq!(truncated.len(), 83); // 80 + "..." + assert!(truncated.ends_with("...")); + } + + #[test] + fn test_format_consciousness_prompt_empty() { + let temporal = TemporalInfo { + last_active_context: None, + last_active_context_name: None, + time_away_ms: 0, + was_interrupted: false, + interrupted_task: None, + }; + let prompt = format_consciousness_prompt(&temporal, &[], 0, false); + assert!(prompt.is_empty()); + } + + #[test] + fn test_format_consciousness_prompt_full() { + let temporal = TemporalInfo { + last_active_context: Some("room-1".into()), + last_active_context_name: Some("general".into()), + time_away_ms: 300_000, // 5 minutes + was_interrupted: true, + interrupted_task: Some("Reviewing code changes".into()), + }; + + let events = vec![TimelineEvent { + id: "e1".into(), + persona_id: "p1".into(), + timestamp: "2025-01-01T00:00:00Z".into(), + context_type: "room".into(), + context_id: "room-2".into(), + context_name: "academy".into(), + event_type: "message_sent".into(), + actor_id: "u1".into(), + actor_name: "Joel".into(), + content: "Teaching a new concept".into(), + importance: 0.7, + topics: vec![], + }]; + + let event_refs: Vec<&TimelineEvent> = events.iter().collect(); + let prompt = format_consciousness_prompt(&temporal, &event_refs, 2, true); + assert!(prompt.contains("[CONSCIOUSNESS CONTEXT]")); + assert!(prompt.contains("Last active in: #general")); + assert!(prompt.contains("5 minute(s) ago")); + assert!(prompt.contains("Interrupted task: Reviewing code changes")); + assert!(prompt.contains("Activity in other contexts:")); + assert!(prompt.contains("[#academy]")); + assert!(prompt.contains("2 task(s) in progress")); + assert!(prompt.contains("Background activity detected")); + } +} diff --git a/src/debug/jtag/workers/continuum-core/src/memory/corpus.rs b/src/debug/jtag/workers/continuum-core/src/memory/corpus.rs new file mode 100644 index 000000000..ab4264ba1 --- /dev/null +++ b/src/debug/jtag/workers/continuum-core/src/memory/corpus.rs @@ -0,0 +1,422 @@ +//! MemoryCorpus β€” in-memory data container for ORM-provided memory data. +//! +//! Rust is a pure compute engine. Data comes from the TS ORM via IPC. +//! The corpus is cached per-persona and refreshed on demand. +//! +//! Architecture: TS ORM queries data β†’ sends to Rust via memory/load-corpus +//! β†’ Rust caches MemoryCorpus per persona β†’ recall layers operate on corpus. +//! Zero SQL. Zero filesystem access. Pure computation. + +use crate::memory::types::*; +use std::collections::HashMap; +use std::time::Instant; + +// ─── MemoryCorpus ───────────────────────────────────────────────────────────── + +/// In-memory corpus of a persona's memories and timeline events. +/// Loaded from the TS ORM via IPC, cached per-persona. +/// +/// All recall layers and consciousness builders operate on this data. +/// No SQL, no filesystem access β€” pure compute on in-memory data. +pub struct MemoryCorpus { + pub memories: Vec, + pub memory_embeddings: HashMap>, + pub timeline_events: Vec, + pub event_embeddings: HashMap>, + pub loaded_at: Instant, +} + +impl MemoryCorpus { + /// Create a corpus from ORM-provided data. + pub fn new( + memories: Vec, + memory_embeddings: HashMap>, + timeline_events: Vec, + event_embeddings: HashMap>, + ) -> Self { + Self { + memories, + memory_embeddings, + timeline_events, + event_embeddings, + loaded_at: Instant::now(), + } + } + + /// Create from corpus load request (CorpusMemory/CorpusTimelineEvent wrappers). + pub fn from_corpus_data( + corpus_memories: Vec, + corpus_events: Vec, + ) -> Self { + let mut memories = Vec::with_capacity(corpus_memories.len()); + let mut memory_embeddings = HashMap::with_capacity(corpus_memories.len()); + + for cm in corpus_memories { + if let Some(emb) = cm.embedding { + memory_embeddings.insert(cm.record.id.clone(), emb); + } + memories.push(cm.record); + } + + let mut timeline_events = Vec::with_capacity(corpus_events.len()); + let mut event_embeddings = HashMap::with_capacity(corpus_events.len()); + + for ce in corpus_events { + if let Some(emb) = ce.embedding { + event_embeddings.insert(ce.event.id.clone(), emb); + } + timeline_events.push(ce.event); + } + + Self { + memories, + memory_embeddings, + timeline_events, + event_embeddings, + loaded_at: Instant::now(), + } + } + + /// Empty corpus (no data loaded yet). + pub fn empty() -> Self { + Self { + memories: vec![], + memory_embeddings: HashMap::new(), + timeline_events: vec![], + event_embeddings: HashMap::new(), + loaded_at: Instant::now(), + } + } + + // ─── Memory Queries (used by recall layers) ───────────────────────────── + + /// All memories, sorted by importance DESC then timestamp DESC. + pub fn all_memories_sorted(&self) -> Vec<&MemoryRecord> { + let mut result: Vec<&MemoryRecord> = self.memories.iter().collect(); + result.sort_by(|a, b| { + b.importance + .partial_cmp(&a.importance) + .unwrap_or(std::cmp::Ordering::Equal) + .then_with(|| b.timestamp.cmp(&a.timestamp)) + }); + result + } + + /// Memories with importance >= threshold, sorted by importance DESC. + pub fn high_importance_memories(&self, threshold: f64, limit: usize) -> Vec<&MemoryRecord> { + let mut result: Vec<&MemoryRecord> = self + .memories + .iter() + .filter(|m| m.importance >= threshold) + .collect(); + result.sort_by(|a, b| { + b.importance + .partial_cmp(&a.importance) + .unwrap_or(std::cmp::Ordering::Equal) + }); + result.truncate(limit); + result + } + + /// Memories with their embeddings (for semantic search). + pub fn memories_with_embeddings(&self) -> Vec<(&MemoryRecord, &[f32])> { + self.memories + .iter() + .filter_map(|m| { + self.memory_embeddings + .get(&m.id) + .map(|e| (m, e.as_slice())) + }) + .collect() + } + + /// Recent memories (timestamp >= since), sorted by timestamp DESC. + pub fn recent_memories(&self, since: &str, limit: usize) -> Vec<&MemoryRecord> { + let mut result: Vec<&MemoryRecord> = self + .memories + .iter() + .filter(|m| m.timestamp.as_str() >= since) + .collect(); + result.sort_by(|a, b| b.timestamp.cmp(&a.timestamp)); + result.truncate(limit); + result + } + + /// Memories eligible for decay resurfacing (importance >= threshold). + /// Returns (memory, days_since_access). + pub fn decayable_memories( + &self, + min_importance: f64, + limit: usize, + ) -> Vec<(&MemoryRecord, f64)> { + let now = chrono::Utc::now(); + let mut result: Vec<(&MemoryRecord, f64)> = self + .memories + .iter() + .filter(|m| m.importance >= min_importance) + .map(|m| { + let access_time = m.last_accessed_at.as_deref().unwrap_or(&m.timestamp); + let days = chrono::DateTime::parse_from_rfc3339(access_time) + .map(|t| (now - t.with_timezone(&chrono::Utc)).num_hours() as f64 / 24.0) + .unwrap_or(0.0); + (m, days.max(0.0)) + }) + .collect(); + result.sort_by(|a, b| { + b.0.importance + .partial_cmp(&a.0.importance) + .unwrap_or(std::cmp::Ordering::Equal) + }); + result.truncate(limit); + result + } + + /// All memories up to a limit (sorted by importance DESC), for tag/content matching. + pub fn all_memories_limited(&self, limit: usize) -> Vec<&MemoryRecord> { + let mut result = self.all_memories_sorted(); + result.truncate(limit); + result + } + + // ─── Timeline Queries (used by consciousness/cross-context) ───────────── + + /// Timeline events NOT in the specified context, sorted by importance DESC. + pub fn cross_context_events( + &self, + exclude_context_id: &str, + since: &str, + limit: usize, + ) -> Vec<&TimelineEvent> { + let mut result: Vec<&TimelineEvent> = self + .timeline_events + .iter() + .filter(|e| e.context_id != exclude_context_id && e.timestamp.as_str() >= since) + .collect(); + result.sort_by(|a, b| { + b.importance + .partial_cmp(&a.importance) + .unwrap_or(std::cmp::Ordering::Equal) + .then_with(|| b.timestamp.cmp(&a.timestamp)) + }); + result.truncate(limit); + result + } + + /// Cross-context timeline events with their embeddings. + pub fn cross_context_events_with_embeddings( + &self, + exclude_context_id: &str, + since: &str, + limit: usize, + ) -> Vec<(&TimelineEvent, &[f32])> { + let mut result: Vec<(&TimelineEvent, &[f32])> = self + .timeline_events + .iter() + .filter(|e| e.context_id != exclude_context_id && e.timestamp.as_str() >= since) + .filter_map(|e| { + self.event_embeddings + .get(&e.id) + .map(|emb| (e, emb.as_slice())) + }) + .collect(); + result.sort_by(|a, b| b.0.timestamp.cmp(&a.0.timestamp)); + result.truncate(limit); + result + } + + /// Most recent event in a specific context. + pub fn last_event_in_context(&self, context_id: &str) -> Option<&TimelineEvent> { + self.timeline_events + .iter() + .filter(|e| e.context_id == context_id) + .max_by(|a, b| a.timestamp.cmp(&b.timestamp)) + } + + // ─── Copy-on-Write Append ───────────────────────────────────────────── + + /// Create a new corpus with an additional memory appended. + /// Copy-on-write: clones all data, pushes new memory, returns new corpus. + /// O(n) but appends are rare (~1/min/persona). Readers on old Arc unaffected. + pub fn with_appended_memory(&self, corpus_memory: CorpusMemory) -> Self { + let mut memories = self.memories.clone(); + let mut memory_embeddings = self.memory_embeddings.clone(); + + if let Some(emb) = corpus_memory.embedding { + memory_embeddings.insert(corpus_memory.record.id.clone(), emb); + } + memories.push(corpus_memory.record); + + Self { + memories, + memory_embeddings, + timeline_events: self.timeline_events.clone(), + event_embeddings: self.event_embeddings.clone(), + loaded_at: self.loaded_at, + } + } + + /// Create a new corpus with an additional timeline event appended. + /// Copy-on-write: clones all data, pushes new event, returns new corpus. + pub fn with_appended_event(&self, corpus_event: CorpusTimelineEvent) -> Self { + let mut timeline_events = self.timeline_events.clone(); + let mut event_embeddings = self.event_embeddings.clone(); + + if let Some(emb) = corpus_event.embedding { + event_embeddings.insert(corpus_event.event.id.clone(), emb); + } + timeline_events.push(corpus_event.event); + + Self { + memories: self.memories.clone(), + memory_embeddings: self.memory_embeddings.clone(), + timeline_events, + event_embeddings, + loaded_at: self.loaded_at, + } + } + + // ─── Timeline Queries (continued) ──────────────────────────────────── + + /// All timeline events within a time range, sorted by timestamp DESC. + pub fn events_since(&self, since: &str, limit: usize) -> Vec<&TimelineEvent> { + let mut result: Vec<&TimelineEvent> = self + .timeline_events + .iter() + .filter(|e| e.timestamp.as_str() >= since) + .collect(); + result.sort_by(|a, b| b.timestamp.cmp(&a.timestamp)); + result.truncate(limit); + result + } +} + +// ─── Tests ─────────────────────────────────────────────────────────────────── + +#[cfg(test)] +mod tests { + use super::*; + + fn make_memory(id: &str, content: &str, importance: f64, timestamp: &str) -> MemoryRecord { + MemoryRecord { + id: id.into(), + persona_id: "test".into(), + memory_type: "observation".into(), + content: content.into(), + context: serde_json::json!({}), + timestamp: timestamp.into(), + importance, + access_count: 0, + tags: vec![], + related_to: vec![], + source: None, + last_accessed_at: None, + layer: None, + relevance_score: None, + } + } + + fn make_event( + id: &str, + context_id: &str, + context_name: &str, + timestamp: &str, + importance: f64, + ) -> TimelineEvent { + TimelineEvent { + id: id.into(), + persona_id: "test".into(), + timestamp: timestamp.into(), + context_type: "room".into(), + context_id: context_id.into(), + context_name: context_name.into(), + event_type: "message".into(), + actor_id: "user1".into(), + actor_name: "User".into(), + content: "test content".into(), + importance, + topics: vec![], + } + } + + #[test] + fn test_empty_corpus() { + let corpus = MemoryCorpus::empty(); + assert!(corpus.memories.is_empty()); + assert!(corpus.timeline_events.is_empty()); + } + + #[test] + fn test_high_importance() { + let corpus = MemoryCorpus::new( + vec![ + make_memory("m1", "low", 0.3, "2025-01-01T00:00:00Z"), + make_memory("m2", "high", 0.9, "2025-01-01T00:00:00Z"), + make_memory("m3", "medium", 0.6, "2025-01-01T00:00:00Z"), + ], + HashMap::new(), + vec![], + HashMap::new(), + ); + + let high = corpus.high_importance_memories(0.8, 10); + assert_eq!(high.len(), 1); + assert_eq!(high[0].id, "m2"); + } + + #[test] + fn test_cross_context_events() { + let corpus = MemoryCorpus::new( + vec![], + HashMap::new(), + vec![ + make_event("e1", "room-1", "General", "2025-01-01T12:00:00Z", 0.7), + make_event("e2", "room-2", "Academy", "2025-01-01T13:00:00Z", 0.8), + make_event("e3", "room-1", "General", "2025-01-01T14:00:00Z", 0.6), + ], + HashMap::new(), + ); + + let events = corpus.cross_context_events("room-1", "2025-01-01T00:00:00Z", 10); + assert_eq!(events.len(), 1); + assert_eq!(events[0].context_id, "room-2"); + } + + #[test] + fn test_from_corpus_data() { + let memories = vec![CorpusMemory { + record: make_memory("m1", "test", 0.5, "2025-01-01T00:00:00Z"), + embedding: Some(vec![0.1, 0.2, 0.3]), + }]; + let events = vec![CorpusTimelineEvent { + event: make_event("e1", "room-1", "General", "2025-01-01T00:00:00Z", 0.6), + embedding: Some(vec![0.4, 0.5, 0.6]), + }]; + + let corpus = MemoryCorpus::from_corpus_data(memories, events); + assert_eq!(corpus.memories.len(), 1); + assert_eq!(corpus.memory_embeddings.len(), 1); + assert_eq!(corpus.timeline_events.len(), 1); + assert_eq!(corpus.event_embeddings.len(), 1); + } + + #[test] + fn test_last_event_in_context() { + let corpus = MemoryCorpus::new( + vec![], + HashMap::new(), + vec![ + make_event("e1", "room-1", "General", "2025-01-01T12:00:00Z", 0.7), + make_event("e2", "room-1", "General", "2025-01-01T14:00:00Z", 0.6), + make_event("e3", "room-2", "Academy", "2025-01-01T13:00:00Z", 0.8), + ], + HashMap::new(), + ); + + let last = corpus.last_event_in_context("room-1"); + assert!(last.is_some()); + assert_eq!(last.unwrap().id, "e2"); + + let none = corpus.last_event_in_context("room-nonexistent"); + assert!(none.is_none()); + } +} diff --git a/src/debug/jtag/workers/continuum-core/src/memory/embedding.rs b/src/debug/jtag/workers/continuum-core/src/memory/embedding.rs new file mode 100644 index 000000000..c253f519e --- /dev/null +++ b/src/debug/jtag/workers/continuum-core/src/memory/embedding.rs @@ -0,0 +1,326 @@ +//! Embedding provider β€” trait-based for pluggable models/backends. +//! +//! Default: fastembed AllMiniLML6V2 (384 dims, ~5ms per embed). +//! Loaded once in-process β€” no IPC hop, no socket call. +//! +//! Extension points (each a pluggable adapter): +//! - BGE models (768 dims, higher quality) +//! - Fine-tuned persona-specific embedding models +//! - Quantized models (faster, smaller footprint) +//! - Remote embedding APIs (OpenAI, Cohere) + +use std::fmt; + +// ─── Trait: EmbeddingProvider ────────────────────────────────────────────────── + +/// Pluggable embedding provider. +/// +/// Each implementation is a separate "adapter" β€” swap models without changing +/// any consuming code. Known future adapters: BGE-large, fine-tuned persona +/// embeddings, quantized variants. +pub trait EmbeddingProvider: Send + Sync { + fn name(&self) -> &str; + fn dimensions(&self) -> usize; + fn embed(&self, text: &str) -> Result, EmbeddingError>; + fn embed_batch(&self, texts: &[String]) -> Result>, EmbeddingError>; +} + +// ─── Error ───────────────────────────────────────────────────────────────────── + +#[derive(Debug)] +pub struct EmbeddingError(pub String); + +impl fmt::Display for EmbeddingError { + fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { + write!(f, "{}", self.0) + } +} + +impl std::error::Error for EmbeddingError {} + +// ─── FastEmbed Provider (default) ────────────────────────────────────────────── + +/// Default embedding provider: fastembed AllMiniLML6V2. +/// - 384 dimensions (same as TS embedding worker) +/// - ~5ms per embed (in-process ONNX, no network) +/// - Model cached at ~/.cache/fastembed or $FASTEMBED_CACHE_PATH +pub struct FastEmbedProvider { + model: fastembed::TextEmbedding, +} + +impl FastEmbedProvider { + pub fn new() -> Result { + // InitOptions is #[non_exhaustive] β€” must use Default + field mutation + let mut options = fastembed::InitOptions::default(); + options.model_name = fastembed::EmbeddingModel::AllMiniLML6V2; + options.show_download_progress = true; + + let model = fastembed::TextEmbedding::try_new(options) + .map_err(|e| EmbeddingError(format!("Failed to load AllMiniLML6V2: {e}")))?; + + Ok(Self { model }) + } +} + +impl EmbeddingProvider for FastEmbedProvider { + fn name(&self) -> &str { + "fastembed-allminilml6v2" + } + + fn dimensions(&self) -> usize { + 384 + } + + fn embed(&self, text: &str) -> Result, EmbeddingError> { + let results = self + .model + .embed(vec![text], None) + .map_err(|e| EmbeddingError(format!("Embed failed: {e}")))?; + results + .into_iter() + .next() + .ok_or_else(|| EmbeddingError("No embedding returned".into())) + } + + fn embed_batch(&self, texts: &[String]) -> Result>, EmbeddingError> { + if texts.is_empty() { + return Ok(vec![]); + } + self.model + .embed(texts.to_vec(), None) + .map_err(|e| EmbeddingError(format!("Batch embed failed: {e}"))) + } +} + +// ─── Vector Math ─────────────────────────────────────────────────────────────── + +/// Cosine similarity between two embedding vectors. +/// Returns 0.0 for zero-length or mismatched vectors. +/// Auto-vectorized by rustc in release mode (SIMD). +pub fn cosine_similarity(a: &[f32], b: &[f32]) -> f32 { + if a.len() != b.len() || a.is_empty() { + return 0.0; + } + + let mut dot = 0.0f32; + let mut norm_a = 0.0f32; + let mut norm_b = 0.0f32; + + for i in 0..a.len() { + dot += a[i] * b[i]; + norm_a += a[i] * a[i]; + norm_b += b[i] * b[i]; + } + + let denom = norm_a.sqrt() * norm_b.sqrt(); + if denom == 0.0 { + 0.0 + } else { + dot / denom + } +} + +// ─── Deterministic Embedding Provider (for testing) ─────────────────────────── + +/// Test embedding provider that produces deterministic, word-overlap-sensitive vectors. +/// +/// How it works: each word in the input text is hashed to a position in a 384-dim vector. +/// Texts sharing words produce overlapping vectors β†’ higher cosine similarity. +/// This enables testing semantic recall without loading a 50MB ONNX model. +/// +/// Properties: +/// - Identical texts β†’ identical vectors β†’ cosine similarity = 1.0 +/// - Texts sharing words β†’ partial overlap β†’ 0.0 < similarity < 1.0 +/// - Unrelated texts β†’ no overlap β†’ similarity β‰ˆ 0.0 +/// - Deterministic: same input always produces same output +pub struct DeterministicEmbeddingProvider; + +impl DeterministicEmbeddingProvider { + /// Simple hash: FNV-1a for deterministic word β†’ dimension mapping. + fn fnv1a_hash(word: &str) -> usize { + let mut hash: u64 = 0xcbf29ce484222325; + for byte in word.bytes() { + hash ^= byte as u64; + hash = hash.wrapping_mul(0x100000001b3); + } + hash as usize + } + + /// Embed text into a 384-dim vector by hashing words to positions. + fn embed_deterministic(text: &str) -> Vec { + let dims = 384; + let mut vec = vec![0.0f32; dims]; + + // Normalize: lowercase, split by whitespace and punctuation + let words: Vec = text + .to_lowercase() + .split(|c: char| !c.is_alphanumeric()) + .filter(|w| w.len() >= 2) + .map(|w| w.to_string()) + .collect(); + + if words.is_empty() { + return vec; + } + + // Each word contributes to 3 dimensions (spreading reduces collision) + for word in &words { + let base = Self::fnv1a_hash(word); + for offset in 0..3 { + let dim = (base.wrapping_add(offset * 7919)) % dims; + vec[dim] += 1.0; + } + } + + // L2-normalize so cosine similarity works correctly + let norm: f32 = vec.iter().map(|x| x * x).sum::().sqrt(); + if norm > 0.0 { + for v in &mut vec { + *v /= norm; + } + } + + vec + } +} + +impl EmbeddingProvider for DeterministicEmbeddingProvider { + fn name(&self) -> &str { + "deterministic-test" + } + + fn dimensions(&self) -> usize { + 384 + } + + fn embed(&self, text: &str) -> Result, EmbeddingError> { + Ok(Self::embed_deterministic(text)) + } + + fn embed_batch(&self, texts: &[String]) -> Result>, EmbeddingError> { + Ok(texts.iter().map(|t| Self::embed_deterministic(t)).collect()) + } +} + +// ─── Tests ───────────────────────────────────────────────────────────────────── + +#[cfg(test)] +mod tests { + use super::*; + + #[test] + fn test_cosine_similarity_identical() { + let v = vec![1.0, 2.0, 3.0]; + let sim = cosine_similarity(&v, &v); + assert!((sim - 1.0).abs() < 1e-6, "Identical vectors should have similarity 1.0"); + } + + #[test] + fn test_cosine_similarity_orthogonal() { + let a = vec![1.0, 0.0]; + let b = vec![0.0, 1.0]; + let sim = cosine_similarity(&a, &b); + assert!(sim.abs() < 1e-6, "Orthogonal vectors should have similarity 0.0"); + } + + #[test] + fn test_cosine_similarity_opposite() { + let a = vec![1.0, 2.0, 3.0]; + let b = vec![-1.0, -2.0, -3.0]; + let sim = cosine_similarity(&a, &b); + assert!((sim + 1.0).abs() < 1e-6, "Opposite vectors should have similarity -1.0"); + } + + #[test] + fn test_cosine_similarity_empty() { + let sim = cosine_similarity(&[], &[]); + assert_eq!(sim, 0.0); + } + + #[test] + fn test_cosine_similarity_mismatched() { + let a = vec![1.0, 2.0]; + let b = vec![1.0, 2.0, 3.0]; + let sim = cosine_similarity(&a, &b); + assert_eq!(sim, 0.0); + } + + // ─── DeterministicEmbeddingProvider Tests ───────────────────────────────── + + #[test] + fn test_deterministic_identical_texts() { + let provider = DeterministicEmbeddingProvider; + let a = provider.embed("Rust borrow checker rules").unwrap(); + let b = provider.embed("Rust borrow checker rules").unwrap(); + let sim = cosine_similarity(&a, &b); + assert!( + (sim - 1.0).abs() < 1e-6, + "Identical texts should produce similarity 1.0, got {sim}" + ); + } + + #[test] + fn test_deterministic_similar_texts() { + let provider = DeterministicEmbeddingProvider; + let a = provider.embed("Rust borrow checker rules").unwrap(); + let b = provider.embed("Rust ownership and borrow system").unwrap(); + let sim = cosine_similarity(&a, &b); + assert!( + sim > 0.2, + "Texts sharing 'rust' and 'borrow' should have meaningful similarity, got {sim}" + ); + } + + #[test] + fn test_deterministic_unrelated_texts() { + let provider = DeterministicEmbeddingProvider; + let a = provider.embed("Rust borrow checker rules").unwrap(); + let b = provider.embed("Purple elephants dance at midnight").unwrap(); + let sim = cosine_similarity(&a, &b); + assert!( + sim < 0.15, + "Unrelated texts should have low similarity, got {sim}" + ); + } + + #[test] + fn test_deterministic_dimension_count() { + let provider = DeterministicEmbeddingProvider; + let v = provider.embed("test text").unwrap(); + assert_eq!(v.len(), 384); + assert_eq!(provider.dimensions(), 384); + } + + #[test] + fn test_deterministic_batch_consistency() { + let provider = DeterministicEmbeddingProvider; + let single = provider.embed("hello world").unwrap(); + let batch = provider + .embed_batch(&["hello world".to_string()]) + .unwrap(); + assert_eq!(single, batch[0], "Single and batch embed should produce identical vectors"); + } + + #[test] + fn test_deterministic_similarity_gradient() { + // Verify similarity ordering: identical > similar > unrelated + let provider = DeterministicEmbeddingProvider; + let base = provider.embed("learning Rust memory management").unwrap(); + let identical = provider.embed("learning Rust memory management").unwrap(); + let similar = provider.embed("understanding Rust memory safety").unwrap(); + let different = provider.embed("cooking Italian pasta recipes").unwrap(); + + let sim_identical = cosine_similarity(&base, &identical); + let sim_similar = cosine_similarity(&base, &similar); + let sim_different = cosine_similarity(&base, &different); + + assert!( + sim_identical > sim_similar, + "identical({sim_identical}) should be > similar({sim_similar})" + ); + assert!( + sim_similar > sim_different, + "similar({sim_similar}) should be > different({sim_different})" + ); + } +} diff --git a/src/debug/jtag/workers/continuum-core/src/memory/mod.rs b/src/debug/jtag/workers/continuum-core/src/memory/mod.rs new file mode 100644 index 000000000..2bc1f3c66 --- /dev/null +++ b/src/debug/jtag/workers/continuum-core/src/memory/mod.rs @@ -0,0 +1,489 @@ +//! Hippocampus β€” Rust-native memory subsystem for AI personas. +//! +//! Rust is a pure compute engine. Data comes from the TS ORM via IPC. +//! No SQL, no filesystem access β€” all operations run on in-memory MemoryCorpus. +//! +//! Architecture: +//! ```text +//! PersonaMemoryManager (DashMap>) +//! β”œβ”€β”€ embedding_provider: Arc (shared, loaded once) +//! β”œβ”€β”€ recall_engine: MultiLayerRecall (6 pluggable layers) +//! └── per-persona cached MemoryCorpus (loaded from TS ORM via IPC) +//! ``` +//! +//! Data flow: TS ORM queries data β†’ sends to Rust via memory/load-corpus IPC +//! β†’ Rust caches MemoryCorpus per persona β†’ recall layers operate on corpus. +//! +//! Extension points (trait-based, pluggable): +//! - EmbeddingProvider: swap embedding models (fastembed, BGE, fine-tuned) +//! - RecallLayer: add new retrieval strategies (neural, graph, attention-based) +//! - Each layer is an independent "PhD paper" β€” develop/test/replace independently + +pub mod cache; +pub mod consciousness; +pub mod corpus; +pub mod embedding; +pub mod recall; +pub mod timeline; +pub mod types; + +pub use cache::MemoryCache; +pub use consciousness::build_consciousness_context; +pub use corpus::MemoryCorpus; +pub use embedding::{cosine_similarity, DeterministicEmbeddingProvider, EmbeddingProvider, FastEmbedProvider}; +pub use recall::{MultiLayerRecall, RecallLayer, RecallQuery, ScoredMemory}; +pub use types::*; + +use dashmap::DashMap; +use std::sync::Arc; +use std::time::{Duration, Instant}; + +// ─── Error ──────────────────────────────────────────────────────────────────── + +/// Memory subsystem error β€” no SQL, just logic errors. +#[derive(Debug)] +pub struct MemoryError(pub String); + +impl std::fmt::Display for MemoryError { + fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { + write!(f, "{}", self.0) + } +} + +impl std::error::Error for MemoryError {} + +// ─── PersonaMemoryManager ───────────────────────────────────────────────────── + +/// Top-level manager for all persona memory operations. +/// +/// - Holds per-persona MemoryCorpus in a DashMap (zero cross-persona contention) +/// - Shared embedding provider loaded once at startup (~100ms) +/// - 6-layer multi-recall runs in parallel via Rayon on in-memory data +/// - Consciousness context cached per-persona with 30s TTL +/// +/// Thread safety: All 14 personas operate on independent DashMap entries. +/// Within a persona, recall layers operate on shared &MemoryCorpus (read-only). +pub struct PersonaMemoryManager { + corpora: DashMap>, + embedding: Arc, + recall_engine: MultiLayerRecall, + consciousness_cache: MemoryCache, +} + +impl PersonaMemoryManager { + pub fn new(embedding: Arc) -> Self { + Self { + corpora: DashMap::new(), + embedding, + recall_engine: MultiLayerRecall::new(), + consciousness_cache: MemoryCache::new(Duration::from_secs(30)), + } + } + + // ─── Corpus Lifecycle ───────────────────────────────────────────────────── + + /// Load a persona's memory corpus (called from TS ORM via IPC). + /// Replaces any previously cached corpus for this persona. + pub fn load_corpus( + &self, + persona_id: &str, + corpus_memories: Vec, + corpus_events: Vec, + ) -> LoadCorpusResponse { + let start = Instant::now(); + + let embedded_memory_count = corpus_memories.iter().filter(|cm| cm.embedding.is_some()).count(); + let embedded_event_count = corpus_events.iter().filter(|ce| ce.embedding.is_some()).count(); + let memory_count = corpus_memories.len(); + let timeline_event_count = corpus_events.len(); + + let corpus = MemoryCorpus::from_corpus_data(corpus_memories, corpus_events); + self.corpora.insert(persona_id.to_string(), Arc::new(corpus)); + + // Invalidate consciousness cache (new data affects context) + self.consciousness_cache.invalidate(persona_id); + + let load_time_ms = start.elapsed().as_secs_f64() * 1000.0; + + LoadCorpusResponse { + memory_count, + embedded_memory_count, + timeline_event_count, + embedded_event_count, + load_time_ms, + } + } + + /// Get a persona's cached corpus. + fn get_corpus(&self, persona_id: &str) -> Result, MemoryError> { + self.corpora + .get(persona_id) + .map(|c| c.value().clone()) + .ok_or_else(|| { + MemoryError(format!( + "No memory corpus for persona {persona_id}. Call memory/load-corpus first." + )) + }) + } + + // ─── Recall Operations ──────────────────────────────────────────────────── + + /// 6-layer parallel multi-recall β€” the improved recall algorithm. + /// Operates on in-memory MemoryCorpus data. Zero SQL. + pub fn multi_layer_recall( + &self, + persona_id: &str, + req: &MultiLayerRecallRequest, + ) -> Result { + let corpus = self.get_corpus(persona_id)?; + + // Pre-compute query embedding if text provided + let query_embedding = req.query_text.as_ref().and_then(|text| { + self.embedding.embed(text).ok() + }); + + let query = RecallQuery { + query_text: req.query_text.clone(), + query_embedding, + room_id: req.room_id.clone(), + max_results_per_layer: (req.max_results / 2).max(5), + }; + + Ok(self.recall_engine.recall_parallel( + &corpus, + &query, + self.embedding.as_ref(), + req.max_results, + )) + } + + // ─── Consciousness Context ──────────────────────────────────────────────── + + /// Build consciousness context (temporal + cross-context + intentions). + /// Cached per-persona with 30s TTL. + pub fn consciousness_context( + &self, + persona_id: &str, + req: &ConsciousnessContextRequest, + ) -> Result { + // Check cache + let cache_key = format!("{}:{}", persona_id, req.room_id); + if let Some(cached) = self.consciousness_cache.get(&cache_key) { + return Ok(cached); + } + + let corpus = self.get_corpus(persona_id)?; + let response = build_consciousness_context(&corpus, req); + + // Cache the result + self.consciousness_cache.set(cache_key, response.clone()); + + Ok(response) + } + + // ─── Incremental Append (Cache Coherence) ─────────────────────────────── + + /// Append a single memory to the persona's cached corpus. + /// Copy-on-write: clones corpus, appends memory, swaps Arc in DashMap. + /// Readers holding old Arc are unaffected (snapshot isolation). + /// O(n) per append, but appends are rare (~1/min/persona). + pub fn append_memory( + &self, + persona_id: &str, + memory: CorpusMemory, + ) -> Result<(), MemoryError> { + let old_corpus = self.get_corpus(persona_id)?; + let new_corpus = old_corpus.with_appended_memory(memory); + self.corpora.insert(persona_id.to_string(), Arc::new(new_corpus)); + self.consciousness_cache.invalidate(persona_id); + Ok(()) + } + + /// Append a single timeline event to the persona's cached corpus. + /// Copy-on-write: clones corpus, appends event, swaps Arc in DashMap. + pub fn append_event( + &self, + persona_id: &str, + event: CorpusTimelineEvent, + ) -> Result<(), MemoryError> { + let old_corpus = self.get_corpus(persona_id)?; + let new_corpus = old_corpus.with_appended_event(event); + self.corpora.insert(persona_id.to_string(), Arc::new(new_corpus)); + self.consciousness_cache.invalidate(persona_id); + Ok(()) + } + + // ─── Maintenance ────────────────────────────────────────────────────────── + + /// Evict expired cache entries (call periodically). + pub fn evict_caches(&self) { + self.consciousness_cache.evict_expired(); + } +} + +// ─── Tests ──────────────────────────────────────────────────────────────────── + +#[cfg(test)] +mod tests { + use super::*; + use std::collections::HashMap; + + /// Stub embedding provider for tests (avoids loading real model). + struct StubEmbeddingProvider; + + impl EmbeddingProvider for StubEmbeddingProvider { + fn name(&self) -> &str { + "stub" + } + fn dimensions(&self) -> usize { + 384 + } + fn embed(&self, _text: &str) -> Result, embedding::EmbeddingError> { + Ok(vec![0.1; 384]) + } + fn embed_batch( + &self, + texts: &[String], + ) -> Result>, embedding::EmbeddingError> { + Ok(texts.iter().map(|_| vec![0.1; 384]).collect()) + } + } + + fn test_manager() -> PersonaMemoryManager { + PersonaMemoryManager::new(Arc::new(StubEmbeddingProvider)) + } + + fn make_corpus_memory(id: &str, content: &str, importance: f64) -> CorpusMemory { + CorpusMemory { + record: MemoryRecord { + id: id.into(), + persona_id: "test".into(), + memory_type: "observation".into(), + content: content.into(), + context: serde_json::json!({}), + timestamp: chrono::Utc::now().to_rfc3339(), + importance, + access_count: 0, + tags: vec![], + related_to: vec![], + source: Some("test".into()), + last_accessed_at: None, + layer: None, + relevance_score: None, + }, + embedding: Some(vec![0.1; 384]), + } + } + + fn make_corpus_event(id: &str, context_id: &str, context_name: &str) -> CorpusTimelineEvent { + CorpusTimelineEvent { + event: TimelineEvent { + id: id.into(), + persona_id: "test".into(), + timestamp: chrono::Utc::now().to_rfc3339(), + context_type: "room".into(), + context_id: context_id.into(), + context_name: context_name.into(), + event_type: "message".into(), + actor_id: "user1".into(), + actor_name: "User".into(), + content: "test content".into(), + importance: 0.6, + topics: vec![], + }, + embedding: None, + } + } + + #[test] + fn test_load_corpus() { + let manager = test_manager(); + + let memories = vec![ + make_corpus_memory("m1", "Purple elephants dance", 0.9), + make_corpus_memory("m2", "Blue sky observation", 0.5), + ]; + let events = vec![ + make_corpus_event("e1", "room-1", "General"), + ]; + + let resp = manager.load_corpus("p1", memories, events); + assert_eq!(resp.memory_count, 2); + assert_eq!(resp.embedded_memory_count, 2); + assert_eq!(resp.timeline_event_count, 1); + assert_eq!(resp.embedded_event_count, 0); + assert!(resp.load_time_ms >= 0.0); + } + + #[test] + fn test_multi_layer_recall() { + let manager = test_manager(); + + let memories = vec![ + make_corpus_memory("m1", "Memory number 0", 0.9), + make_corpus_memory("m2", "Memory number 1", 0.7), + make_corpus_memory("m3", "Memory number 2", 0.5), + ]; + + manager.load_corpus("p1", memories, vec![]); + + let req = MultiLayerRecallRequest { + query_text: Some("memory test".into()), + room_id: "room-1".into(), + max_results: 10, + layers: None, + }; + + let resp = manager.multi_layer_recall("p1", &req).unwrap(); + assert!(!resp.memories.is_empty()); + assert!(resp.recall_time_ms > 0.0); + assert!(!resp.layer_timings.is_empty()); + } + + #[test] + fn test_consciousness_context_caching() { + let manager = test_manager(); + + let events = vec![ + make_corpus_event("e1", "room-1", "General"), + make_corpus_event("e2", "room-2", "Academy"), + ]; + + manager.load_corpus("p1", vec![], events); + + let req = ConsciousnessContextRequest { + room_id: "room-1".into(), + current_message: None, + skip_semantic_search: false, + }; + + // First call: cache miss + let resp1 = manager.consciousness_context("p1", &req).unwrap(); + + // Second call: cache hit + let resp2 = manager.consciousness_context("p1", &req).unwrap(); + assert_eq!(resp2.cross_context_event_count, resp1.cross_context_event_count); + } + + #[test] + fn test_corpus_not_loaded() { + let manager = test_manager(); + let req = MultiLayerRecallRequest { + query_text: None, + room_id: "room-1".into(), + max_results: 10, + layers: None, + }; + let result = manager.multi_layer_recall("nonexistent", &req); + assert!(result.is_err()); + } + + #[test] + fn test_load_corpus_replaces_previous() { + let manager = test_manager(); + + // Load initial corpus with 1 memory + manager.load_corpus("p1", vec![make_corpus_memory("m1", "first", 0.9)], vec![]); + + // Load new corpus with 3 memories + let resp = manager.load_corpus("p1", vec![ + make_corpus_memory("m2", "second", 0.8), + make_corpus_memory("m3", "third", 0.7), + make_corpus_memory("m4", "fourth", 0.6), + ], vec![]); + + assert_eq!(resp.memory_count, 3); + + // Recall should find new memories, not old ones + let req = MultiLayerRecallRequest { + query_text: None, + room_id: "room-1".into(), + max_results: 10, + layers: None, + }; + let recall_resp = manager.multi_layer_recall("p1", &req).unwrap(); + assert!(recall_resp.memories.iter().all(|m| m.id != "m1")); + } + + #[test] + fn test_append_memory() { + let manager = test_manager(); + + // Load initial corpus + manager.load_corpus("p1", vec![ + make_corpus_memory("m1", "Initial memory", 0.9), + ], vec![]); + + // Append a new memory + let new_memory = make_corpus_memory("m2", "Appended memory", 0.7); + manager.append_memory("p1", new_memory).unwrap(); + + // Verify both memories exist in recall + let req = MultiLayerRecallRequest { + query_text: None, + room_id: "room-1".into(), + max_results: 10, + layers: None, + }; + let resp = manager.multi_layer_recall("p1", &req).unwrap(); + let ids: Vec<&str> = resp.memories.iter().map(|m| m.id.as_str()).collect(); + assert!(ids.contains(&"m1"), "Original memory should still exist"); + assert!(ids.contains(&"m2"), "Appended memory should exist"); + } + + #[test] + fn test_append_event() { + let manager = test_manager(); + + // Load initial corpus with one event + manager.load_corpus("p1", vec![], vec![ + make_corpus_event("e1", "room-1", "General"), + ]); + + // Append a new event + let new_event = make_corpus_event("e2", "room-2", "Academy"); + manager.append_event("p1", new_event).unwrap(); + + // Verify consciousness context sees both events + let req = crate::memory::ConsciousnessContextRequest { + room_id: "room-1".into(), + current_message: None, + skip_semantic_search: false, + }; + let resp = manager.consciousness_context("p1", &req).unwrap(); + // room-2 event should appear as cross-context (not in room-1) + assert!(resp.cross_context_event_count >= 1); + } + + #[test] + fn test_append_to_nonexistent_corpus_fails() { + let manager = test_manager(); + + let memory = make_corpus_memory("m1", "orphan", 0.5); + let result = manager.append_memory("nonexistent", memory); + assert!(result.is_err(), "Append to nonexistent corpus should fail"); + } + + #[test] + fn test_append_preserves_embeddings() { + let manager = test_manager(); + + // Load initial corpus with embedded memory + manager.load_corpus("p1", vec![ + make_corpus_memory("m1", "with embedding", 0.9), // has Some(vec![0.1; 384]) + ], vec![]); + + // Append another embedded memory + manager.append_memory("p1", make_corpus_memory("m2", "also embedded", 0.8)).unwrap(); + + // Both should be findable via semantic recall (which needs embeddings) + let req = MultiLayerRecallRequest { + query_text: Some("embedded".into()), + room_id: "room-1".into(), + max_results: 10, + layers: None, + }; + let resp = manager.multi_layer_recall("p1", &req).unwrap(); + assert!(resp.memories.len() >= 2, "Both embedded memories should be recalled"); + } +} diff --git a/src/debug/jtag/workers/continuum-core/src/memory/recall.rs b/src/debug/jtag/workers/continuum-core/src/memory/recall.rs new file mode 100644 index 000000000..2e1dd980d --- /dev/null +++ b/src/debug/jtag/workers/continuum-core/src/memory/recall.rs @@ -0,0 +1,687 @@ +//! Multi-layer recall algorithm β€” 6 pluggable layers running in parallel. +//! +//! Each layer is an independent retrieval strategy operating on in-memory data. +//! The orchestrator runs all layers in parallel via Rayon and merges results. +//! +//! Data comes from MemoryCorpus (loaded from TS ORM). Zero SQL access. +//! +//! Layers: +//! 1. Core β€” high-importance never-forget memories +//! 2. Semantic β€” embedding cosine similarity search +//! 3. Temporal β€” recent context with room bonus +//! 4. Associative β€” tag/keyword graph traversal +//! 5. DecayResurface β€” spaced repetition (surface fading memories) +//! 6. CrossContext β€” knowledge from other rooms/contexts + +use crate::memory::corpus::MemoryCorpus; +use crate::memory::embedding::{cosine_similarity, EmbeddingProvider}; +use crate::memory::types::*; +use rayon::prelude::*; +use std::collections::HashMap; +use std::time::Instant; + +// ─── Trait: RecallLayer ────────────────────────────────────────────────────── + +/// Pluggable recall layer β€” each implementation is an independent retrieval strategy. +/// +/// All layers operate on MemoryCorpus (in-memory data from TS ORM). +/// No SQL, no filesystem access β€” pure computation. +pub trait RecallLayer: Send + Sync { + /// Unique name for this layer (used in timing reports and convergence scoring). + fn name(&self) -> &str; + + /// Execute this layer's recall strategy against the in-memory corpus. + fn recall( + &self, + corpus: &MemoryCorpus, + query: &RecallQuery, + embedding_provider: &dyn EmbeddingProvider, + ) -> Vec; +} + +// ─── Query Context ─────────────────────────────────────────────────────────── + +/// Context for a recall query β€” shared across all layers. +pub struct RecallQuery { + pub query_text: Option, + pub query_embedding: Option>, + pub room_id: String, + pub max_results_per_layer: usize, +} + +/// A memory candidate with a relevance score and source layer. +#[derive(Clone)] +pub struct ScoredMemory { + pub memory: MemoryRecord, + pub score: f64, + pub layer: String, +} + +// ─── Layer 1: Core Recall ──────────────────────────────────────────────────── + +/// High-importance memories that should never be forgotten. +/// Simple filter: importance >= 0.8, ordered by importance. +pub struct CoreRecallLayer; + +impl RecallLayer for CoreRecallLayer { + fn name(&self) -> &str { + "core" + } + + fn recall( + &self, + corpus: &MemoryCorpus, + query: &RecallQuery, + _embedding_provider: &dyn EmbeddingProvider, + ) -> Vec { + corpus + .high_importance_memories(0.8, query.max_results_per_layer) + .into_iter() + .map(|m| { + let mut record = m.clone(); + record.layer = Some("core".into()); + ScoredMemory { + score: record.importance, + memory: record, + layer: "core".into(), + } + }) + .collect() + } +} + +// ─── Layer 2: Semantic Recall ──────────────────────────────────────────────── + +/// Embedding-based cosine similarity search. +/// Compares query embedding against all stored memory embeddings. +pub struct SemanticRecallLayer; + +impl RecallLayer for SemanticRecallLayer { + fn name(&self) -> &str { + "semantic" + } + + fn recall( + &self, + corpus: &MemoryCorpus, + query: &RecallQuery, + embedding_provider: &dyn EmbeddingProvider, + ) -> Vec { + // Need query text or pre-computed embedding + let query_embedding = match &query.query_embedding { + Some(e) => e.clone(), + None => match &query.query_text { + Some(text) => match embedding_provider.embed(text) { + Ok(e) => e, + Err(_) => return vec![], + }, + None => return vec![], + }, + }; + + let memories_with_embeddings = corpus.memories_with_embeddings(); + + // Compute cosine similarity for each memory + let mut scored: Vec = memories_with_embeddings + .into_iter() + .map(|(record, embedding)| { + let similarity = cosine_similarity(&query_embedding, embedding); + let mut record = record.clone(); + record.layer = Some("semantic".into()); + record.relevance_score = Some(similarity as f64); + ScoredMemory { + score: similarity as f64, + memory: record, + layer: "semantic".into(), + } + }) + .collect(); + + // Sort by similarity descending and take top N + scored.sort_by(|a, b| { + b.score + .partial_cmp(&a.score) + .unwrap_or(std::cmp::Ordering::Equal) + }); + scored.truncate(query.max_results_per_layer); + scored + } +} + +// ─── Layer 3: Temporal Recall ──────────────────────────────────────────────── + +/// Recent memories β€” "what was I just thinking about?" +/// Fetches memories from the last 2 hours, with a room-context bonus. +pub struct TemporalRecallLayer; + +impl RecallLayer for TemporalRecallLayer { + fn name(&self) -> &str { + "temporal" + } + + fn recall( + &self, + corpus: &MemoryCorpus, + query: &RecallQuery, + _embedding_provider: &dyn EmbeddingProvider, + ) -> Vec { + // Look back 2 hours + let since = chrono::Utc::now() + .checked_sub_signed(chrono::Duration::hours(2)) + .map(|t| t.to_rfc3339()) + .unwrap_or_default(); + + let recent = corpus.recent_memories(&since, query.max_results_per_layer * 2); + + recent + .into_iter() + .enumerate() + .map(|(i, m)| { + // Recency score: most recent = highest score + let recency_score = + 1.0 - (i as f64 / (query.max_results_per_layer * 2) as f64); + + // Room bonus: memories from the same room get a 20% boost + let room_bonus = if m + .context + .get("roomId") + .and_then(|v| v.as_str()) + .map(|r| r == query.room_id) + .unwrap_or(false) + { + 0.2 + } else { + 0.0 + }; + + let score = recency_score * 0.7 + m.importance * 0.3 + room_bonus; + + let mut record = m.clone(); + record.layer = Some("temporal".into()); + ScoredMemory { + score, + memory: record, + layer: "temporal".into(), + } + }) + .take(query.max_results_per_layer) + .collect() + } +} + +// ─── Layer 4: Associative Recall ───────────────────────────────────────────── + +/// Tag-based and relatedTo graph traversal. +/// Extracts keywords from query text, matches against memory tags, +/// then follows relatedTo links for one hop. +pub struct AssociativeRecallLayer; + +impl AssociativeRecallLayer { + /// Simple keyword extraction: split by whitespace, filter stopwords + short words. + pub fn extract_keywords(text: &str) -> Vec { + const STOPWORDS: &[&str] = &[ + "the", "a", "an", "is", "are", "was", "were", "be", "been", "being", + "have", "has", "had", "do", "does", "did", "will", "would", "could", + "should", "may", "might", "can", "shall", "to", "of", "in", "for", "on", + "with", "at", "by", "from", "as", "into", "about", "like", "through", + "after", "over", "between", "out", "up", "down", "this", "that", "these", + "those", "it", "its", "i", "me", "my", "we", "our", "you", "your", "he", + "she", "they", "them", "what", "which", "who", "when", "where", "how", + "not", "no", "nor", "but", "and", "or", "if", "then", "so", "too", + "very", "just", "don", "now", "here", "there", + ]; + + text.to_lowercase() + .split_whitespace() + .filter(|w| w.len() >= 3 && !STOPWORDS.contains(w)) + .map(|w| { + w.trim_matches(|c: char| !c.is_alphanumeric()) + .to_string() + }) + .filter(|w| !w.is_empty()) + .collect() + } +} + +impl RecallLayer for AssociativeRecallLayer { + fn name(&self) -> &str { + "associative" + } + + fn recall( + &self, + corpus: &MemoryCorpus, + query: &RecallQuery, + _embedding_provider: &dyn EmbeddingProvider, + ) -> Vec { + let query_text = match &query.query_text { + Some(t) => t.clone(), + None => return vec![], + }; + + let keywords = Self::extract_keywords(&query_text); + if keywords.is_empty() { + return vec![]; + } + + let memories = corpus.all_memories_limited(200); + + // Score each memory by keyword-tag overlap + let mut scored: Vec = memories + .into_iter() + .filter_map(|m| { + let tag_matches = keywords + .iter() + .filter(|kw| { + m.tags + .iter() + .any(|tag| tag.to_lowercase().contains(kw.as_str())) + || m.content.to_lowercase().contains(kw.as_str()) + }) + .count(); + + if tag_matches == 0 { + return None; + } + + let score = + (tag_matches as f64 / keywords.len() as f64) * 0.7 + m.importance * 0.3; + + let mut record = m.clone(); + record.layer = Some("associative".into()); + Some(ScoredMemory { + score, + memory: record, + layer: "associative".into(), + }) + }) + .collect(); + + scored.sort_by(|a, b| { + b.score + .partial_cmp(&a.score) + .unwrap_or(std::cmp::Ordering::Equal) + }); + scored.truncate(query.max_results_per_layer); + + // Follow relatedTo links (1 hop) for top results + let related_ids: Vec = scored + .iter() + .flat_map(|s| s.memory.related_to.clone()) + .collect(); + + if !related_ids.is_empty() { + for m in &corpus.memories { + if related_ids.contains(&m.id) { + let already_has = scored.iter().any(|s| s.memory.id == m.id); + if !already_has { + let mut record = m.clone(); + record.layer = Some("associative".into()); + scored.push(ScoredMemory { + score: m.importance * 0.5, // Related memories get dampened score + memory: record, + layer: "associative".into(), + }); + } + } + } + } + + scored.truncate(query.max_results_per_layer); + scored + } +} + +// ─── Layer 5: Decay Resurface ──────────────────────────────────────────────── + +/// Spaced repetition β€” surface important memories that are fading. +/// Higher score = more in need of resurfacing. +/// decay_score = days_since_access / (access_count + 1) +/// Only considers memories with importance >= 0.5. +pub struct DecayResurfaceLayer; + +impl RecallLayer for DecayResurfaceLayer { + fn name(&self) -> &str { + "decay_resurface" + } + + fn recall( + &self, + corpus: &MemoryCorpus, + query: &RecallQuery, + _embedding_provider: &dyn EmbeddingProvider, + ) -> Vec { + let decayable = corpus.decayable_memories(0.5, 100); + + let mut scored: Vec = decayable + .into_iter() + .map(|(m, days_since_access)| { + // Decay score: high = needs resurfacing + let decay = days_since_access / (m.access_count as f64 + 1.0); + let score = decay.min(1.0) * m.importance; + + let mut record = m.clone(); + record.layer = Some("decay_resurface".into()); + ScoredMemory { + score, + memory: record, + layer: "decay_resurface".into(), + } + }) + .collect(); + + scored.sort_by(|a, b| { + b.score + .partial_cmp(&a.score) + .unwrap_or(std::cmp::Ordering::Equal) + }); + scored.truncate(query.max_results_per_layer); + scored + } +} + +// ─── Layer 6: Cross-Context Recall ─────────────────────────────────────────── + +/// Knowledge from other rooms/contexts β€” cross-pollination. +/// Uses timeline events from other contexts, optionally with semantic relevance. +pub struct CrossContextLayer; + +impl RecallLayer for CrossContextLayer { + fn name(&self) -> &str { + "cross_context" + } + + fn recall( + &self, + corpus: &MemoryCorpus, + query: &RecallQuery, + embedding_provider: &dyn EmbeddingProvider, + ) -> Vec { + // Look back 24 hours for cross-context events + let since = chrono::Utc::now() + .checked_sub_signed(chrono::Duration::hours(24)) + .map(|t| t.to_rfc3339()) + .unwrap_or_default(); + + // If we have query text, do semantic cross-context search + if let Some(ref query_text) = query.query_text { + if let Ok(query_emb) = embedding_provider.embed(query_text) { + let events_with_emb = corpus.cross_context_events_with_embeddings( + &query.room_id, + &since, + 50, + ); + + let mut scored: Vec = events_with_emb + .into_iter() + .map(|(event, embedding)| { + let similarity = cosine_similarity(&query_emb, embedding); + let record = timeline_event_to_memory_record( + event, + "cross_context", + Some(similarity as f64), + ); + ScoredMemory { + score: similarity as f64 * 0.7 + event.importance * 0.3, + memory: record, + layer: "cross_context".into(), + } + }) + .collect(); + + scored.sort_by(|a, b| { + b.score + .partial_cmp(&a.score) + .unwrap_or(std::cmp::Ordering::Equal) + }); + scored.truncate(query.max_results_per_layer); + return scored; + } + } + + // Fallback: importance-based cross-context (no semantic search) + let events = + corpus.cross_context_events(&query.room_id, &since, query.max_results_per_layer); + + events + .into_iter() + .map(|event| { + let record = timeline_event_to_memory_record(event, "cross_context", None); + ScoredMemory { + score: event.importance, + memory: record, + layer: "cross_context".into(), + } + }) + .collect() + } +} + +// ─── Helper: Timeline β†’ Memory ─────────────────────────────────────────────── + +/// Convert a TimelineEvent to a MemoryRecord for uniform recall output. +fn timeline_event_to_memory_record( + event: &TimelineEvent, + layer: &str, + relevance_score: Option, +) -> MemoryRecord { + MemoryRecord { + id: event.id.clone(), + persona_id: event.persona_id.clone(), + memory_type: format!("timeline:{}", event.event_type), + content: event.content.clone(), + context: serde_json::json!({ + "context_type": event.context_type, + "context_id": event.context_id, + "context_name": event.context_name, + "actor_id": event.actor_id, + "actor_name": event.actor_name, + }), + timestamp: event.timestamp.clone(), + importance: event.importance, + access_count: 0, + tags: event.topics.clone(), + related_to: vec![], + source: Some("timeline".into()), + last_accessed_at: None, + layer: Some(layer.into()), + relevance_score, + } +} + +// ─── MultiLayerRecall Orchestrator ─────────────────────────────────────────── + +/// Orchestrates all recall layers in parallel, merges and deduplicates results. +/// +/// All layers run on Rayon threads, operating on in-memory MemoryCorpus data. +/// No SQL, no filesystem β€” pure parallel computation. +pub struct MultiLayerRecall { + layers: Vec>, +} + +impl MultiLayerRecall { + /// Create with all 6 default layers. + pub fn new() -> Self { + Self { + layers: vec![ + Box::new(CoreRecallLayer), + Box::new(SemanticRecallLayer), + Box::new(TemporalRecallLayer), + Box::new(AssociativeRecallLayer), + Box::new(DecayResurfaceLayer), + Box::new(CrossContextLayer), + ], + } + } + + /// Run all layers in parallel and return merged, deduplicated results. + pub fn recall_parallel( + &self, + corpus: &MemoryCorpus, + query: &RecallQuery, + embedding_provider: &dyn EmbeddingProvider, + max_results: usize, + ) -> MemoryRecallResponse { + let start = Instant::now(); + + // Determine which layers to run + let active_layers: Vec<&Box> = match &query.query_text { + Some(_) => self.layers.iter().collect(), // All layers when text available + None => self + .layers + .iter() + .filter(|l| l.name() != "semantic" && l.name() != "associative") + .collect(), + }; + + // Run all active layers in parallel via Rayon + let layer_results: Vec<(String, Vec, f64)> = active_layers + .par_iter() + .map(|layer| { + let layer_start = Instant::now(); + let results = layer.recall(corpus, query, embedding_provider); + let time_ms = layer_start.elapsed().as_secs_f64() * 1000.0; + (layer.name().to_string(), results, time_ms) + }) + .collect(); + + // Collect layer timings + let layer_timings: Vec = layer_results + .iter() + .map(|(name, results, time_ms)| LayerTiming { + layer: name.clone(), + time_ms: *time_ms, + results_found: results.len(), + }) + .collect(); + + let total_candidates: usize = layer_results.iter().map(|(_, r, _)| r.len()).sum(); + + // Merge and deduplicate by memory ID + // Memories found by multiple layers get a convergence boost + let mut merged: HashMap = HashMap::new(); + + for (_, results, _) in &layer_results { + for scored in results { + let entry = merged + .entry(scored.memory.id.clone()) + .or_insert_with(|| (scored.clone(), 0)); + entry.0.score = entry.0.score.max(scored.score); + entry.1 += 1; // Count layers that found this memory + } + } + + // Apply convergence boost: memories from multiple layers get bonus. + // No score cap β€” scores > 1.0 are valid for ranking (these are relative + // rankings, not probabilities). Capping destroys the convergence signal + // when high-scoring memories from different layers all hit 1.0. + let mut final_results: Vec = merged + .into_values() + .map(|(mut scored, layer_count)| { + if layer_count > 1 { + // 15% boost per additional layer + scored.score *= 1.0 + 0.15 * (layer_count - 1) as f64; + } + scored + }) + .collect(); + + // Sort by final score descending, then importance as tiebreaker + final_results.sort_by(|a, b| { + b.score + .partial_cmp(&a.score) + .unwrap_or(std::cmp::Ordering::Equal) + .then_with(|| { + b.memory + .importance + .partial_cmp(&a.memory.importance) + .unwrap_or(std::cmp::Ordering::Equal) + }) + }); + final_results.truncate(max_results); + + let recall_time_ms = start.elapsed().as_secs_f64() * 1000.0; + + // Convert to MemoryRecallResponse + let memories: Vec = final_results + .into_iter() + .map(|s| { + let mut m = s.memory; + m.relevance_score = Some(s.score); + m + }) + .collect(); + + MemoryRecallResponse { + memories, + recall_time_ms, + layer_timings, + total_candidates, + } + } +} + +// ─── Tests ─────────────────────────────────────────────────────────────────── + +#[cfg(test)] +mod tests { + use super::*; + + #[test] + fn test_keyword_extraction() { + let keywords = AssociativeRecallLayer::extract_keywords( + "What did we discuss about the blue sky yesterday?", + ); + assert!(keywords.contains(&"discuss".to_string())); + assert!(keywords.contains(&"blue".to_string())); + assert!(keywords.contains(&"sky".to_string())); + assert!(keywords.contains(&"yesterday".to_string())); + // Stopwords should be filtered + assert!(!keywords.contains(&"the".to_string())); + assert!(!keywords.contains(&"did".to_string())); + assert!(!keywords.contains(&"about".to_string())); + } + + #[test] + fn test_keyword_extraction_empty() { + let keywords = AssociativeRecallLayer::extract_keywords("the a is"); + assert!(keywords.is_empty()); + } + + #[test] + fn test_timeline_event_to_memory_record() { + let event = TimelineEvent { + id: "ev-1".into(), + persona_id: "p-1".into(), + timestamp: "2025-01-01T00:00:00Z".into(), + context_type: "room".into(), + context_id: "room-2".into(), + context_name: "Academy".into(), + event_type: "message_sent".into(), + actor_id: "user-1".into(), + actor_name: "Joel".into(), + content: "Teaching something".into(), + importance: 0.8, + topics: vec!["teaching".into()], + }; + + let record = timeline_event_to_memory_record(&event, "cross_context", Some(0.95)); + assert_eq!(record.id, "ev-1"); + assert_eq!(record.memory_type, "timeline:message_sent"); + assert_eq!(record.layer, Some("cross_context".into())); + assert_eq!(record.relevance_score, Some(0.95)); + assert_eq!(record.tags, vec!["teaching"]); + } + + #[test] + fn test_multi_layer_recall_creation() { + let recall = MultiLayerRecall::new(); + assert_eq!(recall.layers.len(), 6); + assert_eq!(recall.layers[0].name(), "core"); + assert_eq!(recall.layers[1].name(), "semantic"); + assert_eq!(recall.layers[2].name(), "temporal"); + assert_eq!(recall.layers[3].name(), "associative"); + assert_eq!(recall.layers[4].name(), "decay_resurface"); + assert_eq!(recall.layers[5].name(), "cross_context"); + } +} diff --git a/src/debug/jtag/workers/continuum-core/src/memory/timeline.rs b/src/debug/jtag/workers/continuum-core/src/memory/timeline.rs new file mode 100644 index 000000000..a5c3ad047 --- /dev/null +++ b/src/debug/jtag/workers/continuum-core/src/memory/timeline.rs @@ -0,0 +1,111 @@ +//! Timeline queries β€” temporal thread and cross-context awareness. +//! +//! Provides the "what was I doing before?" and "what happened in other rooms?" +//! context that feeds into the consciousness context builder. +//! +//! All operations run on in-memory MemoryCorpus data. Zero SQL. + +use crate::memory::corpus::MemoryCorpus; +use crate::memory::types::*; + +// ─── Temporal Thread ───────────────────────────────────────────────────────── + +/// Build temporal continuity info for a persona in a specific context. +/// Answers: "When was I last active here? Was I interrupted? What was I doing?" +pub fn build_temporal_info(corpus: &MemoryCorpus, context_id: &str) -> TemporalInfo { + let last_event = corpus.last_event_in_context(context_id); + + match last_event { + Some(event) => { + let now = chrono::Utc::now(); + let event_time = chrono::DateTime::parse_from_rfc3339(&event.timestamp) + .map(|t| t.with_timezone(&chrono::Utc)) + .unwrap_or(now); + + let time_away_ms = (now - event_time).num_milliseconds(); + + // Check if there was an uncompleted intention (interrupted task) + let interrupted_task = find_interrupted_intention(corpus, context_id); + let was_interrupted = interrupted_task.is_some(); + + TemporalInfo { + last_active_context: Some(event.context_id.clone()), + last_active_context_name: Some(event.context_name.clone()), + time_away_ms, + was_interrupted, + interrupted_task, + } + } + None => TemporalInfo { + last_active_context: None, + last_active_context_name: None, + time_away_ms: 0, + was_interrupted: false, + interrupted_task: None, + }, + } +} + +/// Look for an intention_formed event without a corresponding intention_completed. +fn find_interrupted_intention(corpus: &MemoryCorpus, context_id: &str) -> Option { + // Look for recent intentions (last 6 hours) + let since = chrono::Utc::now() + .checked_sub_signed(chrono::Duration::hours(6)) + .map(|t| t.to_rfc3339()) + .unwrap_or_default(); + + let events = corpus.events_since(&since, 50); + + // Find intention_formed events for this context + let mut formed_intentions: Vec<&&TimelineEvent> = events + .iter() + .filter(|e| e.context_id == context_id && e.event_type == "intention_formed") + .collect(); + + // Find completed intentions + let completed_ids: Vec<&str> = events + .iter() + .filter(|e| e.context_id == context_id && e.event_type == "intention_completed") + .map(|e| e.content.as_str()) + .collect(); + + // Return first unfinished intention + formed_intentions.retain(|e| !completed_ids.iter().any(|c| e.content.contains(c))); + + formed_intentions.first().map(|e| e.content.clone()) +} + +// ─── Cross-Context Summary ─────────────────────────────────────────────────── + +/// Count active intentions across all contexts (not just current room). +pub fn count_active_intentions(corpus: &MemoryCorpus) -> usize { + let since = chrono::Utc::now() + .checked_sub_signed(chrono::Duration::hours(6)) + .map(|t| t.to_rfc3339()) + .unwrap_or_default(); + + let events = corpus.events_since(&since, 200); + + let formed: usize = events + .iter() + .filter(|e| e.event_type == "intention_formed") + .count(); + let completed: usize = events + .iter() + .filter(|e| e.event_type == "intention_completed") + .count(); + + formed.saturating_sub(completed) +} + +/// Check if there's peripheral activity (events in non-current contexts recently). +pub fn has_peripheral_activity(corpus: &MemoryCorpus, current_context_id: &str) -> bool { + let since = chrono::Utc::now() + .checked_sub_signed(chrono::Duration::minutes(30)) + .map(|t| t.to_rfc3339()) + .unwrap_or_default(); + + !corpus + .cross_context_events(current_context_id, &since, 1) + .is_empty() +} diff --git a/src/debug/jtag/workers/continuum-core/src/memory/types.rs b/src/debug/jtag/workers/continuum-core/src/memory/types.rs new file mode 100644 index 000000000..95529c4e9 --- /dev/null +++ b/src/debug/jtag/workers/continuum-core/src/memory/types.rs @@ -0,0 +1,148 @@ +//! Memory type definitions β€” shared between Rust engine and TypeScript via ts-rs. +//! +//! These types are the lingua franca of the Hippocampus IPC protocol. +//! Rust is a pure compute engine β€” data comes from the TS ORM via IPC. + +use serde::{Deserialize, Serialize}; +use ts_rs::TS; + +// ─── Memory Record ─────────────────────────────────────────────────────────── + +/// A single memory record β€” comes from the TS ORM, not SQL. +/// Used as both input (corpus loading) and output (recall results). +#[derive(Debug, Clone, Serialize, Deserialize, TS)] +#[ts(export)] +pub struct MemoryRecord { + pub id: String, + pub persona_id: String, + pub memory_type: String, + pub content: String, + #[ts(type = "Record")] + pub context: serde_json::Value, + pub timestamp: String, + pub importance: f64, + pub access_count: u32, + pub tags: Vec, + pub related_to: Vec, + pub source: Option, + pub last_accessed_at: Option, + /// Set by recall layers β€” indicates which layer found this memory + pub layer: Option, + /// Set by semantic recall β€” cosine similarity score + pub relevance_score: Option, +} + +// ─── Corpus Loading (ORM β†’ Rust) ───────────────────────────────────────────── + +/// A memory with its optional embedding vector β€” sent from TS ORM to Rust. +#[derive(Debug, Clone, Serialize, Deserialize, TS)] +#[ts(export)] +pub struct CorpusMemory { + pub record: MemoryRecord, + pub embedding: Option>, +} + +/// A timeline event with its optional embedding vector β€” sent from TS ORM to Rust. +#[derive(Debug, Clone, Serialize, Deserialize, TS)] +#[ts(export)] +pub struct CorpusTimelineEvent { + pub event: TimelineEvent, + pub embedding: Option>, +} + +/// Response from corpus loading. +#[derive(Debug, Clone, Serialize, Deserialize, TS)] +#[ts(export)] +pub struct LoadCorpusResponse { + pub memory_count: usize, + pub embedded_memory_count: usize, + pub timeline_event_count: usize, + pub embedded_event_count: usize, + pub load_time_ms: f64, +} + +// ─── Multi-Layer Recall ─────────────────────────────────────────────────────── + +/// Multi-layer recall request β€” the primary recall API. +#[derive(Debug, Clone, Serialize, Deserialize, TS)] +#[ts(export)] +pub struct MultiLayerRecallRequest { + pub query_text: Option, + pub room_id: String, + pub max_results: usize, + /// Which layers to run (empty = all layers) + pub layers: Option>, +} + +/// Response from any recall operation. +#[derive(Debug, Clone, Serialize, Deserialize, TS)] +#[ts(export)] +pub struct MemoryRecallResponse { + pub memories: Vec, + pub recall_time_ms: f64, + pub layer_timings: Vec, + pub total_candidates: usize, +} + +/// Timing for a single recall layer. +#[derive(Debug, Clone, Serialize, Deserialize, TS)] +#[ts(export)] +pub struct LayerTiming { + pub layer: String, + pub time_ms: f64, + pub results_found: usize, +} + +// ─── Consciousness Context ─────────────────────────────────────────────────── + +/// Request to build consciousness context (replaces TS UnifiedConsciousness.getContext). +#[derive(Debug, Clone, Serialize, Deserialize, TS)] +#[ts(export)] +pub struct ConsciousnessContextRequest { + pub room_id: String, + pub current_message: Option, + pub skip_semantic_search: bool, +} + +/// Response with formatted consciousness context for RAG injection. +#[derive(Debug, Clone, Serialize, Deserialize, TS)] +#[ts(export)] +pub struct ConsciousnessContextResponse { + pub formatted_prompt: Option, + pub build_time_ms: f64, + pub temporal: TemporalInfo, + pub cross_context_event_count: usize, + pub active_intention_count: usize, + pub has_peripheral_activity: bool, +} + +/// Temporal continuity information β€” "what was I doing before?" +#[derive(Debug, Clone, Serialize, Deserialize, TS)] +#[ts(export)] +pub struct TemporalInfo { + pub last_active_context: Option, + pub last_active_context_name: Option, + pub time_away_ms: i64, + pub was_interrupted: bool, + pub interrupted_task: Option, +} + +// ─── Timeline Events ───────────────────────────────────────────────────────── + +/// A timeline event β€” records cross-context activity for consciousness. +#[derive(Debug, Clone, Serialize, Deserialize, TS)] +#[ts(export)] +pub struct TimelineEvent { + pub id: String, + pub persona_id: String, + pub timestamp: String, + pub context_type: String, + pub context_id: String, + pub context_name: String, + pub event_type: String, + pub actor_id: String, + pub actor_name: String, + pub content: String, + pub importance: f64, + pub topics: Vec, +} diff --git a/src/debug/jtag/workers/continuum-core/src/persona/types.rs b/src/debug/jtag/workers/continuum-core/src/persona/types.rs index 3526ef2b0..2ec425e32 100644 --- a/src/debug/jtag/workers/continuum-core/src/persona/types.rs +++ b/src/debug/jtag/workers/continuum-core/src/persona/types.rs @@ -276,12 +276,15 @@ impl PersonaState { } /// Adaptive service cadence based on mood (ms) + /// + /// This is the MAX wait time before timeout β€” actual response is near-instant + /// via signal-based wakeup. Aligned with TS PersonaState.getCadence(). pub fn service_cadence_ms(&self) -> u64 { match self.mood { - Mood::Active => 3000, // 3s - responsive - Mood::Idle => 10000, // 10s - conserve - Mood::Tired => 7000, // 7s - moderate - Mood::Overwhelmed => 5000, // 5s - catch up + Mood::Idle => 1000, // 1s β€” quick to respond to first message + Mood::Active => 500, // 500ms β€” stay responsive during conversations + Mood::Tired => 2000, // 2s β€” moderate pace + Mood::Overwhelmed => 3000, // 3s β€” back pressure } } } diff --git a/src/debug/jtag/workers/continuum-core/tests/call_server_integration.rs b/src/debug/jtag/workers/continuum-core/tests/call_server_integration.rs index 4502a08cc..beb80060b 100644 --- a/src/debug/jtag/workers/continuum-core/tests/call_server_integration.rs +++ b/src/debug/jtag/workers/continuum-core/tests/call_server_integration.rs @@ -235,11 +235,11 @@ async fn test_orchestrator_performance_target() { println!("βœ… PERFORMANCE TARGET MET: {}Β΅s < 10Β΅s", avg); } - // Relaxed assertion for CI/CD - warn if > 10Β΅s but don't fail - // Fail only if completely unreasonable (> 100Β΅s) + // Fail if > 100Β΅s β€” target is <10Β΅s on M1. + // Run tests with --release for meaningful results. assert!( avg < 100, - "Orchestrator EXTREMELY slow: {}Β΅s (should be < 10Β΅s, failing at > 100Β΅s)", + "Orchestrator too slow: {}Β΅s (should be < 10Β΅s, failing at > 100Β΅s)", avg ); } diff --git a/src/debug/jtag/workers/continuum-core/tests/common/mod.rs b/src/debug/jtag/workers/continuum-core/tests/common/mod.rs new file mode 100644 index 000000000..fc907bc3d --- /dev/null +++ b/src/debug/jtag/workers/continuum-core/tests/common/mod.rs @@ -0,0 +1,149 @@ +#![allow(dead_code)] +//! Shared IPC client for integration tests. +//! +//! Defines the length-prefixed binary framing protocol in ONE place. +//! All integration tests that communicate with the continuum-core IPC server +//! MUST use this module instead of hand-rolling socket reads. +//! +//! ## Protocol (server β†’ client) +//! +//! Requests: newline-delimited JSON (client β†’ server) +//! Responses: length-prefixed binary framing (server β†’ client) +//! +//! ```text +//! [4 bytes u32 BE: payload length][payload bytes] +//! ``` +//! +//! Payload variants: +//! - **JSON**: entire payload is valid UTF-8 JSON +//! - **Binary**: `[JSON header bytes][\0 separator][raw binary data]` +//! +//! The `\0` separator is unambiguous β€” serde_json encodes null chars as `\u0000`. + +use serde::{Deserialize, Serialize}; +use std::io::{Read as IoRead, Write}; +use std::os::unix::net::UnixStream; +use std::time::Duration; + +pub const IPC_SOCKET: &str = "/tmp/continuum-core.sock"; + +// ============================================================================ +// Response Types +// ============================================================================ + +/// Parsed JSON fields from an IPC response. +#[derive(Deserialize, Debug)] +pub struct IpcResponse { + pub success: bool, + pub result: Option, + pub error: Option, +} + +/// Full IPC result β€” either pure JSON or JSON header + binary payload. +pub enum IpcResult { + Json(IpcResponse), + Binary { header: IpcResponse, data: Vec }, +} + +impl IpcResult { + /// Get the response (header for binary, response for JSON). + #[allow(dead_code)] + pub fn response(&self) -> &IpcResponse { + match self { + IpcResult::Json(r) => r, + IpcResult::Binary { header, .. } => header, + } + } + + /// Unwrap as JSON response, panicking if binary. + #[allow(dead_code)] + pub fn into_json(self) -> IpcResponse { + match self { + IpcResult::Json(r) => r, + IpcResult::Binary { header, .. } => header, + } + } + + /// Unwrap as binary response, panicking if JSON-only. + #[allow(dead_code)] + pub fn into_binary(self) -> (IpcResponse, Vec) { + match self { + IpcResult::Binary { header, data } => (header, data), + IpcResult::Json(r) => panic!( + "Expected binary IPC response, got JSON-only: success={}, error={:?}", + r.success, r.error + ), + } + } +} + +// ============================================================================ +// IPC Client +// ============================================================================ + +/// Connect to the IPC socket with timeouts. +/// Returns `None` (and prints skip message) if the server isn't running. +pub fn ipc_connect() -> Option { + ipc_connect_with_timeout(Duration::from_secs(30)) +} + +/// Connect with a custom read timeout. +pub fn ipc_connect_with_timeout(read_timeout: Duration) -> Option { + match UnixStream::connect(IPC_SOCKET) { + Ok(s) => { + s.set_read_timeout(Some(read_timeout)).ok(); + s.set_write_timeout(Some(Duration::from_secs(5))).ok(); + Some(s) + } + Err(e) => { + println!("Cannot connect to {}: {}", IPC_SOCKET, e); + println!(" Make sure server is running: npm start"); + println!(" Skipping test.\n"); + None + } + } +} + +/// Send a JSON request and read the length-prefixed response. +/// +/// This is the ONLY correct way to read from the IPC server. +/// DO NOT use `read_line()` or `BufReader` β€” the server uses binary framing. +pub fn ipc_request(stream: &mut UnixStream, request: &T) -> Result { + // Send newline-delimited JSON request + let json = serde_json::to_string(request).map_err(|e| format!("Serialize: {e}"))?; + stream.write_all(json.as_bytes()).map_err(|e| format!("Write: {e}"))?; + stream.write_all(b"\n").map_err(|e| format!("Write newline: {e}"))?; + stream.flush().map_err(|e| format!("Flush: {e}"))?; + + // Read 4-byte length prefix (u32 big-endian) + let mut len_buf = [0u8; 4]; + stream.read_exact(&mut len_buf).map_err(|e| format!("Read length prefix: {e}"))?; + let length = u32::from_be_bytes(len_buf) as usize; + + if length == 0 { + return Err("Empty response (length=0)".into()); + } + + // Read the full payload + let mut payload = vec![0u8; length]; + stream.read_exact(&mut payload).map_err(|e| format!("Read payload ({length} bytes): {e}"))?; + + // Detect binary frame: JSON header + \0 separator + raw bytes + if let Some(sep_idx) = payload.iter().position(|&b| b == 0) { + let json_bytes = &payload[..sep_idx]; + let binary_data = payload[sep_idx + 1..].to_vec(); + let header: IpcResponse = serde_json::from_slice(json_bytes) + .map_err(|e| format!("Parse binary header: {e}"))?; + Ok(IpcResult::Binary { header, data: binary_data }) + } else { + let response: IpcResponse = serde_json::from_slice(&payload) + .map_err(|e| format!("Parse JSON response: {e}"))?; + Ok(IpcResult::Json(response)) + } +} + +/// Check if the IPC server is reachable (non-blocking probe). +#[allow(dead_code)] +pub fn server_is_running() -> bool { + UnixStream::connect(IPC_SOCKET).is_ok() +} diff --git a/src/debug/jtag/workers/continuum-core/tests/logger_integration.rs b/src/debug/jtag/workers/continuum-core/tests/logger_integration.rs index c69957925..f93753a9f 100644 --- a/src/debug/jtag/workers/continuum-core/tests/logger_integration.rs +++ b/src/debug/jtag/workers/continuum-core/tests/logger_integration.rs @@ -4,20 +4,23 @@ /// and send log messages via Unix socket. use continuum_core::{init_logger, logger}; +use std::sync::Once; -#[test] -fn test_logger_connection() { - // Initialize logger with the standard socket path - let socket_path = "/tmp/jtag-logger-worker.sock"; +static LOGGER_INIT: Once = Once::new(); - match init_logger(socket_path) { - Ok(_) => { - println!("βœ… Logger initialized successfully"); +/// Initialize logger once for all tests (global singleton). +fn ensure_logger() { + LOGGER_INIT.call_once(|| { + let socket_path = "/tmp/jtag-logger-worker.sock"; + if let Err(e) = init_logger(socket_path) { + eprintln!("Logger init failed (expected if logger worker not running): {e}"); } - Err(e) => { - panic!("❌ Failed to initialize logger: {e}"); - } - } + }); +} + +#[test] +fn test_logger_connection() { + ensure_logger(); // Send test messages at different levels logger().debug("test", "logger_integration", "Debug message from continuum-core"); @@ -28,15 +31,14 @@ fn test_logger_connection() { // Give logger time to write std::thread::sleep(std::time::Duration::from_millis(100)); - println!("βœ… Sent 4 test log messages"); + println!("Sent 4 test log messages"); } #[test] fn test_logger_with_timing() { use continuum_core::logging::TimingGuard; - let socket_path = "/tmp/jtag-logger-worker.sock"; - init_logger(socket_path).expect("Failed to init logger"); + ensure_logger(); // Test timing guard { @@ -51,13 +53,12 @@ fn test_logger_with_timing() { // Give logger time to write std::thread::sleep(std::time::Duration::from_millis(100)); - println!("βœ… Timing guard test completed"); + println!("Timing guard test completed"); } #[test] fn test_logger_performance() { - let socket_path = "/tmp/jtag-logger-worker.sock"; - init_logger(socket_path).expect("Failed to init logger"); + ensure_logger(); // Measure time to send 1000 log messages let start = std::time::Instant::now(); @@ -73,9 +74,9 @@ fn test_logger_performance() { let elapsed = start.elapsed(); let per_message = elapsed.as_micros() / 1000; - println!("βœ… 1000 messages in {elapsed:?}"); - println!(" Average: {per_message}ΞΌs per message"); + println!("1000 messages in {elapsed:?}"); + println!(" Average: {per_message}us per message"); // Should be fast (non-blocking) - assert!(per_message < 100, "Logging is too slow: {per_message}ΞΌs per message"); + assert!(per_message < 100, "Logging is too slow: {per_message}us per message"); } diff --git a/src/debug/jtag/workers/continuum-core/tests/memory_recall_accuracy.rs b/src/debug/jtag/workers/continuum-core/tests/memory_recall_accuracy.rs new file mode 100644 index 000000000..b407bbd8f --- /dev/null +++ b/src/debug/jtag/workers/continuum-core/tests/memory_recall_accuracy.rs @@ -0,0 +1,817 @@ +//! Memory Recall Accuracy Tests β€” Corpus-based verification. +//! +//! Like TTS->STT roundtrip tests, these verify that the RIGHT memories surface +//! for the right queries, and irrelevant ones DON'T. +//! +//! Architecture: Rust is a pure compute engine. Data comes from the TS ORM. +//! Tests build MemoryCorpus directly with pre-computed embeddings from +//! DeterministicEmbeddingProvider β€” no SQL, no filesystem, no temp directories. +//! +//! Test dataset: A persona's thought chain about learning Rust, +//! with explicit tags forming an associative graph. + +use continuum_core::memory::{ + CorpusMemory, CorpusTimelineEvent, DeterministicEmbeddingProvider, EmbeddingProvider, + MemoryCorpus, MemoryRecord, MultiLayerRecallRequest, PersonaMemoryManager, TimelineEvent, +}; +use continuum_core::memory::recall::{ + AssociativeRecallLayer, CoreRecallLayer, CrossContextLayer, DecayResurfaceLayer, + RecallLayer, RecallQuery, SemanticRecallLayer, TemporalRecallLayer, +}; +use std::sync::Arc; + +// ─── Test Harness ───────────────────────────────────────────────────────────── + +const PERSONA_ID: &str = "test-persona-recall"; + +/// Create a test manager with deterministic embeddings. +fn test_manager() -> PersonaMemoryManager { + PersonaMemoryManager::new(Arc::new(DeterministicEmbeddingProvider)) +} + +/// Create a CorpusMemory with a deterministic embedding. +fn make_memory( + id: &str, + content: &str, + importance: f64, + memory_type: &str, + timestamp: &str, + tags: Vec, + room_id: &str, +) -> CorpusMemory { + let provider = DeterministicEmbeddingProvider; + let embedding = provider.embed(content).ok(); + + CorpusMemory { + record: MemoryRecord { + id: id.into(), + persona_id: PERSONA_ID.into(), + memory_type: memory_type.into(), + content: content.into(), + context: serde_json::json!({"roomId": room_id}), + timestamp: timestamp.into(), + importance, + access_count: 0, + tags, + related_to: vec![], + source: Some("chat".into()), + last_accessed_at: None, + layer: None, + relevance_score: None, + }, + embedding, + } +} + +/// Seed the standard thought-chain dataset. +/// Returns (memories, IDs) in order: [rust_basics, borrow_checker, lifetimes, concurrency, tokio, cooking] +fn build_thought_chain() -> Vec { + let now = chrono::Utc::now(); + + vec![ + // 0: Foundation β€” high importance core memory + make_memory( + "m-rust-basics", + "Rust memory safety is achieved through ownership and borrowing rules enforced at compile time", + 0.95, + "insight", + &(now - chrono::Duration::minutes(60)).to_rfc3339(), + vec!["rust".into(), "memory-safety".into(), "ownership".into()], + "room-academy", + ), + // 1: Builds on ownership -> borrow checker + make_memory( + "m-borrow-checker", + "The borrow checker prevents data races by ensuring only one mutable reference exists at a time", + 0.85, + "observation", + &(now - chrono::Duration::minutes(55)).to_rfc3339(), + vec!["rust".into(), "borrow-checker".into(), "concurrency".into()], + "room-academy", + ), + // 2: Builds on borrowing -> lifetimes + make_memory( + "m-lifetimes", + "Lifetimes are annotations that tell the compiler how long references are valid", + 0.7, + "observation", + &(now - chrono::Duration::minutes(50)).to_rfc3339(), + vec!["rust".into(), "lifetimes".into(), "references".into()], + "room-academy", + ), + // 3: Concurrency β€” connected to borrow checker + make_memory( + "m-concurrency", + "Rust fearless concurrency means the type system prevents data races at compile time", + 0.8, + "insight", + &(now - chrono::Duration::minutes(30)).to_rfc3339(), + vec!["rust".into(), "concurrency".into(), "type-system".into()], + "room-general", + ), + // 4: Tokio β€” recent, related to concurrency + make_memory( + "m-tokio", + "Tokio async runtime enables concurrent network IO without threads, using Rust futures and await", + 0.65, + "observation", + &(now - chrono::Duration::minutes(5)).to_rfc3339(), + vec!["rust".into(), "tokio".into(), "async".into(), "concurrency".into()], + "room-general", + ), + // 5: UNRELATED β€” cooking (should NOT surface for Rust queries) + make_memory( + "m-cooking", + "The best pasta is cooked al dente in salted boiling water for eight minutes", + 0.4, + "observation", + &(now - chrono::Duration::hours(12)).to_rfc3339(), + vec!["cooking".into(), "pasta".into(), "italian".into()], + "room-kitchen", + ), + ] +} + +/// Build timeline events for cross-context testing. +fn build_timeline_events() -> Vec { + let now = chrono::Utc::now(); + let provider = DeterministicEmbeddingProvider; + + vec![ + CorpusTimelineEvent { + event: TimelineEvent { + id: "ev-academy".into(), + persona_id: PERSONA_ID.into(), + timestamp: (now - chrono::Duration::minutes(20)).to_rfc3339(), + context_type: "room".into(), + context_id: "room-academy".into(), + context_name: "Academy".into(), + event_type: "discussion".into(), + actor_id: "joel".into(), + actor_name: "Joel".into(), + content: "Deep discussion about Rust ownership patterns and memory management strategies".into(), + importance: 0.8, + topics: vec!["rust".into(), "ownership".into(), "architecture".into()], + }, + embedding: provider + .embed("Deep discussion about Rust ownership patterns and memory management strategies") + .ok(), + }, + CorpusTimelineEvent { + event: TimelineEvent { + id: "ev-kitchen".into(), + persona_id: PERSONA_ID.into(), + timestamp: (now - chrono::Duration::minutes(15)).to_rfc3339(), + context_type: "room".into(), + context_id: "room-kitchen".into(), + context_name: "Kitchen".into(), + event_type: "discussion".into(), + actor_id: "chef-ai".into(), + actor_name: "Chef AI".into(), + content: "Discussing Mediterranean cooking techniques and recipes".into(), + importance: 0.5, + topics: vec!["cooking".into(), "mediterranean".into()], + }, + embedding: provider + .embed("Discussing Mediterranean cooking techniques and recipes") + .ok(), + }, + ] +} + +/// Load the standard test corpus into a manager and return the manager. +fn load_standard_corpus( + manager: &PersonaMemoryManager, + memories: Vec, + events: Vec, +) { + manager.load_corpus(PERSONA_ID, memories, events); +} + +/// Build a raw MemoryCorpus directly (for individual layer tests). +fn build_corpus(memories: Vec, events: Vec) -> MemoryCorpus { + MemoryCorpus::from_corpus_data(memories, events) +} + +// ─── Test 1: Basic Store/Recall Roundtrip ───────────────────────────────────── + +#[test] +fn test_roundtrip_corpus_load_and_recall() { + let manager = test_manager(); + let memories = build_thought_chain(); + load_standard_corpus(&manager, memories, vec![]); + + // Multi-layer recall with no query β€” should get core + temporal + decay layers + let req = MultiLayerRecallRequest { + query_text: None, + room_id: "room-general".into(), + max_results: 10, + layers: None, + }; + let resp = manager.multi_layer_recall(PERSONA_ID, &req).unwrap(); + + // Should find memories (core layer alone finds 3 with importance >= 0.8) + assert!( + !resp.memories.is_empty(), + "Multi-layer recall should find memories from corpus" + ); + + // Verify content roundtrip + assert!(resp.memories.iter().any(|m| m.content.contains("ownership and borrowing"))); +} + +// ─── Test 2: Core Layer β€” Never-Forget Memories ────────────────────────────── + +#[test] +fn test_core_layer_finds_high_importance() { + let corpus = build_corpus(build_thought_chain(), vec![]); + let provider = DeterministicEmbeddingProvider; + + let query = RecallQuery { + query_text: None, + query_embedding: None, + room_id: "room-general".into(), + max_results_per_layer: 10, + }; + + let results = CoreRecallLayer.recall(&corpus, &query, &provider); + + // Core layer: importance >= 0.8 + assert!(!results.is_empty(), "Core layer should find high-importance memories"); + assert_eq!( + results.len(), 3, + "Should find 3 core memories (0.95, 0.85, 0.8), got {}", + results.len() + ); + assert!( + results.iter().all(|r| r.memory.importance >= 0.8), + "All core results should have importance >= 0.8" + ); + + // The pasta memory (0.4) should NOT be here + assert!( + !results.iter().any(|r| r.memory.content.contains("pasta")), + "Cooking memory should NOT appear in core recall" + ); +} + +// ─── Test 3: Semantic Layer β€” Meaning-Based Similarity ─────────────────────── + +#[test] +fn test_semantic_layer_finds_related_by_meaning() { + let corpus = build_corpus(build_thought_chain(), vec![]); + let provider = DeterministicEmbeddingProvider; + + let query_emb = provider + .embed("How does Rust handle memory safety and concurrency?") + .unwrap(); + + let query = RecallQuery { + query_text: Some("How does Rust handle memory safety and concurrency?".into()), + query_embedding: Some(query_emb), + room_id: "room-general".into(), + max_results_per_layer: 5, + }; + + let results = SemanticRecallLayer.recall(&corpus, &query, &provider); + + assert!( + !results.is_empty(), + "Semantic layer should find memories related to 'Rust memory safety concurrency'" + ); + + // The top results should be about Rust, not cooking + let top = &results[0]; + assert!( + top.memory.content.to_lowercase().contains("rust") + || top.memory.content.to_lowercase().contains("concurrency") + || top.memory.content.to_lowercase().contains("memory"), + "Top semantic result should be about Rust, got: {}", + top.memory.content + ); + + // Cooking memory should be ranked low (if present at all) + if let Some(pasta_idx) = results.iter().position(|r| r.memory.content.contains("pasta")) { + assert!( + pasta_idx >= results.len() - 2, + "Cooking memory should be near the bottom, found at position {pasta_idx}/{}", + results.len() + ); + } +} + +#[test] +fn test_semantic_layer_cooking_query_finds_cooking() { + let corpus = build_corpus(build_thought_chain(), vec![]); + let provider = DeterministicEmbeddingProvider; + + let query_emb = provider.embed("What do I know about cooking pasta?").unwrap(); + + let query = RecallQuery { + query_text: Some("What do I know about cooking pasta?".into()), + query_embedding: Some(query_emb), + room_id: "room-kitchen".into(), + max_results_per_layer: 5, + }; + + let results = SemanticRecallLayer.recall(&corpus, &query, &provider); + + assert!( + !results.is_empty(), + "Semantic layer should find cooking memory" + ); + + // The pasta memory should rank higher for a cooking query + let has_pasta_in_top = results.iter().take(3).any(|r| r.memory.content.contains("pasta")); + assert!( + has_pasta_in_top, + "Cooking memory should appear in top 3 for cooking query" + ); +} + +// ─── Test 4: Temporal Layer β€” Recent Context ───────────────────────────────── + +#[test] +fn test_temporal_layer_surfaces_recent() { + let corpus = build_corpus(build_thought_chain(), vec![]); + let provider = DeterministicEmbeddingProvider; + + let query = RecallQuery { + query_text: None, + query_embedding: None, + room_id: "room-general".into(), + max_results_per_layer: 3, + }; + + let results = TemporalRecallLayer.recall(&corpus, &query, &provider); + + // Should find recent memories (within 2 hours) + // Memories 0-4 are within 60 minutes; memory 5 (cooking) is 12 hours old + assert!( + !results.is_empty(), + "Temporal layer should find recent memories" + ); + + // The most recent memory (Tokio, 5 min ago) should be in results + assert!( + results.iter().any(|r| r.memory.content.contains("Tokio")), + "Most recent memory (Tokio) should appear in temporal recall" + ); + + // Cooking memory (12 hours old) should NOT appear + assert!( + !results.iter().any(|r| r.memory.content.contains("pasta")), + "Old cooking memory should NOT appear in temporal recall (12h > 2h window)" + ); +} + +// ─── Test 5: Associative Layer β€” Tag/Keyword Graph ─────────────────────────── + +#[test] +fn test_associative_layer_finds_by_tags() { + let corpus = build_corpus(build_thought_chain(), vec![]); + let provider = DeterministicEmbeddingProvider; + + let query = RecallQuery { + query_text: Some("Tell me about Rust concurrency".into()), + query_embedding: None, + room_id: "room-general".into(), + max_results_per_layer: 10, + }; + + let results = AssociativeRecallLayer.recall(&corpus, &query, &provider); + + assert!( + !results.is_empty(), + "Associative layer should find memories tagged with 'rust' or 'concurrency'" + ); + + // Keywords extracted: "tell", "rust", "concurrency" + // Should match memories tagged with "rust" and/or "concurrency" + let rust_count = results + .iter() + .filter(|r| { + r.memory.tags.iter().any(|t| t.contains("rust")) + || r.memory.content.to_lowercase().contains("rust") + }) + .count(); + + assert!( + rust_count >= 3, + "At least 3 memories should match 'rust' by tag or content, got {rust_count}" + ); + + // Cooking should NOT appear (no tag overlap with "rust concurrency") + assert!( + !results.iter().any(|r| r.memory.content.contains("pasta")), + "Cooking memory should NOT appear for 'Rust concurrency' query" + ); +} + +// ─── Test 6: Decay Resurface β€” Spaced Repetition ───────────────────────────── + +#[test] +fn test_decay_resurface_surfaces_unaccessed() { + let corpus = build_corpus(build_thought_chain(), vec![]); + let provider = DeterministicEmbeddingProvider; + + let query = RecallQuery { + query_text: None, + query_embedding: None, + room_id: "room-general".into(), + max_results_per_layer: 10, + }; + + let results = DecayResurfaceLayer.recall(&corpus, &query, &provider); + + // All memories have access_count=0 and were created recently, + // so decay score ~ 0 for recent ones. But any memory with importance >= 0.5 is eligible. + let eligible_count = results.iter().filter(|r| r.memory.importance >= 0.5).count(); + assert_eq!( + eligible_count, + results.len(), + "All decay resurface results should have importance >= 0.5" + ); +} + +// ─── Test 7: Cross-Context Layer ───────────────────────────────────────────── + +#[test] +fn test_cross_context_finds_other_room_events() { + let corpus = build_corpus(build_thought_chain(), build_timeline_events()); + let provider = DeterministicEmbeddingProvider; + + // Query from room-general β€” should find events from room-academy and room-kitchen + let query = RecallQuery { + query_text: Some("Rust ownership patterns".into()), + query_embedding: None, + room_id: "room-general".into(), + max_results_per_layer: 10, + }; + + let results = CrossContextLayer.recall(&corpus, &query, &provider); + + // Should find timeline events from OTHER rooms (not room-general) + assert!( + !results.is_empty(), + "Cross-context layer should find events from other rooms" + ); + + // Events are from room-academy and room-kitchen β€” both should be cross-context + for r in &results { + let ctx_id = r.memory.context.get("context_id").and_then(|v| v.as_str()); + assert_ne!( + ctx_id, + Some("room-general"), + "Cross-context should exclude current room" + ); + } +} + +// ─── Test 8: Multi-Layer Merge β€” Convergence Boosting ──────────────────────── + +#[test] +fn test_multi_layer_convergence_boost() { + let manager = test_manager(); + load_standard_corpus(&manager, build_thought_chain(), vec![]); + + // Multi-layer recall with Rust query β€” memories found by multiple layers + // should rank higher than single-layer finds + let req = MultiLayerRecallRequest { + query_text: Some("Rust memory safety and concurrency".into()), + room_id: "room-general".into(), + max_results: 10, + layers: None, + }; + + let resp = manager.multi_layer_recall(PERSONA_ID, &req).unwrap(); + + assert!( + !resp.memories.is_empty(), + "Multi-layer recall should find memories" + ); + + // The ownership/safety memory (0.95 importance, tagged "rust", recent, semantic match) + // should be found by MULTIPLE layers and thus score highest + let top = &resp.memories[0]; + assert!( + top.content.to_lowercase().contains("rust") + || top.content.to_lowercase().contains("concurrency") + || top.content.to_lowercase().contains("memory"), + "Top multi-layer result should be about Rust, got: {}", + top.content + ); + + // Cooking memory should be at the bottom (or absent) β€” found by 0-1 layers + if let Some(pasta) = resp.memories.iter().find(|m| m.content.contains("pasta")) { + let pasta_pos = resp.memories.iter().position(|m| m.id == pasta.id).unwrap(); + assert!( + pasta_pos >= resp.memories.len() - 2, + "Cooking memory should rank near last, got position {pasta_pos}/{}", + resp.memories.len() + ); + } + + // Verify layer timings are populated + assert!( + resp.layer_timings.len() >= 4, + "Should have timings for at least 4 layers, got {}", + resp.layer_timings.len() + ); + + // Verify performance target: < 100ms for entire multi-layer recall + assert!( + resp.recall_time_ms < 100.0, + "Multi-layer recall should complete in <100ms, took {}ms", + resp.recall_time_ms + ); +} + +// ─── Test 9: Thought Chain β€” Associative Graph Traversal ───────────────────── + +#[test] +fn test_thought_chain_association() { + let manager = test_manager(); + load_standard_corpus(&manager, build_thought_chain(), vec![]); + + // Query about "borrow checker" β€” should find: + // - Direct match: borrow_checker memory (tagged "borrow-checker") + // - Associated: ownership memory (tagged "rust", content overlap) + // - Associated: concurrency memory (tagged "concurrency", content mentions "data races") + let req = MultiLayerRecallRequest { + query_text: Some("borrow checker prevents data races".into()), + room_id: "room-academy".into(), + max_results: 6, + layers: None, + }; + + let resp = manager.multi_layer_recall(PERSONA_ID, &req).unwrap(); + + // Top result should be about Rust memory/ownership/borrow concepts. + let top_content = resp.memories[0].content.to_lowercase(); + assert!( + top_content.contains("borrow") + || top_content.contains("data races") + || top_content.contains("ownership") + || top_content.contains("memory safety"), + "Top result for 'borrow checker prevents data races' should be about Rust memory concepts, got: {}", + resp.memories[0].content + ); + + // Multiple Rust memories should surface β€” the thought chain connects them + let rust_count = resp + .memories + .iter() + .filter(|m| { + m.content.to_lowercase().contains("rust") || m.tags.iter().any(|t| t.contains("rust")) + }) + .count(); + assert!( + rust_count >= 3, + "At least 3 Rust-related memories should surface via thought chain, got {rust_count}" + ); +} + +// ─── Test 10: Negative β€” Unrelated Query Returns Unrelated ─────────────────── + +#[test] +fn test_unrelated_query_finds_correct_domain() { + let manager = test_manager(); + load_standard_corpus(&manager, build_thought_chain(), vec![]); + + // Query about cooking β€” cooking memory should appear somewhere + let req = MultiLayerRecallRequest { + query_text: Some("How do you cook pasta al dente?".into()), + room_id: "room-kitchen".into(), + max_results: 10, + layers: None, + }; + + let resp = manager.multi_layer_recall(PERSONA_ID, &req).unwrap(); + + // Cooking memory should appear somewhere in results + let has_pasta = resp.memories.iter().any(|m| m.content.contains("pasta")); + assert!( + has_pasta, + "Cooking query should surface cooking memory. Got {} results: {:?}", + resp.memories.len(), + resp.memories.iter().map(|m| &m.content).collect::>() + ); +} + +// ─── Test 11: Performance β€” Multi-Layer Recall Under Load ───────────────────── + +#[test] +fn test_recall_performance_with_many_memories() { + let manager = test_manager(); + let now = chrono::Utc::now(); + let provider = DeterministicEmbeddingProvider; + + // Build 100 memories to stress-test + let memories: Vec = (0..100) + .map(|i| { + let topic = match i % 5 { + 0 => "Rust programming", + 1 => "database design", + 2 => "network protocols", + 3 => "machine learning", + _ => "cooking recipes", + }; + let content = format!( + "Memory #{i}: Discussion about topic {topic} with importance level {}", + (50 + (i % 50)) as f64 / 100.0 + ); + let embedding = provider.embed(&content).ok(); + + CorpusMemory { + record: MemoryRecord { + id: format!("perf-m-{i}"), + persona_id: PERSONA_ID.into(), + memory_type: if i % 3 == 0 { "insight" } else { "observation" }.into(), + content, + context: serde_json::json!({"roomId": format!("room-{}", i % 5)}), + timestamp: (now - chrono::Duration::minutes(i as i64)).to_rfc3339(), + importance: (50 + (i % 50)) as f64 / 100.0, + access_count: 0, + tags: vec![ + format!("topic-{}", i % 5), + if i % 2 == 0 { "even" } else { "odd" }.into(), + ], + related_to: vec![], + source: Some("test".into()), + last_accessed_at: None, + layer: None, + relevance_score: None, + }, + embedding, + } + }) + .collect(); + + load_standard_corpus(&manager, memories, vec![]); + + // Time the multi-layer recall + let start = std::time::Instant::now(); + let req = MultiLayerRecallRequest { + query_text: Some("Rust programming language features".into()), + room_id: "room-0".into(), + max_results: 10, + layers: None, + }; + let resp = manager.multi_layer_recall(PERSONA_ID, &req).unwrap(); + let elapsed = start.elapsed(); + + assert!( + !resp.memories.is_empty(), + "Should find memories in 100-memory corpus" + ); + + // Performance target: < 200ms for 100 memories with all 6 layers + // (relaxed for CI; real target is <50ms) + assert!( + elapsed.as_millis() < 200, + "Multi-layer recall on 100 memories should complete in <200ms, took {}ms", + elapsed.as_millis() + ); + + println!( + "Performance: {} memories, {} results, {}ms total, rust internal: {:.1}ms", + 100, + resp.memories.len(), + elapsed.as_millis(), + resp.recall_time_ms + ); + for lt in &resp.layer_timings { + println!( + " {} layer: {} results in {:.1}ms", + lt.layer, lt.results_found, lt.time_ms + ); + } +} + +// ─── Test 12: Corpus Loading Response ──────────────────────────────────────── + +#[test] +fn test_corpus_load_response_counts() { + let manager = test_manager(); + let memories = build_thought_chain(); // 6 memories, all with embeddings + let events = build_timeline_events(); // 2 events, both with embeddings + + let resp = manager.load_corpus(PERSONA_ID, memories, events); + + assert_eq!(resp.memory_count, 6); + assert_eq!(resp.embedded_memory_count, 6); + assert_eq!(resp.timeline_event_count, 2); + assert_eq!(resp.embedded_event_count, 2); + assert!(resp.load_time_ms >= 0.0); +} + +// ─── Test 13: Corpus Not Loaded Error ──────────────────────────────────────── + +#[test] +fn test_recall_without_corpus_returns_error() { + let manager = test_manager(); + + let req = MultiLayerRecallRequest { + query_text: None, + room_id: "room-1".into(), + max_results: 10, + layers: None, + }; + + let result = manager.multi_layer_recall("nonexistent-persona", &req); + assert!(result.is_err(), "Recall without loaded corpus should error"); +} + +// ─── Test 14: Consciousness Context ────────────────────────────────────────── + +#[test] +fn test_consciousness_context_with_cross_context_events() { + let manager = test_manager(); + load_standard_corpus(&manager, build_thought_chain(), build_timeline_events()); + + let req = continuum_core::memory::ConsciousnessContextRequest { + room_id: "room-general".into(), + current_message: None, + skip_semantic_search: false, + }; + + let resp = manager.consciousness_context(PERSONA_ID, &req).unwrap(); + + // Should have cross-context events (from room-academy and room-kitchen) + assert!( + resp.cross_context_event_count > 0, + "Should detect cross-context events from other rooms" + ); + assert!(resp.build_time_ms >= 0.0); +} + +// ─── Test 15: Corpus Replacement ───────────────────────────────────────────── + +#[test] +fn test_corpus_replacement_clears_old_data() { + let manager = test_manager(); + let provider = DeterministicEmbeddingProvider; + + // Load initial corpus + let initial = vec![CorpusMemory { + record: MemoryRecord { + id: "old-memory".into(), + persona_id: PERSONA_ID.into(), + memory_type: "observation".into(), + content: "This is the old memory that should disappear".into(), + context: serde_json::json!({}), + timestamp: chrono::Utc::now().to_rfc3339(), + importance: 0.9, + access_count: 0, + tags: vec!["old".into()], + related_to: vec![], + source: None, + last_accessed_at: None, + layer: None, + relevance_score: None, + }, + embedding: provider.embed("This is the old memory that should disappear").ok(), + }]; + manager.load_corpus(PERSONA_ID, initial, vec![]); + + // Replace with new corpus + let replacement = vec![CorpusMemory { + record: MemoryRecord { + id: "new-memory".into(), + persona_id: PERSONA_ID.into(), + memory_type: "observation".into(), + content: "This is the new replacement memory".into(), + context: serde_json::json!({}), + timestamp: chrono::Utc::now().to_rfc3339(), + importance: 0.9, + access_count: 0, + tags: vec!["new".into()], + related_to: vec![], + source: None, + last_accessed_at: None, + layer: None, + relevance_score: None, + }, + embedding: provider.embed("This is the new replacement memory").ok(), + }]; + manager.load_corpus(PERSONA_ID, replacement, vec![]); + + // Recall should find new memory, not old + let req = MultiLayerRecallRequest { + query_text: None, + room_id: "room-1".into(), + max_results: 10, + layers: None, + }; + let resp = manager.multi_layer_recall(PERSONA_ID, &req).unwrap(); + + assert!( + resp.memories.iter().all(|m| m.id != "old-memory"), + "Old memory should not appear after corpus replacement" + ); + assert!( + resp.memories.iter().any(|m| m.id == "new-memory"), + "New memory should appear after corpus replacement" + ); +} diff --git a/src/debug/jtag/workers/continuum-core/tests/tts_only_test.rs b/src/debug/jtag/workers/continuum-core/tests/tts_only_test.rs index 06816f863..15120c3f5 100644 --- a/src/debug/jtag/workers/continuum-core/tests/tts_only_test.rs +++ b/src/debug/jtag/workers/continuum-core/tests/tts_only_test.rs @@ -3,15 +3,12 @@ //! Tests that TTS produces valid audio via IPC. //! This test uses the currently running server. //! -//! Run with: cargo test -p continuum-core --test tts_only_test -- --nocapture +//! Run with: cargo test -p continuum-core --release --test tts_only_test -- --nocapture -use base64::Engine; -use serde::{Deserialize, Serialize}; -use std::io::{BufRead, BufReader, Write}; -use std::os::unix::net::UnixStream; -use std::time::Duration; +mod common; -const IPC_SOCKET: &str = "/tmp/continuum-core.sock"; +use common::{ipc_connect, ipc_request, IpcResult}; +use serde::Serialize; #[derive(Serialize)] struct SynthesizeRequest { @@ -19,41 +16,15 @@ struct SynthesizeRequest { text: String, } -#[derive(Deserialize)] -struct IpcResponse { - success: bool, - result: Option, - error: Option, -} - -fn send_ipc_request(stream: &mut UnixStream, request: &T) -> Result { - stream.set_read_timeout(Some(Duration::from_secs(30))).ok(); - stream.set_write_timeout(Some(Duration::from_secs(30))).ok(); - - let json = serde_json::to_string(request).map_err(|e| format!("Serialize error: {}", e))?; - writeln!(stream, "{}", json).map_err(|e| format!("Write error: {}", e))?; - - let mut reader = BufReader::new(stream.try_clone().map_err(|e| format!("Clone error: {}", e))?); - let mut line = String::new(); - reader.read_line(&mut line).map_err(|e| format!("Read error: {}", e))?; - - serde_json::from_str(&line).map_err(|e| format!("Parse error: {} (response: {})", e, line)) -} - #[test] fn test_tts_synthesize_via_ipc() { println!("\n=== TTS Synthesize Test (IPC) ===\n"); - let mut stream = match UnixStream::connect(IPC_SOCKET) { - Ok(s) => s, - Err(e) => { - println!("⚠️ Cannot connect to {}: {}", IPC_SOCKET, e); - println!(" Make sure server is running"); - println!(" Skipping test.\n"); - return; - } + let mut stream = match ipc_connect() { + Some(s) => s, + None => return, }; - println!("βœ“ Connected to IPC server"); + println!("Connected to IPC server"); let request = SynthesizeRequest { command: "voice/synthesize", @@ -61,47 +32,55 @@ fn test_tts_synthesize_via_ipc() { }; println!("Synthesizing: \"{}\"", request.text); - let response = match send_ipc_request(&mut stream, &request) { + let result = match ipc_request(&mut stream, &request) { Ok(r) => r, Err(e) => { - println!("❌ IPC error: {}", e); + println!("IPC error: {}", e); + return; + } + }; + + // voice/synthesize returns Binary frame: JSON header + raw PCM + let (header, pcm_bytes) = match result { + IpcResult::Binary { header, data } => (header, data), + IpcResult::Json(resp) => { + if !resp.success { + println!("TTS failed: {:?}", resp.error); + } else { + println!("Expected binary response, got JSON-only"); + } return; } }; - if !response.success { - println!("❌ TTS failed: {:?}", response.error); + if !header.success { + println!("TTS failed: {:?}", header.error); return; } - let result = response.result.unwrap(); - let sample_rate = result["sample_rate"].as_u64().unwrap_or(0); - let duration_ms = result["duration_ms"].as_u64().unwrap_or(0); - let audio_base64 = result["audio"].as_str().unwrap_or(""); - - let audio_bytes = base64::engine::general_purpose::STANDARD - .decode(audio_base64) - .unwrap_or_default(); - let sample_count = audio_bytes.len() / 2; + let meta = header.result.unwrap(); + let sample_rate = meta["sample_rate"].as_u64().unwrap_or(0); + let num_samples = meta["num_samples"].as_u64().unwrap_or(0); + let duration_ms = meta["duration_ms"].as_u64().unwrap_or(0); println!("Sample rate: {}Hz", sample_rate); - println!("Samples: {}", sample_count); + println!("Samples: {} (header), {} (from PCM bytes)", num_samples, pcm_bytes.len() / 2); println!("Duration: {}ms ({:.2}s)", duration_ms, duration_ms as f64 / 1000.0); - println!("Audio bytes: {}", audio_bytes.len()); + println!("PCM bytes: {}", pcm_bytes.len()); - // Analyze audio samples - let samples: Vec = audio_bytes + // Decode PCM samples from raw binary + let samples: Vec = pcm_bytes .chunks_exact(2) .map(|chunk| i16::from_le_bytes([chunk[0], chunk[1]])) .collect(); - // Check for silence + // Audio analysis let non_zero = samples.iter().filter(|&&s| s != 0).count(); let max_amplitude = samples.iter().map(|&s| s.abs()).max().unwrap_or(0); - let rms = (samples.iter().map(|&s| (s as i64).pow(2)).sum::() as f64 / samples.len() as f64).sqrt(); + let rms = (samples.iter().map(|&s| (s as i64).pow(2)).sum::() as f64 / samples.len().max(1) as f64).sqrt(); println!("\n--- Audio Analysis ---"); - println!("Non-zero samples: {} / {} ({:.1}%)", non_zero, samples.len(), non_zero as f64 / samples.len() as f64 * 100.0); + println!("Non-zero samples: {} / {} ({:.1}%)", non_zero, samples.len(), non_zero as f64 / samples.len().max(1) as f64 * 100.0); println!("Max amplitude: {} (max: 32767)", max_amplitude); println!("RMS: {:.1}", rms); @@ -111,29 +90,27 @@ fn test_tts_synthesize_via_ipc() { // Verify we have audio (not silence) assert!(non_zero > samples.len() / 2, "Audio should not be mostly silent"); + // Verify PCM byte count matches header + assert_eq!( + pcm_bytes.len(), + num_samples as usize * 2, + "PCM bytes should be 2 * num_samples" + ); + // Verify reasonable duration - let expected_duration = (sample_count as u64 * 1000) / 16000; + let expected_duration = (num_samples * 1000) / 16000; assert!( (duration_ms as i64 - expected_duration as i64).abs() < 100, "Duration mismatch" ); - println!("\nβœ… TTS test PASSED"); + println!("\nTTS test PASSED"); } #[test] fn test_tts_audio_quality() { println!("\n=== TTS Audio Quality Test ===\n"); - let mut stream = match UnixStream::connect(IPC_SOCKET) { - Ok(s) => s, - Err(e) => { - println!("⚠️ Cannot connect to {}: {}", IPC_SOCKET, e); - return; - } - }; - - // Test with multiple phrases let phrases = vec![ "Hello", "Testing audio quality", @@ -141,9 +118,9 @@ fn test_tts_audio_quality() { ]; for phrase in phrases { - stream = match UnixStream::connect(IPC_SOCKET) { - Ok(s) => s, - Err(_) => continue, + let mut stream = match ipc_connect() { + Some(s) => s, + None => return, }; let request = SynthesizeRequest { @@ -151,30 +128,37 @@ fn test_tts_audio_quality() { text: phrase.to_string(), }; - let response = match send_ipc_request(&mut stream, &request) { - Ok(r) if r.success => r, - _ => { - println!("❌ Failed to synthesize \"{}\"", phrase); + let result = match ipc_request(&mut stream, &request) { + Ok(r) => r, + Err(e) => { + println!("\"{}\" - IPC error: {}", phrase, e); continue; } }; - let result = response.result.unwrap(); - let sample_rate = result["sample_rate"].as_u64().unwrap_or(0); - let duration_ms = result["duration_ms"].as_u64().unwrap_or(0); - let audio_base64 = result["audio"].as_str().unwrap_or(""); + let (header, pcm_bytes) = match result { + IpcResult::Binary { header, data } if header.success => (header, data), + IpcResult::Binary { header, .. } => { + println!("\"{}\" - TTS failed: {:?}", phrase, header.error); + continue; + } + IpcResult::Json(resp) => { + println!("\"{}\" - Failed: {:?}", phrase, resp.error); + continue; + } + }; - let audio_bytes = base64::engine::general_purpose::STANDARD - .decode(audio_base64) - .unwrap_or_default(); + let meta = header.result.unwrap(); + let sample_rate = meta["sample_rate"].as_u64().unwrap_or(0); + let duration_ms = meta["duration_ms"].as_u64().unwrap_or(0); - // Analyze samples - let samples: Vec = audio_bytes + // Decode PCM samples + let samples: Vec = pcm_bytes .chunks_exact(2) .map(|chunk| i16::from_le_bytes([chunk[0], chunk[1]])) .collect(); - let non_zero_pct = samples.iter().filter(|&&s| s.abs() > 10).count() as f64 / samples.len() as f64 * 100.0; + let non_zero_pct = samples.iter().filter(|&&s| s.abs() > 10).count() as f64 / samples.len().max(1) as f64 * 100.0; let max_amp = samples.iter().map(|&s| s.abs()).max().unwrap_or(0); println!("\"{}\"", phrase); @@ -184,5 +168,5 @@ fn test_tts_audio_quality() { assert_eq!(sample_rate, 16000, "Sample rate must be 16kHz for \"{}\"", phrase); } - println!("\nβœ… Audio quality test PASSED"); + println!("\nAudio quality test PASSED"); } diff --git a/src/debug/jtag/workers/continuum-core/tests/tts_stt_roundtrip.rs b/src/debug/jtag/workers/continuum-core/tests/tts_stt_roundtrip.rs index ae9d1ec50..29ccfc677 100644 --- a/src/debug/jtag/workers/continuum-core/tests/tts_stt_roundtrip.rs +++ b/src/debug/jtag/workers/continuum-core/tests/tts_stt_roundtrip.rs @@ -1,4 +1,4 @@ -//! TTS β†’ STT Roundtrip Integration Test +//! TTS -> STT Roundtrip Integration Test //! //! Verifies audio pipeline produces intelligible speech by: //! 1. Connecting to running continuum-core server via IPC @@ -7,14 +7,13 @@ //! 4. Comparing the results //! //! REQUIREMENTS: Server must be running (npm start) -//! Run with: cargo test -p continuum-core --test tts_stt_roundtrip -- --nocapture +//! Run with: cargo test -p continuum-core --release --test tts_stt_roundtrip -- --nocapture -use base64::Engine; -use serde::{Deserialize, Serialize}; -use std::io::{BufRead, BufReader, Write}; -use std::os::unix::net::UnixStream; +mod common; -const IPC_SOCKET: &str = "/tmp/continuum-core.sock"; +use base64::Engine; +use common::{ipc_connect, ipc_request, IpcResult}; +use serde::Serialize; const TEST_PHRASES: &[&str] = &[ "Hello world", @@ -22,14 +21,16 @@ const TEST_PHRASES: &[&str] = &[ "Testing one two three", ]; -/// IPC request for TTS +// ============================================================================ +// Request Types +// ============================================================================ + #[derive(Serialize)] struct SynthesizeRequest { command: &'static str, text: String, } -/// IPC request for STT #[derive(Serialize)] struct TranscribeRequest { command: &'static str, @@ -37,24 +38,33 @@ struct TranscribeRequest { language: Option, } -/// IPC response -#[derive(Deserialize)] -struct IpcResponse { - success: bool, - result: Option, - error: Option, -} +// ============================================================================ +// Helpers +// ============================================================================ fn word_similarity(expected: &str, actual: &str) -> f32 { - // Normalize: lowercase, remove punctuation + // Normalize: lowercase, replace hyphens/punctuation with spaces, split on whitespace. + // Also split pure-digit tokens into individual digits (STT concatenates "1 2 3" β†’ "123"). let normalize = |s: &str| -> Vec { - s.to_lowercase() + let tokens: Vec = s.to_lowercase() .chars() - .filter(|c| c.is_alphanumeric() || c.is_whitespace()) + .map(|c| if c.is_alphanumeric() { c } else { ' ' }) .collect::() .split_whitespace() .map(|w| w.to_string()) - .collect() + .collect(); + // Split pure-digit tokens into individual digit strings + let mut result = Vec::new(); + for token in tokens { + if token.len() > 1 && token.chars().all(|c| c.is_ascii_digit()) { + for ch in token.chars() { + result.push(ch.to_string()); + } + } else { + result.push(token); + } + } + result }; let expected_words = normalize(expected); @@ -66,13 +76,18 @@ fn word_similarity(expected: &str, actual: &str) -> f32 { let mut matches = 0; for word in &expected_words { - // Allow partial matches for numbers (e.g., "one" matches "1") let word_matches = actual_words.iter().any(|w| { - w == word || - // Handle number words - (word == "one" && w == "1") || - (word == "two" && w == "2") || - (word == "three" && w == "3") + // Exact match + w == word + // Number words ↔ digits + || (word == "one" && w == "1") + || (word == "two" && w == "2") + || (word == "three" && w == "3") + || (word == "four" && w == "4") + || (word == "five" && w == "5") + // STT often clips the first phoneme β€” match if suffix with ≀1 char difference + || (word.len() > 3 && w.len() + 1 >= word.len() && word.ends_with(w.as_str())) + || (w.len() > 3 && word.len() + 1 >= w.len() && w.ends_with(word.as_str())) }); if word_matches { matches += 1; @@ -82,32 +97,19 @@ fn word_similarity(expected: &str, actual: &str) -> f32 { matches as f32 / expected_words.len() as f32 } -fn send_ipc_request(stream: &mut UnixStream, request: &T) -> Result { - let json = serde_json::to_string(request).map_err(|e| format!("Serialize error: {}", e))?; - writeln!(stream, "{}", json).map_err(|e| format!("Write error: {}", e))?; - - let mut reader = BufReader::new(stream.try_clone().map_err(|e| format!("Clone error: {}", e))?); - let mut line = String::new(); - reader.read_line(&mut line).map_err(|e| format!("Read error: {}", e))?; - - serde_json::from_str(&line).map_err(|e| format!("Parse error: {} (response: {})", e, line)) -} +// ============================================================================ +// Tests +// ============================================================================ #[test] fn test_tts_stt_roundtrip_via_ipc() { - println!("\n=== TTS β†’ STT Roundtrip Test (IPC) ===\n"); + println!("\n=== TTS -> STT Roundtrip Test (IPC) ===\n"); - // Connect to server - let mut stream = match UnixStream::connect(IPC_SOCKET) { - Ok(s) => s, - Err(e) => { - println!("⚠️ Cannot connect to {}: {}", IPC_SOCKET, e); - println!(" Make sure server is running: npm start"); - println!(" Skipping test.\n"); - return; - } - }; - println!("βœ“ Connected to IPC server\n"); + // Verify server is reachable before running test suite + if ipc_connect().is_none() { + return; + } + println!("Connected to IPC server\n"); let mut passed = 0; let mut failed = 0; @@ -115,14 +117,10 @@ fn test_tts_stt_roundtrip_via_ipc() { for phrase in TEST_PHRASES { println!("Testing: \"{}\"", phrase); - // Reconnect for each phrase (clean connection) - stream = match UnixStream::connect(IPC_SOCKET) { - Ok(s) => s, - Err(e) => { - println!(" ❌ Reconnect failed: {}", e); - failed += 1; - continue; - } + // Fresh connection per phrase + let mut stream = match ipc_connect() { + Some(s) => s, + None => { failed += 1; continue; } }; // Step 1: Synthesize via IPC @@ -132,87 +130,93 @@ fn test_tts_stt_roundtrip_via_ipc() { text: phrase.to_string(), }; - let synth_response = match send_ipc_request(&mut stream, &synth_request) { + let synth_result = match ipc_request(&mut stream, &synth_request) { Ok(r) => r, Err(e) => { - println!("❌ IPC error: {}", e); + println!("IPC error: {}", e); + failed += 1; + continue; + } + }; + + // Extract PCM audio β€” synthesize returns Binary frame + let (header, pcm_bytes) = match synth_result { + IpcResult::Binary { header, data } => (header, data), + IpcResult::Json(resp) => { + if !resp.success { + println!("TTS failed: {:?}", resp.error); + } else { + println!("Expected binary response, got JSON-only"); + } failed += 1; continue; } }; - if !synth_response.success { - println!("❌ TTS failed: {:?}", synth_response.error); + if !header.success { + println!("TTS failed: {:?}", header.error); failed += 1; continue; } - let result = synth_response.result.unwrap(); - let audio_base64 = result["audio"].as_str().unwrap_or(""); + let result = header.result.unwrap(); let sample_rate = result["sample_rate"].as_u64().unwrap_or(16000); + let num_samples = result["num_samples"].as_u64().unwrap_or(0); let duration_ms = result["duration_ms"].as_u64().unwrap_or(0); - // Decode to get sample count - let audio_bytes = base64::engine::general_purpose::STANDARD - .decode(audio_base64) - .unwrap_or_default(); - let sample_count = audio_bytes.len() / 2; - - println!("βœ“ {} samples at {}Hz ({}ms)", sample_count, sample_rate, duration_ms); + println!("{} samples at {}Hz ({}ms)", num_samples, sample_rate, duration_ms); if sample_rate != 16000 { - println!(" ⚠️ WARNING: Sample rate is {}Hz, expected 16000Hz", sample_rate); + println!(" WARNING: Sample rate is {}Hz, expected 16000Hz", sample_rate); } - // Step 2: Transcribe via IPC + // Step 2: Transcribe via IPC β€” encode raw PCM as base64 for STT input print!(" 2. STT transcribing... "); - // Reconnect for STT - stream = match UnixStream::connect(IPC_SOCKET) { - Ok(s) => s, - Err(e) => { - println!("❌ Reconnect failed: {}", e); - failed += 1; - continue; - } + let mut stream = match ipc_connect() { + Some(s) => s, + None => { failed += 1; continue; } }; + let audio_base64 = base64::engine::general_purpose::STANDARD.encode(&pcm_bytes); let transcribe_request = TranscribeRequest { command: "voice/transcribe", - audio: audio_base64.to_string(), + audio: audio_base64, language: Some("en".to_string()), }; - let transcribe_response = match send_ipc_request(&mut stream, &transcribe_request) { + let transcribe_result = match ipc_request(&mut stream, &transcribe_request) { Ok(r) => r, Err(e) => { - println!("❌ IPC error: {}", e); + println!("IPC error: {}", e); failed += 1; continue; } }; - if !transcribe_response.success { - println!("❌ STT failed: {:?}", transcribe_response.error); + let transcribe_resp = transcribe_result.into_json(); + + if !transcribe_resp.success { + println!("STT failed: {:?}", transcribe_resp.error); failed += 1; continue; } - let result = transcribe_response.result.unwrap(); + let result = transcribe_resp.result.unwrap(); let transcription = result["text"].as_str().unwrap_or(""); let confidence = result["confidence"].as_f64().unwrap_or(0.0); - println!("βœ“ \"{}\" (confidence: {:.2})", transcription, confidence); + println!("\"{}\" (confidence: {:.2})", transcription, confidence); // Step 3: Compare let similarity = word_similarity(phrase, transcription); println!(" 3. Similarity: {:.1}%", similarity * 100.0); if similarity >= 0.6 { - println!(" βœ… PASSED\n"); + println!(" PASSED\n"); passed += 1; } else { - println!(" ❌ FAILED - transcription mismatch"); + println!(" FAILED - transcription mismatch"); println!(" Expected: \"{}\"", phrase); println!(" Got: \"{}\"\n", transcription); failed += 1; @@ -223,20 +227,16 @@ fn test_tts_stt_roundtrip_via_ipc() { println!("Passed: {}/{}", passed, TEST_PHRASES.len()); println!("Failed: {}/{}", failed, TEST_PHRASES.len()); - assert!(failed == 0, "Some TTSβ†’STT roundtrip tests failed"); + assert!(failed == 0, "Some TTS->STT roundtrip tests failed"); } #[test] fn test_tts_sample_rate_via_ipc() { println!("\n=== TTS Sample Rate Test (IPC) ===\n"); - let mut stream = match UnixStream::connect(IPC_SOCKET) { - Ok(s) => s, - Err(e) => { - println!("⚠️ Cannot connect to {}: {}", IPC_SOCKET, e); - println!(" Skipping test.\n"); - return; - } + let mut stream = match ipc_connect() { + Some(s) => s, + None => return, }; let request = SynthesizeRequest { @@ -244,28 +244,33 @@ fn test_tts_sample_rate_via_ipc() { text: "Test sample rate".to_string(), }; - let response = send_ipc_request(&mut stream, &request).expect("IPC failed"); - assert!(response.success, "TTS failed: {:?}", response.error); + let result = ipc_request(&mut stream, &request).expect("IPC request failed"); + let (header, pcm_bytes) = result.into_binary(); - let result = response.result.unwrap(); + assert!(header.success, "TTS failed: {:?}", header.error); + + let result = header.result.unwrap(); let sample_rate = result["sample_rate"].as_u64().unwrap(); + let num_samples = result["num_samples"].as_u64().unwrap(); let duration_ms = result["duration_ms"].as_u64().unwrap(); - let audio_base64 = result["audio"].as_str().unwrap(); - let audio_bytes = base64::engine::general_purpose::STANDARD - .decode(audio_base64) - .unwrap(); - let sample_count = audio_bytes.len() / 2; + // PCM bytes should be 2 * num_samples (i16 = 2 bytes) + assert_eq!( + pcm_bytes.len(), + num_samples as usize * 2, + "PCM byte count should be 2 * num_samples" + ); println!("Sample rate: {}Hz", sample_rate); - println!("Samples: {}", sample_count); + println!("Samples: {}", num_samples); println!("Duration: {}ms", duration_ms); + println!("PCM bytes: {}", pcm_bytes.len()); // Verify sample rate is 16kHz assert_eq!(sample_rate, 16000, "TTS must output 16kHz for CallServer compatibility"); // Verify duration matches sample count (within 100ms tolerance) - let expected_duration = (sample_count as u64 * 1000) / 16000; + let expected_duration = (num_samples * 1000) / 16000; assert!( (duration_ms as i64 - expected_duration as i64).abs() < 100, "Duration {}ms doesn't match sample count (expected ~{}ms)", @@ -273,34 +278,36 @@ fn test_tts_sample_rate_via_ipc() { expected_duration ); - println!("βœ… Sample rate test PASSED"); + // Verify PCM data is not silence + let samples: Vec = pcm_bytes + .chunks_exact(2) + .map(|c| i16::from_le_bytes([c[0], c[1]])) + .collect(); + let max_amp = samples.iter().map(|s| s.abs()).max().unwrap_or(0); + assert!(max_amp > 100, "Audio should not be silence, max amplitude: {}", max_amp); + + println!("Max amplitude: {}", max_amp); + println!("Sample rate test PASSED"); } #[test] fn test_stt_whisper_via_ipc() { println!("\n=== STT Whisper Test (IPC) ===\n"); - // Create known audio samples (silence with a tone) - // This tests that STT infrastructure works, even if it doesn't recognize silence - let mut samples: Vec = vec![0; 16000]; // 1 second of silence - - // Add a simple tone to make it non-silent + // Create known audio: 1 second of 440Hz tone + let mut samples: Vec = vec![0; 16000]; for (i, sample) in samples.iter_mut().enumerate() { let t = i as f32 / 16000.0; *sample = (440.0_f32 * 2.0 * std::f32::consts::PI * t).sin() as i16 * 1000; } - // Encode to base64 + // Encode to base64 for STT input let bytes: Vec = samples.iter().flat_map(|s| s.to_le_bytes()).collect(); let audio_base64 = base64::engine::general_purpose::STANDARD.encode(&bytes); - let mut stream = match UnixStream::connect(IPC_SOCKET) { - Ok(s) => s, - Err(e) => { - println!("⚠️ Cannot connect to {}: {}", IPC_SOCKET, e); - println!(" Skipping test.\n"); - return; - } + let mut stream = match ipc_connect() { + Some(s) => s, + None => return, }; let request = TranscribeRequest { @@ -309,22 +316,30 @@ fn test_stt_whisper_via_ipc() { language: Some("en".to_string()), }; - let response = send_ipc_request(&mut stream, &request); + let result = match ipc_request(&mut stream, &request) { + Ok(r) => r, + Err(e) => { + println!("IPC error: {}", e); + println!(" This may indicate the STT model is not loaded."); + return; + } + }; - match response { - Ok(r) if r.success => { - let result = r.result.unwrap(); + let response = result.into_json(); + + match (response.success, response.result) { + (true, Some(result)) => { println!("Transcription: \"{}\"", result["text"].as_str().unwrap_or("")); println!("Language: {}", result["language"].as_str().unwrap_or("")); println!("Confidence: {:.2}", result["confidence"].as_f64().unwrap_or(0.0)); - println!("βœ… STT infrastructure test PASSED"); + println!("STT infrastructure test PASSED"); } - Ok(r) => { - println!("❌ STT failed: {:?}", r.error); + (false, _) => { + println!("STT failed: {:?}", response.error); println!(" This is OK if Whisper model is not loaded."); } - Err(e) => { - println!("❌ IPC error: {}", e); + _ => { + println!("Unexpected response format"); } } } diff --git a/src/debug/jtag/workers/continuum-core/tests/tts_timing_benchmark.rs b/src/debug/jtag/workers/continuum-core/tests/tts_timing_benchmark.rs index c0cc4b61e..10466eab0 100644 --- a/src/debug/jtag/workers/continuum-core/tests/tts_timing_benchmark.rs +++ b/src/debug/jtag/workers/continuum-core/tests/tts_timing_benchmark.rs @@ -3,8 +3,12 @@ //! Measures TTS synthesis time for different adapters and text lengths. //! Outputs structured timing data for iteration and optimization. //! -//! Run with: cargo test -p continuum-core --test tts_timing_benchmark -- --nocapture +//! Run with: cargo test -p continuum-core --release --test tts_timing_benchmark -- --nocapture +mod common; + +use common::{ipc_connect_with_timeout, ipc_request, IpcResult}; +use serde::Serialize; use std::time::{Duration, Instant}; /// Benchmark configuration @@ -15,6 +19,12 @@ const TEST_PHRASES: &[(&str, &str)] = &[ ("very_long", "Hello and welcome to this comprehensive test of our text to speech system. We are measuring the time it takes to synthesize various lengths of text using different TTS adapters. This includes both local models like Piper and Kokoro, as well as potential cloud-based solutions. The goal is to optimize our voice pipeline to achieve sub-second latency for typical conversational responses. Real-time voice communication requires fast synthesis to maintain natural conversation flow."), ]; +#[derive(Serialize)] +struct SynthesizeRequest { + command: &'static str, + text: String, +} + /// Timing result for a single synthesis #[derive(Debug, Clone)] struct TimingResult { @@ -24,7 +34,7 @@ struct TimingResult { synthesis_ms: u128, audio_duration_ms: u64, sample_count: usize, - real_time_factor: f64, // synthesis_time / audio_duration (< 1.0 means faster than real-time) + real_time_factor: f64, } impl TimingResult { @@ -43,63 +53,37 @@ impl TimingResult { /// Run timing benchmark via IPC to running server fn benchmark_via_ipc(text: &str) -> Result<(Duration, u64, usize), String> { - use serde::{Deserialize, Serialize}; - use std::io::{BufRead, BufReader, Write}; - use std::os::unix::net::UnixStream; - use base64::Engine; - - const IPC_SOCKET: &str = "/tmp/continuum-core.sock"; - - #[derive(Serialize)] - struct SynthesizeRequest { - command: &'static str, - text: String, - } - - #[derive(Deserialize)] - struct IpcResponse { - success: bool, - result: Option, - error: Option, - } - - let mut stream = UnixStream::connect(IPC_SOCKET) - .map_err(|e| format!("Cannot connect to {}: {}", IPC_SOCKET, e))?; - - stream.set_read_timeout(Some(Duration::from_secs(120))).ok(); - stream.set_write_timeout(Some(Duration::from_secs(10))).ok(); + let mut stream = ipc_connect_with_timeout(Duration::from_secs(120)) + .ok_or_else(|| "Cannot connect to IPC server".to_string())?; let request = SynthesizeRequest { command: "voice/synthesize", text: text.to_string(), }; - let json = serde_json::to_string(&request).map_err(|e| format!("Serialize error: {}", e))?; - - // Time the synthesis + // Time the full round-trip let start = Instant::now(); - writeln!(stream, "{}", json).map_err(|e| format!("Write error: {}", e))?; - - let mut reader = BufReader::new(stream.try_clone().map_err(|e| format!("Clone error: {}", e))?); - let mut line = String::new(); - reader.read_line(&mut line).map_err(|e| format!("Read error: {}", e))?; + let result = ipc_request(&mut stream, &request)?; let elapsed = start.elapsed(); - let response: IpcResponse = serde_json::from_str(&line) - .map_err(|e| format!("Parse error: {} (response: {})", e, line))?; + // Extract metadata from binary response + let (header, pcm_bytes) = match result { + IpcResult::Binary { header, data } => (header, data), + IpcResult::Json(resp) => { + if !resp.success { + return Err(format!("TTS failed: {:?}", resp.error)); + } + return Err("Expected binary response, got JSON-only".into()); + } + }; - if !response.success { - return Err(format!("TTS failed: {:?}", response.error)); + if !header.success { + return Err(format!("TTS failed: {:?}", header.error)); } - let result = response.result.ok_or("No result")?; - let duration_ms = result["duration_ms"].as_u64().unwrap_or(0); - let audio_base64 = result["audio"].as_str().unwrap_or(""); - - let audio_bytes = base64::engine::general_purpose::STANDARD - .decode(audio_base64) - .unwrap_or_default(); - let sample_count = audio_bytes.len() / 2; // i16 = 2 bytes + let meta = header.result.ok_or("No result")?; + let duration_ms = meta["duration_ms"].as_u64().unwrap_or(0); + let sample_count = pcm_bytes.len() / 2; // i16 = 2 bytes Ok((elapsed, duration_ms, sample_count)) } @@ -111,7 +95,7 @@ fn benchmark_tts_timing() { println!("{}\n", "=".repeat(80)); // Check if server is running - if std::os::unix::net::UnixStream::connect("/tmp/continuum-core.sock").is_err() { + if !common::server_is_running() { println!("Server not running. Start with: npm start"); println!("Skipping benchmark."); return; @@ -165,7 +149,7 @@ fn benchmark_tts_timing() { }; let result = TimingResult { - adapter: "piper".to_string(), // Currently only piper is active + adapter: "piper".to_string(), phrase_name: phrase_name.to_string(), text_chars: text.len(), synthesis_ms: avg_ms, @@ -242,15 +226,14 @@ fn benchmark_tts_scaling() { println!("TTS SCALING TEST (chars vs time)"); println!("{}\n", "=".repeat(80)); - // Check if server is running - if std::os::unix::net::UnixStream::connect("/tmp/continuum-core.sock").is_err() { + if !common::server_is_running() { println!("Server not running. Skipping."); return; } // Test with progressively longer texts let base_sentence = "Hello world. "; - let lengths = [1, 2, 4, 8, 16]; // Number of sentence repetitions + let lengths = [1, 2, 4, 8, 16]; println!("{:<10} {:<8} {:<12} {:<12} {:<10}", "Reps", "Chars", "Synth(ms)", "Audio(ms)", "ms/char");
  • oB5cQWiVuUyc7o+a+d_+ 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

    0Sw2V%$5f3xnVO*DMqm&! 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 auC$N@t`8Nw9yJ>T{AyE~g3S^$6$o~F1NGhi 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≫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ⅈ_7qDGYtqb#|KoGu036_3y7!xX0K%uR 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�(zzK4qpj)1J) zV58g<0;GX^mH~fTPktSD-`aNX9iFVeJgrl5h6qalRiz%!-q%) zNI>`BP)cvOaJZY*?C^jWz8X?6~`^IP?;Dk z)_q;X(dwD}$LHEk-LR6g?+UUE34Arb(CQ`o#csY|oLOHTn&$1G+NIqV&;`r5ALvrhY*-!9jPzmzclZ)0x$owf=B%aT>h;k@e$GFVm zd?;JN?-M3&jxsHKeoNOgZn_7u(b1r|N@?A$)x3eVd23N2w*|4vPa8&4Afki*En>hg zd;y4XRTo<}y*bTNk1^Iwnu#Ag^pZ3i_xKYfS~Q6L+EHLlSWzK<)`) z(79{G`$KWJws1S)$R%LVkM9A|F1%+feU8<)(>2P>S;LUFxA@l}U>0MelDR%Z>Q%zb zLhLYOtqtMLZicjs&tPCj;j+bec#PW5yo%wG(N5S!(@3LaDRl zh{rp>wYYD-k^bb%SqP;7pG`I*!FH%rd#M)1q{5Hh?Rr5d6n+ukq+9SLR%X3h1tIY>ua-vB5d2T@W zrY?((bt0VxUzcYE+OJ(emrLjC(!UoPt`?LnM(tP1en6IfPQDGK%+{w$UEqf#D@ z_{hv(q(Jthdo#SH&w`&Zb4o z43ny#WE%vroTaq4U@eS*&6TWGb;>Fg=lR%3zNFdK`0KNqJ8ctBHgA`8zGR=Ji2TSWVcs2xIy6EUG6{{}VGI{GtzJvf$Dg7^q^qy}$wIc^B6LxLw zuHUA}8S4d32-`31d6pTzkGg(W&xoJadKi{@jG<#2SYaAF254Huq8tCgQn5?dVyHvk z)I7>%JJXl5b=N{EGVMq-W)J8#Nyf5H_+(jR(YsJpcXQS7zamty;|>)t!ZU4 zQf;rtpfOsEoI)aNCRzB2LVc+i*&m6&v`@FA_SOur_rP5&^lNWZ!6R1Ns#EKw_kCk|S3 ztpNr!>H7MH+mjv>D0uRmphWALVVzZ$HN|3f^4M4D4@EG1s*Y%Ek-sfO3lEv@BingK zJteq%8p%i&vsgvwgbN8gg#?U~rSdKYzMKWp(0FA(9o7V_z+Y$^!X3kx65#Yye(Kq< zz{CFLa)Pj%hCW_-5l;1huGIw}PdFg^^I{yb8k3CLv#t7at=i6`fart=wHPf%$qPYy zI1d*yBbTwGN;N0+x!gf#M}(ps`)>rnD8FE6k5>9fD9x+UR89Dwp1D^K_}eCwyCQ4| zm?j}K=~X)y=&T`J`w@86#C?+5<{6g^`MFQ7Nh3(@bq)`IE)JQ_U)jgSB|X2G zcs`z3X$dzS{3X_;Wl@g^7JodS7$Gu|**NTOaTEP`z?B7)?i!Us)kc}!5muzimILWU zvYLz0Bw+PW)~2K%;*yM3m#pP1UH*LM3HKb2zR@UUj&vL<^WCjw4{S>zc~Rx)KZ2*M z?UwJ_1L!fYWb(_U&Lg7y;`kGbw%n->X;GC@?FFuL|E0X5+NI|sF$J#VEGksvlf`kv zUo5VTA8#&^^GN+AuP>CoyfpG3lK8`eyP=(D?#?d{H80@Zd&TZ+#h6Jr+>+x3plkHI zkd8SdBpiF3-XCqN^m)F2!mv~tzO4*Kj}BtqZy}n$GX%53@xUJa+I!1U;z;wz{qr1G zhMg%_;|Ao!F7Z;u+-2`+u&sO>t-Y=rwbzzsX`y)3xLIzr)^LBPIAzdINYuZz z(PF!A=h|K}VYf+W#o6N0#aT5{%4?WyQw<`43C|F(uRH^xo+|5c@`bToI?(V3FYUtj zH%RaZQ$3<0QE&&iJdF%Fw$n0a)Q=mel->w}5&?yBe#6o14TvZ3qIs?n$vA;`e`4a^ z`JY1FKYLqCC#6CO?K5s=+Gg1Xb`Yn6PQ9r1Nz}1#Kb*b7u^RM^B-}5iVbtH!-rmGC zv0ecYQ9u#M;7=-@aLDRe0H}gGf-s`M@GjKQ>4GMRMmH|jN7fKG3YUBZ2R-^{BRu$) zI3905L5P;xP4+$l(Ye1tLgeLH8Zvv({j}Vz(=PvZ=duu$OT)2IZf8pryG&~N6Z_?+ z;P=NJp@Ye48grU3nyP>;rhwj6)#Z(VHSP{XFT+VOE6>5du1XSohdCY-u1XJs6T*1j zU@+LO`++Jc>XH`oB*GK%B=cxcwsS^o=>f`WkA6w0pD(<|nRFuk;6Q^Z!|k(4bxrxd z(`zjvyiStn6koF5Mxpixi3aZ&xy2^tsPu&q{^F8qH?odsKzUD&Q? zh8CnldI0HCx*1BkVdzp25NYWex&($U=@2BP8$@a89vX(0?%urLKE7k`AMreE-Rr*2 z^NPTv24ea)@u2*UJ{KdnX9@r8<=R}&W#-Uq#UnZk=&Y|8Fie@Y)$mc+e`&K7;;{W; z*O<%32|tKM3slSFce3lL)fKqBH+DuK!7!AZ1VA4k%TzP$!xsIl4}Dv@#u}ZhGt}28 zBE!bu72nwcCY@RJE^l3ldViC_smFBn`XS?<<%&Kbu?>6rC$+}%hdsFN>@yaC9yzJq zM3g?Zst=XeaBe<*)o9EaI}DTa5GDg`$S@45V>^A?no28IXR5#KMyuNSt0WS4m;L$7 zV64d5ZmlFcvBq+cNN5P$sa~s+-jk_Rf=k@@OuauvUb2j_Bu%Lr>+}h}9_#W*kfsk> zlu%XQCVS~}lIN)MW=6`pz(?m_$l#rm@z<%i6Y8+la$77H} zwIjh1D|`6Ma`-KS)_V=vUv$H5Toa$~(VMB*KiSnX0Zqe2+>K^q?V-)S$sM+;4eOU4 zhC{ugSyscjAJ1sWAc%)kJkG)n?ce-@hM|igjB>|RUYD&kD!a7^_SyNtdV1%|Wfpv$ z!b+rL)2SgPku&1vM>)L+UQ}+g=8W8|(OEs^!SzVRCqc1j?;uy~ig(UugKV7YT=TdG zUOf$d2g(9XKCQQSwt%lkJ_+)s4!JMvC@WkJ_#F<~4^ulFm$>a4(Sgv-44X-pg{7HV z*VJ%qO%WIF~A~Ft{vp3TpY$1_uc!z#2_zPQJ07K zapv+_3*w+ezE#r3sv1H#QRo&pSmC|NX7Glyb^~$!QLhZ zwj1=xu448!rbd6|>{_sVKbeeEfUZ%-MEy?oN=9hibUsTl4M(6csaD8E9F>VU}~S zu{B6u2TM-nRe58eaE)&pp~MCabe*nsVY6@uOIjayYfkv{99_dX{s*b-fow;Fg0Kmjf` z;W{-bVH-+bOihB;AE!x<9*zQXK3;VGUUt7*_{NA?TM4W)KvE^3<;I~^AC0w3UjM>F z?Z0ff>nDPf!4t@ls;V*Q)#?WOIue+C5aq$bCtH0L{j%%hBG_*Y+stX# z>7`51EuG1^DuS0HfUv})SGzxvl?cYw#Uauqvc>&$%1!;|Ydx?K%wXM=i-C(=iuC6aeHd~bXtG_fX7_2M$>-}#ShMXDkTDRaOL*? zm5(J1MhBDI`0N1JQN}V`LXAPh^78Nm{4e?!=JhfQ;j7(yI9d1@EEc^Wb;IGsi^kpq$Np*m?E#Jd9t(uJ=ZUi=GQt560^K=M<&Uu#7 zsAn3mQltLqQ3%Q^#+mXf(KNNoru=Li+dfPl?VJ;$Gz;E~-N|h3w*7H!P z0HGL{5;FL1iY#jAxeY_}x8>FU7IN_cx^vxCJ>07sUiX$D1fYgSQgrH3<;I+_i)Q*E z2=$#0|CtFdp{r$k&%Z&cdOX{4w`+Ye=EC&GXbkhvNmTqdXrwggK?;#VL1JHO8%IS2 z%I;<7zP`jUEH4>jn<~vA&l<~^+U=nce|3P0^Jt9!a!hj+M=D%Qo3d?2?)Bc1@^Om@ zCAD*0!B+A+sZUC^y~9wQt%ci}Pe$6@l9Mi3DX9fl4hlz#ftAd&?+i&#MK6Zn9ld6i zKJ#0nBS)M}+$&s|^uwF8x1uhMq|yCFCB`iENy1vCk8^3s^>_>Mk68OzGa{reOMFD{ zr55WXJQKfN>Gk@)<%$$HBlGu>2z5^c@KB)lDf3t+MR%lvvHb9M1#J^TW-`(=X;I2P z_#OEeKIujE#^sQx8XXQiaxF~k1dL!QFt-ocDa4v$Z= zU0(qrfu=>en+Vb}^3&sjj`s2%ZLfSWGUo& zD__JQ;7l3)0~z<5dWH*bdP5cZoip*{w;bW_3n#x#K>hV$idr*oYqD+UtCwR-@p$vd zSAFnk6YhSBD>cR%a0oohGYj|Fi#Surf3Q>>X@0!0)0;PUPy!Urbd9V03-rUV`uXLr z(#+?&ka8=+8dC}hUyZ`pa=$6TsO_VgC{}|OVz~+pFpa~Mv_*S(KIrbWemVYD=Svn5 zy;&^w;y>RtFXb5O#>HL%qnQ@O>GK{0`sYU9BX#&|%n#iBJ?5+V{`lVlUMi%98U5!8 zU9}88rnM4Tw3FOsBEP4LeEOOr-=00_ogBN;Exi$TZ)a7lWMxa>-^iH8E%Dbp*lf1W zAzNj`_6;=M*dT(M8hpgSt6x})Wxz#6#c8|UD=V)rn$G`J(AEbeGw?uzJa5D=``O-y zL;9C8LQS?{im)T!z{h1biYtI6hz8{xIQEu-c9js|a3^3OT2cY}0}M-GmL<5_j)Jff zm7=aa`^3)rX?o-$ixYa1XX6-tDe8Bj& zs0RNkDNMn8da$}J<$CD{ez}JQAm2wn?G*{-+?;C@wy&4-K?&)bK=acSn6OZ$fGscc zpyI#6C)Wz$qwBBEfGJ2-!4~U)5p2r^b#yTMb;v4Eb`qUMa#i9YVgwK)jL{YM85u_c zxKLcK_=Is@0ca>y=caW73a@PznrPF2b_vPS2grs{kbz=g?n_0oYT9+o^&nRI&vLCapJ4bMC#@*X` zsE^+6;kHjKJ00|#h26tb;9hmkhjh8Fv}0&M@-b#qtOLw_{B?_8D2j3>@d77J;daOY z{&fb)+lvF3yA;*B7BgITC(}Ld5gvKj=YwZb_k&Xt7m>m&J`l&(G~)XE3=P=FD|Iu* zxJgfqz#4t+jmY<)+dVFLdCURlu5rcHA~#8(9i`lb7=A=Y79Uj0G2pWrIR@3|5Aqk0i+jW zJ7<;2Y45Ci_TI>R#j$k~Mia`#BL}y=>*oqsc?+Pjh{>b^E)x)tXmT(u{#+k$Gt{B| zRUGDGXKSxzEx+F#a;}+V6e`{9qyIC1I)f7F<6(%6eBlQBI({|l7m@x;uqaq)8$eeB zq6Q+doqyX(^W}})06CjH3e{6yy5!|ascY>rdxw2KN*rzBche7I=JKGiNOmjtP>}Hg zh7YFle7DRaio-F8TU2<>(uv+MFmBt7mtOB459#MAP{ZPyTNkE(ts}vqK;=pAB0bW* z^p+YG7Hq>)4y-jcjrgV%e?lmmM%65+$E_a+se!aeb;$DLhdKVT7X5<;)#HGadu31{ zOKY3dQVd@vJ6tl?N{ zD8QX{inXNuPj-saG0-AiN}##sLczoMrTWU>EnY7aAC7ZT29rN%JF?hle~=2e4=kBu zuLqp7(L7OjI!PK8*qNmP2{{@)Xe$=ENSUn;NskuJRa5-~5%rY__B!a^^l(o@r6P7t zD%RJeP37z^V{5YlYyO8z_3hNhp*ueDeXgw0QqEsPe*_*X=##ZKcFPhk{1mrICq&7e zu(8ED>>=@t1o5gpECd9QrXGV9^qJSI-( zGb9`^`rc^0ZM+&)vQ&-aQ1o^3$E(O{iFDmOYs*c71S@?DliIC6Na3Lwf zl@%R`MzbDK9#4_ZM|7XfUMS33FI;ZZoBbR2KK?}+eN6&qa*wQqaV3b^%GTAqG3KKG zBBG=3F!RUu`%k`8y*{F7mmUhatnn`yZq-UFFYq3it@0+%_G$&HJu;0)1@z~60w?Va zzxf}a50M3G1n4&Us@hHj0qAGQ3UhRdFHk;Ya3nFTyXT%&$3*FaJMT}~RHNb@e7dG zGbi!7sw+K4a42-HJb7vs@fFbD*22`BYh)cxyJ8`V>Tf&mP-Zmqc}Nz2+APs}V~-N| z(55bOxq#l-GX3n_gM%y8t*E7{u)*{}PL*%sR!sEt!^Cv;{v7F=9X)epn`~!da7;BrKQeJKX1c2*tFCYxu_Mk`AffH@386&s>2ps-qrpXe zqmh?I|f$K4~szPsQZ|DKbzkPP%amAM8?Y0Pz9cg%!6Jxg zCS>y5x|FB#GSqA&S2T4gjuLkoL9Rya8U$glAoLfyW@gN*4J(08b!ZWU06~C?ZczhU z&h5(iZ?7lN$cdVTkFovCXbT2$?O z&<`a1@acMgD(eAD`RBS)!ldYo2X+iKZkK{_5VzISUGV0&C=fYs#8LqOXkhd@w8HQ) z0BY!t@RwsaW}L$U^C=317;q(?F(0do;r9HH`-mM{^5yGSY_vVt?WLPK)gJDZ+7wv| zs9ZIOL;t;VjEgI+)hY&D*%uQXlML~q#=IVl9FlAA#0};Lj!}$}HkV-Z;~Pg?cu6Br zPrtW&o51l_C11-w^F7LV?+czo>I0bMkjy|Z$nu$~94vPnR6IUSl;pYbhNzux(!gvG zykG&5K6;GP(6dF1z(7;qjKXM%rqpv*2Gp;3|IXSpzyDd2_s2ItMX>yNu}#Mbk3P3i z#+Uskl!Nt4{eANtHTDILU+SgFCtCH7`-f#fz1E|l(z%o`h}2>aP<9;C$WI8 zKEsIpe%S{N^(hRx+Qq|=NBlTgESOHHn2QB_+fz`J=JG}g3C6ak#eQ{;mHunAkvesC zk#;bU29Ay>h_f2g8MI6p_MNer25@B+pz5CPiBOKQ86B9`x%VH(_Zcv>98BSA8 zYB5Z;?A5PMU9Fyt+R%?X|GRw$lQ8r$mrO zJ1!JWq){g>eOp((aH$8c*}7HsPGR&!20hu_#=bO?`12Y2tb0aB+o9fYyI6zEai_~dHNF7vqeBO2 zu0y=n^{IeC877sJ6v}oGVPo3_ z=qN1rzi9G5g`Mg!%1s}oQ%5fpD&?~#fHrm+$_iQ!n!GRMvCOGvRqL|ejcH_eA5UIc_^Y%Ym##9u@WfZu--|U zpqqw>5u_ej>~3d%#yLY92Co(o@>dU#KHwKm4Mj1oweov;YZAyMyMdGQqk%Qv!Y~!*hH6vx!Kzn0T zPBJS{#rXmJgCa268(&?_an~B4$h(q~e&qYaX;{u@JHI{YYkw2 z#{16gHosBoz>S4@DE|%-umpvHcZx)oq~M7aHp=9ZkM@s8f97+;B>)~W@Z9eZ>myS0nch8Qc{!9 z%^T{vo@_eg*!Rne-J18+|6;;M71ah^dOn{veaxTbAEejkT1Ki>?9a>FOQ*c09hlJjP@3+T8vH<6mORE{;lf1{XWnF=3Gy5txIRaj4*bd#TswSCTG57Jm zPPl!emA(J9#3SF)SDKVUo{!SY2|_C8as!<~{HTvkF={vNQoW-2Io~1k<1JG{i5Uo> ztKsl7%DXI8cj85J_T>88nR=hp^PlqjOXbz*&A|*0H&+aP)M!A}+6;I?Sq{GM?Du{W zz~=3H?9lZQhP z?tw8Gm=mo1ob+}%EYJ2`S8R3pos64n4fQa-5vRM7wC#FGvmaM+;^2i7fP(6ctHpj0 zpL{vv6co)z%e@}Ulfi8}v(qZ95Z;;{2b+O-uHPo4CZ72(sYpn{LXg`dWjL^!ojju% zo+iA#4vRA0u$*$d4C?Fm*{=dvv$;`jj{o7|4b+(CvUvYG%`-z%T9rUe zlkmD+rJ;IHS5N+$mCZDh95?I-P=ob1+BrP_n?q&;BU)C3f#jhfYQe?x1VV9t@8{$t zKq;uOI=CXBMc)XRGD+&pkB%RGzw@=Gb_>TIZwM8Ed3d2egc1!xQ2pBeEg@3;2&a4i zl1_2~V8U@!g+p)e0JA$J`GMzjx(y{u7H`LYSksaN`v&lM&|zs}zFwZD@afsk(aaC) z_$%AdzWzC9e}K8gzR13}=AyZLveC>c&2eHZctCR2V9Ad;KJ5|_GQOu^CmJUjuWDm( zF7IJ*b*>mbDn80i%;h`pMRgjg+M-xEo)%FSVR%={mxy34+aZ0-wFcbv_$v(LE4y}l zFjn=sbdFJ>9Rlny5B>>X*q@QhzWeQklx0Hj+%RA}dr7cjdrSF$!Py1IhjZw=jrEqY zD^Rb$@9Al;Q=MRPQpxO_rrQ2_{L3)%)MXi?N-qG<=#l*^D2(}REdRYNwbX1PXo{X|MsNpq z9TJL2YQ_H_J>>sL4j3x}Z>s*Hu@z&4kuSXCx zGhSJU(@pCfVjA^WTiQE9T|H{QlzR)tMge=#8I8<6SU^GOy=pSPT6a z(Dgt**g?Kc(_;_(c9j7({{u>`@Fovv{%bV?5sN8ll1A*rQ+g5Fw8BsK5>Ea%bTgr- z&MMuwQr8CEu|;MG;BP3={hjZOC+}L0KSQ{Hyw##vDkE96%Xat;Rbt%vH_OFSv@s+$ zstW+?w1iirbmRffQSs56-_9V~qEH9F1k5iaCj<50<+0uVhW;IUMa>JJq?;{3>F#+; z9*wSjm<|{gCRyWD#)&C5>K>rC%rRpb8Sp@r-re=5)AWv?|60qFvA*|MpqZ(v$dDIc5?(?q}SZ|OzQDG zjWm8sT=&%YMyByDElbqhS-s;mIhq)ogGsirEni=GL({=_3i&6qG?9?Ax~nZ!|$DC z0AI5rZP1TvphhPjjRqvuxc;{mtwNVBm-*LHfn);^$}b#XLB}dF5n}T>!CU9m-$x27iYD+GqFCMSo_* zkodMsqRhY}tHUv)C%dYiHQ!MC9jan;KRHKcoP*zZm=#cmyPA=T^~=g_MAy$W$mKfv z0FK(cs4?!ZD{RYA*x3rhdZjC!Y)&AnuEPIR_LZ)olTpndb~l-7ZmOr(52>pYsbNPcSYkHIQ=9a^tt*6U(f7vLrqJPH6K8*0R zs-(#F>>ZINJ-<-SoRr2#v+G7tue9qG>I|N;qlQKA40960*a70K`!vSVr}aaL`&D7} zL%L>qh`GY9JCr>Scw>2t5{1%~BeYY_jhZ%*aahL~HLmN@&QYuRMMa(FL&hnEc2z%< zTz}D2&cML5kNl{PRtOG}PQSc6tw>*{!V$v--AB2u<6BuhUi#jh;G&PokAVf=gPmNX)JNKo{$=Kyic#E6|=d^@tXM9y0DwH6VUR&YC&c!DR(oXB~g#JJOc;O z4J!eUa|rQ03pYx-AQiLD)6<~dBYdf|{7kDSZQ5(rvJ$q&&Zor{qi4%BGRp2DcXV`Rth3p?C@shQjaQTkXGny3I=sm+xSDmp5)3DaESmBV zi0LqWhl8K7dK4}O1O#j*>rpx3T)zYck^l-pP+DXk-q=idor6|oIUK6b`bIgY4g5-h zNQ3h9r9pq(9V@piI;pV!0%Qk_GE0ZWDrkFmKA%8ii(l;kkv#Q|)_uPz zmuT>}E5r}<#r11Fr9Em_*7Xj+4(A;5_-!Now|A64)ZZz(E(uGt-CW6uA}Zqzn!QMC zveOVwQu6*-J7JD2a0ne1Jd-w1Nt#$r(DMX%6Y^6#p2qA;5pmr+rNnD;eq|IHqFG6N@) z(UUx$40MeKw3(^Y;B$me#If4sd2w@L`msr=j9 zHvy$c?{5F)Cs{4J>mErE5-pE{LtWg9R#@_TQFMwEKN1L4s(iQZ@IZ;kyv_I|L@{Lp zfBplR?;rWMPFL8(V>4uVe8A(J^C|g#DgIEWS}N1L6)Rd{7!4Z5eDlICNPi`sYoTi7 zi;W8PlEFVce}xtOy`GNHX>pOl{vxt))EbH2>q&q8 zFgf7Vvj5ss>znXtZz4Z4kJvEo%DZdbVeLla=Ao}p5<|tn8QK1$+Ob~*`^oj&A>YJ+ z$Wv6G>RrA8uF@gX(Z}Y~KII>9gHXjHU*+MJHy#mOi-MnVolJ#h_OlrMuHs#D0V}-` zkUeR?J3}aEV@t*hg6O>uSZQhaLJJoN+=a*br|P^1(P#bAKqaU8eEo&}jJ}Zr|51w> zloZ5*nzG8aKL@SY_c(`B-#;co!DY!&n|2lVfj%7cWEK{I`9!=}`?Io{h3hYFl3&@H zml^_$+}b(V_@wCb`E6q(=XRFZl{144zsvkl9~i8k@$ONwoA4Hi6oM&q3`f|!I+FY( z-`LJU?qTrw%!MHh?KctAQ1`wC4*%b7-r1+$E{2!0TI~z9_c7cL5{-B`ul+7m8`ie$ zI9x82lzZ!#@)U9&?ZfLU^O%g2bei32qqKSv9zAbSihj2_34M{_^7bKGT>WoO9HreC^W)NIaZuu4Ad&l+S8 z>bDvby@T=%@+cm9Vi!6ZcA%IO;^<55pDmB@+BA!N^ z|Ku__<*2ngY#NS@7TZ}m%ZPbi)JYFCUsA+Vv1fiZzS$n^`Sv-Z95P&J#`LGh$)a_uHjWCZB-zSPpIf3lPPWbd6>KU8sYSP3+$ zGMFl>8oNaSeU9sBnP%eu$tIW(aO$H|K{x>-(`)|3epB9=IDWM@AMQl;YAgfg>Bh?E zS_W?+;NkrHzxt&rgQ5sZNY(coFGNdAYu5D3XwO=R5QGE31rfXhST(Jnttz8@`-0A2 zBnP3K1q`~lPVR4BU%lK09yx8JbRGSY?-K0#C0=#lOiJGmc+(Ee72^73n7p0VH5ki4 zJ;Mcl5+(o~X;aYNgyJo1H9ERO=)kP2>uEDa{kZs2_~Oqwq?$Ote;;Cfy)NZlW;tL4 zH{$TLiP}GZsF1y!lwE727bXE}P}-->&ihV~!IcP{vWv_sJX~JwYwP_Tss_m$>eDUl zoZF=OhK50sIkLrDh9<&W$ESlyP~Mg3F{wET&&J(z{%DdCa?aVf{66QlD#wNN)ec3L zJ;51E$aB<|2%YFl%twF-S$i&A}_aULQRFjrT3J z*Ynq3=6*zODB)BS!Rs~5AF)BJz;&QG&|UI0K2C`JRTmWVhjF{8Skthu{|*p94a@e? z&&|FEIMTURqnf{yXbDvT>Z9#oL=vJa9$76D|P}f{B484x-K%ucW=vRkqUe zU&?&Jx2c*E?-D;L!9Yqe!_L3SaK$QO+oA5IqV0}j?MfMg)Ff|r3UEu9Ob!dOfxsd;&WKP!?}+SLE`vABBh8+Ell zs@03`uJ@L2xf|<)rC3s%cRdD}yG*ArVl&ar#^%@D$w6|Z%`OarcgRKQ4{^TO4YraHD z%B`EBP@7MeWqGkMl`GwkSHvyS+%kiQ$LVCbuf8zH`P81esXaSaN7s+k zVIr17ao!(%&1JKLY>F;=Lp1D3R9xa7S&M&cf{{F`VrBKaKbZ!Xd^`+(B3*jWtc`A7 zr0?7P-pW_1_*O-D3_iB#gyQ2KE^j{s>PAI~mBllD&QCIPuYPfmh~D$v6bE3U^gUiT z>1z?FGJ_(MZ!J+b!x(G*Q1z+c{X?!;ZE7N^_;~QnLziXi97$!9Z2G?#&{Da1ubyO? zm-g?|_NvHqkBvy4D<4ftGO{v1D?h=^j@|oo@XElUIzE5E{wtTRYf865;!zsB zBIacj(f<;NC=U{JT~u|9ULPBz01jtde3iq?^IHk@sYbc3e0dC_w<&tCgxN9FKBOXr z4J5>(G1fzo=aHXwGq!Ed&e(3u_NGxA7|4NwWkM~BR={9vT(`z1%SB^+<}(A*gjMis7o0?J?h z)i2L1&2(&f*?HYt_-uvc80>Fc8MRc&9768w6TC~ zxNIZ7kfV2d(4ih}dJQf23oQ{ za!xPU+Gh&RZM7a%x5r7EFAdt|mMw*~ELaV4!sI`UYZ@Hmcz77JmfH%f_?6kWpONk_ zH7G{&wzzdpzAL19f0SHzX}g;Y`mjKRH(%`IP}`t-s$J!HY3`U>t|?L>P0AqShbT05 zHq7?_E3oX^>gKq_;!y(Ps1F}K&OT^(hzz$vJNw!SW1s2H&65CTP~Vm7TH#?ib;lS6 z64PL(aCsma#cv|)TdxF^OP&o-i8JeYAxV0h6n2G|2i4-4f-MQ}L{$~Yi!YUNSWV&% zl0kc+J`O(*)`!i%UmhxGV)Xp#mNR!Btt4Hz*m=18tLpM==BL?e8izv5!so`zq4}G+ z;F<3yht=2J{(?OTks;+Fm(jhPc*`F|XsF zlG$=6@vugCBc&^KAx53Xj*JbCHB0K^Yh6|`fTQ?W=)%R{NtcIbbUmS+2dK`FVT7YF zFn#-%$YrHioW*C;F!pWJp1@+ww5`qTb-6Tj3@uV>p?wq0jzCgg*Sgo7&c-kL$m0)Z zdH%feM~G|O-BG)G*Ky@e`}go73KT~E?0Kfu76l$t{nuTptCZNr+1|ITt(THj_1l(M zwT?#;Wu$NP3Y+DB_Tu{#O?eqYI3T<2gG6?I5PrxwbGGM1;K?V}p8z6Y{!v@7II&2U zSZ^k5^Zr#ZPzhv%@&o7uBK+{Y$}=}(EBG$43D5bnmJgCc2cbL74u}dAXK0&|;Ng z{h*hk5k8r4v3Tdruw#pnAR_h4RF-@G@?xvW0|o^g3mJFUPvKU~;R$(SqM4yt#I}zn z41AO|B(@qO-;*=S{g=<-e+)#h1bfG0*h46Y!+!k;w;RmkmPWB36^_EZT>sS_)XC`MGJxyE#y9Z;lynsthNVEF}bKRowM4p~3tUNXh>Al9gXZo9P+v{tBAQVebdl`K+lMP#Tzk)QDQZxH6w5JEh|^_e&QG`9WNh*cDOh5Ip& z9irnDF)y`w7BvwY}tA7f$t!Y+Xc2@Nj?DJ(&c6O}9$3d)&3 z-@yC>*E2;l)ihlE_l;Ig+xm%ab7T0%RI*m7Z=@whcQB}$!@DDV*O=wkY0DsYgx$_; zBCBtCqQ7p-WTSZDB8B1GT~k!6OR<~2n7(At@~Q6l?>TirMMKc9xVX3>)-|XlV?+Fg z)I9FI+p;ts6^6mrXlGk@V3D`Ezob>x5{Ue|hu#D2_t~QU-4}cBv#~aQzigOart`Br z(W@l8XQ6aMqCzi7?4%cUQtPzU4QkbE@8@aEMH++65)molHXc$U(3O3Ab zEzqWL`x$K7O#4PcC@$L!?kCO;>KZ$zKaoO*rsWzfWr;#h*_8k7R;vnP>TCJinO!KA zW$3Zu7aDEq4U#NW+c$5zD`R~Vx`?T&o3J{opU{J)wBDA~tSyI#-&D}fWs4%;OT%Og zDS_X^Hb2V3Qs1S}Cz|OnfA@-#?AaTeo_4vRpFhwxQ^UoMh;+MtzJ-q0P4msnD>7$W z`dl6oRUlY2U%a-EQX+eaYOwplh9^(Xz#&X{RxuDZO_2m0T2gI=;$LA4C1x-(L%$5r zK(C*;E2ofzb)5uTM^1WFUyfVZw{Avs!sb?D-b4+*J5(bc6AP&!2iz zOjCj=nLMtKGH@~M1)EjToA-F1kLpFUkLubHkjenr2gng*ol2d~^l78iRD0S=1Us{I z;`D3PJL#@~)J5%Pqq)DRqM2&o8BqO(_uZgI*Rg>2+RNy*?~ssOtP zwz0x@l9pSw)nyLORl50Uwmei%t*3DzTiK1i?hN$iCVQ75{QJIQ)H%HRMgzmBtZ{-x zh%K=J|ESVFzk6Bb)x)M13PM~1rlRHiiSoxkPOYM1(}s=bv>2pMrEzT zBEluVN*L=a0$4!{F?3qd;*Hs1_m+`?TTBNXLa5y+lie=vcT&0O7kas*9k#04iLiH^ zH6@MjS*hnJnONE93yDb?Kt9+P_8c0fJ)jRmXgY7RLj-?=+=&2jG6}Pv z`1~&g6pcK~97f^8ut=qyx!zOUod)dP|B{Gi5G^q_mz}Q0tw8U4x4aTF8 z`Ol`4+_*|%{&`2I^C5oXxmG+$&(7GW>L{~Zuf@CQOMFndPfpCUd~ zuWD=L*Uj(zDK#_gsOypk#ZB_|M1LGzkI~rgaOSZjY-$)(Ac|@Xuj>1x<94RfUQgGq z>?)=XGCJ2^fA8Ta(&evwRdZ;ntZU2I;Mx1E;OJ%D4N<}`F@24e5Lp~pS8l&&0ANVh zSSUnCC1xtJu}NCcH*OhVE6c6b{lLIli#%=eG);_Ave170NQ~2OUvYWPmfV(P7my)! zV36>6!7*9?WwVvj>wF1PXXlv91b_~E6-#5~h(lof_~7Sdl7G77%jC~260}c9mOa0< z5c%6`$v@Dsi4Fy_ZXgqU*@o}hQmC(}$O`M>hrLqD`7{9NG7LwioM`;ykfxw4Xy?By zdpQY0#bTQt;z%w^A^p?rQmS)LXKqq!q{LnB;WP|2(%!xqA$s6YK?y;{|MzdKLtM)} z9^*vUbX@> z!C*vTk=B4R_GnATPyC`pgxpXAcxGhUwWbKdy#@JX9rC>SObeGSxZd6UC0c3Tl8E9} zOxQMpLh1aWKBCaF6_giO*v8A;UA1$rqD5k9I7t{A2Th$1VNgcwoSE04&ge*##dV&la=VF z-cDLrT>K}7Iwg;uUWaj|f>e}%&D`7gOmw+U$l%#4LN4=?ug6dxlGII)iQbTFi2Y%H z=`}usq~048?|J}8qm0S$+Lm$;GLEojdM5}p;Rj!KVeb@396whg>c95AC^Nfgle`&F z7s*+Bc@JC8-RYu7Kc*<72l1i%gOVoSO_41B7Mz%5(vP+fJ}ct(8%P#7Mn$ZVwG|$Y zsVo=D#|~g;#A_o%TQu>m1M^XCORzU{QNdhd`J8a<32k)Wpm%#JriH;r$N}Dw8v=}M zxa4kLFoa@4n$~s|gXf)apy_%Z9Mid(3HJscLqt;rB6$z<-`NVkN9)1jk)k5TpF;CL z!;u*84dgfgHeug5fK|lucm{&6YzG|h(@n9CHUfF-RUI`@G6c2 z?{5fl2_$5gy`&iU2;yklg8WZInD%hFrF{}4juTo!{go-!Cs(kJ8If|WUE0K2V^Z^l zjI=g|5@UGO_i#o;s&|NprrGJ1up90LBj*)MrceJ1F<5{YHjj+o`a`M+L4R~jtUIPv z*oMw#c#CGZZ@(+}|4!&>87OVDM27lgpll4T=5wpd_9OqZIaVjn_?%MJjL}rPV1GaS zocV=MK6TEYrC(4%qg1!%X&de2LVrWGO)S3;ijRbDm#0)AKH8b)C96zRP}%Bsv}#h4 zL{urJcG&!AlyCyQ47&}luri8Xx?06{e+pjsyfGuNzuPy<4?*if<+7`xg)nuqzO7U~ zM1A%Ay;32&%1MMieNZKhF8o%iFQG1RVr5dRrt~eee&+F9V8M6t!H|<-6U0GOv5CIYH09Mf|9+%w;FrH z65$b+uiE!VJ-{|D-ki?s~ zYw8IfhkUDie2+W<69YQ&=oiusQo_GSh-`tqK4D7##>p-hmPYL)pKon^-qzG{O5eJ$ zV|h1?(o{zH{M){gEqGOSV|WScqmAe<0Y@48SYG+&H2<{Fgum<6qabS5t%Z^06Up1w zG5dWPq0ayT=l^_&BX&yxVVJ=!yWB|)@xw6|>FI8mDn6dji*5=^T7GX^%bMw2vuJ&G z?u?5FIE?X@t0hHoB&m(1_Bz})*lMB;Xo}nnqR8d5j2ga3dp`~l|0clAiw`K(q58KUf0|ixo^1<{2lG9kQFopPqd_7u&s3L>Yh4qE{|7-rSq^ z)uKO+N7@UidUG6iiZw{2JilYY^k(jC+H*EXrl6P9yHa0Cem6bWSF^IPnR#pw#Y%W- zJ#W#@LRE|&P1PbYNmOeh=7rO&3(G^Hm{v>O#IK>BZX}NMhq6t^UB|ha zVd`yhx#W*N3qR(P5Ns{n%0@-Ss!d_CL3iRUer6WK^l7Z#1$5tq^?&PI5nU6bVg8e;x%E?lu4=BrR$VdC=&~-7DZ;7g zG#$K;;y^uIgUhn$I41SF=KM$ovoLO!(cd3)K9(`dzI7{wwo*6@&fdB9_>0O~nzph- zqY{Q?>^80Iu#3_)^o_CwWFI&K=~LN3MSc2bExCW#B=IboYP~>%3Bp7=A!b5hZD)N2 zeSu>gysXYl_7aJ{(%+hA4x8H`1G1P`zu%5gSIYRs_PiY#eHvWZl>P-}gCl zF^poZRRufeFDNevp%=VD$~HA2{CM1tYE-kuPz0sb_UG zYu|-cN&FwG-mrMUpoDSrFIYq+b(8)2+|5>13cD{3LcEZDAv!Dw`QfRPRG;+rOi_EpWamNN+x)R;U=nvn#JPU1$FswT-362Z&{#bm9v!O1wXnn zX6@Y3JIy+9{?`CC@|LnuDaX9dvH18_Mv=Ub9<5BQ2vm7GE;?1}!!&3~7yMxq19JcB zEV6ojOltJa`2rXq{<2Vv$niu^DVP6f(}=sDSQO&=71mr~fRj0%d+{rg`bGlEw9YUB?0z)*z3N>HZ=KWbfeLDwiV-;T~su!uHM-y0=;2iq^> zTJXy*7Wt>yh)N4O#0?8>93~Wc9F~TMh5e}U8L27Xg<(1ymoqgwP_?I~WSf{HJ!cXw zi?${rd7e9mFuOb1%i~0fQ&AlK>d)j1aM*<}7f;X7CRYEO!gZL-MOOi z0`<7NaD7uJCM89Q^QCWl+xn*pEct)VN5}-*(s`>C;2^;!Y!(C;0Gf$vAw&P&C|>mU z*O2^J>7Up-qM6egEO!!IxnYz-YQM}&E8M3*W$Sf8OMWNP#3T_~{bJ;wQ7P$iy`@Ay z+vJE`fx1ywV*(8m_P7{X5*J*Z7NC}LhYMNKR8!iGl7yn*#~FsihMi~ zrvulH_@Wsl;l&n4^+yU)WNn}5t@oJ4_Rsm9iYXsRTid_1^71!*{97P4Lx9Jy6Z)Ff zN^E)^AAg5Ewotskwc9tYR+47FI@d^cGGURfrkTyUF;B#l;$62_^1`DeTG{qRS91LGE6pzOy) zx&NPXVw!$LUgSPoWj>?CLMCxrVfo0MmiAd@J#AxFV1o)A37%upx2I%S+`%4E+~R1^ z&2NX%``#)1309Ei>HWVWvuV*P&ypAz(8*i>gH!i?0PjJ_)3ZYHDQI$qk0XB^@MV)C zcGDyAHKX#qf%?N?@5icByx431zk;B$YeAAIGT-7yktfW^xNclJ{Q9|&CgSM=DWZ}i zJOGMWTt#Vo9_37l0)b;O!b8DH&aEmF=oPPl<#6qSreP1UgVCsvhIQ509w_9x={H zkXms%{Z3)E0(MKKa#9n`>C(2G(qv-Chsd4bL~8$V|6~0Po8z22 z-JBi#WJe~KxjdH=FZct4@;xA$QLprBayS$((Ah6shULcn{*Q4ky`HHf zzcM)=Xc)DPZ_2R8gBvSt!oiR0c_=!K%5(e%a-s9T{})@m%9>jt$P_3^#%CR~CD3{) zG_g&YLaElQT;pV41dMa++J8@OrBqA2ZxJy}R5BK$>%0_=N`spN*(0=cEGf%vNG_9l z&I^DX)iv}@I%h4y*&%waXs9GJsVzKdO+knBvwnPgRMhoIbM2ym*H-rk#$PftH#(8L z<=E)sai>D^grt;Y0CKA<_u5XTfhnUn7GimaTLw=Xskts1*Z495l(`>Km`GoXU{JHL z$20>0)-HHB+j%h{UOGy{^TIXQe5|!CR;nUI@#)bBU}(GIQ<3ntb8SKh<`yuMDo^V3 zKj_7wOn}qBvv_2Ik}Lk+OU@@XMnwiWEeBaEezZd1ehX<#X@x z)cQ~|FjI$uVwj+!w;_;;bbimIIU$qNUFD#6Ht$bZ0K;|XA$CJ!0=S?4#6clqgj4Qs zjfwaL^Nl!X*zu)C5(Cku7~@pBy#`R#IklY^1?qcK!eO{bMo<+srkYue65SnKkR z*!0LjR&189`(c+9A>a5m?Gj(Kh(zM>5Eu2-F11k0(z0_nrn22>po zBnKX^pcftqP64(1bYbZq98(A9Tq}H;A7lGFg~g}A($h*Pq%ua?se5GH;u?20jguQZ zrKha6mG<*Cu=O0ITcvd|j=S%A4Ebuy9qu){BSty= z`sA6VILUYX=M5hysB3hz8zppr8CGQwORD!3&)ys#Hj8LZiA-9S;`{SIr!S4mb;Xp1 zUjH+$)Z6Zz)!Z7SaURHwd_b|$q3iVl=?SWT6HX%>i0IuHISUrOM7EgHi;AT2s{qKT zH0Nm$BWhTxI-h+co)Tg^6qDM|4RMs>dJ?p#ScNh~Ii64~VXdrnH8a}Ax~{B>`2i3l z5NwMK#tVmBHB?5#41%T4lING^EP~fpjFh~0zN!vjd?B%g$G|lndBjv!NoUxvy})wL zULErd^{ec!n~!jS#vN5NkvgkHXPh|D)O9p1(<`O6RU(F`K?q*`E(9+>YMf_=KjR{X zl9~9mw=@81EM3l)(m`ap9))a(DFy2%%~1dh#7ORmhR-#FhsRae4gRzo{Uvd%E&7ja zU#YLB%xB5>=;8yYx|r6pM8#6a$)n%24a=HZ1f?% zl&~)z;Y85wmh z+t{IMx?^EQ7Uizz4R{Utz?f3o_JgZ z-B{F&g?x0+-_FVjPqe?xtJDhKUS*<`jl?tt2{`~4z2TLgFtkJ73DoFg5=H2W-uP6c zh(U*kPvXtoYm>w2|7>;Ci1D4Vby4fM{(K4XXuD8OO0tmKV^7unZd(MeD@{B{NqR*` zwdN>WRyP{H{k3!AXV%}o-&wZYszaD(m`s5nhj`OgPIWTpC+$+%L%rn_Q%Tn?Yp!AX z4Ak49qcQ&JVwQzKs-8;_+5rXs#mtdeBpV#K0IA<3;Z@`d|HHp*0j+fh`*t5uuefdf zDefbY3`le}qp_o=ljYB9Qn?PWnb{pb`=+X@IflI~RjAkvX;x4Ae zB71o3d}L>L`hSj(I718)UwDO>G*Ke4M%l7@Jq;MtUAJ;!;(;^_B&Sr~^u#2SHn$lg z#vf9sV{1ebRtwJY-RuI^fZBED<7pFor@P1d7)s1H!%T%fy zSXF@;Q~t`^`lftR8+Xm>eJMVuZ2DwT(|lZf=k%a#M*4EEJ3*yextC8+X>FbM>6Zur z`hElKfROAvR|~hpRxP`%y|#A7q#*;rFIrGhm&15KhK+%7mu-@4x7cQYItqj$|Frp6C8g4BWe8S5sB$G@xK(}%0UxzRU z;$PV;gD4>xin9qn&wv!Vd>1Qnkps#S=6;IVZA<(Ouk2pbFm$M9&+T0F!V%S=D4xDK z>ZqzPZ%L6+-ZN5(xj&ki9!aN1bfOi13cQ!&=Iro*D*WU`(cIYlXECRCbdfDZM;_bA z9$yKK`{#w2eMm;**me{w`j0W|m__76%xN0l`ea>4;}s3gzbo(+#5P)fn=da-o?Zy` zfBf5McGlK9{EI%ZHB^1~t~E3ARAl(a#Ix_C=gd43HKy(n!=HXAX3AqYiZ$^^F&HOk z=PQMQ!Ykiz!%LvBFuOE|Ky~)*@>fhcmX!%w6|4|@A+9hp=t{IDRZ>&NbiNg|M{uO` zqr^sMaumE#ekXmOYbMOC!k_Ic8IpLu*<7J%v1yl!E&Q+W>a$-n6r73EEU8x>z6HW} z>kY}P3A&f;qgm{@*lMIBkAf3bz#*)b;ZWb4Fp1g@1d&-r+VG>Iqnc`&j_RFDnGg1L z*7qs-xA}46w)t5J%uRXT;b%xz$}k0w2e7~KKRl^DC5HLP$Tr2>(%3R9j|Te z@nMpyH~S~}MYUq&gncglE-PzthI(64s#Js8AumUr3Op#X06pebF9IklL8XF3ih_GRX6G$mI$p!i>k!0 zhwW!n5C1sbqUk`KOC((+eLVHwA+2nggW;Vhx309Br93&iXjmK}Z@OOb(ycQpR$oxl zmXxqZy72kN_#`4sRb%ZGkARdH$*%C>t4@DeO7pA|QIxELL({n5BG+;Wo$PtO$g4sY z_jODP))Hh@2B=$rTnaph0IrCIyday4rtcE3wco^j;lF2T>kq`P+ zoL*T`pK?&u5^9laEc)oiLR$Cfpt_-`GSr~;41;*1ZeBwC;EIR_#>*xL;Ll$# zdA7D}rYgC?e}(0BUyTnKE1FbO7qomm=Qz0#&kHugdUg59eyY5yIgaKg#1_5=YwO<9 z9eAGZ!<8)i6oiLUmfQ^uxJ_NlSf7+N=(9-q4!jIAz3x}P9xVF9;6GJm3}-REMen_< zEpq-S8`#!>;_fZHAPqpI2r&AQzn2Fd91h=^Q*`s!D>8M*21?Mi22~;iV2~lq#M}%J zVFa;2Y0ki6k+-GHTZ^~|Kh)xpW~Zg4dS_W2Z`yly|yaD=)zFU>m4#jrkrK=5l(ZAc-%x@(r_zb$5d0wm~WFQUM$h6#Oz69Ugg1{QN6IHrrw9 z`|Bue5$1@;MskiQB1IAM$QW4BRdD9hHJT%)B*@2_<|KM|x}oTvc%OtP2#0>gp_8o4 zVvE-`{NXa_WfX&gPtd?Kp+@t6DyXZGz`~l|$SW+gPR;iz-reS3wdHf=4C6M+Wozko z)K!Y!iNIe$gwX5Dfh6RsFjh8Ex0RKZD#M5=i$Bzi&tUbNJ?(pJ|9!VyeZbIhFVG?X z*7b@ANj!6~-f0z)LkC)o8ByD5v-!1v zeX+Z3vRUvU8~vB_3nlbpu6TH43PYr>wlz!|=L_LyT%YOKvV`85<~pr>~B24qFZY?KqdF&(=&jt^WuxT-+M1 zD|#b))Fm_H2t?nZtmxXdmPM{?$|`*xE;j8u+?yi&asAybRB9}Jc;4Ue=j87g2P4U0 z1Jnlvw25{?ZXuUjZeBMi+85{%8|#ZDLrip@NS*$lF+y9fUbznZWSkPMp}BE~r0opC zozORNb)cGkj+}IxeKO8gnkMdBnvq*&+t=_1@wjpS4n06;+9mkY!R;5>+St^i#0u9@ z8dYjmhVszUyM(b#!8)8BT24qinz3vnQ~20B$?kZ1dWPosT#xCfsr^zEd;{L&6W-rX z$9i`fDt;A|ESSnCiMzYI1N*l@e&v&%QN0_AOGx9k7c)sdAtutzzSVR;wXDr%x9?)r z(*$@Z+85MdK7l{xJCZI!>GdGTx5xw0({#xw@?8x=%aG5hYiO)MF#E@jAm4j!ViJ<< zRCq^Fj?0|1f~ti@NssJ5NsD$YMe_KGx8vhq)^>LHtEi=aQ$}oJsYccd}4AHHU0RQS$i=<(S7pxGfp6w|G$>= zd4n0u)2}!GXGHtIJMMiP#5nr);9!O_g|*m~sXk-tQrsCmWfNbXixlD}ARa*6ynb*t z#6v6?_!zF;jG;0I{P(*{dUct%GTw2n`TV?P@f@a#vNCB1+KwX1Hc!`keYEL6im5I~ z&-A!i%4Lijg0|}r4!}^WP~NF&o872g0|O=Lp_wqnx;g2$iLUcIVe`i`zV^edj+L?W zzNz4ojKJ@uLX}%1roa~_1Vr(SPcuKPT!5(OQxy1w736prA(5bwi=k;#?LWsrKBP96 zKMcviF)r_K9cq z(mU}YhR( z|6rwX4-AFLE4)qoQ^qz#U|Y_?9>0>qk#@p{&gYmoe4G!|!#J*{F5ZIkDJv^$hK3B~ z<^~HQ-e7KHI<1Cx^Ps5AHOd9lsNDnQWeK#45o*@;*LU#L$Cb*ip)o?nOwPYMjOl^A^Sh9VkG5pA zof)Llayaj`iC8@TSfXk;+4v#O#sv?`?*XX&?s>UeG#2UU%>TozN6#7kroYI~m==|B zv9f?il2sxpA`mAp|I^^urqU*^sUFd@qQ<`Vq3gr9{`R!V-v4EFabsh@x4WD5z1ys^ zmm3=Ja|P(K&HYeOVGU8{?g=o%w3USLtenp~SJ{Y9FU^tU?Up8lH*nFMbY|Q<5 zJ-E-g@NussbM%T(L~=#-xy{ND9K^gGzBu@e%(g#AFc(%>a?>vP0#)lisq|}f5!AX^ z{XX-z+53SE;=brMe$##KYNgZ|l+6(Og88V#a0$9X>isNvjw{2qm@e2O&8kY9(55>M zpjTwI^1Tp>|8&Jzc7?)*>r>n~+}5aT8GP8imiwLT&md~&e&($nVrFYNPKY;wzEh&_ zBNcgbjo+T&DS_Zev89}jwpE5+nK-NDMiEu~92lZft5VWoys=uxTvTnfp@9P>(KKcV zj=lz#G?HH9fQNI#Zy??W{OZYE!A<6_Ta}JSaCB8&-FLAoDyS3Rhjk0iO`m8Ek4^sl zYDOTr##(rNQ1&$+5ZeRSg9z+J23AjaaD=yDjt~`+c0MjEiTr@CuIzIqx(J4dg#~Zg z{hl!eY;{{~BM;~4Sc@jicEXjI32^x_9bwlu;v7`jE_eJ!VFg6pk%XB`sm{RlRpEo% z+8&sLCq(vuYh+LFw&$>c2?s#~w>*A6+PF0O=T?IA!^2Kh%f>HFeb+PI-01hZL*BygeeaQ^q-d%8p9gwC@HN=KL*TAVaTy|D z8NNcyj3Af`VQp)1*cN%I+I(i}*a|{Dr4@XNe4GAwolZB2JXi>JxfO@;yh8QNSJQ6# zm15Y^)T9jo$~<^>BhyvC?+CsRocDbAY5q(!_1(1k*w|d}4DQcyi1}|D2>iDyC-i?xCxp)OhDo$4d^Xf{JK1b_=> zEKL5b-N&CD^pk~s&0conY+Lzly?MPW>Hb=r(Z;Mmmepc@RZDz+IsK{d&!bx_l?xp; z%cfC^{Q7$fRx-eT6j7(*q;XE%$h&7vr`Yj(uP>Pbu1KedElmYQ{D>O>{VzL~)Dfkv zUc~R7*(&g#BD4n)xPSs!um$)VSB7OT_B7^rn?xWUjTq=k_%(8E+8h_5SnWQJ=89-R z^Y7xn+Ix4x!=uEj(QU({lh;wS#^**Di`ARyG2cu)PpdH%>v%H-;^ltgChFj65y+;1 zg8(HVapK>&*78TNLYP3czIL#=0&BJfEl4;qS>XtDKR{s{xb_qpkQ7!Ac=K1@h3ZUd{|~sA!trDDsNGm>3Bdm^Ibg zovd|?fP8nc1KY9b215AA=*(%Hh!maqK;Z(|ar1w_a~k-}2on%%hESg27jx}>28b&)O{>T!g65AV(L$Xz z{gDyz5*x3+D8y=zeQaF3fr7pL--ddcQ}uaCp^%T*$DO`?y%mjnuEDATQInZs1>nGJ zAum!CQC;$>e0?mA_k}VWxsGRzCi@9il@JMV!5fCn?UTowjz}}v4j)JA5u!E6;xwC1 zM_u7!PKwqLDy(JAwD*B(E_fC{Phf?M*~6|b{4V4IpNAh%PRHaLcTC#LEIdk<;SoY7 zFrJ7cwMTZ|F2f$z`y5s$uJXD&2{nVh)vDD?=~xRV{nfm$LMe&)#*5(7C1qs5k+HV^ zRzb|&*UQ0A-Zx-bV*jpAHi~6!zg)a9*Vlg{r#tUMFIwEmp0x?=ymT zaqkti2wB=ATpXb-|_Y``aE&&J=1c~tSyE~0R zgkt6wmTXC9k#;~d8ugdSDnwjTG*VbghMGS zneS4GjhyBp_6f4%I|d2xU<%nwrcvbSf%r$b>iJ(K&(EIs5bU+ph3=Bxjd9_6{?Q<= z;==KpWsTH$xWF~lg~yh`{Tn`X^)4xtpUBDC!Od{nXu0dl+%Y=q~(DltFZ#8BPQkc)7Ix%jF2!|*$XD%oXo z*E0yoEU+fvz#Z61pfrl4T8RFgksD+)tX*fFixu?**4#$)kqxa z``bViD<38w${m$$Hs|gn`<2 z1aLJ9`<}n1TWb^um^Ju#Uh3$~^XNZ5P_OYyNsI1B0Og^1Pg)!7r0V&6E|4lFKfXpfs$)fgF8;7$0>lUe30C_yH3*&pg=-1r;PeC5{1#vjO z`A6^;mDWa}wsp`#$;IYWehB*=`f@*!JmpDwl_G42t?x>yJ_>qrbT*D}_CUDm0CdZ@ z&kS@eg8_O}mL{5c9z^4Z+40Qe3xAFkox(ER#+c7^#Vhge-KPLR#VF$k?@{tb^D%q?G(9Y~4(NZL|VdYK@4u3Pte<#QDD~)e3Fi z^5i{nY5u4J(|!d3>^i8iU1P%Y^ddGV_%W?mi}nP_+|ikaGAlI~)0XoPw3LQfzzeOV zh`xP((hD%=%5VMfi?zQpQvNP!35zG9x47uYUd(f>u}~|7v525kQo4{}JA5nP5PyPJ zgw-DJ5^?FNZ)P1eSG=iV6_Aw`=uy^=--lE)_JGwZBeDwqz)jr zXXaT~=d>-$u6{k9-`t8`Vq4fw2;&GEmv21wxu7-9%USH$qs&)1!G8^la6>n|P~^Q@ ztw&c!)#xM*xY}P1LvMc=u3a{HKVCX$^OP(r%rP~nHk|AIzFo}kcuRjVd_!r%tiEi& z23(He=bKrPgwRhhmQAiK&*mh&n;SNHo^k43{{DjRs&$$mp0JF|9;BU208Z3!i|iXy zQ~7vXBw0NgOn*Ix%xE1{n5Y%_2KUqqdF*L5PHObM3t%N-bwXxW+7$t*tLx$m%O_L! zDSv#Qt7`-;x`bXEdkYnyxf5S>u76_p`vmH1>A_wa4fVNu?622K8FOB)*pEF4*_aq~|e-o!?Rw+aRRN&e2x z4Y0Z$?i1|VhVkG4 zw2=p4LTN*96@Wf{QU{NykSCvRbWQZR-B0T_{A?TkRHzfUZtB~$zW61;uTHP4E{&`L zyljf&;9AzZAQSj|x5@oNpp9bn!Yp=F-8}TT!E#n4YiWT_wj8K?3%L@GI#aLET=qQ3 zv9QSPntH0!2V8U7trgWb=1I#0N7bW1XRes4pf=GpbjWtjc(_QZFaTDWinq2#b7Pu^SB3-_&9X=%>g3v``-be7Dn+JIY3W8-68~L* z#=kPXl-RWhbN=THYiZ+U)brVT!_s|);#^BDjM-@n-$h_}IU-vUrVqRtt-hjt8uSKk z=3jT>LDOBQlf|m)Z+WMeF^#*CvgNi(?!Bgr5>UruH4uErk%%3)Bz7i~VzL5Nzi$ z=4(mCavgww9pDBYguSiQZW#U~d-)DA3<6`C+DrljqI?P~^X&9gG0yOgMb}FODIj54 z%|~U9yFOM#cdH7`nr7!I;SI`)wggNRG(Sd;yw|hU7H`nP3-9JrT$=RDrG6mIO4#Fq z^TkHjhFg9Q0*~bd??vZ4$p78bdiJGFG8!cx)ibQ8lXe^RT1p_FYzED@^`v0Bw{V2q ze{IK!>{zC2v0DFxFN||0Mz&$*ekM{+h;~|8U3?{TO?8GEzb)wV z)KAd8CHd&_w3oKpv2n-zvP&yy^`GEzUUCB{{U#M|b2*6;_zICn5i=Sj-GO zB;Af;`$ip%VswVnoSSw$So!^57J#D^pBeOfpY^erkbo!Ib-0}erY+nfMrk~dQMm?(117-zHs?W2kRTUqgQiZSTAK?Ni8x1!F z(dQ!?4eWu_CM@)Y!amVPoUgQF|EPt~sR2aVn+iFSWo-WDY(x*nCDyle1CgRK}RR%@7+N%YGMWjZvKy0!-GQiX^ zay~|tW&RGf{28NSDcn6#Mlox6;cit&O(|-ry7R2) z8i0w)D%lDV_Fgm!W>UG-46P0v32X`K8aija{UUnYkUVdmXT@M^Xf9@NG?^jUIouv0 zRzQy2K3NugnicH*FTf&*2h9QcM_3rby2ZN^tIoERww#n?m2B`60zmaeiTNR&Z2>9W z_>)61O?Bp?_5(=6`@NaBs-|M;Sd(MbtquI|=F)WK<+oym6}3YF6*s6aWgDdOYGlC#4DZ=4c z@)TDTnUByvPRIS&k7IUTNR=xN@a=#SnC7hO?Mz)Mb5WOqdSbiB+_e^$n?>U1a-uZk@u}1HJY;?2cJl*7a zviRhVLm(3Hop@KF#K7F}c~181Q;kPxj^i+)fIz!w?`nzc*!eSo27F%z~Cd<1;e;4;+=7b6UGLi_c&=0B^Foc+6Qbs>J4A{p%{pDkF; z)noOFGxGN<^0iQ`+YwmPppsm#mG_Iy*I1!SJ41HgW%IOUZHt_}EyCW_*mBx0rYfdf zO;KSvg&28tCONm8kHeheFF$$3EB-o$E#0@432D_lJPUw z99K!}hie*JI`5de<0oC03=Z<{i8me*5XF?+ZC6@nSC7LC*NxtE21PoKLwT8J_D>db zs@Mpm>1+Fi_Y46ax$nCcD)p|?g#V0c78z~<)vbC)TR10&zX%dM!_Dpw&MD7*FZ^rH zRvIR{>ED}9SB{wfP4Ry4dEaDheswodL|yBe@RWI(Z-(-O_=w}*AQs;HgHb{utE&AU zOiUfOt7Z2{FSZgWq?Te=uz8PGCZRKn7+aryXPt!+ z+dH)Rte+Sh;1fcf#Pi>$_X&ESk3QeG^h{1AWf#KrnIQBga=C9fmdxLwjG0wIU4)bQ z{p-G~vOifaJO(7PL+#vr0%-m#@w-sPSfrHvIQV$|IF~ry@IJrm7PL1g^t}uwzwJ~K z5O_W`y??v-=soXv5V&xjtk8IRfpS-%Lr9o~Ah|Z4@Hba!J0|Cw?xC^rCf6dW@9e$Vr{UN8Oj zcqkVhBfQxkF$13O1LW^Bt5BD3kl}C%UWP?ScF!&~i=z@bHL0!Ry6e(11QmSJD<~6= z33<8=5Eik3^8B!dSjTH8jzJ*LDgFTG$H@+K04h+pWz(-?-C+P-f&79}FYU@tl*4K% zoXl%fKg77K{{?XZ?GVw37Q-o`gT9hYX=~_6r`xBk>nhgX#o(Je#9JwN8WnBtvqOv# za)ahIikL?higdA@R}}Pfe{n{b^hud4kZKwVT+_Bs1syD47sFl{So%ZqPiMBlDj@-~l8??~ z)M<}v*ARWwE$h>i5)06^sILGK9tDML1y7b7m_;XC3s+z_im)j*cP%egz0GZ76A-wMqu7vo^ z^dh0mawt-U7{B?@{ou)OCHqYMT3F@C|Im-h(pn$kG>X~&2%1$?`uv^w@jsvSRifc8 z`;@p2+YWkY1fxwYO$Z*P;~S|E^+v6i2qoLVy-bG@p_tS)r)} zu1$-?)Efj|-Eh#$0&`iC7NNqp(9B*VRD?>GBOI>IC(k(S|Kb2jNpe>_8G}?r=~uhN z0k2_AndsCbY|ul0B50ua&umjk62R2hea>17F{${LuExdeReF%>_^oQ%zHULttQ|GS zj+!d-BulY&p4mV4uS{YxGjmg4S4XAuh(?8edw+S8Oud*3+HDlMj<6<*w%+y1GdQs|soX*i)?>Ydu|u@U$cZ1r1^95Xp?6dc+c07(3tAfkAtt6{^hPr6tx zeQ)%U2P@Mk3#U=`W+`eO3`Q*`v-_|#tnXh3Rb=8>h@AxlAp(ff#+CRDaF&TQR=ZDi40-g)t+@%1q&C+qH9X+1DFb9a7!rrxKhe1wnVy8UHxt?{~ zmpDRHVJGmQ0r?h!Z9a)wa739$uBa%lO_6Psfh=5@!yj8Rw>C^TbL=5{Ij3;?)Tne) zJ$cYyaw_$`s>0RsdeB=0)kEKMXi1)hwJ+oQD*5CQ~Rir9_q`5h$ zt&TvUnomybL+wGtTkexZwP4mb_~$u;JGeeI(Q}Lw3PtFS7v9Y86_@2sPONn^S^%GdzzYmH=6BvJL!>*yg5ymQu+yLj=NsgFWkQ1 z1|R|udx?8>p;(|Y8>aYVjV=N3N=@9Oa8SbrNb)c_P^$(W#?c)q-qYTjXRcPC65z2Q z^s&x$;kFw8vn-;`+5kEyPElWIpY6V#c){(L%s+&&{5tZJ9St&@D0njQg6~BEoy^vD2F!V{3?)~oS@umW(tTIw?me=v zw(jC4vG}oFvP-Q>-iLjXBoP8nyUC|+&|4jDu*}SE@USvsy<+!VUaPAc`%w&xJeHXE zf1pBMuhTyMb|Ltv_?k5BK0$CtsU74t*4CuSLk>ZI{w}DsRbrxB)ury^&;@(M&-(?$ zSua&%Z?%t2h*!6UpF*J&u89Rg9U}jGgd|Y4eO7k1evH$befA=}fnk81qgilISoTYq z3-7QPZeLM0)D1@aZ~cv_IT7A=>&O0{TB9kivJi52?O)}F#dhi94;?S$mbd34JLr# z!6QxIEd!7PT?1V@hWW0F5b)#T)AQ#5Hd}=)(oi(W3c~|Q8;J2T+sDCtxSMqpmQSb+ zT57W6@;@Mka(R|V;(=7tO2gDx z2n^~O^oGDKj?MGU#D!rlr@YCiVWTu4pIJcy&00i0)Ie;^2Ar1pHX8@Gv>U4sPMlNd z=O~U1)l2+PB-aqZ>>E&k#+(y+&+B^0>lSh&c3#$fz)#@!g;0CcdhvB7q5N-K#PAnN zNi);*#5^_0*O-0?Jlh0LgCLGu&Es)Sv|_aDI7$=&?09R-AOsL%F|6$fC)VC)6u=5d z0FA|QS+YYEaMAJ5dBAT#?$PTV90~&rR0;9QlcN%3w70bG9vX#}ApvsIdE_M@+!7qa z`(9%1VPDI7jmInzn?H}Jy{&sWQT$dxxBZM!iJSU7u z!5A_EQ^bpb3@NcrAIds5IZULfr*Sk+ae_Y&WyfkBq~wE(t@knuivFlLEhnbBO4Qdc z;{09NZPZ%iW!;gMDTDu(UJjy#SLpJwL)UFDkVJtAgjYvTrR>5JqNg{In6PH7;yP-F zH>syFtcQ|LdC(~k^Q5ol$Vq%*9%8zf|A9XK<7m%(K!QhST?BFI^HqSlGIO?QN{I<} zvND1kox>%&z7U8AY7aqUIsSJc^sU;{-tVj+rSU~Ixt6l@2pvfvwVQBN|1WoXPM=6 ziC7s=T#bVyRx--sR2qA^ty|Q(2Gaj*kq3qB0lNFl{gl_6fwX<(~EB(K5_*2{`29 zswOiC-nVfVw#jo=4l$Tl?mzi@V5g5BcE`Sh814m>dO&nSu)ZLr3g70%KP)X4W?k)F zy5o*Lxs#>^wi@>iQFo4Z{h_FbZ^v5eZ!FE z1TMJ){^ip;%r(>rlnrY1uB4&NCk=i>_w^+>7Y!ZIia_`MN%&M_iz7%}N3 z&q4Ox{ek~`3C8i;Ev=yYm-z3P)p;PVWBL{}N(_9$oSZ!jH)t$qMrgFRi5{P^5vd`W z2D>+&mx`We0ODIWqz-6TXY0lLviYAVwoM%-Zz1>nDEHr!4)xUd(|X75xa6W6Fw&c6 z+>H8mtR(w13LOuVZtNfNMG>yz^>?HI8mbIinDl5A^Dd?@=wEJm0z=%_9nPS{YL&#aZ^<;u=t>XJA>D`c-rIS4e}l z>2_x62%_BsyP7pFKo2+K<1*>D4;~X8tN+Yr(qh{@KKQ#@j;mpP-MYWFUS1g)c+4<8P4WC>*Iy9 z*q8@$10AA0eu*l| zdFWHx^3wsxdRpM7vZG2=o2#@9DM~D0)bobutNUhsuBCnHkSsoNR@pqhh4i`BcDK5Z zc`p76L9w)*&^vUZRSCPbg3An^xaLGPzTq;4kaoT}PiyH5(Z)2Q#Jyxvf3H zw;RE>J6zxRP}QOV9E%2_lb)B3o`#9W0$-`dkH3cRDYgsz?#`uLtru^Qa-^i*Z~Mt- z8#R}_K?BxO0=pKncxXD{(CZ{Lz4^AjnF2pRT-52IXXIMc3ymb6T2~9}0Dt(_hv~Of zaaQLR;64KzlzwC!Up+r5_or%gCszwXV3_SyK8#gBWU|k<`;zSSS}h zA&jN9QiKq$6unl_X9HG?!GZL6KV)(X^D3XbmRKD175dL`P=sG345Bz-k$Vu{MWW3y zm+=PrMDQkK+M{C@fe!7_m=HQ3))hkrWus*V`4at`!e#-9kgW$wsrG!qc&4$`MZ9A!6O0_9gbx~&+9~wi|iL6NLC9}7$Hgzhfdc}#`!9Q zEbMDZj#s%5$}s|i2S8=yQ9>)c{Zg|g!~;Zzdkj{mK}mzG_*6`ZR`Mr&f84(CqF3Q6 z&=cC&Vv%75ifSe1VS%~NV$4T1yRSbTU|+a(^LO%E%2swqgs&N4_rLuIg{_tfNTXBi zZ^3OpqM}pEOY0tHKk!*ia0g$XOIn41G061Xmd*XX`g=rx;U*L+wdn}VG2cGPvf>46 zsn7nrRRrgaib+5HCsbyh_NjsOud@syd!|CcJKW|E4+_5z`0&v^Qlu+X2IUEfD8p0% z75R^7Z^bRe>p}|<{B8{LbIMRJ_?|yq2gImgq(%gicj|7_+luM-Yx<4SNOnIoVlJ9D zLbFEAVQSlJ7={b%zOuZ7SvvKf;{48?b8qY&t2=jV{wHB`O~OS)5<%~PLDETr4g)sd zl8KE4x7=FYMFo`Zhf(TMOr*%5iyarm{QLgRCg+WaD|Jl7SS>3Z-`ceqf#oWYfZSh1 zDQ56ysn#$G6MYmx2BQ7J@P7YIdlr&7U+ET#5X63ZSD^m4K8EmLxv!X=|M)$B_iD(# zH__YQ`HWDgywHEef15PE+vgvvnVYA$YH09ohUxIGlj=n5)CSQkem?)IWOkHxOFqu@ z2EkEZTDQf{V}}wvnA;ZxM$&u%!wOMJE(SquZ&NT!>-h03^|ibp*zb}}`zYeme`*bL zMJvPQ*(L-vg8|)lhY^T}G`*OkytiA~q!S3y_}8TBIWG$ct7Mx-)G8i%WP~df9Eq>n zx(5AwD0qYqF9A4}>Cj&~nM1x;-ik>Fi%9q!aF1s-()_Xdp5<#tX&yKC!vjxr{g>pG zWcG3*8wCKW0=VPNt=x+TU5v5F7l0`@CHt2%sa#d%DGewlQxBwJLe?NU=B8kU!3unW z;LxzQggg$e$@U4V2OK%Xhl_JT69Psd${8K(z~Zw(8hRZ-bfwy!n0?zJ6SlvmoaVX9 zG(C$o>E}Dub8IPI#$r45H%i^dBu*{q8|}3iGLhsd$>%1p$2@NHOQNpXQ}d6Pb)>6; ze+{o$zVUm0hG4?~Mb%k&MHRQ-eui!&q#3%TJEW18RvJWU0qGcG7^I}Ty9AZ)4(V=? zjsfYIVd(Jk{^H(s|AVvEiT!+^v-f9*+TN)}Dyy0>tCv{gem>3s8acDpOU!MQ!%1&1 zipGO}|Aq?)XCdMm5NwC!OY0a|wQr#a#*?O?UHna)ZWel+R2IPJ(Nu17K*wNL-Z8uf zLfWw$7+T*F! z_bB36j7sSW9VeoMv*0~!@RSgKF;QvKrKcm4DKF$9`Gcl{S*9$r(dJwg{3TBMuDZL5 z6>}Bv0tk0e@GK$~HLWwiOT_|cLu*TFqtTlg2_c4|+Ixcy+aLgb3ASGuz)JT+_rGdq zoHMPfcReSB9-FND1S#k;98r5a0n>^J>a1kWoBFt$hoF{5s(4{xf2TASF?tUASM-ee zB2LpK{W<`qiI-`wMdC6rvqm z1UNt{L)s2_OH8A8;IFp1`%PhkCAVRw%ZD0M*BsZs_RA*K=G|*xuNe+DiTK!~CeSb& zU^_+kD%*Sg)~krrb4V>_|MxBh=Q@xiDoR~)yk#%v2%+r9=v_V&h@2jzc^Lc|5fFXX zAHE9p*N*%9*JikatX%cW4^h9-d~JG*wcnpFpUIcHn~qV?gI&vCm%szMGyycDXLGb? zH_0s;4Z7pW3ux5W_|9kRJKHbkllQA?ZI4&4>p%T7;w9vxh!@3~z9u98(!6_e9Dmt( zh{hYCO#888)zIT5yRJocw06C-!ITr`H{mKT7@gKwz~S;i3YPM4mzr zK*r=f^kS2vTTq`6saFo%)ROe+`jjm#xB2)?%|-m8%Z^Ys*L*D zo({2P7DNoa##B@3h8*^^@z+y($gy3@Q4-xrwiDXi}UG)d&v(@#?`*U9IAAfkMxANE6aav{MDbRN;DFON`|5A!%gT6@2JU0a6?)Z532s|I$B< z><;TvUNy>eIt>fSYei4@A0YJqa5cop{v%JZig4H{X(P8wdAGz272wi-w^kc2pkej1 z;r1_1z#Db7JE!aJ{ILu=Y)}iFsIdcVT<}+ZomSf+h*mT)i3-;0>c(kMReWrF)Q}*xzaMjws=w-gXPe9 zXmi`A-aBKXL8N`k5>$T-zjPbWMv6*RMm7?oxb@+8pkiquX(J@5{YZ+xt>@=v&BSnDC}zYC1cq3IVP% zizWN#Y%h)vRzXE!(OjRc8bXB=bA4%=DhnW$w~-hN%+zghUT;N}QmRHnXCyciCJjSZ z70r$%ActgcUgf<^XfF9t;p_siZ{{n&*7+ggp*c*OEfP*K7?oQNMlrtGvv{zVUp_=%ZrH`=Lak%VQ?}xt3laG-E1jT!q%l^jrC7x3k!^c2 z%Lu(PXJw7yZ`@fQoEzHwgpD-R69PSCZi8|o?4-=kXdPHa6LvT)$O1<0Q_zU}u{VkR zvband=hl7zxZv%EmJHnqho7GjEBipLn@R*K{lLq2U+4*BDJ`h23(kAK0$;>A{Cn$w zM}o3|1CWHiHUt5F(z~<22Yece@<5twyP@IvR$Lu@^pvsSf*L6*wwRCsR#B?u2B+f5 z@Hhysgx^MBK)C^Q`uDZY69=Vve|g3Le!l1nIz0L3JVw7?pcta@{;{H^$F+zEP#?m* zHa$UE1`wiZji6U{9hv>h3)TZf$s~KCF9@kytpO{houPruA;^BpH?;G+}-O%Ya z4^GY69#zbnoz*$HC$%X)_PbxspON1fvQ;-sMylbgp`ekwbHy&z`NeUP>`mJ4J`Q&h zXSpt#d9R&3yh>XAh##zo4dwG3oTsJVfF>Kxwba%1ngQik-T;l4m#@@ye3B3yY$&Gv zM_)LG*#jTNkJj95RZf5^zxMAG{lCWm%CWf)dlOIyrvg;cDi`=)s_TufvaZ^w3DMV zlh%uSg^qmMmVPQ?Ma)#TdMQLtr|@wLNwVTOio~rB&q2X+%HR7u=?Uc#EjhOSUbkKl;T9*gn`Mho}R6M z0QpRJ^yhlF{_pA9Z{@c;;(NuGI1b5;I<23K^ek$ZgaF`FV(iVG~mE}rPvV{*h#ec z(xcbX=S{|g4*@qjR{=jetG$+0^ijO>kYM20{|eH7?K|mTuSgiPXzFPONvHN^<`-LG z*R=Re-CgFGCA?iCZqa+Km~?D|@9#B2WgEAu=y~X`eOeF}DP*MJS~&05+)2+j4D=Yh z>%K0S?sIx`OZqBMs`}I8o%iR<{wMCn>l!mR_wU2etVYcPYFAkHXGtgun;m1$G=R9U zgd`HeYIDO^O%k4$nKVE?tE=XOfkIhM9lZ{-grA;;M>nU zgD^@{?DE4BzBQaR6r6g&KT1w*kA$ll%GLU)L`{N(=y4`#nu98~lvsf{*^Kk0#%gVq z@4~6RY^yp;{!^VS$Z;$>O=3r1UGf@1I*s{EA?^Mr-94mXwEm z0~KjzV%+$cgb+JoXFY8EnWz#wnuVWNjOC72szo(E#$TQoMeQYYW!~dl!KqbML7ucm zn^@ht5P53mPl>{q`b-(v57q!FBiZ%4yPZ#3Zyl#_W)P9YblSDQ$wXg$Q7rCDxYQ7W zXK?W*JLptpa1Fo%W!|>N{>z-G4AUF77_w(|m0vxG#T+SE_dQe&y%X&EK9)NF(&&8x zX;Pxm2)?pvbKc-Z9=F*}3O?qQ)Lo{ux`^?##rsjMCV3-WocYMac%h`?e3fpwaepH- zp2nT^y@xhkF5@L$PSFsFo%Km`S0@gh2Fw8+D80gD z?y`C~xq~1-(~Xs(RsfW`pWr}y`)2#u!QX`dZ~>XIM^YKd-1jqI?CCXQ^2Ltw1BT85 z&h9(ia+{&SP#x%J=zL!(*VU0x)2Soo4{el90t^Go@$qq#nDuQai6{JKZW1UG(Ec(% zfli>qaY=WB&|?1Q`_s>%FIxZ$&oKuEE!?UybrsYNKq3I*!i1WR#@%%{ABTSKP05DNqn|z|@aMPqLdR8W}vbA%@ak5O2)O zS^RU9XV%c#&|=LAW#uX&?BXO*ofm!sa4>Tlb@)XY`^KXebv65z!WgU*_Y!5-RS@F_ z{O^&_?j_=p;I7Nuuk79X_dmy(@?RKpHeymG+6(h zGBdfq?q0htHrpdJbGEv)T|3Xf84ro^Gz315epuhMpoX5xpS)c9)u^}>6iR4s3W_x1 zdO1zgKu5}-9X*glL#`f#o=47WWY=|bTh(_qSWoeNLHg1!PrFU^d-2#(O-KJ}n*nD< zl~0T5y(!00;s+jmBLQ zxjy?-c#87*fBDFDF@eZL_0UPZibMaZR5qmdfPYFeP<6;eeesFSMmaC!>r=zZr}hQf zt}IKeve1APFQ+LCEkFB22m>P3OYG226$k zU~>_Yo0P8dk_c=MuuX={D%%tWS|u>2AV>mOmK0kH4r9Ub>_#En#cwZ}wEU=KwzSB+ zqac9@4U_fD4{sl4+o8P~bU)Q0n@o^7MA_6_+49BRP39!KtYqA%Flq8#(Is1akPpbF zc*MSL`A$c~&YA75k&#S`0zS`Xx<;+&3pT%reJ#?dF+?U1RvYBg&IyhiP{@x!*2|0# z_=N9b>vOORxlH%BrM2rU5Rp@%1P*1nA1Yu85wk(!?%R2T<$?WZ`n>E;@jA)aQ_zQQ z*b9^xnk~ZJB;H*&&CN`aZWcy?@NHOK-edVF{|IO9toeg>n8kRXRI&)WzE7TOtS*MQ zywPvbxK8LO|30I%09N3^-uX+=G;cmS3t^<+VW=?222t(@$n7qV=n$G)Gz%UM{~g)o zcf7+WM40z0BtsiJgVBqil8M*#m~;<=+_Y+pq~gsvFmc4hYsxe*+D%CI4C@s7q!?k4 zuS=dcnIsbrF78m$Rljab?H1+(i_CTs&;NJ+qM}LH!^s}Xlnch6H@!mrZr{YRBN7v& zX^h$vYMk@F6nJl3k?t^MRcIzFS4t}OXe=zo%$d{|kKwHbL#5I%Rzi;_$F}%2HAorX z{w4`czmgdp$HP8fo3A{@61zrrB=cj1KI@CFcaYWyEf-vjF(tHc4f1sQ6bH|%cBKmT zxn>S=uBcQL4O44|y1-u;Z+?=DP{eqlseC4xcy;TsKtbaYr>ehrO1n@rEE&l@!X1A( zR<=!M_d?K^LgO#s0eH5RXo3-8j)_si{0Xp?WOvHZ^>1(;4A_7F?j*2r@%a07EklfX z@wF_w8WB3FObz`v#zOW#_t$VE*&0p@blgCoT&R`=7Rn4tNNz~Hqwj`Q(#hq&hlzm6 z)3q#b(JU(xk>S_FZP)89g0>Uc;)2)fdt(`LHcNLDia{JkY_E&cv{1UC5UjP=WYvrNr)jnG3hwRcjkKm*4Dd(Xi0VYEMf~S>keL zVP05fbS7`WA1wm9#eX*%$g-i-%Cwpro_!=6-z=$EnTs9Q5H4tuJ2G*&Em>vl*c=7S zvF11sYe@et=+QZgOnCa~=uBwIe3GZ{SJO{FfcrU0dYSqX*zNe%oL%ta1+fdIHyiIZ z?Ap*Ro1*2ug&Z{N`xw`AfYAuUS9~JL$>?tHRl@(4BNF(=Cif$ zdb}DKh}!ZJ>CpzlmF{>M562;%S0``DCKI{oHT)v*sbyHo4aGQx^s5%a*)2g4jSo!D z7s5w0f)bS5(QKOf?3_acmKau{FCFTG{6m60G#XK>d{;1D$CsR#C!?0GbmX6C10JJn zNlq{<_^l&T@n&CBOj4r=Ml6Nfbg<65WybB(ycp zIv1DA8qIF5T$T6vpNio&|2wX#Q_+oVXLXGpzk1TQ5hXQlm!^NQs^50?SAVpO>F`5O z0@Bl~r$`}&m;_Kd7_0XwP(3oUn9dhQcd%4K*wE@?WZZhtF^Y)?@%EQnV^EGR&}?X5 zN?*53QhvjP_P6!?;fFc?_33E00L&XQVlegl!zbLTDT-J%vngJYzcZ#x4$TIp8cO5J z;>I6$N4(rRV9T5DWOdFQio8cMp`wCXHyyG4O;m2eYcQR8*T;^X>vBoY@1>HCh~6R; z0wCP3?HMtta`vix{kSfqhDe+EEU832HOviIsaHDG_Q4M{t(^K9g}hzS?VAS`Q>6@`7;xwP!&bP``F;+Jh3vcYH4WI^fPDiD-0SD~I-SO@&~NBT*6gutl3L z^4$zPc)~N4W>=+qnbmQ<{93ZYtBCtY*FgpX_5(eK>;T((MhQB_RrDsymEc9BEinJH z>M#I2G+tj{9KN8nM-7`%Y~wTTcoH-Or)t)8%LJf0dr3h#BLb z>XsROQ;-GSp_r$j26U+^n`QGT-;{8nDBsmx^h_TOh$CQw?!ZZ$ZU{2Tcl%|?9&Wx= zx9BeL6y~}E6Gv`M9?4~7w~cKLuF&1;ih4wf-E0nugT)egCuA1S!+~hBc?ilbLo(bd zs`ek>Eb-LI^G694C<0<@`B`}ltGjn5YSW{m_R&4v%*6)j<*BDCDZ)4NWOK|qO%?KF zSNJeyt|<1V!Fc57;hnSOd{^>WB61>9=xL}2xBOlVe#n!zl2D3_b5i8g`-2^ zzT30|7sQZfF#l{L*S~>_Z;epzkuA_;!X9H1<9_cx^Q8VVNZgVym@wLc;vL_RsqaCF z*G3wN~WP+F&k^zsX1$s@iei`9>}LRO*Kn?&mgBw_NYVU~o{hmql2GBeYQ*&lWY zc}-^nC0}UKNT6!f14n6oYn8B?SI<#jzIj>?o6D2Th)i%X*xlZc8H1?9qzu|jSN=^+S%G?!sN0-!lIXzQuWa;V4E_%S!VNR!vf9GSv zOJt*d(ejPqyY?sx>EFMhDB~F8vkKlRr{lj8sXIXH8W@^G3@q09)3(2Spd?>qzY-wv za*4?>)kz-ti^8S5sgN_qtXc&$0b@eLD;UA?Zvo4381fIu?S8*P8)n^CK zp_LbM{@cJ{GQl4Tbv7a+Bv{1LxJHq30okt@`-?>OVU`VY2X6>bU*rm24VOoF(pDF2 zr`M=~$> z)}&+o=^cw_tRYaj2`&PQF=+XcM(#*=bgC(l2Vlu7d`inv7bc^iM~!~Ro*X-~yus2h zP;DKG5@7fD!19OU(V*zB0=M0l+R~;DJx7*hhW8xy??0V@nJgovM{3<09%lD}3{8Md zBiU~wBg3g5mBXYs-=vHsU6bMByy5*9xu9-!2PIJBy<9ZbZWp#w?N&O-q?)g_GH0Gu z=OJl3Ayz3hd4m70sS1`JEm<_4khPpTXF&K5+tQF?k;fRnsw`qd8hU88_n+AdX{d+i zhPs=1eY9r>N%QRBQx&A2=3;K^9H=S9lFz(m7Q&@*niV71ov>A3{zOU{QxEYzV#%bc zQOti6mjT}ef7GnRXgIBr;B{*QCEbyvJ$iB9a5EFQEU!$#O;4S|PO@XKwlmPm#JrAg z&Yul+vrwfd^0Hb}z;IL7BP}Xa+IL!U>*udZ0f5)HZg>a!U#TLaRwy%o4WJ`vlT9K0 zoMv9eTj{btON&9|Ldkrg38mWf6x}M79n1$U?AkFUa`4q2?QT6nUWe2wlzk(XD!SC_ zk1eFBeHqdLt#I7)(df_Jj;RSKc0ClR6sYI*I!S@C#5Zp`0G|Or4a4x`F=R*dhny;V*zafTOwaZe2S)=Zh=O0yE#pm$9C&a*-&FP#FRt%wduO_F{mjq42zBBng5*qW@Gw4VZPT z-rK2|P|z?7BbF-Kc)n{KK@x?t(|)##wuILvNFc^}bXt#S=WUD&EJide?SpR%6QTV! zFbCxwMn3w36$g{-`_!nfAEIfz*Dke2ZUxpT8VtacB`MqMYH1(T#uHpAIW>?u4s8*QyHk90{%_!NJ z^={iOEytAN|AZKdkMd%DS&^I zeLjGlN9M}_2bjDi(*Yg)+neHj>55ryaW!%LeY^6Mb3OJXad`10FtN+cOeP>I{(aTv zG$KOF|M$onnFG|lyueQQ?`Am@fr0JNo`8KlG8q)>!n!HX6&>;Hu#_0ytL)&&lYM(@x1LMb2i<9v`Bl>l3m-CJECL?=qh|9zWozylw*L zKQ3D-WxfYl5-{IwkXK*&*P3r|bnx_9z5xde$JaGBl_C^FBI3!i%vSO%+Z|JF{#%56 zoP#rAToF$_FYJX|VHM<1FHeAy5i{CkE($rdY--|@WflA1Qukk)hYUq?8yOkt>POA& z-ji!fbsJd-|DqKH?zjy_$&OMxW+3=exj36!i#*H)=X}%r%$Oew*vgbDBCPf0H~5ti zc+~Jfex%;C&tm-Hb7l-}2bw@p?c0Hzpk3o852#4fe0h`H9sYDJmUXKEBjjRd>9_Ks z@vd3Xhn$68ds2$B7HNdQ^l0*9RNV-sM!R_yWV26?3Du@o__GazLqy#h{Wj^ZEAPX& zH2m>HxoB4snxNhn>r+t_qc5ucsX+=x0uMVl$Gw2!A77TQ!+Zi%l0I~CP3*QL^y6kv zxWD0Sd+)cwF11*^w|X_Zg_`a2h{%{vYo#mEYxk+H|A7RZ-B#drAQjcK_?S2|JqK|Q zuWlN!=zpZi70U?*#D_1nZ=+~>S6;Dsw96i3lIzQV`O%%a-L7r&o?8J&qLNUlK}J3A z2gdW%%rQ4tF{@PJpfEpT{c-6*vB1~pz1;$)GzLxeyY{eJw9j}`gO)AGpY$Ibh(>Yg zg%-myt#NzRoPMtU$zQUaX+R{-XqVj|)7C@!x2uh_+C*@X?DK!SLs26YT;(*`7p|2w z)jQfN$ijAcC!ZmkL@B&bG+Lp~dDa*Nj|uNN`r|((GPceofzj^{ zV2ULTL&4a+#*^u`a|110DT$dZtF*jXQQjGFSJ)n$3ErmnC-aW6s$zJNvqkLz?1Yc# zQvDHqt6miI=d4Uy>$GP0y(@GZm!RUxo7vNAo44vMw*~Sa?&x1O2 z*EHzgIr@uUDOpMYt?bNywzQMYa}Ww*JhvaeW^;L7kyOVc0qVt=R%jl+t_x8%&A>8X zh?RY_zs3_KJ0CUx%Mw*~Idk3tEo6^6KKO0=_~YNKi+5GxDAaki-sy}|wt0T1w|ur& zrogUx3&1-`xfcBQZ-g#w`v#kpL6Z5MyVZdm(P7LNLHJsT|IA)oc=o$K>}Etom? z<+(R5=%;1Ncxs;bg}9*GO9!o7BBn5EmD@hpKcaLot#t|k&7(nSf#VZ}HFE0X zvJs#8!kX{juAL}#`0mCQ9#c5=m+zVU;SQe)QeHWp#D#v-9ZXoZ z)*$nJ-QnlL=M27v@FQAfkNwKmXS(+?KLkvien=rfP-0qG8~tbM_8zs8i(n0J+X;Vt zYlF;aK3RBg7RUvhf7kthe$mU75~mY;4NqC#zyh^9uK$}_GjZ-1Zx6Zo?tX^pfyoDk z9uBW7?^BpF4Uy&778d^QHj;fhJiNRD{nW4Z9$|%pE?0(*Vj=2gfcHT6vxFKf=`zl` z&08glJbZu?@+EBv?TuV`N!*v)(F%P!pYL>qRmh&t2Wka)rASp-gKgj!=d>-(!~1E( zyJyhY4@^reH}rh#FzMZHCMdteo4|f3T5~KAN_kt%5bFWB9*V3L3%8Xu8sOVL*hBK4 zCSm4Ml9VykTH+N<#+vW{FAIS86NQZ`$9_`y_$=k#^L*ca6Bvg!^P5EG6!xQgoqGr?qj|z2z1t9~ zgSl3q84ZpWmmcU5MaZYA90`@R9r1etkHegoF^qcYCedc{d+Ry;3&<&Onw0|*=-dYX zg!oeq!U=xsp@9?fpbUdx1%hPN*ZFNjK+9KP``7#0%7^%q6!vxsc-Ay#BE>LpXzUig zd=AIpkz&AR!qwLg1Lz}A+wBBgC9K@Qsqb9QmdH&1;?k${-~!Au=9ww|%A%pfdy3QZ zcZG3Ntmi?J3AB62*H+5ZK5crMT0NdX1#C+aOP~{u^ZqLgg5}s&FkRvLKJ=O;w+JbB zsJx;Z2-(*v8Q{9ZyNfj-+*@Vh4M=aDKAVzx&UPr@e~d0MuV=C(^4rvwL6WT7F`eqk z+_b`CUzbZIP&?tptwV+)AEttoM~WR0Ob&NUyS>!#IpA6k0G+NLJ0Q(rIS8U|!oYdQ zTN}yG zz#PZOav;`uuSaq7b~d%&@tM?-YO4aej3iNO0NYDLxZfK_j2cz9V}?ZZ+v!^!QTB zQ8i>pdLE2UT^!A&rlENU$kkQtJA&~Wxs<6-I5!KLDt;3a(gu-3g4(#a<%j5WD#r(+ zdVh+Ng?<+%YVJXJ7{^QPe4b1X(i;rx(Nhjb0iu{X8&*qj1%CWeX3{3TGvx5YOd^#j zU<9O1j2IcQM!vX7p5Ya=v0v(3@Eu-K$r9~Zg?=wGLK%G#YWZEED%XS z_Zh%q?KQ6J&SnLoo!r^=e_EROu7L7nND#C8XTN^UZ_8uO=a;5&pTfZug3swtsG_7Q zAXelj!MM(?5eF!`dZLL{2={?!9#i&5Dwe591M3`)#}rLteR1tPsHGpFndo?7E$r~8 zS_u}BYEjVZO>$m~a>Kzz!yZgSf7giq4{IBJZn7z6`!vhXZ>Xx>$?}i)@6GdE1?8|u z^@G6_My7LMtzigqHheS30Fy zSU%dn*Jyq;IytERk{>OeUNu`9x3@;LXLeN0q~?D#(p_E0gu=a2Y&+}Ay|y?t)xxW0 zyX31>yJvj7v=rNBpDBA^-K3ZyYh_LY47tI&X6o+0^L+0WLxi$v9nZ=&XHSeKO9bT` zp!9v0yFLx@QbRj;oa?}EwN+Ot8R=KBfj%Qh5`U7gzm;y60kmRMuuBq14AnK-6vZr| z3sAfmi~~&7$>p-d#4MA?2hu*8cIfZML#puvSWv$Hq3_g}rS>e8cJzva2L z22NF(7y+(!eM>bl9cAl`Wr;7@x!6TeF$Ty+fYF~O84m6JaE(u1|C{nc9Yst2Y_uGP z0jxmqeaDj(O7%o*|5cS#TD^`9=#1Pc_{v7Qfi@H@!kefp9%Q|WWt~}$BBlh$M+;$! z$DFk35TT4q25M2b8uG-*N?}Vn6vQawnNK$~EK3@ny$uarUa>*C;FsJ+Cb2bIofLE^ zZfb!rf^<_>D5kB!B0+P*vP&$5<4*!UZ?$DowLwBy^x~rkg!F*0n=RPX1EcAhHD}S` zlX?>Jh1u|YarOhs2_=V-Q+bRBSwJBVdLkzVi`Cbl^%YbY$2C8Jj@Hh*DsRO_g);+1 zj$l^FnXqB##7E>C0?!$a!=U4B>)Aalz&&&o8E`u5oKCMm2bU@xGc56KGgl6%G`*|X z%ktn@r^_LaPRrb1TynmY-g_h@lt4_$L<$wewd#`Z1tBoX;=nS!u&5G}q+NQ#RHEX_ zvDQIUf`B4T>Xh84V4gI)=q>4WAJ5Mw$Vdp_T$2hfT;Fy$(xFtQ_wY7v4m3pT0_vt}QHbh9=iPxx-!||0js?hCNm74l z-oikQgm3q}2(`^RlW}{d;ZUb*K~NBIh`LNeCu@L5K<%5m=P4}krqJKVdwnzNs^BD^ z0hmjPx=EOcb_nyN&y_SM*K)?z3*1a_qa@k)Mk+&n2M94QhP5OggCQ7ZJGfQJgn7j! zv67t%wZxDE}_XvZGh14apHpn#rqy*xb3m5B#*lF`1oBv{R-&vbVD{)<6=58i= zOd))AdFqeFi>^wz4zuufN@#ZErOcGeN=Jz$hSF>E<%~j3t-@(km2-yLS^$&hvMPs# z)Z&}y8NF$v>4*eQ@DzBYSbCpeQu0v2gy>;)7Z-myyEPs|yr=2n>q7$eb$;9fd)_^g ze_u~pz&mHFvxygZD@U^Yuo?8QQ)Et4aCCzEFBvy3d6WoLfSb2kO1l{)Yu-M4jtY2yjw1vNSjK<}-KbRV43`cLDRL7y8;>s z$Hym$li*7}<(CxtJYW|gy>lUI*YYhq7jJZ<49^H35l=i6!Ow1z%Y5gX9HewQvuW;1 zqe&MBALR--N999R^Wp2&2v^mivuqvAeeHyTvwWHJm5pp&gu-Rj4z&t$>T!4Yr(9k= zi~z?^LzU7+WWSgD{nM#Uw<-kf*7M3Kn%hx)1w@&M~uhDjF7<<-3@Q; zTZwU(UU=N6JI%#7{}Y1^;nifzU4)7ILMC9h+wj#R4j<`Bm~{dhWFnwaYGO8N;tULm zgY5_Tqs^eaV(H0Zj``TD6cT6lFzph1RRp;C2-|-Ku9OPYR@6P@N~?wov~%sHh>bAE zPhJ?m$&_hXLMd}^I8MB>Ts5_u_N!^48$A7b@n-4EyP=cB&e`)BTKsJ$sferEp_$Hj z@yz7+uXyiF!JK{_<#-)T^Y1L_f1@TfJ+M1VfXp;2gJ~~oOwCrvmnryFMq4ne=ob4# zhhVMmHz)<*M#MW>?R#5POeNH;*_fq!gJNdek}`Y4e#7^}Lb;0K${pJn4RYx5$%01eX`PahD8{vw1zIr)k z?{vEVkTh|@NG|`7d$DuPCAS?{sx^{gb+Em?l!Q!b@0-24TD?7Rx*IP!!tXdeq^zQ| zZ--=Y)`?!j>Q&F`Il`x?JGnoK2DWQzvOzRbZ=NsoiV1g0GICV z@X3G68|+gFW5`_xN0+iWJxFB8XmUbMcZo3reW)NX>WwLZl+sL50wvn^Dn5a&3}l6K zz-aqAd(_m58yB1hF}U(OPU=0UW%q%qM26r0Op6BC=QM{C(2Iq9F|*s1LQYwZEMe|o zd`(n;U157ANCoKJH>Od_*-&Zh^v~-ck;Qu3E@^s|p3%liqg;()!H?vr(5|-`$^>+) zhge))X!N6<(k+T8g4XRz)iw>=^&#q&l3qL9Ou`W;7%%M&9g5oRjM3Ta`C#UIKhiYz zEyv(-QYIp*;5G^$-D1YKi^+?h9GBXYr;E9F1CrFJI?y5)Plz19H%QL&De0gH6o3+z z?ER9{3o;VAQ&pff)K1YTguLQ|p$z?*C##evO|zhmjna;cNJr5lrPhg`(pvu(1xw5V z*6zOXEae;NuWJiB6Gx{NAFJ~dHRAuc1k0^)x;Kb}`@ugKvbpLeG_|G1S5?8JdNiQ+%Y(C~*9nQQ_ zJYLNh{9wz3Tv|#!_D`z?3^|F5@y?tUQnj&(`V|p@UNrW$^PG=r9sBc-umkleg0_ zI2b2Y;%Yuq0&gyE->!%44I|-x+4liwO^}m=W-rM0!6U@mHETU?IpyYbpX_D}2vAY*wLE?;(YV|3CRT5`rI(l)@IpzX5SXq><4GTPd=s(+4oZD zRko65583U*LXb6*wVe(zjmgObpDyyQDUT{8Ab^Q}gn#?^?a?>Els7 z^P8lV_>mux6}(!Q0q~y!EF3G zu~5ERsY`>oQsldcHrDe1;`?%Kda?^oh||j}2N~aoN}pBALqq0X4RDYLnf2P+eT@J{ zn8swtex2hn_XlyM=&8ht64I!KzUl5Qfw4D&-Se(aGG7N`9De@<*U4w48c@^?z5{PX z3*?|kj&tx3G7V@EG`M4ghyAoRRvPg$dDn^hbz=PQ=RXY)0(IXn@N(D47j*8+M!xTA zIa7NiWYkA}Zn)e^)Co-}BFrBTMzpGGkLM!pekEA@;k>l)buVa|EN|`FWMkA@0`BLP6 zeS=G8vmK=ut7m!ydB8UpA;{;4KQ8X##j~`S_=YIe@|Y-Cs$U@A-<5T=#$uZ11t}G z1?c|?58W-l@q!~@%(ML^ZCVm(boJY{7f8^aa-0@O)PVIs3cr4PaUxvtFm6#em(}cc z*nb!aIoW-FJ#y$OrNlI3d?gVKefGCfTBFl}#TWH`m!y(1_S?5fV9A_P_`P}T-t`T) zl>DNCmXK6VX+g(!&n;3+>uixmO5;IAQb==!~$F7Iip)bhdm+Gp$Ew&aKFWI=BM;{P``Qe!jYi3KQl_~{S2NiqyUfr1~r7Dn?GvkdV;7nPJt(^P<8>6~fUJ z!lvq0LZKms^uZeAmzNGmE%N=WsCV~+~cid4>ndwJ2KH?qIr<2)mf*Lbv}^;I$+<#&0j zorD@8b#?9?0uW^_2HtG0!LO7m)lChyd{wGCV&~t}e;FB{TZex%SN*^@zLp7LthmVg zHQrI*T=sN1UKHqnWSh9SnlJHD4RG&d0f{&_)a+HnSEMcFm^<40*Uo1{1fIK>bx)qO1}$`=oqf+kp@;Xn z*`1Z-qU(Cnb&Impw*5>>#wnz=*~eUT1PLjQ-iw_u8-T0|^{4hDS#rkb14qS<%nox$ zj(>bvTT>^ei;GGlmpO}A@p;OfDQQz)=jJGFvhU!6nx`r;X{Y{c9?0+geh~0-GbV4e zH%@co%*mcsGO*QB!WiDnOgQyz!#guKwrJzpz3Y^xYE}i5VDS* zVUDdT@nuTYds4u$myUNOZbkN0lJNh2oGr+cWHBR)_TI5tF;~y30xV^X52pe3geDn3fMdsIM~Th ziSUxEI5^-B`vljpWW@-hcgjne{po`~dnzKsm1epr@?1yO*zs)x=-dzuc<){9DFkea zow!Uo{43gH3diL;gfOMXU_(saTb2kI!|m5jTmvbm`8&PG72#mhJS~O~>r5=*tn2P2 z<8}V^7h~U&_SgJJgopNxjfME|sKn(!!j9{-K;CqPtoncBhoR14SDCMzs?CTG4S2Cn zEC)lmoPImX0c@_IJq7;1*9&aMYo`{f<>|`jqKMdVXkd#!>|PgF&63F{3W(S}3o(-t$X!t!OsM==uD@7j{l@mi+zIw}``Qct^QFGa>g?+w4ixFO420E* zBGz)xh@Zb&Zjpm*lV*(&jw{zy#d{|IA{=oiSCXz8 z&l`#^T50@k0@}y#zLH-rA5^a07eK=qh2=-(lxXh|3$Bm2@RCZecLy16UfF1T(g21A2afu?pNH|kD9@gk zIBFG*m72L?8U^o9OvU3)rDLV&xDq3#Q{=hi`TCHpe-HgiAkxsgyP&Jh!{$WfWI+NkytB}@Fn zzW*<2s`A0IJYZjqgPaaenDN19(Z?b-Y1nnGp}q>xnHo>zOMApy_B)4b4zrc_qf;|K z5w$q#@|BX#Zlhs#%f2IZv4q|yS@Z0uE|))97@At7t%To&d!|%{5hY#YwS)#AD-eKf z$O-YRNv`qLZDrUdyR7dlE=vq3N(*s3^(r)E0jZuVncY7VTfoLM+zstk{>95wzH7S& zymzy-fh$a%P3Gcli3Q=({hiv9WItqN6^e3y>3YA8LnV|NZtvQUx{&J-!;FSsA?_~U z#jRa}V1j3QArGq$Jmyk7Br`V@V{V@t^U}Y#tuF>mOZnO$g?Bp(_IxqASEwIIx4jdiUe%qk|&$`FejGbL7n%yTZESxLkv{%4x?^|m*lrV=0e$msKlw%l8Klw1veN8J#VDI~s;hEi$)IvkUR&wO{M_lVIzI=5jzwbT0X6ZT zM7KTI1l1gD^v#UG6k-tLAs)JN3jXA~Ziinhb|6tBeCop8HRHqHFl*yf*WTs$*H&Ng z`iNvRQqt%Um@x#myS?%&KWWB#ezcZdlt^>6?G~u#h@xZ6T+ZL1p95* z5qheoNw?u(R65x?J1DW=I%{A>%?YTM{5-bLXLFp+7x?s5`-1`9)v_ON*2DSoQB~-3 zi)sDj;!~N-IhvuofxD%K(NZ@bS`L8 zfBf7I5?@|H5}36OwJC6f!K@~hK6;k!L%iKE@enEvdi&2`lB0!LKW87F25_lXwK)uk z1co2*Xas&!-cVB?{oU*ei_YnfB6r|T#y3N93NXHzY@^8y@YVDINlrXRF>2pSs4nHm zbTCDUEZ+Jm;nN8HAEw?rob5O4-%kW7LX4KEO|7D0uaKZblIlj;T$v-*Xx$oJ%?f>qgG6{^TLM zy<8D>I%u~shTWQc544-t+wQ);(Fw^}w^Wa%>hIw7Zha|JEFjWxv3>4mkTO9cS5#VB z-Rxd>qc=Vp;F~0Y5b@jmKBR!VAWT^uyyG`NN-Ao8Nj=0pGgwoK;329iWVGq+>$CT4 zl9-~1UEVzp5**#T)WhYx>c*gbcJ&z*eCn=Z7HK1GnJ;APH0vE4zr}X0N&Alh4Y^b? zx46`zAOd=&w*+36RV!52Z0(%k&&cR_lDGFTrjCLuvwcI%V*guNeb6Gy_ZOJtwx9{H zadxszD*fkRSo{7FPPSE^X?{C4Bw91sN4z9jR4(6H*Xu= zPCXJ?$1yGFen$)_+w;;83xC&9-@XSq0ZE=oPb604DX;?;r_7rcq~A30!V?De%rDFg zLO5c&?JOQT!(_!d`6xf}|J@Y7D|ee4ni?4E9i09QB2CWUGPPc!eAG6s)Q6ME(a(OH zhH!!Z8+-nZoMdrtHwY$vpycq_6J{VHQEGhbVqF&h(v;N#K(6C(9#iI!Kd5uo1!Q& zHK?CGA{$$!q5tGoVc>?vv^htad%B!8C__?6fbXB6djJHIry3Opc2Lx>^ie5Fth5}G zFAVvQGebmm&`vo8ml8_G9keQOVK@=@tm^-q)(W0`WfAxRvC$P8;x7 zW_|^ErsA;|@>01aG2cEf@|hdpla}mzRldZ^mE|O3DnfEWFLip?|HfTQzsb5XG4mlb zm)2gmB|$AI$l`(6Gxi9*=JL7b#j3^bQ;VY!-$63JEO(}I@E)E$itC*BWpC68+lYt` zcG%UVAQo_Oh%F{*R?ytMkF< zj0Gcs4#Y_HeTlEBVQOck;|YO>5kR}r4~ld za-lK)ZNZi6B~RB2BS<8rLKK6-{-?{RUE^SXy2$28U({L#sy=Q|>{)yGyzzRObs5(e zRd{mh!F>DUiL}<}=cN+8(TItIrJqpeM9UqAmhdlF6y}-UG2HlY0Ru-Cas*v z%iECov1n~9fByVA#Jy>eWj;6J!80R)HiGDl!HZP2pYXrAYHz(hDtEfr`jMt1s9KfhHyFmYcobC_o#kzazYV(VejQuevb9Oa2D zJP?1~HMD5cz0xp$i10^bjh^KF0NcRbh7;3;Om~D6$P0sHId=yz zbk9ZF-Ec6%#1)!)eNZLi5?y;&+&ZR)|6!wijSXP3u7u=l4j>b`dOI# z@kBeMkwT(A2yTwUI1xDLp&Mn552n2~zOj%ZwtvQlNoSlk6NGrh458n&eAji&R`EIW z{|SVWoV(YgDTj9U2<4&Qy-c>XMs?+>|1)furJaa`NMAK_h)&x#5<^OV^?eFEruU87 z07Evseaxjz{ExA`OU?JZd)IG<|Be+YYb# z*joJz>A&~)&c;-l?3UnB($|73>5by3jQ1PNbY4%`QsB?f5#+@C{e!~fB+9B`>HG6{ z)%WGT+lIRQ!L4gIx|mtpevMb;d3p7S+UhE_;>}*5w&)kx+n;TFB*K4t#2e|~C5=wI zt;YbRqO6g~!2^~wU3$K2&cwSvbIGoFK9RnM8-4GNc~`p54+Q+H4bD8Bp>Me2E|1Q* z3dv&W1Z$C_LVoK3zEkh-Q$S1s7~m?=p{b>tuC6lJUYd#WV@n$SRX+r9^Tz{CdLHl-JT-Wd*gOTThz|u z6d#6sn>~LtZp4=9?PqCS5FyA=FJFEq zO7;!#<9%!5A@`1r(Xq-o#VUP+wJPdghQ;e^UmG?;UXz$rBPv~7zAKeMq>i34SxoWY zZk^;1{uQbmN=3$-;o<@lghu0VIH!@vqW==;!wNIKcm!Y9b+4-Va~jl&AI#8i4X9nk zDBc$T7yk0?aKcDR`sV9jER!`o)X(`;@>;&_r`zc%Bz_;RiiLR}a#d3cr+N}?G8x_# zq_mGMu^mw%O)EmIiq}eh{E&~_Gw*;h4Y}6}IhR4pKp7`F{3)w4icT?iK~yVy_>qx! z>?>cA{FDw|+6kDugI$8Ks>hX|s5T-zTrd+6`Lvp>Vfsk7tfWjWQ*w|lG+WqzIbuFi zY6gOAIu6TuA~w_4OB(E+<@-UO7c@9~^TA5L)h~nbY3lAs6v?T3Muf^A{zIFRQ`lOA z2J5=YuJoY1y#4wmzfBUh`EB|eSsZPlI*+wn_oi?1p9(CN`hjze;eQw##?lJEfxw zWOGWhpypwzchfj~(z6?dFOu`a90}^d!p3a98PiyLTb;fZ$VmEIM;`NEkUB zxldAuO$#^ewpGmfU4--rw@yQ(pN_afG^X8IM?LGMeMg*GS9%`2@vqylc{BXsi66=b zBIdnW85VE@IPn;QolVLv?&y*m4x84Z-KKJ`s3UOw{cbv^U^ zZ@4pMY<#J(GS+?&7i9|_WEvmTb+>t)$t*8)mQJd+y_biGV$JUH-REc>@;m;%FI`GT zFcJ6`C9J%B@!~TsSL!XwsNe*gXcjreZIqFY?EQE!Zy|%6c9-2%`tzSRc)o*93qpvo zYoBhI+`O~kP*aMdZ%|Rd{W_IjeHQi~DTqqA<@8M*;b7cSz|mu(ltUqvwYvyocWY-> z;l7OpM3;rCEW#=KljfQ9L!W0Y#^A!NrX7Tn#!OIV*!Jn}MT+_VE{>pXVo~EiuCLo) zhQ?!vYo8E##OUL}@>omBOlfk<>f!fklJ|aS*#z7Uc2lRGj5J!;dj1k5{#+O$#R|zE zRtcNFRQ;D6i+#l&Fh=a{izuEQG3it;krfqd_;GIn^6D0ovDEjh36>Z??W_KQHig zBA#OO$Ph4n?7g}KVZ3AbwK~`=4WlrOuO@SUoVh@@V6eMu6Y0y>HOf8oc)T~PCdDSs zU2MGhGXQ(`J5;)&zD9f|+@~x$NJ8EJbeAUeNH{Mvap4}I3cy}EE{Yg`?Hg(I@@4rC zZvd&sD}W2oy7X6zZHeBuRe*clP_tQksLf>Vn*iKKyDCr)RCAm1(AM_dG9$b@^DiaQ zHPDO{!bhL|lDERjCdpzdyjts*wotUJDXN%}?02bwt-6McDKMH)IE$i5u1lm!M_qVJ zFiHHng~7^Dd1(lXsNiP(c&1q~I{%I#>2fHO16qi8DEPrAmOR3kqGaiq>{kzmSufcxo5sl|p(@U77-N&ii=_Xsr(sC->SV!Gv z&tvUb!N^F9&dDm8Tr>_myaHPjJC8b4*9bW9Z zOF6?e{;{jZRxb@mc6aQ32h7c(Vx4)+I4*5OTxuLfxgKe^@bf&l$?Y$w?5vF-zdm(MX$%{j9Vy}GNO-krDTxGV2v_q=SdWBBd0Od09dwbU)~rr;gQpw;gRLn0E)U)SLb6 z`SYUd3dO3|=CUEc#M=Cw(%=1FP1d(|+w>Pq-=z#5Nt$g{l)d`~d1GNVRoyc`7X(cN z@|vi-ZP|+-jJ+IwLF5M1i5>X*V#Ml5faqKmF+LXSj6bLo?53#btLqfCsHQpMFb!ss z`%v1+rT$j+VvZ3td;Eb%$ij^IAY$pw88VGY z7PpB5uAI#Jw|X+Pv6)JkQ)iMdDZd1c7c*VaYRP&8D7??}LAmz^NS-`WHr)3@xaE*# zjX{l#Bs*fMCf`tV2oGVnqNJ71jcAUiY=z?)FO6IWBzU+6fxYv0gsFO$!t4YrsL@oH zbr2C;EUPwa3ruS+w2n(c=rtg!+vs@vZ0UMojc z%Piit|HKjeW%Q9c8;3TPFSw2ZWUle?_YLz8UHX(#@{t&+G#uTit!FoSY&w&U91Nl47HxQI)5E98 zPNO5z33iG+{?*HpZ;-@okpl-`i^sq6sl7iqa^LgPT+kak2lv@moZ>AMt=6MB#8)ZH zkby@3oklRFk1{%r2=#<=q|KLoVFJ1gEiwNp>zf_e8|B`6;8gkju0d_#DlqqidhVpm zy}2)OhM%9Gesw<%$b|*~Kl9dU^uKuJ zaX73-$v(ffeidRdS#&bF|IU<=6`e&wK_A?>-5@aSxne}Roz7XFAT}t?bxDYNkcF|j zSWC}gL8Y1QGoFR3*MAe;QV|x13yo9^RsFnpEap zk(2^2OR1u*Rj++d6s$>O7p4O%R$4~e_}}$$MaxcmU`N-p+-C?f)rrM|53okHC}x^L z&!Kv=B8(50+jSs@XzXZ`*D4jPw8H5cJP1_|gNnjwDj*f>Aq>X1 z+*bm#Wi!}ain&~Y=NJI)SP z!Wwt3tvu#_f-RQ)`j!5VE~oQhA@0o=Mg>x6d*SB8 zxTzzyRN%E!)fCIP%(^X@ZNGN+`e4@aC}{h?bt=#WgWiMcTCklD;n8zM3t=}1-3DQ! z79qsZ(sxTYnav92f%b)4Yvh?Z1BQ{dz}m=Y%h|BcS=mIo}6|H``a{- z(N$A~-Ui^;y0WMh4s)QPSH~}}mgElzph|1c8st~|EGfrtr{5`ezBn)9!bXRr|5`Rg z#~TCfazO-ZRO{Nmu;pdazXavi)r`Doh2F%XTwc_6MfOrqbN zwcLo!oe(@qPSSH|Q0Y~Sm<7=$r@KdIcbkiOu*nn62znt=_SC)Lrq80VO9Ee7jGZ1m zuIO-_#4$?{h*{2^5>VeZ7SA4_@2iFj6IvJrFVSCNf-&+lK=*0quwNR#SLmGk;{xc9Hyf zFZ=MWBi)ip7Kobg^}=t=QGmgf4EIdnI2s2-1BS|*kEh_S|1|O_;Sl5@cy$j{S9o(d z?thiERZsYLN->t_w{r!GGBOm?sn?qkpLg&on7voZ^pM>ZJSFVP(mkk~BU+5$1{?f_ z4nsed+=v@M0T=>`y`%y8C&2uUCcsh3mMp;CGl{{*{r99a)hms*Bw;nN07Yo(3 z!dQ7=n)Z7IcwVi8<!d3+dA z-NU-xndu1v2BMohx3w9jsIQh~h@P(Fq}#=Ut%!kFiZhr$2<2fTkH+Q1S8Z(9yI_HM z5nvuMs{x|i+GPFo&+PSYw>Yl@LB#dxqMRGCr^4lKyB>0+t*_$~-8aNkVoN&=b>&&$ zw4=;+9aHJL{?LSA;KnX=X$7~QGKYjRF)S3?W;+*{|?1Q3IF@tYt1DxKMAUYfK z_>lLvP_tUtm$98o^tuaqZKjGk=Mc9RIET4(IE6asT1_Ri(6Z^~sIf<}9XX$k6ksT; z`S-5~3JH50Gmgb0U!h4Vr}eO%@amftAo5W*S74P>mFJvtIVRNVmgv&d1zIHLEdGBt z(FR}W7i?r{cT#!V9OVMNr`;arYc_NXdWyL= zj}jQHiugZIc7N{ck%(1z?b(as)?Xi7D`lYTEl z<1!XHcMx^_%sC*<)}q$UTJ#0~ER#XAHTz+o&8Dk9Ov)xTl5aBg8-|g%;alqDE4Wi~ zS)(7uYWZ_8(7eFrd}|Kh;NaXXp)fCTuKg!?jg=GLd&mRGSI3;!*w$wx;`>9CModRp zzz@o25|(WmK7Zp~?dlTRtFTe;sbYIssHM+Td}XG<#nonDrQ!`OO#PQAhIxhK;TNZXWz0Y3yR5*0{#xvsblXEP2fKLWHnr#WCTC zHRKx?oFXi_{GI|~af!J$4&(&DaBe_)-jZjvAuBV$X~%okyR*G|cQNY{A!yX}5H(Rh zzv()pCs!MGl)8*?IqcpA_EbF=cf4NABH4#RlZ-z+mVPv6_8DRxDf*VhyT4K|X{3sl z(MQj4#+eTH*l%CSpyv0~<)PS&*_Pq3-qT8xdy7aB%-$JuPv=w~grprAaTx*T8aMZ~LVvcC zhM1V#yjn9cu3I%{AV(vgqUJ&?ax8=7w|jQu$C zB-8x-ituxfLwsKPZ9nO;(E{;_+`|7xzx%b09N_o;v&6{3a!<&VwM);_UH0S0E^c;q zc9v|eD#cmA65!r=d28?CDTT?YlC(C8Lu`|Yi76l1rB3BNp+Jsy#Ro~sYB9}Kw#%>! zo{x@<2*$jBQg@!ZLsrLj*Vy;y{bX1#=u( zPVSprH}Co{APwIi7;{JD(enf8yjjqKX6kKV31J)F5+to9J@2u>fNrm;c~4{%7UnuA zqvp~dr?ac#Y4oe`?eOg$8OegYr0ygyEUzg7g}7pYCrbjdEiVuJhS2J4ElY9gZD%W4 zj`mtvB-A&A>5qN3a3~0uw6;DD*f@N73NF1l?Ls;<91+--18<46BNajQ^C8&e${~e| ziBm92D`S$5v>7dRNQzHOIU@K3C7oHVZ#4hDtC7_$3u-~nW5!`fzO=n9F!D42xBv^E zOR5dA!a$v;9)L%N6<{;gx@aGOmGztKwwP;zuK~Xf!fUd?@6Vk9@%x zv59|CyPsY&sufYl0*9*UENCVeNGA6+uyesbBgJ=>)81%cKa#OP#~4}WC)JJLQnd>D zhc$V$a3UcAha4uqDN{^0Id15*5N1_MCb0~@(?_=)IWh8pi&fDfIf!<5_=?be!BcqL zsDIt{?;kA|tjw$QSAf4Ai?>)59bi(hX!tfNs9~>PnF_}A`oxDhR{;hVnKSL~$X4_> z-(kQAB?Qfw0y?DkuXg-r*D>y#i~KGRAFNWS(%{H(v{P(TGl|nym;)CPzXl&90dzE( z9DZrXoMc9QE*O3M5u&v;ztW(@f`7k&*NW~!_XJZmdCyUB37Lzmd0OH_yQ8lkn{azH z!-+*60~=Ujy0`FQ?r%TlP%c7LANCdut}HnFx+k_kqjVQd>4v8;;e&PwZFA+IasK_dkbKu=LUe)fQ?8K$1#dyX?XGh>G0Tc3; zM|*J^WRqWp<2b{gtVM4xFNfut<=x3?c7}&N{1CgE9^Aq0G0-~zodku3?9VSMwXe(6 zj%n5kK8G1h{gKLuoT1BVZXSQo9`_IWj=t$w-P!?js?`%a)UH{V?S9*x^lHuMsaMiF zcaae{-bkM<%AXJ)h4V?LYf+$pW0Qz5GjGglA@ZUaK$plJPQ-SFrV?Zztpj~*D_y_X zZk)wNnB1I`f|&Gc$?>G@cc>Q#mI}G~y)IyCK}fmJvO1}Ph~)vu&HPwcEZqNKV>Sdx z#M!bNGV~{o_YP4M;3=Sb^#@u`kc`;6gLDtA0}uf)qM2dA038$0Wp1%sgej;W=|bz_ zNZ*25CKpi&pp(^WciyRJpD0|L4Yk>PJl%)YK-Fel9~P3<5k21nN$0mPNea@o7Rz&W zK>P9th24+f4aYiTv5@iJWS26aY+=jQ*lz##p=5j!8|sLGxNRWyC>QnBm-6Ay_Jzb( z4r1*BeR3SUy(&~_(OH6C<*8;Dvuia_#Pe=+5pQ1$A#qULH{NnBu}G1P4wB6%s_!IAHMY~Q z9t6FvUcuPLg!VsA138E;p8rd8tQDci-oT6w-n!wAE}OkNmU_a#NCo`mzrUFEht}Fr zZj;>;m|<^!-lJtqPv2kuT#hxDa>}1o!R=>Qn}4QH+v;f9fxt=_!DX5@zic2J5=7h##XTogr6>9NM`+38Cw;<|f7D5?eLYRm>VzPHn;v9Y%7{}N_G5A@ruM^S+qt_VI< zaTZ^~&1-AQWgjclej7D&buw%FeHq9r0w9_Jh6@+HrUsF4WmEB+B0LSh4-8YF9WB@V zcN%9$AscG#9AT`M*^=2jD5gHS*nfQ{*Hr=DfMS?5UlQXaq1qWpWJA*~a{JExe&rw` zUw^*7LtbQ*e|`LG7dI^#^IR!R;U5z49K*P}hrD(!WTe!(qaDEv zAGsn(&&7h)ukXggUFL)iBOQH|XGo*Fv%Qj!gwgMsaxhXomCw+JCoSIZJ)Ved5R`#+ zyFFTdBiJjsolC1a%?l??7TmZYr9|PVdADORx`%F?eKG73{kJ~~?9)lNu$*KfnVnKe zGP5@ZDk^Ax1kC~r^jCqYN#`u}>axrN@7h<8SWFy46R0fWr}KczL~7M7LS zKyxG*D}=eSE9y0bLE+!R&!5RynA3k0kN`3it1u1rjR#4G-$S%`zz4Sm^d!MLomA?B zcyLWM5uf@0sZY8<^ET;B@E&=a_d1Nz%#g>2oDjxIdw-2P(Nyzc!$io z>h16G*6a5rTsZK$8k^N+0WznrJKdStG}U&AWT;GRjAhdAFpsUKDpm*}g;l63L~7pF zj$|MfFXnYdukTL346uR*JURYrUGj_JOW|^t>{$mV?4%|3DfYZ+BR(95B7%e z2Z|ArMEWZq3n8k2w`c|mQf7!EMgaB*j@i3xuM6EaXX=AA%Bxvr6w;|rIK4{Leam@BZ< z`6uK!SBM{^%=_NbZn<8C)g#A9WFhb5P=;uS#3L&^0_F)b5lO`gZ=qQUZze>f;v-nL za|-*nV53YOsouH(OsufiLz$*5yg#8?_tQG?f%6rC&)I*@W=?%r%;lT)L9MLA411Lb zk*pTN=}m=H0(bbQ!drrJ!X@WeLy@@Sx4V^rR$Yf{qXXHhewaKMfFH{BVBZumU++n9 zj{W&gmdCV6P}u)@#^W=h3M-1?rgPj?c$oEQF;uB{Ao#zXx&KK)U-JiGfQA0G>Y*hq zaVR@gmV1kA(Y`M_1~tM`&R&r(Z1*4i{p-0B#KU^Np)Lzx3DEjzxkUhqfHZYW%0_(L zyEbAvXJnSz|EPvCNzFX`oiNB9C8(2%OqPT1OO}+Tk8p^NU??U@xLNppF98!$j*-V> zT+f$PHpFCu67B$>v!qx&>fz^yn)B@3p?@(5dCD|y9UZyEY&SHUVw*O2FIq6*(>MEp zRQcI_FZ;9{YpdZb`#1x^gJ@36|78IjY;VW5Z`z@h&nHZ(5oCQL_6cfj@kA*Gzu)38 zbPyj!;YaZq83J?pihY5X?GSnHDT>AHAS!Wus5q5|7}sq)0h^a8(cby>g#g5~9R|b zL>#yUhb-0Hz3vWl-xaDk+iRV!$y;M)~h`CPC0L z7n|-W(=U5mLnD`FJc@$Iuab@J1fD>n={3`-vOPjU-tSw4*v#AEO7 zgcPa4-FdDy5C&7(z}tdGytxF^hsCQDYs6SEmw4`u|u$6^JfUa6INsGih2rpu-X|L#>UMx z`+U#vO{h?lw?o68mf7I+czcXud)qvE{jLJ=>fb<$u)GnQrTj@QV^);RHq5r2)AJfo zhrFC?pRY+WxszNk+H`LcdA+(=d;1TK8nXl1h7eAudztwX=9p+({(WUhalaJfpj+@% z1RlpYyvlb@f*t60#y&hXZY+4hZV<4BC5+o34+{p0!E=*v#*cbmUmp_R?Lm2i6ucNE zY9tCkf-($izsVWzX5RLY*UGj^Toe7it@e&Bzl$KEVkK{VaRIGy0rn3|?7oBe6Qexb zqJ85eZ$0|bM7`do@e9hPHx(?8(U+t)Cqn(B%Z*SZ@y#uloyD6CaiI-QBNK1Dj6z!^ z=1rhCuNvz0ENW8r1_R!ja~_4AclbX9J$O@Unj+zmGjnLt1UB}Vm)WbuAx54&318~O z7d24PWq}PFe-5FxPQ-KG1fJ_PFTZN>`4Z4W=)jG^M8`3rfZ?;Vsib%2k$V~O@fI#Q zJ3l^!Mk8TnB2yzc4}QR$C@TOi7L;*(jFN{51C@Y227_dIB#ShvNYv{lEr2udRV+ic ztg$G%4ZZUpR->O9v^wOAgKX=tqGZguLT^EEFkU`rGzhJKI?wC}v=9*$9rQvYrvQJe zj$bx{@)uLWGGiE&0sFi{C^2&$RWQJr$XvuLN{58;EZQ5dYCJ{;rN$xFKRILvVTQ(n z6wu6j*Vs8?d(4#vZMGoJcKw$8R7U0G`(PL8!q@9SVHjns$fYrR5Lw@IGejE*oU%{} zs?f|x(MAVk3sXw(63b(JtG_e7folRP#8gKdU=EBRpGo0;!sw(j0)(5vX(mbRLFfC*Z?tqzDIH88^x z?vTnLQIR>o^=KLFWsJO6j~p=cjt3W|s*JU10%sPJ!hcRXTec~-zh-SDI8SRVcuTd> zV^?;x9Ix{BvFU5YLOk>^6p&TTJHC2nhs&eb6rQhTR(H4}=%T8b&=)Hbqwug%8w_DR zWE(N(Q+|NYDIXPHa9b4{3t+>+qs9V6`50u!C{tk+j2FdHi{JoBRkdN;eO;?{oQMrp zvEUGd6FBGG(vlngvHIuG|C|6$J8iqwDYG{gP|LyM!c)G%Y#$Jie8P=;Vf~EsJnsLz zd6*E9fvB7e{@XR!c*0))JQ-Bg=n&cXThQR9%-uawKtc4wcty#tzko13`?#6x=ytsv zZBO}XyM7Pl`%()YRAmF4OEjOjc(}0LmKjU7Tx%n-bV?3u+MQpuV-%rEA~mZRY6|dd z!q4YX;(n~d+m1o(z2HaLep5YxGY-j;t zdpVr|S^!Pp24xo_fIaNi>D59~3!mvbM<5Rk_9y0gxi8P+31DLN584>OZg*=IukDB? zWv51g0$l2$t5kK6M?|Mjr{_3=?4zN*#K9bF>?Ecn*{p{^YXAy(ltY3K?xJ!=e#DeCTYO$)jH13ihO+il=VlkK5*&k zzGO&Imbj7a34Afq3s|+MTyQC^rpmp4yXQ%b4l$7f{5m|GoU(f5iWFL@w`LK5Gdy-E zE`1Gy&k-7pljz6RK+_s)4MA<+)Ko(alPHMV-A6K()A~J?2B8()4dZs_nAjlhi{nX0 zHc%KaeVENM1QaYP$AZ4I6ViC&=?If~moH=_MrhC!#3y`W#fph)da)XG>iXyN6bP_} zNkxOF0 z-I36P2cm|D@<|Lh#<#zI>%H-<3u1_mNAO^dR!TlM6p3}fJl;hRpu>%7 zOv9wpAnj1zbGAiF@fZ+F)B>ns4&apb{}9{26NRNQ&R(o4gq-FmbcbA{r#}^HZ0qnG zb)3!t4GBr2c+@=Ox#7b@T`uZh6ZxV)NES&NoN&G`jO%gHk z0mtq7K$c9Ej=Z#lF8Q~C^MgSfT+7Z>t;B=#VYb`#4>&;{+1F(eW#t_@P@?4#2L2>j z-CD441Q#&%k}tw#p2lcJVQlF|xVXK^`;B&ZE@`~T@8Rk9b8kE^@m&1=c+m_U?~Cqkw@jh-quuss z*e>}k_xTVu9YctfP)=FF;3+FSd;0WSJcCxsl+|JKFsXLs4;l;6`)c;VR*`;R(EWk}brQUHvSI2be|7D!9O|tpc{SA)O3kwum6r@1Tt3c zP~|9^GG6S#IjjPgCTAY7*nb_JQ6~{aMQz2b0Dxuyr##h2Nv*!~f^+Rmv2Hg;S@aDj zZD>!4c}F)*T#a=fQyAbh^fgcon3pnnbJ9A?9Uakb=l?Np*~aPmjP3SK{eQ_Vv-88X zkqB!Z8Nif|8jG3Oc+Ri1FFwU=0ivTJWA=?9O<@og+L>bCubRJF;0b*gZ?}(=`@18* ztn+a?rox$TO&^P&4^v7_Q#*`cw&^sJ9ggG(Q%1X1O2~_w*f5AHn+N-ri)T7Zx@$#1 zNVS+(_@4XvnEb$KVMRsv)X1L_l~4&HV{yUw^`9HlB9%{$!ohB(Wwplk+CtcB9o7fm z2k^l^V?S8X%PqFqd1}r}ggrQ`1G3C8T&7CylF@dY)h#U3bU_zy84G!cS1{9N-pcRP z4c-g7UK1aF;T8mNdcscS^ow%d8U5!%;;={#Aft8|;+)h36W14oHY9`qDe%b``21*X z1vO~TM&<&`tx&a9IhG|d_*SS`VSomi@q?8F@N74z{mx=pP=9{c+^5P;N=g_5U!S5S zj-{8-Cs6QU+^wyjtKwxr`~;iIR_kk0lt=a^SW(z_e-ChxZ(iYLLqZ7~{tF8y3pSVO z)d@TM5ru`(+QM(K2Wak{y6ApSUrN(;`Eu%o~a%xlU z7D_XOjqx1|r%Z_7&_<`PTg>t-oRdbY9y0**gSmT@dHu<4+wuO=S!QhqPAO= z{&HN!(Z8%mt&tWi?^njV6vVc$aJb2N)U^}OR$q^RmwB*-vdyUDRi^qzrCECSqG_##BmwQ8Yjf#Yc{%6>Q&9M_C(ceDbY73R4sYgw;| z$kIQi9=ez49>lxCJ;=4}iCB4{<*}0Vf67Z;A{J6+R+*If27k$Cp(X!A?IG}2g)=j% z_M<-yCTFblZ;3=2D%l_53be}|<>5~-vOrYDBFKD{mjPYGXzyk4_mO5l(QR0&?(HgY z6vT7ckd-e9Y6XrJ7kF>}A{nW!PDp4Zpf+Xqa-n(88EHy$pqyy^%IDH~KqDpqs zY_&AtMw6mDLx>bUT3Mc4U$9sMpc`}Ff6HSbrecTs6s&+?3wwPR5-bEn#V(-!39u?M z3afx(Zv(&$m)&5#PkUj$3SWumKnv#iW?CU0Qf}1m3m{~VAMa1qy;2Vt_^fFAOnPmJ?%UuH@+J^nCmP^GB56CjB(JOP z^jOd11Te$?3e5qfdZat^WZ)5L1wuo8u3G$ubyj>E+{k+xP$2xeZUQs^3YXtT}}B;kJ3bDy>EsrQ40U8UxhmyZ_3o#LG3e*k^#NI z2D|C8)$Zg(WpB}o6vlQBChPP&=+8o^nJz6iF0DSp<$soaMN%Dy6x5MeQH^dQE@t&f zo3d)4R(FgK`b-OXQ0+-q$%ZXmG1g{b2q_*d2#-oUp+z5uC&KOuW0~-K#Ejgm-kTyq zHOB>0J}%Pht9h8gek-fcPIZP5t|-K78%>B~e3OyN$1NDA_p>Si7q+XWhVl9UtKBK~rfm1_Rch zo5n^D9-etxx)I?7p;GUbtVdZOi5|BonPmGDM~MLTo$m_JQsh@)`Mbi70*P|%c~s}S z@x1sW!op3>7wm3Qli^_Bdnr(3wM6KA;y@RCUiR@7}w1(V)=kaB`+sz^c* zD;yQ~^#feGw%m)@UKq4uv#b4lYcO}r?LJ8!*Kle}-E>k4Wt?!zn3bC2&In7P-=Oe= z%rD@Sj3|*vN&S1E%IL>@r@n0 z+NuecjgrZ?5H#)Q#Zp)_+DR+*DK}|=8y20@yFlZY*@~}p+;ODqA%&!i0yD37LGnwR zYcl&9N7zSJw$ zxF15$g6Dq`<UX^NXbAX~4zmu`q}13MX`1wI+kazteMG_6R{p+69yb0YY3g4nR$LQU{`S+2qI1 zq;5^tj~wDCz{Z?}ln~L@-Fqd!Y7AYQa(-c(%Mx-lQU6k+e+cb$i&S=AZ-(R85*57^ zO_@yr?7hFnU)z6I0saNR0WA1G%tt-6K)RvG0xwwsAANOjX(Ae188&}#0Hx%pC0pf!+|A7mQPLW0MD$(#Whn-c9By6F0H z-z(dNZzJf}5U~!>2xvw`F4@8t@CJwm90L%$EoPIPSUHr4q>^PZEr1Wrji$lU{ayrX zdkuLH(iGLT0@VS$XcUc+_?X=o?JF@^OD&M4qWAUXlQ;w4DT$eR zk^MY26I(PyT^!h5`49Qsg)lNS*_*U`e}3%VV$V+H!po8^Ean_>&mAM`xo~GLtrjq6 zsr6CIZ+~R>OxR}zkQW%J6dVAxw44=q-Ao`V;AT z`N)hcRQ?n-af9}4pIm8DM{OwluGQtyiUn&$TAt06%Lhr4Yu~RvMj5jLGWM|DgOQ0= z`=>FTv}(iG$brbaysvVXL*c#4{4Lq+Lra14fs-8oTg(t(u0*d?GMeF->HhC$@6OKl zAM}PRn58nMwW|-cmJV!WQHoWUPM-LCL;`IuY@$;MBw;iS}T3>YK*3aGu*GA_I5p;Kc$OG;=hMIM%e0B z(@l|Vv3~a=$k}l>gm4D%^ZacPn~i_>$J)MVap#nJjP(j2WrJj7c&P03@J?+bDV(96 z$U3*Xqn=UxoD8rO7;^B%E>#eJ=(2^Dn*n%O1735U{I0dESs`C^Tp#0qxASsJlk>L3 zfT%D1KoUId#oOMoJ`2|E2N_7>)^upK&!h`zra786%g8I8=Ant~hF~NO^0EauHpXa~ z2N(EZwkQjN%ZS}_HD#uaLhx!SJUhzCu)d#E!}u9wJQ)D8XTI(x_ZOBTH%(wpA96jC zDzB9s7(`A9KcPF9r>c*cVR6gpoKQ@e_@s&qiq=w}?0CR)PG#1eA`m5l76}v!03^$- z1XW_rBZk;ux_~N1D{V_7@2wggx#uj|`U|g_*JGUl0LC+?Wa&i#a=xX-t5k%+wDGGOVzdvzPy*KHPjR_vsw0 z+IOd1BpzJG-I>aFU3tG_f19;g%ayIhKnV3LZQkzgj9hY^Qcs)r$IG5Dg$1hArI3E@ zjwmLn2R_@bSz;;kTCEEiDi?)>Y^GK#d(+uRhqa&7S}M(J+Y0MP|cIFH!YMSDK@U0IxiMZH050rfdx*o_?_Q;eT7u zzyHP3AU(`@$*j732p$FU{|2@iWKUp6AKQpLu@p~YTBe%&{%(XFW93q=d+HyKaflY$ zk6ufckai;XRf?aacz{O}7hUq~W01adp8iKACN*NNF)WwfE!|MV-H*s4BKh0SS!exL zn+RrWIB)iKdE>ThUzqrIT^Q@W+J{53UZ*LW!pSzew;@WDox;^R)IWvEIo_%xm1KIN zo0{y~bfZOd?19(1%WFRO#vc-WBBmv~M>}zIFJ`j!2JP6%d(Y6Nl;N?s%~qt5-r>L1 zph|cvJQZT|KFf4uCYSg6zt1;?-lL9$dZtpp;mqNvez*L}k&7JgFjPasq8kzZ8xdA( zY5!{c-95dH`#7i8gbCrUB;;b(OQ2sm>dcf z4S4dC=L7C(13~SrvEXd;L&%V^#do(3zL`9#G}G<;&iJpKRjt%`Sn98cwtpl;Ax-wn zInsqDeBGP3&J2xaj{5NRJ|R`GdN zw2ia*i5C3-qv@=|+F-(M9iWurZE+2SV#VDFg#yK`#ibO7;t<@51b26eySux)y99TK zpeO&{XWw&?hfL<1S+mx93sjJ&e|{Uu5)Y;qeVWJn!=p-$Jr%ci7~WE0s3N9b)hPU9 z*pK)lH5zj;3+wxUflP*;zt~M)-u|jTV&qIJ?hN^h)b%dw3dy&{d~R6WbTU= z=+gfavbqL1azs2JVA1_3Z5Z#L#-5uimcvWW6N&W;t-_%h+H)XpMNbDGU<__JpA@0)An_&{8LIe=*Wo)mSfY%~ zNXeqw@exbM8yi3>f~7iG6`eBM6N|_C78#8}M}sIlI)`LGXwA-B@a6`S<}Nzg2hj>5 zmH8Z+Ff@dA(Y)X-+Oaek6Hzt$JpkMJb?vUrEqEL;|h#Gc$O*A&Pm}hv1)j(1EFkdROV80 zq7nW^>9L{bv%AL1lRcU%LxN<*NN^vBYH)#y{X*Js|R0MT9ZBu)yTS(#? zu%A;Ie)%@xB$WX4vtVa#F7~kA{e5Ka3M7+-VwxkLqpZheI7&Sa8Klrvbzwv5U zMgplT@~b%&d-43j1R*(Wo@#UH^=??Pcy=Y#zx(hg-+1Il+oFCVSTyq~>0&$de0lvz zxJ0*>`G-{0_h*84&NKRNABOBA4s*vS5<^!4XA z3C$K(x@NU}_Y0T9|a#r3g)lN3z=&9O*|1n2l|8*vRav|VNjbjbx?&WN9l z`!NrqsDBBfG*KZHEzolQB-9N(f1jYs*ECY2Y zb9_zuxcczc3C6Y^e6|LM+3W6oJngJBpm00|_6iA#+`t@JwMB7HxQzU}{2o1C!9qtO% z=@3P@)YsjVu+SfuHL0S33$woAfO{9gtJD!5` z5Jv1V0M=DLtuv`Oq+13~>pI5%rkjEsOnlAdpK-J>HJi}S7MjD#my36%`S|_wIdP;& zvG)e0+(ZbP<3^>b+uV_XRseV^UQld9PW5Z0CqJEv03g}i@tvvfaj;2F1a{QPl9Ko8 z^@{eQOE|)@8OL`)r$~_}Bu7Zc^MtPspNj_3=98`E=HF}-NN2BR*s{;b*(r9Br@6i7 z8m9O{9Q#L;X5n~2s}R!~OM(X8i)%&j9CenBVNz8f)|tQYa{Nzyn95y1+_(_&5$?#Nu_g^7RR6ZGH!+pt+d*}*Tf|lGiica(-SsL zdw6((JXQ_+WS6F9vgl7P$OHHc}Q zifAX*rlTYOwPq$3fH}D6ZxTj}!PzbF5N{2uvz0Ebg1JX&Rq z@t?EeO{Cm>@J$AB1-2dl!YPHlNvu{?tLWcc1yx z=|FK31`Y~p2A^!_tSxYfYh{+_#rsrE(4f!K@YM%4nf}lkADQ^Ho@P09d9Y0-v;N2O zq===~WQpwtSrLPD%ikmIwPfFpK_SgpO=2S8bNkkgiiKc7KxCwnFop^PEwx zB6l!2bUvT6ysxz&D-mQV#{(BRFdG zhP!aYGJCK5mkpEi+4XJ~4}Z?KoMO>NK;f0qh@x@?SuSx3p!=qI&^eldcnyy!>LaM# zE0C%Xg{RldAlmRps~1z?(>XNBQ(E|Zd{#%06y!{4O@jUnJ$(?JAWZDT26^q>{)AJ9 z*<}}t{PIV~7cu70sGguJ30BW@$;TYo8l(>J9-i*~WWQPex#X)4`AcjXyE1rNiq~C) zAo(SD>02I zY}?4McMF7rNzTj$aFndwEobaFnaiatA3cF3DyW=bFYYNzoYziVbpS`#W+2QR+Tudo zMUQ@9b8#y|{8UIV70pxAvX=SPjhf}&iRc4_y9Zkr)_a8CG{bOlPOD%j-Wr9y^KXQi z_WrW+FYmUDX4$#?+5jr?1dWhqPuMUHzisllxN8E7{)7!II-R{YZQ7nM@~umEeL_Dx z(=>oaT%%!)GlO@M&WfA5b_<2sD7cmrm@3n-2%xbZrnIz@Zi~S#?wmeC+lLV~++3Y6 zxMh=~5Y(Qg;soOA@2iJ<$}cKr+%CO&E@iYSeg1c|zh*+{JH%(&x9k5`IxP?4c!Gs% z-H0dr|4~4i`SE)iXP$fm_QdZKwq+Cp7+c|70l~s<>5aa{6@^FUzAqKcr&ylmBW?K$ z3k!(%#_!S|5&_}u_zH9K_xU7GrqeK<*`s*>@PMMo^4a6A-(uh*M9E3EqPaXB(W$ow zAq_M?N_2>V`xWA%mFr%@ej?yLObn5#6F=Z#qBH%(L(Hv_k@HS#y9L+NtzIAp{v)-k z*P-|)j3j1hAi1E(aAj>7y(Ir_=hB84EhNdPBJ;Kl9cO9l0(@UTj@$2UL7i#oiD$mnY<{AV$dLT&Q%pFHw8(=>) z9$^x(w>i-ZL}|T^2bUHx&5tE9(Qu$ofDGf)gbL7qiC!S+_1xHr_M2^@yc?C)2A}s_ z?WUu8>geQf+Up83?Zy7!wv5uQGf$A#9e`u?81R)?JG^2<{&@amkJ@h1Lm427P$X20 zPu8SI;K#F%^<|BK@Ntpuj#PcCm%Gtop;l0-7CDYjjbzCD!k`BC>2uf^>9;RXVwxvJ z%^6vph?#&bXM)`vLTZP+n(qfj22e|tf7Doo0APRUnOjQEy^C?)hjit+%lPl3eiuLZ z)F#Wvtf8+D5czWyUsTc7s73y&b!%zS{IGTiEUpeI0^Tem5F5c;BM@OBdkEawQPXWRc=b+LGu(3E z&44)T3hz%j9jy0UID3k}0L~KIWaH#wvFt;YR-@l0)dhk`T{Z&upaH{0jeNvc01du9 zC{D(`Uy{dfY5{?}h37Yf2QI`}V_stQq8)OzWF_tp@2^*?1y^B52CGC z_(1o3&(7(mXH_APPrkgbew{p-0wAaK00!nUq`R_hZ#^g7a=|~7jD_U2ljnRmkGi8#MU z01r}W+drO$b0b;vjuWJBJqNPx`93z-3kP8{rS3sFzlVt7>yF=FP_dMIjb{|+SNc6j z3g_fUY`mi-KhSBrxL&!+eo7SBPB_ej(`y{1NlmvD(&cHnEH6{PQ$&gUx3fGZy!nVc z_VN>m%JZMBaqR!bUAdXyGuD1iEa>#f7pZ-w!db9AqTi|gdGpHx(~o`9gr9Mx`oCU7 z6=U(@rsH_p9*x!R&zR&x&I42b`eeOMuzh0C8^UiqLA-oG4Ly2aF{92TF5~;Bb68L_ zTtvj?2=_Tm<5M@QVjd#@8&00O8Auod!SLth_zAt@R)L!C{0vp6qZlSbTud}E8aYhI zxFbLBMT-%hitH&NThg z)W)}TkqH}u%@Nab$by0y&Z*AJ)Ty(Dr~TFI_B)GSr@#m#o%Af9D^BuxL4#Mp((-q= z4(a$DzY;ZFE`x}odo>3o9JtaW$DlT)B_;7m4N2@@Is3sDypdE^a`EtC*lV9kyOmu* z5k4sqlGW+snklSp`$?V25RABbY}4B*?FM;@6Yd_PKGJBM8ROS4J_3&+V>nuQCf2p^FVHMpPdzAkXW9i&SrZw5*80fAqPVvPc zzeq0>!HP+{L4CK#_<%G8GagaM?el$srNonX&j7@oD#@unjjo2|$5oxTSJ82li=ZHR z{~;AM=H}_UJ1|cE5ogfeGsS7Y5Xg{FjWB150*m?7nmp~brL-4z*I?W3oXp!k7NaKx zeaewJ^SoeygF2oETy6z7**G{_Lxs|+PVDaauyxX#Z26*{w*N7}s(zDd{H8hNP73+A zo_D!f(=;vV9;0UN5*Wh%)-_QUNs!vhlRV++Y0ZUdoY!MN=W^3*%SbkXhDvzNR=LkUDo*71D!5- zPa}Y1-7BER|88NC@E>Hy3zd&Nj(N%Vz_+(OeoHSZe5kZRZ?L|hex{kxZPdIPykSV_ zevwLw$oN3SwV88))ZN%0ih+Z6h|GH^7K}|t|83<&R`}xl{y}Mf-egF7#E)M8o`e}q zqnnmb%45*9U*u%2;-S#3E6?N%bD8AG@Dih%=z%a~r*yosEMky*Q3(f3L~MAOZ#Lj( zvn2o`4yKijA8a3RNAH2RMWdG%69go@*m?{swe*a%7JOTUeUx;$+hHA?KA{weGr{E@ zeRcpes}`*bNZzjUZ2KF_4$^s7keA_9aDnLav1slze>6>?-R7clS!378-Eh0*056c< z+bDKqKs`pL?HnmSd5*>=QOQbe0=P9DB3;Fx+(-uq8_=2{==ciMb(jGytZO<~>gMWR zzPkL}!8T}}fQ6Z4%2iwT$Ig%;uJOi#KF-v2YbeIZ9&YkwRxY(BAL%&A6I%x*XzOL= zP6ap~Ut(X2POIGFz@YHpxO*h%%9jZd9mAtpX`Z5q^Sow6=Hy8;z?UXYug+8#m;tS#JzrBam%eW{hE%q*ocl;sgQ+mL&og&IJ2P7 z0`k*m&xbWzFqlVbz~jl0Mbndz-sRR>+SRez-ClCIykJYYTRtRpl@tFW3V3;|^Ujty zo#u3Y*+b9P4PAyw!TRF%vw{Lneo}Hq|6+8V-z#P_)NtNm-IIPME4uCl#NwejKd(~MJTFIm}w+!)!d zg#Vo{WYoXx8Dasb+m`aQCegP7-=GEEiB%k3 zco8)cxy@rVHb?Q~v(Sfe_C^rka|I91ID9G#R5UQeY?FQL6})wbCa1b6T0zX2sWpN0 z;#qDkG{xI|PxlsfTq}`BMl)f|A-PaqmLx66rXUX|f0F_;hLyNG?icj`k;fHKfzA9` zBm9!kPRd_5JK&zYWj4!V#x?b2-Kq!fViMzFX zGG(F*eKlU1n$z-8DK_ku9;t4&G5 zBntV8&^%vvNN z>qGA2ko7^P2L};^k*o4D8DW}O+1Q|oXgfrF_?=+Y+lqGDvE1jud z7f9nGaKXSjDXAZN^Y1l@jjr^XQHcI3t+6T`6*?P_%h!MW!nL=So?>{LrvXj-<$?)W zJ<;g1Y}&6h2&$rD8PRtwS=(Mt8F7Q^>pkQT3!Lsb*4Ml6r}3VwnYym5b=~!}|L@{H zB2Bsdtdg6hgLs>tEV)ExS9s|SiWPxVk98aK`ea6ZZ6bgXM|Yk#yoCoY;nUv<(huvK zFQhVD2n_eY%33-2d#w@WYXsBqAG*xqII6s^Q%%eb-A;F@x|QWG-N+Yavt{b#uIM z<&1F!io;SiW8;-QOi-0NeOaN?SS3oC9*)Y23?dxIG@e zC_5#dq}n>O?K0KfR}|whw;7_F{K_;9zCR4dYqvkIA{hyTkjvf${WV^nH|FUft8I38 z4%LSKLb`hiv7gaea!y5ptqt!P?Hzg^42e7QSFq`BcgCESn&@Nib4l3#$$ z`mE0w>uCvy99^u?oe#Jry@v#bzvX@s|98bE)&3YrZ-Z6# zw^cLuVq8Yez2YW4$TddQwigfcMSmYyCYW7gLmiZ_z$7V{J{{O^);l7;$CE!z>8=)s zYn$xS*r-1c`87GxaKB;@jX_MXe8$Z=d@qT(O<-L2<%jFQK%8vPrZ5Ms7Q>QyDgEOE zzjo@+48K~lWul!yCFg)GM~8#Zxbtx$DXfZB(`cBZIvALIW+ITS#}6)V8a#TX60E!~ET(yXEU$b}jZ=fj zWuuAdw#laWjrnHEef@B={KL~Jw`G7v>se5XVa>kwvN>B0<-(k?SO0`oYp;LXgdrT4 zabKM^EkN`0EYUr!@L)`})%O&Vf3|dDG?7&~^x<8UJMv}e_V%2o79(R5SedPkiPFDw z`5`vei*w}omR9lXUlat7SnX8T?+(FlINZWq0Vu~~;i=yis~_=7Vbpom!|sZy)3(~;d%T9B`Pik?(~*D<+SIkJc*7WvFuh@qXyR=a-g+FjHSBzq1IZuh}v74bdLN4&EksabG#GEn=rj-md)iRAo3# zlZJ)mrRVOt@Z$E)gk|sa9LOTD6EeL(#{by-M;G-){mM3Cdwr_PTm{z`EI^a}9c_t(q;f zhb9PlF$W43BU`V`&fJ&Ml|OavnQF@H6u5YJi*@(OOZ*q{IBzkD4PjrpS>ZMR)f%mG z`f>cYL~GLDLO7Y&XO(p{@D2~_g63Nk*)zRNaRMuJ4ubK`~3YIj9h)GfyS3ABUjh3++;}vZv6ic9^p>^)Qo!&d#>H8DWRxl+Q%|bJd zb}bQWo2FQRQkb2KJJ;XVhb;TA5}j6t^B;CiVEFVYr8N0psT(4bKq_8i-SF5EBC;%z zyv+95e-2*lJ0b#wLec5FQGR zzQ2i^_92R=)6so)4M8HbwbE|%&A20J?}PT9xn<);;Ix}~;^rTCqd9E7TyVY)KK>9+ zr7e3>hJ_`7Jlkmn4J1l`4w;Sc7=y7mLQ`~1Ru)p35HoKL?=U|rxpwF0M$p@CI6Z=s zM5opFpg>PsNFgU?osMo{)gfBoDn)fXc(;LWj>~TOo+M*w{s?!qESe{d`iFQ!FTkRP=OUoJ7>qS+Jm73A5d4i+Y!1^O<%W+BA3HB3> z;OGClsQA$P;3ALtXaqio9esco9XaVbd`$#D9PlUd&o3Cz4yN+icQMtk=?_6dSQ_b4 zT@R0P|3tQ0%2g!_S}#-xKf%VG0!n}W-298q{7#bG){iVbDJ8)`s57 zwnuUdl3a|gtc8tVeN|Ere{AiSHCCg;*z>L{7C$Yk7nMW-YajY=>Mny=adQij-`%_9 z35Re--fo`hPZ&{l^)uRT%*F}#bh5M;u(rJ1&_W7_?h5mb187YIEnmo__hLX>AJ&~_ z8bB@m2b&-f=@=PimjwETm;3&duBF-|CNi{ArR@GUF_2(gs^vb7rOjA9_4k^7q4;=v z7721a(2h>AZGuu>77A_1-0lvZ-zPD9(dzBQTpd1AtHt;@s@xDPg?O{5)R9zHhkeDk zpA09pVkQ%rAIX>*IV6?GSff_IP-6*he>dyN>K6aPgOxkG(V456wyrRgZmeR6w>{kE zk-s%aN&N~}WqjU%_qvA%&(JeF%}%VFzoev4? z@`;OQf1OMqm?N}k8EwUpbshiwKDlO8Sw!%N19Ja z4+(yoQ~}HXQ1O3ZOd=+eUbGgvs}vM1Eg8t}OPTf4<{zmI^*o>QE1Vs;X8Rx-EmUmw zy~6k0T3(ZwFwkU6u}Pco+O@>+m2@k6`b|P;Unn`5X0m4OKn@?qJR;SuUJ7@-78w>Z z*~jFX??%=5ACy2(Eyrd1HbxQC5bRiPmS5k`g z)%8ReLx>=VC0|d-Q#(&36AS(Sx&T&8_ICY)pnaNrs!V!##Iww4lKC>^g$J6;T3l-; zTCmJk9f41LIQ_9a!Q*k9U(zH-O`mpM)Y5XPTRms86S{}@9F#Lw*RQ?|u%J;%hABQ^ zcmV$>dKFjGwN74LKOQcTcnM@Pnz_grLNy4)=J^J;=D5xyDy z3`|UzaO6N`(@Kkry&8xX%Y!rhZF_@Ef5e_lV*X8w;E0)X11JUvy(&=34s9>+m?a_W zB0Or`JtP5d4@BL{y&3=cARHDUXWN!qrzbR0ZtHcrISG^98HeWS3Z>`Yz(w?N+oo7w z|1cvXqubUx&u3Tq>TJI3ekvg|m%Ncl%Awy(i6u39T6=e&Yg(SjGdR<&QzLjS@6L`6 zIR$mB9kMoUx2{uJy6CzWDh*1>6Ik@DO!!=!1u^gL-O{Ed=pUDAE#y=oWZ=YB^mryM zW6o5`{HX8^E5!lTGI=JT( z%I};tdp~~_1c}MZ$@xs`x}R0|&SAFbXBR4~#*z+qg1w*){22cK_0XU~=SS>& zRV}TNSf7y(Hi0I3^5ylB+1PbmPof^IM*w4w*dx4IwP;`A5!?^17f9#rC#8G-SL0sx zrg4`Bx5otCRYo#mo?ktAw+5)hvSJaAL-`I1sKhiD7ZjPj^*jF}b0?)bFMLxWX4I?f z0{>;T-3E+qBJw7ukaVx`*>|rrUNOBS*B*^v_%n!H)?{xdX468Z=`JlX^&DaF-b4)hn;o@4dqEca%vW=$RKmi1i zvH3?^v@Pjd>R6gaQW{y{q4*kqKZq`OV2ZD+%M<1-NZZ{VxK5%e${CJPW@O=62Mf*4 zS)u>rn%!a;rm>YBTgaN8n8vSF)=0P=UyLwu<^*xv8W? z(1*F4iHy_os`l6vA7D31rjbR*>GuK2PONT8BYwmeCYhiYH9MArHyDG>D15J2VAE0C z2glLetQw8~iSEhJ;qA#f>D6iC|5W7B@HK}6a|qc}<9OSLe2C0HyQQ;Iv`xXpWbK+< zEThbjn48nk-;1U6-7vQWwsB+55HT67B zHzB7V5pEI6Bu^+W&st9~<0*HufsY0FaV=D-|CREGa*VyBO>_81F9itt^5x4nN<=Q_ zdi${Ie;9hcOvw@O&3Vk)hiN=R62-MPSN_Z zfG;dAh+0D9Z(3)28@Ao;OgcUe>tsm-ZBBIUNLO;2&k){3DW~w%)qFFl?VYwgyU<~d zSAP{;%aMxdB51$wJ@4abV`J2;S@8A(7pT;=I&Mn|JvcfY@I|CE>jpThKdnJ;!H#gk zuPvzTMJ5+|pz{3a3T`6LueW=jo?H%!=}UWbalh+Ny%kuy2tRLseQeKruijvzuLh)) z7t~Yeo`u;r6^>u<+7e&fr}rIP%C1n|$hpq`R5L?ZJL-m)U0z!@O}3S%(ikvEdn>qa z;cWibK-q?@MpzMHhe80v76K_8>8IC29;^F9K+ySwkbXEI`Mz+|Z&Okug8#7KJRA5- z7dofTWxXcok?qJJCPb$8@WSe`{y!B+Ku$U*F)^fip~G&$sr%jo+cQuEu-!FL4;3oR z3`$>Jx8jH1dkBU$#NNI40KLL%voQ8j?d22s?2Qw)n7G3BWQdpca}#ul+u%SREg_sc zI9lMHwR1N~mje?iGPaE_oKCbyL_EfGM?Md|2H!N012tC!N*%^e2^4T5u-8O%u*n4% z`do0qHFsy8cg?P6tz2-p2D;Ev^VNpK^P${FXjBdw|w20cYX0(%)9Ko{<0lEs_;6^XeBxN1Vh${<)r@oPC-XuLNnlL)m%UtqNW?ZsuE|eH z>ahkHOtTu@~{xtI3SXayeCne*c^ z=VFlR?>LLNS&zFl;9Qv&0dv#6=!x?nI?uXY@kkCHL?&0A=o9k$F!N&BSRvtOR4qrl z<5&aHgNaY@okL+hoN#L$KU`>c-v(atoJ5JzVLF``wpriaJQn*^uk|pbt~)O;Z*C-4 z=`9#f=wHNneJiw7(~);Y`14vhnK&EDw;Z^Q5zzmaVRk@DYuSqtU)klE+z8! zl`Z{1z(H)uB=-Oqua_cZkRv%f%xz&*OnOYwQ_;yDEBnP00oF9TOzHjT2A`ge7Adn~ zE}#E93?rf58!k%0B>h480nP1tD$wRvA3Gz6R53o$56(J&@gtJ1g{dx^*p7`SM*I)o z7)qULLwiEDkvWNOw1i`niV9E|Fbcoj2}<6%t4j!cMD1-Hfx^1-{T-hp_8pO|zbTfb zT>$v+=4wOARl`Dx8A!TiNRq{jiu-cpbz)SUbcM=!$4{MDbz;c)+|*KPut%bG-7k9U zl-+iQ@UnE!i4t+NDchNp*R-EOY7i81_l{Vs9+Z2KcyRhK=>Dr4r2T#?q|P)~1D#DV z!q~ic`Jx{P6n=$`LvZAIJH0va^(rnC9K6NbVWZXMENwrJHM;$Nd;1ju5p)*wa53KPftk} zg3Jd(BNje3&H*U-3WOaChqJ|E*|KXAL)&!7SCpgerz7!bUuOm}ZICGv*}Lt|_&B zjjzcg7<};^3(=jUfaRGj;xE=gp$sYPUP!;E)Ar0L5E7%xr~debgh$>|nyDD)2MyVQ zPWZNh`{lskIM!b3UEewPsFQW$PW<^mcZ9j*$04sv3$>&a(PG@lRD!we7sYgo(13t> zsR$ePxb6rYP#Chu+@RC zMryW+x+mCob$dR;*>hHU>=!kbws-KtjN}Dg>bZJKMR7KH%4Q7p?+Kf}bt@Zy7Z^83 zYfnOVwh!-mZrGcFExbU#t1H%1=vcQdksHBQ$aJRAzJAzss@Z@1{*YuvkgDdsS`=W&{ zX->}@1uZ(E*1$N$8+9zYbJc16xz4Cwj>Q4YXEfwayxaN~o7}Md_*k%YVp+Db%hqs2?D=(ig_S;s0*0|C;3#C_#5RNSi@OBb)eMov-hW ze;iZErAF>-JP8;5mye@d7W1YF6M_b4I5x{QLuQ>%$no4g*!g6B%>mSF-w&9?rbjqIm&e6L=I6p%kr+A z-BQ*Lj?2{^OamTFiXUeCESI}wjt;vbqyMpHCW@6KlOOG|?;nk%l<_`vOzkD%@jNqp zexRU6H2a5LsdF}+j(s3S!q?F;rWJK2<5JCFvi2?3uuUnrRL+q}|MW{*?OZBOO}O?M z&S3Y|;mGB$X5K)riZ}}|`Us@=M>UzyqH<3;bW!dF!Hu*t_k8e>?#H&<+TyM&&Cw>~ z(Jz%NEErRZw$>iYS|?=KigsnH0MOHUdrqc$;q3x>ACRBT{k|K>O+5yu8vtM6t;S~g zmsk3KcPY+1$D6xJ#`%Z4G%#QOb}i?=2^4rxdfh^h$XM;Jb;ahu_EuPXKE{7pJ@d3i zmsI!rOZk`V13aW+NiLEhs$V63g@w}122-VMLnuv@1T1Bxnoosm%9djtzR|A#@uw1* zoUSl%ywPifNRiWM(0YGDpM7s`eZh#pt`Wa966F_W-o8XQDPFK)UEtMyBFmpu&8$W- zkNd~<*AFl7b2$2whS4=WRfsG=ZgF|L}*x8D(9l zA5NS4(|&F6+7lXHFR#A};}YN!Z#Y~A(Jp^sL5Wp#zEtiB{rs=wmsjY}Fn;k=&D%G_si`2}F(Qv<(eub1-O$ zBovYOzZY2Gv05-3BJ4_}t@aHO=RK~mnqR@}x2pCm0*!o&2JMh>nAd=P@Ro&WZib9# z%6{r6QVG1kO$JrFUHzmSd?nhI?2LMKUAP{L{C9r_B9*c#Kr}APvTI!Cw0W#E0*Ep0 z1F4NbyL`-_MMBObmsJ&krd@s)b8Th`$DGTQMnqM=XoZZCAg1YuC*F;muuO;G`MC8* zHwd5G;sSfI@8KbFZ3a`GHx+qs86uOmXpqFqh$A0TH2B~o&^j2c*5#63^_6I3F)FzJ z=ZUm6Y8uia2!ouxXZIGKepDsB%qwLZ&&O2MoibR$oQ7~MHDaCR09k)!;#Xi+SihHL z*xlaN;A8u`^0@-nlX&|qm^Xny?J_GOoKU!n5s`Ji49{EM%i!)KdhNdN+FBvfkeMUJ zbYD-FSEW|u%W(K3;*H!A1NvqOi-j$I)z)K4L4mqijiL;vUG2U3a6D7Ip1yvREC@^0 zlkc`vVqGF$=ULPPaz-<@>W6QMF0#;R`BY$k=<_1Bp5=McENax#s6h>`1C(^54E-?e z-9zumEoY~xqzkhd3R~p3G}xnp;#MuJbxh{{O{6(t=No zRUD!q{nZz$j-t!9FZ3igNErhumr*F}6xf$`$kc)^jgfe;Xt)<^r`sh>%k5{Q^X}SG z$z}dA?;%m6Xb8KC#Qx(rWiG7WSw1DeNzJ^2>PB5xm%QyN?JQAn02}g0DZGQ>!jz## zoQ1%_G-L*uGt#F$B?uj~J&30v3VHZU4xjio6Z#kLY9cej%*+kWzw=M27(WoZY@)n; zCEp%ya9gqM*GLV*q19aO{WDHbT(D)aE-Qkiy*o zn~0rN+Y|QK^+8f@3Pmf5UW)uS%}`7HY6RmP&ju zkp1`vk1A${km_7v5%!($+wOScuOC*clsH0@a9$P&uKCUQ`C$9*Ln9+rYc1vie$wf1 zO8HV*LOKik0>Fbs)p|!wh9A!s{AGAZ8Z=YUl&RBSa6DXuM)s z3!e$f9iw##IjsZn%?OlIu-0cW2B-Miy)jZh_4E_p@Ms5Dee#tV4Sid+nVRxfls<#s z31cyblS=u4mEItFS)tiPVqYwFkU7R8ov-*W_NS2wBg1bD(rg(4C45>Y4P(5&=drH? z$5EJKtiYS<9zop3-2jZO8^=g!fiBaaBg^Lvpn;oo*W-SA-un9Vg%YH@M?+51DzQ3? z3xjEi_^s?dP#WDR*xJo-_b;!K7gbwdSfUIq)mh4%9&*6u`PI*r+Y(z@VQ%uP(B&xA zJ7;Olp=s;PsKD*bl zYNIZR|5xx+Vst z`*Y7Oc|1G+4@Ht8bx|nnAbI`u^lmfB8|qG{RKUPMXBXb#_|&m#~&FdlEr6{=x;ixufG7@Z5RHwBTVd%DKs zavlf#TBE1X3y!I-9Y%hb&IjSArwUJlza!o2IdA$a{|m+NYJ;*UkBwqACWC6FU>tvX zBF}Y`CQ11J1a7Yo4`K2BFb;`_kd(E{3#4ClX&D}#d}g}TpPZIqX?uU#`ucLdQeFL1 z7=QNL2~IBhCT%Jwm$uzOuksYBk-%hv>5KDY#^)H9tFGR&Hab~>BiT{t+W;p$uo-Vo z3FFf_3J7ulx4jZQ*{d|(y-hKF7QoTkI)4f-uC(HW&c91r`rb(y8 zuyV=xjiH+m%o(}EH40qK(T_s9D>w>A*)Vg2^`w$-Jf~KVqgpF2zLQ*h=s?0Yg*?Z+ zjr4qi0(lfK;K6ragxLHvuyn)zzmPvaALMve4WHo}&^qDRbju^W&mEH^!&RD#2%#j^ z>pwb*3VJbqfZogHt1PPh15y6q^`;w_T1H`-tXI{G+nS5@l(S9I*u_&dJ+cDdPVD(E zPy3>`9bgy*=*}znuy4R`V5X8Vg$~PC_jF^#3YWH<*X@H4P5>p0(%o-Xr*dWF@Dn+I>w29w znxqV}?!FG-dE=$S|HYK#V;CkaI>h9|`Ane-<`3h_#Wbfi zq806rB4;&b)3V`k$T&A^68IX9znwnxtGYb-O7hPOz<#xAJ1%smu7&t{Pr#S=e8>rP zH+>(%Ske6kH)Q|&RmH;^RfOR0b-RhK9-?sesPGDnYGV!Z#7WAu2&z!(^KgSd{?=2~ zB#>JUr_&Xi_J;+yLThP21joBabM|C=5@ip~Kq9eWN~(QShJmDj=|$UbI*QnEsV36r zW?P&ee~(S~69|`id(%M3fDU$v(V?(tR-Io6M0^m7s5`om2J*f>U0I^gq6OeFs3sx? zR8@t%apiqr7Epn!to4bP`~Ow)Gi(S7h!JHkVg@~Jrg?r#B5XFb&)L%^1i19w{)ck| zQw!UDoeRC$_9?83TZ;1ejjVFeqOy-38&jn;-XrjMTrC$Li?Gw_ki;PNGDBdOqhqJA zI#t#n+1V4p-7SFDNTIeQc;b79eFE@@2pA4VJi)ShC^4U7Jv*8SseR{>jGiVS!iLwL zEdC(7O!t9zx$n+aO)@;@3`I0aVJg_?zFXmy!A;^>;vfplgUzrr;|E08$Xs*C-6u6e zROql6VJh;irG6gx7rG8+w(z%wPHtmXn}5 zB(hjR_~*>ixj2O=^vU06maXSH3GIB9NTuyjmv6T7C)mmJ$dZMRpc~0m_iZX*<#lY( zwUPN%PW#QAR%tl}y7k_`$}-*c$N%qv{LdKT8q?uf-hnVNG*uS+$H!d!i+GT#1m?#I zy@H?mJIawY@b`}!SKG6ZUOc8k+d-sx0cU*wvttm>I~v|eKNW!A{mK{W-e~GnpO}2q zvq5g904(m4M8oajZ-_vn)GK!T-RaG*9+~#1=rvQNKV)`%umx3V5CIs(oQlRHZ-+^j z3AK9r41W#9LK$CaGg9?|pqT4Un{eS@@7z3ZuMmu;pb-i@)wCs5&D+r-oQqTaN7u9` z$K=l2{b(tY4Nl}`{W1KT2U_cyQejZZWYb#6v@aI5zfDqvzaWT9R|Q-Cq$=Kt6x)Jpgkf*?Rf1$#eC9k|Q8>*B#)g7f zbJX|L!st=Os`t-=S^OP83y?RhmJM)})f~t#UNH-$nYtem*`KX5{EL*X>bJL$kdMU6 ztS}U_boP|fDKL-wm>khbUilAl?Vcax?Cr|8;o@D@zFtX&f@>;}s?r~)g939!`52DM zyq3=^LhKFhAnM@npza{{hR@=)J@2rVM}*&idVrM8L?Vy1)qNk&OFw{2)wq7ZuP|v+ zIp5f45MFU^)OQnYbI{E4!8^v}>g_Hsm1Jm5+%=t{vq{GPW9ls9nsB4Py)inan;{4c z>24TZ(hAZbARyA+qoon1beBjY-QArM5(3iQqn`bq|L2MKd$;XA_kGUyT-U1{_nZot zNC>(bR`%VYH7*3DYU2;yt`2k6;ega#WZSdUnZ~s2zIB(($ zyuj{^GiD=K?gAX0u#O`+_HQcA0(B$);yr2UYH4`>ad)&y`irM{3q4{Ny{gsexnI4J z3_2o3e<6EOGs21GDEU058f*@)P5uSbGE*y2W95#!fukn#VQAj-;E|M`TWV2XO^Nr*oAig~m`&`Pg@|Zw8OtEKhx00k-RF$?dmc z+y)a6j1-o<0?MDp#!|?xZsC?s$$%fNBnP;TlE!rx36EvdG@abT+DjQ2eBBy9f-@9dx|UKqL}~ z-FyywdOj8TaVW~?qHN&rJPHVLju%q7Ky7wk-_SPpcg3j(Tpsv~tz7Ly>)*!ZB4d08 zO-08Odb)-w(ybA6n_rv1m;Kzh{C9G7AeP$BKlJI!{HP{>Y6Ik~4+6YITS13} z3z57yMaPW&8|)|m{ctY52Z)D%qosvl3QwS?{kQH~J^@X>Myaf|@3bfJo?X-kMCj-| zbm5%sS^yp(Qvd0B-?zs|K=i(7JVCxgh_3*HaWT$-XTZ6ihE~Mo*Ixy@xwQFCa=>-^ z`WxDc2gsUU`#C9SO>0Gyte*?!OA=XtQJ{zwhZ1_?)U8>|GjELikt;Qr*(KtuFNwj;{RFApoSF_<-i|q=&?1O$G0tyK z5$y>`_Z}NOh$qZtYGH3;OJi+|R>oIe@HBE|9aMpa$ z7@|;!pUhcfP(|QhV015{h5Y^Ep#^X=FCc*;`XOkX9j-?Lpy7i`_&A4 z{BNXkj5$MkkjzH@uOiA|lj1$2Ecvu5{!cDz8l_OQyw@E_#F!nCTP<_+BkrJdVnhsO zx%H7l;xyWTWjMhs{vvttYRVu$ltFPTDPQ?ya4Mf4iCeQm5tk7Zx5oS-|FS0(JL2#= zM>GHjF1)p2pZh_zsjrK`6^jXkNYA`DI?70zA<-Qy1KF-r`$o0umfLU>e}a6_v&81?Yk zybpT}Y@aq#-(BSfng>AW7>JpvB5G<4`CR^dipi?keUq&qeCW|zsJG=7Pb`t7VEcFT z%hWE-flvR@BWpVwf7IMibj@6;6Gnudg;Y6qnFBT#I~RdrnxzS+?2hN6(vmNwC%s#O z*J=AAZ8F3U@m&}7TJGc{oDyc3f2ofC17Ku+-1W(Sb!3nz5Go6M0VUI2MfnMc0`LUB!Cipr*cRG`-PK-?TGCAT8Lr%^}az#cr&ty=}dAHl)l zXPMq;Qs9FPtT3V+a1Il6^0#b%c=p333%XYxMKp=lonZC@^3lXL`Oxmv2rWeB88Fbz z@F;nO%k>1Hd}-M$O7B^Fc4_dKK|Lz)E)F^`JA9twdYS+rC4O77+WV~|@OOdtBWvYZ ztQdPGCwOVuV<~5HjZe)70)ZowxpQmPa}$6hp=d#s!iJ7Vj(IxAwr!8GZ#cC*`yh0) zHDrzYtcZsFtF*(rF324MwOL>+cx5SYhm`T+ESrzVReVVO+npN<-RRA5-^fGTKt4M2 zgTBLdXZC;mW;O9?!~vc!!Lm zBvEckySgULP0)HiEWSC+eUNbmcB)BrO~oye!h%11W5>&R|A9$-^94Oe+&M2@P7b{( zbpEDwr{hozdG|v&r|{h{+3^j&Fr!?jd_k>WlSU_xW3jo=el4InGEM_Egn2Cq(+ja( zQW6XE`)80u1O5pwv9`$WZbGQJWtIJ40Z^+>8&5&>pG1unMorT;)gu5an)BSlOT2y- zIQnTsB*deKyCRqWZ#rBM=SS>^uxg?JTY_53TXPzPMgNd~mj1(MMCEf$eb4*2X(}pV zOB`q%J1dI?t(e&lQepttt4+q>XhQUgd5UBh-6WbOnCm;l+6;qoS zT%wk6cvOfl3Y+BZEY7yIUomaoWl^S%BwW1JbuhhsEJa!5PRlW6KhHG(t<0XHA=F%k zZZP-{8|+vZ@$#XQ{3zn=yRpdN`Ongdnt+h=Xz+>L-^9v=u5WrKw&z71r?TOz4Y^nv z>>r^|wR{N9qo4#&(O{#i#gLw zHzu83<05}u8?Qq(8TGrunC!=b*5aXHo%tE2*Wdhl(-nom$j9k6X?= z6QN=l4!c*+Vb@U!8^xb`14=6_+Mz^jnU)XD${GY+()qU{ub0aL(kY+on+IZO%ds>a zQYw{S*B5A6o=*Mpz94Js)wBEiVzEWwR2uxNrRF}|uew3f1nlgmG@dEOwc@i}j({1_ z#3j`1A}3{)i*U(}+me^hwSH=Haol1nhgBtxKN{X~ly&+oh;iX22?QBb#AAPxBYr=m zyKOT+Y{2~TK}9vfhKW4skBuThk+!f`3N3$GoV0YW+{vttDR{qL;P(K!^(`)qFg=aH z-5|G0(g;vH1MxbNRI2eo1lPug_~L3s^lL3mYDIJVG1|T z1eD```|y@g*Jh?k$gb3|hc8+%;@vlnT;~>i`s6nZ?K-M6nG->N$cx{TYn|eA{@A$# zhTHAp^L;AtZR^M)kk1r5n%eTaZRvP!C$POr<-6xgdO|igpdc_AV67<*paHD{zo3`^ z#(^~`h`d2olH0d0x&QT3JCfM=r$gampN>ny=KL%nQq3_mUQ^%rk zsS7096;Po&RtLbI5Iw-#Kr;M(dxrv)Aff=x)E?wzJ#Z>&sd&zxw{EGie>aKlsj)wk z4Vy=AM4z3*;PXtL3yNhmis$!pXbJLSiCCWx$HhNN^snTME>aOo``pGyd+ z7ATsH?C?&li@$i&4xj+>*2q#cmkpvrjhhmi47ts4Ty=UP@RH9NSZeJYNIWI8a>X}R z1ODPfv;wY7o)J1|tsI0eAbec$61k!@KSU*l$6py$*J!suRAlt^Qwul1?&_J-3bz{o zB|Uayx;Rn9Ah$yFm;Fx%JqPOItKExuaf$S7d<%cC56Jz)Cz;v(5NvssC6Ify|#(UH))E|8$WB^tu3%zru zB`km9rO^1V4fX_!_{1H! z&vHP1pIIAVuIj6FpH1SzKgfB5mxHHI@ZrL;7-0YzQs}@ zPEd6%E8kdC7|wXe|G{1S90L_&7u~5a^Y3o*B{j@vHxbM$M;Ux>ZTBt=_y8x|#h1(~Abg_MZb<|ixft)~x2!b*Q8>-VoBGGI;IU|xtiPQ5AiO_2 zruUUag?b5JjD@1d{{hr%ol*G2DyBEAMl&pLXpu~Cg^!%jg|K7|fke85038iN=TOO* zM@Uwdc3JbIb>Q?zGzYBM7pHrmpQtF0)WVTF_t!XD+46`hkoaylEuTKVCB_T<~d7U)k9jRYYJtSCvEVZvc`?+w}=aZPm+ zuUiZJ7-P}d9k-(wd9ggqFVM4vE8u9vPOHxYdlI0^UPgj{7_I3)_(+Umm}_2Jpqs1-GBRapLME17n32{(fu9;mc*3V`s z|D03qP37pgx62&xKk(N701BN;NbNA zec3QL4&I|Bi!dLH<<2M4XvyPLP4{-O7LT`pFK5&Ltd?GGMMpYp6=S6`D;%M)ED2bT zvkzlEV%WK4mrjsndjD>HSFe0vW!l2J6dRm3e1Py5=NASe7-E~t!8S~u8cdnUG5B2vA zA7y`3+SMNXni$0&Pzst|c@;Le?_PtE#b`KfC0K1*=c4AN%a&l`W1Hn)>q19h-E~SR z7T6`@KPa9{D@5J%^Ihp@q9)rJGBuTKzD|qAHxWPuCzEkm0tq7B3IjH(Sh8__p-F>| z01K~A{W?Xb=G~_H`W#RHC}A_N0?0Uxru9D#8Dg?93mO#0l$Msv3YOw8`~a2@}c;0#l-hOyeXojeUv6(-#i$NFx8J?YjSA4H7l=ve;e zop{Pq)o^Tu(NsUt9{p_HR7qbwUnUOJS#@LnJU^a(r)qNMSn@zz0SNGcP;F z@RM`y_DvNb+!-bPBnkTv%mb{7`ZEl1r{d=VWQ0n2R=nsMJvdyPh`^|Ard$OK>)YcF zqB+Tnn%Wy#MBBLii-#e1IywGY|N1Jn5lU>2j|w?)6+lUG{NP}p4md_jTmFiXL&a>x z9j`!lDB6r1q!zwt?ioghJs}I@;_x;M84-W{yhA}+9)nIH>i}t4;%Bkc!`QZ-<9RB3 zJwBH~j`5xh11;5>L2oNlw742I^Z7k}@9+NjCK`U>9>>81?U8(Ct3vfXyNv4h2BNdj z`NYI0lo%F$zg>_LaCVB>=@esZY{~qh4A#=ati}&OikjAGq62=n{VFecxwS)Lb4(gL zM775uVV|pig^jnR+MY7?_aV8#Zd<^5MYEw76w^ON*UEla`$4b2*0$KtxH=upO2)*b zy^ho?TrmK$pE4mGFLL?Pg5g3Np6)~f-Y1GsET@lj9`#3*6UC@4Awxs$Ma4#M- zqB!LD``f%Ogv~zeN%y^+F<@MA?IYlhC4;+AH4@FSR8{kh`})H;dF-z3;Re9hJX^&B?&iW zSxI3y_*D5(%cJ5H^h3j^AJq~XnAcjsXbR_m=&px60DGN7&v0pXA_c?p@xL-2p{1I0 z;-^h2FawTiy?47Ay?xtGai43oY=|SQy;tt*wMgwzUKhe)D8L&EQv;Q`{3I z);H5b-rMQ+rPMTWM1Yd$dGAEvWT9ggQ=#N`UK???SImawsw{EfQfkKEOQ3)I zgCStsJMVVRz%BHSP@eJ4cyMbT4U zeMS<@UUKb>ctf4|aq7KW z2y=%$@H)>G#E-Gt&vA{<*BgaxUi#D~TgFenhOk8w)PBBjSa_8dNdT6j@%bs_H%OO8 zt?-5uC!Yn&h9ZG_$Ssk zvZY)O&&ZW3s3f$Uv}=@})76V}AM`Z|hV|VU^! z&LzSaPESh(I&{8M7NIg6-tCxHd7XBtQ~#CrRoiTKI+_TyXJ%VkPRS5J4x9DD^TeKu z5JUB?Nl#mG}U!7XTLe#7a;sY&RNm8 zNPbB~6^VNN4Rx0~@_-d6>E-cnsc>#EfvC7OSD>}3S#k?CD2o`wcA;q09=#JfG-o;D z`$5sCL?wOp0r8U@XSw+5d)9!kM*GFb5T`P0GQCg{yPrMt^+ZPuM^8#Ow^bj@v2*w{ z@dV?&0H(xDV{C@rmjs9nxs#{ z3MN595q54po>JPx*n&HlbPGdHFaU!9sgsA1O!V{o6%@EEVHjolx!QL9dvxO08FQ}Z ztSsqRh8}2u_r?Kt+i7<4u6mtxzjn9~fU2#5?kuCDRZcc)>j&V6u8E46*plGi`{5D_>f}!w>U*e&aQd_9y|(j-~TyxFqXS0ehK3 z&_e|bLQ!q7@B+N=GVI-gbay*sOMA&b6<#o+FzQiq)2 z4bX%xRd@{HN&!y&&QwHrc2p&1z60)rcd#%5Piy%Um*rFW0`9$zT)|F7?EU=63?;yDpCdr4)%*2RQpwt+^Qk9gjI)xQyb6reA% zVw+JHXE1IAaTGBe1ds4L>+!y$uz(OeRH;UUxt^l=do0l-?>vpj>G~E-`BkSCvdGR9 zQ5qvK_%(mz^mcwFaOpKO5phze4;)V+9HA zodQ*NPEdDimTimh5|>|I#%2Au1N9QE#Tx&W`m)M@|wW*qdL$TCCJXFql znxt+*<-O%^%7|{focagE#NP=hCb@XAjK%5j{9r;NX}Vql!THxk{C+DmKgOk6GoNRz z9~wq#tvUk4;!tlJtp0_a_kTZq_*6c8luWEH0?!oAh-7q4;T@oCIFKBLEKLaK zbZ#~A85YdT&s8S;LMj4lk??peyH)UoaBTIGBbL(JTsC&Jh+{GDS0I(Fee`(ikW0Xa z(J$}&JtSX~&Z{np@`>kg4aH^XRUldkrmvTmYrPasZjsmU4P@%Eo(}`?1{p%6S+?cX zZE@6}8yQbTYKfB2Z$XKG54pEM@sEZ40M2#nj|RegfKD>Nw_kkf!W&*X*MQC{o%{g9 z0@UF6k3suoCTM=$G_%eFw01BYYaI1-K{e~3Ul*AFhXr7TyD0qv*3Xi4D+(F}OaiWw zIrXU|FEs^>phtv`@B7c=n9y26D(PFrSmc`3i{r z{-whpNOmxqcRV}W-i#~?YXuoiENHSog`H@w|GE4UZ#ybrJ?b^Ao1?=8cy};gu4lYv zr_zx0&UDcLvrY@j<|0k$9=u=w7RKEv>@MejGsD>#KsEB3t+d;Sqg&*#N*Sf2IPBY! zmBdAfzV3~FDq&8>FsG{og6|@rQ_ABeMkn380e9Uj)>2B>Y`wRK#im^!xx8rN=$+`; z?y;By=tVYuBsS>HM}&&-VuY3OdSrt<@JTy`-F{Cd+fe|dsfb4IAyr?zDgA^ zd8J=bCn64DQ6V5>>jGhukQr;uM@6Yj9j!8b`xeoHd)-PIyUV!6NC80=tCksPAj*_AS%GBrH(HYuLW{t%KJE z=cY_4glwoUNsn0xyc4ocUPA9(CnOg7!B7)R$K>aeq+EyE~tiltOY2D}ZiVxUfNbdM#eQPHqv6 zos4_m=e4G_z4nVKTOvM*m9!@R6Hmu5onrO5@_Q+F^{J=#n>@Nzro$DeUR(ayPe9Ec zPpA)x<0SfTwH6eF4tR$xdR4Q`DV_%>K*pjRfgc5FXQ3o05wl&FQgKJ{@XD{TXsl%O z2qqC=w3;1;FU)3(^36|iUXnX1A_!_VUQN=WTE=){?BzrXy3kEp|Go(K=(M6Zu1zo% zOu^VyOzm7{f>>yxoa3?)!uMt)uhCLG0}_So`%qA}z@@KIR7kc$n?;SU&EQhKj9j;| zGMMe1j_d+nH91aDc=3OQJ`EPJ?Nf9J+o<;QpXaJy^6eJlB3@Pe$w_Jt7w1(tO+N#M;T~yZ z7nq!8x+uwJO{%ucfOpv%-^l|N+aU{sIBW{|S(zM#qz-fISW%^s^$T+Q*}clb2~PAI z(C(m6(5CY`Omn?)TdkUz@>`xwyRM6F@<^+}tmEg;Sa!&L2al${DQe-Z;d5p&4e*ye zEUcujN+LN}D*TF+)#H-h!`kK|Z`hBd!2aIm^TFOPJ)`FBt#P(MyVJiiRQ&nD2E+!> z?L7Q@vZc`NzHcuW$@0?6$OM?8C1tjmVAR^;1>q#zS)7XCDuZ9SK7*h2h3t_zwLgWZ zXN?g=1A4B`@vo0By$i9hOQCnCVePjCNke*X3T0iaa%jR~-R6DR6|4%)j^Np}oDvE) zS-xgS_T`$e#@}t{HI_g*CeoXXaq+sBz&>Jghyz0C=6tfgP_~t(qk+YG*Xw0?+t>g( z1A%A5xFq_K10qC%7Hqf~fw|)AAl~#ElZtD$vcY5cXy9)5dm@BKZV>90FpWRUDnKGS1E|Mb;3n9q0`RREUEg1%Cw5CHRPxD0Ej=0X83~^9nZwi z@^XQ&vBbXUv0y4E^yrVeRO!67V^qs5r!(2@y(H}K)o8r82=jcSo57{uttl`=*=UST z0dQJYSfo#RfJdGFAHa8Mp>;;KS~mF`f0W7l>MFt)sI;RYn%q?wefkEevDD2-^XJOS z7vzqBR^CpQQ*!5U4ew&fNu9_W)Es;pX`O6#=o2S^Ry9Mzf1mH~&_NwF0^qpFd0LUkB711&_g1Tb3Q4qk##hS>7D;a-%^9bzXZ39zoo@*m9y^?h&YlScLnLS0p{8lev=gtEhq=Ag8{$ye=K|5LZ(!aQaizLCfs7vZh7$fV=8*;p^WP z_PFbGL5R(~=z8&YHHaovsbVie0<90+S-FGjR94HW)>*dLTwV(I3^=D)biX?K7Ok^s z+t0sMQgp`hV$oBXQA2(8LN2iAI^!n-u7Az9$LQ5^eYb@@PkuaS5%n8IpDiA*y(@mT zV8;wu<{l;!ft@`Ggl{k!w7s*YR<1}K8Lcu`89oF{h_YJ>!c_I&& ztOYv{MO@O%0@0|CVA_edt)6!L0ZoZt0z&V3E%EJWhvhfADHkcZH0k{3Nd+hSQxw3( zCo`Ovik3v)7dN6;^qn9C$YszsJw()eW1taGnE`%3I%Qg&XE7@MuY}P>_VKI#Z74&G zxaP4mh6RoVnLmyd0?;2GlMeNfs6JJE9}g7QT|!i`Tq%Yq+tILi<)4 zu{k%*j4=(cvSMv#u=8PA5VVy?BmJKGqLjdDpIG~RFC(!~`MacLWKV#2)6$H!<_)^# zQDQ#tucHvM?Fe0dRv{e^)`}-2cK4g)gO-w6Y^angPV>iU)V8TyJW5-pDQ-WmsNprO zlj50QG~!v~l@YF|E_uJUQ`M>CM+AVcMU2qJ@jD{$vx*5aJy^X&UIpu&4lF77ReQuF zU!XJ>9Ve=99&qxwkuxZ6%I1>9->%GKv@xGfAQh0|fZ#=Mh*e$uw;%h-8n-~*lPQ~g zbltt-Zz>MC<=3CR<; z^Px&U&L|iIeHtU}=-9DKsdY9gz8UuP7}h1WYE&>;#>%G7F7Exg%aC?V8y|98YLd*K z<7<|Bg`ZRs?3=19hr!+6(jsfEPoOI3fq$yvQa$r%v-;wMxM0Jx`kx7e4RBm#wztn< zx-vZ*apyvSIstTz|5`T~N9(>J6?iHODop9vvT>Lxy))O-i|?H8aXX%W@@T*k_EB0l z%m?)C)mM%gZR=FTjtiBonbH47CbCq6xC}iQ(s??N%;UzZZlVGeC1T=l_>w_u{tM&%%a{6!&1sB&}^CyDq6Y`?$oI5f|Qt%g=kO$*qR#3 zlSA{~4GKh$`V^!TNs6EIJ{ejxSM%b-l~@kAq6_;oL8>h}jShManeY0FM>+`&wcyfE z8{H3^+F0xGvBS!Tc(z!RYX{bM?J$`}R^M~1qtvgQ1ULk+ZVa?E6C}13rC9gNJP{}j zu<`71v-W1MM+OY@g)0(>pXLDdYm*u*thPzYr?c#!OgU^hTseH})*b)yT#pugfVl)= z)>#4bo$Q_BD-C}FpZzzq%4@mE5~6+UZ2y9^`y_>=7M>&x1?_p5boGj_rL`89>m70Y zU$+=t+$FbOG6|wv)VZ&%(Q$XK!AXc{#@P)%Y~E8%waWr1eTC+QFb}^geK@O==UjL_ z%r;u{A^f^`4^H$CxpIRg^ze6~`50SKm8VM0{<&CcxLGBt$abc9shxYy^(PwDr+DtE zFYGy%tvgS?qp$rDG01=}WU8^`?9$OQqC@KP3qm!1TAj~|vSLFM|4HGVwW?w2z%hTe8r?$NyNSe`$(u-jW4CiP6d6_(Cx3v6=bu1oOapCghpXJRzsH})_N}kNm+msrVhiN&`aWGodsbRd?_hE=9OVgJXfxeq3WtHdn5|5XB>=L@4{7%+&E3|aw z8&+IOS2+IU@O(%Ic5Q)9vW)8#YT^yKn|5@4XCmIWO}s}Hj=nFjt7z&kdqZKZi82{s z8wjvn%5npY*Af8g^*^%W-z9*Z|2NZ!dP-^tl!~+^5%iP74P(e5jDSZhz;SQi&tT_h zzXXn91xX4|&Aj{vneUpGGnLg}fT$5B{c=n3{4vS}imN|}YZIlS==*{Fo=cI9M)`72 z$W)hI4UQLnW9(madGcBr@OC1XnUqz2CqUf#a}dE~xBn7lfK&fch_AS!bFT!PD`u#| zFRJ5LqvEqPA(Rf%_vsTda*G6^td`a1Bn##k?M86^&HoKkgjoMziy|B@65j_sXHGz} zH1Q_~)tfM_x5!K~s55XW)+3ju0kJ`~>Xf6D6RUX$CBDlOF65fQuYF0TRYOTN8S z1$W1~>|7PB6xmPz+<(aX@T=8)QUkB4o3ex71oHF&HQUuHXl!!&*JT>fjg6XH1^n6-jAAG9Q&WP zKUpc(cB^wYXANl>Qou(Vf&PR4b~~?n0q!J|U(UlxBO%^Srs3y`P7Tg!59_%-t^nR~ zjos51Z3d}T)hGjjcQYY3hvJ>VkuQ=PLK^0YD=8mNs~XB(5VKP%0=AqSth2Y8U{TcO z+yq+IoP;qB&KWJDtykP`4fA&5dzekmD11bJIdP=6(a=b>cWd@e2EDCciLD2y>o(tz zGCpqlYn)pj&S8GiCn=~Ma&>r3BkImggY-#~fwd_=lI@|T%z?djMEhUf}yC`O<;x@?^28r^y84 z+|LnvXW9zI{?@OVFSt4zUd4<93xe_b($f}|gi$Cw;yBP6|BlNP!oi&l&Eb0_gR+`?g+RC~}OeB8* zR8ewc;*hax2s*43Jn9Y;SXC=aMPhoY^1ED3C6VEK)KOHv6xC4)!A9 zKqe+D1wJTcZT*4GoQdqDY1OAzCJNL*weLylCo|Xs*3%S6g zs=1Qn;D|CJYZzJT)-}U%V&f|G7eK$VA&|M&V`nD>zs7|sYK4Bov)2GT(Y3#dN0#{9Z>M7bxN3>Q0$1mlvoerYI|%G)KKXE!8Xh@ z9QLoM=;NlMoo{I&D21sOJHd*dE1AvGhLtOx#2G@93hpUBUR7uNRmQ*Mm(^^p7CuTs zVxyI2X&F@}j|rc7o&4!gHDo1Mxa7wV{&gZv0#7>$2^6zF)k=&S<(&8&OZpD&D_UqX z`Vfk}b{Z$ONRDv{my0MoVmO$9W;R<;_PaC77kR3O!624T*-Gf!m#cHg%5M)nEj0E^g3ZAwo)o61X{9t(u zdx|wmjDu!LO5VN?F8fu?{2h84b8TyH|6R2*Ijl0^syi=R)q%p(mIi$8kkfpwAzli^%56#U3+N{Zpl;9c?{}flrgVmmAa53_9!F6_b*e z7&btqxTV_JERY*$YX;+sqRA7@mt9GlD4er4_KGpP^7$E!clQIUkXYN6Pyq!i)W*qknj@UMf<`cwUqhr zm3oVGscFD*A5$1#qF{smMYdm)hG`Jl@Qx(EQ#@b{aNoQ6WCILHAVVY&dZC>nKjeB> zfV&l2qcsU7u#Sy=ewfk+W&h~!YBTZ&Nd^!hAHj>KkbK@_3jU3x8i^rt~g?q z8%~6tLl-SpCZ_4|pOU?ZK4;YHZmUOnS(e%wWnogu|3T6{NU|7X)tSI7qq&E1ni1T) zNqIT7in@Enx6rFtF+{M9cE!Xs{i0C=DmX+SY70UU4+pR8P$fH)8#x6P$~%Xkg!+OX zcNNQHJ07gsKn1;L2pyJP7w=%Yt!P1d?s{2jd+AIY*QIp+t&PjcV6eJ}%L$x~wgy zT}}@F8luR_T;HkQ2L#$^Al?xX;lHB!ud0}R#y>SNBP@tu7&Fxf=ws{Q3J9Q;w7%B( zvZ?DrM_6PFm69vHDzYuSq-s)szgR&khnO6nQnYWET&>|hJy99l2%}InqZThdu`D)i z2GD}qN~*5*u9j{TlCJe3@t0Wh`D$36wV_w>mH3aDZ6CBNSRFs->$k-W;G$$*oXgqO zGut43cY_;4yx#xb!lY5cGeZl~Mw@YN!g%o^xsUH#k1Acm3o_iUq_DVi8aVHlcp4I| zRxWQVq7hP^3L}&o4?x1)pX*QWB)MK~;Vqyh3&E|=5~!AE8R^`ojdgTZYAn$u zuQS2d>=Hm?>;y`IyEXz5?yp!U@B6F+#A8T3dBrznt>a~>Xc)4)4j(3`g1;HnvARsK(sQ^90(p7lNOCp(N%#< z4`ROTbg((@boW#Fr^Dd|6Db7btzM>AYW_DtkrNi*Rq?AL?VUcWe1>dzBz@ zI^p39m;my*IZd;|CjY8cCW&WXwZ*B{vo5UvU%yx4OOZ1239LJng~~SO1E$g|yydsy zmY(z|i!@(8u7_%98On1u{NTC~6$3IFGJ%#kI&4<)JE`kf%ov>$fPYo@*|TnN0&>`2 zX-eHj=f!w1Oroz0s8M0}au^CO`XAq!3w;Ru;hVI7bR;JZ7p8&8Lel*<-oYL7Z)vQc zMvkgGOy{9AF4-a1(Z}-VZ%i1`j&-b0dIoXt?teq6jzu^gj(0yNeJJch2&?GGH|&Tr zCag}(Ch-(iS9cAcIWiYkxxvb6Uz!P6j5l8$l!^D_kPOzMJ=$xoX#h$gRZfqJhB87A z`CK~cvx&Vn#xP*E5Z}o6 z)GyOB;JSu(l!Zf=cJO7;PF6gqf5lTY=POS?sbFs*dvI}>-qwWwF;M;9b$oKd|8GKk z@g~wiEjqT;eV|O)n;R#-lNPe>cP_lbsBt{7=`6*U(6KOOHMyy2dj2ZzBFpZ4Ym^Vg zJ*R!elg>HYmu4Ike{#iyf1_zbsC3YE@|C3(J*A(Pit{O_kCgAdwRtW|U?%4{>e4r4 zncSRcoDjfp>l*QDx< zU4o0hHRrtO&Sb2Zzl|j#Z8r-GMs~Pxhnc)6Psg`IS{o-M_9>E;i$jnSph2pxgRQ+t z)t3G{6;ZFf?QWg@0qKtG^{X?N)-`L%o3#LsCodmI#sK2MiII!u)6u()yH`7*p#R!b z{~dtbWEj`!C@ku4Q%yd(MxS@TZM*foztrM#y&h{zdrSVwD&--q<-A`nvVSJdEtAde zn~{F?h%LgBmiPb{k> zh+f*v-fn`FU_ z{$aT+hQrj7x1%aa@#jkY;qYrlaU7NUp zTwHc4K!4i6sJ&%Ln-bADOMbcyGx5(ffg(7uE8Nlae@asdB1b^`Su@pM#e~8y5>w) zsAIpAz`6GIgY1E#MKoEKnyDPrQ4|ClwWx-d&dMAjyGxL{S-33vnJl^w+;`ogpoUp* z9lsgO`ch8yO--NP&}!DgC}Zkv*-+h7=IJg-?p#@83-b{D=&*Y@0#r4U)7~r^Amv{@ z%hTpx%5K^keG|nl-IEGE{A&`UR};}kkDW&sX+6|B@w;5+S=ZC2 zgX{pLQRu--PBYS(hcD$>1Ize=p@sA4n^X~_&s)7%OIE^bu3_!+SMDQ2e!G7CSKeZ* zVZKQDL%Y79Z@YKVV}k!gA6;e%3LcU2{ixb-&x^wD%>p+154tM0Pr5tJref`!7OT+> z&Hc*SwffRX&w*>%mR?~_O?-o6-KlFKD zZX$YQR_*lSsrur(@tjCWtTdwO1ps4MG|e2*JCz3e42+xL+0 zjp|CM@80|Um4p((3sApW0q2}!xmA>QAJ$PEnWV>)qnhcNUz=+GV63MbyGT=67Mx@tAiYBwLi$ z=8^ACVg=f4pKP1Mj(l=4@mNP8A}~NvvAlcHvB9FAOQ*@f* zphA5}m^(II#6&fIyMB&1C#7Ho-*^ta;XA({+Sz4p_^wXFE!i2Q=L)ck_#2u})?Eb5 zKYM_zH@AX&u`kz{@4t6R3fw{>Pr<>b4L9IbE0C4_*(3(}-h#>vkeXtZ@{0$?bF1Fu z%GkF}@#WfGEAU@~*7YB_(E3)h%2Uk;mF#Gbp1(QK70W)n4g1vM0Q?GBK{i8ofyf85 zu~c@|xDz*SrA0A?0q~OMN8?rl*(O!;=bq^`r<1RPAad@E;R`%uoW9+V!3$aAjdvl& zNc{nks42y(#{!EFGT-YO;8pdkuxeJHhWhPRb}QwB9u~VbLVVYFVjnttVU`QKdk~pd z&fKKCkry)0MVI7>Oz+T&N8IR}%o``u-8&C!K~BFNzSKW=^L(8?BMn|L}+*%5V&8kXw_ptM*OV&RSRn+8M|=((*V7jS$ITPU#pV zv_ReY<~o6zX>8_5UK4T({M}qaRJ;xdN=Q+WY=Cl<5I(!x}*3d zA41$!)G02}Sw>gAT&jRYC0Z0z*k8@oG+Q;3O!w-0)0E;}|1~B0D>Jj_$e!##XmkiQ zs%`{XaIriFe(2B&dB(Nj*+S`fs5YApir|}@k?&nqWQJNZU$Zy}rFG&Yf8xYY?6Y5r zQeVIG$OIav*GH)#LCVY)OKV#|bi zk{;o4*hI+;Edc_>DM=38+Ayak3?+Jg+$tFZFGfh~ScO+s^X zwqbf>d*||8E9LfjYezqMrVFw8;Bwmt*av~Cx7LP^DU%$sX+#P|+=c}c(CKnf8>B6o zQX1gCf${{ZQBIC|*_Tn$5p5x-z z5k*AC1dE>fhg)d6wr}3N6!y<_w-IUDN`BuAm<*LnD^tg~ZT)OB3r8RLpe8MY%5WJF z-MJ!E3}o%oV)H6W*EUMAJ7_lN@f_{6&@t`Oqm1|5_lyhUKkN7VBj_WDm1e%@XWV~Wph9pN-Fus<5X5eLJ1!KbIX8}?!IlU>tbZXZpPcZKUe zPiqL+ii#HoQx6&mJ6j9igj~0qz(%+j=Diq&lh$b1;K<74HusO~^4_>8?Gp8Eut4oT zGtswE9`gz0I)WMB<@q%%vy_wy2-~hdb)8_4s0m7RQl}Zw94N-}@Q}7E#1abWa9EEJ z9fF?mTrr%b6cf@7-Gkj-dscZj_JgLJwz`4Q&oCKkt3o&WYu?REKiwzrab7Mi2M%p; zNksIo2m604eIV;pfBL4}&Pjsgn-T5q@WKD{GgKCFrFEr+f&IJK@RAg!zi=1*)MhWh zv~lFv+>HlQw&)KVnFE6weKh>~-q8u$@w}h z-|3Z^(w^h7YJ@KJ`V^v$DT`m)C0FYmK!@C;7)1OP;ZG4QMP4_yY_t#`(*WvgM`V-G zNl}=FXs7NAAxT;!$ECI!?cUc~R>E{52VCS(bJz!6bL!s^++6HW6MNzN>0c}f>yH2W zN?Q9dR8`jmQf7M*Db@!~H$nlyIGa0D&oA$$E}tUR^6ZZ~NpM$` z${+pxc3bz`z|TvhH*>0ka4%Tc@DE% ztah{2hdwHWWMl9lXpj$Bi)!r__R?IzT{h8!Dxb3E@Wtr}?by3H0^5tK2>v3aXAHQP zrMtK}=kDZ{U1GFD6SwclA|i}8;IPtUNelJ0*gZzojLzY4#;T&AMsB0+XP*4lyP^Be z5#I@sPaZqG(TRgytQfoav0=@vXyndpE|~$gDwobz8Va9I7_9BE&+V*)y^p8rzk-S6 zpR-qInP0f`PYd_gn&VL^Se}*KrR+sNLMy##9B}wn_U$gk`s;APgEHS!l ziI>qI2j|0+WHz`ZROFp}Lf2va7+xex9tN%H)9!mQJUXB1O0s#BZ@VU&+AK2eduelv z1O^+AGWILF+ETij1Vh-Snr?oF8GqVqBlnZIWs>~27{sKt zDC|ZZSq*QpeuCUhY=H9%D`BBinDmgJz$9$Ie4+les6u-=)>tw=>XKI;=R}d|Q#2ua zU)2pGY5A7No3H~`pS4e8X;N#Lw($|w?_!imt2l|G40`?)Pw$a*uNPZ)U(gs=JbfN< zOEx1)*H4d9ZQsBgKrsFF6X!d&fJpTh0qt;_9U3pvNU2-Qe<_XA_ifEpM6P}-3!abS zFYiJlqWiCKyE`o^w!4n}`1jS8C+I5_&J%0TaXeGL8q*6)t!j01+wv&E-=V@tV zeD5e7rE45PJThRC4{Dtzg(2C_p98?fVt!ZM^OovCqZk;VTugBdMgyqWtS?xs5MuG$6SKNL@dOW zjJi)IGjI6o{6}E>(^*aSr+=0?8&$7hGmQgDwy@?7)D=jc)6wyR-#S?d>DboTyTRrU zHS7i@>`#4JiY*r1lzNf<(%J&#~FW`4=2OIQ`Wfjt^sDvqt5pR1TmSryye@17%$ zdIg=blMgSgrtsV7?QgJh=SST+ow;d8E;(~-_)?d$1a;RVfKw%1_^vKGL<0hMeEmw& zcBdpeO&>0DWT;;zx3YPMSBI}4Qh(>}pF2Uf?oTIs4}Q&1zTHG(?)HNJlU@C9uE^Z2 zeeOX4nH7bz5te_TYqeTI=pzq!l#jaIAO8M_UC4=AG(@0D>F-5G{b5 zJX_-*y0kXx>LOA_mFKe*2b(Y6Y(hSHPZW=|Kk%@{g){}NgyKqK~9 z8GOfPILgQ@Pta)AAn7C~H#c}%3Oc_qs!U4+G&mc_*)W)%!S;(HeM(n6Q;PeiknSqmb+&JLMa@6g z)~20Te~UJckvrC_afzJlniG8R0O~%Sko7WKK|J^D9CbHZ)p&%ZAABCr~>XKp4}7(-(QdJl-INy%eebw^4b}& zCaZhhsv1{{l@!L!2{*%D{fa$&V#&_?KKfj(Q~blR2Hz?^d$Zt5ap5+S)0XIoxf4TZ0R*+Gu;MlQwV(jhkkqFxbid<=dx(xpX zTuUA6S2)dxY!>lWD2(1Jeh~J;jXe9iHZ7W2;SqEwm?7^j$Y_{Bu#LqxFjQNBD`0-c zCK)X_neXm;H1r)C>(I4xDrbpbzkce49g zwSNE&=kj^L8kHAhwtKWq)QC+x6wcI}&NY`qtlO2YxxP z8#-`mJ9oADb2Vp@%y!eCJ)2ntQ6yprJR+N1)Y2kYZNWYEdErI|YkDm3w^nUfK=U2; zZc6#Mi2&hlcl8-nX_HtcQR%(~$M=~c z_3aWSrfzYJ{t1vcT)wxliReOwmTnQ$gw%@-$ycqp@de3>Z(^AWxumI!onB^++$dAZ zxQTheu6aN(0Z#8K%n6P7a%C#Ev%juWUEH&@PiKo2jg7iiIxVN7jW%QH)9Y02PaEq` zgK9(fN(HPO99SN6R*=DX3g;;j>y5`T-v@PwsNVo?D#OKRmkByhZUk{1$=%Lq;^k;> z6^b(toDn}gJ^fLsj@VePVovjg)oXtu#}0!U>;P_dNKa@0t^RVB57@VcCI+gis#eGU zkUkd%XFlyTPh<b`b;$S^=3?zThjg!ohYy zTof91yXCUp*kXW53=HTsodwbU(qsd!jI$yG{DhJEeiDBFz8L8jC4uk%$F!`FZF(pp z*6t)*t8 zw62-U#bEboewSj%hLkz%WxJG$**GWqMTGLQqqH)$Cqbakh5Fw=>nLJOX#cJ* zYI}sqRly`>V1>6`4nLgG9+)B!O4Q^ng8sBGBl?z0on`mWF&?ZR$m|dG_=@sQ+LT{5 zBsN<~QgELm?)g2H`1#n!1UH{)!rbO6>r6?A?#EcC85Gp`dqS_f{G4^4?7WT-Xa5Qw znPRgD)$-pe?xMvaw0*Md0Yn8kNtRDWh*jY_V#ztA)a#>6Vdk>J?F)A`) z6ehPdKHdeYXG^y-r>3Pv!2LNG)(!!aMybYffg8lZimwVYvRwep*SpsjHG8~oHxn)| zPDV|z72kRE4<$(c4=UWac6nX~M(p6)`#bjD$oS(DzQ_|^_`?)FebLwBm;R5)jLtN` zw0*pJujqU9gQ&bCbboa8r|ayP1@)xpT`u5_&%>StCLH3mdx{2nP|B} z4n{uZ|L5bxF8|>=?xqxlDHSNY+~J^iKWk%w&UqSN{*E!hbVSL|)ov3dV@V;FBvKeI z_F`_@V0lu{so!~lM*~dZJz`v%`<};|m(9oEO-wC`hx;z33)&GX^I{RunCS+krr5ty z*H!1%2>9poDJm-)aXjqE|Gc0eRJi_cs4<~y;$d1Ix8?XhEcWC$1EA4|X?}4rQjM#< zKjitp%Wol+Gga7lo2K19=oNc?81@wzvp0go+#&mCBa*65&qxSdD zvzgP&l?rx3TCp5-dB4^r11PpFjS5f>O);izF1jy@Uj>6t zBt!TLo^*C-)p9MM-!sA!;od>G8z3M3_15Lp79)7}%z;#k`c@zqa;R4TOO4NXy`*`? zGk_!NDvX)`5&VDG>a^QEvQweYvuw!k3VOH@`>x}n5&uq^k)Xxa z=IaxeWBPJ)kEDz>JPl7|G4n(;ieyO#8&n!=Q$S-eqiYL6mN8?!y#p=Vf^~ihBA@$& zLUBPRML*KMt~=XO&4AYke+lA5-k6G)>EVU^jJE7hKioDq$j)coOn%*0HcpxS>HJH_ zi#Eo3mLcNr-oiiLZwKFD~v{!%b>6Y=dp z1uSgGYR$j*Q*=7e8071(=9~0N_9obYTkr6jiYTi^X|?45ehj80FHULmQRn-BopDL% zw6^E){B#{IKJ&_e30e11GD}~=!tp?WacNSN!C-}TMB4X2Y}K$#P7*I2W?kP((WX=` zg+GVND#oAEP43Nypo;9u9(&}jg}BE#&r^ZdO4X^SBp)PCslfa{-j+5S;;VMk`RQAz z_x6jvpTHslI&HEP@-feTZp%KR+4sk zx%7e4BrqP`w!LS#gqM8XE!WD-G+!)WRTEOOx(gGf{{(%CzjB3YgSK>z3<@;KFlF0X zg`->{4UR_wdPbB%%a+?aYEpuwJu6fX4A_2r+;55Q1%qD#^|tOirj8rg4{$oiva_?t zbqDqxA$7smdmr>kp5CKkg(C*0h_`s&trBXvm#COb z_j>SHmJHiR`oDe|c%bgr@Try-kN-H-=BCC$6M{?OaFamKAy`FGz_K@uoN*0yxo(QS2jZJ#@cwE+xb)LDuEAt&!fBT0434?sWZWa`nQ^7-0Fj{)P5Dy; zLb@`)-DI;H`5vO*M}7IAT5EdAr=1T?L*6a54=VwH(3jsJ@&_WBXsdL zixv&(_ptZgh}~#{yFTPgGonKBvJw?yo-h4}zMN)^#l&EAiaW{&1Ozl+cz0{_njQKE zQY2)VG5t^W<$tPb&qM#crXvJN)z1+5E@s+wljqGJX^emip-UA+yh-AM&+pT0q6iYR zND`#IRWb!j1PD_NFtoXom{etl*;%oWP2!EsOqhA{5~=4|5mr2)z2htVee7D23Msib zW^S0C=jr$rES`c(5uC?{5m5z>*b_e0=&Q%sguw?Y^^f#ECW8_b?)Vy&0z;}%_6TU& zsQSj`Ei1+jyS$=Te(Z`^>(I}oG1HyfkMejYXCCKDKKDFOJG>8^j5Y=Hg1Y0%KqGT<)dO_`Lt{4X3ztP z;e&nljpiRk@4jGQu&eHsYie#VHL;C2xj2~~rVGY;CKf5v+#_e-J28I=V7@st&N17< zKB>&;2wg)k9cCP(HEn^^he(`HBps!|v{$jDdFq8A;B`Innxoq4O=vMe{_AM zq@Md0r~Z5ovKXSOll(A4R=O2G2>C|;FQ|avv)OEB|FX2nMT1j^yClfAV}w;+UgBCc z-i@xaE^C+ z6kN*??%s~B(5|{>%Z3bI)xr3zZ7guKA%qo`n1WOc)gTbEq152tm%-dKR&p|T&c{dxZ= z#bw;c(*YS^VV&xA9fGb-?Cik3u=<_k8oauOtqc2ZqV87W-L^%SB>oiSJ3)UacV;8>!o&cDO$^ z#gDv6ag79D8WKU{gh__a_d{?(67}3hD#)_RjIIa*p+eO*HPQXKsg$WM9J3)dg7H+S zvBkhA=5)(ZGGOquyYZ_8E+4XI&Twckg6_VMTz!zo7s z%RZD4Lmc;7`rIc7*Q7$F=wuhb_YJe|OS=}MltB8ob3FyC3f660av5Xn(|FxH(RPUf5x>n-UqU^dyK z`nm(hoCazN7dMMMKvJA3;jY?}@vq211R35tg`dG;jX%!j@@oGN3!vga-qe-W&gi47 zZCsDsz#zu6w~zV7+8(wIrW0*6M_JfZ71*J(Px0OXMasJZ$Jn6(m zcq18R5&L(Acuse>=+F41QQO#<$7@H(8*P{(qY65qraVU)!BUs~1QRiPaBC&jF=Www zAcjbh+f&4%Q)09@A0kiXVBxzJ*tbXNjO0B1R~&I*4*oSerSo1y35C)aJzd0kvuJ_C zH_f%6WzV8k=<<(!{6Q}3zZZN_xRnt>)2dm)aQjamoGWMT6-hJcbVyHQADIX_b(W{} zb!*=Ei!{i+gLkkUMI+=t68ktU`$vW)u=I4htW`8HjAlOepc&iml9EaA;ez7#u0$k? zHGy%If%R8t;leJt+dt`4*}Rd07Zj>y@kSiy(ojRB$qTd>d6GR^)M*V0o%B{-KUv`p zdfa?@RKID(w#pK-ofMLr%XZ)?F4eV8hTV?eD=qGkic~%hHOv21lA~m$Bn5hd?@ECQ z1lk5XmUjFOg{L!jT|leBns*k53#esX-8XpJ)T6fQDHQ_7tJZty--zq;CmfXl-a--m zB*Mu5`s57=%Jh&Ho%9@u%I&gKJzF9o{~Bl{GzzT1vuG@x2k4$BVOw4s`Z8~S{{8Z% zH1S$FxrM@k#S-5~Aw0M6urazsik2TShQRFl1}*StM#-YP+6n{d8)P36rP==D_}`hp zUIMidbvANjqr7cIiG`0zW{bTnDaW_9Zk}x?izd42`zt6O#>mwfnUaE)La zcU{7ia3KdumpSx@+IZPgE2O+kt!JKM^Lo$~=1>s@Kh}^fN2p~=Z^G;lZ*@}V=ef`- zI$;aj5X0Qhh4>-M1+Pzb?FsDzJ>oLNJ?TCjyHqHYK(U7J55cc@!4pgxHM0d?ivd_q zzwtHND^2jhsrPb-#zkfc-i#uBxvr3o2srOt z8tvTrdWGGFcp|1ginPDfy4fZ1d99h3Tr~(K&he7w$E~lXUVIL&=}Q{^GvG*^t;XAZeV9DG1vP%;Rq*dY|mBa;N-7m zN>D-Wj_r6Cw7PT&gh7P*#_ZR9>2;1RU73!M9y2z)olrl<^B)Fmw+7Won6{TVWr$nM z(0a#(rtNb_#8e4Hcl|hyS#vPS(gbQYn}rS^xvz zcuFplW|0m}K5;Dr0Cw^7#^V`(SG6w`9ayHn{d6U5eF~(i^BrJ6As-<8GJe)^RaZVN zf9VF-<{Deb{{jfQo%@W{w0=9swI5xpdNHTixPS?V8|FeWc7dZgrY@ZegGi}gqNsu@ zVUtc1djzx`XN9EPU(&1N3AdzyT_wt;(hN=)U&U(8JHfEA4?der^(`u=VskJCXc*HJ zaoVflWzSIQ*RS-a>|WtBu5c+O82~FOD0Z-fg>mYH3Z~hzTJ&9|XB`fcGVYe!IBVO* zxok6VZWsrr1xP=xOsN-P*0Eh-yZD9~s{zEMFM1HS4ZC6bJqqL58^T@WJZ8J!`mwp)E@d;Fbev^eXPcbWQ@J_K z>-|uT%k$LhQ(^-}SDydTkMbv`Gq@GnxuXzQ7fux!bS3mK0#CnmP#hM-*-fj2pzM^; z%Ds?w`_;_^xwV(m@CnTX|DaLD_I-v=Tbp2f>g4o0#$BGNB#I4LR_5W@CkNa?1^eQ> zAMA~al;BwJZP3@i`feOPoI256Fm`){_hGrZua;Je@rE2~WA=~3kc?8xYWWw| zDBjQ~IMl>Y;vz>VWRq1yXRyYkWz-tOoK|ld8@m}5ghZaZG)|S&)Y^IK%$#zO?Y;l3 z><^9->vKufZ=QmBZqifL8YMeJ@J;+sXSsERF3rPn|F?%0j`)~^_^1#nU#7>l#UZ=O zcH8)Oo#YFHVvs28c`)I9+g(FVk?D*-%>Qe7nk9JrEt^{=<>hu6?mEY0_1p2rux1$H zYzxkq1qNl!*VSKMCCpM3z3V=b6#2fkO7_l6s`+bA@I?YIE{b&`np;3zbOF@~qDTSj zmeSe$SAg9U_)FX!OD9dA?+nhbgA@7Wyqf6rw?g;@P0i#PX;~$MOlx ze%VbCXNonmPV;YRK!pdRUiej4y0Aj-TzGToUS zRd7gsp69!1AbB&@r!Cga>$xGCH>AFlvpiH0&Ou5T;Pm9&ZGkVMqOpgUhQo zg@U}dkhgGY`2_E&j0ruLJ!Ir$0?j@FyC&0e$PKO#MtP+kI{2kH_atL)fV3nb%aQRE zSaFIfp*L7PLCG?#J&$vm(r}aZZyUB5o1TkR!OY zQ!y}H?DgvvXRrYQBFZG55$w#Tz+sfNhpnd**W%t1Q94@Qw9g_$;Qnu53`k{p2$+=M z{g#`X-<4zwTAuTTFNoJRIUV3k)c8fr<{ul%Gz`N93`3;34*}YT3|(Xj%)>LP0LK-E zuVM(-3-CdAOA-WAN1Xj8-wBL#laHX_C!`xo=j1o9_rX#9saN{02fUBRMpn7Ba**p> zSYJ1)gbqzkG_&3_=eE&HzZLROqdZT(eJ=FZ5yr_t-dB}Uw3<)|398lvhylsahY=TL z&heG8Ij2KgmQbbdWr5KZIeR#Z_VdU=daavJu;8d_^I^n|nZef!+}Drp&2-qajfQi6 z2YGffM}kXcPBCGIosLjVnqMZG8I2Vfc5gR*lo#in>A8AH|j0L0urFNe(6} zqZws`F*Nr7`6e(d)NIBOA=#~S2H)&wLsRe2;F6djqhUc%!L23D+thcgM`q|_B4G&e zcjAE;zdXcJJpMPgx4cQY%#A^*XIr_i{uYaem^8fvm!_cd94j2VsZuGY*QNRxiwd_o zwO66MH*bAAvxFq_UsL&rmq~ILIdZ?94?EEBUx})bK)_NdO2Cb&v>=)Fc_Mth=@bF6 z+MevL!D7$r_;F`6P2`dOoN+2ol&2WVOoi-J^^{wzE$U@bnJKIn zX$o`2!&*&SeM4>837Mh{j7fV+LtU&QHYdj870rHD?8p8{yS~`{uQh|*(mJ4)-cqi@rV%DF{pLR+M zuXSJbitpDU{s@#GvDD=HL!*NZeI=x|Y+vFRtbEJOTTMWJ#9{Ax3nT>XEe5Bg~m zgdA$|F>^ZS-p>?gbfzr5^H}My(Q7;UNkg#=q=jm|UQgL-0KVPKBnI}U5@iIP&0Zv# zwQ(3XiqzxrhD^8{gSKk_aq12NXyL`rj8#?eZi2WFpqQ#i|DtNCdNDv?swee-Tsdif ztCNu5{lqg8RFc8!`QqRZ9Wt_bA+0M^uNxGdO7l5z{4Lm+zr|Iq2L}{+6&MP33GAc5 z9&g`{q`)FXT1MIm4dVDDG}gk_Gm~N>`>JGYk#zPIbCSf~&$F`T2Xe1UT<=DRAA;@xV~rc_%k$5y6cE#o5j$A3a|M_s>C1j0cgd822tSU7c(G|rvRyP(=`;99B z?d&SL4WhG*KSvRuXN#Lw;8Cd_*8ST*p@n;qrMk_c;Zqslkw6_CIYjNz%xghEJ>d!H zXpE}k8hzU|0ro|}^>e~ESlaRWDStNp!>9MQcHOubZ2tEqA{1)z zv<7Qo)+22pg?Ah&8AhNs`-7s7LKJXhXbY*&Zp?r-;|nz4Oz*p2N-J?tW`1RI4z3V> zH=u1@#?3&y@QVoKohb2(_fp%7iG3cgg4rmFVJ~Ct+C=g>K0HJ5n{bc ze#qf*i)y~W-PqTC5jIV!%V;gqi`W*_^SL!MLNwDp+?OlqKIh=BiP6U=5-FPcorl4t zZoC(IZP3e;U%9;ko6plFOJzsej!*K!vsUnv-u;ZeG+!a94LUU9yL}b3vUJ^lSEA3jYcB9Jl7PE92vFKE-NRQ_Q}f{l)O4f4!CbE% zi+UjLp(hx|hMg=NvU?tM_o`y~7~aAr!?8Qu@SOtO^zQi>4xb7oL>rsfIoU17+akt9 z9K?dWNL?mAzyG~w{s1};F4&W&=`}$la~1oC%gQMQmt2~Ho$5Ll2MGte$GHBC6H-CY zhvTY?t&0+;4K5P+PkXod-bw1f3O!MBD}q0X0+(@U$hdWe5gJRjU^^t;_AzX!S+$w2 zQoP=OO$mirWwcoV{Y^!Zst6&UVchN!Csuo3cLW>Xb&nSjg5>c8NsI@w`GMEmm=a?4vUpu8q zE4En{{rew}47(lu=!Z68i>=k2xk8ha)A6}~^{TV&Qz{CAz!2&^Qmc_V_{!p7m_?$v z#(|qq!pMzoF76+zYEpx5p*icgw)JzxAP@N4Z65|{`&U$?)RtkYb7J2Ck>P-_0VE@V zzo<}VTsXhDqb`X6{LQ;0URi0g$DM$>mxUN~fg=x8c`ZHN()<7G%kX>F(B4o`bt7qK zc8F=nNu%2In2rICzw|!Z@R1sN;NlAc11g7?Zc&jw^NyC#uwrJ0JBxM? z+6{pMR_%RiAeYEwLQH~@*Y<)q0+pNI*p!I9R%^wF>n*ohJljd)8e}-&6NNp7}aTT z*enVrEn7%x`T>N2&X8EuDmrR!{NKvDM^KO@YZdEKfAf19z-Q zyTJ+%KN%2XButnJIniWgfwfA5C1A=T#ph^< zGr(#fvSE$?C=|??^Sdw9LS(TDc#{hm!W)-Y=N>NZWkgl5y}ub z7*m;nlv@@^Xo;i{ZY5uqcVniyu)TKf!hq&!qp%Xqs;ZUXy`m^;;*eje>9kGNlE9ml zSR`6@7M3L$p&kQpw*EFC1QJ^ebWJ82xr;SegI?d<(Q+T6?{Cltv>A*7045=Ej`DAXMOtgMm+rqJp!X2onO^WVO>7H? zKAQ1Mt+a-2c&#-_4e>MQiNWJaoHSr$n-PXYsm~ay1_`^PXaF+pO#dS79@Xd|h)p3W zEpDd}a6g-UEA@$_5?)^pC6%9FztKG>dNf)ZLNMnCc@N#Wua%papjy*8I1gD(W z6hCv(50vvV?BY%Ux*LdPMjjh8I^Vm`Iav*S(0xDqYd+%HZ;K>AY$9W=-cYjw(r%WH zp+x1EYSu=@{4myfKm2wVS>P^Kh)|Z5pA}WK{{tz2w{eOzA`qZEmp&|PBZo=LJtc}L zg$Un)5Mr;{wFFD>>=*IS;m#)EI>#cQk|Bnp6b}9dnAm$*M+E`wHOZk{WT1$k@J6^I z#Yd0Qh+%$yKGXfHL<3_HR;trH0U6R^=k%Ap8SSE2Ku+Po5qJYBVFeYvgUC?{=x+Yzb`Bia-Kn0nZu?qnrh&FG^9)*;Yj zPW$p82zIxKIE@M%y_j%;S|$d^J1G}#(v7jc-D2;M9T_x|GtW;{SfqiVKKQ87rrr;e zS&@N8R^#uRiKe#1Z{&s8VtHe3!)cl+7PV3p0 z{3wB841sCQVahf6C>?9IYn5iMGhVIt}zhDU=P5a5#`QKiWqf=pD4eMY3tFyX}x@m1*K6)_fG-k zyHBbLdX0V%PZTx>sW)YRgCu2y2%{&Gjp@c+RQK;fh#@BJF$EDsnfbfkHWo;!!bC*6 z8>y)gnjqhI6thPRs$IP+ZLM{GhGJTX;=b=Po&?}@Ofx^cxFOn+vHKi+j{YvqO^U;) znmw{GKRyCb03<_OF6gw_&wTGC9egJJ)0QY+cSh}OlsAR( z=hKo3A$8)+tTpx$HH58Wkr*vEDBLOYWlEi9# z(1&HlLh_}G>YgDcoT|txqJj?K9^hCai7UT*b4mi&@kO;$C--{v=Eyg+t@hjT;v?Cc zZauE`wk7U*>W`Qoe;NP|o2v3#I*Mqf{mKEn21`x!S^5)5zNp-Qf@S`QHp*tQgG&Tj zVv651^a`XHc)oI`9x|w^MEgXk@~iJ2q3=Et@3|NFvQlkHo`+QiCC{R3Q<+cYnbvqO zynKxrGZ$brruQ4AK^RsZ^Kjv}PdwW*Hq}+i2Todb%KG;Ry9kE_+)B{#*ljjvbxQhU zcYL<5#AT&WPLxByL^|p_@|95w3Ao3d`bJRkmoImVCPWcT8Ua`uM{&RmQ3_F)Q4M(q z(30`%QQGMfKhoSRGIuogI2e?)_|~7VxBAO*CJXv?sBM3h{?2WlqMmSo%;uARZ*Eg% zeLtA!m{CS=l*Lo6;p+e@kd}Zp;RSq2Ri&E;gKeErr3>-0#;}2SVI_r8lOv!-6Q20K|UKk>&Ve@v(hg29Ssz7TgbF!tTGO8 z5qqUZf7ULzL~ur((!Twu5V}J)Mhr!gQQWuJgO=7Afj(vVue7-#q?VuR0HzZzlBH0R z;{GTBf*|3ycOeQ$4&P8aAxb8M2uMd5iH8S*f`W^StZd&<53$>@6MYlnTs2ntUp_MZ z^#x2&P9IMFz`WcdunC}q?hE^sSkp>*w&TYN#7#_(XR3iDM7S%3FQ2xAZ%VPa3j`#h za1id2ZNMbQG}Uh3raZt=h*FKHSX1dLp$z=!vic~VL zs_@3~e6nX;>vUq^UlRCTeK;2+&OJ#M%82cbP*4c0VyJEyrs(ph`~4dXS-Wy?XOt9} zMTzUYE^3;R3iw96&o;?m{q6pmWLBQQ#zRx?e^(+RNg@|(WLH-TdGI6;=*jzV&%Bhx zF1nf++H`|}%(#Tfuapv-Y@WN;his70b9q*qDn( zjLyi89_1wX8NScikdyTDctgq(NYtEIHjdh!__cpO*gM|TEV#;8_Yo0*S&0!c{4)SR zddvEE!6Z6FxQCs?3~&h;d12im=|LGolbLPkRo)dO7Ln@mqZ%AV1nXu~UcA^QV4_91 zm#aPU^)iH1Qcgqw5sfM3vgY$Tiby^Zf5dgo>;Q}adKwljU1$hZ!+yI&?Jw^l1BT3j z4*w5TXW zv%9}%_kXzeoO{pvp3nPlHPo0&&q;^ff}LDq>X?py72i+waeY#K2dtZ?gdP-pvDlVxsdV=NHR zJc#~_XIbl%ZP5u8a%@$ricYH&NU8=jy(D`D#!#qv23;!b9K}<;OvKutbQ* zgc5C+_tuwYSi1ODIISdf%)OubxR+uq_2@`}8m7PkmL3N6E0-mlYZ-j7d0_}zvAYCE zkA&QJ883+?W5V8vZZq07pY#-Bsgk88)e~K=ON87Y=!Qc+9v6KATLR)v^UfAGjSCSB zH>gYi;3k?6i_{=7Z!e{Li>8tNCSw=L$;p1D5~z>NdP0Tql^{4jukdSOZUKc2nJ1GL zx$F8fG@FY7*+*ADyEDR`x8X>6p-Ti)zmZG+&=ZT#uRQQJCI&6{ zu7MdVb4sLB;Z~rRg z(O8j#yuty}zN;ht^31TbB^@83Di= zP=jG?U9w8ARegz_2*e+Ft#c%VN8kZ8QIPrAvAuKpdsFi-3^bA8ETrL4mPQB&nR)4Q zv{0_F#))9`o+da9%jiI`8A-&^a6))sD^B5}|EADstx2ipi4ws^DDpHzL8q3-&jN|t zAILi+!>~2416A|;!Wk0AlQ0sq;<}N(P|uAMb{%w|2XmSFqsLiIH{@!6az1X@n*bcqK4Hf}#*1dU(hR!*3d1iwr zi{d5UUP`STk7w#Y0$%tGyrw*gd*OO8{W9drZja{s_+I{as(lhMAg~PDrr}?piFRJt zW=YuYJTDk?_jM}`*>U^l$s%9+V<+JE{Ke;XFbboKUpoMyw)r5^+o6X?!6Tei`#FZE z>D&IN!5^;!jKVkqQBmasNaX<2fc&Nim<8N-}|){np3nV z-=8FXUeIaz13il1VM`T;K`Mw4LkCFAGM!@D(E3b~PlpP1Nq%`r$_O~;Jc=4IAPUlE z6rcyww3V7{fbnoql$t4bhLUIbvM0~a6;d@!_co}mwe*t2 ztX?{NN*VBru4`fE-K5|D%Yem(;g7bpOBeA07>?$q(AnD)=KXBDhhccF_BwS>;c?H3 z2P4?FUo%zVbo#FJVvaKVQ6U$_jZ~CO&Eb4eK$j^$iOb-lWQ^kTa8PrGf_t5xp1C@+Vc7^MNYVUg#iU z<4bT(5|;A+H|87-c_{31jqo^>YSh*v&=Gl_ot!~3T)*$<2tKApZheufmQ=#K`kdBN z!WqOkS~-}6u1vzkWsfv6-ooUT^1xF(Ie;sF*n?x}GEn;BZC8pw-#cff@l52wwMYddNvNuW1k<) zwI25W!PT!d;rOnKga+BdO`%pA@GdjMIG@O)MJ3V1%hMx5J^--sR{f_PS9+a%0Z;V1 zZKLNLCDT1t3E1t-mc7zMVbz{UY%K;Vy%qdW_2WV-efxz~SE5vz{iBWhsGysh_O1J# zZE&f-S{O<3nas&~J%=7Q375M||GcgdN%;8S(m00jb*6k|%NVCSt#wk`RPYMm9fkS5 z3NWo2ZhPKb)SWwAl416ppf69jiy$$fS=u*Y#eKYey~FS1r?fI}$IS=e3;=F$c9$Al z3tNE|TvG?*2_p{7I(hs7A4b`}f&+hH=1< zAQ~eu@h-IMO;>4O48@S{9|z3$g{c64pzxR7eH)*{(`?|{1e#{58sMy+z#|$T_!)qX z*7F17c@Eo}I`5QlO;qqWHY@WV=gC`?wy*$}f`)ScL~U0jG|E#RVs7+ido`flV=`iV z+Kes4ZCxh2(t?c7rLQaICMTZ((wkf|LqFIv>piX;ZEW)5_z zf`75Sy#D7tMyOM!o_1KR2Mp!HO8n1&=bXR#n!?n27>L!5_781DN|En~sKy=-{Ro4| zWDX6JSsy^EAHxA4{*9+<$n~Gc;A)t3?L~hq^YeN0I2jh@K+)bXhHRQg;vR<{lc3NeNO%dI#mfMyPnnNB^c3|#i2_8K@IXl8lpCF279nXDF?mltUkV@ER$YNBUU_UH{qCM0|zlgPH4swL0c_AJ^VlyeN)f0OVe}L1WT;k z?g{j~z0rm_Gp9|F2=qN|LQlmpzysxvzcMcZkSI5;t(9~gBb{r`_2)-{*~C1V&jqAD zIt;_M0%!pd-lP%eZOy0s!C3gXzu{t(PW+@6YU>h+)BF6V);Zkq39JPP-!fWD$dDAa z6>!mWQp`u}!=9V;XY+$Cq+%cvug&VWLLfr!Mj@g;5^K0XX0Y$V&$t=w8S*jK|DIhs z2$tdcgmSL<-rVoXx}1=B0D=5U6#ZmVzKld@9sHxN8U&j-_mfW!R#W*j^lKsF_-uP3 zl7DVOHLSYip6va0BmJj=3hbDC{q)FZCq!FO+Ajhu|CQ!KYvALPnjY19C)^9f^lcr} z1BW5&*eqnNXr_qZYi!8=ii|6jk2I)r)vlTf$C@=U39N)pg`6%<;QPBBLu%L z1(qsbRUula>Kd3wIav2oztWxx$X0!mq7|v(;mJy4`0~?NUcct**U@Z2vwHODdAdeb ze{xJ?WBt@e1IuqN;QY__*8~y$>D{MpDZ|4Dgv%uh5rvI{q@%pJw{X>-PvKWl^iy6= z8*EI(ANZ5bx>Pcrid!>yi6?LnxP8M(ABo*m8;mMBWj#(Di9)3(BZ>Blp|<}hQ!QN# zyn5uQu9MNjB)uEM6|);ZCpO^#xg=Q;u{!d%_w%y}lHLvFHSF@DYhNijC*ICG zR;6xE?8$`)8g8h5?T!jjZm5@$JTsFv3bFUMuwg)jBPScKHZLw%s*Q|s*FN%MYu24i zLJMb1v`OM$EN@a+MC;Y>e6O~pT-;oD^6d><@p$DKppKVq{rjPJP}ZZrwWlr!apRe+ zyGdYU$CFunm~!pi*-?Ps`K3o-6iRpVCsAy6wSsele?;=fCGu4xqgY??A7sZ)%8i5P{> zPtlZN3oh4T-d-e?tx&hev<=K3vH~B%T z;RWP5ra3^G<}xSr7;TX=#+%229Lx&t2ptMmOCw9eM4+2Qz&)E~Cb;_!<0XqZ*ttsru;k*u+4+pN z!x=`Zit+n{GjuHk>sjCtKk_u960HGneGI>n>P+u0sQ9J2Jtigr_}ZlEMMkDGx~A7z zA_HRolq|_a0#@r1-m5kq_`XYMY)GhHBNZ&hUFG+lXrbvx!6aZ^6m7Sp#Aatd_#dDP zaDc?%1$J!oeU`)GD`fZiIw4xm1ZL~c_Z=c|Da2y%PATe^!x@aWUS{e+^bOG7W(%M(lb!eRJk5AP^9mf|1%ZP7{aU%+8-{e+L6&8~xMs#00)PK!v=uKc^*+c(EyXaOmcvs-zh zRSO59mKWZgcc#q>#uX5Q&M^cIkRMU@MhPlkrSr7Db`ii@JD}rwurwr;_5wUu$`%uWx5XiD}hOu@Kg3m0ub(#aI37Sn?2+BoBCs zW%_t;dEXt3PlOOdO4d*6*gqe?GWriPI>aRt1m;auSS_yFiy4dv#QduM1kTvsJ&k=V zU_iL`EA~6~D|&>>U`yXvgP!FmD;1Y%3VnntA*4JgA9f@J*TsbfC&NF$I7k zlFMQl8S+&RxH`MbR!m5=AZH9R5mr|y@T5XxoCx&)^#g++_T%^V7w47%66|@ogsX7b zg`}U>iO)=bydY<4n8qkz^A~%|8DZv_v&j;Zm z7yd^^nwtWREjg5u5Wj|_=sQPOeHvbES>N^P^*n+EU+wgnEG5D1pF7fyNo}Nza5=Co zks1T>3=>j+zVg|TqP1o}W}u(MTM(d@{dGOTS7ES|r~jsFz^=1{S&j$&R%oRlA@l#V zKWo-nZ=AnkP{(+=w<~d|)Rc(bJU>zEKQJMe=B6gQu%1tiV<;2m>RotP)jAA+O45`!8C?Y%s(?OF9WRiW(>0?)eBQfmlXO(Jc zQGaIBod(`Fgh2H)Ms(yOT|!Mpejskm zMs_Ce&S{3gvnYI!h+)CbR-fh7)UyINvou>yrhgwDapDqO@E7yG5&fDKiCof?p|5ZH zUP~giBr~SAb4|k+LOSJQoHqI1@f#>0j0D$C4M##pwP)<|vOv@KHQ41ek&A~LS4dOx z<*39Nr_^Ao#?(&~N+#$gbAmk|gSzE>bSNdsElUshs$;84&?r3uHYQ`doyDi1VrFjq z7x4}7^%!kj4^n6T?4H0bq#2(jirL6ab zT8HE&k|+ZgO*y=;gr!`9xYd+FG|MJp7?n2DtaaUst|m%7A*tIX zZ0GhKM{WP$fRqtlI)i+Lx%0C&_$Evk33pjlyJW}~0Ux1%Mj z(|zI=)3?a8Pm1hBwR-jRt-DdX>IR7QBMM=m-8JL5$k2{gqwNXl)y9{hrmKNXy z(*SW8nHbsDnA@5fj&S>4m!Mab83Y(-d1ukSF&C=p2Rj7|ZDE<~I*OrVa%_m7(gSg0 zB;95{23s#uH{pR|#y*yRj~~Ozmw_79vds%msw3E}P4?jp%7QOCzq70v$p^bQ9r9)? z1A2a(hV^mNvX9?|NH(Z?jS3BqaQFEoHKuZ>6TZfR!C@G~Eb5jajc@gqLG%hlyVV{Z z^_hX1*`mu+MJ$8STHjr;0Wu4n3hu;+9IvYCc)*J3MvX!QcbBgRu4$>+>GDA4=a*vi z{;{Q|r~kn5)lGzEWTd2-+L!^a#Z1g4B5_zWjE#Sd@%$5{d{Hj3+q^tWn!WL>h`9d;&67NK2%aFZ2|3o}$gqC`uS;tLLY+b zkW6HY6bgdI1FTcx8x>&A4~n#Fd`L{wgJ+-cO<_K#S8K4gL9|v>V-p-7(v&JZjLkSD zxnGv{-hq6FfY)vZW#k1)V0D3oJwBK=-T z!?2(`mC{s%kE70>4)r|Qq?$MyE#%y`4z%WH3?gkTDJ$X?lc6)b`&Vtc%; zZt3%opoOpC+R{`id!@9M8yBss7^ns4y*J7V=goD0^-T_9~fhi zZAkds*~{Ip6D2Oirdih4d$if_0n5IC;da zw7*F|-6R@wc|W{ByGx!#%>V4EZxQNE-Pc_&U%^uNpx@N?0-B`h+}8!GO*4oRlI~vJ z7asIt^k6qwDppZyzr-nM-RM1AcqS7#AJp-dWRgDM+gwcm6RG35NO${j~9*~!zz5e9Gfj*~aHFEYdT$At?{c^U^@%7U2 zWcS+4xmWXcnQ7*?{+h@bd}xvyD^#*mgLS+h*|ySqM)ANa|CU|;u0c&mdvin)-k#pp zL1nKw{pRO&D^xb%5`bZWy(StFjYR$_|6o{702bm&bj;qUt6ykX>9Xio8e5A3PDptl z6KfS_98iYbTgU{SN~-`&Hj(IH0;M%Z{7u~8+JxS%ZvI~P8@7Mxa=-*UKSN`D@Voj~ zB%ThA3)Q-vlf$mTsDm;$Vo@UF$qMU)qPBKA+U2x!exWm#^ilm%Zc6OVE-WdTuS=xJ zO8o&b4s93X_XoU}05n_nN&@SemB|4!u~@-}1O%5X{%FBg#9dwRr6pncjL(S@V86Lp z!Vx@vrQjxHm9b*4bSR4!L5mcpM!VE6NkmzT+gtYElbH1}BY19cEieE83{X*&dk^D> zzFzF!$A4bJmU|I9cczyXPH6T1!q;UX)d-Yg!G~AR>GO{~cwGPG1va2{@wRRs zjaUU%A%Qhr2i{JtUwSUMl{%K&D@I>fww@zG8zm$OtKsZ(QFe2 zaJLhE;AFFKE_(R(YoveiYe%h<_hA%_DQIDGd*JppRLixROmgmTt*(*|K4y}PWWuTH zYUud4BbJH0^X4)aVbR&_>RC#pXJMHYsyJ&jLC$B+km?#P+z&Kb!swNdo9%tH_j?=J-!2{l+?))`Hw8 z*uXZX3+3|(0hk;`$67C3j>0N(Hx3E-;THj&pD0lSd&Tn7g9xrCl)ZRmYa$P8FBme! zT=&r)LWA0ZZ;E85LjkXbJ*d{=6ny1#C^~8e4@2xypFN#H+miOo?|cIG`+1wmma>_(hT$2QR#MFjy`OaBZ|m`1QNnEV zk7azCpLXMokjv9VIWe5AGylDRwy)3;P`>Ql>0aP9NWtrV(tAm3qduyveF^Z|?3{R4 z^2l|o;3I}h5yGo3vOH)FKH}YB&yBBfCIfccjYMp*bQ!b%&tS@$mEVw!AK4#}D`8D7 zkXjNQH%8_#iQ5sODENLD&#pl4=o)busg9m~N8%>LJ32=S%JS$c?9@XWl1jN1T(D=Z zs)8?g5k(RZEL-|zH-Zo6UTRQ}QZ!jg;w`6q`h1yhF)vF`dWB&0PrF_ebGs!gJx zA8)t&_(5(Rc=!Cb)7`1%f}kMQGkaNISe*WtJrejN!ibzlexsR+Eb1_dn}F$T1ixuz}c>TE;VAWl=y7FjOd&aON@yY&u zAfF-Op>kuxy!ea1vYQ$RdYZ`Tu%b!jM}-FulBO^cR8|JDrZVlgbllv?iOOMqGyI|g-hIbRpMzOnu9`#cV~PnHunLDb z{}sg1B4$zYrJp)eK5YxWJ@Z3_acm{5E~+2oy@6@d0HXX(SFMH?H}em-Q;6tu_^Qoh z#=qHl$Qmi#OE^qjfb+yN#2lu89-HTJve(d!wUqk%=Sm~=+mXUtv=dV|vS;Vgo#xVU ztGzWNV|lLI5>IjIG}3G^(7ie}T=D2C2X2OMx?ZtdX{OrMOK%+Q4z;Q6Wi@bHq#bzOm@1$q}#7;%3ime{YbCd4Dm42K>kGd?fhfc?4X115$Dlk znP%X0Zr-~w5RHYF?HWo-CtN_QH6m9(1_x8bqPw=l^_jQ%m;IS>=+7fjrZV%o&wRR) zylF3syGVld!;vCpqPM0lrdP%8W{G8G2_vE~c8!dB)QfM{$0IB7n3x9Ng%nFjEQa8V z!8eR7A!0`8E??0GxW^i;A)&pNs!dC=F-T8(jli$$EE+!>zrQ8qknhwx+TKmjxRD?x zwa8A$E)}g(^OO77AcfAcRwM<8k&GFRvxaer>6go+azn7_t!6JQvBgdukv4t=GZLZ1p~^dZe~Eu@mV|$~kV%_Q-&My;)I!&w`t^OFzvykwc$}gO4HS ztaa28oj46AZdTjjfc>i*Xxfw{58-F!tC=H#PTan6A?SXWbQ^HGXNU3qL zN3EJUh>5{)NXyE@hY&JlKvhJ0rrHn>+i!||PXF%o(LSCtJbIMmklK|x=5InC<;&r% zo~1H~mT$ehgSd@aCMQm;jUSPl-w6d{QjxnWqM+5vsi>`PSmCIUjY;C0t`|*XxJHYY zU#>E{M>5$A>Y53PpXZtCkeH-!(MwY9BQH5}Y$%zLtFbTZWrRs@u;c#5HnFCh?^(?g zuBXwL&+y3l@T1hDsA0PgBa!Kv7I)imp>l*Sw0i%l1MZ{wS@{YblwavFXsZ}LD|lnK z>tWA_Y>?#3uMjetKTrbi`2`n6i6sn~WZoBH1ukbO-dkCk@2{W=nZk69|NRYCqPeMF zV8GAW%Z9Z(t+|9VeBsT$PIAGq3I7LH; zBXHlPj&tw`ym;4>`s{FJm_1k4JL{|&vAX0ZIi3Myryu|MK(OUaZI!m|d1W_ojo9ym zpGa%wD1rF)iCDpNsAXzbM#NQmq#I|beIt&<56~y=7-U~pQzi@kz?C-{QI_D zmf`Tgljd+9>Pk|ex&kaXvMHTAnVE3Q%5?fqvH3q8vL+H^1pp+hz;5{bQtuaU$Rfdc zYx(gpfrw4GWdvaFBig$0<&UXMR-2Ak@yRdBjqiIsLX;IXgW{JS@t%2-aCqBhit(@f zHvdh@`_IhS%(Hy&Dy)st)?s{wiY!rAqiUG(30q-;*dA8a9%ZM7C(&Y*$*Krju2V|> z4ZY6W$z|Ep(bn~(OvgLTzv)Hm`Q+b(%_)G%eKD+}zHnM8@JSUBS^uZEw#)B8ZbDLg zgy?U)9F_|)zYo!la7t_RaP-IItm5Zx9xEe>u~xn44|L3*es(8X%Wx{pL>0U-%%Oj! zIM{8^)Qc+SewFrqW3s>dwqHC+C)=aTCNfm4xUrplh!tO8S#7suPYmc$5eF(K&ps`5 zHu>oPMJ_F9y)Otj_gr0^wpom4+O1sr#!guM^ zaPI4y437!N-c8NO0^XMNnCroxgMY{Ge^THuT75RZPWI@WN)ngRIEp#84vZIwB;xHn z7Z_|e=MXxfTDj6h-;em3)Q5h@xVb-dal&G}SN+TDnt`anG>F&?Fu>< ztBDnKC!pn<8^5%` z7)~nFBnNkZ1d(Z8S~lA|T)A6{kKi1@qqC2l^?op%2VeWGP~vc&dLU#3{3v&nC&Tzl z>7!i7mIspaRX~$FV1(4w!@%&Bu^56CG>+50IA}x=x>2o>@Co^W( zn3=~Hv>ejZp&Y6bSWII%WVpj@**$HEJkEH=*`9mFv9$Y`gzSEUAKze7pIdcNC8Ldo zmgrNrRY%mv88ud#|Nar_pGlZKT9t_Q4kG5fNNVlSi40s+pm(Xul%#FVe}axItJuOlTOrUf5X z?rU$?BYUm}@^Dq?^0R?YNuLuYt|YCiYf{0s$(?0t8xhn&^0bz16=hPSHIcsp)utJR zCOskx<74&9ZbYRwOEUkR?R9n*ZFF)-t-7!V4aUfl|D`?N9H5yebV;vcF`XxQe<|b5 ze*k#3Dj)B{oHsxc#E9JYA!JY3zeEU5ZC-okjln~v=Jh2qcl|PgM;^eQ&Y%O0@tVz& z?8-COmad{z2DQLkc0o5QbrUntwd{tudK6rmSaN?`>I6$Z22>;Z6q24jl<~jy?fRe8v~#n$7GA~CA-dd~%Bh?5=*IAC&mII-P066?S}$Bc>&(~~N4=5ufyYoL!dl8y2fR zxT%gPjDgMVXV4;kVN8sFm6l4?*A18RIrk6|4KvN2jU2wkQ<%?b+3}f#|B$L5WGUj2 z)kguf)|sjJwnUe!6(EbAdk?}?!f$O@DJNK~&23~a?#$=W;%{Uv6Hi5j3=bFbxL)oQD^v`-e{YHx!s03RU614DP5#%|;31Mi3G zhxs9oOT=%_<(;0`h3e&uX$Rk6inA$DrWiczI8$A8Y10t0+h8Z@#Hniu2(G_UXs_?1 zjzrix=oT@v=G(t!L8c}uQ(f+A*$dU%IE_e_llmodye6_@QyNC6nt0P|EmTMZmMLz( z_@(gc%dqz1b6lHg?nKLKeR>J#(H7xWxIEP%(x!NSp_Qf5rF|~ee_6^q0`0P>l62x@ z=B1{s;9)Z5Q`RGz+;FeT$B(I0PHD}4OR;?I3Qt1@$R9OEotc*d(hmIyFdm;uJwlXyYAHMqq*-gSa0WcFp>j&DfwiimsgJ0hYsm9 zDH5_dSGU$5)_qzugk9SH&0RFjF?0|tO~>j9EehPm&kY;KU_2m^8`;gtsEtm{_kcPy{NxPb6XAKgHY&UJ^nG#R9j~{S9VS+`7?{@ptA4Q4C zUbp&mAS&j%H`_r8*G|4ZFd26`bM*S~rjhRSJov@ojR|cIhgrhew_Eo)hN+T^oz^YM z;R}TD=A>-m4Z^LTd&Fm_YcxFV6VyI#C(3hoX0#8B!g;#elpZds~(o{w2Av7VK&$nPL5l@UPmiMGD)5 zBu&k8GbJu3x%=(gVTx24Nx(W8KjWu(m7qniz5fT*Z)PBl)bvy;V!qEWb3BlTe{hyB zA(p+pPV(N$P59zPw*r`P3>a(I39xb?7|5CO%1Ui=`Xv>fZJ1@q$uDZ-9xc1hvxMik zkA|0`l~uKM+!YEMGYI}vecC#k(ZQ8vYU?B%%eQf{`bg+7eAX!UoLC!K$u;9Es>`u( z{ZhkBLJ(x5%lXlf;P@?*2Zuc8a=DOpX;@{s&~|PC=-dcbFqvTAq=3ghJ=Mv$>WUMh z!ECLoK{S7k(PN#q%rxgHWubpLL2k9*pBb?HD<@GZ$e-AFqEF4m0aLuFY$)2NNlTXF z(?oT>)pX!sHe?tnK(11qyHHr@V657AGjNuK?;SZ> z@AR0*vkMd7cNByABKk%x80@xK70Qvybw7m=_1=p9(I2lkRW*=g`pLBZnVp4SRp>(6 zssgUva;M3lbYCxsusb^lUw1fsIekQyTHY`UWeJ?pT8C)7a~mzU9nYoN8P6*N&WeQ* zwmWHn&M=ZkV z#s^JdUOvlK04i?A0aQc-Un1>=u%%QW;g8-q#!A5HO{~uAtgQ9&GJN+HJOtYzTXUF#PC&VZ!9Z9aWSQ?3F zM7ZTJOpy$@H;}m?5S>7)XU_Ih&JOctnA$GNSUoDV&2|CU4_?4k>Y-*2PByISezP@|nuYz{wqEFX7 z1n2(e13$zSGAMZFdv2@rqJ3~`_&14-mR*F$LAVj0W;lgS@f&O?%+Q25K2^X@Tje9? z;as|f^p}$tr`1DwA=`q@ryss_=4=$79aE8W9^W+NUnH)k&=}>p5Yim`i`LgT;Dky& zE4X%)pUb5~8e=NlUA$V~Ha5dn9~Z_ZWk}_~{4mu*_(Mg#E%xSwsa^aUUx7)JfvHdT zr@UYV>sIP?*anx7d?P+fSmkt}9&{c5kmb91#OJWa^|yQ5qbF#P%ZT-tTrI4C+so{P zfj}yZWI<9^gymA1Q)eGhxXkvU4r<~=V~p+*b*S=%eIJqW{*jXo;ls=F`H?fG?(R3x zL8;8uZ}#QG7(VTOQtR$!y2WC_e2v%@!^PDLye$1lT&kJU_lG$wx`NyS*2YQOPM=4L z32V4FrAv%$-zPgqjP_y{sU3tWI3zu9VEvO1su|T8;CZiBSesPmD4;KxIH}fZAH?FD zJf#+^(~y@G?D z4D?SJtfZxKHvFe(It3d)$*xekbB;tNG$Dw@JFgE5Or9R9vaj_!k6j+skg*u-zc47V z+_yzq-L@sxPo5r6dQ~`bDZkh6ZK^(G{rq1cTvT-^w$|t8WI$)>HEC6%A_h zKNhz|kM*^+=ey6_FyQB<(`&xJS`jr-efzfOzuWluZ~T!b2eqq)8I~Z{?;`_6$Yvnl$=ACWV80}dp+*MXP*f#V|5e6IA+ekihKJb>5aKa|=V z7Ud0`!0jeD0t)lVF_(@v#gCW1G7!=@m1-XqmmXIz@mdMD2p~P7{73U zmxdDs-Sko`*EDpjdtOO+Kp<7pn*lm@{pXX{1h={I@GHTGOxe{rX-o%?8@|U4J_HQ* zp-m1R3cqxl+V9`@lR;Ifgp1Y3(VEAl6L`%^*ARa7Y}%=T}m;J+_!PoVSn>_ibC@LekOs_FuN%5Ms7 zCdpp6nbFUQ(&3d^eQ-rh!6)1QvA5dds8JKqhG9hU{8Y0idn3aM)JTsdxs@a; zQG{XQ33G7|a^uGdu6Q6W2cwc0BDNs>#WT*0Ga)iCg9lr_n#tR!T(aI`01$|XJatR7 zWS(4pKD*q`{%_W?&v3vY=0}T;{FQ~Cy~_d_HNBsNaLqiquQwv>-V$PG!w8~1mbRcB z9JqLG_YY91Q|c0v{3qSutyZC~V|ZU*fzCZ4;*ci?I$?R)D;Z;JV3)mD@GwUG4^P7A zkL1!aeXbMBCz_$k8OK`^V4p~@Mv55b7LLL`z? zGvPd@v@v<)?WgK5>%gZz9ni7H6yM@TY|iy9}7sNr%H~po3LYt zGj;~oX3CKjf3Q!p)$d9kQ%&j;nY7SHdZI#IRd<)Z=BM_1sQI9NsyRM8Z$#DN5f)(* z6)EgiNu`G`q!b3O>8^h-EjIeoKmS#@iPLa>ybQriUytq;b$pH7qfcG&u;*?Mq=K6C zZ#JmJTJPAsMVH}}TNh{ge;Mn3sq658awr+>@p} z;hfORSCi-08U>wgu;Ax>aK)>TzeCV}Fsb$Vy3ve00hZ@xh?%WC93|`{);uHhW;;&; zPEstbZEwcBJ4lR-jfG35eEffTFJ6@bIO$PymWula^^@&b&k~+kk=+pkVAMSdPYYTK zT%_w~Y2!1hp8#mbI+-1J+|X3eZVZkG`CdFT7syj%w~398RoI*?1C4F>8l$mLa{pV8 zgf5cnAvTzDWy=m7rtYj8&Z|P*;6>wb~V}@e`eXlgI*eJ%%-R<1)M{LrB;gGmtRg4T9an z1_Fy8RT6e(=y!!dys)|3GvUCvGL@%X7)Ne3{7ph6p)38#epDIV;lY8k3EEe7sL_-U zef61tv3uanQHXF_TH3niSZ*$ zeVd>~gZt$EeP}D90`A%pugoEBj(jk<1;u5oUzkHP@UIsOk1vE2S_8*n13zzKLp;`C=WLSfH{) zJb8$H^haH?te9hKC{b`DGx-I2m%iKF*hK42^h5~+7t?xh@5C9d=XAtW0GU3g7Bz&) zwYhACPxA%KPS%+k*F`JO2+hxMd+&XO7*0~QHoRJ3ylpsAF0`?Gb5$QX2Dv;JPKu0T zj||vw(V~|fN>_sHvW2EJ2B>;@XYXn{9mY?Txa*1oZJQgoSQS~6A)9=@)@og~>+~$s z%W{NHJ)F@Gs=lftdLOuGf5(#jE@PvgP_`-ne3?2=uH~Mu?EmsSYi-=Jtwh|wHkKID zQf8O>%ITeaMEuUBN(Bu=r9yjh6+Q#h;q|Nxe$Zp&@t_}00?%YWoPAKK-%xtE!~=Oc zP+RoVIRdlr9va2O3lvd5u~}2m^)1vbG8Lu@44#6 ziTTO$vI%&eOUv????OwF~ToO2@Sf*|M-MBW`22OH@JM2e;UVf940#Ljr& zl~Bc|D1_^oL0*l-j_{d~dd2O(w-D8OL!r^$h`XH~a>)Gjw?39o%gN_> zy;OEN&o!iuNK?=jP32OW#OzMU$jGqsjVpaGX^02)GzVuE%N30=b$BakxUyT1m*y+? zzc=paYPl9v)-#W$R+ieEg`oc5u#Hi!C9tu90i%z)n9s(oYHO~#y5rCP#nV|nH2J=5 z{N4rwsi7#%hN6UYBMcZ$L8J{j9Vy+T2MDM%N=Y~b1*KCuq(c~`gfvJ=kFICm7r*Bp z*k0Y&eP8E!9G?$eHp5Q#9#7@IP_XQvvZUnj($X^v_tC!@g;_P9$FX}7iM!Ko0V^vj z2?bsT$5%k*0)}6|eH%H@%c%OyGFhhN{qlLGuB{d|iNBTgoH)ePO1N;?swB~d37>ti zt-2YGUpENbRUhR2l2$4s4>=BEvd>n*T?s>M6f%(#Jn~P%qibsocVy|SoE%FwTB@99 zt_JRD(3U29o9bZZeq?A2d;snt(AtB~MD` z@?5{slcyuChvdG|3H{agJllXX;H^I?a0+El%7S#hx zTBYPho0R>qjk?}t4;?LS^xfj$Yr68Z4Jl3?IbX#-h?-taNoH{4)!XgF8RcxLbue_0 zd0@3qu8#75<8f5RZ+0=E>1I-h;wPMEC(`uh{QFSbhY=#XqNX<^Y9_oAHp>1Z!A~EG}@|XW4!o|EiXYrzZ=(DuxQ0%iur$Ds43w7!^i9S5*ie=DZ<3pXr@Xmd)aN z|K`t|1?g4Q^NtIjkusnC{lYr~K}S1Rw1mYMZ1z&)!^t?wd!2Gp*5Z zbZ{IU_^M!RneFrzmrke!JtC#JW4tAO*8`%(R@g?ud|N1L!(*~riGD$v3ROS$Q2vD{ zvimuL1pbNP$;dJvC@nUe+cBc?mRip(gky`BpQooMH&ahAVo}p*D4c-LBq)>m#GO|s zet5nkRz$?|^xOaa@V~LWNX?z?6E+uaPS_V2^hvezZ_C``+yT=rv{gWsq44VN(0rWP z6V|)L1jkXc2pka(0;~FbyuAo z$hM~(0=TicPBWNk zk1{^~wvk8qzJ*vDqZ#(E?KP1c)hD`{9}EZfn{7Fn#G84=ucr_|^p-a3TofO=ii(Yv zw>`pamf0_hOOdBS3ASgTOz_Nwu4h zKr_xt`?PmEP9aBx>F(ur$>O)zPNhN#_MRUTc^hjFu(tXNmSTSiMP00+7G5ubz_#*Ez^c;je-bYcdAAhW1-Z{RQX{0mKBC?mN!Z z|KaCAl)_DCWgvBc6#O9v%LxVcwnK}M$BR$1Q22?5OlIuUZaWVxs+!vZ1+V#R)-e6} z39k3aeE;3m(Zr;B_Kf-mi%q8WEQQ4SIvb6@KQUf~w&337*h$ zDUw3#JrhuzAt&a&iG*zR8wMt!vRJ^iwXF8gB;wyQkoZFa_vE#n^&AsyZ zz!Qiaptn`K4lkr@6t1BB6T@ve$Sh(K{x;UwH4I0>%d^gp11`I>p|A*2`$QoJ5Zy7O#oV z0*@LM1C633|mfrnGxX4Rz7L@Og`&B4d>SE|iR`;r?LS@oXG zoo3iM@&$ws=pQ zWc}I^Lkz5woeL9*do*@r)^Cr6422`7Oq) z{BZm}Ww%_t9hh>9z|aslIXTU^w)U60Z4yorn#BAk481a9FIIa2JJU*ia))!za@6&+ zPnRv!5sH)Bsuo9*CK+Ol`#sGbIo(XHa87RgOe;+Bn}S>HYKzZuAyp^GcY(8&PDR}r zY~Nyty28ayYy`)o_qPj0(EvOW?EbuJ%`d{k;ds24c6+kg6{Fwe)ZhaZ^hR3mBFsu!opLB~vxKu~6Jy;ZF-_;Irj13(69pC-!d43;+mg}}vR`$qYp>sff^f?w# zI42JO(t0`SJwwuE8v0$#!Gc7zKYB2;0)s3zP9$Fuzqo?Rec|mAb7aj<2iwNIGd#MB zTwWR4^`Oi8_wEX88e!-iL+Jyz^QY|Q($C_mxp3V<~ zWVU?&`NB$mGC!2FU=H=}Fk5RIcfuAEoa4Drvin@ky(FKkL)qtyJca=F^HyF`GaF60 zn|ST*z<||Uc`wu3nUVrPQW!spNVg%f$Ye4QQhHA^k193dO30rRnyBX|X0jrI;N_B6? zX)Z&>Pt>NF6Ld+uVT-Y>CJw1-bgXce&Bc13l8DUq{E_v9FQ)Y{me}H^i<9PY`R%Qs zmABtn+*;#;8(S3Zz9Os!r89(WcW5%g&1_5BIRaoAXs<2~G=BhjK+71BRQ8>;#FZu< z3bwgFe%wds1C7!X81-<3y(0s2l*#ryjlqN{pJlK;ds9l+WIN4 zNk=ItL3f4y9NV36=NDc5!q#uOWQnx>7?sX=man0)4{RiA#Q9cy4s|ySp_XD>W za^9@-ELq?G|CQuoLUWG9Ea#^zi;Um5IQ<@Ro+UXsGTlLIR7Tw!uKbo?TOp!;qibLW zk0Lf++?PXyi@RR~PlC|UrLe0Rm`~lcajW+=F5E>dyW+}~_<8(f zvM6v825na7_|*0RdI%X?f>LL2!1s4!y5@0%?iod&YUkFo%S5DX6CTMPbKChzrWOfg z=qB>@qokHBs3nk=UG|`CnDEw!BO{c9RPWhKysw;GU3#-eo5fhzuc}m%P(}&6e|teKO!B&1ZP=*AJ-f|lex6K^{Uz-vs@i1 zcMe*gv48;d_rSY;3SjNv(S?wED7}>NV`+zq^wQHCv)})hzo~Mka!cFt7;5ok^q~_4& zE7I6bE*q%DMWfLW=n3c6`o*CvB>vOA(0-Nc%s&w=*rY!|FEEiu?E_RKbc0x2oft~o zUmoS*G*PulzpU-kNT9oG5MM&8quHx>0x^U6$x6kXC+kpHzYM1EaD*!!eZs>F8 z#F}X{FAc>=Wpxe#*Kkz#eivXDuKU*ttpcZm!HvuETXgQ8Uq~S@6C3y)=BLw_7l*7s z_nIY6u9+7nfm;#WPgDQfo5W!=%WgE4#gB6*jnpiw=fbyADN??-Li0VtUwlA<+?$;1}LYJQ5Fzl5%mT1;vO20N8kGMfHyU}EG0;7bxGA-k@xflgdLYv-oDnBc-+`PJ zt$fiwKG(xvEaGGSr#X~H#3lHI8Y!7)GR+U^XctTJTB{3xK10nYaIF}7^ei=NH|4X+ z*L3mLslz|=yKv!Ox-W2HBSZo@(e7qnj5wS18``+LI$Q&l{nXn<#=7M*;1{*Uy~@hh_qgS`mgp3+xOy zKb+19G~k;2MeOAfj7@8W8n|Hg0$vXK0gla%QAtsu%v!)S%NFH|gqX5v6b3kClXj}8 zSP_+_)Jh|t2UodgUgZ>Dm?M2+X*eI#($cV24m}TqT!{#1?5YW-0SzOJz~Tpv^V*I~3Ugv3d#@ z!%^V8h;d$@g`$?b!o0a^7sPOMVj(;o)|OBgt%gCtY0(w(^Js;A@1R5P4lb*@Grq%Y z#Ce_|6lL}m=J1jJZ%TYnMS^VoBp>=YUri5p<~Ew0i$Z64bw> z!<1`?SFkxIE0`{h%oKzu&!^0&niZK2@xQdp4s#J@uX6>fJ72dkhX|FlvzM6{q2bfz z#(WeUB&pUPtfpUW#I-%B~B0i<;l21O(OY_5LjP^j&m%@_9SoRSLAms#5HSU7DAi;jb`)v$1hOf zxRvS1E?pmgz#`{naHE?jjXE`?LmUKWp7k zRWV>Brd9OC?xwJ>I_pCvdal~f4^&HE$oJa2a=fq1eu#LNeu*)?O;JN{Z@5@I>h15p zf4DG}Q>Y`+ortW5W;Bnoo8CflMOWJi2b^&_IddoQyt94=CQ`trKb~E`#NwbXedv!?b%8zO^K_P7I<>Tqu`Sm z{H4H&ysJ4y$;>)Y)|3Os&&>V7OTtdA5DF^w>|m%TSstf!Z2-{~@CRTB?)RtEu=2E` zkdmSToNid-_IXDm;2sxwCSSxcCrV_N*QgZK|KjKFA)_Z(NoV5#l9RLg~YAH79-gw6{USjw?Dip!+#t^&9@db zN;)PJct(zYO^>ia9v6B*1Mm)ukLAGW8QA%5?mZ1~DHh60>GHiYF#oUT2lRRxV0s++ zx5EHRaGtJzIJ*&_FmoN07yu2t!N_Rf_e}K*vnJ3q-Z)T|es#9z42JKwdVD%Ng}d0A zuAC%7I6x`rkHE7zhGG!lIdNvP<*P@PH~ChE49fj;c(zX3f2Q#v(5of8N+y0+fiG3c z$zEg@&I!}L#`#?n*d{rF(r|i8S%2SF2)bgQ{2UpVd_Orpe&gbN=F-HJosHyHxD8p$ z)%a*SyGOSyDRS8R-CsPhyjS?LWOQB4>?FZsUx$B--|V=I zg^zhM&KZe{yy&@6vlC$qK;tR+iE|7P3g4hfM{h$jav8@&rJc!{iz**Hr#KB1`^#aX zg3t8TDhLCyB2=AOECR$OX}lomR*F>!Ah|Out2!Uuuk$hWU>0F_Vaa$%Zdyn<&Mw4z&h0uR6HL6`ahnPtk{473aeMLogt08Z{&My&`87a(q`g1w1a|IcKz z(=s-%%z(`?b%Sl9jsg=6dOkIpUF;@r$oHORghBZCogPp$9shKmkPB{9LgZ+OJR7cJo))?F zDXrcf`#n4Ktb>az8?l9sa?E)XOHsih5y#?AJH+YU(LNBc=`PiXsowTrj^EyF;fKmU z$XyjDsC>tx@muq>$_gh`=h2G9Xs@h7f_;aC2Q?Q}2fyV}VzGZawvAHRth3~mMZyWe zd1YpV2|oDr>=5{g+s7{n{^hMk7z+{kwa2EWkxghx}Yz%Y2Q6clV~!HCK}cI zVHM}Ql`j`F9?#@#X-ofQ!-BHd7PBtSZt@8CdfsvW`Cl#Uzj#@S@wJp^Q1%B5EY3$a z3{3w`H!`^0j|DCi0`Q(5_M--$6tAxmj^BoyX$uhQAMj7??vxGoN}fd4YmFJw45Tag zw9UE>|N30``+D+7XD>>^`;$mm9`Zm8amCB2yKBlcXl$H&-d&#|A@IB%EgRL^ps=&g zl6dhd5ryrg7q*^LmB>ETdCMI$I4K`^uYK^_Dq4*X85rAEd($M{v?-D8Gix+L*ju(z z&l@HTQFU|`G2Et9`lP%rajjuSahC{^%X{N$=IuOIOGuN)3#4KwgwUu~K zf15Cd-HPsjHbT>}yF_<$%&4dGvU<0iyp@2jdipNwb8+Dv8oOI(FVyV2gzv_SRDSNm z&HKsT|H$oup4vTFTY0ad_4uRY)vAU?$>10K@)JIF2j2%;3ROIOq)@D@Cl9!F7*yX0 z-KOzKrB|IrEqe2I3!R6GH8}a-hWF2nu2CQ!lduHM>w+Lf`;F1}k(*$eOimH73pEPC znJj(_=o$O4K;jp^Vf-;BrxvM0oc^aqOjQaG6D#og$P*hn?rzOCOUBXvnOC@2LK_U} zCCR66ak@63GPyxYk>uQc!>6(5(~@cl5kIONw8c}(96=Ypz$)yk5-ucH;+0p=+D8&V+`aTcgV}?9nOl4zE2;4y2yF$ z9R3IqzP6)iEIa*}Mc4=!)Ydxbf%px^>Q2_x)c7O=y~{Ll%k`PW(vUD#AON^uP;Wg* z$q91{c!Vr8YtrhO`O_Fa#h;5>=gk=+QwbYBojERIh-E-)j0Xx`RVDf za&(o3u#x|gt=zpH>-7c|xX&1}T$EMNwEmG1dH-mV%fmIE30;Fd9pq|n&tqB|tA|qf zWlXHR#U#TEbJ99B26yNn{?^?8bZW~VLF{ z%5bk}w%h!3Zzz=&vMBnt>>>L;sKBJ!CHQaiJt=N|xye3bGjTq{w&Mzr2tDeoo9AN{ z|MI4Xhli?)3|qFc^5AD(iH*k}@$AV4XY99@2a5Z>)4fsF9&n7{`7wzXmcbI3+A0z= zC;tG!MT@%=0G>?_gb~)^muK8g1bFc)eqTtm*yW+r8Antos+ z3dH;h6i+%KUzue>^dVKZq<0y#@FvWPE5EU-aYef4sk^|Y4-^KpuG~Bp(FX|Pnc70; z3b=c+wAxWBlx5}x!3x2FR3^J|j307ZC?hg&NuNME`~mAtQ323wE7O2Ti8j1h5yRX; zz5)ppXVm#loZVoFJ*)~7s*UY$WpWD!8# z9ixfmq`SAPNgC);G&Znzh7>35GRD(rXjuM;ETLi`mh$BTY;cu)&1>cD}iHr})rayb4wPwU`()k*V zz|*}~l8?V9G3!ktb02Jm+4Oui5#f#xmqF^|Ba|WzLd+~*WrYh4@`j4pVOCtVnsAIK zZ8BsWi{bv=Dn_jg`^zl5xg0BX6*pH2KD*`>b3NFQKfI6(G+j|z6m_3Pm)guyM(0>C z(vE9hv^F7jHekR>?DGHN1?sX_)MX+4`q$jD`*Ad^%qBA6?@zb3j5Wjz$&;8UqXvcp zvJ`xG$xD_gC4f)xk-MT%oNsQj1QO#1lg0krChBB9lZ}^MvA8c`mGfrkP4BtLwR`0Z zcUu|OKV(iT{zhi(a z9I8KVEX3jZpRc|DuHme;(mm=$^Y#Z0qqJJ#^t0-_TE*tC9F-GpXQBRH3;QMu&}}7; z?Qg4EJ#k4NJlwQiBU^|@9#O(9k?QWB8PtEJJaGN_DwGG5{M8HwUqXi_1Tk~4R^B_R z?D8M`$2Tlv-owz`ss8$QGu0us~**tuF&NNI%jr2fa#m!g9K$T%6zX)(0TOj`<3^z1L`s+(`f0^hJu zpb_{$FB56Ktm)J6%@}tR#kvAG#L>kGWqC{5Owzp8Lq$)?c5y5)Y?+}N#K|1IyNs;& z*C-17881*gYVa8x;?1`p_En2BHS3{zYjsQFf!c`216`!9& zq&l}*l0OMF%aQ)&dVYwO%-ror8%=P@$Sr`%;9X2JvMoxw!!HS>vTfsjC6QJJJ-+>r z!_9-dZ*6r|J$N)U!KjWg>H)yDalgUO_nO#{=eRMY>75_x>l@GkHP6l8ucO8Igncyp;t>0wXZN9tR^;N2 zw9Hpf1K<2Cqj*r#`%gHs7@QS%4<7RXf1uE!s`JaiDbrOEPX7D?z0A5HWNE@(Y6!Eh zt^XIC;!%Xqw0OGX>W1nWem*i%jfVb}9`Njh!f|-;CWL^Aee4bWan0wFBo}}yv(sGn z`Ia4;^-I}Tvzh;6+)r<+-D?f~FPQQ+)erBI!NIP-O`{LvkgIK z5y+#RjfP_$wREYP$TYndC4&I6lDa4}JK`zK8?F@mS%?i zN5wp6zNZUWtyood%r%TiK%77ED$X&J%gFL=3(n?!tFHF8iqWtsGrWu1@wa#p*;cVa zQTr+5z*nXve_}SG@`RIVrI~@4v206|e4r`~jIii24~yh+QaJNit~may*XH)bdH3%s zg;z)-l_DD3oqO(E6I{jzm2<+NcD!lT)tQ9lg>K}d&t&r+u1L`)enrp&nL zEL_@B169SGmM0hRvzI4xhVBTH-b#PPq$hU^_=kr1xb1tF#FlP{#Q1R1`q(kikP*>Q zUy0&FLor=|iHcX(+k;TEo+W9q?8e2<@_AemCI>=nMT<(wcH$@7w^-8gN`^$*+Ou%8 zHAFJ?;Wo&OS(`V~ZNZ&(_h!(%?bBoqAJOS+1b&aOS}vQ#wWTcaKU_xO$$}OpvCtq( zGA)96=6ypCwsCFeBZ~q~!M!_c>*ujHWNT`^L)vT(#FAD9>{X|q|o>-0kC0mn8o zCNo%Jifce%BK+hBMewfJ&HphU%-tT(YFIS0sChVC3m2s*PJcBmZUF8t2a$$f3HE+g z4{MIb<~(zrYE%@a?$Q^+B3&(ZTxsss_jLS({B(sNqXTXKz0>^WU*##@I@;B+MvrOs zT3}s=!#?SAlzA%V_zC~sbJf~DW#)@KBzo;Z&))TGoivnN`ngh%;4?t}DIVKt07>O& zAh=?oZ#O<&RFcE1{#y#Zv}dzI^VyR3D=+LRRYk(L(t92fz0@i^BBkvt5tOjC?2J8J zc&Y@SvxMgmnF@+-TA*q)J(Y%!$we7>6==~ssOj;TY1Jx8p=0Xx0-g!VR-C3W(N;H* zmg3*Q7z}fTDX2!`e&->RKjz+hUnKOj$@d)gS+?;*?e@-9m_ll7Cr5viiL)`3<=j=( zvMAyc89>F}2Nmc`&VBH)*}Dn@KAO#F_lrZ#aLVJ(NA-e`1u}jQtJNlpkQe$D*8=_) zu=IS)J!=5VunE9yo|atun0P2|(>IcION~6~{aWhu=RS-?@}5G6r#4)H`Nqtk`~BG}N=r;9(o!x(V|cWACx4)=jsi*gFAnS}uv2Bc^o+6zV#VaNgXaDqUqfJaT<=RVtLJhA&wW z?AB(!0Fs}LRk#WYABW;^sCI0KO+V`zrU8nzjQ&2cSwy9|J6%8f!7uTKr#hZ#oFQDo zyY1*{!STzlC*)A~D#?O)@4ku;cCy}I#wJ25pdTI|4x$&ST(o@GqMVi&A3(!HLT**6 z-RIxRO`)ry`w_aXJ-NB!;xM$Kd=wj!}S3ZY_3BGPap}Mm$_YUQKwXo7%RFG3ij=m zdK&eyfF$KkzNvSDLNKH*n?ug1qHu7w0PGkBtz@^~Eks>2jeFaTZ?_Yqma z5zZRL3`}C@&9}o46RoF;{(c5$+^E)t>LErF_yKYJ6(Nf<(zuNZrO#y>NH(?6QbT&? zI@Sv;KFfEF#(Ka_^Mr!~o9i;xzi6cOanfxqDlrm4QSM~6xj}3M>s8PM0W}~hh38)p zb0m##gz)QK@YDqO#05o=X;3ns9WTGBg6m=@XUI-?BTnaP#>3yXHpw956CPr$&EgW3 za89V6M~oN=t)<$EXnK<^wEefmN6D+}O?{srFNL8HdMyn3U&qGi*cohyq zhca1VGi@sE>1wn3U#X^k=NfkD_Zr*4a5cMmbMq|DhBn`*rc(qnBWqoawbC7;9{;VT z^#&6jg?*gcyYG1gV6Y2M`u+J&YYDxBk9xQSSLwv$_=69N+gFYC^BMvqS=Kg&dNc}? z3c5(l_nJW}QL7T7RQL7hxhw@14~e<=LhWe9f!Dk4?}5xC5vHks0>%gAQmUl_sxM!} zC|nZ}X<@tjSbb46X+D{(SO;HZFp&^8@Jh#sXFu%SAP^K`Xg+T*rey-FJlV)sxNxl~ z_J~;D+fj(3)APysJ=ro(JnB2=zcXw8kN;!6&kK=2d6e76~L zn+|FYq+=58i<@az(tX!ft8T2;AMgDjE#d^tDjq%|lLEg7P`{kNGC7}v1Nuer`!$jS zEY*4ij?H5)t+S&(7aX&2yLf(pEM4-3f zL+XkInf#P9QnoC$9R$mv zA)(i7I)E<;(Bim*s(ul_r25<^j%|$C_XFb(Y|>q8qXcS#r3^hc??RIN`ETuJy7j1f zaku`t=T4ixP*2vZofh%NG_C$C;cI!nY-_V_^NNvEO?#Awr`VU##}QSJ71zHz{QBeM z!Djf3l8fDFpu~#KeER%Qk@wtA1V!yToI6mmu>%OQET^!EQQX&csz6y|#o8e!nrQ_A zu7y>qhEANayMH)CClj)hUVS&+)n&=6V%??_WW3(K9G|X+CP5RZLmpS!d+U8?`7R;? z>d)Q--eO${7eEp)0)g;5)Kydp7g484H90JcX=|bG;pB=)=`SVyz+Y~`-`L0~y(aHE zE^3?2m|N|@_FIj<1ll)%(j3A(l6rh~WMh6)K%rFvmhkv#;S9>1Mvif;9f212v?Dxm zEq{a-4HuJh>yG!Tf^cTD1!bWx9TPj*d{$v2Faz@=b8@-q`?wKYN5NUHvzyk`pcW0G zLeP;sk19nq03;~7*q459(j&!}KsO!RU}`+a)u6eJHtbPK-eI&*hjfu+$!~vl#xuN+ zb_D|do>4XH_V?f9K(>enkOPdzZM~n^J1~~vS-~4S%zh%a^t|sjels(G%D*xU@UdNN z%i#SxUL0zcMwJG|!OrPJA^s=`%T4EI2k=hRjjm{K@J0yyMaeBxnoNfn>0l<`eWi)i zmR^g}0|H*3ph9Io+0;|ahLzHnuw~PPGcR_@Y`8^m?`JzVOT$@45Ch!UFsTLBa0nK1 z-A4UQFC!~ye@!-fWg0YbZ{`)s0N%wkuzolaD~0}xt->1pfNVT5>SatCl)`A*7vv8| zk_w5k^Fzbnk>8`Ep_wAS+rqT}LhhbrkB@;6|H{$P`bO)GacoeQLOs*# z&TZAES?QAjY}?qYOtDT*k&9alixRqZhM)Qr|DW&lP8saipT|vWv>^V%i;1E@cbrPfzTs@A%y2#Oyt{g)exwjBG%da3mJzcz zcW7E}cEa|(7R=1mH+5o32BBIq)}7G#f}=_RjX z0$+ChS}e3zF?v+7-(|1NpvGdkoo*o~@iTd`A}s4+zQ{vi_z@wN)zc#c5#aaksn33v zGJQL*!CmoZv#qU}&*TqgO;x!2d?vV+%trwRr5zhn!;_4M4`D5{`!RYyt+w=nyz;b6 z1Ac7nYc%azxX46!1dN#(u=ku`FjE&)iz1o>x86Y{=c8DE?Qb#%Xs|!98yYxFPs?G* z6)t&l$p@l?$rE1(vji1Dy1rAp7!wp@{!5V_YTKYTnXg#`xetoU8=r}FXG;x%30w)i>@HtF%*m7%N`!qQpBJ-Nn_jc z=f(D!CK%lEMCCeJeWvB49f;~7{s(cJUwJ>HjGhfni&UZA0Rz;`9b<0= z)ak^AN;sHYN4O?5VGD^>TN=uzed7E;7rFXi-@{BKL{{&wwWGJkm+t671KRP-GA;p=su9ajq?gopMuGwtZub|8eq;tU5KeTN6?+i<>#m?2d+pr62t zVBW$0sR?-Mo|mn2l=8)G8xP}SkPF>hP{j}5t6ljy;!@{sE?Vb019$0I`4tkh!gSO2{0ndByCm9Mp;!;8O7W z@lH#g&u}2EsC1t79HW~$)! z-jLdiRetp#xd#lzDnHd={~cJD{H0i2^Y>+Nuw1Kgh8#II@_Xk8N#RG~4bW?u4f76r zi>nE9(HGj<^o|^_l&%a&t%WF6)fg|ACDj5$ZQc9` zHqXKCi>m=Pbq&b03D}>XY&?>V=Nv?EE?c&ke}|r}a1%vd?kLQ< z_;%d0)RZHg-69i79y_y0!eQK2eesy} zwR5zdJffrRbgOBmqrkqn;g<)=_6Zvh(o#F_=Q)!RMlQz!mlfoWkB!Xr7pH=j67@bf zajHbQIRv~Zs_w&|UzU6G5CWe)Z#?3+%v>hB#(70N1P9^0do5VGUDp-5yt7II{2lE3 z*~{0>m@EGFUB67qulv2eX>-_AIq3!Ed4N)ShC*4vLuqc3iM{j5><$XjwBkub98TY+ zpGz>}IiC6^>)EeBGRqBo{kEk5Syt`Qf8CCtW2nly7>CyB4y^I^dK7-do6)g2Y6LY; z=P(hh>`#C#wtuhDq0yfPzJ@UErWPi62@5Z0S6Rp5ytrwnj<2k|WLWdJu5UeCzC8Qr z{gb#4&w?#I8`SO7U8wlX5ObaG&RMy;SL;1H?x;W)Cz<*`dI}dSD1)9mFgCX~?_JGY z+m+V;GWgdiq~!-`PbK%lGw;17Xi)IvUS-)=JhJ=cezoj;_$7W6l^?7NY0!k6t3dFRUBrskYs%cR4S7Kk$C0B0>d0x09uS zT_n8xmvd#Og9G>4N~cPHxzJ3e&?_*Hu|M?pNm)sQV$j+}i^KuJuRy*@(qqOX_QjQ2 zG?Xr82LFgbI44c|fjs$k;>lXs?5yOP_be`j4#7D(9a6EDXUF5SF_w%Dq#u#0FTe0! zyX!fUyg$t6XI90uk$b$pppiQ)QCsh{W*;OwB467iFH|dF9s5X&Q!U!@SF%&_ZLahUH_1Ko!XyL(f~oVf@V$aZq}!eH4=X2!vx4GJf_mMU)G`cY=9O zo{tY(TH;($G(h_YyoEb9dm+fXcZ*7%vu8rmKA$I9!GMG>zecd?c~7!NQ&8Qd7O{B0 zzUz{Mt%_xnZbYgCvwOGi+PFii$xv*3k=&f!l>ZQBjA>VA0*!FGYzrAxrU_(^3@-v##jW68s7f1?A|SExvu}BO~?dpSVif6J3(3 zX)RiM`ugnVw=U`W4+;&?r-A3|Z0O=r?*}rpQ61!sU^ARN;KRvo06YdnIqB%_boz|T zV7)2&jgF|kE>QKKpv!>@xf8Z;WtKlqIrqwv?FSWjYc{qDDy zsw>VO0;;`V-7X7G7o_>uT$Df`x?V}80?IQm{OC2W>5}l+l9uxi`fCn4Um=I9i0yES z+3HjD!sJ4tO`{mD_Uou*Y0WVyy*&KVe5_kVVK*LZ2y#XQ9%VgYxSue#d1rDs_0|fkL=|P** z*Uo5I#HvT4y}G`@V^d$Ywpt5LeaYO1SaSoXIW_VVIR=I&lqam$_Q5HZ)c?K)UFv@l zMy;#B19QfjC&s*A>idgprpkUMvNgRi;7-@ZK7?#Jv_=VOHuQcv7owX2-(J;6;LOwx z_?-2(uRp$fyd1`ryfJg_7#>|~(9{SQEI!BPE2*$$dR`W+#Y}F!uB}r%$@F|^a{}?i zakJ`~dRmR0Z1sBT7@mPrJ`}e70#&gKj3>$Pj%@5(T>g7J^N7xBo#z_xU)w`}bFiuE zGp*fkoKx-daN^?inJZt0;%k`}y=T-p&Un#*NRag?g9?n0ioSg+==Ie&;G-DP)Al4j zx?%Nn<$lIHbiKz=wwgjfmXtc9XWkUyP2lx_0ELVMmGhy<3rI;UqfNNmb}_=L&bB*( zqGIJ)0MOa30+qV2S(e3@5g0GjB@``IDOdk;cz%RDa694)3#~Pi9R>I}F_I2GB00XQ zWi(8&NW*xzU%GfR&BH-r>Feo?FQ3@ie6M`{H@1z0zMj5|E41ZZMDL^QpyPCYGueLF z+1sb#GQNGXxlA$INZ0B3w4b&!{}o&w*UVSwoPV`RuGJ1&sa8<|E8JtRtgCPy;2D6_ ze+t&ySNZJ_7OI!w8pZ!{bLH*kJFRml1zmuPHvXo(!bsZg)24rhKF3iO-fK!z!?5#G zwB6!!I<_Yf?2Hq2yKS!DzM1W;^lC*UoBG<>DXzWQ)4F`*<;%?@?`rAO(WS-YFj&re zDtMq7aYW2k@gMw2DzlEhbQ}rr(cuTNx#P<&Yk8YtydnFm+?MFttEsr?qMcBtetAue{i%O8R1AK{Tn%xZnF;)C z&JLBdg-}D<3RYW5LOB$<{GnIM4Ck=Gp&`J9uWEb!g?Tvs_5>zBc-a`zZpZN1jq*BC5lGvBU>^KD0`4ov=IM5*?0i__ z|F%)uou7;^^BqYU(4T_zbqiyc ztY0AQlgD8!^oYXNd9*YxBrnW`x1IY}X?-W|@3U_)>2fcQm4rjk5p80W=M>(50!}{D zm9XrROUC~63poE1K|3WC8(_ktaV+Qf)u*`lqvDN#M{Joz!5ngQedUX*@9Sb#nU);K zYx#ii&mdW3fEgps(_o(08uFh0eBr5-{rasE?{iSeMM>+IHkHejT@YP`!S{ad@z#ZG z5*V?=AwW`|T}G<%qnx*9s)2~r+8p`VEk$}AU)+xn^1b}-ciei2^Dz}_Tk<@Es{?;U zF`e&IC5B)46q3qCY@@M3{yqk^R4Y|4N7v%4Fx$t^BwsGBfGHg*<1CkYZiKCuVmfaS zeim?|de;C~U=ei)YB?of8^@lK$1SEhaCeqj^@ZiupB>;abSd{9uw&Y5&4t z^p^MKeH;5WS`M*#R<_e{b*hq>R!Z&L9Lqn8Y^+_-HW190mXWxbI;aZ=0u{*>o1%Lp z2~qunR|R_mW#(%}O zRKaFAPIFOitA4L1Z>{)z^7psmpanMaFt8<=inl}g(~k$Knh4Um#ANtLGc(M{WGlzq z1wP;DT(RkjW3^3;)iBcR>*FjVB|Ec5a{aCQXx^ks^J9+XWuHY1*`fczY^yBL8_z5t z)^R1VcP#kRovr_3d8|U`oCNo!_<$z|wD@v87(Es(b2sOyvmFDwOp@usBO{KbA&@Ks zcU$8<2A=CGkpXGjC@=H>qv|c(nta3m?~M^6rGg?k{2(PU1*BmpQc@yPBB8`Ux^rWQ zib#hbjnds9HHLI|cf;th5u={@`+lF_@jU;)eeAgJYu9z1@ArAW-Yeg8_02fW%_gk) z%U1Zx3MW5zf(A|M+zj(pv@?|As(bgg9tK(l(}npQ&^l=GgMd@ubmu-*US@YZf?AN9@KL-~>7 zzB=SA+2Zbna-%;G?`Kab$38DUanEM&sbaUfxmQPyNA5mw zFws6erHs>NN+f;4_wHN3+cPA3I?T(Nav0<{^jsYDb{Ocrr3-hy*bF%ghNc&Z+HoGO z3}ID>Ng}92&?$Ey2NZ?<#)vMJ8oGWNqIF>fc$m&-S~Q}eXmZF(Y%i1PQTFg#xhqT1 z1_R7x_(H;dDRZw;4tGb;GHt5YAJI!dHec3_N;@UmyV4GVgZPbyim-E_zx>c`aXj_A z_WHEQI^A%YQ>O^pIW?AB@nRf;m%*GdE|ox;o2Ng(f&o{nTwr6~AOSCK9{3HnOd*{# zY)o(i&Jq&yuSHad<0`)CV(m_l*!c=88gw=qBDLJh(ImWew+Um!R-i?Q3BNkXDUSXs zQ8~oLShq}Ct!Q;}7%Jqw$|XJHrj^j`IQ@vl3WVbI9uh(5uVIu((ym9@i(%DFHxED*8TFY(*xtwC@fm(YpWn` z7g%<=%gLV&-I=BYo9btE9GuM7IkF>n&&K%XiBh!7Fi19A<68#Ag$l zS@C`a?u(hPr&p+qKpGUZ_nnmi0>llT!qe&c;|mFXa$4{^t50^}Lx1Ajcx?wesF+|8 z@ppShW3|>!ZwZ_Xemh-%Ee5fm0VWeVdYZIH6+U=>uPU?XtjpprK(J((-$*!b(^BE+ z4syPHTYdfdgquS1NU`#$t@6m{nrrt`((THA(*&e(zA2}>&@dupaojYYW((8MXJuER zpmmxTc?SK<-fIEW+abRKyn5RCrxDOrrK7@ZhRi_dA?kpb-y(dh5@}bsYn?d583qn= z4s&&+F~FH~n8@C{exNinPk;E7mzR!*Eb-7Fd@+J%ZaYg~Kx3TAWBI0Z55$pdtzo@s zkCEcO{4IH*NEUn1p*SUU{rU6o3w^oiaO{Y7l(_Y(h+@;Ww|lrIrhFXM*RdzOy=^6BIhZ2ll8R$XI*Z*!VI>N>XI{nfg_*UNTQ0taRN1ZR zwdO4(Ruj-k=S*qN)=^bL`tx-%6FNEU+Ktzj`}}IXi{|!74J!k{@6c~o!|^Bv-(DGp zbLxg)b-b*yaUQ})+x}MrkoFt+sj`xe!?79^zK=v0fsIMKxmZXJ)>%&+AwY~C+%ufb zftdZ|=!baE<(0o4c)Gw!HWMPZEyW?u9M@H_z*Vs~NY7LHAUw{FB4HlhlRZ{9&Av8@ zj`Ol1+o*z1NVS9EJ%K0c`V*A(5A^58SJ$Xt&S?0A^Ch|B)7)4CGTbsWC@9vX@OmfC z$#uR`jDvY+m909mJv=tqCRtr5(7qwmM$3BKvit;?B{Xa`+>Q}-KbJ2V*R@Y8w!PeR zoaKa}KzS2VjWUStlNg?v2aPXz9{Ts|+}jwYvKC$I+RmKnO|$Hd_io)?ui2wZ^qw1t zv^h+06VYV8u=L~cPw2mlRY=T)$oY5CCH9NR*;q7~S0@#!*(Ck)?#mv$rN3RLnII-0 zH!$Zc*y!h#EwYgyZey8hWr(fc=W*=*{`IKARC8G?ZjHCmkIxrVU>JU$BAVGFy62A7 z5#G7rG>+rDY1&n?%}wXM%d6GBEaQ)atGPNa{+v35UUgja_EXx#hz+tD6V%v5y;Y`% zsk+R&)9{fEmL^-P&M6z=dFNI>ZZZDeiGB}DhHt3yyQi$xPK5UOfRuiGzxDkY;lZ^Qwp%*5nW0ft|<2c-l&9ZOLNo|$(Y>g2`^tX*0Am3w!clcn>~_R#k^U?{5U^~9#&5`af;k!_KPE+cM3uMP(P= z7|Sx!zjgO@>$xmwIM7rqQzPD-m(2_f1|Im=)4H?G55*0!St#jRtRkxZoWl14<>!XW z3`ChJ$aXEvOaFNqIY4^Zsp*$~V@IJuqfI7^J>mFs3L=t!&xfJp!q5X&J9RaD_P}2M!O=#emCs`J;HvnDB*{D(ToHD* z91>U{Ve1hnG%Q9$Duk!}s+jF>(2!c)4UgcSQ|Gbo-fPHNMERxQd9^lNGrM%){^FKy zSX6loBcGII-@7=+^DSMdAjc25e5irRUCvBF1=rny5<$)6rIu~3*3gI5)B`7|lgs-l z4UaLcuZvg;w#_N|eJ2ZpnVMv~5*zq@YkGYVH4GpXU*_9HnPSY1QEurMm2DIuE)qJ>?O8F^~+ZD4RU z=d3v4EHg&Dr_=Q?A-?yMjJ4>|%NTEAxa#a_%vM&9YmKqEf(b0KxHx9O3MCV-mAc9q z;oan|KJDErETUnuaar7bmxnFo)En`3y&wCwcnz=icI$Dct>sg1w|Vt6OPG)7mxlg^ ztwc#aPQ^&V;^lqE6BOeCSx1hUc5872d#Qpf-Vb zFJ`2KPYqVDAr;=|>n&6gDMg>=oRIx+@+_x7qGt2YQL4uf6OX+}aSUW4#pY#eKeWq8 zq*&JR>HnUE^Em+?lvVTkJc7ytN+6{hL7*HA?1fI~>~sF*d;`th$op*55JcQ=_bU@L zp{>W^;ggy60q?Jj%hbuN&ObSy=-lg1EHe6#`DVv^#L@Of-H3Ng!4EEjc(uHzqopCO zsAQQm5vK-ZoYd~pABZq(p$(RE$Lz=cRQDJH?N-v9t?=jk4g6g5xN#uo9_=c1GDt88 zWeCnp0W!CThpmNt$Rql~>ckW*HwG!9BEP zG-k{lp=*u3t@-;A;anfvC%L@Wic``!R0x*SVKvju#s;HY)Tp{>OMGgnz!; zD4lwOKbvPE9PU|IuNcu}l4HH|n<`^}GKIK<4ImLUCC8~alN%kETk)G;V%iJo&IE{W zUOa=##{0UoGFif=*G_dK3`dc{-sR3g!oq-^q}T9qg#G__8}x~WGzeBBH(e2E07}07 zggx)n&V{M;+xOb5C(&YZ#|2@B&ES2Owyp{_IxSO#cMJ)REDl8LS~#QCU3~ zG)0N-G%Iyaos5fo5_r~bXrAIP)?xy1wc&|_`(6aswwdhQ9{s8Z@*R<%89&MXb=lM; zp0c-lbrnBZ<2slVDWbfy5j{}SFcJTBwe~p=f@!lO9XOCO8YOG9-k)L={f&`8sClLR z{5q~IcQpDgm@cjD>#<&(l=AI%n?qP3S&#M)1lvQv8U5^V11bNntx;XTru`?nUY zwhcV~v)W+|ZNB3&PF>>c-4Q8Es-YYfm7i>Qe0lr&`NVSs$NHgJ;Yg~*N2rv~u;!;v zvN>A?o-<5h@T&DR>Dr`AVUDaT*~_O4Khxy9T|4Gb@v$5Utdt~@jA_DR5qs`m)n}Nl z?TYD0`(kOX`C2NLY)rAt3H)A+OR-&xeKd5nq*F+s^uok{&z4FWro2n&n_$N2WBsjs zAH9|QhiOx_*V%=$!q&^`GyPR&W{jrh4r34VSY+hVmgw>_V2|`Y>)_ROnD9N3wIj10 znD@*5Yk!p_m3pl?*%>JfsdLwz)%T9xvPM!(A+MEH)tEPi*PI>Q(hAPI%;Qe{Hf4Go zBL1(&AuW1-Q)Y1i&%_E|RBjkJz1B4L^Hd9b9TlH2b%6TrNvtZ{F??Fi>^q zYW?84sx847isxmJig!P8(E0KP5{ulQdo_^yZbQwH{b;ZG3Y#Ra*L_}T?w5{RlN3ui zJ`la!;aWDUNo)MJ0CU`6|8V{r`L0el!gy_JhB|4(ZoJO~pt8&LjHa6I-Ne3>XGw+Z zj@Eg1gLfv+2EytcU_UJ)(q$<_+B@+?ScCrI_nHXi8yJIbHD-9_#q$`=ql>9dV{(f@ zlR$sY$`RFQd~n37vNuy&gL_T;RmD<~h-2K3L)kHJjO2(|1fOkQeTqlSzIdOTuXH?A z8K$(qK>ANWK7>Gc8xr zDEpOX!Iw0A#+Z;);T=K8>}||9E0OewRBURVV2+*lPB8RjnEOYH3zw<)9DNw~b>ps# zd!(NwTeeKfiO3v^UHT{^4gXbXx3B|0803Oo!N{6E7}V(|hLS_h1@3{xM*z+$(8?{uf)J(4QqbU_Nt< z*-4Jky!R6OQCp*UV<;3n-AgwnaK0tTv0tgoyt#e+SNlO_h4Xi2kIStB!XP_<6>VAZ z;WL(%Mg(|VH$gp6eF=DkotW}`+T$(M|HE6UaN;y=W0gKI*i7( zF`Ok^!g#NAFZIMt`(Vq(a)F8dBdHX}Jf4#@o5hADj=mH0vH;EHhP$WR;jL>mCr$nH z9!3sb6(d1LZeMhhuFn;?RKM+01$X5Pi_M&I$Y;^8^N4@=9b^Vlr_&r8{* zFM?T!yA_b?MBzdG;g|QMOGFTk%4Y}5yu6$}wn>?j`6CQ9V`%FPJ8&HKSY5k} z!&%HD{}??-8LcU4Z#BcZ`h^5kz3o|&=w{5ka4|njMZfZZGeRno=UhZ=@$4vwR`xKd zVd=q$q!yc$KMK^CbIA>93~pM@ldb-zI1;N$v}-}Yc)-ytre1KDt}q}6eq|&qV8ZbQ zC3}*t*I+27(b*U6nkUkei?{Wg9F_FBUhw;6kNSLqC{AOcJqpY-d|Ppqbl9KPMd8j9 zc3d}xZq5cKz1;{+TrcC7bOr6mcqDL3&lNiy|CYFHo-A7_(9x28Di&m_FMDy&G8STj z`#oumc;kM)Tcd9~QCwtl)~$ap+@CmnOU6ro-YeUZ4h9Qb7`PLM#518aQf4Y8J8IiJ~^IpSrAm6SnoVMQUJNr^?sH2>5ODm=%pLE)^HefkAJA z*nAA0+D(>DMyv%7_F;?x;wDFDqAsnum;+8)I<|13j8#UW`E(4QDz`i`sU>?E!2n9WVQk8xJO^pnJP=k?#0Q18J$^>66tq^T_Bi8wea?l=;-WzTm) z*=4JJ4nwqr+>bgrD+>66*z`20jlBNDxLsX%-)`CkTgYr4U zC4@2Ne)!dBo&v=X#xHZbb4t-B`pR`nrIHWPljh-4#ff6Ooxc|hE7)`ILEaj$dd#g; zDR)xxB)BmI9Nz2+wZhN5YEoR(2E1kvBhVBFO!TKyi}{Kmp+lO=ZyU3Ni?2oIsfCl zl7E|1=|w%f92e59j#%4j*dtn0-&)i@HR$AM7FiKTW2Ub;BV@{h=(Fm}aTQor=hoYb zJWUaD6Wn{X&AuWFsLqFB>Bi?nsz>53tDTrE2;62%;l~g7>x$&Pe(9cp^2{92nuY&z zD&cOc^S#oEe-D!qm_8yR_DuxeR_5Y7xwIh{BYgW;rIVFymt7O;A>?esMT@n^(eVwL z(?mFbe|3FvLPO6{A$>=gIlcfQbO!c2X#UujxHp4{Z#@<%w*jZr+0ENV%ii*_9rmr> z=z_5);e1$1H0Gy|{uN~ZRQuDGkLlOB+8Iry9m<|f0f&D_=Kj8TDgv~86Zn<7=xayM zAI8#Mqm>L!lgob^j`&BUC815C5F=@nn9ca;H!*9yKgntn!&T<(Z#uAj^>}SymhV zV7`Y=A96&oeDZwsnU+iqSaQy`qwtQg{8gr1s%Kio{%jtbxKu_mTiHgL$M7n>)xZ_* zY&hDpY`4r|-3q>SELe~1o4eR?;}*5bZ2!46SHl8BL(q$+S8E#u3UsoSKDZ&}0xdX3 zXUu3G8;8kGa=4l9XoM%OhBBWveiLnD-(AQ{|Ao%^H5*vd&a{?Mip<#{W(9n0;NH#z zdsETkZKiO(_naqXZ+O?%@Az)=edLjNp1 zv}6AK#kx3S$NgJuVY*9RQ+B2xJ+?gpq_kyJ&+mmJms*q=E?xf4LAS3;qXgRwMI>3F+Y^ogYp&z}w4M?x z)~6XH<;5nA`3Equ{s7uQ3c4aDyzzIG)N%+rr&hsmY4 zN{xM(guM*#8^rnkF&2oIIi3iAD`yt5QpYb`&G_?&tI(!b*-q@}LV~^q9?_?rdf~D0 zO$|Q0^6%_33y@k+DP~663}Rve1wf`)LalOO?-PzywL@tRP86#O`z0=MA60P=cs_?2 zdo6w8N~*Teag`bnyLR(2o{>rgOqIZQZ3_}aV0!#|g}j=qXF4@qzU^yx6#EGe_-c&i zT;ix#q#y#mV?NdzOkW`By8hWAes`I&ulR3S2fI<@N#njCv_Fg(;}VAo0Vy|%D_|Ew zxA**BN%TqtX-aKnZn}PDgcpe0zieb>(_F3JN7awQJVon5Iv9gurhK!Zg?->F;8;7 zYVih49MpP)Cx%TFkIK&3O3&3aHEPe-oZBt_G!N$sd{TKPXjHw^{Rev7z&`?%nVKMs zg=cG}vBMWDmyfK9fv+3Fn@;UBXOE*}_a6eO)6`(!6Qu5GvSAM{bP{;Hh9FiF| zK&Juqj@FB*>9@?t9LsU>xHtq~JJX1@Ss(u>(9<;smC9`wPB1KPMXN!IgqkjRoJ|JY zp15w}L^Mn0FH=45qNnV_Y9nOztZwmn4yHdC>oGkp$Bg)6w@7}1^nqqpXM+pdCMR_m z;=*(pY-s2`P%+WjlaaeCKRNltyyfhugKNL>WR5XB;>Xyevv~p4yw@{45rfuPM+E%d zl&EuBy7<^R_t$Jk9rb6 z$fw5Z>8pCz8&l3hCU0}bA$XErej?NPG8j>%(Ho~GQlgw^2>ff< zM&}$?8rcW-UkXVG-UIGTc(DBg_y07lvC8aq^e~T}`gwe@u*hPxnvh@xL+`y?(37%S zGTie8sO3|er#*@xq1}DuSl)quzTSmgnFKGzS0PDrVqlg2CKsHbiW1&WZw|~~35OO> zwxa=-yI%sut24p3R^#VOHbv~n*a9l_lgM-P_isO`*O0Z63{SDwpAFIU)5fQU%;Kx}ESATPa=ymVKVQOdZsCq*cQDc3LRG0fnB*s@&bKZNU|o#A z2z1CEH@}CE8^Uyn?W(UPcM3b}eVdrd)fV`YB*cEHBda+%bQ)xabN0$*lx^rqJ?GT- zS=r7qjqYB?GI<%&683796yC0>^prUh!LRxy2z)_EMWDk)V!5dMufo;aY)!GCOH#|M zXD#Y1wD$6s`Y7y=kIkRRvP?Hbhp&OzS(ehO`b^eRV*bmWztmlv^nQiy{d>rNX}E;; z+KtY%i>|cTs{@vWQ>8MUaIlzfk6;Z0%PfPYp|_MmTncVh3zZx)fPE+3!6IuhAIg)& zL1#F0d$UJ&E6FCh+RMh?=N0|`%K}I&?}?YG&1v8^-OKoakJ(x~?6KW_ydA2eKxo+b zd7Mq{r_!@GVv~I-*3&0kL46i8puUkPSgLg#zzzSVWfJ>C6g%tQzC=?}JaeY^1wdI@2?SfFAdyVH*`wD#*MOUI_mG>!8vrXu`?}NP&=OclYq{o_9b6^7oS^08kzjy-v#8z-JYlZJu|;^dW(F=^RuAox5kmy3?g$IB-T*B&V)E072aQm~S`s-UU<*zx5DXpq zU%NuD4%f&oQtoBUFECVC%@ZkQt-YVM-gwSB!$MQj=5{OWT#@#!=4WZYmVN@Wol9>J z{ncVkNqj6Zb)IB7Q4qfv*aXSQmiz|r0E|jT^yMKCeFFu3WekjRT9RwAksG>C3M^cg zU~mb30DgwVECxovZCTdxS~`6Ycw6~r8s!WJeiLAV>3wE;OAI~}q^0O-9#Van+uqu! zV7^tYyCmx4qPiO5v(zbdagf(WSs@hno3o{Na0U$+L!8en#6@9u%rC!I)w`L+^=pe* zF(Aahj5zH~K55?1Ht65KZTBT+H}^lDQoE~$v$0Q3@5)%*ZN_7mo+6C`-N%be842*h zw^c5R&YzrahEWHN-3|hqB%1-8kO{gsR%=3M?Q7=stPFoz{>SQn5xjQeRCMP3V0yq9 z)}X&%AWq}Sb{Ho>!hWl{B~WOt@Lg@bgiO}ltz%ogZ&RWeWX0OI(xUh;f&0A%;RjuV zA{|I=3{sMV9oC`B)0pe?h?O4W;7nBb46vb~8#F#C_x->=lfSYwgbd3cT8)z42ir*c zRzBFx^dDRawQRxc71!_O@7156{w~Dk1u=T}mK!ztSVlz!Zp7+n(wxP8vGX-W3F1>V zg~R){-YW!sksX%3WiXR5LrNnVTRFq0L(A`DM0DK+T&o{<&%Dt{l*p4%G9}iL3{n;5 zs`XXxGcW^om7EHWcIpOqrA%)1WE2^cHB<%^_nr z$j6PoWpeZNQRV={lXO40K_5$i2$UQl6|K{_NaF=$_OZDYwX`mH&(+FVZ#!PVI6LkA z%%+PxZ%D>0R>v#uYm8#kXC=%l=ALY0Vq8_5-jKWzi-#6dw}?3z-7=2K3RLdt4QwI2 zaLd||c~hJ~MWEGW#JWoL=-7GY2yHrCU7RV>S|$pnJ3fiIqv7#Yf9>}(xeDh>u*t}jhrnr<#Qcd#isayefN&1*$W>9fjOeV_BczO+2% zogckTu%d{1x+e1YnQX4|R_A_@X?aYPiE$5)1k7ml?!iF&VNv)&DD)Y0i=ByeE21}< zdDs_K#!st#)|#=OI;CxWo*<|ipX!L?4g)uqRS_g5>pI&^GJl;ELd3St(B8kPFGGcg z7?k%nZ&)SvhZzQ0yi$TiDytYhjF;1Dd_;HIJ8(6{b2$>`hEbZr+GusRK;#a(tngiS z_vpGZ2$n(JW+QQ}G2yhC%@GZ$5If}FR1G1+NZB$Y!)}70E+$V*Kpg5ufHY*fIUz>c z6w?`Qc8YVQ^lPfVrqrbz^zc7v!pre8ZVz(JckdcI?-(=hzK|APiAYJP;vS?(9nxK} zsH!aR!^xA&oLM>vu{9Q$)|rEeyoDqi5iMW4|7$7a5v7n3>Funw{C`64<*58Q$yU;V#G7SZAy-^)_Vur7-Fi2S)f=J z8<6xX4U0)!a(S!%?yBKy^e3p)bwszY1>h#KgGT(KjzHwgu~o3fG4Rkj)fQA+iw!IR z(P^&z+c(iPq=t8q-()2m>JGC3LF{ydmHdfheB#IT-UKogkOctkPmE!UwVZFKm^>}^ zY^*@)?E%dImgpw_l0W4H4GG%u64Mz=JSYYEn8=0Kci+!Fzj+GsA{Ap9yIu@@iZ8ym1}~}*T0KgOC!Rz@@E|CWdYUhW1uH1t3#3z z_vV1Q0t4i{FH=0)7#_2!v_`#$gg*m%05g=yZdsNvaP-;ar0C80Y!{Is+aRSK>OeH1 zhbS)qPmro5&}+OR44v!QaKu(`)kjToi(pRv!{!_{oszFjDi4flhDp}h!WkJpcZth^^82EkE{t!feM-=1PFP1x=>eX)FF?j! z$THJBFg9eNZ=jC8z6apC_iB{FqyIk+hUrGr=r6tMIT+|pVa}X=X`pK#-2j2y*H14IU#6h zXQV1(PksYxBwufBOiWLPiMOklFz>*0lH)NK#Ki*#QUz3PqH4YHn0k*qq;yA+MU@lzSuF&I#{Rz6%E@JHBpvg6t7F!|6s zkU#MN$4BzXa)VJIq`fV8M_KN&uWG`?h`@C+mF4rQ#0?aCc^KjUjx|BvuxBRE7cWaZ zl|Q%=-q;AdZ@Y?(_uDkuRkrfKy*uUde$(kyDNDMna;vVsvF@?3`4QUw&}$qDtdSI# z@R;4m1!Cv#dBEq~C+?yXW#R@&{YKafB}_~HEPwy7fwa1ez>Z08G}kX&?hThjDPD`o zVnV|*Ad5_Y25x6uN5?zhPB27vZIDXN{HE?1adOgR%eT^qKrfTA*?i~6>iAb2cr_c6 z{ztAyofR%5i{YQsS3b?5g4!H}h@JJ#zOVn}=rdG{Pv_N-8L_rBkiqMmG4;8XFccC4>`Zy9eU^h{5wK1gi zt9fcs&bX9MW^;lRkEYGq$TZU-ICx9A;kIxkDNemMMyp(bbvfn)7ol93lo=1}4~zGX z-9v~<$_kT1oq4|BnzG=br5zp3amV2i&8aNx*pqr963ds$5nIZ*`>6<{-(`A|)f1B9 zGFV{`4?`KxIWJq+to}N;E3wXH9N;(^92uV{`s#O+P@?2NN`c2E?>vefpGtgAmGB?U zk%DE|^;ZO~m`J)Q^SHK1^2pYXsb)i7+Fk#zjW8x(GA6%`-m20a5gz}a(pmQDqGAKh zoGrTJB}?4|S_f!d^=k|*G6pbXkT-v`SqdP8Mh}>M1s!aNq@AfV=~BG{cA`$;`-1W} zACo*Lc?G-${6^$Rmjkluz*CO*g5bsgi)pcgUc1B)2wy~or*k+aMk>}Yn0u7p})WpK+0?RH4H(@p;RKz3q}98 z=-}2%UiV+}W1=%Hp{38xd!$Ux_TjodrXgg{&)sxfw zn394m{W|Jr0B|*i*1jU~<}D_y^E-f4fUW68nyG-xWY0z@0K3swpj-*2M+&nC7+L+- zNO)QzB$9@#Q-Z|oXU1qf0u(0jVn&5^SXq)k;ck$wyda4#oKan{?CI?Lm&NZEIat~<)@C--QX+2549y=pO+`TX zFYq{?nQ#wxm(4?>KI!$8>oh~$BYl_WR8qpqhfQ*~6O*#^j_f&!N0;WpaH($VqwSgsb@ARS!5_~w=Wy|PoIHM&nevAjn43~qV z0>J_egLi|X8#^;=HttM!D^M)-4>8WRcy|9#-ij?sjcqafExTlx5_y|V&A`RWm6+ym zf$P7W-q&+YEXA@n8D#^^4bloAvF!2@LQ3el2t|?&Ff^M zlk7Q_2sLm?QAQp$K8JR7DHI*zm~mBy*32n59TGQ?i}XshlZ)6kL@%pYpvIgny|uN!n-jdD zWJrtUfBXDDrk~jUvq-O`K1%-Y-E#;Tk(~M|{sP5HoGo)-T;WpKXbg2^Pufa4-1S}< zM_=uIsis!sJw8@mj00k5OXlw{&K)c%6ga|< zq{r-Q7MN(0VqPK^>xb%wL3e-;J?Gq&fv=G{@`gy>j`qP{fjvXktG4E`jfP-i<7N&> z-CG+7AA?8{^x;TXGz-tIjb>sUcaNic)5^J5Vadq~NBL3o&c# z?jRTdqs&dV62C62NI^`aozzCecwQY5TZ zT7Ii?M3eH>{>hV>MN6_-pc$~2HiYRp@+c!*?h$%3=jILS(+oPiGWcWxTCj73C5qYt z$Wr$)BKB}s_`_@`tin_xW;8>4Lq6~S^zg~A{feOrTN`R;NVnge9vf@AoM~#aE1)oU zJ7F3le*Nb1hs=Y?BG!u>zFDnu6wQIKn6-T5`<)Jy5F(C-g<*mSKNlyek?$26)o-6& z_Wr&vW~ZV}ir$7j@wGA&P&`h%8u7pR7;}m#Fukl1j`?13aCE)a#Ly8ZO6>i>JxN-r zUub-Y{7VBwPSCcC^m}pj8^?6#_mPdw!6dZML4;{F)J*<5 z+Uoqc$Z{25f;cO{Oy;%_F}4+1LR*X+?d@Oo5hwLyf=%^VqbmH4-8Q!UsX5-alXMkSLw z_@n63E?;xKVb7cBlXdZ?yv?PHqX9wt7KF-9LdPCVgbv66aUO z`bbR`7*u&TSDW*@(CGVVuDKWa(c@`_5c&Pq;Fu72`8kWjpC_1Oqp@}xmICpnwZ5@3 zAahKxV4Bx5CE3IAIMi8~=VWO9@f4zxN(DX=N?0|UyqnqZS1T-V~U+-TV@9|Gi-wdY+Cn2iG)F73f zAaQ{B)Mm2zmx^WLBKrs&T{EXot|AEb^JqRn%W%x8|43L`Brjjlm@9+H%XW}ZFl_{S zv?9oS^!0Ijsh1uy8%n*#jG^@HYhulkADbf} z<+9)!Wd5b7Tu|&`5iDSXdVcao>H%?37--Uar5%smX2IVbS*cADyBZ+ok|>H#gW>t+ z*nzO>Hp$Q7;EiG+)ee2h&gvrJ!STws(^bI8!uMUmt+V;+Psm~ zcCIN7uWz9(rc4z4*G%uBs#x6j64V*pehW=Kskihb=-~(WRLOCNIYJd0x#HCw2}V}1 zuj~hp8tZ;>YAWp-%ymu>yUPB@3EpgEwq}!PtZ{hT|G(RO2Dub8(?@-_!$Ayc@|qae z^PWW1?knk5qVukIK|rc#I*nyh3j+C#I4vnad)uu2-{Nuv$m_@6Zm{|q$|BCKbSn26 zaG#hj(mas6_e;Un3{@dx>GTa?#ohMpOyh|TDTk$! z0oSl%FdhO2g&W={a_b+N-9=MPK5C3Y5yMZub2U3a((iOoMKXMAeNTqd4vO2a-O5hN z*ilsUXQhOAclC6;ypzN<@_n}K8@>B#G?f=uCa1*Z=-<8b+6a9)ImjAv`1@|C^@7Um@Lr<8mz8QbGo48b084)IHyg6~hUP_x$DSsr!7JpI?AP{%C!_uuG z;LTKhR>e3h2pRK5#QyK+U?6&z*IvsQxISxCYKGwR+#VMsd-1S>02GiTZ0?jc4=E}I zcM4eCT@;z|tsQDfLrQb{-%VftNy1C=401kXSr#!^^d!m3RRTk<@A%#DhFz%6x0H|i zA)tftII?~-GhXHUMif57J^7{jK2Jb9haD7O9UN)Bx3ii%Z+JZvG1I*)t;%MLQs_*e z9m($F75Oxn?Tg1Bv_yQ~6NB>Kin(+e{dpS=ycyb_&y7v^HZ0nY0yQ-VDe}nb2v1GW|5~y~Z54ymIn*v6OPBITc$mmO0$L6sEmN2*W z36!Ff)bLHnB(roclG`{&)xSlR1A>rrmdTN!I#8xqCI3scxxc6E_-HpufOTEomk22B zs2A&r%9%e&0_d{`I^#_uD#JY%u%>Z7g$lH&eQUiY;LujjF^1 zk9-4#`LWh^|7A&)WyEP)yZn{VM@UsP(A${r!QNIEBet|_Ereakp@iGj=~_+<*QfK0$creNyGY8ch651PoQ#cTVIsBdzBZ?x8auxd3dTOGZ8#vC$U;x`Ugsw%EEE^jVy_!fb25k%^IfI{%)KX@ z{Y}9UB^!Vl`jf+u!s|Hnw+(pFD=6}6u%EEKa2@%Ze*%Hw8vwqyooJ2L`y~>vx2Y!^ zW4qjXsF*_)D3(qwsD=P0Z8F@av(8X3i$!{{SFpM(LW)!3&yxX%TJMfmtn)$rckmRw z%*?(WfRvqWKySgbk_SLhxp!X7^nf30o&rx>`wz%@k94we-47Wf2kd_CE+sGh1ckaY z$|wNMSGn&@C%=#30qfyfXb))I%yYWmJMy;#RP(vT2CynZwS^ELWhEjK7(hV`^R2+% zcp+mGwCb*X%UArGAJL;%q(f=|xRmc6XnOBFV*!20F?KB;wCPTf0!x^^;*&n>_Ccpv z-ah2rMUmpUc>|3{IHdTznY1?iLnP8ZSd4>E%HHx`zSu#K<}`1d33V$y|Dx*=2By) zr%KSuV7H*x_(z6d8NW+rKi-p-{1aELfIq1^nH?1-3bkpPTKS9geb)^$GVY4^QhR)V z20SKZFMCRaD!F#KZ65mX#9amu$Y7H_?rvKCXY=dWU)>j}0}v8R+8 zEsAyIB9ixT-qSIrFhlFkkZ^)V?I@J(*H(@n{+Fp6E)?6FDH6_$7ofS4VAx88t0YNf z@HAIhcFe8_9MVg?h~-zw=pU6%iW(Q-_jCF7GfY8@mWP&F_-($X>7y`QG9^yK-(u&{ z;=<+DNKX6|cXGVjB2W0vUIB&sI!}bW9sykdqcZtX0PUAkNUWqewryg!kx=M*=EzEK zr|26a*7IvXrUPU$8J%t{I&+V0F`+*zMvJ4#V@WDyXZf(BOjD?iew0a>lD+Z?Et5&QGtLkzuOUoX{(0#iy`T3$m+OTaJf|b zX49f_n?H=LbyS-ytp7iv-NZl94zD{ZJo!(wGaZvhwBmHn(t>BtoOvCOWT2g?lzo9* z5lr;|1_zP8v?y^L6m)a8vyGu(GYt zbK|_oNId@1d1tF!)@pn438*onNecZ)%@w{FxX+)S6AL= ztyPvg#I_SgpTsv-mVo)hX9>sITa4@rqmJWk;cV{EO7jibHH*l5bm8*QMXs~nN4J!@ z#csYbsl9UpWmICllc>R9L*|Y2C$mcyl?=zraa(40pnagfqf1xl*t;QEX_q^cta{s@ zN)GAU$0`&_-iaQCruN0^ICg`aq$f~-E>;Gw2?V3y+t>1X=c^3UPbxJ03wM*I(glaA z3^@qFA_IQzz_cHxZr!&$$tOtWhF2O-W{t4y&Zm`_wz7vASvUHqNf40laHlu{LxbT* zCkdn;^0a1UQm+QkuaU*V0)mzdjR~f4LVp=y{Db;$A8bqXc&2#7InS|$7%Td?5s?`t zP&Z*szboX1S4;gd4a3F@HM9Y|c6~IGB86I&)7#Ocg6~-}ac=NxwF|!6GXGEn)-RCM zuszZ`!jj}9WIFt^L;k_+=?W^Xyj<2&?$AP=nGhzE1KJHX##9K3C^_JN%WfG-Qc4A0 z*srb+^zNx#GW;b**r>7NtyHz_ z@4(^0Y&TZBk($FFr(aG#pSR8Kam8l}2uCK^r8>uTwTRC-hkB8#@n;sNEu|NcL4Z_lw#L^$D|$Bz!9Qm&Q|%(Vtt=xil;v@%?mc zHLg9*;-it+KLs>i^Sx~(n$&at!w-{IWRtU_7irRvH9N|~6H6Ey-<4dIC0nrnpH_6D z<;oaN{+6O2Sj^8ko(N9tG`f}!jKHdM&bxmN9oQzeyEVDEXXo%hEO67_167P!+3aa~ z^U)sc^}k09VF~N<*eKB%^Mw&){O-k|b*g6$r47O5K$~-QC`bi?6J1gJtyI?_Hwk@r zCtbsPX64E@T~c8q-DPv9L)o_?#oBaAc__?Q{_h0pxC%f)BtQEvoPRjNM(AA=0aNBk zGdc!&>fB0!I60C^P;EH$YVy7@7=77)Y&7w5E-od5?oXn)BLbNAm73{|d=*dXPopr_ zCv|{BPUUemMPL&ykm#K_IxpV`3iuN*$Ar(}sMqiGA6UB2R@x{a6{$!%lXPi9n84`& zG7zwSnR*{#zVYT&5Su_p#`g7X3yFvG?xC^xe%BV7;a!t)(g8$4%X^oO6e8-1)*EQ$x-N5XvF~ec z$X&9*GE%z7!*>J=JU`hG0%PlUXzpk-oBg=G5$EQO8>$7~an9aBK2|a(Nd3yy5>RN=eOVZyi4ZGXc!eG-GgoFr3IZ#2%;OkJKOR|S^ykEB?*X73jK-_% z_q*Fc^FOG(Sc&cbNY|Ebm94`S9#RPMWK@AYFs5^6m8WDVQ_YMGLF~Kzj1hE%tMv*c z=*bTzlrgrQ9Z%Aa{|mE$5QJ}G_qcD{XHk@cscz9B^(-65jjucW!sq$*E}!44U( zNMhKf0%mD zsHV2CZ5Kp91VKfbQgkCAQYDlSAfPBk1VlEyNe#V*PAHg6x_ttlOWm4fcmIo@;Mf=<`3#`!BU&M->#0^A z(avc(p(-!ieWR&Bp$X#`J7cj*VV!#BbG1b7Oz}>+{BG_sw;HPsiLXlHc;Uy5-QT13 zI~t(N-*y&FEcZxER$h`Ye6&L{tK5(M5!`{(*!z@fwUx8bR9APTKfN@PMyzC|P(+St z;ysd#nrH5P6%<=maRlej;%G%4rwmbSDBSA`a6SZo>ISjy;g!$)0~@;+x`8jZMD#12EXwMao6oZ(zrBUVpM=kGRvj+F+v>n? zSlfm-r{ow0f&zd=vVAs)5UT*w^@*w)W>=la`v5KF_(eHbz$@>Ms-nl-K7h;(#EPH( zh?OPNn@aJ>xp@k>P>gCiC{%GDp~|JLe$cuR%Bj(Ckeh9CRnP5~H&`2OS=al28$ub6 zXRj>wGcKD~>TN+zezOgZAcs#+h2CMU{&hGKX*x1p8cN%S_rH1_L-r1nayXX4<37%U zoN|xDK$9&D*-otp8 zDr1O7O_hNG>0(FbU(cs3ZT?aDI@h((r}rxn=0Z%fo5%4BeD%0ij@E5FHY87H7Vx<~ zM<=L$mE=;0VmD~J!>KLsgrbco!>js}LRw6+Ge)_|tc=`vHOfZHI53tOTL}28)(Bb# zn9TQ@-#o~+j-tCC8f-}n+IV&AEdJK-*^lSb299Og#kZ3=9<~k9PsNjH@@u*gMW&&g zn>{-dDyTi#C+AE=m!0CXxfljM^e2ky}YoOR|N5M_!lo<7vyp!jr) zJz>-vO5`V!1CK3YxCWD^g*tySbE%>eqZ_w=pT=u+odM!HCVbM#iGGx^cy`%T3*O;1Qx^(BC!7BcRVTmQy z>}_>H0BDx}@WEK&_qi&x^gZU`$~36NyNqRbv{Cmt)C0&foZJCGKOIXQ+8&yhKgmG! zdD@@y=R?#pO|I9Hx+}U|Ooiy>wyJFuAAQ!Hdm>>kXz5y>;nK5h$xY(?X@Q*Ggy{1a zJdGL0;BOVT9(GWN8IxowASW@&TXZ3}qf;(K3iEN)zDl1(+)E4tbDQ!r2(ctB9L3XL zOZuoEO=*XGg*6=+ISHxd+*}0QI8_*&ys6DWH=U~x4(vjSn$0Nc7xqznY9^MTTSw@j z6iwEj>E^7`Z3GrpZPEf;I+j>}W2v8Z(+23~p}1|tS|cF9craU?2#FOEccAnsqW0(> z&xx>nzs2%7vx7PRE@5x4^wa*fXPm$W5W+FMIc zCd$Q42op)~Wg672q+ezNw3dvCwA|d*v6F;^<77W2Ar7g@UblkXI=l^Q5s813WoyED zs$%sndUC6y2$V}nz%SB&@*Ejo_cFVIgu0#nx35f!K324EUw&u*ZXrt(5C|kY?0)tP zzTN{CB7lT^o~-THmTvjPdAWkEOhdC3q1791UP=^qDV2B^_t; z@dU$5t{bn9r|?dwNZTO9@H8Sulb{+2+(YJ-e-8t*J#+x)M@&bTb-I$I&)nwW?e zacq8}w_6SOpJzM85;X5UemF==!)C1Tz#jP+ex1Qth8Ub=T5q-wX9n}L#|ICRiNRyv zsmO=)^wd?HZ*7fduc4gX_yx*+ZN5T^@-;XWyLuP?;;>Cz3eOIN9DepzK~2aSSYp zyNyD~9{ArqXvCR4g?alYIu`e~?6v8H=5L*le3jT$shjyV1JC_?1sOJl@qBKVi4!di z>1tfg3MF0Q5Det|Y~B46Rk4Z{BmLLmUi4-Gv!rw*2`4pU*PR2Nq{N8nAa~+6vC8r1 zz#Ovmxw|h8)5)JN`C??qHz=g_xIY+qMW&)|HR)Dcn+9@tYEv_H_05owPBFE$^HVt> z`@G~9mOPPF^jpjym#LfFNbfC4T=a4uwNYc9MfJj8)h#iqC9W)0EnUnY++S&~z%OnQ z!#3hG&C=XS?xzsT=f0<-1Gc^-BLD3SV5k&EZ=ry^{K{rON_lRjA20t!`o8X~H0|uM zy{xAqw?O=d%hX%7?if78sR46HT+hfwjQ!6Urs!I3f}`DS7CAHm8CNFVEB4Y^cr$|J zwT)d-IQ}ZDEAUR|GFjUDX6M_(ciEh8^BdGwH_`ndp3|PhFG|~U(I4V+VjppO^D*G7 z|LUdgBOE_3BKgTk&c#8qkkw-GUCB@;IVbEIm!-w!qBA0SY8_VSuXyWW3Dw8#%}-@j z94TyR(@p}Iy1<(ttREVxUu*9zh91`i3(5^HIJI(;4CZ3hm}_+aA9rFiT-wHR5mo_K zTjdF9WYxDO#xb$wRjO&>X6(j0lNSqd4GFmhZcZd)#U-IZ>E9pW_|(#=8;^ z$#snpfBUwckrz{RRK$g{`xPv5a6ILo|1U$8EZIO~0XAFP7PAghG9Y;>co(cwVrZ1e zcKa{*AxNurLu>g9IW@KLg>_)lN%we5HC<(~QDZ58#c7zy^>2MvheD`AZv4v)7TpMT z0AlN8B)OZbwK;OSx0w6&IkfP~_37Hp0SU&b88tm2UQ?DynOxYc_5+hl$$kbSeOW_w z{0^CjG;b9%abHMcAKf`!E-x}L>u>Mv>~ADKx<1V*%))pN=`m4~pne=?a`}79+jsU} z^T#;x}e4Wn{Px~UL*M#*syKP_G`Zd#WxpN*^QzrJNw8q&(=Ipl(Ck% zcZMC(5Hwm>MIdCRjzh)AE<>I;zSt*)S!NBd-U;NPOsO_H{v7fZ&pN!(Q|7xzFJ%8o za)&}jWHPDpkaQ)<@jvfEA;25^qQKL=PouyeW$Lyz-Y%809Wl(S+4$$8!-oT)_Vm28 zg|PF6(gE>V!n)we2)T!fpwDWusR4AgMUKw8h!T~zJo^Amgb z#RnIffF=}Z*v|?IrH^py5JCaj>PyNak>GeLN%5&yyGV)l+O&((} zzMIgrlg_TmwDDO!U38weWwtgj0Q5_q5I?PMpwp5G`UrPTCGg!o!SPI@EAlt={7>>_ zavd-=|6_$Ovy*FeB+;T6jp58!jdE)AE%Mi-lXazx7VC_Z|B$lJ@+e}o*|saWVk*al zz6gaapQ|+043}IqlAG8m>U~`?a=QBJr`gV5-l+{`dg`s#f54aQQB1LtQ8LDB%hxA$ ziIjWlrS&htqPr0$bX_!&^kz1(ZpIQ-O}C9M22B#^Hm(Xo$FVLxL@6#qbo-s@b8LH! zJ?56&kT?HuBHAY zLrU1#u_uyE(~FFe=m9~5KT5wZlwchH>)JS7;GP-1X2{4{vvBwDueuU_dXBCQ4Mnh3 zle0?~O&AlOseDskNo37&kgzeUB%Hr@^&OMfdZ(fEJUDOWtF%F_y})+707rg$(%3P! zVvebETDJ=Jw&{BmGx#|n)N+a-R#a5*Lr}}5FK|}LYqsy~UYS`sq{e2ra!cKeb4MPb z7WKVmb(g7KL+gfAUWLt5`I4M@`&+vGmm~4LLel-Y(2f??)1f(uGPsZJ=}?*ng&N3_ zq>~kR;o--f*clY}4AF@e#Z%AK+AlpCEzZU6>CbdidecnYnUkRhc!_&3R9C$Yrs%z6 z!5LG>sMwbCBks@ZV9LGQt)B5o{cJG-*G=RVdy~^%;&mGOsWL13m3P*!%x+!70K1<QHvy*=ie=hB`l@-MycV8uG|n@@i~d*BQS|Zolv_?Qaz8tCuJ5Q|?>#u-`X*Ld`UP zXVKNny))~GH&m6^Qs}$yUcZd&NWm-f9tJ{bvxNTq$V0cCj#$gYDzf`&Hm2OMb6h9b z)#Be6m-Y2#!1A-^8HdGsL9fM+%j-GMb`KwPQah2)(k}B*lqE{6KjN!>bS&&)*nE2X z{`}U?sj;7io<7}u%3_WuwH^oF=tRsH6~X3e0#Td9aK5Xju=7qStt;%*)VzP-|S2_Vhf_(@msGMP8nE?vvlwitnz8$C%_y8cjGbhvpqrV*X#mrJI^U z%jg0pBzot8xA>1G@Yc17r^hi^|AS>hxsw{PvumpSzYtfef0nH+GlND z9%bJ6k!q3_S>W7gi*uPi7uE8BkJBnITFQrFvw;q5$wh*swTbCwZd;bJ-zdsWE`%SN z7{r9KMXNSIyIvLCyw>>`V5M5_R@tcNPrAZK>tNGIQ{F>&A4$iI(QojI3t@XNqz3!N z${&E8 z&6!^3Q(3+i z3TbRH61#6Q@@O~W6j{ALIi=tC$`-;}#B#{U9>-ihck(hdfqsF|@+u-ev4j5>UhYt5 zsy=?#cNU!VSLn({b6_+1lOR04J>*bmjG-}C=k&7g7yt1;9BlQ-cuHB^pC`3E_gLbK zjH^Bno(Fpj_|FxX%-=SOBNq@o+)DCMT!4ws>;-Qu%sg!+(*1Db&)CM4|35`2-6fDug{g%PuX=ouU^i6wZR|0pzV^-P z^D$EZcFs%K>8JY|k(Zeu&8Xf=V(00oKX3S(T8862`v^-H)%NXvI~Pbg7PlkML6GzA zznBTQ(zoZ9mJ;t;a?5S1+>mD`M>yl!#0EkmnM&f!c|$x~ciFIST&&%99Xz|f$8#iT zxV9y~D9?!#O8TJ0en<;_%|{l!b+#T=xO`npJvca!n{@p-iHv6w7(1*uyE__S5pP@07-&3U|X^cP`xq3PZ8nnQ#`8GS=c|gPqDTjFsq)B z?{*>9tP;FY4=@HMbzk}X4Igg?do>G_=2Cp6Z?|gR=?<%i(iURoROp&VYLq6upDvmK%hs0;*PO?tYKt4BtNI@61$GJ<|LgD%N({Lev@QUZsxw| zH%B1ZwIf(}O{S=^K@%lP2A%O*F9Y9&QkUH_?5j+dSWma3yp`sZDAc+OQeCP;jATlW z^ryj!r1cz2C@+=tC|$Xh!Uu^vZNnD>T$!hZuY=9he>f}HM2lm(O|e`zWwEb ze~afF?5~Ww2~QH=9c}QE%}V4rtTHGanqf%-y=3v+bij?}q*%V7VB0>_+C>P`vAOh@ z*`3=q%NlX$aZFH`#yJ{Skyj#kEY63e*NpP_8yHhzR+EW~yJ`WGk?F?GH)I$gU-*ip ze4qs@cOW0RUcMcA3A$XdoK zepbhKf`h_F0MQZ)E<2^(87Ly?N_}F~<44{<5YVH0OK<^vEAV7}?D* z!^BSFY#=?$T$xvUkbwexz*%U(i(i5=YuR~?7X^FqC5wA!^4Cp50RY&MvDKico*JMT z=>2u%>>*14&fnNGPlW~NkJj*cw!PuLX*Zn&wV|A_e2is@RWnv0f&*t{ystz`;}Ul_ zxS~>c%8rsPC9U*^f#?Yp(rBVb%1y3KPhE1PypyUL}3d?i>Tvb zQQQ&y$cid{WHQlEsdk()>X!#B+^gvz4YJBp_mLS_Mx^xAaKLekuQGX5ud#D1BI*!n zpA4MUWAAt*OKNp0=%J8>;RM4>P8@ppVnS4YKtOPkYl+*$yNo3Xx>$74n?DmLy2Uj* z@e;6Yajx3@ezGYO1`6{=#)g+Ix?e?%aS< zP5rU$|EW_y*HK98Alz2=e(YgJCgJ<}6u`&Qi;7(n6lGy7!Vsc)p7gA&hr&O4_?HXQACY1q%){=+L)e) z*i1(9iv2W`zO$!CjOeaJLskA7kvACh~>Un9&ZuHlX(OEZ5B9!wDCs z;=TD5c3BuIWfVg7f1;AJqh8{kkURYCC6as|tCgAm(aAhctz3K@T+@z)RUH)3Mrep6 z+N>B>KAKM)wl1S$QH;0T3Xf!!boF8xSA@@1P?fO&6xqGs>b1_@8MPeL2?_31iX)&x zMu4_Mf3tRLc54$6PoB`SVHIvacF~U-(9>g8RM;*?3cpaOwWrA+OSF~qTPaNYbLW3q z0FUR^gC{G6tPXW+x$jVv=$eBq{*z3RBHotZ-6;QjSO5}K=WU0tX0d)!PoTQv?;_0ujf18cdkB z#5lEBsG8hG1Lgbm!=zs1+cVvVRT_IG=3i@J)Pdzzozf?>=9Ve#dRW!Zd8u->R!ZJo zS;(eL5szHDa}kRc?f~ymjq4Fa-^CoaVZJer-G{dkIOFRkoG0BM_u7~xR`yc#-06Fz z=1rsJpeviEgcyhKt-OrWQ;!JkRh~#~s`BuZ+(f@#3(1t8R{?rFs(SGWSvFBACi>`% zQxWwzZ8-YXZm)ZfCAjxsM{H93cyTBRJ+WG%r?%`ibfF4bi}eST9F?Bg^l-^oiW8Gt ztGvtf5=9Rz5z^w@qJslxIY~sc>ZYgtgol9Yk^h9NsMlDfUJK=P(n|1_6jKh^W9@S({MXm~VAeDZmK#puPv`^gVHYWI1J5|esAq~TM~GgOk! z}j+ zfLyCC(&t}(n7EJ^i+=Ov;p89LpTqXOE-PJlW)-v9kEe+Sj(mgsUm-nda?*1b35E6I zw;utm!WE=WlC#Z>rsh!Hs|*$6TasnI4thOZ2o$l27RfaD28u9 z-8&);!y@JqQ_(eWkKjtxC1_G9pd}?=%4b-5_-JT>Wv0my4k1W`<9z=+kTWOk;V!$5 zlMyaEO)T@49c>(Ftn)QO+4P8w#wD8TV2!%Pjx1XC8l^C(&5%ux?TS;R%q@$9aj>)RlkM$ZM0Y? zd(`*@c!~Y};}^}BR#N}dbO6L^6fWbtIplX5Z`G1kor)L1oP*1Fg+_;4QtDHzE*irZ za*+5ZBdzCPOlTwfOUIB=;nI{cyd7QKC}m@9?-RjAXVX+03Dk7B(2%psLZ@iv5qRBd zE-%114Fd?b1IU~bnTS>C8Eef{KUhjx#J6irzS)F$B8SReiO8K71njvTbBz-f9GDPgNZ35z}f4;<>ixznlGKUM7#!vQ4eX6ZN0mliD0&Q zz%I2=)6?1;gfy-2(!Zy-;7q<;vNFdhi0&jyr1 z1V?D`)7JrNd%J_l&~|dPPH=d0`KT9MCC>*IRKk!Ti4(W=A>E44k&s5&AN>Tj^J zP`DS9G1QbflKsyDZ_{yVQE(mg?yC2R)BZuN#BmM+gEJ`eR*@v`7!S(RfggoLO`GOv z=BbtX4(s2`?zA4=A*WtuDRLNj;n}kq8Jq?U6e!Hl9c`W?%41SkU8almjObX!HM<9r zT6DcFM(2-4WXlYptLGJ!5RGDsd0orN$IjiR@uvKyccgAE-HKw~E9w)m#pC1fD(y-8 zC@tkQv*Snx@mi&Iry3gh*eMB+sP<_%^SBn}a>quk?Eu8t$sYDl`W55c7l(!EefQ%B z*BQZ_s(e1KQF?rSpi)jEV>C$KeJ6_iiZ&wh_HywwhoI@~!+eC3dK5j(lVXI6A zck_v-;st-JKT!)EiCyRcSt+xdsDM-@YmcA>p8KXUJhGk5zA~4QiLK_{^1k4-(f&yx zeQwIIDC5XM07r+_8Gev2z$F||61ysW!N#xFGh9@znzYTuM!~xNFXT^7=HWg*idz-C z&`ZCMPxZSan{J1e>8zf7e-msJm3W#Hw_TrSKT*cA`PuL8k^bZeG;$MUn7Z%Z@8;`I zo2V9Im+w}8Na>5jVw8Sy21VWmJp{IJ5#QXV9$ba{{I%QXFO1p2Q3bRQvq@*zLP#h= zxKt9SM&R;iI5LM2rj?s+;euIPQ+-z9I#0|2;#*3vjABIPKfU2AvvDxzU)R4c7>iWR z8f&T6%`QawoN5y=NT|79?OrZopf}5dRwUyAWsJzlEUmo?l;rdsE1vaw>*;j2k;=<} z>kn{|XW;)$ z^HL#oNdtUx4Ccj2m|k|hJMqr7u^MhfpVGofq zCj}PPm!l`wqi$rbd8h3i5~EZ=-DHXER;L&zdt+p{2v8TU{?#W5`Mrsqzw9#V`B3{B zhnjY%Z`47|S4myMr3v+o;=}*m=%20GD6A67C1;hkcfk&(4(?YuY6P<`(MT*d=9y@2 zDn8C#N0cV_8nJQ263Kipy;LN=QG<>F|yz6?)-&UY1VaZE&ZgA-kxX;k;|=jw$knYyE?53#SiB8W0sfSzt^CGM9 zQ$cBfWfjtC#0SPoK@}2IQSqkpXPgF~j!x&d1Oejm(PN2oW`K62cY01Re-snJAffYh z{OO4L588MBUmf1%9j&7Mpi;r3Qts=7rVfPKMuSJH)_K?` z#57=jX5aLgNw$STRc6_ikavS^d}UJdA?XbNhKp(Q#9)$jAJo`+O6!=9!J{EV^>^oS zqP9>wK5@v}EajZuyQOu+?%n6xTvzYwkMjR#g!n&q81z54I>3x-1GrvOnbis_w&oJ* zO*NhvwwrMJ(s({1hHMEC$tDZM8J`kN$O--4$%i?pK zh*8L!#7pTDlsU_W&y*#uQf=~(tEHXeGKT5v$FPCylzjPf?-`nluuZ-Q=vv(*s~~JO zCk-QgqY0E|{TXHcEG^)tpZmn#|Bhi^`wzF6osAo5OkQWnhCdSOIe$e25^6UbAa)0m zXK#f+XrDI5cwH$aADjG-J3U zd7K{IG=$j~Ac9&nBzbCi)9#~doP9%S9@W}60&784_huVRpPMP^*7#`Iv(z@1a=RE+ z_*r^;4-dLGR+Us7&k!*~e}aOrR*PpYsA^psb5vxrM`pnFw-s+4W`Wv7P4$c?3yDU$ z@Sj?*v>%mxPY~FhE)8=SQxp0x|4uAVngxAfPn80JDi0hSB2UYKvv>r9b^98e?_BV+Ag@s}x7T1QAFGmA^gulpK zEFwf;^Y~OJS0ai*@vy3{^o7|N?g@uNm2w>SUotZmEg~Jb=U?`W{La8BhVu+&^vvG! zoXN@FqLF1es5Vn2Th~rZ)eiL+A$N<#zcWnEZPzx}@?GZ`x2JJ4s~zbD{tY|aWjwZElTkm^w2e1R zW^!lj;C~)wBokFNS?WG=iE|au+UPA43+z=%_JA*-T!8l_IynRvv9U-_6z369ELq^y zA^g>am+o}G66N_^aFX#vX+rj4>b|MSJv<-+KL}k|XC=;i*Zto}vr-g7R!^l9n37?#2=76vXSeT%Y!G|Wtx4OzXc-QVLrj#^Q5cC;-AiHLP8Uuz{A4wps-@HO;SO0uRGrqdQShmuUik_F7i4mtfM9rH zP8&=U94s)z*j)Z%q`l!!I&4JGlsQH79x#kaNPtfE(ppR@dMO^*yGeu`mK6COG@Q1$ z?v{A|s}ITWRyfB)zzhbZ8LUNLH+xU4ss_23Ojvs|k88}wksP6wrO1zUT;|o1NBn&5 z+Fwn1PxkMv56=rz>__*w7FoEKw5lSvVZe>t+=C2^-zHCSrFqlpNh>vMj@|(2zKDGuM27H`b~%1; zOtY3s*5K!8Y{Ighbde)i4ZV^>ln`828r)6?W92RqZT3f7`N5!V*3pN31cHL~O(aB; z{icc3(Z{E!s|)TnFr)_P>iu}TEltNe=1wMsPUK+I?#+ge+a6I^jGDky%8Dr z*W&>@YNXUmV27qn&~|9i9D!RjE4_=eYVa30G=+o?RLGU ze{!DU2TZripAii6%e;mk!9Sn|8|o}}Sm$VD4fQWY99x{|kk{Z&RE>-ufn#r8txV>6 zb-8Y`rt>?l+U@&g>XuTgbmz-GFVoYzUZL1}*V=tTj&j`2hStL1kvcdh^K{?l-YGxK zpl37%kiS!2vJIt9cq@+Xy{&U> zyV~*Xcuul&mu#kdw{Nk*t%!9>%=PgI8?}E(_5ybIf2V-6`~k0Yc*L=m7BN3Cs$bdr9Uv6>XKuoUaOjC+?kcRHMk)A7UYv{X7CEqe5Q2TH5xk7 z?51pt4I8;t9$?YMQdq@aoP}Qhxf}F~^ZjV}EUws7fk+hD5b+o|6W#>QJReb-dqVM> zv+pj*TEuwkwuln2t3@jOZnz4}w4O+0x)_wf9y$8iqiS4He{e^cvKrzJ%a1trlHWb( zAun<_j&vAH?Dm!%l|Hif-tI;*AT7PNqP&)WoGw;T4+7L>pN!i5!773b%^2O zTB|^$B6rVcJ$^zF7vo|TxIdD<&3ReLWb$%7+YJP!QG9jq^T@vT9bq&{>Y$zv#F+Mn zRN*oo?k}j_A0FjQ|K@}X=<^1f5RLrExVN-LcA$O!rjZGf-~%3= z9F^9r`$<2Y=%P)@TlAxXU}bKf6tYQhhm{Cyzi|YGT2!`_g64H}`u67NLz>2l_$4fp zTCH4;>_DpxI^Wo0ob)lsp#X#ZV1%_)gDx*a#z}C^3!2ZIirv})760&sgj!-s*~Z~r z+U{kKeA9pimQzb?5EkMXbk9ea#%9ln%-7@F12-M9hqlPb8Dv`eJx@wLwJ(;cJX-OMTq-7=Hqjes)m6eY>@qLHMUY6o1I|+N!o;t%g7US=| zY-G3TZikA+WS*AH^>mOaoZAplY5JKHj1lwSyQKUDqO--qMBAxB@MAV}fecyUNvSKt zP&cFT&|{dQP|&m0*gVlABR~nGkigH&aS{)*D>d+WJjqGzJ7j(E10d3jQF*kN_ObM+BEG5YpT{OgcoHF(~K6n#O&)^E^j zn+0uyt%KsC>Wt%L!SxNXE2DF<42Y|$BoEzIgL)F^*Np(Jaq-?J61t3v0_SQbDr>Tu zhPYkEabV)K0n#mFPj6@d9z$oYtK>`}E{@v!lupPN*lfMnn{{=X)8V=uCf~b7G93NjEJ8T0!=@frRhEHhD8M9GxotThIG0=p1}idF|`; z&ytfrPGXQKmK*r}F3h~Cx-#+}YP@!Gt#%-Xi|3TYGj5BSCw!lz&4d3;;${;WUsQ_t zb4kQf6p_3iMdI;jPuGmeg^h{L;T4}PwCx--P!05)vqx=GmU2U^*LXL zde&K&YU8 za*E0TGS9IrV7W$9Xno+hy-`E<3?mJr)kTVzSbh$RB+=Lz{s7a7Q5Yg8LFanS0t5#% z@jX6s$WOqg&E$v?`G2_o_{WKb;vre>Ia5Te{B-5mwR1SE{JBDyXVW?xim+Q&CbGA? zTXfy8xXHU+cfmtv@tQl_YHM6&TaXw9F`xGi&M630lTnxa)lHSOTBO)H zTIEX5-RXN0$A~r>DD_rN*}TYk9YE9^jB3G|FPWXT=u$+4{qflx0#4q827g?5B68OV zE@w`85oLa88TM4%#%Wl6PRfk@cy!*$BPX_*|7p@epF3MqS!eHq5=K1ttG%0Dv@hvV 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