From 627963d375a52c8f2badbaffe96ce3919e65327c Mon Sep 17 00:00:00 2001
From: Fengda HUANG 写博客似乎是一个不错的好习惯,作为一个不是很优秀的写手。对于来说,有时候发现原来能教会别人对于自己的能力来说算是一种肯定。有些时候教会别人才算是自己学会的表现,总会在项目上的时候需要自己去复述工作的一个过程,我们需要整理好我们的思路才能带给别人更多的收获。我们的笔记上总会留下自己的学习的一些过程,有些时候我们想要的只是一点点的鼓励,有时是诸如评论一类,有时可能是诸如访问量。更多的可能是我们可以重新整理自己的知识,好好复习一下,以便于好好记住,写出来是一个好的过程。 无处不在的三剑客就这样到了这里,写得似乎很多也很少,但是还是没有做出来一个东西,于是我们朝着这样一个方向前进。 Linux是一种自由和开放源码的类UNIX操作系统内核。目前存在着许多不同的Linux发行版,可安装在各种各样的电脑硬件设备,从手机、平板电脑、路由器和影音游戏控制台,到桌上型电脑,大型电脑和超级电脑。 Linux是一个领先的操作系统内核,世界上运算最快的10台超级电脑运行的都是基于Linux内核的操作系统。 Linux操作系统也是自由软件和开放源代码发展中最著名的例子。只要遵循GNU通用公共许可证,任何人和机构都可以自由地使用Linux的所有底层源代码,也可以自由地修改和再发布。严格来讲,Linux这个词本身只表示Linux内核,但在实际上人们已经习惯了用Linux来形容整个基于Linux内核,并且使用GNU工程各种工具和数据库的操作系统(也被称为GNU/Linux)。通常情况下,Linux被打包成供桌上型电脑和服务器使用的Linux发行版本。一些流行的主流Linux发行版本,包括Debian(及其衍生版本Ubuntu),Fedora和openSUSE等。Linux得名于电脑业余爱好者Linus Torvalds。 而让我们来看一下两者之间的不同之处,这是一张linux的架构图我们可以发现内核只是位于底层。 应用程序(sh、vi、OpenOffice.org等) 复杂库(KDE、glib等) 简单库(opendbm、sin等) 我们可以发现,由linux内核+shell可以构成一个操作系统,而linux本身只是个内核,也就是图中的内核模式,负责控制系统的这些部分。也就是我们可以发现,Linux内核构成了一个操作系统除用户界面以外的部分,而shell就是这最后的用户界面。 而linux内核以外的部分就是由GNU计划构成的。 Shell是系统的用户界面,提供了用户与内核进行交互操作的一种接口。它接收用户输入的命令并把它送入内核去执行。 实际上Shell是一个命令解释器,它解释由用户输入的命令并且把它们送到内核。不仅如此,Shell有自己的编程语言用于对命令的编辑,它允许用户编写由shell命令组成的程序。Shell编程语言具有普通编程语言的很多特点,比如它也有循环结构和分支控制结构等,用这种编程语言编写的Shell程序与其他应用程序具有同样的效果 bash 是一个为GNU计划编写的Unix shell。它的名字是一系列缩写:Bourne-Again SHell — 这是关于Bourne shell(sh)的一个双关语(Bourne again / born again)。Bourne shell是一个早期的重要shell,由史蒂夫·伯恩在1978年前后编写,并同Version 7 Unix一起发布。bash则在1987年由布莱恩·福克斯创造。在1990年,Chet Ramey成为了主要的维护者。 shell将会是我们在GNU/linux中经常用到的经常有到的工具之一,用来操作计算机用的。在迁移到linux之前我们可以试用cygwin来进行模拟: Cygwin是许多自由软件的集合,最初由Cygnus Solutions开发,用于各种版本的Microsoft Windows上,运行UNIX类系统。Cygwin Cygwin是许多自由软件的集合,最初由Cygnus Solutions开发,用于各种版本的Microsoft Windows上,运行 GCC(GNU Compiler Collection,GNU编译器套装),是一套由GNU开发的编程语言编译器。它是一套以GPL及LGPL许可证所发行的自由软件,也是GNU计划的关键部分,亦是自由的类Unix及苹果电脑Mac OS X 操作系统的标准编译器。GCC(特别是其中的C语言编译器)也常被认为是跨平台编译器的事实标准。 GCC原名为GNU C语言编译器(GNU C Compiler),因为它原本只能处理C语言。GCC很快地扩展,变得可处理C++。之后也变得可处理Fortran、Pascal、Objective-C、Java、Ada,以及Go与其他语言。 作为一门计算机语言来说,Python会有下面的特点。
-
-
-
-
+
-
-
-
-
+
-
-
+
-
-
-
+
-
-
+
-
-
-
+
5.6 笔记
6 GNU/Linux
+6.1 什么是Linux
6.2 操作系
6.2.1 Linux架构图
+6.2.1.1 用户模式
6.2.1.2 内核
6.2.2 Shell
+UNIX类
系统。6.2.3 GCC
7.5.1
return 0;
}
8 Python
+
8.4 包管理
Raspberry Pi是一款针对电脑业余爱好者、教师、小学生以及小型企业等用户的迷你电脑,预装Linux系统,体积仅信用卡大小,搭载ARM架构处理器,运算性能和智能手机相仿。在接口方面,Raspberry Pi提供了可供键鼠使用的USB接口,此外还有千兆以太网接口、SD卡扩展接口以及1个HDMI高清视频输出接口,可与显示器或者TV相连。
Linux是一套免费使用和自由传播的类Unix操作系统,是一个基于POSIX和UNIX的多用户、多任务、支持多线程和多CPU的操作系统。它能运行主要的UNIX工具软件、应用程序和网络协议。它支持32位和64位硬件。Linux继承了Unix以网络为核心的设计思想,是一个性能稳定的多用户网络操作系统。
@@ -1519,8 +1541,24 @@服务器(Server)指: - 一个管理资源并为用户提供服务的计算机软件,通常分为文件服务器(能使用户在其它计算机访问文件),数据库服务器和应用程序服务器。 - 运行以上软件的计算机,或称为网络主机(Host)。 - 一般来说,服务器通过网络对外提供服务。可以通过Intranet对内网提供服务,也可以通过Internet对外提供服务。
+WEB服务器也称为WWW(WORLD WIDE WEB)服务器,主要功能是提供网上信息浏览服务。 WWW 是 Internet的多媒体信息查询工具,是 Internet 上近年才发展起来的服务,也是发展最快和目前用的最广泛的服务。正是因为有了WWW工具,才使得近年来 Internet 迅速发展,且用户数量飞速增长。
+Web服务是一种服务导向架构的技术,通过标准的Web协议提供服务,目的是保证不同平台的应用服务可以互操作。
+根据W3C的定义,Web服务(Web service)应当是一个软件系统,用以支持网络间不同机器的互动操作。网络服务通常是许多应用程序接口(API)所组成的,它们透过网络,例如国际互联网(Internet)的远程服务器端,执行客户所提交服务的请求。
+尽管W3C的定义涵盖诸多相异且无法介分的系统,不过通常我们指有关于主从式架构(Client-server)之间根据SOAP协议进行传递XML格式消息。无论定义还是实现,WEB服务过程中会由服务器提供一个机器可读的描述(通常基于WSDL)以辨识服务器所提供的WEB服务。另外,虽然WSDL不是SOAP服务端点的必要条件,但目前基于Java的主流WEB服务开发框架往往需要WSDL实现客户端的源代码生成。一些工业标准化组织,比如WS-I,就在WEB服务定义中强制包含SOAP和WSDL。
+WEB服务实际上是一组工具,并有多种不同的方法调用之。三种最普遍的手段是:
+Internet有两个核心协议: IP和TCP,这样讲述起来似乎会很漫长。
基本概念
@@ -1531,7 +1569,7 @@10.1传输层的TCP是基于网络层的IP协议的,而应用层的HTTP协议又是基于传输层的TCP协议的。
-
注意
: HTTP协议只规定了客户端与服务端的通信规则,而没有规定其通讯协议,只是现在的大部分实现都是将TCP作为通讯协议。10.1.1 打开网页时发生了什么
+12.1.1 打开网页时发生了什么
简单地来说,当我们在浏览器上输入URL的敲下回车的时候。
-
- 浏览器需要查找域名2的IP,从不同的缓存直至DNS服务器。
@@ -1561,7 +1599,7 @@10.1
- 从对应的服务器下载资源
说说第一步,开始时我们输入的是URI(统一资源标识符,Uniform Resource Identifier),它还有另外一个名字叫统一资源定位器(URL3,Uniform Resource Locator)。
-10.1.2 URL组成
+12.1.2 URL组成
网址算是URL的一个俗称,让我们来看看一个URL的组成,以HTTP版IOT中的URL为例。
http://b.phodal.com/athome/1
开始之前,我们需要标出URL的80端口以及json文件的全称,那么上面的网址就会变成
@@ -1580,7 +1618,7 @@10.1.2 URL组成
这里的
#
后面是锚部分,如果你打开这个URL就会发现会直接跳转到相应的锚部分,对就于下面这样的一个例子来说
http://www.phodal.com/search/?q=iot&type=blog
-
?
后面的q=iot&type=blog
的部分是参数部分,通常用于查询或者、搜索。10.2 一次HTTP GET请求
+12.2 一次HTTP GET请求
当我们打开最小物联网系统的一个页面时,如http://b.phodal.com/athome/1.json
我们在浏览器上看到的结果是
[ @@ -1601,14 +1639,14 @@
10.2 [{"id":1,"temperature":19,"sensors1":31,"sensors2":7.5,"led1":0}]
我们用curl命令向服务器发起了GET请求,服务器返回了上面的结果。
-10.2.1 HTTP响应
+12.2.1 HTTP响应
一个HTTP响应由三部分组成
-
- 状态行(状态码)
- 消息报头(响应报头)
- 响应正文(消息体)
10.2.1.1 HTTP响应 状态码
+12.2.1.1 HTTP响应 状态码
在上面的结果中,状态行是
HTTP/1.1 200 OK
返回的状态码是200,OK是状态码的原因短语。
@@ -1639,14 +1677,14 @@10.2.1.1422 unprocessable entity - 校验错误时用。
- 429 too many request - 请求过多。
10.2.1.2 HTTP响应 响应报头
+12.2.1.2 HTTP响应 响应报头
在这次响应中,返回了两个报头,即
Content-Type: application/json Date: Fri, 05 Sep 2014 15:05:49 GMT
Content-Type和Date,在这里的Context-Type是application/json,而通常情况下我们打开一个网站时,他的Content-Type应该是text/html。
Content-Type: text/html;
Content-Type是最重要的报头。
-10.2.1.3 HTTP响应 响应正文
+12.2.1.3 HTTP响应 响应正文
正文才是我们真正想要的内容,上面的都是写给浏览器看的,一般的人不会去关注这些。
HTTP/1.1 200 OK Server: phodal.com/0.17.5 @@ -1685,23 +1723,49 @@
10.2.1.3《RESTful Web Services Cookbook》
《RESTful Web APIs》 -10.3 REST
+12.3 REST
REST从资源的角度来观察整个网络,分布在各处的资源由URI确定,而客户端的应用通过URI来获取资源的表征。获得这些表征致使这些应用程序转变了其状态。随着不断获取资源的表征,客户端应用不断地在转变着其状态,所谓表征状态转移。
因为我们需要的是一个Machine到Machine沟通的平台,需要设计一个API。而设计一个API来说,RESTful是很不错的一种选择,也是主流的选择。而设计一个RESTful服务,的首要步骤便是设计资源模型。
-10.3.1 资源
+12.3.1 资源
互联网上的一切信息都可以看作是一种资源。
-11 设计RESTful API
++ +
++ + + +HTTP Method +Operation Performed ++ +GET +Get a resource (Read a resource) ++ +POST +Create a resource ++ +PUT +Update a resource ++ + +DELETE +Delete Resource +13 设计RESTful API
设计RESTful API是一个有意思的话题。下面是一些常用的RESTful设计原则:
-11.1 REST关键目标
+13.1 REST关键目标
-
- 组件间交互的可伸缩性
- 接口的通用性
- 组件的独立部署
- 通过中间组件来减少延迟、实施安全策略和封装已有系统
11.2 判断是否是 RESTful的约束条件
+13.2 判断是否是 RESTful的约束条件
-
- 客户端-服务器分离
- 无状态
@@ -1710,14 +1774,14 @@11.3 设计RESTful资源
-11.4 设计RESTful URI
-11.5 JSON
+13.3 设计RESTful资源
+13.4 设计RESTful URI
+13.5 JSON
-12 REST服务准备
-12.1 Laravel
+14 REST服务准备
+14.1 Laravel
@@ -1731,28 +1795,28 @@Laravel是一套简洁、优雅的PHP Web开发框架(PHP Web Framework)。它可以让你从面条一样杂乱的代码中解脱出来;它可以帮你构建一个完美的网络APP,而且每行代码都可以简洁、富于表达力。
12.1 Laravel
- 强大的社区支持: 无论你是一个PHP新手还是经验丰富的架构师,都能在社区中找到需要的知识。你可以在IRC中讨论Idea,或者在论坛中发布问题。
- 测试、重构: Laravel 从开始就将测试作为重点功能。我们提供了灵活的IoC容器,集成了PHPUnit 测试工具。不用担心,这些都很容易上手。
12.1.1 为什么是 Laravel
+14.1.1 为什么是 Laravel
- 因为个人喜爱,你也可以用 Ruby On Rails来搭建这样一个功能,或者是Java。
- PHP在我的服务器上运行得挺不错的,而且我又不需要重新去写配置那些配置。
- Laravel 可以简单的开发我们所需要的功能,换句话说他是 PHP 世界的 Ruby On Rails。
这里不会再重述之前的问题,这里只是将需要的步骤一个个写下来,然后丢到这里好好说一下。至于RESTful是什么,前面已经介绍了,就不再重复了。那么下面,我们就用Laravel来搭建一个平台给物联网用的。
-12.2 安装 Laravel
-12.2.1 GNU/Linux安装Composer
+14.2 安装 Laravel
+14.2.1 GNU/Linux安装Composer
GNU/Linux Ubuntu/OpenSUSE下可以执行
-$ curl -sS https://getcomposer.org/installer | php
12.2.1.1 Windows安装Composer
+14.2.1.1 Windows安装Composer
请直接下载
-12.2.1.2 Mac OS
+14.2.1.2 Mac OS
1.安装Composer
brew install homebrew/php/composer
2.安装Laravel
composer global require "laravel/installer=~1.1"
3.创建Laravel工程
-composer create-project laravel/laravel your-project-name --prefer-dist
12.2.1.3 Mac OS
+14.2.1.3 Mac OS
1.下载laravel.phar
wget http://laravel.com/laravel.phar
2.重命名
@@ -1761,8 +1825,8 @@12.2.1.3 Mac OS
sudo mv laravel /usr/local/bin
4.创建项目
-laravel new blog
12.3 MySQL
-12.3.1 安装MySQL
+14.3 MySQL
+14.3.1 安装MySQL
出于某些原因,我建议用MariaDB替换MySQL,如果你"真正"需要mysql,将mariadb替换为mysql
ps: 在下文中我会继续用MySQL,而不是MariaDB,MairaDB是MySQL的一个分支,真正的开源分支。
Ubuntu/Debian/Mint
@@ -1773,7 +1837,7 @@12.3.1 安装M
$ sudo zypper install mariadb-server
Mac OS
-$ brew install mariadb
12.3.2 配置MySQL
+14.3.2 配置MySQL
修改database.php
app/config/database.php
要修改的就是这个
@@ -1799,10 +1863,10 @@12.3.2 配置MyS "sensors2": 12, "led1": 0 } -
13 创建REST服务
-13.1 数据库迁移
+15 创建REST服务
+15.1 数据库迁移
这个名字是源自于Ruby On Rails在那时候的印象,不直接使用MySQL的目的在于让我们可以专注于过程。
-13.1.1 创建表
+15.1.1 创建表
表的概念,类似于在Excel中的表,如果你真实不懂数据库。 让我们创建一个athomes的表,为什么是athomes,因为以前在写android程序的时候就叫的是athome,忽略掉这些次要的因素吧。
$ php artisan migrate:make create_athomes_table
打开 app/database/migrations/create_athomes_table.php这里的是由日期和某些东西组成的,修改生成的代码为下面。
@@ -1831,7 +1895,7 @@13.1.1 创建表 }
意思大致就是id是自加的,也就是我们在localhost/athome/{id},当我们创建一个新的数据的时候,会自动加上去,最后一个timestamps批的是时间,会包含创建时间和修改时间。 剩下的temperature,sensors1,sensors2是小数,以及只有真和假的led1。
-13.1.2 数据库迁移
+15.1.2 数据库迁移
我们只是写了我们需要的数据的格式而并没有丢到数据库里,
$ php artisan migrate
这个就是我们执行迁移的命令,如果你用phpmyadmin可以直接打开查看,没有的话,可以。
@@ -1839,7 +1903,7 @@13.1.2 数
use iot; select * from athomes;
就可以看到我们写的东西,那么接下来就是创建RESTful服务了
-13.2 创建RESTful
+15.2 创建RESTful
用下面的代码实现我们称之为Athomes控制器的创建
$ php artisan controller:make AthomesController
就会在app/controllers下面生成下面的代码
@@ -1874,7 +1938,7 @@13.2 创建RES } } -
13.3 Laravel Resources
+15.3 Laravel Resources
上面的代码过于沉重,请让我用 Ctrl+C 来带来点知识吧。
@@ -2027,7 +2091,7 @@
13.3 Larav }
希望你能读懂,没有的话,继续。
下面这部分来自于之前的博客,这里就不多加论述了。 这个也就是我们要的模板,
-13.3.1 修改Create()
+15.3.1 修改Create()
public function create() { $maxid=Athomes::max('id'); @@ -2039,8 +2103,8 @@
13.3.1 修改Cr return View::make('athome.create'); }
这里只是对其中代码的进行一下说明。
-13.3.2 创建表单
-13.3.2.1 创建表单之前
+15.3.2 创建表单
+15.3.2.1 创建表单之前
由于使用到了bootstrap以及bootstrap-select,记得添加css。
@@ -2051,7 +2115,7 @@<link rel="stylesheet" type="text/css" href="<?= url('css/bootstrap.min.css') ?>" /> <link rel="stylesheet" type="text/css" href="<?= url('css/bootstrap-select.min.css') ?>" />
13.3.2.1 <script> $('.selectpicker').selectpicker(); </script> -
13.3.2.2 创建表单
+15.3.2.2 创建表单
这里用到的是之前提到的那个作者写下的,稍微修改了一下。
-<div class="row-fluid"> {{ HTML::ul($errors->all()) }} @@ -2103,7 +2167,7 @@
13.3.2.2 创 return Redirect::to('athome'); } }
13.3.3 编辑模板
+15.3.3 编辑模板
完整的 blade 模板文件
-<!DOCTYPE html lang="zh-cn"> <html> @@ -2164,21 +2228,21 @@
13.3.3 编辑
最后效果见:http://b.phodal.com/
-14 RESTful Evertywhere
-14.1 Javascript与ajax
+16 RESTful Evertywhere
+16.1 Javascript与ajax
-AJAX即“Asynchronous Javascript And XML”(异步JavaScript和XML),是指一种创建交互式网页应用的网页开发技术。AJAX = 异步 JavaScript和XML(标准通用标记语言的子集)。
14.1.1 jQuery
+16.1.1 jQuery
-Jquery是继prototype之后又一个优秀的Javascript框架。它是轻量级的js库 ,它兼容CSS3,还兼容各种浏览器(IE 6.0+, FF 1.5+, Safari 2.0+, Opera 9.0+),jQuery2.0及后续版本将不再支持IE6/7/8浏览器。jQuery使用户能更方便地处理HTML(标准通用标记语言下的一个应用)、events、实现动画效果,并且方便地为网站提供AJAX交互。jQuery还有一个比较大的优势是,它的文档说明很全,而且各种应用也说得很详细,同时还有许多成熟的插件可供选择。jQuery能够使用户的html页面保持代码和html内容分离,也就是说,不用再在html里面插入一堆js来调用命令了,只需定义id即可。
14.2 Java与json
+16.2 Java与json
-Gson(又称Google Gson)是Google公司发布的一个开放源代码的Java库,主要用途为串行化Java对象为JSON字符串,或反串行化JSON字符串成Java对象。
14.2.1 Android
-14.3 Python与json
+16.2.1 Android
+16.3 Python与json
@@ -2192,7 +2256,7 @@使用pySerial可以使Python很好地在Windows/Linux/BSD上执行串口操作。
14.3 Python与 date=urllib2.urlopen(url) result=json.load(date) print result
14.3.1 requests
+16.3.1 requests
@@ -2211,20 +2275,20 @@Python 标准库中的 urllib2 模块提供了你所需要的大多数 HTTP 功能,但是它的 API 烂出翔来了。它是为另一个时代、另一个互联网所创建的。它需要巨量的工作,甚至包括各种方法覆盖,来完成最简单的任务。
14.3.1 requests
"temperature": 19, "sensors1": 32, "sensors2": 7.5, "led1": 0, "method": "PUT"} r = requests.put(url, data) print r.text -15 前端显示
-15.1 库与车轮子
+17 前端显示
+17.1 库与车轮子
在多数的情况下我们都没有理由也没有必要去重新发明我们的车轮,在这时使用库会是一个比较好的做法。
-15.2 库
-15.2.1 jQuery Mobile
+17.2 库
+17.2.1 jQuery Mobile
-jQuery Mobile是jQuery 在手机上和平板设备上的版本。jQuery Mobile不仅会给主流移动平台带来jQuery核心库,而且会发布一个完整统一的jQuery移动UI框架。支持全球主流的移动平台。jQuery Mobile开发团队说:能开发这个项目,我们非常兴奋。移动Web太需要一个跨浏览器的框架,让开发人员开发出真正的移动Web网站。
15.2.2 Bootstrap
+17.2.2 Bootstrap
-Bootstrap是Twitter推出的一个开源的用于前端开发的工具包。它由Twitter的设计师Mark Otto和Jacob Thornton合作开发,是一个CSS/HTML框架。Bootstrap提供了优雅的HTML和CSS规范,它即是由动态CSS语言Less写成。Bootstrap一经推出后颇受欢迎,一直是GitHub上的热门开源项目,包括NASA的MSNBC(微软全国广播公司)的Breaking News都使用了该项目。
15.3 网站前台显示
-15.3.1 Highcharts
+17.3 网站前台显示
+17.3.1 Highcharts
Highcharts有以下的特点
-
- 兼容性:兼容当今所有的浏览器,包括 iPhone、IE 和火狐等等;
@@ -2241,8 +2305,8 @@15.3.1 Highcharts
-16 构建基于CoAP协议的物联网系统
-16.1 CoAP: 嵌入式系统的REST
+18 构建基于CoAP协议的物联网系统
+18.1 CoAP: 嵌入式系统的REST
引自维基百科上的介绍,用的是谷歌翻译。。。
受约束的应用协议(COAP)是一种软件协议旨在以非常简单的电子设备,使他们能够在互联网上进行交互式通信中使用。它特别针对小型低功率传感器,开关,阀门和需要被控制或监督远程,通过标准的Internet网络类似的组件。 COAP是一个应用层协议,该协议是用于在资源受限的网络连接设备,例如无线传感器网络节点使用。 COAP被设计为容易地转换为HTTP与Web简化集成,同时也能满足特殊的要求,例如多播支持,非常低的开销,和简单性。多播,低开销,以及简单性是因特网极其重要物联网(IOT)和机器对机器(M2M)设备,这往往是积重难返,有太多的内存和电源,比传统的互联网设备有。因此,效率是非常重要的。 COAP可以在支持UDP或UDP的模拟大多数设备上运行。
@@ -2254,17 +2318,17 @@16.1CoAP减少了一些HTTP的方法
- CoAP可以支持检测装置
16.2 CoAP 命令行工具
+18.2 CoAP 命令行工具
为了测试测试我们的代码是否是正确工作,我们需要一个CoAP的命令行工具。目前有两个不错的工具可以使用。
-
- CoAP-cli,一个基于NodeJS的CoAP命令行工具,其核心是基于Node-CoAP库。
- libcooap,一个用C写的CoAP命令行工具。
- FireFox Copper, 一个Firefox的插件。
16.2.1 Node CoAP CLI
+18.2.1 Node CoAP CLI
安装命令如下
-npm install coap-cli -g
16.2.1.1 CoAP命令行
+18.2.1.1 CoAP命令行
在coap-cli中,一共有四个方法。分别表示REST的四种不同的方式:
Commands: @@ -2279,13 +2343,13 @@
16.2.1.1 CoAP
测试一下现在的最小的物联网系统CoAP版
-coap get coap://iot-coap.phodal.com/id/1 (2.05) [{"id":1,"value":"is id 1","sensors1":19,"sensors2":20}]
16.2.2 libcoap
-16.2.2.1 mac os libcoap安装
+18.2.2 libcoap
+18.2.2.1 mac os libcoap安装
Mac OS下可以直接用
-brew install libcoap
16.2.2.2 Ubuntu libcoap安装
+18.2.2.2 Ubuntu libcoap安装
Ubuntu GNU/Linux下
-16.2.2.3 Windows libcoap安装
+18.2.2.3 Windows libcoap安装
Windows 下
安装完libcoap,我们可以直接用自带的两个命令
-coap-client @@ -2298,13 +2362,13 @@
16.2.2.3
v:1 t:0 tkl:0 c:1 id:37109 This is a test server made with libcoap (see http://libcoap.sf.net) Copyright (C) 2010--2013 Olaf Bergmann <bergmann@tzi.org>
16.2.3 Firefox Copper
+18.2.3 Firefox Copper
为了能访问coap://localhost/,于是我们便需要安装一个Firefox并安装一个名为Copper的插件。
-
下载地址: https://addons.mozilla.org/en-US/firefox/addon/copper-270430/
作为测试我们同样可以访问 coap://vs0.inf.ethz.ch:5683/
16.3 CoAP Hello,World
+18.3 CoAP Hello,World
接着我们便开始试试做一个简单的CoAP协议的应用:
这里用到的是一个Nodejs的扩展Node-CoAP
@@ -2346,8 +2410,8 @@16.3 CoAP He
就可以在console上输出
Hello World
也就达到了我们的目的,用CoAP协议创建一个服务,接着我们应该用它创建更多的东西,如产生JSON数据,以及RESTful。和HTTP版的最小物联网系统一样,CoAP版的最小物联网系统也是要返回JSON的。
-16.4 CoAP 数据库查询
-16.4.1 Node Module
+18.4 CoAP 数据库查询
+18.4.1 Node Module
这说里NodeJS Module的意义是因为我们需要在别的地方引用到db_helper这个库,也就是下一小节要的讲的内容。
这样我们就可以在server.js类似于这样去引用这个js库。
-var DBHelper = require('./db_helper.js'); @@ -2357,7 +2421,7 @@
16.4.1 Node Modu } DBHelper.initDB = function(){}; module.exports = DBHelper;
16.4.2 Node-Sqlite3
+18.4.2 Node-Sqlite3
这次我们用的是SQLite3(你可以用MySQL,出于安全考虑用SQLite3,SQLite3产生的是一个文件)。一个简单的initDB函数
var db = new sqlite3.Database(config["db_name"]); var create_table = 'create table if not exists basic (' + config["db_table"] + ');'; @@ -2390,7 +2454,7 @@
16.4.2 Node-Sql }); };
将URL传进来,便解析这个参数,接着再放到数据库中查询,再回调回结果。这样我们就可以构成之前所说的查询功能,而我们所谓的post功能似乎也可以用同样的方法加进去。
-16.4.3 查询数据
+18.4.3 查询数据
简单地记录一下在IoT-CoAP中一次获取数据地过程。
先看看在示例中的Get.js的代码,这关乎在后面server端的代码。
const coap = require('coap') @@ -2470,7 +2534,7 @@
16.4.3 查询 };
当resulst的结果为空时,返回一个404,因为没有数据。这样我们就构成了整个的链,再一步步返回结果。
在IoT-CoAP中我们使用到了一个Block2的东西,于是便整理相关的一些资料,作一个简单的介绍,以及在代码中的使用。
-16.5 CoAP Block
+18.5 CoAP Block
CoAP是一个RESTful传输协议用于受限设备的节点和网络。基本的CoAP消息是一个不错的选择对于小型载荷如
- 温度传感器
@@ -2481,7 +2545,7 @@16.5 CoAP Block
CoAP是同UDP与DLTS一样是基于数据报传输的,这限制了资源表示(resource representation)的最大大小,使得传输不需要太多的分割。虽然UDP支持通过IP分片传输更大的有效载荷,且仅限于64KiB,更重要的是,并没有真正很好地约束应用和网络。
而不是依赖于IP分片,这种规范基本COAP了对“块”选项,用于传输信息从多个资源区块的请求 - 响应对。在许多重要的情况下,阻止使服务器能够真正无状态:服务器可以处理每块分开传输,而无需建立连接以前的数据块传输的其他服务器端内存。
综上所述,块(Block)选项提供了传送一个最小的在分块的方式更大的陈述。
-16.5.1 CoAP POST
+18.5.1 CoAP POST
看看在IoT CoAP中的post示例。
const coap = require('coap') ,request = coap.request @@ -2514,7 +2578,7 @@
16.5.1 CoAP POST
[ '1', '\'must\'', '23', '12' ]
便可以很愉快地将其post到数据库中了,
在做IoT-CoAP的过程中只支持JSON,查阅CoAP的草稿时发现支持了诸多的Content Types。
-16.5.2 CoAP Content Types
+18.5.2 CoAP Content Types
以下文字来自谷歌翻译:
互联网媒体类型是通过HTTP字符串标识,如“application/xml”。该字符串是由一个顶层的类型“applicaion”和子类型的“XML”。为了尽量减少使用这些类型的媒体类型来表示的开销消息有效载荷,COAP定义一个标识符编码方案互联网媒体类型的子集。预计这桌将可扩展标识符的值的IANA维护。内容类型选项被格式化为一个8位无符号整数。初始映射到一个合适的互联网媒体类型标识符表所示。复合型高层次类型(multipart和不支持消息)。标识符值是从201-255保留的特定于供应商的,应用程序特定的或实验使用和不由IANA。
@@ -2687,7 +2751,7 @@16.5.2 Co
简单地说就是:
-
诸如application/json的Content Types在CoAP中应该是50
。如上表所示的结果是其对应的结果,这样的话可以减少传递的信息量。16.6 CoAP JSON
+18.6 CoAP JSON
于是在一开始的时候首先支持的便是“application/json”这样的类型。
首先判断请求的header
request_helper.getHandler = function(req, res) { @@ -2758,7 +2822,7 @@
16.6 CoAP JSON
并且全部都显示出来,设计得真是有点不行,不过现在已经差不多了。
-16.7 使用IoT-CoAP构建物联网
+18.7 使用IoT-CoAP构建物联网
注意
:windows系统npm install失败时,需要自己建立一个C:and Settings[USERNAME]Data文件npm install iot-coap
new a file
@@ -2810,12 +2874,12 @@index.js
(新建index.js)16.7<
show:
-coap listening at coap://0.0.0.0:5683 restify listening at http://0.0.0.0:8848
17 MQTT
+19 MQTT
MQTT(Message Queuing Telemetry Transport,消息队列遥测传输)是IBM开发的一个即时通讯协议,有可能成为物联网的重要组成部分。该协议支持所有平台,几乎可以把所有联网物品和外部连接起来,被用来当做传感器和致动器(比如通过Twitter让房屋联网)的通信协议。
早在1999年,IBM的Andy Stanford-Clark博士以及Arcom公司ArlenNipper博士发明了MQTT(Message Queuing Telemetry Transport,消息队列遥测传输)技术[1] 。据Andy Stanford-Clark博士称,MQTT将在今年和明年呈现爆炸式增长。
-17.1 Nodejs MQTT
+19.1 Nodejs MQTT
@@ -2831,9 +2895,9 @@mqtt.js is a library for the MQTT protocol, written in JavaScript to be used in node.js.
17.1 Nodejs MQTT }); client.end(); -
18 尾声
-18.1 路
-18.2 其他
+20 尾声
+20.1 路
+20.2 其他
意见及建议: https://github.com/phodal/designiot/issues
邮箱: h@phodal.com
diff --git a/images/rpi.jpg b/images/rpi.jpg new file mode 100644 index 0000000000000000000000000000000000000000..5d631591469bd32b165d83cdc1ee69ac2928ff90 GIT binary patch literal 204917 zcmeFZby!s2);PXr1{k`#OG3ICa_CS(R6s=O?hXY8TT(!fW|T%!8YPrg32A8o328~m z-_gpL^f;dB5>||NY&~K``hKz!(AU9~b~*7}MYIZI~E %+` zIRC(Z4*mXa&?>)Y`s-K4*2CJ4-O$m)*Tcur!;@X@sua74le?`)fDgE8H<3Uq zPZ2R;Q4ye^9O!9f<6`H_Zf)n_ yp-N{yw(?m*7RL@h*&e2Ib*xT-Eu>Lih zU>6&dEvK>)yF#E`pqr tAozE;2q*g=6kiubPE$QYb~O)g zJ9a5yNnue=XtcMjy_}J{=0C HtB7(zZl z?!H!mLhe3X|C~YH&d0{v$ ~A5IWaC2iw~Gy^g1!x9cDBZEZyCT B`P7RDIqQ)Dk-UgQq$0omKI0-SyxWY+s?|@!~2?thpQsz|3;&KZ{R<8wDWfI zx3kss_HbkWvjcKY{{!XXC{=Y0F$rl^F&PaFF)=ZernHo*BuZ9QT~b 2b%A!z`(vm8g|BJCA5HYqkayEa_{txB6YUlM2$kj>dzn?z^k>A<|Jz)O}`U_d) zzfAH6<=+(apSY0L{|5g)K1%HWY5$SHe =(Rn^hM`JF)kz|9OZ0|=%ITFg+U0S9nqxFI0_?=i|B{0o2Z$<6H) znDfx$5!C6gQkP{eubj^jo9d{kSr{4_XzE }xqHCL0dRBo^)}K{WjDQH z#*XZT79aq4KnwsY8y`=-tD4t- xK#_j_l{h9yo%l^opd nmgkC0$nDwoqc^=4s^~1i)WB{~iS>f6JB~60)=yN?KY-To@An-|c_<@NcaD zJ@9*P|H9b0@@LOrw4eXg_ph=4>hpL7fb1S5n`i&(vrYk^_8|cD aSm+k+ xWkhy>3-B1i>UAO{qJQt$@Uf_LCO=m4KUKNtoRU>1A_ zt6&T4gJY;jgM^X5s9+2*HrNH208AVv3sZt=z%Ij#U^ifvFb9}B%nx=Kb{`fAi-)Dc zUcw4t6|j2PdssK@3+yZG8*Byk6Lthgz=`41a27ZZTm&u)SAk!GUxVL*JHWl*!SDz0 z7 }bxLI_!e8o~f!hOkF?BSH}oh$O@-L@A;H z(TNyD%p%qhzi{wysBqYEgmC0>v~jNE*x-2KgyKZuq~a9d)Znz?4B~vl*}^%)CBbFJ z6~L9l)xkBzb-)e4eT18Yn}=JC+m1Vo`yF>54-bzPj~7n{PaE$Bo-^JZyePa3yfVBN zyf1k3czZ}Bk^w1zR74set&qORN5~XpF|rvsfc%a;#3#aM!xzWb#5cot$G?Z4gkOZ; zgg=14gnvvxPH=%hj=+GxmLP~AmLP|qfuN7zJHas_1tBk?BH=YcXTos8WWrLycEU-* z9U>wkP9hZ16(T1h3{f&sIZ+qUH= OcE|95^-6jhrOCqZz>myquCm`n` zS0lF~4<%0{uO}ZR-=m T|(VUy+uPwBS~XS6G)Rr(?~N*i=gG9)uDBzjir4< zJ3@Oz$3mw ce!74k6$3TAbY{_!ix)?7Y=xMc}#d7^VISz^V0L`@CNg~ z=AGmt;Zx@G;(Nt6#E-`>%kRRU!QX!oeo^Y8 K*EroV1*;+#9(~c_Dch`6Bsc1zrU^g&c)>MNUO4#g~e+O6*FO zN?4^?We#O4 7e;qb4yD~>yB27Hm>$1?KtgG9TpuMokE>0T^ZdF-L^}_m#$t)y)<|E z;$`p44SH}rUA+XoN&O4@?)tR`z(B_!!C=ae*U-!G?G?N$hF8+AEEFrCYr_rMruJn+K~$pvM U^o8VCu6U zpWj2jZ~jXDY5s=+#sQUq6oKx6pMx$2Jq=n4)(p ~3sDJq843%v z4*d|u74{(PJ4Opr5Kb8G65ex9^j`eE-TNl@8y>Jcz&x0LsP*vmBhp9Sk47KMKhAoB z^Tg>%?^B7VDNoNLY$HBKibf_yoYgS;|SOW9o34YFb%3bNbWt zgACh@flPE}X% t)R=o>xiPc-j8hi#f(Qow>5Pg?Ws5k$I>2?)kF? zMg?t!GKGaj%tf)U;jjH(uN0dX_m`-b)RhXAzAU3Hi!2A_e&s(ZEGtIdTzd1NQns?R z>Oxg|HC1&)4Xh@pW~ Kc+p*=Z zu3xvu{l||dFq62G5mV$-Nz=^JuV(mX%4Vf!8^5W4`#g7bZereMes#fT;pF>+MUus& zCAOu)W%1>AE1E0)KW_f`zUsMpy!L3FVm*C>Z=-4xz4>{|bnE-J_xAbEs2zr#{9Vc2 z4||4t)BA4w#|III42K23WPf!YnH()02b>^Jl27?h8_q7BO`f}*pP#n?3Vir=1Umvo z0pJuc1O@E84X{Cx1TN&Xq4qmM_}yS|1P(495}$yO2tueP2XGhy0mnh$;{Hx@U?I?R zfJ1>x$swkKM|H&t$>~Kc9v=4+pG&pkJ&n G?|TG qNN=eJe zqU6-nH8i!fb#$*@yKZa(g*P^~cJ>aAPR>5Qe*OW0LBaPQJbd){$ N^96$k{AQd22bV((k5c6d(#ng9Q#>4> zS~c!v#d`uS38O6 NuUiy;NsvC;NcOF5D^fOkdZ=-jO-8M zKYob+y8EwV|Gqn)f+9-W^Kn3ofI-THpa9C?w4PyQB#ntB$~T9D%wtJKCz?BKuK=|4 z`WzavcaS;~#VnP;iT5|rcy|u4V3!)C8AyU};~2OyAyBQSKXru75&}czi{N&aE>K%R z Z0kY@dXc>mILBp{4-R}|i^bqBS zl8+Li`gtU4 ?5D;|G??42sqe(Ugsln_WUx< zgF3_tnj$^61EadY983sr38}+6dQ++(OC9m#YpL-y6(0iLE2n%g62QKSrX&Pvn|oNi zMGT!ktP6`f)yK7hCa7~rK;sAPQ-kjvVyVD<8%;1Vs#pM%SQ*EVe7Ki9_{&iH+daio zM?jR7Ujhl56giR#6atE1@@ykm#2ywIu+muqgo6-ejnE>a%X~12!(c;LY_KpaeJK?v zLklsdpGgASeh`R7Ec1c+b5Mo`lE8sMR%sWwQ^S}@TFVdxShDl}(|QHCib6l)eczRK zpn0-Is>sL4bbnM5w-em)nZ~%9+gk2o(aj5n@Smu?RWuT{+Omo!?Un5T9J8zvvAO`J z*ue+W5Ai}1;-Pu~+XrP`aN9s_FTWq8@2+d(&6g>p0vOl!3Yrk91~JI8iY7R{GYFgX z%Yh>f`{7GJcd>|SfU}g wS f4C$>C}jR*?O 7bG$?JqW-O zgr6+KR944}TIknxuuSOz?d;4-n~mV&?A{3 gx4q0ljb`*LISYxP0FiiIhnoEH8 z@3F*Z*FZLJnHi8k;{~4ig6Ve=z~38*#p1{+BF%t@zI;C%cQf5kKI{C;X~Qa-2o3Ax z%7>JPHDei8$G+tVYc1Tx;vyKZh-Q`ozzk` }KL+$YOKR5|JMk_1WD8<=;o>aDe5&W_0YlcCjUVNd8F z<(CcQV!p4eXkg4Ow@1gH;h`nLyQ~fjQ^M#kL-_t`0-7L`50=|l0K;x9(eGgiFdNWD zRGfoVEY7mmIEL!w>^7QcbUXv&-cLdc3qF`{Bmf(@w4g6nl-{7=sJ|stcGU=>W#M54 zykztGNe*%l4Tf<4PF)}t0Tg#406KUObRZR%%OS(8$X8BuH~^r8zZZ3YC7{bUfK&~O z;GKv7E 9z}GlHRmRBc{%1r3g%g9~lQ9mrCV=|2YpA##jBIT7%2twN`-i4U;m z9AI&~I;mmj1E+6!S*NQ=!chx`9B3>Ei$fE4odZUIAP&Idb}N!1a{>RUA|Kd2dk*H5 zm4?`vV(MA=tAJ7p>vK$iepVs?VURgBpnnY$4NZjV1Q~Y>jp!1(vCp7WF~5t2r;g#A zI$>;f3&B!77U{>P3*_uEjG@U`gwn4*U7(zm3wXS>6>$N_IoRvR5ftkPeNK(m4~A@L zS0?6S<$T$9!z%>V2GlTy)oBc)b|0iz#9pHj@DH1cWU>cXLEcm(4r2ffMsHnz&apgx z=Q5EFj~=`tSY{(QHAhF5Yp^WX67?wL$Qpwfc}8?}6=tx5#pR0Y#k~XrKls687RYWJ zu<*fBSmgKrSXob&V1FzDA^?jFdaTF?3xGRe@|ojQ(TG$mnHf;6gZ8bTkRPO+Tugv@ zN+h63xOY!}pgq2!DgD|3-vM-BHXLC=N5uWG&Urm{s;wMYOa`=nF^>uX#sRgrav4!J zbS(!^`*zOjxA07dK2L>dg?-n??G5X|Q2R=bk@S^OWBehvL#99d9Eh<(o9h{b1)dNs z*D_D;^b<>T4q&KISR}bDbY?^F9AV8WXwrq?9W)6R*C+_G$b+YEWg&aql 2;kF$YnbGv@Ce|! zGJt`5U4vi4ctMWLD@G2ow0l^@3S@CJ(+L4G-z*2V3&)U7@3FH$b`0qbSv}zp$Om1w zq&_BVGlJnMDi&fgVsLp7sQK6r&nPl|;(8F5!&{aV46h(OMfu>_drR~M{NnJ*U3x4I zZ@(X8*V8jwr!jTC${#Rr4baui9044abHU~4%;cl%9F8}mV#Fp2^SE?*dS&yT*tKYi zYZ#LDhGsqoAzphqi07wdkiipIR5@|1BT7`rS~>@#xt=7gHOg{m4y7UR0P;1Mc|}<) z$hz$ad;1VD9UCGN`&9X0-(sCXpe(md1eTkAHxJ$q_$6V_e5MmIHUXW~Yw(5b%%-Xq z$IbqMa-#Iil$?H2WEu4{qCV%>z-O7?6gLMR%HmuMG__a?U (v9SV<%3S z6a`` qZ4lOnnw7L1b>`4LQeCV{^UJ 3;TF4VjZK%2Y((VAFye7MK2c-dwW+}OyT`%4;=+t zI>L`W*OTtEepBPhq(A*&0e#;< C!WMe3G# z3JJ1}=uiu1)L(ewnIm2zYTAW^FUHTH#T^kXCpWf@NSO47s$ajpIZ`obZ1Un`)EWVO zw|oPu0D=AySK!r(Z%sI-`D}9}ZJXJFN+-+Z;*W=?uTMPcC2g5_8*D;z*+igXkdV;D zXG-|)6|BXIkNJ(jx5rASbeuh3o{}u9S#IlDTXrWBw6DM19*qdScoO>9VsN()uO?$o z;Fe`vP9O1|rhXN!1B-XCay)%9n%jeEmbC(vTE&6(t^0jL3Xii|Qw8}Jg39iAE%04k zsSTQo(S7rEtRq)@S1Wt<>RrDr%`~3sxhY=N`hk*gmrrRd+WAQl;-*g%C3b1597n1* zvSzLNHq9nd*~pZHoSKv?;tyKQQhyM*iB-S*X-oOU0ZpX7!0Zkpyb`3-nFAE}d+$7s zbepu6f6_9IRK@R-dSfq`ksdx;B1TLJm+MEo`%HEPO~{QipPvg9bS5e`(X=u#Qx~66 z7S4|(Q|@DNpn!~k*&mDh%L|H9#Ly(OA$+jb(OPG;ydpow{kIig*vn~g?CRPpL@RI2 z6(eFll>pwmkkPcpkTb*iz#e1>fkOfm0`No8yCx|Li?cooIjD9XjDD8cGwMvp4FIoQ zEKXm(8Wi`5-|0u317;sIz9S3|1x27?co=d&D3%L0L}(cpI0JDlwp<|62zbIyuffiT zPwPO8BWx)buq(_O!VeCxNXXf}eWMRM>PIxNLMJdk)5`!$6#F~?vI_ $i(Egf zwhW3q!93_kG)tiI4QioCtVbS`u^rp-3|S@#MCQ>%M|b+covU?3hd!4PP0-n9S%%@C zXt0wz&|`5=_{R{d+TeEv0s3x3If#AmHkv#M!L^5Vd{B$p!@lAT7N)(Z!@f6{Taja! zYM5O%uk$7<#Q`iS7`v-!1iZVxc`4anfT?}M$p`*qFci#gZ)(X--XL-&x~KM~SBf(2 zhfY*dZm$d__t5higwKkecBYyxQ@`gWhv^dSG^V5%44sXRDQR*7{$1wV#wkKf6!Xl) zv1V_nyk790GS1G2Q=LUPnQ9-tp69H*OR;_TeZ*5qm)2*Vn%C<~9UJxY?zSGYx1IxP z=~`iNk{?BNONU{(LG%wdS)+07Y$k2g_S2Srpp)m9OWO5>Zuqf2Mr;w{-ZA((r&m7_ zQYiOQ+2=DIj@zkA<7-rK`kP>`y}2&3O07<-TjgUrDc_o_lA@)nx0=msqGI{lK6w*N z9M|HAP2I1Jk%(ByFLJ3*YlwF|RNm(+zkhk_97MUU6EWTKpfaGuL!eBpk#VEQ=HPGf zRcrn|wYWaJ#xgvMI}@MS4!^tmywc=mw4pccM-ZnQ3J~vz#X1WkMy_U(I@X!i#cwC* zQJO{Q-^*yJBXxS%x_TG^)CTiN01w&VGzOM{CLLF*0(DTp81^C d_Y z+N*<&fKO4Ze`pdgrw8O=yylW&SiE_b3N#^lX&OWK3ks7RS@^)w7QZyyw}-psvI9$D zIUPj&>JY|85_tVK_Sty`)Ie+xic_%%or)4@B=3+zBhZ=1hf>l$XCOU?p<~McGLQw| zI_gKBkDS&+f!s8zleG#2;9-~zbdi?a^ASi(-k~!|f@pE#qgXRsYeR27*jFft>;dvo zp3vbzLQZaNXBAD-N8OJf^s0qt^Bi0!0BhR=k$_T>-xOz3tQ`oi`OlAFnCXLO`(at< z;Fcjt->ObIo$L=~Ml?u2GK51OaTrZXV*-=g9(e{+$QpP?!aaxKv`GcUof9Pp4HIuN z7Ni+oL?6e(E^Fe2=k_mR7oBf1M0 NCr1S`h7^5 zA5-O(rzD5>&6~Byar-9;dWr|_mOe?A^sBi$8^GdXYv21wR5b=wf?rQ^Kx^`NfWY8P z*3mLHQc0M6rm{JLS8-S1l~3Pw=ehfitNu$BI|pmgu2;XgwIz3^g@$RAu~CSGWM)VP z*BPCIafg>bOUY^{gMF*5Ow@gp!G6(MZ+VB nalm+yim>D5iZnrz-&}bNY*Hi|0c>HRMC<9EtOA?B<5WV`s})T><-yo`|!!Y zySq5Ygo5%Brn^w02isLP1EFLGIwvGRM1drqwN4VZeGWrR_7Q^^gkq_|{(hhVWax7( zVb64+ls|mt*C5!3iU)fOq0d2P705=d>|wzGTwGg`Oz{Ugj6UCzY()+1vp4}mctEEY zny4G9Fl df#C@d~i?wGFz&?zApvd#2C!=Tt|u;uJI?0odJl0?Or zWPz;&UY@>(^=E-na+W%43{xE=0ZDcZUT{B7Q6N;qKod_R5Bm`(y+a`FXx0$ckP1_a z3O0hhZD!Lg2X|7@!fU&836?w?oh9sWPdP(aonI&Pkp!8=2MjY4*GjvQCDSh~a$5&W z9=EEEJJop`%Ecb*&p{7ypqzL{63j>}j;XAq50;bIEb|kWP8y1*Jwu%oN{dHDkJ8f! z=Gac^M5QlHSGqbbxqo+M4Jyv-;q*Qr{@ke$@jXF~GvZ+&isr&IxA_QQWe&eX`h0`9 zXm)l>OrtGD=LL88kbm9-B`F4$ _-1tuoLqT#a%qlbE4T5hEI0{Z(3 z7W)QIVjp-l5$r%89A}=GMBgxT-CdEN+$|&*N~#vbU}^#`Yp MH7VV<4!jo1= zHrIyfm3MG6TGo6JtjdU6&L+);pDwtW*zB1Nh0ZBs%T$?I?(dTQ{Nb82=@jPdvk; zSBr$4mP0@5@Jwl$-u~cA6l)-8oJV9tzynY0v`(ov)Yqe9X_L_oW78GJA@RI_h}rL< zqo1i}|IrZ{ZZD9lxWyl5qscI|yK2niSe#Dk74b?3aWA+ZxtO*7e*02KDCxGrqpB 7di)J6KNd$VT#4dX4<6T^0QV|;{_%*&98glC-^zc2EK-h=&kprrXyxAJ$ zoNTE;Rqv*oz|H)ZG|lT&+xhIgZ6S7e!NskzCmLoKhF`px3?987DtXs)#C^8fAcFDZ z)0?=H9bUgmTo|3r7 +3mAo^fr>)4ICuBg`LCZIWzDiU zAGfiR_wPkt?if8Ncdrk8;amyVoUNDbl{3B)pjHqc%;N8pa80A5+!_z8_6=azR?r=L zP`#~F5h?~M7I5FrR?a|Nc9-qoBZ>?k2!9$gRRB&MVPM(W3>F+=Nq@pGN=3iYSItg( z(hrA Im~yMT5DG7WM4Pyy2Y9O&aBSl*HPB%qP$ib2>kLLPH(Pe;7_eX%T1!IPb`aC5W~ zaHNDaq6f%7D+X?&AN?xKdIx2b!59=2xapI6h7ksUofon^$)r>w3iBtY&ZY!Qyax?e z(IV;cY&*XOVNIUB5_`Fph>P=^KI5q{^`>3$jStm*@Tx`j(u|}juK4{Ss5}&u9iEj7 zugi2~=#wlK-N9_|S+Y7RZePaxb$=uW(L)V0(^=*h&q)wb?oD7w6Kruv9}>&=VO_kw zq_9|NmyNf0ef+DU070q-^Uxr?ZLxk_j&oNa<^2g>h!c%B*Ttm-bh2b&Z7H$@ezB@> za;b(7p7t?i)?34fXFlGxLow*Js_V?4a5fURqN~K(jyq=j!*>~Ca+QP90_LCc@|PaY zXLVGoGi~=0Zn>xuHk7n5+P~6yPn+O#4qSV9B<9K@E3?l&Hwjqk&bJQUGfC)=K@QXv ze$B4gFNi_x->f!0BX(L#FRrE1j$TduDRAPDYjDkfv};~{n@SV*%&9g_Vvv)!gx_87 zR+PoPXSgHhz=7%7hfbGoPq~SPsP;WcNds4J>D)fc7tGA!+QXYT)eXT7rugHwSo=;4 z8S{I)jQDLY=*wPHba|Eb#@>61Ert!BT)OdC;j@+4IdHsdGP1!5t9*Vec&ww8!o0*h zDwt6plU(r8 3pr{B*FbiN z(A(vU2-D%wP{TuS@rqF!<<3rLMJ%6bunR}*G(9rLd1!-|iE-p8Y2z2eY)qoFx G5Z4eJ_OXHg)kU-1xPzL?ypNeQ-d(a)_)k#WtfgUuyZj|&N>_E4 z+HTX;+&FOoK%VH4z2ec&FfsGJqYP??Pd59T--?LB;DNU}MUC4{W3mDh%q92bidMMl zc1(DRy8@EyR?+=~oCiun2&+ZD6|}j5WQY&ClrJ$Pj1W&G85xYj_spgQFpZWv(g)oi zrAFY!>98{s!brPT(d|EEQCMM)qaAdqh;teVG5eAv2C9wsKyLRS-;-%MgkO|pCKoV6 z<9Wm&6VR$`0M*Z!A%6#z{uD`o3`;2Ffxny ZO>RkVTAAMQ3nIcMrUT3&}RVD~=|GJD*5LUuEpxEzS@u~P` z#l>3B3X6BN8nP$RQnF1sKWfQcq#ryJvE&Zc&6?LzxRYq5T*G1QKiwKPO38m#< X}&e~Lh*Mc-WP4a;;P&|_@7e|+7mf2rC)%*_!!UKND0RMb {yiTQ#D}AFp3jmGG@eZ zlh2PW7;nXk6{Ifv8=Ix_n}3WvhrUz|tsZ3H%9vbTt9IOO+kU3BwL^E}a$Rcj{;S8P zPhUhnshdBwJ_pfGeT%p(Hn(eT30%k9Ao=j|Zmg8VS;<@br~1;9I`UbpCmPK+XTIil z5JvBWeUL&K-SN6_er^0p{n$nkhq8TOq7r_f*9(pt+*X;tm{YfZ=zKI$l+7Tm=^!Ht zEVAm3)oHTZ>k6;9MO~GYcm1l1n)2+J_KDT8lG!>(!uyy7Qp^)h`cs!&se?+wxZoqU zyz;Q3*p=H4{1p}hAFtzoIR_u=N3VBZ6^i~KKsxa(YWt?vH(QHot$B;qM%_{Mp)iNS zQl7808S_)#cWM4m?$`IxQ)1kzq7SJ9hchEH04zL~Q-% z5L gNCpVRYn&wYBD^{i5*rVzDn>* zys3OKG{1U_VyHcXSOO?*%}*NVn7`pc9*%BXok^OLb(Kw&p47Gn3e|qM?DyT$W*BGH zdAhe-P*!#6<>=6%g_+m)i6~Z2vB7gtV%p9^S3bq4!!GFdJus)?wC$zoOR)vYoG4c9 zlB;4##Yg90wkC7br2JyxWM4HIFHF;UMgC*kP?bS{ER9pejYC$ZaK^W}HN;WDZVU?Z zc>;qkH(76U+_=S-l}SUcH7}h^QlW#QC|AnK%&3=o7^0u*U3FF2`YuC(>(-0Mcmv2W z4lcy_yJg3iuQwV=pZ&Nj_MU!^CP1RRwTM#w?3%faa`iU!{)I!iMl0K)7B9g@+i}Fe zuOp !PK3-CP&2fh(_R|dc;mobN(P}=) ziL_4>Pd(h#Y5Uc8wBOsh)5;Ey&62i^c6sZ%EzjgmoJc8?_0+v!tf oU)m-IfIDN(zVk(8_52 z!T~4jDl_-@O%16qo~#~;(oBbp57MDunkCPHJQ*u$`?4$3TEk{is1xDJC?@>yeMFBH z@0}Yn(8-K5kmxloycWiLrZID Y=0)>O|dHm**;-ydB1Kd zTX3;uT+sAz{In6aaGf|bgf2L}?`$gZ90<^HZEr?gxjPYg%TjDvxw5pwz;%xC%QxrJ z*ljthv?bc%A%hbUi fLXbrX5XZJ9hhnXBCQrZU?>1gX zE-E{uv$ZAvV5Ph}QhA&_O70-~rSP=x 2SO6BycJ|jDoz~>_hdN#8ZX`l_$Sea79uRP6_Ad zl%upWmZ}?*8=~JxCC>8qT{&*@F)Y-*qiJ&6;H3H&74xQ2^sj`l{k6n*UD<~z^Xi;- z4NbVB;zGhO3xnBwLLU#)Pur->fHs1eREtBRbHHJLSTWDbZV(V$Ec w{ve+mVVGty3&trT^3iSXup)r@BF-(BCPlwI`wVXArWU- zWYfi~NsVzdO^fVVI}1Kn6eQoB11i&PrO?`@nNOTNhqZGz4rqtQH9NE&^At#Dt<$&q z{L^?(ZTi0Z=ZvHtmrlR_T+i0-K~vf(Lq}O){@hg91X0mD7%}|K{#8cqVN4d~Qhz|a zTiByZOCg$U5oZEAHpdzZ2Sq3XFWfHD>}5P1e)ZD#!Yf|?8T{*q;fr~bCsWru-blw) zdhUpht;vnVzke;%o3&Rd8(i;^_qprEJlWH0+8w|0p74|X{0Pr7k2MHx?>E};`xY1} z8@;j7$oeSou)Vmqkfh_acw4TjgyemO)tJ`pVp_VmnVYQ93I|NG lqK0=h8WkPVsY4I2er+tmeT&S!{k!;WO%5QOHnpsM0#E)Q(9Jj&y71M z85gn62#E_v8@fu;t8 3+Y7LZP%J{ znyLAfr16B4ic7u`x8`pRz>ld}KI085^UK#2UJIG7+56#iRk4Q)_sUz%{n0bF?Xm9a z!~D5Z&HX-|ieclQn^)>%Mh&W*0OckA4?K&{__()Z$R(~NtoU5KvFN~WM)lUcTUjYB zW++tXa6-4Pez0^=TE;(K$1TJ`63P%wV@6FhEj7u?MxUwVt>~ 8)(pBR{DA?a*i}Dz;l!G(E5Z^?1E Pk9i <`)|6;&x9vQlzuHypx`pdeEIGPb!d=O!|=&xUWd DIqghP+h!nw`IKLe+#W9clA!@_I!Z?@KI z$`)Fk)1rQ+)!WQwiq@mnr}G{$ZohRuSUv}z*FH%Q+j9}E=kq&{R~apjH`Po}A;+K~ zP{xZcoFlSx`eJSK;cJ`&R_b_dY# uHv=u^0*D|)z#yma3OJS z>h$vVaD{BJQ9-Wsz=})A#8;2WUzT^xx54x7(^}74T@F?f(t)cP!`+NmZ{1kXlItj| z>J0m^uq~J5sG#B*GiBPPazvJz+i~gjanFcX^ov%ZlZe&r`|Zzuy=i{RW8!|jEs8mA zl)E1JGcRY|cV=37UGTl;z>CRhNs&;gz_Y=&anh8$z*4&`qXD;S{Eb}88$202Zu#-x z3L8$$-rxftKjYHR8=rQF&D!|7r-kLF{6 +hWQ{bD55T;p0fldjxb zXsEc*km HTn6FTR?*^d@O3`-gH>S(}@UR+{SDw^c4WGJ>TXsIk^Xi^gA! ^%&WQI$jl>>9qmLfz_AR786A6kFNhb5pWOp)VXDJpmcaao1rk! zWzRZ8cGq=Nf#F!?Fmg_)x7oShJTTOPY+1(aosmk2!jE-CN1A!p>(0K3-NKT`=FL=N z+Y(2KqIEjPxzf2bm1Dw6f`JWqesVnnI#7fZIu#NmwWukP^zQS?hkSbbD-F#jsK;L0 zH`_nbOx$RsXht1hPLKNOmC1k1zn6ge-f^R7e4n2zN=Y!nK*}%eO@7&t`eWoaPiijj zeu_YJ<+WcWek&EBY>`dk4FV*YB}L|wUEa^oI|f{^gYqW?%9yzq7cPyjtvzP2mxx%< ztNnWG*D@6ObiGt=52K$n*Rdb($T=VvlQ5-A)_)tk@g#K1MsXzTP0_B~8LyPS=;!b9 z8jUi>qZ_*CAQ)ds@bDF$!z~lTtCNv0lzXBb)`~Pv47Me6J5UcxhpM=g>E2!2h~{}6 z8Y`Z{<&b2MqGtJK;TuMQQe47JH+{O+-uG}q+~ekI>6G&I73|F6%}@am!HORN@q(_e zjCb;^7(D72o+lcO%}Ps*=YJjA_;e1;cZBWd%et4RKOVb$-R!^7Bo W @y&3AIIcwgn(UsSw0vn urn99`UNwnx@=j z&(N>$`z+~b9(;Q;{qsb>%gf(xSSM`a%{kzz9fTyZs45fq==9_LWZR_cigKdX_$RLu zKNh+Fd@=2IDO&7g<@RQ!ahUwq>^+;-!EPU{W371nK%bQdca#oyrDjgN%c|#3?|j;0 zwlYogZkeHxPN{5-*be0qcBcM*SSIvID9mdbLzN5ouwV-+GdBVNeTs-C?Lf070@2vk zai}Uhcv{76c!LRd%@O__3-o Ff$eL((_eorCWSt7eA0&h(akKng$lVdAqR zgB&SOkfRizz7g~(-JeE=Axq)S{3ey*1V4R%QBPLW^q6d6ouln1?v}7(_ETq`T}G|% z`(^Vpl!40aW@lwDe_UO8;hg%gIN%vdhx1tdEkm|dmn$j$iaCR~dyz{>SXs+Sq~NEa z%0kJ8?&jt_)L4_!U6*%trfW?+fki>DE(=vjNWCXS!D8c2;`%;&YZ~YtDfu^K<#jx~ z&|q@WrI|%Z$-=CYC9B vBPw0xpbaa~jV5QFQSbNs;Ry^xWhOs7Z8o1B`X$89sz zGU>!&O knG>-=Q81ntGBJz z z!Lnc*F>}uV4VVX#^0nUNWc$&a-t9eTH=9{E`DTFQn8`n)#J;+3#v9oynYQXO;SxDv zUKpr1sXF%L?l3c+(6WCmjZl?+d4K$Yb*%WnnebhYdtWTB9JbH7T{21x5atcvr=5L; zzitw6x|5*OcZ zg1K11oaP>!EyZ(rYi+iGFn z@l;yeQ{1xJ&Jc-`Eh+pe)NVvLLwFo@ycv_l<{=pR$!*)`_Mos^@1et2YxVTmU&Z^e z7%f%)YgreeLe7tTjWE^W+75$Q5gbvq?XdRL>XpgGX?i#J3opK}F#GQlug7Q;)_3wo zbY|4vIR_RgMy)v|A0uhAn9ih~tWDlQoIYK5UwHb;q45#Eu$4%Q74g2d*5!L&W{($3 zWG0^&MVhtKNH#;X4C9Q)c9N0Ld^QcYeVTs}R)@>`sY279t5$z9)jPpXjkIY%%X)?> zRB_^>#jU{O4)U8^b25!@ZU#O@ap Bpy6eE{xs+0FBs`l{pwy?>)OJ%GsW{GPe^&a18b4Np| z<2h^8KQV`qO0={~4)=C_bJCsu(LYmlSh#(gi3NS*#CUl3IK?u_<<-b|=%Km;#T$n8 zTNbDV+`iEg%76gzB-*qu8m8Zc&Uj9&-qxy*p7FadCLU9M`uSBIGmlHH;zF+cgtxpn zb!6GIwL@+!v$ZpfLh=;tOnLbDnhb@T?V}C8pI#lR3PeXkRms`<>CzFxC)PuI89v|2 zS}iDDYB!5kDP5X4D$a&e={Zu|KD#K0#(7Zds=Cp0JH+Uq`XsC3Ek k<$Z`p zi@QeoZkXd51(YjL;`i9k4a(1Ba%J0Z6e_({zPc70K219yQpIwq^Gv=fwxjhuopBTC zq1U%YZRB9p_n)*s=DwGV5`J#O f>RTcHY3gOA=pt%VqE0rt}M iA{6H)d7o{wyztXYziEWOzB!n?KwnxC{qe JDTDTPx 1k*R#G`EdQFNaX&A= zsdFNXL;>w5f_GPSaPc8mZOv9p#iMBW8(hoCc(L@D%(=IGRT)Q_i;T~m-e&Kb%>Ib< zxIax5yRoFF$@SyayM;Z)#6slLV(#G+jyWM#e!`|o=Mjz<1$4w*+@Uz5m+|8wXIXA3 ze=FX#ATj%B*7;$Y*u^?Box9lDs5qFaig4!F< K;=?-#rlGv3|({{Zno z4!^?&x&5u#@%gqF+E2LqpNP7^_<5mxJh!)N8$A 7E(*`=#kR55su1ABL9RA@NVbiz)3q z7vgF4TZ?ss&5|BlBwdmf^lb7t#Y2q06M8txHmB};&{j_VR&V-VgKfSrX-RK&s#<(9 z)2+OHsp!`_CZpq3)Gl^O1>qiit75^CWRn9wHa`l&bva(zpG||oLlsM#ZkO(O8-z(2 z?dFXHrJ5KZn w<}@4?oK6qgJC01E#AM!f > zofph+G)9g=N<^qej{KWS;;0lQ{l M z9S>UZ55zl7d5zVi-VkUmA$x&tvMkp~Jf@wvkIg6(cWmaegs)LwZBA^*4+_{>Q=X~r zyZJVK4S( $WQnlMbt__&dY0e(o9d3(vD#+F4D4#Vvw2nA!P>-N53s zRF$^VSMp!0J{mkRg^c;9%^ULGF?uOWO)Y0=+gn*X-Jd?|-v+M#0O4}$9|^Rt62WYd zT={xFr>qu4kjrl!%n-_B#w2b2UO>SkJ?d&xgj(#^-E+m3O;UKd;o~Kvc5kkU+e>S! zUn`sjgYd`48uyH4@Ft(4TrY~O?qs&rbje9Yv+|B4lIBD5q-s83=kF;6bDUDGMZ#RK z<>qtc*h U zo$Pv-#c94j>2|&vm%x4qx?Nje@V&jykGxr?XtvF%wxS1?@yR^DaI9;{2v5CiuHhH< zzay_Sc#2YLg*_!3%2A5Ddv7Og7n46XGjL|Y+)3uNj2%u(Z!C8YuI%UDxg{NSTAw2Y zZ6fr4*XDh<@Y7C%QutF8A02G8%YTH{@kpKn)vg%DuBFE8714#i?_G18=Z~nWqZuUn z$F2MMA6 efC8(Coe#Y1(za?ENLht3!LEpEmaA zQw|D$ZM>t-NqpRSU~pR*Il`SLqUkqH{{V}>{4vd$(47uSaDr4Wxm -P@XBVv#}A);_W`(EZcbvxGG#{2wNexk~$DX z(vP)*r#<>h%dy{6FODW_6(~v)j*^X+?<}-yw!V*b*`GT2=UVv1ckvs*t!wb}QuuQ& zi!)n%AMhkL3X2MX`@tAti G@m;kY=@U=A+q<>S&_LZfKgq=QFM@UA>*6VKW z+wE?h-_~ChwXcmjXT$9p{wVxGp?qDq@`Sz_@P42Dsiw&YU>aNJmexq^+#xN9- Yg;!bxVy$$Lpzo!dN0z)RR-T z7MD(gK2c~EIKqIr0}Ic+eC}Z{-n9P!;g7~M8uh1+ol2@)@v^gAu1lk`Nq0)y`Jc3& z7Rd0=hsXUxZF>Iz*CnrW3;ZbhAJK4Diu6YAYikyRIqlp#6bngDN1j mDGu)V19}TwB3x*4yuA zcCqthoQGhMuneGlxWLH8dli)2wAlOFN*DM40IwtD-xkjvtTjvc;9F*r?e6A^A+|9j z%+fllkGi{?fI1E Y& 6S>e+}K-URgyoulyvf zBrk6EvRs*#7~#*D2w&a$cg;s6`LBHqsm7Ys?tE$DyL7xkc(9bj(gSD-EUMUT#16O> zx;fj|L+H=hv*Pu)z>Ryv8ie{pz9!SWOKooj-kEG*Ndwx*?Hr`s05C)20FFA=RXLrk zB;hS2k3R8Nh_Ad?sd$q8 kT>G5h0i~cFn{6lS}O{3}d zI#gCrS +qw;je=*_ v%>!G{9-SuQRyE9t<|tf( zIH+9L)ta>wwA}cI#Wucg_FeKw!Zw{P xpZJ=g2pCPC1pU2 zyPqL c zMPuTNixF|E+aZ_BI)hHc?cIfjIKcpqu4|#{bE?fdAELhqJ|XD;01y8FWxaPt)wHSg zh;{v6SR{scKBxVZJYnI_g+3?oPN(7>K7SO)tZ9BzczQ7anoqL7+7+T} zoskj)Fe7k3TFR_ktz)7VwVC2S7CcVgHrG5)ty ^E zq>i< a>Xwz0l#!L2WT(i<4WuubMB(c288@~q_xqgYz$^gi79+xtN1 z-xjog16f%3N>2`4_ E?_a{9oI#lHy$iz~M_zwa2qa2O! zqv4DXExi7JiZ$ke?b|Ddwl1-fdN|G-(1I%(j?%xM=zPX;9%v|azv#~)@YSgM4!kuR zc1Wxsibf0>T20bpY3bN=O(ga_N)T$C)YgmfH*GJz%cbepw(+7(aMv-!ha|)|?P9p@ zeNSpRHD^1-I&h0ieLW9u@TZS1z7=>z*Tfoq-kI?Wz<&@L3qKxsKIz)aQ_{8A5Xhhu z1($4V` GXDUER@T?k zUap^s{xe 8OR@jida_( zdr7;sw`6o lde^;RnSjp>mtgWhAXqKAl?zFb2f_U!BNYV94w2d!ZkHpscco5xd zR`E1YO>}Z55GxW)QLx&sPtDh-Ue$Rc&8neI= G^{>k3#Z|D=yc@D^>!UwKo>NIlw33y# zJJ^3^Plvi^!(CJ1*M?eM3gcb27TV8@wk5`;aHWGeW{_ lx2Qvo!5u{5KZCF3Rw7J&&2aw!K7QXP+ZM#7?G3=fZIr4(w+y4U22Lh317_W zojVpTei*)uq_(B1YeMoiRg>(#VyfVCz+4_W*XVJk`Bbi&XPYYNyCi%G;y;TXHSo8@ z>#P3&h5rBzAidF`oJl679ki)&c=3!$Bgmn$ILAFjZ3{l8bDNJ%I-huWQ}(0PZ**&0 z?R(+&wWdoPYbDGu*j>)Az$~ik7s^I^kH)t4)gjXB$V!DNzlz?cX{>n9P59T~>zge) z%IizgFL1NVdmhQ#ApO+HDm`<9?O!#U@vRIBaf}?Kx9MZHo=nqC$v;EmUl9Jnz8djP zk>RZx@5fq&t-pt6)MQB^w1BjWs7@wj!-fmD7zYPEO?-V%5mb`>()-!bEVVf~H@{=D z@OSJl@P9(lll4gm@Yz$cpFmlxNqTbeJD zJ(cWoRmy2eHr3hrYx_ia4@~%D@jCm#nmaf4evzfwqRz?$lem)MO!E=Jk;1Oy+>F=i zm<&_IQH ck;=I}p zP?~W)8Ko%MpU+g*%FT6c=OxFGW HN^~H3ineg>u=%;T#Bip dEeU<+G{S63gEjNdINZqh9 z%%g_&BN^*n%V%xN6X|y16ugs9gvRbuVMPF*{BU|wy~i1%pwe{Pp}tE977XA;<*R-? z^WLt^sih@h^7wm3SQx>j+sFsrW %oIO)Y4 z%w!GWjUVn!V6TD7Za4t&Nyn{HsK}KyC8@3d00_s0ZQ_M(boo|Qj261{8A}}U5p%#D zk5fwb5`vD!chEGoMe E>DRx1ky~d;B75Gn2nS7 zv9y8*Cb8yfcU_<2csx&6lLgDxPTT(gS3gTUEpx1RBf**;uV;0tYJM8E@U5-QouAv5 zJAFsQ8kOgiwo$R%@fh*|LB~AwtE8<3CDAtiTO71%N`)w=cAQ~n-cok5zN*@9wa=7% zZQ(5r>-L86Cx)BEx}C0{KB%uIwG?t{*U;b340D@g2usRRR@fLHlmI#{Rw>>|zNufx z`H0Yjvl-Lpc2d#W@0&?kZ+l;Un{+ hZW`UYklz7x
BP@3~Wll>Frll>YNLaZMsRfijLFbzdWI8RMah`?raa@SHR z^F_NR-zUSPvbUA3Ww&GO4;uK_LGVAq{Wr#X{{VxobzAQfTZ5xpcz;>dX44=OC(HKj zOv$n{^L@}Wo);#xqwg+n_;c$sOvX5DGLuq#%S%b}>($F-y!Y&zKQT}%&WtvP3|j!6 z3o$%* )tfc?)9O2t7?}JL#Dv9 z#|qln#0x4Z- *MP8;K2B~{kdq*g9UCZIUm7<=BYtq|n%KFgw zed6zg9w_m@gS;gt!^{5w1MAvMI-ZNB>NDI}YH58eXsvS_Fa_h>3O+Xs3>uh6+9}1W zH5=dbD-l}`@XHfHIP%ntWgF<*<<`qf*{yfebKQIc@c?+kNquhr0O9Sgg!~DkMnAW_ zd8>GvREEki8sLaGFf+(;!lA}^-I|JSQhcd=&!M4@g-ULulZ;mKa(4N5JihN-@NdT7 zj=liVya;uV4`_Ncmmv6;`$p;S?odVNJ6j~OxwQ qIWB!R|C)l=oC9_I!gtTEWd zI5w1G-S4YP&*j^@)b{OH#M(XHhI~=*yTkgNQ6svq!GkY2GZ=Al57y7^H@47LzO# zspSbi)vL0+WAQE5q3FvHoE2CpPMn>u7k*y%P3dm7*U0(b;y#dkJ@GSFfa;g}t*zay zmHn)ml&^Dl6jyQYj@nsVmTxGMp!#*^n(*^FDa)C4SM=_FJ;Zmy=X2(tGJLOI+a>aU zpUnMb@W{u9bO3n9oo&bcvRd`9zrv59`}95)=x+C|#vOi?tXSTl0a60=$LUVMAn)r) z0jL5pC;?aT9;SdK=|BtHngBw5r~$y|tpG8{UTL5||JD7jBaV7{QY@_~&uWsE#$4)7 zc%;UTYW@Pju~^L-L7YAHvt*JwcdltG9TAbw%O2OqUrNZ)BD)|X-2VVN0>*X13^((n zz{Q?Ca(@g|k7Fs&AJ>Xf*iGF0eDV5~yVgv2+?uqgsNRio`;BmAy4U$L;Bu%nkDsi+ zHgQ%a;7XE5levHy83gpe_cioq*((~C%fCz2e93Sl1z#QWxDp8KjAM#?r73Dt)8#SS z*g{!P`ZPmu=tjT+9r{w`u`-gm+G+7iE8Dh1 n$fjtQx^d)mu zrpFbaNFvh`$|h;9P4&xypq`SjMI2 vU#qwjXc|=cF6aNi4 ~ug~DA-wA8I++;8`zaN>sqE}q|B)966;&>UFC!g6jwL#`8Lsj zxKy)+TM9TCDoMpmj)cgcQ;PyHh0LS(jtMForg2FTIoQRyzF+N~J;+pw5px_NNbdpy z8;*B>KJ~5AIqcr49d)j(C9-R6?e;ktCl<=&L}deDa)98Fxf{CnpmBW!@h91&@Z6BW zGLc|ba^X%T`Qyj{_Zjc$QqmtImWZ))G )2s`w(q#c%OTT(i8o)a^VsC7ikhZ4&Dj zv82)4Lq6Tl0p2kvIQ2OP7&?jj&Hn&jcHh;`pX^#Piua#Iw_cjt&(PiR*X*yMcr#1! zHT|c=TkCrt2VdFRc&||LH;3f1un=83$1L_&F@#Hz7=6Sh?Bf{+p%&Kd{{UZctxS#( zPnKFIt=69>rT+jG(E0P?FT(u~L-1CU a$IbeS}X?j(&%8;dC9 z+xClWFZ#t89YJALP4w&ib`~cG$qr~snL8!@E&l*bdmL7t1b+g&cI-nr@t%qVZ^$Yv zf%&o9=~zj))VHVT5L~z!H_}Ugmg}+o8+<2!GvSYboSntAD-v7Om{z}=s>;c)H~IBH zU#;;!m*jdHu-#nHtIEupEdtDwDmKP3utyx=k-^1!`F(cg?Y)_lm6|+bSMZ*xt54?Y z9w2+CP!N9M5MY0@qzdPy#(Cx)aw^bv>frDANgk@hVI}_nF8=@#x)+Ca4-J`rvb8}M zp4+C~ZjZaveA(mJSEYpU3p#`M t4NC6>{t({>%H%MVrSyG`F`273GSwah3B8 zrb#&Ahz >RN&U4g{o3AKT~4z+ix`My zfzQgka%=M3uZSyVbuksHzj{qK+g{6CZL#ZS6d^@Zj1`hh^eBf)^m*>jB1XJe8*9 t4HeM~xZUNbdX<0KAoy*QfAue0A=Tfjzv5aa7bl6N4Nxd z_^Jw8OK#`i HGw`j?h3vHLAHxyqw&vGT*0iHLUd +gsbUA+!Q^sL!&&O@=zCMfQfu8`d)xfajV-O`g4~%SSOn?i+uIS1ktP%j4wx7i z>^QGYQ 0T1Qd0Ht#jGv5)~s*;U)u2kLn5TEVraL+3G6RaE<(e6co* *;Lbz(aK+-XxPU{{YWNPy;tp#(E0x!c$j_mqz~pL(;>yN0yv=uf j_G?K*(dqOO1(!{DTtGx4p*dI!$kt^KAwte%$ zs(h`_joY)-@t=QM*wQVX{2ENRc?wF|+QwwLnMO{;IOE)!#@8IBV}#Z94>g_ 73SbWLWyY_Gq%Sm%*R3KB07|*ET*6w-#zpGew(+ zZ#f(ISP_meed@5ux~tKjJ;k>E%B_7Jn@_5;-4W|r?d*x=+g)8lVP& A6%DP>xd#!Zxd!yFBX4}g>KjOBBd8z6U>Hh$0wA3N6 zzq@?xzqp5NG8rE@V#NH+bCd5< &)$~-(4QBQ`3As@O$=^ zgHh7%@4Q`b(=5=-dw2f;2?1zB2?I$k41_Q^Er6h7j8QIWN=`dn*!FOk49=9`>P@}5 zz3;zA{{R5$G}tt4d*c_zuNlVv7ajuAWwVb~@iwoeE~cjNMv#$b8Ds&anOk!VhQO_= zROO$fedAm`7*(%cqfqvI$tKnHvRZz>BCo{1ivB$KQf_=Xr)ZuC)I2ZZ3juqkNoS=r zFkM escOmw%b?43?%T_83G`u`Mbg z04Q&rRY1r92H z@q=Hy@b&)yfnUL%6411Ji`#kiSTt)7C(V||K_V+1#YhYWcs`s~u5LWbX4Q`q7o5&e zRK1)ORFl(HbnmySHxu@h@n4JdTRkp+1$Y&-ttw+>q}X2Rl3Yfw3}Caz5oJWc?^x5T zDsPnQd_wV5uk4_bc2~RG%S&ozc+*$$hK*(LYvP`ZW1wl8{;zYXCWEH !!YTeT5vD4{a7d|2B zuHGrq{s?$uLh%IX*LT-;dLE#cd6kJKU8sk16P8oZo@+H(&RVP6t4DNk)u_jw6eAfu z?akN9$^QV6!FZZ49G@P~eeo3$JV~m@4ySb-Y#KC%;SZ4-0m7;%z+R)dCz|uK8A?~? z>a_GfA p%tp_MiX&zVra%bKZaq@#{bhI5Ys8 zuyKwLdH_9W1OL|jsx8~76()%hKH^Owm6|Qxd(Z}D)C;uK$rPE$Us{8>{&mkNn#G(| z{97M5`qwm()e|j;ILf=TC^OqOF#xb(oOD9Mp<*&Vq6(t8TW<3GeGZojp> zKx1$C^S-*0GT@NX8>b)~bR6S7fUaD*DAYeS$ZJkntynv_-gka(P5s_pN74TP1HKUW zN5x+Qbw3#Rvi{yZe$!Let__3866vk9-SFDSXjVlrtc4Zal_j!pKsX+yTGEWHkI=o8 zWi1_#l>9|>TEgPm+9Zy7{IN7Z?jd&N!jp`Vn(IvGmaO&9+1KHAjqwA 0Kl#I}AL z@H{#c@=f9hu3<9TUT%SH6r`Y!n0bM+K2kb!n#QeORdY%d9Hp+N*TvgE3V0{RI^T!< z4|^V=qG;{pX?mxf=Nq6D5pwRQ8FEhpjyMA}sZGgUn^lU2i*x7uCA~U@vXX5Q?*7%a zCT{Sv#+M9^co~ck3F%sMTVoDpkFCBg_%Gpi!|gl6_g(|>g80@=ayyykkjV?BlE%o9 zz|q79%vFiYa&hTd(yHgW9I5G}yFOQ*^5XvhR&OFbhFD%Zd6ZzWWK>{5=NT2P%{`io zb=><8;pfATg*u199cRS){{W0*)4n9=YkeK3g<`ma&AnJ=%x)uaWJYxChX)z!T<)_{ zvkG*so4={@cZx2W^G%M{$zz%(nWdQ&;zb|=tU)8E=Uqt7Hf;7E+2g@p4)~Aa4S!4c ziQ>2Lo|P4(GimzNZxS-hCmW*u_$!GMsqLOISXP{()sCuE(@(j~_|AP7! e_?-1L= z;$ilOux7EAMoF1&qh)w@mku3y0ddB1DpIm$a7n#c^)KxO;17l$2=9D5r}!hqQTVQH zPTEVILSMA~ugl#d6vH9dyFpajjmPh?>si95GPvgj6?5U=7GB?K`mOExlv~}itZ+`J z1SaFRZhDp6Prpvo D !dK-Z;Irux)d|&2bQp#iSc1 zxM7ncuzVeakO4emlxp65rWZ*y)cI3Y)h3q87~yDcO3Y-jL|w&Y50;dk!Fs6gTHMc` z?D})|RQOfkzZq!0JiPda;}-Df(yp3)8qztS65lYg49LPzSbp$u>OsjP-mt4xsU&q$ zrOvK+4zc1#mTg80XyLW8nNl@^HfdxGUnO_2%V1>Wil)O&(bfD7@T~s;5 <~rZj<4^hTbA?3;0{a z5%`}?5&8ChA(i7}a}%PnFfri)2Xf&?4l`X8 y!$k=1$SuO zg0!MOc *!d>n=J!*&+9XLD+BS~gDx)#r4CQ;AV c53Q5B?J0d>ZjLiac-Q*?d3oGR}MB;ok;_fX8`j2_8c%ZVZfDo!eM@RxWc>vfKLV zY^lNP-1+lUmg3+`X{Nwsw#& 3Cb^4ABhPe2DIx0IU~Dv9jh1T4HC<9`+%GvjxQ zlfqsfwXu>Y^_}RFfRib=w~&z8P`mMw^6)y=Gn|&hMlo*JUy VxbaQbi>#)-*X?GWDPpmUWNiw88ml38 zX5q4MJ*x=a$6uMVr7P*N$k<6Om%)#RT9d}F9Nr}HYk7llEKt12c^Nqog&u(5R!TO1 zGseu^bhm%W9$#;z_`cT1#Ftw3fvo7VYnE`yr@iHj_TFM7t0@r)kvA~UL7vq8qHOUM z3cRvyHGQ=FjPDI;BT&1%(q+;08~tpV2lidHjoa!9s0Wxn%8{9nuHm?q7zAgishpbC z9IamQX}9Hj{mWJAdz5}RheG&s;okx3+9lPc_Lt(#JH{7x7aOhRjOpr;i${W0SrM3^ zJBa9dR%$%oea}XYCKTzYH1Blv^4G4t3?CkRbeqS25aHK6WpAr%pAF;j3Tm_bI+IXu zB5Pz%mfr=0TuFxKf-=1gYbdqwyAxX&s!QLyh3{`q!+m!!emeY6@Mpy>M^DzYO(Vrx zMz0ZAT{U~_Np#C?H4(hKOA9MzD*;y8NeVXs^A ^3Z z2Z4SEc*RKCSH}7}mhOMzUbrNmuQkUs-Ai|C^f!Z#)nuCcOZ2lpqECe-SK*g{l}`gh zvd8`TTK;jwN}5lS_PgKI{YI*M?DPd=n)12b%-S? }Ab6|T^EGJm>iu~X%zC*;j3JyDtAMcelLbj*4EYvj0MO*+1j z{Z5?G{690hh>%5nbZR@EB$2NX>0ZVbS7_s!KL rAB&XQyyqJ!bifB-qp zS#Gutx#WXgIDHykzoF^j+xCi2Yc=^;^$X2D?@otJH#Vl!YS!@HSj+P5mfgV%B5fyv zK?HRNsIOAiJp|)DjQwWbXc93ZrsEpQj5#JY&M1o%soQg%w*$;p!3Ugk-_)AfFy%da z!;_f2H{vF9`_`7)4*vjkk(lS(KGiLyp%aU}&kxiiwvSLIMe`;ln134W&N-^EqpQ^D zwHr+?8;=4{p<7$sYO?4ycY2gCpqI_mnWgg Uw&tXZX%kF0-Zc+4LUe`xj}C|?HKN9J_PeWkekjcJBoy!kWc zc)H)&b=UVF vZ_IR_nAB=i}@LRQ%HmMXMite=*w^}mGvI`BrB;IAL}KjIkH zS5EP4)>9?Mh!D*fvmv&S+yF@Q 0+fM+?11w=#tY z^Hk>Lvb0}Kw^m;> =CmntIR#Hg$c*@p3)$m8gpM;u9d^*=P zxO_`(;*SCNar73nvxW(5CP!_>gFnrj;EWOIYbe{6F>B#>N8RD`tQRzDNy$x9 iq>utyXtsY zm|)aWqbav_d#fv6@1oY%wYvEo7MX4PGTH2rwXcXxDOG0z3q?|K&Ni+wo|T$$T{SzQ zLoADbyq&!*`64eJd{^+!muc{_)8QT7yK8gs)@?%O*H_kJjb`&Naq@sTVS>Q$I5_K7 zHy>xpy1SKIGp8DqWrw@=Nu|uY^w!r_Gkiz;SNvMm@5SUg+`bt_wT>C=w7dvpkunVA zOB*t? bZh@m{NE9j>8qWov2W z!o`D&a8YC>z&oELn({HV9ZeraWAn`8HF(U?)^W6-EK*wR^m^NSpRnE^$j~%CI%)RV z$Nh3z_AuYVkD>h;ABB1&WLD!HpITNa6@|l@gd*Bfxx-I@5qQsYllTfuWsLF96o6`y zPI1Sr07;y2KnQwu%>W$+XaS)9lmOs+;(!;9v;f>^w-f+lf(W1w|JVJg+xS!(k19Qf zwE|=;yigZ2?o%pw?Mak#cX4DK{*{c8aX4*KA)cM uipzqYn}$!+drl(Z9w z69vMMbBf}_`;`-K-M7x~Z tJ2S?Rio`< zq~m*Np8l4<;B+$l0Pt3q;NK2w-x7W _Z=};eQkT&a-+sL2qfh#A6rV_`bp`28~7veg8J$$N5g-# z74-7%Yj=k4!WRl8z$GF9ofu`gVmh1(QgKe#-^kMs#aL?Z+?uufOYpx_%V+py;OTV< ztZjZd=#bv5o>8=)!W#6liGlgSK5~HDvz*o4#cJ2}^Du`QW!&7dZA$j*`EvfJPj&EH z;cR+#pJn17+D<(`T4E)+XuJ`qOKwi%v&%0jeWTs!Lelq>(8CeN7$rVf)r?=9Wd3(n zRw30s2>3@!hx<~;_J`5aODv6VcXi;sWV TSxgl4DStm8Sn c88u%AYWt-~ z&ekZg+(+{k;eq3hm2If*^fINz_!&iWR9xOlO7`B$S7l}WoxC+Q-MaXL_J;80pQhTX zTwc#%;Qe7P1SR$jo9@{%&BsGf iUyE=sR`!WIUsUbb>9rr(&*6rn_J;8P0PPAT zlV_b{1=oS~S>aHi=Pwk| bNjWUB)VEx`}X_}Nc;uT2t<$e zitwC2WMI&_@MgZQ8yL#&yC (j2DdKACmoorx9 zmfQA<@RQrI!p{B>*HD!obnN?60CDM2DzIHodY2XD>NfU~zm&B6m}%d$hl5v2xqIK* z7fG8_xRrulY5ok>=88D@BoJ;37AL-OjxkYEQF}XnKjd*wim+2xg;?9ZviyvTkJ 9_Q)LMW3^j^8qweJCGma+Enc)$_f6T`=WBh& z{kOn>4|t1JS-ea8Ncev1Pqu(6MQ7nnXU-m42;u|GoPev>0e{AbxZ82QC(GvfVO|&i z01|(Zoj>g1;P~F^OF!C|!$q0F5NaL^)+6o8`HOhH2VgUrBN%mm*Wz6cF2O~(%Dpz% z_pSIgXWsk>&?89f-}b2RC8R9EMvXi%tf>sgnH5dg1oNJHnxx?!+1oxXz|KDHST+7D z{zqGX`!@I+PLA7Kvi+odKc#5*@n=WB)VwdM`8NoygCuTlBlCvghA40jMNFcTx_W+| zzwiz?=a8n 6T_)p;23w^uxqxgApR#szg7LBXI2_*ci4a}T+ zRxc4rO5E$x`kt*U{{ROhpE`dv{zQ{}EAUOkGTYex(w-8MW43ooPY-I+WqOq}{iFs} zJoMu=GpW@zZ%_CqEo}0WsQsN-X|lcF-kSW58h?g<3e#?xhwUBU=^2A=Q=;nDuM_8> z%IT@5Mg4=%4lGL8kmP_ 95!FfF ze}1_DWaGcBMDY=B$$YLvD#lu>k$=~(;$}zS?*dyv<+trQ;G2~PaGCUdQY8!7G3UNd zJaQ^0G~c@a08*&dk2RrDCFif|i`sv~zlYkJ#+Uy9w3oxxwP`ocJUV`-9Qa%ll`@^# zI2rBlN!LjAVVTi{HI#X~-6iFx{1fUw3@3r~c|T|04e7o+(!6J+_; Db5d zE|2kU589vN v99Q=W~%=H*_SsV(iT~wbz;pKz!^NL ztz_b~{ lrD*`>xHUYw4z!)AIE^r}n~%-uvR&y0f~Hc25lH7T3Z{g`Q}x zWAmCwu4aUkl4Th47!nT^r9BbPo5fDLYqDR9J|v#z@#Hb9te#uHoxBaCXM@{=R(a5z zo`zhKF_=!J7y<(-3=#hT0zGI4Cw^plTo-94z<(Mv#7!%B&rg)cyAD-!q55%**BwuZ zTYIm~9=#bU;U#|m0HQymFNDlb!yf>1pZJj2^XvPSujUM7-!zwLKg|7pqFmp1t zaa=bsW{s{sfA>%FuV*S=`){*3s`NSAl_z#9=COYBc0C$wyQ3wLwYh7l3d}bhxatQ% zUroYP@R7n)b>(U5?cFVmF_Njylvain=msgajtDsVSB03kx^v~)&fbT09o5XA3;zJj zL)^#xYvnj$>sQi0snwbNpPAc6af KHCuK~?_SUGBrNuPtCw%Cd<+8@Pa<9lh^ zep$Ex{``(>`Wqs;z|v299|50R>r#G8(@UQ>=~|85uFvf2S+8CtX_;ZSl5zm*@(7W( zDCxPdJxzKwlveJ?jZMkx6yKt6^4RQrN#iX)#TH%$(LT#1o~NQNq-9Hiv@p4Jn3Pt- zU~ItzXEml8FI`Wq%VNEnZCg&N&r=T4<4V)-p}5p^wbm@-55B>6sFmc6kuq3-HaiF8 z_O7W!?`=fxHC;=<_xf&tGz~KMM$|2AptRL=*`S5tmRO-=n)Pm@Vp*n;?kkUe2sO_I z%emuYy_ HJsXu(WG|a=MNIxNOKSfs#yGhbG1Rv0p~cc zO2?rIG;8W}$t*g2g!%Cpyo8O& 1-u4({v>=SzlT_rU RnAKT{plJG}HwRwUpqA2m z$bxCsa^y=4PIAu5Pu^}Y4 Oh 66Eys%V~LA_Y4_;GAS+{d-h$l;vaX@7a68cit!P2kil+*j-t{eXM9Uc3N~7vWs+) z+E!xTYaOb&`Eq;J(z2=YJU$`APZxlzN)2;KG_T#GjPXx^ykX%9*!Y{nSGpQIGcE1Z zMB1TTA^fO~2Cab&Fwt z0$j#FvdJD*)=mUZA>b(_5`71ya$+TDw4JVcygPyV)+QYBx=meg7M_-GwcY+l>ISL% zIs84b_(kG 3z9? o3O{j)x4ZLpUNLEz^w*$|mcF|H$o9$zpit>CG8ihY)2*J6nlD^H^KH5DGgY`>W zZ94kaKem{(=~)(QlBM1yDoY%6Eu0TdbK0TJ^53cPROoY6QH#<2{{Zmk++VZ*0KqQ< zc-z4iej?SpI|i?%-|9Cp{{U;;Mz41wTRDnIQMpeqc==d*6JC5JDap$2*Xg#0>zQ8< z;9-P{sZKJKle>~lwBCySyB O9lJ9MOJkO{;4*t)d3VdPV zZw2_nQ1Hc__KSa~tn$u^@yn< V^4@H5UU zr!c9? Jp{Hn<*P2D_TcV97iW4Mkl4NCuK^$OosKHiKsR+vc_kYy;JmVn1QNq=zsX=n4 z^hq`7{EvnFF$gi)B%kYzv|f4pqkjd61Kzyq?^k2_=Mhhz9FyPOzpj@*ZuAfN0O+|t z^5JjC{jys2aQ^_qkD>iP9haf5Kgcz(#m`C#OkTY^bg5$yudh!^KmvdpgPi_!0CGN* z0OQXT00G4SA?K|CJC97z06KHtfEU-&fIt7x{jWT9H7v3+bBy++0kn{NW|$C5ZdiMo zO${>=?%U-&R&5rU=i1CgbH+N?B~*1%XC^_ 7nw+#4TgTzAyV8tK%(yS@Bk%rB3>FhPQrXmeM )%)2%5 R?pfkAKyE1%CnQa`@}w zPLBoFyt-tUjeRTXH>(mwYVocbNlbe;p~tT7nD1I*F5_=Csp8~#8hGq?ETrC(Yh|oj zUv|E`d7U5aC-C!6@HdI{eJ4WkRkw?6PLQ_^ePgv%Hxfb>Msd$L=O?{Vj44LOd`pne z4~T?mO81MumA2cyw)8zC#{U2bbng!Q0h7je{yo!fwRvsqA-C}4N}}v}g-XRE30M|P z=jBi<96dYQZR>r#Pj@}x>UdnfRXwM}6>If=tE+vFAovTSU3k|208!I?KdNX}v+0_I zV^y`+bv3b?c~&tbKVgW1WdRAvJO&sY@in5V%`K8EBjH(31gc*0Ztu3ceir$h;7s^~ z;g5uEAeUD0X1#f?+vzqiOqOuVaJNp`p5js#Gyxku`T?4$uXV2W-0|@IJv>C?8|tMy z+e^E)zb#K{_@(gHUkB;hfYq*})2IIcgl9%;%{$Cl+AEpwq*;t666+!+RgcY_d((|B zOC;6B#2Grl({hxWT#@s$=Cf r)m4Qd+}dubye z07{1}es0;%txZf4cWy@V;R-aczgV6o(NVjSOP1E%@2Ah^e4}-1Z@PTTA!TPkNo5WZ zj?xtJGNX1njPqQPrq`kQCLz;ulWpGZbyrE~?dG+%`q`USIyjgBJ3++0q1Cli@b#RM zM-yuECitROMqv9%8Qefz_Ms~uU&8qx_Ld=1sN7TQksibd3WAARJ+SVUl^pXs{Rfb~FC~RcJdxQkC24wkzsZH##=0t60w_ zZ#3Kcs|Rq8Z@I0eXwkf;B&V2wJ_*k~>zbuLSIYVyk!N^#;BnO{!dJ7mRjTsyTK@pR zDBa6^@myNKsPbPR454>ABxE+_ZmM(CgU>@*#>t#jD_4?mg`1b&lIovNUb`F~xothR zq2RrGD+uqSNk`hO?w8HCmD1oY$x|S*usy#z?4@a4Gug`_UKHunQF^^o+V{4rvp$^h zKBV8Y2ZKB>@PEKw3Gmz=GSH!x-&NZaSi_}B9OmJdPPk(G5=htQ7{xt!h B|Qms@{Z8J`Rx@XVefeJ{qgmlt|W*LKnB#@V0k zaN0*V`bUyM%7UW@2PcekPOR0BYa_2pmpp6hwYR>T>D#&MJ}1*ZWqUh+6&(*u@eF<- zlI|IN9W}(4#vdSDW?^u$$*}>0pkbZeITg(LlhF2SVzSvsnm13 Urk<4^Qyc zs~x0i6}{7}`g=2(rdbe?mXPzeVZa^FHBnEQ9yLm;oi@|a`QOme@T`{);O!=Mea#M? zc2-s-k`-nnar#!tBYY)U%9LdL9%rQKvFi6%lWO`c_0uE^_AFUkD3Cea$9RvC*kIz6 znvcSaYEgCHHAua7(e3(q9c}KPrfFK1oojb>CA7DDAz4dG6wLT3153ed9B> cxIMA}E7P8zg-y*RRm(%Rv`J6GPZUQRG7tDk^x*Pyh1+1nbgpSW zSMy(*J R0D6zyt$#7*3O?3pe>AoEpR`oH{^QWl zax?2*V~LYA?N|M0`;Gjo*UHm!m-t`ga@FbTU^v`OeDjYn=q(7g1?2Ht(T$l`DPJxj zd>`R8o;Dx5m!meK{p4eKV?XKt095|9@|-r>b$uiHotc-}`JJ>wIL&=zV|IA5X1qPS z*Rh0)x<@3>#J}3^NR#8gikQT*IgZ#qKtC#@l^y*}e?erl`LJ~5<@p~Knp1PHEBPLK z@YCalsqljLSl4t93TXPx{r;NvOAe*JI9GcstIOr9mH>=xz|XC8*1)QgjGKPzzxCVH zcpP8Vl$R~}m!{u&Psd*$ylvy#dyNNQ@b`xF%TE;FMW~51%SlpYeL6A%!84EobBE(3 z@x^vf!zk2KzP-90l{{*#qm8Zoc^)%$YWFGSSz1kfFvu`lMANenGUZVLW3&vM4|?<@ z^e(M8C1f;scg2=AgHpfIFEra(q>UrHol+-dl?;&LCT}z=qLx#$Zae20=8V*~K6@8N ztY0;Zo9NHkZW>qlQ4EE;=K!$ct;FHxXP{eYcMIan8=0bZ^E?URd1D~)`}pqJkO9s> zP=6n4-v;k3^*u}_7iTuSjm3k_l3cN6&eOM&qdmaqBlE9iBYPURVO~&>{OBTBl#DUs z8Txbh)r*zfmhC1jro5lIl@}zEHvq?iPrYL)Sk*$ub7?$rT9;-KLlO<7o->Sf_4lYw z=B%?d_KmOkkZKUy>VaSp%9EnWv>XBeJrB6%wB@-GS2HEid?}-5;>$y|7h`CG -QvVmB+O%OBZC0LtBPxiEX7jm0mL>*(JCq0lj&tu ?NP!=f{hEhV4&= ztgT?R`>G4v?%3JrK{+S!r%G*9x_Ttfm*SXT0aZ17#jAP0Kh)~9PapV~z!6DlYvOCk zBDpNz*%uOhrqRLYYQb^66$e3p3w7XPxZ>w~tq+RBXLG|YS0^Re>b_Um9&zzA#C{w2 zjJj2ve+x8AO=!HSd8_G?OJpuqNMuOXcw<*ZRCe eg^g zv7hZ0lEjK+;TBql{L*yR(o0gCz-}cN7%}A+~TFGPTR&wKfSKU<{yc)hLcRh zx_tINZt))Qr0!Gm09PaB=y~J4b58P2BjWPjT6N&$nn&p`>~rE+XZRW5eHsf(i$v0{ zwR>y(rU~RpEEg;`<%nQkcHx1F=AzX!;@-Dy{Lj{Kb^Wb4C_-GSHcz9rj^8umZ;svv z8V {RO=r!1ZQ6{U%Ko1&hv-l2%H}VEo&eJ=^lPmPO@~aKt?k{`SOQ5a7~}I8`GlxB zITeNucUpIUGxQ43a9oZ$D5d4G`B~$;eHu+t#A*H;mP@M*Z&Obav{yyN{FfSm7DgaJ z5hQGSkG-C1@$D$e`|I~xW8}DJ*{n|_BI4YiTc<94*KYo2>R-ltt8H)K@5Egs-bZnE zJSOvtMk=ikj@f+1=RbIk4MrAmRU_8x@kh|{9XV9Xu^lX=yI*tjgHM-Ez0|F5^nEq- ziy2_H*<~c{a{I#KS1jE8>~puG^cCjUc5ME7$3hd#)k S2?*>;~3|RPzN`5M }6wR-A (r0#l~lODv5$ z!?-&*xS5lYxTp<|)JiKvpZqzMTC>IFGpkYxE1#WO-wpY${QLLb*LFTDurp7pX_nS9 z3k$0&d6vfZ5I15pV&RDU#erdy+k;t2G`pV<8&0fa4|T;mKhM-z?`)q%)bwjuWcx;^ z<$2RgsKkiR5kymkOq}}m=~+q*wQ$4c)bO(RQ*W9r-rXLGEo~FquYL>sFYwRo)8ePF z)a}p2?-c3wHWym|0QTL*)rG~=T&b3L^!EjAqXU-Ni~xBjlg}5-r4;`F&7ZAeGb}gN z6 ICEtf6 zvb~BcXrUJ7FD~T@HXKVKY?G3t1B_NKoN3m(TAkS*Z9=A6)oG~NTXd|FTlQ`K7CD~+ z+4y5p_=TbAelgW0wD6{(cQhKk{0_+>Qdq=dz$bIL9DCPQN!eWd+lOI?#N# M??38JFkzffxtBP7Or4 zYArTBoc?q$7^Mt6uV~rp&1rADch!0J?suOMJRk5T%iwmK;teCj(rP~w^(VDxtYVRb z04Y?xjws52RSEf+{N2YDmK8-W?{z)CE2n{3cRHGF+m$I@yES_&{qLgG@*mm9;g`Z^ z@h#_$J|^p@?V26w)x0$gt?V$hrLC|;ov)*oHY0nG$W-#Yam_-sXLfaPzGa5`ou^VO zl{=>;%#z*rOa1`OA4|2r_^ k&DULa1CuroM9x^%lh1oG{sTI)l?xXxhV5Bs!7Qur }|I`pR0oZNNgW2b_vPZ09- zr}b$@&Fa $&mnupY-$yALm#_E%RH?{zAT(yUT6VnP1)&});H+8>W&o1=)8 z^>LJ=c9q&qtFK#J;QV{yJquE>(DZAoiK4f^*0lS1%JKK)+w&99bH}}7QOXSc4}fuT z#a5L{dqrDS)cTM1efTrs%}YU+eRjolWzp`gG~0QnILv7wDB;(uV2a+8Z2i89P6@rw zpkLvBi)}Tvj+>ykguI{H5~lIyslY`9bI*L5>!#XT8B~NXW3|`59BKXt@P?y#;cpLV z@Lk?{ao*a`81iLlK2P42!N%e`8t$hym5vNWB% {q2pQ iWxNZ}kWAErd|V=Ew^G#Fku;pmUD3&2D)e{0GDD7^OL-XQIBFTJP_A z92du}X2apPj`Y6->333IE|CqIYLN-W%rRfAo97VCwMmV`MnEGfNgXSyt(KAd&%b;# zPYYJjlTotKyV>6NyVqSb>CpO1;7orLJbs=Z)_xFa+6I@a_;XFUlf`-ZspXtTN$Xu}3e(*5Rwqqj?sEP*_;LGL>;C`@JVW4b6 k&Ja~wRUg42h8cl(>FgV+u^_^9sT} jiWfp z(rVI 2@1oo&dVYJ=$iTsz8Nrc*S zkTO2#HJoc*w3qe$e@y9FJ~p)&O+($a)tc3JvDf$;!?O67!TL6ZYb0qlyP;}p1 ?8fU=C&bZ4RRRcOX7t It?V3 V`5LxSE-ji zPIvv*b5B;iPDE-}L~%GE^PX$sVV+>$+x-t)>h(JhTbN`SSKatmqlU*)t*j++I&xc? zx~ GEv8xkp^HBQaJ9o(DWqja5!f zo~{}4(@tA!`J37&!*3ty;yqJI@h66KT}~cF)wZ( 6#tm-q&H5gLj3!8ZMD>Q6XPYZygb@c64+dSz;=hGez(IrW(^?0t{DDHe0 z;p-i0DA1D}R<`m@8<{Y61~QN_%Mp&%z6w71-k{%IEVT1Oel2)M#kzgp!M})sE$#df z<4tvZF?NG!noGp9ySr1g0m7}h1&@4Jrslb #;^3Y+FveLt?p$G@~+#J>}GGvaQu zr1)#>w)%aZpQgNVyk`bRftpXc!#TjsU3n<9j4;Y_S7`e8;pF}p)ci5<*8c$F4~2X| z;)`DqXnK^5YvEZw&3PU4F-J5~$u8mhwHwCLNF i~L7t!5# zLr2u^qg5YcGfwlWGlXV41cw+TE&<1WmDNtxI58^IX&UnCnp%yZSiC=Z +Vcs7Q0Xnrz(!m`&iiL6#zL#ZjB3S_sIcSs%}yp<&g$vNV)ak0@G zDBk|3&o^Hf@7u;w_--8?BTwzCoiYorG%!?(@=IXs3g@C{^v!bApDQ{Q2RPn7e}VMZ zh@rO9^({6?uD;0y)vdUWDWZ}{t}kbp#%-dJepuhj22Ysu9V=Gsa% $I- UQ1+_~GI&hjy!HrRX{ywQFs2B=)mvUTgVYY@7D1agC}0;CIi`p;C?8T~DgZII-cV zs#A^Bc6aI3Y*F~7@hVS>o-MiYt>&2@ho;nRZEdbC?Idf2-D<3&RotjSZQVTpuF8{j zAfozyr_AH=@x@~$UJ1vV%GbZcdp}oweG%xM2K}zQS>W5~{{Z4c;q6aNjwQ94C%ceM zFP0U2!zKtuBxJ7M3HGj9arRb6*~g4yI4)==zr?y}+weYbzwxvdo-H0Lw35=sU+sxC zcq}8jSB^6!!%o)wpO#OUu1M+Hx@-Rcv^Lt``uz`)!Dey5;v-fvO4D*nnRRWoce>T1 z+hYB#@7qf8mXO{A@W_Y7`fbLR)5U)y%L?3ro7s$ca-i^_fKR1mN^XqPwut(yM-$M- zVdqbkK4ou-HLi!2_&hq?Y3i~UjtFB#J;+rHl6~=-@^Ny%GCvLXqnf0pbsI0b%lyyV z?G$50(mg)IZ~p+I*1gO>@Z;!@>FDf@LHT-C!yHJ*2bx78Hyq=fo|P fE1i@>E3`80fKv)0RPhczzP&lJC6gAK#2(J z#Q-ta)OMf@OWbWgk2NwXJDz3Y0fi)UTvg7>M++z3u4AC3KTmN$Sm!Rs*Yc^jj48nz zfa5#^^{A83Ph;S}h}LZl?akb>TeKR8o=Day1G=nk(UBtcM##<&ZfL?SQ%CY +oa@q7!YhKUD`N1 PQ<8@hMa&dn_~Y5s>r@lQb3d_Stg4~XQp)26<+gHYX;RFNfO zvD`UyMnklG;egwY;;t)}K85EwULuAmMpnF%c29k6eOKSx%-Oo|Pl@I5HMXxNn;d=} z(!8jyHJF6L8?}(K!#onaYO*7fxVCxYXd kooZlqH;qYpuM7berwBMq7t#{Y( zxvTI;;ZMXbiIyHRweS|7V|p#baNf;xav*q_RLH!tAC;AkG1U4BDpBT|OQya> 6w8_V<-+H}{DMJ!X< z#I3LgjGvvP{{Uo=dS{B&VdX7k^*>GFo*h{%Tw$zV-+xo|1Hd1)FNQoB`#N}IMAdAy z8-E|^dLt#)q4s6FvANZVeX=k|4kMCGF)Th+>x$A;++$>ZjYE|r&rJ9)`+RtRPVnx5 zXX0y1jbi3mUOih~mSjhcM?3dy+5wDiz}uapgIm#js@suT9MZk4eXXi~)c*hmE<7zI z?z5{sot^EZvUztF(z+6{84x3?m1ZOi0CV)NmsuD(SJ3?5z40cE 3?DoCSrr|s^@|Z@R zAzOPi@4v}y=zN#^K={JX$NvBnue@2NX{(^w>X)#!y`s$}(zldii*m}!q?agI 4A>fuSM5uc(ha~LQhFt=kI@R-B-jqPO0Jc_-k!sHH#~Y zc&?XHk<4u*Y@xQa3L6>DGtEn^t$S(`qNCR5#a=MKxYIOW+0sj?UT3rTS7l-^T#dIx zUMXqNj&br} +f06Ro=w5KTN%Ftb@JFKfOZJDc_;c|q;cc$6uG$Wp z@TWz!zSHBJ+d}fmEz`5fHp7N35aqL;-RmhvQkODXA5D}-H0j1Yc~bJxZ*%1T0E! >!^0sjDL zj}K@+1^h?gPZS&d0`x4}ZiT2A ky{5qZw_*NeQti*A{Y?}W7j^KelT%;|h-pH{AUaB+4rEN+)v5ot`yHmu& z-kf6v(Y^X_WPI`PgI@6y{5SB;+}h@*4Ejy4p6hoqE6TAbCko@74r|B6`;{c4qD=h{ z1^e1jsO;P8WG}?sLs8VcA)%$_t8sb1#BoI*+HNG266gqB(lPYLJ!r$W@6_`6g~l{h z?7ijXe #f0$uP4T7^%gmO$*+(Zf7W@uz*A?ldW8m?N-+$Lb %TnrFFw% WyyzPV&Q<7`I-y>-bmBXOn)xq`IT;_(A^wwk>vy zzISP}`XTUG$A$bngR0m;oOB;3ufp-L<*4=Q{{S=e3`4w|I|$e2A6oORsmmr`EB=di zf9Z>l{C2%8Dzz%I?Fac7U*C_aJf<||c*x_A!oLEHuQk_i(E6E3=`7<>f%yvkTZiby zS!|Csw2WUGFZ@feG1MCN_}l%)I(?*eWbgN;FT+9piLD%UxQn0o4Se?w(@vdNZ{__? zjQ#uY^k=KYybo&nB^{5OlQd%-X1i!DOeB6Be$y7|AMGLI3yB8k$B3-tmLhm?kXw?t z{{U+kuif%!xZvrpFVy+mOq6RMBwcvB#c6kcEdD9GPd@tQNL3aX);NsM