From 391b3eef1195f57b643855b5cb2bdb46a3e470a6 Mon Sep 17 00:00:00 2001 From: George Riley Date: Fri, 24 Aug 2007 11:44:11 -0400 Subject: [PATCH 01/18] Change the protocol stack processing to pass packets by non-const reference, rather than const reference and value as was previously done. Also change the queue semantics to return the packet on a deque, rather than requiring a packet as a parameter. The problem with the original approach was that packet UID's were getting skipped. The fix handles the uid properly, and we get sequential packet uid's on the trace file. --- examples/wscript | 4 ++ samples/main-simple.cc | 3 +- src/applications/onoff-application.cc | 3 +- src/devices/csma/csma-net-device.cc | 60 ++++++++----------- src/devices/csma/csma-net-device.h | 4 +- .../point-to-point-net-device.cc | 27 ++++----- .../point-to-point-net-device.h | 2 +- src/internet-node/arp-l3-protocol.cc | 5 +- src/internet-node/arp-l3-protocol.h | 2 +- src/internet-node/ipv4-end-point.cc | 4 +- src/internet-node/ipv4-end-point.h | 6 +- src/internet-node/ipv4-l3-protocol.cc | 29 ++++----- src/internet-node/ipv4-l3-protocol.h | 12 ++-- src/internet-node/ipv4-static-routing.cc | 2 +- src/internet-node/ipv4-static-routing.h | 2 +- src/internet-node/udp-l4-protocol.cc | 2 +- src/internet-node/udp-l4-protocol.h | 2 +- src/internet-node/udp-socket.cc | 13 ++-- src/internet-node/udp-socket.h | 10 ++-- src/node/drop-tail-queue.cc | 35 ++++------- src/node/drop-tail-queue.h | 4 +- src/node/ipv4.h | 6 +- src/node/net-device.cc | 4 +- src/node/net-device.h | 8 +-- src/node/node.cc | 2 +- src/node/node.h | 4 +- src/node/packet-socket.cc | 10 ++-- src/node/packet-socket.h | 6 +- src/node/queue.cc | 42 +++++++------ src/node/queue.h | 14 +++-- src/node/socket.h | 4 +- 31 files changed, 152 insertions(+), 179 deletions(-) diff --git a/examples/wscript b/examples/wscript index e5e771555..cb0af9530 100644 --- a/examples/wscript +++ b/examples/wscript @@ -10,6 +10,10 @@ def build(bld): ['point-to-point', 'internet-node']) obj.source = 'simple-point-to-point.cc' + obj = bld.create_ns3_program('really-simple-point-to-point', + ['point-to-point', 'internet-node']) + obj.source = 'really-simple-point-to-point.cc' + obj = bld.create_ns3_program('csma-one-subnet', ['csma', 'internet-node']) obj.source = 'csma-one-subnet.cc' diff --git a/samples/main-simple.cc b/samples/main-simple.cc index 7285f4946..2039a55c3 100644 --- a/samples/main-simple.cc +++ b/samples/main-simple.cc @@ -14,7 +14,8 @@ static void GenerateTraffic (Ptr socket, uint32_t size) { std::cout << "at=" << Simulator::Now ().GetSeconds () << "s, tx bytes=" << size << std::endl; - socket->Send (Packet (size)); + Packet p(size); + socket->Send (p); if (size > 0) { Simulator::Schedule (Seconds (0.5), &GenerateTraffic, socket, size - 50); diff --git a/src/applications/onoff-application.cc b/src/applications/onoff-application.cc index 32bcd7564..512c454f3 100644 --- a/src/applications/onoff-application.cc +++ b/src/applications/onoff-application.cc @@ -206,7 +206,8 @@ void OnOffApplication::ScheduleStopEvent() void OnOffApplication::SendPacket() { NS_ASSERT (m_sendEvent.IsExpired ()); - m_socket->Send(Packet (m_pktSize)); + Packet p(m_pktSize); + m_socket->Send(p); m_totBytes += m_pktSize; m_lastStartTime = Simulator::Now(); m_residualBits = 0; diff --git a/src/devices/csma/csma-net-device.cc b/src/devices/csma/csma-net-device.cc index 531bf7314..610ec9b6c 100644 --- a/src/devices/csma/csma-net-device.cc +++ b/src/devices/csma/csma-net-device.cc @@ -274,13 +274,12 @@ CsmaNetDevice::DoNeedsArp (void) const bool CsmaNetDevice::SendTo ( - const Packet& packet, + Packet& packet, const Address& dest, uint16_t protocolNumber) { - Packet p = packet; - NS_DEBUG ("CsmaNetDevice::SendTo (" << &p << ")"); - NS_DEBUG ("CsmaNetDevice::SendTo (): UID is " << p.GetUid () << ")"); + NS_DEBUG ("CsmaNetDevice::SendTo (" << &packet << ")"); + NS_DEBUG ("CsmaNetDevice::SendTo (): UID is " << packet.GetUid () << ")"); NS_ASSERT (IsLinkUp ()); @@ -289,10 +288,10 @@ CsmaNetDevice::SendTo ( return false; Eui48Address destination = Eui48Address::ConvertFrom (dest); - AddHeader(p, destination, protocolNumber); + AddHeader(packet, destination, protocolNumber); // Place the packet to be sent on the send queue - if (m_queue->Enqueue(p) == false ) + if (m_queue->Enqueue(packet) == false ) { return false; } @@ -301,11 +300,10 @@ CsmaNetDevice::SendTo ( // transmission (see TransmitCompleteEvent) if (m_txMachineState == READY) { + if (m_queue->IsEmpty()) return true; // Nothing else to do // Store the next packet to be transmitted - if (m_queue->Dequeue (m_currentPkt)) - { - TransmitStart(); - } + m_currentPkt = m_queue->Dequeue(); + TransmitStart(); } return true; } @@ -389,9 +387,8 @@ CsmaNetDevice::TransmitAbort (void) m_currentPkt.GetUid () << ")"); // Try to transmit a new packet - bool found; - found = m_queue->Dequeue (m_currentPkt); - NS_ASSERT_MSG(found, "IsEmpty false but no Packet on queue?"); + if (m_queue->IsEmpty()) return; //No packet to transmit + m_currentPkt = m_queue->Dequeue (); m_backoff.ResetBackoffTime(); m_txMachineState = READY; TransmitStart (); @@ -438,18 +435,10 @@ CsmaNetDevice::TransmitReadyEvent (void) NS_ASSERT_MSG(m_txMachineState == GAP, "Must be in interframe gap"); m_txMachineState = READY; + if (m_queue->IsEmpty()) return; // No more to transmit, remain ready // Get the next packet from the queue for transmitting - if (m_queue->IsEmpty()) - { - return; - } - else - { - bool found; - found = m_queue->Dequeue (m_currentPkt); - NS_ASSERT_MSG(found, "IsEmpty false but no Packet on queue?"); - TransmitStart (); - } + m_currentPkt = m_queue->Dequeue (); + TransmitStart (); } TraceResolver * @@ -495,32 +484,31 @@ CsmaNetDevice::AddQueue (Ptr q) } void -CsmaNetDevice::Receive (const Packet& packet) +CsmaNetDevice::Receive (Packet& packet) { EthernetHeader header (false); EthernetTrailer trailer; Eui48Address broadcast; Eui48Address destination; - Packet p = packet; - NS_DEBUG ("CsmaNetDevice::Receive UID is (" << p.GetUid() << ")"); + NS_DEBUG ("CsmaNetDevice::Receive UID is (" << packet.GetUid() << ")"); // Only receive if send side of net device is enabled if (!IsReceiveEnabled()) { - m_dropTrace (p); + m_dropTrace (packet); return; } if (m_encapMode == RAW) { ForwardUp (packet, 0, GetBroadcast ()); - m_dropTrace (p); + //m_dropTrace (packet); return; } - p.RemoveTrailer(trailer); - trailer.CheckFcs(p); - p.RemoveHeader(header); + packet.RemoveTrailer(trailer); + trailer.CheckFcs(packet); + packet.RemoveHeader(header); broadcast = Eui48Address::ConvertFrom (GetBroadcast ()); destination = Eui48Address::ConvertFrom (GetAddress ()); @@ -528,11 +516,11 @@ CsmaNetDevice::Receive (const Packet& packet) (header.GetDestination() != destination)) { // not for us. - m_dropTrace (p); + m_dropTrace (packet); return; } - m_rxTrace (p); + m_rxTrace (packet); // // protocol must be initialized to avoid a compiler warning in the RAW // case that breaks the optimized build. @@ -547,7 +535,7 @@ CsmaNetDevice::Receive (const Packet& packet) break; case LLC: { LlcSnapHeader llc; - p.RemoveHeader (llc); + packet.RemoveHeader (llc); protocol = llc.GetType (); } break; case RAW: @@ -555,7 +543,7 @@ CsmaNetDevice::Receive (const Packet& packet) break; } - ForwardUp (p, protocol, header.GetSource ()); + ForwardUp (packet, protocol, header.GetSource ()); return; } diff --git a/src/devices/csma/csma-net-device.h b/src/devices/csma/csma-net-device.h index 441ea04cd..95b89e9fc 100644 --- a/src/devices/csma/csma-net-device.h +++ b/src/devices/csma/csma-net-device.h @@ -195,7 +195,7 @@ enum CsmaEncapsulationMode { * @see CsmaChannel * \param p a reference to the received packet */ - void Receive (const Packet& p); + void Receive (Packet& p); bool IsSendEnabled (void); bool IsReceiveEnabled (void); @@ -270,7 +270,7 @@ private: * \param protocolNumber -- this parameter is not used here * \return true if success, false on failure */ - virtual bool SendTo (const Packet& p, const Address& dest, uint16_t protocolNumber); + virtual bool SendTo (Packet& p, const Address& dest, uint16_t protocolNumber); /** * Start Sending a Packet Down the Wire. diff --git a/src/devices/point-to-point/point-to-point-net-device.cc b/src/devices/point-to-point/point-to-point-net-device.cc index a071f9246..2cb026062 100644 --- a/src/devices/point-to-point/point-to-point-net-device.cc +++ b/src/devices/point-to-point/point-to-point-net-device.cc @@ -117,18 +117,17 @@ void PointToPointNetDevice::SetInterframeGap(const Time& t) m_tInterframeGap = t; } -bool PointToPointNetDevice::SendTo (const Packet& packet, const Address& dest, +bool PointToPointNetDevice::SendTo (Packet& packet, const Address& dest, uint16_t protocolNumber) { - Packet p = packet; - NS_DEBUG ("PointToPointNetDevice::SendTo (" << &p << ", " << &dest << ")"); - NS_DEBUG ("PointToPointNetDevice::SendTo (): UID is " << p.GetUid () << ")"); + NS_DEBUG ("PointToPointNetDevice::SendTo (" << &packet << ", " << &dest << ")"); + NS_DEBUG ("PointToPointNetDevice::SendTo (): UID is " << packet.GetUid () << ")"); // GFR Comment. Why is this an assertion? Can't a link legitimately // "go down" during the simulation? Shouldn't we just wait for it // to come back up? NS_ASSERT (IsLinkUp ()); - AddHeader(p, protocolNumber); + AddHeader(packet, protocolNumber); // // This class simulates a point to point device. In the case of a serial @@ -139,16 +138,16 @@ bool PointToPointNetDevice::SendTo (const Packet& packet, const Address& dest, // trnsmission; otherwise we send it now. if (m_txMachineState == READY) { - return TransmitStart (p); + return TransmitStart (packet); } else { - return m_queue->Enqueue(p); + return m_queue->Enqueue(packet); } } bool -PointToPointNetDevice::TransmitStart (Packet &p) +PointToPointNetDevice::TransmitStart (Packet& p) { NS_DEBUG ("PointToPointNetDevice::TransmitStart (" << &p << ")"); NS_DEBUG ( @@ -184,8 +183,8 @@ void PointToPointNetDevice::TransmitComplete (void) // NS_ASSERT_MSG(m_txMachineState == BUSY, "Must be BUSY if transmitting"); m_txMachineState = READY; - Packet p; - if (!m_queue->Dequeue(p)) return; // Nothing to do at this point + if (m_queue->IsEmpty()) return; // Nothing to do at this point + Packet p = m_queue->Dequeue(); TransmitStart(p); } @@ -236,11 +235,9 @@ void PointToPointNetDevice::Receive (Packet& p) { NS_DEBUG ("PointToPointNetDevice::Receive (" << &p << ")"); uint16_t protocol = 0; - Packet packet = p; - - m_rxTrace (packet); - ProcessHeader(packet, protocol); - ForwardUp (packet, protocol, GetBroadcast ()); + m_rxTrace (p); + ProcessHeader(p, protocol); + ForwardUp (p, protocol, GetBroadcast ()); } Ptr PointToPointNetDevice::GetQueue(void) const diff --git a/src/devices/point-to-point/point-to-point-net-device.h b/src/devices/point-to-point/point-to-point-net-device.h index d8d8d3242..e985b76cd 100644 --- a/src/devices/point-to-point/point-to-point-net-device.h +++ b/src/devices/point-to-point/point-to-point-net-device.h @@ -211,7 +211,7 @@ private: * @param protocolNumber Protocol Number used to find protocol touse * @returns true if success, false on failure */ - virtual bool SendTo (const Packet& p, const Address& dest, + virtual bool SendTo (Packet& p, const Address& dest, uint16_t protocolNumber); /** * Start Sending a Packet Down the Wire. diff --git a/src/internet-node/arp-l3-protocol.cc b/src/internet-node/arp-l3-protocol.cc index 100f1df88..041c50e14 100644 --- a/src/internet-node/arp-l3-protocol.cc +++ b/src/internet-node/arp-l3-protocol.cc @@ -84,12 +84,11 @@ ArpL3Protocol::FindCache (Ptr device) } void -ArpL3Protocol::Receive(Ptr device, const Packet& p, uint16_t protocol, const Address &from) +ArpL3Protocol::Receive(Ptr device, Packet& p, uint16_t protocol, const Address &from) { ArpCache *cache = FindCache (device); ArpHeader arp; - Packet packet = p; - packet.RemoveHeader (arp); + p.RemoveHeader (arp); NS_DEBUG ("ARP: received "<< (arp.IsRequest ()? "request" : "reply") << " node="<GetId ()<<", got request from " << diff --git a/src/internet-node/arp-l3-protocol.h b/src/internet-node/arp-l3-protocol.h index a2ea8227e..82d8dd29e 100644 --- a/src/internet-node/arp-l3-protocol.h +++ b/src/internet-node/arp-l3-protocol.h @@ -53,7 +53,7 @@ public: /** * \brief Recieve a packet */ - void Receive(Ptr device, const Packet& p, uint16_t protocol, const Address &from); + void Receive(Ptr device, Packet& p, uint16_t protocol, const Address &from); /** * \brief Perform an ARP lookup * \param p diff --git a/src/internet-node/ipv4-end-point.cc b/src/internet-node/ipv4-end-point.cc index 69faf523e..cdd78c303 100644 --- a/src/internet-node/ipv4-end-point.cc +++ b/src/internet-node/ipv4-end-point.cc @@ -65,7 +65,7 @@ Ipv4EndPoint::SetPeer (Ipv4Address address, uint16_t port) } void -Ipv4EndPoint::SetRxCallback (Callback callback) +Ipv4EndPoint::SetRxCallback (Callback callback) { m_rxCallback = callback; } @@ -77,7 +77,7 @@ Ipv4EndPoint::SetDestroyCallback (Callback callback) } void -Ipv4EndPoint::ForwardUp (const Packet &p, Ipv4Address saddr, uint16_t sport) +Ipv4EndPoint::ForwardUp (Packet &p, Ipv4Address saddr, uint16_t sport) { if (!m_rxCallback.IsNull ()) { diff --git a/src/internet-node/ipv4-end-point.h b/src/internet-node/ipv4-end-point.h index f606aa63b..06192d500 100644 --- a/src/internet-node/ipv4-end-point.h +++ b/src/internet-node/ipv4-end-point.h @@ -43,17 +43,17 @@ public: void SetPeer (Ipv4Address address, uint16_t port); - void SetRxCallback (Callback callback); + void SetRxCallback (Callback callback); void SetDestroyCallback (Callback callback); - void ForwardUp (const Packet &p, Ipv4Address saddr, uint16_t sport); + void ForwardUp (Packet &p, Ipv4Address saddr, uint16_t sport); private: Ipv4Address m_localAddr; uint16_t m_localPort; Ipv4Address m_peerAddr; uint16_t m_peerPort; - Callback m_rxCallback; + Callback m_rxCallback; Callback m_destroyCallback; }; diff --git a/src/internet-node/ipv4-l3-protocol.cc b/src/internet-node/ipv4-l3-protocol.cc index be483dfa0..b44a0a013 100644 --- a/src/internet-node/ipv4-l3-protocol.cc +++ b/src/internet-node/ipv4-l3-protocol.cc @@ -221,7 +221,7 @@ Ipv4L3Protocol::SetDefaultRoute (Ipv4Address nextHop, void Ipv4L3Protocol::Lookup (Ipv4Header const &ipHeader, - Packet packet, + Packet& packet, Ipv4RoutingProtocol::RouteReplyCallback routeReply) { for (Ipv4RoutingProtocolList::const_iterator rprotoIter = m_routingProtocols.begin (); @@ -310,7 +310,7 @@ Ipv4L3Protocol::FindInterfaceForDevice (Ptr device) } void -Ipv4L3Protocol::Receive( Ptr device, const Packet& p, uint16_t protocol, const Address &from) +Ipv4L3Protocol::Receive( Ptr device, Packet& p, uint16_t protocol, const Address &from) { uint32_t index = 0; for (Ipv4InterfaceList::const_iterator i = m_interfaces.begin (); i != m_interfaces.end (); i++) @@ -322,26 +322,25 @@ Ipv4L3Protocol::Receive( Ptr device, const Packet& p, uint16_t protoc } index++; } - Packet packet = p; Ipv4Header ipHeader; - packet.RemoveHeader (ipHeader); + p.RemoveHeader (ipHeader); if (!ipHeader.IsChecksumOk ()) { return; } - if (Forwarding (packet, ipHeader, device)) + if (Forwarding (p, ipHeader, device)) { return; } - ForwardUp (packet, ipHeader); + ForwardUp (p, ipHeader); } void -Ipv4L3Protocol::Send (Packet const &packet, +Ipv4L3Protocol::Send (Packet& packet, Ipv4Address source, Ipv4Address destination, uint8_t protocol) @@ -365,12 +364,10 @@ Ipv4L3Protocol::Send (Packet const &packet, ifaceIter != m_interfaces.end (); ifaceIter++, ifaceIndex++) { Ipv4Interface *outInterface = *ifaceIter; - Packet packetCopy = packet; - - NS_ASSERT (packetCopy.GetSize () <= outInterface->GetMtu ()); - packetCopy.AddHeader (ipHeader); - m_txTrace (packetCopy, ifaceIndex); - outInterface->Send (packetCopy, destination); + NS_ASSERT (packet.GetSize () <= outInterface->GetMtu ()); + packet.AddHeader (ipHeader); + m_txTrace (packet, ifaceIndex); + outInterface->Send (packet, destination); } } else @@ -391,7 +388,7 @@ Ipv4L3Protocol::Send (Packet const &packet, void Ipv4L3Protocol::SendRealOut (bool found, Ipv4Route const &route, - Packet packet, + Packet& packet, Ipv4Header const &ipHeader) { if (!found) @@ -416,7 +413,7 @@ Ipv4L3Protocol::SendRealOut (bool found, bool -Ipv4L3Protocol::Forwarding (Packet const &packet, Ipv4Header &ipHeader, Ptr device) +Ipv4L3Protocol::Forwarding (Packet& packet, Ipv4Header &ipHeader, Ptr device) { for (Ipv4InterfaceList::const_iterator i = m_interfaces.begin (); i != m_interfaces.end (); i++) @@ -471,7 +468,7 @@ Ipv4L3Protocol::Forwarding (Packet const &packet, Ipv4Header &ipHeader, Ptr demux = m_node->QueryInterface (Ipv4L4Demux::iid); Ptr protocol = demux->GetProtocol (ip.GetProtocol ()); diff --git a/src/internet-node/ipv4-l3-protocol.h b/src/internet-node/ipv4-l3-protocol.h index 2cce3efa3..8254f27e6 100644 --- a/src/internet-node/ipv4-l3-protocol.h +++ b/src/internet-node/ipv4-l3-protocol.h @@ -118,7 +118,7 @@ public: * - implement a per-NetDevice ARP cache * - send back arp replies on the right device */ - void Receive( Ptr device, const Packet& p, uint16_t protocol, const Address &from); + void Receive( Ptr device, Packet& p, uint16_t protocol, const Address &from); /** * \param packet packet to send @@ -129,7 +129,7 @@ public: * Higher-level layers call this method to send a packet * down the stack to the MAC and PHY layers. */ - void Send (Packet const &packet, Ipv4Address source, + void Send (Packet& packet, Ipv4Address source, Ipv4Address destination, uint8_t protocol); @@ -151,7 +151,7 @@ public: uint32_t interface); void Lookup (Ipv4Header const &ipHeader, - Packet packet, + Packet& packet, Ipv4RoutingProtocol::RouteReplyCallback routeReply); uint32_t GetNRoutes (void); @@ -183,10 +183,10 @@ private: void SendRealOut (bool found, Ipv4Route const &route, - Packet packet, + Packet& packet, Ipv4Header const &ipHeader); - bool Forwarding (Packet const &packet, Ipv4Header &ipHeader, Ptr device); - void ForwardUp (Packet p, Ipv4Header const&ip); + bool Forwarding (Packet& packet, Ipv4Header &ipHeader, Ptr device); + void ForwardUp (Packet& p, Ipv4Header const&ip); uint32_t AddIpv4Interface (Ipv4Interface *interface); void SetupLoopback (void); TraceResolver *InterfacesCreateTraceResolver (TraceContext const &context) const; diff --git a/src/internet-node/ipv4-static-routing.cc b/src/internet-node/ipv4-static-routing.cc index b70c1c1af..37e8a74df 100644 --- a/src/internet-node/ipv4-static-routing.cc +++ b/src/internet-node/ipv4-static-routing.cc @@ -210,7 +210,7 @@ Ipv4StaticRouting::RemoveRoute (uint32_t index) bool Ipv4StaticRouting::RequestRoute (Ipv4Header const &ipHeader, - Packet packet, + Packet& packet, RouteReplyCallback routeReply) { Ipv4Route *route = LookupStatic (ipHeader.GetDestination ()); diff --git a/src/internet-node/ipv4-static-routing.h b/src/internet-node/ipv4-static-routing.h index 8462f55a7..439af8cf7 100644 --- a/src/internet-node/ipv4-static-routing.h +++ b/src/internet-node/ipv4-static-routing.h @@ -52,7 +52,7 @@ public: Ipv4StaticRouting () : m_defaultRoute (0) {} virtual bool RequestRoute (Ipv4Header const &ipHeader, - Packet packet, + Packet& packet, RouteReplyCallback routeReply); diff --git a/src/internet-node/udp-l4-protocol.cc b/src/internet-node/udp-l4-protocol.cc index f0ef8569b..9dacbf961 100644 --- a/src/internet-node/udp-l4-protocol.cc +++ b/src/internet-node/udp-l4-protocol.cc @@ -122,7 +122,7 @@ UdpL4Protocol::Receive(Packet& packet, } void -UdpL4Protocol::Send (Packet packet, +UdpL4Protocol::Send (Packet& packet, Ipv4Address saddr, Ipv4Address daddr, uint16_t sport, uint16_t dport) { diff --git a/src/internet-node/udp-l4-protocol.h b/src/internet-node/udp-l4-protocol.h index 4d7a082d4..70e2b0ccc 100644 --- a/src/internet-node/udp-l4-protocol.h +++ b/src/internet-node/udp-l4-protocol.h @@ -74,7 +74,7 @@ public: * \param sport The source port number * \param dport The destination port number */ - void Send (Packet packet, + void Send (Packet& packet, Ipv4Address saddr, Ipv4Address daddr, uint16_t sport, uint16_t dport); /** diff --git a/src/internet-node/udp-socket.cc b/src/internet-node/udp-socket.cc index a2bde3224..45b8b82b6 100644 --- a/src/internet-node/udp-socket.cc +++ b/src/internet-node/udp-socket.cc @@ -155,7 +155,7 @@ UdpSocket::Connect(const Address & address) return 0; } int -UdpSocket::Send (const Packet &p) +UdpSocket::Send (Packet &p) { if (!m_connected) { @@ -165,7 +165,7 @@ UdpSocket::Send (const Packet &p) return DoSendTo (p, m_defaultAddress, m_defaultPort); } int -UdpSocket::DoSendTo (const Packet &p, const Address &address) +UdpSocket::DoSendTo (Packet &p, const Address &address) { InetSocketAddress transport = InetSocketAddress::ConvertFrom (address); Ipv4Address ipv4 = transport.GetIpv4 (); @@ -173,7 +173,7 @@ UdpSocket::DoSendTo (const Packet &p, const Address &address) return DoSendTo (p, ipv4, port); } int -UdpSocket::DoSendTo (const Packet &p, Ipv4Address ipv4, uint16_t port) +UdpSocket::DoSendTo (Packet& p, Ipv4Address ipv4, uint16_t port) { if (m_endPoint == 0) { @@ -195,7 +195,7 @@ UdpSocket::DoSendTo (const Packet &p, Ipv4Address ipv4, uint16_t port) return 0; } int -UdpSocket::SendTo(const Address &address, const Packet &p) +UdpSocket::SendTo(const Address &address, Packet &p) { if (m_connected) { @@ -209,7 +209,7 @@ UdpSocket::SendTo(const Address &address, const Packet &p) } void -UdpSocket::ForwardUp (const Packet &packet, Ipv4Address ipv4, uint16_t port) +UdpSocket::ForwardUp (Packet &packet, Ipv4Address ipv4, uint16_t port) { if (m_shutdownRecv) { @@ -217,8 +217,7 @@ UdpSocket::ForwardUp (const Packet &packet, Ipv4Address ipv4, uint16_t port) } Address address = InetSocketAddress (ipv4, port); - Packet p = packet; - NotifyDataReceived (p, address); + NotifyDataReceived (packet, address); } }//namespace ns3 diff --git a/src/internet-node/udp-socket.h b/src/internet-node/udp-socket.h index b3674f7ef..9ceec713f 100644 --- a/src/internet-node/udp-socket.h +++ b/src/internet-node/udp-socket.h @@ -51,8 +51,8 @@ public: virtual int ShutdownSend (void); virtual int ShutdownRecv (void); virtual int Connect(const Address &address); - virtual int Send (const Packet &p); - virtual int SendTo(const Address &address,const Packet &p); + virtual int Send (Packet &p); + virtual int SendTo(const Address &address,Packet &p); private: @@ -60,10 +60,10 @@ private: friend class Udp; // invoked by Udp class int FinishBind (void); - void ForwardUp (const Packet &p, Ipv4Address ipv4, uint16_t port); + void ForwardUp (Packet &p, Ipv4Address ipv4, uint16_t port); void Destroy (void); - int DoSendTo (const Packet &p, const Address &daddr); - int DoSendTo (const Packet &p, Ipv4Address daddr, uint16_t dport); + int DoSendTo (Packet &p, const Address &daddr); + int DoSendTo (Packet &p, Ipv4Address daddr, uint16_t dport); Ipv4EndPoint *m_endPoint; Ptr m_node; diff --git a/src/node/drop-tail-queue.cc b/src/node/drop-tail-queue.cc index 74c8fde17..5b802acec 100644 --- a/src/node/drop-tail-queue.cc +++ b/src/node/drop-tail-queue.cc @@ -73,39 +73,26 @@ DropTailQueue::DoEnqueue (const Packet& p) return true; } -bool -DropTailQueue::DoDequeue (Packet& p) +Packet +DropTailQueue::DoDequeue () { - NS_DEBUG("DropTailQueue::DoDequeue (" << &p << ")"); - - if (m_packets.empty()) - { - NS_DEBUG("DropTailQueue::DoDequeue (): Queue empty"); - return false; - } - - p = m_packets.front (); + NS_DEBUG("DropTailQueue::DoDequeue ( )"); + NS_ASSERT(!IsEmpty()); + Packet p = m_packets.front (); m_packets.pop (); NS_DEBUG("DropTailQueue::DoDequeue (): Popped " << &p << " <= true"); - return true; + return p; } -bool -DropTailQueue::DoPeek (Packet& p) +Packet +DropTailQueue::DoPeek () { - NS_DEBUG("DropTailQueue::DoPeek (" << &p << ")"); + NS_DEBUG("DropTailQueue::DoPeek ( )"); + NS_ASSERT(!IsEmpty()); - if (m_packets.empty()) - { - NS_DEBUG("DropTailQueue::DoPeek (): Queue empty"); - return false; - } - - p = m_packets.front (); - - return true; + return m_packets.front (); } }; // namespace ns3 diff --git a/src/node/drop-tail-queue.h b/src/node/drop-tail-queue.h index 2e4c76461..6febe0eab 100644 --- a/src/node/drop-tail-queue.h +++ b/src/node/drop-tail-queue.h @@ -58,8 +58,8 @@ public: private: virtual bool DoEnqueue (const Packet& p); - virtual bool DoDequeue (Packet &p); - virtual bool DoPeek (Packet &p); + virtual Packet DoDequeue (); + virtual Packet DoPeek (); private: std::queue m_packets; diff --git a/src/node/ipv4.h b/src/node/ipv4.h index 76d88faea..b4d22c520 100644 --- a/src/node/ipv4.h +++ b/src/node/ipv4.h @@ -46,7 +46,7 @@ class Ipv4Header; // FIXME: ipv4-header.h needs to move from module class Ipv4RoutingProtocol : public Object { public: - // void (*RouteReply) (bool found, Ipv4Route route, Packet packet, Ipv4Header const &ipHeader); + // void (*RouteReply) (bool found, Ipv4Route route, Packet& packet, Ipv4Header const &ipHeader); /** @@ -65,7 +65,7 @@ public: * inserted and consequently the protocol type has to change). * */ - typedef Callback RouteReplyCallback; + typedef Callback RouteReplyCallback; /** * \brief Asynchronously requests a route for a given packet and IP header @@ -100,7 +100,7 @@ public: * insert any extra header. */ virtual bool RequestRoute (const Ipv4Header &ipHeader, - Packet packet, + Packet& packet, RouteReplyCallback routeReply) = 0; }; diff --git a/src/node/net-device.cc b/src/node/net-device.cc index 1ffe6d4b1..965bf78b8 100644 --- a/src/node/net-device.cc +++ b/src/node/net-device.cc @@ -171,7 +171,7 @@ NetDevice::DisablePointToPoint (void) // Receive packet from above bool -NetDevice::Send(const Packet& p, const Address& dest, uint16_t protocolNumber) +NetDevice::Send(Packet& p, const Address& dest, uint16_t protocolNumber) { if (m_isUp) { @@ -197,7 +197,7 @@ NetDevice::GetChannel (void) const // Receive packets from below bool -NetDevice::ForwardUp(const Packet& p, uint32_t param, const Address &from) +NetDevice::ForwardUp( Packet& p, uint32_t param, const Address &from) { bool retval = false; diff --git a/src/node/net-device.h b/src/node/net-device.h index 315f16033..0fb21e0fb 100644 --- a/src/node/net-device.h +++ b/src/node/net-device.h @@ -158,7 +158,7 @@ public: * * \return whether the Send operation succeeded */ - bool Send(const Packet& p, const Address& dest, uint16_t protocolNumber); + bool Send(Packet& p, const Address& dest, uint16_t protocolNumber); /** * \returns the node base class which contains this network * interface. @@ -187,7 +187,7 @@ public: * \returns true if the callback could handle the packet successfully, false * otherwise. */ - typedef Callback,const Packet &,uint16_t,const Address &> ReceiveCallback; + typedef Callback,Packet &,uint16_t,const Address &> ReceiveCallback; /** * \param cb callback to invoke whenever a packet has been received and must @@ -251,7 +251,7 @@ public: * forwards it to the higher layers by calling this method * which is responsible for passing it up to the Rx callback. */ - bool ForwardUp (const Packet& p, uint32_t param, const Address &address); + bool ForwardUp (Packet& p, uint32_t param, const Address &address); /** @@ -274,7 +274,7 @@ public: * method. When the link is Up, this method is invoked to ask * subclasses to forward packets. Subclasses MUST override this method. */ - virtual bool SendTo (const Packet& p, const Address &dest, uint16_t protocolNumber) = 0; + virtual bool SendTo (Packet& p, const Address &dest, uint16_t protocolNumber) = 0; /** * \returns true if this NetDevice needs the higher-layers * to perform ARP over it, false otherwise. diff --git a/src/node/node.cc b/src/node/node.cc index ee83e8588..5fdd50bb8 100644 --- a/src/node/node.cc +++ b/src/node/node.cc @@ -213,7 +213,7 @@ Node::UnregisterProtocolHandler (ProtocolHandler handler) } bool -Node::ReceiveFromDevice (Ptr device, const Packet &packet, +Node::ReceiveFromDevice (Ptr device, Packet &packet, uint16_t protocol, const Address &from) { bool found = false; diff --git a/src/node/node.h b/src/node/node.h index f4d898f53..1538350be 100644 --- a/src/node/node.h +++ b/src/node/node.h @@ -158,7 +158,7 @@ public: /** * A protocol handler */ - typedef Callback, const Packet &,uint16_t,const Address &> ProtocolHandler; + typedef Callback, Packet &,uint16_t,const Address &> ProtocolHandler; /** * \param handler the handler to register * \param protocolType the type of protocol this handler is @@ -210,7 +210,7 @@ private: */ virtual void NotifyDeviceAdded (Ptr device); - bool ReceiveFromDevice (Ptr device, const Packet &packet, + bool ReceiveFromDevice (Ptr device, Packet &packet, uint16_t protocol, const Address &from); void Construct (void); TraceResolver *CreateDevicesTraceResolver (const TraceContext &context); diff --git a/src/node/packet-socket.cc b/src/node/packet-socket.cc index f642eee9e..7e0095d79 100644 --- a/src/node/packet-socket.cc +++ b/src/node/packet-socket.cc @@ -186,7 +186,7 @@ PacketSocket::Connect(const Address &ad) } int -PacketSocket::Send (const Packet &p) +PacketSocket::Send (Packet &p) { if (m_state == STATE_OPEN || m_state == STATE_BOUND) @@ -198,7 +198,7 @@ PacketSocket::Send (const Packet &p) } int -PacketSocket::SendTo(const Address &address, const Packet &p) +PacketSocket::SendTo(const Address &address, Packet &p) { PacketSocketAddress ad; if (m_state == STATE_CLOSED) @@ -262,7 +262,7 @@ PacketSocket::SendTo(const Address &address, const Packet &p) } void -PacketSocket::ForwardUp (Ptr device, const Packet &packet, +PacketSocket::ForwardUp (Ptr device, Packet &packet, uint16_t protocol, const Address &from) { if (m_shutdownRecv) @@ -270,7 +270,7 @@ PacketSocket::ForwardUp (Ptr device, const Packet &packet, return; } - Packet p = packet; + //Packet p = packet; ? PacketSocketAddress address; address.SetPhysicalAddress (from); @@ -279,7 +279,7 @@ PacketSocket::ForwardUp (Ptr device, const Packet &packet, NS_DEBUG ("PacketSocket::ForwardUp: UID is " << packet.GetUid() << " PacketSocket " << this); - NotifyDataReceived (p, address); + NotifyDataReceived (packet, address); } }//namespace ns3 diff --git a/src/node/packet-socket.h b/src/node/packet-socket.h index 8dc1b9e62..be4ade908 100644 --- a/src/node/packet-socket.h +++ b/src/node/packet-socket.h @@ -82,15 +82,15 @@ public: virtual int ShutdownSend (void); virtual int ShutdownRecv (void); virtual int Connect(const Address &address); - virtual int Send (const Packet &p); - virtual int SendTo(const Address &address,const Packet &p); + virtual int Send (Packet &p); + virtual int SendTo(const Address &address,Packet &p); private: private: void Init (void); - void ForwardUp (Ptr device, const Packet &packet, + void ForwardUp (Ptr device, Packet &packet, uint16_t protocol, const Address &from); int DoBind (const PacketSocketAddress &address); virtual void DoDispose (void); diff --git a/src/node/queue.cc b/src/node/queue.cc index 72eafed69..ad79109c0 100644 --- a/src/node/queue.cc +++ b/src/node/queue.cc @@ -49,7 +49,7 @@ QueueTraceType::IsEnqueue (void) const { return m_type == ENQUEUE; } -bool +bool QueueTraceType::IsDequeue (void) const { return m_type == DEQUEUE; @@ -122,28 +122,25 @@ Queue::Enqueue (const Packet& p) return retval; } -bool -Queue::Dequeue (Packet &p) +Packet +Queue::Dequeue () { - NS_DEBUG("Queue::Dequeue (" << &p << ")"); + NS_ASSERT(!IsEmpty()); + NS_DEBUG("Queue::Dequeue ( )"); - bool retval = DoDequeue (p); + Packet p = DoDequeue (); - if (retval) - { - m_nBytes -= p.GetSize (); - m_nPackets--; + m_nBytes -= p.GetSize (); + m_nPackets--; + + NS_ASSERT (m_nBytes >= 0); + NS_ASSERT (m_nPackets >= 0); + + NS_DEBUG("Queue::Dequeue (): m_traceDequeue (p)"); - NS_ASSERT (m_nBytes >= 0); - NS_ASSERT (m_nPackets >= 0); + m_traceDequeue (p); - NS_DEBUG("Queue::Dequeue (): m_traceDequeue (p)"); - - const Packet packet = p; - m_traceDequeue (packet); - } - - return retval; + return p; } void @@ -154,12 +151,13 @@ Queue::DequeueAll (void) NS_ASSERT (!"Don't know what to do with dequeued packets!"); } -bool -Queue::Peek (Packet &p) +Packet +Queue::Peek () { - NS_DEBUG("Queue::Peek (" << &p << ")"); + NS_ASSERT(!IsEmpty()); + NS_DEBUG("Queue::Peek ( )"); - return DoPeek (p); + return DoPeek (); } diff --git a/src/node/queue.h b/src/node/queue.h index d135fff68..915642f09 100644 --- a/src/node/queue.h +++ b/src/node/queue.h @@ -83,14 +83,16 @@ public: bool Enqueue (const Packet& p); /** * Remove a packet from the front of the Queue - * \return True if the operation was successful; false otherwise + * Must not be called on an empty queue. + * \return The packet removed from the queue */ - bool Dequeue (Packet &p); + Packet Dequeue (); /** * Get a copy of the item at the front of the queue without removing it - * \return True if the operation was successful; false otherwise + * Must NOT be called on an empty queue + * \return The packet at the head of the queue. */ - bool Peek (Packet &p); + Packet Peek (); /** * XXX Doesn't do anything right now, think its supposed to flush the queue @@ -163,8 +165,8 @@ public: private: virtual bool DoEnqueue (const Packet& p) = 0; - virtual bool DoDequeue (Packet &p) = 0; - virtual bool DoPeek (Packet &p) = 0; + virtual Packet DoDequeue () = 0; + virtual Packet DoPeek () = 0; protected: // called by subclasses to notify parent of packet drops. diff --git a/src/node/socket.h b/src/node/socket.h index c717ec0a5..1a28bd71d 100644 --- a/src/node/socket.h +++ b/src/node/socket.h @@ -173,7 +173,7 @@ public: * \returns -1 in case of error or the number of bytes copied in the * internal buffer and accepted for transmission. */ - virtual int Send (const Packet &p) = 0; + virtual int Send (Packet &p) = 0; /** * \brief Send data to a specified peer. @@ -182,7 +182,7 @@ public: * \returns -1 in case of error or the number of bytes copied in the * internal buffer and accepted for transmission. */ - virtual int SendTo(const Address &address,const Packet &p) = 0; + virtual int SendTo(const Address &address,Packet &p) = 0; protected: void NotifyCloseCompleted (void); From cc6d4c0c06535a332590b8aa8e78d00b2404ea1d Mon Sep 17 00:00:00 2001 From: Mathieu Lacage Date: Tue, 28 Aug 2007 13:03:08 +0200 Subject: [PATCH 02/18] constify --- src/devices/csma/csma-net-device.h | 4 ++-- src/devices/point-to-point/point-to-point-net-device.h | 2 +- src/internet-node/ascii-trace.cc | 2 +- src/internet-node/ascii-trace.h | 2 +- 4 files changed, 5 insertions(+), 5 deletions(-) diff --git a/src/devices/csma/csma-net-device.h b/src/devices/csma/csma-net-device.h index 441ea04cd..62bbceab5 100644 --- a/src/devices/csma/csma-net-device.h +++ b/src/devices/csma/csma-net-device.h @@ -421,8 +421,8 @@ private: * @see class CallBackTraceSource * @see class TraceResolver */ - CallbackTraceSource m_rxTrace; - CallbackTraceSource m_dropTrace; + CallbackTraceSource m_rxTrace; + CallbackTraceSource m_dropTrace; }; diff --git a/src/devices/point-to-point/point-to-point-net-device.h b/src/devices/point-to-point/point-to-point-net-device.h index d8d8d3242..fa3d3b838 100644 --- a/src/devices/point-to-point/point-to-point-net-device.h +++ b/src/devices/point-to-point/point-to-point-net-device.h @@ -290,7 +290,7 @@ private: * @see class CallBackTraceSource * @see class TraceResolver */ - CallbackTraceSource m_rxTrace; + CallbackTraceSource m_rxTrace; /** * Default data rate. Used for all newly created p2p net devices */ diff --git a/src/internet-node/ascii-trace.cc b/src/internet-node/ascii-trace.cc index 0331bb5fd..961edd709 100644 --- a/src/internet-node/ascii-trace.cc +++ b/src/internet-node/ascii-trace.cc @@ -92,7 +92,7 @@ AsciiTrace::LogDevQueueDrop (TraceContext const &context, m_os << std::endl; } void -AsciiTrace::LogDevRx (TraceContext const &context, Packet &p) +AsciiTrace::LogDevRx (TraceContext const &context, const Packet &p) { m_os << "r " << Simulator::Now ().GetSeconds () << " "; context.Print (m_os); diff --git a/src/internet-node/ascii-trace.h b/src/internet-node/ascii-trace.h index e219afc41..084f82830 100644 --- a/src/internet-node/ascii-trace.h +++ b/src/internet-node/ascii-trace.h @@ -40,7 +40,7 @@ private: void LogDevQueueEnqueue (TraceContext const &context, const Packet &p); void LogDevQueueDequeue (TraceContext const &context, const Packet &p); void LogDevQueueDrop (TraceContext const &context, const Packet &p); - void LogDevRx (TraceContext const &context, Packet &p); + void LogDevRx (TraceContext const &context, const Packet &p); std::ofstream m_os; }; From 9f6f56f3ff63bd62790080845f5431b850361844 Mon Sep 17 00:00:00 2001 From: Mathieu Lacage Date: Tue, 28 Aug 2007 14:09:52 +0200 Subject: [PATCH 03/18] use the NodeList::Iterator type --- src/routing/global-routing/global-route-manager-impl.cc | 9 +++------ 1 file changed, 3 insertions(+), 6 deletions(-) diff --git a/src/routing/global-routing/global-route-manager-impl.cc b/src/routing/global-routing/global-route-manager-impl.cc index 9ede0a134..9fd73c680 100644 --- a/src/routing/global-routing/global-route-manager-impl.cc +++ b/src/routing/global-routing/global-route-manager-impl.cc @@ -337,8 +337,7 @@ GlobalRouteManagerImpl::SelectRouterNodes () { NS_DEBUG ("GlobalRouteManagerImpl::SelectRouterNodes ()"); - typedef std::vector < Ptr >::iterator Iterator; - for (Iterator i = NodeList::Begin (); i != NodeList::End (); i++) + for (NodeList::Iterator i = NodeList::Begin (); i != NodeList::End (); i++) { Ptr node = *i; NS_DEBUG ("GlobalRouteManagerImpl::SelectRouterNodes (): " @@ -366,8 +365,7 @@ GlobalRouteManagerImpl::BuildGlobalRoutingDatabase () // // Walk the list of nodes looking for the GlobalRouter Interface. // - typedef std::vector < Ptr >::iterator Iterator; - for (Iterator i = NodeList::Begin (); i != NodeList::End (); i++) + for (NodeList::Iterator i = NodeList::Begin (); i != NodeList::End (); i++) { Ptr node = *i; @@ -448,8 +446,7 @@ GlobalRouteManagerImpl::InitializeRoutes () // // Walk the list of nodes in the system. // - typedef std::vector < Ptr >::iterator Iterator; - for (Iterator i = NodeList::Begin (); i != NodeList::End (); i++) + for (NodeList::Iterator i = NodeList::Begin (); i != NodeList::End (); i++) { Ptr node = *i; // From 722fb6424514f752081a1e1466d836b9b2da16fe Mon Sep 17 00:00:00 2001 From: Mathieu Lacage Date: Tue, 28 Aug 2007 14:31:53 +0200 Subject: [PATCH 04/18] use more NodeList::Iterator types --- src/routing/global-routing/global-route-manager-impl.cc | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/src/routing/global-routing/global-route-manager-impl.cc b/src/routing/global-routing/global-route-manager-impl.cc index 9fd73c680..42c63b9b9 100644 --- a/src/routing/global-routing/global-route-manager-impl.cc +++ b/src/routing/global-routing/global-route-manager-impl.cc @@ -1110,7 +1110,7 @@ GlobalRouteManagerImpl::FindOutgoingInterfaceId (Ipv4Address a) // the node at the root of the SPF tree. This is the node for which we are // building the routing table. // - std::vector >::iterator i = NodeList::Begin (); + NodeList::Iterator i = NodeList::Begin (); for (; i != NodeList::End (); i++) { Ptr node = *i; @@ -1183,7 +1183,7 @@ GlobalRouteManagerImpl::FindOutgoingInterfaceId (Ipv4Address a, Ipv4Mask amask) // the node at the root of the SPF tree. This is the node for which we are // building the routing table. // - std::vector >::iterator i = NodeList::Begin (); + NodeList::Iterator i = NodeList::Begin (); for (; i != NodeList::End (); i++) { Ptr node = *i; @@ -1274,7 +1274,7 @@ GlobalRouteManagerImpl::SPFIntraAddRouter (SPFVertex* v) // ID corresponding to the root vertex. This is the one we're going to write // the routing information to. // - std::vector >::iterator i = NodeList::Begin (); + NodeList::Iterator i = NodeList::Begin (); for (; i != NodeList::End (); i++) { Ptr node = *i; @@ -1395,7 +1395,7 @@ GlobalRouteManagerImpl::SPFIntraAddTransit (SPFVertex* v) // ID corresponding to the root vertex. This is the one we're going to write // the routing information to. // - std::vector >::iterator i = NodeList::Begin (); + NodeList::Iterator i = NodeList::Begin (); for (; i != NodeList::End (); i++) { Ptr node = *i; From 74f9163b2451a2ac57345e858022db0ab3ec8a20 Mon Sep 17 00:00:00 2001 From: Raj Bhattacharjea Date: Tue, 28 Aug 2007 10:20:13 -0400 Subject: [PATCH 05/18] Remove references to really-simple-point-to-point, fix build --- examples/wscript | 4 ---- 1 file changed, 4 deletions(-) diff --git a/examples/wscript b/examples/wscript index cb0af9530..e5e771555 100644 --- a/examples/wscript +++ b/examples/wscript @@ -10,10 +10,6 @@ def build(bld): ['point-to-point', 'internet-node']) obj.source = 'simple-point-to-point.cc' - obj = bld.create_ns3_program('really-simple-point-to-point', - ['point-to-point', 'internet-node']) - obj.source = 'really-simple-point-to-point.cc' - obj = bld.create_ns3_program('csma-one-subnet', ['csma', 'internet-node']) obj.source = 'csma-one-subnet.cc' From afbb95d98712c9b5b68a882f654119ef78bea2a2 Mon Sep 17 00:00:00 2001 From: "Gustavo J. A. M. Carneiro" Date: Tue, 28 Aug 2007 16:53:01 +0100 Subject: [PATCH 06/18] Build the ns3 library in the build/ root, not in build//src. --- src/wscript | 14 +++----------- wscript | 5 +++++ 2 files changed, 8 insertions(+), 11 deletions(-) diff --git a/src/wscript b/src/wscript index 1e20fb75c..859021e66 100644 --- a/src/wscript +++ b/src/wscript @@ -39,11 +39,9 @@ def configure(conf): conf.sub_config('simulator') blddir = os.path.abspath(os.path.join(conf.m_blddir, conf.env.variant())) - conf.env['NS3_MODULE_PATH'] = [os.path.join(blddir, 'src')] - for module in all_modules: - module_path = os.path.join(blddir, 'src', module) - if Params.g_options.enable_rpath: - conf.env.append_value('RPATH', '-Wl,-rpath=%s' % (module_path,)) + conf.env['NS3_MODULE_PATH'] = [os.path.join(blddir)] + if Params.g_options.enable_rpath: + conf.env.append_value('RPATH', '-Wl,-rpath=%s' % (os.path.join(blddir),)) ## Used to link the 'run-tests' program with all of ns-3 code conf.env['NS3_MODULES'] = ['ns3-' + module.split('/')[-1] for module in all_modules] @@ -64,12 +62,6 @@ def build(bld): bld.add_subdirs(list(all_modules)) - ## Create a single ns3 library containing all modules - lib = bld.create_obj('cpp', 'shlib') - lib.name = 'ns3' - lib.target = 'ns3' - lib.add_objects = list(bld.env_of_name('default')['NS3_MODULES']) - class Ns3Header(Object.genobj): """A set of NS-3 header files""" diff --git a/wscript b/wscript index 48b731729..6c1ca5339 100644 --- a/wscript +++ b/wscript @@ -165,6 +165,11 @@ def build(bld): bld.add_subdirs('src') bld.add_subdirs('samples utils examples') + ## Create a single ns3 library containing all modules + lib = bld.create_obj('cpp', 'shlib') + lib.name = 'ns3' + lib.target = 'ns3' + lib.add_objects = list(bld.env_of_name('default')['NS3_MODULES']) def shutdown(): #import UnitTest From a88243575793143bcf4b13a00961f37273496410 Mon Sep 17 00:00:00 2001 From: "Gustavo J. A. M. Carneiro" Date: Tue, 28 Aug 2007 16:54:07 +0100 Subject: [PATCH 07/18] Add some tweaks to enable building under emacs. --- wscript | 3 +++ 1 file changed, 3 insertions(+) diff --git a/wscript b/wscript index 6c1ca5339..c72b75e1e 100644 --- a/wscript +++ b/wscript @@ -145,6 +145,9 @@ def create_ns3_program(bld, name, dependencies=('simulator',)): def build(bld): + print "Entering directory `%s/build'" % Params.g_build.m_curdirnode.abspath() + Params.g_cwd_launch = Params.g_build.m_curdirnode.abspath() + bld.create_ns3_program = types.MethodType(create_ns3_program, bld) variant_name = bld.env_of_name('default')['NS3_ACTIVE_VARIANT'] From e20b40ee6196fa1ad955b93ca766b1eae451c11e Mon Sep 17 00:00:00 2001 From: Mathieu Lacage Date: Wed, 29 Aug 2007 09:35:53 +0200 Subject: [PATCH 08/18] backout 9856d1175cbb:642d6798feaa:27dd3e15308a --- samples/main-simple.cc | 3 +- src/applications/onoff-application.cc | 3 +- src/devices/csma/csma-net-device.cc | 60 +++++++++++-------- src/devices/csma/csma-net-device.h | 4 +- .../point-to-point-net-device.cc | 27 +++++---- .../point-to-point-net-device.h | 2 +- src/internet-node/arp-l3-protocol.cc | 5 +- src/internet-node/arp-l3-protocol.h | 2 +- src/internet-node/ipv4-end-point.cc | 4 +- src/internet-node/ipv4-end-point.h | 6 +- src/internet-node/ipv4-l3-protocol.cc | 29 +++++---- src/internet-node/ipv4-l3-protocol.h | 12 ++-- src/internet-node/ipv4-static-routing.cc | 2 +- src/internet-node/ipv4-static-routing.h | 2 +- src/internet-node/udp-l4-protocol.cc | 2 +- src/internet-node/udp-l4-protocol.h | 2 +- src/internet-node/udp-socket.cc | 13 ++-- src/internet-node/udp-socket.h | 10 ++-- src/node/drop-tail-queue.cc | 35 +++++++---- src/node/drop-tail-queue.h | 4 +- src/node/ipv4.h | 6 +- src/node/net-device.cc | 4 +- src/node/net-device.h | 8 +-- src/node/node.cc | 2 +- src/node/node.h | 4 +- src/node/packet-socket.cc | 10 ++-- src/node/packet-socket.h | 6 +- src/node/queue.cc | 42 ++++++------- src/node/queue.h | 14 ++--- src/node/socket.h | 4 +- 30 files changed, 179 insertions(+), 148 deletions(-) diff --git a/samples/main-simple.cc b/samples/main-simple.cc index 2039a55c3..7285f4946 100644 --- a/samples/main-simple.cc +++ b/samples/main-simple.cc @@ -14,8 +14,7 @@ static void GenerateTraffic (Ptr socket, uint32_t size) { std::cout << "at=" << Simulator::Now ().GetSeconds () << "s, tx bytes=" << size << std::endl; - Packet p(size); - socket->Send (p); + socket->Send (Packet (size)); if (size > 0) { Simulator::Schedule (Seconds (0.5), &GenerateTraffic, socket, size - 50); diff --git a/src/applications/onoff-application.cc b/src/applications/onoff-application.cc index 512c454f3..32bcd7564 100644 --- a/src/applications/onoff-application.cc +++ b/src/applications/onoff-application.cc @@ -206,8 +206,7 @@ void OnOffApplication::ScheduleStopEvent() void OnOffApplication::SendPacket() { NS_ASSERT (m_sendEvent.IsExpired ()); - Packet p(m_pktSize); - m_socket->Send(p); + m_socket->Send(Packet (m_pktSize)); m_totBytes += m_pktSize; m_lastStartTime = Simulator::Now(); m_residualBits = 0; diff --git a/src/devices/csma/csma-net-device.cc b/src/devices/csma/csma-net-device.cc index 610ec9b6c..531bf7314 100644 --- a/src/devices/csma/csma-net-device.cc +++ b/src/devices/csma/csma-net-device.cc @@ -274,12 +274,13 @@ CsmaNetDevice::DoNeedsArp (void) const bool CsmaNetDevice::SendTo ( - Packet& packet, + const Packet& packet, const Address& dest, uint16_t protocolNumber) { - NS_DEBUG ("CsmaNetDevice::SendTo (" << &packet << ")"); - NS_DEBUG ("CsmaNetDevice::SendTo (): UID is " << packet.GetUid () << ")"); + Packet p = packet; + NS_DEBUG ("CsmaNetDevice::SendTo (" << &p << ")"); + NS_DEBUG ("CsmaNetDevice::SendTo (): UID is " << p.GetUid () << ")"); NS_ASSERT (IsLinkUp ()); @@ -288,10 +289,10 @@ CsmaNetDevice::SendTo ( return false; Eui48Address destination = Eui48Address::ConvertFrom (dest); - AddHeader(packet, destination, protocolNumber); + AddHeader(p, destination, protocolNumber); // Place the packet to be sent on the send queue - if (m_queue->Enqueue(packet) == false ) + if (m_queue->Enqueue(p) == false ) { return false; } @@ -300,10 +301,11 @@ CsmaNetDevice::SendTo ( // transmission (see TransmitCompleteEvent) if (m_txMachineState == READY) { - if (m_queue->IsEmpty()) return true; // Nothing else to do // Store the next packet to be transmitted - m_currentPkt = m_queue->Dequeue(); - TransmitStart(); + if (m_queue->Dequeue (m_currentPkt)) + { + TransmitStart(); + } } return true; } @@ -387,8 +389,9 @@ CsmaNetDevice::TransmitAbort (void) m_currentPkt.GetUid () << ")"); // Try to transmit a new packet - if (m_queue->IsEmpty()) return; //No packet to transmit - m_currentPkt = m_queue->Dequeue (); + bool found; + found = m_queue->Dequeue (m_currentPkt); + NS_ASSERT_MSG(found, "IsEmpty false but no Packet on queue?"); m_backoff.ResetBackoffTime(); m_txMachineState = READY; TransmitStart (); @@ -435,10 +438,18 @@ CsmaNetDevice::TransmitReadyEvent (void) NS_ASSERT_MSG(m_txMachineState == GAP, "Must be in interframe gap"); m_txMachineState = READY; - if (m_queue->IsEmpty()) return; // No more to transmit, remain ready // Get the next packet from the queue for transmitting - m_currentPkt = m_queue->Dequeue (); - TransmitStart (); + if (m_queue->IsEmpty()) + { + return; + } + else + { + bool found; + found = m_queue->Dequeue (m_currentPkt); + NS_ASSERT_MSG(found, "IsEmpty false but no Packet on queue?"); + TransmitStart (); + } } TraceResolver * @@ -484,31 +495,32 @@ CsmaNetDevice::AddQueue (Ptr q) } void -CsmaNetDevice::Receive (Packet& packet) +CsmaNetDevice::Receive (const Packet& packet) { EthernetHeader header (false); EthernetTrailer trailer; Eui48Address broadcast; Eui48Address destination; + Packet p = packet; - NS_DEBUG ("CsmaNetDevice::Receive UID is (" << packet.GetUid() << ")"); + NS_DEBUG ("CsmaNetDevice::Receive UID is (" << p.GetUid() << ")"); // Only receive if send side of net device is enabled if (!IsReceiveEnabled()) { - m_dropTrace (packet); + m_dropTrace (p); return; } if (m_encapMode == RAW) { ForwardUp (packet, 0, GetBroadcast ()); - //m_dropTrace (packet); + m_dropTrace (p); return; } - packet.RemoveTrailer(trailer); - trailer.CheckFcs(packet); - packet.RemoveHeader(header); + p.RemoveTrailer(trailer); + trailer.CheckFcs(p); + p.RemoveHeader(header); broadcast = Eui48Address::ConvertFrom (GetBroadcast ()); destination = Eui48Address::ConvertFrom (GetAddress ()); @@ -516,11 +528,11 @@ CsmaNetDevice::Receive (Packet& packet) (header.GetDestination() != destination)) { // not for us. - m_dropTrace (packet); + m_dropTrace (p); return; } - m_rxTrace (packet); + m_rxTrace (p); // // protocol must be initialized to avoid a compiler warning in the RAW // case that breaks the optimized build. @@ -535,7 +547,7 @@ CsmaNetDevice::Receive (Packet& packet) break; case LLC: { LlcSnapHeader llc; - packet.RemoveHeader (llc); + p.RemoveHeader (llc); protocol = llc.GetType (); } break; case RAW: @@ -543,7 +555,7 @@ CsmaNetDevice::Receive (Packet& packet) break; } - ForwardUp (packet, protocol, header.GetSource ()); + ForwardUp (p, protocol, header.GetSource ()); return; } diff --git a/src/devices/csma/csma-net-device.h b/src/devices/csma/csma-net-device.h index 0650b111a..62bbceab5 100644 --- a/src/devices/csma/csma-net-device.h +++ b/src/devices/csma/csma-net-device.h @@ -195,7 +195,7 @@ enum CsmaEncapsulationMode { * @see CsmaChannel * \param p a reference to the received packet */ - void Receive (Packet& p); + void Receive (const Packet& p); bool IsSendEnabled (void); bool IsReceiveEnabled (void); @@ -270,7 +270,7 @@ private: * \param protocolNumber -- this parameter is not used here * \return true if success, false on failure */ - virtual bool SendTo (Packet& p, const Address& dest, uint16_t protocolNumber); + virtual bool SendTo (const Packet& p, const Address& dest, uint16_t protocolNumber); /** * Start Sending a Packet Down the Wire. diff --git a/src/devices/point-to-point/point-to-point-net-device.cc b/src/devices/point-to-point/point-to-point-net-device.cc index 2cb026062..a071f9246 100644 --- a/src/devices/point-to-point/point-to-point-net-device.cc +++ b/src/devices/point-to-point/point-to-point-net-device.cc @@ -117,17 +117,18 @@ void PointToPointNetDevice::SetInterframeGap(const Time& t) m_tInterframeGap = t; } -bool PointToPointNetDevice::SendTo (Packet& packet, const Address& dest, +bool PointToPointNetDevice::SendTo (const Packet& packet, const Address& dest, uint16_t protocolNumber) { - NS_DEBUG ("PointToPointNetDevice::SendTo (" << &packet << ", " << &dest << ")"); - NS_DEBUG ("PointToPointNetDevice::SendTo (): UID is " << packet.GetUid () << ")"); + Packet p = packet; + NS_DEBUG ("PointToPointNetDevice::SendTo (" << &p << ", " << &dest << ")"); + NS_DEBUG ("PointToPointNetDevice::SendTo (): UID is " << p.GetUid () << ")"); // GFR Comment. Why is this an assertion? Can't a link legitimately // "go down" during the simulation? Shouldn't we just wait for it // to come back up? NS_ASSERT (IsLinkUp ()); - AddHeader(packet, protocolNumber); + AddHeader(p, protocolNumber); // // This class simulates a point to point device. In the case of a serial @@ -138,16 +139,16 @@ bool PointToPointNetDevice::SendTo (Packet& packet, const Address& dest, // trnsmission; otherwise we send it now. if (m_txMachineState == READY) { - return TransmitStart (packet); + return TransmitStart (p); } else { - return m_queue->Enqueue(packet); + return m_queue->Enqueue(p); } } bool -PointToPointNetDevice::TransmitStart (Packet& p) +PointToPointNetDevice::TransmitStart (Packet &p) { NS_DEBUG ("PointToPointNetDevice::TransmitStart (" << &p << ")"); NS_DEBUG ( @@ -183,8 +184,8 @@ void PointToPointNetDevice::TransmitComplete (void) // NS_ASSERT_MSG(m_txMachineState == BUSY, "Must be BUSY if transmitting"); m_txMachineState = READY; - if (m_queue->IsEmpty()) return; // Nothing to do at this point - Packet p = m_queue->Dequeue(); + Packet p; + if (!m_queue->Dequeue(p)) return; // Nothing to do at this point TransmitStart(p); } @@ -235,9 +236,11 @@ void PointToPointNetDevice::Receive (Packet& p) { NS_DEBUG ("PointToPointNetDevice::Receive (" << &p << ")"); uint16_t protocol = 0; - m_rxTrace (p); - ProcessHeader(p, protocol); - ForwardUp (p, protocol, GetBroadcast ()); + Packet packet = p; + + m_rxTrace (packet); + ProcessHeader(packet, protocol); + ForwardUp (packet, protocol, GetBroadcast ()); } Ptr PointToPointNetDevice::GetQueue(void) const diff --git a/src/devices/point-to-point/point-to-point-net-device.h b/src/devices/point-to-point/point-to-point-net-device.h index a2c86e93a..fa3d3b838 100644 --- a/src/devices/point-to-point/point-to-point-net-device.h +++ b/src/devices/point-to-point/point-to-point-net-device.h @@ -211,7 +211,7 @@ private: * @param protocolNumber Protocol Number used to find protocol touse * @returns true if success, false on failure */ - virtual bool SendTo (Packet& p, const Address& dest, + virtual bool SendTo (const Packet& p, const Address& dest, uint16_t protocolNumber); /** * Start Sending a Packet Down the Wire. diff --git a/src/internet-node/arp-l3-protocol.cc b/src/internet-node/arp-l3-protocol.cc index 041c50e14..100f1df88 100644 --- a/src/internet-node/arp-l3-protocol.cc +++ b/src/internet-node/arp-l3-protocol.cc @@ -84,11 +84,12 @@ ArpL3Protocol::FindCache (Ptr device) } void -ArpL3Protocol::Receive(Ptr device, Packet& p, uint16_t protocol, const Address &from) +ArpL3Protocol::Receive(Ptr device, const Packet& p, uint16_t protocol, const Address &from) { ArpCache *cache = FindCache (device); ArpHeader arp; - p.RemoveHeader (arp); + Packet packet = p; + packet.RemoveHeader (arp); NS_DEBUG ("ARP: received "<< (arp.IsRequest ()? "request" : "reply") << " node="<GetId ()<<", got request from " << diff --git a/src/internet-node/arp-l3-protocol.h b/src/internet-node/arp-l3-protocol.h index 82d8dd29e..a2ea8227e 100644 --- a/src/internet-node/arp-l3-protocol.h +++ b/src/internet-node/arp-l3-protocol.h @@ -53,7 +53,7 @@ public: /** * \brief Recieve a packet */ - void Receive(Ptr device, Packet& p, uint16_t protocol, const Address &from); + void Receive(Ptr device, const Packet& p, uint16_t protocol, const Address &from); /** * \brief Perform an ARP lookup * \param p diff --git a/src/internet-node/ipv4-end-point.cc b/src/internet-node/ipv4-end-point.cc index cdd78c303..69faf523e 100644 --- a/src/internet-node/ipv4-end-point.cc +++ b/src/internet-node/ipv4-end-point.cc @@ -65,7 +65,7 @@ Ipv4EndPoint::SetPeer (Ipv4Address address, uint16_t port) } void -Ipv4EndPoint::SetRxCallback (Callback callback) +Ipv4EndPoint::SetRxCallback (Callback callback) { m_rxCallback = callback; } @@ -77,7 +77,7 @@ Ipv4EndPoint::SetDestroyCallback (Callback callback) } void -Ipv4EndPoint::ForwardUp (Packet &p, Ipv4Address saddr, uint16_t sport) +Ipv4EndPoint::ForwardUp (const Packet &p, Ipv4Address saddr, uint16_t sport) { if (!m_rxCallback.IsNull ()) { diff --git a/src/internet-node/ipv4-end-point.h b/src/internet-node/ipv4-end-point.h index 06192d500..f606aa63b 100644 --- a/src/internet-node/ipv4-end-point.h +++ b/src/internet-node/ipv4-end-point.h @@ -43,17 +43,17 @@ public: void SetPeer (Ipv4Address address, uint16_t port); - void SetRxCallback (Callback callback); + void SetRxCallback (Callback callback); void SetDestroyCallback (Callback callback); - void ForwardUp (Packet &p, Ipv4Address saddr, uint16_t sport); + void ForwardUp (const Packet &p, Ipv4Address saddr, uint16_t sport); private: Ipv4Address m_localAddr; uint16_t m_localPort; Ipv4Address m_peerAddr; uint16_t m_peerPort; - Callback m_rxCallback; + Callback m_rxCallback; Callback m_destroyCallback; }; diff --git a/src/internet-node/ipv4-l3-protocol.cc b/src/internet-node/ipv4-l3-protocol.cc index b44a0a013..be483dfa0 100644 --- a/src/internet-node/ipv4-l3-protocol.cc +++ b/src/internet-node/ipv4-l3-protocol.cc @@ -221,7 +221,7 @@ Ipv4L3Protocol::SetDefaultRoute (Ipv4Address nextHop, void Ipv4L3Protocol::Lookup (Ipv4Header const &ipHeader, - Packet& packet, + Packet packet, Ipv4RoutingProtocol::RouteReplyCallback routeReply) { for (Ipv4RoutingProtocolList::const_iterator rprotoIter = m_routingProtocols.begin (); @@ -310,7 +310,7 @@ Ipv4L3Protocol::FindInterfaceForDevice (Ptr device) } void -Ipv4L3Protocol::Receive( Ptr device, Packet& p, uint16_t protocol, const Address &from) +Ipv4L3Protocol::Receive( Ptr device, const Packet& p, uint16_t protocol, const Address &from) { uint32_t index = 0; for (Ipv4InterfaceList::const_iterator i = m_interfaces.begin (); i != m_interfaces.end (); i++) @@ -322,25 +322,26 @@ Ipv4L3Protocol::Receive( Ptr device, Packet& p, uint16_t protocol, co } index++; } + Packet packet = p; Ipv4Header ipHeader; - p.RemoveHeader (ipHeader); + packet.RemoveHeader (ipHeader); if (!ipHeader.IsChecksumOk ()) { return; } - if (Forwarding (p, ipHeader, device)) + if (Forwarding (packet, ipHeader, device)) { return; } - ForwardUp (p, ipHeader); + ForwardUp (packet, ipHeader); } void -Ipv4L3Protocol::Send (Packet& packet, +Ipv4L3Protocol::Send (Packet const &packet, Ipv4Address source, Ipv4Address destination, uint8_t protocol) @@ -364,10 +365,12 @@ Ipv4L3Protocol::Send (Packet& packet, ifaceIter != m_interfaces.end (); ifaceIter++, ifaceIndex++) { Ipv4Interface *outInterface = *ifaceIter; - NS_ASSERT (packet.GetSize () <= outInterface->GetMtu ()); - packet.AddHeader (ipHeader); - m_txTrace (packet, ifaceIndex); - outInterface->Send (packet, destination); + Packet packetCopy = packet; + + NS_ASSERT (packetCopy.GetSize () <= outInterface->GetMtu ()); + packetCopy.AddHeader (ipHeader); + m_txTrace (packetCopy, ifaceIndex); + outInterface->Send (packetCopy, destination); } } else @@ -388,7 +391,7 @@ Ipv4L3Protocol::Send (Packet& packet, void Ipv4L3Protocol::SendRealOut (bool found, Ipv4Route const &route, - Packet& packet, + Packet packet, Ipv4Header const &ipHeader) { if (!found) @@ -413,7 +416,7 @@ Ipv4L3Protocol::SendRealOut (bool found, bool -Ipv4L3Protocol::Forwarding (Packet& packet, Ipv4Header &ipHeader, Ptr device) +Ipv4L3Protocol::Forwarding (Packet const &packet, Ipv4Header &ipHeader, Ptr device) { for (Ipv4InterfaceList::const_iterator i = m_interfaces.begin (); i != m_interfaces.end (); i++) @@ -468,7 +471,7 @@ Ipv4L3Protocol::Forwarding (Packet& packet, Ipv4Header &ipHeader, Ptr void -Ipv4L3Protocol::ForwardUp (Packet& p, Ipv4Header const&ip) +Ipv4L3Protocol::ForwardUp (Packet p, Ipv4Header const&ip) { Ptr demux = m_node->QueryInterface (Ipv4L4Demux::iid); Ptr protocol = demux->GetProtocol (ip.GetProtocol ()); diff --git a/src/internet-node/ipv4-l3-protocol.h b/src/internet-node/ipv4-l3-protocol.h index 8254f27e6..2cce3efa3 100644 --- a/src/internet-node/ipv4-l3-protocol.h +++ b/src/internet-node/ipv4-l3-protocol.h @@ -118,7 +118,7 @@ public: * - implement a per-NetDevice ARP cache * - send back arp replies on the right device */ - void Receive( Ptr device, Packet& p, uint16_t protocol, const Address &from); + void Receive( Ptr device, const Packet& p, uint16_t protocol, const Address &from); /** * \param packet packet to send @@ -129,7 +129,7 @@ public: * Higher-level layers call this method to send a packet * down the stack to the MAC and PHY layers. */ - void Send (Packet& packet, Ipv4Address source, + void Send (Packet const &packet, Ipv4Address source, Ipv4Address destination, uint8_t protocol); @@ -151,7 +151,7 @@ public: uint32_t interface); void Lookup (Ipv4Header const &ipHeader, - Packet& packet, + Packet packet, Ipv4RoutingProtocol::RouteReplyCallback routeReply); uint32_t GetNRoutes (void); @@ -183,10 +183,10 @@ private: void SendRealOut (bool found, Ipv4Route const &route, - Packet& packet, + Packet packet, Ipv4Header const &ipHeader); - bool Forwarding (Packet& packet, Ipv4Header &ipHeader, Ptr device); - void ForwardUp (Packet& p, Ipv4Header const&ip); + bool Forwarding (Packet const &packet, Ipv4Header &ipHeader, Ptr device); + void ForwardUp (Packet p, Ipv4Header const&ip); uint32_t AddIpv4Interface (Ipv4Interface *interface); void SetupLoopback (void); TraceResolver *InterfacesCreateTraceResolver (TraceContext const &context) const; diff --git a/src/internet-node/ipv4-static-routing.cc b/src/internet-node/ipv4-static-routing.cc index 37e8a74df..b70c1c1af 100644 --- a/src/internet-node/ipv4-static-routing.cc +++ b/src/internet-node/ipv4-static-routing.cc @@ -210,7 +210,7 @@ Ipv4StaticRouting::RemoveRoute (uint32_t index) bool Ipv4StaticRouting::RequestRoute (Ipv4Header const &ipHeader, - Packet& packet, + Packet packet, RouteReplyCallback routeReply) { Ipv4Route *route = LookupStatic (ipHeader.GetDestination ()); diff --git a/src/internet-node/ipv4-static-routing.h b/src/internet-node/ipv4-static-routing.h index 439af8cf7..8462f55a7 100644 --- a/src/internet-node/ipv4-static-routing.h +++ b/src/internet-node/ipv4-static-routing.h @@ -52,7 +52,7 @@ public: Ipv4StaticRouting () : m_defaultRoute (0) {} virtual bool RequestRoute (Ipv4Header const &ipHeader, - Packet& packet, + Packet packet, RouteReplyCallback routeReply); diff --git a/src/internet-node/udp-l4-protocol.cc b/src/internet-node/udp-l4-protocol.cc index 9dacbf961..f0ef8569b 100644 --- a/src/internet-node/udp-l4-protocol.cc +++ b/src/internet-node/udp-l4-protocol.cc @@ -122,7 +122,7 @@ UdpL4Protocol::Receive(Packet& packet, } void -UdpL4Protocol::Send (Packet& packet, +UdpL4Protocol::Send (Packet packet, Ipv4Address saddr, Ipv4Address daddr, uint16_t sport, uint16_t dport) { diff --git a/src/internet-node/udp-l4-protocol.h b/src/internet-node/udp-l4-protocol.h index 70e2b0ccc..4d7a082d4 100644 --- a/src/internet-node/udp-l4-protocol.h +++ b/src/internet-node/udp-l4-protocol.h @@ -74,7 +74,7 @@ public: * \param sport The source port number * \param dport The destination port number */ - void Send (Packet& packet, + void Send (Packet packet, Ipv4Address saddr, Ipv4Address daddr, uint16_t sport, uint16_t dport); /** diff --git a/src/internet-node/udp-socket.cc b/src/internet-node/udp-socket.cc index 45b8b82b6..a2bde3224 100644 --- a/src/internet-node/udp-socket.cc +++ b/src/internet-node/udp-socket.cc @@ -155,7 +155,7 @@ UdpSocket::Connect(const Address & address) return 0; } int -UdpSocket::Send (Packet &p) +UdpSocket::Send (const Packet &p) { if (!m_connected) { @@ -165,7 +165,7 @@ UdpSocket::Send (Packet &p) return DoSendTo (p, m_defaultAddress, m_defaultPort); } int -UdpSocket::DoSendTo (Packet &p, const Address &address) +UdpSocket::DoSendTo (const Packet &p, const Address &address) { InetSocketAddress transport = InetSocketAddress::ConvertFrom (address); Ipv4Address ipv4 = transport.GetIpv4 (); @@ -173,7 +173,7 @@ UdpSocket::DoSendTo (Packet &p, const Address &address) return DoSendTo (p, ipv4, port); } int -UdpSocket::DoSendTo (Packet& p, Ipv4Address ipv4, uint16_t port) +UdpSocket::DoSendTo (const Packet &p, Ipv4Address ipv4, uint16_t port) { if (m_endPoint == 0) { @@ -195,7 +195,7 @@ UdpSocket::DoSendTo (Packet& p, Ipv4Address ipv4, uint16_t port) return 0; } int -UdpSocket::SendTo(const Address &address, Packet &p) +UdpSocket::SendTo(const Address &address, const Packet &p) { if (m_connected) { @@ -209,7 +209,7 @@ UdpSocket::SendTo(const Address &address, Packet &p) } void -UdpSocket::ForwardUp (Packet &packet, Ipv4Address ipv4, uint16_t port) +UdpSocket::ForwardUp (const Packet &packet, Ipv4Address ipv4, uint16_t port) { if (m_shutdownRecv) { @@ -217,7 +217,8 @@ UdpSocket::ForwardUp (Packet &packet, Ipv4Address ipv4, uint16_t port) } Address address = InetSocketAddress (ipv4, port); - NotifyDataReceived (packet, address); + Packet p = packet; + NotifyDataReceived (p, address); } }//namespace ns3 diff --git a/src/internet-node/udp-socket.h b/src/internet-node/udp-socket.h index 9ceec713f..b3674f7ef 100644 --- a/src/internet-node/udp-socket.h +++ b/src/internet-node/udp-socket.h @@ -51,8 +51,8 @@ public: virtual int ShutdownSend (void); virtual int ShutdownRecv (void); virtual int Connect(const Address &address); - virtual int Send (Packet &p); - virtual int SendTo(const Address &address,Packet &p); + virtual int Send (const Packet &p); + virtual int SendTo(const Address &address,const Packet &p); private: @@ -60,10 +60,10 @@ private: friend class Udp; // invoked by Udp class int FinishBind (void); - void ForwardUp (Packet &p, Ipv4Address ipv4, uint16_t port); + void ForwardUp (const Packet &p, Ipv4Address ipv4, uint16_t port); void Destroy (void); - int DoSendTo (Packet &p, const Address &daddr); - int DoSendTo (Packet &p, Ipv4Address daddr, uint16_t dport); + int DoSendTo (const Packet &p, const Address &daddr); + int DoSendTo (const Packet &p, Ipv4Address daddr, uint16_t dport); Ipv4EndPoint *m_endPoint; Ptr m_node; diff --git a/src/node/drop-tail-queue.cc b/src/node/drop-tail-queue.cc index 5b802acec..74c8fde17 100644 --- a/src/node/drop-tail-queue.cc +++ b/src/node/drop-tail-queue.cc @@ -73,26 +73,39 @@ DropTailQueue::DoEnqueue (const Packet& p) return true; } -Packet -DropTailQueue::DoDequeue () +bool +DropTailQueue::DoDequeue (Packet& p) { - NS_DEBUG("DropTailQueue::DoDequeue ( )"); - NS_ASSERT(!IsEmpty()); - Packet p = m_packets.front (); + NS_DEBUG("DropTailQueue::DoDequeue (" << &p << ")"); + + if (m_packets.empty()) + { + NS_DEBUG("DropTailQueue::DoDequeue (): Queue empty"); + return false; + } + + p = m_packets.front (); m_packets.pop (); NS_DEBUG("DropTailQueue::DoDequeue (): Popped " << &p << " <= true"); - return p; + return true; } -Packet -DropTailQueue::DoPeek () +bool +DropTailQueue::DoPeek (Packet& p) { - NS_DEBUG("DropTailQueue::DoPeek ( )"); - NS_ASSERT(!IsEmpty()); + NS_DEBUG("DropTailQueue::DoPeek (" << &p << ")"); - return m_packets.front (); + if (m_packets.empty()) + { + NS_DEBUG("DropTailQueue::DoPeek (): Queue empty"); + return false; + } + + p = m_packets.front (); + + return true; } }; // namespace ns3 diff --git a/src/node/drop-tail-queue.h b/src/node/drop-tail-queue.h index 6febe0eab..2e4c76461 100644 --- a/src/node/drop-tail-queue.h +++ b/src/node/drop-tail-queue.h @@ -58,8 +58,8 @@ public: private: virtual bool DoEnqueue (const Packet& p); - virtual Packet DoDequeue (); - virtual Packet DoPeek (); + virtual bool DoDequeue (Packet &p); + virtual bool DoPeek (Packet &p); private: std::queue m_packets; diff --git a/src/node/ipv4.h b/src/node/ipv4.h index b4d22c520..76d88faea 100644 --- a/src/node/ipv4.h +++ b/src/node/ipv4.h @@ -46,7 +46,7 @@ class Ipv4Header; // FIXME: ipv4-header.h needs to move from module class Ipv4RoutingProtocol : public Object { public: - // void (*RouteReply) (bool found, Ipv4Route route, Packet& packet, Ipv4Header const &ipHeader); + // void (*RouteReply) (bool found, Ipv4Route route, Packet packet, Ipv4Header const &ipHeader); /** @@ -65,7 +65,7 @@ public: * inserted and consequently the protocol type has to change). * */ - typedef Callback RouteReplyCallback; + typedef Callback RouteReplyCallback; /** * \brief Asynchronously requests a route for a given packet and IP header @@ -100,7 +100,7 @@ public: * insert any extra header. */ virtual bool RequestRoute (const Ipv4Header &ipHeader, - Packet& packet, + Packet packet, RouteReplyCallback routeReply) = 0; }; diff --git a/src/node/net-device.cc b/src/node/net-device.cc index 11566a028..e3b9537aa 100644 --- a/src/node/net-device.cc +++ b/src/node/net-device.cc @@ -171,7 +171,7 @@ NetDevice::DisablePointToPoint (void) // Receive packet from above bool -NetDevice::Send(Packet& p, const Address& dest, uint16_t protocolNumber) +NetDevice::Send(const Packet& p, const Address& dest, uint16_t protocolNumber) { if (m_isUp) { @@ -197,7 +197,7 @@ NetDevice::GetChannel (void) const // Receive packets from below bool -NetDevice::ForwardUp(Packet& p, uint16_t param, const Address &from) +NetDevice::ForwardUp(const Packet& p, uint16_t param, const Address &from) { bool retval = false; diff --git a/src/node/net-device.h b/src/node/net-device.h index 061df3441..cc93e6420 100644 --- a/src/node/net-device.h +++ b/src/node/net-device.h @@ -158,7 +158,7 @@ public: * * \return whether the Send operation succeeded */ - bool Send(Packet& p, const Address& dest, uint16_t protocolNumber); + bool Send(const Packet& p, const Address& dest, uint16_t protocolNumber); /** * \returns the node base class which contains this network * interface. @@ -187,7 +187,7 @@ public: * \returns true if the callback could handle the packet successfully, false * otherwise. */ - typedef Callback,Packet &,uint16_t,const Address &> ReceiveCallback; + typedef Callback,const Packet &,uint16_t,const Address &> ReceiveCallback; /** * \param cb callback to invoke whenever a packet has been received and must @@ -251,7 +251,7 @@ public: * forwards it to the higher layers by calling this method * which is responsible for passing it up to the Rx callback. */ - bool ForwardUp (Packet& p, uint16_t param, const Address &address); + bool ForwardUp (const Packet& p, uint16_t param, const Address &address); /** @@ -274,7 +274,7 @@ public: * method. When the link is Up, this method is invoked to ask * subclasses to forward packets. Subclasses MUST override this method. */ - virtual bool SendTo (Packet& p, const Address &dest, uint16_t protocolNumber) = 0; + virtual bool SendTo (const Packet& p, const Address &dest, uint16_t protocolNumber) = 0; /** * \returns true if this NetDevice needs the higher-layers * to perform ARP over it, false otherwise. diff --git a/src/node/node.cc b/src/node/node.cc index 5fdd50bb8..ee83e8588 100644 --- a/src/node/node.cc +++ b/src/node/node.cc @@ -213,7 +213,7 @@ Node::UnregisterProtocolHandler (ProtocolHandler handler) } bool -Node::ReceiveFromDevice (Ptr device, Packet &packet, +Node::ReceiveFromDevice (Ptr device, const Packet &packet, uint16_t protocol, const Address &from) { bool found = false; diff --git a/src/node/node.h b/src/node/node.h index 1538350be..f4d898f53 100644 --- a/src/node/node.h +++ b/src/node/node.h @@ -158,7 +158,7 @@ public: /** * A protocol handler */ - typedef Callback, Packet &,uint16_t,const Address &> ProtocolHandler; + typedef Callback, const Packet &,uint16_t,const Address &> ProtocolHandler; /** * \param handler the handler to register * \param protocolType the type of protocol this handler is @@ -210,7 +210,7 @@ private: */ virtual void NotifyDeviceAdded (Ptr device); - bool ReceiveFromDevice (Ptr device, Packet &packet, + bool ReceiveFromDevice (Ptr device, const Packet &packet, uint16_t protocol, const Address &from); void Construct (void); TraceResolver *CreateDevicesTraceResolver (const TraceContext &context); diff --git a/src/node/packet-socket.cc b/src/node/packet-socket.cc index 7e0095d79..f642eee9e 100644 --- a/src/node/packet-socket.cc +++ b/src/node/packet-socket.cc @@ -186,7 +186,7 @@ PacketSocket::Connect(const Address &ad) } int -PacketSocket::Send (Packet &p) +PacketSocket::Send (const Packet &p) { if (m_state == STATE_OPEN || m_state == STATE_BOUND) @@ -198,7 +198,7 @@ PacketSocket::Send (Packet &p) } int -PacketSocket::SendTo(const Address &address, Packet &p) +PacketSocket::SendTo(const Address &address, const Packet &p) { PacketSocketAddress ad; if (m_state == STATE_CLOSED) @@ -262,7 +262,7 @@ PacketSocket::SendTo(const Address &address, Packet &p) } void -PacketSocket::ForwardUp (Ptr device, Packet &packet, +PacketSocket::ForwardUp (Ptr device, const Packet &packet, uint16_t protocol, const Address &from) { if (m_shutdownRecv) @@ -270,7 +270,7 @@ PacketSocket::ForwardUp (Ptr device, Packet &packet, return; } - //Packet p = packet; ? + Packet p = packet; PacketSocketAddress address; address.SetPhysicalAddress (from); @@ -279,7 +279,7 @@ PacketSocket::ForwardUp (Ptr device, Packet &packet, NS_DEBUG ("PacketSocket::ForwardUp: UID is " << packet.GetUid() << " PacketSocket " << this); - NotifyDataReceived (packet, address); + NotifyDataReceived (p, address); } }//namespace ns3 diff --git a/src/node/packet-socket.h b/src/node/packet-socket.h index be4ade908..8dc1b9e62 100644 --- a/src/node/packet-socket.h +++ b/src/node/packet-socket.h @@ -82,15 +82,15 @@ public: virtual int ShutdownSend (void); virtual int ShutdownRecv (void); virtual int Connect(const Address &address); - virtual int Send (Packet &p); - virtual int SendTo(const Address &address,Packet &p); + virtual int Send (const Packet &p); + virtual int SendTo(const Address &address,const Packet &p); private: private: void Init (void); - void ForwardUp (Ptr device, Packet &packet, + void ForwardUp (Ptr device, const Packet &packet, uint16_t protocol, const Address &from); int DoBind (const PacketSocketAddress &address); virtual void DoDispose (void); diff --git a/src/node/queue.cc b/src/node/queue.cc index ad79109c0..72eafed69 100644 --- a/src/node/queue.cc +++ b/src/node/queue.cc @@ -49,7 +49,7 @@ QueueTraceType::IsEnqueue (void) const { return m_type == ENQUEUE; } -bool +bool QueueTraceType::IsDequeue (void) const { return m_type == DEQUEUE; @@ -122,25 +122,28 @@ Queue::Enqueue (const Packet& p) return retval; } -Packet -Queue::Dequeue () +bool +Queue::Dequeue (Packet &p) { - NS_ASSERT(!IsEmpty()); - NS_DEBUG("Queue::Dequeue ( )"); + NS_DEBUG("Queue::Dequeue (" << &p << ")"); - Packet p = DoDequeue (); + bool retval = DoDequeue (p); - m_nBytes -= p.GetSize (); - m_nPackets--; - - NS_ASSERT (m_nBytes >= 0); - NS_ASSERT (m_nPackets >= 0); - - NS_DEBUG("Queue::Dequeue (): m_traceDequeue (p)"); + if (retval) + { + m_nBytes -= p.GetSize (); + m_nPackets--; - m_traceDequeue (p); + NS_ASSERT (m_nBytes >= 0); + NS_ASSERT (m_nPackets >= 0); - return p; + NS_DEBUG("Queue::Dequeue (): m_traceDequeue (p)"); + + const Packet packet = p; + m_traceDequeue (packet); + } + + return retval; } void @@ -151,13 +154,12 @@ Queue::DequeueAll (void) NS_ASSERT (!"Don't know what to do with dequeued packets!"); } -Packet -Queue::Peek () +bool +Queue::Peek (Packet &p) { - NS_ASSERT(!IsEmpty()); - NS_DEBUG("Queue::Peek ( )"); + NS_DEBUG("Queue::Peek (" << &p << ")"); - return DoPeek (); + return DoPeek (p); } diff --git a/src/node/queue.h b/src/node/queue.h index 915642f09..d135fff68 100644 --- a/src/node/queue.h +++ b/src/node/queue.h @@ -83,16 +83,14 @@ public: bool Enqueue (const Packet& p); /** * Remove a packet from the front of the Queue - * Must not be called on an empty queue. - * \return The packet removed from the queue + * \return True if the operation was successful; false otherwise */ - Packet Dequeue (); + bool Dequeue (Packet &p); /** * Get a copy of the item at the front of the queue without removing it - * Must NOT be called on an empty queue - * \return The packet at the head of the queue. + * \return True if the operation was successful; false otherwise */ - Packet Peek (); + bool Peek (Packet &p); /** * XXX Doesn't do anything right now, think its supposed to flush the queue @@ -165,8 +163,8 @@ public: private: virtual bool DoEnqueue (const Packet& p) = 0; - virtual Packet DoDequeue () = 0; - virtual Packet DoPeek () = 0; + virtual bool DoDequeue (Packet &p) = 0; + virtual bool DoPeek (Packet &p) = 0; protected: // called by subclasses to notify parent of packet drops. diff --git a/src/node/socket.h b/src/node/socket.h index 1a28bd71d..c717ec0a5 100644 --- a/src/node/socket.h +++ b/src/node/socket.h @@ -173,7 +173,7 @@ public: * \returns -1 in case of error or the number of bytes copied in the * internal buffer and accepted for transmission. */ - virtual int Send (Packet &p) = 0; + virtual int Send (const Packet &p) = 0; /** * \brief Send data to a specified peer. @@ -182,7 +182,7 @@ public: * \returns -1 in case of error or the number of bytes copied in the * internal buffer and accepted for transmission. */ - virtual int SendTo(const Address &address,Packet &p) = 0; + virtual int SendTo(const Address &address,const Packet &p) = 0; protected: void NotifyCloseCompleted (void); From 0261a0b79557e809dd72b6b9bc367df0c17843c5 Mon Sep 17 00:00:00 2001 From: "Gustavo J. A. M. Carneiro" Date: Wed, 29 Aug 2007 12:31:17 +0100 Subject: [PATCH 09/18] New WAF, avoids the bright yellow color (hard to read on light background terminals) problem. --- waf | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/waf b/waf index d4f80d72a..94a2a37a2 100755 --- a/waf +++ b/waf @@ -11,7 +11,7 @@ if 'PSYCOWAF' in os.environ: pass VERSION="1.1.1" -REVISION="1272724989" +REVISION="1420549696" INSTALL=sys.platform=='win32' and 'c:/temp' or '/usr/local' cwd = os.getcwd() @@ -334,5 +334,5 @@ except KeyboardInterrupt: Params.fatal('build interrupted') #prof.runcall(Scripting.Main) #prof.close() # ===>BEGIN WOOF<=== -#6<\%_0gSqh;d"&i4hUq"'EA+4s8;Tjs8W-!s8W-!s8W+l!!!?/+s8Ri#QQOmTF;*7jW*^\\1'ZCz!!!!q-n#&q!!"DJF2"&p-aW8SQY$K"!EWV\h!&gY=W_6RV_sr\722cZ@k5kdqqg'$4*["='$#2".3/jH9s\UR>BX?ohY0*=H[;!kmGlsVII%EnT7)!(/U>#5gO6P<#sP`m!Um]ST#;0S]:$Hk8J3V550%G+n!@)?&(e/H?7rG4)HopHecsJV&*NLld/Hf'i_/tW]OXF=:('"e7,sVH,!!!'c"B6'9h=&$=^$;/b<7!LN[75n*Zqu06hetOCfNT/9Dgh)`hX=R2Efmj*fjoK.pmJmh!ZlhGA_fKbKkV"UYb%$WeaM<&g4,qXHU?d8^JOF*%JYrh=IR.4^RKF+eA55]5<0hXk9hhme9(rh6nrgMn6Nkn!3?hPcO46ZarrBDYD60?/F#=^#"+FY%MhCpYKIuY'4`L\G(EBC%lKlo_[gcA*S!'f@;scf6;#ph"9uKijR_*D0sg5$f:Wk<&O(2&%?WII<;NeC$o1g)ql6Ep?UE"Nr&N6G4/jfDnaO=GIt<\efO_Thd*tkIJ(4`BhH+Q#Q^mriANd<)9A\4n"42=kb]#^DkT=Q+gDA3H_e&T"!!)5_8bRSiDY<_tcb@q:I-rM#g:)F^8p<2]2gLe?Ch*\7]tNjs020r>=5RnDp%7PBoC![Th72o`a:#<,9:j0fl5oft]63B-8kZn]AUbg83'YpRHGrfg4g+/H\r+?>S>Dp@l24g/m%jC0ZVQ)bTehQ#4*Z0as)4J9k`J:5(m&jtEVkI2Cd(dA8ktHLJ>Oq"f]f[(ArhIYKc]5c[J4lPj>D'k5f4*NGO&PAu:]C+\NPC%]toII(/+.rjfDHbJ5>YJ"KR9b7j=!Wi@V5S+A-^`Z.ASs`%sVkPt8ct"&3+92BEVEkcF#RCJ7dh#E,Ua`\jeFbS3IT5tX)L@B"cl+_GW#>Xm!!!'e,X>9.":V:+!hL&PR0f"X"2lLC,L^ae2!71_m!MBDm!$Oo>7Ynt_-@c@Y'Z*!^lAs)Wb%=WB+[&Uq:JF)fo`,M!)?9a<-DDVJ5ThD;C,#pWnI_3hrA9lerC5s2rjl;?[PrL=C^1!mZZe!*tIsVMZ(`(aR.`!.f;1JL3$GX5;7lqq$d-4`p%rY43r4;oek6HHf2F7+PXA[5XV*Bupng8)TXXs/-lT#^Lr&'K\Qer#dXd]Cp9.mP/tTC5VP&D[`VCFf?)?KI(kK#j'?aArSC"kcMIcb*fhrE/IY4>tHlu3H)Ah!H-i1UBF'l\7*5d+pSd1QOXU,!m6;[+S$'LH\EG3'I_C+N!$1+S/Xm_TYp[$6OMM\6Lb6b*.a-p;-K&GIBY.2IRIl@iLl5p?iV9MI)>9,,>qBHsO9J<7OV9E@'%8]A1sm`T">r#7"I2AP!)c`-72/oZir6"9Mht@'bEYs>A0_+@O`e!+[VTQ,*mbQ@MkIV,ab5MJ;Rm1To+GYM@*`88=G8?VHB"STV@=D@OPt6W$J$fBOrV0-n:U?TqWGT)3R<'+G(dC#_jNq)Ib1,>+qU`+UFmB$"/oE,)@E]?m$q1UnJ'U.Z0+@Tr)7cTa@*BMCN#0R2R2uW%(AjLkp^6BkX<1+KC9kU5#VBVIGXKMJ/ENBh9S)#UtS0W!JK8Ob0EsOt%T2AdOWpL*EIOR"upf-A#uq,&+'S80FTSLkLp,)CV;9#(W'V-DcSHBLnA\MPLQHP"K1eAL_-r8j]2$VMZQGLhMrCWD*jo,`%84-5_l%R\YP4L4UiuKRtP68gn/"@=a;&Q6mHJMBWplV&>(7?mI-KAf;jaQ@pBZ,(`[L+fYkPMO&jYR"d$q#a,dfC8-<[TI;3\BHdMWBI6'7!2Z?]W$7BI?t"kI.&qkJ,"R<:+K-2M7Tro_AeJK$JqHOW+IZDhOb-D](mZ;<-<-ZfU4S,bUo&ho7ZjDj8qJI#TSaj!8.L7A5OGNrUM3&urTn]Eg-)cPD@SiIqMNSm/Slm3`R%],3Jk.=W&djAM@L?:RLm4k_,c%/s-n,4lV'ZOA8=EFKWgWKh9Z06^$?/C!";NW7[_\dIUgcrPJ=%OS,a+k"J;Aek8n+6X.OgL7@UUO:!\.rR$;uD+TI(j`A;DM1.12K;Jf./f6>2T-$4;Alj9`\$MOGf"Ad#,I."R2?ROKF/Q)\:")AWV`Q=L>+&V64AJfnSL5&_'@ps7.?K-IZV'a579&5jd\,u[c/!":Q"j'b"&p;H+ea78+=fPg%KR1ntUN6j/aV1a;%"NZ\#;YI8)[;g:(0\g+"[p4);+3hYV0!=_9X?R[7$95[9$sJT&HP3&O`LjtPbL`($qNep!s(e@ZS9oT&4EcH'b`9;!N7IPM5ckEL+%o_,%:ldL/=ONLl-_F&;C?3O['7>&u[4OVML)DU,&Si.L%#gU`lV.AccM9-jl=SR"f1($7$euLe:9K,%a`MMF:np8r8gB$C4SgU0o/fBVd,O&o*L!gnk--N=JCZZ!$m5S-jV+i$5eGP#_7SiU*,;(Weq-s,p=akM5?VL?m1pb&gaD$Th5lr=GR7j>"V8A&qq_>KHQoui<`0P6df7/R(:fIE;s9Rh\PANrmt=orCFh8'mg]"&D+6a)#:/O,i7]."+Kk[%NKSXO=J%mE@,6@Y(6bULL%6.d^;cXHK:qZJ:8KP!pG`23s2hRo84Zi5UdTim3('<_H)XgLVl\#513k/Q#3cl`d7h&Rj3TeY;1*>tbQaFbj#WruKf!VX19?TD=Br:$=O%N29X.*&1$`lL11)H)i?%XV@p[U;VQQ[[c4ZB@DaB4ipr+-jD.-ZO/16>8I.*S&6"o2s/jEoeFIh,FP[e8'qD$Z%eZgi@9Q,Q*'8IP&q-0H/-;4SUf7Ypi`gsZGHd@2-AcEZP_]+.kAe^[m&`i27$HZH@%)@*)OU!_`["OMM86CRjNHCdhIEdRTM(-S/9BL\Be31535IL<.-G$Tt3r>h];r+"U>WB7=tpLQo,6Q-SpD]>m4+f[Y-,`BJ?5dVXkj`A@2`I3^Ai[Dr&_^l5]IS)i(Tdtjts6;E,1G&HRr+4X3eFpm?pS!-J*Q7n.f'J`K]nEIh\_)%^3>8&k\;D1nO@h&3rbD-Xlcb5N\meD5/I>uqMHC2VRcV>oD\p0VCPTTUJ))f,tRL^i2q79mgDt2"2f10:,Y5"=-"Aknk*4;R=O%JHT7l8VEJ]X*k-4W_Q06+0X6E7d-f'/X(2gJlnLN/j:gCPo'R@5/@a==0`c>h&b,Z%ZaC(k*\iC<1-#*@G;1\T-!<"nfL./i2oOWt[p$lGa8q,\W]ZI!bloqU&Q(g]0d)=!X]4RP'nn+[AQER9o`,d2f,DJgI9hi(r>I_5BM@H]`E9ADm@F;O*9nh9!E_cea<66EK;j0YLDt.?#"Q5A.6$4qL0P)K:Hn"0E\V*hgdBoC@&$=^#(M$u]@U5A;L0nQ-'U`qjYlCPa-gborMSi;+MA4a./,B&%-;uZE'_%ib&79A#8oo55h69cr[.o!\/n"O&?W>*-YeOrH05(;R"qalZ2.[*EZK_ab&$WVWqI5AD^2j`\6CP_^Nc/sU$'-X!cbuoB>sn04b7PF0<@Bf+Vp2Pl6*d&!H&N1@Ppeu(:lRCbWI^ubgb^(Ob7YOENEE0#>ruLrrGL[b73^[>WO=8t88-15.=b>N-R^teA:n6%f1XolP4Q:8liPMXq9@"d\QosaAJ6b]*7PaDbOM8,[^:l>:7u:M\7t>k#96+r]aI@j4W+`^I3iOX9bk"S,4hQ,X_*No0jeZo*?=]'1XQddQE!q'\H;P%JHI"SCr[>d?W`^RMWqDeb)I9%pkXgAd)mc@hZda*MKqe?QZ]1tGN9HMuYXV.j%)!YY.85D9d>=H]%"B^=U!s)ZDO=0=WP^&EaiY'6-h:[^:b$qkK4c%B9iK?q+jGU#c!aohaW]HP3aF?;54mK/uX=Q;Hd@/$_E?JG3E[dX6&.:$nHlE"fO^NWXNa2m8BT\:rcR8GE5QP8^s%)u-Cf87lQu%06?+g.eJ/;sgIm,bE_W%jO]jONnI7g!8CUQN/-i"AGX%Jp4UmC7p1cpM=370Zml%qO3_-tUd25k_.@/Y">(HT\&3V7Q]DHZ'WDB$0n6b.ku"XWUVkT.n]BLo'^`*&`D#M)dMBBBLn2DcD!js/-:&@%!2dGrum&\J.HC2D5H:RH__So_Q@A,T'16ZS12\C+a:L0#D`I.l)#mn7W*u'=AE")m4#J(hLY3a3`5pb;*ZO/gb>#DYuS`UiuG&2+q44-=u)[9BLIOn)uC2tQS>rc.S;64;'cpN7XXKQl=Xr#2&faVMODc@=48cJ`rcp4U9VJIkLe-:>at<4LKT1VnC6@^A?F6,-6H3kFaN@gK>TV&&!WKCj[GA&.rn?ZG9&r$r;Wobm_'@P9t_m:8&@8AG2Y_7LTtHDF]'8uS;<1/MNOM>+MP"tcsE&>"t)?J*7oq0OiiA1N)Lo0Z;V=2!tZS+n+IW1OIJDpq$k(FdsdW\!@4.K`&oEuo&iU*ou`a3B#J>QYiEUP9_m!P5=98Wdk&Mup8KY!MH4pA75gU&p>pMYSSs9C?I4i`LRa^;CJ6&bP"?q,`jR\OY6Y=.g6>]aT?YEVYe8gc50l;p\)>P:BQ.&?!E4d;]_%3`eVbt3&Km8tOdP(Rq>T:\RP$T"/d`:-f!kZg[[%[&HiqLN;+VE[oI:W`g(JL>m%`ALdZcW[]BtJ/eaQ"s2-3FL-aSej(52.*W39HOJkrB5\h?%bL$52>k9h^;i1`B(b+:nbd]khhO3m[=AKq8(/MN9M+p'Q.g)*"c7X('tJI1Te(m97@$4`t%d$R@"n+k)G"Q5AP_j9o1Wt,-94*.CNed5-Tf7I0o\b(UBmdJo3l/;OY;2OskdTLRdFb4usk"^U.^3.OmA_kfs3=EP""rMIOnV/R;C#DU"!'Hl#D_s\*bm[/Q>!#Rc+.Ee%NGP1;RQkSl0^*IT$V_Lo\*pF:2F2Ou1[K.S@Uk9(-*T:'7KSm-flXA#jcV^83=$W-H;Ju&I\1tn%Xh(iA_ir>KQ=-`I_[[]@f:*#g4-g@8s`nbl'dZmnU+>=XBl2UZPj%fd)K-,/;J[(I8N?[8HMFR8DbqY4+uKS7:1CU_k$/CO&#\EnXT+a:`l;TLuHbZOtcT=@:sE8*5WJrbRANK6C(LpR"'IikHf*+SG6^JbiPD&oIp'5YJHng#\Krf$K%@EUNUnUadjk!&+]H^pe[P7*%7G;)@p3&0f[@=_J"NhI!,B;Wq"35P=b'9Ytbc"0V2*L7);PSma#k'\&t!`4ql;0,7U\fK.YqP/92EVs`(jT47'3:Mu65H7K#UQi*"QuunXRXo_\AMDHSj2O$-o<5$o+Otu13:d!L$45[@fKo@'6UQ'rlNlH0E`?"[o*PaL-dg*YS[H$7%mFN,RI#3%K"gUPFbp%FfRkc]6@GH$8V3)g&#p_1YH[=?uoGZ"gC6JuN#eNt%;6\JN%_gJb[T>uB]0.U#PK;'U@iTTGrgTNZ*j'%MgreIXKG.n[QX35NMIsU-4+G&E)>-spd9hVI)98([)2L,'_F"bcYEP*e&09!hpU6$cn[I1Q<+si3?C[RTO'@Po7rN1p+T\;dOclDV^PiRT?O&I7u^G,9]lJ3bd,#j<,N!'j-qkle*Uer=K*67dB`/%sD:GG!\8?%"jQMV>KLn(ZK'58J6s!$d_XB^aAd=pSa1c0T@bZlh.$kuSr3t?t02+&Ttk??6LBMpkn5hMa*:enlp13J#OJ?k;'e/`O.-o&7^?4^j?VT$,u;4?nl/HH6pFU;0,5hhjn8_/MPT;Ypi;C?ul[21a'&e)=b3D)J88+LG-N0r33-"$+3'YA54=IR^pMi9CdDK$cC[Xsqc)/2M`Q2PbW,p`e6ST@uWj\*Eg-^;@sD'@0,rN\IQ0giBdQ:QF!cRWbT!`5>a0ZEY4]/s^u&V,Zo7Z%gF766l*PA.)%qI'CmGR2PS^p0:Sg@'XJ^$n=V1.13_W%6Af'j)4FNudHG:=1'RO&oAZcW;.D=/pC=>jL?'H'AZFLTSb"n/k?LI*5="c^FuHVH>78Vlk'Pd6Wbt;OlLB+K6r:NpNZ/OI?t,C^5?<#8g[e6*\OVE0%/VGj3*$t@oLon`g9KH+%%l$53N]:H,Z7r%#nX%o2;t'c$FXo#40Ej>GKNsf(=KeQ8fN%E1;u`)jB"]+Uer[K-[-8s7D8@?U2PfFWY?^32"%pIkDB\u:Y:E$7g]*-/LEfZAESDg7N#,GS^:+ru%@F]/BYe<6SE6QD9:LVK;)^r,'oiR#-Zn[FnX>l>VKqNSH!VhGrc7u))BhSP4"!\dYpJd2ja:,[0noDPUf/[H<;"X#Ccf?K]U:'iHT<*RA6b?d6*B]BP%LG(,)FQ8mT@\Pmn@X0edU?.1.FNc_toqK;eT-PbsccN;/Z:&BHn#308AT+Ca&%u?shS^4#`pA?[KPo*[l.1/=E?rH`4?K51FiA^P1Wp*PH#+m6A\@r7+2>AKo!ZrCV_dp"QT%9m5CA3np`5',<2M%2YB+=7pDlgC/=9.H^rM%mMTfcP6/_\1`ud]3r7&m^p%m'/eNU"d^:)I"i3HJ_[&n8)l.scYks7'[qn;k)4gjWb&P+!%<('b_da,=hcfa*8*VnS3=,+,C]j'-iLYYXRY$#acmU0P])TUG7`YqtmmZFjRHYGfFPSA$jS$hBk::\3*H+`l_P$:UkHLZf#n=/HL?#sfX9!>mCG%bdP[/L7`=b<(R1<"F>n%gkn\^\CeZPV@%YU.fsT`:K)N=p?9$m7+(2IK*gEs,XliWtd\7l9A*agp&ifEjNr95js](pH<.\s]dRa<#@Me4-m*YLUY?g':_%llV5OuE<2eRi+^AC[X-@f-,q^,,Gu3HM=j<>5^PkBp%nQ[4b:$1U-XDnR\6AETaUM55S+MkcPBm$^F>]%H&&i2L8/ONRf?GICGHZ7r45MkL\dYr2nRiF_Fsu]6Too0]E/7^E9bBtU2_?H'N;Ka!HTY]ooA)YUqtEJ67Q_b"t>epq%H2CB*j.bGh&P;:(QPT`qA?$mA"iYURG(bmpeJir3t@rilZ3Ai>ZJ4Ioke]5_#/8.KO!E?o5_KVteR?'a6k9J^a(8"6]>3kXeI%d#,N*Cl*#FT:j5V8T[/hhMWW!_oLrP0g;;BAnFNeTte3ogKR'Tmjpiq2&p3Ro.uH"b)PYd\dk*DDB!f;m942i)=_lXf`;B5X?8J0C>]m],N5r01J;?tN\iGRPD"U8H"N9TK&74Q)aJfk`blt#Z)BK=UD'4FM]nBYZL1D^1eq-=b0D/(L4k*^oFZg"(iIn)5]L3D)6P4ma>)$A9>G&63A<'DgtuD:-eZR&,kL;DVdne[6^EWG#0JZLaNl<_WM>]BYiji\4:fY`hX94@A("9t3FK8b@D#tWgiQA_+Yd*\"HXm+3!qd-b$+lWmec,?5"%b)`>>n=^"D9OLI]Fd)p]7bUf>E`S(._o,jeQXK!`juoI1E\p;?`GK\2YJ2Cb(O\Yf3jef*H`C>.]!N5)m]G5bS'TsK6oL[p#56h6Ma0U!_F0/(NDs6oHV_(>]cqO+(+pbo[4ZO#89A,W2Kr-a:pPZ3$uKegS8"I.D5;[j.2XH!-4OG0X.pL(p6r4+Y[7!Xd\)IgihQ9r6=J5&F$%#]]7&kY>,An'>KT;qAKt,E&/GpFr*1Hb5?gmL.,r/p-moj<&Fi%Vp*_D;V%jg1YgndHlMZ_J"QWFf-CO@T82e@lQ0R/e@Mpl2)+4iN^So;$aNC!mqX65kZqB:s0-57'`XER9955;lFCT.&rfj<>O((0h5h3=k7QX+75WCbK,*a>55MadBJ[IUsa*#]:spcdRk.$W(OlP&+EnpO<$n'"gb9.-In7bN[bjn\RpFEB9O_E!rR[[@VVU1jI05IK)E*fGm93Q*6oa]Tq[@-5I\r4YN*kI`Y_gAAiA?=^B3I#/_u3illV4`lkRNQmu>PJu6m$6if`/-I[ZeLO6qL`n6ojAr9/l-7?tZ;a6,/?jsV))c,:pJf"_iV,TjAJMerD4q12,Bh8L"!pJ:LVqqU\"LlK6"D<-VX4PVenMlW;K/W$?oqn-3D;a+Tol%p$FetrT28M_PSR+NWuLg^VX(d3*d3YgOGoPEn=dq"7.I*5A>@SY3G$IR8;2M&IQu%HHJ;,$OMVlrT>:rH%nhPpA1S#ko[!;E:;8fT:arAQb1-KWVZfC$MHtA:[na<_qaV5-MN!=HWq!#2uO]loeDhaaUQPdSQmQa:\/9rdkB,81-g&JS-,<>#j2U*p?s+q+X*Mqfq;nbDpI5Wo\2YOjWc*#^JBOF2PVkP'cKY_]3&2_=&@:'Zgi!%5J-e"P%>75IMo-#/#A>:Ua#n=AE%]U%`KaO`o_Ga?f!3-+6*QL-h##FuZE:Vl/*o0tuf]GM83H":6D!Cqli*0&]&dqYf8Pq`/C/FZU6BPD>m-I6HG7mIjJ9i3[)c$(.ar:-aKiAB,FfjP!$j8,@KQ\t6&/*W-02_9(3GLYYl/l9!K0=;D.8'u?'@0sY4"+4&$:MSVeFh`iKPb_2ZE%*-TeQ4s-[_c'B'-W(Vq343N833=8-UIHYt`:qoV?l*YP@5]%ZbgrHoDG$>1tc`%=-cgJb@f"0]qf5K$>s]F_51T-a"HI2'%mINn\BcFD9!<1>V*M/[FQf]G',^ElLa)FXVTU40pLFWn=cl^4s4KAX%$nn:G\X*?J+5iJt\ZB_Dq\<%-g=Telt!`&AJj6sf;2?f17JG'@gTN=:Fnk#7"/_AGqXbF:gbDI7l,;jdQ+kfdeMVr#S_..8ZLhC-&GUY5&biX%g"c'0mLr2H>"gd&[eg3kh[/VM;)necEc+LFtFL[Kc\*Wcf/i\?!)0&oV]Y8V9Y"PBJlQEQc\3*aA+[#+Oj@'!k7F.+^f0FT]Xeg=cPLdI%q/"+YM\fPGf]90P`*`Cr@7k)^tV5f"Ni>?8&f,02dF:H4N)JU63j6G(>W,Y3e.g;_g.+!54-QK-`V;]hS/9V"/bANSpE$-N<U)c]!j*DsM9O4cT:OHJ<2\@\iP2BWJ[6YM\BVGh0,d`f`u3R-c.C.O<(#_OjE-_TeGM2'ruWd>,6h0+B!*#1CM:.O]h(ka3`L7%1^1KufY^$LSLIK`iD=`Nc?"/%IjVUFr^6JRg@CpC=,o@9=WpsYtT8&2s@ll?oND@CL%B[n1VZ*ndd#M-h?&'n07gFT++YjldS7]t=NjrU-#o\t?W1IE'A55uB,`CBe5a"bn2JL5%5hFi8i4u-b+*D16>P@))X6Al"u"_D]02^"t8)bl/M[_;7]N*OJ7Fq4O>Z$G.`(m3i=dYMe3N#liiC_bi'"6g=$q2-/5k.k7i%):\UX"RDE(Fq[(`.qH0_"G14C1tXMr)Z:%?60OlM,QU<'c"-ZW"l%X4M0cOT>.!co6amf]/fJA6m-kTL9VT'?$E')`'YT2?ogRmfs>4%=R5U4-KiF]'7gHkTpOa=*'$lNMuDH4O71)g"PmeYqK`GT)@1FNJ>'"h9#@SUc\ef9]6H#p]F89"#'h(66%G42Ik4@''jK9m;Y+Ot'u\XI2RnN,Q_8l\Ull06B`@jMGb,.mO+eJC?@lhZ5X1K+5ghO:g*>Z7q6N=L!R54h,*S4p"fGuB;*="[`1.n:2/tfq#b-K<+\5,H24hCVbE&:b;XlFp$UG]712)Tj2&mnA@23n9gYFpIE5Z_),KgQ)B?lP1aLP0fI-n&n4k.?,%c8mn$`MpQ&Kr*jnBdQP4*Ha>dKIHY_2D;<:Ug^f6^`9+W^rsA2-!+1HXQ(jbH.ecL\]0;JHL>Q&-ghM0fG#&lKVp%_ln[A!huY_h#6("_0hU<sFr_S"H1X_"pJ+_C15=$%*5U\H+f:N1KLF1e':.WD]\Ef3)pkQXa4^(*+tQ]oG4a/=o'On^lkng69Zj,N"N/?!._I$u-JXqogV*t9gP]ctY-AJN[I"T4ff9-gZ8*YR5R/Ok9jkEt2;TM(4,Wbu[kSYCk)."1b?l1U06&R(GW9`TQ"Z"5j.$AfZOLfERP/)7I\!WQZodIZPq>?iISQC+5_qt:Z#4R7I0m6ZM&8<+5^).&2h,K!LB?mEi"U+&,X.p3LnhocQMi0stBCYlk/NnAdj"1+Pnr5HFjW(X$HV0*k]#MJL5Y?b![0rGH)ifKdnYM;4Xc'^\[L]/qBqI&C[6p3r=!VJX-nMPZhR15,`oh&UK05_iRp=XK"KJA*\ORO[@;=P5,mA?>);o'r]A[r:AIi9#QR,XETrsBu[.DM5V9K3<@745.dh@irbg!kO\*(6JDYk(>0\d*GgY'=ZEn+6KN-Ifcg)aDU*9Tc8[-IMB'BFXdU[GCAUG96D75dr<4E+VWh%JGi-2(Q!pB20Zl-FB/d'?,#@GAtUI1T)A6YZWlP_\G$3G-7R:ueDWFLA3U*fiJNZA>c3f6^#H-R/aG*]=7lF;DJ5;G)rOShoi_J_epM]Xg)"D_@$STh4*44*fV]49"]HdKq.QhP4>\r-rdrI^ANS=>r%_Z#=RE%f(>-6N"+Z0s-58pJb#$3D%:Gn&l)!YN`8^[QgP?Q_t;sn]I6i`eNX&jCjKPlbpEO4=EN"*:#e3/?h3mr3F7pKR-Z=01Po+[enP>c[PoAp@i@cQ?Eg^&4U[*T,n._]2cfp[XQdgn@bJS=iOt(J=7@n:riNO'E[k`j!F,Q0o!d/Mn<7UnP9V,^$/T)q.-JlB1jg$i9]c.Ob(>-&k`=FBm4/5:=J^$NH,ee/Q5tm_@Z-FN6.4j.e,Ti9G5F^Xn*./l*X#%WaGWFa]2IX=>F_m-ki?qGF-RB-;l7L^Gop0We*1;=L"==;9tgeB?lFqD46b*/q@n2/RE:(VF3=EI,"7O;5(%Z-K%N[UFIb&jk,Vjm@d#d'.c-9c[dq[]!;U3\kARhn^_nM5f.WmdF(&?rIr8+L9$$hp;3WlWmtDVX8%Tr>/"WA+#ENKQ5C>D2]6%s5;o3X$Ze&%+:(PRNca.,0^Q@;o^9(u5=^i)JeKdEG(j.MX2F;J@s.59f'Q(;.Gg*2,&O4/LA1D>..6%,VoLQFsU+/?++#D3nc0+no64HpLD%"OHjpd(cWA8;62.&m#OkIm[9/1K^WbEg3eo8W-fo+_@g=WIt)pE5*W$1HHDXfU>+j$Pdc2.G6R,(Tdlr:e@l2&k@VGLI>g,>$>h#reffJ.'dgRr80Y0An)I0,?D/=-ChJCcM9Ino1t#eIdWip3jb=BMaecaVpge):,>GM6E!.4!"iAEM/ZCo4?L$U+/bPg)*MLX`A5mB^Mgu9nJ%0.UVnl5t9,#_D7@sAB5+q?;==$b8bcTg)%h#)9)O[Y!fl5:kEkeo6fq9X$js[)Lo_/(q)!I\ADdDG-GE$PY:&%5j+/5>1=tEF3@'tR@t'#Q3K=/pjLf&9J*>;McC[k-:p'UF,HtYIhJMV@q/ia6QCV!QJQ.KWo-N=-S5_`/uXbgX']bs4PDMmu,4I7r'8eL_:R'))AQP0D5bF415_=[UNcV5TjJ(EK,q7u6%I95cU.#L\tO\qNZfB5A3!@u_U`q&LXq+)+%momLlB(QO'tKG)Zlq*+^s.Dg+r9N[Q5c7"]1`6GH#,)&aKR#&!9)9J-ki:875/$h7&H#TrETbp77$!sF!N$1n?JVmg;>,X4(a*OK.q6l2Uo*pm$gQl#YHUF9&iHfW^&m0A#o`n*L:j.5GXDl;TTh=7%W]?28F2LZ7$MW:+4+Ai'rZJ5S,-IbTOY^9!YG.g(^s29C#leHp&\3bV]haatL4[g!9mm>!a(G#nf5XLAF>3,;2MBJkX'+#bkDnq3<4\6UD1p/h"Q4j.ah.oagD,*+4XU*-Q<2CEc%sWGpp4.keAkK%e1-nreX1a?NHH4oV.i=%iJl_>3c1>\=!5W6/Y"2'q^1gYM*GSA)DhY>&MVjj!S%[u34KdG$F[@&%jI"0,:gA]_1XNOJrpD<&pl9)?s0hQ_\L,PP.Y]b&o@]t2H*P]`9tJ@cX*/!C+#oifbKCAtf4.ZT9Q5F/%nPNp^j'`F?(sih7?E'V1jYVa,gIPqi\]u)"mEbJ3/&Js?--iHi:jkF*OQTo51rqeQt95-MXpbrVoPo"UE]@CGsfBepha%YEVR:aY4_fc\J??A?kOlk@6DWfq+4..s)+s*Ba':Z&*oB`ME\$n^%f@_bg=))M7<68ItFApRH%QVkiF)A%b7_Yq_>H7Y?;f3R/aS>;K?$%/,cmcH$IE%^t0\VqM#&rFm''l=EJ3UmmUn`AAkBq<9Z0IkV#2E=Op:RJ/@plnE`+7RUU15e!6%,HWZ\>]PC@'#4'7bPHXo?--pd:k;d'j>&.;\$K"o]==ES$H.Z*=/1cKL6*=C'CD'rGo$N/Bg&s1.TYoG*A[`<*o`lAOaUT&U6kmZf4k;Xr.^^pT5`p<68LeUY]:!FON,SP"?ptBJc`ejZ<,"5F0SA`m"8uLNqOI]5qj1r&9g8&^Z3AEC)pgF:\m]&$RT:uUn1eN_gTk3G.3TbQO@H;O]UL'Y]I8u9dtWLT95Nf3rU]=CTDTYN<[Wj#Eteo*p/X4C2QLNZ&tLI,5k]d9nh3l;;mSeU?4dOu]CpGnQ[nJ?jf6*]I21S^*m[&+e:]keJs)PUugjb5i[E2b/BiPHZ(fV,Qg/pu*53,W9[)4Y%a%6a%BC6Ri&[3b?&@!1da]Z1Ec]>3_p?.5Qp**+B?X"$TRpF2e"``=(G35%>[6kPn9C;1#%`lc$5Cfb.B6j;d<7S5oVmhr2.IbVS]EOFed1gcKn/-CEj,FWB?]Z>$Nj4+g%+`I.E-W=HK\s`.IS.,=KH&nAdLL>-0BtBM,6f353$RAooC%CUgZ(Mb3*9o.`"<76I57audlR+8,/E7%0XT9>41jXUMm`VK8nOhPrOr.Bh3k]1:+Zc8NS@Ar9.@SB1T_>borjQg'Nfe3hWE0?AO./d5ri4*jf=iGo*j4?1<%9Z*#nUqY'&NJ\gPr5uCIs!_';/gA0W@8%$G^j;7Rc1<^\Dr8X*,6%#HYSe!dm[54>%YJHDiRd1fS]NOggCFLlY!mF73jhAlpVH[a[R!H,fi;>iA1lCR&iSNK^=?^5[*"'c_G#!s`_+A`LqcY)`bHdJA/d+[$Br/-a1SNZ)KEnOb'G"0o\XHk[=MFmmR@RR24:+k;g]lC;2jio\kVfEEss!)a*^IC.ZoS[[TXm>SOT+X>`mlm40[$bj8p;<+jCADTL=s`3R)7tZ";Vr@A(-bMCE.3Q%ILj%ZiF!KV+Zu0%=a@DpbpA@uKW^-CY$mKOMsA>c27Kfh9;gSS&i42!(WA3bN%h4WAPi53l/!;3!IC4J*M"%!1/U'qmtm[%.Fbh6:KZXb$0M:VdlKHYM7$f@4WWJuF^tJY#nMULb@5Vi!P._`nY*r&rmnV_o9n5rX3$1n4`L+gsP+26Knt_+p"p!j5r[j$EraCEOV2C#V:Q'ae'EP9`&uponR):4/fsNTPZk1.VckoNML$MVEl#AH%Iu!o,NpG=[eIBk>lF_Lm^ne$.pBe:'M]r9'J]S1[*hEN6LaL=4&XTmcbTLQbH[n,AGPe?p6T$d5B4I#F8)+`$.'flcDmqZ,7uXL2QXDEpQ)`%uF04R.M>*Jd2o-KchWn1?qQlH]'do^+KLaVQ_\oB;n$!EJLWT6rgVmr"pHD?ppc!]T?qtM)rdq8\)Yhi/+=/G2Hpj5a<-L42m%Kk#I_f.chH5At!>?fuOIU2H\(hM)/P,\tuQ59$$D[K'Y1X".'Uf;@s138;Ks=+LNInLaj*%SDG/OCjcX6r'B`W)hC]s9eK/nn)ohFgZbJ+6)fD^<1Ah7O@#fq$G*SP6UMRg_rm1ZZR#'p).48\Mm[orkb/9t_&L9(F@?FC[sj"70Q<'h"(N8%)'cTs[$Y65^Dc^9"5Bgo?rILqANaeV's<3,PV*P>ZX#pVO!2Oo8Oat$[&mCTa];4t\ab:Nmq-aqE6l1KZYTfg1!1#,YQJ5&$ZUt":_e/6l"D-$l9HDP9:(VaIkrG/Cj(A;5;&#@=)0>!oK,Xp%BCoI2?CdndVM]L(lA&T1h,Z)Po6St-g*EcE6$T;cOA6gXV3DS=ca6=TZ)"lud2KDPAYeLbhJs;+<";%?2_:UuGX!n2!SA[r&'\W4+UdFj0?)HW%^i,Z@nY@oRdL`(*KPk,hHaQj.sQGaTe:.Chke/eMPi@;G<4hGqXg*nUDaeQN7OK#I!mlhR-D9PkFMNnqD./nEMASg8q$^1=n.-pkV9:M9s9C#YEm0nBl@@]>2^H"K&G!40d,o;-RdX4;Qr@d"'-1l&ce^;"+42f#>s4d7V>u1Gq)_Z>48BBomIY\b4?]X5A/*6\WX&@oSn;na:]"(pmC0oQpDuI1R=Ji5-6;_h'1BEI'*''5q'g6Rd*%[EJ-UVfj&^:E8K?tMV%Fus>'`t'@BRpK?1dVQT1+h#=/)nV#DdU+je+D&P$ABrolmq!Vpc'i@_>fj]:#rI^$cE7Y3rZ!)n8q!q2O>601WRh`bIa9]S,?7h>QZOd[RYG.GPVOl*F.45NIFt^BfU[7*i\"Cj;SA_/6u+mLf9>^r=!I>07aR(.`L2J>bfb.<3*@[mCKSEpB^YZXIl-C]h=q4GC6k_V%@T?HmQB:s#a4GHD&g*V7Jg'WUpVBnVhVG$e$U7gPsUra0%go'&T\iK6@*Ki54n5t?*qIg4C\f"cl!9qHY#?TXbK?);Pib_$DtU4c$4c1eSJ[++^23VdJ#9iq9.c1YCY9*=f^*GqM\'?-So69GlP#dgLWKdab]m[U$cAjM;K[n7&@dn<1-P$PK$mHJ^G+sYjSrJre.D6c<=!18Tnf]&9EXD$HtmGqaH`0]M>97[`C3P.>?G4N]Q[LZhE;*Ab:2pCiI=W0`rSn+K1\<_E],aZ*^?(9#=$%Xj(V@^QP;a8B:M81N5]Q1C\-YL0L9S>2*)d/iYSY-;nJ!J<3!$:Q[MtCBfN,XRV\D,=q99Lb5+T<6OY`oYDj6EcBFWiuB"A'DWujg2ZgeHPI,cFZk,_4$itfKl8mU".dAo\M7p)_8Bk7'RI'bn>-5\+CP1Z#G^0QWnW:)9SlXsAlb:dYZ.&um'a>!m^U4&ASd;]^4p@g*mTWKed=#]!lP+suP9V?eIe/H^pJ*[jPjP!(!6*/kh'2-3Y:`bOG[Q/)p"&^2J2<:Gu`0lY1YU2/A+!_!R9dnJGIkb)o<+tZ.&af6h0_9g-B\sm/?[L@@88nBE3j$;i=_F"N8/Z]*6+^oZ.cupROPphKl94/qI&f%s_LCiYr1an0<,g!HQ_B_GL6CBMU+u0ut:>iuUMPcd&K7[Y_O?l>ie5N.;\=M5gePo$M@LH$>YY3,a;IpRH.@I(;+@ss$#S\EsY&Pj8;,CB4-6k$<]O6\X35%jR=JH!B!6WJ)jdl;^Ht8@.oAkso;@A_PAkI%n";j5+D6&8Wn"-!S_7^,s2gnC*o)P!t@9R7Zuf+%rn0%dJZNH(7-SS)Vp\fsk`eZ;so)l$f#M+lL2jCQIEP%87f]'\5M-G/GSO'smkZ2W8tW3c5@99/l@"*:[\#_Ql0]sLEc7CsWs)@%__m>GELZ_,^^3ClFld71bX'GgBrt'_M$2-/prUhI"aS[B_<,>oI@T;"a-t4g8RFTmA`PL#o/gTf_(=?;6,*#5pDC'77n>t.CT[A5M"7MQ"V-u'I8I^i.o9\X<%(WMW7\'PLU6earg03tbGB@5a">E!lLqp^Fdp5)N+njYNc-p/F4B/tf$\k#1ga@Fl+Ms6gf$dP1rN!V6:!s'X:^)r1:JiIb7[lYj.PbWA5/T51LDMue3NUJ/2o&!<]$$u)SI`44s<V:q>TX+c,NAEWEsADEgO4cV.j_O\]HTmF^%JfqQDK^L)AuE;MqSV[gJYWHk*QWjU?=f`*M*"m]Z@9^fPWdLS6_\)/!U2pS9!QK^9Hchpi3Jb=^&O$G1ftm]2f_:lO#B?ZFE3)X3)5j(ojuF,uNB*(pPnBgY)@"^#Q"_@u63:i?&6+qF/HXq<]tmp9,o<6Mf5(ZCL>sSLl:i($+r#4VaHE@@GN&fOq$/qn(![mKJKFX'9gTom*!YQ((Z!E^'FKp2s'ogUi-[):@<&WX)7g>fWBNbZgkc*NC^u]2S/%MFmV!VX\sF_U!6hZ'8)A'DKTtGGA&7,Tf@Dol`FPkEiEI,OCIuN-B55GFm)aU/7ti$CYD>f/D`(.F-*\:;iG/ll''J>OC$7tp[[\*YfO+PR6\`%TA:?+`jt=$E&76o?4E6PWOkSXBa3XhYiT,_H.+(ND[cHq?#=*%3N@+scEheaMG,Kh'Jb?3&pib^a*O2KorVlP].(q$55X@/F=d.L9R7]Q8N,t*8$:qh0JLVq%n6OY5ue=(kjFQ76k"I1&pBn@N;IgkNqkB/@^P*!2X*>7HFRK)*8iZUiqN#0L:CpL$afWJ#CcU:@siW2?e:=qg1-*F@a/b3cKF&)Fs._1Af@%o7M:`(.%.2RQ&o/4M"]\&+YlVG4slH`V6q5Ag-M1"3lpq'WG+FHgTe.W6AWia.)4D,&C[M82rMJSCe!\79Tq<=+W3M01Wgg!MG)^@R=Q/Q^W/,%+]Hq7srWO%k]j[lW51Uprmnuf<./AMpB!XcD^C0ODqm*,FXtYk0*%#\!3cV1P.0)Y?U-eSLl^KADE0lDd`"pbb]cs1(G/go2#6E)UNp7K.^9lH"k=aGeD?2-e?8Z9PKWfmQFfFg'"q/YE8.!Ln/_agtQ*1;2Y="G$3o*gQ9[d27t]b$_>O0L.#HP[3[:/VkTS^c??=>)D/'ph=d`[-?&Lpn*j&fW;Jbe-10,3M%>o9]dY)C?*NqfFZ`F`NtnQD3lX0U3Y?M:k@rILa@W1%jRP)E0s\Kuc:-H.E_&`7YpK#$rWM)ihXaC&5pql>k*9p=3L-Eq2^.Q+@-X@J`?W0%ebdS$P/0;h7EOeAI0H)'`'K5.lq[[#"K+tdNd**qK6m=:b8g)q;QP;o4\@S"'U^,\g*Fu50#ef>+e))OGfjV.VZXKD/`r)s2^LU*5XPuh0F_O^n`\$RPPeM%pSiZOaR9q`rpL(:Wki0h=^bA&F"4RjTOqj7BD5(]l;RG\JbjZH%.2JdR8gq!*g674`X6,@>[.LYq*2/gg$sBT(HX6X_GhoZI\m^Ie`uLsI"^Q>PKIf[fi8?at++%=VBp;/1Cb5pgUHTFrFH"Cn$D+1//XHXVX3T-9aXU3#^a(lGGOjHF%F1m8BH3blgXnMqD/MBn@&LVk<6.)"@W't9`Ja%%TD7R)ajah1O\O>Eb%:bir=R`^_N7?m!^mEQl8niK0:OT.G2:_]$$$PM_gQdMSf8E("fF"ZK[*Fi0TS1'Cp%L(WPcHglh7`NP\;2,Nk]?HNB!L)ThrS*)P:.OMJqHiXJEl7WQl^rsa2XbC0fDe0g?i&dr7oCft`Q],52qdeL+nF"X/10n@r-:QnNmb[O>A%\"X#PU4>cHi83>ajfHe\a>V&uc+!/96^-[1*gNPjn2kuTDXKpk/uY&.k?f17C1#<3(SBTVe[L1(]8hXJV+R7eCoE:($$*#q>UX/A9*nFVIrrq3io1Q+<7N9(bPQ0hkdG&['.2L7I_cen%#[/uZr8qJ9i+6fgSo!cFT8eGKQ`kPSFDgZ8*SfX?9!N:".7k8[nRdDH9@KfM_i6D?nJe5(q.no;7a'%((,<2Co@qc@)$r)p2MPb%QNO(%Z[d=49cXFLFo"$r.*piJ?pjtL"A$f\Ia.53`CNH"eaJk^Mm^^0F#k"R5&ZT>AS-Wt`G--fR@%]-N7.02P#0V^dq^P(/\444"\V9n80bLd#f\>>O@6ol-$c6QiC*8U!Kg@0Vg)W.?*Pb,Mo^GI5Yo$2bmmD\8!YJ(oXj`WE,iG3HLm,'_1%+U=8#FNWl84gN6G[9A=RGWF0mDR()&h.WPA[Y6?1*d8dj'8!GA@d;ujcr7>+etSihB$SF^FG;Gd)5*/#+CC*%jh"$3h9'mdRnSR*"M@3:TlIa@+^:TnV,#B=]hS5^`-1E6);o>oeVS9\[j-n6NY.4>0+hQSRIOtc''GM(l]\-ZGt]CHr[2+klM+`-h)ckcadIfHOT`.V#_9N6tAii*2E?18m;GZtlq@YI>6M[Y0o6j:$`AQ8PLOOGlp7l+'++Y$QJfH"J0icmcq1_ta42`R1+?POh!7_QqJaWMP2Z?'qq,E%M+DWmIGHp`uR"khMo9:QnU\)G)H-XWk.3YupiL.a_9Ra5lps.n#,luqk>n$DQ#695eKD=*Xgi5-@.$,^+kKeMCaJ&!/Ga_%M6H+5Ba.aWn!7XGr!mN1cTb%U[;b85pB+tq#-ZTT(o>/k(4a%.gPC+S20-BQco7fs%i%T@Wjo&BrJO#TAO>>e+a&oA\Q:aT(ObQm/6nF`6dT&@.F1;bl5r%VoBJC%g_%M_.J_W4JhX)3jR,Z14#\o7Lb8^A^@/2Kj5/@8_SW,$GVATV70N;M?SKPbNbq-t%Y)qt\4%KV;"f(o(%uHkHAUgc8R=Bd'%%N"hGs+DB3>N'DPE'2YM='6ssOT[opaEG'b2hn/[ErBCA`8a!8UEE`?(1&b;$&'Oh(a3j#/8U,W`rS2&/n*0gW\GV9O>*^*\SprC]<4bA-[iR9a$c%[MBB=SK#G'cuIJH[[cau76ISH7_Ln(^>#2A+"H"F2&ERA(,-^!.$p&*Jn7"\jY)aY,#RTXq5Vtqc>n/:!,5'";Pa8/WiS_ZB3dddM,h&Y'9T?EkEZ!aecW$gp%c#_EVOe-`ggQDAYEgqIIr/LU=oBu!am/Ga/V1)*#&AA+krP'56cd?(un%[VKK_]tD[?b\%=6nS"bo]E`q'>uC=S7l'rcq'*aK95:G0l,J/+n@rFhRQsN3`!F1\\/VDf"/^.o>qr]J0'Sko3hro/ZC)h4B(%bR]-PrB\o!g$n$)g)kS-M)I)5hd61](Yn'*U5pB:^J5hV_f&ECrYM%AGAhE=n>uLg^JrnTcVLIVlht1nhaS3Uao9?VINPIQ_tS$2QgXA?-09&>'rO"`rh#D3M<@NZgoB"<4079_o=)S;ZfG\WZL&i:r'"(uK6iCP:ZB+u-i*ca?7aPer#]bXBk`KsJhQbD`W"?5+jf3p0_u?.&7U\5IG-XZ^CD93^D,k7Vi?c!2"([]p@H>]\*om^gd.T'a4C@!_4GQB$=7edW1fW&W1=]!^g.Z1MqG($!_h]Dk^e=%YiL7CbhS4SkYL*q:2XAI>fXOqBq36"h/@u2oA1JSoiL1!e)t@+Ge*S7fBg9/qgDc-93aQC*OYVfRqO40_08nNASdidW=p.'VUeG[,-pN6A]lcA[io;AM_oDmjrclNYQa`;jeIPlCrM@0)JdppuN*Z@;03Tt57Il;K(oDQ]!A6^sCQOd=UH65*>r2mi"%=2XB&!,@lD7#k7r;28?*tP]316gnmH2$JdO*"u,4tgiqhZI5^V>+:_Jn=:2#r$d<*/chbas>kse%u@I3niIm@nuR\5/,aq)rb?'LB]*FR4%28:t'*?i?CaMVQh;*lJ.#CJCr*`,l`a7S1s$C+f_:?":uEgN->T&iW_5\"s=FI?/^A?rZ@Qqdq%NjSnO$:Y;WD^Z;g[0X'-3LRkD[CfiHX'gao\d>V>7^M#>P_mOj5Pk8c\J.*u[X+5-I]=NJ*Hf4P1s9<#U(/Yqi<-.'^X0dKJI\6(3pO%H]8k5qMh>:"&nWmkQ[ti`3IrEC)IQ6bCJDMg$0F+R5*lKf)H2YIZ]U)3:FeYZ1g%fX\`:DrYYL>^jO[u#jSe38AF\6]S0%3mds36%@^7R:KO/$uJ3./AUpqA_-q6%J6eSjKW\$r,NYK-"%gSOqfmXP$3O5c1)rE\9`9>mIG?`a)e=ej(0)4]@NHgo(R:Ysba1uWl/]8l>ujpN98I#V]e")J6E$ZE=L9qjp]L<:K:T)l`oOj]slXX"=[I##=T*Pmr`$""Z)3@q7ge_XZhT#gbY8W&0[%;Q*_p.OqHkIHOA(A%>n$@-6QN;,tZiMn%_[oPi"4cCKil34.pj&QJqd.OJP$PrTaXAs'4!p@B;i/6+BX`Ke2@ob!E9(0/1'KpbS*"9AWKP#0+G+Yd?"WM]nV;(@\HH!iM(Sqc%h%L4Ep$1Oa?"eFZNXK=hM[LBS.".La<>F.?lM8SmWssHon%mIR\?F\[bVr,VXnFMZnn6c`-k]Z+mkWUV$,uHbX=q0BHPHl0!Gu5Gi7dLqku.Lr;[i3Z82N#S"u$XI.@&fnW"/j2M0%4,sqI)t*(E/mLoP\XOeaULFe3$%oU;5t1p8EtKH?;ZZ>_!@K'\K>2cnNb8nQRA\E$,9dY<0![TPU(-l6';_4(-I%Qj%5Gt@7EP^M-8)E5"4?P902>!Z9q61=RV36l4#WbY4PIn/5^BXpKSRj!asWek]dVYl^2-m3b^rR\1Xs-bEm"3%;!)\^6>YDg$Z]N4=N#9YTs,pe4+-rWC&Ibee(;*cpbe(mq>KWGY9Gr$*Ot$ngl%PVBBJ'o+>piR6h3&0-^ZLS4bCD-XG^l,_AU32N1]G@(HL33"nc)P%hEE0^sVNFu=6Hei?5IYu.C#84@#,lT!K=kYGdN^[(KAnI1b8_nC@-;c+7#NP)Ye`#cJ,f1cMl8V/;!AH">Dn9o<8J'Er$:LM2DBS.nASqf-BosdjU=16WS%O'nAI$Xoa0_FLP&`ia.&:,1ORo"/CC#m+KiIc]t6:7#?%B:c%j,e4-:BBu16/`[P#>Ca0m'"8!12rH82NNI*qc8h-"XV*SOR5M;GZIn1\CE^ofu^#aL(5ID1_G#*Sf>[h<>!*caMo]$%F`n(ld1=O*3O14[1ZI/j2Z4'k+W&Y6GI%:8gVEWL'Le."hDXLAApH^h79a?ZD?Yl2QTOGEI.'OdnJ$9r@*LBm9(+?sL51h'A-&laq&7=fAKN02TrsFA]c1:hENOoM6Q:I\-/n;2pGFmXA32jDa!V8:K>tk6]p>C'e5BCbG6ed?AjVALP7%ZM_]BAINGHWP[Mk!E&5e+-7V6>$tW%-3Bj84"J)UOjK8)Z_WK0[CT5icknO_\ocj"3IOOQu.mFa4)=e'5r]mr8/no.E*3/s*L;hL[kk0s(!MPR&3ClI2<;I8Y\PE=((\'ho0LM[X*TY+C71>Il*+iuJiWmGf6NG)%si^j3TZr8[`Ip"R28P:om+XT,Di/43p,j.3D*b&;I95-aIWiFFCDJSJdNC'MCnqB3'kY"R@ZM1O@R4;,=V(V>SX:M$>VhZBCO@3AC2Q&dMq?U1gFdqNFsTd;/\A/QRkTX;IG=<@r'tb_@;F(iRH(m!MB\s'T(I@4=LZ',kXS_nCE-n?X8c'0E4b[m/]t7G(2'kT$]D3kC>Kp="Xo*,fs-j3LH.SR07aDGLdj<-1W(dHB*8kE2VoqF^>-9@eqpJLm+N__S%s.saL@X-JWQVE@%;lckZr^VZkheaKooU;P%m_g)t(G/fLkNjn#=n/27s*KG<*CL-]_[L1+c594OFj%oQ#+2b")\kIOC5<]FWSo[;Pd@6m.Z!"]N6:WgWV\K\1TsYk][5C=NJ]Xob3Yr.]`j:"EY',h&m\95-R@*MI^g9uQ&GYst0J?Wf*G*<'AV@$&#<\OG[(B#tM7JHVEDs_E,o*44(;U0dLFYlG7G4q1]Rj4k:-Q7DW^`#,;\/JeG^K\`4M#UeN*.\ADu.im4I__L9\c!HRRoT)m7GpT#>#VRZfUF>K8:ra]_:*Z2OQ!H]aRJgX-;p:Ui'.,Wm47jIsDoA\]7#3/gLQG3#K]5g@-o3sN7+4F]H@K?[Qb_iif%)E0d3Y&+m]iJ5'<(;!$X#hichaEU%[/)JJ`RkAr,`2NjBN`L.RuolFgFhYs]!ZYrc!jj@>=kLKMj2Tru&KG>didpQY'(193s?:.hb;/pK^aN^7F_7=l(]chC5Y39A16$!mWa^']8f4uFhKS/atfIn"1e.!m7Je!CqI'5dst`*s(9Q$!@5aG==u<"(QXG&6go=tt=I`#h%R6"_2Q4]_$oLVLp`f]SaI(Bf^tR:aN]ArULk'M][e`2">i(?qO&kZA3c(s\q6Sh#c0*=I*n&E=785Bc^=ihY['"hhJ4RRlt\S5*1[frI=9r0af.lciUjgWU8q4lmQ4#nEL^Z\'^:fi%2"i$[pHBP:8N\Q5,:otE!%AjJdnk&dmF%4AY!$)=)&9\m%q#%cJID7U@Y5uB[JVB[OEEK]pReJk5-<\^Km`?2\80(&2paf)\?6NTTNq%S+1W7HlA,\LceB);B"RR_5#MTKZ$o6>I%l]*kPA0BFAS9`LOYY+1673.IY_H''A.6F>'B56"oU'7(b\lQ^.Odcrgo;#:j?t>XgMpU.a"`?SL$E+JM(b$ET=ra:R)o=&fQNFrQT$L<9U3cQo]_W=J:9:SRI(Q9r)@=iJ5o7u?R%FkX,L=GuRB=,9ZANE4Je*NoNL5>(Z%[MAc)_JFZdsQ[C]cdFVab;I>dZ^*Nu/;D\?-/Ws\YV@>/P(U5P'*[=4RLl)+$3dm99D%8$Ju\.UjS&.gb3mKbM^HLC#GPM\W?okM$371:&c6FY8DH#cq?4\!(OE\(B)B_nR6;m-3^YVW5>0+#f\cl4%E99M4!u\gj'j3^/XCL>Yj\Pq\.?=WgjsO%IAmE$,ka4'C@U)j+_d0#e"-#)+m[Xk7:\!8[D$u$VZ0om+#b/RBHC7(#/L`4,bm]BTZ2srX>(=\4$D&MApgV"E5n:Z[*I\>BZkBt;3nqf4-OmF(O(pf?.DG(jo:E1eW)Ud;WUl:W(D'NH3n!B&Msb^o67`k;XCng8YgNq5X`YXmhlaoh4t7up!aM60VD(S@DTa,/VR2M<>;JcIR8r10?SdW#BKO9+.-luhmU!dXg#_qISDbiK4-fVSn"`S$-M]gn*E2co?q2ChJs,F/nS1Ze=O6`^=gPRd[[<-?arq?DJnAp^6i+<&'HJ7]V,Btua-utj.t4`,Vd-n(+gtE?I(#m8Q6NS4!U2.!N2C#mL/-/t_p>-2\bmV_^RbR:;9ECuN45j3bE'Z**^!`W#p03+bfQ"PTq]TLlcrpNkAMs:"P('SE`\f-<=EVZR(Z^`FbkBNN']TdY:V,H0-W'Vl#pnPa&m#6j!N``rZ)^+0d[CNoW*l#EH:itF!Q<,:=BMtm2N,kU?_)@!P7s7":\HNabpOeUXN3.pmM-;eF9,R,E+h%WI\-A>tkJO0_cQe&N,+bh"$u7-/!PLFPT-)b@(%-qg^jMMSq4Im6&a:q#6Wj+!)%8:*@_UDJt04;<%\25kHF*(dl(fF`9t9*A":ahho%e&k\ERaX@^moYL7#D>XVh4,PtbMB!l*nWUsQ11:3LUH;k1"##`9]8=_g%@O0IK&ARl[tmhTUWiOXm3os5iL:62iS6WqU`7?3eW&9%s.9?RT7Q6IlStpPL`h"C@:_c%c#Yil,@r>il54J!N1$c%6kIM&`?J1t4*PkqsV$b_pJ7!ogb4rgMfg*7V[5o6s$(T,olMSS5Isq-0qFr*8[=ZE=I,1i;oci6M:l!&=K37Pk(Bd+nQgKLh05iP7+^AiO$#5#0W_nJ.%+FjiV[IoM36almP8p\X/*7&I'H8k.'01u7-%DmT1mer\?iAhc:YH_M(0uIPtUjQNd#VlldsF28BVt.2Aj/GSu)`ApVqmNBYq@ZeaBt-\t!7OMnM,7$6lgpR7_jtp#eI)4>3e4c\*-JX/T9C_BVe;r2UaL5)lg],6I"KN/LS99[%\g,<[[m752]U1ehc:\QrW0;rfU$@UVuBQ4DX.pU#p#Po8$s5u1&>`Ur]nq=`p:*6Xitk?&c47k.5rgI@S6fr"FnG]DghF@?=9an#3@ou`T;bhH*g$X79(j]3cHMp75)UZ3(j-[ZWH.@iI3;?Sn91mWLJLIb3PlBX$%]9bXJth0S03_oGdD2LM+IGD!nV9?X_,N+2WP\EmC;QF,UA;A(8(PJXg):<96cD>UDCZDY,*UX:P\!5HUpJBhSO\_QuhT4gGq0;h]SZ6-`s8gVB7H""/g4JrCZS%g>e/@`83N*4K)aVcqt3\MWs:-\3.tODN`(GB+$hM1n@u@F3KVbj$J$3=k2IKhgOSo.GiiG?f!_+3*IKQ=,+3XpBo:N8oiVfc>^PtJFsY]K?G12]e.ZhAriB$bV+aBDIHDefigbDFLDDHEj(,9iitZU>sG;GZq#KQ\8F([a``m;0&(q1l$DCT`7-a@->&F;<[$^JSqaE>gCOTN)JR3la77:K:f+t]R$\R'UY*MgK`T0W(icVU;?&Tc@a*kC@S-m4TEmC]&eqF@iooK4EL3DpA*_hH6,t*B)6chLA0)kGjXJ!q>#*lV=:\;muqE`eS.S71B'ilmcR3,lP1[diUk,*iSEGeEb2@n1"'UI$?H_KiM;FYbD?mLUAef#L&8?)(;HDP)G#E-n^!)13^5V@Xo[>fpuSo3r_M=>Q<6jp;p>(ILAcibauPp[I\U!2^RUP!N7:MSpZTWCHI^NsO-S8QHL#^VH9FRh[DKW\N,f6K+ipk!f&KilK"GMojO\pI2enBpmQ,HhU[:[PTj]1&=u5.Mnlj`(-4ThP*:]k,T)_#7tdq%UDKXfB_O-6XhWK>iCs-ab.L6Th)@[>%S;kkG=]-d=*b@DIbae@-Hld-KR8h(^dg4m.66d^iD[_XWifLB3*AO9^F(%HVUl36d./u=ZseTG3iS5m,ZQKMlfg&?^4'>tO+Dkae/;*/;-YCep3^n?c3c[kVR5SP%($uO<;q2*.ef.TU\1OMeugDh1k(Z`W(1JAN,iWm2Oi3#YL._j1uIGIC1TG4=ecC412\8#3V'-A,;d`Ob':Mkf+2n1]))_-noP2'[qp`\+uL6cj)GRq9I[*oaW(-0!KM@e%(>t>nkQC`D19q@Cop7l_S^L9$)dAFbs-t0Ti5#N\!r$l$RVM.h%Q!'p1rgH'hnudpb\I)=!N4W5p@di<7bJ:1cWZ&-d&:X_=hNcolJPhRmdJNu^RDkXDAn2Me>O%&q)be_W'1UqH]IR`/dV8cWT..BNd:*r)W'O,rseEn'Z5%Zk[l3^,tuW0Xn"(_+URga/CGFIi$i/r9\nse)B?\k"eiO3nMN%IG15Te7c'SMcPqp6Nkb2d*5DglXk%+5>V!U0eo'd@ieKGNZKTY`A9Tmp>U0ZOP4IZT>1>ST;8UQ];3932)U>V`Li.UgMtXNp4Id^)<>JG2QY<-C!#:]+N0eDTrd9:*j3G/St>N9rSLon(utfQR%3Uqm`1]hOc:0Ou&aMH8.;7#QrpPIp)SjN7b*S-Qt6O08@qc02D.H2)$t#m)GnFfH4+o52'C;7d'@[=NIsC%EbLP&pqRM>oe%!*0$S]4aD6H2q;FHWojMcC)/oH6=bkpk2g;YIoir/Cs:G0j.FsnQ13+PFKnfhd/`>C/T/q,8Q_S*AEFWF7`U)$h6cYapZP-4Wm^Jr&#W3Tj_&rOVn[N?'[.j^@.oq=kSCK6\\sDEOE'V'C@8K@5X<:8G@oY&nu3o982`[bd#*c9E\YF]XkHr;,Ti*2'2ViH>[+'1#s6pQUp)aN#uX8D2(,dXp:!mr?H-LrXHqG=Y(6@\\-hdA9-i,f)*YqW1@t>i37trQ9-eeN5JZmB5DM-.RABWuPg&9O!@IjBWpR)%b0@YnSaJpdueqc]<_.[u8C4"n)nB(DrP<$Nl.ZY-Yd*]Y7`siKk1;-H+(q\T"^#;n7A<*MK-eLT@pHffp>AC-%Al7Y_)(hoD'paTDP]g.\iSaNM86[XAPkTqHdf^5`Bh2(<.,#p^A6C84kCeC:5?8*e7Z^Q/I4BOM"MJf)%#aL3&MofK2,8E[<>-Z.'[%jRMuU:l=O3ngj&NuLH*Dl*`K>nd%>Z,^T+.pUi)\s0Ho3!WN'9KPcVRpFZCnJ_`Z%i7T60.3FP'bVLaA1Lq!s:sMV/DQM?4"(V3]A#Qupt#0]L[<2`f72929"1.6,hMO`P"'k>m0b$Q!MJT#-t,.^=NJg`pBd\D46'Y$Iu\-TXe`c?X)k,`Cj%Hg(H`_M\^1EddGA`^_c@T8"lCOm\5RT(u&9"0?1R4iD\mrS/?-."^Sb$jjP-]Y1N:cKi)c9ZJ.[NANP\q.=hKL"QpnV0S8ghqWUWGFZ%ijVBNu@J`FO1/7^\([s,PWaL77#Lq.U"2mYM.-[BY_3O->o,TN,6@aRA6Y("C$48ZB"^Im6+q5!:,dA;*<*>'H0CFO_A#TL@MiFS!(&e!8o2Qq3-diuP$G0TJlFl=+T)jGuJ4kt/?`Ru.[SF9l%%f/d+1("2:be^7TkRX8jQu@o>O"NT@bI[&&tp"oL'NVp63WRjaLWaT?5gGifV!fN+Ne/uZ9Or@`q/6QL,QJqM=8^(T#Y.4gW^KV%epV-HSMf)JcL?.ZZOOR7RAo\Arsm\A5,@/DL9d'5p&4j0?]KUH>9V+s\#t!F@-5hVkdQkkRln3kP["t3oFasOX4$=_^:S^&WErH/&V?:"f#pV$]f.IJ\?c+'pF0M`CjP-O3_.p\58B$DlJ93H5SYq`-0#@'V3$pT4E1'Kn%8l^BgU[l7&DWhn@(WIILuoUQZNejT@W()G*:XG,Z0584&N;F[]Q78C+[g<=B:[W(pGX>F)up@Yfru9>fr.a>Kpd)."i`Rn_hD#i'\$o7kpmVgk-(cJ&.oE@.oHjD9RC5Q@O]@`\AG8%MM@AgWt0(pj@/*8.;jjV`?So5s[[FE`09<8G#+XE]F8:r]V8=`R+L@;lPEGY;b6bH#WB6mV"V;@hAPa'Ue7(=@jgE8jYn=+?a'pY/[\i6OemTdtZlt>E.9]"&epP#_P$G0M%9i3+:Ku$p/*=lD^e*^p.Lu5biNNHSb3WX(LGED&,k*74&s.K$*Np&A+-]-s9PK,mHNDR_/R9OR97c8]4dW/'"Isje"0g_dj63a.&P.P`4ZkG:o>Q8^*d#\-L[^3=?NUP6iI!:<=Ai#'@GfOoQQbNT[qD=d2iO+FNGqnaAWI/R6Uoj;?lK+>ZMA':@:/ZXXLY8i,PkX#*9(ihDecX3jZ.J)*gf=5BB%1'bGfsLJC=i$lTJ8UjT4hasm`(Y`=I;WenM;;*a2>"H>AP@1[]nE-;iEgmr_RrLoIQ7ini5d-%k\p?H2b1GCbe>Ei(sBe1u,Kh7aH6U2ooMi3_3>@kSS>kkgY9B68U$<;5ob3U1T'l"U6*cK2!X*#@KP3M+dGm[giD38N^*LMuk\,?aY*I04<]r*>*bjASCp6c=BPVoW];\1T,+;R=BY)\l%'WH!&KT6`2^uskLe&tI`/ofhUqDM-2_[#()alDZZ"Qq#IV+R#U4G@kobm-!g8lfCV-YO>LeRuFe2G7,a2?ODLKS^4"L"6b^.H/[HR(IZ3GHu[S?($nT%Y%3QpM%8+%A7?6>fBkiB7R1%f[1H+Ds^PP8q*-,QZmO"'JKWD@V47RVM0*'I;B$Z!gd:lanc-rb"ZK`lqeH(*:#-ZP5(h2nrOL@gU.s@@,0AG,C3ni%=iHbmY=WV;[+5odDJ/:(#Ri=T8,#WlW\USX_0HBq065n9P\!R)I_Z\Qu)5b8=JR!n#g\s3b\GkN/R7]8KeJX)3Y1GnFt&>_gLk?S<'g/G!;@"oftOk0[?nV;qK!EMPk,0eK2--O[HsNG_E>7$!!p7W/n-N,#)JYcoW$(]flF.&2jI]#3:;b2GE1JeFYOi=NB*,?!PhGlH4#DC6FC92EO87gGWPpJWW0?/j7"@]:@0X3tmGX&1A!u<]Yb6("0JsqMomInbn[E<5,+BE)0ei&Xo$imK"rK]/aIO=0jg,F`>[YKDA^?4clKVX;ODhbd/;*>F(fQYs3h20eR'eVsjNV`3Rs1SF!Srb6k3t64RAf>UZSd`@14@5dklssl4t5gE.$T:6i"B]IMFeC94Jc/1p8Q'.6NTNb%.q@:dT`mZC8TAf#&%M'bW22:"Ik151RR-"a?/rT(e-Y*)Z49r%#nJea/2**?@MbA0'(%Rp*o.`,D&Xc$Zs!'0pIMUHMn`L:0\$tl+HXa/lGMA'i]lT'"u<.-cpsJOPrfD1'=OIK<)XD,pB&hh4m?Om?do*Nq#,T_,hTN5hhfthr)pJ(h?R_FB2[E=HJ5CqiU4"G[15:a3m[X?ZX\J]>&H%`Ut1#a?%q90gCX9ha$$l:@IdNp7aK3_UInmKPXcN_IW-:V_98pdjI1W%%88-lhK6Ze7!2#KefcuUViKOquim6Z#DjgJak,n@6ko5Q8OcnKU23P-8gj=4i&;tU#:n^8o-^opI+D@LYmC'/bY.BoH,[9%Z5.-!/Hp@usgq&&-!AAB]Is1SUJ"Za)ZQEi+p-6N^HJ9dVBf+@M?C-WC_a^^)=8OjelP0?#'t<6,OoFh_@Lf7X97-am*\PYDr4ZD9\a3%1_!["VLEHd"lJ$CFg%18H%Kc)'2_5d=dcl+WCoKF2!@c>UJl8p#rll&#)kljjI-ndf`7E3XmF+>FIF0a4KuC6f;$_C-!(CQq)LkUjBH-Y%4NnXt0)WrOEc06Y)rSWZ2E+(s_/7%^H[Q%.qtI:PK'hF#l&/Ib(VGJ1]?R)BG.Mm-5p24e$I!r'sSm%H6("(Csu$;\IfM5/bS.9:Q*dn0G=rA[`:eOgkFHdSne[C$;6Ba:d=On*kp5a,GVq?,4b2`,r^]F+N5#3RR^C9nA$Af15hmI$_CNk-\qS>U)P?R/N5MaXPHLXFoCI.OE%I$q(BiFrt&;o_fth!ma!9V:,K>;5;5EfnO&BZ-dgY>#QBe'pW#s[r*UX4P<`!=6(VFLY6Dt]FlQ-JO.W3O6\P:,R5E]\P"0@8Ff_s?[?H"OO/=7)[.]%-aAuoU*>([!mH>)QD=b6ijcuah'Ghddo9X?1Gr:7,Oa&i^hPq(N5GS%(H4Zf9Y2F[\cjRV)K@#uJR`n?e%F"mnQ4@i".7VbG4sH>kiHi9`*pp`f*`ZX_g/%..U/8VIs3gm,rVDSDL7"u1[h*$gDmub!_m=?BjloR1KOa3jPUkE9@I*=q.^`p_>*#d$E>8Y`H`79`O0!'-F^ZheEeD&KbDNLJDCgGa>+3"A/CluR(o8\K:Wft]lb$!n'.!PNjsVuZ8n>+\PW$A'5D,k'TbER#G9QM7[SfYh@Uk_`8,ssilVOqV@o3LlUtGch]/4&_ae7[_[WP^Q.Dc\Lj7:1R]?^k=KN&HeC.@+1K[&/5S4Y;1/i3WD9&UeVBe>:W`NG^7Xk.^rRnen(Xg/gEO55aS;Dmp^N\jL41TBr3=DeP?&IbKSVaLpi..N\&Rq^j$ZTbQUKn4WCOA4bMjBF+o.TR3fJHrS8@mVq3E4VMZPl\&)gTVJ$Y)%"%6ODqUi.&+lmpuaEiNrg62;=.8<)\g0-VoS*FL6s"BZ4p\T%])L2fc:cPn#:-j_qp]!GP#G3/>pq)DG0(T6s,Jkj\:p99Z_^XaSaUn0r%KZG'\ACCfM5LRUuJLI;+OBkAlb-@$1)"+P-nQP+/:^F!^3.:%COiST53g_j>R;@nKqm^H?Z=_HVJ\Alu>+d,bD5[=/7)".`NE]IAsq\mP?kqZF6f8q:>D@Z4TWf27(5(6N%gGC0%X'NWc&OnU'?Ca):6n'=3g94:d[&*M)mb\KB/Bnr&acB&9*1!]YjNQo$:>)FR,`B'-M70S(uEP#oAG09"V'POQ9Ne.dM\"k8B$L>UMiPa&JGfRmU?1>+*3Bl7Bb_rT.fdRjQ+'K."W>Cr.)`3u'#uZpV1";:DKO*0Vekfn;kD2=@_hR>+.:+Eiq4l93qeU"t@M>>BiuoZ)G5oU/:N"B2?DCch0hc4HGEQQF8*iIgb7T;#:k]>HN4"?D,>N.u0"*SV-0m3F`3+&ej+S*Q33RZo,>V*lDR(6?KG,VsI@6n7:FK"7s@oCJ^j_=+urJmrEKWdn(f%[a+[@?\Oqo5Je8(U!dVc^&+W1-HSe:6-_M*q$8+kCW\nbhL^N@.$psj3(QnN:.t#2TM93*bHgkh1I!&7)>3aSbnHRRLHJDBfNqb:2gV!d(u.P-DO-JOfr"V<6R50.?RaISIZWiLRNE^Li063pEA(N<6HHa0:bI-P>/afG0)d&F<1l;fO>?6,8K6V[qM2Ohgf6QKGkTo&GL$uc?>HHm>CE=U,OQ'<@8EQ&HUQTO"@AUU,F2C-Bj7SbV,l0(]HQJG4LfP5fr>/?N7/%m2fB]Z`cd5a$XYdTZChNk4e5Bh*DRd[E1esQ9CjB<%\AY'!5D9pn7KaZcu,jU\@":GYB$T_oI_5`6@+TrU@Oc2GbK!/h78@rDB/ukC8\#/R["tYKHNrKq3]h].&L&H)O0!dZ*4LodX^pIGI&7)tcG9d-D?lpd1$NJgbJ_8W2^ZJ1K:8$!GB`A\M\b\<%S\XE-$^'j!u+3,RH*;Wc)R^(AVqM&O.I.r"!r@dt`qWD7<6dh)=*f5%L0o`Ob2-Z@3ec='Qb?@?p9qOd$JlH$DLM^(,6i'6mlqH"AN3lNBSa(Ee`um\/Pb$g*a;CI`>kl<--bjr7[`9")rXLpGL\WN(br`hA"Ts[REnNhe/FreHNW6@"WfoHJRNe9E*XS6PmQLAmJ3"C#YrP//X8,L'Rpq$F]+)g0)pACO1FRK)L@J\9rDA4nI4/2-%Za"a@Z-UnNIj.D+U\O_TE-Id[aO&f:mr#ms_4JsZNR&J%r.3bW2MZ:1]#E^t=aeEu0P+^NIOIPLOqWG6=)Z_CLTfggNPj'Orm&>oou`2L^Pdn&seU1mIu#N1j#D#]O7[*\V$`3PW?"B>6(,Cs=!E(\:CiM>dKuR[2>0:13&QrZm:%(ZpQ4D.--ljFdNnqA]r*8=:UUJ21dF<_'CQ"lY=Ht6=A#o1)R%";DD33_YDq]Z6Q%5,K_2u)sPbE:6#_Gki,8s.'h*`1U0;0+7EXZl:m]/N[4K(#%3M-kMlDBgV8cpjl,Q]/oeK@(JnQK:h\eLEU/U_\/U6YP)+a,BdM*/Sd0q^#$i)!0KqLPHuakQEA%aYJ>[A,a4Gt,T^_+u)\]*KCXtkBL>YRoQTB,8T,t+n(l,>DoCh/")rSPK1G_/<_h"s6n]XmNe(f?+m(aX3="OY,H-F,(HnN=;&NCq/aVIi#8.R"6jLSXF5WYSj+hlBT7WWTXTF;:cds[.U"bmEs7>sYFfT?gYbRm?s,>ORMa,Hd64XoN4"3?KjMO[Nk2IY:UUkYfF>6[e/3LURq_)SDR6Z#UT;ZI`4"lSL!blJ@b"G@8;/4$2>;cOlp8(&$_j0Ad0!+'UL.7sa0S'@Mn*[I]FdK`l\P+:eRZ#nMd\In1`IQbfkR1SKSrIO9k5^#EZ0-VPiq:PjBViVGC7.u"="2c!Ug^Ji,Z4KPk17n=>Hj*it5/J0)(571"nke_,FU4mmVXb7.!qM9mY@mLcmi8L8OL]A4GtMKnoT&_^jV'/WX1UO?-ii*5o/@s4KV\3.;5kH;d4L@YEHa^OquesFU^Br?\g[s0nuR'WL"Yc^0\f8KSPB/^8h`pCL]F,_,V@.D(4Ecjt%4;6:F$rE)NLR;,bQ\JZ<[p^+(YSE3Qc&g[pc]sOTBkBED)qWkr!luHJ![4IfO4Z=6m:>Jd16"(Hs#`(S%[q+8(-\c^S+t,=PN`56uPiVU^Br,0[IA/^5driZ)o_6CB47K5_B0C;L't[;5B]6bqEG\eei>*W'U7_!R>VDVS,`mnnhUlpU&u'MP72"1kmKZ(fKkk%:#aKYNsM@&Y=u'M[Lpt8c"HR]sT>;\!Ea3\B9p:2QA^dg(H:k$p]@`4l6!9MeQ%Coo\KpfCV1:H,(U=mJ24<.]5:p!fF_f7jEP1bsq-C$,Uh"g_XZg.X%lYVG'F/Qnf2(hJP^ZGn;f'8@5o1jP]e7IsT'o%%d)Vh]rV(&WuD;TOrO3ika]QI1pCTOhS38Ud^;BR'=m-m/",ZnBQ[mZupMbj5gY/d!n85kLYOqqcki:!VqOSg(lTj6l7U%mlX.n9u"JiJ@W(8a&=p]%iH?*#ir8Nj$rjWspp"(^obU2].3Cb!Z_/P-GiHM\"QHh6W>$*M@hFm/SF@CV2Z\'k_V*W61n`X0.V__(>u@2bp,?26`0da<(*38D@d[LdWCT1LWl-/%3Y#%K`X+&,*F@T/'(!Pb(U@%KKn,_S"53RO^aF?O>(17UOeW4NS"nQSq_Ko"IM!L2^?l#ZV:ZC@baK5$/Q.^J[kBFiS^;ofg-Z,nj13Hj;Ef-&I@Ue4BlbgVk2_a*hI!I/>SEPnO]'.Ek:m(Gd(&/h:+r\Ue*JUsnN)[=5(NBHlrMl&6okc9lT9EP%K0nKBEn:dplXc&o\XV-0NHpaI=L"qa5?"?(jX'nBg"imHs.Zj:U%Q4*h`-BG&%a7+/5I3McDsSp9$Oqo6Akd3#G3!g!N4/l4GTu'u->^?4pK&./Lk"5^GNA+>%)7r$#_:5GEl[dad.QRQp\CN7\;o`Lf%_Q;qlV:BnVaEKGKW7_Qn;$CHg4%Qs'S!Y02"]%frij&&/9F^Z"Z(f(kii4_\7jWE_fGpjmnF:S%bAQ2&4nl'T?!+@:(d",hPmd/K;e,`iPW^\&GH%(fKKNeTKqoa=U%.3":iXHbe]:D01Ok/Tn(SWV%N4`^pA!M4_ID+Pq3P[OFaFVEA0Cpe?q5JFOr,\0K!8E]&2Ui64^^'r?7rT(EE&t_AQF:SPIWa\?WKdQ%C^3G:9c6jInef:W`J4+1b_SracF4MH:tb3:rKp4@rq?OWP5;fo[`6'^=tNQ8),e=A[FOd+M/begR?0_'qTKbcAd@M3B?]6&l\>AKE`=0_"PgUhIHcrdEFsn&q^(2qF%6\mD(b813P;8CO,]Sprb2]REYML'+q\ffD?BS[oEM([mfL@O.Zk?m2eoXU?8[b<m"m4O?N2`=T9);#r0T^31nPe_=^S'j6r9dn[Br4p_A&ZpsuR&r%Bo(#Fh>^0*a:5e(M>E7Q);"UoV'=,n&isR@5gQ6bTVrV2'297!(JFS%4Tdn0R8AniopTd"1=Fo.m$r.%QGBrG!M"fFL/!i&kKpLM*bQbW_/lo3_:c=7*@a[sR-&'shP;hFBiN+g>@O7JSV2bT.58p3WEH*O6^H\9cG)]%:V7DJO2"j+sV+-H$/dKSo,f?Z9Unn-bj[!dMe@1bpGM`Vp([r]K7%_dDdqW93Y82tEsu.Y=m!LTJke?EOH9YN:%B<]',VQH@)jDI&NPrt**_;I?mUR)Ulne,h^:J`*B::Zj#?*\N!ZZ&_-tTVNd-^=#7LT8)O`rar,hPEo0g`nTennG&Dh>QafM6AF7^PPN_)d?Rd+O^\2-,uekXs@>3_163RM)\GhD!tN$fM\M(iu<+Vu2]`s/K>h*!gm&PP!H.McQhA7>jB@PUUcjCn_O8pT?>=Z7c,^%FgjlON6S-90?j,"Xn\Z9,tL)gTjM*naXn9n^MA\\E;TP#u[mptXK#cOH'X"*S9:P)tXnA-c]O`8OSbT022>@Q?4um+&@p9rLuE-uii>Qq`ApX>:aub-Td+&Z4_$?DHdM6>oE6(YHQ2*hBY18"-b?;#?,)V#1TSIE+5MZ'/:%U#k#4oUm3GImCJ=lI:LZ3`[9WXb$%&cpN'L;l@u[kFfe5J0ntj#9o$/>,4]0jD?$'E"MS\*P;Eg2@EC&LZ"<'MY-uMrKLZNhtN1oRru)U<#uM1X%nVh.;/u=9;L*EeC_lnc[WK4mJF;QK:k$W(M;*7"d0(dOJ.W?E@Q_)HCEcC"6pFk6XLHF>Qm>&-O#)Z%#:!!`T_R=IZ9\E2oi=jfqQQd&["V^^fV)\P'PP#r.3XCdqiQ%2p>kFrBcGCJ`UZP6N']?/5dZ4HJ!`Y=7KYs\-(&KEB5oaZTHE(hi;-a(ji?+Ho!%^BQ_U0E5$W2*#Fd;$0K(6t+Mc.s=3^B*q>IR,)$eeXiBJID`%[")8d6Mm^3i-FgtX6.`X5MA@-Iq32;/J?@Df"oCs6o,AMe,p0d-Z#X!#K70WLTt**ilKX,2\/UV,OO9RJfp7RcMf@Y#"eQqD1Db;14g9nH=S+iY!6dNbJoBs^#jLq)[)gd2Id*#rVLbedkH[UqNY]GFZHblnB$$rceK=9/Peh2%K2H#/q84d5UepG4.3e^(d\r/\a$LM,I*cpP!@ID6iTB2=qJhA`)+Z?e<65h=/H]9U&8@&-5'Nn[^2X^]p;+V@QmhgaW+:NZ%Gm;%S(\Al?uh@3MmTNgY&0HD#VV`$e$t>[c*^pV@S'B*V4`n"TK1I*)>o-tb_'<>Gl23"ErS-k3R4Yl^;m77HtGn:ZFXYGe(+g/2E=JL&5n?m58q"#D4f:$a&21i+)X;Xfc)GD9^TA:X\b,m-J%s0:#f/?i6J0FXlGbU@ZY5)TV5NMV<%DC_b)=M#[;c^h/-Iu26Kq-tNWNh$@EdjbaH41O$f$O)"/"QI*Z_V_62e_hnb*59*QhWZcUUc<;n(8=0Sda4q4c"5&b8a)Pn4oD3?J8@o%a@*f9Yg)PUU-cG.tG?1G'bMCmSnD-/)4ZX%4fFDWrD%&qBLLL9^At`'?i7Q$^rl@sGDkI.cl84J33+cNj_#j]*0hdUVH$d3ap5YO48g`/>X@%J/om@_EBm.MoQsND0pQ,Y)XnF^HBFXkAF*djlcbn*oL$C4UouO_%.YI!3J*$Bj*.AnOLHJ^,<]&opL#MsYaSZ]K"]0a#pMf3tk6ScQ(^XOo\VH0n1^"D?]X1A*T@mpP',1p1IAfIqN&SXkl\:kk>CIclBFDWmG,X-hiK$'UE8"NHC>cjZTZ+T&WkF^CL5BW*FPi.7OR9TIs?a!%U%-Ip3XP_!td]49nhmXLk8*I3?Z[^;@!IPb:7&t+B:Ak$;jm4;\CtYJ!B$;sqb^Xg&F9\Nc]=;FD.p!5G98G/QiVJ#\Zg@/STp_P8BPk"LUN"*G5Nas`=3(%pU%pGO66YuMO6t1!E,nm,?QVZZnK[dj=cr67P)!Fl#^put+!h@"+cV2K6_Oc_0We.peWi09_7qOVqJu.5^iH"P6/l1+2_i.)8$DXGR@1f/SY!n"kM/A5G49!05k>(sf-c1Un:llCH&2:?bKrNCPWDDS4.u_-@RtbK0A1_0#pe:t,gb&tjVo%f?p6R8EB)43%;9N.rcGjF1ibBM*illS0ZBkA:"#nC<6!NHX"YcUg^L0=INW'8Vr2"@KL#m,9H.MY>#?#,(iBrb4dub/!mL,qK%SO8Z'd;mc#K&W![0PaeshcDUFr2dp,/(lZA*BF"`CG/uh,(s?Js6`+!("uIT-ZreFAMlYRLaQ'pH3#NKH)8t*a\5H2*32<8gWZ<81kpPD+;jH$(5'(]Gl59\!Q0UL1_F6Rl._i_I^>t0*HXeuP46Z^V[^uM7"=%pLRS5ggA9\#FD;kGV[*e>h'D1W]@]'Y\"NY==>\XqM,flPs,WNAhkks<9H,:raWj!BUXn*h*OlpAl%-R/dI69?L;.l>.?1(OR[5i08'2nmT-kVVPK^lAEm;fgPo-Juk4*"%Q2(8-G11IVaIN\R"9t3?Rq%I$l8/45C".S*\;<'0TcoZdt0[OH/+X:heDS@'m^W4f;nUK>4QCo0*o1>6sVAl>Pac.i&nae=4.Rg(,^dRaFVHgr.-T#$G_7Rt[_f57cZK+LBKQhHYkW9e=Y5DQk=a*]f+CH>-8BD89FXm`Y"5>J1J2Ds&hXK(jR=!uD1B,lkD3:\:hV[]k4+7&dS&.a[&%)`Ke'HgT[@>]gT@uUeYEb@CV)&Gj$V6dZL?+`6p]9pK#*7nNm-Wb#RU)rd1TKD52pP8t5;c"!!6a:JX^L1R*I3'hl[L7),CKP&j[]!FkeCHOH]b"7K`#0#tFN+B#RaW)=NA.ABj;%X.a(pl;=NILWgu`n=RBHi_dNZgpr!kELCE@ZnMlWDO2f]8P/=)tUqj`Qb(L0Ru;Q_IGdmnQAH#!!&U^OeZCsQn(csbq-OrEf:kG"B8`DaBmN)?DKs*r4b`KkF;2-"aZNXJL3L@cD7uemISu57s2gdHW[-dM"s2VJ83,&WBBl4bf.MKDQiJN87DX;:srk!LBoU\puN.cZ9;\b$HCK_a#ml,o=TCB'0iAUngYItW7=3SRR"T`&K#Y>g7RtHRI_t54r,(\1([j])&^&6Z(X9-R=QP-;g9AXVXn(CI>[fn/V'WU?lpZ!2;6V<`\ouE1((SP_Z/cjf?U:P^a('.L[FoW4AZNI>ElCToGIahM<6WpV=okJ73A(oVX?;%OkU-9(hns9+P35/7t91mCs:N_N7[(l=2bd(/GM%DO6cXukJU@2pm8)7)]+l1%A^jq+f1ar#PlUm+>G@bJk^CtLh7g+CPf"T"q<"#M(Y]a0G/S057sZ_l!)aEG?/[M3"!6Hk2Vm=<(%9c6t\Cum%'0mAk=/ZRt%%SdJG@3BbA5`\e5K99`'d\1&`>IB'&g%KG4NrFG^.g7d7KOM*A'HROKh"LM\W!k#*ED%\c3Z`"-kY3-t0+^c7"?p253ZT7Xn/bY[*Y('e]gk$Yh@AkDUV^4GKF1%41H!G?NE&.f[S?KZ)R^RMn(V)7sZ1qD*agm%3urf_MgPi5N,QIKUD8'I>=';[D1h38tBJ!]L#k666tkMi@DrfI`cA.R,u%4N%g0ChAB7[B-,#Us=1,md\*!Wipi,c2=`J$d!b#sU<](d693;#j0Y#Nlk1]s!iN<$.'$5Ko\R^R+cZ+G3YS67[It>1U(oeqBEH09cNgL3"1/7`-5L6'F1L?WKjg`Kha)^d&C\!P>T,b(.;^*_!u/cso>9]=nj$R;3ftG)PO7e"+M/=?*r!/eN&72jaFA9F:fnLAcdC%>Q!cO^0+[&lhcmk=T=gLce(N1Lsqb$O@2,<*%9NJ[@a/`V_R`npH):Cj5b("4e;A-W&qYD+Y`P;pH$Od.7R@&3G[D`P\God1-/`FAFl0_/1tF*jaWn6VD)=4aq8%GLY7a&r_PL0U\Y1co.h77X4h1WiV]$:MJq?'Q.f-(Z]iMHYuER0d)R:"Gm7I&<$]q.t^2$*ns%d(2g3IL.GVr9a<`p/Fr"DItTIh`74":PK2E"f//Ed1^PC[c:jZ6G)$I17i9<2Pm-VhNG'd-+3SF@#(P5Wck+G+OD)P^"`Q]`Doo>#*[SfE2,NHIMLo,5(ulZ9IU%&-h,YTbT*0/j(A\q&e_JpiuZ!_^_A:5?lJ%)L:S,a2$/X%%Jpd^"iq\D235%!-&8juM:ID-B)Wb_Zqc1p"9W!7cmZ#Il3#`Iaq"C]OA0-U%N^Wk4QgoSmS;^NnklD2)c'kkqdJ":^t*QRdL7Lq.#/qhU!u"]#$"7thMk0fKOP*N2&7i4ZfHNe'lDJWW?fUK%k6Qca"``V1hkE48G38NUVK##+m2GHnE*_)6s,'V7>`S$BP.#6h^g?#<#u(sR'\/.Sp7G_YI@fsll6MJiI59UcS7YFS#%tuHI\d(luqb>Jq6FNE%+T(K*ZlGk7:.Ea?sB0$fQZC/ksM%I1ff$\'m\cTcMr]]088u9addc,R*a"u,i.[kTLgZajRjW;&[7YVk2K,$;`h_6^HEkf]p7&5g+[%Ue?GnmAULJ=4KWlmt>duc7,H)*FT70_\QlN"V<60k4H%TFW#;@>Q2%dYEHM;:pIfU3"D:RjKUqNN#AR",gBcVSQmqB&ST@Lt2R[B/iZ\t<1%E`V-?as4bh9t!"u`sDiA(G\u*9U+\7CRq>>bEXW)=!Lb:CGC(NV9e,g6MNBjE7U?mM[efFgi%F:*M=d%ju&72U$n0k%%&E(ACM'^+f*K?@lQS%C53#maIqJOD93IKXS7#kK+e6HkhcHdSr"c]rS$N%[F)HmZ79.Rp/L$OV_sGA4Cgtj_#'=\E4EM[>3#cR`80IVPK4*)*1;"uQcc:&Mg#j^E1aL,8HNSfFE"g$3#Z!aq=Qe`1%SD$W7KX7aPD0pEbsms.^eL1%*e+jk_')76<5trFJWh8B+:Fj+FCaZ?NaQ7((2=;h;6F>&"W<'5*2t2:Q6[E*&-j:D]_LVCR]A(:iZ4YUHa)q+#(STGCkfMD3g%)>GKT9o0BaFJ[]hhO<;TFKY?UUqM@eI0+D4A2CH3_s(sjS09bToe;u79iLjSY0[B2aA`7Wk"HKj6S+ZqI5rD^rp/k&fnE[5K5ZPdV*)kA3SDn`-[c]6#.)ipe=_A\)fQs!rbSQ']RCGNV6TCbHa$7%H<@Mb[3I]H/5>I?*c"g7/bIMJ02,M?KX*Q@@tIOirTF@Kg/H5cf,J7cqHWYCZN\,Uc?8*"sT3p>?$5+*>BJV#[3@RiOBi@)_N_d$H-&p):>3Z#k3_e8f&(=@k:Lg"8mFT'g^J8\dm6gN3*6"8LJeN!D,NZ'i9c\1(^`uIetN!J;fouJ9rj`.marjF<:4(i&1p>VC!^K5'VG!bSP]dM4h[[EbI,uGRmd=TYAJh6FWKh0X6H;3r?^?i5P"IIO:4Dm2GJsa%8pcFJQ'j$r)ES.N&a:$rh2"4K9O[(=@SX[*B+!;FrO,,SQ"f;I5m!ee?39Orr3sCsVX#)Z9Tmb_K[tTda7Z,Y=c"!.'kmN%`\,M"iHl>_17K+Zci<__5^VV0*8#Yc#/4QQ$laf^FHPng:%f@22Z,Ya!WV8:+)6GkmkGQq3D'<)WA3U418kN1L9AXqgH'Di&G5=Agp9p!ZJCPDG#>PlM_!0h#W76)Nn#B6Yt#!7G7_(#m*8#f552e)Zgs.c>J4&KpfSckm60e0CdCId@s*5g!VBK!f@@jle$C.")`pi#,/8@YN.l`%GT&;Ac$"7cZ0EP;F>ehNng@P=T9Mo;&0J&eqQE:\oqG!-SuXKOdHPOQ&VJ`''0&D)W-ak;/q4asQEGc2mF%BWt26a5%F!BnDUp+0k_#^IbK5p4*2C!=;d7p?gq=e?Kh?Kt3a#6jaLA6qdfN6P+?_(^[#*qET8r+p3b`ajkQidt$.hP'A!MKj#.7>RPTgYO\-;]5UPUN5W5bM/267*s,7Y%Ff#bY^a&L]iB!',iH"s>#;ZfXM:-U3GOj8qB(RP^Z<.`laKmdcC]m#VRnd?5GF!uQdP51B[jPRRuV^@Hmg]jo#4Ybb7]Ut5dHKrj"P6k\u#.d.nuE%*h7mU51t!Y2`^R!;CKY>BCmm0CDb(X'78VD#EF5c-Dl7'qDf9IW:_$d<1Y4];X\nlPaNQ&&.LKE#"KiE#2"Hj+*5E,%$2bp)1O9fN]I592VDch$6nH_m"-,4J.YLV%iKFLM7H+r;A=l4.KcoUTOT>L(q*bl%jm@ph_t9SKK*R?#53n(p1OoT&L^mY$W;Ioi#%G+[Ae%-40g64%2*s\a$;\@4JT-1WQl#RLs)pW!k$qd.3hRUT>9l_@X^EI.@"lF)*qRSZO6Mk5XH5,XjeM]T0QK]XIbg+HP%6CE#U:"&22oJFBikae*/*Q^jqH^++XIg^M?)RT,#H]C5iMe+b3OWPP,@fMDhj2JZV$IV1^Hn_aXa&/;5$O4L'U*lOqe7QM(+m.8f7Vn+:2!b.$QuM#sf")i-H)#O:_PY.ah/C.[7&8#k?PS5^]B\9gLIRJ*'khnc+B%#RH=F%O!P#St-c5Z%T=-1[ZO\8^99Bei!ftJH*/&q:-:7%Jud\^*^(5m>LLSWD:5C[A+Lr9"6"[H+e3@QW?Af"P9I>+HaS]=gbmUkAP488(&Z^Z2KYcW&$ZL\1M,+`h,c!^s8/;VP%K-JBV0aO?XrA#opTTK3X!C27TWBa;.!rj>aae]aDoa29X7"^N@>]s+)\eGJa'q$jTs*eEVA20MlA[E:6&\J2_LU(^K82*Vb&,?8&^8$=NGtOr#T6-f@4A^CM]n]("k3=>=FLuKTKiF\N?a!S(9GF'!k)icBB^Gj$erXi%NrmZ>3!B-(L[k/X9o^-;iYKV9%`W..:^4)H$V8+>I>$dcO\;?s'hl8fM(;j6OBA%FQ=Y]jEfOEha/69[8`1f6BQN=f0QBTA^^oX,^hrn?AHTPP[hr;W[ktI0*[&5?V1Jb"YC5)>rqV.42O3HiT`B;+0Dt**CCX"QtB[,#LdE5[eRF;$e8ia5f+6h)!#-OEYnF;f!CBIH'MsBHdOF@+hiebh:j+#IH.k-aans7Ih&,W7a[i6b.PRBkpB[Bf)bV.B[Td;>-oa'8-/**>>tm"EE_AqE]iYQ4,a?Aae3sAl.hJD)c@7eVrF=I1mK2;bI&8q[\T3GO_K8!s$%EclS=jnY>/4V<>Y-&Op_V5*#>e^o]L(/S>uN>Gj);\ZccA9N5?'k#L=R@tNALil&ZlPA'2^J:VKAbd_>`?fs$<1"d!XW%s"o7n$#";AiZMWhj6JdMY,qcGdT8MAau$?8boFio.5[mq[au;W)5#mbEB7HGPbC>L;XfN9OUt&)f\T&R%ZkLC#J*D8L=cLSEQ_Mc%u^V%RKn-]0_H9TofiR%NLT,G!&]_3Qiua)'jSI&q3q%C'#Eir=`0Ahn>G2//W.j#:o'\',DIl?7$RCkZ[=ei7(Hb>f<\4=enW=dHG/^0b9!0(GYfVPm)n_-p_1SNg1aP]-;j"pQ88\`Ol+p461G_V[NWSZ[iDE1(<.c+hX+?8dej[l)gt6\SgMQH4^#B*GH!?,V4-d_XJ7'tL*'ZJ?eJYpqg3I2d`YQR.2PPM_Nm7>"M+r*C2.mCG[n;d75"]RtaiZc:iQb@.V%ufTGUCCatM*4cp@.254n"HLg>5nCugM]Rl4dI7#0GW)@$c4CG[LV&M-3q6\R6)BK6:4:;OT/80+Mgb"u(o0Pjq4ZRu&/O4[mmL@5SEc/8U,V.'lO$],U6&J#B>otdOTgn8:5=q7)%qn^2JBEJ2&+_.q7RgjD5.cXC"1%!s5J7q@;6'i^IPR\Bejl?=s-&'AlC/KSA5uVpg/hT7XQS4K18L8nn7LNAD",p.p;^-B4E!jFu/LbRJR:BZ'OE%EA"mf(J2+o)\Ke&o@U]nhPh<>>SESs+Nf5cu2Q/@MbW',%4.MhSCkA8!D/q0S=8]2AumHHAc(H3]1$@j+6/S1)L)Q^nTN@pDcBUD=FK,,g<'TRqV&j_=`b%r:XbC-@P"[%J-/2K^]tU;"/8p;dKEF'PFdCm_>ONR:_%UYm=k%_g8C-&?td>a70;Qo@s$bFQBHUW:jhR-W+RX1&H2U60soTE1!\D0UtWQ#4U;a_=ecF[?HjB18r(P'$;r#QObk9UhbQ&%R@GU@CW@Im\6P&j"][mS29b#610/3iq[I6'Z/ZePCHk,D,ak-XaB=f:L_F_5/2??+V1U,NN$4.:"U(dF?o^_8(ME1fZHWR^-aCb!@n#/@'F`OXQR;eMZlm:aP78'?+BG-QV^*Ud(3AP^,T?Q@\d!s7B;6*0';Y*CVI^e!!,YFUAnJsnW*(g9s0;!N;sf^74tA0kp8mgpQpA2&CO%q.*7p@mN!P-?(!a>@Q`[,*SW9e.7?9RP^"5Kcg-"3:^`$m>4uV>:kGE-qD;g#"q)#uW:oT+&2):p8jhO*jS+0r1lL)plFXAXM8g]:Jf_M7T)\KYdC\MJ-nOj,R"OY3jU5%pRu)^"i`DJd@ubr+X9eIq"AR^*pg+t$&i?X]#DT=bh<)UFI^-nicZJt-:$Nt-5m/QL?,F-9i=B="US.*W5(Et5j!nhf$[+l0?EOt94FU](T]S*,/%li!,+;c#?3TmH+]K1I6D]q60(&ifV(+FG'<@`NerXL&e)EULc:u:29a$E&Wn>/+Z'CrV$X$Y*"gUW-Xo>IcW+?44.;9H?qfQD*BWa1X&$h-9mci0qTS&5"I_-["Es/$knRc64*[.M4(a$TrLi(1dU:N+!E5bIYlMZE4S#AHq3;I*phc1Osub*@-!&R(Vo&O?/@:;'FlN&Td,4".Y?h3V(L/K$8NQZaV8bE;-9Ic1Y2]'NKPI@meF!'H8>l7P<@OG;2rMN^lX;,m#HeT#7c'DZ;"DI\ki)B!NDp+Mujk>.])O2KgQd0`9N*Z6b=I!tU>eb-&#[)'C"LX$o^G3Qo"4u%jTss\,@R-.k*-T45l7iu=7q3>^.s*`a&lEp8%T,.@ET\g%l+=aL=OE%`?BR&nX>(FA1i'(%V$PhsM:%dAh(0!=hi5o&VjD$_G'*NWEasbuZJF0PKAOX&A^5+&7Kp*P2G+SN9O0MZ.j9-.cbgoaqu--#gA'gmc>c;ZdM6[lrB\Ce0'C.'35=AMgt4PNaW`e`!YQ1r$o-3YN8^'?#l0!.C\Vjnp>NZ(3l_h.E5*$$Q>kgA#(r`!Qsp)&+;(?9M_;l?F>nq&1OVopglP]@(rA:)ofbor,IW5oO0838mp^\16Ptj,\C8c,K>1!]^5\KC=B?O3WZ1acJVnpD5am4J^(b!9T[\dl*&\N]rbY`?b,k/&Igq+]-O_j348]Z*PL3/m<:J#"XD'%BV5@MkE"mYQ8=4(eS]]"&pOgDfBFB.F^;=B7%]a[9X&o@jk;^agR-\3ue",GtU;#]-YgC_M(+lH?'OX,?bJX6pQA8XHGd,l6VVc*>pr$Eu9bY4?LM'P'81)LJM$/CW2:")t75]5pL%1j03G*W]EL+l7t1*&^XXB&k^M)8TBLBGMG"4H]'_#jlDHk2ld5W9P6B'g/`*LEtT4au:ag.lC#G]4!$;?mW5E1'+Tu:Z,Ae'nTBfnJ$-24`V0N1Apcfsa%41sUI7KdBD@kR]jnU62E=>MJbE!3$\MfnsqpVA5\R*#];M"A/q2MSP*DZEjiPHVjmN6at?bhlFFWd,LU`;`hVgh1&A^aU[/kXQV,=ioJ0M"meZu]t7@oX(7&<[8@$r][_LCs`50G@:%9!Jdt7&1Gl<)<]l1ITZu'grd]7\TsAC1;^M6&t;mEM/#'Rb"Gd$_a.KZ(c9&\jm;cY'K(e9;au_@TV$mh6fAk)`;6p_Yl48>ThH0\-]0N47ZqJ0]CpQ^u!=HeF&OuM4=+e74"HLT^s7W,a<@%6Vp16MK0%fs22n=fg?6E]A9mJ3j)Cf?[T3-r:kZG;N]R;NbLrhbrHM?AJIA;fL0\538Ui.(umlLQ+aN0WKM>Xc?F7@-tK6`o-R$$'QQ=.Q5HU^A#in;)N[7b']@CZefERH?D\F)X"/]\7u2ei\nUj@-mBps&hg7T8p@g")hER$";jG_$0);a*R.$m_8db3K;@fXSg4-`QP:aoJ&kidr17NoBZ;'BhT?O$r+L]iWHKrHuogZc?&0e2qXO:3(;=g`bA+AFimp+bZG.b*qN-?b[nJN:dQ(QaLhJ__fKITqnk-gbY2C&JlXj)F8>3k7g?.K+78N3%]Ao\4YARNahb`%>]a&)3V&FJEAO%1(Qq(+gkupMIZ+t5sd*LYR26;^ST?b&<[;'!',"tb@&hg801qP'4)9(,X_aFR5\Nu2'q)_5D>WE"P8/>,)cO2ae8X[W8<0u2oo_RT/831nRqY.;Mh2h??^#PIW_j[ac7)aKRlM4+=RJ.),?eT0gntbZ,MTScJ8gZ8VSEsC\\Z?oc6"%?VBc:K7WVmGA?oG2"%I>3>1l`NkB';q5#rTsVYDF"bMP_j9^8JHlH"@,?g?LZ=daj,D`uB^0OLmmbAb>.'Hj4W8X5H=)QlILMj(I"O-4_DA3-nXPoCEI+q%4'>g.5bda'L'ekuf"L;d]=Q5\c4UGW0$+cjc/C^("3oqRKZIKs,(c9?9-/cu=]N88[GaauQ7ZW:9:B;HJc2Ecl*b0h]!5TuE+&8cTBXqr%j3l&o.;(AS4a^OpibaBG<3B/[L0gMOJ\JcbD$.MSc$$PE^$3A6FslfE\@!XtFe0kYe.obB:LNVBN)raCU,R9p"-HSPp5SM[d+s7Kp+L;&KkOG>_17WQ,aN3Gr\VSAhblfOUp1Om-*A=dK]-X[JEkK5U@'T^8SrDq#hD]GO45e(cF<_sg0gdD@MSGRNCh2'(+`[j#nWi6[JWW-mrN28Mff+Y5O(M)6u2fPbR_.`c-%&JJ(gW$9W2qA4]gZ?&2-B#=cWZfM=?Eh[rfJfsU3)]?cUpgH9hPJBaDGGB_KeOD0oF?,FYCIp2bQ;IZ/o?+L5jS&u_DM[S7_d%$NEs`Fptr:*9&t8q"]h^7+A$adKJs?+ZjPS,k\n*-ZSNuXJF/J(F8YuAobt_K5?/3[@A*nYbD)2%8,b^*pXTSEWP+Sh/'bK)&@o[`T*^c=F7rIj^bZU2O*N#&GUg!##4&S]h4j7q[eXGS(eg./[0shjO\sWbt#3!0l,=O$HQ`rNVQiLLe$36bM<=(:OV,,90KDT"s,%J/R9G[%HUP"M'F/T]f1%-mR2&;2Uf*TlsOeuiKjM$bLX.J,fA%2X"4mVKe:qki7]c*A`0+JM@/2$u=EnVapP3M(+'N^TG-\RIc0hK.9[X#ZQq-uLRJhM[M`ZRSj%Y136JWlUi3WK("`<#'bOFdS,ZHuXj"l,4=0d^dOM[eQ.U7]<:+,(rq$-r;s1k"<1R@#>Ys=/kYJ@c]GkU1$VL+B35aR[J0Q*!s#^A5"j)pDK]"cp7i)5l6\"4e&Hai7bCO"8.(j>Sd'mbiiq%kF*om8Au3tE?ru,*"\8XM+1I=DQ6Q1aM&7dL0JgUM7k]EWL(QIY8aS1K$ol+L6NuPAV0t[RM608NBK9XL_MX3",^kUl=a;[18dk-%gb]Fj]TeGB'=3,fI.5@W)+J8"UTg;\?l[O*`QuEdiY9h5ZQ$&a?qp7;jLH?f.`)-\+d?Kk>W2&XiDm""1)E-Jbd1J7;8Or6S&PJ)hUGmF+ZLc%>&BKL=.7M=0_?=ls$%ZN47)]mG;:W[00Xr]T7];bKDkn>p(Rg:C3">Q,QWX'CGmT=Y+l(`k)2q\J5`[q(Ri6.o`WT3hb!TVcNqku\MgF]l$\a1])/,C6iZ91&Ta$OJTh9FJE0Sn=VE'QiEYo#I6)L'kK**4%dJ(n6t<,LguMt=S.3E.oPc+/U,p61IihNo<=H3R.6C8u)%EECXuPW-"I/24"I72MD=U&DYEal!`]k\L0Z(.%1G2'4@qopme$4%J9n7=hc"%IC]I5G,Mq`7"n)4Z:A>S?RZhZ!Z_X?89b(7go72p<9u:m6SkpRerUL3Ps&L,:QkJP3sm4C_=1^&W5o.k*CjZ9+*$[6oH&I=*[m,&:g+LX5TaAqed&of1hi)K<<,mL9RLXHS/m;6m"XH#E)RROE<;S/c(O!^l.^_/oRBts!si'S*#f/-bnA8[*.>/#0,[),c1P)#qX]PEhakM0o8Z8F#g@l/AHE8]0kWnn2iL-mS4Md>ggOJQW+bsFj*C@mPLfU9@\#p"2]ki'imDJK!^#i4glbL.riNnM\%Bq0+jZO!rB6PsRR4gKZWnC*H,LTdoM"c`!@g"A:TEc^g>'pbagGMj&icUcoWKi;kX:6]=,nm2MGF44g0M7TsO*O(csC,UguUC#^M"h-XEo;L`hJb&+7GFoJ1`"_-T?\"nRB!Rjir@!lh+.fBks$5_JaHAk%p#.nb[lD1Io"T@eFZ+l24&qXY9op\CXBU3EQXrb@lrOjpg'/Z[a8JSkc9G_e[HMEX3,O/MKTO;Kc#5Z7<;dua1F4@e)eaHC)2+JB)1A!,j0#MM6lrjDHIIGoi1E_XqG-76MtYXYJJAh-LU'Qs/9%YMIIS^O%_:pC=q,='@*%-:%bCt6(l9XIW"/nu'Ai2.]X&:ie!h&#FYL#K_:*FGReLS3?XR5Jd`Tm@utM:">big3m#YeMi:MLkc)t3L9Z`C[;(^&:Bc",b5ZO<%ZqTs7hSLbj!G,/!OAAd)JV&@0^m'u&u\b`.5,F29V-ZiSQW\7rV#&+"#A!?]*HKp9i;3']l^UtTgHYndR*uKG-KAN*EORtVl'C0/%06gt>)JMd-rE!Bn5t#0^*_qdY`aNS=6"1,<8l[CLQpATs0\s8!'(&O2nqdS]]r)"+p*?\9J62(F#6KQ+!T-]TfMO:06.Zp$gQK6f[37q:aF>,"E=s9P)p]0U82/=:o-NFTjPi-N9j,mI7'5mWdI-g+6Xk6TEp&T!#eoogL^Tu-=QmXBa06H4I&mO*@h#-,&0i>IYTDr-UYmnZWKNs3T);#7fPr(p)PrYk4(ksH(Cp9odUhB$8Wnkt,+kJM`jK<9KLqlSt?e)uC)0(6f'm-.jbd=p7+pC_f%8=Y)3\`W65=!Ld,,E^gP&V9&kgQIC`aXKtPm)P/ijhM/bEg<-1Q0&dX.GU3X:>fc"q2G+=cF]8$4)4j/se/I2OO)V)]F;"OJ:,BDcfA@6Kpq7,r*_,$F:MiI9ErR;'sYgZ(-q`Y!u6?]GCUj]p<]%3s)6i_CiaD<_9J*;D?J^\OZ2oE])HSTatdMdF'DM+S%PhCY`C^PKEpU1kC;j`97\aiD6+?>W?a3fa3H#c#:^Ie'/onYGXCCU-[1[BH8p<_`l.Sd5VA>U$d+RC/[UL9?k869$qk&r6r2#/eAkYMAMN__+K4BjrJ857+U<+DIOBd9*#E='sA]+O9N;oP;,5ce5%epq*&0HUA,KVG-3?/f[QjK`rb+/Zf>&G"[5b10BrL=]V=g1HO:@aa>WM4.,QY/%&VP:8V:il'6'VTmnDn]=;I;8kRuT^\'WH]9s6ZSI2&#T8M/u_qLJ'dYMn=;Mg/e8An>[7%lSLkglWB0lT:aXhHo>GG?(fEc4J5JH>8V6"I/?02_8Rc.XNXSH-R!)S3G!sf:7.f0Zat-VqW4'3TGcb,mOs4d<:Jao3O\?P;8M$gYe-pGn61-"HYJJpT(_PLm."%/emVE(M#D3>G*1,#[rgSP;-X\_ZOG:`;C&iuT.USDPP[,b[(#9]P5FMW>OMHdp.M;u".B"Or:uj2<#1`dM#s:ca!"N[S#i-^:Jlq.g6'FR&]J'GX!bccl:?@8:4P>LCR4%cm'YCmh1%VBfY$5D?kVtm4Yps3-"i_=XZ_WIe6;W;IVF7s1n7\16HVpf'EIa3ERkk(1D2Vfbh!DLWc='J_'Ko+[C=jOf\bU&toT*Rui/<+7T1,#^8A%a`/U5$da<(*l32ghH$(8D:dCZ+5stNIZV((`K/m]lYSH#E=T]I38>OnP3@+Y"+hffPMnAaSku$""H[$G^cnAAcZEn2=sHtFLo?i-0+bqqT^N0>GClef+T>a$kVuYPoP=-ndBSo4rLb70;[FZ@:-sFZ!DOgQeHit15lgLU6FDO4Ulh*$+WA1VXFr/eoJd)^K;!g&1U'Zq6F;FJjIaL9=G@Ka;@Gc,I]tL&2!/e]2"56&C.:VS.oqF&/?1CNF#21bKSKX=JVMd`QNdJESYZ0+*o^p^a"p]o2'm>8oh,CqF4Pi)N^3&e0nT<"nSeocge+?86DGAO9Oe?sS-o?IR7)^.MC:>MTX'#gCG^_\ZqS;dHQ(nm',c6dTGZ&`+3q_i1GU-FqSV%dK_ZH,I!N'oZj'.EWeld)kGaV/#>`WS@]0>!+gF_\+9h@H06nWZmF`XBLe#TIMe(W!O0&J:FT]J]rSuO@r%)q(Esb=/6P"EW:/Eo!0^Zch:N!m(hr,*/pdR>gu8VGT@$kf05B^;S3TjQp'4JjcG)$6j16)@hr$(+F\QU"Hk5(#R5ut)GmqS_\,g5JaNP45`(D\cijM:.Gr?Hf;ENbn,QCP$rKiSO3"E%k`_1@(4gE,5g[pjaHGCOLkC@L:fOFqp(@AS+TsP+bUEZ\.5VUR.9+\KN"A[EZOKPqOJEL@!?dP`d[=0^*C@OQ$:KqH(IU)(n;nAs6ldR%%U_`qKhTjHW#j%K>_&B0Ti!!87?Ak%IP/.]E-!YP?-D>i0t[=q?u6"rL<8nJZnEg"Vf/>A(Dl'Q0:@QU[R1CZ"5;Xf(=%p+=GCG#d@.#Qp5g*nllp=$$,D9.CHM5eBuXFH6A\\J5"UB]%>4B@EC1UV;s?DK6e786)W-Zqk)J!7(h[e\:sHfNs+p5Jn@ZV]3+UmSuJZ^Gkn]\F\d8n)rVH/an6!<,/F_<<&EM8Eq"N$*eIO!D4^EBUW*0J[1,SkX"]M`gF;*o<>EAsGaSmXJ3G#DU5EVaQcNU:%g"mS_$&gQ:ZaUFT%c0Bmnn\PMM($r^)Bi&(lFoH93hF?VhuSsgVorLZSJIFH&37tgn<*G\l#JV.+LiQ![Nq.HnQJjt>KeHjZ&)kj-3&"(WCQ>en;8.0J$fk`i+d(;m`m[?/9CD&^D0n)lEnn4jm`hLe+^j70npEG$qR"c*4bQ\FT+"n-2bl+<1&kCG#OO9OH8Q7''9,a4Rn"bV:\8r24dY5B.E-=oshP+d/)KgC!se3gIkj,F,-(NW3UtYgOH*GEefM"AD*)C^,TXY9fqdQ,4E>F!u'>[iuM/0/0/o"%#/`$Y:UpObS94!KMG6oR5sc+Y*&ot-om+`.)Ru2+"^JHCll_u0oGXcAZ6]%+!.riR#&P%VG,'BA5$*eVV#?]n;#+G)F8W,"7#!sZ"4%Z6IVRS$,2p:C!)lqnf9O.Wr)I\5$\mIXmmgh;lU5"gE"2gXm>2[O(#e1Zpm_MfPM,>^*4faPh'H3oIN3CuT)S2_dh)]+TnNJhMbA:&8Q/E1%](atdC,KmAE5R9k*49THAqnE*6SClE'=H-Q?Cl>+igG\4H$Rld35':UJAGWl>@=T7fK$c-4a[IQ]aW,CO@9/mn/r%#n%)t$,$hsHMUW)oKn0m_[i[u#4cKZ@&J.AK3i7S);G"6M//t%Y6;q>[b"<^D*eO7195#0BQBt4CX:$RKeq7*8i@aWBW(Kgm-Sd^6)5F2$ce?55`&V9/VEU\7VibcJ"K/SJ%7oOa^'C%j+jL`-K%@.P,7^1hbWI?u+t7,sH$OH%LiXWqp'20H+<8ZiV1feS)AcKs4o%[o!^.P9q=#LRg&G8e%[pP%4rskD3d6dX86=[+l7p5G#GChR),e87f4VWl'PDSX]cA_W.pNF('F3oVTFMi#c+8*#!b*8YZNs2-@een.c>t>d_fAW'q/^>Tokd0!.ZOG/q\)+L3AQ,r:_6QjZF*l.]Kur5A-!=\X]9[*FS\C8H!-3h`rMX"Dqrt:b6prfi#Qij&/nWG&BDfLp+a/oL@'7s3XuORCg[CW/>-X&i>jUkdWO3W+\)7ia=SckiULIn9Vd8:C).8;"T.)^^PO\,VR6n(NU$3Gc-:^iUE#:*kMJbhAK7H,'0WF6%p]E5sI6DJ14AY?7WL)`!8Y%n!0MPLTQ!G!>pW=6j6"%^V;dCX6=c]X?@d0_XpHobqtM4_%P!-RTr+&'5,+uXP*I@d6Biai2!FC-6U9Q?SUQ`.SmNNMG3jV>@G7Yq^^^N5NSPo5&l^h[i=?qRBOn^caV#E4d\+iW-b%9,HOeM1*cFr4L]BW+JTo:I28N\d$e74!?PB)C4X.ZdKL"O5b7`$AH&'SBucJ8"3+K-9V)kWm$c1soj5d1#p;M@Ep7$*kQT)F]])/3PNne!7P^tqN(r:Rs5B>d]negQ5+0hL:_.!,0T-XBgDWLmhq$"a`JMqb!&j0bS1/@ZmKaO,eo]iaaqlNX?'-p@dl0lW1GkAGpob*]tGQGa!EcgeOKr"@LN"_P3`$/)/Im)A\ps+pagRlFT46F2+sqXD+72n:@gZs1]cq0NhO,hrN(I,'N.FPam\.BT8E]&=A1l#!>KmV+OJ_QnEk_+A$QB(Le_B?=GKR)jj/o8_@#8;,Ruh(Pq#@@G`n8U"f>:.5Xh]A;[TO^2oWuAUfn62#8=J/^$nT8)Q9=QAKniLB=WK?h\KPWTRF[!bkU+T<1'Bp3o7=!P`tdR"XhM%*b8&clH>nG/%Jql&%e5lW??]o^U.XYO)A)DLHGeD@Ui0?V(Qt<`Z9eW>F$eTJ8gV.!hOG496:!Aq5uii4)c[.Za=%E!UD`"60JX;HkZC`:%1>bGL?-/pD]Kt`JV>)be!CNL;plga6_^"u)c/gf#Ir_?6O0q:Oc>!KXu-dToc?e*g]uPT#?;*KkX:cXE`1]/"JlLC47(:Yjfbat?>j*JluT`21Gfe4`FoA4IArq7c@u^WGle4p0@)rRm7kdf&'B)Ac0MbRjaD!T:]5G;XR;Lk4&OMOmK5#G(a2bU!c]o*9e5`b@]6+FmW\M&(YE+8,/#TZ*N@f8ZY2DAZI'QiC?fo:q9$7UPA/09#Jqq3C&S\Mji/\W]%>3Qe0>1UGYY0:%b^+!%/XesOLpHDs`h3K.C=DXDZpi`lg>PfduI6;W@O;Ab/M\trq+QpcXpaNDt>i0b?OtR;NK^.Ejn*!<7@r/Ukfr2%dF?X0-\(m[.b9KEkX8_FdY;B-=+@)<9\\`R]\#D'ojLjO0$PM&DWC1(QuqJ5_manHfm$J`A;h#%8>qs?G;WCp$"t-hNBBNaJEb&\<5OTF;3.omU?tE;be]%Q"CQ6F$*QZe<^Z!&Zu-;%Q$^MPVbuZ#?3Q5"KcJK2*i'MTV,Wd]:0L*9VP')"10I0E;bsjE^ssk:k`inB7O7OF/:;F>_=du5[\0N#AtgSk#=^1ibnWH\FkWbdJKRG_Gg-\G5L3H"IUU1=(i"dc/d@[HW7V#lBhcYg/KYIWr_ei-IT*;W.+YsA@`sQ6rk.P>Hil#A#qt8RXq7_"JF,rBP27UPI1p4mJu,Hnq5RZ#gjhI:BVSdBVS`HP)PbCR1M8#+b5"/c%SSX-a4`[--Pj271:--jl&<_7<_./_R!Ce"7VKWL*shIY@NP`&2bp?Ih&UF!Df'$3N$e(CamtGgY++K^n)g(]E`)T)A83fJuD:TAn6XHWaqM(8eQ`5No5]EBXTr_p\4r?$4ERoaH7.^f[K`W"6c/*#f$5UlYgsG+$rDb<(oTe@&24JK7\2]dh;-RGQo>uj;[#=k?pfE'ApX[a$U`d>N!LHBJFq\>AcnDZ,Dfj/1oDLnM2=+m+9js]P8T%BF]59r(ePW4TNmp'Stj_1peBp"Cf"girb,"Zj0CS`?c)Rcn`Mmd)L2r!!W=R)65R,XOR^9j\^f^#];!qF&[4n*n#AD;0.7eA5_GH^qh4jC8g'3XANooi2/5Ai/JErVpqWTu0>7)g8+6:2oR-uQaa+Omd8H3o9,1,7.("kSk$+@!mBVBf?pY?3+2=fqD3#f&rTO7GYd'ND&LouRG6o]0VCh3Jdd<"aI0:C"s?cn99ra-M%&=]ifEVZ-8QO]=Z&Pq#rPtZ)3Xd`cZ8mKSjOKPWRIq>AVV2@5(.P?:qq+71<=,oU'u]%p<^*IMC_.DPfTeiMmF0sNRBEtL=tHY/DqmFBqIMMb$<]]IfuWU"]]2mR.ua(]`Xq+a?1OXWP[O-cctJU4alVettoINc<"5UGOn5kJtkp&h,D4W[m(!@71B.6TuW#MhV):=,2>(Qf2UR&V6MOG0C+LsiB;'3*]01\0K@ikmWt=?D^Y%?95S0esc=I(8W@P^=oL+&U/-UtZ;_K92TE35[4[.hWPb!QTeq&L4fJRRQsa7='mR%F;W\A3(_e;hI1a;b[Fi/RfsslR"%"^3/OGDV6*R^+4GAJ!2?&:*2D5fgOc(ni95J"V'FP7aVPe%T"*H4OXBV`%6qMtnTXR1R2[Dqg%LJB#Ot+[%.?%8mm)sC1/@_+@eW]['$__;`@dbq$k)g)FUPhH8Ig.ki:gp1COZ9R7#gC(W.ci%!@k0Mk/a2!aNg]Gn@6VUg5VuRS6qInT1)*'I>d:e)70-g[S2\8LOQ$X:c:KY2'b+Vp@m,oAbG[g5(Ja=N;E"fhUObb>j;k^]4G%4M8Tu%6J>r+khUVs+&)"si!uc/--,BYs/+]hC,7Yj;n4hR1KEE6V9Sd(R)%h)&JTIs3<,,&Q!anEE+J_+>F1m+:+,U&I;C!t&/qFoFDMssjm8F%m]1):n;!n`&)\cGik)s`^2\P$P=OKP8,nc'JdbJOV9j5?uduS!QA;gEm#O+l5&`U5`(6G^X4V^1;.9nE2KkLsd;%lS5Vr&B)2A.U,Ll?@L^=(TmK?Bb*tR!G^K_CE$]fEF!W%PF.%n\'lkmpq(IF_=?b$L4Rb0KLg5uWLlN.!6cpW^,@H=he?7)U"4?&#n:[Ulc2<[$j1q3NkI7+KZ(UHM$*L-C-DWC>L1#n)JshFR_[#](Vn8k>^9.J&5L`JAmU)*u+42UcMl$br)i&G8)UMM8m*WcENi9RAH%JV@Jm!X2JrfAr1D(<8Yra1n?m#_#KTMPiZRHZA,,fd#$?RAnL1o_m&4N6L1Hpn.fkWOS/F-#E1=I!R#/0b$o9lb)is,b6\KfShlJafd%Bpq:qbP^V29fH,/V[o+\HV4HOP=aCd\NeXWP3?%Ns9A)8\Zk#Wqm&1jq`G[P/16hor;CEHAAl0+4A)9-mGZYNCkM7!)ZR(V7;$=A>&(9UM+kAkG4/I=i[R4`]uc.,tNY9V`1,;6^3DrO:/r3nrs5M!MHoQ[g[*uaO953@(IJK0Ck]ee9*,_C32Rf;<+I=jEQ;g$7I,3:h'FO^&TkA"i`#+9j_bXB,FC!k229n`^NZqcp&$X#+r^(abNRSeLG-0#J#Vph2L"L"Y$H4e,CTRVKU@7lADoMJ7'W9W_.Q$ikl2YReDelTJ<:+9=]qI"M542Q)!t>r.uJqI.Yr`a6s'oo9GF_)$2TkO6:]@3o;`"g6Li1hD#t.iKk'>m)DQ.dB.8m-1G;3`^+:4N:Quobt*.5pBIn`.D8N6FmrO+Y=%>To>4+E^u3An&_T5jiUGeT>5'@T!Ja=,p&n!68]Q7#U"i.U7Fp)gYm2WX2p#GUGu8$qUQ'LS7^Sj3>V2m:E:\Ye3l`IZ4:dRTl5hUAsW%9VQ%S2'gh;&$Sr[+^"!j6*_.P>mp.<.Gkr;b'OEN,nTn)^+"04AYRjIG).?q(9g^"H--KLagL*l8K4YNH7^q`#T'L?[i"_)4q?cC5_n]^2$1PST=-*[:*mjkIp0A.k?n3T^,V]G2Sj.+4IrZXRS#?rkZC!jbj.>._8[s&+j3jl@Bep?6A&("mBQ,T.\QL1jo4orsoK@;9Wt!S'88)P3me@i2*oY&18uF`;Yj^90IJW^gId!G\,mq"OJTn!3a/pRu$U(RJMRVQQsSl1:Vrr1#u/O\Z7Wl1r7)?GB8UOMGf[j&K1X:a\^?`&g\rr`Za$W70JFn]T=ilO%uh\S=,#4#+=S73mG'dHb+V[kSgaG_dS_;,n+b=,fDh'Enn]5"@$^hQg_0piO=k^kfuol5UuFCGb(ncAn\%KY+K9JOm_:"dA0l8fZjgjJnXq57EeJgLgsL/+0Q9LoTXTk4O1U31UDQnC\$/rGB<<$p;fhC4K'V6N@)RUDk*G*c,V:5k:%Br!PsJ1S^u0PlLMG3+n8&kku^!f>&rE1<4O-9:AYe,H^dT\r=JWjJ@OOB?.@&,S1P6:))/b,O,f5V7OQLt'UigB:AB!@U%>UoK8qdiCsNN3H27Vq1!h[c3;Rr"a@6,=E7V0f*O>?a7mt,o$j)8S"/c,%2(6eqKPK(rTY%7W-/1P,<4eAcnu:=k$9g!2m-0;nF#a)P!gr&2GQbMksi_^cTVf%hT=o/3+=icMG.;=o=`8gWfoLSSE!a-C*V#WP`$%4=Y=9R'NMu#0eeKa.nu/2NB]O^$9l/V0]/a<6qN!CB>6Cm_2E/=M\NE@UA+fI=^\`o4E]R$o1LVAPtnTa7Yb@"MOE8kN9C@R:+t8H[7nGaCd=)E)c.D-=YkV/^DZaib=d\L1)lnV'rD7&`GR$l(djQjL5MjUlOsQ[Jg@mjI"Q3Au(8QOf-i=0,%<:@O1D9M0%4/5`iL]M5hk6%bDK6o:J&HuE'dk,b0g],;LKo7::1]ZBXQ"6f!Y>W`F&?BK:ub=BruaK;2h.OtWT&.D[g-[X-VS6j%o0/cQne7(*G7.;mHC]o&=P'Ua]11;Rnah)VOiiYY3C4^+#X_/6W$SE]]Jt_*LFC-QlC7cQ^lRE,Vn#W,YSg5kg>S-ke^4b.&(*HkORYn0Q"VQUdrOc-sP`n7n(D]`2"RaC]Qj,\qqO#*2ZG).,].)A5$8\Z_IhQcqG6*)'NG<-lX&Of/&4<4ggZ;a$Mq)Tf@USo)^WW=>1-(4i/hX_&ZqfsgbIX9$:Sa_6tlp'#a'aC?+)b&+#bM]&5&8i:lWHF^_hT#^q6R6J\YlZ5/%iOG6n?Q9I.s*UOAFgr1mt[7-c3%;A8Er+d>*Y)Ru$o7cuQ((_o=]u\Nlupf!2P7-<5YE\!-76RR3`i/jZrABmgG9EQ@a^Msgou6d+k_;15B?X'q`+RW1`%s&4e)sm#q8X,TWe"]W*:TXZ?'`3mggHnE@"AbBF>(8+5uj9IJu_sek6k!Cke501>U%LgFX2fT<*lAM,5IEn]s(.'/"d,NcHTb@tsjW7L;>_XhnO)LG6i+7(BKeMhHhC^-L>ES)i;#/VaRTIOJd8!j&-lbUr$.^8m*=?mRG8EU/EO;GprWd.-_(QA>6@T:kUPX1aI2SfMaKf>?fcYN#G6Y;II8<*bk8%dk*u861?8]Ft.S1H7,LR3@^PLk[JW9ld:_0cH\F8*3GYticRV=4Q$8_FUf$T/kCLfVBc_73`/>)<*[_g@F$0PL^\-\@DGl!+,S8_mK8[g7&IJJa\&5]a;H1cP[r"B@Sk_%$:,NhOlRf2;C%baVif%[<*MIjFS'W8M(8-?&aWI?es2+9BS`=U+;uXW+IXJf)-U>a\%`]eOf\uc:22>1ha)eH1lBCgb)a^2m+Uj%d!i^&nd3DVXf\5;;,HimXGco\Vp]?!(XXQp5?qqkUhKtmLqtQ/JInbXdcf%u;j0L>#9esIXAF*n+JDt:J=m^@U`?HQOFRQKA0ql-j.#%-hQ+l:%3*%*jA>UVaO,cN!\o_"!/?H:Olt$0g*0p&'tnL@R5^4,[b!dQjQ6BX;N@nb`InHrs-pN"IZ6*)`4riW>$Uu4^pEKOip<=b4sST\!%Gd)n-*"FNr/!abFGpMdrC/lSg<$FC0;NESjL.oT8,1S'i8M2jfUf.WMb&/BT?+:38XL92#NEcQ&,6]#:A?1e^KNTocp`Jh'jtGFiD9/qXe81^QlDVM-?sN`(T_f9K2oDA>+N4g?UZP'!;UC_Z8rjm+rR/ku5f)l]c[J=t66#IhadNSoB94uOY\AAk`P`sS7RPTtaQ*bJn"NDrL2;i`"0=Q@5]hA<6,IQ!A13J4\[("[t<)6sb'[K^0p#cXINaO%][XApmD+Y]-'kZ8HT8-c+1O9*Ei5d]&c1kK6DjM;NQOX#6+jO$)t$MXgVd'?%4,-X4[>JSPQ?b02I_,73u-ijh+>S"gV&c7R3mm\O7XR?r#Q;1YRgMO1/`cWo,?6H"3%/Md:!X0i]pZGWk3!105pk/^5$3>qeN'S%!e9ajib=7jEorq?C$DkV^P&pAggmu?EE&'8_&WeF%Aim*t_.[p-,bkoaLuGk))$1ulkqSig-j$q=k1lrP)EMrb%u1f$JICJ'jIAVhLj7pX_#Z"&_j9SWVE)O6H=5]Q]%uCKDKO_&%a8RUGnlkS&`F"0liG0;LSl9iph\u%!:YPYREGnq&Gd3"LSo>0U'&@7a;AO:'N[P-$:B]$8BaIlP*0iNpDf_-K31#`s%MS-T9[f(s#/%m_)`dJ%?*mYHIFcS=)TSL&YN61Vj'PILYIYbs.]:6QPCfQd1TGp*.lH=?Fk.3Y>teP_V7">J0*R>1(/aE4SphDrp;D-Hcn)YkoB-I@2S&??q*aFZps.JZMpS8u!'TR>jVXla^j+NWo:p2*rI-6nk9#Yqgkl;grX-oc(K*cG?b=a"p#77+;+g"1#7+%+>G>e]$gs(6A5Fp7d%_@CHGt%aH``-9!nf:_qIkX's&A^s+qL@&I)*Ad%RIE`JH$G1;GCPlr$(k@_lhMaI/[KMb6iKH\llISFuXE4ZW^r.b:hcN-(Lm?#$BuQ=t0R6F3@98gKgddkE3A28i*`JM?`.0RWM:JoE&[(:^L@JTZ\]m+CrDe0Zj`uZD'9T&'$54a_ba'Nh+9:Jap7*WtD(n%oFf=1@-1a5MLqR"Igb#JB4E@(h6Na7`Bh_bJJjpiV^L\kL`'bXVN^p'Ts'0'VnLLU`r.&%C%3QkS27ViuciJ8;C$&NX$aH$%k_J]'C^i($::dJUWstnU1p52urf[IbfJs$lDPY=bHu7:n=eX%s.rr1'B<_1e^HH6kW0,.RP>@4>o#WBV@b[-J6B40Pcd3T-Lg?N]Dn(T]Vu:@0hUd7^tfW&936Z,-b`K^qcm^5g0BC;d(khH,h*,k@"UKJUf!gJ7*q'Es]rSj>cuGX+4Q`OnK%@L&q6Oj/Hl[K#QrF%C,]L"kMA013fSjpgB(Wo!)]miE=nBa\BF5?`dc=k"U*+^s\gDGLH78=bg;,La(fuP>1([am\OqgD8:sf4QoC@-thpaZ?Sb8F"r6RRs-.*B=AnI#c6`>3Ba"IG]E&o5F4X[:P!UW2Z!;_6./f\`nP6"H@$po\VOuG<0/;HF3LD-SaO+Q_4kO7Cn"-\JK'@k9f+&!jkOsj%$N$:Oj&qE@n'!+_;LjKD$JFF&C5n>InkJ1M$g;#T".+n+PYL5qi1p:#T8G-me".2-7&#)RUn1)mZ`\^j0IGMJj7'g$-TnWUY[4#.6BpR6m*J:+Ljt]FL/sm.5gcN&&@]tGV,np*U*Q>HaQs0P3j)jS_Rk[>8eAeVFGC9ZLS?npU@j%#T\:2q&!WeOnWjC"j`5t$J"_YQab7TE;nUjt8/)"/_?#c%jWF\=6T=V1Ut?r>5o"^q:^\jA1s-OVpB*&;qGJ57:UN;dQlgu7^)jNEliYZZckPh3l2Z,:EYTK*?L+tg+T:fB5j=S+'Q*e`IHSO4_,#6+nm%+T8BdMrJjZr:>'4KSA/!Cc+65[P"D(pBlj(J.8rl^EV@37*bOqDu'UL6BTTQMXF]_8ZFa%5EPN_/=*@a9=aFsH/XAtJqSA5_uMnlJ<\PsDc$c."#Xt23]A]$FPY>T\1Tg4g1BC:7`cX.rBgg(OZAf:L[D")o/:S.+$$0hkEf(c&^2ngKa^B]r`m?(]SH^<5&Ae#eB8f"+rECF20X!X-6eli';f*-\!;`$PSm::g>96$?,F\iYWm<@/KqP+t_B1lo]Od-aO,3$5d8M2oP=$$`GPk][35DHh;SAEp^H(n""STj"cTFp@4T4G%F=>BX;2q;J%kR;S@uO@Sk=sU73.X4YA55B.$:p9bKOBAsA-9CN>A2W/J?GFmfq.$QoZ3&AHH[50mZa.M.X`&3WD]PcUZ4%i.Y[?ooN8!?qWuGP=XIF?7-^;dcFBi;:4`_S*^]7]VR=r?&/aFWrL@j_6Vo1f7(8n6[(3]5dLhD7!1*Gsm1&XbnN!EZ-pOc'JJUWN&@^+qmZY2"P/EL&c!?h4CD.cA`W=Z"5uL"h"+95M>?5O?Y2fL]ekEq&9pW(d1WK/+G)qIqW<&SdjSp%uBj[HR);+^dK@I6Bn;J[L=@@pp(3kj?T3\\+ZUe'Dp6J5KH]sb[K;fFOuGS[(mBEWo*l4C==ql1:SOP2DA>NkC!8I1':\j#EeaKHHoDqNWr-$5iI_6j\qo%)$f.F]Cp8);qs.*aGJUlA)A9'efG\lQ1mQGIRMX(#%*RB:3Zq!F"q]oiYdp^JEWpu;F`eqE(V#\4DYJGE(\C=cFa#J$"+SX!kR*d1Y<@/=eLL#tQmd]Ui<\oZ!/jCoiSqTiXi>hq^0RT\+Ber6Sc"dE)9f3qpo8&kQ&P>*^+41;^R`VBE5HRF:W9Co4/dmPJ#ndIaU7.9RPd'Cl1tN3b2^9`=i5m2"@+-U%`+"P0')Tm@=ofq.pI30[T\S5mGDk34]S4QOF;-Vn6'7jbIa>S&p-*#cml*0VM5eDbijp4Z/G`LM85Z&4:`":('pT5hIt!E4lSYPJ0'.X3.[I"T[?^0tM[GuQg<)4!ShpUmUYIh\5DNIQc)Nj+$:JCN*,/c#?Fs>b/&ADo,?^p8a[Jdc&&c-IJ[HpoL[h"Y.fe=d$u"!,bA_"F9UeR4F)Kmsj9<^!2FP72ab_kE*9Mu0@0maR0gP<37-@DG2*1VI#9KK^e3)`t59.\F7DUbf"?h[k3&LnVD#st]*M=;3iUS03k?_VkFYD6t:'Q>FY0(s!$5bJ/EBs@@h`9h\\KZ&GW3F560^21XpqYADb0kVN)@.N,8]"Mtr\WV(jpbMkkdD?<_V@V<]l:l2@EgJ:>ocr5&&S8RZDP)$3#9=b%*!\)E(jKG%3'(JAJ.:-78Z_n#OT6uN@3qN#3$PB&]`o$7m=q<6]951'O>uE+kh$[ae2S13dPkC#9oiW..-*fB5@u>FU&Jd`.9`#2J-Y\o9/*[7O=V(BZ6^:r9SCiN29-)nbh0H]oq'2^fMs(n?Y%-i"^[1#V]G/INMd*25;b6fq%.?AB1_GE[%$K2<+g+sJ6u`'b8NqP_9q@k\QoHQ`>O^),=_X"*jZ%U283*dm%i#WG)bUo$XqE3:3@f\O.d%IVJI-dWp(`DYIKRt@n1VC]\pnh3nikj0'"4Q$%Td,Wl!mQo>>C[bl_Wj7f")'"'e%m,(R**nh[bmj!`TtZoqm]"I_tcXO.T85Tlg9H@c?24@]qj4lbXY9iFWN@Ook?)o1gprX;!IIlUMXbF@1pK+6TG"U4?M%+>UhiYWu3Lg^Ci=FIXaB873f]p1T_3DK&KIaG#^OdGVJC`]ap_AEmB0L][\:`+k>VGd.,:tBUiF6$K67(EAYijPPH`WkQdO(W)t4HMano!&b(p5fJI,V(+o[NBG`:")cILEI*>pkHqC*l*@r[i%.O'ZD'm&r1cM%_G:K'b9h4gSe75D2&k6T63JPN`3e3R9m%dl2[._^9b=*/O89]T'7HRJ![biA:oa;BkWot!Xh%8D;8^t*TfS=X&fSHkXZ&X.BF3gRtkK`m3\U$rKbCA?iG$4dJ*H@pc6aE[IN_X[`l+A.!3V54a]n@jNBl*2@QIe!5UI4TE4+G"37itXe!OsMHN_Ehm6OZrb:-4"S4\N!0`#Ii-/nF3+DT-=>mW2?G\Lh,Ye+j39X1DENJKIGdia=T'+HN5j%8BZ^J#W`5<9^BM3#B.8DfhVM_(C'Kmo:HA%#(#\'^[);;YY#oKfp$C:;ne[Dl(WlqH6$B*%6DFVb-,BT+X=m6^BC7Q1pLa&eC+CXtc2su%M@tYC5hRg&OUK<0mTg=B0SW85>cNk&6Prd5XY.P\%#6"8=dpKenFXuW&]Jg&cDD;=ftsbDd/loABKP)E_5;Vn(a^D^XH3XX]2;Vra1^XL6$!5XYSohX=sdhgDOGGPM$YN".al[@TQ(Xo!QZ<,bUk9=\MR6:l-("9S2k,UTSamjNF<-Y1G?Wd0aP3k'GEa$"GF,I+mJEBDga<[lCP-lb([jV:_>!7&B(*l?:giN&/Ct/LGG*I'*K/*dX/ui$7_/(N=23-bd7s-P5um@_&#canA&Y(=-f%e;,EU!\Hn\[Lk2C^LXu!CP\Ib*_bW,o:?!BBW>q973,,$W7]MhL9gk:D9u+u8oo1@J206;n2\@M`&)*m7#=+DbC.MqkEd>PJ9\bP>gD!?r;]Q-$B-F!7lt`!3<>a_7Fc@[J_7@H!U3'7O1)P9ONb=[b1BYG49a3V;Z%>o;73(c@,s8b[N:GZ9mkNJR)BpH8<[c.X+u'0`=1.'oZZm\3=IfQtTbHihKM\n]Pp04?ohc!a;AP,DhOkdt-!N8Z.2'+I6rJe-(pOMoE06lp#teG2`et^Y(5O54M$S_=$^N#q_@/_;O#I'p7q7=1=_p`>-u?ki%18DQ-4#tObU5:_64"Vmee/e###I$R77<@i"7PYiMCug-*odI\5HUjn"387OE?abtPVnHm@h,YOegWH]^$N?o,e^sip`lm:Ic)k]8)ak\Q^Yt09?ZH>Lc;)UCVp/b74HK:p%&kDbBJ#sALP!lRYcJ[M<*H#mE8tYic_lN%d/%j3UfDmp\3J1rCQ"/VAC-K]pHEE'bJ1*C#j3!,&c1IE-O(`"eXGkT/DP:S`4P26SAF:Glc1*b+Q?sppr-\9(S5=.hEMj6?A7fk'3"rQpB8fV:o^OD<:-Q;#O=@$_3-f$0'F\qc.4fg1f%?R:5GPUJab>,irKL?DD2!OSQ)BKgPLE&I$Tf3JNag=X:QA9+9HtTc],GiY[R,$Z:gs6&>[lD$F@bB_VdpV>`R'DZ5LiBWKj_`)c6)kj'H)]HA%0>?UFF&E+c=LNsrlbR190:l*FHqFar0^R?YfoHg@"JFlXD&b6bH;I\9>iUmN'([.E?PEr)'OSok'*S@Ml1lD%Tb\<;k'F^X.Q*^MDTnY*9ob=er*__[0?e*]jd<27OHV,D%tEAY^A[=6F;u8%'$\8UOmZE;Vq$drQ$Z8:j;O)AfC<7oRL.>$t@1YV!B9+r:4n1kNr0?E0>*Zr&\Q(4,@bsL(9.rMu?#N&4fAni;Q5LYgS^SPeC&UE7Ri6."K`6H!#t;Z4IjWI_T6pNtog#KSlXoJL1q[G1m9D"@4UH5n$%%5qV7q\<,^!I0=Y_P&-j^Ucj9UC:oVZmIA=:PVA>Nl8GHWqCdQV>>kafT>@5cjA^l:L'5Ut+Y4&??EbD;F'*luM4:)inkdf9h(LVSWQptd>sDck1&CO'R$_!9=<2r/gu9R2HfZ'C"%lUHZsO4sG`7Ad#S"99i9Gt5MO04KDd0jd[iasTB&H*[YZdfA[/Z;g>!KmXVXNXG3Q(E?UiLidSe>/IV%3m^OW5)-c#2KkaG0hMP"KJN.-_@S7,HhZ,kBO(8//&0ZYHb&Wea(mT0"I4.V(0T[TMYp[_\-bp*Go4&qK>SC1&SZ6,NSal_\BhI7WXdecM&cV=[P2QQaAim@?@paQQ.QGf`4tSpp%q^;9'q_\.,%,OiigaM<:E3JH/M'S)uV+ejcpFZbas@drT#@3YC.+4^a>$gm6s7i.OGXKBHRtNpBE,;%4=>D+"lSDk414/8(A-A[9n5YBHS$Q5c-f`6ChW?Sp3Bd<'Up(8*iG6r:6(K0a^a\,W3QrVeYq?Rl!DPEV[ITD8Jt3E15`=0o(n8dEL$Z%TG2e"%L+BCA2@q%9jb1RQ#KVmPZY5jr.OA3)YkN\]IBK*(POparq+q"0eJhc//g.3++Xp-s5.0F@8r;&9/g-(7(8RF(c5C7VJ4M'9"1PT])FT7!h:<>)=)]_jVXb=G@#%'g0[s#J2'A^?@bZ6A4r;ZG7@MArL=oBQ&(3?o\?XD5EORU+s9b<6$t;WTOqI1_0kn'U'7FOWmY98juk(FO(bZpFfd(M5VBl9sZ:4;!$Ib\,DMD-!rSSOH,N]VCsdce(CL\9ZZLhn+9lcch8j!B0jG;/uCSo9;=gt=f+jS:nta$An\06)^Ree^'g;jY'm_k5!dotB;V?(3aHoV@+Rst9"k0DaKQ:Cl;R@GZB)oVoBk@uUSFJJKP*1UN_uY5`Q>P=]=o5:@P,m]66@e^M_=t=J#>H'!&#JfNP:$ntQ,eHk"q,1Hh-p9,4ii=iqNaWIL7?8RXPT;bMdqpG&e?^Iq`O,n/coSbY?#HgMD8Z4N?8J>6K/laBuMNPb%n?Vdgp"`9?h!V=)__VR!i$+J93BnG9(LjS4\br8WIG?Fj[YRHt4_7N'/!"G8V[')6GGoVH_LHKqorW7_:6*tf5UE@?^Og*g/GWR*Pe5cg^hd]+kq3,mHU,Yj*heK1V,H&'(fXa28eLcpn#1uX6loZ?7d'CqDceBSk\![`i?\1I@^"N]1tl4EB7hPX\5#)gM=LQRT_5Ko9JLafi34E!I8UMXHH8g;&2Y/OH"$5kW#:sj1h2@`+0\*aVQJ@IL&!:=1TX.%NO&PC]jK'3J.gUP:&@!DHP-](G:Xp0_gj]^RBg**Il7%bG+W@"RHH8*EeBVUW6pM6Rs#")7>RDmsET4JR%EeoO6$fj!qhS+<>0s9hbX"NOI3AmeJfFbbg;KiJe"j'U8eGktak&-)1_GD36Y17d]drbJp^aSZuGa("#pT?12tcS^gJSnb9GYL?Qqg#6K3j$M:G*W6GF@^S\i!!(i/Mn2bnK0;,\;=%Dl@4lX_AoHilgFi6N5dSRXA/3FV.TNg9)a?C7/[bECZTWc"G#$GU&>:@7W*`eHCb,k2bf[T^b8#?1=:l02)TpYN5!2YiOTOLr?mVY[)4=/SL0?$\NA?kk#O)SFlrp_\+>R.X?9+6S#k$;D']AW5S_Cbh`[%%I3@m=WcV_eR:JPp!,Wr+mO-c9m/YB.77Q.GO3H="KZ3Vl/B8UT__I4r67o8(Y2F03F#5E(^0aM)7-S0e'M$/chnl#l>"'OHu'bugJ,;BLN=;6!:FW;cV_]f6grnM;@9Om/!m1HR!%.6/mjJZGjUdUnNjM2G(J@hIl4a-U9DHISi`W>q/@UNO^Y30G"=b\W7buS@?(mWbCmDFb*Ll."UoGI'UJ$a_e62"U,gP\QQ#@oCpE?''p'LE:DF6>;mF.B;EV9H"h8i6qB#bdMg:9G8Pp7D:7mFB$Vm65iO$VWTcm4ga$B]Pbc2\h(\#%*7H.@r3Flg48g#i@)/1Z.O;qQX+Ufg5.YIACH4f6)7`f7M;s/oZ0$eLW)1+iM>kme6B;d[p_e>b2RV,,'<2AK@P)mj2mP!X`Z>:uL3`36tSslT'X\Elmm?Rl1rHc0[M#co[Rn5XX\e$tj_oE(#IHn1"Z=C`=%&`M3c94\Suc6BH_"i%AEUjf&$Igh!F9q2fX5_K.q`-N*FFhccDB5r1>,pGlA[9Vf*O7PTH:pOJ5M.";los&sce07nUc@th/'qSYL*7#,aB6D^'r5@O$^%#:A!=Bo:Ka#V4:@"lDaFQb2dOb,(%N'8(GFMSUBJn;m/OOVGTj+ojS!K\;5]ak4X?0O[0Pb>r;ML]/Wbl$u63NF5-o/Y!!TYsZ7"kY5TE(!j+AS(C#R2I+jM?.&*-sVIJXZc0D%Tbl6kL#j8\F3l.'&`]D,h/`0ObDO0N)D1M/o8SLP%T2$tK0&(*TLi=\&+6'#19YZ/NlB%.#(^Xs'&G&h#q;C>,_&a5gCtN0N2\ers**&6/m7Yn;kujRE1.Vau!pE5\-"Os#:Mf%86LnH`UD2'7+Z-_`Ce68@oH8qA74)/s)/%Lb(D2gk%2$-LsB#T+CI:s.3LD.R<-Oqf`&*mUA$&S4(2I)V;91Gh/L\+bI'q.!@k=]D(_)CW+sFD_`Q3*/QT/tD#8@b4:OD8X+aI,9PtrL)l&;Q2U-u@W*CKem'_]&Po5!CU_=1aBDAY)B<7.5q0P&!9pbB;#n"6oaO`W:*Uqn-`)TJFf$8VN,D-'@L`cu!79Ld/'>r#;]cu%a!JMqrVW`M`1;dCTeo&kncT8A,Q*-G7a`3fDa`*B!_8K,2;[sZda81$:_u"5^$6_f8*69;&GZROo>E[]dPsA@k9!m"E-Ghc!YHeF5AX)e1\>!Mn+YZA_M1$6nGDK9YJ3:FZFA9MM100!*99L.5a*"7uTY+-==4FX2qL$:/&l5bng?=V38rMY@,ILh3dRVL;g2e#Q6D+QLRBIJ#K7!m6/nf;XN*p:2m2FU>Sih8j0;&g#P;,cBrEC?ERd)]@&+/qDu&>L4@FW8ZhG(FM8A(`+ldl`o?TY229fS6%Yh>4b@=omfLPThMU-D63h&nD?*!Z1t_J0AI'.Yqb1C*o5N!Jj\\?]ebJ-bWia@CF#5<(&^gOD02^lkkfC,26e\7O7&MpS;qn6Tfn`OTuiL#Y300BEFDfq,7>8OcG4;0g#ercHbn>E'$qH/uBbK%Sc#Lg`f=(>YM(Ck#!7U&G_TVD]2Q;#t=n8.(<2a0NUd_DX_:bZM"1)knrRCcUeLPG^GRt9Yd`?-6ZauiKEO:))]DY@Q]aATkXmI"[n1*J2C/m;27\KEX9OQKV]bp*)]6.5FM<&;#9As.'s_.fo8:M"@;.ZkZrlhXMGraQ):ILe)2#0FNFn3B<^7`nVmAs'u:V&!3ldK`I5Z>C`8QRY?5C\b17c-Fu]%_SsSS2CAX@@O=9M>3laR1euCb^2u^N$p;G"ba]B/;;(jiIO+6*#UQEJo\QJ#o,;_bAItKi]D@s]f]D.DAUnGtEXmmg$7qYe;Lmsd'5/:!$Nud5Os3KD'/4D.Sn]q)9hg;N9D*$Z$P/*bO@Y1Qr;bSL3`&d'q+qPBN*]n?a;?Oa"rIFd9Nu?kYJG:eoAK0oB_^A"Q;8e\iom/!4i_s_he2[e125DEr<1H+as^3q6iAe)s*a[fQ@93$W;S/bf6>D]@ZG%4_ZY-&1k]-Mp0SMWhJRARKSbii<6S3oGYtsEX*j5JE62RqRo,Q<6IF*t@)E_bVh(Pm^r(E[bC,^kGV%<].$Jg'27ql%0Oda%fO.:^&oY4/9:5UW5m&<-Le*:hajK?,[i<**X8o]Sh]+SK1C[n1QAh%ilEqRb1*I>`")4SH3V0R].L?`H)&F,J)29(;M65jhad23<8/`fu'6XSRaTG-:nVM;A'<3^:'!OP\,!G`G)E[$R5T7q-G(W.,Z+f&%>d7-VPnF6KNJ`I)7-#bP$>G(*25hFaaNC$p#q5!#)q7XB,)/l4Q?cR_9lE)FT@=5Mh&C6?2>/rFpQOOL65`Nm'6VoB0p.aqY+[If(W8JCo&/t/@'gB3.R^hGN_.O=RPPuO)S!E_7P6EdmVD,jc>M`E)e%Rq'4X7)=\nbub;QO0u;(upd,f@oX.@8J[k,OY4R3[%$P]UkU%$a-$+aZr,ONSap"Lp'C-nn-pfRi=A7Ir;m`/,'K.&('HiC(E8E=iH7LKqfh<4UErl@G^n;/mn@3(0l#/#Pon@aJgf3Y&N:^'S$`bI_daiaP\b;+X^)%6SV;"\h/H`2)qlRcfsiODu)g,kZNLX1=K./VjY@ZH\37$6Kics&NE\fIf0'_@eSJj1+k.\]YC-'/IdW@u2U9,mk:PFXIghcOlkrj?-RO8(OjE%-Lj8WR4\6])l\OqeQLN6rQ%(7us,O=ikH4PiQk&h!sY<>D2OY"Gpsi0g98[NU5+!XoW/Sk=Ym`C(l)6H0F3Ygf+pOG5c#f7q_@T)&j@kc)\@3ie;G&(U\oe`c;0u:DAL5/U/(nl8Map=g3E>60lG8R`\?.UPn#9\R,t)",q,SGmitgqp/)DS3[DBgZqII-=S(TUZ\!_?b`^"*iMj=pb\bl\SK$KBaMNbZ1OMDMMH/^sN4:d%_P-Hu_/n"F'=)42<3nk^9l$XRo^s4gaQJOkdtk77iF$e('BEa(>^YNcd!@:`?DQ@!R0?HTcqMdk2EngDJ5]o3X,[PQ]hd'0YnV,_*&*-3NkR9=#+d(k@)T\M;\]*._q^nQpg*U%l?n]/9$iPnYd-I_\kAo7VO2Y:$$nfn;GKu=ka,o@Obj4j1*BcZ&O>T3+]PTS;AK+hjNh+^^Pi%$3bJQ(F!Z=46IPFa(7R!Wh#j,K`L%N-)Pof>tfLH4EFj"H!c-Sg"=#a]U#pIK\V=cgkp>QjqegbTW/\>CQ"'P&?@4j#.#"97#hE>V#h*#/iNsX'+V25,"t_@Jf'$D;^"usNn"]_D=;O#5)gRorJ(/.q`^%,=/'d'G3F)lqT\=b-Y3u/Q*UT>Cl[OOM.:L=>1R42oZL8Q/IEV*U8G5!BKH\t&A`fBkA""%jC^:YO:Fs;U_MnSm1eBuk*F(?su)2Q@qZ8jir87DcGq\CO_)B5`-DGNPn^sHd/A51k"Tb`Yo"l,=PBc2f[Hkn\XR8$aAI)IYpH4T/M/@^B_`QK6d^I)")B?@'jjga_On&P%JZ;>cl?`QP9I*8`<+Hr!Qqc'jI^5;o(('H$D@iC_So-q;'s_?Gb`+7X31NB.]k&86JTale"bAr$b$Z[LaPh#)T=be@AV[jh#Z_TGep2UC6;,#D*q_YoYmObnZ5GHa=at.Mhi:5`]05sF_UL14cYaYKS^og0d>'ZNf`h>9q4u\3n9u=Su'^'@:[+be.qWhiD[dM3X0'H<)m!QO71g`N[fk(nWZ3LUN;bRq4-jYSL.aB(F*Q%RE`#.YIYDl!>EOaEFJA!I;$ZX*]Z13n]#)UulG-K2k)!ZR$Ui3;%8[H'>31?'`j/Kab_48gYZ66e7?7I-,e&#P'Pg,UOU?TKKA4].?m%2Yg@Fi0Lr6WSAB$)S;o%`YVlN`u(9F`\>&VX`.L5cSs%rG:>ed!gjC(U)^K?XXgW#gS4ZocS5N*u"cVeLe8[8;._&i0WFN2Qp,j)"=b=-4n\1'EDsnhgRj=(Se4Gu;fp5=\)m#%(;#SMTit`QHaMZ$!RO&,Un4WknHn5W$O7$.VsaO'+m%k`3Vsi-31.Z'L`h)pF.B4tquCsfM(==='b*?cG--(Q]Ec*C'kpCA/:kt;'Rb0&EW>t]gmW$;3/Nrrsurbqr#7Z_he6'bpP62qZh^Dq@Ie)J-J0fLYj;oJO2W>&JD)2O'JC"=UpsH"26QfcY,-VLef]G@/TXFS\mtg5K<\,4JDSl)@.9/&dD7$Tu?'?IK'%j>b;,_<-e:1_25a$MLI:]aA!7$@W-KgPaXVJp(J(pk_B[Ya&9`Kt8mh.4C#J$hdPF$":u9Z]/78J>#TC2"*$X/,-]b#(Qh`$c1blmWDQJsS3J'8>*K4e=t-3>#=(`\*AU5qqrdU>0KuUmn8NNC42<<:HVG-G%0_,)mcn=DKB)P(Z``:pe%>&AcHt1u^ipUm@%0d=cS9KSR]4A-[Z,D^7DAoQ]usqrRE6-r,gnC6ema"."X)4I%T&F3OEQii%&A2cMUP=3Ps,4T-=BjU,N#5gUM$;+Weh%4\S9F%5U]-E#H:U('MZ^u.LhSJ"OVNC*CBpO1d$FnK-_\WGuf_7&8i0b>n\\mZt:@[&7@N>aa3Z>ms\o?D3fAL*]uESk-)1L/le$(#9j+QoV/*FKk`*PC:,ZZF1856KeujkOL^?I5;$&E-@?i`DQ4Z/gA;:?O:ZAP4S0m)XQp8YQRs5l;K$IUGc//V/!KV*D6>]aYr>5D]n[Lisi\2#t]h5a2tjXI6JuESQf>SGO9[h4F3TYf$Z?@P&iNP"q;c40fhOVI^f&;PBqHjBPL7:$rT(f$A@^E3>-#8%!UB"u!@Vs(BRN'-:HVDIN#,%,B;4;SI"ckpZ@#%M;-4:rh\%)?]30Qb)r9W3"U5L!1ZHuLt[Y@RjpB`N`UoS<:OiZFlg-CSC.lrMZ@=aEVZ8!Ra^#(Y&G>$;!-R$]ZY_AJO?RI`N6>a=7k#s??I#lhcY+,YK=,f3N$E@=BiE=!%sauN8"iWLXT"b4c(KZO*f:59[s(`0Vg4s%>S?XKiIDm7,nE`Z>?j6[j3m%.$qQ/g[11mhIC5ID$G=!=c;HMKT@Qmi;M)>4XW!=m(J[8]AR*_@,j0Y.cLl5'uQ'g$gA5*:P,mY\o5[k!@9$eZDO-!5u<5-#mhgZ16BXQ$r%$664STt8-sAELIN$\7i2Yn"KTreKHgL6%gN)T3(uXQ4ZSlmUAfM39_sU%k?$=;7MoR3N,Q\NIE:QriIpn'Q;adOgeTAr8Arlkr#S,%Z[*.siJAp=ZroBfCZJq4I><(`OL5h1OS'5?BpTI;PhcqU+l!kIbn1!X0pi5q,!/5$H+Up>VMO\cF2s@TQ`m;!^arm3qV33j&&Y5;\P39q!MJiTc8gP+Atod=2Qg6`7@D@%(.re0m/.&^eH,3=)G;JTp)al%6^e(T'Eu#i$)F4EEp1F`@HC#\q/YGkS7ouuom2FBm\M5u*BG"k#2]Lr,`@7tNsfDH8#1I9G5\>4J'-Zl7=Pfg'q@XPj2SV?2W6P/%m5`Terkhc[Ig_pNVpnf0`P$!rX,_VhGr8WS(qCm2)\a6_=MZak-*ooe1oCq#K%%EIGan=qUg3+X\-G5B\.WR]FPL0-i5i@"F!%tTh:,B(QkINB_fD)0SL:3cGJ\C@8lC&q8dHuaB$42WFb89$g'3NI,T/RJbWrnj@I?d8W&n,5KKs-KV^YQ$eInFZ_+nD<:,j8;+8*l$P1?f1lJ\,APdINSFde,GuOqu8>Js5X-Wec5)6q1"J'5L7m[5Onb*4X0Opg45R1&)i19K0E\"$f5?VTA0B,(N>_Ue/SA'%7*hgZ&)KV&Q@[%qAa3_C7*"A&J@]HcaI?uZ>sH:mY*3A^Y]n.5oj>!"i(V0SRE"B#N7uBKe;7[2A%@)Qd!6T1L[H?Lj:pS0JL^iNZU5HP%:\'.=Y[2+]Y1b_?*!:8cD=84Q@>?NkcYl#80b6jE$`brt`AahY)""JJe^/s(7&8gZ!e%."@Qo"=Nl;PJ:6AE&IG\8ese24p*s.]E@HJ725s!Y.&Tg.71#"!&0m:gN(/784#jA1ebF_n\N+&T@Nm=L$I%EhaeXq;jAA\+ubWJYL(u#1-Koqs/`TBHJ>:E>)gaAG@\U&Nb=3#ht-"E!T_Kn2PeXRpamY[&Rfstkt8$X)'W*r;SVM91Q[cA6N.h5h\XlC"Mhu&lnsp,0S=?nO46I-RaUfR1=jX`QPa=NUQLT18,9oQ=AHok7)]lpclrs9+s@miL96l3TGT51fjb5g,tiCee%r^4!VkZ='p])XW&dt0,"(REmQ3qaFus$/`T7.W32]Mjq`jrRK22jrN)BV.)ma#BF8>h+cNr5Z$@#ol!D!n:+qt%m,q,`lNAM=U$Re2Sl44_-ob*WY*BCn/4AW0bf1G#cA9YJ>jGAjh^o3s-eM3;S7$V3%_>!Cas%^D/]`#/11.3s.]W#A#CIH#(;`R6<[T2JM!@>8ur<%\`)*W\,nYg/F(A.t#,MEl4gLTG2s8A4QdTe=EY7Fu##7,SLjE;J"Q9[4+ERXN,9a<9'972gBp2F8?"_tOlBp5q7>7!_RB&f=fIY+rD?7=k,]OA2?kBlKEd^'*rM5!0J4,>/!?%O`,6Dt6#TjgtX17AVkm.P]%9KB#gpHl(L;@fikYkR.*an>,)4%#(]1"Hm/L4fYo'<*A[M'b$n_u*$p+:H=kh@<<6Nl7QqH:'s90bbj?%CV`n1B$huir5Op&V=Fj#HjcmLN.nEm"+mr8*Id6,l:`dnd5p&nB'd_1k3UlqKTc4_nao%#"e])NnOEcIp]4n1gn9pnO]Nh_+).+TD#H`YPaR'ENRJ1?hu8i]8klGU9N10KT.Aoa\8*1HP`6[e"`CAf7'"B*,^8=Fi>9`d-/LIPeLE"EsDXb0PZ\Y;k1t+.Qi,V&X11'AI-;r+JX(D*aWIFbj@TA3.K&B^](J*1jj6AG(0/!=,6P&@@8qGa;Qnt>gnV4BZ%^:bi@RSMcImU*g4Cm42S)'N%]P&me;rH0LcC0N-s,.3!'Wj`S?SN'I4Y*cYl& +#6<\%_0gSqh;d#""QRi4MNW9%Ys8;Tjs8W-!s8W-!s8W*A!!!?/+s:iT#QPE@+:JNalM^0u7E&7,zzU5BWbz!oq"M1#9$/UR'Q@h2E0$HX4Xf:2NWkAtYU?>A0Z5XLk)fl$_aFmsXWhU_,Lb16eF=;LtY_;4@7:GM-3XH_GC2j>#5d`0]WUYfGLm@uTQ\8/5QGJZ:^!al1hiXX4Z1]3!!bahTQJ6W5j?(>6<:;j),Tb;_rq(S"]4Tp^n;;I($KLb"*XME*kPRs*a8a2mA3[.1[C%gSaknoQEB!KJ-V"e78sKLqQ7f<[g/oQpRq#,Vr%IVd/!*kI"26_!32kCX@/ja$DLgq@fQK/-iaSS!!!!";/3L+=0I&?f7!+ek.8]W)APb35bL",pV+k_pMdk@?LdFY3?)DUUjT#DH7:>M`,MT5>M/qVQ)JWr&9p34.AoCg76^f"/EJ?[LOSc!G2QpN!kMlQ5PB>Qe9%Xo[YKlb;dNP`]gkf@ssK;9s,dbO;"NT3MhD^$AIlhY2:7flm,"G4"[>Y<&9$D@`gThd^jnZ_MkF;8&MfhT_KQmgJI5!mpgHlFYZOZqC'b^!'!4K5Y]WkSeBG<@%rN>Lj:QF;+aoG>u01g@k+Y`YU:#VlpC;Vn7Acp27T:*mH>2S\UodkG^QSWW;eD-_iLEpYGS9D;0"0)e=XTS%GZeH+R"qG6Vro=)?^%<8/(-0o!<.!:A;%gu=t9pWoEpgV1/+h`#2J>>)ZQbs<_*Sb@9_n8e[!qoO3!";6&f\`o3cnr@F4mWY5$95Q*D:)19M*#1*/qjW`(cF0ohH"Sbcj?;r*gO8fKJ^K*SY2=G/[tW[F]b3d#aR,7p%`R)?hV@.e\_[;n;U_NV[bIcYT6Hej%op:XeGJR,RIVId78h^iJ?PM]q?Dl)pH7hk*r!DC]u.OU?Z#Pf^%]/-]_@H?DVG!CXk<*KmsE[D2n-r&Z1j9lpNOa;T\4qGD4TF@T(]d&k69`8a5+JD-#2Z4^"r*:3\V7INr!(i71t/D!e`=D!/W),8%`Cj]6isn]cM^NFjX2S"V3l^mpg\RYT3@:>!Dht^,jl`_Y8=.c(64"dKXeQn`/[l`pC0`([UDk<"N=94JdUXD?tIB\s`!.]Sb+:)W`d$OrL)?aTBR8Mp5ksK.e7R<"V!!!.T+p``HN<'#R!hZ;9rDPPH]i3T2RSQjX;ot`-%0K>!$%8JQ,isPJ`I(_*2iqB_BAV?,)f%m'T+R?Tj/]O&cNVHHmAUBFJ)M[a@.lm9LU2t3gM1h8cL-RdLdWh<NV%3lH^70+kPbWurM"Ubm[_%@s3!@.eH,m6RM"VVRa^dO;B$l)I@,sagc'i`+J`=Pu]:dHonP`-:j;\9^#6Ua?t6:1ke6pUhb`(<<^&Oa^J6U=+,&JA%GKG$]V;$96["9hK+PT^Tk'ZEL0:t%,Bd"KV2727LS9T9TK<#$[p6ps?V1pg.SYZ4)U'N!1G,r66gKMtRd&i?DG_[I6t@aV8J*f0;^;oNPXJ,8$OmeH`.LTS$PQFW'*S[TPS$lG1GVNq92)0U5tOCB&/S(*oi7$%aW>)(HP\#`'glVCAL=Lo*WZL`g5_!\.rR$5S/DTI(jJR3Dqe8j]CgTS??rPaW^cP(K?nq*K'M784CL1BLQ5'L9T09b`^(9%>XAN=,k69/6Z&#f+U15nGda*A@dR3T,"&fGR\_J>alb5_=\9TdlM*#RDb'Qt`9#,bc-=Q4aHM#RQb>A-N@?)G-f7M1UuV!Z`n*%5B:c1C410"Xt]*`"Fb'OAmr4&P5fPN>4-=1/ftp:st:g'bF3`9%-*].7l!cK#7Wn1lWma5SOIN.tp8U!(\m["%a4>4cCp)`'I5)+\PN[,qpVh:_=Br#n2do8u!l`&OeDg70Oo&_$lM@0bh!Jb;,.hKeP8=,SJIWb"DfWf`6V'l_!>8(&YfTiV6j45Y#gB+Q6Hl+@!DQCq+B(iu[$7C3:f,)!1DEeU8PE)0;)1g5d8`an:t&E:9LCTIb(Tsh;cQ7";af![<'jKI`6cq16NES)/4hBd&d9]mZk5"AZOp2;";*CeYYtfAV(E!A;O%BI"N7QB6kGP.'b]"-;_T@\&O?Cb`!e%.'NHA(&-RYTBR-JLDjpK*FW;8kKekTV@R9-A"Q.+:;MXUhRJYZPnOX2E=9M6!19#/p[&@0Nt<00BY`.V)`_6=-:W>[+\@:C(J-kqMo-n6*$JV#'q6:=-W'SZ`U.7?e$U4SgX-NSQW&HY?H,r#uf.8rYZ0b6m5Q!t)d;Q-t>s-j*dWs,EdI]%Cr(m4d>e0kLPcTrcnGMfkMIt2d@80uNa&N5E/mY[Y2cPmY^KAApchTGs,*%kFc2X$UU,l\(FVC$6&p?t[,3r=>mbD$@qt)SQhRbC8\U2["2n>ia:T<6)6H\9_%A<;W*o6.j_H>H$U++PXZ*lD;&Gm4dQPuVA;ap3,k@Fh8'`led1@no?to3''K0\[i@#_)("eY9d).6dmEWFZUA-n&]8pH/)rP:S^McNds_PS9gslAVP%@r!r4/Nj>T.T$;d6DZL#122"e$EZh\m)[1PrHDp?=E7-lps8;>TGnJ[Wn,hQC"7;Fup4f-9;m:c=^iS-g^"nA+4TN9k]B>+;h:mbT1Dern<)TjE2tMkMN6FSFp?FUXP,Oi'blRY;Pr*FG9N_5#c7X7K3!a.10c:$qH]4`TcKcY3^\$a>W@apXq5K)]/Yq>h\7Lcos_R&ES?Gu)UG&1P,Pua+r$;-EOWWCDcB]V;!@/-eF?MjK;^@2(k8R5U0JsbsjdqQrm7.E4UBap7PipE&\MlAk`TpX!=M.]U3*;WX`KW.PI*RBs_$l.D?2Ru*?Zut73*Z!R=$uq+;^g4Fq.flXjcb_C:NBJJ%O"SWZ_2ra:ZCOX26]pEG(UZ-jAmC%I,@3?I]0+8b:IQ8"VPinq+oFEB&:W#a8J!CAeQq.E0J+]jQ'/NlIe9P_Iobr9@rP3][1+mXd\ro%lE=(,Ge,sBi7KpOJUhV)cI5K<*@R`fDI&KlISf?'g&F([mdHjS8-6f#OOLIQ1q,N0sDWW_e5Ia[AW?ajb$>n$bl?0V"Ves4qEp?WQ-M^e&4_hG+Wqg>)">&%pVrZ7,mR=\\N=i@;:.c271V*-KB911'qp"b%\S9Xla^b*F4bBTARI2CUDD&;\62U/Gs;om+GIc=b%.T%/p8B-p2Io5P[=U*^Nd6`98;Eq[qY@p/b11o$L;j;j.7i=dq_i"[pB?)5Rg=*4GbpIbc?>J\An0g<*'jucP.`T<;?SHRI]9d]n8rS@!9]B8rUiHI+*2h-SJh`:Ja1L+RKLc"'5ZtDM>WKoEX-f2runUHIr;Mj>``QkAa6>:2qhp_/ku-*6`e);E7SsqA?F6,(*>B+H[a\LOrjEoPATdEcsp0!n+&H>0_d&<+k]^(#_`NnenMEr"7^.Zm]s6=Yi_,qrDa?12SG!4-AGc[0^r$\+/u!E[tLpfM5QElOD`7CZT_0EU+gER`6n8*X\Z+D.a:)?@Q&oG+Cs[$1s(n<7s3E[D-Ej$^@ROB8LE;6%ghsB\l*geF/IsQZ5MhAEoY1l:H@7WXPt:l_[T/CLMcRG3dU?i=!N_MNY[u#D0Itrd#of4S!PC,l.Aj,:%9J%Qu3Xb7Nd,fj?a<.`M&E_a9_C)?^J;j2toZs7psO,.0iFY9I3:4h,9A54MOu&#.;*:)%E%F"69,E4NgNf7e;!/J3!Cp"YXrQ;tEkj^b;_bB_7=G\SC$Oj510U8<-)\ii&L]?6NKZ;,+iM5J$>.6=/#M.l'Y\ojV][<.jQk=$XiiTaAoBs]/LdD8>i,djHX]^GVqdnKMN*=6BE22P"PUm6;`^kmIsP(p+XP!k(k+1aoh.*^Y3DWo+ICLYXfYG8nJ,i:Ur*MWM)#d\3EkuJqdm9rjk:HNM`\5DKV-d"6PM:2$N>G`bg,ipeO'M#cgWTG)e.he[;rD0;ZG'%B;(lK68?nmVno-"Mc&(=\.@N(iu;4Y"C0Hi@f$q;0%$5eL#7Nr+I3N?g.,(qY0&EE?GDP[4^G3Mr1ZkB!Jmf^%TFR'=jhr2=ae&D6+UD*"cUpK/Tm0*4Kd%(L?r@=>,bIaWpEYjB+N+9&PPVHKkcNLKQ''Fq_-;V3_&St\$>%)@>B`%cV%/=VWo=9OFa'jd=31[5`gRLNMP.FCab0#'p*%3M,^tCge$9`6)=MPim4Yn'm@f#:YSXa(3qYmgeFBO`Q)(*Uj94uf6h,]F`U\F,](F]g^%:W>f:)BA&omm"e2opoIR,pj.7#T:jmpo&c6#6PJTjdd_]l;AcSPfHU`+GPA)RX!*5nqa2)=`uL]FaAuD^)ej4QpW_g-s$9j6DJ`mHfWJ:NCWgAiV[@b-OZf3N]I]#dn7"VU*ge8)=ubX4'.l8Dh>)5?g3CgcWak-+N4ut0\'5F\n[n;=rLCt.Bj:Q)R3r"pqFsL[jpSPM]qC@:oF;Nh:G%VfO^T$;[lQlI6CZijeOj^*hDFCHm-QAKP,0O]Vcb=@shiAjH];;VLN22Ylf)$N>"c&8Ia&/OFPe"^X8,$H-[lKq>&'qHQi?.G"isQHmEVWNj)63HS_"emH1^V!Ff0O3U'G#LIold=)nh+.+e%7;Z#D`"G`o(oG"Y&mX%_er#o?.>]Ps)&j`t]OPSco>!4W%Y4O0%e:pRE?s73D(-N;+;E`j*'i\>MG'nVYOj]$1B@/`G6:CdV'##ch6=t:Q6ZpLDiI'l75)VD*JtA7dgt#iPH+nAdOm747O+''ffiRQr?,G5/>te>m``6`hS)8\k'Ih/_<%>-]ic*+,D&U?&r=XUr+eHCT.t\%'jf]C>Oac1P([3_Q2,`f3"ON<&OQLP%l92em?nS^8kH@TaHn))0Iu5o^Qfj?^]19/>d]n04?dl&+\3[@k,YN)?4HRORrtSU`Qh"7UDNg;)WWJ2%,k@3P?hcXY.0NNl/1t9P1BIQLbaY.AXWC=[dLNAH4%qttMUTr(XG7WLPhtch"0i"D)SWp#t3:(u0(X`'aW#'(3/Wg[A28ilg9@(=o1Fbg+,)U2!rAl;UI,WG%IiO9S_b8rAM\O.^(WUD^kZF1K4OIkAO*B7Hpq.\9Tq5F;jc0fmJbf^BK+VW=*$5:16sF)PTuq9#CXfnt-6$RLNi)St`i646-sJD`eX&W/bdVC0p5]:-hRG>ja'][NK#FP#7f-%^[X^4(JKWO9_<7J2m$k!-W',Z=8INZ2ViiiJ\nL9*M!l7mT,["#r(9@[=:\[QEPh0et1MrT26]*6G#Ai7P=h':M\.beY@#SK]5Gs&>]dTe5G.VA7$\iZ[u>30uKJgbAOV*Y3oBUI7;K)h^B>6krqe>N.cX&^[_'7pVnCZ?EP,97k;9NKMq;imN[iJk8@rYgDjW?"Vo&WFt_,k^aUeSeOmtgGrR'TZYre:2Se.MNZ_IGNV!iK[&[_)13fpP.&c6SO,&$c!k<&4BFNUMre7X3-b>[TY"t$_T^Qd1"Y*L1S#)ejVH;mX@OV4+QTuG>KP97g]J&,+^lHJA%MM,E])g#1lm%`,?gi\A*t#XMW:>D=7Ql-af%)(FRXUY2FGttFNQ^CQSPehEEja97>,oAG!j[+-4O#koI?ZG`*\^(7@G99n>;82RpJ8QUrqN>VkdqfdnJjNK&k[!QgefJcohejJU9jE88;1#QDE:>JX(M[D]'6))KV`O&,5YPgV%*@^RH1,bngg]6egQhZPIqp^8+3"rN3)/B4&%VZ:L'@6rVPlt>Is^!l:J17Ng63b+]Ymj_d3q7/4?+;Y2o96jq0)@3,%JDUu-*+N+@[i>o,n;B\FIQXJSXcKbIq*ie,%T,D3TqcBD&8?Q-6AS:%[`:iFs=`mYW2tV@#[Zjo+lN]?^,i>]LPNKB!3;]+A\>I%+r0,+GN-W=IJ"[-9TQ^XDZ/j^tcF6q/`h?V0G\Eo^.Er%7(_Qtk=E2[CNS%b7VX-8S&J$V7J(-Jk]K\Yhqh0OPKb"eF1R^6SMh03S%6O3M?I*V=WCE"as&8(HT)X,X%-l0h+:1QZeL0nXe]d*2/OFNCCSO'Tfln1pua`,QJ4K7WZdsH*rf#qr#-3,%lDQ;6:m[19`DM8ceic+h`/TIKjIsJU;Oo6"Yp#@B?AK9JWGV(+*8Su1p\Lc,Bs!2[@o%l$7/Oga4QGb:We]tX1QGsP%5b$/EZ$T2G:%o+-U'IWqs`EAqo^m:X$fd0N1:B=K^3*qU8J\SP0!cb[4<-N&#@HP]2Ad/6&OL_iCb`[7(#:.C$+U&Z]WPpXE0>ReV#:9Hp24R'00t@"T,7fp?D$VN>7bNN+b2+m&KBs3%kB`J%&h>Y!uf2RHZ<.HG.l&rJsPq7rPa?O87$rL758Pcto+d2mttZE:HPH.^>QT)/D6h`_a2b?ZG6g^NAgkM&LOfem1eapThZTasqu#,p.PsQd#7&rL.Q8F?l-1=?EQbbC<&V5U'\YB#OOt=PVgKC%3,uJ2?i#:gpM.sWu8G]7DBB=W_g[+-@DsZ?JXKSt,VDM9uOFKNG4hj_Uk)qm/)?(^1^O@-2gZ)3m=ms:NK9=2NSZXBACE;cFaUM9c>,XPX*N"t1opE!>-j]EQj4ebbU7m;U_b7.AFg*HQk<$Mm!OV;C":=`mW&BBoGCD3*7TG;fTJGM%6luj3@U-/arFEJU%2;K9(4P[,R7Y_+,#^]H\>V:(i^)68+GADr9jJLi`[eK\N9Y/..D^p(cjs"^)cY+i6.JR4]%>i;j486-H-Rm=S._@RofVTTR(j0\468Z3)_Bk8cJsLcMKb8%\Sg?S9K.gMg@o]D7?a=J%OR>5i\$76F1F,f]sb2h/&>-*P9H5,S_:%r(><:N"o7hVjU_(#>]5D5!JJ5s$5r+%I;fH,h8.Wu]0tU$S.no2[_e=b]\]M^;/QNA`0kajBS3=)*Cu;FPEI1E/h[K%e#=F_":?Z7`mdik+V+%J=n5o8)a-+G?#3q,JSU7PJNodk.3LhTe^03eM^bM8Iq?'q6li0g!q^B?LiESl+XN1K'lIQ!sOdWq9Oe`TEpe_LI8DK$'_#^u#5>T6F5$uVFU)to&B'+J1MbK0KsWsmG4_5l[oe\\[i05js0MV)J%P",rddSe['+>Acn3pMZ10i6LS1o1pX1t";5b53PFfeNf$Jf\$snpbU@Fgq\uXj[>,G$o6e9^!<"GdAE)c%0oE",>RY:V2^4,kLAGVfD<(WR"S.0\OHAgl4+\)Oe3.9-$+i#Dr9fUZ(%cR?(KE]d8BAP7?URE,j8lE.l2?S.\)^MZC0W)6-m@LYppGau?8TBE8fiJh,YG7!G^R-8R-YbSNVF(Ijh-1!o]7F1%VDO%DRhrQ!\8=-L&lSUCBqj62*.I!NdYO'sMkL9\G(`-r\qRq;sV^fS%HNC"(W\gFCe,Im4N*Stu:;\jqu9G$togb>^hgI*HP5P=hl7X/T1Tqe*8\5tq7A-_*X>tUI\r`P#cNUrQD-W9__O6VrFlJlaCE1eZ[c[T:r0qp.I_]n!WPoDPn.@g]%;oFY7#Y!B`WHh6!@pQH5)3>qr@N-$*l6=A>tGRt\[J`t\QQ7,D,7a$(JC!f;pF(gN_M)-]*mWVgjH`P-uk+S?$+TKUlVlLXXr%EJLNo#\/2FE%s4VCq"nlqMCMTCco)3;^R01TJ-5jb$YL\B"%7C4,2N;af;fuU(\EKO\aM_$?0Qne_WFsCWip`!7%Lpk7RG'<:][*P6Z+TZfl@50W9d.Eb.Bct/KpkPNiKS-UeTdXTK,nKoZkFOnnB^B/]M)Jj\T<7i(5[rSd5Za%r(4a=C5X@Zq<2+Zb8jf%d5e'6(R=p\R7j:WoH?;!4P?W<:+)qcG#+@@R,__pPk1I01beu(?'r3[jMfKhpkZ]P`1dKLpR2HNQ4Q(;NS63/r9aU9t=J;A%+-14,CG_foPc8Q,Y/8#^.t$-`C6;RiKC"1G+?P^9g.3d1Kk#u",o9g3S8F,[7VJT`8=6#M5bDEW9]H72kh'`:/W<5.*Cc;k&i'P-QZH4:E]/AS8V."WQGfu"LFj\h)Lh,Q1(a>"3S]NL5480+deOHZL.-QXGM%OJ#KmFq4\;qTl$Uf@i<2>8hUXVapGq4XaaD7c@9E6$pS.m#gU)97>>&F]+<.;Y;5l>4BRR:.&R$8ha.rHt-SMVs9)p7K70X=W^Fj-*qn)Q224_X6HDO*;X*?Bg!cans-A4n2kmimZeG#+KQbrSk7R%.NU1g)>Wjs8Ji\eJt2^d+oTs&+VF*$'1@s6lmC3'Ip8V7V23N6W>jE0bXN[QbK:_,0K%-&NR9ao9AR&b[)OnOK)UPCLJ:i43mjsL1YQPe$,kMjOJfEh?hfHH>&0?8(dg%NGc'YWkMjR=gfs97VK)AJa!.>MSGQgZ;p]I4G4]d+T&/b&LrmB,(HI\LQi1:+*Vsf6H,oZI8TU$hjWg1kZ6l>$3h()lY'SUGhp/)D5_l_":J+8,L&<+YQ)-PY4*c9uZ;:371=8MZT\JlKSZE:XE,n)`VoK$D^ol(Qa2;6_StCbg?On-:a6jLt=1K=E5JST8%th3+S)O8+mqd1g+8,-slt%mPRN&*b3k/%J2u5D0m$I&4)4gl#FMA-Rm+Qn:`/LEO8X02fi6b.Ul$os\9j/RHTbAJFoMHu59#3n6HWkg,<9O(3)6`A0oSbSN1D2rO92JUcCe6*M"@Q*Z9iOYL'+mK,5nHRb&A;Lo+)eKu_?$:'"rbXkmYMjF17cIM*+U4cWETObfNso?k5rYOaF<6_a@bsDX,i$*4E+b3)Gqnue'&lc?P)5[)XTkGZ1]c!#VFY_oBok2C-ECa(Hm39tCW"qQr;+D[d(@qd5GoT(Q=NY5!^1e>1-lc!6u6hn8sk7_fD-Moq`>;FX7K=&6!.GrIme0[_LRdCHp$llo@PkcG7t7GLT7+tSc503pX>>[oT;*g)Sj#D&YHNY%boC!K2F<$=*ac@HT7D^i]i/;SP5E"$BtW>dS*3!'*E6NEfd=2@Mo/oQkb`5$*f?IX3r^'#YlPc4CVL9_EL2Y;'LjmdP>F*d7L=;-SHs?r?B4&h=VL!fZc,_WE[;7%.:r02MV#'s>G*]Y,`iC]_7>::%2g8,?55o\^cC*gm=l6?]An*F?78^a+[(O:Jpm+gdFWlGk#2Nas/!@_[6D!"(n.`2`Uq?J"1)F$d2)8Q-ok(sF1?+cKE*;Q(23Wa1Z??jl6B#a0gbk'>u%`7jZOG!S$`jK5Lh$i)Skk1*gqS.4%"@T>ik1>*=Q\e$F!`K-+b0E)pAo8FUVcA^`"raY\O[)rj2&$N<]0F<5J,N8TQTrTaKiQJSt6g=^,+M;,`GEC&U*BZ]V%<-`\?1J+%3:Jf^N[G^Ct]JauD)E1]biG$mdIDeCWd'WS5Q?&/M3sk-tT/cJDi+k/e4(`Qk4NWA1,dgN\7JUVCPjhXmMe*i!&De:C#qgd+pXP;b0O5,L+!TC\dn9Lg)FOrak3q6doFHnuVqC:5`!AaXF%%KDJ6*ul;jS2\md/?!STCn*N=#CL\QOiOC7I'%Z]X@+_*sc.W(uEGIQ]>ICSj2e":<;L`EPg%(,NloR7Z]H3GW?j#3RRRP%QI^N#>,YXR+,AHR1]LrIJYZL2]D/aC29>S0qGn>&1:32-s`gQecjF,)fGpYpVGgWTQ&tcDji:Mo8P[-$*7FSg`#;aLntt?)j?N9@>.p3aUHI^BJq9Qs&n.!:fr^Z;Pr7W>*-H@d7RJY,/G:DeRdho3VZTn'm`LTU#IUA9FA0%/`niq)9LCZjoX>0DdM6dta`eYo-#^G?$65IZ*Jrn6?3Ap.RTDZeI=E?91&Qp$[A65g&/I.eXPifFL2.GmomV*!^tBD>WJdVf!e:)'Li6C`T8#H[`P(AC/gd"c#BXR0*(We_cr)ShVR%uEh!5O0Hj=-*[kS_"(.\/mGBI6c12kd0Ql:%8L\i_tYK57ma6iM(fCDG1N+6YNbOm%]-!`aFC3nO.RrK\(.'r6Z9[gNB:YDj7DDpcYm5%$9\kA3+h'k@X[CoB:8(Gp?;i'K32bc!%Ktf``gd3bG]S9stE/YtENOYHQ))fsf@fAb5PnA[tEG^=B$_l&^_`-paf([W7DCQ4lV2Os%7k!Y\m2:dH22r-)ZH",H'sC7f7b5G=hU"NXR2!]Bgq?.]ADpkB@M,tgFnG^rt*]\@[G_I.b/G8K-*.W&,>..HJg+S4r@E_GD=VkcK%M;6VmAd0m*8.c'"h\WkScM5#O-ES85mSUp>KLb+;6QmhNerAH#T#.\Ig[DA[kCFmN$c\7[)(+3;M1i#E+e.AY6fF=YM)#Q13;d>)_lg`Z$o.RS%ZHd>-CFnHWM@C\\4fo&\T.]Qo,`Xt`%C=7Q56l$gVrQ"*E,@H`>Mo:p_Hn(QIX-4,/d(3;mp4n'ldmDNUbA(?q+oj71?9pTPH@Fl$R:*Oa_>]i'0s%H@7&W%kh1(dL`4JbJWb[e7k\ja=ad21F&&H3K'$2nd`i;G3cf4Y8CfG;C#^*bIQ'YR;/`Y$bA@WX.Q4E8eeN9tDb3bE^:@g!,6eUUS7fL@8f+-)mXm[b8AGj2DM8n@-mDlAoH-cdhc_UJV:ig9M@2%qsO]YSAX:m[qeQ%`#L/"t-!i4ksZQFBI&](2W?5FjsM?r(h@`E1<7X<--\[`QbPI(G!3"?5WZd#Rob_FFc7h1ZE2)]MTgdu4mB15l!qiU4c[4(%qB9$9)i_;aWb^q2pZKXQC[[kcA0bngD1.F$k&RN4PATb8tKV6R^C/^c?T0ZXlX6=]"oKQ)RirrP[EgAQfkgV+G"f3'%B/#or9t8/NYE;/jaZ$Np?DF6SCb+T].S,/9ouM,T\"'afDhYB-&&aofplep8TOa]u`r)a8$]>og`rm#bM,Tp/=#+Bu.MXZ([4a.6Qo6s;8Ws1DYH/A\mW,@scs7<$RRss]S8skg@e[=^[S#uYN?0:EC1fi(.(A8a%:W'X6Lt6[cKU^Ur^^J^VRstld?c5J#?;,.cY9fs&f]CULa[lfcl.fgjBO-sD2Ui^6%WXm[#>F8>/7'XOjCW.F9:^c3Z`GqTpPc[7KT&8mqQ:)iq:XlY/hh.[Y"sa,bEXNUMhpIS^SqslQZ307-Yd!Ydah$t9PVderp%SHZ=^ei'-tK'K,ltj^7=Hn9XF*:TgiOhHFpi788*D?AWZAA_^;@@D%^=.7`bt"9hrAGWfE^mW7>"^%[]8_H%!?t'd-)=Y`jF(E:kU&lO^URaq89em@QANFUlnDQDqpLpi=TV)9R(W@T9nd.#q0uF)G[A(P`0NM3H@r%a-p'V)p,M4ph9&e)cD-elb=l]"6!jHONpkl6T?[eEegg#eH':/<9)>PR%)Y$=lQc>,^deJO`Hr[^'b*U3op]ouQ#'OV[S;nkVK94YZWM$u!2P8X*SEt8Xd@UpP<`:Z7jBIOjm^jpF.fboW^uEG(c;N7l]&7CC*,IqKmB,geP.8J+c>kTZ>6AK&;m1]fXaG=hU0:3JkWuPG7)d5^TG%HC>`%hZf.\)@`]krAGVBom(/DHaI71=L/Wq,Ve9OXj+)mCJ?,gG$u0/QhK]]IZ+]q2sq*,stAh2_BCI+]]lH>qVdbA^pr&Mqkiid+^U9;pY,>V58Jme*p)JAX<#$1"$QV(d34*FU7ma!k[p=kJt@+.Z%Nuo96[CoUg*[b:I;]"cJ??C?MVU[E5luV#oOSrJ=<9'P4IWAoAHRbn^f4$E[ikZWkgH29a\&'@`==#B0a;egIM8(4be'>\7g\lI$5Ic/iS,UVGLgePmCEd4r\X6G>;^ZKGs%SlRuVr4Mn_>ZlEaW1pWW;AY)l9"Zt9.Hh83bSdYGc(4W@;dhY]d^P>ug+12IP4Q'[j"^)cQc30leUrp#?0G,EaO9\&NC76OS"jeVkL2r<;bD="u*].`4hS+5Ntc_m(UD5d82JPH)amkr^rNTm*UB+>X^QYg^XiXbU8lR:`1SFN26`0RO5Via4d].rnXSLW_];!sMR3gUQWCj9$Iq53+S(Qf/ic5F\(4^&a0B-6kQNYIT8ENK7#B>!>Sgf)Chl'g^?3qqV&dVFsTY"5+k712GaG/1.[SVMmiLcYrA.F=1ejU]jbOU.@VC5uJ+Ec*?lY?3;!E=opG5s4bL.eQuh2T]!eoI5cH\pCu7_oG>j6Cl"7C).8Y5&_Ep5NnALc"LUAJXSd&e%/;61/WE=j#T(cC5]r#-)Vr?AR&h-Vs.C.&Q:Q:.Z\jug!`XM-:oJGTqKi6T8`$bc@5(=9oYS02\*@OU:YG`4ref=Vi^+/>koQp'7n8o&!lU@e>4Oj,oPR(Qoa%L8;*9jEh&V(ghbp97diCl,2?Q7;4_MNV:04CR[FOrGb>l-UqkKtts>1c[aC)LO&RG@Xs^?B)KKUue$#h1"deL'P?+lYN-@UQl;>7GGA<,B*;);LR\N*1'd@3jh?fUF0fk(Y6Uk`qU%!QJ#1f[OcM39WOCO-?1?Np`VrODJ>EUI*d%,,21oFdmh?Ch/96]ig_1u_mQ\nCh1[u.`V3d]Yl<[ggQ&cL@R*[>EdIXBskiVOrE&+hpXQVQ&,k6Zq)i*E]$NRT,D>J>?.Ni:#kVH=0$9d;-(BPHAn?#h%L4K9HI.5jYs=Fn9rc+o9u@%8g1"q,!4]2Arg1"W$/$8gdZ-.hF(gTotS5*+fc<<1UuLX8rADh8!/d8Uo?4oIbbts/hBps`QEt?c0`IZ0@]+0d@W)R2kt#XI8(VYo/sZnViH"c>Y-b^KW?t#KQc21k;d>lBY:sI]EG8`ohDV&qX.pd+/96iQaG#.nEp-n[SunsGN`"W_"o3%6AI!A$UiY+#0:[Af_p>Z(Cg6-6@$%83[Y#d3?1[HC>(oq@TqeNWIAbGsWBI_&ULlic4)h'F,@*+>j[REVF/)K_,W:&C1Rbn0lA4[n^h0<82aOb%d&At)G^5RTK2*Cr47ghUc`[fI9rn]>5C,#k@qhBf7TMK[3UD^fEH]"P;KjjMathq<15/U]5/toJ>r/G2M3G<+g\XctYGaM`LII$g_JFbB,t#nuV=Vk_cr1D^NOY^KBsOtN(Wk)04&EK7cR3HcpGd;48ss5e/h*[5A7@:;b$=+CB\c>'Yr^/el>+^PgpPSSI]>=2,X2I;mAS&T#;0qZgC/2]4uK$#rS#PLT+:3D,$#9C?%uf(CTRd2p@<'tPM^5H6piIsq0i>B%K^C,A6JXPiU"=B+m"p]d'>bLc!$1<-78.7bf,;`.m;C@RB0/`6LK5r5/eoP:pdKslE-CIH[L@/r1.P@7$7>XY!FdD2Ok8*Kl9f$"%,QsO)4JW'NRgG"Q>'1d/0-6XOJYJkb7('(h,fZsC3*cg16F[BO;hM1![RgeX_t,`m=AD^]Lf9_l0;lJ^S`ohGhkH-7%[[lDPAuDA#ZT8d,t_i"L5UiqIlnDa=>,g\N'VkhG-Bu!'Hn;I8&3&K&OD^(IT.V'6af1X#6jOK@%SGqJJQUCrR9oCo=Is?i2/C!SG'!S#'+eW[#]b_Zr%CK`&rdbAJL[V7qmYh?Vt!=>orEa\#k5EIG975[Z-UaP"]?p,U5)N<=VNEpjLIR+N1JhCLioCc.A1;-oFYrNCA$g#(0m#n0:-%W#lSk>erj;ih2%@kk'HSpS28JPl9o\Ur`CO\hP%^V5[\.$hQ:G'TjcFEL-LuP",<1`ptjGEjd-g%=6WYY/mJn>c@4S\b37!$fC0_XK%nK#>Z35!:B$]#mHXUpGOaftY_rcoB_#"6D=BZPP!D"14Hrq!b;;3.o%b]h%WCsX7_dC1GqX>:Od!__gc^RLJ-!?r+)gp?N,T^2N)/%ZjK:L^sB.l[nrL6da0,CR/kAKlL+V\On>fO4FS[>H>Tho2>'q^\j1mP_[_XEbP7c;rV0q1lS#m5_iFf`t2?5dr4pJ34WK/*4K=RO1o/ogJ,WOD!4848qC<6/qp*FNqYEH&m.oM\'\>iVs%aHVoDE7ELmk(Us\=860HT<#"Ol%W.fGII65.dNA8Uqb=UNh0'8In#=sDcXMdB=YZ\l6,'>3h^1!Eq9J4GgEncUPVp@Qm'?JV$gidZ_c60sE;eK8DV#YYh`mU,<,>9:@0.#AN9k8hI@2&S&,je0X6>aII*4la'X_mB.(E=:A'.G`!5Y*!*a3:!o21ngq6%;?P'Vb#%NoN!9TGt"tXjY$EN.+P&Cp^Q&X?+<)4'Zl"uT*H4.+!2+==8BW9-@mo!)%W(10?D^A`'=+YF^uDQ%MBaa7Bp"V%=n^2gK12&DeXLT9_o[SL/;]f.Da4+#'7&dBDN3A(XEn@QRL;kBfQ4/=#G)7b=.GkXs2LV/]&[)VNYolesf);=tkN-938O@TJK5\B':WsD*\Fm3@[^IUs1b>kl_^'E6&0VX]l=H8m+,3T-SgV]93)OB^:Ctm[mqc$;eEP.eiZ9G=j[2F4E):"S]14#(:*iHn\fJrT'WdfPW'/b#6I^^"AORt/5>T\fPZ0;4_:^!.:FiZrUHj.`,=,\+gP_?iXq!%SK6"?NN=u,>Il\X"]RIA7s6Ap&,r_0n6dTW72+48*IFZceHEf,D*j4Cpl\HSsLB+A`3"[m^ZGn%OFI\$8<`c.XeM'ZQ!h"8)A3?t,7kG,U9tCB\q?jUD?$WQsh"a.^JsZ,E?p%hihs9INO0m,BYD5,La44W`JKdsl;uWF%6,%50LnU.V&rJ1K1F*hFb*bH#@A^-"N8+3?Id/-T-*MSFP*5+Q85_1Dm>S+"nn\L87b_f>+C0M!B?>4e?QYcg+5fQinriFb.dETXVI,$35XDES6[IeoT-fHm#.W&N=059gojM!51C%=2*gp`FK"_*dima804qTj!']eO"s4`&^7Q"Ga>ZiVd\[1o,8sgNdGIR;U>dh`"_$*Z7GY?_HQga^q?i)u!Q>l7b[#M!phcUQ*APQ3N_58Er_o>ucJ1mYpPZBsPgFelc`L0c?0f1/-G8b`GNHQY)QRm'ea'$f`OUm:9<$>W)Zg"QIM1s>.t*t@W#5:X@UV,S[3W9b9p3.GqJG-b8TO*lT3C6<6Mt%Q0GA,hY%:V&odf+Wd3/?&sg#NP%n)uC$TK7'TMlgHEA$D(&$$D0M$UB/K[Y)hLMERCh/L1QNBIIq)N_>H((TP1Kr'@f3JK@EQtScK2a'XXWlPE\3_c6ZEpe8oQ<&n#32L(;H:?@H7qmY-2;si?F?Qt2L0@"?:))@CRW(FQA7CcD2J.-V;OF=K\^&\C85m4q[Tja#Z7DtC.QpXU6+1"a=)D3o".CX.<#\o,VBP>!1q6^tB$iGLpm9(mRN]S,W/ci*7p@dt/c)%'pRM$K_0RV\01K*6d:T;80:!R]k,a"SC#/4JMijMc32iARj2L[h^#Q;"AW`8Miu]SV%:\AcrAU.bKr`Kse@sI2D!*mKkt=W`7#:h^.:BCro.\]ir^IXW5#A;3ji!QdCQ0uP)&lXUMc#Z*4,'uNhA;a9[&8:St;O*gN=klq\qr=LCJZAm3V'GH0\)5/+fmC1cPHn3JiK^,jjiL`L)k?&B"b\79[n>ae'HF,TEQBn_5phT\0)O"mHJ$VAk1?u'(4&)Oo$TkLM,#g^-a%ARk!=>XF5c<;g_aR)/<&LrZ;9tKFiq:1mVt)YZI-8_A@\h%2'UQgkVm@0nX>5"7trS-q>?_!Y",!URjBAWnc6,10X4N2sWT%HT:.,SKKeliqN&1VV'G'0'SkeLOTa`@tn:A0C?r4lnZ_811muKl#ZKeh2"O0R>m/Z,8-$%.%.2ReWVL!%n+)&M^!#JD%1S]-7YJrB@E@g3+tKL9N%]h7IS.7P>R^_GTMp?%*>c2j?^blPifb3=t7l\U:a?pEI'eVO;`p@FsJCgde$<;!M\"AW:-GFU"blFQ)ra-ogSUUug*OY+nF,kr>06D^('d4L\L+rqhf%]/@6Bb837oLE+CS@apX@-D%5KB0"\RrWHG?[Ce(d7VpuFMr3TbMc'9F6qcF==V;f>B6?g;108:9[>:Hc;L`m&Y>kPBr.R4:a2qH."=Uf:@(X&?d&#Q3fc1!*LpcQ4c)8UoU#^=2AcSLrHl1cqVo6pn@e*p@@8/>";Wo!dr28J_DW3AC^4Xhd`4Ir5X<>1<'[,:.Boi-12aSFk!n=G(MKG.6c=O7SWDVV5_hV>/q,iUT&SP%\RPdZu$%jrDWe$YC`.?n[):6FPqJ^hDRtu\M\Ea\Qrh[aX[QR'PP;rK%#n[*11=Jf*h.a"Wh2Ga*jtijd:4=W(OK-tD8N&u3=YSS%VTc.!c>tW*'M0S+:R5Oe;1(;dQ+s/?oC'SXd2g!DRksSsTQ4Ki(5bqcB)\Z9%K5HPcW;2.UJ9LsT?)2T2Y"_1qd2b9+_;.+s0BOI]X5'*4L:]q:3U[MM8U8@8coHn'Z[,U614!u`,4Y))#Iatf""n/>S3WG?DVo>7bdpL;Ug@)KQFD2U>JD'^I%mJr5#)%>!r6RCa`bRcnH,u:6"C1t"\%r)5ED=8JBnS1tH9LHBK8L&mIQIlPGW,*-R++q=!]uhAqCp-&o!/_0\FDKUe4=G&^?:;-*R/50VR1J"-e.F<=O#Cc3uTPsXiS-rm.;kMD;s-,LB=;ERj)[IN$&bp;l[?(b&!@Xdp`6XfE-bD1Flh[`?qe*GPT\.1-Raq>^7gj+O6Sf&,,U.&&2:ZgAWEOs^o7K9'n7D2<2;P>m`>M3_N<]`L_!tAM=qGJn,-uIFq`oqd"$Q41p..O*(=Qh5k.S='n`AC]]"B'^VeesRIAM>AYPSG/`Ck?(#+]M;+WkRT52.jIdfJLU:[O7m52e&UL[hV:0&7mAR[`C-WHl'@oqhfsMqYItnZ#rK0C(L1l[3E`/"7Bh\m*Ba(A#^uH.66X=)-Z5E06(aIeP;;2XkfDd8@bRhsG?1Ds5%Z8WuSi!D864'-+d\^_]UqOd2fn`9iJtA(HKTpemKRHXXSU-(4jIHD"nodoA(r9Db@_>V0"is@`PmTd?MIO8B2\@F!*_YHo_ItW>T&a*YA3l,MEp>MUDV@_<(tjlL3]C08.o`r2Y,LRp[.L?<@mqV.`$U3(Y6\(V/rriCV%#6Hf6R5`BK[RS[PR45H:Glhc)0f+Ggj%>%$=[hP2VU^s\[0Zeiu/bZ9n:?aR#p/tL&ktpHYEp5X9+"7D-?m#@b0hY\,rMQo\j#0Sr5[lR((<[YA5l.M6]@mNRXRRG7YGb8k%ABp$&[3,!Qs=U+WLDQB;_q6I"Ai(>&Id1pfpKP4=9c'/W[5_52Orlh0smW@14R'"OWsHAG*,*_4@h^XcCXY(O6M##$]=(2S_H1ZMlkMhcLnD!(c(IVYX\+HSXSMn->%OQB"](c3&5=_@cCfEQ.FsW'e5(`*/%!$+iJ3Z._Lsp+dMZ:c9d`B!VhVY!&[--+F/FCD>G4[j&-R"JZRSmhT*:c@N5^ck9s!d8)-cA\MLQ9MF_Ru\7Ta[K-.0d5)J*',bR8`$a@rdJ2i1Q7i1a$a1UJI3`."k"ja4Ci)\eF_,@>T?f9fd;#+([1,KNsJ#m>i6P)&C&&d/8c3Ftq?MXBk8\A)GprNK!0BMLqjubLVP,o,()CbUIm,2(C]p*;+[!IZp',utdY>`]'Y[A=c./g4[n?gjM4#1]I!tL&.E_:6,FB(9gf8fDcWZSQB'X-NqhI#*(._MJNBDU`g*IkP&fD<(fY5d1Uk/k6JDT(iq]L.5:<8U%A8I%M9"[U'UOjF0_"kW\HdFe.+rQpT,,K#@;EsTXJ<;5T3]ss[:NQ[OI2#[.fZ[dg[[+(O/j0,oh;S5qO4fZNHh5itEGnY%B]8:TJj(Kpq>B+b0?NY\?fT5Wk1rG/Ms3HUXPiD-#JZ5NcSRj5#Cg.%ar6ZFIh,qqpiie#P!8J@RLhN!@]>nAR-FXI_D;F$;uNfn!Ur[k8FarrWlt1TJ1fSL[Y23E-TF85p/No7BqB&s*Ltu$lVpG5\,N4@hB"[dZf^p!>#hl6Bots.7FC@'JMgNIl_R^@45$G_C3qH+!c>bDE>3+dR-)*(b$bo5gcE\(_==i1%6*78Zp9("QsFZTm2]Uo>>Gdr;GhnGRI]"&FVfitb@"%qbhdgO"qL#o5"bZb^5B!-OVTYcp1pm8uBCYTV2Ys9GRK&SX55skt?hRY]/+[8i$fh.Lg%F_1:=4>gJTN+?aofag@sXs1XF7ke)JBt]sMVVX[Cse]Q*B1ei1%>k]H":^J-ihfKM5qp'4oRJ'4*iBRUQN&o=<4_f$$/[Vs+Ih:5#^QOhc15B4TnI/f>k`dSmZq0l>9I=-34V[f0oSmQ^/r[WDANIGg:J"Pj"2%4s]rgEd6O5DTPHK_Ik^UNoas#*BD/b8(*`cJ`=i\*BA1:<`14KY5tM-KOrdCtq?'Ddc"pFs@SbI+F:c/%W`1kS\?AqpCi3dJr@1Os"H)/G"#%YbjhfIse2^TVucCO`M]e)AltIG;:\jRm>$ja$Ys=29G*O+XnB[)&=4=;8CQ,,0g#^I6q`Hsg4oi5P%_U]Df_U3&Z:$f#ef60N84S,/BZUZUS;r?[Z5+mt`q5DH?'[7E*cmHMhS`a9OprEiX0e]FTQn+]'J*CWbU6.&TEBt:^TQZ2[Vm$YA.pG)TD:TEpIGM?K%o;C*`H#duumG%*El$`Q'c@%fNdp*tbiHNjMTrM)p0_"[]8DX)#H?/qQ)r^>mSJf^\h[DA:[=/R1U,AM;:%?lR5hrp#DEMFV`K(N`HG^Qgq@AAGH@\B;_h6.>T$]oYAu<.h?_cA*8(H\p^5na*`RUZqX7p9h@lmK$juTdDp36NX;pY;9h>7,:@ma$fkPgS(EB[`e]1JTgS9pn#E?n=)NuH=ZnA>Yb_Ju%m0oYSuSIP2ACY+Z#0>>k=lFtrj+1<-c^iVN-p")8]A"[d-HbBtL,L3\.kEo$='<'CIt*JSO9_HS(OR6;K'Bl#H>;WQ]kd*86%[9?<$4mga2UK@?jnb[_(`;3%1G\VKt[CGRNh@e;Oh^\;:LLXK3^Oqh5rlt\Qnt07Xc+S;IOjH2iFtrZ$;=*+`5n1"ue*3lUp)f5UcAT;__5bc:Ia's..@OunA:ordh&[Y&A,-#[nE^"7mEG3pp=%Xl>(CVWl=7fG)(ojrn#re;mnZcQ^P%$%4jiBQS-`c0_7P$-N@hj,r.bQ`/fMQ!LUn>9 "cL>tj[h/mP4e+]K0IgrB(IrBl/X6'*HVNRI`cW?-jqRe%>>'#%>B)569esGH;%LJK7ng)'(K:-@2\O;qWqY8`LSFtVIbGP5nl@5/3CC\col**_u)5K"jn*5%="9[r\IZVFD/Kl1=U4=+blL^)`5iW\.gN36u8a*lOjMN/8]W&3rP18%C?sL*NG&@'M>AA0&4(^SgZu?cZ`c#P%X3g)nG.hO^/8DrI:UT"jnLHdAV]G^h[8olg6s;&]IV&4H5er?mB2s!3)pV5o[@r'+5S0"rFT\'OQG^Ba)rlg$NE,P<%+(\:%eY<;87I5l7r>5:TgjM@?)@K.n>ns$kXCVEo:\XnQrbl>d9HN%^@*+^@Q@,1DrY3iT!Z`1XtlM:=l5Bf#,Qks3)=odPr*Mt'RZf:[sk.8an[1seYkNC%C'@2u-^Kj$,`?KDqR#*:sZ;[+bpJ#2+rf!AUn+L*/FQ^,&YB*ni?["-35"G,;1&EgiH[Ha'*lh:Y>$4&(*;r(H]'%PqhsC$K8c8;ZO0@624O:72h`nI=3BtK4e!op@gYMMJfBJ:@Y'8GC%YL[W+M@$KcVM:aH*d!U>k-pIL(Ib6a>f\f$=5-E"7Q.\N41DW@blSB`EkU^*^1VidLj.J`2IKj#Rm4m7)m;tRg[PnJ2Du?l`hr-3UD!6%aT?A34/QBbNSB`U8gslFL_[WJb#uSjE05#,BBg;^*!:OC125iFI;m@ps`JW15+Z."poAP17"(/!sh7>To)Z5AUfrDc4nYoW^LRd!A,#\)g@fkFW8VN*:4t:4cK)/R)P&Z/Z>mg.Z29Va.=8pXQ^CYjMU;q]Rd?-j]f4KhG,<>P^88F-!,r^@khTgLp83BUD+:g7H$q6JP>N`6j);q%`@WL\;`j!'d-s:_*OsFg-0u5pKl72P2?K,SQk(NC]&[1ICH,No>1A=B'K/nIp5f^[;_2lqEC#;blf6ogtY8+=k"Ug&$472K,oRG+.VY=)K7F%=UDD5U\!aHrt\tdhkneV/0P;[\)2c85','2\FgBq$(7B52K$#%SRq%Kooea_7V$S`Qq5Y_op1^;6aoN.mDhC[S/T.[obi.CaX`X`q6-Y9@]Nn]O=8rDj`PLFi,D>dnWaO0X0ud-\Jq`O5TQ0C/*$d?ej#^V8DPcc5r(^TGH=qaS`]Bb>mTg7of&%-Rt,9ahj[k;[A,kVEdF2kQ/RK;LRN&SstP]M"HRaNrCb2pO9RuS%!=b+lE8Po[1,-ODc.7]?,;Kd\0%)k[?!K@/0IKLa^eL9/6o;q1\JHY'^eA$;c3LQ3;I7Sle=0"hL2!;Gi9]2PcofJp/V&,P3"2Re+i#pX&,CcS7>;hhuP]GhC)YYGna&5,S1df[p"GB%,MIM"rogYPPs`T=6R8c5j71Rd3bQlD/QNYK[=FGLC/;n`j+SQe3Ja(dVN_(@V?,k9LitsELSrO,P4%V9a)DL[^_;o@jf8Ohm22[ANC-jEff8S`q#D#'3df5B`%j@,.*-pT&5tsaFHT(P3M24=h*rIiCHBSJ+EKg.$\$ROd@)5,#p.3+#SA>)"+/cNJQd:j=,X(lPhqlsZfbPEUqF*%4@#f>\]k_fu^#``XYNhBHm,AV]4)EWefZPd>V%f)oLO.naI\aK<)J4/OYjdo?Q^&ULOL,6FW6aHTdSPB?Bc+UHd"anC[D\BAi\K(p&/a/R$j(B@4'9>lGIoAGLI.9uY021&#[f]bB<;%O]5]&Ui$ur)4sF+2$cQ;6;_`B'`EA%SCuHroH^c!nPAW\X-@XE`[)3oB?u5obX5P[a'-41/#n,):Ccs+@!<'eXSk!HY:HQK4e[lj7'Zp;pHse21IelucGiB+1YVfuEG_XX5o:7V_Btj!q8Q]ja"R)r58q\a@e`s,?if(*1]@inaL5Zqb1u&KfkA1LB7Ykh\2`p\u_eGI*1)U(0l;FWV5JBgIPj7in61_K/27r^$*`U74Y(E/m)GVJkQHdHaB6Wjo[D,d6lfN6DVdnmO!6i9r7>cbABtCS!MmrdAu9Na?ZP9kZD2?;6O73E'f2iML4t46nE??#Nmm3WucmcPdNH@^i-N>.N;.,n6p5d;:X2DZ5fUNEP!u[q5lD*^bo;::Pshh6-PF\X\D9CQlSm,Y_?5OduY2,au!@;pAXPr;45kSpBCeI,7Z.Tm,;D<_uMZilq(J_i2fLB2qA[X\'YV)X"7D?'=FbNSAdGI(VqDf,PZR>Vi7)Ra!g7<4sqiL2,;M;kJt;K/^WShQhc8X9s&;*HZGIg[S:XCFN*@='W1U=aO]/.u_c6D-#;9qE?uBLFmZ*61Sek>1'91G@tQ7f[0^=#%rg^Jq2/UPpQcf,U6!9l\Hc=.?:-]Gt1VE?`pl=B3eEZRkt\/NL"0[%Q\%=g-^1N3or!?ouJG+1un#&Cnth0[5%Z%*^:fq:HlHN@jXhR8,ac&'%b?W?68509j;WUo[[sOV&O$BictCfYiH-Xn3-L39r:NU[o4IgUo+HT$DPn9.k.#+RJr+%KZ-P0\89&H$e2HI-uA-6K3AK:j"n=AnY9fi6]e>7AA7:-9(];3qmbL8\6]Y;lH1dYR:1hh3&a?sUWN7K9k+U2YP!ikruq((SajP92-0Wj;Ej`$CsA)Z#95U4Um&rgKDT5mMnh1oeiVT77tWNGO.D+/"AmDHRhp6^GHF'=:nqA>l-%fb/gM4uJU5S9Ys-.L4VM.eUO2Jo?HT(SpUoOt:MS-5$f(pnVBJu10XZJ+_$Di3Kr+N?FJAS9S\gAQe.Fj9AaHU6d:Lqdi=^s7jZWKC`,J5mh!gSMbmA;aE4H9lt8K^2K7j@;G#IgX!\eS:*cES#&`f&qIUT7bD`plK>FOUQ9'"dG`4ZLU5Pm4*#RHLFS=@I8a;b\c*-mOCZ#YcHE0rC/?OYg<>4%'tU&b]DP:iap[XYSf#I$pGIJqiC3.:b%lc[ZZ8US`]J^ukkV`:*B["TEa%"WSHNo(Rl?`te-#7i_2+*eHcP+L>BTb0XOsNYA_eIKE@k6EQLLrhTX?#t,B(S$JZXo^F/5>(,jJ;4+8Y;!FQOk_F^7;A2i^VR](V3)IU^=;2+6Hm5!k0:6`Dd)U$l"^:QDZ^a`po"JA(e!t2Tl`K>&fj!ELWCSL<]mGdkn8&W=J:9O:NL0Kh41u4QdbbL7baos&H;._]ija=t_VE:/@7[:/QhKo:+!HY"^jf.HXE:W+S5H.U+)uMQ7*[Y[\ET,)S!7g=?'M`ELJ"<2_:ldaGA(-^en`m`hq*+0JcuN*?cA>*Wdd5sVi5efT7q(mLqIRB#fBH.DWbj+cZY:?J,924.p8=.;2%G3>d8/?_H&71?EibfbsCRonC>2MLlI&XL_Sk>Z,=J^%2nTj(ASj\'B2+W(a;;'O=A2S:W7-PuUblMa4ccq<.4e]30$m2W`-:aON(NEQ;;'4e*eOnh'TYhD*uSgVYD;2GWY82>]Nghc;7)`2/`SB88!QYX$o%_.+7h`h@pqlH]r>nQM#`YKt%?D#991PF#_TCg;cFFSXoQ1tr$-%]KZi?H#=(iG'jT>4Qtqf7>uiW63&[Xc1?%^VV\\S[bWJ4R]F#"I,qD6X].%dVI$?$btFo[qK[JWPr1S,ClhM%jVRBejXm9ej$(1P-[9Kk%\n]A_QH5BD9DGi>4(O8p/qc,<3#sWoB:[kW*L.(/4MuTb%*W2Z\l*>\LLA%e#oM*MmuDQ*[cJ8*)Z39H16@SjPs-1%2Ia))\'[/:?o8q=Nh#)4W9#f$7XQ]B''8c6,Kl:^@3ahq)B#hGe2:BS]m<@'h(@g,OA/rW7jWH1p2H8o]F)i\St%NRU6=CJl+ScB7#IIWkBU+]%R3B'G&rWQSM(YBQ]dCIor;7FWe;RB0;T^QB4PUXKQG8rW7cqVc)oC6C-@'42GePQ[?c"](=]0]b:)O?;2!YgE?4jqf&RNK1YrUS@PbG\c:)F!>1h#Pm9_fXX!I5Y3,Y%)hd!MA[,IJn>:pHBQM792Dmi"$::jM:\!3$b'6V4_QQqcgR^LXu=glKdn$J?@:TA!4cU@Dh.8P@@>.X2]=-:Zj,*d#'rp*-&Mt)X'>tF9Q0f?&Wkp0-g]*P@>:>1kj'D@h3-R?U2D]HkUq\"I=@U$q"[:iK2&t#&s@aGdT#tArYJPip6Tap'M)nhJu5LV1uL.uP'\[HVO=Cm]2$Uc/9hq>"Zoh=X-oG1&1lCA$'nMTV#kfng]jd@1>T!H+8=+eqGG3HLB?;&bF-8X[!)L'Bp!>_([n_A;3YG9N\3b\&*8`h4darq()AnH&Q=dAu+.0&_`djh6R4!j^SC2j3nK*nPu@ZrbK6SG)E-5HVh(AE]i73rKDP/Y$=+XNn,229T9DQUi>1;ogJ\jfgOM1[cSb%S=`33+VPEI8.dhi\ND^]X3to?aSV`H)Bj+Nc<'uom1jLf[&Be2X4;r;GR\6[Jp%cn+dQBMF\EKo!/VgV[9V]L2]5`#Q3NtkP\<5'81eg;ooDd\=^nd;n<;5.`RgAhEABXjho\^%Q$&E30:jUR72;&,bak6m6g:`8W\%oQl64QDAt*mG\h9Par0P=Q(TaT@\9^rq)J+8m`_L:5l#hNW[hD2P>KmW?qUp-g:8#m.o*9#C9B:1N>q7J6/HE-&J'#iFHZ)i^fq%B[IJtF09^hTW.N!dBYK$V4J^9amWp_B.>^78qNY>himBfmI]i0T.LG@AERW=Js"?BA@L&85rNGj?sYt+aINo/(:&>e76RrO\9+5)[[3913n=$T/KM$Zr&^fUPAYomHYojD3S;Ku`7NBa%D1D4\_k!rGZK_A56T@pO%p);.8CpG06+Vdp9VCQ;jq$@eGA`olPATmBtepmN?Lh`P>4m\hr?dBPAU)=fZ*3JpZ.B7W>GmcL7Sht$,_IMqeInMgQT(/D)At87@%jr9pJD"r,<['h660HL0!%[WCA6)d]qt&.MdVl@jG,_81hgC@%/s5i%!_C(O"A1^=-TQ71q7[2.d7]+Ra?)mXCF:tB>B7"hH6[2RJ6=8e.^^S*m6k@e";@qY6&"%n@>(3pdg@?(jT[lpSGK!/J7Q/Eu2ls[kUZC_]0GeefigbY!o27HZG_^-EEJh;/t^\_A:8Zf>]>=CM[c[;0//%22?MFW;a>I_k.$&8#ql'28Nk4g)\A[ka#q&s,.=bhB;.N9Q?,)WJ)ZEqtKQSagVS_Il],%\I@[ah8ZWZ=nL2A>UA3t=5AhL*`Va[hOh^7..,OUPFK&7be+2#N?cVr*WOI3V_)hErLXrcV*1-/N`.UnP&C8`WD:i=7nu9Z@bc>.?Q@a9>g0UD0?B[(XDl`[LZca8[dei7e].Rc*_!9s=ba4)8j'KASpf)N=[b*Ao=_3S^0%hlL(7O#`NI^?k^OXW7A#asSL6iRaBtX-*^0ONRr6RB_k"Pu_Zk;2Tc[_K6PH7#RHs;#<7e2COa>qIiP0tKfAl#ll,dRpX\*FLNo=k#Np]HV92j\JHrnre=DCj1,0Q9?S^(-7jV!Q!]VdnZUh@M,F6VH]ME,s[-t&<7u&56>mb]L.i!+>b4jNl7(.`I>SYNnfY&(`^FiX%4:=BP+!`Hsa&KnlLLsAn>h_3'`.@a7<@(V/t["=3s7ick%h\R*.jCn4"`Z/F;9Z^a4;VgLgpj+r:G0#tsbm*qXUK.s#*[]KF-Ts8Cd+>5aYAY]_\MP)pD"@:%d7]]D,i8asQ?AZf6TRBOM6tS`HbrXi7Dk=)-2sFsTt*A,)"?//c1/gQX'J;6f/)+X\"]M-5+b%SRMq0,+3H"s4Fp/g@eR[bZg%"q?UUD/D!"(Nq,J:9$_9$$]8!b7,D6<]k3Y"E:rSHTh-u$nBqJi=k-%R):'Nh@S9PqAd)e;tT5,aeH;^JGQsndIKG!Ijn;^Hh2`b8V;8hn/ZlFNDo[Oqj#nZ$9-+qWpiO/mh;a'Ai7LD?f"1+JA2:TYM,mP0,@&>1R%6gsq.u^))'^O[,j[Q@GDn`m>?h-Ak7<#d3phb=;\Y9a_PHB\I=$u?9b/:-r]E>jG@dl;Rm)-[Q"T:noX+i9Z%93gR/UO07u"^k=4r^lcMZ'fPGcXlSNdTOA+5KL"ZI+*1m;oqS7CcnQCm,nC^K43KT3D;>+9fN1HO?PR4B2I%.(g4d>F^__q)q]#_o>$C`/&B7*'r-Zlki6F&H&!$`@GA5aGFij.Sk7UddcdrNroGD2es@X[MAe=)^(7G9%>MYE)2*L[L7gbV:Tc"VX91rdL^NTSJ!B:-h)DASLQB:5D)C6Q]*Kn0[rRMRu)>=(_/=PC5+69qqnT%4VV4L+fjD++L<*PiX9-#o+2*m8Y/o[HMjb&(jF"'D^^H,sdD3(cs_sI#PRPnXV>dj\S/^F-G,!RXIgG>&+b<5.$OTn7*i`V]!6k\!1RRY7.-$GD?:(n[m,iFYV908ZVd0aH?J=]Bbj*:bPA[A=#"n"%"bIHUX\75b$e!P]ZYu]LaX(SM(K@W1(;k[&pJJ*>O2$5aR,'FI_Z.ub]+>%/)!KOOeN1&F+L_i_%s.M]p\FR=-;K7[S#<[MO:Hg70HoM"^U1Kqh4BD2>k1Z#PQn:\Z"+@*4tB>pUgP8K`#B1G1a[bYONEodK>r,MQ]dI/>*INfMfOs3?efX/C#nhs`Y0eoHT@No\3;Vd^e4Bqrr0taOS!$8E[=YM4HRUHAp8staQe='D0CZcj8RBTelMHLdMU@K9fb&"O6B_\-W%Y$0QBODod2!Y@]X)sjQ;n1AhRmuZ,EIY>=EUPm[4U3a-Nto#oaBBT4YAZ8:DNLTdr9/:1f`J9X:bU9bAAA.*f0RnZ?P10opArYFIJI0:I+`]Ok>ZrJiYl5Fu?9\\!RX.IIIO`ok8lNpi<<9G'JD.W2<+K.tZ:;RV[E,[=EHS_o>#RSu4p1Ld/=gkU4eCtP]/*KgQCiF@f>gWVb6!O>ZG46@;Q;_,cdZfApEKqhn3UdkYjJ@'`d?T'JBF%ZK%8U8l=fN*)aI2:.lbIY<%5i>ef\I3Y#0RH<\m8]hM)N]l1.[te-W$r7C+.Qoj+iC@0%o]t`hb#5@2$m]"jS%E]IAlSFD$+9n]_`rdC9KQc>5it?Z4&sMu_+o]E7a6$2R!AOU`]%Yr=5@'UDsR,VO>aL'NQZ)_A.g1U,H4M),]g:iHdYo5_.Cp?+gmm5c`T(R^&ae37EB>A`S"Y?Y`XV6obcUo-uH2.,1M"rnlhX5=q`b=&"@c_#OcWJ#0+69>&bC',b.fR-;Rn]@WY@+p&X4:OWg*.:Hona)A)OK9:c&B;Vp"ak:D'SE=(#RfQljgK?._Mn,8Yc7\XAIbtg+Z$cL8DL4..:A80%\+npAs?DY<+;Ud@ECS82Ua6HbH3+lCtjpi^M6&0fKZaRasW&n`WU/fokP*_6UnGJI1;8h-*lBa[le'<.jhLiB["*hQ@GVZ40OH%3)Q!bjd!Y3s?ob/sc(>pW-meV1r(_JsTg1j2+gO!]9GmR"nD*;sLbq"0P/M4EgDin$VT84ZNA8q5h4iS:Fc,&k=SaM#I7LY&>SV2N6]Tc4N@(u^HPd$5J2r"]r7jZ'OU/k\bHpd3al"Y$5AL^YA;Vp7pRs"3:K;uCdM<5md"hHrW70ha$qS-W5j[;lZ#CU&,fe(d-d[UX3'(qSU28$:[EM4Fi&FX2\o`9I#_F<%_3YY]&,N!c6IoP?q$N"i^@$s9a7$nRi^)/EX),u[PAU,q1-Bti[_1+"6e*@H@c(%BDjFK1D]Q=GOCf[)9DQ((erJuueL-&gm8e3ghpm0M\8S4-e,kmoW.ca11\,,]bn%I5@LMR3>ZKIQ5FWSTT&%^!V=W'm!\]phZrVMJMNdf:n+j2a0CgFnHJAG%nmH=/Xs+B)'Dt;J(8[^SE\e-??]g^K>[Jg6k4@jG27Oc\e]s86Ir4b#The9f]_IJPUcao7ANP-o@9A.q'asf(Dh\*'Leh/MA36!MnhkD*#j@u?'M[q'ccm=KMaqg-/T,(,ZJ0AK5`BEOj67sAk_n-`OoU6j2$O7h0H5IV%*Uc8`["t,\3?S=-#7gl2jEq&\1-a2CXY:[CYXo^KDRf0jq#5OOqTbd:UW.I2",#,&$\OBl0FC>JUSkO<\V@Gk#l5*O1WbiSBZ];2or@)Q7%R]b5>$in<65>FV,_%Z.$#jf),i$f.qkPX5q:lp$C_5E[.8Z#mGt*)Jo_ht5Uo^mm1"jDpU=XEst6q%;9;(umH"rV\]O+-XlAjFGQU$?MD%jqJZ;<5g@['J@5Y%O6QM:WGq5b9)H1VNU4kom#8a,,J8:pTiVrfme%mcNmh7d*E!2Rb;(&ed<-MDBJ8qloM@G[7P"24N-$=WTC@BULt%M%efC)`,:%%m5g]"om/O`%p0CVd!>ah7"l'Z0;Kab&J/&9Q]d:N_2ha##2.nh4Y_mtRLNrS:RQfQ%9sa#p.NPBB];/N(LMs@hY(\DTZCp!Z:20a?7%=(Z]]>o(a0,1m=@VpLgY9(PYPF,(i`>&qOp(k1VaFTf]q'tibXf"JR^iYV+UtXlj$b)[WI7e@8L`"B`XWp$&X#t$l!)3q57\r&n)#h9mgt!oZ;Yc/sOdaL[g9>^'m/3(WGPF'U2aa)t_.3b]@[R:!\G.ABc92Su63EE]H!2ap9dY'Z//X:]X!aJ\)lQ(bIi^)n>.=[%c@iJ]b@X%3Q0m]WlY"Q"O]>19eYISB@=3<'ub__.Zh*'GQ/?gL%VmIh"OM'>W35e(LrE\DVBU_MI1gBLqfKM"!47,ouj0T*c@n#B$RAThfKW[\V5IBs:mrmPsPNTqE[k+sl-UCZk1(*pV?]kMt]HTaTA=46U,jd*S/5d>ftn*KR6nM'u^ilnl//@PUSN8DjhE@]K,6X;`\J7'ol(cj;.qioG$DfI!MKV?u`M1E#=Wl3qeO(.BB8p";9hK[E^.=@WdJE1&>35([6>Dl%t%j36YC0BgDFSG\10l?aT54nON.D`$9qfKe\Sft%M09\A>"f'88jb,ZEL"IOfG%5a;C*^Fgh8mdJaFEE*DM0q-4$O/FBT]6c1:G]U$Z0-G[nkQ=KZGAt3_RPLF)qPj%AF]=fX-^f+/&j!E?ZS<_HYB"WX#Q*.rTiB-[^_E".@Lf->"R_fFf%OTu!N\q4;Sh0Oai%MP+dmkVg^Di0hnlL,EQSJ_D:9A!p4.E_jO]d"YpenM%ljblDfpT-S$"O!-1r8rRKVA.dO>pcA)eiU9`ndSTOV!$BaGJT8i6tONd=GY?:.p+8XMh@HSMLJnXN"%nA#d,o\iVafFufkZbu2_f4U!-[.EL)ERAN2E_#-r]`#>3ehR.>m_@j4\Vfb%)h`6NY"'PTs3aeJ69.2cYs%/Z*58ce04NS'S8`!Ij]4:F]@>!:r&/F_`[ERV0a:pR^8_]3M\YU"/3nW8\"Tg3Xulb#5K5P%%1d`/)oY%A89pI4>KG70/#BS*cS)E4JY$F7*o@s!9Odp$B0R.cc=ng,ic[&%h7]RGB&dtG,h>f+I2#(AA4g)TMhP%)EBPXSECELYMSWpr$ermI1/'aNQZUK8DCsNPfL%7@85IM&;PT@6mF\O[Tm^)BUOHY/9@[Z`+]U.c3fa$*Q1Q8t(TU6Uuq005Q,kW9dV^f7B;f.pbU1f('B%\l8e[Om7ir6%u?Dc=bX0[7H`5lu=A?0371lVu\C=F(i=aYU:[t3eWPV]a,=T[X:Q6UZqh#\54Pc01q+YQ@5q7ggNZi+Oeqq(iIk.:N`Y"9KuQS0bY=&Z6V[O(h4rnLKc3+(?Pe+U*tJ*7JU&#p=N5U-&Q?FX#6s"4F]VqeRBP)N]9FLG$"%cQn/1b'mF>;@[da!FYFm0S2-0Fb"+:i#Up^,IUk/ZWrcqt\=rj[,%GJX-f&ep[_qfQcLr'&o;!t6fNg`g+=,TkKI$M1*I6H1?=`[gG0O]A2Lt"Ts!50JVtRq>CJKLRV\O.2_k:1IFFSU[#,ita?aP-H]oATj/#qJ,cW1_%RI>:ckno>4ZH$R?MZO%*(8AC4KD1.VM&bI!X_3M/22bMKWO"SsC/49g1`sQj76>g;>h=Sr;aWCCZW&FQ4fSFihr+D`o`%Fe/1g?2ch/-CkY1W80UkqPMq/K\OlrGiG$gL)a>(q]2B\!'RR'+-bqkm'uRtlVX"oCP*%_0<9h00]EVDK1Be]XFpH+i%9k8P=7F7=YbK]Iot+Bgi)]d'3j,GF^/]SEV*=rN05^/`:4i[APT/MaRMFujJ/de?HXk+OTg#/fIS&db8/!]<3C<'MJdKdYkr`6mu=PcHiPm%jURresdBgI`LlK@-ao27khrPNfH-ike(J^VX^XQmqQIO4gCP]e*sLKiim!(j65I>X1-Tlb#$ts0/dG8LJjHP=b7]+g_drQ1Y7sCN+(Y!].8fS$eZ$18\d_*gGR$OB0\(QjQ3uHN*M+g+"/<-8?F'uAFi!bM'-OInWnJ_k`4k;2uuc[N=0"7]2a_6lR\Vac]%8ZB[LkJ;FAp1*CR!Dqf?SL.&i1aJ4>XKK!tZ^0%/5G'bco;-97j7T'PlAlBdgp):i'sVi.b)?kq2*2:\MQ8\+3j/0Y;Wal\bU2cLK!T\LTM^nYkc8GQU2RO)qG;jl"KhtiqLNm9Y^2ZXPA"DZSd5n_:9Hb4^8uNkYkWG&>S*)Wfhp^j%LNS3U6/Yk<;nV965T:/lhi4-AB.ZpR&WXM&8<*\FnT#fG&?\q@@Qfh9?LN;lP9WU<@=UT1"s8sbO3\ac-=LVa_((?'MW82MGe?$IAi`monPD*!WTAV%CHL2@Yp5\W8@r:u_.E:ol^7%Cfa-/_d'=!NupM9PVr=2,KffITR6'MSsY[j#!G's/]arq0pWlB0[Nq<*.Lf!E&6]X]Jm[7Nh5];jWKS\@9n@(>NT;BsLF9<'LsjQ].sb#M(@G>t-enWdge@8*<2_0gOb].iSaH+_eH\"eq)odXqF^?&hZHiu#r$J,5$CQ0`Xqg:=^aH67-R5jZ+bS"&%h*P!:1&3D36&9tIBE&!L>YL>EVigm58>r=.SFYVA^Ki0SSA;F3OA%]`A)V?Ma\8gspC:=^PYJf4Xs/NN73*[^bY@lD_8b%oU5M-@b=S$!$kUt?O(snMgnlVpI(nS7l\!!=@Z2.Z;P?'db_[9Q=EcR5g8^L0qjaeS$_=qc'PC0_1Br)F='/GoWhV[0;L73*)NqV3J$M_U\\+cgLP[S@bB_CT9d^@TlO/I[7_9?Dt[`k@r@OXNBk7iF9A-<0_#)]W=dS)3KMP3i)OVa_Da8rk%-Lo[aW)@$/EFT\X1C_;rDi91#1\fIL=@TGRW]c6Le9seO;"Hq#4_s`5qiu\AXMCmdN\%LeH^d)S5b='sg0Q>.?b-o_F*&2E'#ZDaAA!Ut+Vd6<:"g>/;"eYVuerr$eP5T!6\%ci)9&H3LQHcG.UXl2m/9M=q]DZ#7GZ/MW(M77s'mP;`9L27tDjrOV*6T0i@4,><\_(-6&bi0YPSfA)4(pmTOCknksYP#I@NQkH7X.5Uckcqn#V&5dFr#*^*-B!oN"1b)hMI\%O4!(kpK:2&=GPHK(ba8T)Rs-=/il)#CUaULr^O*:FnZ,bRPbC]M3j7-R?:AhfSr6-bR3Hiu%+A&e#$lFsmkXEq6l"XOf*!+KAHEZ!603Z"ldF'0hkd#V\oQ4t\PgfK*fNI%XE_d-*@dq6OQafdAWZok8qs)fRsFDOP&kC%3uKD66232h00Jsq'68QS#*.XHKmr)Hl\OPDPk]*QnHYpM.KJ!d_u`=MeZVbN?D3?2#*j*Q/+XOKqj/oKVtX.0qQbIROMfp1^+J/f.qIbt=aNB3]2\.G"oX0iAe=pX+!GW#P,NuRf/IC)S39J6*R,l&&m?76>pB1Yf<2NB6o"6oo50UZFWrs.LDibl2HSTY9N&9DVsj(('4)F4D<[C^N^]Vm)%$a!gcA`>WVgM(o6(.%9Vof6\8bh)5a[0UO/3&FT]87L(cnafD1::j1/14%15bE41*@VZ_dW=pYqh^ILD_5oJQ&Ln1C!MV%aK1qIHd^>fc(XBm-0H,r*IW3XuU+!LS#B:PWka@p;$9XN;Z;$Bd(JtuNb*AQ]&(Yu'oXR`P5l=s)TP$F;EE_2m!YbRaeaaI%\=4Po6pN%aa1;2\11P/=30,MBqaj-rED]AGs4QV.k5nNG*aA&as2fbrHuimb6B/FB@<)U!6mImE*0RQ";int76Yr_eg-,g;WI->7A+f"EaMN06W^P+U,G4elFEF"iXtGMg`R/A+DY7,YVB<_*Q6Y-NZNqTn2;/MJXO)lspN[&=ESU,>uW3Uq]J*rG^E.&rI=QK.S!MN>jiK*ITmBkYN.Jb8(Fo@+h+ia+Em!hD_=lNN^c.\IC`7[n7loak)s:bt7LcAXJ+U9pF56&O8N5H*UkOf3T34?f8#'CfE3-o7p`%C"bkmUK?GrX/9nrQcnrZs6rCigiDSa4mF%6?Se0UP#B6,f!AmZ.bepc@8I\Jip'dB(E]c3)fckF832+(,J[E>t<1plDYrSI$!MGO*ct8(PHR1OHl@aJ:Y;km!o9:&]4qO7G-kj%s^5Znii&q4AjO/fc?BUj/(ML64W9#3b88Zh?RRrVN?/D778O.+uD#e<['#-dVBiOa*rM35Ak9(h)AQ*PY*gqgM+S:o[YE"`HBa9_e)e-0)aHoe[Ca5lI468DcHQX,hi?`i#UBc&*Fc;U/NFU*9#tLe8aKI%\?0,ANhK_Eln8F`*.*3o0i>"hXBGX(F3!%"S#.s@IAWq3]-tM-JK]I>X3tDD[4DCRPDC#ulLB&#dN"Z5d!%;#B$Z^fom)6L`GBBHY#]fW*k<4Yk_@M=dHtD5^jsDJhqq3(DBCg4#D?A]p=AS[?YNL,c[\IkDi-s,IrRA,;V/t"Z"FWRI0l8$aZd%=3A6h70hP4bScA`kbosXTWQt*eE0]iP:Kul1X:.'_%IkjeUC7%R7;7YJQHGZ@HB9unc_2ucc-"0\KoDO-Ll0a#8bM=\LrH\&F9eDF4lS\A6Hi.*8o&Z?R"Yr@0ZD>oo]*R.8`9j+4OmtK>pMm6AZOO[*BVjUY14nU)6o3rNcAlMYZ)o_6CB44l"A'+(aRbVHE:#knmIbrbbX_9d&:\YL3_f1tgTf@*D6nWI'ZnlJL_G#(\5"4bRlmRDib:M69Y\nYVT!CTaoVeYT_TIJg7u-Bg(FsOj!mG.g8OB'WG6RD\6+?+rEikgmQQ*pcK,\jOj*(3_B_^oP-.e2;Up9Ed9AkTP=QbJn*NEjuU_9\b'59PG'l9?-`*)#Pe@:3I#6_HsI8c6ET;$[%I9o+$>\op6b#(pfGrL*bS_$E7`Sr3mG5D0R*D.?%e^r(Y7kLcE)A99V`HOrsc)Ooo7^`_W4P+M8X:\H9OMI)Zgkh^<.7"nX8H:B#434P4'qmL$Z/a.E"`il$#BKI4Vk*::_O=_Nn$FR#&?$V=H)RfGTp=NZ^KO'f'5W%0f(Q"h"1qtot\n`2M\D;+F[9HZ><'G6_p)48OMKO*"8=!Nb(hLVDKD[6Kk]3m19(MM3EIFJKcWTC]Xp51kbug?]4,&$>B%b!43el"n`rZ)9nIkBuY?2:>eaF2*251PpF(9AGt/7hTn/c0bTT,mo*O>b(Hk2n4c?Ij[^^`_k"9H"t2c+cF6pJP8.B:%%.[d';?:\K,b4JC-3OJnnE8JYq[Y"WTO=+WcBOQnk01Oq1WHKtPp=?23bk\R.BCD9ZS@$I:3bcBcmc"NDG-q4r!`>o@*@GKDBLhO5g04(GUjj;^BQW#n)/]8ot$2PVJ)YC74e*8KNQd,3-bSgn#R(Ia`)*l)q?e[FL&J3>$"=-C",_SN0!%Sb-'I1OG$VR"l)q-Ogp5rlA?smB3hS-BliQck?DqsN-%(VC7-ocTrsaj2U2!Y%`j)"epJEKA!MU^-p/1?I9XE/jnJ0[Ic^[tA+HVsXH?%.20^n]];$nsF-l"M/1s:[#se0KGDGaj\d.n4&pd&tG:3\Sj&O(N[=f-OLN$W9_@Qbagc.#(RH,FuQbh`([e?C21C^^%HiA"@>/qlQmV$27_$@f0"df>WJOf#k:1h:diqEV09aq;4VJ`X3NH-oV%QaK'Ls`3E/crC:3_q$r&IC`*1,$b!^gQAT8%7@POR8/%)Gp;?ii;?%@9f1Ts_Ch:uX9f+QaMo%>=nXq4u/!e;YR,dK.[%4pMD0Ie!1)0Ji5R,"Q4mbh(]m#P[lrW:KlT(\'Si8&t?R.Op%SB-38ThtjDI6e=K6$-UB!%iH&^fQDZ7gh^kcLT@[C606g&FVeA&h6MTl*M&(g\Xs:-lMQ$VTflqY]^R%"E0)t+nPdulCie"fliQHs)D=pBFJDC-#G`.)]dWBX^1[b=mDGm5$G#B#kLEkta2H5]#]pJ-RFXMBiXA,g2YU8-e\mbicoAMD%VUaH&YH>r\b:I+VSk__hXd\$Cbc8<1#^NV!nRE:8bANqU$!X;pq\'0&sJ0,8k\?F38LNiWV%TnJmo\Dp+aXX8ht+Y]_P,)')<:$*=4Wjl5I8uF+2FF>!1Is%rtQIr"URPe<[3Y!U^$bQX`/Q9iH^R'GHlSC-IjGUm=\E0H&QE@k*tpVLVM(bW%@oJ[T!Se1Oamc&dp0*-qDl[/F^P@h`9s"amoUC$^mYZSPIn!fUnZ'$MGKd=JB2eetE3pL/K+$;Ym*4cOi8Me;,;7m8Z#pDR-ZHZf_1]Z!(/,bVpl>$Zno+?@QWr8+UPYH4.M(-?o/*4E'/1>PtJpnE"iQG;/Yp)mN2fnF#7U>_`E+nkU;MsdVK*sZ#F=-<:1`Qa/dWr5?U`K=sO$A3ZXNuVhVj70Vs*?r+@Sre%"f*O[q$<^N^h?!/ZOMB:gk`n;&0,stLOGu0[rN(,DnS0CoXiT]f`s2r;HX%0Y^a.?K]4!W]Pdh3ODs1r6q&C)`NeIn)EL8mqF8QHoaDUfTriH^O6kgMpBDb*"-YYl3<)7(WI^qnoaX=MX*=+?3!)(LcfbCnbjk*_HG=E*bkoWg."*XFq@G2CJk>CH9\mAT:BR$Xn+P)]ZLm76mRR5WoQYMD/$f+e>sBe6rZ5:d:I>ASDL@/%_4(-'[Uf!?hb6?2C@k@<9cgFahdO.rr@;6GRc=gD"7h\47ZL]*9Ed-pOY[djDp!Ka,-g+#^U3\_qLbLCr2W=3k"F-F=W6[=%[\X`^>"bl]A*`[,'Kr($e7\\Dg1f3hmOJl=i=E^0)4;kJojT&=NrunkG`Xb-`b'P=!WG&N#)%j5dG^?B@:FZC17tm,U"k=tC\U9-FN"0t0K.GdGbb.Sq@CNm.JV4!I&h^*Li-?kqju,Z\!U_1rGrOtnSo.rkDdT?SDHP2fV+[B<,b4kf,;NH0l"";5+_j`.'LtFj/.F1\Cn_;%?Z90m$SR4nP&NHN^L&.G[7^-0n!BVDpOHtbe1"m/2KtP$m@mLaF;Jrrh%VaG1)?TnHp@.E5OD)!L6mVK)N#:k(Z2*0Qf,C[)i<9os>2EOE*VM%o>-V3#j.eK*@r7YRP%CJ?`7M6bT:JFCF:U8E*?"h\e>8?p/0+/KBR'aNZ`O&+A;.gU?*N4<:$l[(m^!9gl[0B4AX)jbjDM>"M'_IlN5Kl@5f'-pUU3#[r1?:"!;BNg5g/-B8sj(dL;43%LsEct>!H@>c73:FS3WaS4nenolX>][RJ.C.*L7Y-iW?Cn`K:#k2`gJ#4[0pIN;a^Nm.I!*g[H7sV".i?]E-7]5s1@"UWs.o!Wk^@"`=7s(,gol@dlL86IKYncI67D'q&_`T1<((pou#MkJsQ\&AdaoW/K]C]nA8,AOsBlL.AV%adG6Bo73,_fUqK_N8M[p#&bh,2-B\e3o_Y[!S685`nPM[eo<^/'I9L3VF@.d>GlDOBMOUfe@=ZA7fS,4'BFZ@:]Fa##9Ej*U6^HP&&E?$cMB'H;%S?E0(+Q=3@koS-5J6pp=>'ogVj2\%=!dVYaCI4c00jS#5aH446gp6]]Leb#[C=oPlhlD[,<:H906g_i&@;Pf/I$l9OA'>J2Ud9uRe*$Df)@W?I#@/d8dn-:bUa^G_pudNG9O#]l-rO]dh&NJU$D+!D/uX[r;Q"$oIf@;&Ki+A*sqWWY4_;de>^4>@B1QW!2Ob'5'7M0:#s`s*\.^Z!!X->O+*Mu:W_(gqQ^-H7`E!J+HY+MVt2A01FhqrZ)[Jbr%[,n2r0!eOmX^i-]f]XS\_KIZJ33bcL"Z5Nf:?_Pp6.+$QTCOb57qFfO+`cR!e>ur`'8m\[^VAXMF1X<0.89eR9db-#<">H/?LjmuE&;djt81k.UQ.o+p9`Fbk!D#JT9fA)-NHF&,P7:5&.;`'b'l\1r]1B49^V"XU4iU"XOD)XlNfkZHPADC:j=*KH?V+QjEfFZ$.7a&\:hBK_K(q]LBm;F_CXVLB+1+B#MW."l519@U+0j,#jh_Rd'##IuJ([N7q5i,7n2GI$?aMn0C-ohTA%:c7QJN9-mjD#V^T>V%(O&jh\G((%6EOF67Oj/pqGV3Y_%P>IBN&<65^TnRHWF&&W%[(2b4,ERLCI[eF$hT8TphsRu+a?*8^pmeM`]ZFS5h79DORZr._aY?sq^E@uR-JVqOI>m!POEC0G_nrZiQ@7lg[LO^N'[$S_TVADfnSe0]rh"+`e(F\aI!#GAB6m7XmpXBT%4fsQO,p68O=E\n:I'd%,ttk&0L'omBr5h+pc5Um%+YPbD@NAWPKAd-S1i2KBYA"]LF@sP)?uBs(&>NLCch(RQ@$:RiQXXb=[dntI?[M1O4fZ[31I2lBVD$2dI_T=%qa`AjS"q1dAjWd`g^8SRQL:,Da$/>n<**8?lbdupn&,\I.E/(6q>jbXfl?=NL:X1Cu@dR9Wjg'62LIVbQE-a6SSY27046T8I\%tf^@,.RPK+\]ZdrW%^sgDB6MJ=\t/d&`B7bpesP0l2"_E*HjTtZ,qkX9:*hatn5Pbp+9D*?]0A6k+]]*V_5?K0[DrjnNtH4iB&72OX^V]nhE#-I2pH&pn]$qr1$o>I?ajg7;cq,@C>@lohO1Oe6c,OKc_oFFkE:iHUYa%L6cB0hMkJ-kP2JqY4'Z[q'qe\]JkPnZM]Gl8MO%/C8Z's,IHAk%me,D;cn>;Og7J%QTZbGE,W1M#B;Wh+Qk`>?4&Ik6j(a$7=]%<:#;KpaXI^I0[>)ar`JoXr5uUdn8,+490=UUpp4)'`dJLKU?H)N/8WP\aW@hcLh=Y$]B7:&"He>3%W;4$TJ?!0Xh)k+dJ.I+f]13QSh2$7%@EOh0^]gI4+-Rt4ASKCL`(U1)F]]F1ZeN63?7XU6i>-/cj^09&OU7UA1hA`k\Q3MjE/a6ibK!U'6kO/a?rMQ#/dd#bC_".1H2^>7$*NrLAKTLhI"n6WS*.K@dnT04,UV!`uNH8U+fu2W.`j$1kE(neYWJ"pM^%Yb=CurDlcGK%FgJ[ltPBe52SA_@2@+\^P\I8/^P2u2[!7Lu!g9MoHKWod8$r&!B!A!I&*u3Jq48]o5]&[QV)K2Ld6EFPUXDfid80eiRX?cjf#Xjd'.g3WG0G=L`c%O(IHt?8B%1Ss@!uunqK2!o<6Jl:)o:neln:%@D+R4B,7=6^(CUFfB#r)uuecA$'0fT+"Ng`,GmBm'3*?M@I,O?$0?-N\,cq#&VO<('K9L^k$)RGUC8:R72cm6U&rA*n,dAqJJ.FPR'%BO(@L,99pYT">s6d/*^_`Kd_EAqll.+`;l)@"%%b_FnioYeUV<"1Cp/VJuc^r2ULoOMVTS$e(nTC2RN2`Y2rBl\4>WbJCr*KXo$!0(A*^E.[I(a]@+\8s]iC(tmN&X8$5e8eK_#WupO:g$j+)f>k^Yui]'+`V*RbPoQ8!e=r-^Mt5ZZKKd1/$pTh8u`mqCKf(QO&WfPE%N-IJ:hMe?O%l$7O8>$o\A'0G6`DGVirMl5sQ.p6*VdP<&P5aLeH`_J=9mK\::G^3\h]ei!W%CnI6c2l;5?s(lEaCgEYC%-1K5#2Ldj]J8:hsp%U(Zmi7X%+RW>ZFlGUbSL#PMIF0SWgmUlY!K(b]]V_khWhcK?k1l)]"KTRsVacf8n<&cMK-`[!<`G<[H-4jrnKA5hgYP:56Zq0EUC@'SVU[ZJ\%mPfZT3&S"^,%H\4]nS#GL5gprJi2P=$oR=^c3afb9(#5p^_pTLsl\rUIk:HUV[u\1hLQAf4eZ2P'BaK4.mE1MU3=-83,b'26\4;`,k2n/1D_2RbE7%:?I2]^'!7H6TmQD#<7b%m83tPQ#IRP_"@`q'kIW"-d3pAHA<#$*?1GP>E--I]/,^=&6ZUK:Kna*V@'bAD'6]>nVD1>AIbEE`%n>h*ba'5fL?u_'2`613et=epYlpBlC$'#BQqA*G6qug(aKE!bDQsciYaiT"2%29,b@MU;_gn$@%*gY.]1Eb0B3pA-Z2[!"*[G&LiuA#anr[Cf&2gG!j6?00h`Qk1jZTpPY*-BXO1QjB:K,._JNuQ-r7("&Gj#a*g7V+L;biR(cQ$N\b;STR-S8%HpbU':D>iCRNhhV_YJP:isgdd,I$oN9Iphb(P)#'p0aL)8&hipEY\*Wi?O5!-hmVh'%"Q+F!/E46-[ee<&$_4(?rQ-3RS^W4%4P.F&bbqj[sY_&HgQ&p+/6l('`4J>l4>Z6U%3.ZsL.VZMnIAe0;bb)20!*Ye6chWc"]#,,!Si6".*h77'U`d:38g:C"6iTL"c:!YH!ZGoJ@:J4O.kD<,@7hj4J6#oL^64l,33"N#AbICK9CPULO*(lI\'5o:Ze#pp-`CoXthjPAPj)F.+)1(6\4/@GfN_,_bUNJG;,?2q$%c?KS4hg)J7RGL77K(Tu];VqCs*j1;3s'GZDBPUp.eQ,W[pCZY?^:I".@3_(&M0`:ukdHiSL8C1@oe3tu"!g9m%iUE[2o&V.-Z%?JE,Wj=fJ]Ja_4\uTl^qn:qL?=kRS8MKKhH1r6s)fs=X7nh4g^moW?4@WJI2FnZ=?ujb78WlCB\]9P`c[p1%JEMN>2!l>Uj6#i`mQ-7`WdG(rLVN%"&$h9:l%\91E9n7d>)FsMdmNk0JfJ:3Ti^)&]*Wa8:hn36%H4B`^uscr-P^n31DVD;3[I@048`;%K^kc,micnlQ#j$Tug*[Hl*]]b>'dUjQP\ml4`bi`.0;88r-'P7cTO\W8qF".e()BZ?WY0iiD%BoC#M1Sbg-jHU&N:gCV@Eq#1BR+@\qg8/`q$^6n\;FH3siP6]rCZct&^BqBH:8%r.l&3\s+r;<_:tD&,WiUqY.jM>3)cN1llkX9ekf[`>tTKM5*]JiD=),8eB_#Q(+nm$rZ9i,^N*0.N(4'S+,"8*"EH@<6aI?[3#/0O"1$WSFal[-fFMZ(s2Ej/N^gKjk[K`)R\VU`[PTO)]kMFq8JC[6K5-TU8:rmkXqm-iek!&P6S$(/)8W70*r3OAIb9fk@Wo&>hO^pd

YYpH80gnn1_r,E?]C-/&"sEN$6%>NJHDaaHp;$N)]Mquk(m%#Mnc@eU0!kl>BEWV^Y2[mh.;]ECJ2e+^i1Jh%aF9'c;8apZG!W&Y&UcRCB!sgPJ3>>(RgF?QnR7/[SL\+krg=0Qe1;NROL/V$B$;HarDTdL_b:E#!-*$$pe&:jE^g%UR(5TZAb!QN!2RgDDgam]P-mhiHgr&:\:RE$GgA4VPSuB5?Pg@$+pa:,Jnfe74b.@,UM,r'r<_,RhBX/[gM4o*H[ROE#Ok9PZKu(O4-L*h"OKhd,'UE19"Y\erU8X>e_5A#!<7:1aqblZoJ@3ngV'GSn4:nS#H6Bk(V8cYSs#RMqHMARTG'kp&[@R?2j$A\\>#"XjhKBeO#R"56H!W=N4#R@'4T[-jE+"0Sta8mUO4Sen;LB]oZ#3f._uSH*SnP'i=!7&CiD]#N1)#sQTfSJ&1.t^HVsNWB:2YClaSK=U*:GF39=7!g$fd3/:^U:`X?aMZ@9SAn3NjM>3(UZDb"P9BAlN"KHN6;aCd2%9PV_iW3sM:eHl(Mr6"^4q0t$IA+@D_g`sDt2NMCkM`M3a4_V;4t9k`b*BIW0=#e-p"ilF&RJVgag`po%%-%(.GK0W0"_EXY*/6p"!)F;M1Sd;3`.%CqBp35Ka3sY"Ggd$Ou&>9(h"ULbtM$rB7L?P5=jEpp1l1I3S\pQlJ!TCVQ9_T5rC"^A!l9KG0"'3:i?O&;QP_S=R%k%JO*09ltaaOXdH]5H[\"`!aQ`ml]@.U\/E*QI\VjQ#/0pF)9YNulA,t)?V=j7#9"XP)2L+eaGYbS8Wd)$bu;'8-tS;&GJ:@D43pE+@'r"qM)!VL0#UO@Y'iug@"m\B<7pmI$#@@4S2*7Xc)[+,Ho]I?&LRK^P5$=I5.5JfTJ-5h[Y3D^8VXcapccVbA1E'_T:+0>D`;go,4E`=qY[:Fa!$k5c7LV#8M8L>UC3"TUXJNNEA+qt()Q,lLYBMotHJe3cLJ.`tK8nONTL-R$j!`]Fs+9Whh<'rs]*gBDf"@/d`"XOUMWCk];Nu`rHLWW>Ue.W'7qpm]R-;X,UO6p=5&,P)YhYRSPN;;gk8^Zq1qQKf0F%o?8&.oSE1e:L14=mcX,!g\[1Y+8K@BsLj8[(]Q#Q'YpM@/j(T(hk^k-.#EL#1ifSj4!tUDAe\\0.N2p#_(d7#;Z`)`6XiQI]D*$RKbki"R>hLu%mdIU'GLMFkOP'-4=28"Hu`BO..!0-<:<1gFkL9HK-P>DOFNPhdI%,ZNJG/dsNrDKM'B_9l\'OemYeJ4TD7r='&fM$T4f"T_.<`2Q!udN\]=+3UHV4F2\_P6.XWZ%(a!m^Lr"Rh@R1nD.*Hd\aCF%?a#u_?C#g!JV0Q-:R^Nki-Pg15D*=L=J);p:E].h=Jo^+'`dVto6`biBjrg=[LPH/J?b6=AoC^755p_%j&$t5%\a.[B3"o$.,+E86Q865hA>T@T?;i-7/jFOM[FsOj6)-k`GG+eafHT.PUKdREc50mRS"FRV`C7rPN%8EQI\JlmG,1r^1-DErJR8JM(Z/S?6aA-DT)qIlk]^8ZhAdYUqZ[?A0+T_t+E=D"qb8ILUqu*PD6IRe"fS0fBmskU]Xqmj2aRC(2rbk:ll?Jo,QJdA/.Vg(`(J%D9bZ5lS!66/u"S@`#*A)n7*.1u]eF0b`MeA7G#Z^Vl#'PX+JF!Ink-uZ[UWgDaai5+)UV&.Za_I\Urg.sZ1p:ZD&#,u`&)RJsQUkf=5\Mkjd-?0>','SC5UZ>6f)B$TDj/T[j7"Gl@0FA=6\e/D!u,r$C#e0Cp&rk@eF?72L8ZUKeNfc.Qt7g6'9ahED=goLf8pQ/c81MK4(fo559]kS(V3*l%2MhN[54e-or67W%?dqmrb+^mD$:2(X4pX\'jjG&<2LZ%?c!H^L6Qk*(lAlXf?W"bUUi4*l1YoUsp@HN0S71>28G?3[8[?@3m%hiTJO%W!eH[F[]<-9DLh$h@jX8Zgnog`rk@^X.s1uF1@>JF,7$sq7rJXZ?nA/bT4JnlId@G"biEWL[d\VJLsY.UOpW,([>kq_&I)*2.;+%JW'8l6Mi7Q^mE#GYNg*@U(bDSb*2fq%%!ju0H]Mc#_L-Ohm$olqhs9Yn+9(Mm6;JC0A5F7aG&\lu;`t-Q)8u$.6tkGVbaVd%V3mC$R5#Yd,>eqR7+LL#d\`hF4^[a+u_M``;Qb<8;WmF!I4%@1*^ZOZ[*OmTp>#fU!'mW&L;dp;$$g#(SO^iLsh&oF0FM6i0LZFj>WB"\'0*=(.5,gge1r@CJ@&"4fuFk<:8HVj/#bJZT!oDIS&X6QL$@NW-Ynum[Zgu_;&m>KgNX&La;,%/VV^sI2_3ug)RnU"/>!Un6WGcPt(?L@;?e*\*Cst;28J;k8Q^VciF?I@LX1_Ot,$,?9I(hi7!qF'b#)*BJqa6gi.]j!rW*ca(r.B)WaFg`hPk1gVbBdd#$D-/jTdl*%5gMdJ\ko$]\KAi=6LF:<2-Qe5bKks((IrGRlXhok,[M6ZY5u*5Tian02I';H4H.O=m"0:!k(hU5'T/F)tMP^kGLGXM(%7&))D9=T))E:B`0ZOu::R-rX^.7tcB7n7ZUaU;ZT(ammBa7`@IScF?:?.s2SoG3-'?Ks6(*Bm.TEe5JQ,ddkZB'`Sd-L:oR&#a7H'b6Em,gha5SksqmjZR1,R-,7TP%4aI2bSk'MX`_`[LZSRtg_sRmRu(/^^)P@tW79)j^-)qrSNqVl1++r.Wn(YCh@\C^hoPfOne@RZ%QfNWBOp+piI'DPPZ8-LC[5q"Yi4-*8eoUsTM.(IQq=u9,6"=.^Z^5gIO)>?W-E1*,9h.=MVRqN!Z@XXo!8=bS?9S(05QtR[9)l7"IC6BiU-q^4n7R>:N#;eu3[ZX0!IY5*B>87[1>[ZJH.eUB9JY:gU*DkFSk3FA-(4*QM&G.CFopQa]`Cc`C6cFeS$6DD7ME'6T)sW^J(6o2J'jtkoduHhj(Mr#3gd7l'jI#H/.TGc%Jc@XV`RN7eFb74V"QKc!m(hpJrnRb482:C:1sLM#R:,JPE3f-*Id+655Wd9\p@amPbn5p.K8f^F95hcP75u2*>%(nJs.CjA`uZutD8J+qmRf^T96B(Wf(Z7BX+aeT09bY-BZE-RL;k47DM$J8q&iL!*ra*\9'D@1K5#U6;9thW1"O#d>BS_KrW08[2M!A8'k"1^C#NW6'im%'fJJ#gG^-aKHQmQD[5WejTY1*Va1:NXd%4"):X;^S'C]5NN*&8%3sJsP`e]`@l]7IP?_0CID=1O7^J+Lp(r*7Y`j']u\uAS]-k_mSc(%>Zo**Pugqh-8MA/_Fp<*XG#ggS':]r&B;Ad_8IT)5969g82?2[Q3jn?`npH>%(Hp[bQY-Wlo&4RElfb5#9$M"39.@Fc"<%`rPQP'$TcIK?D!+Qm:.6cqELZG7i.T4gOUN.*L^8Y]23d2@LeiU/f7QlUlJdm1H>T[SB)%#<7204tQ[0lAa_3u:iXRWm'.>$SNVno78,GM_pA2pQ?/Pu4'jJ'#Y>7a4A,E\`lE+V!u-?7Y=f&VGUGK)/t[A7,KbOo7*NPs7\cukLGW[aTs8o:P$3FK1(2q&L85/F8[E+Pamm*/_+NC'oZkU`D"*MS6Sqq!)J,8QUR]7*NVX7POVL6(,mN$i7Z9;5EJ'5bXb@6=c@!dPCl0\.#*>Rb9O@:BC#R1JNaXop-3eI3o.l'@XRR@.]_^RDBBdt[-+G&-F"njPL30F`-Qt%1j$m`c[H)E<&aMSI_13(`dhr4WrA/W7-[&n:n\jr6`5Du9=!f^/$>/6.7TC`*+4krWG([t],IW"BU"025fGR/W,WqMOarmT.TM=7=sY;SJte>NBppB6TW0-8d2IfJ.B/1+,mHKa?SS4($gHKsPQ`U+KC5AH+DVf0RA14U/=[P;'AabM7PK'02C,r1/bm0K3J&/+>GFcO_\.D.,T&[H@QfCW\N!Z$D[s3V;qFpp2VMOD&>@4^41$^f"PC89bl9p6*K%BD$15$3,,+D'lW0'NbjU_6]eRn9tC(1W[AI$=Y6^R_6)^1lX'f5YS/Pnc927$7Ue)R]3En%g78oBSrNNM'bh+DX+2D33!rAJAhh'6/shXhZ9"5/Nud@#$o"X+IAJSmoq\9$GaN<+*q^.EM#Z!?X4R5^`g5ic&3/9DWrCnMF6htQHt;6ZfUp'H%9HmXu''DKefZ*Q]!@,8f@^4EY:-S?%Yr2rkGe6-)V7o?f67YJpKN!W)Qr,pT:5s<0CsLOHO_s8*<@n&q#W0c0qB$(?Df\I<\:>]_a^[6Zh#=IaY@#%TUXlhhJ;HESt-sL*f\pi!5bQ5=49R%K64HlAS2VSl<+CC`/b9FXd>kX/.].FQqX'*ZT@%^!#+QfEo7D9BiMEK4oZdSlsDe^KsPSd9dHj8R#7*rHY87h$kZQ2W:0,&;[]NUhL"+2,/ma6O"G(Of`3M]%8II=@9XG!4s)/jRQX>+?jK?09a2#EG237)%DUmj/ZTu0A8Z!+Z1Xr/VOU4+;b+9Ju9WA;J@7tBOjh^,7$hr#?dHR@*L$o]>1?-B?ur1RrJI<.)6Hb@/gejT*+i6Yj2f,k`=-`Q1c:Ho!@V2S!\2qqHj3&<4R2#C`8b9"gG\H="\Ut9e/oN7>%l<`3HCcB[\CBroU51"1geJmJ[:[E_`dD1$;O,&Q$X27l^<,Dh]c9@J-8aBc0UKg'R%2)4_Yr.Xs]iGbn2dPii\e4,8qsZ]r81M.4[a=b`h7$SsSa2gR9,,]G#S.>\5da,ERI^EA#n/6X6*;oREtG<;6FRW^e_;::QI:WnG#g5OerabA=So-OWq?^+U76W7<5So(G?=;95X2W)5Rr`@4(.mR$sMJ5$^5GZ%0]eipoFJ4?Hk/?3lpQ4`UfjaXU6MT2n+,!rJcPa9>%:>s3GB=[$&'*P*dcEikP<#sC:5I,g178^"6'6J>L@f)&6pdRsN?oi_Z\'eKSJ\I+XJ6YK^CXmSR$b(PM_%3_4p#@3Me3SSiEjH,hIPY!X_qrYmG1K('+?X:0YiE8!J:Sm^m'rQ7?T'.]kWkekWQUt`_S;E+Km\H^cQr'pY*q6G#V;rCPbGnT,c97]Pe9a6iPq].Tn!k9!F(Sg7(([L#.*8=VHd,V\aAMN?H;YoM2k_dctqaK]DU&n&p%>BhpZnaeU`Ae!s;,J`2/S/tWX+*Q>jqTr"I7LUu*/$tgn$_gm^;'DB@RiI`E)X[ADL0r2!o9bJ$=kA`.,#9Fk$XV-Age/+IkLpWTW,"!H/%@r5i1H]rDR#E)qkCn&,dF1*=@'J/:GQM_Uh`4m3`K$D'o]gK_ok<198B-\Ok6F8T\W]?W8^EuK,W.[.&L;ZpW$(JR*Ha5fno7T6/;2F/Kf!]r`DM`H95^0<1J%NYgu.bmoGkr!Z"[(hp[KH>;(V0>4QWE`@g'&X<7W@@d2>[,*>G1rO-M]rK1?O1Ik'V76WU\hPpZGIu!"IGL'=2jc6-%@sT[P26/K6g9EWu3JU.B-TQ'mCQi4\0nG+oCJS?aLff-7I$enqc$5k+$\2H^gUV]&kCpX2g+7%NqbSi:gN1QNS.S=>654O7gqDQA1NK=NZ`.^V$%39X/[VB@l!4WoH%OCXaIWH_Lc9Ui<0-h1i29n@uV>13Lgll,Dr;1`[,9)3Z<,R?.h5Q2lLksKbJg/?u>Z=V4;*T$^NH#"uM=@^>e=a,kbiM<@UuVl5*Nb5E%^=F`r(N_:EOaqPjW'<7G!?]pQTB<-WhM[&\iSAh]fd/-P9$,TTUVfu#["N6p.IB-GuA_#S`Pgs>)c2-2J=lhHf#GS_'(tB>pYWW,Wdp+n!-6`0L:R`eh9`YD/f'GnXNMQH2cO8UU@q4?X;$ifD1]F;Jj*,*R-(ZuLq+\RMK]9tKG+AiRD/g1C+V8OF4k=pO[7,sPZH>#I;hUV+kI=haf.bSiP([uo\6OF/f8FH>u4"t8>O9n2HsJ[$q:?/75l0V+stSl8"KCeA5f@B5'JT$\eF8_QsLdXSu/e*"6K!=G%Wj[+hQm?0Rb4o[D`Nn@l.-m@ofS/[)NLc8fh"[Z)'2_ANN/10ooQIc"=N2mjVqh6"L5#SWg-Ebf*9HE+nXb/kP$>Lar[+2+0cj29j*6?=W'_p>W@)-^/hA,OV,g^$qV%eLe)K('?\PPXA5M\nnnS>it^'V-rV2\pDHa00$,DXYWu/V`HF_i^N2lnTTgjlTn.Z7>#:$P4cEE%LY/&VJPlFG`gdOC9FDF<7e"e0o],*k[B45?!/p#;)^m*hg#X`*As`^W2fr!p=hI*a*';!67b"5@=EGFX#A4?4@apDN086Y;4FlTM3]p^$H@p@bu&adO;VQ*So24+4[,BTiKTlJ::-rle:GA02BUn16I7tm`h#*X"4EV]X5IG`RGM2'3HNFZ':d+E4!8$jIu'^AJd`n(0Y]8;q2PkT6#n+o37/V+1QE$tG`6ANFN,>S7A\5m8qG>u#)F91Uh+8gP+/;>aVVQM[MCK3[529HC,KR:N/"M(s,_=RNEWl&Ds(>9U%>.Wnd&)h$npbbuLBC)#ZJU%MbaPg5\;Wq1@lFAF.OW/>bcRl]J`jX7\I*]mA[2GPo*<8G_5,)@]qN23-sMB@!&^:h3`1i9tOU*=ATO\\H"MHjg`)8!_>bKCW:6R!%(W)?;1KJT:LE"!0:;R5b\42nB-M6SphX!/gST-P2JKs[;'$\bn+cRM*s]*6B0NonFHb[SSjKR$9[f[F_u0Hun0dPqt_k>iShahIZ5`:Q(S$tUc[;b*l*&CfTn/;Ee[L-jU2M6S?Hi(tAt#*XegDf>Qn#7W8pZ\LY*Fk)@7fL5PW$YUA6qABf&.2#*."S(@]HH&RAf'&8O914GXFu17kR>0:b$UC5b)GS-HjGA&SBg"8]rS'd22"?I:]ORN-\Ei,D[#I)"[%*lTM=p.@,<;$9ET/H*:lRF-i_=:d'W5o.k*CjZ9+*$^7I7Laq#Js%<3X\8Yi",NIhdCq*9]MNem_Tk\#akG>k+!JbQ1dRc!F2U^gc1!^+;qO+-9OE#!q^kpOobnDTHZ>u/2gHd,3SEql`DEV>>H\?Omo4+>DBD4$0`GQAeC^>)+k#KQ.h25jK?L&`C-_=Op1SDd+S)5(E32KdI3Y/_/eMj=]uh(Vhup2c]+K26[Y)%+s%;ZZH2U$/;q/PHUOcglAJEL=Ii;EWO&L*=1E=l[tl>i)\2+MJoTdMIp"rml_EH,HMHNk[VG$N>e&g'eqdlbX!q(`.k?`g;^N`H36,=W5(s85XJgFZI&SMn^Q]&+Ut-kg-8_ZU%6&`Pb4cmKcmje4qXrdYeE#H=\n94B-5*e])N5&aJlL+]%b\87JnSHM7fr;`0Z\/JI^rp+dGq8e3+dZTr%C*5LlMF9n8b#r>e8A-c(G8mO!Jf)YaGk&jS'6?4QO_YnA`"!`;45C`jA_3]I5cES0CFBCJ\h%N]XTY'`Gu@SKMZVCE4o9#f+EBrlqN_\'gZ>.:@%VIqS7aW6=V62i6'L,.>DF8/!<,Lbi''#1Ul&)LX3`P;bAE`N1]42UtB"oXm5>(O(:br;u)@Q:N8n@XHDoFg;")`M&6\uQsso%/92Z'g[N:IA>UKC#kA8^H+1ce%a2VlID8:f0SPNY\gQMI!1g-\O6MYsdK9bKliO\(pPA#CpKndQV-nlbta=]#r$>Zin2U)M'69qDbe54q$2:[oR9:NhBap';cM4ECUdLl4fo$io-`m&14<)MMPRn)R/VK&ZqeW[L^Zq*MVLo,1['5Ua.=H+%,mrJ]X2%"'#I`kkO_$'`Z._23NW;Y5oRZS8Tl(q)]6C"iXASfG9%JS7C/_d7^a5T2TF:I3!sm1k=9R-hKX9i`8YJN8MY4SQn"1)3t,ho*k#Nn`^da2<3$P%AP$i\ngL5\a'nXqY$!K%RZ((]#,^mE>$M%);;aWJpu#jaO08u&rEpu='8`?;Dg@O3LheRf@I/IXRU3+?0n,-&#K\Z&"K9SZ&P\u4rFS6e+eQ6bD@(TSZQ0ttiW&*7#iZG_@2I\nEV_8/K9o(a&bm0V*bH2Gs\TJ*?`@ptKk#07Ei3&6JJ=7q8JZ6*JRU#P50:(M+DIOBd9*#%>/08*#hP@+qKM)7C\I,&SE6B2r0qD^`n;K@bueSFl_c-/?)2?9bD"q_h`f>P42u03C3S4c$)>N8rU:L0&euA[KSrd06IE(M7d*(^$#NL6'beT5*Z(NC?8coId(!CVJA_HY@5:35qFi!Ri9?*N%*E+;Z"0;R+cqSJk^kRJV+tL3UBHAD^cdht&UH4++Ei@*JlSWWKqZ<9^_D>ITTF*mk([9'dP2"RNahVu1^U5+!'.hALN,`M=F2:10_1DQro-82H''mI9hnu:[QK=2`#s=5d$b46"38%6Pit)3@ZTd?bss0a`"O`!Wbe/,6D2F/`ZS(s@b4=d\O]$cXHdBE^t0X@g2XOi"uZ4mNG$X6aT-(&LM.>:S?KbENu+X-oulEC&[aJEYM^:C`!ENgA1=R)1Re<#a,ld]#$ci1*Q8c_qb6eq%t2_F]\(:3BK#ra]^NK@\:9Qp`*$]J0/f,.S!kNFbDQ10:oh$CiL`HX`C]^Q'b>?'-4'>+#n)ohD6PO.i>WNP(K;*oG/7?@ciWjP^&Y]8`&VuREZ':t-kpUa`P@8[TbLtVZ-:q1@iCoEF4NOOn!V`0nksgod@?T-U9Kr!,`WP)GKG4SY"Nq@-6:qJng&gr_M"%GJI@r9>ZVV26,VG$F`UIMkH%oc;3p>!_e3j]VPa'N_`(7gDfUOV7d0hYA.-j>)XQ^_#Va=ltRGJSBTJI/-/V%0Ro-Qcdl[e(mfc*i;Pf@k0#6OF!UamT`Nu=d(*T*L#gH=XqhPX^mnE5$1X.&dcI;4!NuLT[P<>8W_Uro7/a9kZ_H;?N'9K7\9B;0J0Oh_]CReg,Fg@.K.*Zs?9]Wc)F\Wj#LoXgD;.1X/iPbI4FR"dr[%4_NeV5#/u_F_(T-urk-+qu.Q0Vb9C69TanZ!aBr.'Ja5.T_$?&$a2``"(p)1S`0GX%Kup^&\7$q!F]#i]6T#Hqtp>/lk]*s+Mga6:(rW'\q)RMA.^+fC,AkB.Nfr2pRe.8N!Gpl1C8RX9N[CRfOA%V6g@F++LhW>/gV?k!YMqVct'%Hm-#l1g=eYnET:ou$43Lp-((>4[]iJ*2+5CsX;O2cgUsc%cpm&3@4kid75Y`[;!dCb(c@C0fl^D.7=r>h(gKa5X$VZ*.,UF28&+BUCIBD:A7J"5E]O5u-[)=1lG[?>e1ZXe_MfO!UJNZ_e:qFbDogl&A>\(G29\K)C-h]J[D;QXF[Y453eoPRPQn+5d5@:BBEg8d9a#imA+k?NVn6GBlGRGt(I&)Ni)MHqsjCLH%sS$X1>99hI/P0M)g@3'qa$QO.-nk:0gKlF<3D7'NpYfj22?d"1k\gs1TrPsZ*hJNBJ^;O?unOV1LMG(QY:$D'Uu.&$u].)*ta<\/nm'kHof*h;G[WYj_C5GqhsKTDRuT)?`=,rLNl&eI+>55WLfJ_7^A4mDH-Eb.US'RWlt!V*r-@-,ZJs,9DH=Gs?jP4N$E>N;:EVohF^/AoW)&gEWV#FD&9&Ir=+*mimjL]OcYR*_[0"d3.Y\"tW6J1#g8T0cj[iBs"1)O`]SPO.)6>1S`[f/B81@-^9)l#hH&kUX-24,+=>"sG%Y+WmN5rfRffB(]^@gsjGR-P=UsgjXD+?kN_GO[-9PhX#P2rpH$LH:0D=H;PWcV7UWfP\+V[=BXds)d'NWSfJmPQ4V``oY(HFcKdZcYL'E7T=%CVigW.JBmI$!aeGc%0enK2NPd(TVOIoEO\*l?iXEN,Np5H7li\c#%m'iP"\.*MKMC$Nr0@pGjY4K]PX33S<9`Go2]X.*)Y,3IZEIo_krQN]1H;@E,2O*R>3P2ie%(c=Nfh=!*a(4$QL8GMG1D88t0mr44kEmK$+s5Z\AK@c#*M!rKq04`c?s.>4W5p\3HAleko01d!/+<6NQl22(O0/\:Se`H*rqJt",5Y0[?Zs`Mo,Sq\*2OUHVbbS58E3$frg6!E'R16)Gp*!pSq&2`L^/.]oB-4lKD5qq"XGB:2+.KW*rLH.68iiqY$+)<#I"DT^&@Mr8oEI0#AQCn<&sljG.YOOed#]0(&UO3kK#OOYJ.ZSVJ!D49FPBnUJd-k%`aD[Yf^&f))-7$ZVRX=:cSW+3YFF1k&SD0c0"#,r_Q!ErVRBF"\))(Gt9bD4g7XV9*NiQ+_K5C\1C`D(oK=XR-Dh`GOW#BmAJ]CFhS\iI1#ntTNDENe%[$k;B<'5%DY?XtX"PA>f`RHup>pXdPOq*=!U^1KS\SQ!ffS*f^TTp$+7<%6'^r@BspiN!*-FYti75ENJLJPGQ"B4Fbm[XCsQL#/T:mDI&O^iXrl4GkQC;880>[&,f&L-3Z5T\,7VMEb`QnAEr#Uk9tZI7GqQO^fUB&=HS'7j$q8S)Qb7>cr+\[#4'l:=&#("KV@E)J9V2['1rEO"9R!S6F7*9!>$Og5n&SQ.!-8%VtL71,n^c_8]98`LbMXm"Ysb;'7lm7M5l7R]/*P/5T8W%%+###!D&1O2!G.kQluE$`.oiC&4u6k;$^S60VAuNd4eAt5Tqn9ar#]]R2o*^Pdo?I?r?QHG&.>glg[#\pmhTf8t&he6o"bhOSSrA:VArD!Q?.[+6FCb@ph#?Ut-Z31=_Nd#X[0*@iYTu'NHVf\hE/GR"?.Xkl"'42j'D5gO[,E_#DY,kM>>d3'5M@.h0TY8WTa/a5r7I9$N#:*ZX(++SDFtbn@V-OAj4uH-s6L$rf9TBs^E?(`UUfRlaSWL9ksW)3/R57s+*@cPjJOM?QEF)c$@ouqXaXTrmFWGU-R8SK;4eKP5H2Ei7FsNOQ`0^)u"5:H[TB\Zl]^p#_jf8Aca)$!Y=:k(a)ADW.KSn-%q'gjWJ"(PD'S]P6;T<1/'Dr/5fiUaRM<_Y:mX<:4UIh+ijt39qamZ9u3T9hWR2?[Y*B\at4C?$Y9E^%bCDh!X:=?7=Y$>O9$k[?-sF=qoI9:ofd;;-kqMSX^[>f!@'ZWm.\@eSE)ZInJm`qcVMFgL]]q%\FBr.OIiW@<&a%-CFU1D&Sh]T`ICnRdVBTu12:t2uf]3o,J&VQ#K"nQk0JcM)kM%$W]6jU;N9bT9K[2D&d7j.B`2h2qXcNdM;,)jVEEL*==1@C<,e3J[s22eTWb&)muUW1).#uB5cg[Tjk#r54?!ON%mk42[e4`V&QE[:aPF\7@jeR1Q?EO;e7WZUWDF=MlO@i4\lI<&d2>/FU5@WA,#1_$3jOs$=mD-LK6rSSOqq&"C@d4A]4&XiuE!JR%P2_<>XodU$)W$!2"dfF-`(jQ0&#"j@7ZtrDis"9H&b8^#pm14oh/18E0Yo3($pTd5a#TAs05C[;/^s%,;fWuH';AkGSGN:4G5bh?1+=%4Ok95u]-e1GV<_<3&.fF>8r5tK'U9A05p7dU+Z..D7&1Hj8M*b="@Of^1FWG-,_P0/TP:*o,Sknsi=k;L&%>\8#;VYDG_e`l!,;E31mniD[gh0o:P]6omiX"YBb^D[+V\TiM-<.eKd6p,qnI*[.V_RPS3u:_NJ'ZZM@"lepBVk'(b\D2&hPr7PQ_?r,uP:B#L4==Y`fJo+Z(o''dekBP#*i*8BE=q,XbR):%V:(]b?I6+Nb()K/R4MKA:f.g^gUmprID%O.gq]!'kQ`$V0PJc%4eb&oiYSegJ_+h,ILm&5"gf-A2b7rn\.K`8@^p%[ck5DX%g!7Z^'XOJuWOR7&n,!#On9Cg).%V@5jWam7XkNPP5PMF-9s"63F$B7bQ5$V5#N,WdWJc"uBPr(UTI!+Q*C9[jBX0an-.&Z:Z\GB\.*-4Rus!PqQE&dd%8S%c\R6Vr!$U0qBa6NY^&H5IX>F#b!SUIoPF=WOC!*C(;!Z?IM_ha_tORmn#AeXcAr?rmYbV1'*,lk#NV?m&o**8,R?Dj&%k]L<2'[$d4+h4"057KR:r*[&&L_1d_?%D0d"$le'[f^0.#gN1IXo6<@gR4'V_r7p#]JKG3uUC+gD)QUOCt^E8)DKH1fS`C;RtqUdV0Vh,nd!/sGBOj^q_Kh*fLI_6Kja>Eghi@[^;!1*R,FckS#I`Bt6'?!KV/r%A]ngM(MZ0M--O1jeI:lMA#Vm@tMd9PU+Z`.hB6X=!`?rs&.@?d[j#_kIDYCg2;N^%N\gR"Gm7Tp9ahd2O)q2f9k!k?=^T@76pCZUB1[5pRZXMaU*W6fl6+(geYPp];Jp`Of9uSmd'CNc,#Y&)doQZW%a/%^_pF#LZ")F87fC\)q/jW,Ci\p\&Ko2#LiQPRIU,`KLT@eg`?+cZ%=+W);@-$j0?L!lbqhY7X3Dr"AGHWq?#&>">L5Y(f"g,bYN,6/re$Ts-Zd75c;i0JGjd_M8Z)onQ:lIc%:]HP[QmIH_HB"Y[Y=%=O3QZ5\e@+80+lQh%/YjXRrL>1]+JZR)?;Bnc<5#4C0ORh3T$fHFZb]KE,7*'iD>l.\?'13nC*C]L.fQ`PNKdVPMI5,SCDH3/t"=F(VR^W3nCMpDat'#Lo]@K9&<P_T6*P1#s?^KATXT)bphKp9N>EPaQV^qRPhaEu'.fs6dCJC#B=Q':pE@*KU<#V4(`EIs;[Rr!`o7=R$OQd#8.5%K[?&4%^YNUjS@m!RmR?hr4:F0HKd[oL'7D.r+1FI%T0(dcM*%,]M;C)KH"=I#i'>(K/\^o"85JNHt4=YAi[Hn#Z!V$%"n_%pN<:GRpIV;CmL7i&ZlY%?T#*s+6$.5UqLpYg.7.Q2ea@BgY`(3_#`D$I=%'hT57*e7T3>fS_K)un-qJ\Pr,OF85+[H\s'd,k;E=!=ORg[#(#DXqXka_b5//RbFhi&(=6\]tu$$IH8fOGJd(de]HFUZi(K+&SfGcJk'O">ok6hNi77j!GC3.MI5K[IAC;T^;b,=ou?+tjmL6)+Xgjrd^DF/fs)#hm`5g1\WnT`r\5BhkOc[8KSs)+$0qN*tHE\`7PS6mP<"S$M6lBJ@a9clX@OT"Z=i8#$m,\LuR=G4TdPJrpaHk>YhLB!.*#*(E6(`7#OF8;:*soGQ]M2N*/g^n\251$cG+8]=sNc$]u]:C@E\fVcCeK@pWpjlJu=^dHU@_FD?R+fSb<(^Ht\6fSJE[tjOsT8*Jj".nA4;T=?p>UI%LA=AV$Jf0.i=pejc1CPASlq`+,JULc(fRKuocf&5naWK%`d#4b,C`A.KU)MBZ/+(a&oo>u_MKf8f.7D?7+YZdjOr9(5$ckP\.:Doq9=Fr+*WKp+)/RUn`$)#`Z:F#s,ONg@M9J=(jjMLCM$>\t>^!*+%/f.r%4b[?#(ltTXfjAB/$MSS-1bPZ/32<:26rCV@F68c-Q_I4/8I$C4"]%f+'7rL4ME5T&"%6OoeO`6Q[e5-bpTn.?cd[J-*5l:&Wl/SDjh\CU#Y7q"PB6TZM;d)=cY\TMW&l>P6g2LV,_=c^]OYK45m+V>JlI<"$"[Kg,UJ_+lqIf5%\Q/#Ul7lj6Rag,loZMm0REHC#Ec'\`Gb[Df)AO2INq+$-u:&.'9Jt9CoOHX-kk\4-S_>)99"b%S+9LOf86#b5HCW6BUYAu.pn"Z4P#Q?S8-.^)tfAJcRRYS]/lsr35%^2pfOK0=,VDAI21X%[[CG]jd@Id.[AobEDQ>#S>tlBe_O(d_ccM/'X/-WSZ<5'%TRDMqjb&a'.TVZkE4D82K'pRqT"sI*>?Ti)DHmfB:!@KfI[t0N`1V)SVDuj6$#(.3f8-3oMA9Y(9Jb?K"X"HQ?ZN.X5#/04S@A)[QEWN'm;n3TR$#1!TfY7O3^nT*L8gF)s1*dn$k57+F]G4nBQeC`dBScDiuf1k-b"CL,ba`P4m@/QOf)LdIM9KHf]WDcE^4q'T7r2.M:C/\Y\lhM&@:>.@L;-%HD$j;0(8P^P#=CIS!^15XFg^9XWmnl<,R7HL&=!dSp5[a=GNg*(r:D^Dn_>-W<0R4\r:OaWK3i%JL3afSW)V1+'+qUWU"OR4f'WU*o*`ZQM>Z;Eb<(%io$G^;-_*CD^56>r-GfZRf6b8aEu?T")H]+"uC$EJHQOmPZ+8\DGm_N7KUf1%](+A1>H$^B%/6@0[IPGJbaq7l]j_75X`Cf*/A'/:KS(^E.5-g+:%I*JHS4B-a_CQ8ls4n"'\HXk[R\$LclPFZ9>*mOJ3`6'_;kHpA4^!Y3)3uZPEcu1J&XT2trm#4>gW+pMnC=WC0YJb0t,(4>4$mcJ3U$br];FL@-k-Fj?gXmq/;,f@9X&mde.Z0-JFg#E+aP9/__Gfr$\M.)LaTA0";so$Ijs&_4`6_-WRX0*%=.X]lbSq4X(1#@r:^_t6![3L=BRbq!@JYK#J*d3PIufToPGLS7l51PG1CXIP:m8[_84q4Fr>D@Up=,jV+IZ:t_P%N0A\s^IaT""cp=TVAY@6u6M6;5ZU<>/iY$EcK=DY1Bh!<&Bof.dE8btJ',Jb^k%u$'\!qRNG8KUl!MnFk!b)EcV_@6$^OMR+r1D+7sfGf"@3#>\%XHGC4em()pGj+0g)l]9fd)f)>nN6euLD#.fSEmW$^LsP@CZ;>k1&,>`6FiaaoIa@&kl*c)*oj@6Ka:LtL9d\,TrHd3`1WP&1a!P.IN>q)B'fJ-#:7d_1"fetS/Co5*F5^(Y?G>obe)*Y=XKB+@$*p?&G7Lk'd=?b;mD.%%$XRZN=4/=,uO1%E[<1QK<>EHhiKmrg;:Mur%[1LZ>a6Va]jcBj#n_4mLH^9`.8HS,lndc5>"'/%^^[%!#'^,'YQoU^kJ0!5OWI^hKOnX0Ns@RWfD4cciUd6U,L\"Uj&fQVn^./slW*Y[a#g]t7UA!-:UfaS4OI)8PY!E@E5"s'n@geR#"KXG9NUn^p]+4s#75"A4sL,/ro556A52rj001?ue!A**muVDs?CBe[S)'f\"%U""38%Crh:b;IN`5:-qu%YnM*Zlj'<"s1?(Z.5eD?#%S96)?2kL1O2N:Z%,b3$O[-$+ai&M65K;9Vjd('"8ihSAYUMOTpXG'.->*7`O47EefE]-od^#BMM7'-o?S?D<]tXD!a.7Z[ge&infL5eep#UL'gUd7i67m[Y'g;EE@@'.j[!K/?*2SYP*mO[u(mKMGt/Nj(5EQ9-I(&5.p[RXYb>Ok8i=5[aEHK2b3(;>Lr86mbg0-:RU'/7XAVJJ6GqaWJ+:TU5:Hf:dP4a7G9Y'3MU$=hKm4g2M]dDr"F0#iYY]BL8@[;0gV!Pq,'%)2l_g0qNhL>o60I0]_!uRC1<>DCb-igJiE8Aj%d7+2,T+J`fb^65AS=G'mVQm0(,g?9Pm7TgQ?eg@HGo%T>BW1>)HIp2A8eH_[hL0/U\[>3/-m>t-WcXFqPYi`W7f%t_Q)?4FnVM??>nbPjA$?B3Yd-U2pn+`uQbQFudmJd2gk[2#OOd+"HK6fK)!ARAdo=b4I9cHqj3r`an)pf')eQJa48]?nU#k?1%,R#/.4/"r1c#eUAkt<.GEN]O@.1%$,##ona>rJ/7(^D"U+e`5INKt$8X0_n$0bE[7^&872sCDHa`n5OP7@pKN3"e\1Cl:>Yh?F\r2;>G_,H>@$afVVmfQt2)@8rf,"f^!:!'(Mb#5QAS/qOh"/JfC;XMu@a$_7,,1U<8'2%]p5$E`a,^?8QZc%pkQkp6UDccBM*jX$V\rdXG:Nd%[`0mU.=s?V'M80&k+>Iu;UeDT*tj$TYu@:Nd60esa]/$;k[aMjrMLOQB?*&`3jr`9PJn"4mJoWC:uY&8_[m.6@R1;&_MTmRU?q5Y*;"5[!ukaSi$t.U_!X;.#>eD33ohoXWX[V`,Z8b&1FsB-2D[[]7QJQ^,p6)2S6JcZ6,c:!OOicZA2one'T>Tu"UPTo"K5]N!76sp$nrp^5D?$[DT7e`m:@PXU7N5s3V4.6;_hek#$bdC+>41]R?o#IJVadVPfj/gXSl&ua%AX:$j!k1YXjTr^O0jS-+L@Im/S"9LXI4H!C8t-V%fjC"@,C@OMXj_6j+/(9gD)lT;lp4,%>+%(m-*k$47W%WE,7`(hOTtJg$9a@?HpbQ6;t)@#0\3Ja\5r&(<$:LNk*R"U]BHQj+m4N";\9rA_;\G7msTr6D$/]a+af'aSrY@Ye23-n'lUM@)m$LkN[*Qgi;hV\a1pZn)!6[Yl7epR!!kO]l")O&p+-O)#tjo^%>u9hPcUKGmWR5+g>j&.0J81-`_&<'-l$AC&aN<`'tcr,GA`=Q&u4NiO/L-,PZgtWO='s#^5D"Sm-i>Z!LRP4Y*k"_@7L;0>s-p,g<=@1[N",=cej-aX&aZ?q4V,C^/66i^g..Sd\Cr3L.X4/M#A%+OZ\'F,A%[4q4j@Wfl6ks:\9cg=SXoXInJrQ&$p*%68!2s(9&=ZH#(NH.GGfbeoXMhS+qs^WMk#kTZCFeO5uD2K/'7LE4S[EI44RbfM[P0_@KNqICp@j[4mD"&S^q91T[5)Ai5X'hbGq9I0a$[?KTrLC,5n0eF#CH^fHcoOS%M?%uI7FRD1"%#lnGa:r`.4P#*lZoSU.;2@%sEOd-$#`(Uk@mLf*"a&e5lC8H]_nC$c3ALhKaaqN;#IMSH][&`"B%X'Yps$L__Ne:luk/+C$76_IE^4e`=X,k2c"sr\t+5L>!i/kR7NSihQl"&J1s?:67XaVa4SW2Y7Oe_5W$4PR**q_/5u.1$`nCos1QQmp8R$j9'F&d,^`07'C^gVY`>Tg0"2d$l\)p2%[c?pA*eEOLTG-UGdZC8ZJ59HC:_42U50daZZEGG"]&S%u5B4)Hl-sM0YEYMBqID;1L`ir68G-OXOs>k]D'd[p[Ym_M`3^F@AGTgrQXU#P/0k)`j9D=GN'$-!.bmOp;,ep8/FN=S&ZkDb9cK"C0KA#:ru[Qfc\U%j\d%e2&VnuDup>ucl^pBT9CGu@/#B_&#Ac'5VER6Qu:4m5K37oP?94t(qmd@gNn7]YCEu__kdhO`@0"iZ7$\!1GnKhNFp8t"$TR=W@B,kdsT#l658&C=)h3!Io:3=;rH4rat,+@FNP?@Ztqoj[m2r_aReP!H>Z$tQ%n?N`O]'-tX1`3@WD,0^Zj0MDQWJjf.6U!lF;'G+!DO8E$:d,glsjl,.XYlTCqe5InA&Ch'<&CNrd^i:R'AjsMVW+\H?"V=U90PPm(L\;aA*[D-p+TqlM$?oo>:j!6gJ[2d0p:-/+4:o:Motl88O5:2uWVrD;hOcKP.8UOXLVb6Cf3io4XsgBFLD&pmf.33o:Fs0A85!;&;:TTYj@"&c_MX1+GQ+f]Tdsm.Z.3!U&K!,>b3=Poo-jDUY!#+p7VU3I6_jT%Q="%J>\;66AE?Jh72R.n$8Y/iU.rO]T#)HBcV`biN:&ko&L&>KL/R*$*"Sj80EKu#a$;2,$:*tO@!I_OED0BH!*?q!t'5&!Nscba&]:SUj-L:fnpK(/DqXl#Dl:S,^LL=[*l4=(5$f_g))/6[7)dXJV2`SD)uWpbGZ7?K>F/GA<)2Q0HP55l/OK-W7qur+V`XF."G$bg*lD?=[\)tPNaZjL3$_8G1N6#WZEO96al;%cZdFEmom*\3TgYcd'p,m[mf4<_P&aEf)Q3\OS;l4'G1JGDI*h\]H7+0SEDU&N_/WHO8hhE5+lmLXm<&g2'WS>?4Ek[sfBBf68=crFD['EZ'L,>=e/*Pc.Hk@0P$b'g8Q?=85L?\CRNf@U>,6_Gm\J^a\lP2rW",e_fD3'mGmJLGi)DFUY>p$k^8AK@WYZ-GH^!-=s\5q["?h*hbrkH<`*odgYGpf^Y^-UER;6nj%"np-#8O3t6I'+4KMPWg>5Bhbs*9S;b=*kbk'8Si^8*hM"4r>'_[kup[mCa&H2$d>mAZ1B"K/Hnh%Gp\7oWS@$^,h!s0l]p10Na(hGOpUWtPg=YME-hKc\!g9.OXS5s.0ln:J[*EtnTT`Y/<1iKE*3jI%LPah#_ZT:qlKkd,1bI*gu'gc)_[*7$9gQKK7JA\/*$C\n+J&V\0#(88$dm/.ai"8U),,o)"J$$M-(mEVFYke)k/#A%oN/qp5`/1*N)-/7-i\SeeSf+^`e->l@#8QTN!'UBHVWB;(5X==rneA3?&"P$IT4l*n.m86\D%SHt`r'fHk\\^?jHXO01sQB%MHChm!)UVl2bp4j'K(KH?3#p-THWhKYOa(ia[3)jqUG&H8t#4!odE!9]l?'QOd*SZ3RComAs`rn$L%m6f"VIF16rPaC?[P/u!0@tXR+kd6(1paE-l_QnUCWl@^H/DR*`':tcZYTQNq*%uLQ&aUmJg[/*U?4,u@3o>NA]XYa\.e0_W!>XgiqWGi1qH8N(K90snHX9.5B=<>69@9P"H,V'?:EW_=ZU%\"OnQZ#4aX37=S-hq@;BSt+A:I*6sT7U%%/;H6LBK9dBA)!VR@lQ#N[GAh!dDh'Wo3Tk)`1iHJ-N1pMa11p6<_EJL'&UGJ'ND#/Ltm@%?Jjq#05)`iUA$gIOQ'DUpB,cL=DDR(HETXms;_or*F2%kRuBQOdmWZ)Ug6u[RghHl4H>I\@GPlRSWDfufRA@X[+@47q?b*"2i)Uo((Rugp1qQdK^Q;ThOLI3pW#T7],N>TPofL+g-I0UFVqoeiJ"*;.Md4^5P@SJt?3['NF`m/f"*>8+O_s@oM,1b4>.9X`o#&Zu-g?>B0)^1SN+mL^Oi7&XLZ3^QJi.8X]Qc*;(+(lbDrD36O1X8@bcaGgL6"1+0%8%.Ybj.G3"+gf2YR['YcgHhAFKF5h[M6VHE46Fu?Z=$K]9sc^FL^YR53(p>Pt9uJ-ldcd(n-E[\D]/\0H)k;"&UjMM[T4jgnu0etZg*7,Atr'slZ0Hn.r5]N@jWPK@s9`%;"a@b(h@6T3X\f`^08Yra&dgN9cO\gfF%r-m3f7NH2=&O,qO#D@'IU,OnQG?D6-0>TIiV`QBj@F+`6!U(P`]+O]t;nF#Y%P>)!cdf*u@am+pd$,J:X,CX&P?)UjpG)S]PV/S.=5]af$N(rrU*a\5rEC3N-H^N5jLr@$WMjOf-"TE*X:dR@TbG-kho6U9\,jMUmIFnq(;AEoeU$D$"t1-:7MZFG3A5kH=H8Z@'_+%]d`'X8"FJoK$)TWk\Jm%`>iRHiYH>^*SI5DaREolZ1>WSuDkR<:c6-]InAX`9W&D45IYnE,P*,9b/"eBO8Sqd^uK=oKLc)Lk8:9N'gb$/P6%oBndc2*cgt":upYP+\0T13`ZtrRjacr(g4'0G4KoU[&Qth$0=VX(%`N&l8;%$O0h9SUfcPe1!TiBiYfWnZ1CR905i[,1Rt#;tDa0a7#MIJpk4slui4q<*\EY*_TQq*#r7OVKp^.PX84I^h5j!m7Uis;a2u/1Q9$@!a[LZ_Q@17t\R&[M:;Z\)'Z=PZs'M5VcYSFd$@n__r"eCA=,%2<+.U%+:h+m/=`dS@`!mfRc)&/16O)ETu^Z7=J0L?c9?ljmq"*IHOBL*it%%N.h0h4J3U#(@]GU`1@%HqIt)l)N8JTCR<@OK/\s*=Vpn\O*)2X+eDc]Y;,=0/,.d!^PJS,MEFMMSrPMK/ORjMo3!!0_*50?;`^T^KuL.39'+^cT7.-oW5#HXMFqrnCdqL#cU";.B\cn:0g+C'=^J%$$G.l:=)cAbJBo>L6@T3LJ1-jE$2T^Kq)E+uH#1"WkrY5PtfJ6,Qf";ffkM,c?S]A_'$OuE#Rkim:6Q6I8sG20IM>JL_^=I'-Fb,S;=h]JK@kR-$6l45RVF"0[OD]n9*6n:a]2@-8Mrn(,st6<5nl^c1fP2E'%8ZMN2oBH79(c;1^+<+eP*n]9N=La:dYm"9`[YD'#bSb0a(MN3e!,[WE51>e>,N&%tc9<$3G_3j)XH#'&!m]F^jQ.22f9(:eMmk/Rbai>6"hc[I7EfBSeH*k'ADJ3G7*(EY9`M`X:Zkn.(2A3XQ6)Cr>/C(4ZZGM2Pl*(,*8i^C8iF_;\3Oh-.HDGroMeFQ^f_DJsDW'LCp-F(NZ]iBC)kAoP"ZEr'1q_R&en=hj=Lb.fZ^]7,a0Ar'#>B=%JO6d9WQa.D,F,rR,*`6l_@D&`lJKe(A8+'q?!A#0laH7X5`REUQM4:6n2T6=u'ZYb/XQ23/*_*aZC82c=3l[>5iOb%PM:"c.OMfIJm.J;bJ`+OB#!3c6"K+g*GFic^Yr7T=Gn;P?qhrrt%Ye\:QK(]I`//bU17,r>BHtYKj>\4:%HQ!3QIN2OH=Uio'LlB&S#D-X1C.SD@OPrT$&/q-YoLDBLb%u^^i'D/j3e]I'%feq0kLMSV4`Zs-3UX]_ZIcnLo'Q/#&cd8#WkZ/(-;Wg]Zh-s6g>2<_7,3]W!rjTU%gVlnnC]7`ql(?X0M+-RY0XJ(=TN7an!_fCsNW2MmE]\JsR,,RPiMdG=f(TTj#FW5U%V^(K=0/`oTGRg<#Hup]CU&-94m!\.2&hYZX"IkJ)!,I[@%a)tb]s$PNOG>SkbJ2&/bQDtjmHL1^40Tt&qd58cS&Ha:W!)kTd&<%GfIt!/`"7#"R*"uETnGe^.q:[M`?8+rY*G(IsU3N+Dbu[-TgLf'[fqBP]7HtO!Th,;V*6(K@G_4"T/,7:#VLA"-Dp4XPQt@I,c/g(:347_R$$uFn@(XJEIi!=+SNa-;U#T@N`ub0J-KEB,D%^QZU"SZoF6(ftiHEW$h8^#ln5sl%)X!&`*:R[HG=Q,^3S]B*4AN#i1_=DVWh.`,B*LV<_2_"rFDG![N1[*P%Y]p`??d>)+J5N2G:YN]bSVIQKPMJRY212/8Re#GbGHuW/1%NR%@:UZaS.W5P+*JYAY>pc`'fKK"+tL)bu(ei*N(mCON`V6b;+\OUg7GqJg1qH(W]S(G-H@DX%Ka`M[Y+>.d5f<'>2lUJ`H-\&I]0l:U5/MeUd!^eWLkgU8d,?=DJ29r*P[)WpLA1J!Q",]1Tqmq1KH=Kku(En#6UQB0L_;f1Lj9caj^7]1C.d1)&';#Kq57!gBZDY2ro_%$eb8L^Z)USpbH'77K]8`d(/KII/gq7((#!LP_oVM+O$??;`5"eB4Q[:Ch2Z.tS?LfQ%K@cdX9JWt\[?<\^f]+IrI!YFoiU2;n^"J_;3nmFlZt;5Aj?=u6Kgpl#=c3G^,=!1Ga:[1rX?W0fTuTTDo=g_d*11n=AXI(P@[S&d:d8(A-/!9"6]"PB>GBPE+KX/4k'W11k[rSIj!LhRDe+?KR73Hs8;KMt;G7j@%.iA_l(RYhB:+K-K?9Fi.^OBq,oGr1Tr$A_TM]cB3;g"*]hn=QorHH0DmSfl*KJI[c(333g[&fU0Yg96rFW#uM?TMltA+\o<0:Dc3#U4=4)TAY1mr6gg+0a^a\,W3QrVeYq?Rl!DP,ON#bmIl3lLmSM(3Y<5i"ofnNM3=#OV5BW;-jYN9QmimkJ7N@_TVNK98-/Qtr8@kI_:'9[:;`mW6+.dsgb`te`0c)7CPdBTH93s,BfZa&A@)Q#K%AKBB8d\0NH1IHSEf\b(:J8n0&\dd+sV;(6Li.](`>^b7[$AkH`TMd`h1,@E44*'o,73lC!MS7isjRHf.7oSMQ;BNF[\6nq*'/JCJm3&Uj\T-cZ0`-'%t+HF#mic>cWED7;1N[fC>L1hVPYYn.o:.0q-Td^^d-/k+8866G3&4*E'^[GLEnAeAf#;>!3174>T*.U@:c6epkdu.RRQ>JE6Z?+#sZ`I_3AHrdDNUZ)O6Pr2Xj'SFIeDk((a`lN$%V>&%994\$RiKW&iDZad??K\YCq?_]&=C&"aho&KENh_'#FagMlGT^n=_@E$lQp*Pj:&I_o4kg!C;e^lir\t\DD*&qp"U%72%]m$l,nqb6$7jQ;j6(!Hde_;b3Q;j[j:A%X]2C.Wl8'E3p2BJ[_g?Z[Y;RmeMp64Z"l)*2e%s[B&s5T@haLh'HLsgg01dFl60N!O/EoBBtm5Pcd*p7XW,0AcB_[P1iMfU[rn]9(e)Im=gH!s#lt&*V's$oMq,YkSMS=,qo93n_n[McVTcf$f]I`!P=kCXDXs88KEO@C,n]FP!dhp!?M^J_Ypu)%;LKIJJ3omB*]:W-RgKgr,lT/[U/)3@D)Ut\Ummkb/pGuulpHn[$R!Z1.8_YEl3s:F=5@A,?7J/?_EZGp0UR1T1S@W6u3^[nI96=3%la)A_f$Qt-L<*HD_['L2;!FP^NnMu)1e)2[P_Y1g1t3cf6P`.+'2eSC8JV]Iq%R+enN%EtJc!DmaS?65YqQ,hTbJS70po_#R^:Zf!o\0ECajf1GUKMFb(G=@mA&fuSO&!t4QuTGdb4R8kZb9N*,TH,dQgJbTD#=Y4U(e&"\2L+gTtt:aCeVAapaQAPQe/Y=CRRX17l"6eRsu^+4rK,VSCI6VZ$"Bb?QCGgB1+.r5<&Blmc/5&N7AVAEJ0GUojq)../H>#;M:;@fJVFIj/4]P&Z1]Pq-aW<@'3S$ZZe"Gb=OB^a'iPn;krMSHu4IMB;5pu;2Y_7>:A$k(k#VC24haV7ad9;<(5ZWF]BYa_ATp6Y^<#!Wn%#$Nk8qbX!`^,IQd/E`jO%Fc.L>1%rFN!!tA*0BqDk)AMTd'^l%bJ/e$?pg@RZU7e?HP)I;Qql*Z>Bm5$S.F#XeWR?cqj9'qCZZ]^p?Zl3+e['/#rV]*9iBf:+E6[[[3]LCkVadsp#fj9>7"p0(9"B>0Z\RI;9,*qf1A,AL8+o.Mn(,tUlnIZ,dAF(TcSIOCQ>Bt2f*7bF,5]]X^^a,7gP?TmM1TeR\B8Ns*f>P31(83b-\s?kbLd*<>!&\26!nkTFYq(Nh!,J6"YqDQ6=BITdPf07.LVT"3U:b$a&FtD:8rtL:T$DD4*H`kd@kCGFLm&^+;Pr1t)Bu1lXkXm5kRTo-bh0Rile]e<+uj?981#0*5:Xj6B87VqK/u_%+c"mu-k.E'#8<4`Rk;m\*h]8k;,XHMlQP(olg(K4C4$(?.FLWW\8$.Q6PNX^XuKF:FC,G"4TNA!8rcgrKqhcm,^@E1JF(#UUr]96lq5^&lp>AF5MKWWfR;G;pkp$_F@=15GM*8GAse@*pip>lph(N=D3"d'@a/Ce,%./_hY#*!OiB6D4S"sSHKQlcB4Y-QQ#h\=FHM/1PqobaQ7oc0Fd#XcRa6hgL30AP@6/XmHjj\1EVh(AT*ct=8oArTVsMnan@@/>09+[&>]]&KN];`-*q%llS.*=#nN:7A0!jc.lT'sS44e".6g33^Bm(!EA20`r*J7,8/1r6t)C%GJQUqdB@"IScb!qo"f@kUnXD&R&"K2nm_UOH.,p0Q(Tu;,SUC1hc08_:"lG'r=.@$?AXE$p_;/_RW1<9#MM6c4p%\XJ3TnV4F_J(*$fU!'%oKKh=cB2=Kip8)bQ_'Db0%jL7g>T_`$W.jG[R_&GIFkJ22>r]L(.u+W_h0#F\SpXPTWO7;NiXVKH>jn8F,?UF>l&MSq]b))_\!9Pi0',PULBj(ilL;A=\8JLkl??aX`$2aSnf/W_*sboDj8H2&*ERJP+?B!'q&"_^J331(Zb]$Ep3@Koao9Eb_\83Y:16I%*N(8>@C;BB'jY^*V?okf2p#^-*Y9^VE"4DB%Y".5MZRCtJPL'*N/(;O1[_nIE[iZ37"Hb*Ff,.;g,a70*'&Ld(R\F>XRQr&(2i"Srbrugbl>^M':M@S?.*nt44tu'Mni4!c.Ni>\MPp=dDVO#L9[[4:"ImVX;($7QJg79_alfmka;NYg>;7)ZS."'qE&`D@_3;7@_X4">\<0*CD4Q_k1%jp%;I3j?2dNk(@O2l/)6gB&NUG1HJ>jB>!p`:)79_4'VO=;Tmu'Z$6+$A/g1+o><(-3o,KC`BZR``LPs\MDI23e:Lrb3ck/G^0=YA`uE8lHsPN$XO+aU=:.\;.!FN.9)i^C;63f!]XML=,Cbu;)$%>PE3Z@[a,=J\WS,m?Vd+/paM%<')P7fbopK`_Hg=ib!*KKfHh57cK2WP*+F,p-JR:>&;QI1%Jo&N`i?[6a#uJEFG3)trp@>#YY;(`o.219.Rb;40r7;QFs+Yd;,_R$\MD'.MUl[]ELnHl\pNi7;N+f=a[RW%30%"h,0.[\Dj.1P'0`X$R?%fhYT!D?a4Tbn>A2amLU%OZkk+9Y1/ds?21nHVKRqq@"*"Q1"ud._ZMHd+4!")\6QEI!!E96n\X1-0&"nAcYH\V"I35%(dS>q@iI5e>WV)$-7RRfE3J%&OF7_YsarPt;i(PP'.EWX8+Io]I#ng#`;SjKL+[oU(.76g;B+J3Xo8QJ7$"MS(.87\FZVlip/2g/)EA!"h$LRBKt6fA-L,X.su]rV=dV5n@`j!a96@.",?*$s83!/1s3mX$+P\&C/O:d(I3gjkrJ!bJrK>'V_M,@<"],K;"C4c2N]=RNf-SH#&Ch4N7ng#H>O+T;oIUXC2%+OE?+Q*,b^\n$,.JP*@.=!+qm\Tb:c@L]SCp,(LpF.Z0r=&t4ZRJUh2E!Z0p"9*t)hWRu'lH'JsO18Gd@leXp`ra?Ss7\VUb6@X-to@c1s8='l?Gh.F%m%PF![[/!q647I#Yi;>+")LA'.=S)s[`^t'5a@*p)P[.]U8)t5RO]kU5fa:T:KN`W]%$mu5R2.:]>,OO[LgQB,+(gtuQt#VOZ)IDX059:V!\gLuPbZ6,V'KG'nN6-&4#R1`(4r\I@o-RL&:1fH(L]n9(a4hJ9*p+LUcAR7fPL?a\62)7^lIdrJD1]Nm'Z)u8SK=KpV]9Ml8Pt6`=g?D!?#cc-U.Gg+Y[Sc9>P^W.'j=qVV5mGOO[`,/sp"hoUejsp\TQ\D)KS*KeUcE6'+Gg9lUlI'H++ST"IY12ikaB56^r.X!U"!tR[kcae7fot\'-&$4K=XT]q4/n<\_?nJB4Rs%1/(Ysg_h&W6)C:%O&L::M*tK?\:Jm28F0eQ9K-+g)MAim-s4a+mD'!a(GfeM.&UEnfOCYqU;e2bj&FYtP3JeGZDFrj-=7M8";o\5"Oh0f"pqWG)Dj!!K0Ig+;aoHa(NklX_O(5H6J+"QUc-'$]tlid4-?bd1J5/;F#<`-9_6/%qDV[5$_@O8MjeetDfn_9[;Tn7'UF!V8e88N*;"MJ7k4USUL*O]XP:d_F8+PK1q=?-)>JOp"a:KSZYCtp9Ke1(3"ZYMLI%CUFY_*f[GG^ipk"H.8=*B4`V)$Ym4K9.sM:uH(6Ku+92'FhbYTdhR!C6?XbF_a-eNj(.1rAC(!6eH`r&gA@qn2AckF;6)$ML]YkZ$?B@5f%Or0T[.b@bYV!HkN!>Sdn/^$`\<2+o\E+e&Dm6pF1?uQ^@WU@n&F+O6nH))RR<<(0AfI(&ZV2:+i.$:%:D_c[KM)@A^W3c@ojtMbU+^RXV#bJ;a*dC6$EU"-FTf6hZl?%1S5rfs97`a/Q3hWPUa=64X$Hh3`/71'G&]S24&*'Nj.HTIGk6-R1R!I7.52^>ENAiAi2u;?$OAR*ZS5R-NA;Om.;?&G.?&4be0=0e+%I.m@EfHRdhMo:Gb/C]hL6-'GQj&lBHq499ZIKs*F4`Wd\*ZjF^eXOAA<.0=LZV7hO"'n/o&u&K#jdQ^I(:lQebIF_da2"OT(653s3bA>?$?/;.l&#Llcj8VaF0,?GNGo.=RI8=iGP$!H_X"RT";^Q^8>_HfF9nb8\>(g3E;7[qgR0t]dm,2X43#c?d=Dd#WU1?SIbYEO.6gHbQ0>VpeTK[(%-ujZMq`J($)U(P@d\^\$475s=enK2&i5cs,RN4qGG+i8`d%2_qWC"73T?Q,&8Ps%SF@5T>kj`T?(:HL5E=KRq:@>Qc$[X)0_dE;i8#fPG5W_Q0>kW.J^.V,!"HNMXQ>2O_\<C,jX,JT;%qSB+^Xf\cK0GeajW32qWdAW*_CeR>s=`P2rcNNC1OJJa]qYg@=G$@H(\\/h\qi*Y&;94Uot3f9O;-aeu7P`9"K#/(EF30*'.@TLm(:4;'7h.,0=qt/apnI'L&6hT!)aj8>V]Tem6[I=$!u44]C3k)>J6bhU>C?+UbgEcuTupDh1=B,Z'ZWt,2Rs/c/'-(@9>Ra,[=d8ul<=M?=,F(:\?KeR,?4$CNL,l9#1#Y?fX>Fp"Wd7N&_bG)(o$hbE4.5hSWc%NKQIIpQZJ^n$MJ0EIibK`\jj6U]R[r&`cUk'lX7HJRAr8r93sMMuNHG\,=q^KOJn\;Y@BCLsdB;]8BM>%/d45]T]eQDGtS<%KZAMT=!mH3E\;AV>BY<7sYHDH;X.@Ciqo#g,RbH'jj8E^YTc"r-!dO]g\lKh48`WE6H>HI'*l'Xi*cm4/cS]64t0*CTQ6VPHaZ@TL\r/&ZWMIl3gm9%R[.h_N`:QA?Zo7870R;Cql*@)0Q]#YH$iTGP1Jn@6k;YlJr6RKnB.#?,K)i5C@O0JRk`U*-+t8Pmh8m@DTOR,6k[k3XQ3\/I9<>jC=s4M."gCBc2fN6TB6pJ^9'TB.Hs1D'l[0Kn]-p*(tR]D'm0:JuJ>@H@1qU/[/-H/J\?dEPnEaZ!:I<`R:BO08Pm8G@*f@@\b=M]5;9a7boi4ujR[?W*^#IqJ+:Xh@Yr!X;'%VXQ/;B"j_:b+Muk2bZ(\j&oB#nif=W1X4@GKIVVn%n8MrG?0"?^qL`2@5=VYUm@XWP5A$$,J7$66?ZQ'oiZ>0,S*7lDshDM2]\s8gq10knJ5ZblsKhgJ1Et$$nW2cVRZhEdVa)WEoE@(0i"Yu#q]\qc4@oS9BOf-:LKsQeVO,Ehn66l^s`]"YT/n`aoH3j.Rhda\PjUMsPUNMg@.Udd8E(q@;A#>H",nK:@kp@QDBK9+$-(0\J:mrK%*bj>!c-6ru<60#nWNkfnPDJ6.10?f4m\;4I>bo*,*=H"6g1`!^n1?h''iL5cUplWtS)^TKj]-n:8bCfB\$E(bq.<@/r1Dk#/3s8Wq5,0bXmK3.=uZ9S\mJR%*i@#RPsQfF-%-_<*^2;B::,5Qjpm844Hq#_MWIBqcq<7!s2RZG//mm?"ioL`bK=ciLpJ1pdfY]-_6pK2b5IV$e_+1(b]4ikETo0<&$/&5>DM+V5c6askDY_@^`0:Q0kd$/I"R6M\c='b0+gO[,oM.4BPo[;O?TZjJPh*t[&+kn&)n&sG/nd*+;hSVg:mYA6MO?"I5h1_X8/g3-(2Ln']13!eZ:SKOd?IQ:#le6s'h^DWY_pJH-F?&#;;le!(5FiBq+4bH>/[N=%=;Pb@TT\sf>J+)0/l?S--4t=Ba5JqGC-*FIKH3P2UNm9b22]=q-/%B:ceH;^VU"b2Y0?AV_EB$>kk!as@cY6J4k[Fk9EpUHlWqCj:()Z8MG3@_-Eqs2JFch_V`];t2*W9WC%@h`Z#J`rl!j\4!sJ5LDeP4si1T0/JXie1i#(eo?E(C+B>H)#LL%/uJF)BFp*14?56j53!jgISW'Vp;!q>o5:jd=1*S%J[X*#E2rOKV]2//gD]=@?"R+6?=(VEIs6@($F^MKcbjkd==M?8Kgqr'.QR:4-)S:3t+tO<8?ZWi'macLI_^^N1*FocS5$p#Ef&iLXQSOkQ:lqC8*eb:R'j#SQYpNI_A#+fH$r4T70cP+Yr9TN#1+E(Gk+@)LWBMj85m(Z75g!">3)2Tfcd#lf-`m)C*W=LD9#=tU='.uM=>AJG.d#rhIPNd]hYrd0V2WktL`;L=.&7JlG!F8iX$eE'e(Em!)_7Q.Vl[mX35&461\WcaI9.%sJuX^@]54OJQ$$nre%XVYer*sJ$^B#Y%>/=B9G0^k6(nuSBHpQpQu/B&]Li``Yn;[=\LEp^lL'pKb:nkh.&U=W^1R8kekjrMWh=92US>b4lChpc!>*)IUO-`B=Bq&.NU<*ZiSGjJ:=]G&+S0k%g5i/ZccbdD_>-E>H95*1%%&$A.J.X[^^\Tpd"e;kmQ,6;BJcoDiXt4uk<0-NC_.:2(uNj5Ni!'`*>QJkKr^uJii^q9r;(u'WcLl_q4G[VtMb#"Qe;+9-W6)^Ot4;+iC)ad%*;-plnRcauJ9Y3=l#F*o/Q@]aRO?5T`-LeO=&/,;4*hd->'O2a!9^2nN240)!K>=QJq>g?6H&.55@M7!`5X3Le9?XOo0Cj_D6rY]`uE.*?Vs"5V`sK,m>lDRCg)%coib)N\K4?L'^8"5d[NPHHJ$.6D'q&`:f!7a]3P6J11e2DqdD@7S-c,JruFnVPso3OJS7N(-Xr.^coi&&)Z"YGSk^VJsfHt6@Y/u=Sa^0(U%BQi+W1C8G7i5[cBY5pQJ<++5*cs@']PuFH9Fq1`?H]O_JJ9Wa]A[V[-`4%VO#SflC/IKGl\q#RFdH@LdKpUa3DD2pA/nE93q/)o3mr(%,;f4V5L4-5/V5kHY?AZ1dC3.@7`)\eh_:W5&P43I8T%"*&mFARst9@f-NhSjE\J&9I3X-.>s/Gkb[.#V9N8jPD,3PPY$J!c^?+QjB5nE_"YL)Rt$!(jhpZ\0L^PIGt%f2+[i>V68qU`*p48PYpO3.PZRkYL1fI6c4*cjTW1#jOct$tVHK+S&QX,q+ADe:b)::$45WO.=lp,PeVf<&@$5F7eKK1_i.2BH85[_TAUp>[b;"fa/*0:n#TIn7c9dKgESW=oj%oe'$S$"TsN>W;amr8jhfdSS)l-R0.2Y`Z-,[:mt*`g3YNl5pGD0q9Hr_30%YAReQ@tZgjr\`'rgeEU1=q"T?PS!?iFW7dL#!*d+dp8BdE6_9)>T*CI_@UnqJtd^I`"24#,oDI^-mASha74L1HElU[QE="l6NPrm6t[$+4+VsHEdZP(I1\N<;%=_Xg%!QtT5;F-IQE#G(;9B8;BR%1N+_'*`i$r;,SM$frL]H`WkJ?K+rk*G46bAS;g'0+P_-R`IB#l=pN]!@,O"tp%gaG"n*]0"CB=k!X`+A-3h;j2@W%eo#OuebGb`7OJ3sicfb)s%<\@;l$Y>Rg%)+32:qu.](ot(k]_bVi/lrG3=RjHW**>/qgRF0p4&_6^Ure2cgL=QB@6^NGPjRQ^]#.`So=#jp9Sdgli3$rqS.ftr][OXs%i7`J%OkA5Q1Pphu3*En,IlEjm@P`J)1"3`T6bsJ=+=ecNp!EH@lo]Q&8:cHi(%XU0YO$1];tE5u@2`$!6uP=oH`t^LY"?;%]qZ'm#31gu($ZAn-qjKe._?^+oY,Nj&,-i!2eJY_P(Hl9kG9:QXfh0l_pHQjA^KICu'tjPNaX0sc]0rZMK09%G:AgT:`]BHQaEO>!&PAJ^,H`qdJP`P_Ulr&RRl"p,Bf4"'Pp[PMZk.#:B]MM)FSTgW*96E1=`fni'FjPE<%%fX8WG$&10(g5auBoc,KXEjk#GH5XdFq3%7;/8U"TQ9n_o3qRsaYhp[DCnh=T\DBPV*mdp:ESP3s"oeLXT*[F=5)E.Wf3gq9(u=P[m^fD_.>k%jf93>Xc,5uc9-2I(78hkZrU4LV,f)TOXi:_1LtR,gHql/7@#(WHd?l4T)J2+5i#Q<`g@R#ir)f7#,1Ogiea8f^4"F(R,3Ligi*Hg]&jeV1MCmM$rYQo%87\H9$a:ZHS+D>VEU;TaD'j$:'K3JH;bdRL2H:PTL:u%n%fA8PC99R+L]T4(8i*,GTCDgI@(SM2b/5<)D,NbN__CK!ED6H1PJDmK@;_ql4X8,oNV8Y+XBJZB=RX*ALL6?>G7fD=L$oUB5$E>TMW?g4]Yu:".Q9G_[X3dA.^&74OF2bMCu@j#(kDoJ?7'nnZVeH+UYADjMf&2#B]!bq0:ip2F]o[!t2jB&#Cde=M@6WYYu6KLOBJdR-Q5GV_'Q#l.n19YNBqa0r@o[rt^O3V]4MT!JI[!JSp"S*T4Olm,1Ok[QIZP6YrAqLWX$4mCg`p-.r,"[a^o)IEn)CW7l*T6#GR-[EB'@Id'+c)g?!i_uU5P\-j2uC3'7EK[K*bpJU*"3?^5]X(HhL\i=*/UWFYVmTX#hCGfO4M_Pm!`^T1LWZh-+Vh19+oiho\'1,jb!\@]h7IO.*dTOHfRDjnEJQp?9,a%cBm)]F'I[(<=;OeF'K!G8d-I\1JAs.7.!T[V[8N7oR5hZTB'c;2:J8HQ2.D,qKI#]ruH(/BJO=ER5Ca1O1$5gG_\^-F='!O)lt1On$cd=^@uO(s(6b1ruo2*k^WA?pU0`:5O2a:dm*Y!*-8FK3H^j%`R?an4S)fq)9b5iMdbHWAVe=oH+i)*MT-6^*ce-&QpmNJ, # ===>END WOOF<=== From b43e2f91902ce161e62934c58c863e4c2be95366 Mon Sep 17 00:00:00 2001 From: Mathieu Lacage Date: Wed, 5 Sep 2007 16:28:55 +0200 Subject: [PATCH 10/18] add failing test and fix for assignment to self --- src/common/packet-metadata-test.cc | 14 ++++++++++++++ src/common/packet-metadata.h | 23 +++++++++++------------ 2 files changed, 25 insertions(+), 12 deletions(-) diff --git a/src/common/packet-metadata-test.cc b/src/common/packet-metadata-test.cc index e3e61c45e..edca62626 100644 --- a/src/common/packet-metadata-test.cc +++ b/src/common/packet-metadata-test.cc @@ -217,6 +217,7 @@ private: template void RegisterTrailer (void); void CleanupPrints (void); + Packet DoAddHeader (Packet p); bool Check (const char *file, int line, std::list expected); @@ -430,6 +431,14 @@ PacketMetadataTest::CheckHistory (Packet p, const char *file, int line, uint32_t } \ } + +Packet +PacketMetadataTest::DoAddHeader (Packet p) +{ + ADD_HEADER (p, 10); + return p; +} + bool PacketMetadataTest::RunTests (void) { @@ -659,6 +668,11 @@ PacketMetadataTest::RunTests (void) ADD_HEADER (p, 10); CHECK_HISTORY (p, 1, 10); + p = Packet (); + ADD_HEADER (p, 10); + p = DoAddHeader (p); + CHECK_HISTORY (p, 2, 10, 10); + return ok; } diff --git a/src/common/packet-metadata.h b/src/common/packet-metadata.h index b193093f9..12223a4bb 100644 --- a/src/common/packet-metadata.h +++ b/src/common/packet-metadata.h @@ -306,24 +306,23 @@ PacketMetadata::PacketMetadata (PacketMetadata const &o) PacketMetadata & PacketMetadata::operator = (PacketMetadata const& o) { - if (m_data == o.m_data) + if (m_data != o.m_data) { - // self assignment - return *this; + // not self assignment + NS_ASSERT (m_data != 0); + m_data->m_count--; + if (m_data->m_count == 0) + { + PacketMetadata::Recycle (m_data); + } + m_data = o.m_data; + NS_ASSERT (m_data != 0); + m_data->m_count++; } - NS_ASSERT (m_data != 0); - m_data->m_count--; - if (m_data->m_count == 0) - { - PacketMetadata::Recycle (m_data); - } - m_data = o.m_data; m_head = o.m_head; m_tail = o.m_tail; m_used = o.m_used; m_packetUid = o.m_packetUid; - NS_ASSERT (m_data != 0); - m_data->m_count++; return *this; } PacketMetadata::~PacketMetadata () From fd8b0ba57d90c8a10dfb63af4b406ad4d8b5368b Mon Sep 17 00:00:00 2001 From: Mathieu Lacage Date: Thu, 6 Sep 2007 11:18:35 +0200 Subject: [PATCH 11/18] an euclidian distance is always positive --- src/common/buffer.h | 14 +++++++++++--- 1 file changed, 11 insertions(+), 3 deletions(-) diff --git a/src/common/buffer.h b/src/common/buffer.h index 229a040fd..f412a419c 100644 --- a/src/common/buffer.h +++ b/src/common/buffer.h @@ -69,7 +69,7 @@ public: * to the same underlying buffer. Debug builds ensure * this with an assert. */ - inline int32_t GetDistanceFrom (Iterator const &o) const; + inline uint32_t GetDistanceFrom (Iterator const &o) const; /** * \return true if this iterator points to the end of the byte array. @@ -502,13 +502,21 @@ Buffer::Iterator::Prev (uint32_t delta) NS_ASSERT (m_current >= delta); m_current -= delta; } -int32_t +uint32_t Buffer::Iterator::GetDistanceFrom (Iterator const &o) const { NS_ASSERT (m_data == o.m_data); int32_t start = m_current; int32_t end = o.m_current; - return end - start; + int32_t diff = end - start; + if (diff < 0) + { + return -diff; + } + else + { + return diff; + } } bool From 0147e59899c3dadc72e46a6a00e34fedff5ae1b5 Mon Sep 17 00:00:00 2001 From: Mathieu Lacage Date: Thu, 6 Sep 2007 18:19:22 +0200 Subject: [PATCH 12/18] move include to implementation file --- src/node/packet-socket-factory.cc | 1 + src/node/packet-socket-factory.h | 1 - 2 files changed, 1 insertion(+), 1 deletion(-) diff --git a/src/node/packet-socket-factory.cc b/src/node/packet-socket-factory.cc index 3cd403a1a..74d74a8f4 100644 --- a/src/node/packet-socket-factory.cc +++ b/src/node/packet-socket-factory.cc @@ -20,6 +20,7 @@ */ #include "packet-socket-factory.h" #include "node.h" +#include "packet-socket.h" namespace ns3 { diff --git a/src/node/packet-socket-factory.h b/src/node/packet-socket-factory.h index 0f052ce6e..7d7468052 100644 --- a/src/node/packet-socket-factory.h +++ b/src/node/packet-socket-factory.h @@ -22,7 +22,6 @@ #define PACKET_SOCKET_FACTORY_H #include "socket-factory.h" -#include "packet-socket.h" namespace ns3 { From 0824ceacd96b8ff90a4416dcc2a719de8f2d5f93 Mon Sep 17 00:00:00 2001 From: "Gustavo J. A. M. Carneiro" Date: Sat, 8 Sep 2007 19:24:39 +0100 Subject: [PATCH 13/18] WAF: as suggested by George, add a bunch of helper waf scripts that call the toplevel waf script, so that it is possible to compile with ./waf from emacs regardless of which buffer you are visiting (the other alternative is to install waf system wide and run 'waf'. --- .hgignore | 2 -- examples/waf | 1 + samples/waf | 1 + src/applications/waf | 1 + src/common/waf | 1 + src/core/waf | 1 + src/devices/csma/waf | 1 + src/devices/point-to-point/waf | 1 + src/internet-node/waf | 1 + src/mobility/waf | 1 + src/node/waf | 1 + src/routing/global-routing/waf | 1 + src/simulator/waf | 1 + utils/waf | 1 + 14 files changed, 13 insertions(+), 2 deletions(-) create mode 100755 examples/waf create mode 100755 samples/waf create mode 100755 src/applications/waf create mode 100755 src/common/waf create mode 100755 src/core/waf create mode 100755 src/devices/csma/waf create mode 100755 src/devices/point-to-point/waf create mode 100755 src/internet-node/waf create mode 100755 src/mobility/waf create mode 100755 src/node/waf create mode 100755 src/routing/global-routing/waf create mode 100755 src/simulator/waf create mode 100755 utils/waf diff --git a/.hgignore b/.hgignore index 96ea69ce7..d5b25104e 100644 --- a/.hgignore +++ b/.hgignore @@ -7,5 +7,3 @@ build doc/html.* doc/latex.* .lock-wscript -.waf* -waf diff --git a/examples/waf b/examples/waf new file mode 100755 index 000000000..191b7dbb2 --- /dev/null +++ b/examples/waf @@ -0,0 +1 @@ +exec "`dirname "$0"`"/../waf "$@" diff --git a/samples/waf b/samples/waf new file mode 100755 index 000000000..191b7dbb2 --- /dev/null +++ b/samples/waf @@ -0,0 +1 @@ +exec "`dirname "$0"`"/../waf "$@" diff --git a/src/applications/waf b/src/applications/waf new file mode 100755 index 000000000..3dcf598bc --- /dev/null +++ b/src/applications/waf @@ -0,0 +1 @@ +exec "`dirname "$0"`"/../../waf "$@" \ No newline at end of file diff --git a/src/common/waf b/src/common/waf new file mode 100755 index 000000000..3dcf598bc --- /dev/null +++ b/src/common/waf @@ -0,0 +1 @@ +exec "`dirname "$0"`"/../../waf "$@" \ No newline at end of file diff --git a/src/core/waf b/src/core/waf new file mode 100755 index 000000000..3dcf598bc --- /dev/null +++ b/src/core/waf @@ -0,0 +1 @@ +exec "`dirname "$0"`"/../../waf "$@" \ No newline at end of file diff --git a/src/devices/csma/waf b/src/devices/csma/waf new file mode 100755 index 000000000..4283ec141 --- /dev/null +++ b/src/devices/csma/waf @@ -0,0 +1 @@ +exec "`dirname "$0"`"/../../../waf "$@" diff --git a/src/devices/point-to-point/waf b/src/devices/point-to-point/waf new file mode 100755 index 000000000..4283ec141 --- /dev/null +++ b/src/devices/point-to-point/waf @@ -0,0 +1 @@ +exec "`dirname "$0"`"/../../../waf "$@" diff --git a/src/internet-node/waf b/src/internet-node/waf new file mode 100755 index 000000000..3dcf598bc --- /dev/null +++ b/src/internet-node/waf @@ -0,0 +1 @@ +exec "`dirname "$0"`"/../../waf "$@" \ No newline at end of file diff --git a/src/mobility/waf b/src/mobility/waf new file mode 100755 index 000000000..3dcf598bc --- /dev/null +++ b/src/mobility/waf @@ -0,0 +1 @@ +exec "`dirname "$0"`"/../../waf "$@" \ No newline at end of file diff --git a/src/node/waf b/src/node/waf new file mode 100755 index 000000000..3dcf598bc --- /dev/null +++ b/src/node/waf @@ -0,0 +1 @@ +exec "`dirname "$0"`"/../../waf "$@" \ No newline at end of file diff --git a/src/routing/global-routing/waf b/src/routing/global-routing/waf new file mode 100755 index 000000000..4283ec141 --- /dev/null +++ b/src/routing/global-routing/waf @@ -0,0 +1 @@ +exec "`dirname "$0"`"/../../../waf "$@" diff --git a/src/simulator/waf b/src/simulator/waf new file mode 100755 index 000000000..3dcf598bc --- /dev/null +++ b/src/simulator/waf @@ -0,0 +1 @@ +exec "`dirname "$0"`"/../../waf "$@" \ No newline at end of file diff --git a/utils/waf b/utils/waf new file mode 100755 index 000000000..191b7dbb2 --- /dev/null +++ b/utils/waf @@ -0,0 +1 @@ +exec "`dirname "$0"`"/../waf "$@" From e377cbad38b1acc6b19c83c9312b174d7489aaa6 Mon Sep 17 00:00:00 2001 From: Tom Henderson Date: Mon, 3 Sep 2007 14:55:51 -0700 Subject: [PATCH 14/18] Provide two new Ipv4 convenience functions: GetIfIndexByIpv4Address() and GetIpv4RouteToDestination (), and align global routing code to use the first function --- src/node/ipv4.cc | 47 ++++++++++ src/node/ipv4.h | 14 +++ .../global-route-manager-impl.cc | 93 ++----------------- .../global-route-manager-impl.h | 4 +- 4 files changed, 69 insertions(+), 89 deletions(-) diff --git a/src/node/ipv4.cc b/src/node/ipv4.cc index f99675e25..9578d4c8a 100644 --- a/src/node/ipv4.cc +++ b/src/node/ipv4.cc @@ -18,6 +18,9 @@ * * Author: Mathieu Lacage */ + +#include "ns3/assert.h" +#include "ns3/node.h" #include "ipv4.h" namespace ns3 { @@ -32,4 +35,48 @@ Ipv4::Ipv4 () Ipv4::~Ipv4 () {} +uint32_t +GetIfIndexByIpv4Address (Ptr node, Ipv4Address a, Ipv4Mask amask) +{ + Ptr ipv4 = node->QueryInterface (Ipv4::iid); + NS_ASSERT_MSG (ipv4, "GetIfIndexByIpv4Address: No Ipv4 interface"); + for (uint32_t i = 0; i < ipv4->GetNInterfaces (); i++) + { + if (ipv4->GetAddress (i).CombineMask(amask) == a.CombineMask(amask) ) + { + return i; + } + } + // Mapping not found + NS_ASSERT_MSG (false, "GetIfIndexByIpv4Address failed"); + return 0; +} + +bool +GetIpv4RouteToDestination (Ptr node, Ipv4Route& route, + Ipv4Address a, Ipv4Mask amask) +{ + Ipv4Route tempRoute; + Ptr ipv4 = node->QueryInterface (Ipv4::iid); + NS_ASSERT_MSG (ipv4, "GetIpv4RouteToDestination: No Ipv4 interface"); + for (uint32_t i = 0; i < ipv4->GetNRoutes (); i++) + { + tempRoute = ipv4->GetRoute (i); + // Host route found + if ( tempRoute.IsNetwork () == false && tempRoute.GetDest () == a ) + { + route = tempRoute; + return true; + } + else if ( tempRoute.IsNetwork () && + tempRoute.GetDestNetwork () == a.CombineMask(amask) ) + { + route = tempRoute; + return true; + } + } + return false; +} + + } // namespace ns3 diff --git a/src/node/ipv4.h b/src/node/ipv4.h index 76d88faea..dc5e146bd 100644 --- a/src/node/ipv4.h +++ b/src/node/ipv4.h @@ -29,6 +29,7 @@ namespace ns3 { +class Node; class NetDevice; class Packet; class Ipv4Route; @@ -273,6 +274,19 @@ public: }; +/** + * Convenience functions (Doxygen still needed) + * + * Return the ifIndex corresponding to the Ipv4Address provided. + */ +uint32_t GetIfIndexByIpv4Address (Ptr node, + Ipv4Address a, + Ipv4Mask amask = Ipv4Mask("255.255.255.255")); + +bool GetIpv4RouteToDestination (Ptr node, Ipv4Route& route, + Ipv4Address a, + Ipv4Mask amask = Ipv4Mask("255.255.255.255")); + } // namespace ns3 #endif /* IPV4_H */ diff --git a/src/routing/global-routing/global-route-manager-impl.cc b/src/routing/global-routing/global-route-manager-impl.cc index 42c63b9b9..c2b7021c9 100644 --- a/src/routing/global-routing/global-route-manager-impl.cc +++ b/src/routing/global-routing/global-route-manager-impl.cc @@ -1088,83 +1088,10 @@ GlobalRouteManagerImpl::SPFCalculate (Ipv4Address root) m_spfroot = 0; } -// -// XXX This should probably be a method on Ipv4 -// -// Return the interface index corresponding to a given IP address -// - uint32_t -GlobalRouteManagerImpl::FindOutgoingInterfaceId (Ipv4Address a) -{ -// -// We have an IP address and a vertex ID of the root of the SPF tree. -// The question is what interface index does this address correspond to. -// The answer is a little complicated since we have to find a pointer to -// the node corresponding to the vertex ID, find the Ipv4 interface on that -// node in order to iterate the interfaces and find the one corresponding to -// the address in question. -// - Ipv4Address routerId = m_spfroot->GetVertexId (); -// -// Walk the list of nodes in the system looking for the one corresponding to -// the node at the root of the SPF tree. This is the node for which we are -// building the routing table. -// - NodeList::Iterator i = NodeList::Begin (); - for (; i != NodeList::End (); i++) - { - Ptr node = *i; - - Ptr rtr = - node->QueryInterface (GlobalRouter::iid); -// -// If the node doesn't have a GlobalRouter interface it can't be the one -// we're interested in. -// - if (rtr == 0) - { - continue; - } - - if (rtr->GetRouterId () == routerId) - { -// -// This is the node we're building the routing table for. We're going to need -// the Ipv4 interface to look for the ipv4 interface index. Since this node -// is participating in routing IP version 4 packets, it certainly must have -// an Ipv4 interface. -// - Ptr ipv4 = node->QueryInterface (Ipv4::iid); - NS_ASSERT_MSG (ipv4, - "GlobalRouteManagerImpl::FindOutgoingInterfaceId (): " - "QI for interface failed"); -// -// Look through the interfaces on this node for one that has the IP address -// we're looking for. If we find one, return the corresponding interface -// index. -// - for (uint32_t i = 0; i < ipv4->GetNInterfaces (); i++) - { - if (ipv4->GetAddress (i) == a) - { - NS_DEBUG ( - "GlobalRouteManagerImpl::FindOutgoingInterfaceId (): " - "Interface match for " << a); - return i; - } - } - } - } -// -// Couldn't find it. -// - return 0; -} - -// -// XXX This should probably be a method on Ipv4 // // Return the interface index corresponding to a given IP address +// This is a wrapper around GetIfIndexByIpv4Address(), but we first +// have to find the right node pointer to pass to that function. // uint32_t GlobalRouteManagerImpl::FindOutgoingInterfaceId (Ipv4Address a, Ipv4Mask amask) @@ -1216,17 +1143,7 @@ GlobalRouteManagerImpl::FindOutgoingInterfaceId (Ipv4Address a, Ipv4Mask amask) // we're looking for. If we find one, return the corresponding interface // index. // - for (uint32_t i = 0; i < ipv4->GetNInterfaces (); i++) - { - if (ipv4->GetAddress (i).CombineMask(amask) == - a.CombineMask(amask) ) - { - NS_DEBUG ( - "GlobalRouteManagerImpl::FindOutgoingInterfaceId (): " - "Interface match for " << a); - return i; - } - } + return (GetIfIndexByIpv4Address (node, a, amask) ); } } // @@ -1693,6 +1610,9 @@ GlobalRouteManagerImplTest::RunTests (void) srm->DebugSPFCalculate (lsa0->GetLinkStateId ()); // node n0 Simulator::Run (); + +// XXX here we should do some verification of the routes built + Simulator::Destroy (); // This delete clears the srm, which deletes the LSDB, which clears @@ -1703,7 +1623,6 @@ GlobalRouteManagerImplTest::RunTests (void) } // Instantiate this class for the unit tests -// XXX here we should do some verification of the routes built static GlobalRouteManagerImplTest g_globalRouteManagerTest; } // namespace ns3 diff --git a/src/routing/global-routing/global-route-manager-impl.h b/src/routing/global-routing/global-route-manager-impl.h index 739e20592..923caf400 100644 --- a/src/routing/global-routing/global-route-manager-impl.h +++ b/src/routing/global-routing/global-route-manager-impl.h @@ -754,8 +754,8 @@ private: GlobalRoutingLinkRecord* prev_link); void SPFIntraAddRouter (SPFVertex* v); void SPFIntraAddTransit (SPFVertex* v); - uint32_t FindOutgoingInterfaceId (Ipv4Address a); - uint32_t FindOutgoingInterfaceId (Ipv4Address a, Ipv4Mask amask); + uint32_t FindOutgoingInterfaceId (Ipv4Address a, + Ipv4Mask amask = Ipv4Mask("255.255.255.255")); }; } // namespace ns3 From 5e7e0d7b2a6e35ffd57504a3794fdee30a03be14 Mon Sep 17 00:00:00 2001 From: Tom Henderson Date: Mon, 3 Sep 2007 23:32:23 -0700 Subject: [PATCH 15/18] Fold the two patches for bu6 69 together, building on the bug 65 patch --- src/internet-node/ipv4-end-point.cc | 7 ++++ src/internet-node/ipv4-end-point.h | 1 + src/internet-node/udp-socket.cc | 65 +++++++++++++++++++++++++---- src/internet-node/udp-socket.h | 1 + src/node/ipv4.cc | 5 +++ src/node/socket.h | 1 + 6 files changed, 71 insertions(+), 9 deletions(-) diff --git a/src/internet-node/ipv4-end-point.cc b/src/internet-node/ipv4-end-point.cc index 69faf523e..42cb45e37 100644 --- a/src/internet-node/ipv4-end-point.cc +++ b/src/internet-node/ipv4-end-point.cc @@ -42,6 +42,13 @@ Ipv4EndPoint::GetLocalAddress (void) { return m_localAddr; } + +void +Ipv4EndPoint::SetLocalAddress (Ipv4Address address) +{ + m_localAddr = address; +} + uint16_t Ipv4EndPoint::GetLocalPort (void) { diff --git a/src/internet-node/ipv4-end-point.h b/src/internet-node/ipv4-end-point.h index f606aa63b..dfd0e6c57 100644 --- a/src/internet-node/ipv4-end-point.h +++ b/src/internet-node/ipv4-end-point.h @@ -37,6 +37,7 @@ public: ~Ipv4EndPoint (); Ipv4Address GetLocalAddress (void); + void SetLocalAddress (Ipv4Address address); uint16_t GetLocalPort (void); Ipv4Address GetPeerAddress (void); uint16_t GetPeerPort (void); diff --git a/src/internet-node/udp-socket.cc b/src/internet-node/udp-socket.cc index a2bde3224..a9b063a2c 100644 --- a/src/internet-node/udp-socket.cc +++ b/src/internet-node/udp-socket.cc @@ -20,6 +20,8 @@ */ #include "ns3/node.h" #include "ns3/inet-socket-address.h" +#include "ns3/ipv4-route.h" +#include "ns3/ipv4.h" #include "udp-socket.h" #include "udp-l4-protocol.h" #include "ipv4-end-point.h" @@ -147,13 +149,25 @@ UdpSocket::Close(void) int UdpSocket::Connect(const Address & address) { + Ipv4Route routeToDest; InetSocketAddress transport = InetSocketAddress::ConvertFrom (address); m_defaultAddress = transport.GetIpv4 (); m_defaultPort = transport.GetPort (); + if (m_defaultAddress.IsBroadcast () ) + { + NS_ASSERT_MSG(false, "UdpSocket::Connect, can't connect to broadcast"); + } NotifyConnectionSucceeded (); m_connected = true; + if (GetIpv4RouteToDestination (m_node, routeToDest, m_defaultAddress) ) + { + uint32_t localIfIndex = routeToDest.GetInterface (); + Ptr ipv4 = m_node->QueryInterface (Ipv4::iid); + m_endPoint->SetLocalAddress (ipv4->GetAddress(localIfIndex) ); + } return 0; } + int UdpSocket::Send (const Packet &p) { @@ -162,8 +176,33 @@ UdpSocket::Send (const Packet &p) m_errno = ERROR_NOTCONN; return -1; } - return DoSendTo (p, m_defaultAddress, m_defaultPort); + return DoSend (p); } + +int +UdpSocket::DoSend (const Packet &p) +{ + if (m_endPoint == 0) + { + if (Bind () == -1) + { + NS_ASSERT (m_endPoint == 0); + return -1; + } + NS_ASSERT (m_endPoint != 0); + } + if (m_shutdownSend) + { + m_errno = ERROR_SHUTDOWN; + return -1; + } + m_udp->Send (p, m_endPoint->GetLocalAddress (), m_defaultAddress, + m_endPoint->GetLocalPort (), m_defaultPort); + NotifyDataSent (p.GetSize ()); + return 0; +} + + int UdpSocket::DoSendTo (const Packet &p, const Address &address) { @@ -173,7 +212,7 @@ UdpSocket::DoSendTo (const Packet &p, const Address &address) return DoSendTo (p, ipv4, port); } int -UdpSocket::DoSendTo (const Packet &p, Ipv4Address ipv4, uint16_t port) +UdpSocket::DoSendTo (const Packet &p, Ipv4Address dest, uint16_t port) { if (m_endPoint == 0) { @@ -189,19 +228,27 @@ UdpSocket::DoSendTo (const Packet &p, Ipv4Address ipv4, uint16_t port) m_errno = ERROR_SHUTDOWN; return -1; } - m_udp->Send (p, m_endPoint->GetLocalAddress (), ipv4, + Ipv4Route routeToDest; + if (GetIpv4RouteToDestination (m_node, routeToDest, dest) ) + { + uint32_t localIfIndex = routeToDest.GetInterface (); + Ptr ipv4 = m_node->QueryInterface (Ipv4::iid); + m_udp->Send (p, ipv4->GetAddress (localIfIndex), dest, m_endPoint->GetLocalPort (), port); - NotifyDataSent (p.GetSize ()); + NotifyDataSent (p.GetSize ()); + return 0; + } + else + { + m_errno = ERROR_NOROUTETOHOST; + return -1; + } return 0; } + int UdpSocket::SendTo(const Address &address, const Packet &p) { - if (m_connected) - { - m_errno = ERROR_ISCONN; - return -1; - } InetSocketAddress transport = InetSocketAddress::ConvertFrom (address); Ipv4Address ipv4 = transport.GetIpv4 (); uint16_t port = transport.GetPort (); diff --git a/src/internet-node/udp-socket.h b/src/internet-node/udp-socket.h index b3674f7ef..332e679d7 100644 --- a/src/internet-node/udp-socket.h +++ b/src/internet-node/udp-socket.h @@ -62,6 +62,7 @@ private: int FinishBind (void); void ForwardUp (const Packet &p, Ipv4Address ipv4, uint16_t port); void Destroy (void); + int DoSend (const Packet &p); int DoSendTo (const Packet &p, const Address &daddr); int DoSendTo (const Packet &p, Ipv4Address daddr, uint16_t dport); diff --git a/src/node/ipv4.cc b/src/node/ipv4.cc index 9578d4c8a..d7c83d42a 100644 --- a/src/node/ipv4.cc +++ b/src/node/ipv4.cc @@ -74,6 +74,11 @@ GetIpv4RouteToDestination (Ptr node, Ipv4Route& route, route = tempRoute; return true; } + else if ( tempRoute.IsDefault () ) + { + route = tempRoute; + return true; + } } return false; } diff --git a/src/node/socket.h b/src/node/socket.h index c717ec0a5..fb62fdca3 100644 --- a/src/node/socket.h +++ b/src/node/socket.h @@ -58,6 +58,7 @@ public: ERROR_AFNOSUPPORT, ERROR_INVAL, ERROR_BADF, + ERROR_NOROUTETOHOST, SOCKET_ERRNO_LAST }; From 929e23b74e247b58429ae2f844de86a04299f0a0 Mon Sep 17 00:00:00 2001 From: Tom Henderson Date: Tue, 4 Sep 2007 21:26:54 -0700 Subject: [PATCH 16/18] Fix for bug69: set local address correctly upon UDP connect; apply correct UDP connect() semantics (that sendto cannot override addresses on a connected socket); if destination is IPv4 limited broadcast address, convert to subnet-directed broadcast and send out on each interface; provide example csma-broadcast.cc script --- examples/csma-broadcast.cc | 159 ++++++++++++++++++++++++ examples/wscript | 4 + src/internet-node/arp-ipv4-interface.cc | 5 +- src/internet-node/udp-socket.cc | 46 ++++--- src/node/ipv4-address.cc | 17 +++ src/node/ipv4-address.h | 14 +++ 6 files changed, 229 insertions(+), 16 deletions(-) create mode 100644 examples/csma-broadcast.cc diff --git a/examples/csma-broadcast.cc b/examples/csma-broadcast.cc new file mode 100644 index 000000000..1cb9faa75 --- /dev/null +++ b/examples/csma-broadcast.cc @@ -0,0 +1,159 @@ +/* -*- Mode:C++; c-file-style:"gnu"; indent-tabs-mode:nil; -*- */ +/* + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License version 2 as + * published by the Free Software Foundation; + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + */ + +// +// Example of the sending of a datagram to a broadcast address +// +// Network topology +// ============== +// | | +// n0 n1 n2 +// | | +// ========== +// +// n0 originates UDP broadcast to 255.255.255.255, which is replicated +// and received on both n1 and n2 + +#include +#include +#include +#include + +#include "ns3/command-line.h" +#include "ns3/default-value.h" +#include "ns3/ptr.h" +#include "ns3/random-variable.h" +#include "ns3/debug.h" + +#include "ns3/simulator.h" +#include "ns3/nstime.h" +#include "ns3/data-rate.h" + +#include "ns3/ascii-trace.h" +#include "ns3/pcap-trace.h" +#include "ns3/internet-node.h" +#include "ns3/csma-channel.h" +#include "ns3/csma-net-device.h" +#include "ns3/csma-topology.h" +#include "ns3/csma-ipv4-topology.h" +#include "ns3/eui48-address.h" +#include "ns3/ipv4-address.h" +#include "ns3/inet-socket-address.h" +#include "ns3/ipv4.h" +#include "ns3/socket.h" +#include "ns3/ipv4-route.h" +#include "ns3/onoff-application.h" + + +using namespace ns3; + + +int main (int argc, char *argv[]) +{ + + // Users may find it convenient to turn on explicit debugging + // for selected modules; the below lines suggest how to do this +#if 0 + DebugComponentEnable("CsmaNetDevice"); + DebugComponentEnable("Ipv4L3Protocol"); + DebugComponentEnable("NetDevice"); + DebugComponentEnable("Channel"); + DebugComponentEnable("CsmaChannel"); + DebugComponentEnable("PacketSocket"); +#endif + + // Set up some default values for the simulation. Use the Bind() + // technique to tell the system what subclass of Queue to use, + // and what the queue limit is + + // The below Bind command tells the queue factory which class to + // instantiate, when the queue factory is invoked in the topology code + DefaultValue::Bind ("Queue", "DropTailQueue"); + + // Allow the user to override any of the defaults and the above + // Bind()s at run-time, via command-line arguments + CommandLine::Parse (argc, argv); + + // Here, we will explicitly create four nodes. In more sophisticated + // topologies, we could configure a node factory. + Ptr n0 = Create (); + Ptr n1 = Create (); + Ptr n2 = Create (); + + // We create the channels first without any IP addressing information + Ptr channel0 = + CsmaTopology::CreateCsmaChannel( + DataRate(5000000), MilliSeconds(2)); + + // We create the channels first without any IP addressing information + Ptr channel1 = + CsmaTopology::CreateCsmaChannel( + DataRate(5000000), MilliSeconds(2)); + + uint32_t n0ifIndex0 = CsmaIpv4Topology::AddIpv4CsmaNode (n0, channel0, + Eui48Address("10:54:23:54:0:50")); + uint32_t n0ifIndex1 = CsmaIpv4Topology::AddIpv4CsmaNode (n0, channel1, + Eui48Address("10:54:23:54:0:51")); + uint32_t n1ifIndex = CsmaIpv4Topology::AddIpv4CsmaNode (n1, channel0, + Eui48Address("10:54:23:54:23:51")); + uint32_t n2ifIndex = CsmaIpv4Topology::AddIpv4CsmaNode (n2, channel1, + Eui48Address("10:54:23:54:23:52")); + + // Later, we add IP addresses. + CsmaIpv4Topology::AddIpv4Address ( + n0, n0ifIndex0, Ipv4Address("10.1.0.1"), Ipv4Mask("255.255.0.0")); + + CsmaIpv4Topology::AddIpv4Address ( + n1, n1ifIndex, Ipv4Address("10.1.0.2"), Ipv4Mask("255.255.0.0")); + + CsmaIpv4Topology::AddIpv4Address ( + n0, n0ifIndex1, Ipv4Address("192.168.1.1"), Ipv4Mask("255.255.255.0")); + + CsmaIpv4Topology::AddIpv4Address ( + n2, n2ifIndex, Ipv4Address("192.168.1.2"), Ipv4Mask("255.255.255.0")); + + // Create the OnOff application to send UDP datagrams of size + // 210 bytes at a rate of 448 Kb/s + // from n0 to n1 + Ptr ooff = Create ( + n0, + InetSocketAddress ("255.255.255.255", 80), + "Udp", + ConstantVariable(1), + ConstantVariable(0)); + // Start the application + ooff->Start(Seconds(1.0)); + ooff->Stop (Seconds(10.0)); + + + // Configure tracing of all enqueue, dequeue, and NetDevice receive events + // Trace output will be sent to the csma-broadcast.tr file + AsciiTrace asciitrace ("csma-broadcast.tr"); + asciitrace.TraceAllNetDeviceRx (); + asciitrace.TraceAllQueues (); + + // Also configure some tcpdump traces; each interface will be traced + // The output files will be named + // simple-point-to-point.pcap-- + // and can be read by the "tcpdump -r" command (use "-tt" option to + // display timestamps correctly) + PcapTrace pcaptrace ("csma-broadcast.pcap"); + pcaptrace.TraceAllIp (); + + Simulator::Run (); + + Simulator::Destroy (); +} diff --git a/examples/wscript b/examples/wscript index e5e771555..56c8797b6 100644 --- a/examples/wscript +++ b/examples/wscript @@ -14,6 +14,10 @@ def build(bld): ['csma', 'internet-node']) obj.source = 'csma-one-subnet.cc' + obj = bld.create_ns3_program('csma-broadcast', + ['csma', 'internet-node']) + obj.source = 'csma-broadcast.cc' + obj = bld.create_ns3_program('csma-packet-socket', ['csma', 'internet-node']) obj.source = 'csma-packet-socket.cc' diff --git a/src/internet-node/arp-ipv4-interface.cc b/src/internet-node/arp-ipv4-interface.cc index efe767531..17960c3f7 100644 --- a/src/internet-node/arp-ipv4-interface.cc +++ b/src/internet-node/arp-ipv4-interface.cc @@ -62,8 +62,9 @@ ArpIpv4Interface::SendTo (Packet p, Ipv4Address dest) Ptr arp = m_node->QueryInterface (ArpL3Protocol::iid); Address hardwareDestination; bool found; - - if (dest.IsBroadcast ()) + + if (dest.IsBroadcast () || + dest.IsSubnetDirectedBroadcast (GetNetworkMask ()) ) { hardwareDestination = GetDevice ()->GetBroadcast (); found = true; diff --git a/src/internet-node/udp-socket.cc b/src/internet-node/udp-socket.cc index a9b063a2c..39fd39ddb 100644 --- a/src/internet-node/udp-socket.cc +++ b/src/internet-node/udp-socket.cc @@ -153,10 +153,6 @@ UdpSocket::Connect(const Address & address) InetSocketAddress transport = InetSocketAddress::ConvertFrom (address); m_defaultAddress = transport.GetIpv4 (); m_defaultPort = transport.GetPort (); - if (m_defaultAddress.IsBroadcast () ) - { - NS_ASSERT_MSG(false, "UdpSocket::Connect, can't connect to broadcast"); - } NotifyConnectionSucceeded (); m_connected = true; if (GetIpv4RouteToDestination (m_node, routeToDest, m_defaultAddress) ) @@ -196,24 +192,31 @@ UdpSocket::DoSend (const Packet &p) m_errno = ERROR_SHUTDOWN; return -1; } - m_udp->Send (p, m_endPoint->GetLocalAddress (), m_defaultAddress, - m_endPoint->GetLocalPort (), m_defaultPort); - NotifyDataSent (p.GetSize ()); - return 0; + + return DoSendTo (p, m_defaultAddress, m_defaultPort); } int UdpSocket::DoSendTo (const Packet &p, const Address &address) { - InetSocketAddress transport = InetSocketAddress::ConvertFrom (address); - Ipv4Address ipv4 = transport.GetIpv4 (); - uint16_t port = transport.GetPort (); - return DoSendTo (p, ipv4, port); + if (!m_connected) + { + InetSocketAddress transport = InetSocketAddress::ConvertFrom (address); + Ipv4Address ipv4 = transport.GetIpv4 (); + uint16_t port = transport.GetPort (); + return DoSendTo (p, ipv4, port); + } + else + { + // connected UDP socket must use default addresses + return DoSendTo (p, m_defaultAddress, m_defaultPort); + } } int UdpSocket::DoSendTo (const Packet &p, Ipv4Address dest, uint16_t port) { + Ipv4Route routeToDest; if (m_endPoint == 0) { if (Bind () == -1) @@ -228,8 +231,23 @@ UdpSocket::DoSendTo (const Packet &p, Ipv4Address dest, uint16_t port) m_errno = ERROR_SHUTDOWN; return -1; } - Ipv4Route routeToDest; - if (GetIpv4RouteToDestination (m_node, routeToDest, dest) ) + // + // If dest is sent to the limited broadcast address (all ones), + // convert it to send a copy of the packet out of every interface + // + if (dest.IsBroadcast ()) + { + Ptr ipv4 = m_node->QueryInterface (Ipv4::iid); + for (uint32_t i = 0; i < ipv4->GetNInterfaces (); i++ ) + { + Ipv4Address addri = ipv4->GetAddress (i); + Ipv4Mask maski = ipv4->GetNetworkMask (i); + m_udp->Send (p, addri, addri.GetSubnetDirectedBroadcast (maski), + m_endPoint->GetLocalPort (), port); + NotifyDataSent (p.GetSize ()); + } + } + else if (GetIpv4RouteToDestination (m_node, routeToDest, dest) ) { uint32_t localIfIndex = routeToDest.GetInterface (); Ptr ipv4 = m_node->QueryInterface (Ipv4::iid); diff --git a/src/node/ipv4-address.cc b/src/node/ipv4-address.cc index 4e1e344c5..0b0a48f29 100644 --- a/src/node/ipv4-address.cc +++ b/src/node/ipv4-address.cc @@ -99,6 +99,11 @@ Ipv4Mask::SetHostOrder (uint32_t value) { m_mask = value; } +uint32_t +Ipv4Mask::GetInverse (void) const +{ + return ~m_mask; +} void Ipv4Mask::Print (std::ostream &os) const @@ -162,6 +167,18 @@ Ipv4Address::CombineMask (Ipv4Mask const &mask) const return Ipv4Address (GetHostOrder () & mask.GetHostOrder ()); } +Ipv4Address +Ipv4Address::GetSubnetDirectedBroadcast (Ipv4Mask const &mask) const +{ + return Ipv4Address (GetHostOrder () | mask.GetInverse ()); +} + +bool +Ipv4Address::IsSubnetDirectedBroadcast (Ipv4Mask const &mask) const +{ + return ( (GetHostOrder () | mask.GetInverse ()) == GetHostOrder () ); +} + bool Ipv4Address::IsBroadcast (void) const { diff --git a/src/node/ipv4-address.h b/src/node/ipv4-address.h index 6589edcf9..f473b57c0 100644 --- a/src/node/ipv4-address.h +++ b/src/node/ipv4-address.h @@ -119,6 +119,16 @@ public: * \param mask a network mask */ Ipv4Address CombineMask (Ipv4Mask const &mask) const; + /** + * \brief Generate subnet-directed broadcast address corresponding to mask + * + * The subnet-directed broadcast address has the host bits set to all + * ones. + * + * \param mask a network mask + */ + Ipv4Address GetSubnetDirectedBroadcast (Ipv4Mask const &mask) const; + bool IsSubnetDirectedBroadcast (Ipv4Mask const &mask) const; static bool IsMatchingType (const Address &address); operator Address (); @@ -151,6 +161,10 @@ public: */ uint32_t GetHostOrder (void) const; void SetHostOrder (uint32_t value); + /** + * \brief Return the inverse mask in host order. + */ + uint32_t GetInverse (void) const; void Print (std::ostream &os) const; From 0ac1983b661305222c93b7f33e346b7ed6741daa Mon Sep 17 00:00:00 2001 From: Tom Henderson Date: Sun, 9 Sep 2007 23:21:47 -0700 Subject: [PATCH 17/18] Add PacketSink application --- src/applications/packet-sink.cc | 116 ++++++++++++++++++++++++++++++++ src/applications/packet-sink.h | 88 ++++++++++++++++++++++++ src/applications/wscript | 2 + 3 files changed, 206 insertions(+) create mode 100644 src/applications/packet-sink.cc create mode 100644 src/applications/packet-sink.h diff --git a/src/applications/packet-sink.cc b/src/applications/packet-sink.cc new file mode 100644 index 000000000..4ed54ab50 --- /dev/null +++ b/src/applications/packet-sink.cc @@ -0,0 +1,116 @@ +/* -*- Mode: C++; c-file-style: "gnu"; indent-tabs-mode:nil; -*- */ +// +// Copyright (c) 2006 Georgia Tech Research Corporation +// +// This program is free software; you can redistribute it and/or modify +// it under the terms of the GNU General Public License version 2 as +// published by the Free Software Foundation; +// +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. +// +// You should have received a copy of the GNU General Public License +// along with this program; if not, write to the Free Software +// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA +// +#include "ns3/address.h" +#include "ns3/debug.h" +#include "ns3/inet-socket-address.h" +#include "ns3/node.h" +#include "ns3/socket.h" +#include "ns3/simulator.h" +#include "ns3/socket-factory.h" +#include "ns3/packet.h" +#include "packet-sink.h" + +using namespace std; + +namespace ns3 { + +// Constructors + +PacketSink::PacketSink (Ptr n, + const Address &local, + std::string iid, + bool quiet) + : Application(n) +{ + Construct (n, local, iid, quiet); +} + +void +PacketSink::Construct (Ptr n, + const Address &local, + std::string iid, + bool quiet) +{ + m_socket = 0; + m_local = local; + m_iid = iid; + m_quiet = quiet; +} + +PacketSink::~PacketSink() +{} + +void +PacketSink::SetQuiet() +{ + m_quiet = true; +} + +void +PacketSink::DoDispose (void) +{ + m_socket = 0; + + // chain up + Application::DoDispose (); +} + + +// Application Methods +void PacketSink::StartApplication() // Called at time specified by Start +{ + // Create the socket if not already + if (!m_socket) + { + InterfaceId iid = InterfaceId::LookupByName (m_iid); + Ptr socketFactory = + GetNode ()->QueryInterface (iid); + m_socket = socketFactory->CreateSocket (); + m_socket->Bind (m_local); + } + m_socket->SetRecvCallback((Callback, const Packet &, + const Address &>) MakeCallback(&PacketSink::Receive, this)); +} + +void PacketSink::StopApplication() // Called at time specified by Stop +{ + if (!m_socket) + { + m_socket->SetRecvCallback((Callback, const Packet &, + const Address &>) NULL); + + } +} + +// This callback body suggested by Joe Kopena's wiki +void PacketSink::Receive(Ptr socket, const Packet &packet, + const Address &from) +{ + if (!m_quiet) + { + if (InetSocketAddress::IsMatchingType (from)) + { + InetSocketAddress address = InetSocketAddress::ConvertFrom (from); + NS_DEBUG_UNCOND ( __PRETTY_FUNCTION__ << ": Received " << + packet.GetSize() << " bytes from " << address.GetIpv4() << " [" + << address << "]---'" << packet.PeekData() << "'"); + } + } +} + +} // Namespace ns3 diff --git a/src/applications/packet-sink.h b/src/applications/packet-sink.h new file mode 100644 index 000000000..dc3c7d41e --- /dev/null +++ b/src/applications/packet-sink.h @@ -0,0 +1,88 @@ +/* -*- Mode: C++; c-file-style: "gnu"; indent-tabs-mode:nil; -*- */ +// +// Copyright (c) 2006 Georgia Tech Research Corporation +// +// This program is free software; you can redistribute it and/or modify +// it under the terms of the GNU General Public License version 2 as +// published by the Free Software Foundation; +// +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. +// +// You should have received a copy of the GNU General Public License +// along with this program; if not, write to the Free Software +// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA +// +// + +#ifndef __packet_sink_h__ +#define __packet_sink_h__ + +#include "ns3/application.h" +#include "ns3/event-id.h" +#include "ns3/ptr.h" + +namespace ns3 { + +class Address; +class Socket; +class Packet; + +/** + * \brief Receive and consume traffic generated to an IP address and port + * + * This Application can be used as a receiver for packets generated by + * traffic sourcing applications such as OnOffApplication. The constructor + * specifies the Address (IP address and port) and the transport protocol + * to use. A virtual Receive () method is installed as a callback on + * the receiving socket. By default, it prints out the size of packets + * and their address. + */ +class PacketSink : public Application +{ +public: + /** + * \param n node associated to this application + * \param local local ip address + * \param iid + * \param ontime on time random variable + * \param offtime off time random variable + */ + PacketSink (Ptr n, + const Address &local, + std::string iid, bool quiet=false); + + virtual ~PacketSink (); + + /** + * \brief Turn off the logging output for the receive callback + */ + void SetQuiet (void); + +protected: + virtual void DoDispose (void); +private: + // inherited from Application base class. + virtual void StartApplication (void); // Called at time specified by Start + virtual void StopApplication (void); // Called at time specified by Stop + + void Construct (Ptr n, + const Address &local, + std::string iid, + bool quiet); + + virtual void Receive (Ptr socket, const Packet& packet, const Address& from); + + Ptr m_socket; // Associated socket + Address m_local; // Local address to bind to + std::string m_iid; // Protocol name (e.g., "Udp") + bool m_quiet; // Governs whether receive callback is quiet + +}; + +} // namespace ns3 + +#endif + diff --git a/src/applications/wscript b/src/applications/wscript index 02aa11f7f..760f76e18 100644 --- a/src/applications/wscript +++ b/src/applications/wscript @@ -4,9 +4,11 @@ def build(bld): obj = bld.create_ns3_module('applications', ['node']) obj.source = [ 'onoff-application.cc', + 'packet-sink.cc', ] headers = bld.create_obj('ns3header') headers.source = [ 'onoff-application.h', + 'packet-sink.h', ] From 7265a5f3c024ed178b03dc10873b95ed2cbb1de7 Mon Sep 17 00:00:00 2001 From: Tom Henderson Date: Sun, 9 Sep 2007 23:24:31 -0700 Subject: [PATCH 18/18] adapt some example scripts to use the new PacketSink --- examples/simple-global-routing.cc | 22 ++++++++++++++++++++++ examples/simple-point-to-point.cc | 20 ++++++++++++++++++++ 2 files changed, 42 insertions(+) diff --git a/examples/simple-global-routing.cc b/examples/simple-global-routing.cc index 75879be23..882e94e53 100644 --- a/examples/simple-global-routing.cc +++ b/examples/simple-global-routing.cc @@ -65,6 +65,7 @@ #include "ns3/ipv4-route.h" #include "ns3/point-to-point-topology.h" #include "ns3/onoff-application.h" +#include "ns3/packet-sink.h" #include "ns3/global-route-manager.h" using namespace ns3; @@ -151,6 +152,17 @@ int main (int argc, char *argv[]) ooff->Start (Seconds (1.0)); ooff->Stop (Seconds (10.0)); + // Create a packet sink to receive these packets + // The last argument "true" disables output from the Receive callback + Ptr sink = Create ( + n3, + InetSocketAddress (Ipv4Address::GetAny (), 80), + "Udp", + true); + // Start the sink + sink->Start (Seconds (1.0)); + sink->Stop (Seconds (10.0)); + // Create a similar flow from n3 to n1, starting at time 1.1 seconds ooff = Create ( n3, @@ -162,6 +174,16 @@ int main (int argc, char *argv[]) ooff->Start (Seconds (1.1)); ooff->Stop (Seconds (10.0)); + // Create a packet sink to receive these packets + sink = Create ( + n1, + InetSocketAddress (Ipv4Address::GetAny (), 80), + "Udp", + true); + // Start the sink + sink->Start (Seconds (1.1)); + sink->Stop (Seconds (10.0)); + // Configure tracing of all enqueue, dequeue, and NetDevice receive events // Trace output will be sent to the simple-global-routing.tr file AsciiTrace asciitrace ("simple-global-routing.tr"); diff --git a/examples/simple-point-to-point.cc b/examples/simple-point-to-point.cc index 4e7657cdb..4e92ad460 100644 --- a/examples/simple-point-to-point.cc +++ b/examples/simple-point-to-point.cc @@ -64,6 +64,7 @@ #include "ns3/ipv4-route.h" #include "ns3/point-to-point-topology.h" #include "ns3/onoff-application.h" +#include "ns3/packet-sink.h" using namespace ns3; @@ -153,6 +154,15 @@ int main (int argc, char *argv[]) ooff->Start(Seconds(1.0)); ooff->Stop (Seconds(10.0)); + // Create an optional packet sink to receive these packets + Ptr sink = Create ( + n3, + InetSocketAddress (Ipv4Address::GetAny (), 80), + "Udp"); + // Start the sink + sink->Start (Seconds (1.0)); + sink->Stop (Seconds (10.0)); + // Create a similar flow from n3 to n1, starting at time 1.1 seconds ooff = Create ( n3, @@ -164,6 +174,16 @@ int main (int argc, char *argv[]) ooff->Start(Seconds(1.1)); ooff->Stop (Seconds(10.0)); + // Create a packet sink to receive these packets + sink = Create ( + n1, + InetSocketAddress (Ipv4Address::GetAny (), 80), + "Udp"); + // Start the sink + sink->Start (Seconds (1.1)); + sink->Stop (Seconds (10.0)); + sink->SetQuiet (); // disable output from the Receive callback + // Here, finish off packet routing configuration // This will likely set by some global StaticRouting object in the future Ptr ipv4;