From f7f1017fedb4293fb435ddd7d8b30bad6ec248ad Mon Sep 17 00:00:00 2001 From: Robin Mueller Date: Sat, 11 Nov 2023 19:05:46 +0100 Subject: [PATCH 01/38] continue CFDP handlers --- satrs-core/Cargo.toml | 6 +- satrs-core/src/cfdp/dest.rs | 209 +++++++++++++++++++++++++----------- satrs-core/src/cfdp/mod.rs | 96 +++++++++++++++-- 3 files changed, 235 insertions(+), 76 deletions(-) diff --git a/satrs-core/Cargo.toml b/satrs-core/Cargo.toml index 6fa8535..65ee5e7 100644 --- a/satrs-core/Cargo.toml +++ b/satrs-core/Cargo.toml @@ -73,11 +73,11 @@ features = ["all"] optional = true [dependencies.spacepackets] -version = "0.7.0-beta.2" +# version = "0.7.0-beta.2" default-features = false -# git = "https://egit.irs.uni-stuttgart.de/rust/spacepackets.git" +git = "https://egit.irs.uni-stuttgart.de/rust/spacepackets.git" # rev = "79d26e1a6" -# branch = "" +branch = "writable_pdu_packet" [dependencies.cobs] git = "https://github.com/robamu/cobs.rs.git" diff --git a/satrs-core/src/cfdp/dest.rs b/satrs-core/src/cfdp/dest.rs index b66365a..f54d22c 100644 --- a/satrs-core/src/cfdp/dest.rs +++ b/satrs-core/src/cfdp/dest.rs @@ -9,8 +9,10 @@ use crate::cfdp::user::TransactionFinishedParams; use super::{ user::{CfdpUser, MetadataReceivedParams}, - PacketInfo, PacketTarget, State, TransactionId, TransactionStep, CRC_32, + CheckTimerCreator, PacketInfo, PacketTarget, RemoteEntityConfigProvider, State, TransactionId, + TransactionStep, CRC_32, }; +use alloc::boxed::Box; use smallvec::SmallVec; use spacepackets::{ cfdp::{ @@ -19,10 +21,10 @@ use spacepackets::{ file_data::FileDataPdu, finished::{DeliveryCode, FileStatus, FinishedPdu}, metadata::{MetadataGenericParams, MetadataPdu}, - CommonPduConfig, FileDirectiveType, PduError, PduHeader, + CommonPduConfig, FileDirectiveType, PduError, PduHeader, WritablePduPacket, }, tlv::{msg_to_user::MsgToUserTlv, EntityIdTlv, TlvType}, - ConditionCode, PduType, TransmissionMode, + ConditionCode, PduType, }, util::UnsignedByteField, }; @@ -34,6 +36,8 @@ pub struct DestinationHandler { state: State, tparams: TransactionParams, packets_to_send_ctx: PacketsToSendContext, + remote_cfg_table: Box, + check_timer_creator: Box, } #[derive(Debug, Default)] @@ -152,25 +156,38 @@ pub enum DestError { } impl DestinationHandler { - pub fn new(id: impl Into) -> Self { + pub fn new( + entity_id: impl Into, + remote_cfg_table: Box, + check_timer_creator: Box, + ) -> Self { Self { - id: id.into(), + id: entity_id.into(), step: TransactionStep::Idle, state: State::Idle, tparams: Default::default(), packets_to_send_ctx: Default::default(), + remote_cfg_table, + check_timer_creator, } } - pub fn state_machine(&mut self, cfdp_user: &mut impl CfdpUser) -> Result<(), DestError> { + pub fn state_machine( + &mut self, + cfdp_user: &mut impl CfdpUser, + packet_to_insert: Option<&PacketInfo>, + ) -> Result<(), DestError> { + if let Some(packet) = packet_to_insert { + self.insert_packet(packet)?; + } match self.state { State::Idle => todo!(), - State::BusyClass1Nacked => self.fsm_nacked(cfdp_user), - State::BusyClass2Acked => todo!("acknowledged mode not implemented yet"), + State::Busy => self.fsm_busy(cfdp_user), + State::Suspended => todo!(), } } - pub fn insert_packet(&mut self, packet_info: &PacketInfo) -> Result<(), DestError> { + fn insert_packet(&mut self, packet_info: &PacketInfo) -> Result<(), DestError> { if packet_info.target() != PacketTarget::DestEntity { // Unwrap is okay here, a PacketInfo for a file data PDU should always have the // destination as the target. @@ -297,11 +314,7 @@ impl DestinationHandler { } } } - if self.tparams.pdu_conf.trans_mode == TransmissionMode::Unacknowledged { - self.state = State::BusyClass1Nacked; - } else { - self.state = State::BusyClass2Acked; - } + self.state = State::Busy; self.step = TransactionStep::TransactionStart; Ok(()) } @@ -338,7 +351,7 @@ impl DestinationHandler { // TODO: Check progress, and implement transfer completion timer as specified in the // standard. This timer protects against out of order arrival of packets. if self.tparams.tstate.progress != self.tparams.file_size() {} - if self.state == State::BusyClass1Nacked { + if self.state == State::Busy { self.step = TransactionStep::TransferCompletion; } else { self.step = TransactionStep::SendingAckPdu; @@ -367,7 +380,7 @@ impl DestinationHandler { Ok(false) } - fn fsm_nacked(&mut self, cfdp_user: &mut impl CfdpUser) -> Result<(), DestError> { + fn fsm_busy(&mut self, cfdp_user: &mut impl CfdpUser) -> Result<(), DestError> { if self.step == TransactionStep::TransactionStart { self.transaction_start(cfdp_user)?; } @@ -496,7 +509,10 @@ impl DestinationHandler { #[cfg(test)] mod tests { - use core::sync::atomic::{AtomicU8, Ordering}; + use core::{ + cell::Cell, + sync::atomic::{AtomicU8, Ordering}, + }; #[allow(unused_imports)] use std::println; use std::{env::temp_dir, fs}; @@ -504,10 +520,14 @@ mod tests { use alloc::{format, string::String}; use rand::Rng; use spacepackets::{ - cfdp::{lv::Lv, ChecksumType}, + cfdp::{lv::Lv, pdu::WritablePduPacket, ChecksumType, TransmissionMode}, util::{UbfU16, UnsignedByteFieldU16}, }; + use crate::cfdp::{ + CheckTimer, CheckTimerCreator, RemoteEntityConfig, StdRemoteEntityConfigProvider, + }; + use super::*; const LOCAL_ID: UnsignedByteFieldU16 = UnsignedByteFieldU16::new(1); @@ -608,6 +628,63 @@ mod tests { } } + struct TestCheckTimer { + counter: Cell, + expiry_count: u32, + } + + impl CheckTimer for TestCheckTimer { + fn has_expired(&self) -> bool { + let current_counter = self.counter.get(); + if self.expiry_count == current_counter { + return true; + } + self.counter.set(current_counter + 1); + false + } + } + + impl TestCheckTimer { + pub fn new(expiry_after_x_calls: u32) -> Self { + Self { + counter: Cell::new(0), + expiry_count: expiry_after_x_calls, + } + } + } + + struct TestCheckTimerCreator { + expiry_counter_for_source_entity: u32, + expiry_counter_for_dest_entity: u32, + } + + impl TestCheckTimerCreator { + pub fn new( + expiry_counter_for_source_entity: u32, + expiry_counter_for_dest_entity: u32, + ) -> Self { + Self { + expiry_counter_for_source_entity, + expiry_counter_for_dest_entity, + } + } + } + + impl CheckTimerCreator for TestCheckTimerCreator { + fn get_check_timer_provider( + &self, + _local_id: &UnsignedByteField, + _remote_id: &UnsignedByteField, + entity_type: crate::cfdp::EntityType, + ) -> Box { + if entity_type == crate::cfdp::EntityType::Sending { + Box::new(TestCheckTimer::new(self.expiry_counter_for_source_entity)) + } else { + Box::new(TestCheckTimer::new(self.expiry_counter_for_dest_entity)) + } + } + } + fn init_check(handler: &DestinationHandler) { assert_eq!(handler.state(), State::Idle); assert_eq!(handler.step(), TransactionStep::Idle); @@ -626,9 +703,31 @@ mod tests { (src_path, file_path) } + fn basic_remote_cfg_table() -> StdRemoteEntityConfigProvider { + let mut table = StdRemoteEntityConfigProvider::default(); + let remote_entity_cfg = RemoteEntityConfig::new_with_default_values( + UnsignedByteFieldU16::new(1).into(), + 1024, + 1024, + true, + true, + TransmissionMode::Unacknowledged, + ChecksumType::Crc32, + ); + table.add_config(&remote_entity_cfg); + table + } + + fn default_dest_handler() -> DestinationHandler { + DestinationHandler::new( + REMOTE_ID, + Box::new(basic_remote_cfg_table()), + Box::new(TestCheckTimerCreator::new(2, 2)), + ) + } #[test] fn test_basic() { - let dest_handler = DestinationHandler::new(REMOTE_ID); + let dest_handler = default_dest_handler(); init_check(&dest_handler); } @@ -655,37 +754,20 @@ mod tests { ) } - fn insert_metadata_pdu( - metadata_pdu: &MetadataPdu, - buf: &mut [u8], - dest_handler: &mut DestinationHandler, - ) { - let written_len = metadata_pdu + fn create_packet_info<'a>( + pdu: &'a impl WritablePduPacket, + buf: &'a mut [u8], + ) -> PacketInfo<'a> { + let written_len = pdu .write_to_bytes(buf) .expect("writing metadata PDU failed"); - let packet_info = - PacketInfo::new(&buf[..written_len]).expect("generating packet info failed"); - let insert_result = dest_handler.insert_packet(&packet_info); - if let Err(e) = insert_result { - panic!("insert result error: {e}"); - } + PacketInfo::new(&buf[..written_len]).expect("generating packet info failed") } - - fn insert_eof_pdu( - file_data: &[u8], - pdu_header: &PduHeader, - buf: &mut [u8], - dest_handler: &mut DestinationHandler, - ) { + fn create_no_error_eof(file_data: &[u8], pdu_header: &PduHeader, buf: &mut [u8]) -> EofPdu { let mut digest = CRC_32.digest(); digest.update(file_data); let crc32 = digest.finalize(); - let eof_pdu = EofPdu::new_no_error(*pdu_header, crc32, file_data.len() as u64); - let result = eof_pdu.write_to_bytes(buf); - assert!(result.is_ok()); - let packet_info = PacketInfo::new(&buf).expect("generating packet info failed"); - let result = dest_handler.insert_packet(&packet_info); - assert!(result.is_ok()); + EofPdu::new_no_error(*pdu_header, crc32, file_data.len() as u64) } #[test] @@ -700,23 +782,24 @@ mod tests { expected_file_size: 0, }; // We treat the destination handler like it is a remote entity. - let mut dest_handler = DestinationHandler::new(REMOTE_ID); + let mut dest_handler = default_dest_handler(); init_check(&dest_handler); let seq_num = UbfU16::new(0); let pdu_header = create_pdu_header(seq_num); let metadata_pdu = create_metadata_pdu(&pdu_header, src_name.as_path(), dest_name.as_path(), 0); - insert_metadata_pdu(&metadata_pdu, &mut buf, &mut dest_handler); - let result = dest_handler.state_machine(&mut test_user); + let packet_info = create_packet_info(&metadata_pdu, &mut buf); + let result = dest_handler.state_machine(&mut test_user, Some(&packet_info)); if let Err(e) = result { panic!("dest handler fsm error: {e}"); } assert_ne!(dest_handler.state(), State::Idle); assert_eq!(dest_handler.step(), TransactionStep::ReceivingFileDataPdus); - insert_eof_pdu(&[], &pdu_header, &mut buf, &mut dest_handler); - let result = dest_handler.state_machine(&mut test_user); + let eof_pdu = create_no_error_eof(&[], &pdu_header, &mut buf); + let packet_info = create_packet_info(&eof_pdu, &mut buf); + let result = dest_handler.state_machine(&mut test_user, Some(&packet_info)); assert!(result.is_ok()); assert_eq!(dest_handler.state(), State::Idle); assert_eq!(dest_handler.step(), TransactionStep::Idle); @@ -740,7 +823,7 @@ mod tests { expected_file_size: file_data.len(), }; // We treat the destination handler like it is a remote entity. - let mut dest_handler = DestinationHandler::new(REMOTE_ID); + let mut dest_handler = default_dest_handler(); init_check(&dest_handler); let seq_num = UbfU16::new(0); @@ -751,8 +834,8 @@ mod tests { dest_name.as_path(), file_data.len() as u64, ); - insert_metadata_pdu(&metadata_pdu, &mut buf, &mut dest_handler); - let result = dest_handler.state_machine(&mut test_user); + let packet_info = create_packet_info(&metadata_pdu, &mut buf); + let result = dest_handler.state_machine(&mut test_user, Some(&packet_info)); if let Err(e) = result { panic!("dest handler fsm error: {e}"); } @@ -769,11 +852,12 @@ mod tests { if let Err(e) = result { panic!("destination handler packet insertion error: {e}"); } - let result = dest_handler.state_machine(&mut test_user); + let result = dest_handler.state_machine(&mut test_user, Some(&packet_info)); assert!(result.is_ok()); - insert_eof_pdu(file_data, &pdu_header, &mut buf, &mut dest_handler); - let result = dest_handler.state_machine(&mut test_user); + let eof_pdu = create_no_error_eof(&file_data, &pdu_header, &mut buf); + let packet_info = create_packet_info(&eof_pdu, &mut buf); + let result = dest_handler.state_machine(&mut test_user, Some(&packet_info)); assert!(result.is_ok()); assert_eq!(dest_handler.state(), State::Idle); assert_eq!(dest_handler.step(), TransactionStep::Idle); @@ -800,7 +884,7 @@ mod tests { }; // We treat the destination handler like it is a remote entity. - let mut dest_handler = DestinationHandler::new(REMOTE_ID); + let mut dest_handler = default_dest_handler(); init_check(&dest_handler); let seq_num = UbfU16::new(0); @@ -811,8 +895,8 @@ mod tests { dest_name.as_path(), random_data.len() as u64, ); - insert_metadata_pdu(&metadata_pdu, &mut buf, &mut dest_handler); - let result = dest_handler.state_machine(&mut test_user); + let packet_info = create_packet_info(&metadata_pdu, &mut buf); + let result = dest_handler.state_machine(&mut test_user, Some(&packet_info)); if let Err(e) = result { panic!("dest handler fsm error: {e}"); } @@ -835,7 +919,7 @@ mod tests { if let Err(e) = result { panic!("destination handler packet insertion error: {e}"); } - let result = dest_handler.state_machine(&mut test_user); + let result = dest_handler.state_machine(&mut test_user, Some(&packet_info)); assert!(result.is_ok()); // Second file data PDU @@ -853,11 +937,12 @@ mod tests { if let Err(e) = result { panic!("destination handler packet insertion error: {e}"); } - let result = dest_handler.state_machine(&mut test_user); + let result = dest_handler.state_machine(&mut test_user, Some(&packet_info)); assert!(result.is_ok()); - insert_eof_pdu(&random_data, &pdu_header, &mut buf, &mut dest_handler); - let result = dest_handler.state_machine(&mut test_user); + let eof_pdu = create_no_error_eof(&random_data, &pdu_header, &mut buf); + let packet_info = create_packet_info(&eof_pdu, &mut buf); + let result = dest_handler.state_machine(&mut test_user, Some(&packet_info)); assert!(result.is_ok()); assert_eq!(dest_handler.state(), State::Idle); assert_eq!(dest_handler.step(), TransactionStep::Idle); diff --git a/satrs-core/src/cfdp/mod.rs b/satrs-core/src/cfdp/mod.rs index dc6e87a..58edbff 100644 --- a/satrs-core/src/cfdp/mod.rs +++ b/satrs-core/src/cfdp/mod.rs @@ -1,4 +1,7 @@ +use core::hash::Hash; + use crc::{Crc, CRC_32_CKSUM}; +use hashbrown::HashMap; use spacepackets::{ cfdp::{ pdu::{FileDirectiveType, PduError, PduHeader}, @@ -35,7 +38,7 @@ pub enum EntityType { /// For the receiving entity, this timer determines the expiry period for incrementing a check /// counter after an EOF PDU is received for an incomplete file transfer. This allows out-of-order /// reception of file data PDUs and EOF PDUs. Also see 4.6.3.3 of the CFDP standard. -pub trait CheckTimerProvider { +pub trait CheckTimer { fn has_expired(&self) -> bool; } @@ -50,10 +53,11 @@ pub trait CheckTimerProvider { #[cfg(feature = "alloc")] pub trait CheckTimerCreator { fn get_check_timer_provider( + &self, local_id: &UnsignedByteField, remote_id: &UnsignedByteField, entity_type: EntityType, - ) -> Box; + ) -> Box; } /// Simple implementation of the [CheckTimerProvider] trait assuming a standard runtime. @@ -75,7 +79,7 @@ impl StdCheckTimer { } #[cfg(feature = "std")] -impl CheckTimerProvider for StdCheckTimer { +impl CheckTimer for StdCheckTimer { fn has_expired(&self) -> bool { let elapsed_time = self.start_time.elapsed(); if elapsed_time.as_secs() > self.expiry_time_seconds { @@ -85,22 +89,78 @@ impl CheckTimerProvider for StdCheckTimer { } } -#[derive(Debug)] +#[derive(Debug, Copy, Clone)] pub struct RemoteEntityConfig { pub entity_id: UnsignedByteField, pub max_file_segment_len: usize, - pub closure_requeted_by_default: bool, + pub max_packet_len: usize, + pub closure_requested_by_default: bool, pub crc_on_transmission_by_default: bool, pub default_transmission_mode: TransmissionMode, pub default_crc_type: ChecksumType, pub check_limit: u32, } -pub trait RemoteEntityConfigProvider { - fn get_remote_config(&self, remote_id: &UnsignedByteField) -> Option<&RemoteEntityConfig>; +impl RemoteEntityConfig { + pub fn new_with_default_values( + entity_id: UnsignedByteField, + max_file_segment_len: usize, + max_packet_len: usize, + closure_requested_by_default: bool, + crc_on_transmission_by_default: bool, + default_transmission_mode: TransmissionMode, + default_crc_type: ChecksumType, + ) -> Self { + Self { + entity_id, + max_file_segment_len, + max_packet_len, + closure_requested_by_default, + crc_on_transmission_by_default, + default_transmission_mode, + default_crc_type, + check_limit: 2, + } + } } -#[derive(Debug, PartialEq, Eq, Copy, Clone)] +pub trait RemoteEntityConfigProvider { + /// Retrieve the remote entity configuration for the given remote ID. + fn get_remote_config(&self, remote_id: u64) -> Option<&RemoteEntityConfig>; + fn get_remote_config_mut(&mut self, remote_id: u64) -> Option<&mut RemoteEntityConfig>; + /// Add a new remote configuration. Return [True] if the configuration was + /// inserted successfully, and [False] if a configuration already exists. + fn add_config(&mut self, cfg: &RemoteEntityConfig) -> bool; + /// Remote a configuration. Returns [True] if the configuration was removed successfully, + /// and [False] if no configuration exists for the given remote ID. + fn remove_config(&mut self, remote_id: u64) -> bool; +} + +#[cfg(feature = "std")] +#[derive(Default)] +pub struct StdRemoteEntityConfigProvider { + remote_cfg_table: HashMap, +} + +#[cfg(feature = "std")] +impl RemoteEntityConfigProvider for StdRemoteEntityConfigProvider { + fn get_remote_config(&self, remote_id: u64) -> Option<&RemoteEntityConfig> { + self.remote_cfg_table.get(&remote_id) + } + fn get_remote_config_mut(&mut self, remote_id: u64) -> Option<&mut RemoteEntityConfig> { + self.remote_cfg_table.get_mut(&remote_id) + } + fn add_config(&mut self, cfg: &RemoteEntityConfig) -> bool { + self.remote_cfg_table + .insert(cfg.entity_id.value(), *cfg) + .is_some() + } + fn remove_config(&mut self, remote_id: u64) -> bool { + self.remote_cfg_table.remove(&remote_id).is_some() + } +} + +#[derive(Debug, Eq, Copy, Clone)] #[cfg_attr(feature = "serde", derive(Serialize, Deserialize))] pub struct TransactionId { source_id: UnsignedByteField, @@ -121,6 +181,20 @@ impl TransactionId { } } +impl Hash for TransactionId { + fn hash(&self, state: &mut H) { + self.source_id.value().hash(state); + self.seq_num.value().hash(state); + } +} + +impl PartialEq for TransactionId { + fn eq(&self, other: &Self) -> bool { + self.source_id.value() == other.source_id.value() + && self.seq_num.value() == other.seq_num.value() + } +} + #[derive(Debug, Copy, Clone, PartialEq, Eq)] #[cfg_attr(feature = "serde", derive(Serialize, Deserialize))] pub enum TransactionStep { @@ -136,8 +210,8 @@ pub enum TransactionStep { #[cfg_attr(feature = "serde", derive(Serialize, Deserialize))] pub enum State { Idle = 0, - BusyClass1Nacked = 2, - BusyClass2Acked = 3, + Busy = 1, + Suspended = 2, } pub const CRC_32: Crc = Crc::::new(&CRC_32_CKSUM); @@ -249,7 +323,7 @@ mod tests { eof::EofPdu, file_data::FileDataPdu, metadata::{MetadataGenericParams, MetadataPdu}, - CommonPduConfig, FileDirectiveType, PduHeader, + CommonPduConfig, FileDirectiveType, PduHeader, WritablePduPacket, }, PduType, }; From 274ae654cd5eaa7710d1bd6e6a6e614d494c520a Mon Sep 17 00:00:00 2001 From: Robin Mueller Date: Fri, 24 Nov 2023 15:02:22 +0100 Subject: [PATCH 02/38] add new filesystem abstractions --- satrs-core/Cargo.toml | 4 +- satrs-core/src/cfdp/dest.rs | 6 +- satrs-core/src/cfdp/filestore.rs | 257 +++++++++++++++++++++++++++++++ satrs-core/src/cfdp/mod.rs | 1 + 4 files changed, 263 insertions(+), 5 deletions(-) create mode 100644 satrs-core/src/cfdp/filestore.rs diff --git a/satrs-core/Cargo.toml b/satrs-core/Cargo.toml index 65ee5e7..2b6d78c 100644 --- a/satrs-core/Cargo.toml +++ b/satrs-core/Cargo.toml @@ -76,8 +76,7 @@ optional = true # version = "0.7.0-beta.2" default-features = false git = "https://egit.irs.uni-stuttgart.de/rust/spacepackets.git" -# rev = "79d26e1a6" -branch = "writable_pdu_packet" +rev = "9e74266b768df80fd4118b04c4cc997aba8c85b9" [dependencies.cobs] git = "https://github.com/robamu/cobs.rs.git" @@ -91,6 +90,7 @@ zerocopy = "0.7" once_cell = "1.13" serde_json = "1" rand = "0.8" +tempfile = "3" [dev-dependencies.postcard] version = "1" diff --git a/satrs-core/src/cfdp/dest.rs b/satrs-core/src/cfdp/dest.rs index f54d22c..5cbc745 100644 --- a/satrs-core/src/cfdp/dest.rs +++ b/satrs-core/src/cfdp/dest.rs @@ -771,7 +771,7 @@ mod tests { } #[test] - fn test_empty_file_transfer() { + fn test_empty_file_transfer_not_acked() { let (src_name, dest_name) = init_full_filenames(); assert!(!Path::exists(&dest_name)); let mut buf: [u8; 512] = [0; 512]; @@ -810,7 +810,7 @@ mod tests { } #[test] - fn test_small_file_transfer() { + fn test_small_file_transfer_not_acked() { let (src_name, dest_name) = init_full_filenames(); assert!(!Path::exists(&dest_name)); let file_data_str = "Hello World!"; @@ -869,7 +869,7 @@ mod tests { } #[test] - fn test_segmented_file_transfer() { + fn test_segmented_file_transfer_not_acked() { let (src_name, dest_name) = init_full_filenames(); assert!(!Path::exists(&dest_name)); let mut rng = rand::thread_rng(); diff --git a/satrs-core/src/cfdp/filestore.rs b/satrs-core/src/cfdp/filestore.rs new file mode 100644 index 0000000..5b03594 --- /dev/null +++ b/satrs-core/src/cfdp/filestore.rs @@ -0,0 +1,257 @@ +use alloc::string::{String, ToString}; +use crc::{Crc, CRC_32_CKSUM}; +use spacepackets::cfdp::ChecksumType; +use spacepackets::ByteConversionError; +#[cfg(feature = "std")] +pub use stdmod::*; + +pub const CRC_32: Crc = Crc::::new(&CRC_32_CKSUM); + +pub enum FilestoreError { + FileDoesNotExist, + FileAlreadyExists, + DirDoesNotExist, + Permission, + IsNotFile, + IsNotDirectory, + ByteConversion(ByteConversionError), + Io { + raw_errno: Option, + string: String, + }, + ChecksumTypeNotImplemented(ChecksumType), +} + +impl From for FilestoreError { + fn from(value: ByteConversionError) -> Self { + Self::ByteConversion(value) + } +} + +#[cfg(feature = "std")] +impl From for FilestoreError { + fn from(value: std::io::Error) -> Self { + Self::Io { + raw_errno: value.raw_os_error(), + string: value.to_string(), + } + } +} + +pub trait VirtualFilestore { + fn create_file(&self, file_path: &str) -> Result<(), FilestoreError>; + + fn remove_file(&self, file_path: &str) -> Result<(), FilestoreError>; + + /// Truncating a file means deleting all its data so the resulting file is empty. + /// This can be more efficient than removing and re-creating a file. + fn truncate_file(&self, file_path: &str) -> Result<(), FilestoreError>; + + fn remove_dir(&self, file_path: &str, all: bool) -> Result<(), FilestoreError>; + + fn read_data( + &self, + file_path: &str, + offset: u64, + read_len: u64, + buf: &mut [u8], + ) -> Result<(), FilestoreError>; + + fn write_data(&self, file: &str, offset: u64, buf: &[u8]) -> Result<(), FilestoreError>; + + fn filename_from_full_path<'a>(&self, path: &'a str) -> Option<&'a str>; + + fn is_file(&self, path: &str) -> bool; + + fn is_dir(&self, path: &str) -> bool { + !self.is_file(path) + } + + fn exists(&self, path: &str) -> bool; + + /// This special function is the CFDP specific abstraction to verify the checksum of a file. + /// This allows to keep OS specific details like reading the whole file in the most efficient + /// manner inside the file system abstraction. + fn checksum_verify( + &self, + file_path: &str, + checksum_type: ChecksumType, + expected_checksum: u32, + verification_buf: &mut [u8], + ) -> Result; +} + +#[cfg(feature = "std")] +pub mod stdmod { + use super::*; + use std::{ + fs::{self, File, OpenOptions}, + io::{BufReader, Read, Seek, SeekFrom, Write}, + path::Path, + }; + + pub struct NativeFilestore {} + + impl VirtualFilestore for NativeFilestore { + fn create_file(&self, file_path: &str) -> Result<(), FilestoreError> { + if self.exists(file_path) { + return Err(FilestoreError::FileAlreadyExists); + } + File::create(file_path)?; + Ok(()) + } + + fn remove_file(&self, file_path: &str) -> Result<(), FilestoreError> { + if !self.exists(file_path) { + return Ok(()); + } + if !self.is_file(file_path) { + return Err(FilestoreError::IsNotFile); + } + fs::remove_file(file_path)?; + Ok(()) + } + + fn truncate_file(&self, file_path: &str) -> Result<(), FilestoreError> { + if !self.exists(file_path) { + return Ok(()); + } + if !self.is_file(file_path) { + return Err(FilestoreError::IsNotFile); + } + OpenOptions::new() + .write(true) + .truncate(true) + .open(file_path)?; + Ok(()) + } + + fn remove_dir(&self, dir_path: &str, all: bool) -> Result<(), FilestoreError> { + if !self.exists(dir_path) { + return Err(FilestoreError::DirDoesNotExist); + } + if !self.is_dir(dir_path) { + return Err(FilestoreError::IsNotDirectory); + } + if !all { + fs::remove_dir(dir_path)?; + return Ok(()); + } + fs::remove_dir_all(dir_path)?; + Ok(()) + } + + fn read_data( + &self, + file_name: &str, + offset: u64, + read_len: u64, + buf: &mut [u8], + ) -> Result<(), FilestoreError> { + if buf.len() < read_len as usize { + return Err(ByteConversionError::ToSliceTooSmall { + found: buf.len(), + expected: read_len as usize, + } + .into()); + } + if !self.exists(file_name) { + return Err(FilestoreError::FileDoesNotExist); + } + if !self.is_file(file_name) { + return Err(FilestoreError::IsNotFile); + } + let mut file = File::open(file_name)?; + file.seek(SeekFrom::Start(offset))?; + file.read_exact(&mut buf[0..read_len as usize])?; + Ok(()) + } + + fn write_data(&self, file: &str, offset: u64, buf: &[u8]) -> Result<(), FilestoreError> { + if !self.exists(file) { + return Err(FilestoreError::FileDoesNotExist); + } + if !self.is_file(file) { + return Err(FilestoreError::IsNotFile); + } + let mut file = File::open(file)?; + file.seek(SeekFrom::Start(offset))?; + file.write_all(buf)?; + Ok(()) + } + + fn filename_from_full_path<'a>(&self, path: &'a str) -> Option<&'a str> { + // Convert the path string to a Path + let path = Path::new(path); + + // Extract the file name using the file_name() method + path.file_name().and_then(|name| name.to_str()) + } + + fn is_file(&self, path: &str) -> bool { + let path = Path::new(path); + path.is_file() + } + + fn is_dir(&self, path: &str) -> bool { + let path = Path::new(path); + path.is_dir() + } + + fn exists(&self, path: &str) -> bool { + let path = Path::new(path); + if !path.exists() { + return false; + } + true + } + + fn checksum_verify( + &self, + file_path: &str, + checksum_type: ChecksumType, + expected_checksum: u32, + verification_buf: &mut [u8], + ) -> Result { + match checksum_type { + ChecksumType::Modular => { + todo!(); + } + ChecksumType::Crc32 => { + let mut digest = CRC_32.digest(); + let file_to_check = File::open(file_path)?; + let mut buf_reader = BufReader::new(file_to_check); + loop { + let bytes_read = buf_reader.read(verification_buf)?; + if bytes_read == 0 { + break; + } + digest.update(&verification_buf[0..bytes_read]); + } + if digest.finalize() == expected_checksum { + return Ok(true); + } + Ok(false) + } + ChecksumType::NullChecksum => Ok(true), + _ => Err(FilestoreError::ChecksumTypeNotImplemented(checksum_type)), + } + } + } +} + +#[cfg(test)] +mod tests { + use super::*; + use tempfile::tempdir; + + #[test] + fn test_basic_native_filestore() { + let tmpdir = tempdir().expect("creating tmpdir failed"); + let file_path = tmpdir.path().join("test.txt"); + let native_filestore = NativeFilestore {}; + let result = + native_filestore.create_file(file_path.to_str().expect("getting str for file failed")); + assert!(result.is_ok()); + } +} diff --git a/satrs-core/src/cfdp/mod.rs b/satrs-core/src/cfdp/mod.rs index 58edbff..f99712e 100644 --- a/satrs-core/src/cfdp/mod.rs +++ b/satrs-core/src/cfdp/mod.rs @@ -17,6 +17,7 @@ use serde::{Deserialize, Serialize}; #[cfg(feature = "std")] pub mod dest; +pub mod filestore; #[cfg(feature = "std")] pub mod source; pub mod user; From da8858eae098fb5e217e998b6bab9f08c8b4b4da Mon Sep 17 00:00:00 2001 From: Robin Mueller Date: Fri, 24 Nov 2023 15:47:03 +0100 Subject: [PATCH 03/38] well this is annoying.. --- satrs-core/src/cfdp/filestore.rs | 120 +++++++++++++++++++++++++++++-- 1 file changed, 116 insertions(+), 4 deletions(-) diff --git a/satrs-core/src/cfdp/filestore.rs b/satrs-core/src/cfdp/filestore.rs index 5b03594..97bcba4 100644 --- a/satrs-core/src/cfdp/filestore.rs +++ b/satrs-core/src/cfdp/filestore.rs @@ -1,12 +1,16 @@ use alloc::string::{String, ToString}; +use core::fmt::Display; use crc::{Crc, CRC_32_CKSUM}; use spacepackets::cfdp::ChecksumType; use spacepackets::ByteConversionError; #[cfg(feature = "std")] +use std::error::Error; +#[cfg(feature = "std")] pub use stdmod::*; pub const CRC_32: Crc = Crc::::new(&CRC_32_CKSUM); +#[derive(Debug, Clone)] pub enum FilestoreError { FileDoesNotExist, FileAlreadyExists, @@ -28,6 +32,53 @@ impl From for FilestoreError { } } +impl Display for FilestoreError { + fn fmt(&self, f: &mut core::fmt::Formatter<'_>) -> core::fmt::Result { + match self { + FilestoreError::FileDoesNotExist => { + write!(f, "file does not exist") + } + FilestoreError::FileAlreadyExists => { + write!(f, "file already exists") + } + FilestoreError::DirDoesNotExist => { + write!(f, "directory does not exist") + } + FilestoreError::Permission => { + write!(f, "permission error") + } + FilestoreError::IsNotFile => { + write!(f, "is not a file") + } + FilestoreError::IsNotDirectory => { + write!(f, "is not a directory") + } + FilestoreError::ByteConversion(e) => { + write!(f, "filestore error: {e}") + } + FilestoreError::Io { raw_errno, string } => { + write!( + f, + "filestore generic IO error with raw errno {:?}: {}", + raw_errno, string + ) + } + FilestoreError::ChecksumTypeNotImplemented(checksum_type) => { + write!(f, "checksum {:?} not implemented", checksum_type) + } + } + } +} + +impl Error for FilestoreError { + fn source(&self) -> Option<&(dyn Error + 'static)> { + match self { + FilestoreError::ByteConversion(e) => Some(e), + _ => None, + } + } +} + #[cfg(feature = "std")] impl From for FilestoreError { fn from(value: std::io::Error) -> Self { @@ -174,7 +225,7 @@ pub mod stdmod { if !self.is_file(file) { return Err(FilestoreError::IsNotFile); } - let mut file = File::open(file)?; + let mut file = OpenOptions::new().write(true).open(file)?; file.seek(SeekFrom::Start(offset))?; file.write_all(buf)?; Ok(()) @@ -242,16 +293,77 @@ pub mod stdmod { #[cfg(test)] mod tests { + use std::{fs, path::Path, println}; + use super::*; use tempfile::tempdir; + const NATIVE_FS: NativeFilestore = NativeFilestore {}; + #[test] - fn test_basic_native_filestore() { + fn test_basic_native_filestore_create() { let tmpdir = tempdir().expect("creating tmpdir failed"); let file_path = tmpdir.path().join("test.txt"); - let native_filestore = NativeFilestore {}; let result = - native_filestore.create_file(file_path.to_str().expect("getting str for file failed")); + NATIVE_FS.create_file(file_path.to_str().expect("getting str for file failed")); assert!(result.is_ok()); + let path = Path::new(&file_path); + assert!(path.exists()); + assert!(NATIVE_FS.exists(file_path.to_str().unwrap())); + assert!(NATIVE_FS.is_file(file_path.to_str().unwrap())); + fs::remove_dir_all(tmpdir).expect("clearing tmpdir failed"); + } + + #[test] + fn test_basic_native_fs_exists() { + let tmpdir = tempdir().expect("creating tmpdir failed"); + let file_path = tmpdir.path().join("test.txt"); + assert!(!NATIVE_FS.exists(file_path.to_str().unwrap())); + NATIVE_FS + .create_file(file_path.to_str().expect("getting str for file failed")) + .unwrap(); + assert!(NATIVE_FS.exists(file_path.to_str().unwrap())); + assert!(NATIVE_FS.is_file(file_path.to_str().unwrap())); + fs::remove_dir_all(tmpdir).expect("clearing tmpdir failed"); + } + + #[test] + fn test_basic_native_fs_write() { + let tmpdir = tempdir().expect("creating tmpdir failed"); + let file_path = tmpdir.path().join("test.txt"); + assert!(!NATIVE_FS.exists(file_path.to_str().unwrap())); + NATIVE_FS + .create_file(file_path.to_str().expect("getting str for file failed")) + .unwrap(); + assert!(NATIVE_FS.exists(file_path.to_str().unwrap())); + assert!(NATIVE_FS.is_file(file_path.to_str().unwrap())); + println!("{}", file_path.to_str().unwrap()); + let write_data = "hello world\n"; + NATIVE_FS + .write_data(file_path.to_str().unwrap(), 0, write_data.as_bytes()) + .expect("writing to file failed"); + let read_back = fs::read_to_string(file_path).expect("reading back data failed"); + assert_eq!(read_back, write_data); + fs::remove_dir_all(tmpdir).expect("clearing tmpdir failed"); + } + + #[test] + fn test_basic_native_fs_read() { + let tmpdir = tempdir().expect("creating tmpdir failed"); + let file_path = tmpdir.path().join("test.txt"); + assert!(!NATIVE_FS.exists(file_path.to_str().unwrap())); + NATIVE_FS + .create_file(file_path.to_str().expect("getting str for file failed")) + .unwrap(); + assert!(NATIVE_FS.exists(file_path.to_str().unwrap())); + assert!(NATIVE_FS.is_file(file_path.to_str().unwrap())); + println!("{}", file_path.to_str().unwrap()); + let write_data = "hello world\n"; + NATIVE_FS + .write_data(file_path.to_str().unwrap(), 0, write_data.as_bytes()) + .expect("writing to file failed"); + let read_back = fs::read_to_string(file_path).expect("reading back data failed"); + assert_eq!(read_back, write_data); + fs::remove_dir_all(tmpdir).expect("clearing tmpdir failed"); } } From f6d2cfa042d880240242cc4d4af473f9ae1ed024 Mon Sep 17 00:00:00 2001 From: Robin Mueller Date: Wed, 6 Dec 2023 18:20:29 +0100 Subject: [PATCH 04/38] let's try the new spacepackets version --- satrs-core/Cargo.toml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/satrs-core/Cargo.toml b/satrs-core/Cargo.toml index 2b6d78c..a3391fb 100644 --- a/satrs-core/Cargo.toml +++ b/satrs-core/Cargo.toml @@ -76,7 +76,7 @@ optional = true # version = "0.7.0-beta.2" default-features = false git = "https://egit.irs.uni-stuttgart.de/rust/spacepackets.git" -rev = "9e74266b768df80fd4118b04c4cc997aba8c85b9" +rev = "47a93354952834eea435f8ec6c561af4750a2068" [dependencies.cobs] git = "https://github.com/robamu/cobs.rs.git" From 0b81198c0311f918475c79c3ad66b836c4119c54 Mon Sep 17 00:00:00 2001 From: Robin Mueller Date: Wed, 6 Dec 2023 19:59:27 +0100 Subject: [PATCH 05/38] that will be a lot of API changes --- satrs-core/src/pus/verification.rs | 4 ++-- satrs-core/src/tmtc/tm_helper.rs | 10 +++++----- 2 files changed, 7 insertions(+), 7 deletions(-) diff --git a/satrs-core/src/pus/verification.rs b/satrs-core/src/pus/verification.rs index 47c2689..52606e8 100644 --- a/satrs-core/src/pus/verification.rs +++ b/satrs-core/src/pus/verification.rs @@ -87,7 +87,7 @@ use delegate::delegate; use serde::{Deserialize, Serialize}; use spacepackets::ecss::tc::IsPusTelecommand; use spacepackets::ecss::tm::{PusTmCreator, PusTmSecondaryHeader}; -use spacepackets::ecss::{EcssEnumeration, PusError, SerializablePusPacket}; +use spacepackets::ecss::{EcssEnumeration, PusError, WritablePusPacket}; use spacepackets::{CcsdsPacket, PacketId, PacketSequenceCtrl}; use spacepackets::{SpHeader, MAX_APID}; @@ -353,7 +353,7 @@ impl<'src_data, State, SuccessOrFailure> VerificationSendable<'src_data, State, } pub fn len_packed(&self) -> usize { - self.pus_tm.as_ref().unwrap().len_packed() + self.pus_tm.as_ref().unwrap().len_written() } pub fn pus_tm(&self) -> &PusTmCreator<'src_data> { diff --git a/satrs-core/src/tmtc/tm_helper.rs b/satrs-core/src/tmtc/tm_helper.rs index 06ba532..6dca7ee 100644 --- a/satrs-core/src/tmtc/tm_helper.rs +++ b/satrs-core/src/tmtc/tm_helper.rs @@ -11,7 +11,7 @@ pub mod std_mod { use crate::pool::{ShareablePoolProvider, SharedPool, StoreAddr}; use crate::pus::EcssTmtcError; use spacepackets::ecss::tm::PusTmCreator; - use spacepackets::ecss::SerializablePusPacket; + use spacepackets::ecss::WritablePusPacket; use std::sync::{Arc, RwLock}; #[derive(Clone)] @@ -32,7 +32,7 @@ pub mod std_mod { pub fn add_pus_tm(&self, pus_tm: &PusTmCreator) -> Result { let mut pg = self.pool.write().map_err(|_| EcssTmtcError::StoreLock)?; - let (addr, buf) = pg.free_element(pus_tm.len_packed())?; + let (addr, buf) = pg.free_element(pus_tm.len_written())?; pus_tm .write_to_bytes(buf) .expect("writing PUS TM to store failed"); @@ -59,7 +59,7 @@ impl PusTmWithCdsShortHelper { &'a mut self, service: u8, subservice: u8, - source_data: Option<&'a [u8]>, + source_data: &'a [u8], seq_count: u16, ) -> PusTmCreator { let time_stamp = TimeProvider::from_now_with_u16_days().unwrap(); @@ -71,7 +71,7 @@ impl PusTmWithCdsShortHelper { &'a mut self, service: u8, subservice: u8, - source_data: Option<&'a [u8]>, + source_data: &'a [u8], stamper: &TimeProvider, seq_count: u16, ) -> PusTmCreator { @@ -83,7 +83,7 @@ impl PusTmWithCdsShortHelper { &'a self, service: u8, subservice: u8, - source_data: Option<&'a [u8]>, + source_data: &'a [u8], seq_count: u16, ) -> PusTmCreator { let mut reply_header = SpHeader::tm_unseg(self.apid, seq_count, 0).unwrap(); From 774d9b5961dafca2e6fc1a0d2550d7098db7307e Mon Sep 17 00:00:00 2001 From: Robin Mueller Date: Thu, 7 Dec 2023 13:29:26 +0100 Subject: [PATCH 06/38] bumped spacepackets --- satrs-core/src/cfdp/dest.rs | 23 +++++++++---------- satrs-core/src/cfdp/mod.rs | 4 ++-- satrs-core/src/encoding/ccsds.rs | 2 +- .../src/hal/std/tcp_spacepackets_server.rs | 2 +- satrs-core/src/hal/std/udp_server.rs | 4 ++-- satrs-core/src/pus/event.rs | 2 +- satrs-core/src/pus/scheduler.rs | 2 +- satrs-core/src/pus/test.rs | 4 ++-- satrs-core/src/pus/verification.rs | 2 +- satrs-core/src/tmtc/ccsds_distrib.rs | 21 +++++++++-------- satrs-core/src/tmtc/pus_distrib.rs | 2 +- satrs-core/tests/hk_helpers.rs | 10 ++++---- satrs-core/tests/tcp_servers.rs | 2 +- 13 files changed, 40 insertions(+), 40 deletions(-) diff --git a/satrs-core/src/cfdp/dest.rs b/satrs-core/src/cfdp/dest.rs index 5cbc745..0ecdf70 100644 --- a/satrs-core/src/cfdp/dest.rs +++ b/satrs-core/src/cfdp/dest.rs @@ -19,11 +19,11 @@ use spacepackets::{ pdu::{ eof::EofPdu, file_data::FileDataPdu, - finished::{DeliveryCode, FileStatus, FinishedPdu}, - metadata::{MetadataGenericParams, MetadataPdu}, - CommonPduConfig, FileDirectiveType, PduError, PduHeader, WritablePduPacket, + finished::{DeliveryCode, FileStatus, FinishedPduCreator}, + metadata::{MetadataGenericParams, MetadataPduReader}, + CommonPduConfig, FileDirectiveType, PduError, PduHeader, WritablePduPacket, CfdpPdu, }, - tlv::{msg_to_user::MsgToUserTlv, EntityIdTlv, TlvType}, + tlv::{msg_to_user::MsgToUserTlv, EntityIdTlv, TlvType, GenericTlv}, ConditionCode, PduType, }, util::UnsignedByteField, @@ -227,7 +227,7 @@ impl DestinationHandler { let finished_pdu = if self.tparams.tstate.condition_code == ConditionCode::NoError || self.tparams.tstate.condition_code == ConditionCode::UnsupportedChecksumType { - FinishedPdu::new_default( + FinishedPduCreator::new_default( pdu_header, self.tparams.tstate.delivery_code, self.tparams.tstate.file_status, @@ -235,7 +235,7 @@ impl DestinationHandler { } else { // TODO: Are there cases where this ID is actually the source entity ID? let entity_id = EntityIdTlv::new(self.id); - FinishedPdu::new_with_error( + FinishedPduCreator::new_with_error( pdu_header, self.tparams.tstate.condition_code, self.tparams.tstate.delivery_code, @@ -283,7 +283,7 @@ impl DestinationHandler { if self.state != State::Idle { return Err(DestError::RecvdMetadataButIsBusy); } - let metadata_pdu = MetadataPdu::from_bytes(raw_packet)?; + let metadata_pdu = MetadataPduReader::from_bytes(raw_packet)?; self.tparams.reset(); self.tparams.tstate.metadata_params = *metadata_pdu.metadata_params(); let src_name = metadata_pdu.src_file_name(); @@ -302,7 +302,7 @@ impl DestinationHandler { self.tparams.file_properties.dest_file_name_len = dest_name.len_value(); self.tparams.pdu_conf = *metadata_pdu.pdu_header().common_pdu_conf(); self.tparams.msgs_to_user_size = 0; - if metadata_pdu.options().is_some() { + if !metadata_pdu.options().is_empty() { for option_tlv in metadata_pdu.options_iter().unwrap() { if option_tlv.is_standard_tlv() && option_tlv.tlv_type().unwrap() == TlvType::MsgToUser @@ -520,7 +520,7 @@ mod tests { use alloc::{format, string::String}; use rand::Rng; use spacepackets::{ - cfdp::{lv::Lv, pdu::WritablePduPacket, ChecksumType, TransmissionMode}, + cfdp::{lv::Lv, pdu::{WritablePduPacket, metadata::MetadataPduCreator}, ChecksumType, TransmissionMode}, util::{UbfU16, UnsignedByteFieldU16}, }; @@ -743,14 +743,13 @@ mod tests { src_name: &'filename Path, dest_name: &'filename Path, file_size: u64, - ) -> MetadataPdu<'filename, 'filename, 'static> { + ) -> MetadataPduCreator<'filename, 'filename, 'static> { let metadata_params = MetadataGenericParams::new(false, ChecksumType::Crc32, file_size); - MetadataPdu::new( + MetadataPduCreator::new_no_opts( *pdu_header, metadata_params, Lv::new_from_str(src_name.as_os_str().to_str().unwrap()).unwrap(), Lv::new_from_str(dest_name.as_os_str().to_str().unwrap()).unwrap(), - None, ) } diff --git a/satrs-core/src/cfdp/mod.rs b/satrs-core/src/cfdp/mod.rs index f99712e..a40c1ee 100644 --- a/satrs-core/src/cfdp/mod.rs +++ b/satrs-core/src/cfdp/mod.rs @@ -323,7 +323,7 @@ mod tests { pdu::{ eof::EofPdu, file_data::FileDataPdu, - metadata::{MetadataGenericParams, MetadataPdu}, + metadata::{MetadataGenericParams, MetadataPduCreator}, CommonPduConfig, FileDirectiveType, PduHeader, WritablePduPacket, }, PduType, @@ -347,7 +347,7 @@ mod tests { let dest_file_name = "hello-dest.txt"; let src_lv = Lv::new_from_str(src_file_name).unwrap(); let dest_lv = Lv::new_from_str(dest_file_name).unwrap(); - let metadata_pdu = MetadataPdu::new(pdu_header, metadata_params, src_lv, dest_lv, None); + let metadata_pdu = MetadataPduCreator::new_no_opts(pdu_header, metadata_params, src_lv, dest_lv); metadata_pdu .write_to_bytes(&mut buf) .expect("writing metadata PDU failed"); diff --git a/satrs-core/src/encoding/ccsds.rs b/satrs-core/src/encoding/ccsds.rs index ecd4ff5..37694d7 100644 --- a/satrs-core/src/encoding/ccsds.rs +++ b/satrs-core/src/encoding/ccsds.rs @@ -113,7 +113,7 @@ pub fn parse_buffer_for_ccsds_space_packets( #[cfg(test)] mod tests { use spacepackets::{ - ecss::{tc::PusTcCreator, SerializablePusPacket}, + ecss::{tc::PusTcCreator, WritablePusPacket}, PacketId, SpHeader, }; diff --git a/satrs-core/src/hal/std/tcp_spacepackets_server.rs b/satrs-core/src/hal/std/tcp_spacepackets_server.rs index c124a47..6ade0d1 100644 --- a/satrs-core/src/hal/std/tcp_spacepackets_server.rs +++ b/satrs-core/src/hal/std/tcp_spacepackets_server.rs @@ -173,7 +173,7 @@ mod tests { use alloc::{boxed::Box, sync::Arc}; use hashbrown::HashSet; use spacepackets::{ - ecss::{tc::PusTcCreator, SerializablePusPacket}, + ecss::{tc::PusTcCreator, WritablePusPacket}, PacketId, SpHeader, }; diff --git a/satrs-core/src/hal/std/udp_server.rs b/satrs-core/src/hal/std/udp_server.rs index 28e0328..6f2cb5b 100644 --- a/satrs-core/src/hal/std/udp_server.rs +++ b/satrs-core/src/hal/std/udp_server.rs @@ -19,7 +19,7 @@ use std::vec::Vec; /// /// ``` /// use std::net::{IpAddr, Ipv4Addr, SocketAddr, UdpSocket}; -/// use spacepackets::ecss::SerializablePusPacket; +/// use spacepackets::ecss::WritablePusPacket; /// use satrs_core::hal::std::udp_server::UdpTcServer; /// use satrs_core::tmtc::{ReceivesTc, ReceivesTcCore}; /// use spacepackets::SpHeader; @@ -144,7 +144,7 @@ mod tests { use crate::hal::std::udp_server::{ReceiveResult, UdpTcServer}; use crate::tmtc::ReceivesTcCore; use spacepackets::ecss::tc::PusTcCreator; - use spacepackets::ecss::SerializablePusPacket; + use spacepackets::ecss::WritablePusPacket; use spacepackets::SpHeader; use std::boxed::Box; use std::collections::VecDeque; diff --git a/satrs-core/src/pus/event.rs b/satrs-core/src/pus/event.rs index 165493d..9424b24 100644 --- a/satrs-core/src/pus/event.rs +++ b/satrs-core/src/pus/event.rs @@ -147,7 +147,7 @@ impl EventReporterBase { Ok(PusTmCreator::new( &mut sp_header, sec_header, - Some(&buf[0..current_idx]), + &buf[0..current_idx], true, )) } diff --git a/satrs-core/src/pus/scheduler.rs b/satrs-core/src/pus/scheduler.rs index ce98095..820b1f4 100644 --- a/satrs-core/src/pus/scheduler.rs +++ b/satrs-core/src/pus/scheduler.rs @@ -626,7 +626,7 @@ mod tests { use crate::pool::{LocalPool, PoolCfg, PoolProvider, StoreAddr, StoreError}; use alloc::collections::btree_map::Range; use spacepackets::ecss::tc::{PusTcCreator, PusTcReader, PusTcSecondaryHeader}; - use spacepackets::ecss::SerializablePusPacket; + use spacepackets::ecss::WritablePusPacket; use spacepackets::time::{cds, TimeWriter, UnixTimestamp}; use spacepackets::SpHeader; use std::time::Duration; diff --git a/satrs-core/src/pus/test.rs b/satrs-core/src/pus/test.rs index fd5c05a..fbef28a 100644 --- a/satrs-core/src/pus/test.rs +++ b/satrs-core/src/pus/test.rs @@ -72,7 +72,7 @@ impl PusServiceHandler for PusService17TestHandler { // Sequence count will be handled centrally in TM funnel. let mut reply_header = SpHeader::tm_unseg(self.psb.tm_apid, 0, 0).unwrap(); let tc_header = PusTmSecondaryHeader::new_simple(17, 2, &time_stamp); - let ping_reply = PusTmCreator::new(&mut reply_header, tc_header, None, true); + let ping_reply = PusTmCreator::new(&mut reply_header, tc_header, &[], true); let result = self .psb .tm_sender @@ -118,7 +118,7 @@ mod tests { use crate::tmtc::tm_helper::SharedTmStore; use spacepackets::ecss::tc::{PusTcCreator, PusTcSecondaryHeader}; use spacepackets::ecss::tm::PusTmReader; - use spacepackets::ecss::{PusPacket, SerializablePusPacket}; + use spacepackets::ecss::{PusPacket, WritablePusPacket}; use spacepackets::{SequenceFlags, SpHeader}; use std::boxed::Box; use std::sync::{mpsc, RwLock}; diff --git a/satrs-core/src/pus/verification.rs b/satrs-core/src/pus/verification.rs index 52606e8..cca7566 100644 --- a/satrs-core/src/pus/verification.rs +++ b/satrs-core/src/pus/verification.rs @@ -877,7 +877,7 @@ impl VerificationReporterCore { PusTmCreator::new( sp_header, tm_sec_header, - Some(&src_data_buf[0..source_data_len]), + &src_data_buf[0..source_data_len], true, ) } diff --git a/satrs-core/src/tmtc/ccsds_distrib.rs b/satrs-core/src/tmtc/ccsds_distrib.rs index 58fb8c6..ea9bf30 100644 --- a/satrs-core/src/tmtc/ccsds_distrib.rs +++ b/satrs-core/src/tmtc/ccsds_distrib.rs @@ -21,7 +21,7 @@ //! use satrs_core::tmtc::ccsds_distrib::{CcsdsPacketHandler, CcsdsDistributor}; //! use satrs_core::tmtc::{ReceivesTc, ReceivesTcCore}; //! use spacepackets::{CcsdsPacket, SpHeader}; -//! use spacepackets::ecss::SerializablePusPacket; +//! use spacepackets::ecss::WritablePusPacket; //! use spacepackets::ecss::tc::{PusTc, PusTcCreator}; //! //! #[derive (Default)] @@ -226,7 +226,7 @@ pub(crate) mod tests { use super::*; use crate::tmtc::ccsds_distrib::{CcsdsDistributor, CcsdsPacketHandler}; use spacepackets::ecss::tc::PusTcCreator; - use spacepackets::ecss::SerializablePusPacket; + use spacepackets::ecss::WritablePusPacket; use spacepackets::CcsdsPacket; use std::collections::VecDeque; use std::sync::{Arc, Mutex}; @@ -244,9 +244,10 @@ pub(crate) mod tests { &buf[0..size] } + type SharedPacketQueue = Arc)>>>; pub struct BasicApidHandlerSharedQueue { - pub known_packet_queue: Arc)>>>, - pub unknown_packet_queue: Arc)>>>, + pub known_packet_queue: SharedPacketQueue, + pub unknown_packet_queue: SharedPacketQueue, } #[derive(Default)] @@ -268,11 +269,11 @@ pub(crate) mod tests { ) -> Result<(), Self::Error> { let mut vec = Vec::new(); vec.extend_from_slice(tc_raw); - Ok(self - .known_packet_queue + self.known_packet_queue .lock() .unwrap() - .push_back((sp_header.apid(), vec))) + .push_back((sp_header.apid(), vec)); + Ok(()) } fn handle_unknown_apid( @@ -282,11 +283,11 @@ pub(crate) mod tests { ) -> Result<(), Self::Error> { let mut vec = Vec::new(); vec.extend_from_slice(tc_raw); - Ok(self - .unknown_packet_queue + self.unknown_packet_queue .lock() .unwrap() - .push_back((sp_header.apid(), vec))) + .push_back((sp_header.apid(), vec)); + Ok(()) } } diff --git a/satrs-core/src/tmtc/pus_distrib.rs b/satrs-core/src/tmtc/pus_distrib.rs index a400484..e4eefb1 100644 --- a/satrs-core/src/tmtc/pus_distrib.rs +++ b/satrs-core/src/tmtc/pus_distrib.rs @@ -18,7 +18,7 @@ //! # Example //! //! ```rust -//! use spacepackets::ecss::SerializablePusPacket; +//! use spacepackets::ecss::WritablePusPacket; //! use satrs_core::tmtc::pus_distrib::{PusDistributor, PusServiceProvider}; //! use satrs_core::tmtc::{ReceivesTc, ReceivesTcCore}; //! use spacepackets::SpHeader; diff --git a/satrs-core/tests/hk_helpers.rs b/satrs-core/tests/hk_helpers.rs index 07264ef..9228365 100644 --- a/satrs-core/tests/hk_helpers.rs +++ b/satrs-core/tests/hk_helpers.rs @@ -1,7 +1,7 @@ #![allow(dead_code)] use core::mem::size_of; use serde::{Deserialize, Serialize}; -use spacepackets::ecss::{Ptc, RealPfc, UnsignedPfc}; +use spacepackets::ecss::{Ptc, PfcReal, PfcUnsigned}; use spacepackets::time::cds::TimeProvider; use spacepackets::time::{CcsdsTimeProvider, TimeWriter}; @@ -64,7 +64,7 @@ impl TestMgmHkWithIndividualValidity { curr_idx += 1; buf[curr_idx] = Ptc::Real as u8; curr_idx += 1; - buf[curr_idx] = RealPfc::Float as u8; + buf[curr_idx] = PfcReal::Float as u8; curr_idx += 1; buf[curr_idx..curr_idx + size_of::()].copy_from_slice(&self.temp.val.to_be_bytes()); curr_idx += size_of::(); @@ -75,7 +75,7 @@ impl TestMgmHkWithIndividualValidity { curr_idx += 1; buf[curr_idx] = Ptc::UnsignedInt as u8; curr_idx += 1; - buf[curr_idx] = UnsignedPfc::TwoBytes as u8; + buf[curr_idx] = PfcUnsigned::TwoBytes as u8; curr_idx += 1; buf[curr_idx] = 3; curr_idx += 1; @@ -100,7 +100,7 @@ impl TestMgmHkWithGroupValidity { curr_idx += 1; buf[curr_idx] = Ptc::Real as u8; curr_idx += 1; - buf[curr_idx] = RealPfc::Float as u8; + buf[curr_idx] = PfcReal::Float as u8; curr_idx += 1; buf[curr_idx..curr_idx + size_of::()].copy_from_slice(&self.temp.to_be_bytes()); curr_idx += size_of::(); @@ -109,7 +109,7 @@ impl TestMgmHkWithGroupValidity { curr_idx += 1; buf[curr_idx] = Ptc::UnsignedInt as u8; curr_idx += 1; - buf[curr_idx] = UnsignedPfc::TwoBytes as u8; + buf[curr_idx] = PfcUnsigned::TwoBytes as u8; curr_idx += 1; buf[curr_idx] = 3; for val in self.mgm_vals { diff --git a/satrs-core/tests/tcp_servers.rs b/satrs-core/tests/tcp_servers.rs index 251eead..e5297c3 100644 --- a/satrs-core/tests/tcp_servers.rs +++ b/satrs-core/tests/tcp_servers.rs @@ -28,7 +28,7 @@ use satrs_core::{ tmtc::{ReceivesTcCore, TmPacketSourceCore}, }; use spacepackets::{ - ecss::{tc::PusTcCreator, SerializablePusPacket}, + ecss::{tc::PusTcCreator, WritablePusPacket}, PacketId, SpHeader, }; use std::{boxed::Box, collections::VecDeque, sync::Arc, vec::Vec}; From 51d3c9b6e8a7cbd7e8ff1691fd5f542fd4451185 Mon Sep 17 00:00:00 2001 From: Robin Mueller Date: Thu, 7 Dec 2023 14:05:50 +0100 Subject: [PATCH 07/38] another spacepackets update --- satrs-core/Cargo.toml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/satrs-core/Cargo.toml b/satrs-core/Cargo.toml index a3391fb..66772c0 100644 --- a/satrs-core/Cargo.toml +++ b/satrs-core/Cargo.toml @@ -76,7 +76,7 @@ optional = true # version = "0.7.0-beta.2" default-features = false git = "https://egit.irs.uni-stuttgart.de/rust/spacepackets.git" -rev = "47a93354952834eea435f8ec6c561af4750a2068" +rev = "297cfad22637d3b07a1b27abe56d9a607b5b82a7" [dependencies.cobs] git = "https://github.com/robamu/cobs.rs.git" From c766ab2d710cddf4bdf357c96a66f0f979da1ed9 Mon Sep 17 00:00:00 2001 From: Robin Mueller Date: Wed, 13 Dec 2023 15:15:22 +0100 Subject: [PATCH 08/38] come on, neotest.. --- satrs-core/src/cfdp/dest.rs | 109 ++++++++++++++++++++++++++++--- satrs-core/src/cfdp/filestore.rs | 1 + satrs-core/src/cfdp/mod.rs | 102 ++++++++++++++++++++++++++++- satrs-core/tests/hk_helpers.rs | 2 +- 4 files changed, 201 insertions(+), 13 deletions(-) diff --git a/satrs-core/src/cfdp/dest.rs b/satrs-core/src/cfdp/dest.rs index 0ecdf70..1487467 100644 --- a/satrs-core/src/cfdp/dest.rs +++ b/satrs-core/src/cfdp/dest.rs @@ -8,9 +8,10 @@ use std::{ use crate::cfdp::user::TransactionFinishedParams; use super::{ + filestore::{NativeFilestore, VirtualFilestore}, user::{CfdpUser, MetadataReceivedParams}, - CheckTimerCreator, PacketInfo, PacketTarget, RemoteEntityConfigProvider, State, TransactionId, - TransactionStep, CRC_32, + CheckTimerCreator, DefaultFaultHandler, PacketInfo, PacketTarget, RemoteEntityConfig, + RemoteEntityConfigProvider, State, TransactionId, TransactionStep, CRC_32, }; use alloc::boxed::Box; use smallvec::SmallVec; @@ -21,10 +22,10 @@ use spacepackets::{ file_data::FileDataPdu, finished::{DeliveryCode, FileStatus, FinishedPduCreator}, metadata::{MetadataGenericParams, MetadataPduReader}, - CommonPduConfig, FileDirectiveType, PduError, PduHeader, WritablePduPacket, CfdpPdu, + CfdpPdu, CommonPduConfig, FileDirectiveType, PduError, PduHeader, WritablePduPacket, }, - tlv::{msg_to_user::MsgToUserTlv, EntityIdTlv, TlvType, GenericTlv}, - ConditionCode, PduType, + tlv::{msg_to_user::MsgToUserTlv, EntityIdTlv, GenericTlv, TlvType}, + ConditionCode, FaultHandlerCode, PduType, TransmissionMode, }, util::UnsignedByteField, }; @@ -36,6 +37,8 @@ pub struct DestinationHandler { state: State, tparams: TransactionParams, packets_to_send_ctx: PacketsToSendContext, + vfs: Box, + default_fault_handler: DefaultFaultHandler, remote_cfg_table: Box, check_timer_creator: Box, } @@ -77,6 +80,7 @@ impl Default for TransferState { } } } + #[derive(Debug)] struct TransactionParams { tstate: TransferState, @@ -85,6 +89,13 @@ struct TransactionParams { cksum_buf: [u8; 1024], msgs_to_user_size: usize, msgs_to_user_buf: [u8; 1024], + remote_cfg: Option, +} + +impl TransactionParams { + fn transmission_mode(&self) -> TransmissionMode { + self.pdu_conf.trans_mode + } } impl Default for FileProperties { @@ -118,6 +129,7 @@ impl Default for TransactionParams { msgs_to_user_buf: [0; 1024], tstate: Default::default(), file_properties: Default::default(), + remote_cfg: None, } } } @@ -153,11 +165,15 @@ pub enum DestError { PathConversion(#[from] Utf8Error), #[error("error building dest path from source file name and dest folder")] PathConcatError, + #[error("no remote entity configuration found for {0:?}")] + NoRemoteCfgFound(UnsignedByteField), } impl DestinationHandler { pub fn new( entity_id: impl Into, + vfs: Box, + default_fault_handler: DefaultFaultHandler, remote_cfg_table: Box, check_timer_creator: Box, ) -> Self { @@ -167,6 +183,8 @@ impl DestinationHandler { state: State::Idle, tparams: Default::default(), packets_to_send_ctx: Default::default(), + vfs, + default_fault_handler, remote_cfg_table, check_timer_creator, } @@ -286,6 +304,15 @@ impl DestinationHandler { let metadata_pdu = MetadataPduReader::from_bytes(raw_packet)?; self.tparams.reset(); self.tparams.tstate.metadata_params = *metadata_pdu.metadata_params(); + let remote_cfg = self + .remote_cfg_table + .get_remote_config(metadata_pdu.dest_id().value()); + if remote_cfg.is_none() { + return Err(DestError::NoRemoteCfgFound(metadata_pdu.dest_id())); + } + self.tparams.remote_cfg = Some(*remote_cfg.unwrap()); + + // TODO: Support for metadata only PDUs. let src_name = metadata_pdu.src_file_name(); if src_name.is_empty() { return Err(DestError::EmptySrcFileField); @@ -332,17 +359,24 @@ impl DestinationHandler { Ok(()) } - #[allow(clippy::needless_if)] pub fn handle_eof_pdu(&mut self, raw_packet: &[u8]) -> Result<(), DestError> { if self.state == State::Idle || self.step != TransactionStep::ReceivingFileDataPdus { return Err(DestError::WrongStateForFileDataAndEof); } let eof_pdu = EofPdu::from_bytes(raw_packet)?; - let checksum = eof_pdu.file_checksum(); + if eof_pdu.condition_code() == ConditionCode::NoError { + self.handle_no_error_eof_pdu(&eof_pdu)?; + } else { + todo!("implement cancel request handling"); + } + Ok(()) + } + + fn handle_no_error_eof_pdu(&mut self, eof_pdu: &EofPdu) -> Result<(), DestError> { // For a standard disk based file system, which is assumed to be used for now, the file // will always be retained. This might change in the future. self.tparams.tstate.file_status = FileStatus::Retained; - if self.checksum_check(checksum)? { + if self.checksum_check(eof_pdu.file_checksum())? { self.tparams.tstate.condition_code = ConditionCode::NoError; self.tparams.tstate.delivery_code = DeliveryCode::Complete; } else { @@ -351,7 +385,7 @@ impl DestinationHandler { // TODO: Check progress, and implement transfer completion timer as specified in the // standard. This timer protects against out of order arrival of packets. if self.tparams.tstate.progress != self.tparams.file_size() {} - if self.state == State::Busy { + if self.tparams.transmission_mode() == TransmissionMode::Unacknowledged { self.step = TransactionStep::TransferCompletion; } else { self.step = TransactionStep::SendingAckPdu; @@ -364,6 +398,7 @@ impl DestinationHandler { } fn checksum_check(&mut self, expected_checksum: u32) -> Result { + // TODO: Implement this using the new virtual filestore abstraction. let mut digest = CRC_32.digest(); let file_to_check = File::open(&self.tparams.file_properties.dest_path_buf)?; let mut buf_reader = BufReader::new(file_to_check); @@ -492,6 +527,11 @@ impl DestinationHandler { Ok(()) } + fn declare_fault(&mut self, condition_code: ConditionCode) -> FaultHandlerCode { + todo!("implement this. requires cached fault handler abstraction"); + FaultHandlerCode::IgnoreError + } + fn reset(&mut self) { self.step = TransactionStep::Idle; self.state = State::Idle; @@ -520,12 +560,17 @@ mod tests { use alloc::{format, string::String}; use rand::Rng; use spacepackets::{ - cfdp::{lv::Lv, pdu::{WritablePduPacket, metadata::MetadataPduCreator}, ChecksumType, TransmissionMode}, + cfdp::{ + lv::Lv, + pdu::{metadata::MetadataPduCreator, WritablePduPacket}, + ChecksumType, TransmissionMode, + }, util::{UbfU16, UnsignedByteFieldU16}, }; use crate::cfdp::{ CheckTimer, CheckTimerCreator, RemoteEntityConfig, StdRemoteEntityConfigProvider, + UserFaultHandler, }; use super::*; @@ -553,6 +598,47 @@ mod tests { } } + #[derive(Default)] + struct TestFaultHandler { + notice_of_suspension_count: u32, + notice_of_cancellation_count: u32, + abandoned_count: u32, + ignored_count: u32, + } + + impl UserFaultHandler for TestFaultHandler { + fn notice_of_suspension_cb( + &mut self, + transaction_id: TransactionId, + cond: ConditionCode, + progress: u64, + ) { + self.notice_of_suspension_count += 1; + } + + fn notice_of_cancellation_cb( + &mut self, + transaction_id: TransactionId, + cond: ConditionCode, + progress: u64, + ) { + self.notice_of_cancellation_count += 1; + } + + fn abandoned_cb( + &mut self, + transaction_id: TransactionId, + cond: ConditionCode, + progress: u64, + ) { + self.abandoned_count += 1; + } + + fn ignore_cb(&mut self, transaction_id: TransactionId, cond: ConditionCode, progress: u64) { + self.ignored_count += 1; + } + } + impl CfdpUser for TestCfdpUser { fn transaction_indication(&mut self, id: &crate::cfdp::TransactionId) { self.generic_id_check(id); @@ -719,8 +805,11 @@ mod tests { } fn default_dest_handler() -> DestinationHandler { + let test_fault_handler = TestFaultHandler::default(); DestinationHandler::new( REMOTE_ID, + Box::new(NativeFilestore::default()), + DefaultFaultHandler::new(Box::new(test_fault_handler)), Box::new(basic_remote_cfg_table()), Box::new(TestCheckTimerCreator::new(2, 2)), ) diff --git a/satrs-core/src/cfdp/filestore.rs b/satrs-core/src/cfdp/filestore.rs index 97bcba4..72fdb4e 100644 --- a/satrs-core/src/cfdp/filestore.rs +++ b/satrs-core/src/cfdp/filestore.rs @@ -141,6 +141,7 @@ pub mod stdmod { path::Path, }; + #[derive(Default)] pub struct NativeFilestore {} impl VirtualFilestore for NativeFilestore { diff --git a/satrs-core/src/cfdp/mod.rs b/satrs-core/src/cfdp/mod.rs index a40c1ee..82c6f64 100644 --- a/satrs-core/src/cfdp/mod.rs +++ b/satrs-core/src/cfdp/mod.rs @@ -5,7 +5,7 @@ use hashbrown::HashMap; use spacepackets::{ cfdp::{ pdu::{FileDirectiveType, PduError, PduHeader}, - ChecksumType, PduType, TransmissionMode, + ChecksumType, ConditionCode, FaultHandlerCode, PduType, TransmissionMode, }, util::UnsignedByteField, }; @@ -161,6 +161,103 @@ impl RemoteEntityConfigProvider for StdRemoteEntityConfigProvider { } } +/// This trait introduces some callbacks which will be called when a particular CFDP fault +/// handler is called. This allows to implement some CFDP features like fault handler logging, +/// which would not be possible generically otherwise. +pub trait UserFaultHandler { + fn notice_of_suspension_cb( + &mut self, + transaction_id: TransactionId, + cond: ConditionCode, + progress: u64, + ); + + fn notice_of_cancellation_cb( + &mut self, + transaction_id: TransactionId, + cond: ConditionCode, + progress: u64, + ); + + fn abandoned_cb(&mut self, transaction_id: TransactionId, cond: ConditionCode, progress: u64); + + fn ignore_cb(&mut self, transaction_id: TransactionId, cond: ConditionCode, progress: u64); +} + +pub struct DefaultFaultHandler { + handler_array: [FaultHandlerCode; 10], + user_fault_handler: Box, +} + +impl DefaultFaultHandler { + fn condition_code_to_array_index(conditon_code: ConditionCode) -> Option { + Some(match conditon_code { + ConditionCode::PositiveAckLimitReached => 0, + ConditionCode::KeepAliveLimitReached => 1, + ConditionCode::InvalidTransmissionMode => 2, + ConditionCode::FilestoreRejection => 3, + ConditionCode::FileChecksumFailure => 4, + ConditionCode::FileSizeError => 5, + ConditionCode::NakLimitReached => 6, + ConditionCode::InactivityDetected => 7, + ConditionCode::CheckLimitReached => 8, + ConditionCode::UnsupportedChecksumType => 9, + _ => return None, + }) + } + + pub fn new(user_fault_handler: Box) -> Self { + let mut init_array = [FaultHandlerCode::NoticeOfCancellation; 10]; + init_array + [Self::condition_code_to_array_index(ConditionCode::FileChecksumFailure).unwrap()] = + FaultHandlerCode::IgnoreError; + init_array[Self::condition_code_to_array_index(ConditionCode::UnsupportedChecksumType) + .unwrap()] = FaultHandlerCode::IgnoreError; + Self { + handler_array: init_array, + user_fault_handler, + } + } + + fn report_fault( + &mut self, + transaction_id: TransactionId, + condition: ConditionCode, + progress: u64, + ) -> FaultHandlerCode { + let array_idx = Self::condition_code_to_array_index(condition); + if array_idx.is_none() { + return FaultHandlerCode::IgnoreError; + } + let fh_code = self.handler_array[array_idx.unwrap()]; + match fh_code { + FaultHandlerCode::NoticeOfCancellation => { + self.user_fault_handler.notice_of_cancellation_cb( + transaction_id, + condition, + progress, + ); + } + FaultHandlerCode::NoticeOfSuspension => { + self.user_fault_handler.notice_of_suspension_cb( + transaction_id, + condition, + progress, + ); + } + FaultHandlerCode::IgnoreError => { + self.user_fault_handler + .ignore_cb(transaction_id, condition, progress); + } + FaultHandlerCode::AbandonTransaction => { + self.user_fault_handler + .abandoned_cb(transaction_id, condition, progress); + } + } + fh_code + } +} + #[derive(Debug, Eq, Copy, Clone)] #[cfg_attr(feature = "serde", derive(Serialize, Deserialize))] pub struct TransactionId { @@ -347,7 +444,8 @@ mod tests { let dest_file_name = "hello-dest.txt"; let src_lv = Lv::new_from_str(src_file_name).unwrap(); let dest_lv = Lv::new_from_str(dest_file_name).unwrap(); - let metadata_pdu = MetadataPduCreator::new_no_opts(pdu_header, metadata_params, src_lv, dest_lv); + let metadata_pdu = + MetadataPduCreator::new_no_opts(pdu_header, metadata_params, src_lv, dest_lv); metadata_pdu .write_to_bytes(&mut buf) .expect("writing metadata PDU failed"); diff --git a/satrs-core/tests/hk_helpers.rs b/satrs-core/tests/hk_helpers.rs index 9228365..8791b1e 100644 --- a/satrs-core/tests/hk_helpers.rs +++ b/satrs-core/tests/hk_helpers.rs @@ -1,7 +1,7 @@ #![allow(dead_code)] use core::mem::size_of; use serde::{Deserialize, Serialize}; -use spacepackets::ecss::{Ptc, PfcReal, PfcUnsigned}; +use spacepackets::ecss::{PfcReal, PfcUnsigned, Ptc}; use spacepackets::time::cds::TimeProvider; use spacepackets::time::{CcsdsTimeProvider, TimeWriter}; From 5a55993452b03676a67e8123d22c5d62bedeafd8 Mon Sep 17 00:00:00 2001 From: Robin Mueller Date: Wed, 13 Dec 2023 15:35:21 +0100 Subject: [PATCH 09/38] fix some tests --- satrs-core/src/pus/scheduler.rs | 2 +- satrs-core/src/pus/test.rs | 2 +- satrs-core/src/pus/verification.rs | 3 ++- 3 files changed, 4 insertions(+), 3 deletions(-) diff --git a/satrs-core/src/pus/scheduler.rs b/satrs-core/src/pus/scheduler.rs index 820b1f4..392eb87 100644 --- a/satrs-core/src/pus/scheduler.rs +++ b/satrs-core/src/pus/scheduler.rs @@ -857,7 +857,7 @@ mod tests { let mut sp_header = SpHeader::tc_unseg(apid_to_set, 105, 0).unwrap(); let mut sec_header = PusTcSecondaryHeader::new_simple(17, 1); sec_header.source_id = src_id_to_set; - let ping_tc = PusTcCreator::new(&mut sp_header, sec_header, None, true); + let ping_tc = PusTcCreator::new_no_app_data(&mut sp_header, sec_header, true); let req_id = RequestId::from_tc(&ping_tc); assert_eq!(req_id.source_id(), src_id_to_set); assert_eq!(req_id.apid(), apid_to_set); diff --git a/satrs-core/src/pus/test.rs b/satrs-core/src/pus/test.rs index fbef28a..c205178 100644 --- a/satrs-core/src/pus/test.rs +++ b/satrs-core/src/pus/test.rs @@ -154,7 +154,7 @@ mod tests { // Create a ping TC, verify acceptance. let mut sp_header = SpHeader::tc(TEST_APID, SequenceFlags::Unsegmented, 0, 0).unwrap(); let sec_header = PusTcSecondaryHeader::new_simple(17, 1); - let ping_tc = PusTcCreator::new(&mut sp_header, sec_header, None, true); + let ping_tc = PusTcCreator::new_no_app_data(&mut sp_header, sec_header, true); let token = verification_handler.add_tc(&ping_tc); let token = verification_handler .acceptance_success(token, None) diff --git a/satrs-core/src/pus/verification.rs b/satrs-core/src/pus/verification.rs index cca7566..35e4695 100644 --- a/satrs-core/src/pus/verification.rs +++ b/satrs-core/src/pus/verification.rs @@ -1438,6 +1438,7 @@ mod tests { fn base_tc_init(app_data: Option<&[u8]>) -> (PusTcCreator, RequestId) { let mut sph = SpHeader::tc_unseg(TEST_APID, 0x34, 0).unwrap(); let tc_header = PusTcSecondaryHeader::new_simple(17, 1); + let app_data = app_data.unwrap_or(&[]); let pus_tc = PusTcCreator::new(&mut sph, tc_header, app_data, true); let req_id = RequestId::new(&pus_tc); (pus_tc, req_id) @@ -2162,7 +2163,7 @@ mod tests { let mut sph = SpHeader::tc_unseg(TEST_APID, 0, 0).unwrap(); let tc_header = PusTcSecondaryHeader::new_simple(17, 1); - let pus_tc_0 = PusTcCreator::new(&mut sph, tc_header, None, true); + let pus_tc_0 = PusTcCreator::new_no_app_data(&mut sph, tc_header, true); let init_token = reporter.add_tc(&pus_tc_0); // Complete success sequence for a telecommand From bd6e1637e491713e4e1aae63ecf0838cc9cc08a9 Mon Sep 17 00:00:00 2001 From: Robin Mueller Date: Wed, 13 Dec 2023 15:49:26 +0100 Subject: [PATCH 10/38] the check finally works again --- satrs-core/Cargo.toml | 6 +++--- satrs-example/Cargo.toml | 4 ++-- satrs-example/src/bin/simpleclient.rs | 2 +- satrs-example/src/main.rs | 2 +- satrs-mib/Cargo.toml | 3 ++- satrs-mib/codegen/Cargo.toml | 3 ++- 6 files changed, 11 insertions(+), 9 deletions(-) diff --git a/satrs-core/Cargo.toml b/satrs-core/Cargo.toml index 66772c0..c46fc3b 100644 --- a/satrs-core/Cargo.toml +++ b/satrs-core/Cargo.toml @@ -73,10 +73,10 @@ features = ["all"] optional = true [dependencies.spacepackets] -# version = "0.7.0-beta.2" +version = "0.7.0-beta.3" default-features = false -git = "https://egit.irs.uni-stuttgart.de/rust/spacepackets.git" -rev = "297cfad22637d3b07a1b27abe56d9a607b5b82a7" +# git = "https://egit.irs.uni-stuttgart.de/rust/spacepackets.git" +# rev = "297cfad22637d3b07a1b27abe56d9a607b5b82a7" [dependencies.cobs] git = "https://github.com/robamu/cobs.rs.git" diff --git a/satrs-example/Cargo.toml b/satrs-example/Cargo.toml index 3d61254..1f96d1a 100644 --- a/satrs-example/Cargo.toml +++ b/satrs-example/Cargo.toml @@ -23,5 +23,5 @@ thiserror = "1" path = "../satrs-core" [dependencies.satrs-mib] -version = "0.1.0-alpha.1" -# path = "../satrs-mib" +# version = "0.1.0-alpha.1" +path = "../satrs-mib" diff --git a/satrs-example/src/bin/simpleclient.rs b/satrs-example/src/bin/simpleclient.rs index 6f6de79..4d0dab7 100644 --- a/satrs-example/src/bin/simpleclient.rs +++ b/satrs-example/src/bin/simpleclient.rs @@ -2,7 +2,7 @@ use satrs_core::pus::verification::RequestId; use satrs_core::spacepackets::ecss::tc::PusTcCreator; use satrs_core::spacepackets::ecss::tm::PusTmReader; use satrs_core::{ - spacepackets::ecss::{PusPacket, SerializablePusPacket}, + spacepackets::ecss::{PusPacket, WritablePusPacket}, spacepackets::SpHeader, }; use satrs_example::{OBSW_SERVER_ADDR, SERVER_PORT}; diff --git a/satrs-example/src/main.rs b/satrs-example/src/main.rs index c537ab2..2a692a3 100644 --- a/satrs-example/src/main.rs +++ b/satrs-example/src/main.rs @@ -466,7 +466,7 @@ fn main() { let pus_tm = PusTmCreator::new( &mut sp_header, sec_header, - Some(&buf), + &buf, true, ); let addr = aocs_tm_store diff --git a/satrs-mib/Cargo.toml b/satrs-mib/Cargo.toml index e901ebe..b64813c 100644 --- a/satrs-mib/Cargo.toml +++ b/satrs-mib/Cargo.toml @@ -23,7 +23,8 @@ version = "1" optional = true [dependencies.satrs-core] -version = "0.1.0-alpha.1" +path = "../satrs-core" +# version = "0.1.0-alpha.1" # git = "https://egit.irs.uni-stuttgart.de/rust/sat-rs.git" # branch = "main" # rev = "35e1f7a983f6535c5571186e361fe101d4306b89" diff --git a/satrs-mib/codegen/Cargo.toml b/satrs-mib/codegen/Cargo.toml index 9a3887c..1ad3810 100644 --- a/satrs-mib/codegen/Cargo.toml +++ b/satrs-mib/codegen/Cargo.toml @@ -20,7 +20,8 @@ quote = "1" proc-macro2 = "1" [dependencies.satrs-core] -version = "0.1.0-alpha.1" +path = "../../satrs-core" +# version = "0.1.0-alpha.1" # git = "https://egit.irs.uni-stuttgart.de/rust/sat-rs.git" # branch = "main" # rev = "35e1f7a983f6535c5571186e361fe101d4306b89" From 1b1bef2958835a386c8b6bd23743b544dd9d273f Mon Sep 17 00:00:00 2001 From: Robin Mueller Date: Wed, 13 Dec 2023 18:55:26 +0100 Subject: [PATCH 11/38] make it compile again --- satrs-core/src/cfdp/dest.rs | 164 +++++++++++++++++++++++------------- satrs-core/src/cfdp/mod.rs | 50 ++++++++++- 2 files changed, 154 insertions(+), 60 deletions(-) diff --git a/satrs-core/src/cfdp/dest.rs b/satrs-core/src/cfdp/dest.rs index 1487467..5bbedd7 100644 --- a/satrs-core/src/cfdp/dest.rs +++ b/satrs-core/src/cfdp/dest.rs @@ -1,17 +1,17 @@ use core::str::{from_utf8, Utf8Error}; use std::{ fs::{metadata, File}, - io::{BufReader, Read, Seek, SeekFrom, Write}, + io::{Seek, SeekFrom, Write}, path::{Path, PathBuf}, }; use crate::cfdp::user::TransactionFinishedParams; use super::{ - filestore::{NativeFilestore, VirtualFilestore}, + filestore::{FilestoreError, VirtualFilestore}, user::{CfdpUser, MetadataReceivedParams}, - CheckTimerCreator, DefaultFaultHandler, PacketInfo, PacketTarget, RemoteEntityConfig, - RemoteEntityConfigProvider, State, TransactionId, TransactionStep, CRC_32, + CheckTimerCreator, LocalEntityConfig, PacketInfo, PacketTarget, RemoteEntityConfig, + RemoteEntityConfigProvider, State, TransactionId, TransactionStep, }; use alloc::boxed::Box; use smallvec::SmallVec; @@ -32,13 +32,12 @@ use spacepackets::{ use thiserror::Error; pub struct DestinationHandler { - id: UnsignedByteField, + local_cfg: LocalEntityConfig, step: TransactionStep, state: State, tparams: TransactionParams, packets_to_send_ctx: PacketsToSendContext, vfs: Box, - default_fault_handler: DefaultFaultHandler, remote_cfg_table: Box, check_timer_creator: Box, } @@ -61,7 +60,7 @@ struct FileProperties { #[derive(Debug)] struct TransferState { transaction_id: Option, - progress: usize, + progress: u64, condition_code: ConditionCode, delivery_code: DeliveryCode, file_status: FileStatus, @@ -111,8 +110,8 @@ impl Default for FileProperties { } impl TransactionParams { - fn file_size(&self) -> usize { - self.tstate.metadata_params.file_size as usize + fn file_size(&self) -> u64 { + self.tstate.metadata_params.file_size } fn metadata_params(&self) -> &MetadataGenericParams { @@ -171,20 +170,18 @@ pub enum DestError { impl DestinationHandler { pub fn new( - entity_id: impl Into, + local_cfg: LocalEntityConfig, vfs: Box, - default_fault_handler: DefaultFaultHandler, remote_cfg_table: Box, check_timer_creator: Box, ) -> Self { Self { - id: entity_id.into(), + local_cfg, step: TransactionStep::Idle, state: State::Idle, tparams: Default::default(), packets_to_send_ctx: Default::default(), vfs, - default_fault_handler, remote_cfg_table, check_timer_creator, } @@ -196,7 +193,7 @@ impl DestinationHandler { packet_to_insert: Option<&PacketInfo>, ) -> Result<(), DestError> { if let Some(packet) = packet_to_insert { - self.insert_packet(packet)?; + self.insert_packet(cfdp_user, packet)?; } match self.state { State::Idle => todo!(), @@ -205,7 +202,11 @@ impl DestinationHandler { } } - fn insert_packet(&mut self, packet_info: &PacketInfo) -> Result<(), DestError> { + fn insert_packet( + &mut self, + cfdp_user: &mut impl CfdpUser, + packet_info: &PacketInfo, + ) -> Result<(), DestError> { if packet_info.target() != PacketTarget::DestEntity { // Unwrap is okay here, a PacketInfo for a file data PDU should always have the // destination as the target. @@ -219,6 +220,7 @@ impl DestinationHandler { return Err(DestError::DirectiveExpected); } self.handle_file_directive( + cfdp_user, packet_info.pdu_directive.unwrap(), packet_info.raw_packet, ) @@ -252,7 +254,7 @@ impl DestinationHandler { ) } else { // TODO: Are there cases where this ID is actually the source entity ID? - let entity_id = EntityIdTlv::new(self.id); + let entity_id = EntityIdTlv::new(self.local_cfg.id); FinishedPduCreator::new_with_error( pdu_header, self.tparams.tstate.condition_code, @@ -276,11 +278,12 @@ impl DestinationHandler { pub fn handle_file_directive( &mut self, + cfdp_user: &mut impl CfdpUser, pdu_directive: FileDirectiveType, raw_packet: &[u8], ) -> Result<(), DestError> { match pdu_directive { - FileDirectiveType::EofPdu => self.handle_eof_pdu(raw_packet)?, + FileDirectiveType::EofPdu => self.handle_eof_pdu(cfdp_user, raw_packet)?, FileDirectiveType::FinishedPdu | FileDirectiveType::NakPdu | FileDirectiveType::KeepAlivePdu => { @@ -359,11 +362,19 @@ impl DestinationHandler { Ok(()) } - pub fn handle_eof_pdu(&mut self, raw_packet: &[u8]) -> Result<(), DestError> { + pub fn handle_eof_pdu( + &mut self, + cfdp_user: &mut impl CfdpUser, + raw_packet: &[u8], + ) -> Result<(), DestError> { if self.state == State::Idle || self.step != TransactionStep::ReceivingFileDataPdus { return Err(DestError::WrongStateForFileDataAndEof); } let eof_pdu = EofPdu::from_bytes(raw_packet)?; + if self.local_cfg.indication_cfg.eof_recv { + // Unwrap is okay here, application logic ensures that transaction ID is valid here. + cfdp_user.eof_recvd_indication(self.tparams.tstate.transaction_id.as_ref().unwrap()); + } if eof_pdu.condition_code() == ConditionCode::NoError { self.handle_no_error_eof_pdu(&eof_pdu)?; } else { @@ -372,49 +383,73 @@ impl DestinationHandler { Ok(()) } - fn handle_no_error_eof_pdu(&mut self, eof_pdu: &EofPdu) -> Result<(), DestError> { + fn handle_no_error_eof_pdu(&mut self, eof_pdu: &EofPdu) -> Result { + // CFDP 4.6.1.2.9: Declare file size error if progress exceeds file size + if self.tparams.tstate.progress > eof_pdu.file_size() + && self.declare_fault(ConditionCode::FileSizeError) != FaultHandlerCode::IgnoreError + { + return Ok(true); + } + + if self.tparams.transmission_mode() == TransmissionMode::Unacknowledged + && !self.checksum_verify(eof_pdu.file_checksum()) + { + self.start_check_limit_handling() + } + + // TODO: Continue here based on Python implementation. + // For a standard disk based file system, which is assumed to be used for now, the file // will always be retained. This might change in the future. + /* self.tparams.tstate.file_status = FileStatus::Retained; - if self.checksum_check(eof_pdu.file_checksum())? { + if self.checksum_verify(eof_pdu.file_checksum())? { self.tparams.tstate.condition_code = ConditionCode::NoError; self.tparams.tstate.delivery_code = DeliveryCode::Complete; } else { self.tparams.tstate.condition_code = ConditionCode::FileChecksumFailure; } + */ // TODO: Check progress, and implement transfer completion timer as specified in the // standard. This timer protects against out of order arrival of packets. - if self.tparams.tstate.progress != self.tparams.file_size() {} + // if self.tparams.tstate.progress != self.tparams.file_size() {} if self.tparams.transmission_mode() == TransmissionMode::Unacknowledged { self.step = TransactionStep::TransferCompletion; } else { self.step = TransactionStep::SendingAckPdu; } - Ok(()) + Ok(false) } + fn checksum_verify(&mut self, checksum: u32) -> bool { + match self.vfs.checksum_verify( + self.tparams.file_properties.dest_path_buf.to_str().unwrap(), + self.tparams.metadata_params().checksum_type, + checksum, + &mut self.tparams.cksum_buf, + ) { + Ok(checksum_success) => checksum_success, + Err(e) => match e { + FilestoreError::ChecksumTypeNotImplemented(checksum) => { + self.declare_fault(ConditionCode::UnsupportedChecksumType); + // For this case, the applicable algorithm shall the the null checksum, which + // is always succesful. + true + } + _ => { + self.declare_fault(ConditionCode::FilestoreRejection); + // Treat this equivalent to a failed checksum procedure. + false + } + }, + } + } + + fn start_check_limit_handling(&mut self) {} pub fn handle_prompt_pdu(&mut self, _raw_packet: &[u8]) -> Result<(), DestError> { todo!(); } - fn checksum_check(&mut self, expected_checksum: u32) -> Result { - // TODO: Implement this using the new virtual filestore abstraction. - let mut digest = CRC_32.digest(); - let file_to_check = File::open(&self.tparams.file_properties.dest_path_buf)?; - let mut buf_reader = BufReader::new(file_to_check); - loop { - let bytes_read = buf_reader.read(&mut self.tparams.cksum_buf)?; - if bytes_read == 0 { - break; - } - digest.update(&self.tparams.cksum_buf[0..bytes_read]); - } - if digest.finalize() == expected_checksum { - return Ok(true); - } - Ok(false) - } - fn fsm_busy(&mut self, cfdp_user: &mut impl CfdpUser) -> Result<(), DestError> { if self.step == TransactionStep::TransactionStart { self.transaction_start(cfdp_user)?; @@ -472,7 +507,7 @@ impl DestinationHandler { let metadata_recvd_params = MetadataReceivedParams { id, source_id, - file_size: self.tparams.tstate.metadata_params.file_size, + file_size: self.tparams.file_size(), src_file_name: src_name, dest_file_name: dest_name, msgs_to_user: &msgs_to_user[..num_msgs_to_user], @@ -528,10 +563,28 @@ impl DestinationHandler { } fn declare_fault(&mut self, condition_code: ConditionCode) -> FaultHandlerCode { - todo!("implement this. requires cached fault handler abstraction"); - FaultHandlerCode::IgnoreError + let fh_code = self + .local_cfg + .default_fault_handler + .get_fault_handler(condition_code); + match fh_code { + FaultHandlerCode::NoticeOfCancellation => { + self.notice_of_cancellation(); + } + FaultHandlerCode::NoticeOfSuspension => self.notice_of_suspension(), + FaultHandlerCode::IgnoreError => todo!(), + FaultHandlerCode::AbandonTransaction => todo!(), + } + self.local_cfg.default_fault_handler.report_fault( + self.tparams.tstate.transaction_id.unwrap(), + condition_code, + self.tparams.tstate.progress, + ) } + fn notice_of_cancellation(&mut self) {} + fn notice_of_suspension(&mut self) {} + fn reset(&mut self) { self.step = TransactionStep::Idle; self.state = State::Idle; @@ -569,8 +622,9 @@ mod tests { }; use crate::cfdp::{ - CheckTimer, CheckTimerCreator, RemoteEntityConfig, StdRemoteEntityConfigProvider, - UserFaultHandler, + filestore::NativeFilestore, CheckTimer, CheckTimerCreator, DefaultFaultHandler, + IndicationConfig, RemoteEntityConfig, StdRemoteEntityConfigProvider, UserFaultHandler, + CRC_32, }; use super::*; @@ -806,10 +860,14 @@ mod tests { fn default_dest_handler() -> DestinationHandler { let test_fault_handler = TestFaultHandler::default(); + let local_entity_cfg = LocalEntityConfig { + id: REMOTE_ID.into(), + indication_cfg: IndicationConfig::default(), + default_fault_handler: DefaultFaultHandler::new(Box::new(test_fault_handler)), + }; DestinationHandler::new( - REMOTE_ID, + local_entity_cfg, Box::new(NativeFilestore::default()), - DefaultFaultHandler::new(Box::new(test_fault_handler)), Box::new(basic_remote_cfg_table()), Box::new(TestCheckTimerCreator::new(2, 2)), ) @@ -936,10 +994,6 @@ mod tests { .write_to_bytes(&mut buf) .expect("writing file data PDU failed"); let packet_info = PacketInfo::new(&buf).expect("creating packet info failed"); - let result = dest_handler.insert_packet(&packet_info); - if let Err(e) = result { - panic!("destination handler packet insertion error: {e}"); - } let result = dest_handler.state_machine(&mut test_user, Some(&packet_info)); assert!(result.is_ok()); @@ -1003,10 +1057,6 @@ mod tests { .write_to_bytes(&mut buf) .expect("writing file data PDU failed"); let packet_info = PacketInfo::new(&buf).expect("creating packet info failed"); - let result = dest_handler.insert_packet(&packet_info); - if let Err(e) = result { - panic!("destination handler packet insertion error: {e}"); - } let result = dest_handler.state_machine(&mut test_user, Some(&packet_info)); assert!(result.is_ok()); @@ -1021,10 +1071,6 @@ mod tests { .write_to_bytes(&mut buf) .expect("writing file data PDU failed"); let packet_info = PacketInfo::new(&buf).expect("creating packet info failed"); - let result = dest_handler.insert_packet(&packet_info); - if let Err(e) = result { - panic!("destination handler packet insertion error: {e}"); - } let result = dest_handler.state_machine(&mut test_user, Some(&packet_info)); assert!(result.is_ok()); diff --git a/satrs-core/src/cfdp/mod.rs b/satrs-core/src/cfdp/mod.rs index 82c6f64..436cdd4 100644 --- a/satrs-core/src/cfdp/mod.rs +++ b/satrs-core/src/cfdp/mod.rs @@ -206,6 +206,18 @@ impl DefaultFaultHandler { }) } + pub fn set_fault_handler( + &mut self, + condition_code: ConditionCode, + fault_handler: FaultHandlerCode, + ) { + let array_idx = Self::condition_code_to_array_index(condition_code); + if array_idx.is_none() { + return; + } + self.handler_array[array_idx.unwrap()] = fault_handler; + } + pub fn new(user_fault_handler: Box) -> Self { let mut init_array = [FaultHandlerCode::NoticeOfCancellation; 10]; init_array @@ -219,7 +231,15 @@ impl DefaultFaultHandler { } } - fn report_fault( + pub fn get_fault_handler(&self, condition_code: ConditionCode) -> FaultHandlerCode { + let array_idx = Self::condition_code_to_array_index(condition_code); + if array_idx.is_none() { + return FaultHandlerCode::IgnoreError; + } + self.handler_array[array_idx.unwrap()] + } + + pub fn report_fault( &mut self, transaction_id: TransactionId, condition: ConditionCode, @@ -258,6 +278,34 @@ impl DefaultFaultHandler { } } +pub struct IndicationConfig { + pub eof_sent: bool, + pub eof_recv: bool, + pub file_segment_recv: bool, + pub transaction_finished: bool, + pub suspended: bool, + pub resumed: bool, +} + +impl Default for IndicationConfig { + fn default() -> Self { + Self { + eof_sent: true, + eof_recv: true, + file_segment_recv: true, + transaction_finished: true, + suspended: true, + resumed: true, + } + } +} + +pub struct LocalEntityConfig { + pub id: UnsignedByteField, + pub indication_cfg: IndicationConfig, + pub default_fault_handler: DefaultFaultHandler, +} + #[derive(Debug, Eq, Copy, Clone)] #[cfg_attr(feature = "serde", derive(Serialize, Deserialize))] pub struct TransactionId { From 0ecb7184166d03cea773748a3725b49932820521 Mon Sep 17 00:00:00 2001 From: Robin Mueller Date: Thu, 14 Dec 2023 00:29:02 +0100 Subject: [PATCH 12/38] this works better apparently --- satrs-core/src/cfdp/dest.rs | 26 +++++++++----------------- 1 file changed, 9 insertions(+), 17 deletions(-) diff --git a/satrs-core/src/cfdp/dest.rs b/satrs-core/src/cfdp/dest.rs index 5bbedd7..7236727 100644 --- a/satrs-core/src/cfdp/dest.rs +++ b/satrs-core/src/cfdp/dest.rs @@ -309,7 +309,7 @@ impl DestinationHandler { self.tparams.tstate.metadata_params = *metadata_pdu.metadata_params(); let remote_cfg = self .remote_cfg_table - .get_remote_config(metadata_pdu.dest_id().value()); + .get_remote_config(metadata_pdu.source_id().value()); if remote_cfg.is_none() { return Err(DestError::NoRemoteCfgFound(metadata_pdu.dest_id())); } @@ -632,11 +632,6 @@ mod tests { const LOCAL_ID: UnsignedByteFieldU16 = UnsignedByteFieldU16::new(1); const REMOTE_ID: UnsignedByteFieldU16 = UnsignedByteFieldU16::new(2); - const SRC_NAME: &str = "__cfdp__source-file"; - const DEST_NAME: &str = "__cfdp__dest-file"; - - static ATOMIC_COUNTER: AtomicU8 = AtomicU8::new(0); - #[derive(Default)] struct TestCfdpUser { next_expected_seq_num: u64, @@ -831,16 +826,13 @@ mod tests { } fn init_full_filenames() -> (PathBuf, PathBuf) { - let mut file_path = temp_dir(); - let mut src_path = file_path.clone(); - // Atomic counter used to allow concurrent tests. - let unique_counter = ATOMIC_COUNTER.fetch_add(1, Ordering::Relaxed); - // Create unique test filenames. - let src_name_unique = format!("{SRC_NAME}{}.txt", unique_counter); - let dest_name_unique = format!("{DEST_NAME}{}.txt", unique_counter); - src_path.push(src_name_unique); - file_path.push(dest_name_unique); - (src_path, file_path) + ( + tempfile::TempPath::from_path("/tmp/test.txt").to_path_buf(), + tempfile::NamedTempFile::new() + .unwrap() + .into_temp_path() + .to_path_buf(), + ) } fn basic_remote_cfg_table() -> StdRemoteEntityConfigProvider { @@ -867,7 +859,7 @@ mod tests { }; DestinationHandler::new( local_entity_cfg, - Box::new(NativeFilestore::default()), + Box::::default(), Box::new(basic_remote_cfg_table()), Box::new(TestCheckTimerCreator::new(2, 2)), ) From fbd05a4a25feba0242580c2bc8ea8b592f1b6531 Mon Sep 17 00:00:00 2001 From: Robin Mueller Date: Thu, 14 Dec 2023 12:10:22 +0100 Subject: [PATCH 13/38] add check limit handling --- satrs-core/src/cfdp/dest.rs | 259 +++++++++++++++++++++++------------- satrs-core/src/cfdp/mod.rs | 44 +++--- 2 files changed, 186 insertions(+), 117 deletions(-) diff --git a/satrs-core/src/cfdp/dest.rs b/satrs-core/src/cfdp/dest.rs index 7236727..0b564b2 100644 --- a/satrs-core/src/cfdp/dest.rs +++ b/satrs-core/src/cfdp/dest.rs @@ -1,17 +1,12 @@ -use core::str::{from_utf8, Utf8Error}; -use std::{ - fs::{metadata, File}, - io::{Seek, SeekFrom, Write}, - path::{Path, PathBuf}, -}; - use crate::cfdp::user::TransactionFinishedParams; +use core::str::{from_utf8, Utf8Error}; +use std::path::{Path, PathBuf}; use super::{ filestore::{FilestoreError, VirtualFilestore}, user::{CfdpUser, MetadataReceivedParams}, - CheckTimerCreator, LocalEntityConfig, PacketInfo, PacketTarget, RemoteEntityConfig, - RemoteEntityConfigProvider, State, TransactionId, TransactionStep, + CheckTimer, CheckTimerCreator, EntityType, LocalEntityConfig, PacketInfo, PacketTarget, + RemoteEntityConfig, RemoteEntityConfigProvider, State, TransactionId, TransactionStep, }; use alloc::boxed::Box; use smallvec::SmallVec; @@ -60,22 +55,28 @@ struct FileProperties { #[derive(Debug)] struct TransferState { transaction_id: Option, + metadata_params: MetadataGenericParams, progress: u64, condition_code: ConditionCode, delivery_code: DeliveryCode, file_status: FileStatus, - metadata_params: MetadataGenericParams, + checksum: u32, + current_check_count: u32, + current_check_timer: Option>, } impl Default for TransferState { fn default() -> Self { Self { transaction_id: None, + metadata_params: Default::default(), progress: Default::default(), condition_code: ConditionCode::NoError, delivery_code: DeliveryCode::Incomplete, file_status: FileStatus::Unreported, - metadata_params: Default::default(), + checksum: 0, + current_check_count: 0, + current_check_timer: None, } } } @@ -137,6 +138,7 @@ impl TransactionParams { fn reset(&mut self) { self.tstate.condition_code = ConditionCode::NoError; self.tstate.delivery_code = DeliveryCode::Incomplete; + self.tstate.file_status = FileStatus::Unreported; } } @@ -160,10 +162,12 @@ pub enum DestError { Pdu(#[from] PduError), #[error("io error {0}")] Io(#[from] std::io::Error), + #[error("file store error {0}")] + Filestore(#[from] FilestoreError), #[error("path conversion error {0}")] PathConversion(#[from] Utf8Error), #[error("error building dest path from source file name and dest folder")] - PathConcatError, + PathConcat, #[error("no remote entity configuration found for {0:?}")] NoRemoteCfgFound(UnsignedByteField), } @@ -241,25 +245,26 @@ impl DestinationHandler { return Ok(None); } let directive = self.packets_to_send_ctx.directive.unwrap(); + let tstate = self.tstate(); let written_size = match directive { FileDirectiveType::FinishedPdu => { let pdu_header = PduHeader::new_no_file_data(self.tparams.pdu_conf, 0); - let finished_pdu = if self.tparams.tstate.condition_code == ConditionCode::NoError - || self.tparams.tstate.condition_code == ConditionCode::UnsupportedChecksumType + let finished_pdu = if tstate.condition_code == ConditionCode::NoError + || tstate.condition_code == ConditionCode::UnsupportedChecksumType { FinishedPduCreator::new_default( pdu_header, - self.tparams.tstate.delivery_code, - self.tparams.tstate.file_status, + tstate.delivery_code, + tstate.file_status, ) } else { // TODO: Are there cases where this ID is actually the source entity ID? let entity_id = EntityIdTlv::new(self.local_cfg.id); FinishedPduCreator::new_with_error( pdu_header, - self.tparams.tstate.condition_code, - self.tparams.tstate.delivery_code, - self.tparams.tstate.file_status, + tstate.condition_code, + tstate.delivery_code, + tstate.file_status, entity_id, ) }; @@ -354,11 +359,14 @@ impl DestinationHandler { return Err(DestError::WrongStateForFileDataAndEof); } let fd_pdu = FileDataPdu::from_bytes(raw_packet)?; - let mut dest_file = File::options() - .write(true) - .open(&self.tparams.file_properties.dest_path_buf)?; - dest_file.seek(SeekFrom::Start(fd_pdu.offset()))?; - dest_file.write_all(fd_pdu.file_data())?; + if let Err(e) = self.vfs.write_data( + self.tparams.file_properties.dest_path_buf.to_str().unwrap(), + fd_pdu.offset(), + fd_pdu.file_data(), + ) { + self.declare_fault(ConditionCode::FilestoreRejection); + return Err(e.into()); + } Ok(()) } @@ -375,50 +383,57 @@ impl DestinationHandler { // Unwrap is okay here, application logic ensures that transaction ID is valid here. cfdp_user.eof_recvd_indication(self.tparams.tstate.transaction_id.as_ref().unwrap()); } - if eof_pdu.condition_code() == ConditionCode::NoError { - self.handle_no_error_eof_pdu(&eof_pdu)?; + let regular_transfer_finish = if eof_pdu.condition_code() == ConditionCode::NoError { + self.handle_no_error_eof_pdu(&eof_pdu)? } else { todo!("implement cancel request handling"); + }; + if regular_transfer_finish { + self.file_transfer_complete_transition(); } Ok(()) } + /// Returns whether the transfer can be completed regularly. fn handle_no_error_eof_pdu(&mut self, eof_pdu: &EofPdu) -> Result { // CFDP 4.6.1.2.9: Declare file size error if progress exceeds file size if self.tparams.tstate.progress > eof_pdu.file_size() && self.declare_fault(ConditionCode::FileSizeError) != FaultHandlerCode::IgnoreError { - return Ok(true); - } - - if self.tparams.transmission_mode() == TransmissionMode::Unacknowledged - && !self.checksum_verify(eof_pdu.file_checksum()) + return Ok(false); + } else if (self.tparams.tstate.progress < eof_pdu.file_size()) + && self.tparams.transmission_mode() == TransmissionMode::Acknowledged { - self.start_check_limit_handling() + // CFDP 4.6.4.3.1: The end offset of the last received file segment and the file + // size as stated in the EOF PDU is not the same, so we need to add that segment to + // the lost segments for the deferred lost segment detection procedure. + // TODO: Proper lost segment handling. + // self._params.acked_params.lost_seg_tracker.add_lost_segment( + // (self._params.fp.progress, self._params.fp.file_size_eof) + // ) } - // TODO: Continue here based on Python implementation. - - // For a standard disk based file system, which is assumed to be used for now, the file - // will always be retained. This might change in the future. - /* - self.tparams.tstate.file_status = FileStatus::Retained; - if self.checksum_verify(eof_pdu.file_checksum())? { - self.tparams.tstate.condition_code = ConditionCode::NoError; - self.tparams.tstate.delivery_code = DeliveryCode::Complete; - } else { - self.tparams.tstate.condition_code = ConditionCode::FileChecksumFailure; + self.tparams.tstate.checksum = eof_pdu.file_checksum(); + if self.tparams.transmission_mode() == TransmissionMode::Unacknowledged + && !self.checksum_verify(self.tparams.tstate.checksum) + { + if self.declare_fault(ConditionCode::FileChecksumFailure) + != FaultHandlerCode::IgnoreError + { + return Ok(false); + } + self.start_check_limit_handling(); } - */ - // TODO: Check progress, and implement transfer completion timer as specified in the - // standard. This timer protects against out of order arrival of packets. - // if self.tparams.tstate.progress != self.tparams.file_size() {} + Ok(true) + } + + fn file_transfer_complete_transition(&mut self) { if self.tparams.transmission_mode() == TransmissionMode::Unacknowledged { self.step = TransactionStep::TransferCompletion; } else { + // TODO: Prepare ACK PDU somehow. self.step = TransactionStep::SendingAckPdu; } - Ok(false) } fn checksum_verify(&mut self, checksum: u32) -> bool { @@ -430,7 +445,7 @@ impl DestinationHandler { ) { Ok(checksum_success) => checksum_success, Err(e) => match e { - FilestoreError::ChecksumTypeNotImplemented(checksum) => { + FilestoreError::ChecksumTypeNotImplemented(_) => { self.declare_fault(ConditionCode::UnsupportedChecksumType); // For this case, the applicable algorithm shall the the null checksum, which // is always succesful. @@ -445,7 +460,43 @@ impl DestinationHandler { } } - fn start_check_limit_handling(&mut self) {} + fn start_check_limit_handling(&mut self) { + self.step = TransactionStep::ReceivingFileDataPdusWithCheckLimitHandling; + self.tparams.tstate.current_check_timer = + Some(self.check_timer_creator.get_check_timer_provider( + &self.local_cfg.id, + &self.tparams.remote_cfg.unwrap().entity_id, + EntityType::Receiving, + )); + self.tparams.tstate.current_check_count = 0; + } + + fn check_limit_handling(&mut self) { + if self.tparams.tstate.current_check_timer.is_none() { + return; + } + let check_timer = self.tparams.tstate.current_check_timer.as_ref().unwrap(); + if check_timer.has_expired() { + if self.checksum_verify(self.tparams.tstate.checksum) { + self.file_transfer_complete_transition(); + return; + } + if self.tparams.tstate.current_check_count + 1 + >= self.tparams.remote_cfg.unwrap().check_limit + { + self.declare_fault(ConditionCode::CheckLimitReached); + } else { + self.tparams.tstate.current_check_count += 1; + self.tparams + .tstate + .current_check_timer + .as_mut() + .unwrap() + .reset(); + } + } + } + pub fn handle_prompt_pdu(&mut self, _raw_packet: &[u8]) -> Result<(), DestError> { todo!(); } @@ -457,6 +508,9 @@ impl DestinationHandler { if self.step == TransactionStep::TransferCompletion { self.transfer_completion(cfdp_user)?; } + if self.step == TransactionStep::ReceivingFileDataPdusWithCheckLimitHandling { + self.check_limit_handling(); + } if self.step == TransactionStep::SendingAckPdu { todo!("no support for acknowledged mode yet"); } @@ -515,39 +569,43 @@ impl DestinationHandler { self.tparams.tstate.transaction_id = Some(id); cfdp_user.metadata_recvd_indication(&metadata_recvd_params); - if dest_path.exists() { - let dest_metadata = metadata(dest_path)?; - if dest_metadata.is_dir() { - // Create new destination path by concatenating the last part of the source source - // name and the destination folder. For example, for a source file of /tmp/hello.txt - // and a destination name of /home/test, the resulting file name should be - // /home/test/hello.txt - let source_path = Path::new(from_utf8( - &self.tparams.file_properties.src_file_name - [..self.tparams.file_properties.src_file_name_len], - )?); - - let source_name = source_path.file_name(); - if source_name.is_none() { - return Err(DestError::PathConcatError); - } - let source_name = source_name.unwrap(); - self.tparams.file_properties.dest_path_buf.push(source_name); + // TODO: This is the only remaining function which uses std.. the easiest way would + // probably be to use a static pre-allocated dest path buffer to store any concatenated + // paths. + if dest_path.exists() && self.vfs.is_dir(dest_path.to_str().unwrap()) { + // Create new destination path by concatenating the last part of the source source + // name and the destination folder. For example, for a source file of /tmp/hello.txt + // and a destination name of /home/test, the resulting file name should be + // /home/test/hello.txt + let source_path = Path::new(from_utf8( + &self.tparams.file_properties.src_file_name + [..self.tparams.file_properties.src_file_name_len], + )?); + let source_name = source_path.file_name(); + if source_name.is_none() { + return Err(DestError::PathConcat); } + let source_name = source_name.unwrap(); + self.tparams.file_properties.dest_path_buf.push(source_name); } - // This function does exactly what we require: Create a new file if it does not exist yet - // and trucate an existing one. - File::create(&self.tparams.file_properties.dest_path_buf)?; + let dest_path_str = self.tparams.file_properties.dest_path_buf.to_str().unwrap(); + if self.vfs.exists(dest_path_str) { + self.vfs.truncate_file(dest_path_str)?; + } else { + self.vfs.create_file(dest_path_str)?; + } + self.tparams.tstate.file_status = FileStatus::Retained; self.step = TransactionStep::ReceivingFileDataPdus; Ok(()) } fn transfer_completion(&mut self, cfdp_user: &mut impl CfdpUser) -> Result<(), DestError> { + let tstate = self.tstate(); let transaction_finished_params = TransactionFinishedParams { - id: self.tparams.tstate.transaction_id.unwrap(), - condition_code: self.tparams.tstate.condition_code, - delivery_code: self.tparams.tstate.delivery_code, - file_status: self.tparams.tstate.file_status, + id: tstate.transaction_id.unwrap(), + condition_code: tstate.condition_code, + delivery_code: tstate.delivery_code, + file_status: tstate.file_status, }; cfdp_user.transaction_finished_indication(&transaction_finished_params); // This function should never be called with metadata parameters not set @@ -575,10 +633,11 @@ impl DestinationHandler { FaultHandlerCode::IgnoreError => todo!(), FaultHandlerCode::AbandonTransaction => todo!(), } + let tstate = self.tstate(); self.local_cfg.default_fault_handler.report_fault( - self.tparams.tstate.transaction_id.unwrap(), + tstate.transaction_id.unwrap(), condition_code, - self.tparams.tstate.progress, + tstate.progress, ) } @@ -598,19 +657,20 @@ impl DestinationHandler { self.step = TransactionStep::SendingFinishedPdu; Ok(()) } + + fn tstate(&self) -> &TransferState { + &self.tparams.tstate + } } #[cfg(test)] mod tests { - use core::{ - cell::Cell, - sync::atomic::{AtomicU8, Ordering}, - }; + use core::cell::Cell; + use std::fs; #[allow(unused_imports)] use std::println; - use std::{env::temp_dir, fs}; - use alloc::{format, string::String}; + use alloc::{collections::VecDeque, string::String}; use rand::Rng; use spacepackets::{ cfdp::{ @@ -649,10 +709,10 @@ mod tests { #[derive(Default)] struct TestFaultHandler { - notice_of_suspension_count: u32, - notice_of_cancellation_count: u32, - abandoned_count: u32, - ignored_count: u32, + notice_of_suspension_queue: VecDeque<(TransactionId, ConditionCode, u64)>, + notice_of_cancellation_queue: VecDeque<(TransactionId, ConditionCode, u64)>, + abandoned_queue: VecDeque<(TransactionId, ConditionCode, u64)>, + ignored_queue: VecDeque<(TransactionId, ConditionCode, u64)>, } impl UserFaultHandler for TestFaultHandler { @@ -662,7 +722,8 @@ mod tests { cond: ConditionCode, progress: u64, ) { - self.notice_of_suspension_count += 1; + self.notice_of_suspension_queue + .push_back((transaction_id, cond, progress)) } fn notice_of_cancellation_cb( @@ -671,7 +732,8 @@ mod tests { cond: ConditionCode, progress: u64, ) { - self.notice_of_cancellation_count += 1; + self.notice_of_cancellation_queue + .push_back((transaction_id, cond, progress)) } fn abandoned_cb( @@ -680,11 +742,13 @@ mod tests { cond: ConditionCode, progress: u64, ) { - self.abandoned_count += 1; + self.abandoned_queue + .push_back((transaction_id, cond, progress)) } fn ignore_cb(&mut self, transaction_id: TransactionId, cond: ConditionCode, progress: u64) { - self.ignored_count += 1; + self.ignored_queue + .push_back((transaction_id, cond, progress)) } } @@ -763,6 +827,7 @@ mod tests { } } + #[derive(Debug)] struct TestCheckTimer { counter: Cell, expiry_count: u32, @@ -777,6 +842,9 @@ mod tests { self.counter.set(current_counter + 1); false } + fn reset(&mut self) { + self.counter.set(0); + } } impl TestCheckTimer { @@ -901,7 +969,8 @@ mod tests { .expect("writing metadata PDU failed"); PacketInfo::new(&buf[..written_len]).expect("generating packet info failed") } - fn create_no_error_eof(file_data: &[u8], pdu_header: &PduHeader, buf: &mut [u8]) -> EofPdu { + + fn create_no_error_eof(file_data: &[u8], pdu_header: &PduHeader) -> EofPdu { let mut digest = CRC_32.digest(); digest.update(file_data); let crc32 = digest.finalize(); @@ -935,7 +1004,7 @@ mod tests { assert_ne!(dest_handler.state(), State::Idle); assert_eq!(dest_handler.step(), TransactionStep::ReceivingFileDataPdus); - let eof_pdu = create_no_error_eof(&[], &pdu_header, &mut buf); + let eof_pdu = create_no_error_eof(&[], &pdu_header); let packet_info = create_packet_info(&eof_pdu, &mut buf); let result = dest_handler.state_machine(&mut test_user, Some(&packet_info)); assert!(result.is_ok()); @@ -989,7 +1058,7 @@ mod tests { let result = dest_handler.state_machine(&mut test_user, Some(&packet_info)); assert!(result.is_ok()); - let eof_pdu = create_no_error_eof(&file_data, &pdu_header, &mut buf); + let eof_pdu = create_no_error_eof(file_data, &pdu_header); let packet_info = create_packet_info(&eof_pdu, &mut buf); let result = dest_handler.state_machine(&mut test_user, Some(&packet_info)); assert!(result.is_ok()); @@ -1066,7 +1135,7 @@ mod tests { let result = dest_handler.state_machine(&mut test_user, Some(&packet_info)); assert!(result.is_ok()); - let eof_pdu = create_no_error_eof(&random_data, &pdu_header, &mut buf); + let eof_pdu = create_no_error_eof(&random_data, &pdu_header); let packet_info = create_packet_info(&eof_pdu, &mut buf); let result = dest_handler.state_machine(&mut test_user, Some(&packet_info)); assert!(result.is_ok()); diff --git a/satrs-core/src/cfdp/mod.rs b/satrs-core/src/cfdp/mod.rs index 436cdd4..7422798 100644 --- a/satrs-core/src/cfdp/mod.rs +++ b/satrs-core/src/cfdp/mod.rs @@ -1,4 +1,4 @@ -use core::hash::Hash; +use core::{cell::RefCell, fmt::Debug, hash::Hash}; use crc::{Crc, CRC_32_CKSUM}; use hashbrown::HashMap; @@ -39,8 +39,9 @@ pub enum EntityType { /// For the receiving entity, this timer determines the expiry period for incrementing a check /// counter after an EOF PDU is received for an incomplete file transfer. This allows out-of-order /// reception of file data PDUs and EOF PDUs. Also see 4.6.3.3 of the CFDP standard. -pub trait CheckTimer { +pub trait CheckTimer: Debug { fn has_expired(&self) -> bool; + fn reset(&mut self); } /// A generic trait which allows CFDP entities to create check timers which are required to @@ -64,6 +65,7 @@ pub trait CheckTimerCreator { /// Simple implementation of the [CheckTimerProvider] trait assuming a standard runtime. /// It also assumes that a second accuracy of the check timer period is sufficient. #[cfg(feature = "std")] +#[derive(Debug)] pub struct StdCheckTimer { expiry_time_seconds: u64, start_time: std::time::Instant, @@ -88,6 +90,10 @@ impl CheckTimer for StdCheckTimer { } false } + + fn reset(&mut self) { + self.start_time = std::time::Instant::now(); + } } #[derive(Debug, Copy, Clone)] @@ -186,7 +192,9 @@ pub trait UserFaultHandler { pub struct DefaultFaultHandler { handler_array: [FaultHandlerCode; 10], - user_fault_handler: Box, + // Could also change the user fault handler trait to have non mutable methods, but that limits + // flexbility on the user side.. + user_fault_handler: RefCell>, } impl DefaultFaultHandler { @@ -227,7 +235,7 @@ impl DefaultFaultHandler { .unwrap()] = FaultHandlerCode::IgnoreError; Self { handler_array: init_array, - user_fault_handler, + user_fault_handler: RefCell::new(user_fault_handler), } } @@ -240,7 +248,7 @@ impl DefaultFaultHandler { } pub fn report_fault( - &mut self, + &self, transaction_id: TransactionId, condition: ConditionCode, progress: u64, @@ -250,28 +258,19 @@ impl DefaultFaultHandler { return FaultHandlerCode::IgnoreError; } let fh_code = self.handler_array[array_idx.unwrap()]; + let mut handler_mut = self.user_fault_handler.borrow_mut(); match fh_code { FaultHandlerCode::NoticeOfCancellation => { - self.user_fault_handler.notice_of_cancellation_cb( - transaction_id, - condition, - progress, - ); + handler_mut.notice_of_cancellation_cb(transaction_id, condition, progress); } FaultHandlerCode::NoticeOfSuspension => { - self.user_fault_handler.notice_of_suspension_cb( - transaction_id, - condition, - progress, - ); + handler_mut.notice_of_suspension_cb(transaction_id, condition, progress); } FaultHandlerCode::IgnoreError => { - self.user_fault_handler - .ignore_cb(transaction_id, condition, progress); + handler_mut.ignore_cb(transaction_id, condition, progress); } FaultHandlerCode::AbandonTransaction => { - self.user_fault_handler - .abandoned_cb(transaction_id, condition, progress); + handler_mut.abandoned_cb(transaction_id, condition, progress); } } fh_code @@ -347,9 +346,10 @@ pub enum TransactionStep { Idle = 0, TransactionStart = 1, ReceivingFileDataPdus = 2, - SendingAckPdu = 3, - TransferCompletion = 4, - SendingFinishedPdu = 5, + ReceivingFileDataPdusWithCheckLimitHandling = 3, + SendingAckPdu = 4, + TransferCompletion = 5, + SendingFinishedPdu = 6, } #[derive(Debug, Copy, Clone, PartialEq, Eq)] From 7615729af9c7d55c44c932704b03d19683ec78f4 Mon Sep 17 00:00:00 2001 From: Robin Mueller Date: Thu, 14 Dec 2023 12:17:16 +0100 Subject: [PATCH 14/38] fix tests --- satrs-core/src/pus/verification.rs | 2 +- satrs-core/tests/pus_verification.rs | 10 +++++----- 2 files changed, 6 insertions(+), 6 deletions(-) diff --git a/satrs-core/src/pus/verification.rs b/satrs-core/src/pus/verification.rs index 35e4695..ff38b89 100644 --- a/satrs-core/src/pus/verification.rs +++ b/satrs-core/src/pus/verification.rs @@ -39,7 +39,7 @@ //! //! let mut sph = SpHeader::tc_unseg(TEST_APID, 0, 0).unwrap(); //! let tc_header = PusTcSecondaryHeader::new_simple(17, 1); -//! let pus_tc_0 = PusTcCreator::new(&mut sph, tc_header, None, true); +//! let pus_tc_0 = PusTcCreator::new_no_app_data(&mut sph, tc_header, true); //! let init_token = reporter.add_tc(&pus_tc_0); //! //! // Complete success sequence for a telecommand diff --git a/satrs-core/tests/pus_verification.rs b/satrs-core/tests/pus_verification.rs index 097eba8..17abd37 100644 --- a/satrs-core/tests/pus_verification.rs +++ b/satrs-core/tests/pus_verification.rs @@ -9,7 +9,7 @@ pub mod crossbeam_test { use satrs_core::tmtc::tm_helper::SharedTmStore; use spacepackets::ecss::tc::{PusTcCreator, PusTcReader, PusTcSecondaryHeader}; use spacepackets::ecss::tm::PusTmReader; - use spacepackets::ecss::{EcssEnumU16, EcssEnumU8, PusPacket, SerializablePusPacket}; + use spacepackets::ecss::{EcssEnumU16, EcssEnumU8, PusPacket, WritablePusPacket}; use spacepackets::SpHeader; use std::sync::{Arc, RwLock}; use std::thread; @@ -54,16 +54,16 @@ pub mod crossbeam_test { let mut tc_guard = shared_tc_pool_0.write().unwrap(); let mut sph = SpHeader::tc_unseg(TEST_APID, 0, 0).unwrap(); let tc_header = PusTcSecondaryHeader::new_simple(17, 1); - let pus_tc_0 = PusTcCreator::new(&mut sph, tc_header, None, true); + let pus_tc_0 = PusTcCreator::new_no_app_data(&mut sph, tc_header, true); req_id_0 = RequestId::new(&pus_tc_0); - let (addr, mut buf) = tc_guard.free_element(pus_tc_0.len_packed()).unwrap(); + let (addr, mut buf) = tc_guard.free_element(pus_tc_0.len_written()).unwrap(); pus_tc_0.write_to_bytes(&mut buf).unwrap(); tx_tc_0.send(addr).unwrap(); let mut sph = SpHeader::tc_unseg(TEST_APID, 1, 0).unwrap(); let tc_header = PusTcSecondaryHeader::new_simple(5, 1); - let pus_tc_1 = PusTcCreator::new(&mut sph, tc_header, None, true); + let pus_tc_1 = PusTcCreator::new_no_app_data(&mut sph, tc_header, true); req_id_1 = RequestId::new(&pus_tc_1); - let (addr, mut buf) = tc_guard.free_element(pus_tc_0.len_packed()).unwrap(); + let (addr, mut buf) = tc_guard.free_element(pus_tc_0.len_written()).unwrap(); pus_tc_1.write_to_bytes(&mut buf).unwrap(); tx_tc_1.send(addr).unwrap(); } From 4e81fd2e169500b2c6dbcf126f91d61ba2c30802 Mon Sep 17 00:00:00 2001 From: Robin Mueller Date: Thu, 14 Dec 2023 12:27:37 +0100 Subject: [PATCH 15/38] some improvements --- satrs-core/tests/pus_verification.rs | 17 +++++++---------- 1 file changed, 7 insertions(+), 10 deletions(-) diff --git a/satrs-core/tests/pus_verification.rs b/satrs-core/tests/pus_verification.rs index 17abd37..8c8a0af 100644 --- a/satrs-core/tests/pus_verification.rs +++ b/satrs-core/tests/pus_verification.rs @@ -56,15 +56,15 @@ pub mod crossbeam_test { let tc_header = PusTcSecondaryHeader::new_simple(17, 1); let pus_tc_0 = PusTcCreator::new_no_app_data(&mut sph, tc_header, true); req_id_0 = RequestId::new(&pus_tc_0); - let (addr, mut buf) = tc_guard.free_element(pus_tc_0.len_written()).unwrap(); - pus_tc_0.write_to_bytes(&mut buf).unwrap(); + let (addr, buf) = tc_guard.free_element(pus_tc_0.len_written()).unwrap(); + pus_tc_0.write_to_bytes(buf).unwrap(); tx_tc_0.send(addr).unwrap(); let mut sph = SpHeader::tc_unseg(TEST_APID, 1, 0).unwrap(); let tc_header = PusTcSecondaryHeader::new_simple(5, 1); let pus_tc_1 = PusTcCreator::new_no_app_data(&mut sph, tc_header, true); req_id_1 = RequestId::new(&pus_tc_1); - let (addr, mut buf) = tc_guard.free_element(pus_tc_0.len_written()).unwrap(); - pus_tc_1.write_to_bytes(&mut buf).unwrap(); + let (addr, buf) = tc_guard.free_element(pus_tc_0.len_written()).unwrap(); + pus_tc_1.write_to_bytes(buf).unwrap(); tx_tc_1.send(addr).unwrap(); } let verif_sender_0 = thread::spawn(move || { @@ -81,16 +81,14 @@ pub mod crossbeam_test { tc_buf[0..tc_len].copy_from_slice(buf); } let (_tc, _) = PusTcReader::new(&tc_buf[0..tc_len]).unwrap(); - let accepted_token; let token = reporter_with_sender_0.add_tc_with_req_id(req_id_0); - accepted_token = reporter_with_sender_0 + let accepted_token = reporter_with_sender_0 .acceptance_success(token, Some(&FIXED_STAMP)) .expect("Acceptance success failed"); // Do some start handling here - let started_token; - started_token = reporter_with_sender_0 + let started_token = reporter_with_sender_0 .start_success(accepted_token, Some(&FIXED_STAMP)) .expect("Start success failed"); // Do some step handling here @@ -158,8 +156,7 @@ pub mod crossbeam_test { RequestId::from_bytes(&pus_tm.source_data()[0..RequestId::SIZE_AS_BYTES]) .expect("reading request ID from PUS TM source data failed"); if !verif_map.contains_key(&req_id) { - let mut content = Vec::new(); - content.push(pus_tm.subservice()); + let content =vec![pus_tm.subservice()]; verif_map.insert(req_id, content); } else { let content = verif_map.get_mut(&req_id).unwrap(); From 37c2f72cbcc4512d855a7ae31eff456600f3fcea Mon Sep 17 00:00:00 2001 From: Robin Mueller Date: Thu, 14 Dec 2023 14:22:52 +0100 Subject: [PATCH 16/38] cargo fmt --- satrs-core/tests/pus_verification.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/satrs-core/tests/pus_verification.rs b/satrs-core/tests/pus_verification.rs index 8c8a0af..9c9fc63 100644 --- a/satrs-core/tests/pus_verification.rs +++ b/satrs-core/tests/pus_verification.rs @@ -156,7 +156,7 @@ pub mod crossbeam_test { RequestId::from_bytes(&pus_tm.source_data()[0..RequestId::SIZE_AS_BYTES]) .expect("reading request ID from PUS TM source data failed"); if !verif_map.contains_key(&req_id) { - let content =vec![pus_tm.subservice()]; + let content = vec![pus_tm.subservice()]; verif_map.insert(req_id, content); } else { let content = verif_map.get_mut(&req_id).unwrap(); From 27c5e4d14eadc6763af5f4bbf57a8336a2e30965 Mon Sep 17 00:00:00 2001 From: Robin Mueller Date: Fri, 15 Dec 2023 13:49:24 +0100 Subject: [PATCH 17/38] cleaned up tests --- satrs-core/src/cfdp/dest.rs | 346 ++++++++++++++++++------------------ 1 file changed, 175 insertions(+), 171 deletions(-) diff --git a/satrs-core/src/cfdp/dest.rs b/satrs-core/src/cfdp/dest.rs index 0b564b2..9a55350 100644 --- a/satrs-core/src/cfdp/dest.rs +++ b/satrs-core/src/cfdp/dest.rs @@ -621,6 +621,9 @@ impl DestinationHandler { } fn declare_fault(&mut self, condition_code: ConditionCode) -> FaultHandlerCode { + // Cache those, because they might be reset when abandoning the transaction. + let transaction_id = self.tstate().transaction_id.unwrap(); + let progress = self.tstate().progress; let fh_code = self .local_cfg .default_fault_handler @@ -630,19 +633,19 @@ impl DestinationHandler { self.notice_of_cancellation(); } FaultHandlerCode::NoticeOfSuspension => self.notice_of_suspension(), - FaultHandlerCode::IgnoreError => todo!(), - FaultHandlerCode::AbandonTransaction => todo!(), + FaultHandlerCode::IgnoreError => (), + FaultHandlerCode::AbandonTransaction => self.abandon_transaction(), } - let tstate = self.tstate(); - self.local_cfg.default_fault_handler.report_fault( - tstate.transaction_id.unwrap(), - condition_code, - tstate.progress, - ) + self.local_cfg + .default_fault_handler + .report_fault(transaction_id, condition_code, progress) } fn notice_of_cancellation(&mut self) {} fn notice_of_suspension(&mut self) {} + fn abandon_transaction(&mut self) { + self.reset(); + } fn reset(&mut self) { self.step = TransactionStep::Idle; @@ -670,7 +673,7 @@ mod tests { #[allow(unused_imports)] use std::println; - use alloc::{collections::VecDeque, string::String}; + use alloc::{collections::VecDeque, string::String, vec::Vec}; use rand::Rng; use spacepackets::{ cfdp::{ @@ -697,7 +700,7 @@ mod tests { next_expected_seq_num: u64, expected_full_src_name: String, expected_full_dest_name: String, - expected_file_size: usize, + expected_file_size: u64, } impl TestCfdpUser { @@ -783,7 +786,7 @@ mod tests { ); assert_eq!(md_recvd_params.msgs_to_user.len(), 0); assert_eq!(md_recvd_params.source_id, LOCAL_ID.into()); - assert_eq!(md_recvd_params.file_size as usize, self.expected_file_size); + assert_eq!(md_recvd_params.file_size, self.expected_file_size); } fn file_segment_recvd_indication( @@ -888,6 +891,110 @@ mod tests { } } + struct TestClass { + handler: DestinationHandler, + src_path: PathBuf, + dest_path: PathBuf, + check_dest_file: bool, + check_handler_idle_at_drop: bool, + expected_file_size: u64, + pdu_header: PduHeader, + expected_full_data: Vec, + buf: [u8; 512], + } + + impl TestClass { + fn new() -> Self { + let dest_handler = default_dest_handler(); + let (src_path, dest_path) = init_full_filenames(); + assert!(!Path::exists(&dest_path)); + let handler = Self { + handler: dest_handler, + src_path, + dest_path, + check_dest_file: true, + check_handler_idle_at_drop: true, + expected_file_size: 0, + pdu_header: create_pdu_header(UbfU16::new(0)), + expected_full_data: Vec::new(), + buf: [0; 512], + }; + handler.state_check(State::Idle, TransactionStep::Idle); + handler + } + + fn test_user_from_cached_paths(&self, expected_file_size: u64) -> TestCfdpUser { + TestCfdpUser { + next_expected_seq_num: 0, + expected_full_src_name: self.src_path.to_string_lossy().into(), + expected_full_dest_name: self.dest_path.to_string_lossy().into(), + expected_file_size, + } + } + + fn generic_transfer_init( + &mut self, + user: &mut impl CfdpUser, + file_size: u64, + ) -> Result<(), DestError> { + self.expected_file_size = file_size; + let metadata_pdu = create_metadata_pdu( + &self.pdu_header, + self.src_path.as_path(), + self.dest_path.as_path(), + file_size, + ); + let packet_info = create_packet_info(&metadata_pdu, &mut self.buf); + self.handler.state_machine(user, Some(&packet_info)) + } + + fn generic_file_data_insert( + &mut self, + user: &mut impl CfdpUser, + offset: u64, + file_data_chunk: &[u8], + ) -> Result<(), DestError> { + let filedata_pdu = + FileDataPdu::new_no_seg_metadata(self.pdu_header, offset, file_data_chunk); + filedata_pdu + .write_to_bytes(&mut self.buf) + .expect("writing file data PDU failed"); + let packet_info = PacketInfo::new(&self.buf).expect("creating packet info failed"); + self.handler.state_machine(user, Some(&packet_info)) + } + + fn generic_eof_no_error( + &mut self, + user: &mut impl CfdpUser, + expected_full_data: Vec, + ) -> Result<(), DestError> { + self.expected_full_data = expected_full_data; + let eof_pdu = create_no_error_eof(&self.expected_full_data, &self.pdu_header); + let packet_info = create_packet_info(&eof_pdu, &mut self.buf); + self.handler.state_machine(user, Some(&packet_info)) + } + + fn state_check(&self, state: State, step: TransactionStep) { + assert_eq!(self.handler.state(), state); + assert_eq!(self.handler.step(), step); + } + } + + impl Drop for TestClass { + fn drop(&mut self) { + if self.check_handler_idle_at_drop { + self.state_check(State::Idle, TransactionStep::Idle); + } + if self.check_dest_file { + assert!(Path::exists(&self.dest_path)); + let read_content = fs::read(&self.dest_path).expect("reading back string failed"); + assert_eq!(read_content.len() as u64, self.expected_file_size); + assert_eq!(read_content, self.expected_full_data); + assert!(fs::remove_file(self.dest_path.as_path()).is_ok()); + } + } + } + fn init_check(handler: &DestinationHandler) { assert_eq!(handler.state(), State::Idle); assert_eq!(handler.step(), TransactionStep::Idle); @@ -932,11 +1039,6 @@ mod tests { Box::new(TestCheckTimerCreator::new(2, 2)), ) } - #[test] - fn test_basic() { - let dest_handler = default_dest_handler(); - init_check(&dest_handler); - } fn create_pdu_header(seq_num: impl Into) -> PduHeader { let mut pdu_conf = @@ -971,181 +1073,83 @@ mod tests { } fn create_no_error_eof(file_data: &[u8], pdu_header: &PduHeader) -> EofPdu { - let mut digest = CRC_32.digest(); - digest.update(file_data); - let crc32 = digest.finalize(); + let crc32 = if !file_data.is_empty() { + let mut digest = CRC_32.digest(); + digest.update(file_data); + digest.finalize() + } else { + 0 + }; EofPdu::new_no_error(*pdu_header, crc32, file_data.len() as u64) } + #[test] + fn test_basic() { + default_dest_handler(); + } + #[test] fn test_empty_file_transfer_not_acked() { - let (src_name, dest_name) = init_full_filenames(); - assert!(!Path::exists(&dest_name)); - let mut buf: [u8; 512] = [0; 512]; - let mut test_user = TestCfdpUser { - next_expected_seq_num: 0, - expected_full_src_name: src_name.to_string_lossy().into(), - expected_full_dest_name: dest_name.to_string_lossy().into(), - expected_file_size: 0, - }; - // We treat the destination handler like it is a remote entity. - let mut dest_handler = default_dest_handler(); - init_check(&dest_handler); - - let seq_num = UbfU16::new(0); - let pdu_header = create_pdu_header(seq_num); - let metadata_pdu = - create_metadata_pdu(&pdu_header, src_name.as_path(), dest_name.as_path(), 0); - let packet_info = create_packet_info(&metadata_pdu, &mut buf); - let result = dest_handler.state_machine(&mut test_user, Some(&packet_info)); - if let Err(e) = result { - panic!("dest handler fsm error: {e}"); - } - assert_ne!(dest_handler.state(), State::Idle); - assert_eq!(dest_handler.step(), TransactionStep::ReceivingFileDataPdus); - - let eof_pdu = create_no_error_eof(&[], &pdu_header); - let packet_info = create_packet_info(&eof_pdu, &mut buf); - let result = dest_handler.state_machine(&mut test_user, Some(&packet_info)); - assert!(result.is_ok()); - assert_eq!(dest_handler.state(), State::Idle); - assert_eq!(dest_handler.step(), TransactionStep::Idle); - assert!(Path::exists(&dest_name)); - let read_content = fs::read(&dest_name).expect("reading back string failed"); - assert_eq!(read_content.len(), 0); - assert!(fs::remove_file(dest_name).is_ok()); + let mut test_obj = TestClass::new(); + let mut test_user = test_obj.test_user_from_cached_paths(0); + test_obj + .generic_transfer_init(&mut test_user, 0) + .expect("transfer init failed"); + test_obj.state_check(State::Busy, TransactionStep::ReceivingFileDataPdus); + test_obj + .generic_eof_no_error(&mut test_user, Vec::new()) + .expect("EOF no error insertion failed"); } #[test] fn test_small_file_transfer_not_acked() { - let (src_name, dest_name) = init_full_filenames(); - assert!(!Path::exists(&dest_name)); let file_data_str = "Hello World!"; let file_data = file_data_str.as_bytes(); - let mut buf: [u8; 512] = [0; 512]; - let mut test_user = TestCfdpUser { - next_expected_seq_num: 0, - expected_full_src_name: src_name.to_string_lossy().into(), - expected_full_dest_name: dest_name.to_string_lossy().into(), - expected_file_size: file_data.len(), - }; - // We treat the destination handler like it is a remote entity. - let mut dest_handler = default_dest_handler(); - init_check(&dest_handler); + let file_size = file_data.len() as u64; - let seq_num = UbfU16::new(0); - let pdu_header = create_pdu_header(seq_num); - let metadata_pdu = create_metadata_pdu( - &pdu_header, - src_name.as_path(), - dest_name.as_path(), - file_data.len() as u64, - ); - let packet_info = create_packet_info(&metadata_pdu, &mut buf); - let result = dest_handler.state_machine(&mut test_user, Some(&packet_info)); - if let Err(e) = result { - panic!("dest handler fsm error: {e}"); - } - assert_ne!(dest_handler.state(), State::Idle); - assert_eq!(dest_handler.step(), TransactionStep::ReceivingFileDataPdus); - - let offset = 0; - let filedata_pdu = FileDataPdu::new_no_seg_metadata(pdu_header, offset, file_data); - filedata_pdu - .write_to_bytes(&mut buf) - .expect("writing file data PDU failed"); - let packet_info = PacketInfo::new(&buf).expect("creating packet info failed"); - let result = dest_handler.state_machine(&mut test_user, Some(&packet_info)); - assert!(result.is_ok()); - - let eof_pdu = create_no_error_eof(file_data, &pdu_header); - let packet_info = create_packet_info(&eof_pdu, &mut buf); - let result = dest_handler.state_machine(&mut test_user, Some(&packet_info)); - assert!(result.is_ok()); - assert_eq!(dest_handler.state(), State::Idle); - assert_eq!(dest_handler.step(), TransactionStep::Idle); - - assert!(Path::exists(&dest_name)); - let read_content = fs::read_to_string(&dest_name).expect("reading back string failed"); - assert_eq!(read_content, file_data_str); - assert!(fs::remove_file(dest_name).is_ok()); + let mut test_obj = TestClass::new(); + let mut test_user = test_obj.test_user_from_cached_paths(file_size); + test_obj + .generic_transfer_init(&mut test_user, file_size) + .expect("transfer init failed"); + test_obj.state_check(State::Busy, TransactionStep::ReceivingFileDataPdus); + test_obj + .generic_file_data_insert(&mut test_user, 0, file_data) + .expect("file data insertion failed"); + test_obj + .generic_eof_no_error(&mut test_user, file_data.to_vec()) + .expect("EOF no error insertion failed"); } #[test] fn test_segmented_file_transfer_not_acked() { - let (src_name, dest_name) = init_full_filenames(); - assert!(!Path::exists(&dest_name)); let mut rng = rand::thread_rng(); let mut random_data = [0u8; 512]; rng.fill(&mut random_data); - let mut buf: [u8; 512] = [0; 512]; - let mut test_user = TestCfdpUser { - next_expected_seq_num: 0, - expected_full_src_name: src_name.to_string_lossy().into(), - expected_full_dest_name: dest_name.to_string_lossy().into(), - expected_file_size: random_data.len(), - }; - - // We treat the destination handler like it is a remote entity. - let mut dest_handler = default_dest_handler(); - init_check(&dest_handler); - - let seq_num = UbfU16::new(0); - let pdu_header = create_pdu_header(seq_num); - let metadata_pdu = create_metadata_pdu( - &pdu_header, - src_name.as_path(), - dest_name.as_path(), - random_data.len() as u64, - ); - let packet_info = create_packet_info(&metadata_pdu, &mut buf); - let result = dest_handler.state_machine(&mut test_user, Some(&packet_info)); - if let Err(e) = result { - panic!("dest handler fsm error: {e}"); - } - assert_ne!(dest_handler.state(), State::Idle); - assert_eq!(dest_handler.step(), TransactionStep::ReceivingFileDataPdus); - - // First file data PDU - let mut offset: usize = 0; + let file_size = random_data.len() as u64; let segment_len = 256; - let filedata_pdu = FileDataPdu::new_no_seg_metadata( - pdu_header, - offset as u64, - &random_data[0..segment_len], - ); - filedata_pdu - .write_to_bytes(&mut buf) - .expect("writing file data PDU failed"); - let packet_info = PacketInfo::new(&buf).expect("creating packet info failed"); - let result = dest_handler.state_machine(&mut test_user, Some(&packet_info)); - assert!(result.is_ok()); - // Second file data PDU - offset += segment_len; - let filedata_pdu = FileDataPdu::new_no_seg_metadata( - pdu_header, - offset as u64, - &random_data[segment_len..], - ); - filedata_pdu - .write_to_bytes(&mut buf) - .expect("writing file data PDU failed"); - let packet_info = PacketInfo::new(&buf).expect("creating packet info failed"); - let result = dest_handler.state_machine(&mut test_user, Some(&packet_info)); - assert!(result.is_ok()); - - let eof_pdu = create_no_error_eof(&random_data, &pdu_header); - let packet_info = create_packet_info(&eof_pdu, &mut buf); - let result = dest_handler.state_machine(&mut test_user, Some(&packet_info)); - assert!(result.is_ok()); - assert_eq!(dest_handler.state(), State::Idle); - assert_eq!(dest_handler.step(), TransactionStep::Idle); - - // Clean up - assert!(Path::exists(&dest_name)); - let read_content = fs::read(&dest_name).expect("reading back string failed"); - assert_eq!(read_content, random_data); - assert!(fs::remove_file(dest_name).is_ok()); + let mut test_obj = TestClass::new(); + let mut test_user = test_obj.test_user_from_cached_paths(file_size); + test_obj + .generic_transfer_init(&mut test_user, file_size) + .expect("transfer init failed"); + test_obj.state_check(State::Busy, TransactionStep::ReceivingFileDataPdus); + test_obj + .generic_file_data_insert(&mut test_user, 0, &random_data[0..segment_len]) + .expect("file data insertion failed"); + test_obj + .generic_file_data_insert( + &mut test_user, + segment_len as u64, + &random_data[segment_len..], + ) + .expect("file data insertion failed"); + test_obj + .generic_eof_no_error(&mut test_user, random_data.to_vec()) + .expect("EOF no error insertion failed"); } + + #[test] + fn test_check_limit_handling() {} } From 9605dbb13a9f6dd5524fcca2adf49eef24fb142e Mon Sep 17 00:00:00 2001 From: Robin Mueller Date: Fri, 15 Dec 2023 15:30:41 +0100 Subject: [PATCH 18/38] mocking the check timer is tricky --- satrs-core/src/cfdp/dest.rs | 97 ++++++++++++++++++++++--------------- 1 file changed, 59 insertions(+), 38 deletions(-) diff --git a/satrs-core/src/cfdp/dest.rs b/satrs-core/src/cfdp/dest.rs index 9a55350..029d3cc 100644 --- a/satrs-core/src/cfdp/dest.rs +++ b/satrs-core/src/cfdp/dest.rs @@ -423,6 +423,7 @@ impl DestinationHandler { return Ok(false); } self.start_check_limit_handling(); + return Ok(false); } Ok(true) } @@ -668,12 +669,12 @@ impl DestinationHandler { #[cfg(test)] mod tests { - use core::cell::Cell; + use core::{cell::Cell, sync::atomic::AtomicBool}; use std::fs; #[allow(unused_imports)] use std::println; - use alloc::{collections::VecDeque, string::String, vec::Vec}; + use alloc::{collections::VecDeque, string::String, sync::Arc, vec::Vec}; use rand::Rng; use spacepackets::{ cfdp::{ @@ -833,17 +834,12 @@ mod tests { #[derive(Debug)] struct TestCheckTimer { counter: Cell, - expiry_count: u32, + expired: Arc, } impl CheckTimer for TestCheckTimer { fn has_expired(&self) -> bool { - let current_counter = self.counter.get(); - if self.expiry_count == current_counter { - return true; - } - self.counter.set(current_counter + 1); - false + self.expired.load(core::sync::atomic::Ordering::Relaxed) } fn reset(&mut self) { self.counter.set(0); @@ -851,28 +847,26 @@ mod tests { } impl TestCheckTimer { - pub fn new(expiry_after_x_calls: u32) -> Self { + pub fn new(expired_flag: Arc) -> Self { Self { counter: Cell::new(0), - expiry_count: expiry_after_x_calls, + expired: expired_flag, } } + + fn set_expired(&mut self) { + self.expired + .store(true, core::sync::atomic::Ordering::Relaxed); + } } struct TestCheckTimerCreator { - expiry_counter_for_source_entity: u32, - expiry_counter_for_dest_entity: u32, + expired_flag: Arc, } impl TestCheckTimerCreator { - pub fn new( - expiry_counter_for_source_entity: u32, - expiry_counter_for_dest_entity: u32, - ) -> Self { - Self { - expiry_counter_for_source_entity, - expiry_counter_for_dest_entity, - } + pub fn new(expired_flag: Arc) -> Self { + Self { expired_flag } } } @@ -881,17 +875,14 @@ mod tests { &self, _local_id: &UnsignedByteField, _remote_id: &UnsignedByteField, - entity_type: crate::cfdp::EntityType, + _entity_type: crate::cfdp::EntityType, ) -> Box { - if entity_type == crate::cfdp::EntityType::Sending { - Box::new(TestCheckTimer::new(self.expiry_counter_for_source_entity)) - } else { - Box::new(TestCheckTimer::new(self.expiry_counter_for_dest_entity)) - } + Box::new(TestCheckTimer::new(self.expired_flag.clone())) } } struct TestClass { + check_timer_expired: Arc, handler: DestinationHandler, src_path: PathBuf, dest_path: PathBuf, @@ -905,10 +896,12 @@ mod tests { impl TestClass { fn new() -> Self { - let dest_handler = default_dest_handler(); + let check_timer_expired = Arc::new(AtomicBool::new(false)); + let dest_handler = default_dest_handler(check_timer_expired.clone()); let (src_path, dest_path) = init_full_filenames(); assert!(!Path::exists(&dest_path)); let handler = Self { + check_timer_expired, handler: dest_handler, src_path, dest_path, @@ -923,6 +916,11 @@ mod tests { handler } + fn set_check_timer_expired(&mut self) { + self.check_timer_expired + .store(true, core::sync::atomic::Ordering::Relaxed); + } + fn test_user_from_cached_paths(&self, expected_file_size: u64) -> TestCfdpUser { TestCfdpUser { next_expected_seq_num: 0, @@ -995,11 +993,6 @@ mod tests { } } - fn init_check(handler: &DestinationHandler) { - assert_eq!(handler.state(), State::Idle); - assert_eq!(handler.step(), TransactionStep::Idle); - } - fn init_full_filenames() -> (PathBuf, PathBuf) { ( tempfile::TempPath::from_path("/tmp/test.txt").to_path_buf(), @@ -1025,7 +1018,7 @@ mod tests { table } - fn default_dest_handler() -> DestinationHandler { + fn default_dest_handler(check_timer_expired: Arc) -> DestinationHandler { let test_fault_handler = TestFaultHandler::default(); let local_entity_cfg = LocalEntityConfig { id: REMOTE_ID.into(), @@ -1036,7 +1029,7 @@ mod tests { local_entity_cfg, Box::::default(), Box::new(basic_remote_cfg_table()), - Box::new(TestCheckTimerCreator::new(2, 2)), + Box::new(TestCheckTimerCreator::new(check_timer_expired)), ) } @@ -1053,7 +1046,12 @@ mod tests { dest_name: &'filename Path, file_size: u64, ) -> MetadataPduCreator<'filename, 'filename, 'static> { - let metadata_params = MetadataGenericParams::new(false, ChecksumType::Crc32, file_size); + let checksum_type = if file_size == 0 { + ChecksumType::NullChecksum + } else { + ChecksumType::Crc32 + }; + let metadata_params = MetadataGenericParams::new(false, checksum_type, file_size); MetadataPduCreator::new_no_opts( *pdu_header, metadata_params, @@ -1085,7 +1083,7 @@ mod tests { #[test] fn test_basic() { - default_dest_handler(); + default_dest_handler(Arc::default()); } #[test] @@ -1151,5 +1149,28 @@ mod tests { } #[test] - fn test_check_limit_handling() {} + fn test_check_limit_handling() { + let mut rng = rand::thread_rng(); + let mut random_data = [0u8; 512]; + rng.fill(&mut random_data); + let file_size = random_data.len() as u64; + let segment_len = 256; + + let mut test_obj = TestClass::new(); + let mut test_user = test_obj.test_user_from_cached_paths(file_size); + test_obj + .generic_transfer_init(&mut test_user, file_size) + .expect("transfer init failed"); + test_obj.state_check(State::Busy, TransactionStep::ReceivingFileDataPdus); + test_obj + .generic_file_data_insert(&mut test_user, 0, &random_data[0..segment_len]) + .expect("file data insertion failed"); + test_obj + .generic_eof_no_error(&mut test_user, random_data.to_vec()) + .expect("EOF no error insertion failed"); + test_obj.state_check( + State::Busy, + TransactionStep::ReceivingFileDataPdusWithCheckLimitHandling, + ); + } } From 2f07fdfe83375d28fed273791fcdae14c852b38f Mon Sep 17 00:00:00 2001 From: Robin Mueller Date: Fri, 15 Dec 2023 16:08:39 +0100 Subject: [PATCH 19/38] first test for check limit handling --- satrs-core/src/cfdp/dest.rs | 30 ++++++++++++++++++++---------- 1 file changed, 20 insertions(+), 10 deletions(-) diff --git a/satrs-core/src/cfdp/dest.rs b/satrs-core/src/cfdp/dest.rs index 029d3cc..61fdb75 100644 --- a/satrs-core/src/cfdp/dest.rs +++ b/satrs-core/src/cfdp/dest.rs @@ -355,7 +355,10 @@ impl DestinationHandler { } pub fn handle_file_data(&mut self, raw_packet: &[u8]) -> Result<(), DestError> { - if self.state == State::Idle || self.step != TransactionStep::ReceivingFileDataPdus { + if self.state == State::Idle + || (self.step != TransactionStep::ReceivingFileDataPdus + && self.step != TransactionStep::ReceivingFileDataPdusWithCheckLimitHandling) + { return Err(DestError::WrongStateForFileDataAndEof); } let fd_pdu = FileDataPdu::from_bytes(raw_packet)?; @@ -506,12 +509,12 @@ impl DestinationHandler { if self.step == TransactionStep::TransactionStart { self.transaction_start(cfdp_user)?; } - if self.step == TransactionStep::TransferCompletion { - self.transfer_completion(cfdp_user)?; - } if self.step == TransactionStep::ReceivingFileDataPdusWithCheckLimitHandling { self.check_limit_handling(); } + if self.step == TransactionStep::TransferCompletion { + self.transfer_completion(cfdp_user)?; + } if self.step == TransactionStep::SendingAckPdu { todo!("no support for acknowledged mode yet"); } @@ -853,11 +856,6 @@ mod tests { expired: expired_flag, } } - - fn set_expired(&mut self) { - self.expired - .store(true, core::sync::atomic::Ordering::Relaxed); - } } struct TestCheckTimerCreator { @@ -1164,7 +1162,7 @@ mod tests { test_obj.state_check(State::Busy, TransactionStep::ReceivingFileDataPdus); test_obj .generic_file_data_insert(&mut test_user, 0, &random_data[0..segment_len]) - .expect("file data insertion failed"); + .expect("file data insertion 0 failed"); test_obj .generic_eof_no_error(&mut test_user, random_data.to_vec()) .expect("EOF no error insertion failed"); @@ -1172,5 +1170,17 @@ mod tests { State::Busy, TransactionStep::ReceivingFileDataPdusWithCheckLimitHandling, ); + test_obj + .generic_file_data_insert( + &mut test_user, + segment_len as u64, + &random_data[segment_len..], + ) + .expect("file data insertion 1 failed"); + test_obj.set_check_timer_expired(); + test_obj + .handler + .state_machine(&mut test_user, None) + .expect("fsm failure"); } } From 28a8b18329bc111ee85900387780f66153fa4670 Mon Sep 17 00:00:00 2001 From: Robin Mueller Date: Fri, 15 Dec 2023 16:10:46 +0100 Subject: [PATCH 20/38] the file store still required alloc --- satrs-core/src/cfdp/mod.rs | 1 + 1 file changed, 1 insertion(+) diff --git a/satrs-core/src/cfdp/mod.rs b/satrs-core/src/cfdp/mod.rs index 7422798..110b588 100644 --- a/satrs-core/src/cfdp/mod.rs +++ b/satrs-core/src/cfdp/mod.rs @@ -17,6 +17,7 @@ use serde::{Deserialize, Serialize}; #[cfg(feature = "std")] pub mod dest; +#[cfg(feature = "alloc")] pub mod filestore; #[cfg(feature = "std")] pub mod source; From 7e8be538e0a2bdffcc65ab4b3ec2422bc2facc08 Mon Sep 17 00:00:00 2001 From: Robin Mueller Date: Fri, 15 Dec 2023 17:18:28 +0100 Subject: [PATCH 21/38] improve CFDP tests --- satrs-core/src/cfdp/dest.rs | 267 +++++++++++++++++++++++------------- satrs-core/src/cfdp/user.rs | 39 +++++- 2 files changed, 208 insertions(+), 98 deletions(-) diff --git a/satrs-core/src/cfdp/dest.rs b/satrs-core/src/cfdp/dest.rs index 61fdb75..b10afab 100644 --- a/satrs-core/src/cfdp/dest.rs +++ b/satrs-core/src/cfdp/dest.rs @@ -4,7 +4,7 @@ use std::path::{Path, PathBuf}; use super::{ filestore::{FilestoreError, VirtualFilestore}, - user::{CfdpUser, MetadataReceivedParams}, + user::{CfdpUser, FileSegmentRecvdParams, MetadataReceivedParams}, CheckTimer, CheckTimerCreator, EntityType, LocalEntityConfig, PacketInfo, PacketTarget, RemoteEntityConfig, RemoteEntityConfigProvider, State, TransactionId, TransactionStep, }; @@ -229,7 +229,7 @@ impl DestinationHandler { packet_info.raw_packet, ) } - PduType::FileData => self.handle_file_data(packet_info.raw_packet), + PduType::FileData => self.handle_file_data(cfdp_user, packet_info.raw_packet), } } @@ -354,7 +354,11 @@ impl DestinationHandler { Ok(()) } - pub fn handle_file_data(&mut self, raw_packet: &[u8]) -> Result<(), DestError> { + pub fn handle_file_data( + &mut self, + user: &mut impl CfdpUser, + raw_packet: &[u8], + ) -> Result<(), DestError> { if self.state == State::Idle || (self.step != TransactionStep::ReceivingFileDataPdus && self.step != TransactionStep::ReceivingFileDataPdusWithCheckLimitHandling) @@ -362,6 +366,14 @@ impl DestinationHandler { return Err(DestError::WrongStateForFileDataAndEof); } let fd_pdu = FileDataPdu::from_bytes(raw_packet)?; + if self.local_cfg.indication_cfg.file_segment_recv { + user.file_segment_recvd_indication(&FileSegmentRecvdParams { + id: self.tstate().transaction_id.unwrap(), + offset: fd_pdu.offset(), + length: fd_pdu.file_data().len(), + segment_metadata: fd_pdu.segment_metadata(), + }); + } if let Err(e) = self.vfs.write_data( self.tparams.file_properties.dest_path_buf.to_str().unwrap(), fd_pdu.offset(), @@ -689,9 +701,9 @@ mod tests { }; use crate::cfdp::{ - filestore::NativeFilestore, CheckTimer, CheckTimerCreator, DefaultFaultHandler, - IndicationConfig, RemoteEntityConfig, StdRemoteEntityConfigProvider, UserFaultHandler, - CRC_32, + filestore::NativeFilestore, user::OwnedMetadataRecvdParams, CheckTimer, CheckTimerCreator, + DefaultFaultHandler, IndicationConfig, RemoteEntityConfig, StdRemoteEntityConfigProvider, + UserFaultHandler, CRC_32, }; use super::*; @@ -699,21 +711,137 @@ mod tests { const LOCAL_ID: UnsignedByteFieldU16 = UnsignedByteFieldU16::new(1); const REMOTE_ID: UnsignedByteFieldU16 = UnsignedByteFieldU16::new(2); + pub struct FileSegmentRecvdParamsNoSegMetadata { + pub id: TransactionId, + pub offset: u64, + pub length: usize, + } + #[derive(Default)] struct TestCfdpUser { next_expected_seq_num: u64, expected_full_src_name: String, expected_full_dest_name: String, expected_file_size: u64, + transaction_indication_call_count: u32, + eof_recvd_call_count: u32, + finished_indic_queue: VecDeque, + metadata_recv_queue: VecDeque, + file_seg_recvd_queue: VecDeque, } impl TestCfdpUser { + fn new( + next_expected_seq_num: u64, + expected_full_src_name: String, + expected_full_dest_name: String, + expected_file_size: u64, + ) -> Self { + Self { + next_expected_seq_num, + expected_full_src_name, + expected_full_dest_name, + expected_file_size, + transaction_indication_call_count: 0, + eof_recvd_call_count: 0, + finished_indic_queue: VecDeque::new(), + metadata_recv_queue: VecDeque::new(), + file_seg_recvd_queue: VecDeque::new(), + } + } + fn generic_id_check(&self, id: &crate::cfdp::TransactionId) { assert_eq!(id.source_id, LOCAL_ID.into()); assert_eq!(id.seq_num().value(), self.next_expected_seq_num); } } + impl CfdpUser for TestCfdpUser { + fn transaction_indication(&mut self, id: &crate::cfdp::TransactionId) { + self.generic_id_check(id); + self.transaction_indication_call_count += 1; + } + + fn eof_sent_indication(&mut self, id: &crate::cfdp::TransactionId) { + self.generic_id_check(id); + } + + fn transaction_finished_indication( + &mut self, + finished_params: &crate::cfdp::user::TransactionFinishedParams, + ) { + self.generic_id_check(&finished_params.id); + self.finished_indic_queue.push_back(*finished_params); + } + + fn metadata_recvd_indication( + &mut self, + md_recvd_params: &crate::cfdp::user::MetadataReceivedParams, + ) { + self.generic_id_check(&md_recvd_params.id); + assert_eq!( + String::from(md_recvd_params.src_file_name), + self.expected_full_src_name + ); + assert_eq!( + String::from(md_recvd_params.dest_file_name), + self.expected_full_dest_name + ); + assert_eq!(md_recvd_params.msgs_to_user.len(), 0); + assert_eq!(md_recvd_params.source_id, LOCAL_ID.into()); + assert_eq!(md_recvd_params.file_size, self.expected_file_size); + self.metadata_recv_queue.push_back(md_recvd_params.into()); + } + + fn file_segment_recvd_indication( + &mut self, + segment_recvd_params: &crate::cfdp::user::FileSegmentRecvdParams, + ) { + self.generic_id_check(&segment_recvd_params.id); + self.file_seg_recvd_queue + .push_back(FileSegmentRecvdParamsNoSegMetadata { + id: segment_recvd_params.id, + offset: segment_recvd_params.offset, + length: segment_recvd_params.length, + }) + } + + fn report_indication(&mut self, _id: &crate::cfdp::TransactionId) {} + + fn suspended_indication( + &mut self, + _id: &crate::cfdp::TransactionId, + _condition_code: ConditionCode, + ) { + panic!("unexpected suspended indication"); + } + + fn resumed_indication(&mut self, _id: &crate::cfdp::TransactionId, _progresss: u64) {} + + fn fault_indication( + &mut self, + _id: &crate::cfdp::TransactionId, + _condition_code: ConditionCode, + _progress: u64, + ) { + panic!("unexpected fault indication"); + } + + fn abandoned_indication( + &mut self, + _id: &crate::cfdp::TransactionId, + _condition_code: ConditionCode, + _progress: u64, + ) { + panic!("unexpected abandoned indication"); + } + + fn eof_recvd_indication(&mut self, id: &crate::cfdp::TransactionId) { + self.generic_id_check(id); + self.eof_recvd_call_count += 1; + } + } + #[derive(Default)] struct TestFaultHandler { notice_of_suspension_queue: VecDeque<(TransactionId, ConditionCode, u64)>, @@ -759,81 +887,6 @@ mod tests { } } - impl CfdpUser for TestCfdpUser { - fn transaction_indication(&mut self, id: &crate::cfdp::TransactionId) { - self.generic_id_check(id); - } - - fn eof_sent_indication(&mut self, id: &crate::cfdp::TransactionId) { - self.generic_id_check(id); - } - - fn transaction_finished_indication( - &mut self, - finished_params: &crate::cfdp::user::TransactionFinishedParams, - ) { - self.generic_id_check(&finished_params.id); - } - - fn metadata_recvd_indication( - &mut self, - md_recvd_params: &crate::cfdp::user::MetadataReceivedParams, - ) { - self.generic_id_check(&md_recvd_params.id); - assert_eq!( - String::from(md_recvd_params.src_file_name), - self.expected_full_src_name - ); - assert_eq!( - String::from(md_recvd_params.dest_file_name), - self.expected_full_dest_name - ); - assert_eq!(md_recvd_params.msgs_to_user.len(), 0); - assert_eq!(md_recvd_params.source_id, LOCAL_ID.into()); - assert_eq!(md_recvd_params.file_size, self.expected_file_size); - } - - fn file_segment_recvd_indication( - &mut self, - _segment_recvd_params: &crate::cfdp::user::FileSegmentRecvdParams, - ) { - } - - fn report_indication(&mut self, _id: &crate::cfdp::TransactionId) {} - - fn suspended_indication( - &mut self, - _id: &crate::cfdp::TransactionId, - _condition_code: ConditionCode, - ) { - panic!("unexpected suspended indication"); - } - - fn resumed_indication(&mut self, _id: &crate::cfdp::TransactionId, _progresss: u64) {} - - fn fault_indication( - &mut self, - _id: &crate::cfdp::TransactionId, - _condition_code: ConditionCode, - _progress: u64, - ) { - panic!("unexpected fault indication"); - } - - fn abandoned_indication( - &mut self, - _id: &crate::cfdp::TransactionId, - _condition_code: ConditionCode, - _progress: u64, - ) { - panic!("unexpected abandoned indication"); - } - - fn eof_recvd_indication(&mut self, id: &crate::cfdp::TransactionId) { - self.generic_id_check(id); - } - } - #[derive(Debug)] struct TestCheckTimer { counter: Cell, @@ -903,8 +956,8 @@ mod tests { handler: dest_handler, src_path, dest_path, - check_dest_file: true, - check_handler_idle_at_drop: true, + check_dest_file: false, + check_handler_idle_at_drop: false, expected_file_size: 0, pdu_header: create_pdu_header(UbfU16::new(0)), expected_full_data: Vec::new(), @@ -914,23 +967,31 @@ mod tests { handler } + fn indication_cfg_mut(&mut self) -> &mut IndicationConfig { + &mut self.handler.local_cfg.indication_cfg + } + + fn indication_cfg(&mut self) -> &IndicationConfig { + &self.handler.local_cfg.indication_cfg + } + fn set_check_timer_expired(&mut self) { self.check_timer_expired .store(true, core::sync::atomic::Ordering::Relaxed); } fn test_user_from_cached_paths(&self, expected_file_size: u64) -> TestCfdpUser { - TestCfdpUser { - next_expected_seq_num: 0, - expected_full_src_name: self.src_path.to_string_lossy().into(), - expected_full_dest_name: self.dest_path.to_string_lossy().into(), + TestCfdpUser::new( + 0, + self.src_path.to_string_lossy().into(), + self.dest_path.to_string_lossy().into(), expected_file_size, - } + ) } fn generic_transfer_init( &mut self, - user: &mut impl CfdpUser, + user: &mut TestCfdpUser, file_size: u64, ) -> Result<(), DestError> { self.expected_file_size = file_size; @@ -941,12 +1002,14 @@ mod tests { file_size, ); let packet_info = create_packet_info(&metadata_pdu, &mut self.buf); - self.handler.state_machine(user, Some(&packet_info)) + let result = self.handler.state_machine(user, Some(&packet_info)); + assert_eq!(user.metadata_recv_queue.len(), 1); + result } fn generic_file_data_insert( &mut self, - user: &mut impl CfdpUser, + user: &mut TestCfdpUser, offset: u64, file_data_chunk: &[u8], ) -> Result<(), DestError> { @@ -956,18 +1019,33 @@ mod tests { .write_to_bytes(&mut self.buf) .expect("writing file data PDU failed"); let packet_info = PacketInfo::new(&self.buf).expect("creating packet info failed"); - self.handler.state_machine(user, Some(&packet_info)) + let result = self.handler.state_machine(user, Some(&packet_info)); + if self.indication_cfg().file_segment_recv { + assert!(!user.file_seg_recvd_queue.is_empty()); + assert_eq!(user.file_seg_recvd_queue.back().unwrap().offset, offset); + assert_eq!( + user.file_seg_recvd_queue.back().unwrap().length, + file_data_chunk.len() + ); + } + result } fn generic_eof_no_error( &mut self, - user: &mut impl CfdpUser, + user: &mut TestCfdpUser, expected_full_data: Vec, ) -> Result<(), DestError> { self.expected_full_data = expected_full_data; let eof_pdu = create_no_error_eof(&self.expected_full_data, &self.pdu_header); let packet_info = create_packet_info(&eof_pdu, &mut self.buf); - self.handler.state_machine(user, Some(&packet_info)) + self.check_handler_idle_at_drop = true; + self.check_dest_file = true; + let result = self.handler.state_machine(user, Some(&packet_info)); + if self.indication_cfg().eof_recv { + assert_eq!(user.eof_recvd_call_count, 1); + } + result } fn state_check(&self, state: State, step: TransactionStep) { @@ -1159,6 +1237,7 @@ mod tests { test_obj .generic_transfer_init(&mut test_user, file_size) .expect("transfer init failed"); + test_obj.state_check(State::Busy, TransactionStep::ReceivingFileDataPdus); test_obj .generic_file_data_insert(&mut test_user, 0, &random_data[0..segment_len]) diff --git a/satrs-core/src/cfdp/user.rs b/satrs-core/src/cfdp/user.rs index 9047bbd..65ce909 100644 --- a/satrs-core/src/cfdp/user.rs +++ b/satrs-core/src/cfdp/user.rs @@ -1,10 +1,10 @@ use spacepackets::{ cfdp::{ pdu::{ - file_data::RecordContinuationState, + file_data::SegmentMetadata, finished::{DeliveryCode, FileStatus}, }, - tlv::msg_to_user::MsgToUserTlv, + tlv::{msg_to_user::MsgToUserTlv, WritableTlv}, ConditionCode, }, util::UnsignedByteField, @@ -30,13 +30,44 @@ pub struct MetadataReceivedParams<'src_file, 'dest_file, 'msgs_to_user> { pub msgs_to_user: &'msgs_to_user [MsgToUserTlv<'msgs_to_user>], } +#[cfg(feature = "alloc")] +#[derive(Debug)] +pub struct OwnedMetadataRecvdParams { + pub id: TransactionId, + pub source_id: UnsignedByteField, + pub file_size: u64, + pub src_file_name: alloc::string::String, + pub dest_file_name: alloc::string::String, + pub msgs_to_user: alloc::vec::Vec>, +} + +#[cfg(feature = "alloc")] +impl From> for OwnedMetadataRecvdParams { + fn from(value: MetadataReceivedParams) -> Self { + Self::from(&value) + } +} + +#[cfg(feature = "alloc")] +impl From<&MetadataReceivedParams<'_, '_, '_>> for OwnedMetadataRecvdParams { + fn from(value: &MetadataReceivedParams) -> Self { + Self { + id: value.id, + source_id: value.source_id, + file_size: value.file_size, + src_file_name: value.src_file_name.into(), + dest_file_name: value.dest_file_name.into(), + msgs_to_user: value.msgs_to_user.iter().map(|tlv| tlv.to_vec()).collect(), + } + } +} + #[derive(Debug)] pub struct FileSegmentRecvdParams<'seg_meta> { pub id: TransactionId, pub offset: u64, pub length: usize, - pub rec_cont_state: Option, - pub segment_metadata: Option<&'seg_meta [u8]>, + pub segment_metadata: Option<&'seg_meta SegmentMetadata<'seg_meta>>, } pub trait CfdpUser { From 7f301a0771b5bee8385f0518054a0d642dc91a0a Mon Sep 17 00:00:00 2001 From: Robin Mueller Date: Fri, 15 Dec 2023 17:21:23 +0100 Subject: [PATCH 22/38] only allow CFDP for alloc for now --- satrs-core/src/lib.rs | 2 ++ 1 file changed, 2 insertions(+) diff --git a/satrs-core/src/lib.rs b/satrs-core/src/lib.rs index 22699e0..061f728 100644 --- a/satrs-core/src/lib.rs +++ b/satrs-core/src/lib.rs @@ -20,6 +20,8 @@ extern crate downcast_rs; #[cfg(any(feature = "std", test))] extern crate std; +#[cfg(feature = "alloc")] +#[cfg_attr(doc_cfg, doc(cfg(feature = "alloc")))] pub mod cfdp; pub mod encoding; pub mod error; From 620ffbb131a8e1e3358376122abb5ee08568c821 Mon Sep 17 00:00:00 2001 From: Robin Mueller Date: Mon, 18 Dec 2023 15:28:15 +0100 Subject: [PATCH 23/38] add test for reached check limit --- satrs-core/src/cfdp/dest.rs | 175 +++++++++++++++++++++++++++--------- satrs-core/src/cfdp/mod.rs | 2 + 2 files changed, 136 insertions(+), 41 deletions(-) diff --git a/satrs-core/src/cfdp/dest.rs b/satrs-core/src/cfdp/dest.rs index b10afab..a6fa9e5 100644 --- a/satrs-core/src/cfdp/dest.rs +++ b/satrs-core/src/cfdp/dest.rs @@ -52,6 +52,12 @@ struct FileProperties { dest_path_buf: PathBuf, } +#[derive(Debug, PartialEq, Eq, Copy, Clone)] +enum CompletionDisposition { + Completed = 0, + Cancelled = 1, +} + #[derive(Debug)] struct TransferState { transaction_id: Option, @@ -60,6 +66,7 @@ struct TransferState { condition_code: ConditionCode, delivery_code: DeliveryCode, file_status: FileStatus, + completion_disposition: CompletionDisposition, checksum: u32, current_check_count: u32, current_check_timer: Option>, @@ -74,6 +81,7 @@ impl Default for TransferState { condition_code: ConditionCode::NoError, delivery_code: DeliveryCode::Incomplete, file_status: FileStatus::Unreported, + completion_disposition: CompletionDisposition::Completed, checksum: 0, current_check_count: 0, current_check_timer: None, @@ -206,31 +214,13 @@ impl DestinationHandler { } } - fn insert_packet( - &mut self, - cfdp_user: &mut impl CfdpUser, - packet_info: &PacketInfo, - ) -> Result<(), DestError> { - if packet_info.target() != PacketTarget::DestEntity { - // Unwrap is okay here, a PacketInfo for a file data PDU should always have the - // destination as the target. - return Err(DestError::CantProcessPacketType( - packet_info.pdu_directive().unwrap(), - )); - } - match packet_info.pdu_type { - PduType::FileDirective => { - if packet_info.pdu_directive.is_none() { - return Err(DestError::DirectiveExpected); - } - self.handle_file_directive( - cfdp_user, - packet_info.pdu_directive.unwrap(), - packet_info.raw_packet, - ) - } - PduType::FileData => self.handle_file_data(cfdp_user, packet_info.raw_packet), + /// Returns [None] if the state machine is IDLE, and the transmission mode of the current + /// request otherwise. + pub fn current_transmission_mode(&self) -> Option { + if self.state == State::Idle { + return None; } + Some(self.tparams.transmission_mode()) } pub fn packet_to_send_ready(&self) -> bool { @@ -281,7 +271,34 @@ impl DestinationHandler { Ok(Some((directive, written_size))) } - pub fn handle_file_directive( + fn insert_packet( + &mut self, + cfdp_user: &mut impl CfdpUser, + packet_info: &PacketInfo, + ) -> Result<(), DestError> { + if packet_info.target() != PacketTarget::DestEntity { + // Unwrap is okay here, a PacketInfo for a file data PDU should always have the + // destination as the target. + return Err(DestError::CantProcessPacketType( + packet_info.pdu_directive().unwrap(), + )); + } + match packet_info.pdu_type { + PduType::FileDirective => { + if packet_info.pdu_directive.is_none() { + return Err(DestError::DirectiveExpected); + } + self.handle_file_directive( + cfdp_user, + packet_info.pdu_directive.unwrap(), + packet_info.raw_packet, + ) + } + PduType::FileData => self.handle_file_data(cfdp_user, packet_info.raw_packet), + } + } + + fn handle_file_directive( &mut self, cfdp_user: &mut impl CfdpUser, pdu_directive: FileDirectiveType, @@ -305,7 +322,7 @@ impl DestinationHandler { Ok(()) } - pub fn handle_metadata_pdu(&mut self, raw_packet: &[u8]) -> Result<(), DestError> { + fn handle_metadata_pdu(&mut self, raw_packet: &[u8]) -> Result<(), DestError> { if self.state != State::Idle { return Err(DestError::RecvdMetadataButIsBusy); } @@ -354,7 +371,7 @@ impl DestinationHandler { Ok(()) } - pub fn handle_file_data( + fn handle_file_data( &mut self, user: &mut impl CfdpUser, raw_packet: &[u8], @@ -385,7 +402,7 @@ impl DestinationHandler { Ok(()) } - pub fn handle_eof_pdu( + fn handle_eof_pdu( &mut self, cfdp_user: &mut impl CfdpUser, raw_packet: &[u8], @@ -616,6 +633,33 @@ impl DestinationHandler { } fn transfer_completion(&mut self, cfdp_user: &mut impl CfdpUser) -> Result<(), DestError> { + self.notice_of_completion(cfdp_user)?; + if self.tparams.transmission_mode() == TransmissionMode::Acknowledged + || self.tparams.metadata_params().closure_requested + { + self.prepare_finished_pdu()?; + self.step = TransactionStep::SendingFinishedPdu; + } else { + self.reset(); + } + Ok(()) + } + + fn notice_of_completion(&mut self, cfdp_user: &mut impl CfdpUser) -> Result<(), DestError> { + if self.tstate().completion_disposition == CompletionDisposition::Completed { + // TODO: Execute any filestore requests + } else if self + .tparams + .remote_cfg + .as_ref() + .unwrap() + .disposition_on_cancellation + && self.tstate().delivery_code == DeliveryCode::Incomplete + { + self.vfs + .remove_file(self.tparams.file_properties.dest_path_buf.to_str().unwrap())?; + self.tstate_mut().file_status = FileStatus::DiscardDeliberately; + } let tstate = self.tstate(); let transaction_finished_params = TransactionFinishedParams { id: tstate.transaction_id.unwrap(), @@ -624,15 +668,6 @@ impl DestinationHandler { file_status: tstate.file_status, }; cfdp_user.transaction_finished_indication(&transaction_finished_params); - // This function should never be called with metadata parameters not set - if self.tparams.metadata_params().closure_requested { - self.prepare_finished_pdu()?; - self.step = TransactionStep::SendingFinishedPdu; - } else { - self.reset(); - self.state = State::Idle; - self.step = TransactionStep::Idle; - } Ok(()) } @@ -646,7 +681,7 @@ impl DestinationHandler { .get_fault_handler(condition_code); match fh_code { FaultHandlerCode::NoticeOfCancellation => { - self.notice_of_cancellation(); + self.notice_of_cancellation(condition_code); } FaultHandlerCode::NoticeOfSuspension => self.notice_of_suspension(), FaultHandlerCode::IgnoreError => (), @@ -657,7 +692,12 @@ impl DestinationHandler { .report_fault(transaction_id, condition_code, progress) } - fn notice_of_cancellation(&mut self) {} + fn notice_of_cancellation(&mut self, condition_code: ConditionCode) { + self.step = TransactionStep::TransferCompletion; + self.tstate_mut().condition_code = condition_code; + self.tstate_mut().completion_disposition = CompletionDisposition::Cancelled; + } + fn notice_of_suspension(&mut self) {} fn abandon_transaction(&mut self) { self.reset(); @@ -680,6 +720,10 @@ impl DestinationHandler { fn tstate(&self) -> &TransferState { &self.tparams.tstate } + + fn tstate_mut(&mut self) -> &mut TransferState { + &mut self.tparams.tstate + } } #[cfg(test)] @@ -967,6 +1011,7 @@ mod tests { handler } + #[allow(dead_code)] fn indication_cfg_mut(&mut self) -> &mut IndicationConfig { &mut self.handler.local_cfg.indication_cfg } @@ -1004,6 +1049,10 @@ mod tests { let packet_info = create_packet_info(&metadata_pdu, &mut self.buf); let result = self.handler.state_machine(user, Some(&packet_info)); assert_eq!(user.metadata_recv_queue.len(), 1); + assert_eq!( + self.handler.current_transmission_mode().unwrap(), + TransmissionMode::Unacknowledged + ); result } @@ -1159,7 +1208,8 @@ mod tests { #[test] fn test_basic() { - default_dest_handler(Arc::default()); + let dest_handler = default_dest_handler(Arc::default()); + assert!(dest_handler.current_transmission_mode().is_none()); } #[test] @@ -1225,7 +1275,7 @@ mod tests { } #[test] - fn test_check_limit_handling() { + fn test_check_limit_handling_transfer_success() { let mut rng = rand::thread_rng(); let mut random_data = [0u8; 512]; rng.fill(&mut random_data); @@ -1262,4 +1312,47 @@ mod tests { .state_machine(&mut test_user, None) .expect("fsm failure"); } + + #[test] + fn test_check_limit_handling_limit_reached() { + let mut rng = rand::thread_rng(); + let mut random_data = [0u8; 512]; + rng.fill(&mut random_data); + let file_size = random_data.len() as u64; + let segment_len = 256; + + let mut test_obj = TestClass::new(); + let mut test_user = test_obj.test_user_from_cached_paths(file_size); + test_obj + .generic_transfer_init(&mut test_user, file_size) + .expect("transfer init failed"); + + test_obj.state_check(State::Busy, TransactionStep::ReceivingFileDataPdus); + test_obj + .generic_file_data_insert(&mut test_user, 0, &random_data[0..segment_len]) + .expect("file data insertion 0 failed"); + test_obj + .generic_eof_no_error(&mut test_user, random_data.to_vec()) + .expect("EOF no error insertion failed"); + test_obj.state_check( + State::Busy, + TransactionStep::ReceivingFileDataPdusWithCheckLimitHandling, + ); + test_obj.set_check_timer_expired(); + test_obj + .handler + .state_machine(&mut test_user, None) + .expect("fsm error"); + test_obj.state_check( + State::Busy, + TransactionStep::ReceivingFileDataPdusWithCheckLimitHandling, + ); + test_obj.set_check_timer_expired(); + test_obj + .handler + .state_machine(&mut test_user, None) + .expect("fsm error"); + test_obj.state_check(State::Idle, TransactionStep::Idle); + test_obj.check_dest_file = false; + } } diff --git a/satrs-core/src/cfdp/mod.rs b/satrs-core/src/cfdp/mod.rs index 110b588..5916235 100644 --- a/satrs-core/src/cfdp/mod.rs +++ b/satrs-core/src/cfdp/mod.rs @@ -107,6 +107,7 @@ pub struct RemoteEntityConfig { pub default_transmission_mode: TransmissionMode, pub default_crc_type: ChecksumType, pub check_limit: u32, + pub disposition_on_cancellation: bool, } impl RemoteEntityConfig { @@ -128,6 +129,7 @@ impl RemoteEntityConfig { default_transmission_mode, default_crc_type, check_limit: 2, + disposition_on_cancellation: false, } } } From 42cb3f7e6b23b869fc842f783dc93d3dd002d9ef Mon Sep 17 00:00:00 2001 From: Robin Mueller Date: Mon, 18 Dec 2023 16:16:28 +0100 Subject: [PATCH 24/38] verify fault handling correctness --- satrs-core/src/cfdp/dest.rs | 149 ++++++++++++++++++++++++++++-------- 1 file changed, 119 insertions(+), 30 deletions(-) diff --git a/satrs-core/src/cfdp/dest.rs b/satrs-core/src/cfdp/dest.rs index a6fa9e5..28ba401 100644 --- a/satrs-core/src/cfdp/dest.rs +++ b/satrs-core/src/cfdp/dest.rs @@ -216,13 +216,17 @@ impl DestinationHandler { /// Returns [None] if the state machine is IDLE, and the transmission mode of the current /// request otherwise. - pub fn current_transmission_mode(&self) -> Option { + pub fn transmission_mode(&self) -> Option { if self.state == State::Idle { return None; } Some(self.tparams.transmission_mode()) } + pub fn transaction_id(&self) -> Option { + self.tstate().transaction_id + } + pub fn packet_to_send_ready(&self) -> bool { self.packets_to_send_ctx.packet_available } @@ -399,6 +403,7 @@ impl DestinationHandler { self.declare_fault(ConditionCode::FilestoreRejection); return Err(e.into()); } + self.tstate_mut().progress += fd_pdu.file_data().len() as u64; Ok(()) } @@ -698,7 +703,9 @@ impl DestinationHandler { self.tstate_mut().completion_disposition = CompletionDisposition::Cancelled; } - fn notice_of_suspension(&mut self) {} + fn notice_of_suspension(&mut self) { + // TODO: Implement suspension handling. + } fn abandon_transaction(&mut self) { self.reset(); } @@ -729,9 +736,9 @@ impl DestinationHandler { #[cfg(test)] mod tests { use core::{cell::Cell, sync::atomic::AtomicBool}; - use std::fs; #[allow(unused_imports)] use std::println; + use std::{fs, sync::Mutex}; use alloc::{collections::VecDeque, string::String, sync::Arc, vec::Vec}; use rand::Rng; @@ -886,12 +893,12 @@ mod tests { } } - #[derive(Default)] + #[derive(Default, Clone)] struct TestFaultHandler { - notice_of_suspension_queue: VecDeque<(TransactionId, ConditionCode, u64)>, - notice_of_cancellation_queue: VecDeque<(TransactionId, ConditionCode, u64)>, - abandoned_queue: VecDeque<(TransactionId, ConditionCode, u64)>, - ignored_queue: VecDeque<(TransactionId, ConditionCode, u64)>, + notice_of_suspension_queue: Arc>>, + notice_of_cancellation_queue: Arc>>, + abandoned_queue: Arc>>, + ignored_queue: Arc>>, } impl UserFaultHandler for TestFaultHandler { @@ -901,8 +908,11 @@ mod tests { cond: ConditionCode, progress: u64, ) { - self.notice_of_suspension_queue - .push_back((transaction_id, cond, progress)) + self.notice_of_suspension_queue.lock().unwrap().push_back(( + transaction_id, + cond, + progress, + )) } fn notice_of_cancellation_cb( @@ -912,6 +922,8 @@ mod tests { progress: u64, ) { self.notice_of_cancellation_queue + .lock() + .unwrap() .push_back((transaction_id, cond, progress)) } @@ -922,15 +934,40 @@ mod tests { progress: u64, ) { self.abandoned_queue + .lock() + .unwrap() .push_back((transaction_id, cond, progress)) } fn ignore_cb(&mut self, transaction_id: TransactionId, cond: ConditionCode, progress: u64) { self.ignored_queue + .lock() + .unwrap() .push_back((transaction_id, cond, progress)) } } + impl TestFaultHandler { + fn suspension_queue_empty(&self) -> bool { + self.notice_of_suspension_queue.lock().unwrap().is_empty() + } + fn cancellation_queue_empty(&self) -> bool { + self.notice_of_cancellation_queue.lock().unwrap().is_empty() + } + fn ignored_queue_empty(&self) -> bool { + self.ignored_queue.lock().unwrap().is_empty() + } + fn abandoned_queue_empty(&self) -> bool { + self.abandoned_queue.lock().unwrap().is_empty() + } + fn all_queues_empty(&self) -> bool { + self.suspension_queue_empty() + && self.cancellation_queue_empty() + && self.ignored_queue_empty() + && self.abandoned_queue_empty() + } + } + #[derive(Debug)] struct TestCheckTimer { counter: Cell, @@ -976,7 +1013,7 @@ mod tests { } } - struct TestClass { + struct DestHandlerTester { check_timer_expired: Arc, handler: DestinationHandler, src_path: PathBuf, @@ -989,10 +1026,10 @@ mod tests { buf: [u8; 512], } - impl TestClass { - fn new() -> Self { + impl DestHandlerTester { + fn new(fault_handler: TestFaultHandler) -> Self { let check_timer_expired = Arc::new(AtomicBool::new(false)); - let dest_handler = default_dest_handler(check_timer_expired.clone()); + let dest_handler = default_dest_handler(fault_handler, check_timer_expired.clone()); let (src_path, dest_path) = init_full_filenames(); assert!(!Path::exists(&dest_path)); let handler = Self { @@ -1011,6 +1048,10 @@ mod tests { handler } + fn dest_path(&self) -> &PathBuf { + &self.dest_path + } + #[allow(dead_code)] fn indication_cfg_mut(&mut self) -> &mut IndicationConfig { &mut self.handler.local_cfg.indication_cfg @@ -1038,7 +1079,7 @@ mod tests { &mut self, user: &mut TestCfdpUser, file_size: u64, - ) -> Result<(), DestError> { + ) -> Result { self.expected_file_size = file_size; let metadata_pdu = create_metadata_pdu( &self.pdu_header, @@ -1047,13 +1088,13 @@ mod tests { file_size, ); let packet_info = create_packet_info(&metadata_pdu, &mut self.buf); - let result = self.handler.state_machine(user, Some(&packet_info)); + self.handler.state_machine(user, Some(&packet_info))?; assert_eq!(user.metadata_recv_queue.len(), 1); assert_eq!( - self.handler.current_transmission_mode().unwrap(), + self.handler.transmission_mode().unwrap(), TransmissionMode::Unacknowledged ); - result + Ok(self.handler.transaction_id().unwrap()) } fn generic_file_data_insert( @@ -1103,7 +1144,7 @@ mod tests { } } - impl Drop for TestClass { + impl Drop for DestHandlerTester { fn drop(&mut self) { if self.check_handler_idle_at_drop { self.state_check(State::Idle, TransactionStep::Idle); @@ -1143,8 +1184,10 @@ mod tests { table } - fn default_dest_handler(check_timer_expired: Arc) -> DestinationHandler { - let test_fault_handler = TestFaultHandler::default(); + fn default_dest_handler( + test_fault_handler: TestFaultHandler, + check_timer_expired: Arc, + ) -> DestinationHandler { let local_entity_cfg = LocalEntityConfig { id: REMOTE_ID.into(), indication_cfg: IndicationConfig::default(), @@ -1208,13 +1251,16 @@ mod tests { #[test] fn test_basic() { - let dest_handler = default_dest_handler(Arc::default()); - assert!(dest_handler.current_transmission_mode().is_none()); + let fault_handler = TestFaultHandler::default(); + let dest_handler = default_dest_handler(fault_handler.clone(), Arc::default()); + assert!(dest_handler.transmission_mode().is_none()); + assert!(fault_handler.all_queues_empty()); } #[test] fn test_empty_file_transfer_not_acked() { - let mut test_obj = TestClass::new(); + let fault_handler = TestFaultHandler::default(); + let mut test_obj = DestHandlerTester::new(fault_handler.clone()); let mut test_user = test_obj.test_user_from_cached_paths(0); test_obj .generic_transfer_init(&mut test_user, 0) @@ -1223,6 +1269,7 @@ mod tests { test_obj .generic_eof_no_error(&mut test_user, Vec::new()) .expect("EOF no error insertion failed"); + assert!(fault_handler.all_queues_empty()); } #[test] @@ -1230,8 +1277,9 @@ mod tests { let file_data_str = "Hello World!"; let file_data = file_data_str.as_bytes(); let file_size = file_data.len() as u64; + let fault_handler = TestFaultHandler::default(); - let mut test_obj = TestClass::new(); + let mut test_obj = DestHandlerTester::new(fault_handler.clone()); let mut test_user = test_obj.test_user_from_cached_paths(file_size); test_obj .generic_transfer_init(&mut test_user, file_size) @@ -1243,6 +1291,7 @@ mod tests { test_obj .generic_eof_no_error(&mut test_user, file_data.to_vec()) .expect("EOF no error insertion failed"); + assert!(fault_handler.all_queues_empty()); } #[test] @@ -1252,8 +1301,9 @@ mod tests { rng.fill(&mut random_data); let file_size = random_data.len() as u64; let segment_len = 256; + let fault_handler = TestFaultHandler::default(); - let mut test_obj = TestClass::new(); + let mut test_obj = DestHandlerTester::new(fault_handler.clone()); let mut test_user = test_obj.test_user_from_cached_paths(file_size); test_obj .generic_transfer_init(&mut test_user, file_size) @@ -1272,6 +1322,7 @@ mod tests { test_obj .generic_eof_no_error(&mut test_user, random_data.to_vec()) .expect("EOF no error insertion failed"); + assert!(fault_handler.all_queues_empty()); } #[test] @@ -1281,10 +1332,11 @@ mod tests { rng.fill(&mut random_data); let file_size = random_data.len() as u64; let segment_len = 256; + let fault_handler = TestFaultHandler::default(); - let mut test_obj = TestClass::new(); + let mut test_obj = DestHandlerTester::new(fault_handler.clone()); let mut test_user = test_obj.test_user_from_cached_paths(file_size); - test_obj + let transaction_id = test_obj .generic_transfer_init(&mut test_user, file_size) .expect("transfer init failed"); @@ -1311,6 +1363,13 @@ mod tests { .handler .state_machine(&mut test_user, None) .expect("fsm failure"); + + let ignored_queue = fault_handler.ignored_queue.lock().unwrap(); + assert_eq!(ignored_queue.len(), 1); + let cancelled = *ignored_queue.front().unwrap(); + assert_eq!(cancelled.0, transaction_id); + assert_eq!(cancelled.1, ConditionCode::FileChecksumFailure); + assert_eq!(cancelled.2, segment_len as u64); } #[test] @@ -1321,9 +1380,10 @@ mod tests { let file_size = random_data.len() as u64; let segment_len = 256; - let mut test_obj = TestClass::new(); + let fault_handler = TestFaultHandler::default(); + let mut test_obj = DestHandlerTester::new(fault_handler.clone()); let mut test_user = test_obj.test_user_from_cached_paths(file_size); - test_obj + let transaction_id = test_obj .generic_transfer_init(&mut test_user, file_size) .expect("transfer init failed"); @@ -1353,6 +1413,35 @@ mod tests { .state_machine(&mut test_user, None) .expect("fsm error"); test_obj.state_check(State::Idle, TransactionStep::Idle); + + assert!(fault_handler + .notice_of_suspension_queue + .lock() + .unwrap() + .is_empty()); + + let ignored_queue = fault_handler.ignored_queue.lock().unwrap(); + assert_eq!(ignored_queue.len(), 1); + let cancelled = *ignored_queue.front().unwrap(); + assert_eq!(cancelled.0, transaction_id); + assert_eq!(cancelled.1, ConditionCode::FileChecksumFailure); + assert_eq!(cancelled.2, segment_len as u64); + + let cancelled_queue = fault_handler.notice_of_cancellation_queue.lock().unwrap(); + assert_eq!(cancelled_queue.len(), 1); + let cancelled = *cancelled_queue.front().unwrap(); + assert_eq!(cancelled.0, transaction_id); + assert_eq!(cancelled.1, ConditionCode::CheckLimitReached); + assert_eq!(cancelled.2, segment_len as u64); + + drop(cancelled_queue); + + // Check that the broken file exists. test_obj.check_dest_file = false; + assert!(Path::exists(test_obj.dest_path())); + let read_content = fs::read(test_obj.dest_path()).expect("reading back string failed"); + assert_eq!(read_content.len(), segment_len); + assert_eq!(read_content, &random_data[0..segment_len]); + assert!(fs::remove_file(test_obj.dest_path().as_path()).is_ok()); } } From 71ce43eca6b49ab6c2af0eac9f02dc9d9cb6caf7 Mon Sep 17 00:00:00 2001 From: Robin Mueller Date: Mon, 18 Dec 2023 16:26:29 +0100 Subject: [PATCH 25/38] added some docs --- satrs-core/src/cfdp/dest.rs | 40 ++++++++++++++++++++++++++----------- 1 file changed, 28 insertions(+), 12 deletions(-) diff --git a/satrs-core/src/cfdp/dest.rs b/satrs-core/src/cfdp/dest.rs index 28ba401..8e5fd5f 100644 --- a/satrs-core/src/cfdp/dest.rs +++ b/satrs-core/src/cfdp/dest.rs @@ -26,17 +26,6 @@ use spacepackets::{ }; use thiserror::Error; -pub struct DestinationHandler { - local_cfg: LocalEntityConfig, - step: TransactionStep, - state: State, - tparams: TransactionParams, - packets_to_send_ctx: PacketsToSendContext, - vfs: Box, - remote_cfg_table: Box, - check_timer_creator: Box, -} - #[derive(Debug, Default)] struct PacketsToSendContext { packet_available: bool, @@ -180,6 +169,33 @@ pub enum DestError { NoRemoteCfgFound(UnsignedByteField), } +/// This is the primary CFDP destination handler. It models the CFDP destination entity, which is +/// primarily responsible for receiving files sent from another CFDP entity. It performs the +/// reception side of File Copy Operations. + +/// The following core functions are the primary interface for interacting with the destination +/// handler: + +/// 1. [DestinationHandler::state_machine]: Can be used to insert packets into the destination +/// handler. Please note that the destination handler can also only process Metadata, EOF and +/// Prompt PDUs in addition to ACK PDUs where the acknowledged PDU is the Finished PDU. +/// 2. [DestinationHandler::get_next_packet]: Retrieve next packet to be sent back to the remote +/// CFDP source entity ID. + +/// A new file transfer (Metadata PDU reception) is only be accepted if the handler is in the +/// IDLE state. Furthermore, packet insertion is not allowed until all packets to send were +/// retrieved after a state machine call. +pub struct DestinationHandler { + local_cfg: LocalEntityConfig, + step: TransactionStep, + state: State, + tparams: TransactionParams, + packets_to_send_ctx: PacketsToSendContext, + vfs: Box, + remote_cfg_table: Box, + check_timer_creator: Box, +} + impl DestinationHandler { pub fn new( local_cfg: LocalEntityConfig, @@ -231,7 +247,7 @@ impl DestinationHandler { self.packets_to_send_ctx.packet_available } - pub fn get_next_packet_to_send( + pub fn get_next_packet( &self, buf: &mut [u8], ) -> Result, DestError> { From 303a9ab58153df7c7b8fc4de867e4aa0a534946f Mon Sep 17 00:00:00 2001 From: Robin Mueller Date: Mon, 18 Dec 2023 17:08:23 +0100 Subject: [PATCH 26/38] more docs --- satrs-core/src/cfdp/dest.rs | 24 ++++++-- satrs-core/src/cfdp/mod.rs | 110 ++++++++++++++++++++++++++++++++---- 2 files changed, 120 insertions(+), 14 deletions(-) diff --git a/satrs-core/src/cfdp/dest.rs b/satrs-core/src/cfdp/dest.rs index 8e5fd5f..bb13ec5 100644 --- a/satrs-core/src/cfdp/dest.rs +++ b/satrs-core/src/cfdp/dest.rs @@ -155,6 +155,8 @@ pub enum DestError { EmptySrcFileField, #[error("empty dest file field")] EmptyDestFileField, + #[error("packets to be sent are still left")] + PacketToSendLeft, #[error("pdu error {0}")] Pdu(#[from] PduError), #[error("io error {0}")] @@ -176,10 +178,12 @@ pub enum DestError { /// The following core functions are the primary interface for interacting with the destination /// handler: -/// 1. [DestinationHandler::state_machine]: Can be used to insert packets into the destination -/// handler. Please note that the destination handler can also only process Metadata, EOF and -/// Prompt PDUs in addition to ACK PDUs where the acknowledged PDU is the Finished PDU. -/// 2. [DestinationHandler::get_next_packet]: Retrieve next packet to be sent back to the remote +/// 1. [DestinationHandler::state_machine] - Can be used to insert packets into the destination +/// handler and/or advance the state machine. Advancing the state machine might generate new +/// packets to be sent to the remote entity. Please note that the destination handler can also +/// only process Metadata, EOF and Prompt PDUs in addition to ACK PDUs where the acknowledged +/// PDU is the Finished PDU. +/// 2. [DestinationHandler::get_next_packet] - Retrieve next packet to be sent back to the remote /// CFDP source entity ID. /// A new file transfer (Metadata PDU reception) is only be accepted if the handler is in the @@ -215,11 +219,23 @@ impl DestinationHandler { } } + /// This is the core function to drive the destination handler. It is also used to insert + /// packets into the destination handler. + /// + /// Please note that this function will fail if there are still packets which need to be + /// retrieved with [Self::get_next_packet]. After each state machine call, the user has to + /// retrieve all packets before calling the state machine again. The state machine should + /// either be called if a packet with the appropriate destination ID is received, or + /// periodically in IDLE periods to perform all CFDP related tasks, for example checking for + /// timeouts or missed file segments. pub fn state_machine( &mut self, cfdp_user: &mut impl CfdpUser, packet_to_insert: Option<&PacketInfo>, ) -> Result<(), DestError> { + if self.packet_to_send_ready() { + return Err(DestError::PacketToSendLeft); + } if let Some(packet) = packet_to_insert { self.insert_packet(cfdp_user, packet)?; } diff --git a/satrs-core/src/cfdp/mod.rs b/satrs-core/src/cfdp/mod.rs index 5916235..0df270e 100644 --- a/satrs-core/src/cfdp/mod.rs +++ b/satrs-core/src/cfdp/mod.rs @@ -1,3 +1,5 @@ +//! This module contains the implementation of the CFDP high level classes as specified in the +//! CCSDS 727.0-B-5. use core::{cell::RefCell, fmt::Debug, hash::Hash}; use crc::{Crc, CRC_32_CKSUM}; @@ -47,7 +49,7 @@ pub trait CheckTimer: Debug { /// A generic trait which allows CFDP entities to create check timers which are required to /// implement special procedures in unacknowledged transmission mode, as specified in 4.6.3.2 -/// and 4.6.3.3. The [CheckTimerProvider] provides more information about the purpose of the +/// and 4.6.3.3. The [CheckTimer] documentation provides more information about the purpose of the /// check timer. /// /// This trait also allows the creation of different check timers depending on @@ -63,7 +65,7 @@ pub trait CheckTimerCreator { ) -> Box; } -/// Simple implementation of the [CheckTimerProvider] trait assuming a standard runtime. +/// Simple implementation of the [CheckTimerCreator] trait assuming a standard runtime. /// It also assumes that a second accuracy of the check timer period is sufficient. #[cfg(feature = "std")] #[derive(Debug)] @@ -97,17 +99,76 @@ impl CheckTimer for StdCheckTimer { } } +/// This structure models the remote entity configuration information as specified in chapter 8.3 +/// of the CFDP standard. + +/// Some of the fields which were not considered necessary for the Rust implementation +/// were omitted. Some other fields which are not contained inside the standard but are considered +/// necessary for the Rust implementation are included. +/// +/// ## Notes on Positive Acknowledgment Procedures +/// +/// The `positive_ack_timer_interval_seconds` and `positive_ack_timer_expiration_limit` will +/// be used for positive acknowledgement procedures as specified in CFDP chapter 4.7. The sending +/// entity will start the timer for any PDUs where an acknowledgment is required (e.g. EOF PDU). +/// Once the expected ACK response has not been received for that interval, as counter will be +/// incremented and the timer will be reset. Once the counter exceeds the +/// `positive_ack_timer_expiration_limit`, a Positive ACK Limit Reached fault will be declared. +/// +/// ## Notes on Deferred Lost Segment Procedures +/// +/// This procedure will be active if an EOF (No Error) PDU is received in acknowledged mode. After +/// issuing the NAK sequence which has the whole file scope, a timer will be started. The timer is +/// reset when missing segments or missing metadata is received. The timer will be deactivated if +/// all missing data is received. If the timer expires, a new NAK sequence will be issued and a +/// counter will be incremented, which can lead to a NAK Limit Reached fault being declared. +/// +/// ## Fields +/// +/// * `entity_id` - The ID of the remote entity. +/// * `max_packet_len` - This determines of all PDUs generated for that remote entity in addition +/// to the `max_file_segment_len` attribute which also determines the size of file data PDUs. +/// * `max_file_segment_len` The maximum file segment length which determines the maximum size +/// of file data PDUs in addition to the `max_packet_len` attribute. If this field is set +/// to None, the maximum file segment length will be derived from the maximum packet length. +/// If this has some value which is smaller than the segment value derived from +/// `max_packet_len`, this value will be picked. +/// * `closure_requested_by_default` - If the closure requested field is not supplied as part of +/// the Put Request, it will be determined from this field in the remote configuration. +/// * `crc_on_transmission_by_default` - If the CRC option is not supplied as part of the Put +/// Request, it will be determined from this field in the remote configuration. +/// * `default_transmission_mode` - If the transmission mode is not supplied as part of the +/// Put Request, it will be determined from this field in the remote configuration. +/// * `disposition_on_cancellation` - Determines whether an incomplete received file is discard on +/// transaction cancellation. Defaults to False. +/// * `default_crc_type` - Default checksum type used to calculate for all file transmissions to +/// this remote entity. +/// * `check_limit` - This timer determines the expiry period for incrementing a check counter +/// after an EOF PDU is received for an incomplete file transfer. This allows out-of-order +/// reception of file data PDUs and EOF PDUs. Also see 4.6.3.3 of the CFDP standard. Defaults to +/// 2, so the check limit timer may expire twice. +/// * `positive_ack_timer_interval_seconds`- See the notes on the Positive Acknowledgment +/// Procedures inside the class documentation. Expected as floating point seconds. Defaults to +/// 10 seconds. +/// * `positive_ack_timer_expiration_limit` - See the notes on the Positive Acknowledgment +/// Procedures inside the class documentation. Defaults to 2, so the timer may expire twice. +/// * `immediate_nak_mode` - Specifies whether a NAK sequence should be issued immediately when a +/// file data gap or lost metadata is detected in the acknowledged mode. Defaults to True. +/// * `nak_timer_interval_seconds` - See the notes on the Deferred Lost Segment Procedure inside +/// the class documentation. Expected as floating point seconds. Defaults to 10 seconds. +/// * `nak_timer_expiration_limit` - See the notes on the Deferred Lost Segment Procedure inside +/// the class documentation. Defaults to 2, so the timer may expire two times. #[derive(Debug, Copy, Clone)] pub struct RemoteEntityConfig { pub entity_id: UnsignedByteField, - pub max_file_segment_len: usize, pub max_packet_len: usize, + pub max_file_segment_len: usize, pub closure_requested_by_default: bool, pub crc_on_transmission_by_default: bool, pub default_transmission_mode: TransmissionMode, + pub disposition_on_cancellation: bool, pub default_crc_type: ChecksumType, pub check_limit: u32, - pub disposition_on_cancellation: bool, } impl RemoteEntityConfig { @@ -138,11 +199,11 @@ pub trait RemoteEntityConfigProvider { /// Retrieve the remote entity configuration for the given remote ID. fn get_remote_config(&self, remote_id: u64) -> Option<&RemoteEntityConfig>; fn get_remote_config_mut(&mut self, remote_id: u64) -> Option<&mut RemoteEntityConfig>; - /// Add a new remote configuration. Return [True] if the configuration was - /// inserted successfully, and [False] if a configuration already exists. + /// Add a new remote configuration. Return [true] if the configuration was + /// inserted successfully, and [false] if a configuration already exists. fn add_config(&mut self, cfg: &RemoteEntityConfig) -> bool; - /// Remote a configuration. Returns [True] if the configuration was removed successfully, - /// and [False] if no configuration exists for the given remote ID. + /// Remote a configuration. Returns [true] if the configuration was removed successfully, + /// and [false] if no configuration exists for the given remote ID. fn remove_config(&mut self, remote_id: u64) -> bool; } @@ -171,8 +232,15 @@ impl RemoteEntityConfigProvider for StdRemoteEntityConfigProvider { } /// This trait introduces some callbacks which will be called when a particular CFDP fault -/// handler is called. This allows to implement some CFDP features like fault handler logging, -/// which would not be possible generically otherwise. +/// handler is called. +/// +/// It is passed into the CFDP handlers as part of the [DefaultFaultHandler] and the local entity +/// configuration and provides a way to specify custom user error handlers. This allows to +/// implement some CFDP features like fault handler logging, which would not be possible +/// generically otherwise. +/// +/// For each error reported by the [DefaultFaultHandler], the appropriate fault handler callback +/// will be called depending on the [FaultHandlerCode]. pub trait UserFaultHandler { fn notice_of_suspension_cb( &mut self, @@ -193,6 +261,26 @@ pub trait UserFaultHandler { fn ignore_cb(&mut self, transaction_id: TransactionId, cond: ConditionCode, progress: u64); } +/// This structure is used to implement the fault handling as specified in chapter 4.8 of the CFDP +/// standard. +/// +/// It does so by mapping each applicable [spacepackets::cfdp::ConditionCode] to a fault handler +/// which is denoted by the four [spacepackets::cfdp::FaultHandlerCode]s. This code is used +/// to select the error handling inside the CFDP handler itself in addition to dispatching to a +/// user-provided callback function provided by the [UserFaultHandler]. +/// +/// Some note on the provided default settings: +/// +/// - Checksum failures will be ignored by default. This is because for unacknowledged transfers, +/// cancelling the transfer immediately would interfere with the check limit mechanism specified +/// in chapter 4.6.3.3. +/// - Unsupported checksum types will also be ignored by default. Even if the checksum type is +/// not supported the file transfer might still have worked properly. +/// +/// For all other faults, the default fault handling operation will be to cancel the transaction. +/// These defaults can be overriden by using the [Self::set_fault_handler] method. +/// Please note that in any case, fault handler overrides can be specified by the sending CFDP +/// entity. pub struct DefaultFaultHandler { handler_array: [FaultHandlerCode; 10], // Could also change the user fault handler trait to have non mutable methods, but that limits @@ -308,6 +396,8 @@ pub struct LocalEntityConfig { pub default_fault_handler: DefaultFaultHandler, } +/// The CFDP transaction ID of a CFDP transaction consists of the source entity ID and the sequence +/// number of that transfer which is also determined by the CFDP source entity. #[derive(Debug, Eq, Copy, Clone)] #[cfg_attr(feature = "serde", derive(Serialize, Deserialize))] pub struct TransactionId { From 4cf96ce0d50d4907e5583f6167fe9288a98b164f Mon Sep 17 00:00:00 2001 From: Robin Mueller Date: Fri, 22 Dec 2023 14:08:25 +0100 Subject: [PATCH 27/38] extend remote cfg fields --- satrs-core/src/cfdp/mod.rs | 12 +++++++++++- 1 file changed, 11 insertions(+), 1 deletion(-) diff --git a/satrs-core/src/cfdp/mod.rs b/satrs-core/src/cfdp/mod.rs index 0df270e..cf18fe7 100644 --- a/satrs-core/src/cfdp/mod.rs +++ b/satrs-core/src/cfdp/mod.rs @@ -166,9 +166,14 @@ pub struct RemoteEntityConfig { pub closure_requested_by_default: bool, pub crc_on_transmission_by_default: bool, pub default_transmission_mode: TransmissionMode, - pub disposition_on_cancellation: bool, pub default_crc_type: ChecksumType, + pub positive_ack_timer_interval_seconds: f32, + pub positive_ack_timer_expiration_limit: u32, pub check_limit: u32, + pub disposition_on_cancellation: bool, + pub immediate_nak_mode: bool, + pub nak_timer_interval_seconds: f32, + pub nak_timer_expiration_limit: u32, } impl RemoteEntityConfig { @@ -190,7 +195,12 @@ impl RemoteEntityConfig { default_transmission_mode, default_crc_type, check_limit: 2, + positive_ack_timer_interval_seconds: 10.0, + positive_ack_timer_expiration_limit: 2, disposition_on_cancellation: false, + immediate_nak_mode: true, + nak_timer_interval_seconds: 10.0, + nak_timer_expiration_limit: 2, } } } From 7776847364bea2a745069752cf2e00e8d01c05da Mon Sep 17 00:00:00 2001 From: Robin Mueller Date: Fri, 22 Dec 2023 19:24:48 +0100 Subject: [PATCH 28/38] rework timer and packet send handling --- satrs-core/src/cfdp/dest.rs | 202 ++++++++++++++++++++---------------- satrs-core/src/cfdp/mod.rs | 45 ++++++-- 2 files changed, 144 insertions(+), 103 deletions(-) diff --git a/satrs-core/src/cfdp/dest.rs b/satrs-core/src/cfdp/dest.rs index bb13ec5..627a3cd 100644 --- a/satrs-core/src/cfdp/dest.rs +++ b/satrs-core/src/cfdp/dest.rs @@ -6,7 +6,8 @@ use super::{ filestore::{FilestoreError, VirtualFilestore}, user::{CfdpUser, FileSegmentRecvdParams, MetadataReceivedParams}, CheckTimer, CheckTimerCreator, EntityType, LocalEntityConfig, PacketInfo, PacketTarget, - RemoteEntityConfig, RemoteEntityConfigProvider, State, TransactionId, TransactionStep, + RemoteEntityConfig, RemoteEntityConfigProvider, State, TimerContext, TransactionId, + TransactionStep, }; use alloc::boxed::Box; use smallvec::SmallVec; @@ -26,12 +27,6 @@ use spacepackets::{ }; use thiserror::Error; -#[derive(Debug, Default)] -struct PacketsToSendContext { - packet_available: bool, - directive: Option, -} - #[derive(Debug)] struct FileProperties { src_file_name: [u8; u8::MAX as usize], @@ -171,6 +166,15 @@ pub enum DestError { NoRemoteCfgFound(UnsignedByteField), } +pub trait CfdpPacketSender: Send { + fn send_pdu( + &mut self, + pdu_type: PduType, + file_directive_type: Option, + raw_pdu: &[u8], + ) -> Result<(), PduError>; +} + /// This is the primary CFDP destination handler. It models the CFDP destination entity, which is /// primarily responsible for receiving files sent from another CFDP entity. It performs the /// reception side of File Copy Operations. @@ -194,7 +198,8 @@ pub struct DestinationHandler { step: TransactionStep, state: State, tparams: TransactionParams, - packets_to_send_ctx: PacketsToSendContext, + packet_buf: alloc::vec::Vec, + packet_sender: Box, vfs: Box, remote_cfg_table: Box, check_timer_creator: Box, @@ -203,6 +208,8 @@ pub struct DestinationHandler { impl DestinationHandler { pub fn new( local_cfg: LocalEntityConfig, + max_packet_len: usize, + packet_sender: Box, vfs: Box, remote_cfg_table: Box, check_timer_creator: Box, @@ -212,7 +219,8 @@ impl DestinationHandler { step: TransactionStep::Idle, state: State::Idle, tparams: Default::default(), - packets_to_send_ctx: Default::default(), + packet_buf: alloc::vec![0; max_packet_len], + packet_sender, vfs, remote_cfg_table, check_timer_creator, @@ -232,10 +240,7 @@ impl DestinationHandler { &mut self, cfdp_user: &mut impl CfdpUser, packet_to_insert: Option<&PacketInfo>, - ) -> Result<(), DestError> { - if self.packet_to_send_ready() { - return Err(DestError::PacketToSendLeft); - } + ) -> Result { if let Some(packet) = packet_to_insert { self.insert_packet(cfdp_user, packet)?; } @@ -259,54 +264,6 @@ impl DestinationHandler { self.tstate().transaction_id } - pub fn packet_to_send_ready(&self) -> bool { - self.packets_to_send_ctx.packet_available - } - - pub fn get_next_packet( - &self, - buf: &mut [u8], - ) -> Result, DestError> { - if !self.packet_to_send_ready() { - return Ok(None); - } - let directive = self.packets_to_send_ctx.directive.unwrap(); - let tstate = self.tstate(); - let written_size = match directive { - FileDirectiveType::FinishedPdu => { - let pdu_header = PduHeader::new_no_file_data(self.tparams.pdu_conf, 0); - let finished_pdu = if tstate.condition_code == ConditionCode::NoError - || tstate.condition_code == ConditionCode::UnsupportedChecksumType - { - FinishedPduCreator::new_default( - pdu_header, - tstate.delivery_code, - tstate.file_status, - ) - } else { - // TODO: Are there cases where this ID is actually the source entity ID? - let entity_id = EntityIdTlv::new(self.local_cfg.id); - FinishedPduCreator::new_with_error( - pdu_header, - tstate.condition_code, - tstate.delivery_code, - tstate.file_status, - entity_id, - ) - }; - finished_pdu.write_to_bytes(buf)? - } - FileDirectiveType::AckPdu => todo!(), - FileDirectiveType::NakPdu => todo!(), - FileDirectiveType::KeepAlivePdu => todo!(), - _ => { - // This should never happen and is considered an internal impl error - panic!("invalid file directive {directive:?} for dest handler send packet"); - } - }; - Ok(Some((directive, written_size))) - } - fn insert_packet( &mut self, cfdp_user: &mut impl CfdpUser, @@ -532,12 +489,14 @@ impl DestinationHandler { fn start_check_limit_handling(&mut self) { self.step = TransactionStep::ReceivingFileDataPdusWithCheckLimitHandling; - self.tparams.tstate.current_check_timer = - Some(self.check_timer_creator.get_check_timer_provider( - &self.local_cfg.id, - &self.tparams.remote_cfg.unwrap().entity_id, - EntityType::Receiving, - )); + self.tparams.tstate.current_check_timer = Some( + self.check_timer_creator + .get_check_timer_provider(TimerContext::CheckLimit { + local_id: self.local_cfg.id, + remote_id: self.tparams.remote_cfg.unwrap().entity_id, + entity_type: EntityType::Receiving, + }), + ); self.tparams.tstate.current_check_count = 0; } @@ -571,7 +530,8 @@ impl DestinationHandler { todo!(); } - fn fsm_busy(&mut self, cfdp_user: &mut impl CfdpUser) -> Result<(), DestError> { + fn fsm_busy(&mut self, cfdp_user: &mut impl CfdpUser) -> Result { + let mut sent_packets = 0; if self.step == TransactionStep::TransactionStart { self.transaction_start(cfdp_user)?; } @@ -579,7 +539,7 @@ impl DestinationHandler { self.check_limit_handling(); } if self.step == TransactionStep::TransferCompletion { - self.transfer_completion(cfdp_user)?; + sent_packets += self.transfer_completion(cfdp_user)?; } if self.step == TransactionStep::SendingAckPdu { todo!("no support for acknowledged mode yet"); @@ -587,7 +547,7 @@ impl DestinationHandler { if self.step == TransactionStep::SendingFinishedPdu { self.reset(); } - Ok(()) + Ok(sent_packets) } /// Get the step, which denotes the exact step of a pending CFDP transaction when applicable. @@ -669,17 +629,18 @@ impl DestinationHandler { Ok(()) } - fn transfer_completion(&mut self, cfdp_user: &mut impl CfdpUser) -> Result<(), DestError> { + fn transfer_completion(&mut self, cfdp_user: &mut impl CfdpUser) -> Result { + let mut sent_packets = 0; self.notice_of_completion(cfdp_user)?; if self.tparams.transmission_mode() == TransmissionMode::Acknowledged || self.tparams.metadata_params().closure_requested { - self.prepare_finished_pdu()?; + sent_packets += self.send_finished_pdu()?; self.step = TransactionStep::SendingFinishedPdu; } else { self.reset(); } - Ok(()) + Ok(sent_packets) } fn notice_of_completion(&mut self, cfdp_user: &mut impl CfdpUser) -> Result<(), DestError> { @@ -745,15 +706,36 @@ impl DestinationHandler { fn reset(&mut self) { self.step = TransactionStep::Idle; self.state = State::Idle; - self.packets_to_send_ctx.packet_available = false; + // self.packets_to_send_ctx.packet_available = false; self.tparams.reset(); } - fn prepare_finished_pdu(&mut self) -> Result<(), DestError> { - self.packets_to_send_ctx.packet_available = true; - self.packets_to_send_ctx.directive = Some(FileDirectiveType::FinishedPdu); - self.step = TransactionStep::SendingFinishedPdu; - Ok(()) + fn send_finished_pdu(&mut self) -> Result { + let tstate = self.tstate(); + + let pdu_header = PduHeader::new_no_file_data(self.tparams.pdu_conf, 0); + let finished_pdu = if tstate.condition_code == ConditionCode::NoError + || tstate.condition_code == ConditionCode::UnsupportedChecksumType + { + FinishedPduCreator::new_default(pdu_header, tstate.delivery_code, tstate.file_status) + } else { + // TODO: Are there cases where this ID is actually the source entity ID? + let entity_id = EntityIdTlv::new(self.local_cfg.id); + FinishedPduCreator::new_with_error( + pdu_header, + tstate.condition_code, + tstate.delivery_code, + tstate.file_status, + entity_id, + ) + }; + finished_pdu.write_to_bytes(&mut self.packet_buf)?; + self.packet_sender.send_pdu( + finished_pdu.pdu_type(), + finished_pdu.file_directive_type(), + &self.packet_buf[0..finished_pdu.len_written()], + )?; + Ok(1) } fn tstate(&self) -> &TransferState { @@ -800,6 +782,27 @@ mod tests { pub length: usize, } + type SharedPduPacketQueue = Arc, Vec)>>>; + #[derive(Default, Clone)] + struct TestCfdpSender { + packet_queue: SharedPduPacketQueue, + } + + impl CfdpPacketSender for TestCfdpSender { + fn send_pdu( + &mut self, + pdu_type: PduType, + file_directive_type: Option, + raw_pdu: &[u8], + ) -> Result<(), PduError> { + self.packet_queue.lock().unwrap().push_back(( + pdu_type, + file_directive_type, + raw_pdu.to_vec(), + )); + Ok(()) + } + } #[derive(Default)] struct TestCfdpUser { next_expected_seq_num: u64, @@ -1025,28 +1028,33 @@ mod tests { } struct TestCheckTimerCreator { - expired_flag: Arc, + check_limit_expired_flag: Arc, } impl TestCheckTimerCreator { pub fn new(expired_flag: Arc) -> Self { - Self { expired_flag } + Self { + check_limit_expired_flag: expired_flag, + } } } impl CheckTimerCreator for TestCheckTimerCreator { - fn get_check_timer_provider( - &self, - _local_id: &UnsignedByteField, - _remote_id: &UnsignedByteField, - _entity_type: crate::cfdp::EntityType, - ) -> Box { - Box::new(TestCheckTimer::new(self.expired_flag.clone())) + fn get_check_timer_provider(&self, timer_context: TimerContext) -> Box { + match timer_context { + TimerContext::CheckLimit { .. } => { + Box::new(TestCheckTimer::new(self.check_limit_expired_flag.clone())) + } + _ => { + panic!("invalid check timer creator, can only be used for check limit handling") + } + } } } struct DestHandlerTester { check_timer_expired: Arc, + test_sender: TestCfdpSender, handler: DestinationHandler, src_path: PathBuf, dest_path: PathBuf, @@ -1061,11 +1069,17 @@ mod tests { impl DestHandlerTester { fn new(fault_handler: TestFaultHandler) -> Self { let check_timer_expired = Arc::new(AtomicBool::new(false)); - let dest_handler = default_dest_handler(fault_handler, check_timer_expired.clone()); + let test_sender = TestCfdpSender::default(); + let dest_handler = default_dest_handler( + fault_handler, + test_sender.clone(), + check_timer_expired.clone(), + ); let (src_path, dest_path) = init_full_filenames(); assert!(!Path::exists(&dest_path)); let handler = Self { check_timer_expired, + test_sender, handler: dest_handler, src_path, dest_path, @@ -1134,7 +1148,7 @@ mod tests { user: &mut TestCfdpUser, offset: u64, file_data_chunk: &[u8], - ) -> Result<(), DestError> { + ) -> Result { let filedata_pdu = FileDataPdu::new_no_seg_metadata(self.pdu_header, offset, file_data_chunk); filedata_pdu @@ -1157,7 +1171,7 @@ mod tests { &mut self, user: &mut TestCfdpUser, expected_full_data: Vec, - ) -> Result<(), DestError> { + ) -> Result { self.expected_full_data = expected_full_data; let eof_pdu = create_no_error_eof(&self.expected_full_data, &self.pdu_header); let packet_info = create_packet_info(&eof_pdu, &mut self.buf); @@ -1218,6 +1232,7 @@ mod tests { fn default_dest_handler( test_fault_handler: TestFaultHandler, + test_packet_sender: TestCfdpSender, check_timer_expired: Arc, ) -> DestinationHandler { let local_entity_cfg = LocalEntityConfig { @@ -1227,6 +1242,8 @@ mod tests { }; DestinationHandler::new( local_entity_cfg, + 2048, + Box::new(test_packet_sender), Box::::default(), Box::new(basic_remote_cfg_table()), Box::new(TestCheckTimerCreator::new(check_timer_expired)), @@ -1284,7 +1301,8 @@ mod tests { #[test] fn test_basic() { let fault_handler = TestFaultHandler::default(); - let dest_handler = default_dest_handler(fault_handler.clone(), Arc::default()); + let test_sender = TestCfdpSender::default(); + let dest_handler = default_dest_handler(fault_handler.clone(), test_sender, Arc::default()); assert!(dest_handler.transmission_mode().is_none()); assert!(fault_handler.all_queues_empty()); } diff --git a/satrs-core/src/cfdp/mod.rs b/satrs-core/src/cfdp/mod.rs index cf18fe7..7bf6776 100644 --- a/satrs-core/src/cfdp/mod.rs +++ b/satrs-core/src/cfdp/mod.rs @@ -31,7 +31,23 @@ pub enum EntityType { Receiving, } -/// Generic abstraction for a check timer which has different functionality depending on whether +pub enum TimerContext { + CheckLimit { + local_id: UnsignedByteField, + remote_id: UnsignedByteField, + entity_type: EntityType, + }, + NakActivity(f32), + PositiveAck(f32), +} + +/// Generic abstraction for a check timer which is used by 3 mechanisms of the CFDP protocol. +/// +/// ## 1. Check limit handling +/// +/// The first mechanism is the check limit handling for unacknowledged transfers as specified +/// in 4.6.3.2 and 4.6.3.3 of the CFDP standard. +/// For this mechanism, the timer has different functionality depending on whether /// the using entity is the sending entity or the receiving entity for the unacknowledged /// transmission mode. /// @@ -42,6 +58,18 @@ pub enum EntityType { /// For the receiving entity, this timer determines the expiry period for incrementing a check /// counter after an EOF PDU is received for an incomplete file transfer. This allows out-of-order /// reception of file data PDUs and EOF PDUs. Also see 4.6.3.3 of the CFDP standard. +/// +/// ## 2. NAK activity limit +/// +/// The timer will be used to perform the NAK activity check as specified in 4.6.4.7 of the CFDP +/// standard. The expiration period will be provided by the NAK timer expiration limit of the +/// remote entity configuration. +/// +/// ## 3. Positive ACK procedures +/// +/// The timer will be used to perform the Positive Acknowledgement Procedures as specified in +/// 4.7. 1of the CFDP standard. The expiration period will be provided by the Positive ACK timer +/// interval of the remote entity configuration. pub trait CheckTimer: Debug { fn has_expired(&self) -> bool; fn reset(&mut self); @@ -50,19 +78,14 @@ pub trait CheckTimer: Debug { /// A generic trait which allows CFDP entities to create check timers which are required to /// implement special procedures in unacknowledged transmission mode, as specified in 4.6.3.2 /// and 4.6.3.3. The [CheckTimer] documentation provides more information about the purpose of the -/// check timer. +/// check timer in the context of CFDP. /// -/// This trait also allows the creation of different check timers depending on -/// the ID of the local entity, the ID of the remote entity for a given transaction, and the -/// type of entity. +/// This trait also allows the creation of different check timers depending on context and purpose +/// of the timer, the runtime environment (e.g. standard clock timer vs. timer using a RTC) or +/// other factors. #[cfg(feature = "alloc")] pub trait CheckTimerCreator { - fn get_check_timer_provider( - &self, - local_id: &UnsignedByteField, - remote_id: &UnsignedByteField, - entity_type: EntityType, - ) -> Box; + fn get_check_timer_provider(&self, timer_context: TimerContext) -> Box; } /// Simple implementation of the [CheckTimerCreator] trait assuming a standard runtime. From c5054c323e204d011b1669daabcddc90e21726de Mon Sep 17 00:00:00 2001 From: Robin Mueller Date: Fri, 22 Dec 2023 19:40:58 +0100 Subject: [PATCH 29/38] add some documentation and other improvements --- satrs-core/src/cfdp/dest.rs | 54 ++++++++++++++++++++++--------------- satrs-core/src/cfdp/mod.rs | 8 ++++-- 2 files changed, 39 insertions(+), 23 deletions(-) diff --git a/satrs-core/src/cfdp/dest.rs b/satrs-core/src/cfdp/dest.rs index 627a3cd..df28c0b 100644 --- a/satrs-core/src/cfdp/dest.rs +++ b/satrs-core/src/cfdp/dest.rs @@ -178,21 +178,17 @@ pub trait CfdpPacketSender: Send { /// This is the primary CFDP destination handler. It models the CFDP destination entity, which is /// primarily responsible for receiving files sent from another CFDP entity. It performs the /// reception side of File Copy Operations. - -/// The following core functions are the primary interface for interacting with the destination -/// handler: - -/// 1. [DestinationHandler::state_machine] - Can be used to insert packets into the destination -/// handler and/or advance the state machine. Advancing the state machine might generate new -/// packets to be sent to the remote entity. Please note that the destination handler can also -/// only process Metadata, EOF and Prompt PDUs in addition to ACK PDUs where the acknowledged -/// PDU is the Finished PDU. -/// 2. [DestinationHandler::get_next_packet] - Retrieve next packet to be sent back to the remote -/// CFDP source entity ID. - -/// A new file transfer (Metadata PDU reception) is only be accepted if the handler is in the -/// IDLE state. Furthermore, packet insertion is not allowed until all packets to send were -/// retrieved after a state machine call. +/// +/// The [DestinationHandler::state_machine] function is the primary function to drive the +/// destination handler. It can be used to insert packets into the destination +/// handler and driving the state machine, which might generate new +/// packets to be sent to the remote entity. Please note that the destination handler can also +/// only process Metadata, EOF and Prompt PDUs in addition to ACK PDUs where the acknowledged +/// PDU is the Finished PDU. +/// +/// All generated packets are sent via the [CfdpPacketSender] trait, which is implemented by the +/// user and passed as a constructor parameter. The number of generated packets is returned +/// by the state machine call. pub struct DestinationHandler { local_cfg: LocalEntityConfig, step: TransactionStep, @@ -206,6 +202,25 @@ pub struct DestinationHandler { } impl DestinationHandler { + /// Constructs a new destination handler. + /// + /// # Arguments + /// * `local_cfg` - The local CFDP entity configuration, consisting of the local entity ID, + /// the indication configuration, and the fault handlers. + /// * `max_packet_len` - The maximum expected generated packet size in bytes. Each time a + /// packet is sent, it will be buffered inside an internal buffer. The length of this buffer + /// will be determined by this parameter. This parameter can either be a known upper bound, + /// or it can specifically be determined by the largest packet size parameter of all remote + /// entity configurations in the passed `remote_cfg_table`. + /// * `packet_sender` - All generated packets are sent via this abstraction. + /// * `vfs` - Virtual filestore implementation to decouple the CFDP implementation from the + /// underlying filestore/filesystem. This allows to use this handler for embedded systems + /// where a standard runtime might not be available. + /// * `remote_cfg_table` - A table of all expected remote entities this entity will communicate + /// with. It contains various configuration parameters required for file transfers. + /// * `check_timer_creator` - This is used by the CFDP handler to generate timers required + /// by various tasks. + /// * `` pub fn new( local_cfg: LocalEntityConfig, max_packet_len: usize, @@ -230,12 +245,9 @@ impl DestinationHandler { /// This is the core function to drive the destination handler. It is also used to insert /// packets into the destination handler. /// - /// Please note that this function will fail if there are still packets which need to be - /// retrieved with [Self::get_next_packet]. After each state machine call, the user has to - /// retrieve all packets before calling the state machine again. The state machine should - /// either be called if a packet with the appropriate destination ID is received, or - /// periodically in IDLE periods to perform all CFDP related tasks, for example checking for - /// timeouts or missed file segments. + /// The state machine should either be called if a packet with the appropriate destination ID + /// is received, or periodically in IDLE periods to perform all CFDP related tasks, for example + /// checking for timeouts or missed file segments. pub fn state_machine( &mut self, cfdp_user: &mut impl CfdpUser, diff --git a/satrs-core/src/cfdp/mod.rs b/satrs-core/src/cfdp/mod.rs index 7bf6776..c3bda16 100644 --- a/satrs-core/src/cfdp/mod.rs +++ b/satrs-core/src/cfdp/mod.rs @@ -37,8 +37,12 @@ pub enum TimerContext { remote_id: UnsignedByteField, entity_type: EntityType, }, - NakActivity(f32), - PositiveAck(f32), + NakActivity { + expiry_time_seconds: f32, + }, + PositiveAck { + expiry_time_seconds: f32, + }, } /// Generic abstraction for a check timer which is used by 3 mechanisms of the CFDP protocol. From c2bd862ba4607b64a354887637782fe885d0cdfa Mon Sep 17 00:00:00 2001 From: Robin Mueller Date: Fri, 22 Dec 2023 19:42:18 +0100 Subject: [PATCH 30/38] typo --- satrs-core/src/cfdp/dest.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/satrs-core/src/cfdp/dest.rs b/satrs-core/src/cfdp/dest.rs index df28c0b..8969e5f 100644 --- a/satrs-core/src/cfdp/dest.rs +++ b/satrs-core/src/cfdp/dest.rs @@ -205,6 +205,7 @@ impl DestinationHandler { /// Constructs a new destination handler. /// /// # Arguments + /// /// * `local_cfg` - The local CFDP entity configuration, consisting of the local entity ID, /// the indication configuration, and the fault handlers. /// * `max_packet_len` - The maximum expected generated packet size in bytes. Each time a @@ -220,7 +221,6 @@ impl DestinationHandler { /// with. It contains various configuration parameters required for file transfers. /// * `check_timer_creator` - This is used by the CFDP handler to generate timers required /// by various tasks. - /// * `` pub fn new( local_cfg: LocalEntityConfig, max_packet_len: usize, From d8acaaf58020778de43ab8d8caf3e054ed5d53ad Mon Sep 17 00:00:00 2001 From: Robin Mueller Date: Tue, 23 Jan 2024 18:43:09 +0100 Subject: [PATCH 31/38] add test for requested closure --- satrs-core/src/cfdp/dest.rs | 58 ++++++++++++++++++++++++++++++------- 1 file changed, 48 insertions(+), 10 deletions(-) diff --git a/satrs-core/src/cfdp/dest.rs b/satrs-core/src/cfdp/dest.rs index 8969e5f..be4eb88 100644 --- a/satrs-core/src/cfdp/dest.rs +++ b/satrs-core/src/cfdp/dest.rs @@ -815,6 +815,13 @@ mod tests { Ok(()) } } + + impl TestCfdpSender { + pub fn queue_empty(&self) -> bool { + self.packet_queue.lock().unwrap().is_empty() + } + } + #[derive(Default)] struct TestCfdpUser { next_expected_seq_num: u64, @@ -1066,20 +1073,21 @@ mod tests { struct DestHandlerTester { check_timer_expired: Arc, - test_sender: TestCfdpSender, + pdu_sender: TestCfdpSender, handler: DestinationHandler, src_path: PathBuf, dest_path: PathBuf, check_dest_file: bool, check_handler_idle_at_drop: bool, expected_file_size: u64, + closure_requested: bool, pdu_header: PduHeader, expected_full_data: Vec, buf: [u8; 512], } impl DestHandlerTester { - fn new(fault_handler: TestFaultHandler) -> Self { + fn new(fault_handler: TestFaultHandler, closure_requested: bool) -> Self { let check_timer_expired = Arc::new(AtomicBool::new(false)); let test_sender = TestCfdpSender::default(); let dest_handler = default_dest_handler( @@ -1091,9 +1099,10 @@ mod tests { assert!(!Path::exists(&dest_path)); let handler = Self { check_timer_expired, - test_sender, + pdu_sender: test_sender, handler: dest_handler, src_path, + closure_requested, dest_path, check_dest_file: false, check_handler_idle_at_drop: false, @@ -1144,6 +1153,7 @@ mod tests { self.src_path.as_path(), self.dest_path.as_path(), file_size, + self.closure_requested ); let packet_info = create_packet_info(&metadata_pdu, &mut self.buf); self.handler.state_machine(user, Some(&packet_info))?; @@ -1274,13 +1284,14 @@ mod tests { src_name: &'filename Path, dest_name: &'filename Path, file_size: u64, + closure_requested: bool ) -> MetadataPduCreator<'filename, 'filename, 'static> { let checksum_type = if file_size == 0 { ChecksumType::NullChecksum } else { ChecksumType::Crc32 }; - let metadata_params = MetadataGenericParams::new(false, checksum_type, file_size); + let metadata_params = MetadataGenericParams::new(closure_requested, checksum_type, file_size); MetadataPduCreator::new_no_opts( *pdu_header, metadata_params, @@ -1320,9 +1331,9 @@ mod tests { } #[test] - fn test_empty_file_transfer_not_acked() { + fn test_empty_file_transfer_not_acked_no_closure() { let fault_handler = TestFaultHandler::default(); - let mut test_obj = DestHandlerTester::new(fault_handler.clone()); + let mut test_obj = DestHandlerTester::new(fault_handler.clone(), false); let mut test_user = test_obj.test_user_from_cached_paths(0); test_obj .generic_transfer_init(&mut test_user, 0) @@ -1332,6 +1343,8 @@ mod tests { .generic_eof_no_error(&mut test_user, Vec::new()) .expect("EOF no error insertion failed"); assert!(fault_handler.all_queues_empty()); + assert!(test_obj.pdu_sender.queue_empty()); + test_obj.state_check(State::Idle, TransactionStep::Idle); } #[test] @@ -1341,7 +1354,7 @@ mod tests { let file_size = file_data.len() as u64; let fault_handler = TestFaultHandler::default(); - let mut test_obj = DestHandlerTester::new(fault_handler.clone()); + let mut test_obj = DestHandlerTester::new(fault_handler.clone(), false); let mut test_user = test_obj.test_user_from_cached_paths(file_size); test_obj .generic_transfer_init(&mut test_user, file_size) @@ -1354,6 +1367,8 @@ mod tests { .generic_eof_no_error(&mut test_user, file_data.to_vec()) .expect("EOF no error insertion failed"); assert!(fault_handler.all_queues_empty()); + assert!(test_obj.pdu_sender.queue_empty()); + test_obj.state_check(State::Idle, TransactionStep::Idle); } #[test] @@ -1365,7 +1380,7 @@ mod tests { let segment_len = 256; let fault_handler = TestFaultHandler::default(); - let mut test_obj = DestHandlerTester::new(fault_handler.clone()); + let mut test_obj = DestHandlerTester::new(fault_handler.clone(), false); let mut test_user = test_obj.test_user_from_cached_paths(file_size); test_obj .generic_transfer_init(&mut test_user, file_size) @@ -1385,6 +1400,8 @@ mod tests { .generic_eof_no_error(&mut test_user, random_data.to_vec()) .expect("EOF no error insertion failed"); assert!(fault_handler.all_queues_empty()); + assert!(test_obj.pdu_sender.queue_empty()); + test_obj.state_check(State::Idle, TransactionStep::Idle); } #[test] @@ -1396,7 +1413,7 @@ mod tests { let segment_len = 256; let fault_handler = TestFaultHandler::default(); - let mut test_obj = DestHandlerTester::new(fault_handler.clone()); + let mut test_obj = DestHandlerTester::new(fault_handler.clone(), false); let mut test_user = test_obj.test_user_from_cached_paths(file_size); let transaction_id = test_obj .generic_transfer_init(&mut test_user, file_size) @@ -1432,6 +1449,8 @@ mod tests { assert_eq!(cancelled.0, transaction_id); assert_eq!(cancelled.1, ConditionCode::FileChecksumFailure); assert_eq!(cancelled.2, segment_len as u64); + assert!(test_obj.pdu_sender.queue_empty()); + test_obj.state_check(State::Idle, TransactionStep::Idle); } #[test] @@ -1443,7 +1462,7 @@ mod tests { let segment_len = 256; let fault_handler = TestFaultHandler::default(); - let mut test_obj = DestHandlerTester::new(fault_handler.clone()); + let mut test_obj = DestHandlerTester::new(fault_handler.clone(), false); let mut test_user = test_obj.test_user_from_cached_paths(file_size); let transaction_id = test_obj .generic_transfer_init(&mut test_user, file_size) @@ -1498,6 +1517,8 @@ mod tests { drop(cancelled_queue); + assert!(test_obj.pdu_sender.queue_empty()); + // Check that the broken file exists. test_obj.check_dest_file = false; assert!(Path::exists(test_obj.dest_path())); @@ -1506,4 +1527,21 @@ mod tests { assert_eq!(read_content, &random_data[0..segment_len]); assert!(fs::remove_file(test_obj.dest_path().as_path()).is_ok()); } + + #[test] + fn test_file_transfer_with_closure() { + let fault_handler = TestFaultHandler::default(); + let mut test_obj = DestHandlerTester::new(fault_handler.clone(), true); + let mut test_user = test_obj.test_user_from_cached_paths(0); + test_obj + .generic_transfer_init(&mut test_user, 0) + .expect("transfer init failed"); + test_obj.state_check(State::Busy, TransactionStep::ReceivingFileDataPdus); + test_obj + .generic_eof_no_error(&mut test_user, Vec::new()) + .expect("EOF no error insertion failed"); + assert!(fault_handler.all_queues_empty()); + test_obj.state_check(State::Idle, TransactionStep::Idle); + // assert!(!test_obj.pdu_sender.queue_empty()); + } } From 48b8c6891aa2f2ca231b75fc38222c7f9437f0d1 Mon Sep 17 00:00:00 2001 From: Robin Mueller Date: Tue, 23 Jan 2024 19:43:52 +0100 Subject: [PATCH 32/38] verified first finished PDU success --- satrs-core/Cargo.toml | 2 +- satrs-core/src/cfdp/dest.rs | 130 ++++++++++++++++++++++++------------ 2 files changed, 90 insertions(+), 42 deletions(-) diff --git a/satrs-core/Cargo.toml b/satrs-core/Cargo.toml index c46fc3b..d16f0a0 100644 --- a/satrs-core/Cargo.toml +++ b/satrs-core/Cargo.toml @@ -73,7 +73,7 @@ features = ["all"] optional = true [dependencies.spacepackets] -version = "0.7.0-beta.3" +version = "0.7.0-beta.4" default-features = false # git = "https://egit.irs.uni-stuttgart.de/rust/spacepackets.git" # rev = "297cfad22637d3b07a1b27abe56d9a607b5b82a7" diff --git a/satrs-core/src/cfdp/dest.rs b/satrs-core/src/cfdp/dest.rs index be4eb88..495e5fa 100644 --- a/satrs-core/src/cfdp/dest.rs +++ b/satrs-core/src/cfdp/dest.rs @@ -21,7 +21,7 @@ use spacepackets::{ CfdpPdu, CommonPduConfig, FileDirectiveType, PduError, PduHeader, WritablePduPacket, }, tlv::{msg_to_user::MsgToUserTlv, EntityIdTlv, GenericTlv, TlvType}, - ConditionCode, FaultHandlerCode, PduType, TransmissionMode, + ChecksumType, ConditionCode, FaultHandlerCode, PduType, TransmissionMode, }, util::UnsignedByteField, }; @@ -47,6 +47,7 @@ struct TransferState { transaction_id: Option, metadata_params: MetadataGenericParams, progress: u64, + metadata_only: bool, condition_code: ConditionCode, delivery_code: DeliveryCode, file_status: FileStatus, @@ -62,6 +63,7 @@ impl Default for TransferState { transaction_id: None, metadata_params: Default::default(), progress: Default::default(), + metadata_only: false, condition_code: ConditionCode::NoError, delivery_code: DeliveryCode::Incomplete, file_status: FileStatus::Unreported, @@ -344,21 +346,29 @@ impl DestinationHandler { // TODO: Support for metadata only PDUs. let src_name = metadata_pdu.src_file_name(); - if src_name.is_empty() { + let dest_name = metadata_pdu.dest_file_name(); + if src_name.is_empty() && dest_name.is_empty() { + self.tparams.tstate.metadata_only = true; + } + if !self.tparams.tstate.metadata_only && src_name.is_empty() { return Err(DestError::EmptySrcFileField); } - self.tparams.file_properties.src_file_name[..src_name.len_value()] - .copy_from_slice(src_name.value()); - self.tparams.file_properties.src_file_name_len = src_name.len_value(); - let dest_name = metadata_pdu.dest_file_name(); - if dest_name.is_empty() { + if !self.tparams.tstate.metadata_only && dest_name.is_empty() { return Err(DestError::EmptyDestFileField); } - self.tparams.file_properties.dest_file_name[..dest_name.len_value()] - .copy_from_slice(dest_name.value()); - self.tparams.file_properties.dest_file_name_len = dest_name.len_value(); - self.tparams.pdu_conf = *metadata_pdu.pdu_header().common_pdu_conf(); - self.tparams.msgs_to_user_size = 0; + if !self.tparams.tstate.metadata_only { + self.tparams.file_properties.src_file_name[..src_name.len_value()] + .copy_from_slice(src_name.value()); + self.tparams.file_properties.src_file_name_len = src_name.len_value(); + if dest_name.is_empty() { + return Err(DestError::EmptyDestFileField); + } + self.tparams.file_properties.dest_file_name[..dest_name.len_value()] + .copy_from_slice(dest_name.value()); + self.tparams.file_properties.dest_file_name_len = dest_name.len_value(); + self.tparams.pdu_conf = *metadata_pdu.pdu_header().common_pdu_conf(); + self.tparams.msgs_to_user_size = 0; + } if !metadata_pdu.options().is_empty() { for option_tlv in metadata_pdu.options_iter().unwrap() { if option_tlv.is_standard_tlv() @@ -476,27 +486,38 @@ impl DestinationHandler { } fn checksum_verify(&mut self, checksum: u32) -> bool { - match self.vfs.checksum_verify( - self.tparams.file_properties.dest_path_buf.to_str().unwrap(), - self.tparams.metadata_params().checksum_type, - checksum, - &mut self.tparams.cksum_buf, - ) { - Ok(checksum_success) => checksum_success, - Err(e) => match e { - FilestoreError::ChecksumTypeNotImplemented(_) => { - self.declare_fault(ConditionCode::UnsupportedChecksumType); - // For this case, the applicable algorithm shall the the null checksum, which - // is always succesful. - true + let mut file_delivery_complete = false; + if self.tparams.metadata_params().checksum_type == ChecksumType::NullChecksum + || self.tparams.tstate.metadata_only + { + file_delivery_complete = true; + self.tparams.tstate.delivery_code = DeliveryCode::Complete; + self.tparams.tstate.condition_code = ConditionCode::NoError; + } else { + match self.vfs.checksum_verify( + self.tparams.file_properties.dest_path_buf.to_str().unwrap(), + self.tparams.metadata_params().checksum_type, + checksum, + &mut self.tparams.cksum_buf, + ) { + Ok(checksum_success) => { + file_delivery_complete = checksum_success; } - _ => { - self.declare_fault(ConditionCode::FilestoreRejection); - // Treat this equivalent to a failed checksum procedure. - false - } - }, + Err(e) => match e { + FilestoreError::ChecksumTypeNotImplemented(_) => { + self.declare_fault(ConditionCode::UnsupportedChecksumType); + // For this case, the applicable algorithm shall be the the null checksum, + // which is always succesful. + file_delivery_complete = true; + } + _ => { + self.declare_fault(ConditionCode::FilestoreRejection); + // Treat this equivalent to a failed checksum procedure. + } + }, + }; } + file_delivery_complete } fn start_check_limit_handling(&mut self) { @@ -771,7 +792,7 @@ mod tests { use spacepackets::{ cfdp::{ lv::Lv, - pdu::{metadata::MetadataPduCreator, WritablePduPacket}, + pdu::{finished::FinishedPduReader, metadata::MetadataPduCreator, WritablePduPacket}, ChecksumType, TransmissionMode, }, util::{UbfU16, UnsignedByteFieldU16}, @@ -794,7 +815,12 @@ mod tests { pub length: usize, } - type SharedPduPacketQueue = Arc, Vec)>>>; + struct SentPdu { + pdu_type: PduType, + file_directive_type: Option, + raw_pdu: Vec, + } + type SharedPduPacketQueue = Arc>>; #[derive(Default, Clone)] struct TestCfdpSender { packet_queue: SharedPduPacketQueue, @@ -807,16 +833,19 @@ mod tests { file_directive_type: Option, raw_pdu: &[u8], ) -> Result<(), PduError> { - self.packet_queue.lock().unwrap().push_back(( + self.packet_queue.lock().unwrap().push_back(SentPdu { pdu_type, file_directive_type, - raw_pdu.to_vec(), - )); + raw_pdu: raw_pdu.to_vec(), + }); Ok(()) } } impl TestCfdpSender { + pub fn retrieve_next_pdu(&self) -> Option { + self.packet_queue.lock().unwrap().pop_front() + } pub fn queue_empty(&self) -> bool { self.packet_queue.lock().unwrap().is_empty() } @@ -1153,7 +1182,7 @@ mod tests { self.src_path.as_path(), self.dest_path.as_path(), file_size, - self.closure_requested + self.closure_requested, ); let packet_info = create_packet_info(&metadata_pdu, &mut self.buf); self.handler.state_machine(user, Some(&packet_info))?; @@ -1284,14 +1313,15 @@ mod tests { src_name: &'filename Path, dest_name: &'filename Path, file_size: u64, - closure_requested: bool + closure_requested: bool, ) -> MetadataPduCreator<'filename, 'filename, 'static> { let checksum_type = if file_size == 0 { ChecksumType::NullChecksum } else { ChecksumType::Crc32 }; - let metadata_params = MetadataGenericParams::new(closure_requested, checksum_type, file_size); + let metadata_params = + MetadataGenericParams::new(closure_requested, checksum_type, file_size); MetadataPduCreator::new_no_opts( *pdu_header, metadata_params, @@ -1528,6 +1558,20 @@ mod tests { assert!(fs::remove_file(test_obj.dest_path().as_path()).is_ok()); } + fn check_finished_pdu_success(sent_pdu: &SentPdu) { + assert_eq!(sent_pdu.pdu_type, PduType::FileDirective); + assert_eq!( + sent_pdu.file_directive_type, + Some(FileDirectiveType::FinishedPdu) + ); + let finished_pdu = FinishedPduReader::from_bytes(&sent_pdu.raw_pdu).unwrap(); + assert_eq!(finished_pdu.file_status(), FileStatus::Retained); + assert_eq!(finished_pdu.condition_code(), ConditionCode::NoError); + assert_eq!(finished_pdu.delivery_code(), DeliveryCode::Complete); + assert!(finished_pdu.fault_location().is_none()); + assert_eq!(finished_pdu.fs_responses_raw(), &[]); + } + #[test] fn test_file_transfer_with_closure() { let fault_handler = TestFaultHandler::default(); @@ -1537,11 +1581,15 @@ mod tests { .generic_transfer_init(&mut test_user, 0) .expect("transfer init failed"); test_obj.state_check(State::Busy, TransactionStep::ReceivingFileDataPdus); - test_obj + let sent_packets = test_obj .generic_eof_no_error(&mut test_user, Vec::new()) .expect("EOF no error insertion failed"); + assert_eq!(sent_packets, 1); assert!(fault_handler.all_queues_empty()); + // The Finished PDU was sent, so the state machine is done. test_obj.state_check(State::Idle, TransactionStep::Idle); - // assert!(!test_obj.pdu_sender.queue_empty()); + assert!(!test_obj.pdu_sender.queue_empty()); + let sent_pdu = test_obj.pdu_sender.retrieve_next_pdu().unwrap(); + check_finished_pdu_success(&sent_pdu); } } From dada8a775dca4096c87f8bf5c95ad242daaf9253 Mon Sep 17 00:00:00 2001 From: Robin Mueller Date: Mon, 29 Jan 2024 11:44:02 +0100 Subject: [PATCH 33/38] improve some graphs --- satrs-core/images/event_man_arch.graphml | 64 +- satrs-core/images/event_man_arch.pdf | 1821 ++++++++++++++++++++++ 2 files changed, 1853 insertions(+), 32 deletions(-) create mode 100644 satrs-core/images/event_man_arch.pdf diff --git a/satrs-core/images/event_man_arch.graphml b/satrs-core/images/event_man_arch.graphml index 1336793..cb41cd4 100644 --- a/satrs-core/images/event_man_arch.graphml +++ b/satrs-core/images/event_man_arch.graphml @@ -1,6 +1,6 @@ - + @@ -20,7 +20,7 @@ - Example Event Flow + Example Event Flow @@ -31,7 +31,7 @@ - Event Manager + Event Manager @@ -39,10 +39,10 @@ - + - Event + Event Creator 0 @@ -54,7 +54,7 @@ Creator 0 - Event + Event Creator 2 @@ -63,10 +63,10 @@ Creator 2 - + - Event + Event Creator 1 @@ -78,7 +78,7 @@ Creator 1 - Event + Event Creator 3 @@ -87,10 +87,10 @@ Creator 3 - + - PUS Service 5 + PUS Service 5 Event Reporting @@ -100,10 +100,10 @@ Event Reporting - + - PUS Service 19 + PUS Service 19 Event Action @@ -115,7 +115,7 @@ Event Action - Telemetry + Telemetry Sink @@ -124,10 +124,10 @@ Sink - + - Subscriptions + Subscriptions 1. Event Creator 0 subscribes for event 0 @@ -144,10 +144,10 @@ Sink - + - event 1 + event 1 (group 1) @@ -161,7 +161,7 @@ Sink - event 0 + event 0 (group 0) @@ -173,7 +173,7 @@ Sink - event 2 + event 2 (group 3) @@ -187,8 +187,8 @@ Sink - event 3 (group 2) -event 4 (group 2) + event 3 (group 2) +event 4 (group 2) @@ -196,10 +196,10 @@ event 4 (group 2) - + - <<all events>> + <<all events>> @@ -207,10 +207,10 @@ event 4 (group 2) - + - <<all events>> + <<all events>> @@ -219,11 +219,11 @@ event 4 (group 2) - + - event 1 + event 1 event 2 @@ -232,10 +232,10 @@ event 2 - + - group 2 + group 2 @@ -243,10 +243,10 @@ event 2 - + - enabled Events + enabled Events as PUS 5 TM diff --git a/satrs-core/images/event_man_arch.pdf b/satrs-core/images/event_man_arch.pdf new file mode 100644 index 0000000..8ef5e9a --- /dev/null +++ b/satrs-core/images/event_man_arch.pdf @@ -0,0 +1,1821 @@ +%PDF-1.4 +%âãÏÓ +1 0 obj + << + /Title () + /Author () + /Subject () + /Keywords () + /Creator (yExport 1.5) + /Producer (org.freehep.graphicsio.pdf.YPDFGraphics2D 1.5) + /CreationDate (D:20240129114245+01'00') + /ModDate (D:20240129114245+01'00') + /Trapped /False + >> +endobj +2 0 obj + << + /Type /Catalog + /Pages 3 0 R + /ViewerPreferences 4 0 R + /OpenAction [5 0 R /Fit] + >> +endobj +4 0 obj + << + /FitWindow true + /CenterWindow false + >> +endobj +5 0 obj + << + /Parent 3 0 R + /Type /Page + /Contents 6 0 R + >> +endobj +6 0 obj + << + /Length 7 0 R + /Filter [/ASCII85Decode /FlateDecode] + >> +stream +GauF[bDmo2Y9c*1VoT\<[-j9S7gCa+J_L9fNqI+r)$DiS>9h& +%g@[%*Nq#qr]bDps7]n#l`XbN^bD>r]\YQp1Pl$-g\dT;H(3jJ5>-?P4nA@fj"GY)c3g(*=8ET>o\$m, +.Y#;1F/QYM:HUg6#+hHtqupTCh`o,!ZQ5ljY&_eN_.*SVraDa,TKIa>`R@ocpd3lnJU;]HlfW.NGlg,> +XK?j,qUlX'gLr/J.!M=pZbTD=Du#n:q"]aiN1mLpq5i/VI]fifBqEmlYDZcMcgc=!riC`j*GE\4W94D^ +c`Qa.\VYEQB!]mBd171RTu+8%RhMdnbWKgliM#00>06%+oZ`7.<3!^2@m5$E +'XNB(S[5<(Nl>>FpQPp7oi\o?a*sLr>e$(1M84tVdd(cmTCmo=rJs,A+UdfmG^Gq@PDkV=UK5FI87rlc +k=D4J[1@V)+ePhFA32(#oAW8ZB[*0?2!NrF#OfI'54`I(K+AkgcZ20EHgiA;g03!@gB+;R2587-_UVue +%?+;90RMsso6m4B8GcH\Sj%\j7VcG5X]#s1!e$X86u/pfQ^R_,St!5'.`\/tOr.%".Vp&0I1tKoN?>UD +oiWV/i9"Y2^o4no:XtET7_\0R7Q[S&E9Ak2p,YS7>^Ii"Q7Mpl7eq\i,aSd=WI#Z#['KDdLW>u`r<=!X +EK%:N#F8'[2tE`Ief[3ONn2Ihe)&hERCY91#PS_`.U$He=rCu_8DGuMf:LKrrPp/(YoXcEqk0k3qKA4& +*IFT6AAF,l+W>`(UK#TT2%qOVS)]j"W'Id-%1URin3)[lY.i3`KCcT[eeBKD^;o+gQT]CP%(aX(MLGjXcdq]r=@TWbJM!:f[Xq5B[s8lR6F.];or=oKW+LkK-hn9n[kQnnK-Hu=r7!a +%mG45mc>:mH]<@n"A)cNdg,:"ZA`ilhnn&_C+^nQUIo-&hP/]]PL9M$ZVVgQP9]MfFgW"QcXI$-N8PON +f=EiR2%?_R,,.2Nr%-.>id_*$pMbnZRhth@!%QZILJKD\XK'j#,[bWK(XBII^2Mf;"7$(>N@8;/Cu:;- +qe5+JMF;/-r>p-B +#Dqmbhn!X)I04E1,*OD#D_[,\M?rYo.P;;`j]&)[2eh:bmZr?eL_JM2q9,F!HleLLc%[R;"oYj&3UFH? +MJ'FTjJ=F2Iq_#S9379TldL98g$kbVW9IQ(NUFC7I@3 +eUn*>5M:7#oHmqhF:cF-"V7at./okO[`L50658U(LXX3n2\S:=b]M9>%m!O]Gj?RB@I4J;/SIeamB_'Z +BLju76u-5feF>\!>Ch\AcI`u)j(E3Z+OE1*4noDNOIZ0S(u=mI4JNC6Yk8%BqY"U^8'4Q"c/_Yd9%3bcr5.c]OTCJYhJo5th6Z8+Aa#ouJaA61Kp(Sb:($<3Fe?H&FhcZg%F2Ui#!D1\i?R"PA%rjPX7TS?1JErl;gDn +GZr4_M0j;ZLGh[64`**u1Zie$YK^]b]!kK031q#+L[3e%l+(YHjlMJhgkX;r`mkUu$P>C6cuW\YA7K2Y +BC3oNlce1UZIZSN7$g,i6OLIC0E*+b%;JG(Xc0$dTCC'F*R.!,T9)NecKMlcE2KPY9:# +T-Ifsep-%]hM'"/T'aBo<#=uL.Yc$fG$Z8]*7ncr)Wh@LprI&4s%$VV7Ds8eK?^,IH""`W\GnK6XI414Jk_4:ECsD4-:2=pB0clb- +4fkANpDm-EWCE,/"qgUsK,6PH_%1GN`1hLM56C0)g]t\0V2\s&Y'ic!<_1mKV0^8A=Z@M2As]g3LM(WF +9\DU@j\Pco3,_ZDR][PkD48c.DV93Wf1n+3QIfW.^U8P;UD><+bgsCL$FJI!D]kgP/DjpJl8LFDSE]eR +Fe-rBOA>%&3Ba^@1G"MW+$C&cE;XfGb/c>+CQ?kd+e>tFV`7.A1*;SN=bB)qd%nF9Eob'-Xe!,VBX_KR +P2"15\[_.ieCZ_Or1_``am&Ff)m2]g[sR[+DJe`hq;^kDLRa*S&aAX^7i8hn/u)+(%@m8\!dh;lf@7nZ3OJ%L2kn!V"[U< +4D8a/;:=o!$.3.;m,;q8dli%sQZl#i#Kp2Oehtc,-dQl(h!$o2PQ!W;@mom7`d"DR:beG.MJB#HdQ-Nq +r%&+'/Zc!OOIFY_rT52B<2N),]c7l8g!H=nQY2J_P[69']'Eop/mI%^[+D+?%JL^k9[,ttoWfY9Y+V+o +lE5su#-J_!mnCWo>bL@Ue*TW3_F5ic4=q>;O'X^qNd2CPk2_ZV8!O4??G>p(QNMe2(P5u-nGOWrAY=GC +1?bs&?8ap#lX`Gq\R%2*[!MAMiE]_B)dR&h?DG\[7k]KIos@KG<@rbo-1!b[.o-`KZ6=]j!Y'9EKW[(8 +a3i(DT<=OJ[k#'s`bMn'3^@S,:i.04VDqlXd//BO5Y*3dM[.aeuPa +B2?2L3mFFdNDb)N0&1*ios,b:/0u5`H`<@JM8T",:fr%sYWRc%IDNghX&I,7d`ZR?5j%,oc]NV5L>A;I +7[`:Yg5,G^kKfP8V&djR1\^AAgV+Yl3BDX.hW_CBQSKni/4uOqn(4eh!b7p(^GI"S)tMVA#bS_SWn9cD +6X%[W^@K`=P8`;Re>#K`.+_N`8A<*Zd^h>o>5j-8CV2?m*W.gPUkL7IoCCG>rKO3aBZBdlqNs.T8NQu7 +gJH_B6OufTpu@=Qo&Yjj'kkS"M7,Hl*ab[NpF!8s]nm2sjl9&k>`/Cs%Ai4D1ueW4T.(SEl6BX\3$^WX +L0?XP7`1*$fhT`8[FEu"l(2+#^Q7SS^AWnLYAolj]M&,q&PUfcJMEV^e,KYbd,fsuY8`X+TE7\H+=:m6 +;jOEOTIdEp5%rCL69_m(It!rcBW'[Y(N%=YP::,L?HTR +o9Dq]1/6C=;U3F&lC0cF@=?=A%PY9\Ypg..j>Nj._-DtfDj7^,%VDWTD\W-!Gp7P*,<3'Mfbe?Ga*n5] +$s!4^FU":W:i?9JFp?[cTA*^l2G&5fs+u/"]uGg>)pp:1ghcNqd#(Y!OZkcmmIJ@::>qD+MJU]g(J$_M +a6o.\9Ml(fS7D<8"bofjdbQLIS=tE-jFG,qLDbb@cHltq!W0%haiu`\&"eCCjcc0-D0!7Klm89o+[$&o +\MkNpffhuuC9RD\j(CHu5'Wg=@F(%JMQh:5lO5c*W]\*fSB`03)N^_OG*r=-OUAe4=/?D"WqBlZl@'i( +OBl"Be+V2UL%CefPJZ!ShI6K>VuD,GXqg\qs-;%)7jq_mP4E].c3$?2jQlLgl=>:uTg>>#80 +*^hI>(uFHN-1^Ze\bYlg4Bn3gU_0"):,-)LL\ko3>M_PkVG&:T3eX%K.[_#>RdG1)&q/eV-0fh-=2oa3 +FZ[odIaZ/=,JJjDOWS&FiYKeY3JfP75'&bE(QqD9TqpV)Ipmt6>bp6sh*'c/-cR=_P;r_J_nB^fBq/%# +[q&113+Y!hO,Rt^AC-cPo1AA`eoR$Z@eSAcXnEWpUYl\laS5HUotjY5a$b1_kf`]1-1sgse"A!H +R-@i6TJ>MQ:)0]Vdp_ROntBIralD!D^XO-Q-aUX6IR=/PAg_N7"R>li*_(>!QeCdOHPG*(cCh'f1tX4= +=j:!dV`N5d3[13Gn0Tc^5CIHn6621#Z'VX/Billhje6rn+KVWLaIEL"SUfBMVr/1Xba[JFF,r`XmX?n_ +mQBCk8[;gc4i@5'(km(57OSX'`]lS,&$m4H1Q@eQ2a?L]_jW5lQ&Ul^B"dFlao>P(jh=-aPVO=j*LFg# +0UkKLM?B/W.#L5IZdZlVS,6?YV+?%(*FncfQ.pB@2Li:67IQZ#91O;(`RhX>AtmPiSRSk'.oqAuo[m`- +?9@%qO_Lio3a_TTI38(WRc?X0mEYN0k-':7O8nps4rLW/ZO#V0h5IXatlG5B3s1nmKWmBn*sCXJ>e+glQEspH:FPT,?Ver\8kk +m@&"$pBnt4Dr>4PL0.OkhE6/B@osUpp4$`K_:R-P0!TF4r>pC6.L5Xn2 +Iln%09:Y`=;X)ka5)R`I@ZGCaNjmCp\L=5+^O^/*IYMU9(]9mc1u>j#^6J$!MlBT0bY.`7_qoULWe +6?9W]jtZ$#.?jMCNsU-+q*N/>]VFBI5d2_k&)cCdQP5HPFfCp;2q8(&[sUD6&uhie_q +bjVn#22%odqB>D0) +mi+>U@(+i@ .OjrR84[&Dct/S"4iB18c@@UST>m; +8&JnjA2!kYi5EmR?9XmrpZZuOV#UDHr9$*HG8"bP^[A$.ihE3[>,3+h61Ru7%^!@*7K3Ui\)P9Ra:C["S,D*91FR`so%!-o>M*\<^QX_Ho37]-"EjEj7LgJC +p^S/]2Uj[*p9eB6#(QH9$\h8oA:9g=74TA+(E,],CPNFIJMUI;Xb^/3de7mJ-T60>S`#m7^)KVsZ=W]G +gNSII.b'=?4ZDAn^\ILM-6IlHpB]V5D7UC4:SD\/@l3)@s%g;lQZh/G5QjLP!c'4OOE`B64=/2'GL=tu +M6ar%OQ,=XA5.8[[huD.AVQ8>:'o#_[h8CYh8,VAc7co_7^Pq3qVhmpB\g+j423$se2W3-?*l'NEI9^f +,g#-L,YK$<8Af9aX^ek3lSSU,\t_*pVhaZ^pLO93-]E;Soe@-hjlVA?24;d)X%m/uBc+oggYE+VKepa>Aqo&<1"d%(Pe,s7;#LZV8n +$QHtpAcX.)cldp9c*5;(g+%gaXltPDI,r\Ti"iM`!3Ho;42%KBJ +'O1^-@G'rZ)o^`<"/Ibag7&[irYFZg\.T4X$EEJ#e9Umnrgllr/3ZW]T+bndSt8;tTqRArOWiq/KZJ!- +R&d"iBR$)1%7Am$'sJSi:BLJ,'$#'kGT^S1[r&3meS:0Nk4"W\De7)J(g71dd^e15i\Et*d72*YYd]U`QZCc]l_RVA[R(3CD#rCEbYlW"YCPfuG^ +/1u'kk=+4XN9iWE5>@pWeEY"gH(+4b]Oi#m,<.JTf,hr>GrjJ4pZ_CgA?3(bjtBGha'LJJc%qpTFUmRe +b;uKs*mDOrYNG9HklaWMg=s0e,2gbm[,WGIQm6Z_7de!nO=6+'PdG/3=@*c\C3`CNYj*CN.ck$Y\4R2W +$!8VW,os%%0P#dJALXEj5m[si\qWf.Jp_KF6gf#@Sn@XAK^c?(r7kcA.am4!`@dA;WZpjEIV+9.[e8K< +AM3n(ZLrM6B!),YB'VUJe?BZ:SK7g!EJE1foG-ufej`6)?g@8*c]rDReI2jtNT$R@Jb-Bu%\r"!\(Vm2 +bn]Tu"a'W9$to8k5%"jeBAVj+\9a/kl!6m>m*CscAeg:aFgl,pom*aj=iW1tCtcT.\?^082O`2VQ%8ju +FKo"?]6Oh<9"*)fO;D:[f'KUHH8(s8b>IK+ql1<5lp?\OZ(2fRbtHO^?]FFN#hGr!$X%U9Yl +/C[Of#UeEhlWCf4p[i^@UoA6AfLTRkg&"h^KgYS^.+`)bpM@A,f;-*eR6,(6=2VG=d]U#P0E70hB^NkKrU; +D;9]+j-Q%`fiR#FnQi'S$==2ibeDa&c-N=7qqA.#.f"n9FNDAFP6Rg$T@>Xl=_JoVkg"C+DhTk+)n8NV +Z+$fkPkZD^mmZr?aLo^pq?C]::6$i.*`BF$RBO>)9D,kS9]W@*90)RQ*Z\C'/aPCE>O>O0=9THaEa,WeDHh0[EA*3>B-dV`RiaDD`&$"X6*N(<4Hhb1&9S+\:\J63MmO(:WfARp!0f$=q-Nk +a)#KO.s8&UQW@/D@p3kHp+Bnrb7D*^C-&o4ZW_^1("]>+2rcoI.WVUMVV\m!B6?^b=E,qR&>a8Km[:Jr +B,+*\=E0AVMA$IMY0h#./$:HnH"b1%%+hcD=T6LG32ZJ^'uq$GA&U&c)ekZ/ZR +ijbQ!A>WkU=f%[i[DGEZ.uj]p#qjuZT`ftjf#Q@7@nVI?CMMJJVdG4ALS:FPq;OBZ]0 +-U(V0+g^1l>!5n+$aI2VB3P^0(I_S4.'((_3o[0>?Gl^q"\OOMaq?t +q']pq20mLDGu)Oj`S"L?=E-fcE`mDLBYR,f:1:'.7LAH_S4UnO>-#[^b_gIekZ/[=hmaEA'L9.eS3Ped +A(^KWEQ6-]X>mMr>B0RkmoXR(B5:[j[c9^6^#^=]@\4\ZDX[mTH?1"Iobiqmi`T/HKl+3@HDcE^nOc06 +Eko%UO.B&ee%L5O8ecYRr?`^OM#e?GRe)Hr'A/3gK.ao/U=)>3(e(?8-W +K.-=6XG7W;J52d4bp9Y_tGU +V]74te$nD?Z6ZBjqP:m^Xm\Gf.?^1sU@/-k[/4nD*N_J5EkqFckI7lXR%6AV*ipun_:h5HhpL'^iLLsm +7p2HQLiXSnABOZh!C>cb`^`A3\B/[9AP<V*e`GaQ0!2C0'mfR]@7/b$i*l[0lDQ\4`SnZ4P?.i6Cmi-Bj] +[t#\>b:&L.o9Z/eQ0(hNhR7I0$uMR3''S?g[>:*2n)G\13(CTVmMm\i% +aBYf0'\.EnRMj2Piba>r(X'f_[j02kjC1,>0Gb+=)1DXl^9hI>Me*UieE!A*h76Y-V2P3\r/s53^eQO- +^N-TprEP?#^?NQH?Maq-NDYsf"h@a&4XH91^4r@d0OqTTOX_.TX!Rd36gMk5!ll*IU.dYNc"!udqa\8G +'^U0eZ*;Ou(X#W&s3l0JjOZhF(n;GR=AE;N`S15b+li]MR(6TeCLE/*lJj==? +c0@b`GdHRTd`RrJk@7*k'"qA,k73_r0ch#WksNHL\jH`Y-tgJ +d#E*7Y0ut4$ZiJBBD56Jnc[te@""MWkc(u>o?2IA+'DtH8bCTo]37JZ+DO:&n4(\#at[pA)`'T7l[*p4 +Go$-ug8X7\<`Xsmf!D8TO(5?a?J0_ZO8fAj+?XH>f.R]lJ,bT0p1kq$T%Gf/_XCj1k`[!9#G-t+s!RO> +s5Xt%s8:OKjZOSgMUmm7rB%6KEG"$,A3p-EX4Lf)>Q9Pn_B(p8q%FutG4kllOU^j*\uF^cbjg/^(dG#t +21.mB._^K0%K,^cNM(Et`nP6<79B8Z)GfRuYkpuM7d4D?FLS[;;kCf<07&h^k,)o>%Ir-8%FG__Jh"@g +K.k\`'SuP'#`D8_NM"a:7s<,!\'laY1?XC`59!L3BZs!'/C]YsGY_p_kf1/;D>_sUM6;`"4F%mSHM8uK +Bd:&IG5OJFAs8D?hDi-m>/$b>NKS#c-_RF)]@Ua;>Yk;2"M(*c841'*^6TTJ]URMt;+iEO6a$0O:@^Zs +!A:4A&i-,3K#eb@k^E%5/).q2[o&uYb-o0XPtCNAR_=!N-FHl4Ze?p'CQ-28@GWq(r!d(`b/,%0OAg/s +0SFE[p+8JNc2,suQH!\H$uPP@Wo2m@/u4r5=0$#[>5DMe?;/bFQ7+c7Wk!:M$4$GnE9sp7j/\G(XrN\h +h%st?$_ci;/5!!iF#j`Mhn\6c9"JC`:"C'1:0O[Tgu1AM]GR:EFs4/R:p5"$,$in`Xdr7>-'!ks'@.9( +#Bu)t$]T(9P<>=*@<"B[C8t%9m=b_&FcDrd]l]o)1gji3'jg4E5oTPhV#.c)5K +45eZc"'62pI::l+r:[hoH5T(Qgt+Eu,TX0Nqp)SrReu)t+mhjl4dp/*iut#,1&(JU#/oR/[VXh(2@3%Y)d(b:"_=?h`.e:7J-V:@1HNZjg,0+4bVY19#O**#:ng]4rZdZeDmB!=4Pbo967%cF5!1CUhe2iF$C$0'N:4t'i8Q_1e8Zs\h7M[oNMjj/$74Y@gE&ii[78)X#M6D//o8W-Y7HJEO +'nZu?kASW\0!N01;]B53W'sEKRrY/?]\AYQBs_bV3Z9VVL^UA948`"GK'sfZaKqDmZY$+sNoW[dj_$Z. +GVCf":uRsl[eIE*=Fg`o]YqV41EAimBoWs9+0%rX]B0N'hMl0TU]VFBdNtR)]AN*PA2@6;d>D:/U,p`S +*._ho'muM!W4MNS#/o>(n3pl'Rs..Al+?IX'1:]9j`aBqa/NrtJU01a)Lsi.L3Ro.Bj?"09F!)A)7&'t +G[_fl_B!o66$_dh9GtK1#Vd5?4r6YcnD'&9X%YRZ_U)[3.)s'5Tq6mFh-F#:&b"%\S.#/HnkTL'_cs>l +B*8"i^6ciD!SA31=OJt;,7@ITk\]n*@;";]YX;ZuYQC;&]0W8em[1sTiK-N;W"o!M>`Ho'r_0IOI+!]F +rjXkt.nl6SdW5XD`W6Oq>ORMt"A:eX%#0!tQ`@e(GD4FJC9#p"(f/!R14u!r`bAJ/ +]HBg]BO:F-)NPYRg&f.)@R@oW_Nd1m=*kfg*/!MJmWKE<$Oq%J*Sa(X*(qQkU[?YM&q\7LmtUS=^3:On68!E+E;u6K`;gJ=np:AQCC+\D3P+U:'"ajsU[Acu>.f9F^KeG)Xht?Y4<)\!$H/D@X89h1Kc>E.H*\H, +jGp6=r`2*9BnYhGH`^0iG'o*(kk##;bZf/\"hNcqM\4rMl^'9(2R$]^D#TJ +o:J8pfBJUsi_;iVfOQDRWaS)TpVgAADi/'#HZr3>1AHqUSj6DUI+(!opR(n9q +AMtM!YrJaE]cFbhf#G>4!cahR>ghG3k]8RBP=K-1@63N[:67Q.[h(1[EVeBkC:/3!PGIW.KtJpN[ZGAY +ENUqk)R`,Bngr16HUEu:G?s'MAt^aqXnZ*J.68maFb:H*7[.QC]W"QpN;%R>no5jGPWQ6>)&e85j!Z2M +bbN#8)^3LLSlXkWfm;c,`GIc5)TMuk17]&T5O*?9bI+@fkDl$'H&e_ja\\>cf@8FG),k4OSMKKNHf&3Y +nag>PQqWRMArk7J#=%3bFSQ=\UsdQ9C.VSSY2uOW\3>#DR#i`FUUBM_@L]1;9*UM6Rkb=pc>oQMbhHs# +O+BBLXsLuD1^=!Dr_?X9]f7AlEe3;'GdriN-`(@="o=r$@fr\/fU/u8S%&62a1.Hih5H16]DTOkobFT5 +XU1T%bl+fY]OI:U&(Oel@mtW4(0-99U@(71?-i7Qm?&fUkXFL&?G(!V48M#0M:S-@0,ID59mk3%>MqdX +3QKL,pREN:j]gnd#JKcf>SK1?1s9H;d:]Y(8u@)f:o`#b,MKklH*]NUIFpTnm4_HS9YXH1a_Kg[bqedr +\_$@E/)*BO1[:1POj4ooU$8Gg*I>n1X&;;u/I+/)mWWdjc<'I[2m%]RI'J+AV!qb-g$cT1$VB7&-*Ro0/o"IGG:k:3G@GUq8MA]AIuC?>Bdgf>rM9 +MYL5m#AA`makFGp41K>eT53W;:;27LSh9%.*TCZR0!3lNr'Csq=Zc<:.BZm&8uh1*J?jje)n +mnRembD>Fa!NHS1F,cYm)g?nfI#TLX$`2+B=.r1)$2HcI4I**7b?ipn!`m&T:Uir"+$=ceCSom)gi82E +;"hM('D98gB,'%nmTe?bj&#iGKd1K@`[P&Km,T<.DH_d!O^QmVMg)[sj[a0n:TNPdEZX&BlTJuCi]Vo_ +U]!Triig^]cHeO+o>\=qUF.a*S6_;W7/T'j1b?i,7^SCfN(^5[J +N;0IA8]6);]pl<7[R[T5al2s1:-KbY.<\=a@:G+B2go/!EAqT_`L@?QS@KLbnM<-LR?A#@gXGOWY"G=N +`mH8AZ[#&MOro](\%$%k%Q2am&@ks)YTY%<(MsYk6i/(*9Rh)\bY5\*;q>IP]0Bk2QJqR;]$0O5mY"!q +ZLcT"?,d];5:ZJtrROToTmK1tcsG:S\u\ftil8H&O/!H<"nu[g5%e+4`klj=N&(!`@'\$So4Tg4;^`-j +[)n]dRi`O.RP%/jlrM063l^7GnpE4VkG)tf$[j>uNB1*EOlN$j)%E4s(N39K-cAc<6QQTE$?=+]oIaVq +h0!&Oh35mg0e0$&hl8R'Bi;;Rb'O#lG['a+b"h-%ddA"cEs0d5PFm4VRhS&Z$rkDELD5&nEC&9Gj$F>j +$X@uSWatU8kIH:lKCMuQElNq)nNr0nl.ka6_%h#G;oZ:8#7C")?V[H+,9"*ZL5EWa_A;gXPq1n0m,#22 +LN)1q;1A`a3r83RVSg,%d,.1 +Xo+K"Ki3n;(>!kY/ok(SXdQVV7MJB5P24R>jAPo=1>\WbUriP:PaO]ZSrS32e%*5IO+9e^snijkeH +hE(R.ZcgCY^:^<4p+e@kR!X(KAu/k+)KSrG5f7MSFT2hhBq.845;PEaES"bsiD5t7DKLBfCsL#C,B:DM +5LF5-QLH9-,3eVW:$,u?5B/U,OOhp,HK^1EDm:MYl^sG*lV:4-4@d3Gs81`m8FU55 +#@@ZGf"*t`XT_$JhX!@*VI`3"eA>6HZ)WNHJtf[%/#Zfu7ZHE<_`a`-*UZ.s&NTD!LLY_8lb?skO?Y\` +L3b@e&0I$^mM`;+gjM*;RbVhdT]Ri+N@ +CpMA,1X3:)K+5'ja(ucAY2O2nY-=ND@WbBkIpQkR^TF;+\#D +;,CR:k<+$$SGK.+?,(2nJPY0'om3ZT`:b/KChs>30@,.ejfSV$T"V5@8VuNLrs+2W5 +7u[F3nA'IJH=-[[`d#7JN8J6:P?fL.4:uS!ho+ouE""nnftDW;D+)s`p_E%G'Aeb]++PitrCE@>c&\an +2d,%Nm'gUQG+IRAS)_q\o"^XP4V'/X'Y2t^I=tY$cH!-&gMu"g;!ADk.eml2><,bq4oplD]sDk@XcKUB +j)n]Mk*%O>7t^kBTP*-`flK'drW8\,]EnX.If4.N'%^Vin8S_cQg`c3<5 +EZFF-1s.:C*I&42NdT4'N0;P0KYC)T@d@'1.hAYUC1m2_i([NGCY!=Q5"N/EhY>V.rX[NA]C1!Pc9]Bk +?Hq`]*If.>9@N-78)chG'QRE$\dZ`>5tYeqY7Ju'd%O+>DEJ56!['\Il+OL:n_AmlljN+5pGG3M3t2E? +6fn*n?FU(e\9\jklW2ojr&k4.2NF.[B5XI1#^rVBbLYYCBcXc!>"G;)>>$=Q8Vu9FQ(4>pb#46Z47Olr +YB)dLG=gXM@;W6Og)4+AiS$4tge!m8A]Su],[uG2J1.P8R0@W,%seY:MrDnP[Hq1>Htm$=k*1/#Eqd%: +b31k13Mlm?h>#/>ma;r(MAs(,ZU77LAkF3/`3-Wtoqf#>f/gc3YA_!Kk1$F0hJ!/G2d5"E2PWkrh"\81 +e5jYkQ6\iNJCZ@OO_se,qnmIh*^'*:[SE0;[aXM^R3TFPH;=dtDq@@9890B1X)^\.OTHeR/4:uQ\JE=7 +j_VRrPHm4\^92U+Zu0/fH[qKTfF(LCVa+8RCZN4to-<[mXd"6&kf!jN\t&,_gH7St>mpDj9-$aK3:okd +?g#-MRHj_5Xnd[ha48e0<$b=^;7pVnp"\YWp"]KX*!/&>:j/so^.fi*0"$:JBAX^d^$g9p^Y\\:Rub\E +XWDi/34l^a,Q"A6DXFe:ec.#Rr5/-DOFflBT0

AKCYWHhiCFmOhE19kGc8Mn,a +Cd5S?]-`q6bn9gGgJ2S&q\CAZ]@*p#\2B4G:hJY.6_I,kS_RHh8F*YI)BeXnRp%0ONSBb9Xt=8ELq0C( +&QM>ilb$Dj\)p'VinVq]FslNPop2>dSB]ViMrm(I\%!KO7/aPC)f0i0.>ciW%-5ij3:i&]i"t/_nGRt] +H'[2(VFOq5,PV^aGN0;(c+B5_A6"WUhLksKap8s>dY@.,JIT&i'6WXMfq!$l6AES3%tnO_)0#7Z1N"I5copuI:Q[_HrslI:LY`=0;o0i#7TI/FZN +g4:Tt.R)HRqR<+#5FXAWD6==!8&KMV0gD$*70h3?9&%`0ppmIM+DKba0lQq_"]9XGn=-/Zjl,1 +#gj(@%m10U',^j)_1RB2d(k@gqqBl:'=f"=ZiuJtb!M,?T*&TDFj>th9/gd$T2n1f +*EIQkijZ#d^'FNZm0pUS@'?jCb=6Ht0LiQ3H<(U1aB]A:>1i6(`)nt@J>uU[?Wk_^B;(0.7_qYhHj:^h +Hk;?:eg/Bno&Z%C,6omt*;J9R-u8b&9BRYmkXr3&aHK8^c?tQY]];/7nd^J(VsiFjgqd^E&M>MN3Q`"# +Jdu9.$Mg0sA,#-0,$I7,c/LY5K*UpUX*?3.D'JAQV<>]":9`hldJdBs9?H&"'6gnU/^QTbD=:+Mmb@\? +Q+27\>:WL6$.eaMDQb@2@qMQKS"QBd'j'>c2QNHXddXtc/_;Xa6!V`ijVMk&qB\l_WV^pqpZ79Sq7TB[oA;-CS"!]=d@[?RmmZ/[_mhmc"A>&10T\pjFgtN^/d@TFbs2#?eAnM9[&(V5--"o9Mf; +/>#fU-U>Zn_n0$.'_:)GU)s.*8lH@b]nX3_GgB!"LN4(ZnU-Xlp&I2ncYSmloW9b'lA'H!_M>0eQPJ\?lr"O<-"g'V +kD>]c2d\)e!a.WY?%\>spj7_e,54m9X*+[]nU'/4-]+k%XnV^#"Ccmp$^*<8G)+Al>-5qgJ_%-T^EJW@ +Y!KG_hHGrXMOd[ULDEH4=C0]oQ"RHtXk$r/;SSb +eiUk&-0r$=^3./4*UieDc5#uRcUleachj6nEdHj1N4G+8-hRp3p^a*pF2!t-)]0VA4_aHAAOS_m6 +Gk:]-6aD(Q9:hDn%kh8^R)2bP]DH,a?)i6W=-B2_lBg3IjCu*iaE]9j"35+H9+Qi,VkPNeOgqGs +X_p@`)(U'00fd6cZcFAs9>s,CVrA;I-I",F[^>HiEMrW\-;-B.?>[^Fk+ZE&a>G`X,clGTl']n>Q+?>Q +Xm&]iXaL>e+QHUG\F2Z"e&cBN0iL]?WEghYV`E!7j\mHo4&FC4hN"rYq._L-0"cIm&`#<=.=)N8ZH/11 +*OHKsIj_5H8V^4:Q;Psll/AJAP,Ia6k?Gtj'!Ut,E+*JH^m$6I;LPA\a[Xg-)LZH@7>njK?[Jlq(++`n +Zs-m-Sl\O@O9q2DKAnoulR:Fh,79h2T!FE)XQ37#_toBsni\&CoFlfNUU&IWoCkYhTC6.7?DPEGj:jGE +h@jN?NC'Nfm^S?tQi*%8>lH9C&@/Cj69hJ(7f@c3s26=/q82V5$8'42QfP`u?Q;H1QRuESS[csMXR[VVn2]ruO0ibn#Ei0oZq4`TpYj,k?EH_"2\3G80 +F*5a5*YiIjIa0!l,*!m(),n0nlFpIo[?/n]cfa!Gh9O]FEC,k_kWOT;j]WZhIHQ3Cee+NXDFgd7;CR]F']G7N@n0r+(k<%Nn_`bD]h +L;=q3:.^MG/D#qb^ZfA57Dd\U8H?8Gal_!k]1ef:aR)>*GT^[eil4M +iY8J3FaEu2jYp^]FnqT_H#@-#!h8OIdYg($>moM?@cF8%OU'W^*QR6U6-V,SA+0>:$P6L +HYme`Fh=72Ej]\Bk8@-TbLm'YonQF4)>UV'*!X3NAV9H&j2A8S^pM%E\X4trUl,2PZZamcm +fOW?R8NX`r:r??K<:!\eqh+[eY4IiA(X]p@X4s2I+*9Kcoe!9fr>B`l-Z)f\@,HhbS<"PjWDVMo;";F?bn:8T$$j +M3F`6S5+AHZ>%!8:ASi&'AN-m7JhnMb-RuXL>PeeQWLE)4GI^OY;A"EHI;"A_Q!lQI6G&tpR3:RZDeO8 +eT_gcCQ`c0+#:k1'-D^5MmHIan9D&3',b;nkh'5mif_5]2V+Fhcs6]$XrJ;0C>[`2piYIh8ac/`gkrJh +m7S&mP,>GCO&03;UW=MB;u6m4[SPfLPg4\Lid0JbmY*4V_u2Q@ma+O7W0KOJj;7H^1U_\"]t8-9^0RWQ +m/PpJ92G$"?-Kc9kttPO]h,]S_XC4Q"Wf4g:&5*X2lO>hPoW8?/jE[1Ao!lOjuW8:'J +F2Uup8DUs9n0iI#hf9fPYAVZC[SjP!$hl->MR.Ynr;eM*S,=sFaef`GY?dJAaFu-0bmJAjmlGrhFlnMg +(73SiKkc2ERbN@@L_H7]WLJdT8LL3Oo3.u]cpMhYHs,9?kUs-Kq@_c:(J']60Ka5>R5U+tRm#W^.2Od9 +1E)D8TRA;9H,cmEUZfM71:3;>7e2a`kAHV^UCTdi+d',J;N-1=iO&0Xn2U*DG923Gj:hC&2uRb'nX[;L +r/bV?FN-ldnJ1M'5H"-'.Zq?DW7'R:49&%tml)uaj1j]3\J(uT,H]IrinJe`5EDr:=%1,O,3SaAVAFm_ +lu@*p@I.+fY.i7jjQGKKWdh/b]D$H,f'2`"8_M5\[4Jo'24H3I>VC!*jS(m.n%X*/=le)mrl9&"j;iRW +^%_P`s'+R]s79at=8Di2U2!B_q`FNLr\]gkpEs!js'dS)5I'eVXaaK'_925-r]dXMpFgU(NPAl_PJ,"T +ZX!qPO*i_#V0HV/>&^r#e)!om+-D>n(//=Oko3741UGZLX\k3*[J6$4)$tped2O6RJ'p_FbOZcr*on0W +7,9gEiC'B$a?R/J1S9%?_lJ'k\tQf#PC6:77\76NWXQn-f$:fj6X't47K0sYbmaVbpY"mg1Ucl4I/oiGSTS>pH9!5RMPa,4%fN,`d +g<#Sa1AVHfr=Sl)CSP'-[#4"epKsCPmeQj:#Ou9h-<2/b09Gc'Du=?-r]d@-GMhq*IJ*b>jS+QBj!4-n +%?(*1l!f!rq>R$[55G24>PGdXUI:+NJ"qYbk9[_3F]r5#.,WoYSL<=Pn>tf`W,AJ[Im\LPI"0%VT?KsG +-%"4<4_\cZpW%$uPOEF"g<9*d%CO:O\(U+io)1;TdqTlM4PrBeU3qHc>2,Y;Db-,F*IKj=S[#^AmX8R`*4%4=OmhbFB>2-S')DO""LGn+o7b^5Sp-.$ADXR_d#CC\jSOQb +/Qrr!+Q`KQ:AX+MM.:;o>j^0VSJ#VT(n?I^3T,gc)#=0(0Te=,gHt`8_8DIAMn5UEn,K6mABr2Sg6(iB +\8f994&KHUdU6osc4p*RCSQiBo)0",k3tSG>^Q':b4jdBOcI53>kY!!EPHb4^Yqr4A9ZBI>ZIYKs.'M; +X*fE7BX_X]1m8**Erdf>*D9?+!jSKlG=2)H./02#VHZGn; +pm7'V*h6V_``IhJ,hFU]e'^">CG4?W3Z=0$]7^?SDe_#gq]!iFZnCY)5Z<*3ep4346Yk_<)HXW9>C`Qa +3V*-.@l0pOJ_"eBA::B%c#i1S;oZPhSXeC]Ve?sre>_\q>Q+]o6c$THb(N5'=GF7q\pU:[-l:% +"fUdOmr,^+^;$@%4l7?'RO@!BB7tIqlPOdSOSRZ!q>Q-6p$F4uOZ_OY7bAr\hiKDU\MVoE:TLFKI",K2 +chBA'MebLD.J!F]lHJNo^;&VJq>Q+PnU,gR[2tgcE/AslT]A#mKd9rWQ1#gmU3uu"5OpA7##?D6n%\X, +@7*'G?WT`hr5\nC*LC+^hg_mbWUg!($TWmdb]&Jfs2@e&(!B`2ZPrZ=Ml*WIJejWIo)140?0R^l?Uqe- +jnn)K=2)G_2+PBqTcX%/MZjS8hqrC2I".W2ML>Fm'-QlE(Ma^6hqoiN_CK#-?MXSYpKp=(ThIbd^S0IZ +^Af+:]R\)ji]Wb$>8Ye4"J"5^jWM_?2q5.rq]"g%^;&Ve4Q#&C>+Y2tGVIm[ol8U8KV +S,g(T,!KXa8%q4#3Qe&`5Xk3ME8ne^-Ap+elB.RL.&%nLB6Z.SA2`qQoO3-m:o4@`>fgrApme%XkhQAV +mZ`_cc'*#.DlFp]R5Z&ZM$$EaHp1S_a]%!E*7C#9';O'KuA$Sg`kA$:f0W`!r7(rqW9'Fr&KOGMhrdg4#Dl==4$u]fWT@'*u\B@9C +bDV^$.c5_1fdlXl%<%9LAE_OpD2!BWF_n-sk8/@%.>7AZDZJ*pG4Yr6A1a\o8mD,jL*kLp\\Cqt2OV[H/?IT,qe]Q6@pCq_)!*ML9p#@6-shqr%X))DD.:<_;\rNTOh(5ZfuBjpuM$XX)NAbp,#n+YbXmOk]3pJ$e=+8ZKBre:V5:pcE) +AM!EN5uW3d1Oud:Uq?KcFQA$u\3&<>jE11n5o4ifS*P%Sq]"DHZ$Ce6\ks8NGPQr`lfeXIO\KMf-nhjK +.os1SORI*I/-!BBa_)t>R``hJpGD"3-aXZO#f&OP\,shIO821Z9BVYdhatO?YI@[?4ljb"52LA,pP3ZM +o)7NmB-c9BHki0?4l7>fqT/Ci1taq16-Ar:E+_R-hcF^0V-NiqL:aOa5qdXNCNH]>QWCPMFCs#MVi]13 +l-.b;mGEu="Cgm\)9<)I"0Kso)6COOm`feMel@4f06=DEVUkI +52PO/0Ko"00qdh-reC!/mr-UL`H=+B[^*+6@,.`@9:N$Lei^V!R8s?IOpb,34/R[2I#Ih"Li-e]^$Ihk +F#or*\Za/9Ga@Oi,>&gKrnqbXs%MjdW`)Ug3)QZSBTTt%n"^+mghFuh"o;R +mV6Uo$#9&h?BO[eaeT>paZ/DVq``,amgg9`HYji2W-nUQ;d1=PM)%VM7Ci]L;Te_=k"`1FetUcPq>M6" +](]<>'nf0dGP?3$;G$R?4XdBiW-j(kR$nQOfXNiiGtHF^Xcea14KA!X4]0B?mf>Z=$T^a:V&)X!h]rSu +R\!c%pasO$C[QAlYuZ:Ij,Y0&^^Da&i`0-(aS?]TRpXR9$Fa@--Uq%a: +`2%C6+Q"8_'&q\Cg%s?p:]$#S2>jo&\U$3D*Z8bIeSWLG-t;Kc1H3!/+]12c4E&Isj%WEe/`OFWZeM0r +7%BA7re?0/;T>/gcaC*_C`\df4)n'"/&KAMe8o1+Qu"iTd9pG0p\-Cg^AjZE)%!5o8Ll"d_QZ'0/S-XL +%;$P0^/X@Y=nFdW8jHq.,=WA'AB_"\f0=LqMR*>Y4K4m!J&KdpCB2:fLAqn6 +R-Qg8`8op[*];o4%$c.YCG?KnHk9R);%k8Ya^^j-qNc2[gOkeVm5@IlZN[3anm?S.]C6YuUqU.iAphOQ +O<,(q1mAu-`k:/,LhC=qm&T(!J1u@W3.YWqVI`+qMbFjKZ)cX[YK7];/\EQYDhd.X!'2*Oc +W.i5Z1el['N)&d0mjuK-<&*I-Ih#7"FKaXI&)oiiNI64Cio8s[\.RU3)fiVRM:?aMDcaW6Xf,OKDEZp[ +;*Vug.'Ju9.Xt6*UjRrAYp!k[*EsE+>T?\LaqnD&Tp-'dc^jJ-BT2H&A'c+Jo^Rs&'+K'`+_#it:[J'K +_cdZ=LknLM)DTg9@oB[m/!AuFO-Mlo%Sk)tImGXF2t1?_lOa7!3H@@^Wg6>P2@ +Q:N'7f&Fj$-*>^$b(KC*,J&/R1rjuNFT)2/o5Jb_Q&)AUSN":GN7uk"4#$R3`;_F[E<#a=rQDe,\ONu- +e12)j3nq2F%;lcZK4c:D-gpdK+]bF^UdSRMHICU.C`c0J\FKIs4&DYEa\bH+@) +q.5to7V@0QVM`fJCXej!r%^pqW&)3C;Pe,f2sOLXIS6Off9tNKW<.8*[pr8W4#^1`AYha]e[$HMmM^q: +kGr`2^YGjCld+CZja-6ANG*gef6FbS[UV5OCU[cM>fT3eSl?"2<9gR;/II@?K&/HdLngtbOL+A`A(KJ] +r:WF![kkdILq;?/?Y$,'G367EWk4h6fAt3qAQ.,`X%&2_=3kI8Y#/5>l;6TuN#?muh#oQ!,OZCrf2\(t +GH[?KhfTdIno/Xk:-&2@h@ObUloQag??c:`Y?(.B+P(`rGe@5I41BiC]BS6r[kkc6;r)<<7?C-0q6UW;]^BsoQSeUU1j?,I]7oOl_ZeA(cbfpTSqd\qjl$FA[-']6.eZ[7mB$pu[goSjOCmN-2Tc^Yt&bbF.6EWp[=ack/@( +)>ML6hgj#seT\.?BN.PW4DcpY>YJHEc"h*ieaIL^YM\mflHrOH/*Y!I+Pf%iNG'qp;AefF@'s,!N=[U[nE +5,`4Fj>VNjB:/M2I@o3!^5em'-Od3F%\5bQs1guH._AKSYqg5F>KMBQne&:9,u^B7]X>M9EbVTKeWUnU +Q'Ekk;"!dmT$VQQ7rSb"DB"JW=7t[%TM%fHrA%\mHJe:fJ%=sO2]n6iB0GsIEV=L$7eY(HB/JMDs%i!( +[h"3-,ZW#N3kYpU;g0#/g&?c>557J5_OE@>'/AA&_ +`P4$[mT3[SjkO9^r8JSEaI=KCLC6/mPD9OY4V&>C*1gjPqUUjc$bWXnm?P+1d?TIp]KHf"3WFA)DK%r8 +RbX?99j[_;``od`&@P2>R)#i(=4hi"^,OB>XqZ#f2+H-PcDhZ!]%^AQ +UqH,=^2BNt$VZ$cH"grhYWR0^M!*^u +.hf+8"LfKa2g0fDE.K5E2\9c,3BI*)QoiTo*l&OE?9:W"=6Z_^!WFKEL#R'QkMZKkkM''WYc:H3Q[9c+ +W"^sPTZB;!I3UOBCQYf$Y>>78[!G_#NM1ZHf$o=B@bI(?'?C/faIr9\d>raaRA&s'%V +R!:COGibk)f#;A#P':,Y>paeb0Zp6R[A_#t+\-eZW)m7Eq4#6>%Q)sZ%Wp=EaYdflA!c"oEcUi1h77gg +;^]W4E5+E[>ph#OW/QA<7V/+c6JMC?j#<#HZVHOqPne(T<(iCf'Fu'L[PUs3E3[ZdiiP@2A +(*TlnI;jVB[X9=ee%h'Lc"m!2I3\!cQFn]N4K1nPB?!@VpU+R(6HSm9FU9uU&^h/2W42+,?+dT@SHJ2q +I@F(_264TXoR?D3gsDOj%HV`AF7W"ImKn%uMk3_JCWCRWC/FJR2Qs!e52:q+jO&cU;,crR9&"1T3f9[8 +?&l&=>`(kN1p?f_rR&8-Uru`h!a.Y/C_WC-lB[ral*\4e@/>\M_7JC)ID_W*>W]7Z[U[nE2T3Zl3O^@%mV,ShdAYrcq6,o/$bm5*>L2P_1>p:dn7EQX-\G'Z5]=6TPO!EtYjSsYi>?68-u*dHpBsK-)(>&pJXB)0UG)6!=a/VIZgP8qmQ2$Eb/4CKSY&).HD/L8 +L74m@1S<-bY$ZK,D=KKshQ"2)Li6S>HQI==j]bgb7X0GPN2h-:%ka*6-b48bZGb!TJub&qs>\lYfZM7,@H +Gb71TbGr/.NdCItgQ=&EnQXNidsII;lQ03T_f_S&o5K-U9=FeuIMU=jH/oigg+Br)Q*nYSm[A%X3U\[U +b^%I>`dE3/eaI)f1\g-r`a8JJM4]soiHhlPo5K8klR9rBepSt7P[<'S8r%7P]D,qD/@.UEOf(0d.,)Z/ +*fAfpjl(N5CO-\3I7>9\a0VN.[N\hR]BpTp[H>R_SE;YjI[]lh`OjP6-*BaN.09=c`"TSs.@s0DBCtUSY=$>R%g>o;(UgFA[^%<=XU?cFglGd +lM4Qp07BgR3H"6R.aHnR',5YK9O"1:aRDn#3?,)Z0i!"R7biEgLl(#V_MCe=KXF!q:0r/!n@7l4iFd*n +fh^Graes46d[7W/iHh"JAEHm)>B@J^f6-hQf&E4O]@Vh@MN)c)_Zc3'g:a]V;FO,jo+]0`-m_ZBOkHo1 +6rR*0q]P^7'l3KRgE+!!]%\le<$]72P,_'gIG9N#g(d!=b!-&qk7eMeYT6K_aR`RuqS]I:O&RhY(9!aN +=cWSj`b-GQ/<2eVW^9cV.bH&2:JQ"p2HWhNVJep(_r#=WTEb8-gYj'iV&On?i!K3 +r`kejI-^dUf80.$::PA'Ag:(!9Z:X1LZpi\M[M1dIe,4(mdRQN3-r)1"*WF$I[3Pn=2(cV-A0>+8V.ad +KWcf&\?As-2Xm&^^Pb>.c[Slqobp\Ssd +jLX45BAZlVhXi,5kN-:O9cW&;H^r8:jpZ-+F=M#aY7H\l\aO0k\*fgTMo;!\=7!pU@(I^`r&($`Tu3aS +-5jpoDi`B>lFHI5c?WV)HE0/Tdjo3lWq3ra:U*8OO3ac+Xmu/OQ9U;d?(T.%[g2_Mg[2tMmP3p_D/-`$ +qrZX_a;Ef1I/JgWcm?;!-*&-c+Kl06O)#_TH"adnf%aM!&csL"FgG!k.D5IOEGa]"VDOelTbSXcaY@6[(a"p[maVio,_sEJII?lAiSLQgFME +@!ogB4FZ5U38T8>/%b5?*W2Rhd8nm:cQqi(5V92 +'T!K9YG$1UX;`:S +epNIdW:I8W#cm0kM>$fr?B]Z?[plb7LiH;FH)oead8^o!oe@nmR_:BA4E>&_0-OCtHejf8?M$c@GGn#W +=4DCg(GA5Cn0_qb`]MM\)RN0c.5HGPUM`Yj#85#"00#,e/EKJ_"[-Cle&_qcZ +@*:]MUdK9C=c$Fi,,W*P4ofiUQi#HDnLT_M\6eYDmDo`i,rM8)tqJN_9^/hm+*@[YKamrP-l.>\n +qQg%KdVQB=ef8YpO,DA1F5YK+;/p)8+;ARt^;LKD9Ddg\S/?R^gGMBpfS/Ie\pbA%V2q\Y["Q0jGc4JMROMu#-''Y`kKOXmlS:Z0O-UB4Lb4OD$O/kTo`#BI4&a8ft&q8gBY:U&O(<*jOG?>FFIY&"kF1T's]'0\^o)eH6ZIW +iDj611RZt9(DEDk37lALM("DLjFcALeBS>;e:&43hL#aW?A6m[N-dO28Kq!n/ag?-\5&^:?XFXu)mr&P +$l4&%X$"QB*ZNa$[8:iWFR(%=cGK%M$n$)U,>tEW)hkkt!B%<.:kmMjTNS@71"Bg5%%tVjUiojZq3aA" +ei.[4RH)i#c&u]ILEj_(=WI\aU$F$:Zq.'92k1fZU@HUmb]+7O1aj13`p1>j2;,GC>"t#V=A+42NK8LA +';%*/Uf-Fo6_d\[>[R8"#b9#)gIuCl8JmF\UCr]$-J,r=fujhAXg'iLCQ4>*l6&MWGd\f7BX261+^,7s +e1*)3^\M)+eX>s^4=Gb.hCAIo*G7LMg"B\7885qGgDN3ef5[qAMU-g(-;^PgYHd45bDf,PcY_YAU/=@s +`\G\tf#l[u/mI$%P3A(bDQ7NftQ*Bo6dXRe_Ss3#tVZ_F'fHl'm]]7T#k9pJQf`< +\V8@@>V<>i(h@eQW:>fY(g\d]<>(99P'e3QI'tIE9?,20)L2R9Voq"r<37jQJ@H@h3e-rD;[V-.h)T%Z +%dm?2Kee16:LNU+8/e"N6XI:15&o,;@H`Ei[=IL)R5fEQ2A$W**N4r/1kYFt`$j-5fSt`o5t1mq?Y8N] +PrU1*JQkW0CMY76*j*9U*5)XM/t8f%?1Le?t%e%$DRp9`FI*CSR@i+EAf,D:D`3mT;Y!YluCsh.J +L/jnHTf&o8<=c4jaL0%(M,2hU[)N;1Nn1GH>uG?qh'e2[(EOLFI;+\chPqTm3(_V%o,V"Ej+A0" +)TDgLdMfaoH.quQ7R4l!L@IdE["csiLXr]!F@Kr'K9i]8)5/p2V)G(!fTk1J[Dpe^L0A(gl;hYZNMMl8 +269t`$a$]()5_0Yj8F7;%GMa`[)VOh\^VP3Vp`O+7r.J\#*^.o(0Y3Db%PN!]9?`ZehDQ_[DlO#/%#R3 +0Y,c=4%%_u2>6$$N*9^EmNQBT8$4]h;ep1PBj>H+*?quDfFZT920]LblNNW/Xu2`DC9=k#WASiFc!5&N +9$%8A?$)f^>Oq(c5m#]iK)C>PeBT8Rn(=X7,ROdNdrFA@!YmY+[[Djhp2mnC"E*ZXW +=12"Bm)CbO$f!cE2>g?m=eAP9gG,a&Vm*2',%!qp/UI?$QUCkHiL6$c9S[QJ+8;Q-hA%Y1.`%q6kE$'jB+nS#hG`Gj\!$<=0!rMkPC]: +HQ0r1SX,aKAIGimI2Z`%U/"^WY]^t$S>L!`&N),!$MOc8Y,DDL;,lqsLm:snY%jdd)g@UEaf%VX/Qo/D +-2\!maV-",&C3Yii0C+/3[JS"h)Nk&PSdREq&?a%`FmREc.gtJ-Cec[ZtO*.hSWY`hE0r#G>eInEP)r< +l7'gj@fM4cWi4pCL=[=*VT7]>n-a>60oS`Z!a6;Z]Z/mp-ju_Up.AB.Ag#9CnXR]Gs*ZHCZ2E8Y,"faJT@91M'YqX",b[KYf6;--G3 +r'@&NI9S5R@+=40eaYo,d)+F,3cq-'C#go>5qAooHFWdP1l#-'-5%\_\[%_mM?"Z;X'o3FE@ZWLVeBUA5]El_8kGFk:].jNr?fi;Brog>2V'+slEc#SY+qkN]RTMM4>%B]e_-f^S_H]_1Ba$%Y+q[Z?- +K"q=iL[cJELoFAWN<0PmH&5nYg13@jDnHtD_@02b+OgSkX,'s2GWPfqW:$'fg!dfAXP/Cg0f`b69aKPZ +;Z%GU;L`LpUIeGIVi +K7>"J8q2#JJto=t6-d.4R3=`n'DqTMA+M#08oA#&@A\4()_]?CluU>s/W4^\?0-Z;)bB3g3j=UE;cF*@ +QU.r:[V#98!Y^G20LD'hFANB6s[\Z#(pE2h8-@!N#tX&^gZLg[7dd]1oK +Mred-93(s&/g1_SM\3ujdqsejP]dPJ%"<8c5OtLt:t0r2]'.Au_,r4W4!;V#_gAncV0P0bJPiJ^D!neV +E$)$BcY*oU9ok[N?e/a?%,"anLX`;q8`N\XnnL+pm*h0n[F*f*Z-hi^Ihc[(W&kqp_Q$.+K +9!sgl]54WR]uEst4N^u$o0//91qZD"<<$%ig9pJ96\@gVN):,.G>6f@am,_:4IsSYJE7N@ZXn/V/kZVk\gNJQq +e?]>qD>^_,pU`bk.dc=Uo#1'=Rs)O1jgO14B6^sVp2Z/Wj^&Y%i?ESC(Y=`!n8d:*q4O'Y#CQu,\UfN; +$g9oM,5d-k'!aflkb?T?'"fj;^qnLsiIB6$T@T=@ZQ4GHP.bMV]3Wa$PA9Zb'9MpfW<_17cHsaOZEEHR +[^3.Ko@gP^BeQqAm_7&kXiIjSB5[UOoPtgk4K[$@oQ!YBHb!!AK'PGpQT@fsn8`qY,Z\9(t +[qhVm?>a_s+qX#)=XdG\n%->-C5E_$^"ep`mnGI%+\R0mmHh[;bH787P[85UY&aHmMF.ErbLO8;FkX`b +'V&g^D2Mia2i2GCYSt'qqnT)'oPJi`FjNn.?Hq2P(+5\ul/]2-8)$H)l[$)`FFi9#[WN@fQoJ(":VYnf +,C>9:9rgDtg>Q?-hu];b-.QO1mu(@C,G,\\/"L5RTm?E/m4WHI]fD)ig:PtS2$HN5O#V2gEEM^,f.R'@ +bkC$5.4qOE]oWH9-]n&Mihj(8NM]foi1'08.e136WWJ(pVaZ>$5h] +=rd,c?GH$sFCZkKN&IYjE6/^=Yor]j[3>".DVR6d]TjfR/WVDPeqpIcpO?J*[/D$#gRB2SV2ZIMK%Fka +kF\R68<5=fdXJh2W%1Wi@Bjre9!th6*kJ^.mFj0S!#trh'RccAeVcT)_.U6#$1!MTh^e#+Os:[mYPW?5 +23/OAhr0UT@W+0m#4K^)_mrm0D:#bO]2:Vqn64s+`9H?icEPD0'?/6]/:rR+dk&fXCNF6Vb,XBMR4W+7bLraKr]" +)?W9j^B\u([`JDXeFXjLI?BP")#n&=!hYO=nIlEApce]gY,k,U4#UOI`TZc_+8u4lS5LX,%ot[g$QQF3 +3#A-JnJIeGOT^39d!2%-_9%k"@he(rAur2PHp8AsesDbRR[u0&Q>B)e4l)N]W&Lt4n,6#%7]:[M)oCFK +%[!^ha0RbX/c5i5,^kFg*[p0_KA5qHJN%_#B1#=6pk+e)3Y0eb%MY-EW`^*^&]\ec+Fg]>VK72V<`T6Z +5n73/*!gJ7G!oYS_MkmsB7l]0RQ5lo-VE,Vn'.Z%^<54DpF,VrmdHfuWmM4X\i`k+I(j]1a\5W)g!ZVQ +i9oEppBU_[UJTGeHDS8p@3hs!M`]n@K,MIn=ll#[UCTLrG'G5b`pWMmGJ`(rat#.3f0n28k<*D>TOV9! +I.[Y\m,MWbP"/tOHCu7U&9D^cD.P^n]P.J%Cl)oJba']^-L_fR[LX2ORb%8/sWQ0 +l_+kIc?_AhL@HAD6N/I19+sNidNsP#\9C&S(^BQ*HoW-j1hNL]NY7I,D4]=Hpnl'D6>$4UlAQs`L?#t4 +<$RH"N]$GoLmFa>L?1+N<:pJUCd&n*5\@7]##TX26a^X&(L_qaqD\#?_t+o<)l!?_)(F25BjI$#OhkG: +FQM$]7`9P"36j(:&tLBe#"QtL)T-(:M2!8_1M\"P_XBXZQ^R0AUNbD_U86T7=j$f%jS@RaDDTIfNsAq:c$aiK#&3^Yr'+SC:9.EYUg;D6HX,*K%C +%LNkLT+WU=ap%?Thr`Y*9o%UjkQ7/.R;pB=%fS5MS*Mmc]6P\qK?5@BOB@lcQBm,=.*/X\P])[a1)DB' +GZ&Xh1rsCm*^Usm&a-<\CN`Jh9S,ZIb`u\!RW:REhoTMF4a.$RSO;*Io7e^Uqso)JDt_FL7=$`fAp79P +VE;D2ejo$qra,I4N+h5V7L!_h>f/+5`aRcM#,T;i;&'J6V^8+.jLH@-LoeI>F>aNrR>4mF$QR_cj2M$b +1+l2O)2&Nb&)soEh:;o$^JD!@CAaiE?+aF?DM2KJ*qk.^PKn_udYo0;`c3gF+^!s"akRIZ3F[ZXD?\bVHC!BJRj"#dB; +m4@[&=f33a\XQK91,$+8r\*Eqni])IZ+-tsOJ3h1a_m&";.`CZk.GpY]m3f!NuU\FLp:TA;`Vn()_6"/ +;8<_k"&0uBjFq"&eN.JC7lA&,E1Oq+0?/0q/c4@^`E>SeZSX4NFGS>c_QFqqX1)).6Y-/>72L/!mQuoQ +ZNZ;/7';( +VFdM(%R3#uaZs#=)(X3VN/AuT`M%[]9IlRD)[U5.A#L;*nml:QFQRP(_^]^pnejZ56_qJZ#t&Vp.+s,Y +\Td5,AH#YG0`!'<-@GiX\0`-^1/5(8`Q?3$Te-qD_;=M*>D$E6Nm"9T^]>#=8A/Y?^W"\N9srB(CXSUSYIe&]eZ3.R9p?LAfos%+Lal?2J4)"AiRCN9-ZOm8:%3g7q`Q) +]MggoIFFJbcVOikK8]UG,;B`(>n>/$kDj9^$(0ru*(V%tX;Tk#@k.6@lqV!UTe`r7btgHbZ$AVNib$E5 +Doms2>WnCjB(W'@k)FE-YA\'tDX+n%Fdo?lQ%`9"2g;A*lgoD-/iuha5H+B\@H;q&T?&6?miB]QdoQc7 +Lp7lTe:Q4>)G^%91=?f5gU8Y:D#%Qu%c.Xk97gI[U/f^a!..!q!u+CnRCe`[7JSML2$B@>APj*+%&t5WF[^Akj;=(?j]?V1uG_c0hQ.1kU_jo@JaW!;_ +l,:!0ZUdTtEe->HJ(E;tp1HVS_MhFUXrWp?S=Jc>3"sjR1ZZ,'?LkK''^I&@bA-/.M8mXtI.hUoEWq5% +$]q*$>VDLX0Bo6$-K-#CA"]Yh*S1:2=J/n$X/"e +$aU)-]JJ^/a?)o_$ZZrB`t`:/*uO9CV;Du2Nk;TUqrB2OjA%LcKjs` +VB_etQSZ0A\_1O]d7S#0j*k:%p6bC#iDsJ=1)"3>_MqgD;/^6Z +I`+I?g[s>lY=W*'N,GUbbXo>CAIT<6L-*$h.HC,g%c$##Pn]?-"YWJd%PMbroKPE\'`Hku@tN#VaK2&^Lu +8%PfAMmGKD3`IkiP(FeR9,T0mClUEn#'-A/)nRklFn<5.Ojan$oSR8c6hg=JRBUr_0U$oV]U9WHLIfT!mt'eZZ;*2]]?CsR^mo-,*^*he+GrOc;*n'ep>)W.#K(ZoVDu\ +k)(l:6i,ILS&iD1Pc'/E>OjGEF17GpMHNI6m'Je=M\1!k)j9*UEg#(dpePo"E]0,/*9E557Fr37@eR1T +.o1Rj\h\c=/#GGDc<"_\<1Yi3c7Q!N[S,7G.dWY`1)>O +iQB:O$ce_=RthrhnRP!B2_S*u%q^*_Zg5Wd8]BeC=.4RTI35mmAS.=ic,b+qeujSXZ.Tp$^R]U*Z:%KCK/4_iDa$_^An/lN%mMN"r5k#D;]N4q +Ob9uDo0+hZMX]_055u;R*158;I6c0G05qfKJJ:aDH]n[*XK1bFVU#;b#ZZ;D->M--= +>V!q*Lq^65qcu4(,sTt.k6V5no0&]O+uAo_GcZ2P$bE`,QX^YRbSaOfn*rFO880;Z-2 +h"upH&BSkIIb%BKK%A6BD<0FXH,'&\o.h!$rl*TpI;nsgrR`NVj4fG*4$Ro;#0S$hP8Zu[[G&Noc.M@8 +J^.q/%&#@^F$G#?aIVCA'3j5EO[ZG66-PU!mC$aWHSSAVTD_pU=]juO[cDfLaVOI7:OMnP(C`(b(I=@GlM\rJ8Q@AXM[hB&cS]_..#qnm4f%A'JJO@@ +##R6dNT1<#]Je-r(2:(EA"X(SU_uc#hXdr5Q[*CdEQ9&8VOb$-i9P:[c5JBq^E2g6DoCiJ9YM+X! +8iN(emcV$Fk^U[YM%1[^cSf)6HXc3C?#NQI'UbP@L[=c'8u_$J0^3rEBDE[4,; +QROYC)GjjY7B;3A%L7lgJ-1TC&\R$i@\AO^WA5r#oNtXZ +=pqG:g9ADDr!N,H?mW+0@-1UC0]\l!a;p;%om'SS[:RVu/,pa`bKg&gr,R5HNiIJ!7ZDH$"g6L?+5'/X +I9Kd7+h5+)IU6s!Dp#dg\\=V[ZhHc"EVs4#9-?\S-Jr#FmucsHjpc5l&(G0Mk:8Dh[k`7Xq`Bih@8K9= +:fiC&T:N=o+kJL:Do8^P).6pTd@g?#"LdG4jn"lH/;Z'p@jVnr:@[,20pXA;0-=2 +SDn)6XgDp29$Db`-iX.@C@qOThu6DOUN^.tTrUZO_H^O/>u\-3p +UQ&Cg,6"QF'&Tc(8@>%HhqNAso)%T83]!/U#G'.j$k9:!Td-8G3'2c@]n$gB6":):fGa&iV"e]efkflh +rCsH.NP;%0gF#N'YQ=Yf6@ia[1[r[cf\5l=X[Ddu +ruT.(X0r%)A[p?pNHRdb.a])UI<"ru(!nV+F/^l)3Y/9kd=IY0[uaNDs7pLO#AQB=MY[^J(S,8Gj=428 +fGucJ1["7@0V^bJ;(#OiqDG+%>W)AoRCmNTZf&MZA($S;TXlc6_!4N%.@pILC,ADtZRfTpjGVOjq>b9+ +Bf@%f:Y[ePf<+$13EMS2T931)kZuNVc>U?G[6DnV#L_;e9`Ck1`>ZMgAW2[__8mo[nP!D)l`!)D:#>i=/I0gS +?N7C4Y#p&tc@#5sPZ,!$?WAon32YTC95ipZ)=,d\P8=RlTH0UM3AD&2TkYrG- +pk`96qS=lo'I01m$A1Eip!hHJfra'fV./S8p==UgS*Oj"oZ`Xh[qO/1I]KPLBPoB(BF[dcq&#XXnu7o[ +:"!pMn*b_4lH7]8G3)#is7p%cX0[238@?!*T4Kt3bCfC.812*c5Bac?#io$.PP%-B%A'!d?:LD6jOF2< +X:!F]En`SX=9_U`Cf3@%jE`RCSkU2MAq(K?B<(soY1n!&`U%DBj!YR3F[RD/G?qAR)#\"P.b4P-eBdAj +5-'!jCS93*s8,5Gli5n]2lSiLl0(K_l@3]jBj(Jb,@uR)ctIp"qO`>4?dr7.NDX^0F"33*jPXRLrb%lm +'RHc6ro3dHd5k#;s$-E7VC@3kWrKWaZ24%@Z`9K- +3k'7h%K^Bhf#4pAf2RZYEk->EOP]XSec.`KofiPhmQGnBq)5\Vba"_S7Xck:*a(HShbM-HZmOC-BUfI$ +'UMkRQGVN'-]fg,`i?#L/+Mko]j"Ae/D$?o^dM+XF%$j,AW9srG4Mu,LT1kXjPIc%^B'GF`;JZ%Q4LKpiUg%X,F"]gmNNW+5e/F4,+0Eqsl\_FO +aZ:]S7Sg2,6B:;eP*K4G1G_I'_oQ$AihSO#UGY(gW/oNnj]$ThaPlSa0D*7&B@[ulX4OJ4O\9K^EBL)! +3?IL"%;q82C\5`[rmi"C,/%0T%r6pXdlq"q%D8JUOK:>9W=0eNUUTDEJ^]*aNS^`Ccrt;V@r@;S;*F+( +C5lP)H+Sn8etY,!\[,1Bn")Em&>[OP;2:&$T/m=j94HJ(W`HAes&rQ,nkiOt___^!2W[N7u +DR#kcki]qcE!5K]95F1B.QZ-!]t3Wga^ZI\6`/j[3t:<=DN"YiLnccdl!qF]uXBpQs-8ci\%VC'6CY6>Q47:J2r$bk>]Z;cKmQ4@FOT/O4dASe01nH4UT88f[73CORTcI6CCs+:jI0D=ntNj%US%DcW&:r_,HVRT5Po,R +Sm?&W\c6doXjL.J9j6K*&_%`!"fZfO#8ct'Z)VF;P-bo>CfeFmCiq&rmscgAmQ27l#]DQ79^t3II*)10#+r)<;W;PC88A'10PXS"9NBd17T7> +RqWDr^"fHLO$AXFLO*-T?"&Nen$]5?&i`Y2:!B[1^$9>!EGDsQ4N_lETkMCdor4PucPFYF[IVNRlNJL"\ +eii]V3-C#Jk$7=-h1o=0q@2C8/5N +Oi_8![Dmr933&S$-X@pR^*d\=\SCcf*G<1uD&_?8/QN4e.f3 +[&Ak%r3oA[5JX;'*L=_3[#>iQO0:$:TCh#8>7EC0;rascN;h8B@XM7Tj]S?=OR@%EFfdIqY3rscjI7i^ +5`/p$Ml(9]d0?,@Q$Z\9^&MX2_0mt4g\RtoWBH)^r5BD*4Kc +#QI&tXS2!-"\0)%lZ>W6-[aL +'E:;s"B1ib=pt5.83]:$6=&g(?WE'q4R:burj1:ie9cIEhHt-GNl6S"hh*X%rDOq((!]4&qEZG#8/-I9 +$`U@uH/u!QHYr65KIsF:CD,W4leLM%q6QC[IFp<5Vc6bU3m`6Bj&SSM`V7u'`Unub`slaG/mZe(f`E%n +a.X'.(lHGug*U(9sY"hiNiMJlCfDkf7 +S^-XEqR^I*\i%+:>fc9&D10lnhhq#7PAK^I>.66P]$85pUYY48dICRh#iSEnh@E.]-'20@rgPKP_d;&R +nf)#k5ckrEXJu]"a:Z/(@0&qq0(VRooFHg3775NmB-%TOS;kd!WD.[dmUp5TcVEENBXO)L5cV[pMeMX& +Pe=Q7b_72Z(\\JG2&]u:0u2$I+gUD-nL-g^Gn4Z7k4V4>%TV$O4DoJ4+g8@m%,lZoepS`'6,)en8Z3OJ +=C,s8pLtTX_j_?1om_BW76rSS#?(lu4ap%PlKPD:SPR4$E_E,2VjG+22%!p9:;6P'O[$#HTL:e%?hAAu +l/h?u)kb*Shi2!KQb2"_eUXc->W[IZH+_qg?0aD]gs)iRnoFK_Y(Eds4_tSHb28C_*jl2"D>^_,QgG3g +ncTuHgmk)U_"D`!O-fa'^'XN[0D?T7\Hg$qIF'p<*lL/-0]mdBHZ]C350Sh9b)Rr__n+1k[Pn9DL4GINTR]1rJ!T%at"aDV^IjC*aJ +])1.c2ALA4:O'F>k6'i-mdAnDET2hA:-P_'dH5dkqmp,%#@52ar8sFC93GL/fk5:A+1Qj]eh>`B>=]A! +9)dS[(pX&]+jg5:%REi-]]n^ehtVP8J"?KB@p?0^55gDmO$EYchMu)c5jTena8SO+NdUrdC,lE]m;HJC +nsLe.OBkpb>S)_Bb4i7EahqA4Q@9ICaj`Q0,2ti!hYYZbPV1i#$?Oo;-nUBP!?c.>n)qFt-'`3pIo?HE +BB8_)/ZnV_$fr=e?hpkkK*V&ln21,6o,$f7h2.//M>s_ceE`XBV:H-`p!6Ok-VDQ&F=j"I-lsM6<_,J` +`YXD6Q2=I8kU!\54q$!%]W&,*qMJ%tUCV`q%JGm1F_fmk([a$Y^TEkdAe#l^-o2o$j%]Yfiu:i+k=n@Z +E2aBH(N$PiMY:C^Ise\?cKBIR[cV,$@V#.#D>RJqUc4FVa#`\Ni@@(7Q+>COAZ0_qGr`uVdnZL+jf31r +d%Lq=,_3H*p2(tAmqR@:lWl\N^Y`);<.uV'V!LYC%f)S_m=FQi;5D]IY7)q6UB,f'pbkU5)A+P4c!)1G +r_i,sY:q"rr*4`dYp,t8"1?"cMTh/p`.u*9P%"RL@uuWu8^I+S<^,7N8&/ap3sXsJ[\e4F@]\M(/&/4M +d6[2Q1"T9gF974;<6hM,8(>fkX=1UA'j"E6j36'gh-bBTH.HK:I^#eN@3SfC<)g[u*&8E1"!/PdI'uSs +B]!pES2X$s.-/0-B^KQ4[.md8fSG;Y?Li`goWsFo[',,#0*eoa4NhE7hpdh?%HMr\B5HdMbEA-Td$Kq+ +T#L&,uC" +%+D>iM9IXg:0%tIh\!BaDVfH#" +:Au`;Mtj9'/oTi0BC)mDgLc>Pl8idSfN-NMcm@N!l*HE_L&+8WjgMt);i=o8jf_/'Y:\=,db3j"WpIFP +s5dES&Yj9BrYjp!B-1-aD)4IFQ.r$g;lB*iOA=ajB=r6!`3%;T$+Z;fUN.)8P%@@d-P;=.R_1=E*;o>6629uT`5ZMicH+\(W +[S>r`BhbMZ`qHtBFn:5cBc4IkmA\mLRGrG91N/"(um?9/a +3BjjPPO6H0;k5E">uaN"A4u<:Ncb/gp#+\R4gu+Zk@sR84r*m+l*dTqjC!GdnC^f2e1#3UZ5krF4E^%] +3;.PW2bA.>dR("7jY`dW):3_sX83s"C&.B]EkdEXZMe0Hh*+"t\f\#;m16ADbj(G7*5>\6R)o"ueZtAJU(a@X:S[]N)e:q-*g\@o30T5b@@UcD1n9!?POaqI5G6.QS)sZLqdoA< +l_tuSPTI^99irT?`k((1o\&ZG-4^$//DjI +pr863>bbcHZ+:9H]2Z[cc'\r>L-Z:Yorg-XFCojifu+QjNL;HAg,LlA`q9HQOQn;Fh^P,N8GMPb([%IX +gb`JAL,o1-atTIcaG_)+'cru\:=!hE+)!-NBe@AR9/0*Bu-9WRC4)K +&,V7.dAX8;3#PHae%2;ED`[P)opt&'(sn1^Y6'#0>m46cRBB)dR<_Z$Oe3!EU<@^sGYi7(NJ!u&WQOc. +#9T$`L8g[c]B4(7o?`;WB8q38;iFbb\a#jmmJ5%T(>UnaQI8`<^+LMg)bYgY<>AU-cg#j>o\SlfVXRSt +I(Dhe2`miZWo!_:"(VkqOFN\GEG`ie)ho(jOZC69l4df80P)h4jsoVHZ>4"pQEt]MM54irU8WbNBqWGAu"[]4s>j$FJ,GRdu('HR&dJ\8iU +^9dZG)m'%oN=neTM`+)3ZdE^\LO@[Tll"J>bZ%0`eC4?C&,cTEXe^9jRE'rBbJmiYOdVP6*&Gr((>##m +I$6%tTh!PLeQFEQGC)0lS@L#.[d'BKH$/uC +?6+C2/.,BQgGhj3VJgY*RrqM,d[R$cZG'gQR$fe2l^djB/3R:gs1RjCm`0P,j@WF,bBgVZU[_E0/La5H +=+3+N.IG0igXWP8g3:QFkPY5gI-`q)g35V]B.>hFUU#UV=`BKR;BG^QQbt8r'sWKr5am$lRE]e5ie>Y+s0D*F:@kaZG!395(*-UCp>)n&O,F=aRQ6jIHPruB\tDl#,6NY +AG]-sfQZI*gNOb;#bAG[[2SGEh&TS=cG.Hnjk0*C(ZacZq8VhN33%+0DgWL6pRA:=qrZ69Wd#=>Z2Z!! +GI)E1)W;n%nJmKjeit%9np;C2nlHDs4$DR`$hr7U]3D_2>0"ZJLT:RC]p(SWls[ +!u4I=4Bm;,MW1[:XVLa(f_'f#s+q*B-1TSdh`P1"#.e^^2UWB7@?B[,pL.;nJg(.04Xf\*/N&g,)tNs>?omaVu9q'Q1e:YpY7"EUHU3)4fbSHX]9>*bZMOfu':mXlA(a1gXM49mt+8 +h/2/cQAO8OH(L;_Ug+mo.`X5*UTPKVDR![m6 +rDMKGrC+n+CH,CTJYTDPCB],=^Rc8mY^@@sSgZ)N@ssmb/+E=IQ+sY^\/nQ=Z\gqYEe,WFM:V?pJ/*VU +?\^ua1V/s/jqoUfYt+L3]f1G"/cEgFrQ2N5nVsgQJ#uiID)hK,`B*tsJ,`mU1H0IqAqcfLpOCa^>p\Go +#B/K6Y31:D5QAK$Z0m+VDuZ_mFh#ocqrnT3q'`Kn#0W2b^.;I&WK&c@AVnnjfW[NJ`AN2N\/17ECF]!QPg&RENREC\52%m;(V=ucAo$35]J5k +YJ/0_na+&Lp\Dam`#U3iE-'2Xd]Gf2.r<2H]DU[.Pdj2BgJthEM#B!>B*VM=j'$tc<)_bl4h[tG^.>_L +*?92S03[I+4.-T/R!6S]?3VMEAM]9X?2blNF0Sa*2WGhg?18nK&f'5-1lT^s8uECm-N`DoRu;fE92hkb +]h#l-WX>:_O@`$fB*[>$_-n3.cLbCXLp9\rCrLUSMW_#1,5KBnD`4eV#=ilWG+BQ;9"1'*0f&3[WdZVe +IIfXoaddt@4BrV^dfY.*;;'s^b44De3(2(?D_)<7h]02jJdTnhAU_tJ^t/DG\j7A,4M5^KRI'C#$Y_d3 +GVA@Ro-UHYN$ljcE?^GSY*C;n+%E'M*4N?7>!Z.Tc]*"tFo+[H?EoprK[n<#rLl,.qd:oI$66O.AOHa, +ek,D3[8QX5>T.LjJ=&]sObfIjnG>WXk12=@%AJ'`*=WC5? +H8[DSeOhF4.m@!R.D.8s0r+E*NhgK&5:k'=.Er7oF$4:BiPI+i$SP&:1hUAm9CmauiE)JSR]<2EX.3@^ +(E@;*d[]u./^925TCTQ99RWa_6049Y\fb3&bmRuF=.5IM.T;e&buI&DDIdI1EDLLgT.coq^DJbR:e:29 +.*W,Q6pB&32!S.7o7@oc/BpgHO&2:3:-PT*/Vpg,R77D,Q0-tKbhL:@^s+*^X2iZ$+H,X"(WU>DbmQ2; +5LM[ZE/mGW(Pk7Jo7BY*9Cm`DUas[t01D3a0=\(>o"#sIj%Aopkk/X97nB)8me8'cDRAShk,!@jKJ[>, +e18cO0Bn`Y09rlMI0\@PO#/MTp'IS+Y*K8>KE?98;:f2pYlJ +]VQsX9_M#DBdPlWNuY9k2@=B;iB]-h_)E$MbmeS<>*S#dP=E`mdH%X%3kbE&U.S'&GbSclJ"9A@9c=K\ +69s&qYss^p7`5#r/?C8q%q[0UK0eeAJf93769EZJ-^2\4^.b]e]PC*i:>CfDUF:\RDeo/p"hbP[?JKf+-A)1mX0+\^m^dFHR?)ORNicK[@0+nNabOqDPX"^Tj0jnM^%Ofpek/-G2u.8_G@iA-6etgt$KA@Wph[M[TGC-P +QifUL$L_gC^@\-O?XXDN +:AJ9J0=#4:O#(Zab*(;ffkDG,/tPLe9$5d7:I,f-Ka*QP8YVfuc+VQ$74MGn6>sdbRh,LR!'\ +BTn?fjY]ILCur&o*DS,g2-X1:pIeN?rj;6"J#tG;O5#\1#e""hYMiU9djdQtZ?st$[[#I1rI)>&;,>T^ +CWh/WPnuI/o("h$HI/\[ibsi^FA]u7Y&pM(YkuKWG-52[7U202;X?FTY&GE +2Bl_TITrXoEI/T%J7I][&QNk!(-dZUH.uMbNps'4S-^^L2+s7Sot%M2MC:Z,/2%Q)3g/r]]2mbn>p+2L +1,`^Yr8mDo04t"Pn+iiTGL,0'%,-b3]Eta'9?ApQruOsAgd!K9B(*Nm8PN[i;2K"2+=ru +ZWO,dQ$j%n\:,-mHqn"&KDWj#d;RfXf%/S:e_5"aRcA&IDa+gjh8*-K12g;?U-.jI-!m(2b/kYNr)`FF +`:%MX#52cRbMnLsNimN^\0f/![e7)O57=XB>`>c]\pNsKFc0EM?/hI9T'`'Xhi+H3j2R_XBU`m/l^TEH +gn*b]0tu(I;sMrCK;rj&CQ)5rp$taVAG_!$ae?`fT"$k=ikfjo-O4>U"sM[L^7hRT3Y+H.Ron6QbT`Y7 +GIOmkh^#fbVMNBi=\M7_YB[fYQIT>fD]7LIEfAIj2(1mN +g8ml876iB:Xa-FdG!uf:hC`$!?fb-E+Pt,g?5lW6fIbkcrs*`f.O%o8#C#&s\i/EL[gm8\hEC=f!!S!f +p1)r&eH`,0b^k[drrOk5OEIgn>D[UJ'@mji#kF9/6pqB#=49bi]E>8i`_fi4&,5=bgFDH>N'cAGW+QLY=r8L%g1lYbe=pSab9PNDR$\X%!]PIKlJLu/WlX0DeYG.?3,<1L +B_Y?>@8@7]iqW:NLVkWEFHN.ZFI?HN+fE=*-"+Xq9%r+kG6WDafaGnoom^peBe^%]aH>.c>)K(oY)n/o +R@cs[CgqAihLl2?]YH6u)1&_:i.tcS2F]"%1C?%?q&:\9k)^Q6j>9>'7U`C#.b;m,+eR>cW?gaA,<>4c?Kf"8jpji]WX +=^`mUW9Ak5U]80AJNga>aTtYXhS;DBY +!f%ltN>poXKrqqU*mr`EHS(3nA*Z+<&1I.IHL-#QnSQ2f.ki1**9f`^Hr'u/U0RPf./Y*n.X""hMkKfV +a"rM-]?VJ8i(^hrV(,:`H?QTL"#auN;aoIZ/]W`N*;O-(Hg/8gK&R;lMroD+XR5`=2nbMc\u7KcQ-o0, +NQ6&RSpQ0$Z2^B,#g75]_IlY<=C:HSXCG8Y!nY`:2nD'i%^?EnE\,d1dTs*]q=3ApNb7c`a2SW+P%L+%S@+hQmOn18WN:Hg$]7%MmTc;d$"KNOj1=0=LYj--'N5g4+*kb3TG)6JBf/+4.C:2\mY(u<:(FG_>Hdk,Ym35?0Gio**Ig)QpB]QMZetr7#PRc +m^^b=\RX*@=/`he/![in0._iiE;i*u(B,[oc0t=2_>Yp&aEPtAC>-F*Rn4a], +4[Ges:9R?Vc$2:p8HJJtdiYTk'Cl+8DsO.+g!J*I)1lcRm45tmj/qM[osGq^'DF"*mHWBZT^EfTgSg?7 +Lc-R&2teEgH.p[.%96#;#@'+ahS*?'hUKq;EE-%m1&[PeUfuOgb[Ns0?,b81Bq2+r\6'YnZH,*#Yr3p# +'\t)f"`Oe.R1ie(J\k$M8N/e6Uca5ES,q7eM-l\%&qdH5AprLd]O$iP<]&-<)6YMQOZ66l`q2thgSCCM +Mce`%S_.B3H`-TEF1##TWoQesk:tTON_T;qT7$MLPE-U]B2!7[8Z.A!e+V"E-Uum$e7bfHh+u]e>QFgOI5;Ic>;A=1\)5 +,_]0F0Pu-q,!3NuCRtGiAn6;;Y1\gF-WqsjdG_qW`Ya'cZdeFp/rVZa4W3gs.&U'C9NS@27&j$T]L=I+ +c.\.uNC],LQ-=P7PF!%9(4VV"`]hXhm'Oc;f9tHm9L%d%Q%"lE!K2dh +Sr`R8qqp2kNuZuG_BT!E'>&C:s!QE;2N7YQT+#*jrtD$fs3DS!3Q6QYYJ(T?rd-B$dFXN7L^Hu/ZW4+eHgm$/l*1Ul(E>8eT+,%N$;(7s +Xird"$afT`L-@GR-;G`fi^c01fj'//UVS:s+-)U^mn()YCM,6A.-V2JRJZuCK8,$OpO^uR8/4XK(AH_s +enLD'ML[.TLH+%N&iD,P>/#"-=&DmLAW7G41R%7F"+FHYjRjlG#(fGdW#ZdW^))45acE6TMlWceS,EMN +rk^#5dt*9dVZ;i(E2k*.=3ji!:^uga;"Zs$J#ur%Ilsj3Xa0+c6/R*8C[%lZ71od_6"/(R;([7*@l@r6 +r&o<4,YGd\hY&dU%q&AAN+:*t/RSJuN/8SS7V1jL*,>aSOP`WrcLY1Yr0t>U9[c='6u*")@NoXL2[]/_0@ORTl8h5ZaHW'0>d"Xhe4m:q)VR5'SkJoNn#b%k06ak)#p9^@9'=*979_ +pOpHs/s\I?ao2B<7RmtqS?^ngJ)H70'tq:IFq`JX:UW7l.suP\@jc`4nMjl8`LI>)WD+BH^kd]ZnRH2;XtSP17K(qDY!L+5a+(W#gef +EC*M.ch9jNA=Sgqs(n"rH>eu]k?#3Ch4l;7:!;KTk7Xuq +]qgh+8d`."%t/qkip8CO(4V/[BG!An54`*2k[U=1kqdLF:g=i/_<7ErC?`EUAb2s)'b;&NiK4#>!flEO>)Vsb?#?fK74#%KqBZJX>rHa0k,MYr\Z7b= +CXj5VeAMf$StDXBo>NS>qVjfa>qpuK9q"%Sas^4AqF6]WfUMsdk:]\]BYM5-3mb3f:_3G+6eSMpX\C<^ +:85V/O@#A@)HSHj%F/m=&[eYo&p;Ja]6Jm)?MU5/ZEVg`g/khi^XU[hH#2/[)K_CaUQQ8fn&Bik3D=$: +!7,-qACP"Am>rsSN)2]_'t.",K($$I/hOrag>E:X2UK>lGr&7!?B2tfDJO*Dp$G?#`\'dX:O?51*D +?qU9\&,sS&AjDmJQ/,g2lZ251\;O]DjqXl%U'p&/Ts-(7dBq@0ltdu7E`F!Rk%F"d2N$'_?i18_(b9(Y +>d)Ckesp9Nq#*`gn[i"\>'mjH^8U>-V*Yc4/a6iLj[[$]B>dgSH6o+*gg[\h+f:3U'>V-e9:S:9aWMU% +/6/F55p0nDN%]e_7X2@Eih3\O3e]_h99Fmieh3h?*c.\'*Ts/VNXcY-l>NrY*r!?<]9[2m"9#WL#IgDA +65j)*BO,haPbE5"e6i)1m-g/[@t.)-/`2j2qIX#ZbM#$r_J]DL:?EVNkli9+5kW9anjjUW[6Lc^#X$?N +"_):oDj&TPhkJgf;V%+ZZ\6ok3eqq66@=u@tO +D-*=4EbP-i+0DD$o^8tDUR$0H1%%fH'WOOUs5NYJI3U>Oqo3E^kmM.Sl4#t^T8tq>,5IACFi'/%jb=*P +5O^I`p?>EnbB=$N/AftV8(T#\O'-;dS]1;rH!7tK5G%iC"PR!_Mb*E1SCq_\_S0eYefH*Ld#f9add?n/ +X9-'/Z1Zk6M.ljlk$,Sk@sd8V7XAnLAf3"$+&k;04t(YlrHGt(2qjKj+b*NphP2JDca"!a`Ufq#oOdF; +U@.&s/`,2sM`8[?[nupGDiri5=,S=-HW32B.q*^aqPQGK^%Z20;+b//4.[CZ0KloR+,joAWs;fiIr].r>Z-?_M%&.=B1.rY&Z8jo<8Ufs[OE6)iGuPtIF; +odR;!hiZ2[h=^dIIH-U*I,gL)qSJB%HG^9k9&@t_q6H(!3ZW6T=DMgu8MF>IUWQ)d=CWEG%%tLlcMA/[ +Pe$YRU/do]DU6P*Nr#F!0ltS=35-.gDiAIg!fcB8[OpSkNp4&u@B2MdIF7F81%.9s5EY&ShV2jTNFV_O +0D4O,n=f=>Qf=#7`q,7Gd?eAIN[;dq^L/V]f\fEZFb+0VF@WR-(p3hKp$@h]P*?lnZa&*%GdYKbiLLKp +%CT:\rj-uu_BV."N3?iP`]_KQB1s0lt!idV7#IhF!OtVT$P42OEWYof0Vp&ArhW +QSZA5_]'e.XmU`tM*Io;EG]3e^n +g2Ed+NR(/SZ3?.WiVN&uYttA?U?+NWe,+t9Y2Vuq0b)=6,?@hq,)%Os7LE5rN"iGm7LJf871,A5@mp`k +j+rM?W/%\YeGga8YlfJ[*CW8iE:qOJU%V\*.?*iI?cONR8kZYZZF7N'FK2(j>TuHb%IMHX$MlbP9&&h0-?^YD4J%Y=M^\0\X$i>lG)q7PD@k_5jW8p+pr5a@_<;"c?7hfcg*cU#ZUZj]^M*7(Kh@B_>4$oU=(!/7.$8S(H5s8 ++a-ue"*aV0N--o7eoBM,Phct>49XnQbeZZ/ghNY+idP'ZY9r;3;f/g3b47Zf&*Ih+TIhd#H?P4ij<5;r +]%lpbn_j#0jXoZp4e=3+ajRN6D) +^l6?EJ$j)b`<+qo39ru[n'el;?=kGcid8AnYdJ@>-#uNg#<_pZI?(.(di!Wc]NqpAJ*9OZqQB>MlE"e4 +;`lS%O8GYeU1_LY&1ML&SlU)ZkFYIjP-,C.$L4p32kmTIYW99u\%hlCN,n6NDu9(n`To>Fq%'Wkc,PJ0 +X1V4de&/4brKa=Z]KnG3c;Y;X##R-RI'u5@9sfSFX%i'1I+PB$K@a8:DWUHqS`lg;*DcKq,/dRJnG/]d +Amu=5NH41as*LVdt]@ttqISSq$?YANnr5J'K/G_YXf+d8@ +1qZ[[hSni[/T8dDI(JN*m^`:4r>:#"ofqq5^[eAEKVqnu4!0>;("kC4[Xdk5]b\.\Vc>;omo&gu6,*T)kE?7]irDJ9I&)8uY` +^"UdafqL1&coO`cXp+2JFB]uOEJu-oVC6MN$oYf"Aa0-`5?X6!mq'U/bp.(>fGj0S6#epZQUpad[oJqU +kj+)o-EH?t8nBL/7?3r2_I!4BXO#ItijE9ST/,Plp3C6qAQWH?l1gh#T;$ZN]:sT"8Fa=jZs"\9RWg;p +74TfWiNnLe:!,=PA3%43j&>Z1p1YN\?Q$ZBJ)[M/(g44H;9u%<#49I+/0fE=:&_iGB*oYHe\@T)&8)@u696/UVC%8LaKLbP%Osn8*GI=u"(kT%0800s:6(hXe"j'g#&a +X/-3*Q"e"[nN]a:Wb@fBPn;Q>CiA9BHV`Bf:!l^=):*Mem6-6#!c2dCqi2AX?..hpokh+geV,hCS:bLAH]c$jMHNNG=F;g'^.n*/Bc)!I,774OEeA:))hUZh@J +[(V0)Hg=>1^#tIt3pK@X=jXM0\#EPs#id8;pX#NJ5AVWmU5#G"7Cg;@P^:ADobotr[m[N-+-=SC*Mi@V7KZL0]tr[23:Z$JikZT^[I +nZGp43)==pmtAbaQ;#B;YrberPYSNQTsG8Mln4-$N)"#"s-CA=TrjSm$d\`O[8nI'/rNbal?sY`!<7=a +atLd%FCu(>29hk+c'Fs%^KOf?djefhpT?5?HV\F"X126Bs,BNMS@qk.'OOkYP8aA=:??trGVjc0'mHLg +,E7WSk1L9,2E^j;7uhT?YE\'L:TLmG3q7]EBD]^@@2jiRNY+Os]R3C%\)E0KmnELY$G1Wn0>?9JTDo-< +mn?j?fs[IU7CM6Ho$4[T!PGaU=TAtI[nkhjqe^cXF]P0,^\EX-!ce20h-$dNhV$3F"JH\k\R43]d.,D7 +n+b@]iJ2mX5On9hhYD]g.4JQZ`=2.#e+^:F$++4ZnbcNtC'[oJHc`.+.+4u*q?8RS]qi4b@+K1"''hD]TTZ+uMfKrnFb#bk"_;0!9"Zpg`FPB@%_NfhnC2a##%3a#%/D+8_Ei9!(u*-">_>.9Y&h'Q6@Y251.=lkOBS^kt>8bK&4] +OCJg@mC\:!BimWHDaZY4HRYl^VK1`1OCKuolp[%Q[oTULrj0`8nU#!3po@,TF6aX5rX.i[VK#,KpHE\t +MO-3nTfa$:kkk7R32.^KqIm*"U@)s!`jid\*j*bi:pZ^('1:?c9 +*a*67ig*b&+-0)Gao6/:XLIr;H-'C3=7_U8C6N<,G'YPU6eArI![&C?J_:3Wc!>&JQmjtl(j2GlPd(Opb[JS[mcC<`ZT'o@D +4`E&n[eo]YT!A0BC^9?[\TQ'#k_jhUr>!_6.h1'hG(,2@`CR%+(j?r>MKY!7empkgdV^\3GN5cbgYX@( +aJ8:)Jf$#u'RaPVTNG3`9MeCa!4ULhR9=3H'ZV.jLF +O-96q.muoXPV(atVWV-3j9m8//#$cE9M5*6&O6!?b1S;gj2FBdaa7U(.oE['2&4(Zc28Bl6YY[IkX/t. +?Z"K9eXk[^`&SKnG!\`j2W[Sb7pXisMM;Qke5T@5p_f-&`#nd.=m\!t@m$$a;OX^pXBkL8dJdq!(3XuD +K\Li.iYr[CoL;Q-ME:7-VKeUZJKZ%sQcMOP>!:nr05KCV>cVF!T+[j[c#IPj.%YO/RE:$K#gu?/:g@+c>5shGn+Q+UZLq5[L9!i,o0,A9:6"DC>#4_&cCSL0do9cbe.eEMQg2rl +=F8kN&mEi!I!T#8;*;8uj8#=7o>NRCC_Os3'0_`:3&*8:D`X=OM%nn\jbMGV80f)/D!"0_5g@tgT\[Kl2r9EZ<'.Stu,&*CG;e#AU?$>rS:I!U2fg9:+`ulBAt[7StZe +\)DRiX`UJG@EV?1RmqHM2t=+'2pk'[gF+0@#\BP)X2J%R&?[K-=`2.I]V\a*X-I%c[j9.V +oXEr%2.r=XQ]Ag9S\F-Q^2JhJlE@FsIfCC.nW&*Sc0@C`e\H!k*;Ua;!n4U0-/F>KR7OoK7 +qopkr]).7o[Z'dJ`a]eCU.Grf1V[`G!iO3b17J9rc:3mOo$UW3kW( +NcrgpSVqu=5Cde1R(7;;&p*4;ksS3fY:)OY""o\2E9.A^h=_]CITgUEnt3@.7sQQ$gpsF*FQUl:URaL@ +d=8<]lod'm%#c2]W7ea,+pKosgn[N++7#fd1Q(BfDE#l7N?!Wf:Z_Gk'5B_a2MF[P\ae@:X+^4nT0+BZ +OWt&HGu[_oV1dQk`u@;Q`0`gei,;'nC2U=j +YjSg'9I617o1Z(W`O_qm9,C&+9OUF"!`SOZ`)ai>a,A+6Zh7H?8Q'V0IYDQ2o(M-5m!@6QV.?a$1,M5H +37,(:`VV#l+K;#iJL*e6>(5N?:G/D+m.^NaGC9nYER*KO21=CtN"`W=W2U-j"<+15E!K^L%/g(s\:gNh +BV,(DUR!no+uDOSo/pR45PT\gci:qn-MkPGeWcaBg0iK9_Ygh0.MAh;b=fL! +Q77:HgRZ%ScGqqd4OMX').L;lYpoh\>,m5Q4WchXHGmm]lC#3;_W@-aUPTHYIQsWsLjimZGlX&7UVgs3sU8hFe*&oh[(DOb+*lFU"9"#;nF=&o54#iYS1ZgT$iK +7.Ia0k28,fWbVs;'A(nCcXqT\X[t9UWL@HCc\TURHg+,0P.d#t%RR,(&(re*[)o,g%t(3F2K_4REI*cVsA?hUTd(P.R#qq.R`PHS&;l@BJXs9dd"\b&a+M/XGh)b#>AL=NP_j?8fN! +CIiQhRX7r,B^W](b\t$3LAIaU[0udm38Z6c//fj4M&bLgh[faWlEhMFaAT"'XiMgOQ[7Z%5A$)Oj:aeS +Gh^^u4DSm2Y7VbrdL!QdcfXLmrq6&/;ZpLuhHW"d#NQ$'B.;Lkg*HkWf>,Ao=RfV\tb?^t# +Ra,D(nl\TNF6.%"#JgMf7X)WKs>!ZYF/=PE@l/t49I93C]W)Y;Wd40S?8!QZXX>I%W@BEFVafDed +5IdbY'_a*EosN4)K!S'rH*(KFRTHIJnZ5XYWE-!C=K>C@ITG^fIoS*LT89%q!(GL!%j`s[Y6h_ +@a]7HF]#p:5I9u*hj!6+Q2BFp>oeN(m9SmnX*#99gGDjga*$`F[!(uWF)q##0BKCP3ijJGFSe-N"]QkR +4sS$n+$/>\LJ!TfN:lj8hqp*+Hdp^CbCkn/m%M#D^U)])a&qiZ?itmRWl0gf=^KR#E$T^;%M=P(=NJd]Io$j*=#*D^ug;NYq!W +4_#ofaP6=gQgVHo7qCM:(U\;d@Gl-/#>cH(rl<)#4?"T^i4di2[T;4lfShYqoX$Na[WubGN14a/pko'M<=A*q2. +'7tu1U3Ys3]S>nJN1$]6-j*3"Y.-=O=nbT"THTQ9+!)B^rCjda')e@mpG.>EAld`:EuJNQ(jQ.CnqP;" +4e17A(HK&i2(OO`>^TS*T)XZ?r2j,DH+>d_M>pfh5.bgtJ+30bCdq0L@c#IYTDo.Cc)O7p5M.2WIt(r% +pXZDc;nIpe=\4Q2@]dkO]mJ;2]^;e'q)gl+Ul9%h4ug=W^GRNSp2'ssrLM<,JVBX26&b*D9gF5&hBZRHaq=l)n67Q78].f$-#cE1EP2l,s1C3>j&YpMe?"Ud:$[7Be)r:533mm%nZgBa;/FMCNaTD$"D_&0 +eg=\BIl9kd="^Volg=^VZ][7ihjTgS3bGqbS)crLiSUZar?MKPYHqG"1.s:Xb5PX#9_K1](Q5=&26T)-ulPk?8 +XNK"#*78$63:>m:T!LM\k$c7XQe$bgeF7#)=Lt&;9+s"VqTSD4ZSLM@ql*_D8'"kqs5^%@neuo'h6ZDuGFMr_&$`c*M553LLCO=D-Q`r-bQ"AR0SA/(B$50LJg-PftasC:8 +Ob<9!5HQ0!)+fndJJq_5_d*^?;A>UlFmkSPEI2k,ih0<,A[D6VP9nEc[t-tiZaCC)XEtVmm_,DD9kJ#X +TmJFW\LdEQL[L.lQ/Vk$&IKS1La$cfWG<)/=nbDJ8a5*9kXtRrMCae'e@kBJl/%5G$JcXU:ZD&7IF/T] +4pH]aB;N'idWo=Lc]`Kibb9.IV3CjANjA)4S<'@j"&&CNQ`,6UB4^;`QuQieaB9tZRNle-)`]F^[?:4A +T8i_IR7f7je@h!N;S"e9g3)l>s.$E9'lcB)^Aoe=i)6,6WjAa-+R-=A8n=o+bkF]YPjd8pB'gFK2jK2> +L=u>?BkfHa@2FX>WHDDRcN) +d[C1Emc$qHq`=^lZl"R2_1RGf9kG[;Ys4M[13P0!Dr0c&;-IPQ0oE'l#57#7^PY"@L)K" +^r_&(S@k"-6tg'o"aD!DY;.1FH8JA>oiLoS +e1prJ[Dp8EH`d"c%Tt6%/_1=niXEQ`2s79\DMt$MgjRBfaZ[r)P0Rd/H#de77J)dX%2:&NjKa*_XfZoQ +b^98DuWIPD>OpX^J,BhuP)/@L#Cd1'=oggJZA>[cDT,]<;)]TZ$'dl*kSJ#9#Rr_X,H&NUR +GogHR7<3_:XRu*$o.]_t`gi=TmEA_tk:u+C<9p<#*qFh&fn233iR +p*aS8:)X`7*9;J@H0d8!!lDNYeFU8D](lm6h`/;VkHHo='k.-V0qXMcK_P,n;F\O6R>nb3'pL`4Y[X06 +hQkCVH-9l,Y&:-ibYS!>fs=W?!G2gH6/>8`2_ru^-aNL?YUCcmXDu+HRJ1+,H2(_8d^o'W:jZhM3SNEg +7iC$Hl;9>^iHj\m`N3lW5IBcpLUs6l5,38QEsX'9iOoDS*/+(1)>OS?j%2PH,MrJV'!BMrFGKaq1K1(; +a8/Y&6?,Y/aE)6ud7p6O[aphBl'WH:luQ_`K]]EGK_In&g%1`+s88XNKF=4*oqmb^B)GD*D?9I*1TR;* +'RKE/,m/$F]QI(hD!&hjq?lBhI;6uq3@32r29$11Y'^o\-4UV5oC?N988?F/cAF2/5i.]7c1>5/Vk+b4 +(ZW\!0?)4+bXgr1%;$luBA2lQcGB0m=#J-J`e"$3a^Qb\.Pi+9hPB8HZ(M]ADG!Ig_*_Qg-/.&5P+_cQ +8ikr=MmOco?C=a@q+K"(GYdu_AL%[5nTAn>]INmIWo&J;2`9CaisV1Sc18/G1#2m50?D%AC"#A +b*dmDS<`mV8`e/8\nL?:ln?Et-k43/.O,M&nRtBu3-]OpT=T_tD6hW?AA#;CLlhs?`Uaq\d7YEd]uB-[m[1ZP!f&3%(qe]]\SoF+Lo62/]7<"=&"CjR+]`G;6Mu8&r,O7\tq8fOPfL5]utglRXp]4@d%A'_^qb$&p#7'=#%*Q>*q +3]A6ERUhc0VB]Z3'Ae+[L?:D%ql4:g/"sLJg##JEK=?)=DTG?cRbO'f>%+;J)4K=8P1$-]klWe`&5%!g +Em9T2RbO&:Jo#Pgg!nfST:G1:)$r`QaH.2PajEhTmh2)DPbh?I)I'eDB9#8lDGt^WAR!YI#;rt>X-IC: +HkS@rI`F=T.63:-41(no63#j^B,n"a^(M[hd3ZmQs8]k!q>=3Jl5K+-[\_kR%/^8-)2f"NV +1,LqM`\f^%YV\;a$T0kR,Rhq7qX)5r.-I6[[jb*(C2Qu$R`3i!RN"!pL?:BukR>2gaA\4`0KAJoITsrc +.*[bKhDI7,odloe':N.f00(99>`ost2nb$f@Xbes4nme=l+4f3-ps;mpae4kr/sZ_p^:ldC<75nrO1qd +?<"ZiU=;Y=_0ME7YAis"7?#=Ge)p9%*H3?qs7m'_8bh<270 +#a(6F2k6,3IQM&OBo@]roCHN($>/buJ;_J^E,Oo>!Z&pB2h +Q5/t!cbb=/qE5C6\DIEPbe]ZI&9kFbJt/lT%1`fjZMal@ZPR3aMV%^dr.49#>s1eG,F5-+ +L;NbtEI%N_ou=ujFM6'Z2e([PI/Y'D^VOO%]Jp?4oB^JX;.Jc%AE"!rG@j%fpcXr1j]SoY9YQCfl:c8hYBKAQBG,b5L=Vd=;+H"5n!uS7j/^Ts_f +j"tj_C2as;H0:-j'&'ZT9*1&OVkG>.+AY?pG;lB:*M%+@%gqjU&@([RA0CfiZ%ohQh`+@uc0m.?)&4![ +:s@Pb(PZQ:1D8+lMAZ`Vg;BG*oSd6K6:uH6,]q_cI"1!&BtpQY$M<(Yjq4C(KfKA%)9(rfmMR<%cR:pc +c`#tb1&3oK1]4fNp[O2q>Z55[oG)".6>r.8k*hm(d.\b@'(T(_3="dd,nrB9,l?of)$rmhc#5(IcF_,F +_:e"C@7ET@;9VSpXcn*/3?H<@Shu5pN$8EcXBRMg?>0d@i)UIgGrDj+MXH*-eh-0I*8q%%%Wf('E]\UW%a$g>$/Q$uKl:i7M`u?q*Id +%%*1(/I'Ei8;dLi%anf/,`@4-/-a,`=tH +g,pT'AL92G]#B3l9oB$.'%16^rlS]CdE#e4N.ePTBO5($cj\*,^q>9+(bk+q/I"U\0bDpmGbg79cUd78 +"(igS`B\d1>S?ZM4L?AN>T!jI?YeQB@N_hX86_;OKXs8j@9NM?Af-=oRgo:Ftr-uN)%Cd5;fP\"h;O(tWL"hD5B$S43>ML6i8%pas +X?2AjT'EipO!3"5i)^HT%\lOljU?W/q.#imcWa,p*8D#ZF5VI"T/Fo7^WLABlqn5Qr<9p1)'Afu/*@pR +@*)1T?bNdV)&02C5(dQuF%4#`-c!eo#jbn:n2LIkd_D&Kn4$\fTl9ir=/&NKAoa;!`.@Qed +?EEG4N.a.]5jB4CFUsU=%j_?iA:g$,Hch,@PPF0$5fj +3&obU$8N5@gdlS1:fuR6IkPF[N*Qc1]+Xqn?F[p+7A`$2;WNCe?&C1Qg82k]W-pY$"Xq,j$_9R$$+3E] +,ba4?#?r_MkO$ounBZnr9'j0S:NMln:&X`*hkffTd4RjW6LD[Qj=eQB>G!HdOZ>+=.Img\QQkUcFt&RB +;IJlir):3Amu:V1e^,p;7RHL[;*ugPCe:BfSj;[@GeCsI`>iWZP%(po1]?BnKX"1,\P)`EmS[R@N*V;Y +f.J'qCM=c>mo![Ao[Z@2bB><_0m;fCNdR3IZG\@!KuYgjrQc>fpL2T&in.70h#)kE5+e8u]`+=]E%f4= +GKh]aO, +EXot0_]h;g`lD^b*rk$aZSul#b^%Adihd`\f7T3IPM-Fd7W,?e_u+a=$W^l>UMdt?_'(GK>_-!-`+1cH +)+?j6C9SOng=&9_)t[=1e:&Lc:"O4$9#O:"U/V$(pK#T"=K.'2p@8Lsf[=q7!>pg*%SGDe +qE1SJg+<&$-acD8.*XD$&h_U"7s5C%c<*>FpWWYfprO2ULbC>Lp^SKZDOa%`nWI(V=rAPf%5"3k%K+-a +UGBuO*Bf,oeOM`eh1AEulmkJf*n9OgjR@0W_-TgT).NgsUbM5]J[bb5[15CT\K5s;LFs5We(J"'!ng:8)j.(Db'nf``mT^^fL`pPS%s*^#BE]V_]_B[Xab6i(9U9DiFVpSoi2[-#=E2 +80Zs%4-E-j;]@iM./n'SS$CPIq,fmLaI[7sqlJ=">Dst!+39:Y%kAU=WT8tL_]Wt=`qbc-k98BgE6Q+s +D_?LW%k776/28sRN,nqhQClcr\8J5-'gIlJ>k'W@MK:+Y_`3;KS2ic72@Q_oD&?M2[pe@jo9e,Y*Kr4] +Y(IW:`@t1)-VR]MEQ9`Ul[f"iQ<0``WtEhOMLWe>HH^.^/?eiK/?e7LcVa)606 +A1&t42sukmWdu4P/o;L9hfM&f]^iaRH0&+AH"E$rKu@KV(c)"4,3S^b\oMKRuO&)@c]qb:DEg-R2M1 +/[+B#cX<2KcM/[:/r5Ve\p(\>T^?ZFj2Lm7DoS],Wm'pf[cT&H7)ZO*"qPOg]q,G#?eep.ea'8UVdQW\ +cWW3N;Peds7^Q'cXp;)9@@'6?.R09rio@H=(S<'uY,D;LA$\?1@uhLu(%KYf\6hd&S1QTFqNARooT_?d +U80kp-ah*gCd,7f.#D:"\20jJ6n;HcmdaOg7QDi#r4cU+;6u`RTQWEuCc[uDH%h7o36gE2SWAFu7M0R* +]Sq-4<3EU>9/>!HS!\J0]C"@O\X&n*Ha\ZH@'R4dYPCN9VUI?`XQgdCO_;(cLDaG#$>r.7^dmq@b;kp( +2s;#a4nOh+O0jf.DlbZ_j/k@lJN=:qO>hm"6qrUrG`^82[9csF`$$5Q[NrR,]>`!1:^HIf?<,!RI+e_aRhmo/SRU^?anaR7"b0=$HYIU4eV4RG*AI3pk\b9B +V#J]_IDbf"-2CQd.!q3A(Gjo9#IQ$V]*nWAG!=@2g6Q\??U\NAdAa==-TRo"cf9#KK6'$jVouD#j'K@i +DL6PidL5)WS+K-E@1\^]-!/q0Ef4X5@33&[L78[N/u$^UnkVRp"">hRaj$1(^r.EBt%BjB5gnhEK#O +^95st[e+.W2PV\][D)uS\K`JKtXb!bR\IifN5(.g##!O]IR5h.HKJsGRV7\0sl]# +#hWh!qXiFP*qfo86cONG^[_en4T3ZR=-IRNg6=qid)B\;]PMrDA(CjY1uH13q(VjH>q+jM^HCVPZM!(p +eoe6<5Vk6!3FE,4Cdn+Hn75QE4WbMZS'5J_j1?AH?$-e2osST"a"fdB8#*c3_CJH4cc,@`@%WM['01pA +hF:j.I2+d!OC/$^fj]>o5%(&!;KbYE?O?;;/0j/Q28=,g@YKa[Q,4cMNM]rA5b"MRfJ +-W;[U=b.[$TGW!*V@^eZ;_.",Yl;MJ5#e/@_sts-4ZTUag?ZZ=]D8eKBZk3j&pCj$'G`elJ,%I(SEBs-A;X^$Uo%EBEfdNIe +MD]/s;-2UPa-G1A5nR_$kBf@q*l$E:?Xo/T"0;E%pZ"j*9/RYZ5QA_/$[hp;,p`>uhk$Q2o*T7+2H?Du +\-(e]i?UM-77Qnik2a,6JEH'*L29Jr0+N-r=r?il.h2iLd=Y0 +*s[-iEHB2BE_j%A^>l=.8$j?.$IL$)8:"l2CosdNM`n)*!oe&+nFbafK"_c/0b:goC:>2N-M(lQS#rWX +!rCb[#?TV$F8FKslc_FPbf_Z>`Fg$nS9#$cY-R'-FT"q4H]=:[$"mQl[<#D$cMiE-Eq2CDHre\>]U#R. +=jVLgX]tYJLj`XkbJ@=3oK38s?q'D*?W`peh^-;dG)k$+;rfod:p76kmMZZtNn'J8NmjgbU8hq&ZmSlG +8r8MX_Iqhs<6/"ZEV^p)f;_Du#GQO_6_02VLR9'Z5?oepBDnM67ukLUOQ1HLI<(iam@2C@3#^s>^%5r< +cWJ#'3j`hg3.4[7)oq3iHcU1HOlHG"j7LIlN#ilb%Z]"\:+WL?;1b]fSc$QKH@<2QPEFntLYSj)*7j%- +QDr%f:>>+;3DPcc-cb2pj>_N#3DPo/-HGA)>ifDUO!f/ZqsPN&j8<&.X>S6qk:DIu#$[)IoHB3hAjhX] +/<45NYFOYF:+i90-sa93kJQR7c>e0*0(Sdbf?A6GU_)bg@4OHh%r%"CV]DiBAI+kp:S5p&E,R#P7>b3it9bbKLr]>_*lM*.o4Yo+u`oLA:Em)%fU=(^['A$U6'X^n2OYG@+90fS]cp#E7t$he02 +:/gT\dBtXlO8?ed*UTsrN;@:;W-pcrpnh*k8.W4SpDnVSJc@:Jj4Xk1-3`]nt-(P-'U\6Q`mN,J+ft>GNjZ:+s?.I$!RpU2\4S_D#a*"1O4T+S%V9LFAh-qUTkp' +Yqd6Z"+>GaQ2\qRY4U&WGp:#_bY6UOH.8VPitT3BK9lC1hbWp&eJDh1:F:K"$]t2&WR&67[CeoQ04ptA +m&W'ML$Vqa&aM8lI!'m?_hV8EHhQFBWOh^/IR^]X%hDH44M))o[U/andPCUtD`i-IRtYrc;pSQI`2_W1 +%6f&2ng=QI,LpdOS0hml'[)nTIeMIf:KCccU?D(:($VfPe+l__4V)To;2_<\*o]45u8Sgf/)cbL>kH_c":O-Nm!WGU%XEejhOZ\?u96]X"hK@L'@BuIrFrO%,]9uO^u +P@Xl(]eY=+T.?_dDLjdUP$5IC>P!+gs_M2m-"]9qfH<@kE^M^55iO7ofZN)L1_GaSE+LGOVEsAIVD=Ffls]fKF9f +;HDt-[F.?f7o)eqk6_Fiu-Rt5*Y-thg9I36=6sP](od*LI>"[okSmM1nO]o +lL[Q\\=0h!,COpfT<3f*F9XTVC.#os)^7Bjsf;nm3>g+Im3dfWkBD;%]0^*:6jNE.GV>)gjf/f-G)0!LRq;o +JZE#H2sUpo9(BomD?#_=&mfgG.:WGTC$Q<-dO7%4]UHo/-I'4`;oK'l-Dg3i"d/:*T8DG_:Xa%$S+)qh_Kjk"(YC&iA;laerGEYO)n=_p>O)mqCPd!=.*Q<@2cl*H+!545V-;o<^,-/SgTod]4N.X^GP1nf7V65XFK0g76Bi\s!j&^Olo-5cV+.h +TA!Z)2,jJR)sb.6X6bR`b*u&eNJkTQkuC]ZWOFM+47Vu*)_M6l?s]JTg8TXmYA'7[bFGiE;)=,CPpQpS +_6grK"08_-+kn,X1,_;)$DeY'Afg1NoY#OKF-uu*Puin2PU`:@nh&j1(:*56rD(kLZh[p@&U:a;9u>7L +1AUWnUt-mi$iQ`s!O<2ehcq5uAsl)k4*nR5;:@*I1W8C#@\o:)RA/"OE6q@,hoc?CA[cN^,FP/^qc_7j +7,qt&qhoY[oF20Kq9I'>46%)LXgn>&mTlkMR`Tuc24N_W.c+gp;ac[e#4q9L+ChP2Roje8hBcu`%[/X` +>2prHT_D//c*ZH%N%(Tm1lkB"2:/\sR\o]/8KN#[E54t=R`=`KgM$S:dX,_o*WlAK-R:jS(Tj`H[*W1j +B:*>VTkC("Ws6nt>u1Fobg8/W4`$>F>EQ$qU;q_Od&I=Hi)nMZ]>F%e2T?ECiXL3m3L!j[H_=?[X%u;> +8-.YAjSgG/qNho[0.G8UIQ"NV?JMlB]6JDC\hmaW +'eMre:eqiPc!g^_*kGW-SH!s@Y+t7Tj.O^SrNfG&2]k=]?gY.5X[#)16`81o7Q]Ru4*91m?Me3Oc6%Mh +/Df8s3/'>Y0* +\L;@*DAN8"_hG)sZKWKi^T9=P:Og+;6Igs,Pm=U7F14),i_EY09U=&:>aX(@H/3EGbGM&4.k$MC['=mp'9n7lRT$g"3s1.r9q[ +>E\&GG8sWkC$FbRFUk!b_^,Y@:$4r0T[>47376q]2dH4-A5/*_]&DY-dkZPZ%^%C'"KkDBR<>Ln*a7#A +d;:q5);'$`MAn0Fq"FP/WW1`uqfTf!0f;.q(U2?t='b)IUM3d&Trr/W4$RcY`sl*U4sFcbC!);5q1e3E +n-u_V/9.u#")[MEQ_[mRFi-Wf]#ErQh.&J.LT\I3;qLNNQ;*T^\25PTS$fO[_7=QS>Urb>P)$Te]WM.D +iR4gfL.a%K)_S7Z=&@*+pS47Mp5`sVQi7HLQ%&qFP3ZJoS:AFQUTa#oLc/Gheg_k]$ES1]q-+4XG1GpK +5(il(X3k6bmJtF]BjY<*_8cL!O(`#F:'p!)=3$NN/jgDnDV:FZeS1_m6M$-&Q3(*h3pDQ=>5Ru+h!-Ql +]A,@Bp0Z\/[Xu8m0u%-O['GJWn#/akl&+6H+;Zr!R +pX[H3=WBI$WBMn_[?>,@H<;td8%3F\79<]_?1?^'Q$P36Dtlnd^6pVTrN47kloQY*dhCN^>*\on0JD$F +ZX?PuXRb-".D7JU!bZauDS>&6khc3'obE,lIRrYTs1AED( +#AM>$VNf1\m\U%XY\_U>YbTIP_%FB'LgrPjli2s6,&m>T?hcq\&At/h`'N$:2>Z`D7VCJV,EI]UaHd:h +H%9I_9cV%@`("NRYO"I/ZERY7kiH0]45hoT'g0^oS(ugdX-t>r2[ih]LP5Y0o22o,Q-_U1uN_AZ=Djom@cJEW,Pi,Df@ju +``okAUW,F7Hc=)F]t[)&;4:j(dB/Y`%=*j`KBo@+UZ'q:#;+[AkK31;ELVLW0-=nJ$@#)H+5uL`Fn*/1 +nIj3*4LC86p[MR7ZeGmpHY[U. +Boh=KPn`>_Y(\t/Kl?Sl\,r9%``On6SP61'2)f!rgtJQqA=?_d2V+5rF_/h"%FVu4(s@Hp];28dA'[&I +H.L^E?:;8%m3osY<;m[O?E86O$07PEj2kqNKlB1-D%A&au_F=I`F=T-98\mcbHt(qsQYk1(ZjS38>\up8ke^8R9g#g7V\225BRrHU;ekN(S/D +brmnm2Q/u"de=*nX[t=Dk!j*+c)j:0;SM2.V`SCLHIgkjgEOneEr"PPpujYT-DP76ImYf]&%/++T.*`%cWg4A5lGh4Q&ZGKi&=caIXuef"sA6XpI>bW[aQu';u#IMRW\tEI^iXQ!t"o +eh[*!*.$R'Mt$c(fJ3ghXol#>fe^iYB3[sK>,#SnFtI^H.cRH2h&Se/`6&Oot:*k&'5[bSI]Erk-kkijgen3l/]T3a]j-Ff(SP=0)'S1^T,\ +>C/P(E?=,QK-u8jet%,Ojqmob4nd@O/>@2T/!/%Xb`gNOXI7As9/\#<+m==ITR6,P:IB1q+u1K3qRiAR +k+[lO16l(?3e!fP:33-Um=^>(,&L28^G1Fr_'gm*C\XaA6.dr3h#>Qo;;31"_.=+Umbl)1MNarqX#$\Bc +(5"3l!P`nokbd\4->gc/SYKg.,@=2:P3jLbW/['GMcQ&P41)!?t+P@^("'/=oYo/I's@dak`\/-ajI4SjidWKY;/\)U-_,i@Ubb3AlQ +!g"Es(5&`qQJsiFeuGP!&sCS'ZIfO$^'RucB(QXN!fBB][.Q9(2tR?V<8j:02fDh"BJJ.#B:?eI8LNtc +IKK2h@^'r$!f,U]X)(iL\]')d('DKLa^SXgaMko$ +3:rDuDFal-kDQk3$ci"qq[SFl1;fnA1D67u=^+;K;"N>/AoinNn&RV4?k^?R!r_pu&'!k`OA3rn?!S?l +#IJ;!(\+Tcq8FM,#4mcEcK57M%@)0j47Jl@IBWQe4 +bR9R-T::+h483^g=H79ol-IEMWQa"XKu[[`-n4=L4n9IaoD9o]\8K4Le'd+&QPuW(HJ$4'9ba5?2&\%4eSGtdc-?hrODl^k=E:VJ!g8kMH5kKV+#^US'8B8PZO5X?QOh!TDNFH)OR +%@r@JUKMo+`Ubt%b[N/0"]h-s>1.5%d1&QVI2nM9WQ]I;0 +*pE/51;0Wi5^s>Td8TA.2ILYV\k[C*P49DPbe1N$@uMM#88rWGXAt>H&GC,(@nj +b:\'1QWlu2?4c]B]XG;Nq&ni:X].V.),(Gh(&piU[09f\?DQgii'U=k=s1Z?"`>MHVa_uX1`er[NY+B81ra32"..Z:Zh*=(0K.nN +>rj9-D3nEh8`,U;GC5`$5"3)* +Y2iH)dHdUDRg-9D>+Q:jiHB93)cY(GNO;Z!,G(c1:32asGlu_PSW](jAC7"1/k&`lG3M\,Xu?1Q(6WYQ +hR]Ni1GWM'?+OR7>S1hJ?(1#u@mOkdV22A'/tK<>fIfVZ8*j-t\9@+1qpJ!m]6)=X-RnmZ]6*c).qrV* +91d%VV5/(fV7HWY,Q$FQ"48^9Z)cH)mlKD(r5s8'r\irC0ZJZbbBOjVpb9e60-'[c3W@='aRh6/Kb^?V2G/GW))l`C(LP:]?:T#$^DB:Jjqp;Mh(b(luO\\GPG,YNB# +iAA2j[O*QQYf3!I?@2?uPI-G:IRdN748!7j/;ES;Pg(63dA_aV#IeC#r#ba?(ahPRH]ZPqH*BNt)/)ZP+Vp0:Tr*Imni;HF,P3n3t +"SV^54jAdV^'XNqqMsufe-k(#W/%`uSFX+;+:jjK[cA$(@I*Xa*R+u[G:j6KL-XR/2EX>%:YtP>jR2U9 +SVtB1[%<^K6J5_\h[q_k%6MullbRGk'[/an$:80"fXge]=-F=$=-F&'lmsld:Jh:LpH'1&O&53JAolt' +,M,0Q/JCmbe+q:djmC,V"ZCdK"l/QG^GdV&(b^rss7%!ch0]q:76R&sc/\@Bg;!.[43@N^QV.dWq%%@K +(<8Y"isj$['n>1bGB\B4$f@.]90N'il$;<$J)SMjmoP!g;Pfb`fPsrH!WI'Y?c;Qn=O0L6R%"J0Ue3AT +l[B-0D[G1?Teh0AC:86H3^cE'hW,!#R)8/V)7akKX9I&\DLIA9p'5Phf+S,*%'b%qn+&TZ=)[ePNc5jk +D\A(LaA[^92#QCdf::n"`eg]4k8#k*8h_tE^jRo7OYCPZUZ0BK9g(n^d."QL43iJ*B#M::g_pt(2?VX= +ld^mKV14q_RGN9]q=s76:+?PZGpNL3GYe_/)dc6*cZnEW&JjBO)W@o,G/*93V3jQp"@UmJDq4+4"6*Rm +e8"U;s"nGShJ8R4^5-q>Bek3YSPI=4$=g73>#?:(&qFM;@3/Va+8dL@5N.^dB5j5P-/!<*)1?H$&;p0<(P\rd2J[(qRIgYe[Q9.[e[##fjJBe,o#tE:/Y';*2(WM)32gd> +Ne@78i])t>EJV_V&AKHMK3Vd"EVLPp*9?r/a$FmTi&DQJE#dN3`Gn^'7N;Yu@Y3XuVF;I0[:$pmLn*K: +PN-aV>4`ArfJsFB6QE!s/n(iH>_F(%nM/m(W::?u'\So7+OW_!#IRpWEDW&K3)5Zb-ca'Pi])1H3"EY9 +*!b0J`,SU&7Q^kQ%uu9u*cLH,fj,cmTEDR$4*6/XO%P]sR.`I5(TMeI&*+[>.a$IEuE?*aA"iip* +R,Br0;@)poO@"o(TMeI&*(3)Lj)BapEJU.F&Fg'P+NXNl-Z1[DKpPNe;T_ +Nl0U/EZB$,ELb6[Ei#.@H(1R,9V8u"@3(?B0Iln(;G>u,R4=A+`EJbh.4jErOQ"#&<[Wg4IJ`K^ndkBF6-UOF?F4&VnitnX.EtP0kWfTBE&M6IoU!JP9.FPd&lpJ@g +\4G+i&O.KYhM6k6.%X_":0TB!V*=464L?Q"#4>3E"1*`rMB6]#V*q9X)RD;N.Q7F5o*68hm:[ +DsFG'_LHn)(XTKk7CXOqZ"74uoGBYs^K`2l,E,5LBuGcg<`N0m4E%aCT1=(=R*hlHXDlMcO1Hsk"5Jg2 +2pSnG!RH8U^Yd\Pp)PB>2EdZ("nRIADtq1q4t=Nnb7bt_@X:sH'C'I?NQljo#;%e\.X'Tq^j(m2.=Z-Z +bc&/e3ud]0hHEKfVD02+!?BIXPpA#a5D"F.&%a%T>=-ANro9QK;$K5^P3k"At4Y$&^a5[JJ17`5UdKqWG+hJ:]j/k`c'uo@^U;E9% +Bp=8#?Z9IB7,3n.B]rU_V&7V(Oa\n>l:-aOXeIb<^IR"$olu''g(8#68/jlq +PL,&?>oPi!+k)28->>jB:2!#)Fd"_:8hm%Xg^jWXSapND8:?bg8SZh2;"$j,&8K$P)^9<>LmZoCG0BZ< +pUW9$eY"gR8hm%XgkZ/'iO6j4,sP@UVdsY#F%C/('LHXbdnd+\'A=!P[@nheZl'PKA8UPO\m[W/mbPer +3^lL>I?dO+U\B1C6!ntCs- +fO`ImKp\9&H83_p;I9+JOjnhN:!Pg?eb#qYU&NAiH9-FlN*s\cLjF.pN_cb;OXF_&SH>q)o>!Se\*CYZ +SGfFl>Laskkca?+NI1Im,9=Fpd'JAu-HqY@$Sd9JIT[V%df*P9HTkeLXP3MDT-s%o>`tI/BugUWr<'h, +gM9jMkgG9h8qrre=o%%_fs?slCU*jFSis0CiKc'Bp#a[pZAOII]3`S]3[UFM4DPek@fN6JZ!rNu[WF-1V313&2dJ@D +%mB7;Yu+;i.5*BqbjD%ckpP"Tl%AePLkBl^lu"Hr'&W*$L`^[?r7PZrOb:n2X-gYKu4EBg/J +VAhp&%Q]j1oF>ud]D5pEXaB1KBIO`]nUu+.Espm@HejS(5#fptooOA6%sgHndS(VZadAN\A+QnhiZa#; +'[Ql]7pUYODcW&&h_Zt>CRiuUJC8(FeQuOW?F2G)YWlqe)l'7KJ27Tc62OFrr'MNFAC"d4)X-NGa5(T3 +6ll'>VHM(S'2@c4o.>\YE@J]K+6oW]5=79M:6-8.[$B-Ve0O@Y-\L8cc(CV*J?o7LD\]J;oLIj;bKdIGpQeq*bloVi=T._>>Qh1.q$s +fM@.O_4E2a2f&35(j[s@K+6F:A\UXP*:Z)7Ls@@@hB@A3X'[T'^0j>2E@dZS*"AerrufVi2:om$m8`g7[h;F^o`_r9+mMUDjRrSc/l(5 +l/82);LSg@Y"L^Ig`u.N7$$NGEO&PF=q>2R':,2LOX#?af^19u],g3h\D<1m*44I+'QuQ=!cbgmUH,u0bA5/X +5RoY&7>W#;(!M%"8Tq_(ZJA8XFuql^],fcs]3S]+>>'BJDRX*d[I;^nq'FhDj]:2m+tB^M2JLJq>0K\r +X@CNmOc\28+f9C4[jU5D9=JWr$;3GVB"Ut"$E-'#>[d$Dop8FKk-;[nQebDX#eQWU"EqBnrI@AhH.hS< +@CN;Y$:ML3?1JP7*!)e/BROC0(MQNX`N:G!4R#aZ,eKTqZ$B'B+j]*;;+)&aG+r['m9]bS*nf>T4Km+X +MHe;_?ier>1uOoOl#.lOLPpDTfn'(Pd[o!Fd->6noB5UldicH!ocG*Scq8%/kZ,s[YMA!`TJ_Qhn'fR[-6#< +"uH]tZrl)C(GAf^)28@oTcZY/_nuu]M];ViMkS:..8.aR*W.Qo9nT%],`-8$ZZt#f`rDbgM6540XKhXU +8#k2cI/*(,-aWcG)UQuJJ^nH%NV`XQI`lR"2n,"L]g6Q$n,71V%5u6ZO*dYbX!b-g:GHss(\s'8N;>cR +kX99\3SgSSGgW_Pf(7I"4!.H)R]:8Eg,8K3a*fb>q(=uRlUn:Ms"o4NcI2548aZ1WZ]7`UI%gD\gg94N +Ghk=+X*knpgDP_%HdRQ(@S4cLYOe^pP1[/X9RafPHC\#^455(8?VHtmuJH@*i>@?jD$r((8"P8BNh4075\'D +j,GY*Hc""rNr2R0%fQ4%)UMa#CG)>Gb:ABqJnaoF<"3N@qAh*LGj>o8h(cak5*pF+WW>iDLhFDmM(4'C +mQ!fXj"V&C(Hu.G#g\"\F\gl4i!G[6L`SoQPIO8S>Ibf5\3OJu_[IRdRt#A_jD4>;b5Gs:';u*l\+4L4 +)A)c+.lcK@R+F8u!s1(Qqh9)KT\8GM6JQPKO(p;^1lod4Qk.`3Uo3l:mVT^+Y1+_.m+G.uL/uE]5u_4[ +Xo-IVXd>H%"OqR<9$G@!rc:CEn@abSIJW6'a15.-MZ,Zgj(QplY.%HU6bHKjCs^(LU`QB.c..?Aj^s<` +5W=l2leZ"[Xr?omp\;i+K`*PgG]=(8_$;&jT@LNk%2d!7eS4Fd5ICQM6C?#m"eO>)"05JLVIV,+hWm7m +?Y(!6p?4Ji39&SRS?.m;A]?k!'V0gL:=b>TKL2L[ahcL`L%qf?I\gt11S(a2&H'5V0\.aU!t*;4fJPV; +p5nFfUl>i7=TRV_F$n1`Bl:FPdOo6Jce,R`4fPNZK(gI@WUd`"2$X(LFbm%<2D\7M(?*/D+Tj7P$\$J$ +g&5p8%J398[^[j-Y"7fK3 +3,3?0"r*M1PLLVSn8i&?'=m8f\FE;O\YtiNaSi'JTc0"L[jKq48+i_*gc-5(ge\GNRN(FDRN&7-L$"-B +1hgj+pERqBa>GncC2UPbPid^85bY`.DbtN8Sg.#W]fX8O07M-9:!J[)n!Y3+!]@G6/[(@J3.K'#JEA)E +6!WIYL9+4X?lsR^Pei^sN4+*""ZQVLhDFf+(=dQ).[r5;`*3VASODk/Uit?@01NfTC=b^'6\ktW735%f +*Ue.8b-*FX9kU2"]a2]ND*"^OetU,iiB/Z*BUgC6R@M(sT1dJuOuHI/Y")3j-Z.2eF;QMP3Mn3T/hYR^ +^<';mEu,f$[rpP2psmUp/=t%p>7U>papL?:]5S#Gq'K^-+9&Tu1AP8&Ia5,\XOL3*`H/bai].pbG3Tp@ +`I'mVKhD6YEk-D]LH]1]);cLcJ7e=D029$Tq>E8G\[)pnb8PsO[)kA"_eGL#/7$>g/[*aB2jph*=9D)g +HhPhncrT>NVD//F'IRob8]s@7^q[+G7JQd>/uf^AZq?$8_sAtpmU2$cO(iuH9,t,MjP9M;U)K-&lJ25T +?L^fk:25'&\KVRELNLD`>c%,:[dC!r5$P3WU];"['UX/ABa3._j+^c#g\2 +U;*j&E&;=sq&IA!M"_CNcj*d!l;=#->R`)V6`=Rkdh(rPF;eVLS^*@e:38[,Z?`m?`>l]hXl;O#JshdX +N-g-Rj_5"nIWQJPMAb%!&%."$eslG@57L=YNQkUJD:ACJP(9;f:*J7/VS@0nr%u>pib=3)aO:^`f2"cP +Z)c0>0*0*7_XlYET8&FBm:Kh/W>a.P=;?>W:a6AWqQSVN,mso,_\?j^S:r7-7E(384!e[S33m2QVJ3.b +mB(iTO;@6V>26EYqEAtO)O=.me4PQVF.2@Xbt9[q'BhM?[aO_fo#)`DObt:]M8oZqJ!Zlr1DN?g=/glb@Q2!q!<(J/9-1-W0M0jMEmV-?]!RAjuHsX'N,4L1g]g< +Wr_$tjHHSE:&+7_)UQ1fAi6I+&1`:k/o'3A6@e#m`%s^KS'd`Lnpu.C= +Hb@popHM^]$B"qi>7@rN#@\pRTpr3;WZ\"kChZ4qd7ku6aju9J8*6o&.c+p;Q(5&`Q)6+)[g(R/L8$#Nh%(>NmZl!W4mV>2ua^Tc^_6=bmSMXR#s,k9.9.&%qYbgaA +C2UfV3-[*dWM7mGE6Q165h`'5:(quAUPi1,Fo05Bf.@3J#c[RXr`^-?jH9q0!O5i;QM*OXW#bF'Zl3g: +fK)IR.>U-_,i=b1j=C,("`2jf%n@-.5qtE[?QGrq&sA=RdeX;H*m5#V&C?O.Vp^%dE^9b>i0#X*H,fE +Tb\5Y8GI#amI"AY*UHu$"t!5tKpue_qPWW'1tn>\L\434cgpTIBa3&ak%[/1)ogSngjT%I"(+Dpm;ZE_ +21;ViZp%:.1t9I3Y8\*_7U&$=20Hia`Gqs9`,A[<$6;tAQ#pI%*D%'M,W.thm0QOJRQf.2;=B9'&detK +jF&AQps7)q:S(#TWb1Ke(=1V1k%[/!`F8-OC,W.d6RrX^fXRNjMDqp%YSn)?1opoBkr-8j`e;emWrZq33B**GX9OnmC"$LE ++8f&7KPo=S+((.c24**q1\IiQ?`jTTBkO5V5esC^EmGf.g&i?hoi):s2D"0:F^)fl1_l52eD1\hH0U&(Q&4f4=Or[i#c*b!%ICS(I[]25'S2`7N!Ja."`krr,7`J$'":<\!(eO`%auHt-9X(g06WtW[;1$L,OuN,I?mu9.QtIJ$0JHLJ*2'!SLmKFrMUWr +p]7Aq"h3^eeN1#0JnV7D[Cp.r#C5-=V%S[^3/s5S`^mo78#^Kj&B,8.qT79MHVa_uV[?\%&214+?!SO@+l +-[K=/Y05!h&W!Fd\JgRed'+EbBJW$,D9BA.?=u?#"%pnCpHD)h.M@)R(T5CJ&N%cksjg,CO6>;d\8l+eO7'pWoU:u\3.IFRX9APWO>rl8HY9/8CIXT7\.;I=F +Q_GC[p*$F:`@g7HK3I@AJljV6Rkt&AC7]7CPu>9e5Z&UnhE\MBq+pG,W>iV7Yt[B)ktGEdWhgB@FNSY> +X]q5JlRU5m9:'h(c'$gfD3nl2ami!.9;ejTjbYX1Q_GBplr)+gGNhfudRW6-FNuinW>^kAl0Q5fd`cZs +:3fPsUtR3bdbOk-%1'OCM?X@C,)*S,/fr=5k/q>Cf(!Vu[(Wr_a>LXgp"^VaeOEPanso4V#$L\Eks]&++>r=5k/ +nU?8DJGakO[;/0Q8)-NhRQWtp3jn7S>^O\XmWVd6`i8bZO&/mWnbX>8h='QA7V)'a\DP\XFMFSWi-n0Z +Uj[moG?Ku3Dr0327jtD=q>H?9"nt*[pVZkK+l2SiDL>B-KX)MXhs[cf&FXgF08K9`lEBW"1`G3=Lk]&^ +E6G,/$;9RD&^"iR]\d/2+5ZGlH+Yu=U/+SU#\>k9^YdH:j*jLFNa2V6[nJd':?O^.QFA(LQ-(RDd^H90 +T\l5\Ef?>Tkl:QZ5QBo=CJF_4o`+g7F2t]WpmY!p1I]STRD:$E4P8K_Yr2HkNAQAoK/slfp,,nV#Q@&=ma2Cl[I7M0`*T8ER=t/c(O5)mVB;(qcGT#Y=Zf1!,+'me,qM-jiji]V-b +p-i$\m`s!l6C=,&6u+M\H7UEVP>^)stm^Vu]n*Xc:!r)P>Y4P8)o-3&?RJ)L-FJbS/_(jKl:) +f=g:RI7F(R4KW=rBbi(>F$H<%TG7qJ%k(,Eh.K7q!Th@=7<_fDu]4k]W!Y6 +h?ILPio0+1"k_KHh:@"`NR;l-oT7pGXa_)94b\@opC^8_bM2qh-Hab\qA$3j$S)PP4m_*<:">2`4brKhd4r"ju\#h +a8RId>$%Z#em7i2ccPY3=-`9YDX\#,aAsPYG@M[RRLP+hOe02^dl\Vl#Fd#.bD[sjXs3?\.<`pCTme"T'-SfJm-#6`lr\!<8[2de4=-oN_!!)`Idp"3 +;\JP>K4?7"OCDk]4-3pl/p/GYJ3o+s^/?N/Q"#;0"UUgVHDO^d8?pXJdj2n-K*6`>]CSp*MVZ1e8Q+oB +30:MX$Ia#UFUnI)[5]g&>-2nGUtD6jStt"EL(Wl[OL($X^SoC&`NZ!Y`K#Y28;`sld6NTFeTd5k]=fUF +`GTGMl#Q&9GOA%[?'h$!XW;`n;XDiTPGHiFP+?fHS-o&s.<`qV&5qjEXOF#uWK:>G@TOF38W"Mr09R$- +ST9no!41ml'f!iE5Agh +9d'/G6GAE%4P%*[kC9Bj+epu*Qb'XBj$-t10QM!BHiEZ2N&OA_/%Qudg=IOMIVXiF[5pXtEei2mHqC-AktuVt/2r7bS*a?I[6!=i`p)B3U04h?Mi+,7SCmBU#9mQ&l(.*NMND4%6D`hoUD7a)\M86Ml +Z/-PDN]*uH;,c_6#0nZ=n_)%U:pJRTSp2;D#A5F=l`3-s*r:;n=9:]Sbn/2TVDhh/SnK]:Fo=)"Mg.QE +T8eaFcVE"o2u3"uFGPl"Mn(XRe@G@Je=$(b:GptTn5[>L.X"\Rf&P$HcnX%1&E`(:hPs`EQXBSmR'GU6 +lXqZASUL=^7IqAU\Z0j;bPi;?.li(1Oa83o9#H^3b)8/gd!@IIQ-\kk^E#Ko:/AkHI_P$n.'uZ='2o/h +KeD$lmTqO^CtTu#0,d)fKiuAgHPb;G]'#Z'n$d-3%OesLG3"sL2f1LKbM[Lh8R/l,T*`m*?, +(8>fTHllLI0'^PF1lB[;/OUD7/dp&q2-G`)Z(4;kd7)M96l-;8#9$cMQ\FWI4,'&ULr_/9hJ*fMH]qZi +DBI"2$dlrJ/OXe>.kF*-<;!KlgjClVFXGkk7J1pj>Bat%1SaC0E.l+q<(s!NKrCA,ObKadTe%`_`Ni[i +6<(&/Jh0;T@3JN!/49Z1&hQL___NkQ&`64hd3ZZk(8=,[F'4dG5^L+hH2=_Eq33XL,8E?*CTn +(8>:)9GShFYRn'>'QL9,OG0VQgnMkV<,e;(KrEXd;\l+5AUT5cW6c"U$W405#[)rjI2HN=.^lh7:7:_F +hD`PCF=F0UYRoLEH"8)0W)ZuVD!*&OOmS\g$dhDf/OW!E+]9gA6l5MC$PD:V(8?_pcUe(9(8BQYVhBcf +io1^tgZsnO6l0!,D-Dac0A,7[NguE5.n;9(J%k%k=buJumE%\*r@5)ag"XA1<$k+2$di7TYRlZ6@3I,? +0Z$-Z*#9_]%1ARqK2A?$+jgA@sm+Ll/l4 +(8AuDL0KJV`3#U^6kBC)&/DetQ%eE/Q>@_%5>Q8W(n^6n(S5&Z$)6F@d6aZ'_EpX>7LP>O0j9B',fO.7$7Q/eOn482NG6K)oZST" +?Ls=27,7`Y+gPCcAK`hi(*_d@a[0ONTufW3]Dor=7-#+-Df)-To*qIKaM-*?6?Ma<$^#EZ[h(PQUP6d$ +\]R6LZasZj\hh5fR"`VkN*D*SVKt^1n(lbPfcp&)2D:1/mVX2Zk]$umIDU_[Lnt93DSNFc1KfN=5GLZgjfRQt*2NT32l9sXh:frP'>'0%u@3I,+S^KiHqbZ'7FSTrZLb?gc,"WeXLl/2$Z4IbO +_BTGNFBMb&MCJS2&7)[!63Iu<,.;7;m'u7pEGi8'6?N+/gd4uAeuC8hKit`m+Y"En@_3VPDBY0<.16`0 +9%em?K&)c,6MGR!gj)Nao%\HfI*n]dBWYAMe$]2"GlMf[l5JKdM:;m'c.lm5eVE_#h*^[#Ml3/e:g]A% +Gd^B1HT-H\-_"m!Y7G0U7F&`jMb1F(@CmMq61r"E0p]hDQ4!^h;hqppEWZ0e",=L:[,QeZ=; +.+"0M[6't<2?B0=D1kts>"M#0?EbbR% +2NZ>`*K0aRiE=VeMVW='#Bh:I1g,<`+cAFlfXR9QdYf1EZ[hm2cndZmVUn&:G91FP%p&Tn1ONa-VaZ6? +)lmY,-):GLUij"d/?lBtotg"5ZrWWFDk`#-ohjG80=pllfPEJ6_.W/Z?>qF1F%68'VT#p(1REr@Zi4F+ +$uir(;72<']P4*9O6C))O$,D=U?;d4B$rJF&?YtWPKiTKhXTNI"P+Is8CDQ89J3Tt]"shdd4hqmTk%;=<7#"^Z]u_r2p4d +V4&c9[@@Y>Vk!I+n!gquD7%qG^V]m*N$$9Sc'u[`hm"i-lDleIG<4:fHY&B"M\'Nu6nA0[+LZ*Xd'alB +`cg]i=lVrHs/Q;]]8!^WBGM,%o@4(L"3&o4c"7duh"4M3%_c>MFt`."d(Q!NoPf<+Ms7Vt#&X897MX`g +4ad-ZdQQ2HU=taYb5-5H-6)mma;q]9)eF;tYB2Y][pk#d2d>TP^p+:IdOL,3qU5V\NGgS\Q+g`sP1>J& +"[(>QB$?#.a0XAF!Z9g?VXqB'kji,p(;>Z/a#uA=qK+.LR+IW= +-j!bdldt(tGk3nf*8AL4#QO)O,iGd6rT-9&*uOH`Fuue/2Xh(ILo]M5m?e-=L:``rmF_A$%pea7U-.!! +=4%F[;NEZlR=7Cula$/E@`"49h2W)Af"Nh:P%$B6\[rRA/i,CXlTI=$Z#41`n(0IY,"aR(jU3NgEKWFcfP-LXN7sp= +lXiPH'^H!>+Xu"$:I&VMX?_8;2!;:qbMdD,EY&EYljq(3GBBK\Fh +`\_"!_Cqd^]eXqb4-PC'U:'FA-g,_`/f%K\6"2JmjElX.I/`G1sK*79P=J_)!jrmfaZ"T8\ZE/8)^M@+0i;ntaI+qQ@C7-J4`:YZ6ACm5Zoch?J+j+`(^c60(kcS3]b +DhCR0U*@FFL)^J+V_c.X=4!B:TpaVt5K;U$&r0^fQr +U9DG;RQ[[ZC"-MA#!&,ePmTCsC4=-j#O'C!1[aMNq)F"n/$>PX8\6ck5?d61Iq%6n]i\9_'e?F.JKCQ# +P\hBL.>]8qSbYC0$9:aSZ1EZ?dJrgaWeg=`>PDpOa0a2#SH+CqF\C'ZNhQ?`^p1G\8*OHaG9/h`gDVoN +:(N<?[esXm\UE^cm=3NK<8Gc!X29q1=8FTJid9,=3:1-ah]?*\+gbg=-8rh0s1B)QL;3I`H,Hu` +C9q0Sl;=m_VY]$Sn)cU$B&4@hs(JbnnS0Bhmr0sV0M^UhG8ApiNhdON"l_]FYb=dTR,+p0s##2a5^J,I +e-,>2=8k&'=JpAr`=4WT?m@dI2(Kdp#S??3V+.L+A*onmI'oDDTUB;HojO?GmqMs\Y/"Tjn'[Dh-#gHj +hDR92d;'f'L9@u=+5Y@&o+Sk57VK/\=iC93&8QS=Cj&GK';eoZ0BNt?)pLL=3\CLe]!CF0@"=6N!``Cm +Y=-,^!rM/g;)Dr>%=Fr\=k]uoq8J?%`/\u3L5[aXIZafC=G0DiQ4)"fqQn@.L<\L37 +'=_,`-3uPX#Pp=CJt%b-)rfT(e`P\AedAOg6dHH0%)ri8@k$7AIZ+/OB5-DZ.P(%sNHFq%24P=A/bm:A +W8?Jpk4HKK=LK9o0Q"sV2/`GpY=:I++7uO`X3g"Od8ehIb7F`'?]M0fS(\?nS6=Q#B1l;$bDgk$Q('k> +_IDl1DE]$:o1(mN)F]Y)*Etd;U\V%1?1MK4?>/Y",n$+7)+7R=j%,A?--b5;]G9b]/2#W,kCE$C`dbc/ +#PRB],OA^!CtV[_dJb"PNo6:2kV8*9#eT[eEmMLI'AOUBAX2(dV0OOkKS0mZ"NZ!HIHq<"#Z2JV&WRE9 +#F_/sTVL&sCMC^A[=?a$`$9qFbYAVSZs![*4cb9Ta]!j*3l5$H8$;'S>"b+T*A\X4Xtp!NS+KOtb]5lc +Ap3nB]uXc=4$$sXnjYFiUtu%JRRd-P)l.qaiP0s,bV_OSWL,M4#:lO2"+6'1e"[=S +iR2r.4NnE8qhqbRn_&orL+`pVlipf-CgSkXSgCj?GlPB4Oo&#RX#9_&HV!#BDaS!]qaMWp&[O_u3tOOA +[GKJl*qGX4UWN7"8b)^.I"skFa5`[tWdf9%6>*FaIudiss1mG-NAAB7$s?`n4G0tQ3(XZuRSFl(8n;;S +qjlD%n*gY#j8&;_!hWl[nEbi047IMcmPc*Lk6k9,4F!U.J6uS'=L_219k=nT(".MYa[8T>4i61>#]ToP +f!N?oJerCR)E[GZ-@uJEmG#4JhrC'-$h&G9Sb1G]4!?_>Paq%-^r[QdisOb*FPtY0kl;G@.f$'p9F>*Z +fF["\8EuOjcoUd3SWso]eK/-al;_2l1YD8j`_Q^G70 +05$PWjc$N9jG3(T\V6e%-ZPsCZ_R]6OAljJJq>*B$]`6khW8E[6spqu1V*L8T0>^lmGd:F%uoO>FRaW: +%u>]2ITtjR+FcD$]m&JLr$j7)p.-Sl,k8m\"2&7?]iajts7a^590-P(I%IHpkBrLqVo+ +C8d0F6arHlRJOn3O`D@@&5&ji.d? +@C-btKFbm-?`p()b]7U[;78&u4j(6VgI6o;]$E!W-e9t$W"#9%(s\iqafB9+(-ZY?1DAX973p4U#0eO0 +HGFI5*cM]d+F3=W7f,s[qMi=0n7k`iLcCFmHSIWLF(2V2GjQ@fU0*nE*`\uKaeI-.Fo4X,7;(1Jpe^9n +7;\),R:P8&4c_`[iRd>QoS>iH-*;gQTESj:&Q/'LP#hWKaMF.TS0?H@IH+dk&\Ba>WMQJW`p9k +8,/>'C=n)Irhb7Q/%KjJEaqM3B2B'+Xh=3.I#f\q3R^;A]jX&7Pg=FjE"p\=gt<4`VK1gRI=9CNaHd-- +\MK_"_QSF`DAJYYqLK'j[EGk +,eL(d.BPf1b$c#&$`qg-$Bdf,!/GJ6^P&9Wi?(;91Ed"k!/:r;`!V>so +`5rF;al8gm\#ALG;*E.*>0]73"eNDtp"0LjC#r'Ri&+U>"_c:YdQ,R,ol*_EpoLh5555B>mKUGDnd5>C +0t^VHqo]$/-7VuMf.d="0+FEb/(DOp$]G+0.r3_hA_[XQ?5B`-(ac#7E\J6Hb +p5!M+:K97*n0:=JWM9MOi/(e0OZ&b7(b"efk77p32KF(a-CNQQfW05Of!*Kqb5qUbpC?O;q,KgHWCI%/ +_CddTECYYK4cOQ:-$8B*ZtnLU]Q/G&([ZSc^/t%WlBbAG5Mpf)f<2;BB.kFP7I.F*8nZD:o60#\p.>DlZuUKrI^o>^ZIND@jcXPZGDG^D9UhLtS_O#B@7Y!hG]M^E9.o>"'Rh +C?6<(lo/<4o$KmP8tZhGr7=0cDZk%GQ+7q2WEH#,#!.<3EP;-MB&F8>ns\$f]Uj<:fHDDf2XZ70X]9<1 +pVndbr_6A./ocf7j6`W3R)J4%h_ub/=WRG"qU&KmMbj`Y@^!e#dBFG?#9@nrQgff'f;)%MG>"Ul$mR0_ +B+KR?l?0[2glt6Ll&r1A?W^'Phhr^_1gP4&pUqX4,b$:qD6BXH@IY1ZN9uaP('n(ujqY5M=[t,l&]ZDQ +?n2D!`@Yak*:(/;i/!Ej7*.*1@XerV?H\4,]XJdR&/O=uSqUFUNE/l_&u?rSo1sBk.e;J^ZL$muh8IPP +U2#?rrk5h)gM6@*mTBfPY];p>X2H"q:5]j#9V^O=\d%m'B(=686^Nb@:: +'6+t]-sTp8hD&(1iNk+*hYN/IcMaP3g^m>/iJP&UPk))P?Tu(S,Oi.7eG0p7Jtr)#>g-'PDXhiS_Tm=7 +XgKVW_clZAU$$.Mm,C_TD>--cd>JUo@1VCQ62$qs:>p-LF_.,a[pZq%%q`J@5-)J`W=>sm^)@WLrGDA$ +q(M+0@V>oM>-'(@DW04ajU/^/8Ned!D38Rr?]a'PF[*Xr^YYINCS8("4i2$jrpG9f1R_$DJruX3F?%b\ +po=*+'_L,g*dYU!6]T%K8hEM+/_7-'CJ;ok6<3L\<(7&e-5=pJ,7a9L'A[?sUZX2V^OIVkf +[1]*+47>TGW-sW,;Qc,\rHqd;0->hQj+bk"4u;T+B]#2s0fruD])*.bQ[0/`*`)=!8OUaTZZ[bMl9Hl\ +G&KV`?,:0!Ea-nZVoO@]3OmYB;!S5ha).^VJOb8bLsMZj[8N4`NQ$oO?hje-XP3tX`kW$1\]e&lg)X&V +=JMIE=Z#N3r+7I--Z*#8/0=L%CFg`t'l'qY7@/("8[SkM8a9+4"TDfrV(`k@"2nnM+M>1+4j12%Ki[JY +"(HWuhn,h@n5Z0D_hi((!OoQdo^YXZ3#25L7r[[V`11h2ji)[=)c898GdD*A6\\9SYMY&q#a-fVU06rf +LX5ZEpL`NY_!fGtZUcRfihQ5e+jsUHs^F7bTco +eeW;Tl.AS7/]hgmDo+)uNb:no1R"HcigV9kii3MR[fm-13t(pAp1`L@-2YGJiQY`\Rf(s,G4a_U +2H*4%e$rY/:MFIe,?l<%O`rA0l+VfpR/mY]Pqj4VqioufjG=A)HYcZR:OMBZ$4G,>>n3pmCAPKXehaJG +)E+BgT%:,mD=ATNDsaK4"'J[B(AqlbnX\NT$`Y%WmM=Q?pKRrkr0&4%?mXm'h;f<-\XR10E'@p=b=eS*mKcO3[SZ7oOppiCd`cn`%;uJc(LniOcG5bOB6cs9JUgKKfMQ?`Zs.6'T_bJsMjdoc[LInXJU/_1EG;n8(PruSGf3&fop_3G`.OjWGA58^-7 +OsAJfoIN!&26'7b%84A.ctC,_Q$#)P2n4c13hf?3Il_*SH)nhe9YSt]jI?b03no%'iEU4CHK"8"@Q'1R +7LMq)XLXgBl*+I(!ZRq)U2i(l\NXF<[mH,?k?5'"k1LW^0=3FI4=2g4FL!f:Y#2j2oug4C'>Om[F]5LOW.-UPTq3-T`HY_U%&j[YfIaDeo=H +AL1@LhU#$ne\_<[8!'7M^P+2GoA&gQBoB[UV*g/`.k9M:;%t;0ni8&b4H#ZTp,h.n(36,@eM2>U;979t +A:Lekn']+3IX1F5Q)"NWKlhhd%Li[N3_t^10+d=+D=&F[*0_@fmpI7,=.EQ)SqpqCQ3;PHZK9f(G@Hft +(i)6p>l813i0a-u%U0TRD@^/,;(WP@J(rCs]gf.udfnR^948aVgL$p^QNM_XRs9E^;RS#iNomQm-r[;)+5Il +p;HY40B)iWjOoi0l?Z5C`e4N350l?"^e@t[ppbZT?TKt^'>EWY];jqui%U_#c-'IN>!@immI3ds=qAT- +j!a*uduWn7G5i`BJ!9DYBgOpQ$<4_m;aCZ/u?!oD*ZDa\:7YV3?FlQ6"$"_#NIH +b#`Ua;e,uUl*_ef/A1-+Q6s;`Fk(`Rd-/^a=bTe,dC%/bNH?nXm@:^PW%^P6c,ngnS!Nt:L-V4VgF +n.nte40EHrUq,^=cDW5#;q1tq)SNp#[?p14iYLXZd/NRUP-;3!eoja>CF#e$CQ'QSQ:!_6S4'L7_F*4>o +Yfbj@g33G-rMS1aBf41/(M5!a]YpU@jk1QW:@<3n&UUW/D\UNV-MIE1FALp8N1KGX>hQK(B#OW+XQgb^ +J^a[L9hMFiHfq-IUHLQtV-Iiu8h(Y=fbuS@hXF26F7J+6@YCrM6k;H/Bcm1ekpaSrE)uc4O%-166r64J +N1eYm5>@\%:!s_VYI1Q0qZ!bCT=lFr0CjGKh@8C?GY[dYqG6/VNHepjM1m>J(P?s^[eofC40&:&i[Y:0 +N;P.%En$1p>TI\Ca[L$"j,&'\YtZ7DB#DqGqjedT#lTTA5#el)>B(JQLn1:cjuPF`4-bECRdg(,+C83;VHEP.Ad=@T[Cbem&[&6o%i(u%l`SUCQVB$4!DTcgeDeE?ujKkEc& +R8mMelp_u_feIO0df-mCk^]V'L`>-/FZCXTcHuc0/#Za?&E[GmgNntG4C%l%"SG32:lNXdU,"6,,LeE] +\cOUA36iY";7kfai[>AH&SseY]FeTkRM^)ZY#JS0hEuoJmen[3J[`H#8(_[tm3uOQ<[[Io#:-1qE'\CI +=.8E8PmIqNr]g#9O6/Ncn%c$7G<0sV;Q[")Y8OMe/^^7kZU@RLCi\,l>>@ur9WXr62qn*lC\M\ +p9DUa\GaVf2::or:LCHu+3%u2Y#s7KZ@SEVZsa8?=OU#MZ4XnfWt9KjTJf5Xe.L\t4h#R6VU[NI%jDO" +eV[pl#d!3@*;B;\:?/Yaodr3M5s`Nf.[Xp^]P@]i1Od^i?MQ8BGI-4^A!-cM@V1K#4b5>$Ycu[AiAg,Aek[_>f2$n+3QOt8ZBe6E5XUB +\^KN<@'+YfmKh;E9tWFU9H5_,TT8be`HRXQi:>1jR2oB$_0NG`NcYfV(b"E)nLV4figqOK7>MO:g*QP/ +`PjSKA#mmZSkFK.q2Hpnc#<7m;LcIN;sL9 +ga,,P8AZ`4muFu$AA+K]6*WLe$?Bb9H$?l.%o`kSV+,rAm&P'/#2tF3223Ra6=LJV'TFUa*3l*,!>Y*: +A?kK`p&A:6YlYth1i)9J-B:=FPR"rrZkh`2]1*c?eTA[:hakN-eft&6^FZDUK(nu?hrJ/3=kh&Fe.8jd +e__GBrFn*:UM^?,g2R?idK(Yo7&@UPGG*k_;$ST@Jk"fSK73@)oQ05s4c5#p7m0HaWkYP#3?$Decq&.j +Pir*rELMGN>dL4KC,:[[Wmi0VWtdFc?aAg&^6`sOq,LH`6'#o#6M,J4KbPU<3Jet$B`jcpAL5P&/j)3E +pqa`'B\^RK3P)9>7Z7=+,U"L`6Z$/s1)fL'p8U\[ouhVGTH`!;#Nq(Z4QZ1J.&X&JU@a^s,a9:3GiMq- +DKDeop\GuVjET6\OcEOf-<6+*UJWO2WaGI,mj47oeYMCm?_?s"MW6BRG$uF4^[9STr`NC:0a7662NH-N +dRC>J[r./G-eu?ZAOOJo*[e!5#%`&JM-=o>cA6/0NPf('-hCu;A;Y/dZ-q3;JNE.FfEl&eNgi\n0i>gp +H?W%_5\2$8pQ$2o$[.-Vj$Hu9JTr:A`VWcWJ&)^?r8@(0322,40O!%(X-h-`9>Yhe33)JQC7m_D5iZlh +Xf*]a;*1DrniOR?Xh^*[g`Arn1-L#*N]/JF=L9,sog^M.4;UO^aBlcT-kJN\:58!2$,iB7p^`%A:?8V9 +)#P0CN#bHFNG,0,@>m4plJ$k.f-YgPTbHHQ$qK]\h.g(o#CB*Rm2WQH`CT.qS'q>@#7NQF+WJI!b=ipH +osG#U/(<&e,Krbg^+6IfMDB&kgD&2CGI+.AS25IbHZQS[]*VoIOo[/Sb*lfpIp9=l_7f9P6D$<<7Q\$] +U3nqYcVA/l"aY5iptFa;2Z8Hg8$tK=hSbfi)SYe[Z=SVdEb6tJ3BM5eSA0CRiqe37Qpl/Dgd[l(ea*Of +TYB$aX:\TRT1>D?46j0t$E;)rD_?(U(9%2%<2[?K+IqfN`m13R=RDh&,&"d'dF"A]H\A!iIBiimK\3b.n:&Z +D8,UGfdk:n.^6`U/3#EIdfD=*C;\nT*`ZEd#rO08ikbae"82^?s#_3^mo8JtXu8b]1$b;Kon+VKbg4;P +&U0):=uP6T]O/_OBXref9-14k"0p!FjM7HWahb^70s:h;]tQ7ftP$8@S-7h8Z$F>aCC2/5u9u +pfp[//O$f:XSWRlOlpZ7YN17+)GbZkK(jkHW8YNVRou!8+4e#H*O#mN.Dq(M$LZ5J:7L8Rlur1SgA.rN +,3XrCh5XaLI_inq,,YmuG/4C![Af/n=pOq_lpUX7-FHG?diB=3\LUKhDRZ4>b`uBud=Z`l#Lm'[#kT,Z +XYG`r58i7KPts*S$iP4k9Q_,G8ti$*rmmDX,1k7?_6\"_9R8rbXeJB_7@`9?T+t5Fd:?Q1G`kt9iKc6; +0?=CS==4QgU3oo3WJNiAa01'2jQ@;-1%@%qM7gk\ZVEGtkX$kbTEC>;90n;@8;W>068)*dkJ(R2GT*$[9;%=po/#Js(#-9;iC&L7hmiY6<2:QB=iZne>90cOhmVK +Z8YP'Wg5mAG-jR(R+G8._ha"ge<-#AJ0n)pgl;nYpqug';@:?Z8rb5K.QGbGO,uTL +\u0@UD9@[q3e!J.C*LU,RH'.7qH;tdf4`1H=;T@$p#;$5)_VOOb(G20qh'(f5Y6_Sr!f1np7Mfag`,HD +%rtd+N_e4sECq')DfmO0<+b7ZV*UGf>8sA?C_n*0jYNKFd(Of[DV^&jo/'JXS2_7-4Rh+cB*HZm/RDVn +q*:_M]JeQSj1E7Hmkj#;4]W$3&Z?-^nA)-7[E)B^i#]VA9[]aI=WI`KIlWrDci@h?fugSni93P#$IAjf +6'o/^s*iP&>T&Yuosnsf/I,:\Sc6]-&[Mdbf%W<^&MU=o!CIWiTNLphV[!]&_g0dg@p#LHiQ;i_nq^ELV*=rWX],I!2cZj)$R` +CVFi]8(D..e+$u!9BU?l))k;/:0Z_O)JcH,Gqe:CWB3Q.9t^?M^LM18)L^#sU!?=>4LtIGT(kD:kUGg9 +^%eiT:SXe'Li@JfRHjCQA5B^'D5iTlSYb)P7Yt16K_>_ZZ:4kdjUOMh8ddYRGn1P"#ECqEfr`EZCo+V& +^Z6t!I.,WX8:6\8BC$4C,Q#Zt2FkYbbE3jIrhRGoIdjQ;.HsA1G1p2qpBU_KUDb[-Bea%0YtfQL/_1jh +,q[];mSEF\lML]e$q7k4(@,7,7.^jG:Jm&Ga6TM>FNOY:edXM)Tr5J1o[73>Fq%Xl1`j#kMn/Cl0f\En +`B&Age7(bm@LrHO[IGG[_8WRr/oiQ;+OOVa7uQ4#`E[TY+Wk_,?,h,r(q-Kn2E3bJRd@-)/1oGNp63nH +ZSQ:"NdC/n`VRHoid5\22ROA9da_fTlTPqp0lM!0`VS"h2!-[i7F5KaGPtEt@3[![jhg(@=q$2/fh.9T +(=UBoZl"Z#8W38E4&K7@nV4'n@OMO//Z,#@TZ&t[$;E,'S*js1/Z+d6/bZGe6AtN5PliU]EH'Y6h4VaF +'"D,H;kcU:6(CJAU%mEn@Q96m>3ej6L,(;]Mh*1N`H49M/I%!TeREr?%j4X&WPtCEqpAja&(4oJRtMQp +g].p+pBAnQtB7)Ch53UW!iXb0l[_aX#CNk +k)4HX5cfJV41p3Qh3cM%[,AZ=N^.qRS1o[SXfo0q>iRq'LA897`nV"EbQ+JeI&01sn_D]8gM\V:(kESb +X8EI1Kqk4V(4I[le'>#KjFe8C#3-%!i +SLU@P*47*RcW8]sfui%;5=VZ6]bPtW:XF^Im:T6ck<0CZG7[RiB_#<^#1cAdi/UY'n_6/lM!sCUThgFk +DWm9]YOk)&#[sg`DJRYrF*XaqTO6$M^5BJcge%0(gfGB'DQEd\,<#2h!Y<^SPYF.LpILe%&\N*9LG+8H +7uY6ab:d_m"Q5IcK0tW)X`26=L[sl9nEM'd#GLkXnaiB4$9BmK6c>l-Jc.](msU*gbMc$NBAa$FB3!8% +b#LFQc7E(o^N&d>!]OMR^lrEs"h]9EaadZ--Z-X;X_'$FmA)XSI(!?e@p>D"!\MJKa@t?5;e3d,lEmWg ++A+<.bR_;-6\Ke*8'p^C@Z+@;j$e&$D&lq)gaHT:qbKVD>(f_B$;#/U.A!;eXKJMYk1Cs\Nc;_m[gf`> +beJcL+>)S:*P%_SSX)c_iT3#N`&0.oMeMXDBP@C!2`st4jbVZco\O"9*Rn.\R&oQbDDtCAF]5!R1I?/2 +s.dsOm#=OBjGSji@r_a7MBb$(8b'=Lk*,f61rNs355GU^6QE^,gieB!BRr',/l/UE?C-!E(?2\1I[+f. +g(+-\`c,FS5PEi8n6X#(J"Cigi;Ktl%h61u(>eHJUG2RQd'(lc(P$-Knc2q_^/&L%oI'4h<>sj@5[@l2^ +?%X3JDC1%If^$!*K[/!AP5fFh"u5kHFL4efn0To-ga6jA3_$X?na+*)`JJ?hJa^A]q,pek9DQlS=T(%# +BuDK;i")`=5oY_(G^:5Id;S=T(J`1(:*kj3MXmn.B\:_J03\M`i1%-gr%V"_2t0tL>8^2XtId/kndKb-T&*EVco519n-q7jl0)L +0P;?,L>8<<5-QY2jg,nO_"EgDPi='6,T`-!2)`O4!WV4mV@icu-3Te1oS,Ge@qM*J +KmB92:-\gR`1mKCQQcbWH\@XdV#Z^%$d+":]4@YF:%IJIuCpX3t>OI,/-^d\fkWf-FO"^<+W1uFl8bKZ2S)0558T`l@WO0YR*i;?pL/bde:&7#% +)'+(\>Jih*YJMB^*[+kXp(um.)@cBe)C`u*/feo"+Y"5N,q52eFtGF(g[rZ$#8MRRfVk=@YG)N#H8Hg& +7/]hscd@[TD\GT$i_BU'!W3#Vg12Q18`)6P?\lFrK-BN\'f2Ulnoic804n3k[BreHo#'k`e1+_q7ufZ/ +g-A477Ym4"i)!;?j^2s`c9O!P1T0Gi7GE*?G&0)I_N(dBklZ)@HSn\s?-WPH2m_:?pac$\p?TC,n)[VZ +q5QrlK9JZY.l\H^ZjIm:hM^*Uf1V"&=7sYmB@9D7V9dPf'dM6^mFQ\N-%2$mAWL0o#0"X0Wl(8)aScg$ +Ig)l5I"*/Tmaj*l@(lG4%#IofRc+q670l)N2Jt&)]r]-C<+(,ss6$$D%oK4B>!K<0I&DR(@b.gVd6dG, +_jSOG7mZTelr$]Y#X8$CSDFP_r@YB"&f%MRjtocm!?GE'q]FGtWW4B+%'bEm!blcsKSbH_0,u&c$.f2K +.Z:j.n>-SflZZ8X:=V#_lgn8.a4KfoYb^67*k>Y6o)0RmMjZ0pC4V/f6rWq(nL""HUXT>=-cckq44-(OhN1?%eS(Qi(+cZX*m#JT)+9O13dUXST +oiUJA+PD8&&Nnej0Da/\*d/V`"X.*/,:G>oO5]e'<.>?QnGLG_Ye`UM>6gn6-10WY['$fl$q,IjH(a2f +@*:mDrc3tq:*U8!rW?YSm?k=4p>3s<^qP3SS3;)`i`oU\"/k7f+Q:\Xh>ho9!s]!3j%Z1Uj6lq0*pO>G +fM6GSo>:N_Z_b#>@!Kf&@D(9;a6qVAqRa;dN&Qm>L-cj]_LM+e3%B,'27+*nVMDu(IZO^OLJUKsg*fKftrRYeol@cD<[olf:(V&,6q'6s^$Z +,1DcD*ofU/rm4hV/1,b5hgl=/\Qq\KV2TI;iIi:"IAJ`DK?f/aP*TET+o,N&l(R2l\aS^.e$I-!ddtX' +d45iN_CELZN![T/LG(o07a) +iLPI1-%@Z,?`8CW4`1G%W8rW3$%H=KFe1)OB*kUk&C4@O)G-L2"jh$J=Qb#mDsh,Ud51E`95:-?/@V\u74\eV)K1g$gCiq(QDp-l"VG-TYa\YtK( +oaa)#.Q%EBcKi&`_2Uku21Td`(mp^4*L&hT$nC68\&E)8U<@CBP_`CsWi4=n(TZm_[cb>s=u\,9iKl.: +ap?1ErhDUX-3N4[d@T$aT#b6r7MA9OIfr7M[IH>2^I;r$Hfqs;Z<>)DU)FY"6iu>\V$#\(G89X!7n8S/ +bgC_2HR<#JD]:64$d/Ai/@FF&d66..<314[hb*W_hdlpqQLK6(! +<8Z@`IVX,kL5J^b0()L;,?j-h`!BR<$<,q3f1IYPhNCk'=*")o%1OD$M;"bJ)=QEJ[A:BgmeH>*?%[>+ +H"E_]\o&P*kZ?AA`6m;[S\aCq2okHqjp+uX+4f-qS9mA(rpBGSo6c""T!oLL[mI?T;`FNH>*?Y"#kL+q +q&bFa[=Ag,K)u$kOk#KODU_T1]SrVGrqbWqsY+VC@VifC9b^N`KjP6E9it*M3qI_9n!tn +Pg0Od[MDpg[FeZoVg5%[?S/^pHH#X@IF%F1h8^I\C)t$D>&9O`Io%HkKGN=jZIE?qOe4sumDdP,(*cF' +QM>j7L)/O4=`QgfcshhuM^@X[#CEl2dXA;B44_i>@g9MTKFR2:BUa.s3_?/QcOX=6]!4;p`CQiT@_;3a +GjhfbQ(9beY85lXg4idimF5UW;NBBc)l^g/$YlqP?9P\+ha9!8dA[j#5qPR;U_Y3*W5[?IHUE^n7If[B`/U^O`*>)Xta>3oNRcsdu3C,'14Z!DLMEOk\'>)]h](?8Xt:Qa[9MllU9\>4l(;5)7A,Ne:5tW96\RmS4G5tLg"W:!aL-(XqjYu/b[Tr11rgqV>^Y5Q7U-3"5<*"h?%E3ui2:]p4HcorF4Wg>cPQP6g;-RY+>;2Eo-^2Rn;n,ro;HWHMJDJIJU?iS?n9" +CpF][Tufi"Y8fo#c=O11< +EEr$dMKYTbJa3.!in^qGaiND`YHD-lY9fqBa4[t59kqU:?cG:5u1UP/"q0\p?$1K'B=B +OF)GU7ik4CZ#8@&bWZk^WfGjCNOD9=92_M&]o\sejUOp_Cs_LDE5t"dl&Q]rQ1bo0BlhLe$/WiP0(QUC +%C]OkcR1EQFZ*F0$Gt,UNr05(d34"6F_g(jT^a`=o%ffQh]bju"Z0QbX6]?E&!C`7bu]%k4FCWJ2oD@Z +:E\:i+Xr5%eo9Uc)h6PGLAB]OS"K?'33LOJ26>!$>odK%7mjn@,K5WL%Cc?e_^0!9rV?XcH02J!mIGDo +lOC>=Ao!Y8dsu,R@Vi1:X'pFb`r13c9s([M\/.nbo56BnC;L0hL)UpJmhIID)t;9(CrMqq\35cJ0N-Nm +mTHr84^10=e?5fG1pepeZk%iTHblu"I@8ch3?+*bo_hS2a+58Vfna/Oc,M0EeV<[HRaZiWAur&NZ*@)l +&%-F9%d[c^qq;SZ$!LgDd^[Ef\*&ZgpVOuIr76a:mc]+$/9^,YZ.QnYbM)?m-Jqt-_H%_=K/cIE#EDW_ +\N&.5$*gg$dQ/ +\/=u=]"[4KDB[H0hH%e3Q)el=mj7WSk?TH\Rb8kOp?1$iEb6U:.V8/9K57t](EpRY84/NN=35_n#1u;4skU:@"\7eHHF(TLMTp9t.bMWM4_s6R9 +CU(VM,i;O0GM0X6F6P`.%scN]r((KBSa&B:3sTF)`O"s,[=.tYOfE`2XBL!O +Ft@r=BPjca7FllQlT +FQqbGFejZ&kb8^ACfd]1=F?pJ:@:Mu[>p;T%^'HX2glY+!.0$f?).6Hmk@3e5=R+AB]QMcToqAN'R]\B +*,W'\`6lF=61.8S7W;]$daQO[nZc-3_g+tjRbfkFEaF6E=b"+dO[]%[Ps9)t8/tO2pFq)R>DDfWh(l(8 +MG'Gas.>]Q9>AZ>4?8W!r,V^]Y=\bR4-SsW6XNZ;BYQAr:j`]=&:H^#Y17ASDp1lo\S$&!L&5Gho,:f9 +oY?F.oo)r=$0DHOBd5(0PKM6!\66:ZfM)6?;UJ7T?,>q0O4GnTquU>qdY[ZA?a)fBg"Ru']8]2 +q(LB>6V_+GUXa>k446Cgr +IH=-l!Nn\Ha9%>k(QBrT!+1`YE7*+?oq`>tlSf<&K0=k!>r+\(@_\P:=g#IJ"IVotUrcLD?O-#;Q&ZqI +e`GY.SC[fZ>;kmPU?qsVJ6PuYelK0+>37J`qR,uIlXrnM;#A\nQ&Nsj#lBur?.uoMjPGS3F8d*)'&m$: +D)Li_bb%$<`Fgt^/uc;;J$?:=0k2PgF->Bb,PE>/)foN9d>K[['G;D+4D'E<6#ikAne,dm%i.mXun# +I]!c=ni,.!k7:n)!J3rYk7]muaSPAuj]kuNA&!ACOc_fmjX@Rsra5I5E!pmANSrfZ$HZeCn(jKE`_.#j +#@et3=3b?omb&;Va-C6t,mm9i3@;c>ndd]pk%S&T07@ia8OaBu7nr5qqHl"T0YF8=:Rc`d15:lH1j)i1 +CrJS]';8L_HS]DX5XI2#F$S&_>UCa]DPQS'fmrrOEGJ,gX0=_%U[@esg>-hmjtk#CO0_OX4uWJ@eCD-^Nm)/.2&+4X1'dKi?VOQ]eDT_Yd +a9A$koPB_C-:I_(O&l7#A)?^ubO=X^=D$X`JeLW/SU/W5<$LfP+Qm^8UBQf.-<6gFn0i^ +b0G/Ud1OLV%O=(][(,4[hj!>_dZeB-`&rmDnsNQ'HESb@-YG)-3,h6c:-Xh]cr,HhSA$V$AWR@oP8.V8 +kgTc[b!$f[hu3A8^`6,Fq#l^EYmc(_=op^AlSoFg=G.E-F0^ +\k.Cmbd1-+'flUUjIuUGO1ZFm.fXp:@1tDqngDg^*!2NLP-EA45M] +N/ZFUp:t)&(%Q5H:2lSE"8!rs(:&)R:!1=]V$+fd`uH3**22+QihqI[Q!Y%hlD*gbK[XrI]W*X4:CQ$ +]u]d`F+-jS?Cl^B'%hKrQ2^AD!cUghoRMuX,L1)L7>63GCumtb.CM7T(6b-3gY+N +VG+)642'C3G@4_/5CF[I<^`]UQ_VbE@d-m":^M1SP/Znns!WADYS[MH*_M +dL#C5>hT^jsiA^4;?jFZ`RrK:9 +*`a\lX8A*+2\qbF.FSCPg<.#^hO(=U)roaJb.Gcn$ZBa?2^.YPIKt-Wl36`re3i6Z#IkpK4o0LupnntO;k)jlJEWp4fGrOF1 +pg3m(rH`D)04m94Vap,UIq.B$UZp8Sb,>*36RPUSc+?OSG04gV1^.'"&q'?Wmk`2ckn\mm^Ih))9QK5Z`jiSfb(U +^PH-V34)e^csg3a:m)=^C9b]#4-8>B/Va1dX2U0E,Ai)2$gB,$C0W=p\u6?h*n"Mjda_gJ]?ttfG9\\o +]UGn?OEYcR(u)%/OEVp$`p]]=@kXe"OD?%'KtNnU`Afod#"M4BOY3WP82Y-:jP<@b+n+Q.1$%.]M]qOY +=q#[8=,VY,V8]r"W5[V9oB+k6/X@7/I"56T=(`=&tLuMk1*q^=2=+9GrK4fDp>'kesGrF`g"\5L!^l]E;1u_CZjk5TFHd*WPg4uH\aI>NQc/jU1Y3F0QBpXU`\>1I2nYU?uDT:g?(26)%K=m[i +Q+de2kE\'q#$?.0@oF^Kp8GWL2e+Y%B^.,296iJC8q/Vb7P!jMqbj$11H(HH.8QP[D[\gYo5:^ZG-n\75gaZEDQKVMPk&^n;arV.nc#AtRqkqHQUWkZ&T,ZYj3>1RXI,LT1f2`oP963: +"!&B4qHmXaTb32gAc4>I)&ABHbk0ElN3@E8a2i'fbal9U[."pGb\B_n97`F]*\-4`%*"JFBEQ.4(#nW$ +5lECu!!%Kr7bOTQ9=ELYY,Dbmci;!ge,8'Pi;7nqfARAZgi<,hneWNkjd=`>b!O>B/IqS_3?->kN8Hp33Ncc:bZT4dcp=p$GJoi"cZm0raE&lA!@;`>5Ia>V`48#T +W`:9Hn^b\n!Q8FdcZTl!D,[]^Lu^JFE)iF;`=3H;!CsP27>P0oaN,_.`/QmgME)e/))SX@d,H7Oh/*&UEeFm-TE_;&,5VW0s(O,Un3'%p@62:jH'' +kGHIc,JQY^c0B/Bb\O`rp\S:>9?'59Sf+YkGscH'5JQ@NNBG6"^6.ThVEraho34VSUIogED1AY^gp+:@ +7@oR>PMha5ZMC?lE9rc'4e@*e7\5Z0NfaPiXLsJ"h@"4:Dr`oJQsUT#MM(>8\MNPqXRJq5DhRQ +>0HN\g`'i^\NOITU^ZQUTNe?XTrU,0u$b'(#Gu'RB]);>u;k,LVF-@O?e:$QBWq"WsDrMTD4F5LkgEq[Rb.j"4UHU]eU7Of@U^6.SM-#m`] +0:L#17f,dtD7$M?NBA9fq1FL5^=ib\f\*;k\t.#i5c!Cg>%O>8)gVFq\$?P;7\47R.P6'gLs@:k$E`XD +ZJP=Z;e-c[C7V`YNkXD=[']J;r$e1HZfd\8f6^6gYNJSkNun/3Olu.DGU(OO0NPGoFl1:3oX?V_f`i\" +gZ/*;jEZ&8(gii97H]6f99JE,YJ^_-X2eC.Z?>H!,1!C7:-dmN0iFi@T5V`8_m1A&jLJLkp6A1Z(.)18 +qt4bRZMZZT1RU07h&$6NaE(H(MEK4+(.On-Ht'0;kI,aeniT'AN',G;p@2sjTGPiX4_p!6#7j6kgQ540 +/Nq8jRi?Wj*@kO]m$=r$B^^j]lHZTarILi;XY66"cH&4(q!F&'cP&WS?XXNqQE+qP.>E08N&d3#MJ-/g +`lj?(:QI.RLU0u%lJR@>%s?"Hi-t''`"C0R(cp9ID]H#>q(mb#eM^p!0am*_.pLW^D'\l$01DK(9T>1t +H/ch'@C7:k>4ZA;8+BaY@rLEglM`=)g_spa/#Lsd4)4Fo,Gqe^dC[i((jm!YT$;P.,Ls8qNWkb+P;ICRqc]0CUfb-$up7;jOniY5(a[&^1a4.[V5G.M_0XN($ogjLH#H#"0^uV>$=NQ*JAhB+$S@phCCVCGk-?\`;ci5$C+. +32PKDOlt;[08@Phg`N7]>jKW6&?6U:HA$4tq;(?ZB(j!tFsCa=YZF/UI>K]1M:tD/@M7FT4QlME,BY/Z +q(1VFhb/77pL8nGh[LcPN>^3$e2>g;,2I;-9H&E9aE(T3XN:!Q['HR'KkAYVp=36Z_um4kaV.sm-iP!b +FEHP&hoKm%i>['fP=VC4I;$"O'r;Dif8C?\gN9`LUXX;0>Om,eW;.Irq'5Icmm)-oC\$(#MJk3;&Wu7d +\Nt#K;*J1cgPn<;L)J$8!$Zjg8*fb>7%X:&F5GQ))gOUUeg)HcLWPHantd+B/B1_/jS>/\V(Ve(EZ.VN +HI3[WNrInVo,k'h$1tu>INFdnCU;(C7\9L6gs)Y1bm@2G#I?#mca)n,Si\D457d$8nFN;Z,eXH/IPm1$ +eYuqIFNR?Y$"i8/:>71j-R6_Tq>EdShm8n'^\G@%k;oH,)3$og3D$20iBSs&:-TSpSJ$U32c+<9g=i(LT+fQ);"OD\nis7L3q+16+D9AP,(EID5MQ/6bM=X9K[:j]!,=\r3J^1oa6B0ecLN^`ar') +la*?&'4X!X;"$_q[Q^f*]U6HmFIhU.&V(S*7r'>1J_5b1I4a75meFh#><#;qoL"Ih$O@c,el]Gtg$pQ> +3q2K]OSK=C=lLOj)/fQ]r\-rlZN^lVP$&'p,#'*&O1DgmpkL[&@uAo&W8cq6VgH>if>KX0TQj:q2c24f +0cd_AXlfhE06Qo]TZ3#PJ_qNUrYViaE=HR_JMM2?3fZBl3I^/J+'J3.\bL"!"onNf&5(l@mnBAlW#O+B +D_(=AE5@lFat.[!WpCFPnq$XNpWUL*kf[.QL@6a&0T6s4,S.q +EJ2M8'NX8q-Uq:*j)q*HYj0F6o`]Uqph]9SV\-%R#5Xa^#M$e+.ot_7dFq&4Vo..hgU*s?X#&>W`d8NQ +kDu5.hNns*:6lY^pDc,NI%n$WTM!%8/`Q7sK*So42c0[bRh4^+hOCWW"(C%5T@LTVH/BPGG_&o>Gi>ul +C)-\!i12dV_Z`P7TIJ`+ruo?j(-G(1Gn)M0Yi&U/7b&)4_9U9(rd +c?2=T*ljQ/Q.!^I9Te@ETJ3an+[9&%7p9LT^Z)QJjl$5$P%mqQ=U;Kr5!8bZ>6';jnK$o-fWmTAOGKGg +'lR9;@9uN;Qid_NoTC%A^KKO>YJ\hGiBao8AF1H +%61A6$(n`]q#_/"UBRV0RGlQ6&nms\Oh)P`\jS&kDBXUB^b",i/=sSm*Dp^-r/:V7=r)AV5]VOrgsDc/ +&p&]_;X_AB$nGdRRj;QX'I4?'B3a[Lb0DD_r)!)X^'/)/)qdecU80>Z;V&_=($$Ed +ML473U?!o)&E_UfX+$:`UCA[>p7tMTmG/#nO4I<<'Y2OC5&[JpIj%:93?<8VrW\,M[S'GkJ0-l:1;GV[ +P:dfEm!=""=jfL_X'go_`.nJ$l>ZZ/2/:-Z+`a#`1H&JW]!aNRhg^c!0$$q4V +cMb,VpK+L+=Qgjm-D^[ApeU,L^Fp(7isLkD#sjE"Pqt:%^qSYAG7%3b1cX?F8/ZbY.lH>eSYk6Gb,cal +)!_TVh/0;4Ba]ruG3)'#lGE*/5lL$&4!/PNRBoQO>i/aI/te3MmQ/]E@E1>7 +T'76nMW39Q^lG?NK?G'I^P*S#CJF=qO0uEnk!#@p:kN[A=dAp1puoZsQa;Gf>,0G:>D>-dW7g7AQ]uX9 +A6ZU??`*cpe9u9eR6%(-QD7+&2:X('B>S8@kdVHM--6QP+_OJY?dMJ1Iqq4`K[ZoPlRBTs,%0a#pQl9! +2;_%ecEAki)geq8/$co/FPpi@CsEm^`[X\DCs\DG8t4)@&X;=#mg&lCUU[n2`@cB3P$X-4p>3t8EdCSV$^]b64Dl[Y.+_e4;YgT>dG(U!M(>B;H)Hps$b_CXId0Zh\e7*dAmZA:>9,8k]fNsYXcsh?21sf]YJd8*j[V<5>>3lKRSU,#]=Lljh +Hbc(^.l`,aCj3Q/>3q#Ze=Eb]4<=-k(>B927TsUu.;roT:ILbQ`HK3Q;-Id;aE_GRXUJmJO*)+>Cest! +>3t8,[L'N2MuAT_cUWohCo-i^\K%THp4+-F(3@XJ\$_1E@_8O>EKObtU__]Jq7d/LrR#)d6XS@(6q],? +S+IE%QuhZ/Ee-=]/[cUA1X]_SFFhXrZ'cCD;*S%b2/&"8:J^?qj&>(J"*6]4I!Yn%g_lSiE]CeB)XG +d^j'V8,pSK2r+`4Pm[8!]Xn0kCN2n'6QIp:HLT[lJ`qF\-_0fCqJ&*VcJYDFV9^+#f,d`!UIf?nJ_C^Q +ZWmTKV@CE$dJa$ +3;[O5.GAFH<*2cB[tuWJr;$8/4A_7=_62V>L1CdK$cF&FAo0oH7P;M<#Ln`;WZ5#b)af@M"++^5@L$p+ +c>t#rHiRs\*:7`,>3Yk^Ttr?-]b/Q+Nig'ugi`QhO,q!8=8i=S3qlB$>3-oqJZ+]?eN;XdC)t?Q>%cg' +cm3H2W]<`9'>;ouI2^lOSNu!1^b^@_4oipu3Egnb0/XQ(k9aj-X.0WF-/8`L\?D?W**=S:3[#`rh\/+C +4&Iot=m,s(b!XL;Klnb"B_rD1bu5q^EQ;eXpFgu;%c(^3:?JP(0!qkc4/20C;6[[ZMOmo\Nk$Ac(9QA% +n,=NsI$V:-YP_teK,3pP?CgVfJNC[bH1V@X;0PbPnAj"mmFZ):[:nt"(t:hC=bj]"$[3P0eDZ3i?Q4PW +XL,-C.m2pq7B=)Y4uT!11sD%kHG=;el[kuB/gmZ$Bb0WZ'/^*118&4<%)_TQR]RFkO_#J2WRpQ\I-k=d +gQ#LUK"f`]NHA#)4cfae#mEdPfVr&OIn3_c^Fkl1:)UV0h,h=5Xm3:CidMom=$=8np%3.Ye +Fo7Q;:\q/fs,`Ct4A+pQ-=)-eQX[FHpa26VOX'\92gL6$J=)gW?\V;K+OZahJM%$EgsBErEEUiIED+J. +Gr/80U(?1Yfu23!Hbcrq^YIp$f.(\hNNr"!"`pi;)X(Qk]eM]td+Z8I%@4kEQbFJ%e"Ao!3hZI'Ci0Oo*ino6a@I*]m;YLhEo\n/9/I +?c[crC5OW\d'-OeFqo-(RO/J3)6fr7^[^&2NTGsXXGX2ZS$fDAhQE.ao&5XBcL\DfQ]i0n,W/dq4IYelG:O8^Ag\k +b43iOI3VXGT843[7hI0T8\c3`P/!s4TC)XVj$hq"H+VP`X9*`+p=J2Q/U+-XGRdP5nmNY%C-4CH42t3pg3T#GKBg*$2PU.lfSL7Rd^a`/5A]= +LX,L(%p>,>3SK6 +0=fs2]hQ5S+*$M#VtY$2@NRYNb.UKI-:\I;Sb58?_FFI&@n)l&Mq12Ob6NoLi!98fVKc$c@cEl9Ze4WJ +:',)#OO%sEmQCK*R;H,I;,tW.(gAu^P%W/]oOf.8j(r_]f4VJIPHD/c>(:#b\Jm/7e]Bi`,6LIS"5Q$7 +@+%oI]P(A0lSp*#^B79kNUN)s0cu-UksfKZj$LDQs1njN]Q*.P4KP7lI*5Omn)9VAJk?Da(315+3l-Y] +'?$F^616FZfs:=[eugq8s.$P/'rMo'):D@clM`@/Z`MI6G[`mY7^R4)1Ja[(F/+3ZCo%pWXZZ>]rC+Eb +=ff]nd#)r[F=90T-RVg?7?!udg&u1\mgFR)Rq#s(f>,I?HJBJ\ll,.4brU%Q=M5*@bb0,b6C8-LOJ,\R +J'=Cu6X)EdX5*Gm=I\8aM3Ykh#Pk(O]bS3;1,:Emg0,*WT`:6c"8rZ81:46#*tg95qnHK#_4uX&4SYqh +8G;Uf(aRdm#5L#>QX"$7eJ^odTu[%]4K%@7FQ$q57;Kkh.l_^Acm(-KQ!^MXa+^r[`6VH@$%D#<+9(2h +p;,YA7>-]T/$7_ +?HrtJ0`&:ihiZrMIE.?[iDaiQ.=JJ)]`!]3hgH2_(oo+!3X>UCOOR]&`sApGWs)sK*G==r!_$@cUIbh4 +?_Jdi=eH9R!Yq5'4I^MNH$BB@^&LC=YTaRbM(":41K!j"p'R$IN1^ep&&%_1m&>9aYV$Q"M3G4m/s^Cah!^*ka3cF\g41P((9Y1p2n^<.=8R^5hSO)]I8+fpkkh_QZ^6]FCrQNG +?&/_Es7/o&@Y#kBoJe:=]MgSUF7:c_a`F[Q/,!>1\Z>G(-,lF*?h>*=19JV^rrhK0^3H\k\o=2D>'JNq +i-+W$o'@rS%"=<$5=Ze"SfRi/EZ&%0&^NmuGrlQ9B\i8K\>;GMDOYlID'(1j0SR7D1FD)u.)D2*J[dV- +keb#G"XSn83p=qD*kJ;Xs'*Dd8L8-A_!?8as-Jjh*W63J+]Gj" +M/$FL-;YG7B.JH^I\An\03pL,9UphBDfQkE(t#R8h)SqD03@r"R:-1fF$I%Rhm?JqT;A*,\/&Je\4-1t +DB^GsUE-G?-J[;;rbnC?`+\btKsSa>j`]f"\bP1Z`gfXuk-e<)fVF`!d4A-"c>^jilR[FFJY5qCXu]%t +Nm!9ATcFieIXb7Foa:Nj/8J3Hk2VlU5Ml!'quG/]k3fDu42gcS%T5qqa\cL9I1ucg;-'>k5dYFCW>"Z#Ma`&ne7'0a6S1cl>3t70f$Il_a9>R"*Ek!kBX*IZkWg^8G[2mj +\knV/u8In;4m2kS'92g&\FZ+Ba(C9`)`D5bG+:+]MOG,WA>)l^g/ +$YlrX?9K#9eAh. +/J^4m;N"OGX41TYZ422nUmX7lA$6[.]\h:\[9,<#QWgI/Ile^#U)'fLpT.VBj_?Mj@YZKZKiJ.?>V!?- +Zmc6O?2H!T+EL`b2kq)e!b7dIQ2K&KFb&*--r!_lAPVQ-oc.d!@EUm+r,.8@-+3tSM/e$Ita@;'4Q?Faa*hqIqV\nuJiIH'4Krr^;6D3K-5n8]`. +gZ@JWM/0f"Did$).*'F99jA>m]8:;-l,LCDa#@[_1sQ+"l34*mn_*cd8h*lc,^P,[Dp<*N*bq6/_FQcU +Jn?Z31ic:A=#NliV0H&7A$!&gZsNS61-N66kRYE+N@W9SS?mRQp5O-:n(ODM^?HP+-^O3"`8OO@0^dP8 +KTiP;JIE0t([;L63`C@dI`QT$*H<_6DMSX5+U'5s)*(7+>ed:Ol&T4fB(u7s`qRo!oMjb0_@V'!@W(\[UtV&>1' +bNe8:kZ]iDd$jct%q3T6$,[JJ/lI(EfUNKiKT1CJLBHOeRRo'(>^B0CJ\uLc.qo=g`Q7])!G-BeZr6\,T +CVTLQ,[fOm;9G:mKk3c5OW/U)okgA27n:/tdc"m6[a@_%]7-E6B,bbUd(=7TVnPd&bTjLm7^+M&QM%Pk9K9=C>NuTcZtL[]g,\ZZ-2@blYmBb[GsF2&&u)\ +(X;e?]98L's4=f/[iZYc4e2GSPJ2lEhtFEl+#1s(!EW2:^XMp_aW(-15,`JTLC=HJqL*k*aD(@A?VUEu +rN:3Ua[rIHc^a04E@ms.:4gD*/T>,f,38?S<64egP2QX=C=3<3^B^;ap9jFb#?omKJ_@g: +m=EsH)h$W,D\(o-@1TI>HTlcFHqt=tEDAJd=RY)O:IGul\%@=eHkkf;kqd7uK+i\Cu:=8*air +5b;'+UEH8*MYBTn:J2bH1*@/CR.),?"ijT"R$a[De[ +Ve`=jMWuhtZT1'[6^2VPi/rD*7*[g`*%b5\2,Me3EkM?F"03j(>Mt76@l+;Z)BgSjL?<4P>E<*8Oc_E7 +&L#_^r7O&Scdq$1GS:YGMg?O0K$'f`-"trXiscJ^5ZYt4'A2oDHH#5-/0pH_-r"eL_Es*b41R*j'(g8$ +6uGemq@E-LJV1^&o*oU/)!rAiMQq2B[X],4]@kfdL&LCcd)[JLDIHkO/+1E]?FF@',9iHUj;jOC`mG&LC_>el+k7Ir>JKca2., +Euk\2X_=i4<"j;pJDZ#)ZK41E[-bWdU3][nrF[>VSL+gd*CV%\CYt(ib"j:.3$SB>:aTj,:)HhXGf%=: +<%eb:mdY+*IZ0)6$i\$PFE1k!<1;/Ue?@T8[:4;;H;rE>eu4H'*F_Mn*ubqd.cu#Wp.`g#m,470md.jn +V,dZtbe):me@(aKNtsA7I`"L<3EI1=kUmd69QX;jKgIRRbbmqeWkMc98BV$dVHqZ)H#rh3mk"`=O,F:4T=<`cEoYe +ZZW,#@H=2;8hL:1FfFpJmAB@jZ+A?$WCGC9l@B`9,$heeeW!`I7n2U5[(#PkTWCG%,>)BFbp$=scU,(5 +(*,#O>t@)6W^G.u]rS_HT`;4$F'$ptf8X`5:GHcqhCkQIa2a$Hf*[Oj2(i7m^WJokh3@ne-?6D:O0nOX +,R?4l#]NeP.D4\UQWD7.E(_i':RUC]8A+q"9S?T0.rCaB+r]iC22p$Xn=?i=7\JR=)e..!JNTjRX)M;V)R)cqmQkp^Um!UcrAQ$rn_/,V;K0bc,;I13DR=+?8[^Xn>C3&JM+YBAC.)?3Hj"pe4f.X% +L7[/I)Fm5Ub7=qN%%t5\f#13C:[4nS'YR#_XN2nj^!90.]QuO%ak2rSDVF,boms6oebBKq52'^P->h%3 +KV&mlF0p;#`]jFT)kN>#6%m8g#NbiFQV)D\:\jg8,\lmYPU*83s2N.,c*b+!gPZXQoVD91e_D;QLue5g +qsneIe^=ZnH?Mj:b^-PMgt9l'mG;O/0](+%)J!j->)SrX ++6;tJPqSICa3$UbM2H>kRBf\jY!,pBH#rn[@OK>V3JSJsj'HFr8VoPPec's",B_?o5%%Lh;[9G0QItY' +R5aL*W:7slI9O:L;+7KEc>cn.W5q#O+.4&Who.>UNn)pW3%?L;/5E^hJYr2((LtaA%n.P(pdhFGf%;/snO]+KD0 +$P_"bR?mMG`tBSeIgE%?(9C:B2uU+R3_cW1t]c'1^8kU1gF,3aT651W\#Y^RNieCt*nQ6mL$< +# +^Dl07dL4O/^(\7Ckfr$Mjs>,ph"F?16ojDLB>ke5jgg5jI-]&dp$*;i33:>o0JqX8:35L_b%^[.D9d\j +csMeL'E/p_;O"r^#"ulIs,cAu%MU3D<%V +?!_Njs0.M$9ec$RT/ZUC1hZWh$'U2\dlE]MhE:#Grk9ptDJPNTTNF/+jfcG#j2];srM4UEIrdNP3$,Rl +$ug*2jbFl%%I5cnoZ3JtjC+bVNNG@@4CVS:4rZIS6(P`FlctNg%25>hZa3cYZsF_u;BFS]P+d\[:[#j\ +k-I(f(/J\*4%49ZTtBk3TBV^PMhebq)kN.>M&?t9:ZFAPj*DlTRBIpg03$/Alpiu(DN7]BQgZ^8k?3%! +hCWtHF.t\];c.2s?]hXbpcU`__.&&$"rF7pW!"*Il&!;qS%h +=8m^dIFP":e,BI+FNM,gJ)ZOimOtfh^LG6.5K6Lt-@*H_5JI97U?*d@`?c"ofUR&!r%.Hc\`_ejVeXYa +-#Tjmk1CP-diGEF]>Y]],g#KQS]V8%7WIJc%@$!jIH`n#Ne-s)P%3F6AOH;`C]JB1.oA45S(A +k\]J:B'f#c?h:Lh;pA2[4kpo[k-TI&>CNN[PjgrWiEnS0S0X`^7-11ccOm-tP5WQK7pRWJ_*Yi:nN+-? +GZTsl<$s-<*.B3)pPHdXXcdN2^S"qCku!oq59)lP0C@r&m&;IO%;`O6I+/d4k3u5=0>n6nO;>93= +l]"kjk@.FBg: +UI*4QSi^cY1R4$fCG*<$R!3NE\A$5HUU!fVLK=q`bMcqF2nfs5K^L:9eA6E5iU_5f5$)HW!/HV\.1_1u +3"L**W4fX`iDk6lEqlTI2U13A7.5"'+7bsD%_i\^LVr#?Tk[9iI7#$FmXJ)N]oL^U)0e4^UPHNnu)XR6rpq\)`-Uic.+DjIGF +MLHM&5`/B[]jG1OO'^/_noqIdD^7OY8]\l:p=(5/`EMlS:bK3>_;c%AO3anX]U_tg.mN4^b],Q=Kg-G?0DTQO:bWg.F=8Y+3?[:=F +"[?3;3JnOEp>Qq6pN-?^Ss5T>^rO#tq-o&_0?4?&BZs0>/4Fm>5o![K.M(ZQk(sSib7U>5Z%\d-cH?GQ +-5_(m'6]K)a>s\<&+H5mNO[Sc"M_.+j:fd:.If?sqNVn98N.T'a&PWi8g%7^G(%ISOeZuGbN`(+G1\<, +W81J5G;?eo<*7>5Ck+Lg4fDs;k/CuFK3?[Ro^f4S_qR=S_rcqb*RsUK:UResH*6H4*1V/CEpar]aN?OR +a6d7JGqauiY7B]k*3+-YV7!n%ZqR88)__k(kRNK4coFV-e.*"]Am!rD7%N[79!88Z/HG +K,E9o$dVhSltGe7m?p@a4+H;*Ro4X4Te\d5('P5R!]mKY#:AI&A*Q/ +BgP%M!`+VU\Hh@jnLFc=fX3;(nX8h'\Z&jDrucKRnR=s@mp/&"@V)JA==Rr-OU)M:\h:<@NO)UUhU5^m +=R.<+3p'LWBmuW%b,S4uMpt!QVo2c*H]f:c4raZ\&ImpNU3Feb[sg/N\J_T)Hc>6-T.OHUA;-58Y2cRtk1)/KM +N"/HK`#+R^Ci-.RKP4-qj%YgrmF=Kg"ML;!TtHjX[1[-rle&bB%+d1_+TX9N_aTKrqh/T#Zd2sFXB\VW +nI!cP;1r%Qp0Yp]F_S%2[e;H9]t#I5mF+qRr.1feCKrGa3bb'Gf;EZ?6]W8%3X\a"qTXIWWLQa@cb@`0 +$9I,-e?N(tDG]#eMS:'[[Uc!bjJrB[/a>9E.r3/^b/;A8'Dkj;o5\=o#EAFji4"04gZciN4SnSq7imf? +7Vb/+A;')(3Z_#Pc=MsE878_eX&'.FjsG#s1cJI%pOc7,3tLnE$'N^TL%sT_k&q[6Dor4W9]8ciRD3d:s)[kHuEo1Xg!qADiJ5Oi83'h[c_YpR^F&9Ws3e+'BU@ +51%Td2t/"qY68c(hsKSla*QpfGDe2mj>i4Df8m=bere1jBIGo_U"31Rqc;`Zb8FtKj"ZHU';e@o_40fJ +_^TP?:5mnBZ?dqnQ'4&5G%@.hUsC:'9XaoUNj +Xdhb=.h36mG@!DL9SN^KQ`;'3?T=/6gi=Jlo/SEA]C6.C+rfHOL&Q +MY[Vpn#K/HnRb9dB+U]AbY6H",P=fBZUH%[$*E@H_qU57-1ZsUZIU'RkuRf#S\4%t/]u5>b3\M(8L.@m +LKTXrB6I#r=8M-h;^Z,Ah'tKNn`E>8EdTbV]<$UIG@V&^h7Gp>\a.4j[>=#&X0I]s>af`SF1cCG1&AEm +f*bR*2S-A%X7=u%m$-oM`]iA8.[D*7+"c%]n*5r4+j\9oV(M/dXK*:gaL0R#e[g7nTV>eAaiDY*c2:>tT7"]: +-8a1<,G&Rq/rYn3>.Jl2<4"g.[T0-oC:He6OkH(_4kmQ>YPfXYZ\&mYQ=ie\E^.X^qo5=,j=f+MID8Xi +*N7XQS*];4b8E@3hS$2;S/XN!WXRu+d<$Ja;-pk0H1l:.HLa6=A2PuU>B^lX=r,*UK'ZI_7''T+SoJY1/I:26YMk.-LI3-0Ut_Hn#PL^eK/^7)9U=jCFf!XI3;*Zb +5IoMD8muMM\PIGS7pk/Hgp'pH:&ETAa#gdU+.Z[Z3Nb\-^\VE];MF;4oCi;l)6GTHS?D4F6l%.k#%GkU +\QA%XI2U*9CL>T;,'G?8@dj1gM&?T(Wk<2.aN_ea09"Fq4#$5fd"[HcXk^PEK3@P0RIUl(rRB/#lJR"9 +pB4[[P^S?>-Sc2-H8>(Pdid0kqn&EV3$aV8)R>cbXD"Ai6Wq/M&R?;!GR:FZZ7R@IkAW)ZO0)U,PX82]]fsC^/cV-4Tc-/%cG[k"#3P.q* +:2VD<$8\/oOEft(Gd!00/8Ta]dU,5'IkD_e8utV\H/IWT#iFcUPs3=3\tuuVEa?ZiM&dZ"9@)U"Q*/g, +XHN0h=f%n\7V1)L9G6Y8[O%mS%FBc&BfEJX[7#I]Ta+-d.Q6>Rc;AHY;LZV) +)*>LcfigCn8]R;Ek6%Mcd,!kFpg5?m3W%[AIt"O8\Upn`nU?s/K>_Lpd)d2Z$pT#Fb3;9+*1]4e\kQK< +]j;4!c8N)M)t(.]:]lDO>Ol2,+1C<&U5NjEp!\B"d81?(j$Y.H1(3Cin?>:e:YnlcYZS*JSl;chG^D/1 +jb;!\a#%]WEXPflY"&+O0M?F`45+_eO7M:Y&&Fo[nj.nehIgH7kX@)#8Ik4-`bbWp&YU%5pMQ]:Kr^ZA +ZT8U`pDA7KB"Ju?!tY2[`iR$&B3ZrD'oDGV:&JJ&m_jP#b0Ps;@(DXMpI]1tXRZ"ObC7PP=k&a,jn)/C +5NE['?M:+g@RYBkmDc'!AR_d:j/LB>LO=';qdj6fcYK\:A?.cb_,HjI`RQTSc+Oj_?JU`EI%l_A.%QsN +3KsclpXXCmcZ>2ML-@[`7e`)(9(%Qe0=mAAVL,@!''46kMpi_`,&]?^ercRQhT@t)JaLJ-A5q_gF6q\1'm(7Fm6DQ`O1(Smthos>5d/PEs-rOdVOd*g7JD4K(h8g!I,*Hi-R +c*4J7%,38hKt$C%XHmAin')e@^3Y4]k\O"^e9Dn +Bksni](!ksSq5%3=fbVZlk&NZIrFQ;oL?`hB,d/3F)MhX7OrWR)*20EQ[OmE/n,"8Np&fF8'gC?[:%Uo +i_+:7]>cr^F&`h!9RaGg6.`iBN+o%]lr0#=0)`D`0/E6C.aOZ4#MID7^#%"`]>T.GR?Dhuf>sOY,cbC6 +[cLY%MGE5[YotXe@3auObU;VmdXFVde10/+d9ecj&<.+CK&g'De;Q;,4M;Ko,XuN*AUbeLKPpB1QBEr1 +m.q>fVUT_#&\n0E:j&08hpJ!*`OcUYgc&98rkYR<6GDI8L=X%-5M.fr9WUeXGpI!=b=Gn"K4@Ks,1oSJ +r%$o+IsXYpak4,/3lcGZnAsiQ3*`kHJJdDr/Ni7#r\u$X/mrI)s][=9,gN.GZ(U^ +Tsl7.nqX^KlMgVKB]CYg[C3W_KDFWF9P)oA$GmG!+sE$n+pPpX*`]^\"cLYT()7K6o8#AFHcB8m8)>RkgduFQ.i-V*O;n+O=lLjX1C2fcju[eJh=I0BROa!#91MrAW8g/cZBkBcX=9ei +airQlWq3iL]OX'%eNjh?gH@'d2d?.$:MuIG]g;-7G$/]AG3jSI^,sh#_=#Q,>$.=EXaGrGUTH`MaIk:q +3[7^uE@A_0d=KB'/_3)6=k12l9pKk(,qVSWn^2>;J!C5&Y9N?^^NX\On>T(\d#Ia;5>Eonp]%+Os8;C/ +^OH-qrP*j[dm&?^f73^FrqZ +endstream +endobj +7 0 obj + 138678 +endobj +3 0 obj + << + /Parent null + /Type /Pages + /MediaBox [0.0000 0.0000 800.00 541.00] + /Resources 8 0 R + /Kids [5 0 R] + /Count 1 + >> +endobj +9 0 obj + [/PDF /Text /ImageC] +endobj +10 0 obj + << + /S /Transparency + /CS /DeviceRGB + /I true + /K false + >> +endobj +11 0 obj + << + /Alpha1 + << + /ca 1.0000 + /CA 1.0000 + /BM /Normal + /AIS false + >> + >> +endobj +8 0 obj + << + /ProcSet 9 0 R + /ExtGState 11 0 R + >> +endobj +xref +0 12 +0000000000 65535 f +0000000015 00000 n +0000000315 00000 n +0000139422 00000 n +0000000445 00000 n +0000000521 00000 n +0000000609 00000 n +0000139397 00000 n +0000139876 00000 n +0000139592 00000 n +0000139631 00000 n +0000139733 00000 n +trailer +<< + /Size 12 + /Root 2 0 R + /Info 1 0 R +>> +startxref +139949 +%%EOF From c9a7f75ca4524b6e304068ab442b9b8dc4b6bc35 Mon Sep 17 00:00:00 2001 From: Robin Mueller Date: Mon, 29 Jan 2024 11:44:32 +0100 Subject: [PATCH 34/38] move images --- .../images => images}/event_man_arch.graphml | 0 {satrs-core/images => images}/event_man_arch.pdf | 0 {satrs-core/images => images}/event_man_arch.png | Bin 3 files changed, 0 insertions(+), 0 deletions(-) rename {satrs-core/images => images}/event_man_arch.graphml (100%) rename {satrs-core/images => images}/event_man_arch.pdf (100%) rename {satrs-core/images => images}/event_man_arch.png (100%) diff --git a/satrs-core/images/event_man_arch.graphml b/images/event_man_arch.graphml similarity index 100% rename from satrs-core/images/event_man_arch.graphml rename to images/event_man_arch.graphml diff --git a/satrs-core/images/event_man_arch.pdf b/images/event_man_arch.pdf similarity index 100% rename from satrs-core/images/event_man_arch.pdf rename to images/event_man_arch.pdf diff --git a/satrs-core/images/event_man_arch.png b/images/event_man_arch.png similarity index 100% rename from satrs-core/images/event_man_arch.png rename to images/event_man_arch.png From 602aea3ec556ca9d148c6f26bc5d7e1ddf5c0970 Mon Sep 17 00:00:00 2001 From: Robin Mueller Date: Mon, 29 Jan 2024 12:00:46 +0100 Subject: [PATCH 35/38] add new graphs --- images/{ => events}/event_man_arch.graphml | 0 images/{ => events}/event_man_arch.pdf | 0 images/{ => events}/event_man_arch.png | Bin .../sat-rs-structure/satrs-structure.graphml | 274 ++++++++ images/sat-rs-structure/satrs-structure.pdf | 607 ++++++++++++++++++ 5 files changed, 881 insertions(+) rename images/{ => events}/event_man_arch.graphml (100%) rename images/{ => events}/event_man_arch.pdf (100%) rename images/{ => events}/event_man_arch.png (100%) create mode 100644 images/sat-rs-structure/satrs-structure.graphml create mode 100644 images/sat-rs-structure/satrs-structure.pdf diff --git a/images/event_man_arch.graphml b/images/events/event_man_arch.graphml similarity index 100% rename from images/event_man_arch.graphml rename to images/events/event_man_arch.graphml diff --git a/images/event_man_arch.pdf b/images/events/event_man_arch.pdf similarity index 100% rename from images/event_man_arch.pdf rename to images/events/event_man_arch.pdf diff --git a/images/event_man_arch.png b/images/events/event_man_arch.png similarity index 100% rename from images/event_man_arch.png rename to images/events/event_man_arch.png diff --git a/images/sat-rs-structure/satrs-structure.graphml b/images/sat-rs-structure/satrs-structure.graphml new file mode 100644 index 0000000..359b5e1 --- /dev/null +++ b/images/sat-rs-structure/satrs-structure.graphml @@ -0,0 +1,274 @@ + + + + + + + + + + + + + + + + + + + + + + + spacepackets + + + + + + + + + + + cfdp + + + + + + + + + + + sat-rs core + + + + + + + + + + + HAL + + + + + + + + + + + TCP/IP + + + + + + + + + + + PUS + + + + + + + + + + + Events + + + + + + + + + + + Power + + + + + + + + + + + Modes + + + + + + + + + + + CCSDS + + + + + + + + + + + ECSS + + + + + + + + + + + Thermal + + + + + + + + + + + Housekeeping + + + + + + + + + + + sat-rs MIB + + + + + + + + + + + Parameters + + + + + + + + + + + Pool + + + + + + + + + + + TMTC + + + + + + + + + + + FDIR + + + + + + + + + + + sat-rs Book + + + + + + + + + + + Subsystem + + + + + + + + + + + Actions + + + + + + + + + + + Health + + + + + + + + + + + sat-rs Example + + + + + + + + + diff --git a/images/sat-rs-structure/satrs-structure.pdf b/images/sat-rs-structure/satrs-structure.pdf new file mode 100644 index 0000000..b5596c8 --- /dev/null +++ b/images/sat-rs-structure/satrs-structure.pdf @@ -0,0 +1,607 @@ +%PDF-1.4 +%âãÏÓ +1 0 obj + << + /Title () + /Author () + /Subject () + /Keywords () + /Creator (yExport 1.5) + /Producer (org.freehep.graphicsio.pdf.YPDFGraphics2D 1.5) + /CreationDate (D:20240129115539+01'00') + /ModDate (D:20240129115539+01'00') + /Trapped /False + >> +endobj +2 0 obj + << + /Type /Catalog + /Pages 3 0 R + /ViewerPreferences 4 0 R + /OpenAction [5 0 R /Fit] + >> +endobj +4 0 obj + << + /FitWindow true + /CenterWindow false + >> +endobj +5 0 obj + << + /Parent 3 0 R + /Type /Page + /Contents 6 0 R + >> +endobj +6 0 obj + << + /Length 7 0 R + /Filter [/ASCII85Decode /FlateDecode] + >> +stream +GauF[bHal/DYSN;a2iOfS98U1f!= +RtII8p?rM\oeCm\q;md^YJss1^_p*lS)&qPUOsiH_9m#Q9^5NV,E+^N*Jl +8q&0LBDj^"iuc=<4Ub5JJpdP2a7K?-l[S`2fFOVocO[[kkRK:B!:],iKhj% +Ldo7**tfH;*ap-_!Id4NBNTbrOjEl.&l@_sqc=lT"]Vq8=5^YUM)BjU:Dh@KmRI3uh!K"^*_Uf%Fi9f-[Ehd'ni7%huWD>pDG-p4V- +5Bo*ri)T;blTkWUs%83ao.''CA[>!?bRV!1nKt,Zh)Dln%_(*e!X`4 +\bq$GHf-T-rtF":`ukh-p)@S?E(7GK^ej4\GKq@$1A7C?d[6Y@^F?H9-!m^;oDO'YjE+7.T_[qWEC2U< ++'Z*h-7XSXc)3]T/=t=[e'q*>GA4MakRcVdQ1V,OTR(_/f-ig]V)F"@p^NaOj8#'ESS/Yt78:+[ +[qEkMeZ_7Wdd$G:EZrYDi+Y!.2\U?2`cmWRCr*H=cqn(6/#8ldII,P"FA^'IfVc.1KRtsI^%_qDcSk(^ +Brf*ENtS6X*p''_I0_r/=1mei"3M)=T%<;d#=H^ac5/\7FPLQ-/5rD/CN__S380K=qt7L)`XEmP2#;`g +P"s5!3N\]3Ldg&p-L.+d`-7mY$k:M)I%`CiXO`s*a73b'S<;W>BurAf3)t"HKZl!m@.0+.8d#+KGh+f+ +'pRCnV%Zgt^.**s$`1Qar6j@Qjb?B0NMP%'VtEp`_t>Qo-u1YT4L,B"_IslmHNQmi/^p=deDCp?Fir4@ +`Ukc2UG[h>?+>Vhn'g30M#J2o>$)Rpl`k>BXB00n;[pL)_9It?O//tK\rs09S19EQHjlR-Z,gEdS]9?C +X(3@iEb!(,4fE?1N/o'F0?\e+9`()sI8D"Oo*:Q(EhAC;dG((O9o4L'2KW_]_m6Mi6EBJASIUgK$iFZb +[MEV3>g@PkF3o*r0NinUUBO88IhsOKUP[PjGrP-MFBHORhgYfpTX09&'E*(M:?2-<6gl<-Yc"n+%anQ> +[-2p@f]\$2"6g9LQFc!?7l-7`q9gMYUD>.kR;$lbqV]R=)nmqkmCNe;r?_T`LAGdEj=M=4LB,O$d! +XA@2)cf"%=DoXk%bM.m)eO!<,%PC=J-!6s/_.&/CS%lf0-(2"Ar<6JUn70,`%!;7%%NZV)rH@@KVqLAl +C[I_%CfsPgY>DYSja$BXU&EuL7Cua*&$Js&\\+a1D+]*VAifrR%Rn_@*\_)s?;HU]"pPV[d[&UJCh5E.bi3Dh\^;hlWT_ +^G.[:I*ic,0Z1?-rlu$V\).$M*P+tu^roO#U"`(Ff$T+"[9)?@-2nP= +kNUNY-/1]TUEqXHLi1kOP;98k@Dn*`iBXE`U("/<>Ep9UIh,^f*8NL+=8u^tP\R("GZTp]S!o%3gF%/_ +.c13DojDKYduY*oS>g6#XE@h*Q!qpA2)n!34XDSR4]3u/7IJU#d#mJ;%iQK0/n8mU$^5i)oEkO'`GFFlVrH1iqUJ^@H +5YmS3Kn +5-]H9:N*U`RT4*N*?cdgNc[ii/R0MK@h6/Ho:aKh'og_\%&u2O6h@H%,d33a^&5$Y==d.D5e7BjO[-eq"K$AUDSfDN+ +[cW3#OfalZbpld:8RJ5g8+4S\<><.B(cpW$/TEA;GNIJjX-UkeoWB72rNIT-X>h5*P+5/:Y+1+9Y$V$#Np#-o +r;<\"grAdp +2_Yd#l-VKi@@%/b1=>3-WjQpHUOUqB*^\6CpkR-IFl+"l^31S,N_Q,nDJcn +_qoc:g[r(:i:[\.oj.8bhWr3Hlk-:nIqY',raD.)8H7$sgASojs!]2`Bp1^Tqd>cEOaYjINN:J#kOHJ*nFGuOjIc+V*ebi>X\E@W9OY\ZU0Z%dWgA7Pg@7`L/,DR;?Z#1:";1@/'W+^PP)B_4M%H_77M +F48bkrA%no@-h-LbuT/;TI^V#GP\rDCkd+.TaV>YWb"!SBKBE#S!?35A8pO0'Rus6*jHs"8R^5]*M]%3 +jl)tmF;\SY%YQ$Sb^NR*?_7S\HeDr*kXPn3FkW1\W$ +XkdP<&"p%3fhN?cCB[[9bbNK'l+=jn#J5Hh72`jc:qAD;^u(Zm"^IHn^9)JaLM*Xq-hDulNlcD2Oa-W7b_%":,^fRp?2Hs2O_T@+3V/f"N#X1S8DMiLd+MM0]K%c +Lh\=m!]r?th&\Fk`$QcJjqeRRqN";U.6]ggl`e[p]7]Y,$Ih4ZrD:u4AmG4qTJGcb3i]p/+l(^W]a;]; +mrjc!lW;2ZhBR'=pD8Wq_e@Q"O`j4`7>GdGL,%[UN2XB;f\'WZf4,SVLLJT"\CX)dl:LDj(n//@d5nPr +br8AV1U?S)37cbY/$oJ/Ke`#,m]f+IJ5-ci$9a#rXWA2K(=mAehTQa9MXMlp*uQ4a_hCs4UY=AU?%J^_ +'#!%6?1pRWETiL3Dbj>)gkcUHiASIHS'bPENTCbp7ppfgN8uP0gMQ(kr%.`^L7X+T:hOl-%A:P)HEl+Z +@AECG(<9h]3f%#m4H\Xs_ru(8[s2!A)sI)V*qE#t2APs6NouTToRDYhHh%"A5Q)Vq`XI#I$]fb +0CP%!8Gru8dqDMB(B9XeLZCN^U/GG27DZo5qE82MYsHWf&c=i&_,`";S;lo.liFLe.pJW9B[8G>?Xi2. +R;F.d&ZgFb[je"q'9%9dG>mZ^NudC%4`]TtGKfiD^R8LPq0.70nmCM4jZVV7k5FsQcUXa2NDshR%e3h% +8\Z_^W^f!r\YITG+j&cZ%u.40\3G**-['4uk4tKbXT!s5CGanJO]"8#*F*eJQ)IiUK%)ib +q;MgcM[+_RX;L%U#KOBKc8Q8;T9&q]OjL>?%+X8rcAqPr@N<+`o-PZ3f6>uoKAL86815l=/;\,NN;Ig) +(B%;`WSSjlZ1lj]gde-jl)f2O^1H*!UgIC\).,$7s3Fa@>ST8]IO6NsEN&)jb(p&$3:LM&qSC7^jD +/J9$?b5CG=Q'(rP2M`OP<=^OEB7:?=@&61#H'kBHC5f%N%&A=)SFN[i3bm2?l`fJm=XGAcXTQlr`cpA) +(m=(Vr)fW6I>83^N`PQ3FeVIRFDO+@%"VF+#=Yum!8>OTFW0Y]@_W/HJ:Oa +6^889k7pKM3F)^4MH5W\>/6Bp*mBq*7r1.@hd[I!f_iOF6qQ^ZH*Kc5GJ.1*\tih65UCl'4'aD;g0n[> +c(31@1c@_D0`_^cj(QCBYXLaWrtA`t?aYO54rZZ6( +")"C-L\XF9DY:^)S\CVg%Db[6mab&HkAT?@crqVMZ]+ed*ml,eED*$P][Ln/bB*/8&i]Z.Xg +_hea_No#ZD*k\t4XS7s6DiAgsgE'O/brV^\ODB]*iUskJA9rW+p18:coK+bgoI%BB#F=8$hCp%Q(A=#' +*^okU.N7ECr^[>PBUAF#NoAA;Yk=cVdF\p4C8_\dc3g=k7QocH7M9Q=g5T"XZ]_;nd&NZ%agkKc&lC?% +L:$\#(GR6s3J4(e\gS$cF(=S2?T<+%[k__Zho[a?:=s/f@HHeLV7"UKVHqMMo-X@5f'2uVH&s8[Iu!(3 +N\b3\0S]e#F4c\)(hgIn25S2dk4WKPf+5)jt9HSI9-WF&ot6RO9J1 +_E;Jm372V_c6YndHjlQRYoI=W,]IquY>pO;0r.&(TT'W2Ipsru#Fd>j.$>N0T3Q$>X.?g%gh`)uEoFHH +F^GLuShr9mU[RCOn^!1@JapB,j6FR;$J.LH.l/sd4!If#m2BbF6Yk]fb\@^Kq"SZPNF+&T5&nrQqC/C& +#5s$8k(C6X14"qIs"d#2Go+7\#@gQik'!_H<\sFJ(k!H,o_3cKN +p1A;Tcg"Jj=rVPJnZ.D/'/q(WV>:\2Bd_):UjZnpa3h1E(I$U>27KEto)-El@t4Ll%n=_O:J-tU,h=d= +;/@AWYWZ\ob!n0Kgp8@WQU[I+@FAnU]61"fP4Xs@__$W+K:!7E%]#W(1A1"%5Kp'=0"N^pfR8S]f:s!o +EkQ3tW$s\AqP,Cp[DP[k%Q;R7_TJQY/_a(NTlna`TeB9/9*Tg$ZDcOB99ePpN`h7"gm:"QFKiHXdt0uQ +Vc;kQ0V[[C6s6<@I>OkO3Zg[qik[/;h[d`l=i*XplumpT&iKQuZk@,6ZXjfPRl6=A"ekE3%\EUd/E'6( +jK`++KJHNg93=qrXROfud]`?#,#)/)Ek`i]L:LU(KZ0M!-8AJtq\$n7],tB(Y^?a>h8>R-4RFe/6F.9< +K]k(+krki%En0L2pP.j?3kn!V' +Kf3N;&fOL>&g])@o-Hd@q@`,T\\jafX:3b"B9da)?77`qX#7N\9?N"9Rp&,A99dC/47jh(k.:<%hf_A\ +h5Sth4)5U%9pB5`-!VtIQ`0JLkY&S\$g`VFdsB[Bs*aBu%Gg*a,A:f4cV##rBd7A_()DgBS>KO=lBDP( +Yj8BWRsW(iodi9pgK%UMO!/;F0!7/VV]j`ZWuV<1,lTSq9m,6aHVOEG*"ZmaRH\CBcdFKY)*GL*Rb)tV+;[Y-'St;\erQ.!8k$!/ak.#/DF98I`cKeV'>IqIYdC\;MQOm^A^rk%>=X363Q/GXM&oVK(UOmi$oUh+gV. +(3S40t5@%TG+GRnVjIAW%hap-lP)VM@g,4=IXWCA(gA?*\&e/=d&jYaCRjUGM-^$Wn#gNc,H0rP<%N3 +m+?fqH6!mq.*aTI^\'XclYlVj,QC5TLj\)40&;;72gn!^hWZ,nB4+l6ME3sHkfpHgNJemc,.m1:V;@RA +9$b5 +rCfWA)>*2X3G#'>qlh+2i_FR=N@a?5+3]d^*b[o0"bT> +oGKZYJSE`)SarF?]mu^!L`(3NZpYUZlU[CdrR/1,QQ^j&7Ang"P/kmc*?5XpVaWVQ51/4,q6i]scSItZ +cS:a2+5faApu*9A8[5\FhiZeUoK-4LF%;;9P*31qXth0DI9l05;*rfTQD&j\Z*89GTVc;=TQ`U:4SqE; +em+:-dM3-2"VUhMiI*]O?RYa"?LOY^HEq/%nO;a+SG>ljBCq&=6"D6Qh"!(f,ec#u) +bm/"eNAT43'8p1#^+f6#ni3,mA1FHKA\l)?0p,q$1Qum2pT%s,H2+0p7'j +htt?<55P/5om?_E00XILr$=/FqSE,s1hu&(5*U?OlZmp;Bfe.sn9g;]U#gNY@=O7+@3kDuB[D3f(Od.H +fCS+aHe7_m7le>2A472=4X+53L!1TfiqN\*mh<_pr^RISN3`pD'@rXCV0'aBJX09a$0gl^r==i#JS6Irsb"Oom<>+RLMnI_\8FX-`U!6pK@+2AZkd/6[W.Q_D#rs@K>](haG-K3jQN)[j$6FTCEGgO>)/'T*0 +n^adB>Mu%^3^X``RS]8E6,YC-^6:HF@"a(`H6Y^6^;R;er]A9J#A.aSLYaSr@]2=#^!g]?j9$Ht1b'76 +^[g'/d;`;CPX33-TgNa--I3CD@j<"WIofV/d<2?0Z?>%% +rCr:o/gKA#+48`2!V4INd':MSC^$_?^_Fk:^%#p(Zts_sT/TBeT<4cO/_'bH95aQL1JcEq(%=k&",fqm\b>F3PYQ^^Y=&-07K2JVS#DM +-0"l'k#[LHpsOJriJjLd*Nm+*;GeT^-'N9*r.3W$4MEd/-g-EZXkAE':O2\T+;mY;`Soj3Cn>XbPTk!Skh@uUI]>:EAB#SE'"^BQp9:>B6e[u6hY8S>7-\0$0'M0iX +0!&*\Gp:\O"c1LDt2V?H[NPKCjE&jHTo3j#_BC)g`/i!kRA=2M[aCX +ZZn"oJ-t1%nm.n*TlB1DZJOs'OjeLZALN"ME(<>[K$+r."hI//r"GHHp.pYA'Dm%SL#(Lr08^I8<]Lj+ +`kKZNZ%$GcGG(q+EGO;k_2)CN!XtOUJ<$>6Y_U\s,OXMu-In"@Uj*QiFF=rE=7N=1)9(GWU"DjJp@6YN +5(;M5B^OUX,KEQcEkGDRdM$o3-]5kG?bJt*V[QGUPqt8 +^C4l"[EpBEdS?2i.!Ig)WCRo/I00pBCM-Lji]1,b`h9tFd!Hb(W5\tgYDDn7@K +Z=`BJ2d9\*M]t&$,BCiAq +@q>#qhYQ>P:CtSka[J9lZ=&KL78noXK)*4]r84%f=HN&8[0N?R]6T_ct,49>oR(Gfgt?hjU`=pR76 +AHseqP<)1$C$(;@I_2k!h9reSj4&T&PNr;%V/X92l=FVNQmN&R+p6LZ+R>_7^Y/*iVj/6;Y:q&rnQFtk +;1"YN#V#[h@8<+cW6"fGXRl74RMbi]'5)Ru1W(aOBEQ@W6]!taN?2jnHXk(LE5^Njj#q9N[o5%n-IYH*=@J4Mb)M-grW1&aYke&!%]uMh5B08rhQp=$c`lX7.Xsgo +(Ks\qTO^8[;0faCXq4Xf&mSU;$30L6jXba/b%RFaZpu&!=P]PMePRSGAh_\O\E=Yj>[a.lVLEjaqd:LS +!u_-S-1Nh#5Q:t+>%nJd/7\,cqHs=q:F\SOPFB^qJ']NWb[kP2dJ)l1nC91a3Ia5)'))nCgY+;E0!o0p +HaV=(A="#Pbsq]b%NX]1BfFU_N.7R._'_Dd_rq'8PIkAoq1)-oFV]A2Pq-@SG^_bRE%p/OR31FCah4<@ +r`!bQ.\8qd2KD8jkSZau?4+(J-f'UXCbkY+(Ne)]4uSU1j/B19BA5Got&``0S)&(E'QZgcW#b +okR`\.O1B?p;s5U3cq@Fc7A72dFjU^BYtS2-u@tfFJ5eDX2Sh]q5(&*K"iN*jP&.'4pBX`;s&+6I;[T- +25-`-bgku/"u?BsH@]OY_Hm))#r+m +9?qlp]B(h<89@^a\nF+ZF'/0?c'?c[8kS]"!19&#Vhon-\=6lW1Y;^;'q#50MmhG38>HSPLG4L@:hnVq/ni*!3 +VXIi5^oms-d%d8l7GmPm`KM]V%ea7=XWX:]\%1C5QPI&1!NE@q4m7iT(c=qac,kUaqX-d@Nj!FmNBN_L +].]'1R%8B-VI/$6ZruhYI+NCLbS'!?)R;5N4UMlC,)jqES$#!Nh2;d2[-<,#e +g_a&'@-3@NB^U%*)Z%>4rHngQ>j^q=rVGiC6@<^cE!"(Q(mk**mrge`qSLj/[*N*.Z*$i9guilDe\h1f +AgOaS4Hme)PE\'pkrZF2PbJog3[&Ee+6c_,aZ?QMb$4AthF+GrZB_PRIZZRd125AGAo_GN"7oEJ;lj]j +5O3M`re`?db,X.E5g!"ScCp?r]PlYerpL\>\QYn(`F+FY`hpD;U![:53+G]q@?6(`<\6#r/>*A[+F(HUQ2[p!"VE9PY*)h.QO)efpHG#Z\)7\8h9.U1]N%)h_\gTb( +Xb8m!UCUi;HTK.Ce[dFUIrh2&?^06fmh$'X*.^,k7sjo91,>[fV$5"@YHouYq!FT.3.dqGYc3)6YHJfG +ReQ_'-fq`/?c.@.Lqb^0qpO!;KO8kM%ZOb!T@`ASY$2:dn_6:ud5l[S&%l$g*IT+"5d&YDVhl5jVkT"U.8.N#@.m&11^BHUSaEPA(G>_2[:SIqQms-n+TQH9RUJjQf8jse=#F: +rVi\'4f4d;\YVCi1N=eth`rmt@I@h+RtE^9qJK,,^P_EOkRma$kjMtL@qFjl.rYFZ2fUD;HrmetkuT[e +:9$gE]YBIe)Lk[1eTZWUqGgBa4V@p:qL5I`5h#W^<Mc4G_)(2oMjGDl"m +r)Y]KXjeRm>5c]PZU(?pX,iK&I[gnJWY\XOM>NqgP+gb('miF#8+?C`BbR)!SV)9Lf^I!>G2=!a)4PcI +LVVU5oARS!H^/BR=rI*//[;k`J[tB:@-^k4B/O')%^YV0f%*L+BA=afnWl*%@.Ai\Fba?J/Os +m*=rFc)$V&d#d$B=Jqgt8%+?Mih+jZA,\7C,J`BU`dOn`9_/l3#%m3]ZMr<(XO&_@Y%P2cObl-ep"([- +c7b_q!%0,^YpdM&+lTN`5B1rh31T<61=>Ohs6)Rg;%EWU$2>]jE7^0F&^8+UleS[tb".$DLrrP!h8dGs +RrQH`$P:Vi)c$ig/'m%si]@ff+5Md%$fu]@C;QW]RHl!O;KLg>*K`qC(!GeW=nLF3(+ha^&]'nl@C6IDIk('870l9$` +fLHa[R;98)/LKR`HWR:+lJF1X+4f(@4c;=kL;I8^W"j?N1fbe";4IAt\?9oLA,VH0:?R0KWu1*YcDoGt +KkaA':FEo9ZPQT?-c$ssHA,D=62Ia'B2oC`X@8*IZ7Yn*s3@_CZhLoL'B@H9 +EDO!Hs%WCcNE(gIiso%c*+>W86J6S#-"WXRZ`#=[G?&qNB"DePg-M#$YB>ScAFeU)ToB9d:@"4#j\j2Wf1Eq%I0IsYhJ`kHO9)#8+,q(j#j"CBgZpZFcG5Q>qOAi0'.Wj2Ic\F?l@<6_oZGLB== +M5J93[u42G)u"=gN]Q^mpW9a)\@Xf68'IGuF1SU3&DfE?Frs:ZZm;sFE(Go`>kd+H:>X*^,TUf^p +M2T"*9h8lDGNu=Gs4,41ZI@nW7=UZ]Q(2,EADZ][GS\YEH4TE4rDuf%.BGg$'WMN::;;'YGj/PIbdtQ1 +nIB9aSXikPm<8baPr6LJ:5Lc_m.&S^`6J8t7i^hud@(nOR^e%)ODH>r&5TB21N=IE-JiN#EC(pIcs+$N +Iei6/@;=u;q:mX<_i,%gZEGRAj-12ou&lIZ#b<7 +0"]-n9\aTI\$V?IEBFn?SDsuq[WdaE'nF3llb\+O\i;lLY5QZ9RC@9pj"p-O(<8N-)/r90pG^4ara"]3 +s&F'OH6f*=(ZO*"26 +IRi-.]qKT!3[lT?pcPJkSE"[7D^FYNQQ."6.-N6VNqYKSnbuhWGlLca]_=rZ]q%qf(N*QZeKZ="pl]>k +43&/g3Z#gu]ufdtr[,[(q?A?Yrqg*R,+.eHB&;CX(t6[@.=8VFcZ/7Q0kOhiDf+?eSr+cLqG??hm9H!o +3k5!Au0@[47&?I,OYaoN6'c5/`=3_cK=lj>f?;B$)SVoOi2agRg^]+WLjj)V..d^']0ng?U-Z?LFXQ28;-?ADUjZ2knO*oM\msf#@ +H,\#:XaK?,Fkq!2Fh5A&1c21]1fI?CiiQjI1S7Z@9t-QjY&kCD$?N9u4rRd.Ras!l.SX*8X%F>l$XZn/SA\Hn-JOQ]8de:QX,:Di.W)[a[RpE\Y>rPiI'+se +`H0jK#b.AbV=AF-De7H[XX^I"3q-.Gn]hKD.P89W20kD^bh&lSfN4?(?,N.:]2-aQKu_]gWks[bI9!Nn +7]\NEn#K(0%\R!pa+m*M<3K<`7$DFe;=.#Y.ZSmV3B6V5`OBY`BrphGX%I0q6eSL!EAXgJXjSQjWmVD6tY# +Wd&X8ZG,,je#":/4o5hRLi!="M)NRPiNLuo7%Q6@9.Zj&YIsbo.?`/pugT'(olOj]GRuC +3ktCohE4pTc[XkXFA$OY4;7=CX(1kt'754SbFP2J8;Qm95'SL5Jd:NKgZljpq1c1kbCXqLp[dHEJnfqG +\:KBNS)m1"8$:;J3QIIEIDLVE_7;LMK8#YE9\p:f1rG<;6Ml#ia9^B9oJSTq+sdk/(4$l'o$I5BU5@2_@\UAk[@fc@8ka+aDRgTd%lG"3^,>)]!Lk +mfD0?Lgt;fZm)S[#X/^9*W>`E?ZAOCQXrq[j;UN"eKP?H4.a)RQ>`Wd0:q&qh=#+>YGP&&Q9BP=d=%)8 +8G$etQ"Qjj$X\O)lFXR(^qQj2#W):Z*-s!OZ"]t:k&s):cgQJkZfqqRfbWUfZPKf1:j?Q1Tdol@ZBdCQ +EH`Jh08$/-:hbr7+/=-;FB]uP4@Pb&1u-",ICfeS%WIJ?V*+C&VH`884)K#bD>JJD,[^*][0mIP6$@M9 +AYD";534u:F:lPOLoEIXrfEH^)3ls7;^/O=V9/1[XZV/K(Z*NYKENF@16AMo"tmPeOS'ekUMZYr5*c(P +GiG4%A67PCjZHf\pc'8>qYS,!S#9gJ3Kna3\T/e>E2&rjh'4))3o8JVVFtHEMWetZZiF`S$ZukEHXS5!MKF`Uj,P+;nW.5EN7;,WYI%(d&$N,m7!AY>69(f1hY*5+PO&[EH9@OU3,-qc$!9s"3%U#1C#Q8 +QEnd#&q:Sb#'jg:'OD!_)eoV'U+nEd\?][DfM5\JV;%k!i_mmFM%hmRF?#]Mjg:k +d2QjtUIUTjZd^E];Z^7b<(%k4eh)m1.JI")Mpknr5.S%>*DG_`X^@`@=Ju+2*654%>,$28`bDA+lPdh; +kgQYR[VM!sY>DtrGWXt)\&RCKH#MfXXjT2?+Z)"cldrbgW@2-7)TRtUS:fcrA*_N"%R&UBE@T<.]>g9* +Tet%=`C&[!1p1heFCE)MdKi?/mKF +Y,$''CCsEQjNok$Y5-I)Wm)cJ;e73'LdCB#j#D4A;fTR7CE1lmOiFYOgm?$c$7b(LSE8H23^ruXNO*nZ +:9Bc<6Pn?i0=k!?[,dOR2" +NDhnr`U_c5`s@ZGd-E;lBcL,JP/aIL.WdLBS^_`/338+t3e\qqNlE6U]leB*Q,Z+kph1YY2NBrQq +dP$+50s/8r$9SE;X/<'0f4COc[5c\Y-$7Dq6brHoRPaA)NqQ`!$R>Cc-Ul,Y%n8])p4`oq#tb@>7"`1Ego9@+ +=5>mZCr^D9>]F<#`bkr`[q?6*3RtL-c]K1TTD[/nAAO6K2_HbY3D0/&Rjkg9g0& +ofG_W[>>rcLnP\9f?Wk\Z'U@!_)rcl/9^;"JVMH,S;0VZ[](k@lD$j9b(U7_[1R=,4$W8IWks\!VVue` +O0K#V#7p2Pn">KnMJ]&0qjtKlp!qa-H.jVaq7mV%;^E/S_!'&T6ALAn[9+WL"s6]Q+<"7@E&<%,`:7GpIG7W'ePn?)4CpgU=lC*b/;Pf +fP0M2(mQ]&0KVpV+L6`&bh14'29G[;MS,rh;*t3Geh*1do`fU%mFN#&;+$OPnd&*c`[H(>f@lfPo8,8A +6AakiZ*YL"Hb#G0cQYI][>`N**d&KSg!7AN+1@mCrD]RUH^^^pSXR,k^B=5'DqH(m3p,VV9riKhZ +r*`&t[8d(ob\3uY[r(dee^%KfPa0CY]JA%2fkYsVg-p;3lnch7SIq.T4#(C`Vbh;uiVP^8rj,aI97&>( +9\7cSh2%NAZ-QeqmrdpBt\@%NONN^>&Y,0u!!X''%0l%u`1=lt_"%1QF1R`V;\W'LCk&#=,m'9nfaUpUk2Fg>ZYr$)G +2$L+1LG!qq)chf!4G/G&=>T]pGp]0R*isr]b-@h>kUsu6`R%H0l'-<8`8(OUBI)HaBaoMmq7s*3;-B'3 +UATikc]!7MGg8m#%Bg\`>)QSp7fQZEHac9l"qnOWL2-(-"_unL^o/%AVA"&QD;<DT3pc>fRofBi.'4:#86MdfQt/2"qKqkBB+a+"m0g0?K4?1mi([DE +[aLH.4+DB6B.-i2PDcAZ9TRflqg^X^'Qg=U]6.O]W5!<64;DV;`VEj$mbU>ZSR&PoV\Z`BbVH0N:R9@F +WL806.rTNqSCHU\ZhSce$DgLVQ*n94F!"D#ZG,JsDJ+%uko#5[)hcqr6Cqh(d_<-AfhXn7D[C;9:*%4:l$FC,kgZhM.Kq8"sG:tF$rgFtglB*7%a4VnJ +R.Xt\Ok+4ugl9dPRCdD-h9:,?IPip%W#btFr>!msBX@J)H"Q3cJQ@Y,#sAV&hXi,5(\\(GX,RG?gSlZS +B%m+m]QJOhf\X+/?YbjDE;/>Fg2Y4qh6RtV:97p<';M>(S%?"7RWU*0Z_FG.(-W"!15'h\BC;*`>3 +[P0:FLq"p`9Z[(Rb3P(94<*tU54R#-rj>OlFgq/;gP`CO[2aDLN[q]!?B[J)nhH7g0`K;[2L/ls2^e"2 +rAATC%c(-9$5%3>=Nd[]&\p2t7ZH$t@`C>Z+$27O_MjWJ*r.s$pH(&YYQ"Sq[ital],^JB<kSSH,g70 +*LsDh)egB86^dn2a&j;;>:4JPi9c(fe6P1P];6_[UWggL#A5!mOU4CLTePIEN:L%Z4%[$hZQ7,hS..ie +e5,pNFQk<%aBJ;gs5ceVm<)TD+(UnOhV2,OiI!&RJOop-5(f&]kIg?n=?9643V9HS,pU +@;3;XG5gbNdN6:K-_lKtFseQAk^Pc/D55SVK3$hK@_Y7*Q"tO0U.E^)o,SXBTm9GfJ(\%4VrPbKZRf\C +R:>&Jb;K2Vk!g>V)>e?sH,f^8/roLI^:3\,k05<+,oDGVK8*V3MKW(RUGT^Ar'QL-Cgm/:*P3,774b"e +dN4H#fUAAj[&>m,,V4\n<='n[eh$/oeC2PR2?%31%tRU3`%lY.Obgs@;d9,JQ$2cidGFj%d68=^2cKda +(d0WVKRXJ$&rbf31'c"B@aR!fR+^k3,1nN^lW`he(Y8>C<"o%A:N"#(3;U[_oVe+@+&&ZZPFQ]&fe+W5 +/._/HSoKAF89nOUWXM?LCY7>Vo1SnBEgE`?>%MDC7TN0rUqA+^KMnuM^*Mg:\.;"WGO/5Q!oGWlT%?R` +03EO\Pd@U/96j*6<@Gm=T7*@Z2+.G'tc8U3dJg`tp+\phta +rm(!gXM6R(2NDVo*M@^SP&eOL6coc<5q_9E+dDO6s$4^70;o=/f83HuH-,K4%fVVR;+`jPTl=/rD0.DN +RJ4=KPUdC7Xc-!?c-1UmOE.,?#V")YkX`k&elS4/=8s089^_^R7Ll:hB`I263JEE::,Z[ZFLQND,A"Be +AMV,DO?G-"QH'^c,Klnb19t18)WR1Tng#Hs+X9'"ahl-_4>O3UCP@]u`^qF#doSJl +!pb?LA>BY.OjMf2'pOj/>UCjDKfAm"7W`-rA;'0fLh"RuOnVBadFl9rOePq`AV>9MKG;59^1:b[T"1Ot +Nf7qdj2_LBI$YH.&B`(PIjcPI8OGt5NrUrPr!o&*hO].+,Wmj'aE5-T.4CAqWQRgMjCP`>#MS(bg>ar_ +o=C*I_EECj87>5V,9qF4J$cO+NK%/p"*^kXQ1lVRi3W"Eq*4Ck>cB0V`Ju?,WK5kgl81c7eZKK]fn0mo +n>-R7HeG"XQZ[/Mgj8=_$9._K%Por4Z^=ISkl:lbF@]LTb4aUc7/$7Yn2d0^^9X,JZ:?Mnm-g&[h>DJ# +[D%^dFGSS(W2.Li.#=hCrd)nWa2-O(&c=h;0p4b+U[Ee!b)0q><#f-d&mJ#I&?V#!4irnq\T]j_X3o4^ +XS[7V>M%lCN[[)!Bo8Del&ULg4jm*tpN^Zeub5]JNXC$GG!0D83LC&Q@_s`dRai0mBGmN3Q?6G+iL0rVTdoJq*s)!r_#4qB"aY`='6KY9TD[6HF7A=FZ?.-BZ,`6;PrZJL+'4[k5dE(6et1N +@%;B%pQ.5f]mk^RjCijPmFHQ:[=kFUIX+&b#@g9iY0&^aD+L2ImoiUL:_D]2S;']8`D'"q1^aN`QWUE4In-tY7k_*L7h;#0m/8"gkCCtAX#939(5aiR +pab[-$^4j*'i9/L)u4[ufD65#Fr5Muh2Q^7rT8$a,r/F[X8V\"kp?hVSF]31ZBT4aZ4:/:8J*d`c:amG +#B#I%%4GM\0Inc[bJqE&AA,N"F1CO"kg+*3QT58q$uJKQCV@ICQ3#mK9]Ro6n(nJlL^AEitMaF^,Vl\.d"<&"6UWNUI!.2f_[oMV5s#S3B61@ +o0sgo6PbR'fd4jb_U=<$elP\m=#G$l=nAk<8*eO%``6IB$FkLHr"@R8NA`#_Ar-E/ae.\,R6(,ZPk3_F +Jhku1#Yn1&FbT19,kA+eETB@eKiBO(DB`X4:?:)-395,M)ZgEXK(j1O?Z>fSu^X7X6aFik(: +=6Ja/s+uk]s2&@h3YL''p)L.L*2OC-nC?Sc9ep8!U7pQ0qt(!cl;pNLSj0`VFs+nsEBkuLh*hf%`RhW= +f#Bn?K/u/P^hl)HqI]fq_R.UFSQk/F&QRKd>+7-Gcckj-4E>KpUYD4d4kO"2890*j'=Ik@)7s5cV +bJSt$Uk/:.):n^%[U,,-+[nnG[edULX_tsm,$MUH1p=9j=9QbXf3r?_5WekLrLVc4V'FkWBWUA]0qtP^ +*"u?coo',:%5jJcNG84rN"MC$Q_I2FX_;o^KfY>sIF5I7r6MR6&a9ME=5o7aHi?""/\0`30-M=L6qdL` +kiiue^-pf&Z!8Y-FS?Na6s[:aXKI2P=6ho]`Ik%;W=h)W-(^[eZE7b"s,b#]>1WgC#O>+[&p6g%j`m*W +&Zk%SA^ONNSo+$EWnVmk-0c7Y_3\iWm=7US^+LqPMA1Gl0@>sL$YY5ZU5Q7'$,%cpU:KY69;V&\1KE^` +Xlsnuoj)'5=6jtC,987f02]dU]0kEWWRU$`3"O?UFCO0;0H07]UF%ab$SZ +[c"/i8an%kep"K]M(\?F.Qp`+&qTtmNiTleq\-\sju@_pn[ElPn[ElPof%7)N@'%0l4u1'$.238Z\@MU +/mk=_ff![fMT_=t$=?-PARe87Rsp&h-"!CXV#Xjh1?U]18R&_0=t^>l?!GPupYeb9/'+%gQcbZ)oaC/A +2RH6$,&X%nYu.MK;8#mUGNd\[]q+m.5!$>Xn`pRlc/!mYHB85bgQht'#$oOG`92L6s!RO>fEaQTm5)Th +?$Gsd8Q*6WDO\E1rPanIkBT? +l)NpYeN$RC>4n`Sp,[M!cZm/g`cmL=R>&BC&JqqV#A=Sn<$7E2s/Vcg]Ia(.7#' +d>lg;l+:fQZctL)A)'6Lmk<)_a7qLN,^W9k1[;e@kNe'"3;`@kkb?Jt[7h$=G=M2i(t4R76A#E0nLSfP +c"t'E\j;BH)>?_["MnaXh' +@QgJXl%h8FB*Vf$Nh]t1:H2L#Rmg!J6r5)!3nL-5cTl,r_O2dCph#*Ulea;b7"RHj8+RelilILLU0M`2 +Z,3Td^l&$aGX&HopKold@XEa(lK54fCd;GsPmF_;9WXu#eIC8N;rK<)CU*_MoogOa9m9;P4S^;XUU+JN +,!4o'Eq8,OKB3`PSA1c;ektH9:m'jNrU5:Hfq)Y=,-[V$61;GR?eS%"ZTd=>67.IGT%agVlGLGp-ZO#b +O`EQ##_?S][A+)hrP,D\YL?@sOe[n;IHEko.DF\P69(h1KK_#1\UcdEmd]A@\_: +laFCDgn)r>[YOP*$5*sQ24&"88q*BrpR-)`*Ygmc[ZH&XZ%Yk(+qNF2[#J#E65QK+#%&3%\\KVDM)hAl +ZJ2'rk*M:($c&;KL@(S3SN+2kl^&d-+Y +`X^I66(%n`aN^m`LAGF;c8^pIVr'6jlK?uZ1tJ^mqu?BGc*LjFDtPo&P@MYd$?<'oHLil;E(S=gj"iZO +UsV-PJ?"CE:p*'R!S2ZLaj2e8%iSGn!__aI`pqXEX2&hG31TV6VKmF:&X9*6'Ti,b[\<-ge +#L8h/$\/-h1Nf0h@tIat'lo[KSd%QQhp(p):6KTt9XjWGC.O,Z`S#EkCf0PW>Yr0$gA9Uuh!fK]TO:b6P'(LVV:%D`X#$\9fL.HslJBI,P`_a3=:SQM7^R +eFFGH5?`Ll9h&<81Po"U*4=_qdINbUcd<).Pa9@8W,ubL*G]9MM9;5Qb<'_rn!I;8hX%E,EQYL+/W]^E +Y2qUkM581opL>0p+*8O,KZlZHp5L=QSaZrDHq+TM0DJ;M@7'C=#\WPBFhO +/Ucc&k(m!bD'?Bm$288F`Mt+n%Nq&h:9T2bN>9cZ^6!hl3lQ,UHC,5Y\P#`JC ++)CfMp_)1;NUJ"?WY5leMl**Wa +_fS1Q71^Z7MX'eNh*c[sQ5eH;jsO+ThaKsSAeZ"ckc.g(B-h^`PX0+]'B@"<1H`k=fqM*Q)NsM48O9@: +H5N\).VJ-a/_!K'hO<6r6f#BA*Y'cY/<9+^3EfR^q)PcIqFb"Y9:4BcH-s*#FhR/`_+:<0Cs(!`BZKPY +8\K4c'Go,07:F6R;JE(iVq!>3=Ia/Y6Zd52jr\VCjm%hho;p+o.%ctcf!cPn+r0r+am5"i'fr$&f?@MF +.+bJ&o!QVlf;Kc=CS8(ncTrF`n]#;;uQ'c^M,[!2OqW`,1c-h@EA]+ufa2#TO:nsil\XC:ml.\Z=[&)EltfX725+*_,>!h;1o^I,/YoB[g-nSB5L+iML$&fg;; +WQpsm(dDs;pr%r:I/XWrPlpLNpsEfF2(pQDfX4a+pV1YX/QReakGTdFROEGeY^J)$>$\n1SuRccX(sG\ +G4F-YrD,"G]Bd5oB;JW:/Z/C#dUI>eCs('\.DCtX8s])W:0.%D\FEW8D4q`Gh//CrMHrC;QD(rD/Z)`* +]X7kIYQigkrLlj@?ZTP!\lW(ZO_Z\le7)DiP#IjO?WsPZ09d6Y7"k&*%IJRXZ.aG\NESF4[@e;9[.6PA +eNkXZ(39tZ(45Q^:D7ksH`kS[h@RfltrRYPYF]#dlc_2-+EKb%@HG?gh/ZpZE +ldqsI>"j-oKGJq-T4a5Gb:00k>BhSVa&C%coOiD%<^]o1;uDP$0Nnt^9gGm^W$NNK>*Ii6[>6S.`/;rB +)N!Wll_`d`8t?4SXCoT@jjrO`r5,-bo_^'H>HMf;fhAPcX&fn>$7(+P[[N2TL99%tm15%3_36I_hhBY@ +d5@V&:.3(*U-"ga;Vo>)eMTsUZ&Z<"b +;JqtFKUl:BXj-6/4.Xa81LZ!WeeeW_4G=OlG"FWep,UcQhprW/7#:q3NP6Vf0Xg,kh88bgg97`Loldp+ +YrGcW[9E]HUL;+C@ooInVnFS3L8<:)N%d%Ke#)S&J=CO-(Y4Rd,LJps=-_L/95?iVYE4+1dG)1_g,A@i +9'_Ea]2ih?rR@i)#06U+-#2p=\l<^X^0A-(0hA/+2J`#!e+QdrVsS$0gD\RVm"ikA)npVYrOMoS%iH>H +SX=&dB\h]EBH8-3lJt=7[ak1mn[m_@iGl6\Dkuh+Xu[$6fs$Z/D0QJGnJ\!R1q`V>`:[i+^DkpR^?JpG +JuLK5@)hImFM[X4T^[&0,#*tX@Qp:'Qg$hCD:c%',9fa+;tA$FZo)2*F[C-iDm=HAA.feon=CE'N[p\3 +\gTJl`8=^dD1bJ#hmDYU0E(HcpMT?&6+)TBqu&Y-/B:1m>)IhU?4ik)KRj&]*@-$k7!kG,eU)&P*F +aV+l=Hf@f2O7s=bGlM?iB"EO-\ng-q5>lODX6#DId5QG7PGYX.?)feK^Y>nG^FQ".P@# +[:1KCc)tFDml(+SJ$n)q&ip_FpLs2rlOSG'kTKkE.ZHgC2gn8;S63=HgobBO1R+qD0mhS"@>3da\ +\`d,m]1(G3^RALmargT,YL+'S(.ZO9*]heT'.16WEmZjfIUr0iU<2RHnZ&=TBCpSLtVf(I#UsLAMM%g:HEggfP-jQ +_=nIf7^-9uJ)^'IpE%*>kn3BcYeRD/Q/ft)e#7IZN+a^+NZ,d;"H)Z"*aUG@]Tn&[+:o(GQP\sh=mV3* +Ok54;c77\nX;GP(nM0.90Nk*.KtE3L;HCtNPa<8$-@)#>1\YPWVJZ[dGBmEGpL!p#/5GXsdd7P009N!` +jg9'(PBe4D_lS`NLe8="$;SEobtb2*/E^%Fi23(EJtP`pNE>o'"<+"YibWhd]5mT]Hb:bV>;>^2M"FI< +Zn`+N)g<],BVY'G-gicmF@J4Td@Dh;o86AkRs8bhfD4Qrgem$S.5.21qpdE'?][DhSb;R+?R!qQ@MI\1 +W%0nZRP!n(NT&ckS.8#@SR\'8o&B,Qo+WP[NJ.RCI?P=M_[=#qp#eR05LdKZ?2Ej^2;Xl;dM^[pVQp=' +^g$WFRJ0g4igCeXq*2*jL\KsF+)S7iX)3iqMY4im.Mo2E.*dMamil'A"s2j"5A64DWi@Td`j[@sL+HrR +qgSYnH?5)O.\ld."4i$QGNb>1s4)\c;r/aZ_#$3jpYd/88'K2nQm:-3N&`B3Rio/s[Q*6]R1T"2*<'S\3mX=,s*rDPtcsYK@m,af=G;ooT\0,&,-:B9CIdr,ZiLK9>@nHmh)h`BJNP(t@T)fmORGVfrP\65kQr +_2B#eqEOR;90'_H2srlWS^.CBp\#W/m@3j!)R_efM;*Wc3U?%ZR:#$rC;cenS,u8bb8T?!=)j2h;NKME +%M`'9(a?HDTfMhXERm$jTOij>nduooat6M$N:YjSmdXY<2<-i_T(!V;4n0HJ5HS1tE4Y12/m>jZ<4GoJ +I/Xf"o7'iPLf&q\c2-<&K@s7]Ac[,+=OD!0Wft;4X"(8G4c>LgMub18$7J!QZZ]sE[)19dMe>5UO>hYf +Q&FQJ-6/-Jice8'6qC=]0$N$$Lj5c@Ze(.<,ki5E=*5>T?lp;*ZrZW/n%129[L-9GdmZ3^cS&:W0f2l: +.,eM"'U>"7E/cnE\:_C5<.Z`_EOqVoY?Z>c%TS(!;n9WSd-C:Bi-FX/:)hH"Up7@0CEcA:V;-CO4ZXND_kX4Rr#/-_aF_)?X1XqKZ5W,Q7[qM)?2,!Nd +$%Q)H;X=oA*F+a4qg76^CNdk$ru.errs^DnT1<%^cB$O,[=<( +CV,f`,-=tI>a31#XD=&*^'E&-oH!lQ55dMTW9940DFkSDZu)-iV<#Q:rDlo4?=l0+]LZJ]Gl&!c1nrPA(UAjj5(B)P?FrbTfNAorjPj@]c607g,QiCd/% +&F_!Gg\C=cC3SLE^JmQL1hUqO/A6q`9rGB[DlDes^O:rBodoI+>$\V8K>Nr\bh=XKX25E_[kD1/j,Yj% +l&j#Q5\7(@Q`+fjad8rD)o@q,`L--@lB%fgKqTY/Zpq0on0Nb)QO(5lmra#73i%*t*NF6=;ft_7.sc&F +I96HteQUet83s*49@WP/DNTpnL!o?]e?I>p[T>Q)7!5O=^-m+E9YQ1++`42"b!rH!p^ZThA\hBUP):`d +p"PfE?0"YO[SQZ2Jc*-?PJ4Da02]>^Uf/M>*FGOac"$.=^Yqh!1uV),\!ZnNFHQN,Mq^\LBj-NM;2[D[ +^6!^K@@%G48Gp_Xq\#%rq%AiNf.g!gc8AE_^'.?HFA1;1j\&,paHr".O=tV>(KE)fma8(9RbQuKQHH=F +%<_#B&%QMok8'>r&>;(lH^j"Y.pC2d6^ZU9A[ajW'5^.NR:pU)]?.%R?VROYk*?VE5I/$lh]LnU\OVTO +F3]TjEa,t@FJS\fZXY,\3T*L&,V?Jbg-"mF+O34jD,7'#3Q:NA"2n]MiN`O +8K,Z#BiEcqV,l)liihG(g9WB5%&g,ZQ8FKn8D\:YB?ADone/_**P[c4\ds.TGqjqK0W`ccRH?[ll$r&g +HTkD7X,8g3Zas3-31t]5],ndQo&l/bFlo_lKQ%ZU=SDdO8fGC>BL +Wk1_KSBpUA!S-,>lQ=%j\pJ$QJt\G8I)7hA+oT"h'g9,.*S<$7+XeBI6n`a@Z=hG-(r28+=# +55LaTUIhWUApj?I6h]%u>^H4S2grHS(>-9FI&,L@mI#IEp9s,,kB=HA5jNIhT5N^7E2b1FDs+PLhn=8S +bN8i'Z:E3Z,9;fRB1MYD(0^<4(E`8m42^GO=@t?PF"l+8K"R +pi\g,2i>e:.Yi<1"Z&A*rWB;G\jfNXWIgo?VK3]kHVr1u$94;6E\8F$lT:0rK4?7!a4H+59NdD:nTjk" +k]"VU8&I9BRLSA_`MW49=Rb*TA>ZmQJ1F>#pV%W\"jO$`s*efAR7B.:eo/g8=Y%YoBqs/r3 +H^E<.@IN)$V\c]0$/hEZ7>UXri, +.s^M>]2`OLE_&YS.RU.ZZ07JA\TuVqX`O$F(H*oUF[""(I(S`uB-n6q'@2#.0$uu+DKMu/p^bg+I!o(/ +s-ODji5&>nQJ(s'.-V03#+@Y'a"t+RYu3m=l*ktftHgo]k>>qE2B+J*t% +N(UAKk0t:"#,F:9bU-NH/'C%\Yo_1.Vj:qbhW($$#FBF6Q_.Zn1TGNd]T&OkS`a7`;0\7=]K(!BY:G5d +1P$L?s7UQb.Fj<"rH(oun*jS2ospMPe""cpS]J2Y2t)7J/RZogC6-r2r2`jB=6e'.U'l.1%8G@WW]/pO +A&g"GK/_,uUSURmofS.2H8m-YI2JJc4/oYfR/uJ88T.TkX,s*U>'QFOTF6cOK>L#=5<#L4f?GHQne%#kQSn4h/%p@I6q>akGbSU5bK +(S(,'NE*\hZhSb&3&eEp<&M:-5p"p;EA=nqc+18F^,D,o@`DPkE;a6`KX[P:rWPh- +,nb54X]?FBEYp+9Fs2lE##bDW5B.JeS]ZdiLM'IcWk+ErWUoCQ2C=tqC`%/Me)uH` +\MV5C[t].klBPup:a$hql.TAMfVqB5;,QAF?dBD3kSTuUEI:O)IrWob4E40OcZ;U(LI$f+?u7#piel6eUJ,.dhd)b4nd@h>?*Y-8$V`T<6X^(C0Br(&a6%"SRgXXDe7P'ABCiV +rV;?MJe>3G@EOa]jiCK0EFnbjo_AFl2=$C/pIrN9Z=[.TY(?e>9T!*N>b$Hd*Te`/cABhQS9*[.=aWp:r[$T*rS0ndablLHkB?<;:Q+qd.St%gg:W?P(355]ALVWd=b70YS1S*g +fc#3;YMtr0(S%1`^7tTg51/SMHBKfqA&Eg;NK2(G0`cC9&W.gl+en)I'dJDc^5PO*PTa*7:rK5\rc"*5 +P\*-O&W$6-U,NUSf;6rAHc8$/GAHu/&WNLC58eO1 +YL4a,&"V##1e4J8^6`tg`]$-JoK^i1JMFq39BgQTj>o=b\"CJj!jmt_7ujoKV_c3^k]HK'3ZU6Y6Ds"? +odlZZ3)Jr5N,pH6oK\_cO=n_&mPm6Jq;*`pc3RS=FP\ORf&f]/UXRaTQSrXSFJKU3S[ZJq\^Z^H;CXma +L69:"kttYG>u-VYf6]i^Wtj(IC8&"XI_;0#>Q-8Bh@2:PgTApN([6$P'+CEQaNl_u:=h.qdi"?rFLpVD +F?9!LKhduI6`6tDU!jlHD4N;i8>l&;S9;DQCT5d6P')'nl1Dbt)r--Fr3G3@?2#\BdriiR7Ji]]VmCSE +g9(BfXS\dAW>2M`WA1L'DuE"nY+&eXg'\l]Wg$SU7;OS:fDc:=T2l0Q=[=sol-L^8*+LV8<,>S$07t5. +m&LdoUX.C!EUh97c5#>>OQ\s +\0oe%))o\/+tRWFmpA2l@=$su0iouK9l2/F:D3EEh)ACodeO0E1;)c&dk\Su;9HS7\P^GHSL:3D)e4%]tN.'28Xc/][kt">-caF*O9', +-HNA+3q+(aft"=rlhoFse<)?N)O%a]c;TU:IH%X=U*eqA`RMa@hK!F8r<%P(;"6X`%W-nnBYS'I4pU5@ +XjiN0Kj>?PeUmN5\=XA6b?!S4Dl8_.;.&D(;HQqaG#\1JY=!.,^BsAuOn\Z<]L?EPrMfaV3;P#(rpb_H +o^B%ZXSt@$?2!`lSVnOGcVO5;]p-O)a<7K9r@=$Uqc@@3?[:IEC-FQ1_+3hW0&.C(=!H?2>`$i` +jpk%l=qe9D:ZP+NC=iB#a)3lBMUG"s@/mk$X7S19[.-d-d'+jD?#P3-Ii]K.`)IKiXb)CgfZ[m/s,R+6 +VQubnA&l*fW[Q+\`r%`>a*][blu*aHht=NCS`nY%*"7X`8Q`4et6aL_V$h&(u8 +YPJF#ZNoCV-\k5_bV)NgIi\IVp),hMa:=CIGlJkkj=KBq+I^N!_"dZD08tbc[,g9#BV2;nSS)RZGfD1$ +TXK)nOR8a)ouHkh$9<[!M#`Ci^f7`P'":TnanG"d\:5OFho>XIa=='S(:lSOq>ns(K,#=75>E!\ND`@9VMVHRQ.$Hcd5oo324 +%:=i9_:H]XJ'W%\T+I?=")\"?K:>Ud1GdV[!Dd;?M#+<"9'72,^DJ5F@r$mu0LJT>N'0KSJRTBHj:MqA +bTeg#5#48)"4T;4oi+.0Y?M>qT>@:M"r#n9*di\;7(*3B9&qH>33R1W@k'<\F#%_,IrI5na->J\s,&!" +YIF&s;D+*Gr/4q?,oZLkKMTosruJ`NogJ=J`=p3H't?dF]Dal%?E1sTiPFZbo7sEBmIn@m0G\O//M._o +jDCJ(AP9FBQ67Qi(;7ceTNtB>@&KjDQ,L +Esq(&)L$5tka2(/*mY9U/FO..m/=I8$/Y7O]Ho0g2uG^lL=gEZTj)2T*R1>f"6;FG4B)pm=eOu0n759$ +rGn#^?dH+ooiCZm0sN;%nPt7-#9`7M,[."kX^L!XneYCA;cCUL'Y+ErZupVk?8@AX/)O,8V/Vd +Ac;r*5I@S08eQ20G]f*[XmsYnZ%*NH)O1mV9DB8In@)L +V30n]a_93GAs6n9WR>[,cnoZAbBJGTnF7G-4lkM8A)'m)m[T!%Dj)6t*6/6)N%ks+qU?sBn4f$ZaE+t7 +?$gMN7tiAQNM##6jcQ2U+4d!K3r#R/U(:>r4hg($ceR8I&m'OZVCKfu5do[lN#(EjDrf!>mF<,V\0,0p +YZB?rbQX(q>CM/7^\:Z14JJ>2XCgb&aIn(AEEK$\5bRWNPC=XW\JcuH1P44P)']C`7[&"+F`n&FQ-:N$ +*m4bu$RhuOe[J/A4Y<#Eh_*%T/KDt75n:F`%\J74qVCn'.MC>"[>iB=JKu%?gm^cV!bib!HZ9#JXcc;* +G1hc-!=ebPh4'fb>u\p2InJ/q4&X`T_TJt0J?gD71:M0HP'net-rS532n5+rkZThtEH4RD]di^[UfcR_^9[;S< +))02Zmku"WN&aR-Z)o7;JZn='=_Ba]-r\e(SbY7Hm4\*&1EN&VjR1[s7rRA_Uh6^hUMOJVYKZMcSPmR- +(E03'0]=LPdRVMKP0"$ASB4,K*G^[!MR:ijIea6%jml/&Rh!'#n6qYV_If!Y_bpFe]__hU-SM:cf^*WL +KI?\?YW.S"gKX[kNr!]rhf25nF&i5\n)phKqS!o@qJ>U^Nq[BC2L`GFb2+1a0oC!`kl4^HJTkGP/Et#< +!B4AmIkgRjIK?/@8:l$(G]J%<,O1A=kI+8pj$';bE)!9X9^98W*Q +)(?IL0Q[MJ8[L9EoBL[/SST,[NW+pBZV;LgD7%?\5UQrEDu4M&V)[8M0+2=#Nu;##hXQ2GH/hJA:UX]p +^ODS8TAhZ^8*k"Hp(B?[rh,5?X?i.4_R?YGpk;V8NYk>hF0oI[3Sd0P>Y40=VXOPbCb4R4_auRd_*F@FLr0@41jh:&7K@$UqA5!O3#r]puND[f?R5HJS +7cdM'r'3Sq(@"ih_C^7*M5Vl#EcHcAiba_?'Y;e\GdAP_B +r,luN<:p>(C,02dHr:&s'9[Wg;C6V(`nL6t2QEGmpV(p7p`lV>U]1j+_)i/&WW"u6r4h+."!bb>3dVY' +rT.5XoP>Tt[,3QZDo,S*kh!N,1["`6GML/sgu(E4Y2J%U=tAJ@fa'\>6gom%VZMeq8 +j*XK-[nf'1b(.S2]iF/`XK,P>$XZiE11Vq`C$iJF\%:E`L:ag3(G&0u(S]s"iZ$j*8Un[oZ>g,h/Z7.K +#(3`d[&WGTIs4CYDoB9l64@I5TFA!ZoYatX3t9D3h!nLVQSQX6ZJ48r,k$&EU?>e$uiVoAr.mDHF#1n06kC2"1,`4&tUDZNbQS4f"oB.\![Y,WAq0(eXdk/(+ol<%%bDrI/6 +>qsI9n]%$K*+DBI^,Oq6;=@cTQ&XOBP"VS<$a$(kAC;AZ(_[\ao>X +,ME]M@R/8sE[&s?H#'C3IK^e/=ir,)j1YRrXa3U8>+>0Ja%3d?P8Vb'Gg@lrg-s^?1U\QNMaf-fPF`.o +;oX3D,\FToQIe7]b0h,HDD.!B+smBSne&Y/bePg<4r>:\j4hNnbZWH;fZD2fU.`qM?T/`:@,Ri#i\&jK +)<&W+I>g>B44iJ]g$PMTJ" +G&1*;2P$,(R<_W0?DAQ&_0pI*[0ufMX]rI7*_EJiHb*Gp^#lSA!cGekILgI+#ii!%N0q^JjTRl[?0h@U +GhQaB?KBQ]?[+M&q=K[^I*0XEM)iBK$:aN&oQf/qbaCbEXha&+d+s^"40/.ZRH)3_en"/<4,3L>q-cbV +^<";E1sJ4LCmV^4?*j/0pmSPLD,(Vd +fi!bha(ICaCZ5epHBu*lfdHAYF,k!@8iEqhH11b_eNX!Q.0nV[_;cb0Ui?f8dT^a8h&&A9kbD9M?c(I0 +7-8?"q%C5?6Y*RB2SPP#9=+%k/.M(,)qiAr?7f1EA81ShW'nn47,=S?<]`sNgXD.hY6i[En1X$!Cd`4# +M7T3-?-hVM1`"h=$Vh,_`V*UNpT/5L4=D$!!K!c2fh]66tUgD +p_'"B8+Ir]j+ZPe(tk68\EZXjn,=Wbgsb\66smfH:-,7OBf]rNp!0C?fjskqH>[VlZgo^!7q`>-&hj+C +dk')*VdpD27R$@o_)3q$q2QQO$0:jZ%pNIUqIY$'okJc[lohWLrT0lgh7lI@f(!P&UFFO!M4^!3,+m8J$7PRPhp:d?&I>.o&qp:__,Zp[T^a7CHGKO +1Angtbl_0;]p6@a]'@Gq'+TMqft)sRf6fVX%NG!/pR85.,hCdm"shLMUUScTPs2V\iU;oboD!Z.^AU4> +>YF^Xa'ql9[LB,KSrf]a4P;rX-@%MOomp6^Zb!'HNBNi'B%QG,[?=WBeUtc@fpd+Y00XMJh=tHRZ(6mF[RVZWi@P[!1c3BoB@1 +mX3D5j41>]]\_/Q^dY>lrUfQ`DlWe"_gWZ:34lg:p;!Sd.l_qF;Yq!kTD]#hYM"+5O775`Y=X)NJ*hA[ +I-R?ng!u\f7i]7te'q.Z$BIt`iO_8!X7$gPK(&F*gNS#@RBMsY>\Xc^1S@Z`Om7Y!,()/_o/41&(Fh;2qE=^Y7j2F$e]*9;L=OKuH+>Oim8; +5!srD).ED+#7Yaq$d2`*04j>4\LU_:ne[GZi>-\tm.9S'lJ&sDLX$0;$TX_?\9fUB%c.(H-O[no*^n89\>6'geE?A"J\mmW&"]iOhu*8mDYpuS#OQhQpV+6L$Af.S=i\9V/eC0iH.USN +QY)FW?;cdV*d`m[M:,s"0c`9EkPBjWWH;Dt]&ZM@&+1"^H'/C1Rd@[M_rp@6,,;ecdJN[Fn7J!C/VW). +NWHM5P2T'>sdVn]%C8"\IOi!Q"J +GK@F;P*kcTKRJNH:;_+BHbsS\CMYb:@5eI*BmO.l=W;.;ML]7fGTE\::+^0/"ZGKiD)$m +^U-20NFm#@>-3:-oVJJ*I'lVebF..EoD2&sC/;TU8DP:BUshrHk7?aS7]/^ZUZms6l$@VeZ8'pHS]V?iT6fpTE+4"O=( +endstream +endobj +7 0 obj + 40412 +endobj +3 0 obj + << + /Parent null + /Type /Pages + /MediaBox [0.0000 0.0000 537.00 194.00] + /Resources 8 0 R + /Kids [5 0 R] + /Count 1 + >> +endobj +9 0 obj + [/PDF /Text /ImageC] +endobj +10 0 obj + << + /S /Transparency + /CS /DeviceRGB + /I true + /K false + >> +endobj +11 0 obj + << + /Alpha1 + << + /ca 1.0000 + /CA 1.0000 + /BM /Normal + /AIS false + >> + >> +endobj +8 0 obj + << + /ProcSet 9 0 R + /ExtGState 11 0 R + >> +endobj +xref +0 12 +0000000000 65535 f +0000000015 00000 n +0000000315 00000 n +0000041155 00000 n +0000000445 00000 n +0000000521 00000 n +0000000609 00000 n +0000041131 00000 n +0000041609 00000 n +0000041325 00000 n +0000041364 00000 n +0000041466 00000 n +trailer +<< + /Size 12 + /Root 2 0 R + /Info 1 0 R +>> +startxref +41682 +%%EOF From bf97a037301824c49ed289b37382230e47fd67d9 Mon Sep 17 00:00:00 2001 From: Robin Mueller Date: Mon, 29 Jan 2024 23:36:34 +0100 Subject: [PATCH 36/38] let's finish this PR for now --- satrs-core/src/cfdp/dest.rs | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/satrs-core/src/cfdp/dest.rs b/satrs-core/src/cfdp/dest.rs index 495e5fa..1899abd 100644 --- a/satrs-core/src/cfdp/dest.rs +++ b/satrs-core/src/cfdp/dest.rs @@ -1592,4 +1592,9 @@ mod tests { let sent_pdu = test_obj.pdu_sender.retrieve_next_pdu().unwrap(); check_finished_pdu_success(&sent_pdu); } + + #[test] + fn test_file_transfer_with_closure_check_limit_reached() { + // TODO: Implement test. + } } From 4e43fb8fd7478f2dcfedee07a62fb2873de21e6a Mon Sep 17 00:00:00 2001 From: Robin Mueller Date: Tue, 30 Jan 2024 23:27:22 +0100 Subject: [PATCH 37/38] single source event manager graph, fix doc build --- images/events/event_man_arch.graphml | 6 +- images/events/event_man_arch.pdf | 2668 +++++++++--------- images/events/event_man_arch.png | Bin 71832 -> 118589 bytes satrs-book/src/events.md | 2 +- satrs-book/src/images/event_man_arch.graphml | 259 -- satrs-book/src/images/event_man_arch.png | Bin 71832 -> 0 bytes satrs-core/src/event_man.rs | 22 +- 7 files changed, 1344 insertions(+), 1613 deletions(-) delete mode 100644 satrs-book/src/images/event_man_arch.graphml delete mode 100644 satrs-book/src/images/event_man_arch.png diff --git a/images/events/event_man_arch.graphml b/images/events/event_man_arch.graphml index cb41cd4..66ca56e 100644 --- a/images/events/event_man_arch.graphml +++ b/images/events/event_man_arch.graphml @@ -90,7 +90,7 @@ Creator 3 - PUS Service 5 + PUS Service 5 Event Reporting @@ -112,10 +112,10 @@ Event Action - + - Telemetry + Telemetry Sink diff --git a/images/events/event_man_arch.pdf b/images/events/event_man_arch.pdf index 8ef5e9a..21610b1 100644 --- a/images/events/event_man_arch.pdf +++ b/images/events/event_man_arch.pdf @@ -8,8 +8,8 @@ /Keywords () /Creator (yExport 1.5) /Producer (org.freehep.graphicsio.pdf.YPDFGraphics2D 1.5) - /CreationDate (D:20240129114245+01'00') - /ModDate (D:20240129114245+01'00') + /CreationDate (D:20240130232547+01'00') + /ModDate (D:20240130232547+01'00') /Trapped /False >> endobj @@ -429,1334 +429,1334 @@ NU9oeC?UmTC[C;/3jf0m[^ao@0On@'Ci#$)22hc@BT8"f\6e[p]@PWj2$$mM>PqTm3(_V%o,V"Ej+A0" 269t`$a$]()5_0Yj8F7;%GMa`[)VOh\^VP3Vp`O+7r.J\#*^.o(0Y3Db%PN!]9?`ZehDQ_[DlO#/%#R3 0Y,c=4%%_u2>6$$N*9^EmNQBT8$4]h;ep1PBj>H+*?quDfFZT920]LblNNW/Xu2`DC9=k#WASiFc!5&N 9$%8A?$)f^>Oq(c5m#]iK)C>PeBT8Rn(=X7,ROdNdrFA@!YmY+[[Djhp2mnC"E*ZXW -=12"Bm)CbO$f!cE2>g?m=eAP9gG,a&Vm*2',%!qp/UI?$QUCkHiL6$c9S[QJ+8;Q-hA%Y1.`%q6kE$'jB+nS#hG`Gj\!$<=0!rMkPC]: -HQ0r1SX,aKAIGimI2Z`%U/"^WY]^t$S>L!`&N),!$MOc8Y,DDL;,lqsLm:snY%jdd)g@UEaf%VX/Qo/D --2\!maV-",&C3Yii0C+/3[JS"h)Nk&PSdREq&?a%`FmREc.gtJ-Cec[ZtO*.hSWY`hE0r#G>eInEP)r< -l7'gj@fM4cWi4pCL=[=*VT7]>n-a>60oS`Z!a6;Z]Z/mp-ju_Up.AB.Ag#9CnXR]Gs*ZHCZ2E8Y,"faJT@91M'YqX",b[KYf6;--G3 -r'@&NI9S5R@+=40eaYo,d)+F,3cq-'C#go>5qAooHFWdP1l#-'-5%\_\[%_mM?"Z;X'o3FE@ZWLVeBUA5]El_8kGFk:].jNr?fi;Brog>2V'+slEc#SY+qkN]RTMM4>%B]e_-f^S_H]_1Ba$%Y+q[Z?- -K"q=iL[cJELoFAWN<0PmH&5nYg13@jDnHtD_@02b+OgSkX,'s2GWPfqW:$'fg!dfAXP/Cg0f`b69aKPZ -;Z%GU;L`LpUIeGIVi -K7>"J8q2#JJto=t6-d.4R3=`n'DqTMA+M#08oA#&@A\4()_]?CluU>s/W4^\?0-Z;)bB3g3j=UE;cF*@ -QU.r:[V#98!Y^G20LD'hFANB6s[\Z#(pE2h8-@!N#tX&^gZLg[7dd]1oK -Mred-93(s&/g1_SM\3ujdqsejP]dPJ%"<8c5OtLt:t0r2]'.Au_,r4W4!;V#_gAncV0P0bJPiJ^D!neV -E$)$BcY*oU9ok[N?e/a?%,"anLX`;q8`N\XnnL+pm*h0n[F*f*Z-hi^Ihc[(W&kqp_Q$.+K -9!sgl]54WR]uEst4N^u$o0//91qZD"<<$%ig9pJ96\@gVN):,.G>6f@am,_:4IsSYJE7N@ZXn/V/kZVk\gNJQq -e?]>qD>^_,pU`bk.dc=Uo#1'=Rs)O1jgO14B6^sVp2Z/Wj^&Y%i?ESC(Y=`!n8d:*q4O'Y#CQu,\UfN; -$g9oM,5d-k'!aflkb?T?'"fj;^qnLsiIB6$T@T=@ZQ4GHP.bMV]3Wa$PA9Zb'9MpfW<_17cHsaOZEEHR -[^3.Ko@gP^BeQqAm_7&kXiIjSB5[UOoPtgk4K[$@oQ!YBHb!!AK'PGpQT@fsn8`qY,Z\9(t -[qhVm?>a_s+qX#)=XdG\n%->-C5E_$^"ep`mnGI%+\R0mmHh[;bH787P[85UY&aHmMF.ErbLO8;FkX`b -'V&g^D2Mia2i2GCYSt'qqnT)'oPJi`FjNn.?Hq2P(+5\ul/]2-8)$H)l[$)`FFi9#[WN@fQoJ(":VYnf -,C>9:9rgDtg>Q?-hu];b-.QO1mu(@C,G,\\/"L5RTm?E/m4WHI]fD)ig:PtS2$HN5O#V2gEEM^,f.R'@ -bkC$5.4qOE]oWH9-]n&Mihj(8NM]foi1'08.e136WWJ(pVaZ>$5h] -=rd,c?GH$sFCZkKN&IYjE6/^=Yor]j[3>".DVR6d]TjfR/WVDPeqpIcpO?J*[/D$#gRB2SV2ZIMK%Fka -kF\R68<5=fdXJh2W%1Wi@Bjre9!th6*kJ^.mFj0S!#trh'RccAeVcT)_.U6#$1!MTh^e#+Os:[mYPW?5 -23/OAhr0UT@W+0m#4K^)_mrm0D:#bO]2:Vqn64s+`9H?icEPD0'?/6]/:rR+dk&fXCNF6Vb,XBMR4W+7bLraKr]" -)?W9j^B\u([`JDXeFXjLI?BP")#n&=!hYO=nIlEApce]gY,k,U4#UOI`TZc_+8u4lS5LX,%ot[g$QQF3 -3#A-JnJIeGOT^39d!2%-_9%k"@he(rAur2PHp8AsesDbRR[u0&Q>B)e4l)N]W&Lt4n,6#%7]:[M)oCFK -%[!^ha0RbX/c5i5,^kFg*[p0_KA5qHJN%_#B1#=6pk+e)3Y0eb%MY-EW`^*^&]\ec+Fg]>VK72V<`T6Z -5n73/*!gJ7G!oYS_MkmsB7l]0RQ5lo-VE,Vn'.Z%^<54DpF,VrmdHfuWmM4X\i`k+I(j]1a\5W)g!ZVQ -i9oEppBU_[UJTGeHDS8p@3hs!M`]n@K,MIn=ll#[UCTLrG'G5b`pWMmGJ`(rat#.3f0n28k<*D>TOV9! -I.[Y\m,MWbP"/tOHCu7U&9D^cD.P^n]P.J%Cl)oJba']^-L_fR[LX2ORb%8/sWQ0 -l_+kIc?_AhL@HAD6N/I19+sNidNsP#\9C&S(^BQ*HoW-j1hNL]NY7I,D4]=Hpnl'D6>$4UlAQs`L?#t4 -<$RH"N]$GoLmFa>L?1+N<:pJUCd&n*5\@7]##TX26a^X&(L_qaqD\#?_t+o<)l!?_)(F25BjI$#OhkG: -FQM$]7`9P"36j(:&tLBe#"QtL)T-(:M2!8_1M\"P_XBXZQ^R0AUNbD_U86T7=j$f%jS@RaDDTIfNsAq:c$aiK#&3^Yr'+SC:9.EYUg;D6HX,*K%C -%LNkLT+WU=ap%?Thr`Y*9o%UjkQ7/.R;pB=%fS5MS*Mmc]6P\qK?5@BOB@lcQBm,=.*/X\P])[a1)DB' -GZ&Xh1rsCm*^Usm&a-<\CN`Jh9S,ZIb`u\!RW:REhoTMF4a.$RSO;*Io7e^Uqso)JDt_FL7=$`fAp79P -VE;D2ejo$qra,I4N+h5V7L!_h>f/+5`aRcM#,T;i;&'J6V^8+.jLH@-LoeI>F>aNrR>4mF$QR_cj2M$b -1+l2O)2&Nb&)soEh:;o$^JD!@CAaiE?+aF?DM2KJ*qk.^PKn_udYo0;`c3gF+^!s"akRIZ3F[ZXD?\bVHC!BJRj"#dB; -m4@[&=f33a\XQK91,$+8r\*Eqni])IZ+-tsOJ3h1a_m&";.`CZk.GpY]m3f!NuU\FLp:TA;`Vn()_6"/ -;8<_k"&0uBjFq"&eN.JC7lA&,E1Oq+0?/0q/c4@^`E>SeZSX4NFGS>c_QFqqX1)).6Y-/>72L/!mQuoQ -ZNZ;/7';( -VFdM(%R3#uaZs#=)(X3VN/AuT`M%[]9IlRD)[U5.A#L;*nml:QFQRP(_^]^pnejZ56_qJZ#t&Vp.+s,Y -\Td5,AH#YG0`!'<-@GiX\0`-^1/5(8`Q?3$Te-qD_;=M*>D$E6Nm"9T^]>#=8A/Y?^W"\N9srB(CXSUSYIe&]eZ3.R9p?LAfos%+Lal?2J4)"AiRCN9-ZOm8:%3g7q`Q) -]MggoIFFJbcVOikK8]UG,;B`(>n>/$kDj9^$(0ru*(V%tX;Tk#@k.6@lqV!UTe`r7btgHbZ$AVNib$E5 -Doms2>WnCjB(W'@k)FE-YA\'tDX+n%Fdo?lQ%`9"2g;A*lgoD-/iuha5H+B\@H;q&T?&6?miB]QdoQc7 -Lp7lTe:Q4>)G^%91=?f5gU8Y:D#%Qu%c.Xk97gI[U/f^a!..!q!u+CnRCe`[7JSML2$B@>APj*+%&t5WF[^Akj;=(?j]?V1uG_c0hQ.1kU_jo@JaW!;_ -l,:!0ZUdTtEe->HJ(E;tp1HVS_MhFUXrWp?S=Jc>3"sjR1ZZ,'?LkK''^I&@bA-/.M8mXtI.hUoEWq5% -$]q*$>VDLX0Bo6$-K-#CA"]Yh*S1:2=J/n$X/"e -$aU)-]JJ^/a?)o_$ZZrB`t`:/*uO9CV;Du2Nk;TUqrB2OjA%LcKjs` -VB_etQSZ0A\_1O]d7S#0j*k:%p6bC#iDsJ=1)"3>_MqgD;/^6Z -I`+I?g[s>lY=W*'N,GUbbXo>CAIT<6L-*$h.HC,g%c$##Pn]?-"YWJd%PMbroKPE\'`Hku@tN#VaK2&^Lu -8%PfAMmGKD3`IkiP(FeR9,T0mClUEn#'-A/)nRklFn<5.Ojan$oSR8c6hg=JRBUr_0U$oV]U9WHLIfT!mt'eZZ;*2]]?CsR^mo-,*^*he+GrOc;*n'ep>)W.#K(ZoVDu\ -k)(l:6i,ILS&iD1Pc'/E>OjGEF17GpMHNI6m'Je=M\1!k)j9*UEg#(dpePo"E]0,/*9E557Fr37@eR1T -.o1Rj\h\c=/#GGDc<"_\<1Yi3c7Q!N[S,7G.dWY`1)>O -iQB:O$ce_=RthrhnRP!B2_S*u%q^*_Zg5Wd8]BeC=.4RTI35mmAS.=ic,b+qeujSXZ.Tp$^R]U*Z:%KCK/4_iDa$_^An/lN%mMN"r5k#D;]N4q -Ob9uDo0+hZMX]_055u;R*158;I6c0G05qfKJJ:aDH]n[*XK1bFVU#;b#ZZ;D->M--= ->V!q*Lq^65qcu4(,sTt.k6V5no0&]O+uAo_GcZ2P$bE`,QX^YRbSaOfn*rFO880;Z-2 -h"upH&BSkIIb%BKK%A6BD<0FXH,'&\o.h!$rl*TpI;nsgrR`NVj4fG*4$Ro;#0S$hP8Zu[[G&Noc.M@8 -J^.q/%&#@^F$G#?aIVCA'3j5EO[ZG66-PU!mC$aWHSSAVTD_pU=]juO[cDfLaVOI7:OMnP(C`(b(I=@GlM\rJ8Q@AXM[hB&cS]_..#qnm4f%A'JJO@@ -##R6dNT1<#]Je-r(2:(EA"X(SU_uc#hXdr5Q[*CdEQ9&8VOb$-i9P:[c5JBq^E2g6DoCiJ9YM+X! -8iN(emcV$Fk^U[YM%1[^cSf)6HXc3C?#NQI'UbP@L[=c'8u_$J0^3rEBDE[4,; -QROYC)GjjY7B;3A%L7lgJ-1TC&\R$i@\AO^WA5r#oNtXZ -=pqG:g9ADDr!N,H?mW+0@-1UC0]\l!a;p;%om'SS[:RVu/,pa`bKg&gr,R5HNiIJ!7ZDH$"g6L?+5'/X -I9Kd7+h5+)IU6s!Dp#dg\\=V[ZhHc"EVs4#9-?\S-Jr#FmucsHjpc5l&(G0Mk:8Dh[k`7Xq`Bih@8K9= -:fiC&T:N=o+kJL:Do8^P).6pTd@g?#"LdG4jn"lH/;Z'p@jVnr:@[,20pXA;0-=2 -SDn)6XgDp29$Db`-iX.@C@qOThu6DOUN^.tTrUZO_H^O/>u\-3p -UQ&Cg,6"QF'&Tc(8@>%HhqNAso)%T83]!/U#G'.j$k9:!Td-8G3'2c@]n$gB6":):fGa&iV"e]efkflh -rCsH.NP;%0gF#N'YQ=Yf6@ia[1[r[cf\5l=X[Ddu -ruT.(X0r%)A[p?pNHRdb.a])UI<"ru(!nV+F/^l)3Y/9kd=IY0[uaNDs7pLO#AQB=MY[^J(S,8Gj=428 -fGucJ1["7@0V^bJ;(#OiqDG+%>W)AoRCmNTZf&MZA($S;TXlc6_!4N%.@pILC,ADtZRfTpjGVOjq>b9+ -Bf@%f:Y[ePf<+$13EMS2T931)kZuNVc>U?G[6DnV#L_;e9`Ck1`>ZMgAW2[__8mo[nP!D)l`!)D:#>i=/I0gS -?N7C4Y#p&tc@#5sPZ,!$?WAon32YTC95ipZ)=,d\P8=RlTH0UM3AD&2TkYrG- -pk`96qS=lo'I01m$A1Eip!hHJfra'fV./S8p==UgS*Oj"oZ`Xh[qO/1I]KPLBPoB(BF[dcq&#XXnu7o[ -:"!pMn*b_4lH7]8G3)#is7p%cX0[238@?!*T4Kt3bCfC.812*c5Bac?#io$.PP%-B%A'!d?:LD6jOF2< -X:!F]En`SX=9_U`Cf3@%jE`RCSkU2MAq(K?B<(soY1n!&`U%DBj!YR3F[RD/G?qAR)#\"P.b4P-eBdAj -5-'!jCS93*s8,5Gli5n]2lSiLl0(K_l@3]jBj(Jb,@uR)ctIp"qO`>4?dr7.NDX^0F"33*jPXRLrb%lm -'RHc6ro3dHd5k#;s$-E7VC@3kWrKWaZ24%@Z`9K- -3k'7h%K^Bhf#4pAf2RZYEk->EOP]XSec.`KofiPhmQGnBq)5\Vba"_S7Xck:*a(HShbM-HZmOC-BUfI$ -'UMkRQGVN'-]fg,`i?#L/+Mko]j"Ae/D$?o^dM+XF%$j,AW9srG4Mu,LT1kXjPIc%^B'GF`;JZ%Q4LKpiUg%X,F"]gmNNW+5e/F4,+0Eqsl\_FO -aZ:]S7Sg2,6B:;eP*K4G1G_I'_oQ$AihSO#UGY(gW/oNnj]$ThaPlSa0D*7&B@[ulX4OJ4O\9K^EBL)! -3?IL"%;q82C\5`[rmi"C,/%0T%r6pXdlq"q%D8JUOK:>9W=0eNUUTDEJ^]*aNS^`Ccrt;V@r@;S;*F+( -C5lP)H+Sn8etY,!\[,1Bn")Em&>[OP;2:&$T/m=j94HJ(W`HAes&rQ,nkiOt___^!2W[N7u -DR#kcki]qcE!5K]95F1B.QZ-!]t3Wga^ZI\6`/j[3t:<=DN"YiLnccdl!qF]uXBpQs-8ci\%VC'6CY6>Q47:J2r$bk>]Z;cKmQ4@FOT/O4dASe01nH4UT88f[73CORTcI6CCs+:jI0D=ntNj%US%DcW&:r_,HVRT5Po,R -Sm?&W\c6doXjL.J9j6K*&_%`!"fZfO#8ct'Z)VF;P-bo>CfeFmCiq&rmscgAmQ27l#]DQ79^t3II*)10#+r)<;W;PC88A'10PXS"9NBd17T7> -RqWDr^"fHLO$AXFLO*-T?"&Nen$]5?&i`Y2:!B[1^$9>!EGDsQ4N_lETkMCdor4PucPFYF[IVNRlNJL"\ -eii]V3-C#Jk$7=-h1o=0q@2C8/5N -Oi_8![Dmr933&S$-X@pR^*d\=\SCcf*G<1uD&_?8/QN4e.f3 -[&Ak%r3oA[5JX;'*L=_3[#>iQO0:$:TCh#8>7EC0;rascN;h8B@XM7Tj]S?=OR@%EFfdIqY3rscjI7i^ -5`/p$Ml(9]d0?,@Q$Z\9^&MX2_0mt4g\RtoWBH)^r5BD*4Kc -#QI&tXS2!-"\0)%lZ>W6-[aL -'E:;s"B1ib=pt5.83]:$6=&g(?WE'q4R:burj1:ie9cIEhHt-GNl6S"hh*X%rDOq((!]4&qEZG#8/-I9 -$`U@uH/u!QHYr65KIsF:CD,W4leLM%q6QC[IFp<5Vc6bU3m`6Bj&SSM`V7u'`Unub`slaG/mZe(f`E%n -a.X'.(lHGug*U(9sY"hiNiMJlCfDkf7 -S^-XEqR^I*\i%+:>fc9&D10lnhhq#7PAK^I>.66P]$85pUYY48dICRh#iSEnh@E.]-'20@rgPKP_d;&R -nf)#k5ckrEXJu]"a:Z/(@0&qq0(VRooFHg3775NmB-%TOS;kd!WD.[dmUp5TcVEENBXO)L5cV[pMeMX& -Pe=Q7b_72Z(\\JG2&]u:0u2$I+gUD-nL-g^Gn4Z7k4V4>%TV$O4DoJ4+g8@m%,lZoepS`'6,)en8Z3OJ -=C,s8pLtTX_j_?1om_BW76rSS#?(lu4ap%PlKPD:SPR4$E_E,2VjG+22%!p9:;6P'O[$#HTL:e%?hAAu -l/h?u)kb*Shi2!KQb2"_eUXc->W[IZH+_qg?0aD]gs)iRnoFK_Y(Eds4_tSHb28C_*jl2"D>^_,QgG3g -ncTuHgmk)U_"D`!O-fa'^'XN[0D?T7\Hg$qIF'p<*lL/-0]mdBHZ]C350Sh9b)Rr__n+1k[Pn9DL4GINTR]1rJ!T%at"aDV^IjC*aJ -])1.c2ALA4:O'F>k6'i-mdAnDET2hA:-P_'dH5dkqmp,%#@52ar8sFC93GL/fk5:A+1Qj]eh>`B>=]A! -9)dS[(pX&]+jg5:%REi-]]n^ehtVP8J"?KB@p?0^55gDmO$EYchMu)c5jTena8SO+NdUrdC,lE]m;HJC -nsLe.OBkpb>S)_Bb4i7EahqA4Q@9ICaj`Q0,2ti!hYYZbPV1i#$?Oo;-nUBP!?c.>n)qFt-'`3pIo?HE -BB8_)/ZnV_$fr=e?hpkkK*V&ln21,6o,$f7h2.//M>s_ceE`XBV:H-`p!6Ok-VDQ&F=j"I-lsM6<_,J` -`YXD6Q2=I8kU!\54q$!%]W&,*qMJ%tUCV`q%JGm1F_fmk([a$Y^TEkdAe#l^-o2o$j%]Yfiu:i+k=n@Z -E2aBH(N$PiMY:C^Ise\?cKBIR[cV,$@V#.#D>RJqUc4FVa#`\Ni@@(7Q+>COAZ0_qGr`uVdnZL+jf31r -d%Lq=,_3H*p2(tAmqR@:lWl\N^Y`);<.uV'V!LYC%f)S_m=FQi;5D]IY7)q6UB,f'pbkU5)A+P4c!)1G -r_i,sY:q"rr*4`dYp,t8"1?"cMTh/p`.u*9P%"RL@uuWu8^I+S<^,7N8&/ap3sXsJ[\e4F@]\M(/&/4M -d6[2Q1"T9gF974;<6hM,8(>fkX=1UA'j"E6j36'gh-bBTH.HK:I^#eN@3SfC<)g[u*&8E1"!/PdI'uSs -B]!pES2X$s.-/0-B^KQ4[.md8fSG;Y?Li`goWsFo[',,#0*eoa4NhE7hpdh?%HMr\B5HdMbEA-Td$Kq+ -T#L&,uC" -%+D>iM9IXg:0%tIh\!BaDVfH#" -:Au`;Mtj9'/oTi0BC)mDgLc>Pl8idSfN-NMcm@N!l*HE_L&+8WjgMt);i=o8jf_/'Y:\=,db3j"WpIFP -s5dES&Yj9BrYjp!B-1-aD)4IFQ.r$g;lB*iOA=ajB=r6!`3%;T$+Z;fUN.)8P%@@d-P;=.R_1=E*;o>6629uT`5ZMicH+\(W -[S>r`BhbMZ`qHtBFn:5cBc4IkmA\mLRGrG91N/"(um?9/a -3BjjPPO6H0;k5E">uaN"A4u<:Ncb/gp#+\R4gu+Zk@sR84r*m+l*dTqjC!GdnC^f2e1#3UZ5krF4E^%] -3;.PW2bA.>dR("7jY`dW):3_sX83s"C&.B]EkdEXZMe0Hh*+"t\f\#;m16ADbj(G7*5>\6R)o"ueZtAJU(a@X:S[]N)e:q-*g\@o30T5b@@UcD1n9!?POaqI5G6.QS)sZLqdoA< -l_tuSPTI^99irT?`k((1o\&ZG-4^$//DjI -pr863>bbcHZ+:9H]2Z[cc'\r>L-Z:Yorg-XFCojifu+QjNL;HAg,LlA`q9HQOQn;Fh^P,N8GMPb([%IX -gb`JAL,o1-atTIcaG_)+'cru\:=!hE+)!-NBe@AR9/0*Bu-9WRC4)K -&,V7.dAX8;3#PHae%2;ED`[P)opt&'(sn1^Y6'#0>m46cRBB)dR<_Z$Oe3!EU<@^sGYi7(NJ!u&WQOc. -#9T$`L8g[c]B4(7o?`;WB8q38;iFbb\a#jmmJ5%T(>UnaQI8`<^+LMg)bYgY<>AU-cg#j>o\SlfVXRSt -I(Dhe2`miZWo!_:"(VkqOFN\GEG`ie)ho(jOZC69l4df80P)h4jsoVHZ>4"pQEt]MM54irU8WbNBqWGAu"[]4s>j$FJ,GRdu('HR&dJ\8iU -^9dZG)m'%oN=neTM`+)3ZdE^\LO@[Tll"J>bZ%0`eC4?C&,cTEXe^9jRE'rBbJmiYOdVP6*&Gr((>##m -I$6%tTh!PLeQFEQGC)0lS@L#.[d'BKH$/uC -?6+C2/.,BQgGhj3VJgY*RrqM,d[R$cZG'gQR$fe2l^djB/3R:gs1RjCm`0P,j@WF,bBgVZU[_E0/La5H -=+3+N.IG0igXWP8g3:QFkPY5gI-`q)g35V]B.>hFUU#UV=`BKR;BG^QQbt8r'sWKr5am$lRE]e5ie>Y+s0D*F:@kaZG!395(*-UCp>)n&O,F=aRQ6jIHPruB\tDl#,6NY -AG]-sfQZI*gNOb;#bAG[[2SGEh&TS=cG.Hnjk0*C(ZacZq8VhN33%+0DgWL6pRA:=qrZ69Wd#=>Z2Z!! -GI)E1)W;n%nJmKjeit%9np;C2nlHDs4$DR`$hr7U]3D_2>0"ZJLT:RC]p(SWls[ -!u4I=4Bm;,MW1[:XVLa(f_'f#s+q*B-1TSdh`P1"#.e^^2UWB7@?B[,pL.;nJg(.04Xf\*/N&g,)tNs>?omaVu9q'Q1e:YpY7"EUHU3)4fbSHX]9>*bZMOfu':mXlA(a1gXM49mt+8 -h/2/cQAO8OH(L;_Ug+mo.`X5*UTPKVDR![m6 -rDMKGrC+n+CH,CTJYTDPCB],=^Rc8mY^@@sSgZ)N@ssmb/+E=IQ+sY^\/nQ=Z\gqYEe,WFM:V?pJ/*VU -?\^ua1V/s/jqoUfYt+L3]f1G"/cEgFrQ2N5nVsgQJ#uiID)hK,`B*tsJ,`mU1H0IqAqcfLpOCa^>p\Go -#B/K6Y31:D5QAK$Z0m+VDuZ_mFh#ocqrnT3q'`Kn#0W2b^.;I&WK&c@AVnnjfW[NJ`AN2N\/17ECF]!QPg&RENREC\52%m;(V=ucAo$35]J5k -YJ/0_na+&Lp\Dam`#U3iE-'2Xd]Gf2.r<2H]DU[.Pdj2BgJthEM#B!>B*VM=j'$tc<)_bl4h[tG^.>_L -*?92S03[I+4.-T/R!6S]?3VMEAM]9X?2blNF0Sa*2WGhg?18nK&f'5-1lT^s8uECm-N`DoRu;fE92hkb -]h#l-WX>:_O@`$fB*[>$_-n3.cLbCXLp9\rCrLUSMW_#1,5KBnD`4eV#=ilWG+BQ;9"1'*0f&3[WdZVe -IIfXoaddt@4BrV^dfY.*;;'s^b44De3(2(?D_)<7h]02jJdTnhAU_tJ^t/DG\j7A,4M5^KRI'C#$Y_d3 -GVA@Ro-UHYN$ljcE?^GSY*C;n+%E'M*4N?7>!Z.Tc]*"tFo+[H?EoprK[n<#rLl,.qd:oI$66O.AOHa, -ek,D3[8QX5>T.LjJ=&]sObfIjnG>WXk12=@%AJ'`*=WC5? -H8[DSeOhF4.m@!R.D.8s0r+E*NhgK&5:k'=.Er7oF$4:BiPI+i$SP&:1hUAm9CmauiE)JSR]<2EX.3@^ -(E@;*d[]u./^925TCTQ99RWa_6049Y\fb3&bmRuF=.5IM.T;e&buI&DDIdI1EDLLgT.coq^DJbR:e:29 -.*W,Q6pB&32!S.7o7@oc/BpgHO&2:3:-PT*/Vpg,R77D,Q0-tKbhL:@^s+*^X2iZ$+H,X"(WU>DbmQ2; -5LM[ZE/mGW(Pk7Jo7BY*9Cm`DUas[t01D3a0=\(>o"#sIj%Aopkk/X97nB)8me8'cDRAShk,!@jKJ[>, -e18cO0Bn`Y09rlMI0\@PO#/MTp'IS+Y*K8>KE?98;:f2pYlJ -]VQsX9_M#DBdPlWNuY9k2@=B;iB]-h_)E$MbmeS<>*S#dP=E`mdH%X%3kbE&U.S'&GbSclJ"9A@9c=K\ -69s&qYss^p7`5#r/?C8q%q[0UK0eeAJf93769EZJ-^2\4^.b]e]PC*i:>CfDUF:\RDeo/p"hbP[?JKf+-A)1mX0+\^m^dFHR?)ORNicK[@0+nNabOqDPX"^Tj0jnM^%Ofpek/-G2u.8_G@iA-6etgt$KA@Wph[M[TGC-P -QifUL$L_gC^@\-O?XXDN -:AJ9J0=#4:O#(Zab*(;ffkDG,/tPLe9$5d7:I,f-Ka*QP8YVfuc+VQ$74MGn6>sdbRh,LR!'\ -BTn?fjY]ILCur&o*DS,g2-X1:pIeN?rj;6"J#tG;O5#\1#e""hYMiU9djdQtZ?st$[[#I1rI)>&;,>T^ -CWh/WPnuI/o("h$HI/\[ibsi^FA]u7Y&pM(YkuKWG-52[7U202;X?FTY&GE -2Bl_TITrXoEI/T%J7I][&QNk!(-dZUH.uMbNps'4S-^^L2+s7Sot%M2MC:Z,/2%Q)3g/r]]2mbn>p+2L -1,`^Yr8mDo04t"Pn+iiTGL,0'%,-b3]Eta'9?ApQruOsAgd!K9B(*Nm8PN[i;2K"2+=ru -ZWO,dQ$j%n\:,-mHqn"&KDWj#d;RfXf%/S:e_5"aRcA&IDa+gjh8*-K12g;?U-.jI-!m(2b/kYNr)`FF -`:%MX#52cRbMnLsNimN^\0f/![e7)O57=XB>`>c]\pNsKFc0EM?/hI9T'`'Xhi+H3j2R_XBU`m/l^TEH -gn*b]0tu(I;sMrCK;rj&CQ)5rp$taVAG_!$ae?`fT"$k=ikfjo-O4>U"sM[L^7hRT3Y+H.Ron6QbT`Y7 -GIOmkh^#fbVMNBi=\M7_YB[fYQIT>fD]7LIEfAIj2(1mN -g8ml876iB:Xa-FdG!uf:hC`$!?fb-E+Pt,g?5lW6fIbkcrs*`f.O%o8#C#&s\i/EL[gm8\hEC=f!!S!f -p1)r&eH`,0b^k[drrOk5OEIgn>D[UJ'@mji#kF9/6pqB#=49bi]E>8i`_fi4&,5=bgFDH>N'cAGW+QLY=r8L%g1lYbe=pSab9PNDR$\X%!]PIKlJLu/WlX0DeYG.?3,<1L -B_Y?>@8@7]iqW:NLVkWEFHN.ZFI?HN+fE=*-"+Xq9%r+kG6WDafaGnoom^peBe^%]aH>.c>)K(oY)n/o -R@cs[CgqAihLl2?]YH6u)1&_:i.tcS2F]"%1C?%?q&:\9k)^Q6j>9>'7U`C#.b;m,+eR>cW?gaA,<>4c?Kf"8jpji]WX -=^`mUW9Ak5U]80AJNga>aTtYXhS;DBY -!f%ltN>poXKrqqU*mr`EHS(3nA*Z+<&1I.IHL-#QnSQ2f.ki1**9f`^Hr'u/U0RPf./Y*n.X""hMkKfV -a"rM-]?VJ8i(^hrV(,:`H?QTL"#auN;aoIZ/]W`N*;O-(Hg/8gK&R;lMroD+XR5`=2nbMc\u7KcQ-o0, -NQ6&RSpQ0$Z2^B,#g75]_IlY<=C:HSXCG8Y!nY`:2nD'i%^?EnE\,d1dTs*]q=3ApNb7c`a2SW+P%L+%S@+hQmOn18WN:Hg$]7%MmTc;d$"KNOj1=0=LYj--'N5g4+*kb3TG)6JBf/+4.C:2\mY(u<:(FG_>Hdk,Ym35?0Gio**Ig)QpB]QMZetr7#PRc -m^^b=\RX*@=/`he/![in0._iiE;i*u(B,[oc0t=2_>Yp&aEPtAC>-F*Rn4a], -4[Ges:9R?Vc$2:p8HJJtdiYTk'Cl+8DsO.+g!J*I)1lcRm45tmj/qM[osGq^'DF"*mHWBZT^EfTgSg?7 -Lc-R&2teEgH.p[.%96#;#@'+ahS*?'hUKq;EE-%m1&[PeUfuOgb[Ns0?,b81Bq2+r\6'YnZH,*#Yr3p# -'\t)f"`Oe.R1ie(J\k$M8N/e6Uca5ES,q7eM-l\%&qdH5AprLd]O$iP<]&-<)6YMQOZ66l`q2thgSCCM -Mce`%S_.B3H`-TEF1##TWoQesk:tTON_T;qT7$MLPE-U]B2!7[8Z.A!e+V"E-Uum$e7bfHh+u]e>QFgOI5;Ic>;A=1\)5 -,_]0F0Pu-q,!3NuCRtGiAn6;;Y1\gF-WqsjdG_qW`Ya'cZdeFp/rVZa4W3gs.&U'C9NS@27&j$T]L=I+ -c.\.uNC],LQ-=P7PF!%9(4VV"`]hXhm'Oc;f9tHm9L%d%Q%"lE!K2dh -Sr`R8qqp2kNuZuG_BT!E'>&C:s!QE;2N7YQT+#*jrtD$fs3DS!3Q6QYYJ(T?rd-B$dFXN7L^Hu/ZW4+eHgm$/l*1Ul(E>8eT+,%N$;(7s -Xird"$afT`L-@GR-;G`fi^c01fj'//UVS:s+-)U^mn()YCM,6A.-V2JRJZuCK8,$OpO^uR8/4XK(AH_s -enLD'ML[.TLH+%N&iD,P>/#"-=&DmLAW7G41R%7F"+FHYjRjlG#(fGdW#ZdW^))45acE6TMlWceS,EMN -rk^#5dt*9dVZ;i(E2k*.=3ji!:^uga;"Zs$J#ur%Ilsj3Xa0+c6/R*8C[%lZ71od_6"/(R;([7*@l@r6 -r&o<4,YGd\hY&dU%q&AAN+:*t/RSJuN/8SS7V1jL*,>aSOP`WrcLY1Yr0t>U9[c='6u*")@NoXL2[]/_0@ORTl8h5ZaHW'0>d"Xhe4m:q)VR5'SkJoNn#b%k06ak)#p9^@9'=*979_ -pOpHs/s\I?ao2B<7RmtqS?^ngJ)H70'tq:IFq`JX:UW7l.suP\@jc`4nMjl8`LI>)WD+BH^kd]ZnRH2;XtSP17K(qDY!L+5a+(W#gef -EC*M.ch9jNA=Sgqs(n"rH>eu]k?#3Ch4l;7:!;KTk7Xuq -]qgh+8d`."%t/qkip8CO(4V/[BG!An54`*2k[U=1kqdLF:g=i/_<7ErC?`EUAb2s)'b;&NiK4#>!flEO>)Vsb?#?fK74#%KqBZJX>rHa0k,MYr\Z7b= -CXj5VeAMf$StDXBo>NS>qVjfa>qpuK9q"%Sas^4AqF6]WfUMsdk:]\]BYM5-3mb3f:_3G+6eSMpX\C<^ -:85V/O@#A@)HSHj%F/m=&[eYo&p;Ja]6Jm)?MU5/ZEVg`g/khi^XU[hH#2/[)K_CaUQQ8fn&Bik3D=$: -!7,-qACP"Am>rsSN)2]_'t.",K($$I/hOrag>E:X2UK>lGr&7!?B2tfDJO*Dp$G?#`\'dX:O?51*D -?qU9\&,sS&AjDmJQ/,g2lZ251\;O]DjqXl%U'p&/Ts-(7dBq@0ltdu7E`F!Rk%F"d2N$'_?i18_(b9(Y ->d)Ckesp9Nq#*`gn[i"\>'mjH^8U>-V*Yc4/a6iLj[[$]B>dgSH6o+*gg[\h+f:3U'>V-e9:S:9aWMU% -/6/F55p0nDN%]e_7X2@Eih3\O3e]_h99Fmieh3h?*c.\'*Ts/VNXcY-l>NrY*r!?<]9[2m"9#WL#IgDA -65j)*BO,haPbE5"e6i)1m-g/[@t.)-/`2j2qIX#ZbM#$r_J]DL:?EVNkli9+5kW9anjjUW[6Lc^#X$?N -"_):oDj&TPhkJgf;V%+ZZ\6ok3eqq66@=u@tO -D-*=4EbP-i+0DD$o^8tDUR$0H1%%fH'WOOUs5NYJI3U>Oqo3E^kmM.Sl4#t^T8tq>,5IACFi'/%jb=*P -5O^I`p?>EnbB=$N/AftV8(T#\O'-;dS]1;rH!7tK5G%iC"PR!_Mb*E1SCq_\_S0eYefH*Ld#f9add?n/ -X9-'/Z1Zk6M.ljlk$,Sk@sd8V7XAnLAf3"$+&k;04t(YlrHGt(2qjKj+b*NphP2JDca"!a`Ufq#oOdF; -U@.&s/`,2sM`8[?[nupGDiri5=,S=-HW32B.q*^aqPQGK^%Z20;+b//4.[CZ0KloR+,joAWs;fiIr].r>Z-?_M%&.=B1.rY&Z8jo<8Ufs[OE6)iGuPtIF; -odR;!hiZ2[h=^dIIH-U*I,gL)qSJB%HG^9k9&@t_q6H(!3ZW6T=DMgu8MF>IUWQ)d=CWEG%%tLlcMA/[ -Pe$YRU/do]DU6P*Nr#F!0ltS=35-.gDiAIg!fcB8[OpSkNp4&u@B2MdIF7F81%.9s5EY&ShV2jTNFV_O -0D4O,n=f=>Qf=#7`q,7Gd?eAIN[;dq^L/V]f\fEZFb+0VF@WR-(p3hKp$@h]P*?lnZa&*%GdYKbiLLKp -%CT:\rj-uu_BV."N3?iP`]_KQB1s0lt!idV7#IhF!OtVT$P42OEWYof0Vp&ArhW -QSZA5_]'e.XmU`tM*Io;EG]3e^n -g2Ed+NR(/SZ3?.WiVN&uYttA?U?+NWe,+t9Y2Vuq0b)=6,?@hq,)%Os7LE5rN"iGm7LJf871,A5@mp`k -j+rM?W/%\YeGga8YlfJ[*CW8iE:qOJU%V\*.?*iI?cONR8kZYZZF7N'FK2(j>TuHb%IMHX$MlbP9&&h0-?^YD4J%Y=M^\0\X$i>lG)q7PD@k_5jW8p+pr5a@_<;"c?7hfcg*cU#ZUZj]^M*7(Kh@B_>4$oU=(!/7.$8S(H5s8 -+a-ue"*aV0N--o7eoBM,Phct>49XnQbeZZ/ghNY+idP'ZY9r;3;f/g3b47Zf&*Ih+TIhd#H?P4ij<5;r -]%lpbn_j#0jXoZp4e=3+ajRN6D) -^l6?EJ$j)b`<+qo39ru[n'el;?=kGcid8AnYdJ@>-#uNg#<_pZI?(.(di!Wc]NqpAJ*9OZqQB>MlE"e4 -;`lS%O8GYeU1_LY&1ML&SlU)ZkFYIjP-,C.$L4p32kmTIYW99u\%hlCN,n6NDu9(n`To>Fq%'Wkc,PJ0 -X1V4de&/4brKa=Z]KnG3c;Y;X##R-RI'u5@9sfSFX%i'1I+PB$K@a8:DWUHqS`lg;*DcKq,/dRJnG/]d -Amu=5NH41as*LVdt]@ttqISSq$?YANnr5J'K/G_YXf+d8@ -1qZ[[hSni[/T8dDI(JN*m^`:4r>:#"ofqq5^[eAEKVqnu4!0>;("kC4[Xdk5]b\.\Vc>;omo&gu6,*T)kE?7]irDJ9I&)8uY` -^"UdafqL1&coO`cXp+2JFB]uOEJu-oVC6MN$oYf"Aa0-`5?X6!mq'U/bp.(>fGj0S6#epZQUpad[oJqU -kj+)o-EH?t8nBL/7?3r2_I!4BXO#ItijE9ST/,Plp3C6qAQWH?l1gh#T;$ZN]:sT"8Fa=jZs"\9RWg;p -74TfWiNnLe:!,=PA3%43j&>Z1p1YN\?Q$ZBJ)[M/(g44H;9u%<#49I+/0fE=:&_iGB*oYHe\@T)&8)@u696/UVC%8LaKLbP%Osn8*GI=u"(kT%0800s:6(hXe"j'g#&a -X/-3*Q"e"[nN]a:Wb@fBPn;Q>CiA9BHV`Bf:!l^=):*Mem6-6#!c2dCqi2AX?..hpokh+geV,hCS:bLAH]c$jMHNNG=F;g'^.n*/Bc)!I,774OEeA:))hUZh@J -[(V0)Hg=>1^#tIt3pK@X=jXM0\#EPs#id8;pX#NJ5AVWmU5#G"7Cg;@P^:ADobotr[m[N-+-=SC*Mi@V7KZL0]tr[23:Z$JikZT^[I -nZGp43)==pmtAbaQ;#B;YrberPYSNQTsG8Mln4-$N)"#"s-CA=TrjSm$d\`O[8nI'/rNbal?sY`!<7=a -atLd%FCu(>29hk+c'Fs%^KOf?djefhpT?5?HV\F"X126Bs,BNMS@qk.'OOkYP8aA=:??trGVjc0'mHLg -,E7WSk1L9,2E^j;7uhT?YE\'L:TLmG3q7]EBD]^@@2jiRNY+Os]R3C%\)E0KmnELY$G1Wn0>?9JTDo-< -mn?j?fs[IU7CM6Ho$4[T!PGaU=TAtI[nkhjqe^cXF]P0,^\EX-!ce20h-$dNhV$3F"JH\k\R43]d.,D7 -n+b@]iJ2mX5On9hhYD]g.4JQZ`=2.#e+^:F$++4ZnbcNtC'[oJHc`.+.+4u*q?8RS]qi4b@+K1"''hD]TTZ+uMfKrnFb#bk"_;0!9"Zpg`FPB@%_NfhnC2a##%3a#%/D+8_Ei9!(u*-">_>.9Y&h'Q6@Y251.=lkOBS^kt>8bK&4] -OCJg@mC\:!BimWHDaZY4HRYl^VK1`1OCKuolp[%Q[oTULrj0`8nU#!3po@,TF6aX5rX.i[VK#,KpHE\t -MO-3nTfa$:kkk7R32.^KqIm*"U@)s!`jid\*j*bi:pZ^('1:?c9 -*a*67ig*b&+-0)Gao6/:XLIr;H-'C3=7_U8C6N<,G'YPU6eArI![&C?J_:3Wc!>&JQmjtl(j2GlPd(Opb[JS[mcC<`ZT'o@D -4`E&n[eo]YT!A0BC^9?[\TQ'#k_jhUr>!_6.h1'hG(,2@`CR%+(j?r>MKY!7empkgdV^\3GN5cbgYX@( -aJ8:)Jf$#u'RaPVTNG3`9MeCa!4ULhR9=3H'ZV.jLF -O-96q.muoXPV(atVWV-3j9m8//#$cE9M5*6&O6!?b1S;gj2FBdaa7U(.oE['2&4(Zc28Bl6YY[IkX/t. -?Z"K9eXk[^`&SKnG!\`j2W[Sb7pXisMM;Qke5T@5p_f-&`#nd.=m\!t@m$$a;OX^pXBkL8dJdq!(3XuD -K\Li.iYr[CoL;Q-ME:7-VKeUZJKZ%sQcMOP>!:nr05KCV>cVF!T+[j[c#IPj.%YO/RE:$K#gu?/:g@+c>5shGn+Q+UZLq5[L9!i,o0,A9:6"DC>#4_&cCSL0do9cbe.eEMQg2rl -=F8kN&mEi!I!T#8;*;8uj8#=7o>NRCC_Os3'0_`:3&*8:D`X=OM%nn\jbMGV80f)/D!"0_5g@tgT\[Kl2r9EZ<'.Stu,&*CG;e#AU?$>rS:I!U2fg9:+`ulBAt[7StZe -\)DRiX`UJG@EV?1RmqHM2t=+'2pk'[gF+0@#\BP)X2J%R&?[K-=`2.I]V\a*X-I%c[j9.V -oXEr%2.r=XQ]Ag9S\F-Q^2JhJlE@FsIfCC.nW&*Sc0@C`e\H!k*;Ua;!n4U0-/F>KR7OoK7 -qopkr]).7o[Z'dJ`a]eCU.Grf1V[`G!iO3b17J9rc:3mOo$UW3kW( -NcrgpSVqu=5Cde1R(7;;&p*4;ksS3fY:)OY""o\2E9.A^h=_]CITgUEnt3@.7sQQ$gpsF*FQUl:URaL@ -d=8<]lod'm%#c2]W7ea,+pKosgn[N++7#fd1Q(BfDE#l7N?!Wf:Z_Gk'5B_a2MF[P\ae@:X+^4nT0+BZ -OWt&HGu[_oV1dQk`u@;Q`0`gei,;'nC2U=j -YjSg'9I617o1Z(W`O_qm9,C&+9OUF"!`SOZ`)ai>a,A+6Zh7H?8Q'V0IYDQ2o(M-5m!@6QV.?a$1,M5H -37,(:`VV#l+K;#iJL*e6>(5N?:G/D+m.^NaGC9nYER*KO21=CtN"`W=W2U-j"<+15E!K^L%/g(s\:gNh -BV,(DUR!no+uDOSo/pR45PT\gci:qn-MkPGeWcaBg0iK9_Ygh0.MAh;b=fL! -Q77:HgRZ%ScGqqd4OMX').L;lYpoh\>,m5Q4WchXHGmm]lC#3;_W@-aUPTHYIQsWsLjimZGlX&7UVgs3sU8hFe*&oh[(DOb+*lFU"9"#;nF=&o54#iYS1ZgT$iK -7.Ia0k28,fWbVs;'A(nCcXqT\X[t9UWL@HCc\TURHg+,0P.d#t%RR,(&(re*[)o,g%t(3F2K_4REI*cVsA?hUTd(P.R#qq.R`PHS&;l@BJXs9dd"\b&a+M/XGh)b#>AL=NP_j?8fN! -CIiQhRX7r,B^W](b\t$3LAIaU[0udm38Z6c//fj4M&bLgh[faWlEhMFaAT"'XiMgOQ[7Z%5A$)Oj:aeS -Gh^^u4DSm2Y7VbrdL!QdcfXLmrq6&/;ZpLuhHW"d#NQ$'B.;Lkg*HkWf>,Ao=RfV\tb?^t# -Ra,D(nl\TNF6.%"#JgMf7X)WKs>!ZYF/=PE@l/t49I93C]W)Y;Wd40S?8!QZXX>I%W@BEFVafDed -5IdbY'_a*EosN4)K!S'rH*(KFRTHIJnZ5XYWE-!C=K>C@ITG^fIoS*LT89%q!(GL!%j`s[Y6h_ -@a]7HF]#p:5I9u*hj!6+Q2BFp>oeN(m9SmnX*#99gGDjga*$`F[!(uWF)q##0BKCP3ijJGFSe-N"]QkR -4sS$n+$/>\LJ!TfN:lj8hqp*+Hdp^CbCkn/m%M#D^U)])a&qiZ?itmRWl0gf=^KR#E$T^;%M=P(=NJd]Io$j*=#*D^ug;NYq!W -4_#ofaP6=gQgVHo7qCM:(U\;d@Gl-/#>cH(rl<)#4?"T^i4di2[T;4lfShYqoX$Na[WubGN14a/pko'M<=A*q2. -'7tu1U3Ys3]S>nJN1$]6-j*3"Y.-=O=nbT"THTQ9+!)B^rCjda')e@mpG.>EAld`:EuJNQ(jQ.CnqP;" -4e17A(HK&i2(OO`>^TS*T)XZ?r2j,DH+>d_M>pfh5.bgtJ+30bCdq0L@c#IYTDo.Cc)O7p5M.2WIt(r% -pXZDc;nIpe=\4Q2@]dkO]mJ;2]^;e'q)gl+Ul9%h4ug=W^GRNSp2'ssrLM<,JVBX26&b*D9gF5&hBZRHaq=l)n67Q78].f$-#cE1EP2l,s1C3>j&YpMe?"Ud:$[7Be)r:533mm%nZgBa;/FMCNaTD$"D_&0 -eg=\BIl9kd="^Volg=^VZ][7ihjTgS3bGqbS)crLiSUZar?MKPYHqG"1.s:Xb5PX#9_K1](Q5=&26T)-ulPk?8 -XNK"#*78$63:>m:T!LM\k$c7XQe$bgeF7#)=Lt&;9+s"VqTSD4ZSLM@ql*_D8'"kqs5^%@neuo'h6ZDuGFMr_&$`c*M553LLCO=D-Q`r-bQ"AR0SA/(B$50LJg-PftasC:8 -Ob<9!5HQ0!)+fndJJq_5_d*^?;A>UlFmkSPEI2k,ih0<,A[D6VP9nEc[t-tiZaCC)XEtVmm_,DD9kJ#X -TmJFW\LdEQL[L.lQ/Vk$&IKS1La$cfWG<)/=nbDJ8a5*9kXtRrMCae'e@kBJl/%5G$JcXU:ZD&7IF/T] -4pH]aB;N'idWo=Lc]`Kibb9.IV3CjANjA)4S<'@j"&&CNQ`,6UB4^;`QuQieaB9tZRNle-)`]F^[?:4A -T8i_IR7f7je@h!N;S"e9g3)l>s.$E9'lcB)^Aoe=i)6,6WjAa-+R-=A8n=o+bkF]YPjd8pB'gFK2jK2> -L=u>?BkfHa@2FX>WHDDRcN) -d[C1Emc$qHq`=^lZl"R2_1RGf9kG[;Ys4M[13P0!Dr0c&;-IPQ0oE'l#57#7^PY"@L)K" -^r_&(S@k"-6tg'o"aD!DY;.1FH8JA>oiLoS -e1prJ[Dp8EH`d"c%Tt6%/_1=niXEQ`2s79\DMt$MgjRBfaZ[r)P0Rd/H#de77J)dX%2:&NjKa*_XfZoQ -b^98DuWIPD>OpX^J,BhuP)/@L#Cd1'=oggJZA>[cDT,]<;)]TZ$'dl*kSJ#9#Rr_X,H&NUR -GogHR7<3_:XRu*$o.]_t`gi=TmEA_tk:u+C<9p<#*qFh&fn233iR -p*aS8:)X`7*9;J@H0d8!!lDNYeFU8D](lm6h`/;VkHHo='k.-V0qXMcK_P,n;F\O6R>nb3'pL`4Y[X06 -hQkCVH-9l,Y&:-ibYS!>fs=W?!G2gH6/>8`2_ru^-aNL?YUCcmXDu+HRJ1+,H2(_8d^o'W:jZhM3SNEg -7iC$Hl;9>^iHj\m`N3lW5IBcpLUs6l5,38QEsX'9iOoDS*/+(1)>OS?j%2PH,MrJV'!BMrFGKaq1K1(; -a8/Y&6?,Y/aE)6ud7p6O[aphBl'WH:luQ_`K]]EGK_In&g%1`+s88XNKF=4*oqmb^B)GD*D?9I*1TR;* -'RKE/,m/$F]QI(hD!&hjq?lBhI;6uq3@32r29$11Y'^o\-4UV5oC?N988?F/cAF2/5i.]7c1>5/Vk+b4 -(ZW\!0?)4+bXgr1%;$luBA2lQcGB0m=#J-J`e"$3a^Qb\.Pi+9hPB8HZ(M]ADG!Ig_*_Qg-/.&5P+_cQ -8ikr=MmOco?C=a@q+K"(GYdu_AL%[5nTAn>]INmIWo&J;2`9CaisV1Sc18/G1#2m50?D%AC"#A -b*dmDS<`mV8`e/8\nL?:ln?Et-k43/.O,M&nRtBu3-]OpT=T_tD6hW?AA#;CLlhs?`Uaq\d7YEd]uB-[m[1ZP!f&3%(qe]]\SoF+Lo62/]7<"=&"CjR+]`G;6Mu8&r,O7\tq8fOPfL5]utglRXp]4@d%A'_^qb$&p#7'=#%*Q>*q -3]A6ERUhc0VB]Z3'Ae+[L?:D%ql4:g/"sLJg##JEK=?)=DTG?cRbO'f>%+;J)4K=8P1$-]klWe`&5%!g -Em9T2RbO&:Jo#Pgg!nfST:G1:)$r`QaH.2PajEhTmh2)DPbh?I)I'eDB9#8lDGt^WAR!YI#;rt>X-IC: -HkS@rI`F=T.63:-41(no63#j^B,n"a^(M[hd3ZmQs8]k!q>=3Jl5K+-[\_kR%/^8-)2f"NV -1,LqM`\f^%YV\;a$T0kR,Rhq7qX)5r.-I6[[jb*(C2Qu$R`3i!RN"!pL?:BukR>2gaA\4`0KAJoITsrc -.*[bKhDI7,odloe':N.f00(99>`ost2nb$f@Xbes4nme=l+4f3-ps;mpae4kr/sZ_p^:ldC<75nrO1qd -?<"ZiU=;Y=_0ME7YAis"7?#=Ge)p9%*H3?qs7m'_8bh<270 -#a(6F2k6,3IQM&OBo@]roCHN($>/buJ;_J^E,Oo>!Z&pB2h -Q5/t!cbb=/qE5C6\DIEPbe]ZI&9kFbJt/lT%1`fjZMal@ZPR3aMV%^dr.49#>s1eG,F5-+ -L;NbtEI%N_ou=ujFM6'Z2e([PI/Y'D^VOO%]Jp?4oB^JX;.Jc%AE"!rG@j%fpcXr1j]SoY9YQCfl:c8hYBKAQBG,b5L=Vd=;+H"5n!uS7j/^Ts_f -j"tj_C2as;H0:-j'&'ZT9*1&OVkG>.+AY?pG;lB:*M%+@%gqjU&@([RA0CfiZ%ohQh`+@uc0m.?)&4![ -:s@Pb(PZQ:1D8+lMAZ`Vg;BG*oSd6K6:uH6,]q_cI"1!&BtpQY$M<(Yjq4C(KfKA%)9(rfmMR<%cR:pc -c`#tb1&3oK1]4fNp[O2q>Z55[oG)".6>r.8k*hm(d.\b@'(T(_3="dd,nrB9,l?of)$rmhc#5(IcF_,F -_:e"C@7ET@;9VSpXcn*/3?H<@Shu5pN$8EcXBRMg?>0d@i)UIgGrDj+MXH*-eh-0I*8q%%%Wf('E]\UW%a$g>$/Q$uKl:i7M`u?q*Id -%%*1(/I'Ei8;dLi%anf/,`@4-/-a,`=tH -g,pT'AL92G]#B3l9oB$.'%16^rlS]CdE#e4N.ePTBO5($cj\*,^q>9+(bk+q/I"U\0bDpmGbg79cUd78 -"(igS`B\d1>S?ZM4L?AN>T!jI?YeQB@N_hX86_;OKXs8j@9NM?Af-=oRgo:Ftr-uN)%Cd5;fP\"h;O(tWL"hD5B$S43>ML6i8%pas -X?2AjT'EipO!3"5i)^HT%\lOljU?W/q.#imcWa,p*8D#ZF5VI"T/Fo7^WLABlqn5Qr<9p1)'Afu/*@pR -@*)1T?bNdV)&02C5(dQuF%4#`-c!eo#jbn:n2LIkd_D&Kn4$\fTl9ir=/&NKAoa;!`.@Qed -?EEG4N.a.]5jB4CFUsU=%j_?iA:g$,Hch,@PPF0$5fj -3&obU$8N5@gdlS1:fuR6IkPF[N*Qc1]+Xqn?F[p+7A`$2;WNCe?&C1Qg82k]W-pY$"Xq,j$_9R$$+3E] -,ba4?#?r_MkO$ounBZnr9'j0S:NMln:&X`*hkffTd4RjW6LD[Qj=eQB>G!HdOZ>+=.Img\QQkUcFt&RB -;IJlir):3Amu:V1e^,p;7RHL[;*ugPCe:BfSj;[@GeCsI`>iWZP%(po1]?BnKX"1,\P)`EmS[R@N*V;Y -f.J'qCM=c>mo![Ao[Z@2bB><_0m;fCNdR3IZG\@!KuYgjrQc>fpL2T&in.70h#)kE5+e8u]`+=]E%f4= -GKh]aO, -EXot0_]h;g`lD^b*rk$aZSul#b^%Adihd`\f7T3IPM-Fd7W,?e_u+a=$W^l>UMdt?_'(GK>_-!-`+1cH -)+?j6C9SOng=&9_)t[=1e:&Lc:"O4$9#O:"U/V$(pK#T"=K.'2p@8Lsf[=q7!>pg*%SGDe -qE1SJg+<&$-acD8.*XD$&h_U"7s5C%c<*>FpWWYfprO2ULbC>Lp^SKZDOa%`nWI(V=rAPf%5"3k%K+-a -UGBuO*Bf,oeOM`eh1AEulmkJf*n9OgjR@0W_-TgT).NgsUbM5]J[bb5[15CT\K5s;LFs5We(J"'!ng:8)j.(Db'nf``mT^^fL`pPS%s*^#BE]V_]_B[Xab6i(9U9DiFVpSoi2[-#=E2 -80Zs%4-E-j;]@iM./n'SS$CPIq,fmLaI[7sqlJ=">Dst!+39:Y%kAU=WT8tL_]Wt=`qbc-k98BgE6Q+s -D_?LW%k776/28sRN,nqhQClcr\8J5-'gIlJ>k'W@MK:+Y_`3;KS2ic72@Q_oD&?M2[pe@jo9e,Y*Kr4] -Y(IW:`@t1)-VR]MEQ9`Ul[f"iQ<0``WtEhOMLWe>HH^.^/?eiK/?e7LcVa)606 -A1&t42sukmWdu4P/o;L9hfM&f]^iaRH0&+AH"E$rKu@KV(c)"4,3S^b\oMKRuO&)@c]qb:DEg-R2M1 -/[+B#cX<2KcM/[:/r5Ve\p(\>T^?ZFj2Lm7DoS],Wm'pf[cT&H7)ZO*"qPOg]q,G#?eep.ea'8UVdQW\ -cWW3N;Peds7^Q'cXp;)9@@'6?.R09rio@H=(S<'uY,D;LA$\?1@uhLu(%KYf\6hd&S1QTFqNARooT_?d -U80kp-ah*gCd,7f.#D:"\20jJ6n;HcmdaOg7QDi#r4cU+;6u`RTQWEuCc[uDH%h7o36gE2SWAFu7M0R* -]Sq-4<3EU>9/>!HS!\J0]C"@O\X&n*Ha\ZH@'R4dYPCN9VUI?`XQgdCO_;(cLDaG#$>r.7^dmq@b;kp( -2s;#a4nOh+O0jf.DlbZ_j/k@lJN=:qO>hm"6qrUrG`^82[9csF`$$5Q[NrR,]>`!1:^HIf?<,!RI+e_aRhmo/SRU^?anaR7"b0=$HYIU4eV4RG*AI3pk\b9B -V#J]_IDbf"-2CQd.!q3A(Gjo9#IQ$V]*nWAG!=@2g6Q\??U\NAdAa==-TRo"cf9#KK6'$jVouD#j'K@i -DL6PidL5)WS+K-E@1\^]-!/q0Ef4X5@33&[L78[N/u$^UnkVRp"">hRaj$1(^r.EBt%BjB5gnhEK#O -^95st[e+.W2PV\][D)uS\K`JKtXb!bR\IifN5(.g##!O]IR5h.HKJsGRV7\0sl]# -#hWh!qXiFP*qfo86cONG^[_en4T3ZR=-IRNg6=qid)B\;]PMrDA(CjY1uH13q(VjH>q+jM^HCVPZM!(p -eoe6<5Vk6!3FE,4Cdn+Hn75QE4WbMZS'5J_j1?AH?$-e2osST"a"fdB8#*c3_CJH4cc,@`@%WM['01pA -hF:j.I2+d!OC/$^fj]>o5%(&!;KbYE?O?;;/0j/Q28=,g@YKa[Q,4cMNM]rA5b"MRfJ --W;[U=b.[$TGW!*V@^eZ;_.",Yl;MJ5#e/@_sts-4ZTUag?ZZ=]D8eKBZk3j&pCj$'G`elJ,%I(SEBs-A;X^$Uo%EBEfdNIe -MD]/s;-2UPa-G1A5nR_$kBf@q*l$E:?Xo/T"0;E%pZ"j*9/RYZ5QA_/$[hp;,p`>uhk$Q2o*T7+2H?Du -\-(e]i?UM-77Qnik2a,6JEH'*L29Jr0+N-r=r?il.h2iLd=Y0 -*s[-iEHB2BE_j%A^>l=.8$j?.$IL$)8:"l2CosdNM`n)*!oe&+nFbafK"_c/0b:goC:>2N-M(lQS#rWX -!rCb[#?TV$F8FKslc_FPbf_Z>`Fg$nS9#$cY-R'-FT"q4H]=:[$"mQl[<#D$cMiE-Eq2CDHre\>]U#R. -=jVLgX]tYJLj`XkbJ@=3oK38s?q'D*?W`peh^-;dG)k$+;rfod:p76kmMZZtNn'J8NmjgbU8hq&ZmSlG -8r8MX_Iqhs<6/"ZEV^p)f;_Du#GQO_6_02VLR9'Z5?oepBDnM67ukLUOQ1HLI<(iam@2C@3#^s>^%5r< -cWJ#'3j`hg3.4[7)oq3iHcU1HOlHG"j7LIlN#ilb%Z]"\:+WL?;1b]fSc$QKH@<2QPEFntLYSj)*7j%- -QDr%f:>>+;3DPcc-cb2pj>_N#3DPo/-HGA)>ifDUO!f/ZqsPN&j8<&.X>S6qk:DIu#$[)IoHB3hAjhX] -/<45NYFOYF:+i90-sa93kJQR7c>e0*0(Sdbf?A6GU_)bg@4OHh%r%"CV]DiBAI+kp:S5p&E,R#P7>b3it9bbKLr]>_*lM*.o4Yo+u`oLA:Em)%fU=(^['A$U6'X^n2OYG@+90fS]cp#E7t$he02 -:/gT\dBtXlO8?ed*UTsrN;@:;W-pcrpnh*k8.W4SpDnVSJc@:Jj4Xk1-3`]nt-(P-'U\6Q`mN,J+ft>GNjZ:+s?.I$!RpU2\4S_D#a*"1O4T+S%V9LFAh-qUTkp' -Yqd6Z"+>GaQ2\qRY4U&WGp:#_bY6UOH.8VPitT3BK9lC1hbWp&eJDh1:F:K"$]t2&WR&67[CeoQ04ptA -m&W'ML$Vqa&aM8lI!'m?_hV8EHhQFBWOh^/IR^]X%hDH44M))o[U/andPCUtD`i-IRtYrc;pSQI`2_W1 -%6f&2ng=QI,LpdOS0hml'[)nTIeMIf:KCccU?D(:($VfPe+l__4V)To;2_<\*o]45u8Sgf/)cbL>kH_c":O-Nm!WGU%XEejhOZ\?u96]X"hK@L'@BuIrFrO%,]9uO^u -P@Xl(]eY=+T.?_dDLjdUP$5IC>P!+gs_M2m-"]9qfH<@kE^M^55iO7ofZN)L1_GaSE+LGOVEsAIVD=Ffls]fKF9f -;HDt-[F.?f7o)eqk6_Fiu-Rt5*Y-thg9I36=6sP](od*LI>"[okSmM1nO]o -lL[Q\\=0h!,COpfT<3f*F9XTVC.#os)^7Bjsf;nm3>g+Im3dfWkBD;%]0^*:6jNE.GV>)gjf/f-G)0!LRq;o -JZE#H2sUpo9(BomD?#_=&mfgG.:WGTC$Q<-dO7%4]UHo/-I'4`;oK'l-Dg3i"d/:*T8DG_:Xa%$S+)qh_Kjk"(YC&iA;laerGEYO)n=_p>O)mqCPd!=.*Q<@2cl*H+!545V-;o<^,-/SgTod]4N.X^GP1nf7V65XFK0g76Bi\s!j&^Olo-5cV+.h -TA!Z)2,jJR)sb.6X6bR`b*u&eNJkTQkuC]ZWOFM+47Vu*)_M6l?s]JTg8TXmYA'7[bFGiE;)=,CPpQpS -_6grK"08_-+kn,X1,_;)$DeY'Afg1NoY#OKF-uu*Puin2PU`:@nh&j1(:*56rD(kLZh[p@&U:a;9u>7L -1AUWnUt-mi$iQ`s!O<2ehcq5uAsl)k4*nR5;:@*I1W8C#@\o:)RA/"OE6q@,hoc?CA[cN^,FP/^qc_7j -7,qt&qhoY[oF20Kq9I'>46%)LXgn>&mTlkMR`Tuc24N_W.c+gp;ac[e#4q9L+ChP2Roje8hBcu`%[/X` ->2prHT_D//c*ZH%N%(Tm1lkB"2:/\sR\o]/8KN#[E54t=R`=`KgM$S:dX,_o*WlAK-R:jS(Tj`H[*W1j -B:*>VTkC("Ws6nt>u1Fobg8/W4`$>F>EQ$qU;q_Od&I=Hi)nMZ]>F%e2T?ECiXL3m3L!j[H_=?[X%u;> -8-.YAjSgG/qNho[0.G8UIQ"NV?JMlB]6JDC\hmaW -'eMre:eqiPc!g^_*kGW-SH!s@Y+t7Tj.O^SrNfG&2]k=]?gY.5X[#)16`81o7Q]Ru4*91m?Me3Oc6%Mh -/Df8s3/'>Y0* -\L;@*DAN8"_hG)sZKWKi^T9=P:Og+;6Igs,Pm=U7F14),i_EY09U=&:>aX(@H/3EGbGM&4.k$MC['=mp'9n7lRT$g"3s1.r9q[ ->E\&GG8sWkC$FbRFUk!b_^,Y@:$4r0T[>47376q]2dH4-A5/*_]&DY-dkZPZ%^%C'"KkDBR<>Ln*a7#A -d;:q5);'$`MAn0Fq"FP/WW1`uqfTf!0f;.q(U2?t='b)IUM3d&Trr/W4$RcY`sl*U4sFcbC!);5q1e3E -n-u_V/9.u#")[MEQ_[mRFi-Wf]#ErQh.&J.LT\I3;qLNNQ;*T^\25PTS$fO[_7=QS>Urb>P)$Te]WM.D -iR4gfL.a%K)_S7Z=&@*+pS47Mp5`sVQi7HLQ%&qFP3ZJoS:AFQUTa#oLc/Gheg_k]$ES1]q-+4XG1GpK -5(il(X3k6bmJtF]BjY<*_8cL!O(`#F:'p!)=3$NN/jgDnDV:FZeS1_m6M$-&Q3(*h3pDQ=>5Ru+h!-Ql -]A,@Bp0Z\/[Xu8m0u%-O['GJWn#/akl&+6H+;Zr!R -pX[H3=WBI$WBMn_[?>,@H<;td8%3F\79<]_?1?^'Q$P36Dtlnd^6pVTrN47kloQY*dhCN^>*\on0JD$F -ZX?PuXRb-".D7JU!bZauDS>&6khc3'obE,lIRrYTs1AED( -#AM>$VNf1\m\U%XY\_U>YbTIP_%FB'LgrPjli2s6,&m>T?hcq\&At/h`'N$:2>Z`D7VCJV,EI]UaHd:h -H%9I_9cV%@`("NRYO"I/ZERY7kiH0]45hoT'g0^oS(ugdX-t>r2[ih]LP5Y0o22o,Q-_U1uN_AZ=Djom@cJEW,Pi,Df@ju -``okAUW,F7Hc=)F]t[)&;4:j(dB/Y`%=*j`KBo@+UZ'q:#;+[AkK31;ELVLW0-=nJ$@#)H+5uL`Fn*/1 -nIj3*4LC86p[MR7ZeGmpHY[U. -Boh=KPn`>_Y(\t/Kl?Sl\,r9%``On6SP61'2)f!rgtJQqA=?_d2V+5rF_/h"%FVu4(s@Hp];28dA'[&I -H.L^E?:;8%m3osY<;m[O?E86O$07PEj2kqNKlB1-D%A&au_F=I`F=T-98\mcbHt(qsQYk1(ZjS38>\up8ke^8R9g#g7V\225BRrHU;ekN(S/D -brmnm2Q/u"de=*nX[t=Dk!j*+c)j:0;SM2.V`SCLHIgkjgEOneEr"PPpujYT-DP76ImYf]&%/++T.*`%cWg4A5lGh4Q&ZGKi&=caIXuef"sA6XpI>bW[aQu';u#IMRW\tEI^iXQ!t"o -eh[*!*.$R'Mt$c(fJ3ghXol#>fe^iYB3[sK>,#SnFtI^H.cRH2h&Se/`6&Oot:*k&'5[bSI]Erk-kkijgen3l/]T3a]j-Ff(SP=0)'S1^T,\ ->C/P(E?=,QK-u8jet%,Ojqmob4nd@O/>@2T/!/%Xb`gNOXI7As9/\#<+m==ITR6,P:IB1q+u1K3qRiAR -k+[lO16l(?3e!fP:33-Um=^>(,&L28^G1Fr_'gm*C\XaA6.dr3h#>Qo;;31"_.=+Umbl)1MNarqX#$\Bc -(5"3l!P`nokbd\4->gc/SYKg.,@=2:P3jLbW/['GMcQ&P41)!?t+P@^("'/=oYo/I's@dak`\/-ajI4SjidWKY;/\)U-_,i@Ubb3AlQ -!g"Es(5&`qQJsiFeuGP!&sCS'ZIfO$^'RucB(QXN!fBB][.Q9(2tR?V<8j:02fDh"BJJ.#B:?eI8LNtc -IKK2h@^'r$!f,U]X)(iL\]')d('DKLa^SXgaMko$ -3:rDuDFal-kDQk3$ci"qq[SFl1;fnA1D67u=^+;K;"N>/AoinNn&RV4?k^?R!r_pu&'!k`OA3rn?!S?l -#IJ;!(\+Tcq8FM,#4mcEcK57M%@)0j47Jl@IBWQe4 -bR9R-T::+h483^g=H79ol-IEMWQa"XKu[[`-n4=L4n9IaoD9o]\8K4Le'd+&QPuW(HJ$4'9ba5?2&\%4eSGtdc-?hrODl^k=E:VJ!g8kMH5kKV+#^US'8B8PZO5X?QOh!TDNFH)OR -%@r@JUKMo+`Ubt%b[N/0"]h-s>1.5%d1&QVI2nM9WQ]I;0 -*pE/51;0Wi5^s>Td8TA.2ILYV\k[C*P49DPbe1N$@uMM#88rWGXAt>H&GC,(@nj -b:\'1QWlu2?4c]B]XG;Nq&ni:X].V.),(Gh(&piU[09f\?DQgii'U=k=s1Z?"`>MHVa_uX1`er[NY+B81ra32"..Z:Zh*=(0K.nN ->rj9-D3nEh8`,U;GC5`$5"3)* -Y2iH)dHdUDRg-9D>+Q:jiHB93)cY(GNO;Z!,G(c1:32asGlu_PSW](jAC7"1/k&`lG3M\,Xu?1Q(6WYQ -hR]Ni1GWM'?+OR7>S1hJ?(1#u@mOkdV22A'/tK<>fIfVZ8*j-t\9@+1qpJ!m]6)=X-RnmZ]6*c).qrV* -91d%VV5/(fV7HWY,Q$FQ"48^9Z)cH)mlKD(r5s8'r\irC0ZJZbbBOjVpb9e60-'[c3W@='aRh6/Kb^?V2G/GW))l`C(LP:]?:T#$^DB:Jjqp;Mh(b(luO\\GPG,YNB# -iAA2j[O*QQYf3!I?@2?uPI-G:IRdN748!7j/;ES;Pg(63dA_aV#IeC#r#ba?(ahPRH]ZPqH*BNt)/)ZP+Vp0:Tr*Imni;HF,P3n3t -"SV^54jAdV^'XNqqMsufe-k(#W/%`uSFX+;+:jjK[cA$(@I*Xa*R+u[G:j6KL-XR/2EX>%:YtP>jR2U9 -SVtB1[%<^K6J5_\h[q_k%6MullbRGk'[/an$:80"fXge]=-F=$=-F&'lmsld:Jh:LpH'1&O&53JAolt' -,M,0Q/JCmbe+q:djmC,V"ZCdK"l/QG^GdV&(b^rss7%!ch0]q:76R&sc/\@Bg;!.[43@N^QV.dWq%%@K -(<8Y"isj$['n>1bGB\B4$f@.]90N'il$;<$J)SMjmoP!g;Pfb`fPsrH!WI'Y?c;Qn=O0L6R%"J0Ue3AT -l[B-0D[G1?Teh0AC:86H3^cE'hW,!#R)8/V)7akKX9I&\DLIA9p'5Phf+S,*%'b%qn+&TZ=)[ePNc5jk -D\A(LaA[^92#QCdf::n"`eg]4k8#k*8h_tE^jRo7OYCPZUZ0BK9g(n^d."QL43iJ*B#M::g_pt(2?VX= -ld^mKV14q_RGN9]q=s76:+?PZGpNL3GYe_/)dc6*cZnEW&JjBO)W@o,G/*93V3jQp"@UmJDq4+4"6*Rm -e8"U;s"nGShJ8R4^5-q>Bek3YSPI=4$=g73>#?:(&qFM;@3/Va+8dL@5N.^dB5j5P-/!<*)1?H$&;p0<(P\rd2J[(qRIgYe[Q9.[e[##fjJBe,o#tE:/Y';*2(WM)32gd> -Ne@78i])t>EJV_V&AKHMK3Vd"EVLPp*9?r/a$FmTi&DQJE#dN3`Gn^'7N;Yu@Y3XuVF;I0[:$pmLn*K: -PN-aV>4`ArfJsFB6QE!s/n(iH>_F(%nM/m(W::?u'\So7+OW_!#IRpWEDW&K3)5Zb-ca'Pi])1H3"EY9 -*!b0J`,SU&7Q^kQ%uu9u*cLH,fj,cmTEDR$4*6/XO%P]sR.`I5(TMeI&*+[>.a$IEuE?*aA"iip* -R,Br0;@)poO@"o(TMeI&*(3)Lj)BapEJU.F&Fg'P+NXNl-Z1[DKpPNe;T_ -Nl0U/EZB$,ELb6[Ei#.@H(1R,9V8u"@3(?B0Iln(;G>u,R4=A+`EJbh.4jErOQ"#&<[Wg4IJ`K^ndkBF6-UOF?F4&VnitnX.EtP0kWfTBE&M6IoU!JP9.FPd&lpJ@g -\4G+i&O.KYhM6k6.%X_":0TB!V*=464L?Q"#4>3E"1*`rMB6]#V*q9X)RD;N.Q7F5o*68hm:[ -DsFG'_LHn)(XTKk7CXOqZ"74uoGBYs^K`2l,E,5LBuGcg<`N0m4E%aCT1=(=R*hlHXDlMcO1Hsk"5Jg2 -2pSnG!RH8U^Yd\Pp)PB>2EdZ("nRIADtq1q4t=Nnb7bt_@X:sH'C'I?NQljo#;%e\.X'Tq^j(m2.=Z-Z -bc&/e3ud]0hHEKfVD02+!?BIXPpA#a5D"F.&%a%T>=-ANro9QK;$K5^P3k"At4Y$&^a5[JJ17`5UdKqWG+hJ:]j/k`c'uo@^U;E9% -Bp=8#?Z9IB7,3n.B]rU_V&7V(Oa\n>l:-aOXeIb<^IR"$olu''g(8#68/jlq -PL,&?>oPi!+k)28->>jB:2!#)Fd"_:8hm%Xg^jWXSapND8:?bg8SZh2;"$j,&8K$P)^9<>LmZoCG0BZ< -pUW9$eY"gR8hm%XgkZ/'iO6j4,sP@UVdsY#F%C/('LHXbdnd+\'A=!P[@nheZl'PKA8UPO\m[W/mbPer -3^lL>I?dO+U\B1C6!ntCs- -fO`ImKp\9&H83_p;I9+JOjnhN:!Pg?eb#qYU&NAiH9-FlN*s\cLjF.pN_cb;OXF_&SH>q)o>!Se\*CYZ -SGfFl>Laskkca?+NI1Im,9=Fpd'JAu-HqY@$Sd9JIT[V%df*P9HTkeLXP3MDT-s%o>`tI/BugUWr<'h, -gM9jMkgG9h8qrre=o%%_fs?slCU*jFSis0CiKc'Bp#a[pZAOII]3`S]3[UFM4DPek@fN6JZ!rNu[WF-1V313&2dJ@D -%mB7;Yu+;i.5*BqbjD%ckpP"Tl%AePLkBl^lu"Hr'&W*$L`^[?r7PZrOb:n2X-gYKu4EBg/J -VAhp&%Q]j1oF>ud]D5pEXaB1KBIO`]nUu+.Espm@HejS(5#fptooOA6%sgHndS(VZadAN\A+QnhiZa#; -'[Ql]7pUYODcW&&h_Zt>CRiuUJC8(FeQuOW?F2G)YWlqe)l'7KJ27Tc62OFrr'MNFAC"d4)X-NGa5(T3 -6ll'>VHM(S'2@c4o.>\YE@J]K+6oW]5=79M:6-8.[$B-Ve0O@Y-\L8cc(CV*J?o7LD\]J;oLIj;bKdIGpQeq*bloVi=T._>>Qh1.q$s -fM@.O_4E2a2f&35(j[s@K+6F:A\UXP*:Z)7Ls@@@hB@A3X'[T'^0j>2E@dZS*"AerrufVi2:om$m8`g7[h;F^o`_r9+mMUDjRrSc/l(5 -l/82);LSg@Y"L^Ig`u.N7$$NGEO&PF=q>2R':,2LOX#?af^19u],g3h\D<1m*44I+'QuQ=!cbgmUH,u0bA5/X -5RoY&7>W#;(!M%"8Tq_(ZJA8XFuql^],fcs]3S]+>>'BJDRX*d[I;^nq'FhDj]:2m+tB^M2JLJq>0K\r -X@CNmOc\28+f9C4[jU5D9=JWr$;3GVB"Ut"$E-'#>[d$Dop8FKk-;[nQebDX#eQWU"EqBnrI@AhH.hS< -@CN;Y$:ML3?1JP7*!)e/BROC0(MQNX`N:G!4R#aZ,eKTqZ$B'B+j]*;;+)&aG+r['m9]bS*nf>T4Km+X -MHe;_?ier>1uOoOl#.lOLPpDTfn'(Pd[o!Fd->6noB5UldicH!ocG*Scq8%/kZ,s[YMA!`TJ_Qhn'fR[-6#< -"uH]tZrl)C(GAf^)28@oTcZY/_nuu]M];ViMkS:..8.aR*W.Qo9nT%],`-8$ZZt#f`rDbgM6540XKhXU -8#k2cI/*(,-aWcG)UQuJJ^nH%NV`XQI`lR"2n,"L]g6Q$n,71V%5u6ZO*dYbX!b-g:GHss(\s'8N;>cR -kX99\3SgSSGgW_Pf(7I"4!.H)R]:8Eg,8K3a*fb>q(=uRlUn:Ms"o4NcI2548aZ1WZ]7`UI%gD\gg94N -Ghk=+X*knpgDP_%HdRQ(@S4cLYOe^pP1[/X9RafPHC\#^455(8?VHtmuJH@*i>@?jD$r((8"P8BNh4075\'D -j,GY*Hc""rNr2R0%fQ4%)UMa#CG)>Gb:ABqJnaoF<"3N@qAh*LGj>o8h(cak5*pF+WW>iDLhFDmM(4'C -mQ!fXj"V&C(Hu.G#g\"\F\gl4i!G[6L`SoQPIO8S>Ibf5\3OJu_[IRdRt#A_jD4>;b5Gs:';u*l\+4L4 -)A)c+.lcK@R+F8u!s1(Qqh9)KT\8GM6JQPKO(p;^1lod4Qk.`3Uo3l:mVT^+Y1+_.m+G.uL/uE]5u_4[ -Xo-IVXd>H%"OqR<9$G@!rc:CEn@abSIJW6'a15.-MZ,Zgj(QplY.%HU6bHKjCs^(LU`QB.c..?Aj^s<` -5W=l2leZ"[Xr?omp\;i+K`*PgG]=(8_$;&jT@LNk%2d!7eS4Fd5ICQM6C?#m"eO>)"05JLVIV,+hWm7m -?Y(!6p?4Ji39&SRS?.m;A]?k!'V0gL:=b>TKL2L[ahcL`L%qf?I\gt11S(a2&H'5V0\.aU!t*;4fJPV; -p5nFfUl>i7=TRV_F$n1`Bl:FPdOo6Jce,R`4fPNZK(gI@WUd`"2$X(LFbm%<2D\7M(?*/D+Tj7P$\$J$ -g&5p8%J398[^[j-Y"7fK3 -3,3?0"r*M1PLLVSn8i&?'=m8f\FE;O\YtiNaSi'JTc0"L[jKq48+i_*gc-5(ge\GNRN(FDRN&7-L$"-B -1hgj+pERqBa>GncC2UPbPid^85bY`.DbtN8Sg.#W]fX8O07M-9:!J[)n!Y3+!]@G6/[(@J3.K'#JEA)E -6!WIYL9+4X?lsR^Pei^sN4+*""ZQVLhDFf+(=dQ).[r5;`*3VASODk/Uit?@01NfTC=b^'6\ktW735%f -*Ue.8b-*FX9kU2"]a2]ND*"^OetU,iiB/Z*BUgC6R@M(sT1dJuOuHI/Y")3j-Z.2eF;QMP3Mn3T/hYR^ -^<';mEu,f$[rpP2psmUp/=t%p>7U>papL?:]5S#Gq'K^-+9&Tu1AP8&Ia5,\XOL3*`H/bai].pbG3Tp@ -`I'mVKhD6YEk-D]LH]1]);cLcJ7e=D029$Tq>E8G\[)pnb8PsO[)kA"_eGL#/7$>g/[*aB2jph*=9D)g -HhPhncrT>NVD//F'IRob8]s@7^q[+G7JQd>/uf^AZq?$8_sAtpmU2$cO(iuH9,t,MjP9M;U)K-&lJ25T -?L^fk:25'&\KVRELNLD`>c%,:[dC!r5$P3WU];"['UX/ABa3._j+^c#g\2 -U;*j&E&;=sq&IA!M"_CNcj*d!l;=#->R`)V6`=Rkdh(rPF;eVLS^*@e:38[,Z?`m?`>l]hXl;O#JshdX -N-g-Rj_5"nIWQJPMAb%!&%."$eslG@57L=YNQkUJD:ACJP(9;f:*J7/VS@0nr%u>pib=3)aO:^`f2"cP -Z)c0>0*0*7_XlYET8&FBm:Kh/W>a.P=;?>W:a6AWqQSVN,mso,_\?j^S:r7-7E(384!e[S33m2QVJ3.b -mB(iTO;@6V>26EYqEAtO)O=.me4PQVF.2@Xbt9[q'BhM?[aO_fo#)`DObt:]M8oZqJ!Zlr1DN?g=/glb@Q2!q!<(J/9-1-W0M0jMEmV-?]!RAjuHsX'N,4L1g]g< -Wr_$tjHHSE:&+7_)UQ1fAi6I+&1`:k/o'3A6@e#m`%s^KS'd`Lnpu.C= -Hb@popHM^]$B"qi>7@rN#@\pRTpr3;WZ\"kChZ4qd7ku6aju9J8*6o&.c+p;Q(5&`Q)6+)[g(R/L8$#Nh%(>NmZl!W4mV>2ua^Tc^_6=bmSMXR#s,k9.9.&%qYbgaA -C2UfV3-[*dWM7mGE6Q165h`'5:(quAUPi1,Fo05Bf.@3J#c[RXr`^-?jH9q0!O5i;QM*OXW#bF'Zl3g: -fK)IR.>U-_,i=b1j=C,("`2jf%n@-.5qtE[?QGrq&sA=RdeX;H*m5#V&C?O.Vp^%dE^9b>i0#X*H,fE -Tb\5Y8GI#amI"AY*UHu$"t!5tKpue_qPWW'1tn>\L\434cgpTIBa3&ak%[/1)ogSngjT%I"(+Dpm;ZE_ -21;ViZp%:.1t9I3Y8\*_7U&$=20Hia`Gqs9`,A[<$6;tAQ#pI%*D%'M,W.thm0QOJRQf.2;=B9'&detK -jF&AQps7)q:S(#TWb1Ke(=1V1k%[/!`F8-OC,W.d6RrX^fXRNjMDqp%YSn)?1opoBkr-8j`e;emWrZq33B**GX9OnmC"$LE -+8f&7KPo=S+((.c24**q1\IiQ?`jTTBkO5V5esC^EmGf.g&i?hoi):s2D"0:F^)fl1_l52eD1\hH0U&(Q&4f4=Or[i#c*b!%ICS(I[]25'S2`7N!Ja."`krr,7`J$'":<\!(eO`%auHt-9X(g06WtW[;1$L,OuN,I?mu9.QtIJ$0JHLJ*2'!SLmKFrMUWr -p]7Aq"h3^eeN1#0JnV7D[Cp.r#C5-=V%S[^3/s5S`^mo78#^Kj&B,8.qT79MHVa_uV[?\%&214+?!SO@+l --[K=/Y05!h&W!Fd\JgRed'+EbBJW$,D9BA.?=u?#"%pnCpHD)h.M@)R(T5CJ&N%cksjg,CO6>;d\8l+eO7'pWoU:u\3.IFRX9APWO>rl8HY9/8CIXT7\.;I=F -Q_GC[p*$F:`@g7HK3I@AJljV6Rkt&AC7]7CPu>9e5Z&UnhE\MBq+pG,W>iV7Yt[B)ktGEdWhgB@FNSY> -X]q5JlRU5m9:'h(c'$gfD3nl2ami!.9;ejTjbYX1Q_GBplr)+gGNhfudRW6-FNuinW>^kAl0Q5fd`cZs -:3fPsUtR3bdbOk-%1'OCM?X@C,)*S,/fr=5k/q>Cf(!Vu[(Wr_a>LXgp"^VaeOEPanso4V#$L\Eks]&++>r=5k/ -nU?8DJGakO[;/0Q8)-NhRQWtp3jn7S>^O\XmWVd6`i8bZO&/mWnbX>8h='QA7V)'a\DP\XFMFSWi-n0Z -Uj[moG?Ku3Dr0327jtD=q>H?9"nt*[pVZkK+l2SiDL>B-KX)MXhs[cf&FXgF08K9`lEBW"1`G3=Lk]&^ -E6G,/$;9RD&^"iR]\d/2+5ZGlH+Yu=U/+SU#\>k9^YdH:j*jLFNa2V6[nJd':?O^.QFA(LQ-(RDd^H90 -T\l5\Ef?>Tkl:QZ5QBo=CJF_4o`+g7F2t]WpmY!p1I]STRD:$E4P8K_Yr2HkNAQAoK/slfp,,nV#Q@&=ma2Cl[I7M0`*T8ER=t/c(O5)mVB;(qcGT#Y=Zf1!,+'me,qM-jiji]V-b -p-i$\m`s!l6C=,&6u+M\H7UEVP>^)stm^Vu]n*Xc:!r)P>Y4P8)o-3&?RJ)L-FJbS/_(jKl:) -f=g:RI7F(R4KW=rBbi(>F$H<%TG7qJ%k(,Eh.K7q!Th@=7<_fDu]4k]W!Y6 -h?ILPio0+1"k_KHh:@"`NR;l-oT7pGXa_)94b\@opC^8_bM2qh-Hab\qA$3j$S)PP4m_*<:">2`4brKhd4r"ju\#h -a8RId>$%Z#em7i2ccPY3=-`9YDX\#,aAsPYG@M[RRLP+hOe02^dl\Vl#Fd#.bD[sjXs3?\.<`pCTme"T'-SfJm-#6`lr\!<8[2de4=-oN_!!)`Idp"3 -;\JP>K4?7"OCDk]4-3pl/p/GYJ3o+s^/?N/Q"#;0"UUgVHDO^d8?pXJdj2n-K*6`>]CSp*MVZ1e8Q+oB -30:MX$Ia#UFUnI)[5]g&>-2nGUtD6jStt"EL(Wl[OL($X^SoC&`NZ!Y`K#Y28;`sld6NTFeTd5k]=fUF -`GTGMl#Q&9GOA%[?'h$!XW;`n;XDiTPGHiFP+?fHS-o&s.<`qV&5qjEXOF#uWK:>G@TOF38W"Mr09R$- -ST9no!41ml'f!iE5Agh -9d'/G6GAE%4P%*[kC9Bj+epu*Qb'XBj$-t10QM!BHiEZ2N&OA_/%Qudg=IOMIVXiF[5pXtEei2mHqC-AktuVt/2r7bS*a?I[6!=i`p)B3U04h?Mi+,7SCmBU#9mQ&l(.*NMND4%6D`hoUD7a)\M86Ml -Z/-PDN]*uH;,c_6#0nZ=n_)%U:pJRTSp2;D#A5F=l`3-s*r:;n=9:]Sbn/2TVDhh/SnK]:Fo=)"Mg.QE -T8eaFcVE"o2u3"uFGPl"Mn(XRe@G@Je=$(b:GptTn5[>L.X"\Rf&P$HcnX%1&E`(:hPs`EQXBSmR'GU6 -lXqZASUL=^7IqAU\Z0j;bPi;?.li(1Oa83o9#H^3b)8/gd!@IIQ-\kk^E#Ko:/AkHI_P$n.'uZ='2o/h -KeD$lmTqO^CtTu#0,d)fKiuAgHPb;G]'#Z'n$d-3%OesLG3"sL2f1LKbM[Lh8R/l,T*`m*?, -(8>fTHllLI0'^PF1lB[;/OUD7/dp&q2-G`)Z(4;kd7)M96l-;8#9$cMQ\FWI4,'&ULr_/9hJ*fMH]qZi -DBI"2$dlrJ/OXe>.kF*-<;!KlgjClVFXGkk7J1pj>Bat%1SaC0E.l+q<(s!NKrCA,ObKadTe%`_`Ni[i -6<(&/Jh0;T@3JN!/49Z1&hQL___NkQ&`64hd3ZZk(8=,[F'4dG5^L+hH2=_Eq33XL,8E?*CTn -(8>:)9GShFYRn'>'QL9,OG0VQgnMkV<,e;(KrEXd;\l+5AUT5cW6c"U$W405#[)rjI2HN=.^lh7:7:_F -hD`PCF=F0UYRoLEH"8)0W)ZuVD!*&OOmS\g$dhDf/OW!E+]9gA6l5MC$PD:V(8?_pcUe(9(8BQYVhBcf -io1^tgZsnO6l0!,D-Dac0A,7[NguE5.n;9(J%k%k=buJumE%\*r@5)ag"XA1<$k+2$di7TYRlZ6@3I,? -0Z$-Z*#9_]%1ARqK2A?$+jgA@sm+Ll/l4 -(8AuDL0KJV`3#U^6kBC)&/DetQ%eE/Q>@_%5>Q8W(n^6n(S5&Z$)6F@d6aZ'_EpX>7LP>O0j9B',fO.7$7Q/eOn482NG6K)oZST" -?Ls=27,7`Y+gPCcAK`hi(*_d@a[0ONTufW3]Dor=7-#+-Df)-To*qIKaM-*?6?Ma<$^#EZ[h(PQUP6d$ -\]R6LZasZj\hh5fR"`VkN*D*SVKt^1n(lbPfcp&)2D:1/mVX2Zk]$umIDU_[Lnt93DSNFc1KfN=5GLZgjfRQt*2NT32l9sXh:frP'>'0%u@3I,+S^KiHqbZ'7FSTrZLb?gc,"WeXLl/2$Z4IbO -_BTGNFBMb&MCJS2&7)[!63Iu<,.;7;m'u7pEGi8'6?N+/gd4uAeuC8hKit`m+Y"En@_3VPDBY0<.16`0 -9%em?K&)c,6MGR!gj)Nao%\HfI*n]dBWYAMe$]2"GlMf[l5JKdM:;m'c.lm5eVE_#h*^[#Ml3/e:g]A% -Gd^B1HT-H\-_"m!Y7G0U7F&`jMb1F(@CmMq61r"E0p]hDQ4!^h;hqppEWZ0e",=L:[,QeZ=; -.+"0M[6't<2?B0=D1kts>"M#0?EbbR% -2NZ>`*K0aRiE=VeMVW='#Bh:I1g,<`+cAFlfXR9QdYf1EZ[hm2cndZmVUn&:G91FP%p&Tn1ONa-VaZ6? -)lmY,-):GLUij"d/?lBtotg"5ZrWWFDk`#-ohjG80=pllfPEJ6_.W/Z?>qF1F%68'VT#p(1REr@Zi4F+ -$uir(;72<']P4*9O6C))O$,D=U?;d4B$rJF&?YtWPKiTKhXTNI"P+Is8CDQ89J3Tt]"shdd4hqmTk%;=<7#"^Z]u_r2p4d -V4&c9[@@Y>Vk!I+n!gquD7%qG^V]m*N$$9Sc'u[`hm"i-lDleIG<4:fHY&B"M\'Nu6nA0[+LZ*Xd'alB -`cg]i=lVrHs/Q;]]8!^WBGM,%o@4(L"3&o4c"7duh"4M3%_c>MFt`."d(Q!NoPf<+Ms7Vt#&X897MX`g -4ad-ZdQQ2HU=taYb5-5H-6)mma;q]9)eF;tYB2Y][pk#d2d>TP^p+:IdOL,3qU5V\NGgS\Q+g`sP1>J& -"[(>QB$?#.a0XAF!Z9g?VXqB'kji,p(;>Z/a#uA=qK+.LR+IW= --j!bdldt(tGk3nf*8AL4#QO)O,iGd6rT-9&*uOH`Fuue/2Xh(ILo]M5m?e-=L:``rmF_A$%pea7U-.!! -=4%F[;NEZlR=7Cula$/E@`"49h2W)Af"Nh:P%$B6\[rRA/i,CXlTI=$Z#41`n(0IY,"aR(jU3NgEKWFcfP-LXN7sp= -lXiPH'^H!>+Xu"$:I&VMX?_8;2!;:qbMdD,EY&EYljq(3GBBK\Fh -`\_"!_Cqd^]eXqb4-PC'U:'FA-g,_`/f%K\6"2JmjElX.I/`G1sK*79P=J_)!jrmfaZ"T8\ZE/8)^M@+0i;ntaI+qQ@C7-J4`:YZ6ACm5Zoch?J+j+`(^c60(kcS3]b -DhCR0U*@FFL)^J+V_c.X=4!B:TpaVt5K;U$&r0^fQr -U9DG;RQ[[ZC"-MA#!&,ePmTCsC4=-j#O'C!1[aMNq)F"n/$>PX8\6ck5?d61Iq%6n]i\9_'e?F.JKCQ# -P\hBL.>]8qSbYC0$9:aSZ1EZ?dJrgaWeg=`>PDpOa0a2#SH+CqF\C'ZNhQ?`^p1G\8*OHaG9/h`gDVoN -:(N<?[esXm\UE^cm=3NK<8Gc!X29q1=8FTJid9,=3:1-ah]?*\+gbg=-8rh0s1B)QL;3I`H,Hu` -C9q0Sl;=m_VY]$Sn)cU$B&4@hs(JbnnS0Bhmr0sV0M^UhG8ApiNhdON"l_]FYb=dTR,+p0s##2a5^J,I -e-,>2=8k&'=JpAr`=4WT?m@dI2(Kdp#S??3V+.L+A*onmI'oDDTUB;HojO?GmqMs\Y/"Tjn'[Dh-#gHj -hDR92d;'f'L9@u=+5Y@&o+Sk57VK/\=iC93&8QS=Cj&GK';eoZ0BNt?)pLL=3\CLe]!CF0@"=6N!``Cm -Y=-,^!rM/g;)Dr>%=Fr\=k]uoq8J?%`/\u3L5[aXIZafC=G0DiQ4)"fqQn@.L<\L37 -'=_,`-3uPX#Pp=CJt%b-)rfT(e`P\AedAOg6dHH0%)ri8@k$7AIZ+/OB5-DZ.P(%sNHFq%24P=A/bm:A -W8?Jpk4HKK=LK9o0Q"sV2/`GpY=:I++7uO`X3g"Od8ehIb7F`'?]M0fS(\?nS6=Q#B1l;$bDgk$Q('k> -_IDl1DE]$:o1(mN)F]Y)*Etd;U\V%1?1MK4?>/Y",n$+7)+7R=j%,A?--b5;]G9b]/2#W,kCE$C`dbc/ -#PRB],OA^!CtV[_dJb"PNo6:2kV8*9#eT[eEmMLI'AOUBAX2(dV0OOkKS0mZ"NZ!HIHq<"#Z2JV&WRE9 -#F_/sTVL&sCMC^A[=?a$`$9qFbYAVSZs![*4cb9Ta]!j*3l5$H8$;'S>"b+T*A\X4Xtp!NS+KOtb]5lc -Ap3nB]uXc=4$$sXnjYFiUtu%JRRd-P)l.qaiP0s,bV_OSWL,M4#:lO2"+6'1e"[=S -iR2r.4NnE8qhqbRn_&orL+`pVlipf-CgSkXSgCj?GlPB4Oo&#RX#9_&HV!#BDaS!]qaMWp&[O_u3tOOA -[GKJl*qGX4UWN7"8b)^.I"skFa5`[tWdf9%6>*FaIudiss1mG-NAAB7$s?`n4G0tQ3(XZuRSFl(8n;;S -qjlD%n*gY#j8&;_!hWl[nEbi047IMcmPc*Lk6k9,4F!U.J6uS'=L_219k=nT(".MYa[8T>4i61>#]ToP -f!N?oJerCR)E[GZ-@uJEmG#4JhrC'-$h&G9Sb1G]4!?_>Paq%-^r[QdisOb*FPtY0kl;G@.f$'p9F>*Z -fF["\8EuOjcoUd3SWso]eK/-al;_2l1YD8j`_Q^G70 -05$PWjc$N9jG3(T\V6e%-ZPsCZ_R]6OAljJJq>*B$]`6khW8E[6spqu1V*L8T0>^lmGd:F%uoO>FRaW: -%u>]2ITtjR+FcD$]m&JLr$j7)p.-Sl,k8m\"2&7?]iajts7a^590-P(I%IHpkBrLqVo+ -C8d0F6arHlRJOn3O`D@@&5&ji.d? -@C-btKFbm-?`p()b]7U[;78&u4j(6VgI6o;]$E!W-e9t$W"#9%(s\iqafB9+(-ZY?1DAX973p4U#0eO0 -HGFI5*cM]d+F3=W7f,s[qMi=0n7k`iLcCFmHSIWLF(2V2GjQ@fU0*nE*`\uKaeI-.Fo4X,7;(1Jpe^9n -7;\),R:P8&4c_`[iRd>QoS>iH-*;gQTESj:&Q/'LP#hWKaMF.TS0?H@IH+dk&\Ba>WMQJW`p9k -8,/>'C=n)Irhb7Q/%KjJEaqM3B2B'+Xh=3.I#f\q3R^;A]jX&7Pg=FjE"p\=gt<4`VK1gRI=9CNaHd-- -\MK_"_QSF`DAJYYqLK'j[EGk -,eL(d.BPf1b$c#&$`qg-$Bdf,!/GJ6^P&9Wi?(;91Ed"k!/:r;`!V>so -`5rF;al8gm\#ALG;*E.*>0]73"eNDtp"0LjC#r'Ri&+U>"_c:YdQ,R,ol*_EpoLh5555B>mKUGDnd5>C -0t^VHqo]$/-7VuMf.d="0+FEb/(DOp$]G+0.r3_hA_[XQ?5B`-(ac#7E\J6Hb -p5!M+:K97*n0:=JWM9MOi/(e0OZ&b7(b"efk77p32KF(a-CNQQfW05Of!*Kqb5qUbpC?O;q,KgHWCI%/ -_CddTECYYK4cOQ:-$8B*ZtnLU]Q/G&([ZSc^/t%WlBbAG5Mpf)f<2;BB.kFP7I.F*8nZD:o60#\p.>DlZuUKrI^o>^ZIND@jcXPZGDG^D9UhLtS_O#B@7Y!hG]M^E9.o>"'Rh -C?6<(lo/<4o$KmP8tZhGr7=0cDZk%GQ+7q2WEH#,#!.<3EP;-MB&F8>ns\$f]Uj<:fHDDf2XZ70X]9<1 -pVndbr_6A./ocf7j6`W3R)J4%h_ub/=WRG"qU&KmMbj`Y@^!e#dBFG?#9@nrQgff'f;)%MG>"Ul$mR0_ -B+KR?l?0[2glt6Ll&r1A?W^'Phhr^_1gP4&pUqX4,b$:qD6BXH@IY1ZN9uaP('n(ujqY5M=[t,l&]ZDQ -?n2D!`@Yak*:(/;i/!Ej7*.*1@XerV?H\4,]XJdR&/O=uSqUFUNE/l_&u?rSo1sBk.e;J^ZL$muh8IPP -U2#?rrk5h)gM6@*mTBfPY];p>X2H"q:5]j#9V^O=\d%m'B(=686^Nb@:: -'6+t]-sTp8hD&(1iNk+*hYN/IcMaP3g^m>/iJP&UPk))P?Tu(S,Oi.7eG0p7Jtr)#>g-'PDXhiS_Tm=7 -XgKVW_clZAU$$.Mm,C_TD>--cd>JUo@1VCQ62$qs:>p-LF_.,a[pZq%%q`J@5-)J`W=>sm^)@WLrGDA$ -q(M+0@V>oM>-'(@DW04ajU/^/8Ned!D38Rr?]a'PF[*Xr^YYINCS8("4i2$jrpG9f1R_$DJruX3F?%b\ -po=*+'_L,g*dYU!6]T%K8hEM+/_7-'CJ;ok6<3L\<(7&e-5=pJ,7a9L'A[?sUZX2V^OIVkf -[1]*+47>TGW-sW,;Qc,\rHqd;0->hQj+bk"4u;T+B]#2s0fruD])*.bQ[0/`*`)=!8OUaTZZ[bMl9Hl\ -G&KV`?,:0!Ea-nZVoO@]3OmYB;!S5ha).^VJOb8bLsMZj[8N4`NQ$oO?hje-XP3tX`kW$1\]e&lg)X&V -=JMIE=Z#N3r+7I--Z*#8/0=L%CFg`t'l'qY7@/("8[SkM8a9+4"TDfrV(`k@"2nnM+M>1+4j12%Ki[JY -"(HWuhn,h@n5Z0D_hi((!OoQdo^YXZ3#25L7r[[V`11h2ji)[=)c898GdD*A6\\9SYMY&q#a-fVU06rf -LX5ZEpL`NY_!fGtZUcRfihQ5e+jsUHs^F7bTco -eeW;Tl.AS7/]hgmDo+)uNb:no1R"HcigV9kii3MR[fm-13t(pAp1`L@-2YGJiQY`\Rf(s,G4a_U -2H*4%e$rY/:MFIe,?l<%O`rA0l+VfpR/mY]Pqj4VqioufjG=A)HYcZR:OMBZ$4G,>>n3pmCAPKXehaJG -)E+BgT%:,mD=ATNDsaK4"'J[B(AqlbnX\NT$`Y%WmM=Q?pKRrkr0&4%?mXm'h;f<-\XR10E'@p=b=eS*mKcO3[SZ7oOppiCd`cn`%;uJc(LniOcG5bOB6cs9JUgKKfMQ?`Zs.6'T_bJsMjdoc[LInXJU/_1EG;n8(PruSGf3&fop_3G`.OjWGA58^-7 -OsAJfoIN!&26'7b%84A.ctC,_Q$#)P2n4c13hf?3Il_*SH)nhe9YSt]jI?b03no%'iEU4CHK"8"@Q'1R -7LMq)XLXgBl*+I(!ZRq)U2i(l\NXF<[mH,?k?5'"k1LW^0=3FI4=2g4FL!f:Y#2j2oug4C'>Om[F]5LOW.-UPTq3-T`HY_U%&j[YfIaDeo=H -AL1@LhU#$ne\_<[8!'7M^P+2GoA&gQBoB[UV*g/`.k9M:;%t;0ni8&b4H#ZTp,h.n(36,@eM2>U;979t -A:Lekn']+3IX1F5Q)"NWKlhhd%Li[N3_t^10+d=+D=&F[*0_@fmpI7,=.EQ)SqpqCQ3;PHZK9f(G@Hft -(i)6p>l813i0a-u%U0TRD@^/,;(WP@J(rCs]gf.udfnR^948aVgL$p^QNM_XRs9E^;RS#iNomQm-r[;)+5Il -p;HY40B)iWjOoi0l?Z5C`e4N350l?"^e@t[ppbZT?TKt^'>EWY];jqui%U_#c-'IN>!@immI3ds=qAT- -j!a*uduWn7G5i`BJ!9DYBgOpQ$<4_m;aCZ/u?!oD*ZDa\:7YV3?FlQ6"$"_#NIH -b#`Ua;e,uUl*_ef/A1-+Q6s;`Fk(`Rd-/^a=bTe,dC%/bNH?nXm@:^PW%^P6c,ngnS!Nt:L-V4VgF -n.nte40EHrUq,^=cDW5#;q1tq)SNp#[?p14iYLXZd/NRUP-;3!eoja>CF#e$CQ'QSQ:!_6S4'L7_F*4>o -Yfbj@g33G-rMS1aBf41/(M5!a]YpU@jk1QW:@<3n&UUW/D\UNV-MIE1FALp8N1KGX>hQK(B#OW+XQgb^ -J^a[L9hMFiHfq-IUHLQtV-Iiu8h(Y=fbuS@hXF26F7J+6@YCrM6k;H/Bcm1ekpaSrE)uc4O%-166r64J -N1eYm5>@\%:!s_VYI1Q0qZ!bCT=lFr0CjGKh@8C?GY[dYqG6/VNHepjM1m>J(P?s^[eofC40&:&i[Y:0 -N;P.%En$1p>TI\Ca[L$"j,&'\YtZ7DB#DqGqjedT#lTTA5#el)>B(JQLn1:cjuPF`4-bECRdg(,+C83;VHEP.Ad=@T[Cbem&[&6o%i(u%l`SUCQVB$4!DTcgeDeE?ujKkEc& -R8mMelp_u_feIO0df-mCk^]V'L`>-/FZCXTcHuc0/#Za?&E[GmgNntG4C%l%"SG32:lNXdU,"6,,LeE] -\cOUA36iY";7kfai[>AH&SseY]FeTkRM^)ZY#JS0hEuoJmen[3J[`H#8(_[tm3uOQ<[[Io#:-1qE'\CI -=.8E8PmIqNr]g#9O6/Ncn%c$7G<0sV;Q[")Y8OMe/^^7kZU@RLCi\,l>>@ur9WXr62qn*lC\M\ -p9DUa\GaVf2::or:LCHu+3%u2Y#s7KZ@SEVZsa8?=OU#MZ4XnfWt9KjTJf5Xe.L\t4h#R6VU[NI%jDO" -eV[pl#d!3@*;B;\:?/Yaodr3M5s`Nf.[Xp^]P@]i1Od^i?MQ8BGI-4^A!-cM@V1K#4b5>$Ycu[AiAg,Aek[_>f2$n+3QOt8ZBe6E5XUB -\^KN<@'+YfmKh;E9tWFU9H5_,TT8be`HRXQi:>1jR2oB$_0NG`NcYfV(b"E)nLV4figqOK7>MO:g*QP/ -`PjSKA#mmZSkFK.q2Hpnc#<7m;LcIN;sL9 -ga,,P8AZ`4muFu$AA+K]6*WLe$?Bb9H$?l.%o`kSV+,rAm&P'/#2tF3223Ra6=LJV'TFUa*3l*,!>Y*: -A?kK`p&A:6YlYth1i)9J-B:=FPR"rrZkh`2]1*c?eTA[:hakN-eft&6^FZDUK(nu?hrJ/3=kh&Fe.8jd -e__GBrFn*:UM^?,g2R?idK(Yo7&@UPGG*k_;$ST@Jk"fSK73@)oQ05s4c5#p7m0HaWkYP#3?$Decq&.j -Pir*rELMGN>dL4KC,:[[Wmi0VWtdFc?aAg&^6`sOq,LH`6'#o#6M,J4KbPU<3Jet$B`jcpAL5P&/j)3E -pqa`'B\^RK3P)9>7Z7=+,U"L`6Z$/s1)fL'p8U\[ouhVGTH`!;#Nq(Z4QZ1J.&X&JU@a^s,a9:3GiMq- -DKDeop\GuVjET6\OcEOf-<6+*UJWO2WaGI,mj47oeYMCm?_?s"MW6BRG$uF4^[9STr`NC:0a7662NH-N -dRC>J[r./G-eu?ZAOOJo*[e!5#%`&JM-=o>cA6/0NPf('-hCu;A;Y/dZ-q3;JNE.FfEl&eNgi\n0i>gp -H?W%_5\2$8pQ$2o$[.-Vj$Hu9JTr:A`VWcWJ&)^?r8@(0322,40O!%(X-h-`9>Yhe33)JQC7m_D5iZlh -Xf*]a;*1DrniOR?Xh^*[g`Arn1-L#*N]/JF=L9,sog^M.4;UO^aBlcT-kJN\:58!2$,iB7p^`%A:?8V9 -)#P0CN#bHFNG,0,@>m4plJ$k.f-YgPTbHHQ$qK]\h.g(o#CB*Rm2WQH`CT.qS'q>@#7NQF+WJI!b=ipH -osG#U/(<&e,Krbg^+6IfMDB&kgD&2CGI+.AS25IbHZQS[]*VoIOo[/Sb*lfpIp9=l_7f9P6D$<<7Q\$] -U3nqYcVA/l"aY5iptFa;2Z8Hg8$tK=hSbfi)SYe[Z=SVdEb6tJ3BM5eSA0CRiqe37Qpl/Dgd[l(ea*Of -TYB$aX:\TRT1>D?46j0t$E;)rD_?(U(9%2%<2[?K+IqfN`m13R=RDh&,&"d'dF"A]H\A!iIBiimK\3b.n:&Z -D8,UGfdk:n.^6`U/3#EIdfD=*C;\nT*`ZEd#rO08ikbae"82^?s#_3^mo8JtXu8b]1$b;Kon+VKbg4;P -&U0):=uP6T]O/_OBXref9-14k"0p!FjM7HWahb^70s:h;]tQ7ftP$8@S-7h8Z$F>aCC2/5u9u -pfp[//O$f:XSWRlOlpZ7YN17+)GbZkK(jkHW8YNVRou!8+4e#H*O#mN.Dq(M$LZ5J:7L8Rlur1SgA.rN -,3XrCh5XaLI_inq,,YmuG/4C![Af/n=pOq_lpUX7-FHG?diB=3\LUKhDRZ4>b`uBud=Z`l#Lm'[#kT,Z -XYG`r58i7KPts*S$iP4k9Q_,G8ti$*rmmDX,1k7?_6\"_9R8rbXeJB_7@`9?T+t5Fd:?Q1G`kt9iKc6; -0?=CS==4QgU3oo3WJNiAa01'2jQ@;-1%@%qM7gk\ZVEGtkX$kbTEC>;90n;@8;W>068)*dkJ(R2GT*$[9;%=po/#Js(#-9;iC&L7hmiY6<2:QB=iZne>90cOhmVK -Z8YP'Wg5mAG-jR(R+G8._ha"ge<-#AJ0n)pgl;nYpqug';@:?Z8rb5K.QGbGO,uTL -\u0@UD9@[q3e!J.C*LU,RH'.7qH;tdf4`1H=;T@$p#;$5)_VOOb(G20qh'(f5Y6_Sr!f1np7Mfag`,HD -%rtd+N_e4sECq')DfmO0<+b7ZV*UGf>8sA?C_n*0jYNKFd(Of[DV^&jo/'JXS2_7-4Rh+cB*HZm/RDVn -q*:_M]JeQSj1E7Hmkj#;4]W$3&Z?-^nA)-7[E)B^i#]VA9[]aI=WI`KIlWrDci@h?fugSni93P#$IAjf -6'o/^s*iP&>T&Yuosnsf/I,:\Sc6]-&[Mdbf%W<^&MU=o!CIWiTNLphV[!]&_g0dg@p#LHiQ;i_nq^ELV*=rWX],I!2cZj)$R` -CVFi]8(D..e+$u!9BU?l))k;/:0Z_O)JcH,Gqe:CWB3Q.9t^?M^LM18)L^#sU!?=>4LtIGT(kD:kUGg9 -^%eiT:SXe'Li@JfRHjCQA5B^'D5iTlSYb)P7Yt16K_>_ZZ:4kdjUOMh8ddYRGn1P"#ECqEfr`EZCo+V& -^Z6t!I.,WX8:6\8BC$4C,Q#Zt2FkYbbE3jIrhRGoIdjQ;.HsA1G1p2qpBU_KUDb[-Bea%0YtfQL/_1jh -,q[];mSEF\lML]e$q7k4(@,7,7.^jG:Jm&Ga6TM>FNOY:edXM)Tr5J1o[73>Fq%Xl1`j#kMn/Cl0f\En -`B&Age7(bm@LrHO[IGG[_8WRr/oiQ;+OOVa7uQ4#`E[TY+Wk_,?,h,r(q-Kn2E3bJRd@-)/1oGNp63nH -ZSQ:"NdC/n`VRHoid5\22ROA9da_fTlTPqp0lM!0`VS"h2!-[i7F5KaGPtEt@3[![jhg(@=q$2/fh.9T -(=UBoZl"Z#8W38E4&K7@nV4'n@OMO//Z,#@TZ&t[$;E,'S*js1/Z+d6/bZGe6AtN5PliU]EH'Y6h4VaF -'"D,H;kcU:6(CJAU%mEn@Q96m>3ej6L,(;]Mh*1N`H49M/I%!TeREr?%j4X&WPtCEqpAja&(4oJRtMQp -g].p+pBAnQtB7)Ch53UW!iXb0l[_aX#CNk -k)4HX5cfJV41p3Qh3cM%[,AZ=N^.qRS1o[SXfo0q>iRq'LA897`nV"EbQ+JeI&01sn_D]8gM\V:(kESb -X8EI1Kqk4V(4I[le'>#KjFe8C#3-%!i -SLU@P*47*RcW8]sfui%;5=VZ6]bPtW:XF^Im:T6ck<0CZG7[RiB_#<^#1cAdi/UY'n_6/lM!sCUThgFk -DWm9]YOk)&#[sg`DJRYrF*XaqTO6$M^5BJcge%0(gfGB'DQEd\,<#2h!Y<^SPYF.LpILe%&\N*9LG+8H -7uY6ab:d_m"Q5IcK0tW)X`26=L[sl9nEM'd#GLkXnaiB4$9BmK6c>l-Jc.](msU*gbMc$NBAa$FB3!8% -b#LFQc7E(o^N&d>!]OMR^lrEs"h]9EaadZ--Z-X;X_'$FmA)XSI(!?e@p>D"!\MJKa@t?5;e3d,lEmWg -+A+<.bR_;-6\Ke*8'p^C@Z+@;j$e&$D&lq)gaHT:qbKVD>(f_B$;#/U.A!;eXKJMYk1Cs\Nc;_m[gf`> -beJcL+>)S:*P%_SSX)c_iT3#N`&0.oMeMXDBP@C!2`st4jbVZco\O"9*Rn.\R&oQbDDtCAF]5!R1I?/2 -s.dsOm#=OBjGSji@r_a7MBb$(8b'=Lk*,f61rNs355GU^6QE^,gieB!BRr',/l/UE?C-!E(?2\1I[+f. -g(+-\`c,FS5PEi8n6X#(J"Cigi;Ktl%h61u(>eHJUG2RQd'(lc(P$-Knc2q_^/&L%oI'4h<>sj@5[@l2^ -?%X3JDC1%If^$!*K[/!AP5fFh"u5kHFL4efn0To-ga6jA3_$X?na+*)`JJ?hJa^A]q,pek9DQlS=T(%# -BuDK;i")`=5oY_(G^:5Id;S=T(J`1(:*kj3MXmn.B\:_J03\M`i1%-gr%V"_2t0tL>8^2XtId/kndKb-T&*EVco519n-q7jl0)L -0P;?,L>8<<5-QY2jg,nO_"EgDPi='6,T`-!2)`O4!WV4mV@icu-3Te1oS,Ge@qM*J -KmB92:-\gR`1mKCQQcbWH\@XdV#Z^%$d+":]4@YF:%IJIuCpX3t>OI,/-^d\fkWf-FO"^<+W1uFl8bKZ2S)0558T`l@WO0YR*i;?pL/bde:&7#% -)'+(\>Jih*YJMB^*[+kXp(um.)@cBe)C`u*/feo"+Y"5N,q52eFtGF(g[rZ$#8MRRfVk=@YG)N#H8Hg& -7/]hscd@[TD\GT$i_BU'!W3#Vg12Q18`)6P?\lFrK-BN\'f2Ulnoic804n3k[BreHo#'k`e1+_q7ufZ/ -g-A477Ym4"i)!;?j^2s`c9O!P1T0Gi7GE*?G&0)I_N(dBklZ)@HSn\s?-WPH2m_:?pac$\p?TC,n)[VZ -q5QrlK9JZY.l\H^ZjIm:hM^*Uf1V"&=7sYmB@9D7V9dPf'dM6^mFQ\N-%2$mAWL0o#0"X0Wl(8)aScg$ -Ig)l5I"*/Tmaj*l@(lG4%#IofRc+q670l)N2Jt&)]r]-C<+(,ss6$$D%oK4B>!K<0I&DR(@b.gVd6dG, -_jSOG7mZTelr$]Y#X8$CSDFP_r@YB"&f%MRjtocm!?GE'q]FGtWW4B+%'bEm!blcsKSbH_0,u&c$.f2K -.Z:j.n>-SflZZ8X:=V#_lgn8.a4KfoYb^67*k>Y6o)0RmMjZ0pC4V/f6rWq(nL""HUXT>=-cckq44-(OhN1?%eS(Qi(+cZX*m#JT)+9O13dUXST -oiUJA+PD8&&Nnej0Da/\*d/V`"X.*/,:G>oO5]e'<.>?QnGLG_Ye`UM>6gn6-10WY['$fl$q,IjH(a2f -@*:mDrc3tq:*U8!rW?YSm?k=4p>3s<^qP3SS3;)`i`oU\"/k7f+Q:\Xh>ho9!s]!3j%Z1Uj6lq0*pO>G -fM6GSo>:N_Z_b#>@!Kf&@D(9;a6qVAqRa;dN&Qm>L-cj]_LM+e3%B,'27+*nVMDu(IZO^OLJUKsg*fKftrRYeol@cD<[olf:(V&,6q'6s^$Z -,1DcD*ofU/rm4hV/1,b5hgl=/\Qq\KV2TI;iIi:"IAJ`DK?f/aP*TET+o,N&l(R2l\aS^.e$I-!ddtX' -d45iN_CELZN![T/LG(o07a) -iLPI1-%@Z,?`8CW4`1G%W8rW3$%H=KFe1)OB*kUk&C4@O)G-L2"jh$J=Qb#mDsh,Ud51E`95:-?/@V\u74\eV)K1g$gCiq(QDp-l"VG-TYa\YtK( -oaa)#.Q%EBcKi&`_2Uku21Td`(mp^4*L&hT$nC68\&E)8U<@CBP_`CsWi4=n(TZm_[cb>s=u\,9iKl.: -ap?1ErhDUX-3N4[d@T$aT#b6r7MA9OIfr7M[IH>2^I;r$Hfqs;Z<>)DU)FY"6iu>\V$#\(G89X!7n8S/ -bgC_2HR<#JD]:64$d/Ai/@FF&d66..<314[hb*W_hdlpqQLK6(! -<8Z@`IVX,kL5J^b0()L;,?j-h`!BR<$<,q3f1IYPhNCk'=*")o%1OD$M;"bJ)=QEJ[A:BgmeH>*?%[>+ -H"E_]\o&P*kZ?AA`6m;[S\aCq2okHqjp+uX+4f-qS9mA(rpBGSo6c""T!oLL[mI?T;`FNH>*?Y"#kL+q -q&bFa[=Ag,K)u$kOk#KODU_T1]SrVGrqbWqsY+VC@VifC9b^N`KjP6E9it*M3qI_9n!tn -Pg0Od[MDpg[FeZoVg5%[?S/^pHH#X@IF%F1h8^I\C)t$D>&9O`Io%HkKGN=jZIE?qOe4sumDdP,(*cF' -QM>j7L)/O4=`QgfcshhuM^@X[#CEl2dXA;B44_i>@g9MTKFR2:BUa.s3_?/QcOX=6]!4;p`CQiT@_;3a -GjhfbQ(9beY85lXg4idimF5UW;NBBc)l^g/$YlqP?9P\+ha9!8dA[j#5qPR;U_Y3*W5[?IHUE^n7If[B`/U^O`*>)Xta>3oNRcsdu3C,'14Z!DLMEOk\'>)]h](?8Xt:Qa[9MllU9\>4l(;5)7A,Ne:5tW96\RmS4G5tLg"W:!aL-(XqjYu/b[Tr11rgqV>^Y5Q7U-3"5<*"h?%E3ui2:]p4HcorF4Wg>cPQP6g;-RY+>;2Eo-^2Rn;n,ro;HWHMJDJIJU?iS?n9" -CpF][Tufi"Y8fo#c=O11< -EEr$dMKYTbJa3.!in^qGaiND`YHD-lY9fqBa4[t59kqU:?cG:5u1UP/"q0\p?$1K'B=B -OF)GU7ik4CZ#8@&bWZk^WfGjCNOD9=92_M&]o\sejUOp_Cs_LDE5t"dl&Q]rQ1bo0BlhLe$/WiP0(QUC -%C]OkcR1EQFZ*F0$Gt,UNr05(d34"6F_g(jT^a`=o%ffQh]bju"Z0QbX6]?E&!C`7bu]%k4FCWJ2oD@Z -:E\:i+Xr5%eo9Uc)h6PGLAB]OS"K?'33LOJ26>!$>odK%7mjn@,K5WL%Cc?e_^0!9rV?XcH02J!mIGDo -lOC>=Ao!Y8dsu,R@Vi1:X'pFb`r13c9s([M\/.nbo56BnC;L0hL)UpJmhIID)t;9(CrMqq\35cJ0N-Nm -mTHr84^10=e?5fG1pepeZk%iTHblu"I@8ch3?+*bo_hS2a+58Vfna/Oc,M0EeV<[HRaZiWAur&NZ*@)l -&%-F9%d[c^qq;SZ$!LgDd^[Ef\*&ZgpVOuIr76a:mc]+$/9^,YZ.QnYbM)?m-Jqt-_H%_=K/cIE#EDW_ -\N&.5$*gg$dQ/ -\/=u=]"[4KDB[H0hH%e3Q)el=mj7WSk?TH\Rb8kOp?1$iEb6U:.V8/9K57t](EpRY84/NN=35_n#1u;4skU:@"\7eHHF(TLMTp9t.bMWM4_s6R9 -CU(VM,i;O0GM0X6F6P`.%scN]r((KBSa&B:3sTF)`O"s,[=.tYOfE`2XBL!O -Ft@r=BPjca7FllQlT -FQqbGFejZ&kb8^ACfd]1=F?pJ:@:Mu[>p;T%^'HX2glY+!.0$f?).6Hmk@3e5=R+AB]QMcToqAN'R]\B -*,W'\`6lF=61.8S7W;]$daQO[nZc-3_g+tjRbfkFEaF6E=b"+dO[]%[Ps9)t8/tO2pFq)R>DDfWh(l(8 -MG'Gas.>]Q9>AZ>4?8W!r,V^]Y=\bR4-SsW6XNZ;BYQAr:j`]=&:H^#Y17ASDp1lo\S$&!L&5Gho,:f9 -oY?F.oo)r=$0DHOBd5(0PKM6!\66:ZfM)6?;UJ7T?,>q0O4GnTquU>qdY[ZA?a)fBg"Ru']8]2 -q(LB>6V_+GUXa>k446Cgr -IH=-l!Nn\Ha9%>k(QBrT!+1`YE7*+?oq`>tlSf<&K0=k!>r+\(@_\P:=g#IJ"IVotUrcLD?O-#;Q&ZqI -e`GY.SC[fZ>;kmPU?qsVJ6PuYelK0+>37J`qR,uIlXrnM;#A\nQ&Nsj#lBur?.uoMjPGS3F8d*)'&m$: -D)Li_bb%$<`Fgt^/uc;;J$?:=0k2PgF->Bb,PE>/)foN9d>K[['G;D+4D'E<6#ikAne,dm%i.mXun# -I]!c=ni,.!k7:n)!J3rYk7]muaSPAuj]kuNA&!ACOc_fmjX@Rsra5I5E!pmANSrfZ$HZeCn(jKE`_.#j -#@et3=3b?omb&;Va-C6t,mm9i3@;c>ndd]pk%S&T07@ia8OaBu7nr5qqHl"T0YF8=:Rc`d15:lH1j)i1 -CrJS]';8L_HS]DX5XI2#F$S&_>UCa]DPQS'fmrrOEGJ,gX0=_%U[@esg>-hmjtk#CO0_OX4uWJ@eCD-^Nm)/.2&+4X1'dKi?VOQ]eDT_Yd -a9A$koPB_C-:I_(O&l7#A)?^ubO=X^=D$X`JeLW/SU/W5<$LfP+Qm^8UBQf.-<6gFn0i^ -b0G/Ud1OLV%O=(][(,4[hj!>_dZeB-`&rmDnsNQ'HESb@-YG)-3,h6c:-Xh]cr,HhSA$V$AWR@oP8.V8 -kgTc[b!$f[hu3A8^`6,Fq#l^EYmc(_=op^AlSoFg=G.E-F0^ -\k.Cmbd1-+'flUUjIuUGO1ZFm.fXp:@1tDqngDg^*!2NLP-EA45M] -N/ZFUp:t)&(%Q5H:2lSE"8!rs(:&)R:!1=]V$+fd`uH3**22+QihqI[Q!Y%hlD*gbK[XrI]W*X4:CQ$ -]u]d`F+-jS?Cl^B'%hKrQ2^AD!cUghoRMuX,L1)L7>63GCumtb.CM7T(6b-3gY+N -VG+)642'C3G@4_/5CF[I<^`]UQ_VbE@d-m":^M1SP/Znns!WADYS[MH*_M -dL#C5>hT^jsiA^4;?jFZ`RrK:9 -*`a\lX8A*+2\qbF.FSCPg<.#^hO(=U)roaJb.Gcn$ZBa?2^.YPIKt-Wl36`re3i6Z#IkpK4o0LupnntO;k)jlJEWp4fGrOF1 -pg3m(rH`D)04m94Vap,UIq.B$UZp8Sb,>*36RPUSc+?OSG04gV1^.'"&q'?Wmk`2ckn\mm^Ih))9QK5Z`jiSfb(U -^PH-V34)e^csg3a:m)=^C9b]#4-8>B/Va1dX2U0E,Ai)2$gB,$C0W=p\u6?h*n"Mjda_gJ]?ttfG9\\o -]UGn?OEYcR(u)%/OEVp$`p]]=@kXe"OD?%'KtNnU`Afod#"M4BOY3WP82Y-:jP<@b+n+Q.1$%.]M]qOY -=q#[8=,VY,V8]r"W5[V9oB+k6/X@7/I"56T=(`=&tLuMk1*q^=2=+9GrK4fDp>'kesGrF`g"\5L!^l]E;1u_CZjk5TFHd*WPg4uH\aI>NQc/jU1Y3F0QBpXU`\>1I2nYU?uDT:g?(26)%K=m[i -Q+de2kE\'q#$?.0@oF^Kp8GWL2e+Y%B^.,296iJC8q/Vb7P!jMqbj$11H(HH.8QP[D[\gYo5:^ZG-n\75gaZEDQKVMPk&^n;arV.nc#AtRqkqHQUWkZ&T,ZYj3>1RXI,LT1f2`oP963: -"!&B4qHmXaTb32gAc4>I)&ABHbk0ElN3@E8a2i'fbal9U[."pGb\B_n97`F]*\-4`%*"JFBEQ.4(#nW$ -5lECu!!%Kr7bOTQ9=ELYY,Dbmci;!ge,8'Pi;7nqfARAZgi<,hneWNkjd=`>b!O>B/IqS_3?->kN8Hp33Ncc:bZT4dcp=p$GJoi"cZm0raE&lA!@;`>5Ia>V`48#T -W`:9Hn^b\n!Q8FdcZTl!D,[]^Lu^JFE)iF;`=3H;!CsP27>P0oaN,_.`/QmgME)e/))SX@d,H7Oh/*&UEeFm-TE_;&,5VW0s(O,Un3'%p@62:jH'' -kGHIc,JQY^c0B/Bb\O`rp\S:>9?'59Sf+YkGscH'5JQ@NNBG6"^6.ThVEraho34VSUIogED1AY^gp+:@ -7@oR>PMha5ZMC?lE9rc'4e@*e7\5Z0NfaPiXLsJ"h@"4:Dr`oJQsUT#MM(>8\MNPqXRJq5DhRQ ->0HN\g`'i^\NOITU^ZQUTNe?XTrU,0u$b'(#Gu'RB]);>u;k,LVF-@O?e:$QBWq"WsDrMTD4F5LkgEq[Rb.j"4UHU]eU7Of@U^6.SM-#m`] -0:L#17f,dtD7$M?NBA9fq1FL5^=ib\f\*;k\t.#i5c!Cg>%O>8)gVFq\$?P;7\47R.P6'gLs@:k$E`XD -ZJP=Z;e-c[C7V`YNkXD=[']J;r$e1HZfd\8f6^6gYNJSkNun/3Olu.DGU(OO0NPGoFl1:3oX?V_f`i\" -gZ/*;jEZ&8(gii97H]6f99JE,YJ^_-X2eC.Z?>H!,1!C7:-dmN0iFi@T5V`8_m1A&jLJLkp6A1Z(.)18 -qt4bRZMZZT1RU07h&$6NaE(H(MEK4+(.On-Ht'0;kI,aeniT'AN',G;p@2sjTGPiX4_p!6#7j6kgQ540 -/Nq8jRi?Wj*@kO]m$=r$B^^j]lHZTarILi;XY66"cH&4(q!F&'cP&WS?XXNqQE+qP.>E08N&d3#MJ-/g -`lj?(:QI.RLU0u%lJR@>%s?"Hi-t''`"C0R(cp9ID]H#>q(mb#eM^p!0am*_.pLW^D'\l$01DK(9T>1t -H/ch'@C7:k>4ZA;8+BaY@rLEglM`=)g_spa/#Lsd4)4Fo,Gqe^dC[i((jm!YT$;P.,Ls8qNWkb+P;ICRqc]0CUfb-$up7;jOniY5(a[&^1a4.[V5G.M_0XN($ogjLH#H#"0^uV>$=NQ*JAhB+$S@phCCVCGk-?\`;ci5$C+. -32PKDOlt;[08@Phg`N7]>jKW6&?6U:HA$4tq;(?ZB(j!tFsCa=YZF/UI>K]1M:tD/@M7FT4QlME,BY/Z -q(1VFhb/77pL8nGh[LcPN>^3$e2>g;,2I;-9H&E9aE(T3XN:!Q['HR'KkAYVp=36Z_um4kaV.sm-iP!b -FEHP&hoKm%i>['fP=VC4I;$"O'r;Dif8C?\gN9`LUXX;0>Om,eW;.Irq'5Icmm)-oC\$(#MJk3;&Wu7d -\Nt#K;*J1cgPn<;L)J$8!$Zjg8*fb>7%X:&F5GQ))gOUUeg)HcLWPHantd+B/B1_/jS>/\V(Ve(EZ.VN -HI3[WNrInVo,k'h$1tu>INFdnCU;(C7\9L6gs)Y1bm@2G#I?#mca)n,Si\D457d$8nFN;Z,eXH/IPm1$ -eYuqIFNR?Y$"i8/:>71j-R6_Tq>EdShm8n'^\G@%k;oH,)3$og3D$20iBSs&:-TSpSJ$U32c+<9g=i(LT+fQ);"OD\nis7L3q+16+D9AP,(EID5MQ/6bM=X9K[:j]!,=\r3J^1oa6B0ecLN^`ar') -la*?&'4X!X;"$_q[Q^f*]U6HmFIhU.&V(S*7r'>1J_5b1I4a75meFh#><#;qoL"Ih$O@c,el]Gtg$pQ> -3q2K]OSK=C=lLOj)/fQ]r\-rlZN^lVP$&'p,#'*&O1DgmpkL[&@uAo&W8cq6VgH>if>KX0TQj:q2c24f -0cd_AXlfhE06Qo]TZ3#PJ_qNUrYViaE=HR_JMM2?3fZBl3I^/J+'J3.\bL"!"onNf&5(l@mnBAlW#O+B -D_(=AE5@lFat.[!WpCFPnq$XNpWUL*kf[.QL@6a&0T6s4,S.q -EJ2M8'NX8q-Uq:*j)q*HYj0F6o`]Uqph]9SV\-%R#5Xa^#M$e+.ot_7dFq&4Vo..hgU*s?X#&>W`d8NQ -kDu5.hNns*:6lY^pDc,NI%n$WTM!%8/`Q7sK*So42c0[bRh4^+hOCWW"(C%5T@LTVH/BPGG_&o>Gi>ul -C)-\!i12dV_Z`P7TIJ`+ruo?j(-G(1Gn)M0Yi&U/7b&)4_9U9(rd -c?2=T*ljQ/Q.!^I9Te@ETJ3an+[9&%7p9LT^Z)QJjl$5$P%mqQ=U;Kr5!8bZ>6';jnK$o-fWmTAOGKGg -'lR9;@9uN;Qid_NoTC%A^KKO>YJ\hGiBao8AF1H -%61A6$(n`]q#_/"UBRV0RGlQ6&nms\Oh)P`\jS&kDBXUB^b",i/=sSm*Dp^-r/:V7=r)AV5]VOrgsDc/ -&p&]_;X_AB$nGdRRj;QX'I4?'B3a[Lb0DD_r)!)X^'/)/)qdecU80>Z;V&_=($$Ed -ML473U?!o)&E_UfX+$:`UCA[>p7tMTmG/#nO4I<<'Y2OC5&[JpIj%:93?<8VrW\,M[S'GkJ0-l:1;GV[ -P:dfEm!=""=jfL_X'go_`.nJ$l>ZZ/2/:-Z+`a#`1H&JW]!aNRhg^c!0$$q4V -cMb,VpK+L+=Qgjm-D^[ApeU,L^Fp(7isLkD#sjE"Pqt:%^qSYAG7%3b1cX?F8/ZbY.lH>eSYk6Gb,cal -)!_TVh/0;4Ba]ruG3)'#lGE*/5lL$&4!/PNRBoQO>i/aI/te3MmQ/]E@E1>7 -T'76nMW39Q^lG?NK?G'I^P*S#CJF=qO0uEnk!#@p:kN[A=dAp1puoZsQa;Gf>,0G:>D>-dW7g7AQ]uX9 -A6ZU??`*cpe9u9eR6%(-QD7+&2:X('B>S8@kdVHM--6QP+_OJY?dMJ1Iqq4`K[ZoPlRBTs,%0a#pQl9! -2;_%ecEAki)geq8/$co/FPpi@CsEm^`[X\DCs\DG8t4)@&X;=#mg&lCUU[n2`@cB3P$X-4p>3t8EdCSV$^]b64Dl[Y.+_e4;YgT>dG(U!M(>B;H)Hps$b_CXId0Zh\e7*dAmZA:>9,8k]fNsYXcsh?21sf]YJd8*j[V<5>>3lKRSU,#]=Lljh -Hbc(^.l`,aCj3Q/>3q#Ze=Eb]4<=-k(>B927TsUu.;roT:ILbQ`HK3Q;-Id;aE_GRXUJmJO*)+>Cest! ->3t8,[L'N2MuAT_cUWohCo-i^\K%THp4+-F(3@XJ\$_1E@_8O>EKObtU__]Jq7d/LrR#)d6XS@(6q],? -S+IE%QuhZ/Ee-=]/[cUA1X]_SFFhXrZ'cCD;*S%b2/&"8:J^?qj&>(J"*6]4I!Yn%g_lSiE]CeB)XG -d^j'V8,pSK2r+`4Pm[8!]Xn0kCN2n'6QIp:HLT[lJ`qF\-_0fCqJ&*VcJYDFV9^+#f,d`!UIf?nJ_C^Q -ZWmTKV@CE$dJa$ -3;[O5.GAFH<*2cB[tuWJr;$8/4A_7=_62V>L1CdK$cF&FAo0oH7P;M<#Ln`;WZ5#b)af@M"++^5@L$p+ -c>t#rHiRs\*:7`,>3Yk^Ttr?-]b/Q+Nig'ugi`QhO,q!8=8i=S3qlB$>3-oqJZ+]?eN;XdC)t?Q>%cg' -cm3H2W]<`9'>;ouI2^lOSNu!1^b^@_4oipu3Egnb0/XQ(k9aj-X.0WF-/8`L\?D?W**=S:3[#`rh\/+C -4&Iot=m,s(b!XL;Klnb"B_rD1bu5q^EQ;eXpFgu;%c(^3:?JP(0!qkc4/20C;6[[ZMOmo\Nk$Ac(9QA% -n,=NsI$V:-YP_teK,3pP?CgVfJNC[bH1V@X;0PbPnAj"mmFZ):[:nt"(t:hC=bj]"$[3P0eDZ3i?Q4PW -XL,-C.m2pq7B=)Y4uT!11sD%kHG=;el[kuB/gmZ$Bb0WZ'/^*118&4<%)_TQR]RFkO_#J2WRpQ\I-k=d -gQ#LUK"f`]NHA#)4cfae#mEdPfVr&OIn3_c^Fkl1:)UV0h,h=5Xm3:CidMom=$=8np%3.Ye -Fo7Q;:\q/fs,`Ct4A+pQ-=)-eQX[FHpa26VOX'\92gL6$J=)gW?\V;K+OZahJM%$EgsBErEEUiIED+J. -Gr/80U(?1Yfu23!Hbcrq^YIp$f.(\hNNr"!"`pi;)X(Qk]eM]td+Z8I%@4kEQbFJ%e"Ao!3hZI'Ci0Oo*ino6a@I*]m;YLhEo\n/9/I -?c[crC5OW\d'-OeFqo-(RO/J3)6fr7^[^&2NTGsXXGX2ZS$fDAhQE.ao&5XBcL\DfQ]i0n,W/dq4IYelG:O8^Ag\k -b43iOI3VXGT843[7hI0T8\c3`P/!s4TC)XVj$hq"H+VP`X9*`+p=J2Q/U+-XGRdP5nmNY%C-4CH42t3pg3T#GKBg*$2PU.lfSL7Rd^a`/5A]= -LX,L(%p>,>3SK6 -0=fs2]hQ5S+*$M#VtY$2@NRYNb.UKI-:\I;Sb58?_FFI&@n)l&Mq12Ob6NoLi!98fVKc$c@cEl9Ze4WJ -:',)#OO%sEmQCK*R;H,I;,tW.(gAu^P%W/]oOf.8j(r_]f4VJIPHD/c>(:#b\Jm/7e]Bi`,6LIS"5Q$7 -@+%oI]P(A0lSp*#^B79kNUN)s0cu-UksfKZj$LDQs1njN]Q*.P4KP7lI*5Omn)9VAJk?Da(315+3l-Y] -'?$F^616FZfs:=[eugq8s.$P/'rMo'):D@clM`@/Z`MI6G[`mY7^R4)1Ja[(F/+3ZCo%pWXZZ>]rC+Eb -=ff]nd#)r[F=90T-RVg?7?!udg&u1\mgFR)Rq#s(f>,I?HJBJ\ll,.4brU%Q=M5*@bb0,b6C8-LOJ,\R -J'=Cu6X)EdX5*Gm=I\8aM3Ykh#Pk(O]bS3;1,:Emg0,*WT`:6c"8rZ81:46#*tg95qnHK#_4uX&4SYqh -8G;Uf(aRdm#5L#>QX"$7eJ^odTu[%]4K%@7FQ$q57;Kkh.l_^Acm(-KQ!^MXa+^r[`6VH@$%D#<+9(2h -p;,YA7>-]T/$7_ -?HrtJ0`&:ihiZrMIE.?[iDaiQ.=JJ)]`!]3hgH2_(oo+!3X>UCOOR]&`sApGWs)sK*G==r!_$@cUIbh4 -?_Jdi=eH9R!Yq5'4I^MNH$BB@^&LC=YTaRbM(":41K!j"p'R$IN1^ep&&%_1m&>9aYV$Q"M3G4m/s^Cah!^*ka3cF\g41P((9Y1p2n^<.=8R^5hSO)]I8+fpkkh_QZ^6]FCrQNG -?&/_Es7/o&@Y#kBoJe:=]MgSUF7:c_a`F[Q/,!>1\Z>G(-,lF*?h>*=19JV^rrhK0^3H\k\o=2D>'JNq -i-+W$o'@rS%"=<$5=Ze"SfRi/EZ&%0&^NmuGrlQ9B\i8K\>;GMDOYlID'(1j0SR7D1FD)u.)D2*J[dV- -keb#G"XSn83p=qD*kJ;Xs'*Dd8L8-A_!?8as-Jjh*W63J+]Gj" -M/$FL-;YG7B.JH^I\An\03pL,9UphBDfQkE(t#R8h)SqD03@r"R:-1fF$I%Rhm?JqT;A*,\/&Je\4-1t -DB^GsUE-G?-J[;;rbnC?`+\btKsSa>j`]f"\bP1Z`gfXuk-e<)fVF`!d4A-"c>^jilR[FFJY5qCXu]%t -Nm!9ATcFieIXb7Foa:Nj/8J3Hk2VlU5Ml!'quG/]k3fDu42gcS%T5qqa\cL9I1ucg;-'>k5dYFCW>"Z#Ma`&ne7'0a6S1cl>3t70f$Il_a9>R"*Ek!kBX*IZkWg^8G[2mj -\knV/u8In;4m2kS'92g&\FZ+Ba(C9`)`D5bG+:+]MOG,WA>)l^g/ -$YlrX?9K#9eAh. -/J^4m;N"OGX41TYZ422nUmX7lA$6[.]\h:\[9,<#QWgI/Ile^#U)'fLpT.VBj_?Mj@YZKZKiJ.?>V!?- -Zmc6O?2H!T+EL`b2kq)e!b7dIQ2K&KFb&*--r!_lAPVQ-oc.d!@EUm+r,.8@-+3tSM/e$Ita@;'4Q?Faa*hqIqV\nuJiIH'4Krr^;6D3K-5n8]`. -gZ@JWM/0f"Did$).*'F99jA>m]8:;-l,LCDa#@[_1sQ+"l34*mn_*cd8h*lc,^P,[Dp<*N*bq6/_FQcU -Jn?Z31ic:A=#NliV0H&7A$!&gZsNS61-N66kRYE+N@W9SS?mRQp5O-:n(ODM^?HP+-^O3"`8OO@0^dP8 -KTiP;JIE0t([;L63`C@dI`QT$*H<_6DMSX5+U'5s)*(7+>ed:Ol&T4fB(u7s`qRo!oMjb0_@V'!@W(\[UtV&>1' -bNe8:kZ]iDd$jct%q3T6$,[JJ/lI(EfUNKiKT1CJLBHOeRRo'(>^B0CJ\uLc.qo=g`Q7])!G-BeZr6\,T -CVTLQ,[fOm;9G:mKk3c5OW/U)okgA27n:/tdc"m6[a@_%]7-E6B,bbUd(=7TVnPd&bTjLm7^+M&QM%Pk9K9=C>NuTcZtL[]g,\ZZ-2@blYmBb[GsF2&&u)\ -(X;e?]98L's4=f/[iZYc4e2GSPJ2lEhtFEl+#1s(!EW2:^XMp_aW(-15,`JTLC=HJqL*k*aD(@A?VUEu -rN:3Ua[rIHc^a04E@ms.:4gD*/T>,f,38?S<64egP2QX=C=3<3^B^;ap9jFb#?omKJ_@g: -m=EsH)h$W,D\(o-@1TI>HTlcFHqt=tEDAJd=RY)O:IGul\%@=eHkkf;kqd7uK+i\Cu:=8*air -5b;'+UEH8*MYBTn:J2bH1*@/CR.),?"ijT"R$a[De[ -Ve`=jMWuhtZT1'[6^2VPi/rD*7*[g`*%b5\2,Me3EkM?F"03j(>Mt76@l+;Z)BgSjL?<4P>E<*8Oc_E7 -&L#_^r7O&Scdq$1GS:YGMg?O0K$'f`-"trXiscJ^5ZYt4'A2oDHH#5-/0pH_-r"eL_Es*b41R*j'(g8$ -6uGemq@E-LJV1^&o*oU/)!rAiMQq2B[X],4]@kfdL&LCcd)[JLDIHkO/+1E]?FF@',9iHUj;jOC`mG&LC_>el+k7Ir>JKca2., -Euk\2X_=i4<"j;pJDZ#)ZK41E[-bWdU3][nrF[>VSL+gd*CV%\CYt(ib"j:.3$SB>:aTj,:)HhXGf%=: -<%eb:mdY+*IZ0)6$i\$PFE1k!<1;/Ue?@T8[:4;;H;rE>eu4H'*F_Mn*ubqd.cu#Wp.`g#m,470md.jn -V,dZtbe):me@(aKNtsA7I`"L<3EI1=kUmd69QX;jKgIRRbbmqeWkMc98BV$dVHqZ)H#rh3mk"`=O,F:4T=<`cEoYe -ZZW,#@H=2;8hL:1FfFpJmAB@jZ+A?$WCGC9l@B`9,$heeeW!`I7n2U5[(#PkTWCG%,>)BFbp$=scU,(5 -(*,#O>t@)6W^G.u]rS_HT`;4$F'$ptf8X`5:GHcqhCkQIa2a$Hf*[Oj2(i7m^WJokh3@ne-?6D:O0nOX -,R?4l#]NeP.D4\UQWD7.E(_i':RUC]8A+q"9S?T0.rCaB+r]iC22p$Xn=?i=7\JR=)e..!JNTjRX)M;V)R)cqmQkp^Um!UcrAQ$rn_/,V;K0bc,;I13DR=+?8[^Xn>C3&JM+YBAC.)?3Hj"pe4f.X% -L7[/I)Fm5Ub7=qN%%t5\f#13C:[4nS'YR#_XN2nj^!90.]QuO%ak2rSDVF,boms6oebBKq52'^P->h%3 -KV&mlF0p;#`]jFT)kN>#6%m8g#NbiFQV)D\:\jg8,\lmYPU*83s2N.,c*b+!gPZXQoVD91e_D;QLue5g -qsneIe^=ZnH?Mj:b^-PMgt9l'mG;O/0](+%)J!j->)SrX -+6;tJPqSICa3$UbM2H>kRBf\jY!,pBH#rn[@OK>V3JSJsj'HFr8VoPPec's",B_?o5%%Lh;[9G0QItY' -R5aL*W:7slI9O:L;+7KEc>cn.W5q#O+.4&Who.>UNn)pW3%?L;/5E^hJYr2((LtaA%n.P(pdhFGf%;/snO]+KD0 -$P_"bR?mMG`tBSeIgE%?(9C:B2uU+R3_cW1t]c'1^8kU1gF,3aT651W\#Y^RNieCt*nQ6mL$< -# -^Dl07dL4O/^(\7Ckfr$Mjs>,ph"F?16ojDLB>ke5jgg5jI-]&dp$*;i33:>o0JqX8:35L_b%^[.D9d\j -csMeL'E/p_;O"r^#"ulIs,cAu%MU3D<%V -?!_Njs0.M$9ec$RT/ZUC1hZWh$'U2\dlE]MhE:#Grk9ptDJPNTTNF/+jfcG#j2];srM4UEIrdNP3$,Rl -$ug*2jbFl%%I5cnoZ3JtjC+bVNNG@@4CVS:4rZIS6(P`FlctNg%25>hZa3cYZsF_u;BFS]P+d\[:[#j\ -k-I(f(/J\*4%49ZTtBk3TBV^PMhebq)kN.>M&?t9:ZFAPj*DlTRBIpg03$/Alpiu(DN7]BQgZ^8k?3%! -hCWtHF.t\];c.2s?]hXbpcU`__.&&$"rF7pW!"*Il&!;qS%h -=8m^dIFP":e,BI+FNM,gJ)ZOimOtfh^LG6.5K6Lt-@*H_5JI97U?*d@`?c"ofUR&!r%.Hc\`_ejVeXYa --#Tjmk1CP-diGEF]>Y]],g#KQS]V8%7WIJc%@$!jIH`n#Ne-s)P%3F6AOH;`C]JB1.oA45S(A -k\]J:B'f#c?h:Lh;pA2[4kpo[k-TI&>CNN[PjgrWiEnS0S0X`^7-11ccOm-tP5WQK7pRWJ_*Yi:nN+-? -GZTsl<$s-<*.B3)pPHdXXcdN2^S"qCku!oq59)lP0C@r&m&;IO%;`O6I+/d4k3u5=0>n6nO;>93= -l]"kjk@.FBg: -UI*4QSi^cY1R4$fCG*<$R!3NE\A$5HUU!fVLK=q`bMcqF2nfs5K^L:9eA6E5iU_5f5$)HW!/HV\.1_1u -3"L**W4fX`iDk6lEqlTI2U13A7.5"'+7bsD%_i\^LVr#?Tk[9iI7#$FmXJ)N]oL^U)0e4^UPHNnu)XR6rpq\)`-Uic.+DjIGF -MLHM&5`/B[]jG1OO'^/_noqIdD^7OY8]\l:p=(5/`EMlS:bK3>_;c%AO3anX]U_tg.mN4^b],Q=Kg-G?0DTQO:bWg.F=8Y+3?[:=F -"[?3;3JnOEp>Qq6pN-?^Ss5T>^rO#tq-o&_0?4?&BZs0>/4Fm>5o![K.M(ZQk(sSib7U>5Z%\d-cH?GQ --5_(m'6]K)a>s\<&+H5mNO[Sc"M_.+j:fd:.If?sqNVn98N.T'a&PWi8g%7^G(%ISOeZuGbN`(+G1\<, -W81J5G;?eo<*7>5Ck+Lg4fDs;k/CuFK3?[Ro^f4S_qR=S_rcqb*RsUK:UResH*6H4*1V/CEpar]aN?OR -a6d7JGqauiY7B]k*3+-YV7!n%ZqR88)__k(kRNK4coFV-e.*"]Am!rD7%N[79!88Z/HG -K,E9o$dVhSltGe7m?p@a4+H;*Ro4X4Te\d5('P5R!]mKY#:AI&A*Q/ -BgP%M!`+VU\Hh@jnLFc=fX3;(nX8h'\Z&jDrucKRnR=s@mp/&"@V)JA==Rr-OU)M:\h:<@NO)UUhU5^m -=R.<+3p'LWBmuW%b,S4uMpt!QVo2c*H]f:c4raZ\&ImpNU3Feb[sg/N\J_T)Hc>6-T.OHUA;-58Y2cRtk1)/KM -N"/HK`#+R^Ci-.RKP4-qj%YgrmF=Kg"ML;!TtHjX[1[-rle&bB%+d1_+TX9N_aTKrqh/T#Zd2sFXB\VW -nI!cP;1r%Qp0Yp]F_S%2[e;H9]t#I5mF+qRr.1feCKrGa3bb'Gf;EZ?6]W8%3X\a"qTXIWWLQa@cb@`0 -$9I,-e?N(tDG]#eMS:'[[Uc!bjJrB[/a>9E.r3/^b/;A8'Dkj;o5\=o#EAFji4"04gZciN4SnSq7imf? -7Vb/+A;')(3Z_#Pc=MsE878_eX&'.FjsG#s1cJI%pOc7,3tLnE$'N^TL%sT_k&q[6Dor4W9]8ciRD3d:s)[kHuEo1Xg!qADiJ5Oi83'h[c_YpR^F&9Ws3e+'BU@ -51%Td2t/"qY68c(hsKSla*QpfGDe2mj>i4Df8m=bere1jBIGo_U"31Rqc;`Zb8FtKj"ZHU';e@o_40fJ -_^TP?:5mnBZ?dqnQ'4&5G%@.hUsC:'9XaoUNj -Xdhb=.h36mG@!DL9SN^KQ`;'3?T=/6gi=Jlo/SEA]C6.C+rfHOL&Q -MY[Vpn#K/HnRb9dB+U]AbY6H",P=fBZUH%[$*E@H_qU57-1ZsUZIU'RkuRf#S\4%t/]u5>b3\M(8L.@m -LKTXrB6I#r=8M-h;^Z,Ah'tKNn`E>8EdTbV]<$UIG@V&^h7Gp>\a.4j[>=#&X0I]s>af`SF1cCG1&AEm -f*bR*2S-A%X7=u%m$-oM`]iA8.[D*7+"c%]n*5r4+j\9oV(M/dXK*:gaL0R#e[g7nTV>eAaiDY*c2:>tT7"]: --8a1<,G&Rq/rYn3>.Jl2<4"g.[T0-oC:He6OkH(_4kmQ>YPfXYZ\&mYQ=ie\E^.X^qo5=,j=f+MID8Xi -*N7XQS*];4b8E@3hS$2;S/XN!WXRu+d<$Ja;-pk0H1l:.HLa6=A2PuU>B^lX=r,*UK'ZI_7''T+SoJY1/I:26YMk.-LI3-0Ut_Hn#PL^eK/^7)9U=jCFf!XI3;*Zb -5IoMD8muMM\PIGS7pk/Hgp'pH:&ETAa#gdU+.Z[Z3Nb\-^\VE];MF;4oCi;l)6GTHS?D4F6l%.k#%GkU -\QA%XI2U*9CL>T;,'G?8@dj1gM&?T(Wk<2.aN_ea09"Fq4#$5fd"[HcXk^PEK3@P0RIUl(rRB/#lJR"9 -pB4[[P^S?>-Sc2-H8>(Pdid0kqn&EV3$aV8)R>cbXD"Ai6Wq/M&R?;!GR:FZZ7R@IkAW)ZO0)U,PX82]]fsC^/cV-4Tc-/%cG[k"#3P.q* -:2VD<$8\/oOEft(Gd!00/8Ta]dU,5'IkD_e8utV\H/IWT#iFcUPs3=3\tuuVEa?ZiM&dZ"9@)U"Q*/g, -XHN0h=f%n\7V1)L9G6Y8[O%mS%FBc&BfEJX[7#I]Ta+-d.Q6>Rc;AHY;LZV) -)*>LcfigCn8]R;Ek6%Mcd,!kFpg5?m3W%[AIt"O8\Upn`nU?s/K>_Lpd)d2Z$pT#Fb3;9+*1]4e\kQK< -]j;4!c8N)M)t(.]:]lDO>Ol2,+1C<&U5NjEp!\B"d81?(j$Y.H1(3Cin?>:e:YnlcYZS*JSl;chG^D/1 -jb;!\a#%]WEXPflY"&+O0M?F`45+_eO7M:Y&&Fo[nj.nehIgH7kX@)#8Ik4-`bbWp&YU%5pMQ]:Kr^ZA -ZT8U`pDA7KB"Ju?!tY2[`iR$&B3ZrD'oDGV:&JJ&m_jP#b0Ps;@(DXMpI]1tXRZ"ObC7PP=k&a,jn)/C -5NE['?M:+g@RYBkmDc'!AR_d:j/LB>LO=';qdj6fcYK\:A?.cb_,HjI`RQTSc+Oj_?JU`EI%l_A.%QsN -3KsclpXXCmcZ>2ML-@[`7e`)(9(%Qe0=mAAVL,@!''46kMpi_`,&]?^ercRQhT@t)JaLJ-A5q_gF6q\1'm(7Fm6DQ`O1(Smthos>5d/PEs-rOdVOd*g7JD4K(h8g!I,*Hi-R -c*4J7%,38hKt$C%XHmAin')e@^3Y4]k\O"^e9Dn -Bksni](!ksSq5%3=fbVZlk&NZIrFQ;oL?`hB,d/3F)MhX7OrWR)*20EQ[OmE/n,"8Np&fF8'gC?[:%Uo -i_+:7]>cr^F&`h!9RaGg6.`iBN+o%]lr0#=0)`D`0/E6C.aOZ4#MID7^#%"`]>T.GR?Dhuf>sOY,cbC6 -[cLY%MGE5[YotXe@3auObU;VmdXFVde10/+d9ecj&<.+CK&g'De;Q;,4M;Ko,XuN*AUbeLKPpB1QBEr1 -m.q>fVUT_#&\n0E:j&08hpJ!*`OcUYgc&98rkYR<6GDI8L=X%-5M.fr9WUeXGpI!=b=Gn"K4@Ks,1oSJ -r%$o+IsXYpak4,/3lcGZnAsiQ3*`kHJJdDr/Ni7#r\u$X/mrI)s][=9,gN.GZ(U^ -Tsl7.nqX^KlMgVKB]CYg[C3W_KDFWF9P)oA$GmG!+sE$n+pPpX*`]^\"cLYT()7K6o8#AFHcB8m8)>RkgduFQ.i-V*O;n+O=lLjX1C2fcju[eJh=I0BROa!#91MrAW8g/cZBkBcX=9ei -airQlWq3iL]OX'%eNjh?gH@'d2d?.$:MuIG]g;-7G$/]AG3jSI^,sh#_=#Q,>$.=EXaGrGUTH`MaIk:q -3[7^uE@A_0d=KB'/_3)6=k12l9pKk(,qVSWn^2>;J!C5&Y9N?^^NX\On>T(\d#Ia;5>Eonp]%+Os8;C/ -^OH-qrP*j[dm&?^f73^FrqZ +=12"Bm)CbO$f!cE2>g?m=eAP9gG,a&Vm*2',%!qp/UckSi3nNO? +g=tgRgM+3ta_#Z*8RL2<&iUn*K*ir[`H3Km/N^jq^^j_ +8_\q6_onjH_j]L"d2k%)NAb?'Y)Y1`hTL$NY81Ik[kIG/;`gKg0?RbjF3>m^Mf`H7japGN8Eil1Y`5\^ +<'&_cK4]1ZQ!>b>_hP>I;@K\5bpfu7i@N.S5'ZV4B/Gn-9R?77FnV/C;<:C.;Pe;>GmNS6X]fBM_,`Qe +X'YfXQF"V7.(WAK@``h'N!C90phS]:Cc"$)CSm(eu +F2n`@qh$s*N##:DoS@eiAPM=(,9&0-&6bDae]cF14!RgKnQ>HA4Na>MA+S;]DGR(sj;ns&40+WGJr+qQ +V&aq7V-;!G>rGcd?=TsJ*b@"#H(W)W)W%8LWrK,EmBK'.HEj<548U;1eGm6mA_07C`VXIe@>%$TqAK0r +LG)9d.j86p6&?49?hAAul/gJc^PZ@c3SI5$>pJ96\@gVN):,.G>6f@am,_:4IsSYJE7N@ZXY\N8F=ju? +D7cBYe?]>qD>[M0qd#mpQ1f5;Gp9oVVO_XO\ZIjfH+[B,Hb%/gE\BJSi?ESC(Y=`!j5m_jq4O'Y#CQu, +\H`YK(=7c$`:4Y(P)p.$6l2tk,Ji\d$lhCC+9!'^EjW:9SaF=]/_PIt^"`5X2Q8$13WWruRX22,FG=+> +PBBSQ\&H(uRFe=S@S%-d`Z4K0j:CmkiJ6cp2Wq@$*NIO^XQ[a*&"dEb"$fh[![$TM[pV#hQ11Y)P\&BC>^"g309'PFY`Dsd9XZ.#6]j/go +>GjV88AQ0jDGqN"^I`O2LXjIOh?PqRV/ME]>6jQFm+&2nB5qD!9.-A)52%?`?e?k[4PIF!i0j]mSk#=H?uaiX +Trq]!M4*bM0iD1QSU2LhL905)/F_N\O@Lp3K%\OHl$Yd#^Q=((A>^!3F[[CXEp!K*"rohlj7>hbI +4\.*hgkBp3q%g0koB^R0lM)35;@h`L,G;7`odmKon!e4M3GH-kjr@PG=,sATa%?&>re*SfD=*:p"d +Hk$=`gR@/pV!(@1/F1`5]E>)_:=*FSF_47RY.GadZmtIs/is%Prs("L8:RWUH[LIlDXA(f(M1?_f$Pa5 +.'?qOjd'X&/`+7[*Q?"Sm("(J.ru3`@QCk_htGibd[>g@12e=2OWT`T1[!;bYM^1d#f+Y0,P$W@D^P5N +**U$-B%\JiXY!'$->->aku]MBF^*FE$9K(L0mU;3.JMW&^5S#ADlHdTWb[Ok1:lE_c[F +?bc+&XrJ!9;;D&=*:4sMGF6P:F(Hk=I.Uoia3G9f`dG;=)\h&hcJXEkCR[&d/PE?cmu\YOh6s(=a56iX +LWi)V%E?a3#cde/g`bEImO+d,Ipqf(F<&3n)e0NUr)joPn\B\Do7,`AHGm."'D?@'rdOn4s#4sjOk`0' +iUdZMM05>0d25Gp..qAh3j%s2mFq&rD(C& +W-c?"_VN*>Of88OB5t.[p`'!!q@5UbTJPIGglAQJ]W(Ka)d8uR+.U!qH*FaK6&-(?29QJ9`+M#WO?ZlZ +dlG/f/$"3>+:#(R4pZ(YG!oYS_MkmsB+Hr5208ch:R&;7hO@)(I?h>hmSW+ngttEt<21<:FEsZ5pjD>A +P*r21ZDC"+_;2_rpBU_[UJTJ&oLaDj_FRj!(3dW^#;^lfZcY#A7NZrnm-mJN4M03th?dte/$HUi?P?T* +Sb&A>K8t'lq#D#dq`$62WgV.nsXdOI8 +JWtX%\5]n[Y(o?n3:#7>(rkIKL&=qAQR70]Ue:p$EUS/10F[#2q/SC_BZrrD*$le7g5OUNpnl'D6>$4U +lAQs`L?#t4<$RH"NqMUe,?fiAH7Xi&UoJ@kA+T3j!]#BS2i*L'5#e$6o]"LG-iKN[dDti!n/G.&=#*[V +o@(9%T2#TCl-bhu1Dg_ap#.m:5Y?-i?l0kDk@tEd>pgPR.*Sc8bZ1@N3V_gpJP$$j8f?[TF58N[*$p"< +`Q9329&i[l4EbFGj@m].XrP\%>;NV$Z"f\(12uGHk[oCX2'h>+ar-G_IGHID_DQTo@(adHNcUU6U'2I5"0]]2#N^4]sHF&udTeN]h."ojiP"T;D59&`@dABj]('VNgPmn"m_N +2_u35an2(Y=[AJDm*8`UXaBX5g4*Ku)a?#3BG9PIAs"kZqfXkG/[g\>=;X1Q)M=b+g\ +`3NS)YU18ArYL`;;8UUGpk*T05+Bu;SacXUjGL`YZZm!l"cdF"B=(_52_iK^G*c_[6AN>Y*4+-UR:WSr +DXie-L.og"M_6dj^[65]`'JnCm;GZ^#%sS+kKp[c[iSuGCYos^rZe$7Kh'^n$tC+SaDB+c:X$53FP>$b +T@=@lOldOcJLt\NEKA7'h8mdqP_,*E\Xi;@0e\m^iJEB0IDpaOrI^F&`fhdm/?.$e(QY=M:[@Nq#>tuU +fJC:AS7C63Pr\jm?jN!J-4s>M687tFS[GDkRbp6;:[WE[9V_6AQP +eDi9rP<$-5$d,BBcTVo[FggV0+Z!P"[ERd>M*Bq(iKOXq&9FQ.2I[.?hA`R[^Spl#=n+!2pViFukD%Xe +2su[U*0@d&?T9R"[aHrQ5f_@A?KGCWIV!sb1U_XQ?8-JHFcNo3pW@lXA:?*uRsfg2K%qFCgRNP&Rc3V- +/<0#O,O(o=*2-)Kign6>lC54-G_S6r)-ktS(lEj%H)Un[:EpVMHr)r)COukJ+)JflT6`2`-J?g-;H6k&oOj0McTZSgR)4(3tbk +ri@nAmE[!RF4d*JPc3QW*]fPT?V-TpD_&.-kg(="p[r0];:b-\Jni:(XRjX%cQ53s[4K[2m*?`;Zi+%N +7_epRHBIR?SfWo/O7aX[.EN_.W+mVKd%:cYaI`XdZMiI/7#B2_em5IDMep[UJ+fO=mEZiLGSK29M5Moh +cTWl@gu\L>DRbkn"k]FNDO+<.am25nk%8^*r[_Ysg9*W<-@;iPpctQIIp8,`,b;BGF`NFM?_uS$[[>#q +g]ssW*^1'T@M^?Zg$qTFf;d+?*U1]MnhC#FB/eS;rM0fW:78^01<2@7cV8C+X<2&qF_AAJC&dG!QTQk# +Q,=sf-g1!PcUl1m*,7&jMS=)DA=gK1O*WPfpFmTu>)LgL%1jThP\Yg",Zof[TJC>O+!c<1m?U=TgA&`c +bcsbrpHN-sk=NitXg2SQ)>l?D/q49R>/@3d]J(3C:pBj))5;Y)p%11Pb_= +o>h?g6j_tC]m)6[:c<3"p0a).`]P5dk=C%fNad6<#7^J26bTMlS'ISbmW50$>)_3[;\?/jAB22ZUg2$Z +OYKJ!I/Oqk-HRe.cP,oj4>213GQ;VUE(De:$85H93-iQ+425a,4=-'DBu[B=CYZEt#I?E0ji[):1C'3X +SqEp"]osrj,!+_^Ea,4SnP@GX;&j;<95)Kk"*Qp&,k=U]-Ec4VXCq"5,d4&\N7,lAX?8`0.!0"@"G`Y- +lR2]d=")aS9?o^84sR!T,kV"T-J'Y)]5/m!ac*JS/XIZ2N#j=PbD%uk+SVsVjXoU':?jS%f9L'2).+D% +7A_7b6&$rGPA<2DD=,o8ph+Z;hV76Ol)U)s/bOo[$+I[N@H,[RLY!b^h#>`Q41qGR,1<:F7Hr(UjXm,( +B?-%,hqMR5n6*_fOCcHRFZ=@.DfCM%dr@@f,ON_.&KMiq1mL*SoJQkaiJG9Ws,$SijimLldqt5P=k`hS +lt5p(44^;.b2Uuca@RH;[VdYAmS#(.A.Bmh5PUR#;UX2;D2\qbK.:a)b$rf,CC@gYJYXaf?=kngX3m*4k0UFHX>?Y.I(4W?O_me7k]9>6b9g;9ZW;:HX[X+=Io#)0R$1h`H:P!&k=\B.)erNZb@8"=2#jRD(6oiXc*2n(GBDW +ai@9XfMZfS!@_VVqn2LL(SrYRpUXhVo..OI>G^nLBm4G\mC$;\%9+uVE9*u91&#KJXj+MER#.]2&\Y[- +>/XLC,sc,aZMI3s,oeYZ7D(:X +ilgli0C3q)@)SOcG&V#(L5"[4#FgJfZghQn1,gjbRLa"UUtBg"m\Ji_LKBpffH$f(M%RMBm&>I>8=>I6-&fCA!U7unD;ZnG(QQ78jHDdKR"^SFrP<$TAOnR)*J'<(TENbZNpQ\Cj#ZEfK; +CY9RHeRKWa[YefR`*t>5Da%9#d`q^09RVD,S]]/1a.&4[fWAEiC14G%(4M0d1U9Cn_nhb'N&Lu>]\1s- +k27W+Rm6_2H&BL?-$!s*CYn79=qSIgbNFB8Rfg!#V[j'%r;eOgp`RP=O;4RiAlkj3j(\7J\sEXN>(0N( +7Ff]k-ar$,N%+P8N["8!3#ir%;YIEmlP!W"Su>i5a$3_SikCa,?N!kq@.bq0qAX[`[I-+S]f5./5,b7u +"U-Q-R?bB(h84X.agI:Z440D'D8.TVY2mWlmlY#$CVJtf+>QkKO2m\j^7\]2F#bS0GD3ki]nPk&R'k'X +SUCCmggB3Fo29o3_S&IhJ4P.\p9Tdr(:88)Dbn*=]juO[cDfLaVOI7Dg_:p(C`(b(I=@GlM\qjPH%k;(*-Z*T53H; +;&mh?p5l:9*jgI)2i+I?CEuD:d$hfj4+&/(YB`#N(4c>FL]noZ>!&;+Bq9Oj/9SJ6+p4+[REfDQIXIdE +iDOHhk3igQ?F>@S5q%`1o_+J5?_9?#40]\l!a;p;%obf9gg+qiKQ%+nkA`nLnI^qX_7o_`! +UIGQ.JLbp)8+oen7kVg;DuWbdkZsQukc3%B0NXWd(Y,TPe`^;-.j;f'hkds- +iXbYIU9fYp*WiA7n`mnNQbP?J-@]N,NBVTKY!6Cmr7bj5.a[+a$_1rnhq!:,UsMC` +h&1J#kLeMOQWo73&,n_LnQ'K/T#u#U>oP@bTdnG,Fa\9')&:LOa19\U%lt6%WmM&)SSo[LAH)2@3'O;2 +$nLTr?s[rPFci_,EFF(8W6UpNUVVo[$qHk%e`k\M!kE(*dKB*Mc:G)XV'(2e6!,^G"1YI/a[+g)\ANKEDpMJ0V +oS5$+K620"Xa2n%OR+R0nobZO87.`K<+g;rZke\aX>6?mGQ#kDmTIVifoVNbm6rO^QWshIIDnE0f@VAu/]\o.fS[6&/5g6-6O76nE=\nak*HBIKB#"JR;K3\/B4d(13>C>SU:)P:k'gG&$ +:((PZ+G8Xt7D&"du//)A9Mj'k6B6>N*udT:5V +\C9E.W3%4pb#eiA9`L)EmL73*N)X +^'qE(@cX4?H?NRkoJ]p.*3IVPX0IarHD4rHf'(=OOk)4lf!m^(9fo^OB*NKlNF&@51Ihq)LO,XQei:"e +kZkf=AW0ktUQ=o/ZK?D5cl1[^[FXQ*FoAF"\4(_O7N^1iLJRedh)+VaDEtMYkYW5oBT:l?gB=8Nef)5) +';2beilBi--W*%ij_Bc]>^q`M70W*FbWjk^(_8Mio=o31*Ste/hgsa]m +40q(R_\?*dnXTZ>F4&1+20s7BPG:!]%c&tO,/,rS$]u3,H*J!$W?Z)!Z1EL=Oj_X8QpuZ[]L_R<75Rg9W&4bdb;*Z7+qUG+(XAu'`V +JPf5/6"f"\<79s9oqV2]hSD6^Y,;Fa9]L'L.8RI*C7>s/Na<[Q:-+qcn=hLSV#Askdp2lk_5R&l.Fgn1 +-"XGA^'Oqp9Orqt1n/1inQtY3b/YT4a.]*U_61#[rc_RH-PAD5jsK4jqHij%p5%Gi-Q_B]dSR;[O8@AP +3mSSa+1:[`&aKT(>uXT-<9$UJH/V&`6mp+s3To\o-cj:OcZW2ggg95,YGu4kD-CVY==ID]GMQXQNMo7# +HU9,4cC,uu-cVS0+3b]m1caGpLGKauo[Q:s5;0Q,r(og()W4*l.Y +j@E.cQE/^52)S69hT4cao3,Wk2&oUll]WqKMS:HR+Lu7ZefADA#;,5r,8o[H4,acBRKt>dPI_9!P%%=P +]5$uSY04jEWF"rN5:'gDX1!;5Z)U88P_CG\l&U3Qc]X;*&`-3]s-Nof.ZO1T)QB7_-f#;Qer+9&YV,QK +71E=X4ub^-bgl8K'e,"6-JokqYGS63?&4ZG$U1&i8f;Ujb8TjP]5$uSP,e?I(iRN)e`_X-B;"IEA8G8* +5%qELB(*BBc)g9b7+LMG$XQhsq&i[g_CTMDRH($*[r2.b^ +&Dq39SIE2>?AWtf/+71L($"oC16'&"([\2V!MJidl1!PL_m#I7pKB/f'o<,k&_cFe,?OIlK3Dq4'bWcomg2>U_>FRQK/=R`Dmo$@bc/B +=+WWKZZt4*lRY9!q:QhZs7dt/,2R)em&qW33-p7hd*Z3#NBVU<\+T]4ZZiDCo!H'Eg7B=A#H>Ih0cL!h +,E3%CU-nmPP'SA\^@[+YfZZHue`a]TpMu9GYdS<[ia")&EIn$jbPM4j15i&0=>frJpYNrmM?Jh*YMkB' +-h`%-8<\/[HFCs3aCq]]"mV"ZNu/[2I(4LYM%f[H2-'._="-o\H`.jL[B[KRTkT^nl$KGUmb(L/=k'_Z +*SAB^.4R(-FHGh]s*SCUf\JoE2f2I%Alk?]14*Ya,$Wli\F*8rt!(6J1L14Q*ms.SXS1c/JPo,+uY2E#cU2X-dBT;?gl +S\VMXC+5X'u!&m],aK".V;2SuV*n6Y'm>:HUWi56/h"3:]]\^4S +K_pI-pPJ):q7_&!Tka59nq,?':ZH[:hP<-2s6CUR$@:YmQo^>tnQY9W:U.3LNf'OkQ:)0W07>3_'ZuN. +I.L8]IpDe8M%VmWoQ#rUjmMCQTT<[!)o#o:GIP*4J?<*^4+ML"]\M=Klh5S6RoNtZjmKrj"^@+9fGZe$ +Ins*je/FjanRI8*gDO\d#s*CC3LsUZf?4=-0D>_M&FN1tDBO58J`5]Sk_Db@igocZf8nK)Z1oGf\[u&i +d`^IH]M1&'a.:&e?T:!6aTcIRMf13$TL=6R3hks"q"M&]B28?/oQ']u%1$Vf;)LLD]%G3^h>[ED?Zn@SNgIA'qBil1h)tC" +T$='M--mo@]9$:3F-0es>q&k`n%.IMdZ'[gE]n_p\U2BQ]cCVWrH?_t-!t>,/o16eRoKg5bLO8;Fi9&-nfdgmllXC,@3G,XPu[3HjEnccgm'`RU&u +Fq3O7(NA1+LGmKp;FJ3]s7S[9=T=%KU/8I(!h9B07\KF0\e#ZML<(r@Ds:S&jW"`Hun*9$_Nh0(i9` +C7Rn%:@d&EPG`'(C0M30eA6qD0_aIR/4B)8m4Wn$b6R>,gWGqaYiL>!*D,*2J$Z(::q]"Q.^uc_7@qp]JBqtR +!pBQkVKPgGXPgoF^TH]s+SW^>lR5CeJO9L(=B4pJ>-,MsJpUgD(<,T[*il-8a?TO +^?$1NqV/;d,pi3FUu4%0,!T5U26,7+$1,gpaL>CRJ\BZ9FIr=flhB@&QS"0)C9I<*m."Y+08%nEd[cLd]u.,HlFe$LJAZ9;RO$j4JtbjFnhFLF$? +'D9&I1..ZTW^;Ol@rL2Oj)_-]c&(V8P]^,N)FRroBopX/`$n"5l)9J%%e64,X?Ah`s,GG!>IFNRD0aN`4hVmYph:I^lBH`-0G2Wb@G^4S3Ne(\6L#s9-g(4)e">UVZ"3)RT[ +2OtJ_b`&Y!U%\flHn3*VX)9+;9SF/OaggNN$;Cc=Q.ram@'fhHo$VWG59U^-Xk\Z$;P!rkbV-VogGVE5 +;5mqZ2-?dHSMA.<*1Msk<:8Do7$#ot7=uRXSVio^/rQa?aMAOdR&;/c,0MV.ITeQ!Y6$GUH1BS\BlU`J +`%Kbe*Oh>/LSo1I_4CL(6l5Al"^U!-D9gdDjgNDJDq0!a5-_5i:S:@lXj^o):DE(!]p7=^L[#t]^"jY.^s7ABW,t+l/C,@quNTlprjUogb3Y_Z[>(lAc&F]L2?#= +1SMmG,UL`R5*Ns\EneF>EZ9$LF^g8SXdQ*VV_al`\uTdVA#5.Sosnt-X3DXu=)J,;7-`jW``$j7bk]cX +kA8C&@=(h9gg_Do>IeV"H%0!r<86%hf=u3PYUV4L(UlPmgGW".i]QgE3)c*s^kk19XXqr1EZ=RCo9B^6 +Ps73KbBs&Bb&*bmJ^!Y`AY!X--D'L%.IX9?)B`7!hfGUJkH"p_hJ:nE^mq=Mn+frDT;C;BC6=/E;8[$J +),[<9dE-Rm`:;?bF5kj0l.dQ7nOX+jWg;7m2J5;D?*R$7!4Wb%;%U(aA9Sjr6%2oor94YB`hE@)DN_`5PgBfQ!]-flcr +IR'0,2Tu-"p<2UWeu0"`Gsji"Rk(#$q5-E;;tPDnhs,7Q"'Ar"Q!lQc85t>s/:;WKc;=`;99irT?`k(( +1o\&ZG-4^$//DjIpr863>bbcHZ+:9H]2Z[c:!A;@_]X_hqH"P<3\rqpCuPcp`lsc[D4I"1j*Cb989GZ4 +n!)fi&jC[2`q`FP3f+ +&#sKMEDUaA9]E<>AU- +cg#j>o\SlfVXRStI(Dhe2`miZWo!_:"(VkqOFNYFEG`ie)ho(jOZC69l4df80P0XEbZ3(%b-%"`=O,K' +,a,#P'872XncMi_9@;7QagARhYue,t!6hga83?RfQ0F@EZBD8J,j +?,_9cfb[f1eO#:4>1HUdWDu?_cKsWB>U=JG%qGl*cZ[p#7r.kD0,RoSl6+Aq:fTB3-L0<%U93]'cF?\> +$(_6#*_",``Bdhh);eTqYmj``mRB3-ont^uZa8&oi",Xb>M1gY%),;uiQrf`ip*V1lFT1tB?jbLJ6&q8iRhZOJ.AZd-1>g#.LG!Ph$T'VF_*Pp];W^h +Xb/K5LTNV8AR:qA\6$]l0oJBKdl,L7XQc3[oOcoXQ1QEfMlcC"(1nnQl?[)l-VI5Ooma0WZ?uA,Rp;r8 +E*:N<*#ae%XSY3`ERL(mXL#*S!Rco0;bFGfE(=`>`iUceA,0#9!\'sWKr5am$lRE]e5ie>Y+s0D)'S`XG>m2EE4(*-Th +qefL$.V5#q`%%$pUA7eIMro(n>8ae?2JY+Y$YSp>&UUHJ#s<6Kd`EX[`2*GK3^ho.P-43Hff*"o7tD^9Ka,NbVkP)rJZfrFTj( +^,bh<.c)29f`*2JGI)F<1r;](isCZIeit%9np;C2nlHDsM]VDYL&:2;h(;i)XlJH6_c6d2?:l5fFYF#o +*X,Gk!tVicE^r/qbqJnGQV([,MLq2/gbVUU4`kPu#7p0nO+3TU"qY@cia,L!^*IJRrugZ2dcgdIk#+=r +s5>HFIe($qj%FNiJVp9YSur#`MW1[:XVLa(f_'f#s+q#RnRFUHo@UC\#ML@2Pk[[RrY=Y,s_kT4_ +g(.04Xf\>8_2>$(k2+<%G1K++)Dk45MHR+*4D2=YT(-N5gc4ao&-@,n9i:WJTs#lY7%(uApOrKB``Sd3`#,QHJ/i&&(,)C>rtBQR0Rm4oYrlHhlag]%TNNrJ4X]Y=-3;mL/3rT&-s'N:2n6A:] +@Aj)"5E"\AKYIV-h\<6VIq(_C^KIi0J%oq%;oLfQN]"O_K?=!'2H"AJkg0P14smDk]:,N!W%!&8aT=pE$eE +*E7E%e[b+V_q"e=2fqc[PrRu4_qPbK?5^@U6N?'5Q#e+I>B+065sok"D"b\hYFJ6@H.*jQLe/Ff:)=Aq +n9FKuBK`g7>f6u;(U)p^KI.p*5`8^]GLKt>J+GS%nYL$_6'mP2iD0X+S4N+N],WS$B](Z@$+f&HH5nb% +FMV(gDbmE]P?KJNa;^d-00ARUoL:.:3;-L%MFH:P5dZ +V60=*pWWN+E5Fns@pS?-ib6,HhVr_&eai*G]H[.' +DS!o_S5GPNLm3IL:b-"L#7]Ns +=84=JB]]Ke]p`h`0.X-e'R_YM.p$fH^/ke[^%nP81DXsS%fRGQGX'pE8.Xg6Hq'Y*@,)-E8f*l>G*+;1$TB'epr7N,"P(>25Ig`Q_98;^=M@G/N-?j_5tmTS +"e&aD#;n]G5%C:[QQ*&*X,j`1/Zh_'rdtPi?E#6aX17)<$$b-I1L3&)ZC,L[dbL5<]OZ%EV0U1Q2,!Om +fXmt?.n*X1QU3-/C!IW\QKG#aI$EcIf-?&-0462$o@!D6b%k$N^!aP97k@hh6+Ne:=^8M'jolVXQKA@k +Te4NK/Bogh+0B%d8@Rmf?><1Xc-(F/2sF00,L$VUD3j=<=7JnOZ\IZ)TRtl+QF_e%4+!i[V%fbO)15Ai +l:lp*?.JjDo7FiOn_QhD5\XPL'mN8jhTU&;H,4B`V0SJpmCJphY"+osPSj.p/]_J0]IqhW\C/$38nbVq +,:(N&Q]U@-SnSXJ??#Jmd_)7,p6Fd:GjLDP$]2L>m?fCso9*f,;4;iC9Ws/^DKtX!UboG809[oVd_&7G +$;0oRDqZ:I?A<'[rmUj8Xl%;B,eAIt]Kf,:DFms2Lm]HH9NBjO-`?m[E$ +?tirID8*l"b7&)kA7&K.J'\?SVt)N<+'=<2:?k,]BHL31Ni&i/;:[]% +lstT-n$#B"mHI9QdXVhomu!6O[-i61\nrsU%\")fXh8KVDouFu>mPko\nd`5!HpmB64ZriC:18jWc&G@ +3@'%]D30S]/UuT$<6R'GmNM_Qm#,shauFd7LAfZ;0GCE,N1+L>RC%2tDdHV3o#3O@9lg2Al_$^/R[*!H +%\g[NM7eVga44_X+L)A4jfJ%X8md(SdYX^Q]MXKH? ++^M0W4Y,E*&WoPqaap;HVX>5'PIeC'=Wl%GE6u@CbMNgMo3pF&$e]DP+16Hu3$/ljY<3n>4jGC;2K5^fei0A(9UN)g,qo( +@lDH:+mWj8[BIp^[J66@@D\B13P;4*;nhg_W()&E/'jS`*_T2\aud/Xj)t]_9jfscu[IT]+Cb)^2#,*'hE#@bAH#6KtYdGj*oV;8sS876Z9M*]\f?U&E3ED`6Xh9S48*a81 +Rd9RuV:P3K/$ESX@p=4@Z@Au=*cSQQf*5e2Xh6Q.I8RI3Bae0TD3@\.a8O@rL/fV4[+i1jVSeld;;9jJ +l]Pk-DbnmV[.8OK:JlOe;0%_THZ3 +Q=f.t?*f3La+>Gcb2`G1[dol'Uh+Eco_E1^Z*9q(4Kj_.[;a_,XLt-%ga'M4r0)h"Y^EZWa&jP$4A8m"ZD6gU9+? +E,E[@h;e(S"Z!!"g&nQdrp]?H@f1XoV3Hl#J)bfBiIcD_AaeT7o-Ub04.b"mmsOlh>*T9).0DW-l.0.8 +]nc?GdCRtVDO9f:eduE.i!aM+K443enm^6E-boAskb_N@K:=VhQJT%i>*R[/2qon/$;0-*:-qCqNn4C! +bJ)B^%9&/Yi`7%&'@[HW;ra>#m"JJ#DWW+?&94d#hpu\9Z[!(OU2,pONNkFaLPE(*Q!/\F^R;-oeQC/b +MnIXN,@A+6Nj:<8AlZu8``IKJ9J,-&2]*p=j_Bb8SBEPpB-4j;nRL@FUc:`hh+@!['*Hk":R7a*D-!sO +H!enGIg9l*8j.:LB\%"E[q33R?.52Yl.;R9Bd;%MI3?$LqNSCsT=;7O` +#+`JfbOuP:l>!V7FAl$qdQL&qCC+.^4-(rAI.NW_L\PWX5L7Sl,=d6aSlOR2G0@K:iTP'7117Ne@>rTPbk:'hUCmSS'<[ +'5Ee5a"cpt +;eD(^.:7<-f_!sCNi(6BeEp_/Oh'VZ:>'(Rk9f3EC.$\cM9Q8slQ1I;(3`9Gl+P0K36etQVN&96e(pnV +pKdE$o;d7^8k7hKi^*-kG]t9OfqAf,]&gd,bfpR"QunaMhO`se98n;YkpO&*1S^@:>'4FH_K#GMI&D&J +<^HcE=_5^iJV$1O#9"*#NlS]pN\qloZUrIiEp4\U(HL,)4Bu$W(ObeXV[)ZqjjeX?!q2fBFno8cAsocb +r4VmOEs(_FN4d,e*h`OM4e=6$7E.BnLGifjO37>.;6_1@h\B3-[iV*OM4PD7a$UA=nEdB7`hS?286XDJ +nU58qYlgG@p9&c1'//4Q2-FP]%q9T-DGPYS=iWR9_8\a??h@_hHXm[dn.G9H5hRm,ZgoHc+Zk]I;1^^? +fd+fLBfC$*n3d8;<1T!\:)"."LcSCF09ILkGL'-=O+$8*!Z5Kl5-l%Nu\[.[.h +^G$P3a3m)KOb0g#VB`dFHUMTh=HeBHEgB;24I4G$U.N;EO.sDlmPd+WUH+d< +-Y5gN':M5"a]%6;80MmphL7"*5T#_BN.3;&QU +[EA59#/KGj/.fI='Al+SOV^["FV`L$58[9J;t;Kf$toO1Z(ZIekQ$OHcoR_]4!9JRT5qQ/4-i:brE!dt +kg1\kJQG@WJugs'M%OmsBi(uHIp\^J&M'IQNV,DX8IANRl7S\f*/fLFTZL6i@BYL2P0U5;D$KJ$Y),7" +]WK^t9$U[(fSY/V')K;Ad2ZMI8;nTE#3PpMI+#j8Tqh9o49%*8lGS%;Z/Dg[IX(K5OSUK/dHI2@WSSS9 +crWX^ogfdEl,u)'PV!0#r;kd'5)_GP@9nPbG2`?RN]jmUH'^OLr#A\Gla*H#j8]'lV$5&:g]r[3ZnJi/ +Ym>BA4btTTa;kT/_Uu%oP]t0&BXBQC[Q"f?7!u33H)/\hVTd$QF!.$P$llpmiMla/S$F5s&P2ZAaFne? +/C4Oak^AX\\N@?#dOCBb.tKa^ONHA"b*;=,oIO[&d*Xd'G;i[%ShrY.)\ZZ6`J\7:lJ-SF>)l.#/H'Ff +r(?-)9$t!%UJ#p!4+jbRTRRa#/-C/nZ*T3UB!C&,;!/<5Hc-l8lgWO2hj]gH,j\76GAP,^J+;oE$pJ;$ +5AX&a4]s%qj+8V&FEKAsTRO +@au!/S7KEkrIc'c7's^?V_r(l9Ph@MLP[i=Nj)SgAtAfMWJ&Ll=>0^RS_O()URT`;[(lIBbYUa8Su\TF +^PsH?=O7#enbiEW&Y.<1nFkDY+iKE4"2ZJ:Eo(sL\H/H,gcDjq%RNV(;k=t"\`<#*N]Z^`-Qi7+m0#bX +cuTcN#g[\,afWg+8jii]lIi1;'FV[JTY.-Td!l:l64Gr,TIX#QZH)SE7S)f +;_M^A't#i]m_f3V>MI9c:XD1rdKXGP_oh_J%ljBI<,lmmojP2A^o+qYP:l%_K84':!0JLFWZi`jcVuPo +%4un)HCjCdOQ\p#+%_IKYb4@+ED>rp;ES`AVgV.#f.E["[C33DbQNDOW6<8l&BFls#kf9*#(Yf9jnf$RA):Th79 +=UT>B;d_pXn(W/5lQF]ZjLRRgR3-aYc-qH4(i/`]dOS[L@d+ln"c\Xm)n9#0*(fiGGk0'ti5HSg:&G71 +fNchY.qCSY%JXJ'_m%"%(H46miu[2L[SAsnY2@]5bo,5.?c?`k9s2=`=eP"?WkrsB)mfL"Z2,s?dd$_J +M%rS.QOQ%aHcD>0ZT[%u5a=t9d+[lBlh5R7_!_&sa+SM;d9>)$g5-._%p.".U+>NnC'HV4=24@-)$b(s +lqI?QKi-/Vj4)fY:P'?;B#WMp/7$U!F'=a\LqpSs+8l+P(*[LL@:-jcI*SF0\hpnWB9MJ]mZV)fra'Al)k4cuN43 +TQ$)AcC$EpIeOAI"G=r07*]/6r6Tik89CM;%A=j:Z\Gbe%9o<&fUP?`?Qk+YAMpp#JHk;H]nkCm(kk$1 +T3])p.BaaU?s-Us"7cgDt7@<[GT@P:h@3j!F'2qAk'>V-e9:S:9aWMU%/6,G&K7g*/0YVTV_$J@F9,t<>8Z-(E +k>ER6UpZ,[S-N84Fe3_oj\1pS!_%GhANC' +-X7#/+msi"4Fc6Z9C9I`>&O1'XBNN1kZGeAed7JN8XmoipXK7.`3l +XhD'n4u?($fCHtg+.b`U[C(f9n&_!Begg$u[Uebk_@)(Q&=.4c5@kSf]oT;Q67/H"_jYNB,)tuPEu8WD +qTUcl[Q^W([QZ)V[f/?qPT+J^VN="m/FQH#O_<@%XlB.S;0oQkBi4Wp_\R1X[DeVFT3E^l]XLFLn>f!@ +JitTUhNb=X8,ZAXV;KMnf(B5jL+KhD0iqN +\p89IoP?%+Z^%s&['.i^U_LQ':]H8)rUPGId/X!pHr-j9H)2-cBRNK)i-2!g;g5qTJ)>Js0Ah"#YJ(R2 +_,RHpjF]A18-e=Z?4TjneTib[=M_\B6>dQ!QhX-^KePREq3bFEJ+5q!t +o>\;+.+!5aa(UhIRg)&TE'(as9rtBaEn_RjcCP:NY^XT#O_2#c)^(bd-n3$_a(k"tVi)l/$ +ndEJ.NX`_`>o.b*6?`S0M:)0l>L+qD+\AYA3u_s`N)rZ2?f(U_emN8.i]kVa-Tn]0aS9MiB\]A!^U!ai +nr+ng8$q[X^3$TU74MGM\+0,_?W)8llpEj``6UK6o2>_8.A'WkH[>B]%Ch&S`PQYd;`][qGBl6P"*)GMj(Jj2mpU\!]H<`N5[IiNsYk%6U\=_It^Z08lCbFUbh +.a-83X3*tq6=I'Wr'h#pq2?#&2(2?>fb$sVne!>#khPG_,5g`f.&*f4'n5WH$AfqjoZA!4\,8JG`TF:T +j@W2cEK?9!,RnGLA\$qbB_2OVL/(SDX>k._X5"Uf@B)(rmE]"\><$E2W0M=D&ZHOVl\5AQQ/^cf?6? +hdR':MW@e_72GXHl?bB+Dk1X,9i@;?!I]d94b:&OD!BV)/sD&mI-Yh%J&R&dGF#!TASOD1B9,'BqaQBu +1tK.Dl;hRf;2`I1dFmkM3[S)nV1F`nB*U&reb%0]h,h[)adO5ihLc].a8Ti,P_oXY9l\a@U>OA0n6T]P +*5qSt[pa(.O@nSq+qAkm8,F9!X/7]Pnf;o5S,Z:%[d3JsmZ,.#:A^.m1H= +B+pi3CIB'$?[F`+Z:;&Y\luSXrE"qul^*nSUYHrS92X$ME0Y5t/u2k9IBo7^?CgAj1e$L8ZC,^0)AF#V +a[ksTqQr0.&pg]=]gq["X(DfIBB?^icQa.O7H$>"ngR"`YLMP&^N%N,O:eZ\rL=J55,^ZY%a1YW(SVV4:Xjg#R*`9lMPdA9Tt]?Hmq +I^BS.b[WT@eqd)`/!%Tjn9'GSU5f)K]J@41%dO7H[8(`qH_alNe_`D.:Z?'Cb)o_pVDK=Y['r=N +eY1VoepZnDTbOoV;AR9ob=cd0I!q)9WS[+=DKPV^;2]Qi;eXHTH2c?p4`8@WKkZ7l8K)V$BU>FI)M*iW +*;R[BEm^_-[4IkUrb'okhYH$6*#I[;MsLoHW8LDtpQnGCDRWW92hF3HqoYOr6 +m6,;62+9T9]P^%E])hK-aJ*VH8=/EkdS>LXM+ +[CrJT\?4/=kFYarP3jjDaS)4E4\B(td:%C:rT>)%>uF'gDp`$.[,W""X,U7DMEs)jp#@Gtmg9C08aR)UbmL,7`CcNloa5(_OTRVSi-]3f.ma +LLW8<399K'AK*8VNf%F"Hg%^'Q<.HsG9!mfak5WV]qRfo:XEaeX-GEbBJ&qK&/iZS$$eLR-Ye7]8QIWh +Fs+inP3BmKFI)W=l,s[mM?6lE"8RtZ<=$%VU/b($!t]PTrdJk001Ih!R);TlZRAt_V<@-IQ58#XMAX[Q +CQ-ZtBWZ.epIb1pn`Yj_`/9l?X,;."KAY=\r3(oHZPQba=6_lq\6*[hIXne6lj&1`j/cT:a0A+7[<7B% +5J4=NA,pVH%m_Vq$lb<+J0Z_5B_S5\:t[OcrQ[OhmF61+BF +4*SHA:VU?BlM6@1p`U4#0Ai>.WoT`I#?+"*9%Zcp-1"F$juk*N:;5+?#;'DuGJpGhUUBDMq!X%5!SoV>;LSTDK-N"/084%"0=iBA +Nb%A,Lpk%6cZjM"+q>%)>@IV=FPbE4;o?6+o9k8QYAj6;]RjcK"k`rF8/G$Z+XgsiMQh#$US +53PXskE*6Y9Fg273o!fBAakiSL%e;q5Ba7V:gr[Tm0A>hL1euiRdB4.ol-#4,Dn/?,0]XV>VE4;m#N#g +g6=EYliZ3Kom6Tr%Y(Q*7uaEm`a2`?2p/$QaWE%G7E^qXD-Wc)7'!5.L-J^J5D/r;ac?3;InVXBIn]GK +rn,9h;/2Aj-kZ%\9?E(ZV"6KT>U(^@`*Uh<4BU!$HoZSf#PSWo@SaI4,U0+8Z!6;B4)I5Q#^n;t+\E9>Jfr +\h?]:"!r+I+I1-3a1i[;7kj!1XRbJ&f($J`:7[[$=-&qI?ga&QQ7-XMFlq_HBdMHI9q:nM^,I^uX8$F9 +nm'au/r)"2BG_3Yl&kPM%iph?0h7G"kgTic8b'C*7g-$23%Iq67%F29%@"FT`?rtO<@TjM7>HZ*PJR)! +#:1TW47"\r[6$QYLmg1AT'`tTn_SG!:4ZB"k.uIn`BOa0b.WHQs,,],H!&FKTj=+uM7AVcr7TPKq?4f.:H$R-&poeYiE)`QTg)!7LGLgY +76N4P/R'p:>tk=;f&Lt?>/g$k2IYh+Ddr+Jp9/]SI)u*.eCaru!b]-?L\-P]s0*NN&*DFlbG$Z\@J3bj +(ToSs2qn'FiYNiA6=F,J*Ydu[\ZNshcdH\`U3GY!Nn`G9q"@Dk)WHI*Tg4g_4bC[CkSb+o6:RjIe- +i72L1EG/:?`f3fZ:@n1S%KkP6!6XS,qH47RI +%nFfC$Qe`EkodJ(^1E7r?Yd?9-Ze@Aq9"g`?RaI;$\+o1V/OZi\S=+l!,Xl^C`l8!TqJp",dmV#);ji7 +CLuh4bRIX7biaD%pmiZhfL])&h1[Baq(\6,=TUsf?ecn%%`G,-!D<>J@&tgrjCO9o,aQqL34603C8oE5>0f)/D!"0 +_5g@tgT\[Kl2r9 +EZ>-u+It2B6XtPp@?8g[M?M/2t76QCGT%QJ8X8L#k5H +/&Tm:OC=nK4!&%9>aqtQ`j<_Tcpa8TR*mMG(F-%1@9ILEVrbaVoP5QH/^'.:H>L,$>@t1r1n(Z(`5An9 +6l0!DUO;DQPS*doM658M>ZF8!gkOj79s*tf/&+Dh8X:=[Dp+,Uc8'P7)\:=uT1C&J`GN/*h-\?BfZMt. +;Qai=j[[$]B?[>^Ubelh!Dj[(#VF9hc8H4Ne4 +(d!6#:W(nE2f\$)hcZt&E-afQYQk!s8=\?sFl9>[WW>`]X5N4[&LY7Nao2M%c6T"f]I.gcSK*>d?h)Id +p`Rlp9K7BANQ&1]cM@/oM1@$^AL]c?]HulVRrA)Kp_:c*7IS\?_+cu +EJ`5QJql;4Rq#Atq.OoZ*,PK(]i1GAjX8*Gn8sLs\j@"X'b2a(mZ0M;iTlE'cTF>i5@V4I]+.b&]/_c\ +=b:@Ahn?nH&O/(m?2H^9X1^=!6GA_Xnr;mS5LpHa799$XnpK8\mQ5p*R[/"a\J%u/m8K(uRT^D/p7OV= +P;2N5L2njC`j"6OA(Bl?hfqPL6d`&)GXK@=4n_^*$\$4+Pa21$j7R,nUF9>`41A8VI+Qu5gXTO6<4iU: +pGu*&?S1-Dl5.E#ht@'/HYd=%_Cs;`6a#^TnnE9geU@<6Q:1)+Z?lXnqOSS-Yssnkm!bums9W4pP3YCr?KM"ljmH;>Pc,Sg=$[rCNnO)LBY?X"%*;#?&C_$"c]:,b&5XS +_].=\)GO1Yr12Y^PRu0LHd`-2[\q;:u;L2-'l0mBe? +mM9m*C9m:-`6=dQah%LcpR6KXLfC<%GdO!laQQb3oo&E&ajP2b*k0?uop6)oNh94AO +6hf1c;dX>&oQNDJlAT=E$hVIl]^AYFm]&c.nh2_&(L:MA*46XnZ1IjNNm\Bee,M@EQN#3Bn@SjCRa,(Y_*4\Y)-pQ9WbqY+) +PMC&Gm0>WY/Y:,XM'pdmff"OT/%P3'aAp*(]ha)&NfbOj(O&$C>tVesUJH3eSlno4(gk4-cW0K;7L[RU +P[QC>QS*[Pesa3[Bc6qn<\ks)2*:]n6jsR"PW9cucC1edB/ +7(>@"7LVs:7golf1Q"E,M\WCPX1uC`EqH6FhXa.Pk`.Jm?BHR/sLdB9[((Ji#G*]+'Ydc%oQf]a8[T)O%gn]SKj'bum[$qC+f'@uURrqc^WS&HbT.71:_%P1K1K?[-T/ojN@LJ$,YL +/Rm]OB5k,E5&`C!$/5p=f'PcH'G(%`B!_k\n3NBu/QO$=2+\M2Rn\].8;+ +ZLAo,e^kgI[4d6.^VX+g>ku^IqS.DrE[E0KHDlM>TBK-Kn=fe;`\f2bnlJKT%[MGeF?,"VUX;:` +;SMnRJR8j9,p?1UTs)`aF8_cO`ZJ[7(JanFF(nk/;i<('f$4D!CF.DclYM5eZbF?.,T3gcc*NLE`8cZe +oV>[4?:d*]+]R6PC`5t#ACBTV^="9r3hLYtlMn\rB"^?C96F-rW&Hr\j=6s.EjMdgCVQ)<*ZqMQ#>n7r +N7tS,=ES:;!`ff0rh`Gg5P(d/fSJ)J^?%Qqf;K@>;>c+e-"s,CkrKcR,pcgZZ<2jOoiog>b84bm>j51V +,ZTj#R0OIt?;0`E[aA +=%cu(jg%T.X;]6&SPUo(m]+E.X:&.PG$A92^/o)@FNKtu;PIjm_*cFb\K$A#V73i?q)gXo/#b'<-;fU> +iY12[s$V"`NF-4q<6J>'P4M=0n_>3Baa3La+B#jhl4onu\,=h`6?:Us-+^+jih,OW@at8uAU\Y2?V7rQFfc$25*ffF)JBXH.L]MPkc2@PmYP]e^I]uHIMfe:97?*M0P;/ +=qk.qrR&@ule@k7NSF0)-?%(L67pV33t&)g-s!=O<-u>c+BE20Y8'`;o-tJ&`[V^qC6a[3[7\Es +YtEpQX)c&'0<0m]*33gVRXa=k]9%tOUR/UE4mA2[1Mq9#\QRYE/9anjkHf"/\H8[GS$%VTHkr!P#PDa# +I#k),i[jF=4Yf#oW0m%-@m$hlqAWe@1X`2a2XHRIQJj9=gG6[X`&.qBCWeEp_7%S_YZ=6,H:P>go[#9& +j5_A)9\O[GH1&4%eSrtG-MfXhr9@7!P2D]V'kdBMen4kV*585?s+Pf@V*3e?ZcC0kH[ki"F768-0^W)\ +?^gdo/3YS4,pW:QI/A&!:=!:;m`Y`0hBg\gV:9P9bq2N0\cUVm6b]MP)C3&W+7%DM(;:cp5P:DJD\N#8 +&"Su&o"KNQf)GD?Q+-j%4UDjrV,PCBO9\NS3Y&AHlM(3hQ9OB!ZM_+Nhg;_;S6k>?0%H\[%`>#oqbk)!)B42$mqNhLl;9-2Yn?YD +b0N>[JEK;S-LVL/,9X.hMJ.K]pNUWF;+5QI2Knc1a&672;a^-ZDRA,-k!/I@pJM(hX1!T3USKl%qjX[B +nsB@o,L+!e5ejeKq=aV\n=d$pF1S>i,'G!9<=44_gpK)DgC!ttpN^`AXL]>^dc&t.gu=@4=lQkVE5uMM +M"gk-akGI*45r&Q6PHMF%amVO'qUj?Q0@Bo@jrbGg[k\gT[mD'j(.&,(U^c(nDFn\"/q6is)I\@XUoLN +PA@SY6ag%O[FgEp[e-pb[C-s^6_9f?obXmoP9ZEBGN%dRRRA$l`U/`lj,B)`4b:6%>_2ZMI](-oMX3c! +SD68DYasVM(,q;klAF.A<9$`oK7(;jel_h=rIgj&]P%LTN7[R4SnFp8-H\SP[js)UH.G-B")%sOn;#$g +H-cB%h;=WB0-b^s2b%S!"ajE17pa!+]V4n!%ro5@,"K,?AgR!A`N^WZr,8\"Dp:o"bH4o=r-^0Xa_RNT2q-MaWUu>FM&iesM%r2Cos1C3>cQ1[0WEFKr +2QckQ9qSaoj2gX3`Q*k*UY)$e*Pld(#hH)9eg=\BIl9kd="^V'Wk`F=ZKK=O#8>hA7Ro\ +Dnk_al1p7lSQXRG4Angrm8+]N%`i^,7jd[X=-];e@8Ei5!Yk/\r[d>ai_.&WWQ0[]=3s#NDp?FUPE!%` +jVY;l;uprO0:^Q0LZ4JUHAio-N?jFHd7!?q%+RZ&kq=7!T]Sc1&=PQ7GtnfBa/ecra5-'fO$GM$l3V*< +;Z:_Q5D"'PZKMm,/%60d[[B>H1`X;6q/]dT2YK"FKYjSX,`\@sN/=1Y0V0B'B?RImSUA6E0_855E%1&'9IJ%mik.D]oHb2Kq)fHiR"JRUmofSXGT9>@39 +MAj)V3)1\\47sW&=sJ71j2,8+m#H*#[8f_AU@k6#I2JT^LU#IgprWS#rtc0I_UCNr.dEG/b5Y,eQfQ;p +lU]=Y.UiPf="eEaJ/[M^/s+/jH2F5b&^?91a8J74/`blnL*A((%:XBFWc1Y;T5Cb)iEXnaSD#l1loZrGp3+d(LGA[gBMCJ>mlK=U^D,YYc#IY=l2gpKg#KhCE="p?\Tn6*%N= +B(_K<9:.#C",lATCEja#pEk(>HV%#%bg&17pKi;h=mAorh&A@)`XIq-gTWV6g3Q*b0[gVj3jT_ZVoL78)Us;E`RL%,O`H5)u$\OJnjR?P!SqG1/"_/(P2VZ@[!d`.tAt +8\;X4:Qj.n2=7-oj#fsa9;g[L>ued+4l%1cpDnG_`a-ZE4J:?-b1BdpCGWRa,15P)Y8HuW4[h)X-/+S& +Za'132UZ\._lP,05S*6L`Y1+(Iic<2$_1LerM&F8s)p4%^uZ;TggX;Q?&)19\Ic<6"[(-*nUqj9O0 +H^qVmS^T:ajP7t:kU4gt-q;S*AbE-/>P2ke=Kt!IX5VkO\elq +9V^Q23E!RM3%hop:3]Mp-+rA!kH+=I(c*H.4N;2pjRgZ!l/se`@H;]m3@i5+RBt>fA'FD?ejnmcj8hEL +#BRmDAWc(Y5[5)N@mW5;$&dOl8*)]'?-h^6_E*`4B-kl6bZW'Z(iraSGt__bH&Oa62:KWLl#K15's5[* +A")NDq)p%I/E[:?A2,lReMfLlC&PiTb)rOf;9m=T1a:p>aS5,ofON82KQY>6kB0"3o,m\@EI,CF@;kK_ +_Z"sn4s(XKn*.b0R3%ej1?VFKI(oqRJ!ig.ZIkM/t1Rm,_GXYEJt1H"mYkK6=$c!;1mmtoi+ +k;bd,q*u;/(G`bk9c\N(pmnSC!pi?g<_'VJo]X%_#2F6Dl_<1eb`c3%(![3`erE\.EU;-;IP`ZNuSt.p-1C#'`/+XF;b*b21dF)mb?]['?)NH%A7NbIdd>Y_WnEBj8 +FUNEi,VUJ%4_<7/)1;1GO`7:OYf8NEH\WIF`<5tk-H;!thPqO.buk5]@.l:hfeK%_/)$(l/$Em:8/Re- +`]57eFKihWGdUjif*d'BB&\GCmIk,T7bG6GOM5>%(eMm&ZT:gU%e>"k83?o]S_T58mcdsQ,!d2\$ge.AJ +7d+=&i?qBO%"H)``l_Ouk`4265Rj:LP`tOokls0(*_P4n"8Rlh8%uhfGl5q!mGqN3M]"n0,LJOJ)nQ*F +nQ*b']N;g%b]gsiKnYF@\532p'[\4>Lj`>L"5u21N>:9V52UU[??9X&%*ada27KQkb$`5t*h(iJ2Fbq# +);Cst+X<\(a\7'$Sol!:[H]#n>]3n0MHSPQDFAY)aY'&W8'2_t]_Un&c#%4iIGrNb`N2EY_duHfec'^[j-i,kP,W3+Ul=(?@;*eD-pC +51%K9Pc8u;L??L*MB>N4^Qn%fRbO'Eefk3,BPnfLCMoeRBl9FWC2V*`(n04OgPPGtc9Z/^;k@+@gnq/1 +Mlf-!2e40Bc#'o9)19bmV]m?oE86lZ[ZlnNRN)"7CMnUe=\,A:1q1\9E^mpV,Vta(H4c4Wr,-S&m_'4\ +Fc!"mL+GRZ=_9Yh-'cR@(Y5J6OtEp7D:/$iW.%f9WK"QBo.Vh)iSHMO(m2uQil_6mMa;hC.?i31DbH)1 +/91EK5r!2,]PUX6crjrW4PZLGrp$#K4G#[Y=aue+PaMDfnU?1\i(D^p^M,B_T]Fbc=o69/R'eSeSCQLP +&Gc@=[E?O&I$Bc_NfELU3;/,1#&ttFg*;LNI`RobZPUKnls]0F0cYn(?+sW^t3%7f)G/e^S((F@-kK=n\bhhNbnqAiiSp)u.YsUuI +=mV5+:_l,:\(D;)Q@THth`/n*qs@r@lk[2b/*+U>Ka1'>HQ_`q^Bo4RK/'JNmUTf23EOTH*Yb&S\(GQ^ +VT.#l]E'*d0?bIOYP$*7"5SI7n`4g$_r&8MBK?]@#E>g%`g#L/K +`m,mO`#&@?b^?;XHS!pn8(>_1ITk=`O;lRH=_219*-+2j[H^fP$0;!]kQEl5]s,PfjN+ZqHkg#=RH?J9 +mG?aI,lBP/XYZTENqfR04*a05=/?q17qmEn7`%+oq>K530c)q]SbAq%jQR>KT9j@`L;0DQo/\BBk6,c#&e1D7:,LH4ng)9%PfPjZadkd$iVrk)7Z +IS\9(kdS1J,=j/B2*E1Xmmgt8 +jK0>A%am.*.!"rOp=I>@&sB\mhc/0sGE;WQZd1ePN.ep?R$#a"-hj?U4HfS)Bb'AF71,`$e;Jcr7RHj. +,,T";^')b1AgDKE-tXa#IhOUN;L`7I6J$+COjI<<].KV:con-\1[p?47RDDjM5')Lp$.%P8E^fk@9F#+ +?]5a&jrU;:J=4Ma]4&];=q$d\OHP87$!kh1,GDTX0?*L@KPiMXILD&"BLOhiSrp=u$1Hk6n7XOa7RFR$ +0I%Vj#0\5\MZGW@\]'(:g>$/QZ.!0tN.ePT0I*8q%%*0=('E\=Ur>Si('@uI%%*0=('A.oFGg1kkL!bS +N.fo]L]NDsbgB.WDmn5aVOHNC1(5'E1Gt(-C9P,PlMZN(3('A.oUr>UtQ,Q"`Oi;hg$#)-@]YJ!L +)4&6lGm.n:@*V&A%#E\J+KW9H8/L0TOjGZabXb9_JbC(o,j7C9BM$pf1(mL"f"RKi5[7`[[O1AJFa6Hn +YS]bt_L"1c;F\MBXiq&DgJ'?VKU%\hq?*=M1(nK.,E7Y8]>NYFSgF-tYQG?_H/QpUK#YS*_Gb_4q"ts- +eV@HK"M\r&hK[LV35112s2O/2g_$LhWN[=hRZN[$qNQ<77Ei$U3$9FhB&)RYau;&Y8'XZ8<<\Q]s+$@R +E%fMAh.5uN.auHH[h2WaS:`c/\2ua4HtA+:G8U?BeT2TL6`>(AY9)787ZUT-sD[Z#1NM4N.fq\J<>s*fY99$E.Kgo-[^7"^!O=^kAh_JJc:GI3nebB/Qc7`&g3-8(jK"g@LqVnbZF']fT!epXZc;=Eoc]Tf:F5T2mH$0R +3*Po20A9"[j\BpILS?e0L-a&K(Ck=\1coWg=OiHM$#esWe2(_#6:Sg41!LOKWf/VVTk9a71R,ia)$s4l +f7>`5Ik#diApploN?^\nGiL_C=*aab7`+%#g,3Fe4HI/0Og".*>eiXfOmnqdf11,E:)/1%>4j^a)74jM +^VI`2\.:>-H>D]MS[#,,Mb$jT.Q/*F%hUeZ@P0_"Y3\B#\hb;]?u,a:pC)Nu!=jO8i<>t3$K%$!bK*6< +XgZg7b=u6/HPq)4[?mrh3EAi/T%Ul/pI5?;r,XO;XN*KBGq%N;R#/tn2]@9t92HH\&pijd;RA+69"#IY-j9d*1`W%q"k?P+n7or0sqp4Dh\bbqWg5W9Aq1k?&FSo +g4pop?]I"Q5$?khF("?4j;$/s7F"3d;Bk"p^tPX[VfjNG)nQfbTjrl0?dPq$M ++rue%nEP!LHXV/p +ng"+O=*3J=PLha+,ePjB2.\%l&[(gLZ(E?P>"!FoAU"%rtUBoDnc`jI:c;o*p=sZ!@7D]7A +6pH3s?a4X!54B49X,M^uCY?jdCGGAm1"<,_*/'Z67=IR^O3a+Srjgp!DrRFWo9Nn)9fjc,#9tB>[2J+c +gfhUNq=/D>XNXX6h1h&D6X5AV!jPd^a_^#nMLq)C?npNFVgh;pd!H.GF_-lNQ?lN/rB?gBY1\c!LlqU( +Vttc/XdmG:;@d@*jV&?4Vbm.8ll!@i`pk_"#AX",qH42O.O*E.d"eVC==,81dW7fG:iT&^G]pOa7`X5C1 +@GI=SEZkc(R`Cg'_hQ:sh7Fb5]X`#6#C!K5:-5isjZ`=CWV=/#'AGQd +N"M;rC_p./ld2)/F%G@+&%n>'Gl(XUq0Vj8"V:#HAmn,h`95P*O9-8Y\*EU:Y7.ig,NRd0 +`>9XmB2C^,!AWKJPl9C";XPW0@V4mCjo1An5Hce]h+l9HIO*UWib.$H>A?k(-%/q\.rSNX8U'StC6^s8Htja#'#!4CB1.Z6=g,$6:^;R`#(b*snEq,2Oqt)=pJ">\S>IA>iKd1%W8*gUC%$/OA.bC^o49@WCpEo7a8? +Ve=4VeN)D/cY=g<1VNu+gk*%dO5cduF"Vr\cn2tXkTQ!.Bbf%Q=C[<0>BToHFW@h5D[L-6RM]],+J6Vg +]s,M46U%Me8UNOAMj`7k&DI)rXtXcjkV$"[4/NVbH&*]Dd9:'LISQuF^UJ%9Vq>'B'C8SYh2='qA/.K0 +]O[[\g2SI>lH:"6&bG%bc:=2p2gBU"@>iT*rL]APL@=4rnuJ9Xp*e6?B"Ws1C/pdI(]Fa-I&+H`/`Crg +MTRKE;dVIZE^Zgsa5^J2kAi=QQY0aH]lrYrp?X'$(WP\tl&1E)hok&`QScsHl1@uSU5Zn_3Uq1e?)iLAff +nnHAE-!QUbW2Ou30LVCI9FHbMt&`T:k +6t<;PXJ$Qek,I;'dGG&:_`P%l0`XpKK#f)=^O??HMp[E- +g%M;`X:7R3^4jc%@K-)7;TOE=H-/Qelb/@]lXJt+An\Dh^_#MXMXXF"afIsX4tthOREaU.Gcl6NIs +D:@!qAU)^c7XKQ;=.oPaMr/Tl4s0ePEY@WMNP9$$.WW0F^]$[.`V:p2^ef4t>&EXJE!hT4dan)YSa>@L +S0jiI@R)L"l$;doV1I&G=dVHstC!^C9_1%YH?+c^]CJs4[k:k("DSeW^-H##KTODHYJO+5!n7#J$4WT`:A4](Y*XDZ4kqilR/0V`0AilUT9[6GCJI\\uMZl)b*fA[L*[MWnjHg-Kj[,$=9Q._Z0!XMm*nB.^i3YW`,[ +Kg3nV'RIDq!qs.WgT>XNA<`2=2^N)'8H*\7ZGI_k@;]o);.U`UUCT/(>nokH4uQeG_Vrt%2*&eU=B?8" +G.R,NpZP!q27es5l2h[Jd)3GfTPSo0JEiOYr)R=JI]X\m^2TN,s+@&I!_B[nBlkBe!hHIi*'U#S$9)cHW2L! +`7l3glbiN$I33cF*cb30DE6KHk0I9k>>[6]oY%pJY-^FUoWQ0`R1qG2'R&\X"WEOVb;)!e +qEl9`*/EDpa6D7Rj>aj,2kAuJ1sU)ekL6H&Z%D"XB]%*TqP5)hNmj]rOQ/;E`rQsrl'(u^4Z#nR*2i+m +=BOsc"Ae8Cq2s_0qJ$0],KK$Z\P`#[XMJm-;jVQq[b1n+S0n&,Nl.d:EVLl$S1]XlNmeBHb/;@D:[f(l +h`4HPq6Tp"CRUU8=V>Q\[Mm3N6Q/J>L`?Y%*63),3QLBT>XUGH\nhDnLXfCpj7GfHjRN&KRH&B\+jg,( +`H8brJOcIR&q2I70+E9CNeas-#GQk1a*_>&0XpR5kbf!]^`N#!#H@ +0D*auS@@A6WOKt1l"rI&Y/h"NY#qA6h(iNQs46pu[REtUa_UK<(f`D&hM*VD4Y$n0Te@VSNS^5YKu`M_ +bg:(EAF&kka[Yf,8JuGUDWW,.a'h+Hm*#L3onbgng09=Lp!rn8qfmqd9s+>U*cUT948/"C +s&l#8ZhG+dpl9Gme4b"LNLt6m[\FpV6H8@VN(k5Kpg%-9FIoPo57<-:."a?/?X).]lrcpKdK=>S5goB? +[N=";*jXt]ro]V[ncZ?ZH];k*UrK)t@mA1IAMhO7qXTRprKX-`l(<\$7"3+CRB4g-W(51S.=GSJM3Jc8GDs%/%&DUgS.4" +&-oRT$a!uq*bEt/Ws@A,LkuZ>C]D&9LjNJUb6Yh.AINuN=%K7F!c`$&[<>-Mk4;EL\-lp5atigj6!%6k +$j*G-4VGjdXq74CWV3Xc(A&X'4HqGpPq#ZWl,;beZp6AHr.=rbM/'Xpu_HfcNJXNpQTVmVZLqdE2V;J`8'@%qR?TYN4`%2$5G6^r2;1UNj( +.*:G_pZO5`^0hIoo>QLqY$dN>75<3$u02"L59WF<7+#O3kF"ehf3Ms +2!R]1%@P81e'+e0ME9kLqT*8H0M=9=6b"A&2?_dJZm!1QP$d^UmK$*efpteU_L"Wh_J2U\3[N8!WM090 +Ca6>[I`S"_A8MTn-uFbS6>\."%k4NB#E^MM;]@d'DP59D-SHu%c+%kae"lB=(kM;&;oE%t8$qFYI/"FV +HTBRr9H2u^.^^Et\8+IBs7D(?G&;O84eJq\=1@=1ef0^9if-+UrZaKM]^R1F`WYk]efX[`;/U2p23EYf +TIKLc]QJ^&PMG4r;lB+8?ugg:AcL?\\0^'C\(R(,B]KW=&;Zescdjf4#3FccuAer]B9c/>3Bmo4NK"K3ACYPoSZ$78o=`Kpn8&E#KV=ZAo'QHJX\JL*qE[s\A/tff\NKH-15fI_oQ]buVH[)5Ls,D. +8gf6I7A!$,TUkejQPD-qDVJ\l1-]XL[@3_E`mKtD([lP2)\tL*SWO_4`\!K[EVi&X]2iW&PP]*12U,0" +][+6gL`YXdk2"]V``g,9Z0DP+9A&eT-=na8`_G/Pn!d.BBu<.Q;bAu_*h2#%TP*"::$8dF4R-J9J<-3W +NS=iMdJO$ApXCZU"TE+28:"/e>$&UTTtq_o0[H1TcU(]7%A'?,T).uFTkAIofI"qR,$VlOO8Uo/<=b\: +Z)UfIL#H$JN$ikh)tXtg.(sTo5cKoJT9In>2DgS`G?In>4j,mF-<$Legj +;P6Za,o--?']=jH$KUkkonG*2fi7X!Q/s!%dGHoqB_;%X%G/mk0[Ag?eKCIAF[Keho"$"$B=r,Xo@biI +Tm>@u:Y&JAT`kO@;i^:73?t$ATX(R)4=i&`.?N9dKGSl#Qd:u:JTU^3Z-GV\VmkrWm2Gq_'uXdu*'euSh*F$`<'p?FLtR5s7m(.8(6kG6(_fdB;\^I5(]B? +g1A`:JUGIm:7EbnG/?1^kd9$Up;Mu]5Q%lk]YDd3$?7\*@Wh<=nHci&ObJh]]V@uBI^s)dlj9_ZTc8(@ +&`C#DcI\XJGu%R,Htcfhkm5Ie;lAq0):PI(;;?-H/H5I"$WRjNdm4b!=`&&Jrd;V;WYNo2%qO__DJuDj +S[,Ph/>73s0WY0D]&=9f9h.u\ +RN23I_o3LkAHoO^>[-1n>aLm8lVc1p[&-crgN58.Yj#C,2dE*HmI`tIs1(Ynl\=_7C4'&8@&FsH]$t@^ +e#_n'?.V\lIcTdT)m6c"7+UYOPSF5i%G/SW)eQ?XiacO(g>7T<8\*R@L5S$5Mq-^ra)]H9?%_%3Y2ORV +Rjd05BhXaMCLq@7F5o*fPiQ\V-1hJQW=5J>ZreaTU+3u7l`a"+4W,"r>W6srs3Eef>!2' +s+[4:?eNI2D7$OLjqlc("ftmMdMLTDp?U,9eR/5u\Sq3/^V$gg"b0BZI`#W.AImhY;d8eYLDO6u>NiT3[Ggi+ +kM'&(jpLGLb&('GL]Yb"/+/Dq]5k%MHl!rdFf![7J!r#JAuQNk`S+Ye[I\=35EODA^52K(i-RpTnp$bW +A$aB`o_1eFX+<0S?DA>/.qT;6gf;7h#Scn!Xcr@^3-+pqI9QP`--\@?Y\#/ADW*p>Y-p7#i4T@GojmpU +n<5&E1LC4[>F56>G>cAV-b,_T.e@Xg?ET&q_49LfjgVWrH=\u;cLBnt!g8QibZb@2W5#rIo_o]e9d/Z6 +1<0ds>X_C9dX,!6.*FCgX])>`p3i5+)nA:f:Dc(r]aloK@E-fPZeCNd6d(h@D:&lLhsOKj209@dfC/2+\[4[Ssb#bY5Ur5E5!*pDPXZ=,jD/O+9?& +&2BqLps0%V_"Sm]a21p46Z6L4iND%pi-H6"[qb"pNHp?SMN]oDIui*S1r%8/>:HTlnePF6f1VAu_mOIp +>.,U"PMboi2?E\^518F)n;n,D_UVNLid339)lQ!2a7Rjga@#ps]b)Z)*#MQJqBpPNhA\Nq?Z"#R_-*j7 ++[,:GqN@&mj^dn,BI.rlj1Xqo[i)jPf&@Cl*m'g".EYq%$[:_@hrkqs"[)gEZ!NANR9VI]DT&]g[7NO' +1q+fKX>'hBb*lNRUj\F]Q3#N[8P=EMSo)pHXL7T3Li03G;2bs_r%Bh<GosPL$\agi1^RRTmZ> +UZMbrX>DkD#\II)gq:GK(]sXL[;u +7@K_-piXi@a>GncC2UP0OQM:e[a2lO9,c]P,ghOW]8(I.'-VWLA%GKl+PJXRN.)ms>mcJnH$"b>PrfQ3X01.(*,!QQa;:Eu +G)Q++FN%=bm#=Pqp0aMd^[:QYR\mCurU=%X(!OSO8K=5F3J2;^Gd$r'@=HrU:S07FO.'HPg7H'Y0TMfI +\'%.OMc1UfDt0(KhD,X^-f/&%e]I"pT%UVX%eXbemGXH=[!-W7BmQ'm)9+gIQ$5VtgbiE,DpV[!A5AqE +dYCa`WCO(`/5eUpY0%98<8!@]Oqc[/eWf2je/ ++QpaGE7DOPS4R>'*R=$h^X2QJE^_Hf9:GW[dBgQ95DhNN)BlGSO$$n0R%Z7kHTIcH1O*>OtlSj+4>>VD]^gZF3,EO^Q*ZRV_cS^,u$Co?^fcO=d-1>b43e%WoLF><&^0LqP5/qUcRr8 +W=tpK'OW(>%?'[t^5B,Z9J`6Ce.r:>khVe%:KH`)T)ElBo"`leTpa4i7LDArYt%Lcs!fk1!?n5`F_4p!=+AG\%%jf((AAV>H!g- +(7*Dt1MO%Sm]-MsB4]O[X/*FSmTV8WPPol0VgGbE/?MhsioqL?[U^+N^@"R-h7qloCYmDc0p_m.GA*krM9AQZ@@<[qqAE6hp37n\$&2:X3rINne+%Gk0PeEJjjlGf!poFY[aVYmu,4C%I-*$&\iDGf!poF[CI"P!g&f7$<5B@-aUk +4J08j%(=?TX_29K%(>&fY_(cJ[M]LWs;42S[A_3H/(/ +QM/'r%+Z#OO4=Mo!IMX]&:6r>^;XHEe,,sF+?Q#C#$Y^l`GatAQle"R;]"@-L>f%_J]AfrcN>MZGOa#)Jb3`P?Mk-]8"LKC\gS +=TK?ipYqmYB!#UYoP;mh>7ARfBJCXMTZ&&F(WNkaOQ6@%^0,mrX*/IA$4O*6TI5Pp\N]/741_1g[8"Z2 +<5uBhE84o/U-b--&AkU3T1'(X`ng6KMgrK\kU.b6O9SJ+(NIV7NpjCM*>!4%L.Pfc,W^pk[YVAck-6ki +jqp,8Oa6*)-@kmqqX_*9N74aLS!ZXV\hl_`B\?QAi`X1jMaRIPjqm3ObmEGL.e*^ei'1*9=RSDEqt]4M ++4aVY7`GA<^/^f,NA6`Zq8FPas'(F&<42tJ;=mc!T=*8O*5T9'"NRB\%GO2l9;;U1>Lj>31c +pJ7B#h1jIXV7ii]2+G.KY`%2$A7=5OXa)&Z:7rH?PWi^*9%H+c^XkJ`FajD_R,\(Zo"3N*4^ic1Hp`LN +P_OG.S!.'*ERtcJ'$":/JjL6`h=5mV)CaP_3YUaJZh,N$kA,O7`EKh[X>mVpUtO7l)iVq@gaD>HaPe^$ +:+an18d/rrp1t&9NZu8P`F/n:>B(M[7Onrnc"P'.Oqic)\IJ,.s+R#5kl9OBYb[1H7lF9aZ* +Gm+AlrD?8@':;X/cnMmuRH9Vlhs_F?I>bW1\Xn62R:"u&*oZ+-7?"8SSWtp2_,Y7$=Y'%Cd[#:nkad0= +j`%*ALY_6hRMPi]\ibH,=id/VI,LY2X`i:76lD2jo"1k5,6sHFg@.nXbZdk*(seth&DKWRG9Mi5dn*4. +_NXnrodp3E/B;LRK&]h`m&JCr'@OKbQ=EueQEQN7hmbpId<)b1CM'$uH)HqXZbVp[]tCFs`j,6e +3lni=WL5pU>S$WDG"0rO1o#nfRE$@GDULBWRrpj%WP#bgT)Zf52ekM4^aQP^HK08AjjrSa$n8j6+#.LS8cp-1V`. +T7;OM8u8F'7I7Jqq)bl[h-Op,;DAMHr1L6[?1O".[uRQ'+Qb+tD/WSK6-_,eWJ!AhQl&jRrf^B_)E3tP +(S,^\Bf)%0p\$Q':bdjH>EAIn,9a8raR=m8+uW)i&B5>oqT5uiDP[tXZl-U].of#E.(<+1?@gQR.OSs0 +I>([Y1S2+>hu$Z;'u0KK4jOP<<0]C]N2c::Z=O/JmQ^G:NO'P`U!epY`BTJ++2r9]ZX'-`lhU51kK$km +E6\F_?ha/Q?0[fhE_<>90!S&^kKWO)Cr4<+F@r.Y0"$"g^(7.=N.Ae-b%DZ($dpYu>M9:R4inqP:.\!$ +VE_Z8VB<>/.*QQ,i^GgF\0EU$iK.U6O2Z$)5M\.V,%om+[IqqDCQLNbJBmB#]9j",uM_U"#p?J!;@G$$KY4<;JYfYu!"V&rKD8+O" +#5/YsocLGT@!_ekDcV0!52ZsYIm;:>\*hW\h72Q8Ap0b/6=]g[nsU_76pH3s?a4WU?8]S_=kYBB`g8Vf +5BNW.[,.+^aZ0@-?6h>N%;rn:S:&O4u8Gs/AZBd)%*Nj.qqlHor@%,LG%Rleoj;[7.L +DUGie5OrA?:4?aJ+J1mh?9r?u*hi6h09=J+A-Xh^g-G_FrQ +Ark;bjNGe-/n@fSNb=J\']&S_NU,>YQ"Ns +8hjVVj/`Xkr8TcNM!)OXSrZJu2])*WQ"#'kr=IuG'"3ukBDt6ID!B/dLl*guaV,@CL"D)8C;]\dLbU(8 +:F.X_VWC$8Y!CGXY<[`D7at_k#e[p5m.YdQ\PeAbJKk"["cT[%gT/h/m=743;:269/Jmd.*LXcH$`4`q +q@Z6a&)[Yq-2s)G@e&=3j`uZchX'8BiA+s#,TPd)VZoY)prBYC3QM#V'3-d4/S5-N?t)TUqd?2(\<8#-qmnWti6>s"s[0^%[WZn^YOJ<"^,?8ck%CTG#I-^6XMFn\T,f +/B"):_I:.EIaa?M0nZ&(Lp4MJWmeun`49Q\e`P-VC!nECf/*_\'e?($&P\=a9C%op`O)D?hnXF@1"*l( +dJX(t2GpaT*$EF'll]8bBnqgBYid$fZ8t>G/C*?lot>$998!/0FkU95m^U5D/XX.oH:IOI,-I:`rj-pI +'(Qcu!s9@VB^?/&?&)#u?+$UkRbjPI%\GZZ[J#^V29)V'a3m`uH(4Y=H8uIhXcn46[dWdTKMKPI?Lln/Y=LiuY*qm95''L4]2O#9`HcqW!]ibOuc/ +(%^9uo3"Yk_9,;A.-B8g2u3B!I,DF#FXH%M78I90N*B)0;+&W9Ei#/]3*gm'*!_n3`,T0T(WV*'2E233 +GDP;+Wd[&SUL]C;8ho1+3,]=C=ObQ7:uO_\#Pl!ME?(,$&KC!3dEA3j> +33ZPDj.K;/3"@FW"NS>QM`;2]_2.+_3QE9ia6AbokTMpjEu_993)5fF_H8>!#WWCSA%]3GiuP3LZ89Ne +Ul@>DC;5SbTJB)XS0n&,Ne=7KEUY;p*.0+n%^N3nj.K;/GRF9h*!['=hV-)P1*&Er+dJ5NTGEJGN[&Qa +@WEGfM@mlpV3p1#aIFWL`1BC;;s\0sMXf8Qg.*H`[`aq#RO=$?gH,q8pZeTrA_/Fl'Iq(D +<6]"H?)_Z3T+R2aUiZ.\LNHsEOf7@cIRZ0,%hDH44M))o[U/`$IF^9$BLR1+VNW#M`VfFN +Un4iO!@l'1O(I:;@#nrs(f;=:`b?'N@T"`5e62a(s7GS0TP(TgE((+DbIYFP0m:9[\P`i*(mSRYL_"^2 +WiVG0hJdg+O6h6KUJiOBiL^&kF^:^H\/.eVS8W`VT)Zf[^ThYC4%:?0H9CF"jpd[6n:gO_&$f3m'uqCnJj\jrmm[/;0aI22W?a0[?B6;@mD:@31rDb8R>MK"T(Hh'?bXbj7+M? +3,N(taTG7J`d;"NDWsB>&Mbl4dr'^r[ZXh+FJBlJE5Z$A98EHdPb70C,T4#Q/Qp%-_UGf5CtV+#<9>'Z +`tRZI3n]st'4N^`Fs3Hs>Dk$^N6@n`KeX%b-jQffi5CG-\0DC.d'M*"-EG9SMMr2:XfC97LkfH#Sf=p%H5k]ZlrE;O>_ba0qt'\ +rE?qcN>aZX7;jN&O0n<>nH:AL+k1t'2MA(WTa_UG2KV>SV@DKYdY@7^d"ZN*->a$R@RN#^+UX)fjjj3h +qC4"Ze>s+QhM\`ae:Nf@7-*&50t!_BQLP^YF_ur86#?mm@RN#^&IjW7D3MG$I]2s8ak@oVeI:`CSf.uNhLp@IIJs,94*VI"4W +rQMKNr<,$I1>F:%E)n?(a"*M#QX0E5a4J(G]YDP9pVJO#ftVI,k:OD5:Tt`MQPDYGc3HoOc6[7oM+cDD +kru/sg$kFQTYa@Pj!+o-:$>$lN1a>76P\:ZbG*5h0f,%?eG`)p[XM;3d=GoB*[fuQmLQ)@KtV%Hps$pR[ro#23HB.Kh1@f6s&HWW)A/R.r8UO*q\ +R_aBM('hiTh>ePU_>VqDp) +Mse6:P.74qI]@[Al,hc&8XV4O)5huoTs_,-"\p8#p$3,K$>N6se9NTWbn2I0Fkt]WW6TBo'bPA.]oiVB +9KZO(ehFhWr^lQf`=Qs)l!2(t,Mg%O\o+YlHIfuDURj_L?=8e]gHX$5:TBi2#P7$g#OQWdh-N&d^>#+h +5L?pHT'#(C]&qBg\+lnq39aDO]9=>sIR:/22i+CPF==cc*U&f5o>PNMpWPMA;D*@V$1I*?(;>@o\eU]_ +W1l*6+n%$)oR7(BR5Xu,0f:?!k$QZX70XtcTEA5U\c?C#XmcOW'GrJP^g=VeJAkelJ@>nke+"^f`_-XIfa&.a,:0BoQ^6AC&i>USl\pf&#f8MKt>,Z*6t-V**cbI(d0Nc-Zgr%D8@M +:\Tqf5dZ!"1lM<_>9fo/,UtD'/oQlAb?JQ,_*:#XqX>*@o[PQiYo:\rI#<\A*%fHErA>u`=*m/@J/3=js8,gB0gKbM: +44XRT],dY,BXbT%luoH5ic[CQF*R#:f8dh$*,8T5&im6JR.p*6luj1V]:H1mG'oa%42-Pp]=NBuQMRuD +DT>*7dd\YMcFurQ1 +o9rKCT#'N`La:^A7+&&KLXh/31)I)'[,P@#,#&a]NU2We`.U#uEi7p:ddRL@iXaBdG +`.&gk$[P9IPl.q+%ro:?cW+/`G;Z%-dA]tPBGSU$Z*q\+?EBGJ$k<DEj,LE6()2u6#\6^?2"QB46k +pg:Cs#!JAG'%MMEnZ"='s$^K3>GY\0A+s>j<3\menCd\7B)>"STW-BAX3o]Ap&.bdQJ(J?DC>=.KA=u6 +qqnOqClVdBpIUnf+&9om_G/#N9X&o?QGrqB#nl7Lo,Od$TCt*22$99(+1lnJ"?3pi!W'OAl`O;GBb)27PgDPK[kT"o3ZNE +\lVu8oi/-!e;X)tHNu@^\>t.U@gVb($.XRoXs1PD[^UN$bkZ`>hG\b2\SXb'%rVSQ%EMa$>>'m&s2`6C +>iC7k+#sNg9J_1?eU['=5,fIIZq*uNC8h'N)d@dcKULd>q3c+?qX[QATXf0r>XX(-\e)UMIV +4''YsefgKn@tL8"0'sub".H/#c[%_f<<@m0F-&B$@iYD"I(VKOT)ZgrT"Kor'.PLE4benBEL/MkE]k1X +J\js5)*@mWs54I0fAs'!qp0X::^q)Ujl&Tb+S<*0UkQ?4KfV-H=N-X&)3WniAX;;$HKh=juK<&Vl +nQh.P9&KDU3am.Rpj7L!XB2P/'UfuGCMp*<+jI,\)]Plb!m7G'L70:6gi/IQ?../mZ"G#&;HZWrmmR@X +ja3b;%/u1M&61f.Au(;9_M?H(#$/GSr1Nqnqr=+alF0<*6ZnX?ge\G.1cJB%OlhC&)/3ue"r*LFWW>\4 +6bORUDFCY<&Qber(_k@(:njK7?ZeD*k0-oAC[WB45@kJXMMEm;jKj.!i*;(lRDqb_E%2'?UN +9tFJgl:[h]EAXi/Tc0"L2pMdg2cKkdbmgpldbI[f8"(BZCMq)?gi-ULbmi3R6?D2DT]X6W8"N>!GE1Ea +r0TR8RN#tu2)fOZC2QaL?73d4rfX;_bssOA\B#Hp=eTHD54%8XK/"A`D>2ZjE!Fh*C#iPOWp<>Y2J;B4 +[h_.hM:s=KmB0SuN.dnSY(9i4&.cd<4HeD[hWrUT?X4Y@c:"XX&Wf01FB2hO7>njrH!&MA3(qaW3J.]' +Q^lqZDlt]uO.'HPg7H(D0NLS^9Mkdq>boDfPGd@$/iX>Ylb'XpX.']'4I:&s*9uFH'n-L5i==r?:!jOPBApAdkE"L\r]'Z?EJp"10kQu#*>;Im%Y5eXj3&'@g)'G:?6ecQ@UT;IpkR"nG.!-<%hWmPmVkm +fisEk_&@G>NHB +cYnK6(2jW+NS&G,TDuoY5,nY&Bo&-h&*-jA\HGoOK)_N6Nk"MA-*8qGihacARPd+\Qh`k(W/f1>IKs5. +89M6BnpN]E!`Tj@G_0X3I'<-AI[+Q7l$RVBIpJ8rB[kc-3K!D>mi=Na&%:oUUGT`r)GlrY:s2>++l$Sl +1rLFsSKg(ak^:*To5#S.3J*f*`I/:$1F3VNpB(06dh(gCkVP[A1Tn&+C'Dk`2t=S1)Ocg-S$V>4VYA[g +!Cq4$6EiCBJ*/rhBo'+6dh$/RV]j?hT8&/3=.M9W!ffEskJ)"#%3[7Uc,<^_25&j3.fSS(7Mm!7@Bi[& +((=/s.F^sM$VN=6MA]E;9%J0*AC%h]dop&2>Q':"/_]Nu\7J2'IHCSg/=l4.PnJ#t1t0pCQ!e,Md!'_L +oa4,mebW-#+K[)m!QBqk)N_EDmPr[.OT@3(a.mpc("\;t3:YLDSJpkedsV&f5H@knWL<=DbPq)&g#nr0 +ir7_1/(p("JMa.9'"MAoF3(p@U_%cb]]^_E"1m[:-WL8;nDdq7TR5_DC.s[3:<9'DE-_^/U_Gc`F`J$&ti('A$T(i7;(`(!9b2dHYg5si3:dY&O6RncM; +XV"QobZUoF][]apgNPD_/ft!.nMQB7qjEQjF+b'rm2reSCs7?T* +;X_U'[k%a),oII#@^d1*m=3V^46#dE2;DZFFc*D%&:6r>^*Q@l=8#8pfWq+jNZ@nJ@WWO'3_6S',Ti.Q +$lh4?#sA5rKG\M,MDf:XohesUXNaTsh%%kRuYB-MHalP)*" +hH;#5^,eoW!SJt.I(NJi#W(o?4!bR2HK8g+O?QMNLsh*%H"^u%eXg,o,V>Z9b<6M@^Q._uH6Cg9M$L(= +iLeTiB^*3'2)tA2fNQe"SZD(d^;\efhV+nq/L'&5nCc+Ah8)]FfX9iN9VhXp2q)C3:XtqKZn]r=l]FT- +jl8MP%&WjFeU[QUN4!l>qt-]i^4rT?j15;-qHS;ZI@c[;W/3<;2^H8![X'37lA51lj&WpOhlLu83hZ=" +l,).9OtL!2C5AhB':^%"IAA$\h@FrY'GRjoqb0cTT9[`o4H'2=c-he,T!.t7eUZG4_qHorCfm$Y.V?M4XaeZJt*&N*Ilr +'Ss-FD1$hm$)_!."4BkaDBq_S%4JX4VS`a*pnshlh5\pf^*4)'0"F\hl<.K/>RfoFc:HK9J5miUSip2` +#,2G=Oug'[Ybf5.ONR5@C6j>WQ#c>BK3?_]s(!Herk%Q(%7d`\([""_^[]gZ1a1D)V$A9J8;"X +5?FV=g-Dfh#%kQ34AWL+d.HUA`(isS+8X!SD\;"t=D.8KF5Fl)(u\BKYK3<[3\.8b"BVR*B4Z`AD:tup +1q1NkM-E":\_YdtkNq5D$R4l,LdWrLifCDE[U5=,J"e',:-A_V&bG1>PPLLf-k +XRe9$$e/\tj&gYC*SgChFG6u7QcPd1F!uB;7]FNOWqj0-am)*.1EoSYI9q@\YQ*d#5j=8aYDkK$2d^J$ +rIt1L>RecV<5QNth/kIK`ir>qZA;P]l?>[S;j39jAt0Gn%Vr[9Z=i!scrtRpZ[CbF*A,;)KKd"&o@0DUIXJF_'kCd9+5#Hcqigo"*4@,o$#l)D(uLOauDO +;WGc[oAZ[=o'tB\?2#(7.?6"I$.S1,;.#/\q3pK.g"f4CMBtmePH+_pPq"J^bmm7j=cE_m8?najG6Rr? +C-^c0I>([Y1S2+>hu$Zl!5J8>p@PLLM9]4!oZ1QKQ^=fu&6&UM2'BZ-@5X_)AqmDAP]>`rc??8nPb)7N +I?*NmKPUR:Z@9h+#B,bB7dOmtRT%KlqB[JG$ +I37iSg228)\fI-LFLhrh5Q7PYqMt#Be>CVG75Z4T6W=/F?-8W@[E9!_Z!)$(BDbQU4P5qEKp??u-7RoSf=)r2QKIk]&K^Gu^j:-/2;qk:c1,BD)"eCe8sB%(9\^ +0C1'2emeOojhoN6gtu<*5,(s3>/d>.ocJd_T`TH$s`kTOGRa;%4pC\CZ5K +Z@V99D`lq-JM'CKT%!\PTQ+l*UG9?"bDXU24F;b$U3NBiN9nSoepLn53BeOpa3(D#d,eH^%rj0jlYXD1 +Nqtu,LIH&&N/u;NfD)2S^N%J)Hcn-Obl?#@HK8g+I_R,/q]/]>ir'AQI`Mk:FR#OD_(D+8omah'Pgt<^ +IYZI(]N(P>7WYL4jS(a;Ur*!Lf)+G):*o(sG."607h +Wr_a>LXgq7KRFQtdA$UNmrsG,^E\^7*EE:%r=5k/q>Ce=f8/^P\;OrUH\?-UC=QItp6[/^n$#iP;tER% +Tre7RpH-7'hpKo3aQ/h0^SC8]IRh)erJl1pqZcrdZ6$R5]X9&H:f[\hq]3ohmWVe%L\Eks]&*hLpnmNd +AMkUFhdJAbhX@[T%e"Vk?et0a1qMQV%C?&lQ;%ApQHmYuPgt;/^Vb@^]\a=lG\LVUT:Y*Ub%a1j^SCVF +rJpRk\c/RHR;e=[c?D/uDatiuPuWR7D-I00^GkE<(b^rss7rRArm*g\ReXMYs7`/KK)b,R^qSbRcY'Tk +0;a"8[C5RcE5+>1G?4auIp)1@>,/!GEQ +rtk^@g5CI4rM&1Xp1&.'U(&rJ4hEAj](gL+/fOIYo5]\GI^dot)t11VD&:OqVK4]C7DCp6DG.lBo_[u5 +KtpnEK\>4(OX6C)h_b5U``"00(= +)g_fH5-\09.D?+.AfP/7nEfG--a`9_B5P\lHcp4%N:`0V>165&+o!lTA`f[G##HgtCV]s*"1GPn1qrD3F#Y#%or]B"I5PMa!U.cFaji"bU@X[_UE`]S2s)\R]H +4a6XuGrUrt2G9pIq$`k,^LOuboE0uVAA]S0J0i0pRIEYIa20JrMOfVX6])nN)-;]$7Gpa8m$PUUrAp5k +6;m1&d4_E+N9@Hl:?d5KbOoBV-'B@`<(St&jEl! +9!LXC@]*Y48W'&C#m)Q!kG>[&]8)*(Ut@DA+DGm3VWDj`*WTG[EF*su>3SpVYrf3R8[5l9,Mp$TB-G6C +;4C.7@6m8<*=EaI'KZ\tJJ>_snK]Q,HVn%*h:0Bljj[#mgliGa/iPXk48'/[fVOo^8[6_i47E/.(%Ml5 +m$NnYUtA[LVb=9n+h&T5XtkHh'K[(:,UjKjjil%thj>*>;`b4^/9&FqO7#p4(Y,+QfGW$O+iV`WNX%Re +/4"YSZ.$Z:g"NK"Z"#)'6].Fh*=F<>kA@gF]@9iD'KbFi+=VIPj<:>OC$P07Hcl]/d&tA6.<_e/BLoD[ +]R]/b85n:As8K?r#BJ.2%ULus_ga+O4U(;Gi&MSai*R+'Qgp5;4GJ"k]$E9S5AP+[EXhsgI4eqo)n&]! +`=jck]0e23*Sfq/A`,*"AJ^9R2/=5jJn5mi5jX,WHl88rXEB0As%[]'7W63tF`/qQJ&2t0jOe_MZ9J"o +W#[#E&p?%B\7#Pj8_QWE1`f"Ba/"AM;j=Z(1Adg-1j%+fV&ml9k5o`&:gsr>O1Br3ZP@i&>8q8+H=TOJ +%Mk%:T-J_brIC*8D2n_S5\S0Z]jRG@]^##nN;O9c;(h"=*a^+ +o_WI0"Fc)o+eE+9DnPj-d9:YWqIO%NnUtL<)](0!SZ9)8o&Xi_4+(Y1Sr>E%I*n]dBUOr/V@Zu>?*Yj5]j<8BZ9pHU1k_g#+J[;h"LmAIuMf(bU")dGtI[n`N/SVLKTC!e;b*M*K5ic80R:Y>O +AcoE.U1QOs;$MP`^?5**+hAOsT!/ccS%IE,7,qnT5-b`*e<>T"'VfAGLb9TO(8?_%Z4N")4,XlKMl'^7 +/fM#*1pj\D$dhCd$8Do#O^!XSeLX,^-FXQB5*R''U5QKbM!eqW=GVj6l='@rq.*Ch9X^dUlLTJ5mbHN. +7c!7d#`",4QpN;2;)*nO$W4/r=]gK;A[RbVW*#;g=bqUF6DRXaL^Gsb>):=UAR6,r^6]V098(J?7"p*P +Z4IbO#TOVS]/@GlFK6pFKr>tnBk8I!?>%/-7)dfH/4;a3+_%K#i`oV/$W/po7?N;&i&"4;;6_@D/4='m +q?RI+TcF7OU11SCZ4IcI0Zl^]Ci?/@1?[i6Dj#h<;Gc+V+gSfQa?juGX0N;ic:JcqgH/=LU5PIELkshQ +UfLTR0'Z.H,/2)L6l0X2OoDC47(5Z^#n,/"`@XKdf,n.O0!_S4Zk,6)Yf$,S3A"$.NaNq-I*GfG]C/''mkWc7$j)G[h+g]>^X'g6S8sq>6KBp.4jiHi76fHljAJYg;@F7$;#`&;:gn4b-E=(*^jL=GT;$_*[4b;\F#YKd``6NZ4-j[,"Q9#t^!\cYPh?'FRm4pTmqY +"_oigmdi,q'VgA<;N)A88hjM*>`-oq6to!r&bdP&6nZGl+]9gA7$M/f&@iLMKh1ZdKnrWc(*])SZk0b^ +UP4M%N#!U00j9B.+&;:f3L(o8o85]j3U6&i>*#2?[(*^jL=GT;$_*XAiHZ^bA$W0GL=GS6A?m1[IK7t_L +(bA(<@^$D8MSVUn;@F,3)^A+`^mY$^&\SQ%d:kFicslB81gg$^#EH[h.4doo,d)]=D:S7HcC@?6V&X +h*Q52it`j9mKs>aXlke"aEm(d,,YQILa]TD+X.BC6=aS%(*]Ng,7BVW[h'.^Kda@;P>T;G/U&p$7)ZGD +)-XZ9CFW&GbT*BECoo>`t[K$]uUA&>cWD9+)BgIUa=/Z4OQq7Z3AO>K7158H&@&9M^/Yjp<@B +;-@ciJtB9SKrC@g-O\>P<1;Q&ISn9(U-]52/4;HkbO\nJ^0#Uh5lCt5W?ERECtghqn$kk8Gq +KrA+UFu_bB66r+"(*_t,Z3cd"]._QbmcXAUo9AJ#\aTCjU.;!*>-TEOC]0amroH]$ +27dQ:W>.I`\]\6Y&*7<5LZ"(+:Hac4^*GB$Cn8lGD?(8D2V1]1+38V`S:`\uj2Gb#8a$A!j`'q$(3a`&EA(gu(HqP+ +!VLB(B6#%eYCBsK4O=KYXS@?YprMl!M[!BEulXoHb?t8*ZK@u)qXYg(76kADEUU36mFRLZ_ +fkfGrce=f#i)YBkNWMC=MeO>I/edP_rP^r6"+>S)FOa +j2(*gX>LQNUuu?W>[jINK,<3h_P))63jQ.WT\/EK5E'dfNC)KI37e%J%S^][r;6NW4*`]Jh`pdB$LGP- +lrMBG!r0h+@1KjJeh?&q_CtVDKdSpQn:*-Mpoa)ZgRm"i>5-`i&oq5O/%@$9JZarGVWRVVE1_OJ^$VkD +7s<:nGGljq=#1$X,2B"O;k#fN`^RY*U)1F[?-O)QM\b/bJuFls[UJ#]Q`Y?spXU#A5&9/r>>=q)BER'p +pA.T]D=I>#[TBQgla3qQI3d>##EWmT\b0\GJT0oepi>R`=#pL?Y76tV-2_9JhKDs^&6uU2/6Uc>btBdE +];oP?AM:d0mO!4ma=8IlH+5d[5a[mb#9Br@G,h"MjNbr^7B_@,[/nQ_]< +C,4kjrd3"MNMgVMOQ(IA/m?=8C:sV]pLuPmo*3o,RX7\-RENoG2kh$$;=-Qgjoo,.m;TtVGVp/S7JA^P +RapPp#H0b\fnJtO]C&_)3p,+FdIlGm>mnqN2,CYq3>p7?3UQFp2g92pBX(WfL%i>"5F?M]2iGkn@p_LO +=)2:6FK?e^as=qB+jNc<96@V[I_ghdgORIE.3jWu'"fGcHPDQjrqRBAK`5@/&)18?B)?rd@h"E!lT@=Y:V8$"MSp.YJUV7k&EXH[Z14rrmf7b^fqcSbC@An0](RNG$&*g +i"bSj=2Xpi0b565G:c>=Z28qj]&^asH)g26U)C>6*bi>ErICWnAa(AWKH\=G*@!tSI:8uu`GX%DG:D*K +Ao*^_HZkQ]h9HqqYAG=LP[Z&`(K.?p*h?31_]tOhC;='+V:`#:f\TdXnM\a18W!t%Hr5dWpk[p-9Lr&4 +nO:6JZfaqFJW(^8?on6dj2mL[6Z7mc%mJkedp=u;QRd.JC8%3H#Ca'!FH"s@`))2HYWY+K+o9% +Y_No3'g%`MXcTlN@`-?GKbPI@qcQh`[SN6!2c90i.5iYh5Z2F60:,RQ'_.P`&[r=?fnL8[2J,EOZ]MZ"Ze7DB\>3nC,%sUGXGQ\Li@tgMAQ6(\riLT$D@k%(VGK[fs#e-SZ +/;a)HJ`LgtL@*"!_S*`F%TC\RS%%Z3qLY'iYVL5[KV0C/-%q1?5j/;:Q9,R6V/=:To["3uX.L.r89,lR%\4o=onHU:WLED4Str=aX8nQrgHn?6`"*SDY]lgK7ffHs`#XHm'[n%J==fSA9N2HS=`QZS-KGm#phDGX-bPcXPTo6DGnEgE5)k6mEHs6$"S&aS&Wmam8UBqZ8& +!=T(rQCdso6hbqY@rl^Pd_f8W4EfMg2/$0a*Z2BZb.)>*q8^3jqpOlcs.V$C\s][$KcbTDoO%C4pS?>Z +g;CqE4hMCpBZh/cCl3rGGq3J9J+'N1L1g&,B";g0ULm"josY[mc#Gkj]J4m7d:ctJeP%gViF&6bSA]X> +/@K748Mb/i`-_Jl6^oDW]3QlcC\Yo#oEorD$07#Ir+Vh/:@GKH)eQ7h7X39p<^91e+P=Y*NE/-\g-9$A +C,N+Y1WL-o_`#-aeHWTjJ]g76V'e2pi,nM&D/A.)f0!"A?#?u6]V03)-[bHDctEThM#0I]f(;Ygm$.8m +9XFG!bUGY5RX%5B>R"GTA]r?6!#p=iWj:PiM10.Apfs)+BKdMt'39 +3Tf!ZMkQ/DESK15Qu*[`dK]P&>IqAI?:O2Sget&N$2lS +;S3bB(AmjOd`/Un&##kMNrZ +mZ+Z[b&4W84;BA563n,(FP#]b
C*Ar:J'' +Nqk\sHh-\Ka?d]^Fe;@b3l<..+7\BXRV=)KAI8hJeoRg6oZ0LqP>:@c?sPC,mA_)7i7>6e>!qMqO?31US1+9;@gC@ +,9=QQTNQcqm)ml8PJ0-G +rGq.cN`^KPLFdk67]dN,IX+-79.KJ4Q_JhVIF8oG7o^X<=!oEArD]!,H_PZ"4'Q-9TNAS/p,BYGA`q@^ +:gXFj:O"\ih3T#E"8J?dTE71s;6;`cD`OO1W[%5aD'hUsri!1;%-QRO]60%5#3fEG?YgGL+a(OiiE;L8 +e-XrmS^1qI_gP%IQMhVI;"%*1jTp1CZ,9Z\D+,Q*6SQEECZkc)S6L6&D$sX1nnm3+&`SQ5ZV02422hlW +"(s0>ZRA?7C)`e!c^WM0KXZ=@ag8]Io80Xln=-Td>_Eb]*rE"c^6?<\A+1GMg(P)CN[+R1%$/c*f^0ef +HcCdgen1[IeS&m,.!/$$57poCR5G[Be9Y=rgS77c=a3Na@h29.Fa?#1U(D67lX2Va!SIRn,>Mpds'amF +i'C\CJf,LUiG(X1]?RMSSF?ecc98i*eqN#o5393kG2Sb&C#J>Mm[]0h(m4#"<5X&5YC$B.,DpKd[#djt +=O.*21Yi6T7J$e.p4K]NS@N'8TCWo*AV*kKbU/qNWuo'F74,9g+9QTMZ>AS>U"_k%TSbZ&9^)AomPF_[ +WH9ju+QOck:iHMKE`*Kl#'e,g6m)?^3?TlfdgS1SIphWGJS@t" +8gH@=IJJh4S%EGPkJDh@?*,]:?sdifI(]W%1;dJ)3%*9/._8;Q%s+e;1Cn8PB.mm\p;(!;GnVKK%2M51 +>-sK8::"@l*#&T@/+%s"rdhPj_=+UU_Z*pN0@o.^Eko;D$C+oooS'61hXTr_f*$K*TUgVsZ.uf'dS[bI +"MfF=::Bgq<5hdsL__R@iCGKM0*b8(q;+ujWVidf&3R$5a=E@Re>D_&EAVDNBq\lph"QCmqC3r8*kh1L +`N_$K`=k=_XX2/0"*+'r*TUDp@_#9PKh84+i`bnO'ob-L#a%^DVuR9OU)/3Q:$38rMS$k'K>OdN>i(uB +B(e:Zl5d>klneW]JA:Zg"8bZ='p2;Wd=?tUb=uj/d3*$s,9:2!>riD]=uSFE>[Qec4.h5qeNJfdA^otj +pE%>^l`9M9ZU]Ig]4HIjSoQZLqALe@\t[*@oMhuo>B!2B5WnAc9*fUdqJDeO=```kTFF+0Be)XJ'^44rF6?P1=7G[H_* +bHhm\K(_=kPWNh^O_6MF0[=T#kl8Dlmq_HN5[XI,igtt$HJ"'fHiD'\mA$]:&)R>\l4.]-dP#j&I1@Ht +eaD=u`R>i:2CdQL*%mRC-YCfq7jss0&I>jL3Q=2Y%9SXk7nOaqV9#4_O$Q9VtH>Y5mU>nF7nk5V-*sAImZD&*&D$E1W"aQ8D ++kLP*'bmcJ=('4rHS<)>QEp->2000iN;]g]f,5=4Xm*N0SnfCl=Fbrh?W<5Nre>7$M#fU2:%0Hn=KJ +c`YFs]IbOSre7f=kl!IWEtk`\I,0@XZe\`!D2S@tei[j6H.k6iG`tSNrJlCL5a$Tl'>>/>b*X%Bs.3;,eOK!.L=&'TE*Umg?\,kl03cS,$r +pSRj,B^JTV0H7L9qqq(*AlG%(UurO7%eTq<.R"%?rAK:`hCnnjUTh=-M\/mGFfiTD-/P7qMtKP&&A@GY +)3\aI>0KK_qrQUR[?r%+^KR^s91"R4Z.[Z+4h0fmYs'fN[&t21MmT,ml\kZTEi!]7-F=UeC9b_MUU?[0 +OUDeW(/#?F/uHURcIU?O^%&e0`S>Wc[9-3F]e;lS +MtJR17_2R%kKm\K;O5!E[2;E'>)\hPb^4QAR.p%!@\a18)!@'.$64Q'(b)62_,V;WJTOL9k0iF-0s!0F +1#GL6>0M9_C,'`Q[9/d77kL&%nC`,q=<_LbQS+L_LUQ>sI6M20"qQ\;S`!irZ;N,mI%L\ti8YhP2XL_& +6Lh.Q$sGa-3oVZBQ87n)EK'Y3$Lra081PcZge[aeZ=/o<'s4\bc2tkaWt.Z+]$=BO87m2[q2IAAmMK2E +T/__A4;^#+>njq6#42oUn&+[=gqi+Yo@FIKI5t_lCLX[\ED>rLkiC!V1kpt.Ce;e0/(+IJ5,7YWC)nB% +1r]u5NiR-C3p$MhXmD/jnH?Q^bEk16B;](<`+RQEHdMn0+(M@9/#7YZT2s@_a5HP89Y2e.2l:T= +NZ")Lrl!WhhLgU(;`n_+d5'[^*D3b$cjI>>)c0"*n6)@<(:<5gE?Jp)Y&u8E3l/XPgZ^u];'6P3Zfc&) +e0KKQYp7_!rdYdMp48G_E.^_7F4Hb'8(9TNW+TQT9tM^dfh1-n>LkWhLHWWq$cut6g?WS&jkNm7D*hQl +q@bl?5?N7]bQdb@E>fMsmql@Vnn`]IQ$V59(gk>X/nuPW<@HpI,2.L]/a`qYr6c?U"[;_o*',B#BA@$C +Z/GdKndd=X^h4s(:4B#W%,Ol*>m,;"',[ +[6qPI4EP78CZZ.EX,u>L[3mi)-+_+&S!NteBS@Ne//?oC=]UM9L\Tun00f6FD-/Bu +fn[p*R.7$m29?AG_]H5)Z,N:G][M%=QIqh;.-Ms@CR]?*FqSXb1>ClZE6G0>)3XF3jQEuHVFdbslGLqb +J\q?1_Z#LB=u^`Jr\%/oo9Zj35I[I04nuS4PS21s/skEng6qQRmhWuaDj'Ti0la9di=1hYj\JS)fbr+#C.neab$d +X[T%Hr3]Q;lP:>`L;'hL9g_6pTGFKfZf&8dmqrFGdXaqJP[9trI.(2%Z]D;M$!S$*)NuNfdGHZu +98>tmBPCqO,N99qeK,R'(8!Ufe7_a>n53jmc':fBTqML%N.^l +lL5RQmrT@+kJO[P2W%b!='LJeGe:)F%AU&Q6;ne$j6VO^*IHIi,P$g\_DhTLf>FHN+l;[6DsbZf&:. +ZP`4+k:&cHpf&5TcR0J^:HJ!g`mGKoG]r@TSu:64bGehi4^4M]RV9FMFD/Zq&)lcu2#tc[Z5! +4F#GqCbDIX6,tFCo@.E%b\YROH>%Z,RD%[TmBJ8J^""\GI%$7H:PfMkXiYc*?9T&pOmi/#<:JOD:#GW= +U\g^E*pH7MQCd`j%S3_kF#UP0,2`(J>!II=8QEG_Zr;F]YeTB6,j4Q5iC`K"2ge*K@]sq=cskgg8iU;p +"c9[8NeojDU*d8GcM*?Q>UY#C9V,<"EqL:&hlH.Vo^JS^*^!gVkl?/U*MA0T"+l-M'-l`L`4:+sqo:>p +V2!hgfEZfSA>@H2LSqo,Pr8!?7ugP,&F%PQ"YFb'^D)(kQQ0kLVo7!"KtIUOHB^(R'O:$WZ[qICf6Y3% +2gEf'://%%EeWP?p"+OX\)pa"D>Rcq,)6`%jCmll]&e9uQ%S_Z>]Ym?cL+A0>5B(1[LTH1r,V^]mu[O\ +kDS#gLVBGVd!G'oB,@-4\]u&%]#,oJ,l,mgNRla=_/!m>IEtnASh43n3YR)C&mk:74i&8[&)W;QIUqd6 +j:WtMB3Ldh_:e*#'glI(:!8"J)(9#"ANVmO&&H`Ka>5rt)RA!QZhR/f&9*e`1o>WF@6EipNF2)9""cYt?TJWf +SIZ-XK09Lp56_JJH+Kl\r`+DIrKH +,=(97]dmrWd*[^BCsF89Mh)]4bVnb?_(u\e>'Ng^V&3bD:.Sn?S%,rtj97;Hk(s?lF)IVP_="WrWC5XV +aZEqo;R,=T;&?ek,2'OR_4I'2\b>*T(aV2^)UBWEIp"uq-N-[A*f+/?]5(lfHg`\s'Bb]!Z.`O0V1h/- +]/SZ*88l:g]E:G;gAg4^IWIVV15p\/b4icR?b&@6+5m&h^(&'h24cKYHF#t>iRD7Wm4r8u +?&WP\B.a`FN6kKZYnn8(6F2lm+j#PghjAYKqkfeE(oCR@hqO`&"<"^'X5qYS>D-KjYV.uE"aS5a7'8E) +Mm^:a*S]SQ?)&t1*4*CBbF8"^6TTDTk8YGR"dRDoX.'c:/ipBrK>!P5@?u +1S0J%68tJr2ek +&iOJ&fVRP3c5LPrV&`=[ZaA)>ei!))SLF`Do!b*s>sE9-C%Y\6NUtSPRE6$o0r\)s[RR?^4.T6e?>I\& +`A=9GI6TmNe$oTl-ThW82Jns%0n20`qSm_%28ER_Ot,hT\L@&_cV8[6(L+G5b!gTa7a.&Tr)3N!]_A!7 +iN##e6]Z?CL]1J'8hhBW'n61XdHVthPgCj(k]Hc!;s-f;1kjIqmH]u8s"!\RY6a$D]UlWW"*bNO;uE9e +'=gCRSeu]]iJIKO+PraXrr(Z5WdgT7$A&p9J',JF2<5cZ7pC7Z&R44=@\/'c;b*qBn2&7:VoKiFJ)ZJ! +eSO_Ugk@n#kNI`4c4/)pjkp$P`q$uII0IuR^%c2e:.kPCDFMs3ZHsf'Z +7uo[Af$OF?"T#TR>;n<%48O'Grs#Mbke`O3XK`(L5P%<<1q`/'f51A?0j:%sQ8OkB@-/>D=995gZkJdB +6u^*p`#UP19bA@fKXbL;D4R\@2%B/0aMV2h@TaiUla\.Y]mcX'phW6EM[i897=kWnnDD%%E_UaU.^CQEE=G:Wq-uRA\69iU>hq&o\Uq/9GJ]'>3Gi1.Lb2.U/%8n +3fjehOECZu.ZO"V(_oNQs/:);)u!/R^]QE;8^BJ]n;5E%UFmQi0.0@gm*;&OSCr,Ch(I=^jJ4CX)g3KWRj3KXF_=&#="hF$'&P#hYSZqK? +d]^!b8AE1uMlOGJ]fk[?q,_poG4H^IK.Lg2\&WoH)GT+f)hO2qgjtW15`$sfWGg!$.!SV=JP*SJ&c'UX +hg@*U*;XE2ih>X7NtR65DeaWZ#.60B;Ht+d3e1S-AtTdg/1HD/%&0pT22M*D`Q[P4XEg3%AR.ZPPnd0C +UKa3!r>f#a`CE9ji^cSn5c/0s$1iZTcV=grn1Qa>G;3B`m]*W+,JXa[Ll("cRod4\#.o])C=6&ZEZPdj +aS"H,H/fccR;,r^Sb)Si'TF,M&DWe`5.me;BCRQi5N_8L8gC.D!jW +-[gX,3)#B=Qq,28]/>.hEG$$c"6$$hq1V6? +hU5LfLTO]6dWr[+oKV[C_i8i\`c9K`;o_a`m/bDQZus@oZVm1Z8o1N%N8)B27V4N\,f1+3rlP',kkAhHUf0p3;3a5GImLD9n2#ETVk-mlZ>@RGa=" +fo'.]:>@D`miI%iINS`);;F%;O_7NKqZ/OPn+A5I7+U,U&SKLO3ph_i.^I3d9-2jYA*b3MBA;:5*SDrV +AY%l+R9[&o^]g`@LKUMh*BQ8n0LIU8=QRg_X@r3oGBm_$)3K8a1K@\#*U7bZBgL=:F(+$3UH)4Rf-qf.fEl/tqHk7r.iaX>1K80TIOAGFQu@Z'JWE +?A-k7>&&ZI9O[=2k1#j0Gc/7ET^j;J^5HLn(\JSaHrCs)GO:S8R&JiP=o/j&(XF!JjXY^RmrbK7SqVktnC0-O)Yjf?IBnNcuYX*5FWhY0s_>YW?&cT@5D%chi +7ttjJ$IkKuX_0/*j]54MTUs7+[9"(EIE+inb[TX/#5;cl'?ou5J))kYS].O*kbti&p#UtM[<,C;XBP^h +*fs-tB[Tfk-b.!*79":aR?n5OUm,c,V9I[%nj,4c8OKX/h\:KRiXaW1CS3BW\V4Bar6/(`mr?OPe'/iC +:s1-J5U?/'OC8u(@cON9M\GeE&Eg<1lRLiFLpmcFakYGl3K#FYQfsUZjH`krs0&bg;kd0,<])+NWg`HB +=k2lgU-$4h`D"$CItNDm0`jU]$FD9tB,oi0?n@Ncb7A7ZgT#o"/air^5!Yl1Pc +!ca]mUWJB#cEjD`n4,lS3?"th:]g#/jNk.".9frE1*X8h?RCGp#]XbEG[dh)f(m->R^"X!7J'$^pnQBZ +Mo(DCi1K-1TNs`XdU@.ct2"`"t:>B77TiCN+X)O +0Ah[l\)Hm?NKjSn:;n4ar:]ng6*s";QPOL'cmV)]%JT8b0!Xn-NVGo&?k4pW)AWr +bnd?_Q(Z+3>1jW1^P+ojgM^ljZO:m/H4MFA'ruIHrh&+$8BZh]GMJUO:JO;YrZ6V?X&g<*>>1Je2^(TAmM:KJOpqG)^gC2#hY8mL<2;-u24B_@*\X\,gNK]+GQ?]@J>&-bPb]nI!:6Bc7 +n%Qp4f\;THJ7qYVqu'/!-dl=59Ul*d`lU6Rg6I0-OP +;1N;i_iM"L6B5a9K>d2/,7f9IX0O`ikq1sLH&E'f]6+`!?ffrYHc4UYrc53ed;[WVU^*qbl#HC#?YrPHfXe7/FIqIhUSZ9X=j +6]HHVWGWQdZrj53_q#!N#;,(IXuokr:-**o%c7N!R#n]-K0NOV]Ehb]Z"pV&>`1a9FP,^&@eY=+QQ:Lq +LYP.]0chp$mAdN&N_Zu/46n^rMtO(JA@1po$sKa-hKs"B^9FpfW6eub-dkpA5'OCONZt+H3`Cs1%*R11?qG&eSPMS1 +_-qDm=6G6_Z@tjDR>clkr1=03ST3h!k<6_:pN.3I:tro7o!G&be"4f`l?b9Na8c9"H**%dL8X!-'i9:PNKk +Pc>s3\Vmh9&S$P/9C!edofmFigk4YPNJ";-inZa/.q$C-miZI+k48^-\?DDIclN]FN$1p]X)0-63"Lul +4t`QaGCp,V5Udd^l&\_([rpL"gWDZKTEYn,aF-8YW?FGdUT55GP?i,gTB19K@p8;tAtZ`3Q14.Jo)`@g +aEcPUF)4uPS+J)crl,]+(!bK&RLAg,P1$L],94Dm^ +*GI0)q/#5CBLFAs-4A2=mKdU!-U'\R*0+p7MWc!LD$g$E'm>)8ZM+0VOm6Fp7:5j([%MU>):[&Z:W1$h +"OmXEHrd_-Fj`"S,8>P'2GXnD4#oste)?-&qIJ)+4]!.c)!eQ`>."96?>;+Vf5n$s@W"5N;EYTc<VXNt]Xo],\qfH7W',M*r+DdV +:5m%$n``>I5L7c)hdY&TGgbRhpd+RUe[('P(!a3C$WcM1>l9f$%G2urjOnh[D]a6[?l.Kf)mDf4=iu"O +WD+;'X]O-,QKG/3$aL0rdl-%sfs$Jt/aF(+dL.i%K.c+!RXa9*:DA7< +ijL8KG8O'[p!jX$X*THR%Feb@<2f>Gcs5K.BX@kg,>nU=@\V>=>QLY[L^dZg4Dq\)Ud$sNELE/S^;A>1 +a)2Ku?/Z)nTFI"+;sUC6jW9#-3,O:TV443f_nVEjgt:_LrO*KSf^NbWZm9 +X*!J-i7WuM!1/$I2Pl=>4<*C4,.>6SlXFJFH;RgmFs1??HAEN[8%:&.^!&gDlpF3ZI@\c@c7HSerZ^KS +9KmeY#N4P"q18$mn2;HICWT)uOPsb&BXV$pTEhlo$"5I[\udrcF0r[B^DjgObe5DFXV2bgM+ekt#oft+ +&MA>kHSBAXU7->b40V&#eeS-]^,%NFrsW3PYmMHF_^T$@`o75p?3WplgUb4T'=3Qp$0.GJHtt\[Fu8^3 +f"_=]B!!_9$rfZTq&%N"Ekko'7+aL=B!`X0c:X&]ltCM"ToKfh,1+)qCi-Bf/2BYb%afd_AKQ$YJL=Ju +XMAcT4R7!CL3J&pF2^mFR5M?\a_rJR[j0NX^'nnKifXDs0]E&'5__J3op*'a0uCkt+4#Y@=L$'jPpa-d +2emoE$h?^^798IU9l0pn5Im1r +7),W+JS+knXfLS;>D8ZrHWpXi6oF:t).m,^SgUhmO8QA/*\ju/;Erb%hsc\lG1SQ!KcIVlZZ1[pqU3Bn +/"X$GOfKRQ2n[0Dt_(j#PE7BE*T/ua`,q$Q"b1N+!@=33)52G53oG\;$ +jnV*EOb9CnUAU-=n4/N;[^L1*aZH-c]t>#9?\O9S;27*q +D+M^(gQ"6k)f#k97@T?k`/kF +]e8':2e55f*V`5VXYGH`.1s39eS]/dIZIi*a.E%Vn;un8nAhP!LmPaP`VG3WK>!+2MR0uh#FoC^8d09- +$7:@198q(QrGohBL#+mL.d-)tW'dL)NgcLq,LP2l4NFAj:L;XNlE`S_T.]2U3>\lOs93l4Ylf#Zr1H!F#7XN +8G,XQoj1Hd?R8.oUR/\\nM.E9E99B*5=OI:_.jJ;?cSZ5oh-$%n%KH&i`*!kpk3f&Jkr>)gPU5/lgR"O +=C9naq'Z)-PUWlgO),cmW?@RqFY%sJcofluk&J16d(:=1<7E@K%t5b$GJZ_^Ml__&7I,Lb%24"P#FE^7 +#I]46J;GLFT@TI@W!Q@Bg_+\h:.<\oo&\CI$W[[2*;d.Bm?@BmT6lFItu?Z +Adc@Wi*eIiPl=1caaNY,Fhk[j+S9S0525g)V]g?YJ\c9oXAnD_#kRq_GXSX(,HX0)SN>BbVVgW'kAU-d +qF\ABi9Y`nk-oj$3UV,H`-0!/n' +^Tob6E6u\WJZ*HX4*W*SC[E8I&`6/$kVssBZ4O.Q*$`5ILdSTM^t;pSVX98S\+2>Z0-2#1fLSGS^FHRVSVe)-0L,>i&^7*ll,YRj:)e[`8B>-T?9I.t +=X`dV*nXX2rE?SN$N"E,acpJ8T?_)c`rH5adO_]Xr5@A#CoqYY*Te)qadoRT]P5J8?&:K;\$YUY4LRi5 +ONMWQ%jrI#0Kb#0Bb0AfGu"#7^;W*pplL7qZkaL:$(p@(i.HDpQP"9fj4m-aiJ1!3l-.tV +F5_eJV3b1Q5$29?B_bTCV_@)D++tU]eBYUf6\[84@j18RZqU5Nr,3 +n"[")X3A8<(>)*$XEa&>\_-AKNEY-8cej4skFYo!?d/6\C*.8Q>6-3'3MC3)h\UX1Vonm>_Q"!^F4I3Y +;Q"C5oNI<@pVMkdG=ds/>"S$B8ME2I@>(#:(bq;0Dd4'K9Gn!t@^;^e4phYD`RWVaaFM!(6_K)@MBTI\c5WE2ZB/Z\9Z5:$u`"C9:_%B%Or6F5=dG"EQ +GqQjJehF,&L4ftt5^7535WIY,76Jc@OeWM0F<:FQ8XITS"q0#a1Yhjr")$s"n"6Cjg]R?Gi]%>RKF!94 +0QopQoQR`?a2\cek*poW-:H"`O&j8oeOq:?GBSr&RU*Lu@["<[qpW?:ep'20_A8DFp/eTD[JZo2r;E;@AqEBLB!_,^Dg[C-G**`&,P +qgHpUTAQ("mD[#G;!d/j9tmQljDQNbr(]`\#NC+_+N0c-IPAg$M(NBE>rR+dkYci,o#;uZ$13Q=&fh5i +>!'dMBY'1(8=>k@k>C"4eMpgs?qhNV@fXo%?[qpf'0@Z&QTlB9G>VAqhIt_HMlj*fn\'5*F1b*=nV3W=L[UoP +gZ@E:<67@u`O<-)[FfBXVpJnbEAXB.Lf0-W4s-o#`O9BE>`^qP=JF/OM0dUd?7iU-heU;n[<1GrJM%gK +6b5D6Af\NC,,F6>&9O,:T_P/ +:lB=8C'@+(MifWk`CMk$Z*jA`csgcf]2OWi8P4)FZs>8lFFPq-6LL`ej3"#1He/_6(e:'!N0mdb=5@Rq +mX1fG,;#k531&,njS756lb#8rl'Ag*@\cq;Z*e^M\(u0r/[dS1+19bLh/Y.r;Muiq(0e'E(SA+9`=c%+ +]l\hLg!*"ZU)2o^`,Gn::TJAf&%_/1>OT+/,\=2H,\9;oOufE=pp>ob4pGYlIdJ*;m%[i$m2P')]4U^5DeupB.Ii(79,-+Ika$*c#J^$jZncg>!c]jp +DE*8H0dq4P*u[Pg$/euOK3H=J$MbQCo*f=REj5)CBJjN;^NI?>d9$eBd-p/QfpBVYcA7$AZ65Su#R +M:8DWn5Z0dmZ)0dVsO_JP*hSCO='VuM][R=>NqS"Et3%uaGTcWR3TqYhpKf.G/fVTNj44US(/+\Z(Hr5 +eU0%$Rpbng,$IpBB-@M.L@j"%+HIS[:@@JdOETl%7CHigB=i'MSTqSa5NOs=N?%N:;%\[u)`8OO9b<=q +V/O#Irk_r#&1-NEat*hlR2Y)?4u\K[mhe98G"Do"ki;"\.AL+u*&E@cIjGgSDs9RT]JQd"($V')d\#t[ +ZlT+GLm/q?p*!m]Z[X9H@dq+`13.1_WXF]ng>U:uS=bP*$lppmSeQ"B6n!@oCX]Tp#Z7q)C[TRL)Xl5D +jm<%BN?t1HIJ75Z*ij1gT6QgjB`k&)Xm!7X7BL7BBM(Xa&@j?`DRt1;UXani/>A_;nnA--aeoTVY3uZ*%fYrcp6BB_)KJd=H +rS>dL1@EIBX2ahd;ncWsO*]n\Vp$jJ53j(*P3=_\,U[/a7aCP"beSQQrA0OqPHsB\4\O*kI!+[Kp&6/[ +"n:SFT"7e4gomfD>>sD$H@$J0?:hKB]DFEcg`7r75pp@emmjgjk0(9_E`305S&&;PH)F^-ZZVG#;9.bg +HJe'te#mWFe[SPd<,#4%P(fTN*mSaP@3V5Jcegg6Io&339m=#06*2YhTMp,qPk@mSmUcF#?#TD)n.B)&&t*=,<%ubD3'UKhI*@+g2^cVS +aAZjTNL0\1]"Iom,TB)AkK5!`&;3A"(>I,4aI__&+G>%PN,+Bl&f>AO.O=J)^8^E-ESC['t]JKt"ET[[HcQYT4e9/ENEjh"/5QtE%Gp7B(fub7O0O5s-*%o +@#&e],+1j*0a_j,iI%<\FO1DY!\lq'+V-n?G0l[:5Oc]&+6\ +?+EueG4>@6G5JD`G8@6`Q,ho-NfqG6,?/HDYKZ@9fZlW`_nF/4G,T=.nQlq+KC:Nt]j)Yh +Ff=8R?e">d5"nfg2u[QI`VrJebMQOt415;F`dPV)ml7XXLbu0APqm:>.bsK>8c?bVf1DQGG"B7Dq)+5' +=ilCj=oA-S)Xbp?#k/@fjIfal3X5p_[Ii'n+PN*XB6ctNd#,#[2Jeji+VuuW+RnZYjB*Mfke5n4gn(Q* +j+\:s0HN\oSi=Rnq@O]P3*.NX+,Njohi,/Zj]-12)ofpm8"jdt$Y3.]_dqRZ<&XKOh0pQX<92K.qe\k_'K*crXAd\c;!BnJ@tX/!<)45=9: +Tp'PqH;FRd!?+;pD#7m_+2;WfWno8,(13=IM]NU:S*FpSF^NMlNjS;o6$+M[MgApo^d$LXHi9o?B_Ri2iWW`f:QF$ +?gh!*&\_H1%i[/7LXbWQb[9@q@D,aO%-stRd\cX9B-u*Un+%f$cD3V<*5C?GdXU<&UjD[[(DItF09$SY ++%&+X?OroIFW8[H1Xeh]=^>4iITc'NL=Rk<0V`YOUK)Ym\Uf"Z8;c`/1:.@*f'OD7;a6LGZkIC[Y^=0\ +Fiu/IJ/DF>5'6&gfV9&sm.!JI%o41a2njA4$T?e%P8O%-2;EBACOr8"9Gc,/j\u%Kb.se0E2RaQqqKK^ +0O!5OZ\fjQZQHgG+g8AI\$[B?3.1%PH!Y>p3Kmq5p22+cGG3'I^BV&u37`+S9fs0^B+IN&fo1k_W\*uf/F?0UR*"?XUc6n]]h%e8g_b-T +U7gI,O,tsE59aHfl+aRM2%k@T;fj0oJ1:1GCh+4RFs>!-qFjSk6@&F?@J?0@"[k+&PBS4`]Cn]b[.,"W ++V))cjcO^j;1DSN5el6f*4+\t:E6)j@>V2FBnVNENHOO^K9pD)i"F$)KFT$.rd0&RQPSZ7n(qG_AC#Q^ +MQODg=+1;-_VK>Z\@A>$nlY"#2s5h`&k2E.R#(I$1YK!Z2FZqOV3t)8_U:u8M6Xbl"-/gqg(sEU?Q=-M +&V\%u;`^QMQ]*@%YNa9[-D-uj+lj&+SQ-P3Z&d^/kSS=qV+A +M&_5=;nM!V@k&Z6A!>Hcrn=o`-P5rW#GS-EoITa6'8Xon@DGoYSV7D6/ +HcDW>:+heA'9*aIhB)ZQ94.fUMJ9`9L7:ijNG:+";BHf/HGAqCU:FW!I??Lj>,$VT.Iqh3W2IoBNMF<] +Aq0Y]jKG%6)[suDqd!(<88G!bVYPt9ZMaoHJS$l)gSCJKOhUdhQ+u+A2uN7;48KMS)*,@fKFrF+hK(XH +6_Wr#3i+.>fOu"^ZO6BfVRM!(%n*!oG;S3m38%P\S`jSqr7k%^XN_CZB\CZ*K/SmbgQ?strRZmj]N*K:ElZ`k*:bZCJ)[i +fo$LRgsE(M&*+_;PTUX;Y=i1>A-;%+"ka\QFhsWS&'+-_Im2uE"A`s=r/o;L)AQ.Ze(XjSUF8b&c^FC@ +'.3?BVbcOF8C&tpl-dN:79/+7kl9fjmfp>FIpZHJ?%=C.j5qYHNHuek +],?PAi]Ym40iHpK[obCE!dT1Rk1q-t;>C2:@s3qs0Go.j]UOHc*9Q&WrQ1"PCn5s;Z>`npJ[+i%#=u[2 +7a*j9f"`@oeEEk%a&7T^%'uDNp3[]GlLKA_rCq'4W?gZ35=qg9j] +B(3gGjPh3W@-6:(-j$K_)k]E`GOr1NeWl;>_L)8mhTa[plO6frbo>[pBraalF`MIn'oK]jnnnsCFVCM&SGW1iWDY!&/>MA+3 +aLf"?6/ITIJ\2rp&:$4us.@NI!PWhiX\o$fQZFj3d$;MWBTRn8^hbPDN]UB +Ea8']pufo6\QUP(@A.M4h+n%mH$<[X9M]oi' +XbcM6(.6s'eRHV3OVU;RN3jGKeRFBu8*eq`+r;L7/X@flfG59fUk??a/9/`@j>TVf+i!)Q1$%.]gE?M_ +H4%2$=,VV^C.4_LZl#``[2AIPoNpV78;eXpk%ZX3h-;POG%rbmh+3Io4/p3O$YhEWRRg3tn)e@>N_Z^m +&^k-a9561ZNEQa92pu0V]=D)RGrO/\aLdQM6f-)<@c2]L0s1q"Z$5$:GrJf_,mLhYlA3erTZ#AiTS9`i +k#-M_*1pCCPf_M$jP<@bJYpk)7&e.k/AT)7m:rmokKUVa[2AHLYki:p +bui1o1[0ScV7`9P-$,/JJbf_reej2M@,B.qR6(X&UXnr1NUZEco)uJ/raam1=Bm#DGt9jSh-=*;]UKLe +n!&#P'RsJ#XY>pQ:kBm/?>/0-)_9o,imbQ\V"kN@FbDtujFmVo\5Z%F2WN_%o*:'EiTN5kVN?"C3FRh] +3jWk\je47YWC^U4WSG.UZ2'YR>#>)=mj;8808.-OjitC<qm='FIapNA1YTGrJ!<1@HPoNLC!\.,%8C2t&*j0_n@PUeTRCkKUWL=pK=3 +L=7gSFs%UifNg@a1@N3o8^4me7lTl@kYL?sA8BedcD<_n&QR\INLUGSo\@(ul_lM6]Gp1$&P[SaIjsjK +g6B[TO\JD8RkiB9o54a_jsE;%<;$1M8*8Vm#D]_d(RTAZ`*ueNIuI0XKk)&WI<>VOX'P-J1)gjIB.a<= +4@V!1=q^F)i2**%$Fp:lnK\:l^i3&&Gl'3l5>4';^u'uG2C\-YD>&N2.`:?=^Tl?H^\8iF5%!Mrpr!>[ +*<*_N`J@bZAi?p"&2R6mY:etf1teoa\k^LgN.n1d@0Qr1TUEb#qCb16PS +oGt$*c*9T2S/ZaVrnke<<*QtSXO_B#dq%pN)gSTTBo9d7Srq"a;VfE8T]jq"oIMpRe)gQ=R +hgmsHX;+-pgXP#?QRKHXkA1gpA`SW']53WTe@PJB-3rJBqi*`<_2GSAGgjT;&LDb.S?o.De(pV8qMaI$/_aqd<,t7H?IDAgT`6MBDX]eh]3`?<-'s.->a@^6eDR0bBjf7dFR@:tt]iYBbL? +c`r4CjE[nB:j(dq(6RdY;BBc2+"KO!XR/ZCk@>O.IORH#qd`-VVr*Ptk@9Waj?X&%n"QrYK%nuu +H&`L!=2h)sT_hs]bk`>1HkVH$#Q"%Q,0un4o)(9;L)E^'cW@LnX>f\irSt4+(1$fKd5C_9(i+oJo:_ZW +]7'cLSj.=]^Z!tho4MZVhVZCq/$&t(>]D6QQs\?HZ=P] +r5%JaSrWsoh;rp]Dr`nc`i;NW$*4&3D3*'Q7M0h.@7P,T_$K?"GWlsiSt6J4=(cm,g0`q19Z.=tPSbf2(F6g+F +&:&/P<9_ioS$D(Zm)L&jmZtS8,uUn"OOhndc.X +HR$l.KTOhf=@A&.l<@VQTcQ:*Nb,16>#rB-E[/oZj3,O&CmBc:G[\Z\>r"=J?i([[`3Kl-c8Fl+7r1p! +N1j1Xbnt!86FlX/f!T]@ah@:=Olni*A)qp,\1p`\Xb`Crr7StbI$Xca)gRITs,&qJL0ESo.5p=K>(,"Y +l)\(\Y-]V^hZT`fEus5[o4M\4F2Gn`A"J-(niY7<(p>J0fu1Sc7\3hNcc!1?n>Bt"iO;T&`+hanks<\6RbU_MW&DV4[TRSr]Y[2rg22AquL@"aVe2Ok(IsD?[/],ubrASgGe&Qi[&kpH"+ur@b\: +LftbaPn7M6@a&thG#>E0`-*BOH+q*c?-$A:96nPO;P*ElfHJXdK1K9X`\\l^NO>NP\"#OD`ZI/1*#Ao3 +npDFZXJom,flNa5p!k_c!:3;J6l5&lir,mhT)pEXsj>h*qd+WH'c^)@i,L;-R`j$;08DjEoqYUtgkPj>.2tl3"Se$H2 +M9,9so&?$aWJ)=MZ.0e=5%[9`bFI^Gk`]#:k!"rU6)FLS`#EluBRukC+V!1F[9a_UJP$ +XGb!&/A%&-Nlo8cKDH#S4K'&fn%l>;c(eHb.MrehZ;XbT)0rC62G32T8Ff9"^QI^RXCo[/IW"5W:+9dE +@o,Ke;CYF$&%n:<3"CWR"QWJo]hE4qLr%UuQVE?HiGf>`sNBGg,%a[B)+m)ACP\cdIo),(ei2\nI +R^)u%a-nnQ4DVm[T#buDCb]g0Gq`0p_*_^fFr30h>c29hrVtIY'H;n;2CJ4]`3VAO]`#VC:Fi@R]LN7K +=Z2km?W?"1G5qP^[tT7`M2GtrIrI)o*CFG1j.D141Jr.+oseMVT3q91;/>ZH5%5#:n,"U.+J7Q_5-,=s +&[quime""P(f?aop0bge0"2)&l@GO.&+i'Yi8]13"5N;)?\j[1"bn4-0ZY>X5`^^e>;--\cS%e@BEU*_ +4>IWb&"L?dCmH+AXADF#!o^Vr!9(D,R?[IBm-)F,(sWQ>]+CR9:MU(djt@rbkBUtK+9h2\g5&KHp*"Td +$[9*Brisrg%MKi\:h&Ab6:[_,(+sQL]LoO@4F8,[4p-%qpd]\NS%sS>N"Y$L6,Tp;(':R.;b-FhDXKXd +iQV:g,.8#^GWGcf*q@*)0oc_l*`V2pe-f#Fa/qhs3J$0_*PEl"Z/^)e[g0$"`iF/c".DKJ$ll7,UCU4^ +hmrJOei[Uu4r\a_J%lPJ'"Hs`'5.U8#'BXp$N+DK7/o?1"c>Jqe3@+j?QI2NRXR8C:h^R\\Vjf8i5E'S +^bJ-O"g>7Bqe3*%Dt9=XHdN'$8@/>V@U2DBiGoZe'm[TOOd>*RSS0m^3jV)"6!as`gH,+D6u/?EI\u

_3.066!Nt9Re3NCJ +KXlp5B'\)7R((1M2/d9epVm5?TG97hpoL8p7=P\iVbQi'_9j$3MKd^&8?nQ$%LGIYfAWDuge`.[_1qE3 +b\1,5%8rnUhZf-r+O"01SXe*Fp9(YKX7!K=SI_gBETMJBoW]fCjL?$T%./&UcW01kQJ'Ea\En<_G^tgM +g=1<^_JQ%Y%tF'a^u0-YLH7)sm#ESA@])u?RhfNOecN9KJKYVr/$FWn+]W[NiHF&-a%Xl^r,>K6)m=bGkA6D>3JJPDT@Ved7Ts6L`dQh +$aq19Vlt&0PT(c1,J];)"eIl=*$I$q[-31]gu,Zkq_&u-MO;a;8_Fsba[Ff"=#u5E1C>3gPWb1J6.t9f +G#FVS.1;Z1or["q-qg(p^"=bqK0;ZV=YZ\Gm&ZA*:>&3Q"3Smrqa?[>l;c$AOm-gX5c%dmo[)8/gQ(!CZ/K"PB0%,']`@X?]g^GO]L:A&UpY/:ZdLnAqWVK$rX/X`/dY +8e*>D+mm".XB6JHoIiIHP)?/C\IbpTYWN+d +s17pL#@0[Ym#jE]pXY?4B]HG2%^\j\0ogiu3_-rZ3&W(e,APK]ncdcdTgmL7;`rQ>Xf\S5O/EH:i1!D@ +-,26"H834slsY\#.(%Eg@1EWZ2EC1OA_f,p<\EX'C&\fg*umqNNbG9NkRr#4onhRoYaH^s/k/?&1':7l +):R4S1m?8CRZ@X2FK48Fb-//XfK/m-jaqBppJR%CWsejF*c8uUm-b-!31;Fg1Ies\8s9`(1aSF8Ai"B/ +jZ),o_*?j+XtFFnMd;8..]_I;F]WOD[+MPXZM/Aun-HDRc@%4MfP^0fTO0eTXhMAiLTa*LCe+;IBsA[E +!Rao]_1U(gl<6kP>&6.!1hj5NTL#6i +G([/V(>BjN+YED?=%R88#C$AenqR]4[2.t8lYWIulrqVsS*$Kbp.T7DJncmFfUf(ZZOB +fU`oh[+Lu.!GSfUg?lKfqa"_iT%X9IY-ch&Ybp(\Nh@0B?13I_qk4pNVe\"_LHVWUG(YI1(>D^/>?]5a +;.jXK?*R%e(>BRE*a25f"'Y&$h1QQu'E=11]/[<;Jo8qE5@`UBd:,:DWI85.8*[':+@i6HS20bS/L.[U +mcd_Vj;9tX`HG&Vmt"Yl[+Ofn(H"5#;N'oh4U!G">e@1E+:ghtm=sGU[+GUh+ENREeeWUqI:/V",A*Ku +IYCqbBMjB#r#Jo>oSsqon2kOV=9j3Cc!+9c*!P"6Kq>eAF[Xo5rUq+2'2eGA&cK[$g!5Z_%U%oqSpU,P +3Zc2!.bl#()A)dRnGC"JE"&0_:+?p"nsckjmMXC!^N&%'pORah_EAh+/jT&4*7EhCLJ3XJr3gA`qB!EY +-U!0tg('r8Gj'86o7leCa-5q)OrJ&,G(f?9f)T#h]*,/!&cA._ZW5Y?@>>OAXg/>mK/j[0Y_$A"m\Y<' +P5Yr@[QJ`)UQ(D!oCdFL7P+CoDh$f!1OpRm4r\O"p=V&5Q4ik-iX.>g55uQ4eDu(_CU^VnR=jH"EXpmu^firmH^p*sHG4lBYY.Q+KQFA-lYe:t>sHfu@k[YC +5=(4Q]i0hiGt;NiC8=u)Nd&6Aa75nT=njR*8K34qc4]tADtQAf#5:J4&GJEY$m2&O^b^@uet:,Yc,J\Q +ak?M?B7jLspV@md#UcuW`+h$FPEI`-U)-e/,.].^W8I.-#VfpIi8!R`I"RcB09t&cL=7D4b?,PSJ)5*nap`] +2VLqY>!"kO2%Y2e@INU#h*rB,325$V7\C5AXm=XI:O-a'.dsj-NMdI"1ZXq[Dqi[NTIGN:M(2Q[K0.sY +9nKPWBULitE.!CP.n4hqf`kIA[dQ,S))K1])2S"X3IFjh1sG7L[mpi(:`ss& +2u8J&[*gR`2+_#aLj,0W7W5P`Q_]*58'jmL^ZFmI53qDsUgtX0dQ3gg(Eh)$fPMYC$)Me*8A=Oe?D7ZI +k%#FOU]gjW:%'AQ$$J1sY=56Q@R_R&o8HYipG%h>=)p2D%mI`E3ht!-RA'q/jdC5_ +TTP9"JZsGse!#S/k^D_^j%5VanF=3\rt1B64>^a/L_Shr,";N/7*7e.E(6AY0<4MS]79j*;)i7GmPHo( +^g<$!oljfe*U40,"&t?Zf*=)r2P1M:pO1rN&DcsR4n$9k?2c)B?ph82%sS_g*ip]ZM]N.:&%6Y6m(nu/ +6OuAp(HpCkniq/HrW_N]q8&(<49Ig+dui4ToDI9/!4FtPZ[!@71!op*DBDjgLR9[^L +$TobuIGj#=Yb#Tj?5Q^WXasY"4BnCXH4fpFY4m<^PAfn[*'3*DI2daiLQ8W[0,(A-d=QdZ4V5<2&V')5 +;'t%lFjTmRJKc01_*MSiC +)6NXDlYMd9h\\ZIL'q1-Z4=go!)gg%[uNY>FOV]lg/ZH[Nl^YW^ls$'4!d_ILLF8q&KBoC&?k;IE'XVF +*-rP7X(V[oZIQa;pnb*cdK5kkgr6HlE+7H&EG%eg]*i&UXM(aDlV52[kNtXU.E6OcFB!h&5Kj!VX)g:m +f[$'"Xk`ft'<'sHW#n3-ks[ricb3A/;6P9]/+PO(@N>UmMU'&[M3N)oj62:W_4&dK66H$cfGNj10_1VQ +2b++bL3cCscCFu:mfFspW*P`$k!BYjBU/T>o4IL=4LGV +Nnl&S8BYi2="WU!d'qKW-i,bhp,)$kO=ma7$]0,L +iN[]7+s+BYE`gWD(^&A42bMaU_-V!NqrUb658PHkudAP_%O:0DD=/nGVU-H_o4am#&/6G/OG?$(;5*j-\` +pOr/+V"NJ[r*?hWgL]>\AW=?$/BA?2T=;H]&qt+6<7Dd>*9ca1mjDL/ppbF4"CPc@\>bpO!Qj +.1hNo-6?.@#>.$NiU=R@M)Y]3E2@b$Y0A<)E:6pqM4p=I3]*Oc/o'eR(@apnM-<%2HJ[EVA`R)ds1q"B +e1FN:bW,qH"_u*6+9#Ks''#AheItq9OOI:*)H`X=bb28(`B[=mqQ]4*@Vr>I]>_a@i1b^?g<6EUeVEK4?RuI?)uKIn+s#rsKcf[BCR@77Ngmlof!A*IdcEd@(h9cjK`=,W1ne7,4HC9_ORcDtgI]Qu*lO=TssbABCDMq-'Z;N')MBCXhQ +>o?hIDZ5f&X<)*qC,*.qMcHi!C,+"'C,,F6>-+l.:ITuI7uPp>hkJZr?CR96e7(_O/M.`O8;dYO=,R7. +DJ?@@;d(aJHR<%6rLq1O2!RMj(?9(,M\/mG7Er3h@MR<@[9/]1"5b_FV@Lc$X2R'e\$]HmI4 +Nea7*`N&Gk.p$#e>)]!(+j3DbregA-u=k4?;jcs.Edqm8=6u0d6/@]()>+(XW +/fN`Y[Q_*:Rp9a$Gdui7^p-elUtlWqS-\k4q072E>4:YoUeW_gEH4AZf7_FeigN0EENd7L%9am61I/^$ +!GXrK[XPTHMA7q(*[09B1Y\RX>%`mMdS@EIfuk%g*7OSG%?t$FSsB6k/$1\2Qi;P0cgD>?K5Z8"MDG7q +ls?iCj.+r;p1LUJ]#N-SV7Ss33)guYqfNqd,1]#1SoP[:mBnm#ftgl$\%U&nLh_222^%MCMJ +YNf9e,M8I%[gM+cb*Ef#fq*]]<>]-HFPU0@eHBhoPl8=>s=T+XJ6UNq@S.-uDSkO6nH7b*Fr^?"C8>JG6mZ +P5=B$#M@3aO1c>ei:9k3#;>IurV_.Y`aZllqRI[Der1?NAj5@0fX&NP^@IU((*2;5.M2G+.Rp@,(3Na/ +?i%56o;$&n'erl8iVTG$:OB:7Hk5aR82\n3.,Che-m-&uQM-#5qN_4T(NP8A[,L:`?!"ljdRkJ48+-7$ +<.FYG5U2u*Waj'JETE0l9<+fDlSg#;[*m^_07=]E(cYQjVLT26VR.enEUQ,5u4_!t[H!7->7N6#3g67lg1H2V8aUWZq)fl: +npQI-pq`,^ZpER;6"c.)D7o(`ei%k_p2>G-@!;96htQs$"8PpK"7,uYNugF@;aa0H'@%6A]D',TObGsd +jSuuPb0OOd]/]!P'jf-]9Ci,R5I,(ZYENs0J4D;J8q*c*HI0(Q'ntM6<6&-\D.PtI0U7eBhCK'Xa;JDh$6O +.Z3p8\DcZhc+pt]Ll.t$\XL=bUDI6IU^V31Lijnk2@eTM2)lf:"N:&/?:^-MZKP3n)E.54K7a\r(%U\o +p,o3Y0fogP$"XlE'4$^(:nm;OY)J/>rEM:DgXE)"K=jk8i%NH)KA/LX]18H%XIPe4i!(7[1Jf78G9Kk] +hq%5Y9,"4q5ps#_l`#*0fI-b3lO:j"Vh8>O;/p)'mg2a"J$E;hW-;+O>e(Dg1a\4d!`dY,cS)jt#"4M. +)Qs(SJISp$X24EfH^NGSH&\VEpJPjc..n\7X&28C.n#o\^87[+7OYV7'IbQL;tE(439HGe40_&MQ,#WUY-\eK/LKhZKaYMbYm%l6#N,O#jC;-l"7]%>0Cq+P +S:hRam&3:W%b/NRaCJ=!MLb`B?1gtpYs&l`2l[o2F,.D)*&P$[WGWJo9[q;g.]U&mZ4tuB('1Vea<&d0*q"=,hiFQG1GVMH+h]$]G8,AL3.5a/cM%r\2R;9>-FW#TpT(AB`O +)QF`J$`e$.d&aqth*N\SR_)qD)W4P[FBkkY4B08fINY_6[mU%%$]\A,gB,R_8Vn15b1&s25OSVY_1KWmV`lR'86#>"fAhZBo?o$$#E? +pF>j0!jQW3cgeTsI@k;'P,qGKIp%9T'*m[1MpZ2)'-Ys19CpjnC&nMWNs8;+q;@A'/Ia,`OjVD-<@Y]( +#2d0ikkX$tMM%e+QM'tn9=@`X\*F]3Lh])4(8F_oa^%XChHH<+m/ +K]cQDjeQ5@T4]PLbqNZY2H +j%6Q$n_Mn,h+CZ#h,,E^g>X@P,O-_3LGAGVNn-0>C0Z3a5[j`LQ*r#Gg3HRdc)9bgH=fTPRHeoaC?3pW +;,>3G'QqkG:TG"BSZ]t6@.quC]/")Aeft$Vpmn29Rl0p8a56'9MK3m=)R0,6QOY/r]J^`3#? +K1\bs!NGeUHQB)ZS5`GppE>"1s3&cB`*B_X3G3H2(^rkqZJ +WF9e`oaNak2np2N%X]\qTYs>u-+Cmcd[-4(90/.-)\(()DUh&,a(XhehE5mV(eCt.)\mW!4SM""XtWq] +RDeP8I.Y9o'H/#WSU,?Qr/QYUNo,iK1U]&Kg&o@X4a"Ndk=81(BnfikMcIB+bSPE,\9bU3fPdWL_E^?U +].'A1X46[FeX/XoT(q-ShIWJUgE7D[G!+uFh`Y(!jc%b0WQO&9B4[(lGojnqU&N^Y^H3:YCJbUZj+!T\ ++7`q^^Dl0FddJ.$Mj9lpVcZ&7omKh%W`&Z;RZIkTq0Fqu5F]j%)"m%$L6m'5b/nNhr/Q)FNo/+*gCV,h +R2DZDoo+V>[LG%GUZbZLg\#,X`jT7$WJr5Ddm/43\n,-$SuHq2]sFXrQU0?aK9uo6]CS=d['cpR&^=fl +#0![__7_Yo3C!4s/'R6bLu3b(^RH*86Mt_UYPuK/Ag0Q0<+.-K->$k+F%4\.<7Ki4/`MGQj;1)G(&&mg!NStgDMRcCl)ff\[Ktb +^>-G'I)`)J[dXfrY#O!oFtb/s_9?=c.dQY_1]E/Pb\2TRGPf&#LS?fPO%l!8XI.;4o_.E5BD2(28TS+: +*!XBnaY&)AAK=!92XDg!"8eRoJ]7/pj^E[\gFGMTE,JdE\YD[G/0tf7]l.`S1$'#5lLQi&:5>1d2:IC +RE^+2\UL5]emgqMM0F$:HG4d!3B5@%1\,G"CRPp]@@rE8k0^&Jb$"E8jAD>k83`qqK>l8QfuNqrJc +p_>ANaXAc]:rVRm>N9@aJ'L4G:-M[AL+RCdMh6hf#/E?gGuV0e4nSWiDI*]`LhaU/gKAW>c0VS=m#3(l+Be35&-@!F8,q;&ke;>,l-Eg;1E:E=(P0- +Bkq+o`SmSXcn^B;3\nr"?KcG)(QQ'c%pEnIg,g+O@aT)Un1U#3abZ +$PN&Ois^jJHL5n"bBU15lrJ*#W5[4-%NcF#k4@A:Mk?trA7'EB?,aI/_oMFe%Ngt,Z8oR45[=jAUU]ib +W$QO]fqT&&b6jlN)tga6@g"c=bY*4@r5!ZG_aj+%AIbotCR;q/osJKDIjB>aF81jcoPjT%0K:'OmL3** +HLDg:/p*)2:-+!c"l +4H"?N_hTKqF82-]rc%Xog@=B\OCSTQk`^-YFaeW5`;A&eM?KcJpC.&ZT$/!O +cK*bKeG,\>IblmUPm\L%h`tZ_a,2\J +K;N7\(u7"CMe.%W.,(;4E[@Q?:OTQSSQ#18=9MNTU?hab.sU]4Y*QhtFabS2JOi*[[^;q:@4p-"7tu&h +4V&T`Y]tP-"m#'@)Huqs=(dQ"fr)!1]>TN27mnB2S?Hkb64/sBEcb2Sjop$6-KN:N\D"s/3hPR\#FBUX +>1Q8[*7b=omrqDgb@CO6gV;b")>qY#Q7Ma`.`kP`YdYFhBYL,95OkP^j9Im"/^"q\N.!]UfKs([JnHO\ +gCC7IZ;Z$&0/HCG87%>G`/H;?>]a:9a>(N`l^=u0Ce*&ZBR#%4[;*Xnc6N+4[3VAXSk=jS;:VkgGY>X$ +:ckg@E`<+^,-gH,reMPblW[Dfo!cMCfg5#.'#0X`7An"+hIH`,=meR5)_j!0gE"M,Y,7h8/K3L6W>[[5 +o]i*02gVL[jiMRDs6&=Ao9==b5XST'EB%h@S&g4:'Rk0Y0BH$4Mm=hbJWGSLp04,?.Y%Ie*^`7eF#HO! +M&\X9nLFK`q^IUNbNt!.H`f6k5#43s*?W5@*aErm@V&&FQYt+pU>,4=`&UUN^!b-M>7HhU:Xj)0*1!Mt +RdHcNe*@mM_XcZ4V8D_grPUdu0qYnVFLeB0pF:PrL.Gf$V#=c1OI#L?-3CA8%=du5)!H?nu= +\J$J\/\k7E'8],-Gggf'D/#N:ReN-Aik\eWq:%.66;-q9S5r[5.UStUdQ&W)]%iM!Gk9l25`BA9Nu#E5 +L;!8TC!4bG/_hjO?i4/KRS"%'@I7Dpgmr=p5o%SX!YRSNGF\hedX4 ++[+)?m"I:R_V9+/Z]2go.D)9WmZaEtVIajG.O)l_/7EZQ=GZnC:Zd$J'.h,>.'FU3ZH\L/lS$2lD\LWcNg8?<-XZpp2:DN$2OK0Ps\%q--uXr`1(@7[r&F +nsYmaHT>cH7g$O!1Ykf%QKQYVk<&6jN&Fl*JKlBr^X;RbnocWq`'j`koiZuHTJJNPX/cdjF\5p,*,c7i&n1HfpS6l +$RZ%#"H"bUW;M*@9tL'=s(6R?[.q`-T^dSVf"HVNfm4rhbP?$?#:YL&LPhB=i!@MJ\84M&.j^k8]NkU"^B[)E9+1H3Vg3>n52U^uh9 +h0EX"c'`1%pY0\^f*89GmT-*jA5NgR-XnClSbKs'GVT11..W]a^OST?Y"`!._3tt\",Q'>OPVGq2%$p@ZocXJ_4NKPe85>@-ueS +)Tl>=7]]$@pKii-K](:K4.bJT4,hS5NOW;fMRLpGh-,g$:1U8EO"g86f2f0CB`)PKc?NE?1gnoas+?du +TQ&k63cCA;EK,Bfs#0RQPT.<2B]p6V?dBdObl!+"p3@+3aQ]>`eU?O>#@;cgE5XdBPmM_27PAV(Y@_(r +kX2MTDQVLg3sQN!l:X7;,6-^cr\gI<()l^2gN-eV1tKggH_I2$0t+2.PukjdqN&k7K^@CComH-C +R@#"ZaL"'&R[^t[N?Wk_#3u)Fb3_I=hUuEua'[-=l1FD'?09qh_,Y%pa,$Vid#R\NFiq%WUXkY' +fc[>8@GA@T36U/:jg=WT9"/HdaP/XtZR6uMG$,?VPODn_FSFfY_>fH"[WSEi4K*OJ/lq[Ykl+2Hhp!-@ +CXrsD.,gimKH=VLPp>U[N83du^=n:j93,_?/Q00'Y"Q)j*$]LCAHTR4NB)o)T"7YR&YZINd>mS4p+q$P +dY9*LcS("cM:TA.H#SdilkT`27t'CL*S$^/T:OL-+7-#3ClY$>S;8mQ]RE*VnpcqT*Xk](skm +99q%i8"IC2kfRRm.HGS^^Eg*ER55CqQHHm52t+pTG$+X9IMT1M@24.HDbA5=LfNPRCIE&0?@61_:>:>^ +O+]Drr+b?Mm2jJ\0?TN/=R2l6r_a!Y1V"m[)Q2phCcRVtaOcWDc^>!:?J46'r5Kn:9[SsH/7_0WOmU/D)jt1hj]5\O1TIj'j@!#6n&RmJ^/gd8.`mVh]?D7Y:,L5]OG=8K9lN5U&8ujGZJ9Jda.e+[n$3O +0<=_::=_#II?WtP5"P&00OK,Aa/X7+AnRC!:Wk4.D)Wr>O_5 +]G`%r4+^5Y+Ct8h"&hr:3ofGb_:NPp;X!e":iWqC2;W;]h1HUoXP/gJ1\e137hT***>L*!)f.Gs*A%q?*?@q0VE!Xh/);ilZ[Q5%,pZ^F +Yn*Gc$n8?&l##jjkk+/#[,MaQ/4Smr7*_Jg=MD89qg+idCc1k^=_f]JnYNQ'!JuP?FFL +?k[gd=gj@g7.F=?@1I*4Y-p)K1N*".BWS4I_Aq^-Of:s"eI6"E.ahr?:>FUN@$*H?S2Vhk5]bp*NuAh +TP7OAhWsA'97iIYY&33hp/Us.8*I1P88O$?/SE^:q(B!%%"T;r.-Xqb<$>M_7"8XZW:J7eAabm:oSojg`8D.9,hXEWpdAUT]GVc.m/ +gcNT#hX0uRrnAam43<`2bIU1:F\>)H1`%kDKdPJI`\c?Xl8c-^OHV\tW6IhN%T8&Vk%1BGMl> +&u0'GRH*P681-,iUFH*;i$3?5:U-.;Z";OR=>H_Mj,Niaa+C>7D"s%Y,V._oR,Yib@eC7,h%K8nml%Q@ +2>Y.dH"CGRWm;nECKj9f.N]X'@MZdl@cUlNL\fa]_F5eC8P&6S`+4)ET!Im=ro'$l)q%-9ZD>c,1HB/^?%+6(Y.S:9gabOSPntnLZG/I"@ZoDL'iJTAE,)Gt\";55]Fshp6/M3V,WtpeDFZU3 +f=bW(dJn:`9P/l-`S@L"HR7]V%(A^g#]1Ghjf7b!.86IWkU$WW*E9B;[l=YD3h!'>=3H"@Qbpq +:XSSr`\HqnN-jht,1/s6l$@Vq_46msk?2J,P`6hf!rB +_o9;Xp]aC_#HZ\*]DgQGs85%>^]!pl(6ZdW~> endstream endobj 7 0 obj - 138678 + 138709 endobj 3 0 obj << @@ -1801,15 +1801,15 @@ xref 0000000000 65535 f 0000000015 00000 n 0000000315 00000 n -0000139422 00000 n +0000139453 00000 n 0000000445 00000 n 0000000521 00000 n 0000000609 00000 n -0000139397 00000 n -0000139876 00000 n -0000139592 00000 n -0000139631 00000 n -0000139733 00000 n +0000139428 00000 n +0000139907 00000 n +0000139623 00000 n +0000139662 00000 n +0000139764 00000 n trailer << /Size 12 @@ -1817,5 +1817,5 @@ trailer /Info 1 0 R >> startxref -139949 +139980 %%EOF diff --git a/images/events/event_man_arch.png b/images/events/event_man_arch.png index 61c8d7255dfe663247b6d21db6f368570fd5105c..6920a18c62b0399f01a7169a1cd7aed74b284ced 100644 GIT binary patch literal 118589 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 literal 71832 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

57b?fjoQm3O83H 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 Y_NLHOi$+i4r^p - - - - - - - - - - - - - - - - - - - - - - Example Event Flow - - - - - - - - - - - Event Manager - - - - - - - - - - - Event -Creator 0 - - - - - - - - - - - Event -Creator 2 - - - - - - - - - - - Event -Creator 1 - - - - - - - - - - - Event -Creator 3 - - - - - - - - - - - PUS Service 5 -Event Reporting - - - - - - - - - - - - PUS Service 19 -Event Action - - - - - - - - - - - Telemetry -Sink - - - - - - - - - - - Subscriptions - -1. Event Creator 0 subscribes - for event 0 -2. Event Creator 1 subscribes - for event group 2 -3. PUS Service 5 handler - subscribes for all events -4. PUS Service 19 handler - subscribes for all events - - - - - - - - - - - event 1 -(group 1) - - - - - - - - - - - - - event 0 -(group 0) - - - - - - - - - - - event 2 -(group 3) - - - - - - - - - - - - - event 3 (group 2) -event 4 (group 2) - - - - - - - - - - - <<all events>> - - - - - - - - - - - <<all events>> - - - - - - - - - - - - - event 1 -event 2 - - - - - - - - - - - group 2 - - - - - - - - - - - enabled Events -as PUS 5 TM - - - - - - - - - diff --git a/satrs-book/src/images/event_man_arch.png b/satrs-book/src/images/event_man_arch.png deleted file mode 100644 index 61c8d7255dfe663247b6d21db6f368570fd5105c..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 71832 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

57b?fjoQm3O83H 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 Y_NLHOi$+i4r^p Date: Tue, 30 Jan 2024 23:30:53 +0100 Subject: [PATCH 38/38] add satrs-book README --- satrs-book/README.md | 12 ++++++++++++ 1 file changed, 12 insertions(+) create mode 100644 satrs-book/README.md diff --git a/satrs-book/README.md b/satrs-book/README.md new file mode 100644 index 0000000..c6fcf81 --- /dev/null +++ b/satrs-book/README.md @@ -0,0 +1,12 @@ +sat-rs book +========= + +High-level documentation of the [sat-rs project](https://absatsw.irs.uni-stuttgart.de/projects/sat-rs/). + +## Building + +If you have not done so, install `mdbook` using `cargo install mdbook --locked`. + +```sh +mdbook build +```