From 10bf021d7500985f2a45a31552d22ebd677ec04b Mon Sep 17 00:00:00 2001 From: Jeff Date: Tue, 2 Mar 2021 13:18:27 +0800 Subject: [PATCH] =?UTF-8?q?=E5=9B=BE=E5=AF=B9=E9=BD=90=EF=BC=8C12-4?= =?UTF-8?q?=E4=B8=AD=E6=96=87=E5=8F=82=E6=95=B0=EF=BC=8C=E7=AC=AC=E4=B8=80?= =?UTF-8?q?=E5=8D=95=E5=85=83=E6=A0=A1=E5=AF=B9=E8=B0=83=E6=95=B4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- data/ch_wireshark/sec_arp.tex | 37 ++++++++-------- data/ch_wireshark/sec_ip.tex | 45 ++++++++++---------- data/ch_wireshark/sec_tcp.tex | 45 +++++++++++--------- figure/chapters/wireshark/TCP-structure.pdf | Bin 45777 -> 45735 bytes figure/chapters/wireshark/ip-structure.pdf | Bin 20341 -> 20343 bytes 5 files changed, 66 insertions(+), 61 deletions(-) diff --git a/data/ch_wireshark/sec_arp.tex b/data/ch_wireshark/sec_arp.tex index 6b062c0..693184f 100644 --- a/data/ch_wireshark/sec_arp.tex +++ b/data/ch_wireshark/sec_arp.tex @@ -83,7 +83,7 @@ ARP解析的过程(主机A和B不在同一网段的情况请参阅课本相关 ARP请求报文中的发送端IP地址和发送端MAC地址为主机A的IP地址和MAC地址, 目标IP地址和目标MAC地址为主机B的IP地址和全0的MAC地址。 由于ARP请求报文以广播方式发送,该网段上的所有主机都可以接收到该请求, - 但只有被请求的主机(即主机B)会对该请求进行处理。 + 但只有被请求的主机B会对该请求进行处理。 \item 主机B比较自己的IP地址和ARP请求报文中的目标IP地址, 当两者相同时进行如下处理: 将ARP请求报文中的发送端(即主机A)的IP地址和MAC地址存入自己的ARP表中。 @@ -135,7 +135,7 @@ IP地址长度为4字节。每个字段的含义如下: \begin{enumerate} \item 通过Wireshark官网下载最新版软件,按默认选项安装。 \item 运行Wireshark软件,程序界面会显示当前的网络接口列表, - 选择要抓取的网络接口,双击开始抓包, + 选择要观察的网络接口,双击开始捕捉数据包, Wireshark软件选择网络接口的界面如图\ref{fig:c:wireshark_wireshark-boot-ui}所示。 \begin{figure}[!ht] @@ -168,16 +168,16 @@ IP地址长度为4字节。每个字段的含义如下: 显示过滤器支持若干的过滤选项: 源MAC、目的MAC、源IP、目的IP、TCP/UDP传输协议、 应用层协议(HTTP, DHCP)、源端口Port、目的端口Port等。 - 在显示过滤器栏中输入过滤表达式(图\ref{fig:c:wireshark_wireshark-filters}), - 例如下面的命令: + 在显示过滤器栏中输入过滤表达式( 更详细的显示过滤语法可以查看WireShark的官方文档 \footnote{ \href{https://www.wireshark.org/docs/wsug_html_chunked/ChWorkBuildDisplayFilterSection.html} {WireShark显示过滤器语法} - }。 - + } + ),例如下面的命令: + \begin{itemize} - \item \texttt{arp~~~~~~~~~~~~~~~~~~~~~~~~//显示arp协议报文} + \item \texttt{arp~~~~~~~~~~~~~~~~~~~~~~~~//显示arp协议报文,例如图\ref{fig:c:wireshark_wireshark-filters}} \item \texttt{ip.src == a.b.c.d \&\& icmp~~//显示源地址为a.b.c.d的icmp报文} \end{itemize} @@ -189,7 +189,7 @@ IP地址长度为4字节。每个字段的含义如下: \end{figure} \item 通过主菜单“文件”/“导出特定分组”(如图\ref{fig:c:wireshark_wireshark-save}), - 可以保存抓取的网络数据(也可以先选中某个包,只保存部分数据)。 + 可以保存捕获的网络数据(也可以先选中某个包,只保存部分数据)。 \begin{figure}[!ht] \centering @@ -198,7 +198,7 @@ IP地址长度为4字节。每个字段的含义如下: \label{fig:c:wireshark_wireshark-save} \end{figure} - \item 如果只抓取特定的数据包, + \item 如果只捕捉特定的数据包, 可以使用菜单“捕获”/”捕获过滤器”选定想要的类型 (如图\ref{fig:c:wireshark_wireshark-special-type})。 例如,选择“IPv4 only”,Wireshark只抓取ipv4类型的数据包。 @@ -226,12 +226,15 @@ IP地址长度为4字节。每个字段的含义如下: \end{figure} \end{enumerate} -\subsubsection{查看OUI信息} -查看本机MAC地址字段,查看OUI信息,搜索各厂商的OUI进行验证。 +\subsubsection{观察MAC地址} +启动Wireshark捕捉数据包, +在命令行窗口分别ping网关和ping同网段的一台主机, +分析本机发出的数据包。 +重点观察以太网帧的 Destination和Source的MAC地址, +辨识MAC地址类型,解读OUI信息、I/G和G/L位。 \subsubsection{分析以太网的帧结构} 选择其中一个数据包,点击Ethernet II展开(图\ref{fig:c:wireshark_eth-frame-detail}), -查看MAC帧的各个字段。计算帧的长度,并与Wireshark的分析结果比较。 -同时查看比较广播帧和单播帧的异同。 +查看MAC帧的各个字段。 \begin{figure}[!ht] \centering @@ -260,11 +263,11 @@ IP地址长度为4字节。每个字段的含义如下: \subsubsection{ARP协议分析} \begin{enumerate} \item 使用\texttt{arp –d}命令(其语法见图\ref{fig:arp-cmd}), - 清空本机已有的ARP缓存, + 清空本机的ARP缓存, 开启Wireshark,ping本机的同网段地址,在显示过滤器条框中输入“\texttt{arp}”, 观察捕获的ARP报文的各个字段,分析请求/响应的过程。 - \item 使用\texttt{arp –d}命令,清空本机已有的ARP缓存。开启Wireshark, - ping本机的不同网段地址或域名,观察捕获的ARP报文的各个字段, + \item 使用\texttt{arp –d}命令,清空本机的ARP缓存。开启Wireshark, + ping与本机网段不同的IP地址或域名,观察捕获的ARP报文的各个字段, 分析请求/响应的过程。 \end{enumerate} @@ -294,7 +297,7 @@ IP地址长度为4字节。每个字段的含义如下: \begin{enumerate} \item (20分)现场考核:Wireshark的基本使用。 - \item (30分)以太网帧格式分析:OUI查看、长度计算、校验和计算。 + \item (30分)以太网帧格式分析:MAC地址类型、头部信息、长度及校验和计算。 \item (30分)结合捕捉的网络数据,描述ARP数据包,描述ARP协议工作过程。 \item (10分)回答任意两道思考题。 \item (10分)记录自己在本次实验中所遇到的问题,以及心得感悟。 diff --git a/data/ch_wireshark/sec_ip.tex b/data/ch_wireshark/sec_ip.tex index d304c87..e89c6aa 100644 --- a/data/ch_wireshark/sec_ip.tex +++ b/data/ch_wireshark/sec_ip.tex @@ -54,12 +54,12 @@ IP和ICMP协议是TCP/IP协议簇中的网络层协议, \item \textbf{首部长度(4位):}该字段定义数据报协议头长度, 表示协议首部具有32位字长的数量,最小值为5,最大值为15。 \item \textbf{服务(8位):}该字段定义上层协议对处理当前数据报所期望的服务质量, - 并对数据报按照重要性级别进行分配。前3位成为优先位,后面4位成为服务类型, - 最后1位没有定义。这些8位字段可用于分配优先级、延迟、吞吐量以及可靠性。 + 并对数据报按照重要性级别进行分配。前3位为优先位,后面4位为服务类型, + 最后1位没有定义。这8位可用于分配优先级、延迟、吞吐量以及可靠性。 \item \textbf{总长度(16位):}该字段定义整个IP数据报的字节长度, 包括协议首部和数据,其最大值为65535字节。 \item \textbf{标识(16位):}该字段包含一个整数,用于标识当前数据报。 - 当数据报分片时,标识字段的值被复制到所有的分中片。 + 当数据报分片时,标识字段的值被复制到所有的分片中。 \item \textbf{标记(3位):}该字段由3位字段构成,其中最低位(MF)控制分片: 若存在下一个分片则值为1;否则置0代表该分片是最后一个。 中间位(DF)指出数据报是否可进行分片,若置1则不允许该数据报进行分片。 @@ -68,11 +68,11 @@ IP和ICMP协议是TCP/IP协议簇中的网络层协议, 以8字节为长度单位。 \item \textbf{生存时间(8位):}该字段是计数器, 转发该数据报的路由器依次减1直至减少为0。 - \item \textbf{协议(8位):}该字段指出在IP处理过程完成之后, - 有哪种上层协议接收导入数据报。 + \item \textbf{协议(8位):}该字段指出在IP层处理后, + 由哪种上层协议接收该数据报。 \item \textbf{头部校验和(16位):}该字段帮助确保IP协议头的正确性。 计算过程是先将校验和字段置为0,然后将整个头部每16位划分为一部分, - 将个部分相加,再将计算结果取反码,插入到校验和字段中。 + 并将各部分相加,其计算结果取反码,填入校验和字段中。 \item \textbf{源地址(32位):}源主机的IP地址。 \item \textbf{目的地址(32位):}目标主机的IP地址。 \end{enumerate} @@ -85,16 +85,14 @@ IP和ICMP协议是TCP/IP协议簇中的网络层协议, 在IP数据报的分片与重组过程中,以下三个首部字段发挥了重要作用: \begin{enumerate} - \item 标记占3位,该字段目前只有后两位有意义。 - 其中,最低位记为MF(More Fragment),MF = 1代表还有后续分片, + \item 标记的后两位: + 最低位记为MF(More Fragment),MF = 1代表还有后续分片, MF = 0表示此为原始数据报的最后分片。次低位DF(Don't Fragment), 用来控制数据报是否允许分片。DF = 1表示该数据报不允许分片;DF = 0允许分片。 - \item 标识符占16位,用于目的主机将IP数据报的各个分片重装成原来的数据报。 - 当IP数据报分片时,该标识字段的值被复制到所有的数据报分片的标识字段中。 - 这样,目的主机就可以正确的将标识字段值相同的各数据报分片重装成原来的数据报。 - \item 片偏移占13位,表示本分片在原IP数据报中的偏移位置,偏移量以8字节为单位。 - 由于每个数据分片按照独立数据报方式传输,因此到达目的主机的顺序是不确定的, + \item 标识符:用于目的主机将IP数据报的各个分片重装成原来的数据报。 + \item 片偏移:以8字节为单位, 目的主机在重装IP数据报时需要根据该字段提供偏移量进行排序。 + 这是因为数据分片的独立传输使各分片的到达顺序难以确定。 \end{enumerate} \subsubsection{ICMP协议及报文格式} @@ -190,16 +188,17 @@ tracert命令(Linux)格式和常用参数如图\ref{fig:tracert-cmd}所示 \centering \begin{code}[text] tracert [-d] [-h maximum_hops] [-j host-list] [-w timeout] [-R] - [-S srcaddr] [-4] [-6] target_name - - -d Do not resolve addresses to hostnames. - -h maximum_hops Maximum number of hops to search for target. - -j host-list Loose source route along host-list (IPv4-only). - -w timeout Wait timeout milliseconds for each reply. - -R Trace round-trip path (IPv6-only). - -S srcaddr Source address to use (IPv6-only). - -4 Force using IPv4. - -6 Force using IPv6. + [-S srcaddr] [-4] [-6] target_name + + -d 将地址解析成主机名 + -h maximum_hops搜索目标的最大跃点数 + -j host-list与主机列表一起的松散源路由,用于IPv4 + -w timeout 等待每个回复的超时时间(单位:毫秒) + -R 跟踪往返行程路径,用于IPv6 + -S srcaddr要使用的源地址,用于IPv6 + -4 强制使用IPv4 + -6 强制使用IPv6 + target_name 指定目标,可以是IP地址或主机名 \end{code} \caption{tracert命令语法及参数} \label{fig:tracert-cmd} diff --git a/data/ch_wireshark/sec_tcp.tex b/data/ch_wireshark/sec_tcp.tex index 252c612..4066363 100644 --- a/data/ch_wireshark/sec_tcp.tex +++ b/data/ch_wireshark/sec_tcp.tex @@ -8,7 +8,7 @@ TCP(Transmission Control Protocol传输控制协议)是一种面向连接的、 可靠的、基于字节流的传输层通信协议。 -本实验通过运用Wireshark对网络活动进行抓包分析, +本实验通过运用Wireshark对网络活动进行分析, 观察TCP协议报文,分析通信时序,理解TCP的工作过程, 掌握TCP工作原理与实现; 学会运用Wireshark分析TCP连接管理、流量控制和拥塞控制的过程,发现TCP的性能问题。 @@ -21,10 +21,10 @@ TCP(Transmission Control Protocol传输控制协议)是一种面向连接的、 \item 连接管理:观察正常TCP连接中的三次握手与四次挥手报文, 绘制出时序图,并标出双方TCP状态变化。 \item 异常情况分析:观察分析TCP连接建立过程的异常 - (例如,尝试连接未存活的主机或未监听端口或客户端发送了第一个SYN连接请求而服务端无响应); + (例如,尝试连接未存活的主机或未监听端口,客户端发送了第一个SYN连接请求而服务端无响应); 观察SYN洪泛影响;观察分析TCP通信过程中的各类异常报文(例如数据超时、乱序), 了解其触发机制与含义。 - \item 流量控制(进阶):运行一组TCP连接客户端/服务器程序(Python代码见节后附件), + \item 流量控制(进阶):运行一组TCP连接客户端/服务器程序, 制造收发不平衡场景,观察收发报文中通告窗口的变化,分析与窗口机制相关的类型报文, 了解滑动窗口工作原理。 \item 拥塞控制(进阶):改变带宽、时延、丢包率等网络参数,观察大文件传输过程, @@ -48,7 +48,7 @@ TCP协议基于“尽力而为”的网络层为应用层提供可靠的进程 \\ TCP 报文段结构如图\ref{fig:c:wireshark_TCP-structure}所示, -采用20字节的报文段头并有最长40字节的可选项。 +采用20字节的报文段头以及不超过40字节的可选项。 \small \begin{figure}[!ht] @@ -111,7 +111,7 @@ TCP 报文段结构如图\ref{fig:c:wireshark_TCP-structure}所示, 然后,客户端进入SYN\_SEND状态,等待服务器的确认; \item 第二次握手:服务器收到SYN报文段。服务器收到客户端的SYN报文段, 需要对这个SYN报文段进行确认,设置确认号为x+1; - 同时,将SYN位置为1,系列号为y。 + 同时,将SYN位置为1,序号为y。 服务器端将上述信息放入SYN+ACK报文段中, 一起发送给客户端,此时服务器进入SYN\_RECV状态; \item 第三次握手:客户端收到服务器的SYN+ACK报文段之后, @@ -200,9 +200,12 @@ BBR\footnote{\href{https://queue.acm.org/detail.cfm?id=3022184}{BBR: Congestion- 两台实验机本地相互连接(如图\ref{fig:c:wireshark_TCP-topo}), 在实验机中仿真不同的网络条件,以便观察TCP的各种控制现象。 -方案一使用虚拟机:VMware Player中通过“虚拟机设置->硬件->网络适配器->高级”(如图\ref{fig:c:wireshark_VM-advance-setup}) -设置虚拟机的网卡传入/传出带宽、数据包丢失率、延迟等; -方案二使用物理机:使用tc进行流量控制场景仿真,使用wondershaper对网卡进行限速。 +方案一使用VMware Player运行两台虚拟机,并 +通过“虚拟机设置->硬件->网络适配器->高级” +(如图\ref{fig:c:wireshark_VM-advance-setup}) +设置虚拟机的网卡传入/传出带宽、数据包丢失率、延迟等。 +方案二直接在两台PC机上操作, +使用tc进行流量控制场景仿真,使用wondershaper对网卡进行限速。 本实验需要使用的命令和工具,如表\ref{tab:c:wireshark_tools-command}所列。 常用的Linux命令还包括:echo、cat、sysctl、ping、ftp等。 @@ -287,7 +290,7 @@ BBR\footnote{\href{https://queue.acm.org/detail.cfm?id=3022184}{BBR: Congestion- 使用Wireshark内置的绘制流功能,选择菜单栏中的Statistics$\rightarrow$Flow Graph, Flow Type选择TCP flows可以直观地显示TCP序号和确认号是如何工作的。 \item 观察TCP三次握手与四次挥手报文,注意报文收发过程中,双方TCP状态的变化。 - 以本次抓得报文为据,分别画出本次TCP连接三次握手与四次挥手的时序图, + 以本次捕获的报文为依据,分别画出本次TCP连接三次握手与四次挥手的时序图, 结合TCP状态机,在双方各阶段标出对应的TCP状态。选择其中一个TCP报文, 配合Wireshark截图,分析该报文TCP首部各字段的定义、值及其含义。 \end{enumerate} @@ -321,7 +324,7 @@ BBR\footnote{\href{https://queue.acm.org/detail.cfm?id=3022184}{BBR: Congestion- \texttt{sudo iptables -I INPUT -s 192.168.100.144 -p tcp -m tcp --tcp-flags ALL SYN, ACK -j DROP} \item 再次尝试连接并启动wireshark抓包,并在双方多次用ss -tan观察TCP状态。 - \item 观察TCP的状态变化,分析wireshark抓到的TCP异常报文。 + \item 观察TCP的状态变化,分析wireshark捕获的TCP异常报文。 \item 服务端的SYN-RECV 状态何时释放? \item SYN ACK重传了几次,时间间隔有何变化? \item 参考1中的操作,在服务端修改SYN ACK重传次数(tcp\_synack\_retries), @@ -333,8 +336,8 @@ BBR\footnote{\href{https://queue.acm.org/detail.cfm?id=3022184}{BBR: Congestion- 指定所能接受SYN同步包的最大客户端数量为6; 在客户端运用netwox工具对服务器监听的端口产生大量SYN连接请求 (如\texttt{sudo netwox 76 -i 192.168.100.144 -p 23}), - 再使用正常的连接工具(如telnet)连接,观察现象(特别是服务器端的TCP连接状态), - 抓包总结分析,解释SYN泛洪攻击原理与对策。 + 再使用正常的连接工具(如telnet)尝试连接,观察交互情况(特别是服务器端的TCP连接状态), + 抓包分析,解释SYN洪泛攻击原理与对策。 \item 异常报文分析。在服务器端产生一个100M的大文件, 利用1中的web服务器,在客户端上用wget下载它。 参考命令: @@ -351,8 +354,8 @@ BBR\footnote{\href{https://queue.acm.org/detail.cfm?id=3022184}{BBR: Congestion- \end{enumerate} 抓包记录以上过程,分析黑色标签错误报文,结合TCP实现机制, - 分析这些报文产生的原因。此类报文也可以从现实网络行为抓取获得, - 请结合实际抓得报文分析,报文附件随报告提交。 + 分析这些报文产生的原因。此类报文也可以从现实网络行为捕获, + 请结合捕获的报文进行分析,报文附件随报告提交。 包括但不限于以下几种类型报文: [Duplicate ACK]、[TCP Retransmission]、[Fast Retransmission]、 [TCP Spurious Retransmission]、[TCP Out-Of-Order]、 @@ -368,10 +371,10 @@ BBR\footnote{\href{https://queue.acm.org/detail.cfm?id=3022184}{BBR: Congestion- 在客户端快速发送数据给服务端,而服务端则有意缓慢地接收数据, 观察TCP如何用窗口大小值进行流量控制。虚拟机两端分别运行 \texttt{python3 server.py}和\texttt{python3 client.py}。 - \item 抓取两端通信报文数据,分析报文中的Win值变化,联系上下报文, + \item 捕捉两端通信报文数据,分析报文中的Win值变化,联系上下报文, 解释为什么出现[TCP Windows Full]、[TCP ZeroWindows]、[TCP Keep-Alive] 等和窗口大小相关的流量控制报文。 - 抓取的原始报文存成附件随实验报告提交。 + 捕获的原始报文存成附件随实验报告提交。 \end{enumerate} \subsubsection{拥塞控制} @@ -380,7 +383,7 @@ BBR\footnote{\href{https://queue.acm.org/detail.cfm?id=3022184}{BBR: Congestion- 在VMWare Player中的虚拟机设置$\rightarrow$网络适配器$\rightarrow$高级中设置; 物理机可使用wondershaper命令进行限速。 再启动应用(可以是http wget,也可以ftp下载/上传)传输大文件观察。 - \item Wireshark抓取全部传输过程数据,找出该网络活动的拥塞点, + \item Wireshark捕捉全部传输过程数据,找出该网络活动的拥塞点, 并结合Analyze$\rightarrow$Expert Information、Statistic$\rightarrow$IO Graphs、 Statistic$\rightarrow$TCP Stream Graphs(如图\ref{fig:c:wireshark_io-graphs}), 分析此传输过程中的慢启动、拥塞避免、快速恢复等阶段。 @@ -423,11 +426,11 @@ BBR\footnote{\href{https://queue.acm.org/detail.cfm?id=3022184}{BBR: Congestion- \item 本次实验观察了Linux环境下的TCP实现,在Windows、macOS环境下, 操作系统又是如何实现TCP的呢? 类似Linux TCP参数,在不同系统环境下如何查看或设置, - 请尝试通过抓包其通信过程发现其实现异同。 + 请尝试通过捕捉其通信过程、比较其实现异同。 \item 在TCP状态机(图\ref{fig:c:wireshark_TCP-status-machine})中, 有些状态停留时间较长,易观察到,有些状态很短暂不易观察到。 试列出不易观察到的状态,并考虑观察到它们的可能方法。 - \item TCP是封装单元为MSS,可是我们在抓包过程中常发现远大于此值的TCP包, + \item TCP是封装单元为MSS,可是我们在捕捉过程中常发现远大于此值的TCP报文, 为什么TCP可以提交如此大的报文呢? 此类型的包远超出链路层的MTU,它是如何被处理的呢?请从两端同时抓包观察比对。 @@ -471,9 +474,9 @@ BBR\footnote{\href{https://queue.acm.org/detail.cfm?id=3022184}{BBR: Congestion- \item (20分) 完成流量控制操作要求,结合上下分析报文窗口变化, 解释说明相关的类型报文成因。 \item (20分) 完成拥塞控制操作要求, - 成功从抓得数据分析出了一次完整TCP流的各阶段(慢启动、拥塞控制、快速恢复)。 + 成功从捕获的数据分析出一次完整TCP流的各个阶段(慢启动、拥塞控制、快速恢复)。 \item (10分)完成任2道思考题。 - \item (10分)记录自己在本次实验中所遇到的问题,以及心得感悟实验总结。 + \item (10分)记录自己在本次实验中所遇到的问题,以及心得感悟。如果遇到异常情况,或者无法完成任务时,也请分析错误产生的原因。 \end{enumerate} \subsection{附件} diff --git a/figure/chapters/wireshark/TCP-structure.pdf b/figure/chapters/wireshark/TCP-structure.pdf index ea94989f132a235866dd85f11254b72edf681fb0..a279628071874469a3aaebb2d1557f0b3f3258c7 100644 GIT binary patch delta 2652 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 delta 2652 zcmai$X*d*I8^^Ov3?Zh7ktK{QvzayfTDC07lC3dh#%>H*o2HOFvW>EhvQMSPR!Afd zqBJqqEUofLwnCIFujhF`yziS2?>X0Xu5*6>`<(xM-=7X^ikCaZo5A75Au@Y?_c@x_ zX@yfM5kzVP#g}n{=Myg)$5`BdkfyH>+~K~2AYc@e<2D{FixrO_ah?n3sZ*Xd=QZNd z2wR$XW@w-g#0v_eS8R(>8=V&@4+kx8_zPjwQnZ;d(K(L@XP<;mXmMFTV~Ksdzlh1nd4V{ivJQnnUyiMcDjOX~{BGIj19zSTS9V-G12ZaKNWooZet||gEQjzo(H_0H8bp!reBAOZy zqTUzjum{(c>lMdc{rdROcO5zCl3I)Bwd^4}gc>)zs20DsetV%D=0Co;{xC@X#P>*n z(-?p5jb=4(^$R!AG*@mxK9x^nF4feS49=3Sr`KHdp+0RE%?m%Pblmz#7+^vYe(cZ9 zM!8#J2DDGl!j?Bq-|2JUpl{mQeCX3{1;2F_Ix8@h^ViR+_JQS!I2K-w`JB zjq7f6o9l*+*T<8}9N%*jNTUNqkg+Z|B6ZYJG=&AZR+&ejdh)*odh}3P6TJgx%)=S zefe~cwgoh8PgL=wZiQ4#Ms^!WQ6xstpc!8gzT`&r=sUx$XZTRAQi8gndl1tzTx?q`NGeHh!WBq=80`f9m z=yivGw@~CtwX%y%cOtOO9~cK8ZaPs4(LH=?RfgW&7gns5y>hWXzK>6HRgF-k$Azu9 zpS1!F(G^pBJLu;xPm+p1@tO>NxGMn!bxE5%7?%(fR>^U>RAh;Jieo3Fr`Sh@i;`a! zvb$;XPSikLnWkF+(ZvZY(V(5bv2MxzgKE@ZJwUaum20sqmLs1z>Rv$(Zr}+Zk9q3! zL8Xp7q}B`;r;*u{ygCk@GmhUp?T;a}_J7M)(;Kn>qhCS_wU`o}{WiFtMOWZfr>Ev` zm77I;6@6j-^}E#23F1jrlcIA+y?ty*eyTJVbv2|>3AX9>$)_G1#6%~;y}Ck+^5pj0 zU}R`&XJ~%?H9n8i+Fw$dEC{e#lV0p6=}Om9mU&J3hxP*gsEHp<-dc}Jh+}&W$Y6)Z zyjyvI+-u*1YO0Rw)Gwx(Y$gOdgTD~`#iCV7{X4!l3`H}~% z{rdFFWD?(@8m*t*ha#PV68Txns`7vbsX}by0xN~5dNP_F(%a7{n6s(ZoSzDF0k#8m+cC#&R{s&A}vi>f=zZ! zatRVy>6YYJ0HG$~jGzEC@vgML?F1hU;f*`e<60t_wBRXy^6C9Y>EL!BzrK4xNd#1o zK?6VH5+RI`wAazlboNSi_}*k!+W}L};T%@1Oya81Q1=_sQuDvZ{x&2%og zAc}{a2XWuYQp(TJ4-WzkObBH7>Ddf41EPlqe&+tV{&g;W?N8kulhU43@l$m&$;BeQ z)>}!r?Vxqlmov=Ud8U)W;+a;(>dE3(Ui;RL`SoVHS+x4iqRm7z7MMguqde$ox}Dqk zX_shQ$xn;Di!*WE4_VtV6V>(uTD}1<_tY;-s<7X@x;1+{XnOg9RGt)K{MEbQ{!>o{^=J{G>SKu_kS**@$sOibHkS(m4M%(j61 zSwQ^RT~fLEnN75Rmgx5qx)G<(vRFKhkCKasUrn7lj56X4YtY$#esanDMpu^-cq9R; zW2M(gx!@HjGDvlgxIv3anQ}PSf|heGEMK}>H+ZBifKxwT78)k&y0;_pf`Uihf`nR5 zUMRBTY)>jN}DXx^)h4Y>drg`;h71I?S%{EZz9nBRn-q?tAc7HFVji zliE%y2*|ntNK}A)c+sL4;LLBaT_$0bovgCe74TJl50B1-_&3^71F`u>jJ0E^^{lOP zmO2|VOe3$bAEW}sPqb%$?Bi^ z%QFs@uTS>jij2|}j^9g4q^dJMzj+#K!&H?x$`UMelhM~)q(N;r`An-uFY}Q>ZgLYC9akr4$i;*zuY+ar4UG!lj0#ZcJajgdGE?teVMJKaE`a2W01 zE~8L*gf;_MtM7#|Gc(5HamH}0Db^f|H8nRv8e`BVCPwDw2m}&ormvv;e?vSJ{`ndb XDAXv5?>Qg}jljWyDk^5S=D>deF&EAO_lTU7b@;L(o}wL#WWdXSO?_m12rj^UHbR5N!D`3>`i@5tSGn6UE~uqDW){Dvr$( z*+cFslgJ`%Wk5Lmo0ba1>h^F_&|kK5*rLWO>fpApp6U%EWjzyyDJVL?4b2DK>*L9nTLvd-YBLsi07P_sY)mBT)AqtzWNul4g3a zacMBRRJcOQMnBkgE1nNk_pE`6`xGPYMF%TcZWBgJY2Nht1DUh(788gg)up0kZ*wVO zq&2OA^sBYlA~Fq?|AQ8hn`Wi+PuQwKNtaqio$2t5s&QxEQ2anA@H){}K2hB@Y&TwX zr$4m?FEXq?D!-Te^;uR}k-r{GJRcMrXJgYRR9MnFk%w8;k9Yg#nnvuB%~0*QKEMn$Ir1p}kY&(;RLj5{jcIlCoht%hHtj$L+@6>PC zZ*_r91#jTpHf1#@35sQu_#H#tXt34_t7NV=<7h<|pc0!#Z*iQ|`-e2&|c~-r(zb zb{E!oO+!%^LS@Um?42p?xW!ibAj+X0JbZh~d0$P2$vmrgdRdN*%o zy?GKFc2XmJO=JCtEX)38+tQr$d0Gs>T~5EHNc?_8psBN}B8;`unppdqaMNeisFz~G zkks9(OONnZ^?uu+(qbL#79nob$^GrBif$`I8GAeesh~|$g|OIiWc@3Z0hvSm;oL&= zn)9_y;zGnw?s?NMh_MD|waZh#RuTPzQIzpqca`*UY zm{ng?DHy*Fjq44B8AN_5EZJEW&tI1{)sPW`8m%3p zb}&)+7l!_qg`;sxY}am1n*p;f%w4%4u%Jv!(tN*XDCovF-zFQBZF8oohkLIo+;)__ z9+4eFs&e(H2|lWe`}P>j4{en5mffRau1Cv?1APT?W1etGSEO&nopbOL19PKWvGu`W zv=`aUGwFXD-;%%_bWY1@0v&C&V|~s&O7YWrBekv)p{~%YP=0s*bG`i`xyk7Yo76@0 z%jafm=!v(t^>1*DVXPE&4YShrX*<1urW%ob0fc{8+%o14F5CzD>%d1j)t_o?pdL?4 zE(v;P10+2o8?;%^1a%Qsa43bC9-til)$fp=%S zRER|Y?+=25fd5+n7%~z3kYTZS;>V12pEGA)(YTuh1|mg-HUoiQv&`Mw(2Vhzy+? zu_q3YMVZ7uijCoOZ5)cFP+Rodb$9e_yKO7{{CPhplxr;pg)$;g8CAfMsUn}X_4cdV z6>=)RGc4bgz;T(l3J!S9QL5pNXY<0w>sx=$*L3d;E4L5p&v^rKw-aS~tG7IAx;57p zUu>*dcMt7oc}sC8O!+ibN`+KTDSa(Rz(@656wmSJu@*N#Phg(IHF7n4{i0UxhIo ztJRWBezS<9JUBX~qyE!n{ef2p6vYdarIYP@fG>Nf;KT@%FiKNq(=3lz~YYLXq#1v>GML^I$PLPwu+jG75OK zvV@n>cKU_`$Cr{J9KTIZ*0wFvIpmx%^yBK&PtCb$&+jN!T{9sW58r3loRBXZ1=XHy zb%}akztnu~i5;1M(+$@@*$-*D?}4(Bi-A^a7A&4{-B+JodkPXnbSNv6&z#zwgxflK zioOE{@zE`aUgPkYbbTl(+uS3gk^Nbr3uz60!cwv`Dorj^pQQ&opai0{-rjMMv&_B> za=U_`?UEjd7~@Hqt%rTon67uGG9%pk3NW$4c3*X(`G^0w%e0%u1tW`L(*|%?q~d^`?&e) zRfo39{qf}u`fA2X6PU;9{h(KAM-u;Q?sC_(Y;bcpJNjm}?tgAxo0c{##_Y*=xuu=w zop!D%>hAue*da|$zE0onCm^bgu96a*uuar{07E!SS6)4UFc@5KFkowQFpbX@(m4WI zNyR>Uu)1-|Q%S#TifTU_j>l2Xk04r1)yt&0CN4>mQ=CK}3Z>NalS|B7Wb50DQtnp? z86(t~?RT;iDIxuO^1*ato18JXYE^E$@Gw4+3u z(6#QpIyO2-g80uF0HVu@K%|}$_5?A_>Q22hq|j?R>1|-UpF|YV4^ZXWO-% zu7$%#XK9-NhA7}&^Rg&F7b1VhgdTL*rX~9=*!^M6V@nn1L*QK*ixuN0yhxasy65zeNh$)`_U$ek7=Rr*Fo-jQ)6bG?9 zOAYj=nBcHb7!-xT!Js%C#M+PI6-o^ZFoDCNyNBs0VJ?Y4;NVC&0)b-YNvQl=mA{lw zx02o!5nnZgAq>Z4ODKNT{{hTBc5i`bW{(|#4uinH1|$Fi`a6Na@mS=y41qwSzh`*V zcMSPIdeJcKcRnl%_YbrE_hKXp0sq#B#31qCFgPBK`gY(h!(*BK_GTUy7DOTzgC(Mg za0?3*&KiLuT3K1cNJzY;6%2uan?X$fuf+{wW(Eog^`wSIP$@njI39;Vfpm1NPmn-= E0YOzi>Hq)$