From 2a55c832f7b7992c84d0dfa7643767ad17890ffe Mon Sep 17 00:00:00 2001 From: ApacheCN Date: Sat, 25 Feb 2017 16:53:03 +0800 Subject: [PATCH 01/92] Initial commit --- .gitignore | 89 ++++++++++++++++++++++++++++++++++++++++++++++++++++++ README.md | 1 + 2 files changed, 90 insertions(+) create mode 100644 .gitignore create mode 100644 README.md diff --git a/.gitignore b/.gitignore new file mode 100644 index 000000000..72364f99f --- /dev/null +++ b/.gitignore @@ -0,0 +1,89 @@ +# Byte-compiled / optimized / DLL files +__pycache__/ +*.py[cod] +*$py.class + +# C extensions +*.so + +# Distribution / packaging +.Python +env/ +build/ +develop-eggs/ +dist/ +downloads/ +eggs/ +.eggs/ +lib/ +lib64/ +parts/ +sdist/ +var/ +*.egg-info/ +.installed.cfg +*.egg + +# PyInstaller +# Usually these files are written by a python script from a template +# before PyInstaller builds the exe, so as to inject date/other infos into it. +*.manifest +*.spec + +# Installer logs +pip-log.txt +pip-delete-this-directory.txt + +# Unit test / coverage reports +htmlcov/ +.tox/ +.coverage +.coverage.* +.cache +nosetests.xml +coverage.xml +*,cover +.hypothesis/ + +# Translations +*.mo +*.pot + +# Django stuff: +*.log +local_settings.py + +# Flask stuff: +instance/ +.webassets-cache + +# Scrapy stuff: +.scrapy + +# Sphinx documentation +docs/_build/ + +# PyBuilder +target/ + +# IPython Notebook +.ipynb_checkpoints + +# pyenv +.python-version + +# celery beat schedule file +celerybeat-schedule + +# dotenv +.env + +# virtualenv +venv/ +ENV/ + +# Spyder project settings +.spyderproject + +# Rope project settings +.ropeproject diff --git a/README.md b/README.md new file mode 100644 index 000000000..00dbeff49 --- /dev/null +++ b/README.md @@ -0,0 +1 @@ +# MachineLearning \ No newline at end of file From d9d21f52583f6aa606e5ac4523844d679eef5487 Mon Sep 17 00:00:00 2001 From: jiangzhonglian Date: Sat, 25 Feb 2017 17:15:10 +0800 Subject: [PATCH 02/92] =?UTF-8?q?=E6=9B=B4=E6=96=B0README?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- README.md | 40 +++++++++++++++++++++++++++++++++++++++- 1 file changed, 39 insertions(+), 1 deletion(-) diff --git a/README.md b/README.md index 00dbeff49..711e5cedf 100644 --- a/README.md +++ b/README.md @@ -1 +1,39 @@ -# MachineLearning \ No newline at end of file +# MachineLearning + +**Mahchine Leaning in Action (python)** + +## 第一部分 分类 + +* 1) 机器学习基础 +* 2) k-紧邻算法 +* 3) 决策树 +* 4) 基于概率论的分类方法:朴素贝叶斯 +* 5) Logistic回归 +* 6) 支持向量机 +* 7) 利用AdaBoost元算法提高分类 + +## 第二部分 利用回归预测数值型数据 + +* 8) 预测数值型数据:回归 +* 9) 数回归 + +### 第三部分 无监督学习 + +* 10) 使用K-均值聚类算法对未标注数据分组 +* 11) 使用Apriori算法进行关联分析 +* 12) 使用FP-growth算法来高效发现频繁项集 + +### 第四部分 其他工具 + +* 13) 使用PCA来简化数据 +* 14) 使用SVD简化数据 +* 15) 大数据与MapReduce + +* * * + +* 附录A Python入门 +* 附录B 线性代数 +* 附录C 概率论复习 +* 附录D 资源 +* 索引 +* 版权声明 \ No newline at end of file From f69881fcc3703bb13be4f1bfe3d0d5c4edbb581c Mon Sep 17 00:00:00 2001 From: jiangzhonglian Date: Sat, 25 Feb 2017 19:19:30 +0800 Subject: [PATCH 03/92] =?UTF-8?q?=E6=9B=B4=E6=96=B0readme?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .vscode/settings.json | 3 + .vscode/tasks.json | 9 ++ README.md | 22 +++ docs/README.md | 39 +++++ src/python/01.NumPy.py | 21 +++ src/python/Logistic.py | 136 ++++++++++++++++++ src/python/apriori.py | 206 +++++++++++++++++++++++++++ src/python/regression.py | 298 +++++++++++++++++++++++++++++++++++++++ 8 files changed, 734 insertions(+) create mode 100644 .vscode/settings.json create mode 100644 .vscode/tasks.json create mode 100644 docs/README.md create mode 100644 src/python/01.NumPy.py create mode 100644 src/python/Logistic.py create mode 100644 src/python/apriori.py create mode 100644 src/python/regression.py diff --git a/.vscode/settings.json b/.vscode/settings.json new file mode 100644 index 000000000..fe7159848 --- /dev/null +++ b/.vscode/settings.json @@ -0,0 +1,3 @@ +{ + "python.linting.pylintEnabled": false +} \ No newline at end of file diff --git a/.vscode/tasks.json b/.vscode/tasks.json new file mode 100644 index 000000000..66d0b4ec2 --- /dev/null +++ b/.vscode/tasks.json @@ -0,0 +1,9 @@ +{ + // See https://go.microsoft.com/fwlink/?LinkId=733558 + // for the documentation about the tasks.json format + "version": "0.1.0", + "command": "/usr/bin/python", + "isShellCommand": true, + "args": ["${file}"], + "showOutput": "always" +} diff --git a/README.md b/README.md index 711e5cedf..4de2019f8 100644 --- a/README.md +++ b/README.md @@ -5,6 +5,28 @@ ## 第一部分 分类 * 1) 机器学习基础 + * 机器学习是什么 + * 把无序的数据转换成有用的信息。 + * 机器学习的意义 + * 我们利用计算机来彰显数据背后的真实含义。 + * 监督学习 + * 样本集:训练数据 + 测试数据 + * 特征(feature-是否有缺失情况) + 目标变量(分类-离散值/回归-连续值<0~100、 -999~999>) + * `知识表示`:机器已经学会如何识别鸟类的过程 + * 1.可以采用规则集的形式 + * 2.可以采用概率分布的形式 + * 3.可以使训练样本集中的一个实例 + * 非监督学习 + * 开发的步骤 + * 1.收集数据 + * 2.准备输入数据 + * 3.分析输入数据 + * 4.训练算法 + * 5.测试算法 + * 6.使用算法 + * Python相关的库 + * 科学函数库:SciPy、`NumPy`(底层语言:C和Fortran) + * 绘图工具库:`Matplotlib` * 2) k-紧邻算法 * 3) 决策树 * 4) 基于概率论的分类方法:朴素贝叶斯 diff --git a/docs/README.md b/docs/README.md new file mode 100644 index 000000000..711e5cedf --- /dev/null +++ b/docs/README.md @@ -0,0 +1,39 @@ +# MachineLearning + +**Mahchine Leaning in Action (python)** + +## 第一部分 分类 + +* 1) 机器学习基础 +* 2) k-紧邻算法 +* 3) 决策树 +* 4) 基于概率论的分类方法:朴素贝叶斯 +* 5) Logistic回归 +* 6) 支持向量机 +* 7) 利用AdaBoost元算法提高分类 + +## 第二部分 利用回归预测数值型数据 + +* 8) 预测数值型数据:回归 +* 9) 数回归 + +### 第三部分 无监督学习 + +* 10) 使用K-均值聚类算法对未标注数据分组 +* 11) 使用Apriori算法进行关联分析 +* 12) 使用FP-growth算法来高效发现频繁项集 + +### 第四部分 其他工具 + +* 13) 使用PCA来简化数据 +* 14) 使用SVD简化数据 +* 15) 大数据与MapReduce + +* * * + +* 附录A Python入门 +* 附录B 线性代数 +* 附录C 概率论复习 +* 附录D 资源 +* 索引 +* 版权声明 \ No newline at end of file diff --git a/src/python/01.NumPy.py b/src/python/01.NumPy.py new file mode 100644 index 000000000..8425a6cee --- /dev/null +++ b/src/python/01.NumPy.py @@ -0,0 +1,21 @@ +#!/usr/bin/python +# coding:utf8 + +from numpy import random + +''' +# NumPy 矩阵和数字的区别 +NumPy存在2中不同的数据类型: + 1. 矩阵 matrix + 2. 数组 array +相似点: + 都可以处理行列表示的数字元素 +不同点: + 1. 2个数据类型上执行相同的数据运算可能得到不同的结果。 + 2. NumPy函数库中的 matrix 与 MATLAB中 matrices 等价。 +''' + +# 生成一个 4*4 的随机数组 +print random.rand(4, 4) + + diff --git a/src/python/Logistic.py b/src/python/Logistic.py new file mode 100644 index 000000000..82ca465cd --- /dev/null +++ b/src/python/Logistic.py @@ -0,0 +1,136 @@ +#!/usr/bin/python +# coding: utf8 + +''' +Created on Oct 27, 2010 +Logistic Regression Working Module +@author: Peter +''' + +import os +from numpy import * +import matplotlib.pyplot as plt +# 解析数据 +def loadDataSet(file_name): + # dataMat为原始数据, labelMat为原始数据的标签 + dataMat = []; labelMat = [] + fr = open(file_name) + for line in fr.readlines(): + lineArr = line.strip().split() + dataMat.append([1.0, float(lineArr[0]), float(lineArr[1])]) + labelMat.append(int(lineArr[2])) + return dataMat,labelMat + +# sigmoid跳跃函数 +def sigmoid(inX): + return 1.0/(1+exp(-inX)) + +# 正常的处理方案 +def gradAscent(dataMatIn, classLabels): + dataMatrix = mat(dataMatIn) #convert to NumPy matrix + # transpose() 行列转制函数 + # 将行矩阵转化为列矩阵 => 矩阵的转置 + labelMat = mat(classLabels).transpose() #convert to NumPy matrix + m,n = shape(dataMatrix) + # print m, n, '__'*10, shape(dataMatrix.transpose()), '__'*100 + alpha = 0.001 + maxCycles = 500 + # 权重 + weights = ones((n,1)) + for k in range(maxCycles): #heavy on matrix operations + # m*3的矩阵 * 3*1的单位矩阵 = m*1的矩阵 + # 那么乘上单位矩阵的意义,就代表:通过公式得到的理论值 + # 参考地址: 矩阵乘法的本质是什么? https://www.zhihu.com/question/21351965/answer/31050145 + # n*3 * 3*1 = n*1 + h = sigmoid(dataMatrix*weights) #matrix mult + # labelMat是实际值 + error = (labelMat - h) #vector subtraction + # 0.001* (3*m)*(m*1) 表示在每一个列上的一个误差情况,最后得出 x1,x2,xn的系数的偏移量 + weights = weights + alpha * dataMatrix.transpose() * error #matrix mult + return array(weights) + +# 梯度上升算法 +def stocGradAscent0(dataMatrix, classLabels): + m,n = shape(dataMatrix) + alpha = 0.01 + # n*1的矩阵 + # 函数ones创建一个全1的数组 + weights = ones(n) #initialize to all ones + for i in range(m): + # sum(dataMatrix[i]*weights)为了求 f(x)的值, f(x)=a1*x1+b2*x2+..+nn*xn + h = sigmoid(sum(dataMatrix[i]*weights)) + error = classLabels[i] - h + # 0.01*(1*1)*(1*n) + print weights, "*"*10 , dataMatrix[i], "*"*10 , error + weights = weights + alpha * error * dataMatrix[i] + return weights + +# 随机梯度上升算法(随机化) +def stocGradAscent1(dataMatrix, classLabels, numIter=150): + m,n = shape(dataMatrix) + weights = ones(n) #initialize to all ones + # 随机剃度, 循环150,观察是否收敛 + for j in range(numIter): + # [0, 1, 2 .. m-1] + dataIndex = range(m) + for i in range(m): + # i和j的不断增大,导致alpha的值不断减少,但是不为0 + alpha = 4/(1.0+j+i)+0.0001 #apha decreases with iteration, does not + # 随机产生一个 0~len()之间的一个值 + randIndex = int(random.uniform(0,len(dataIndex)))#go to 0 because of the constant + # sum(dataMatrix[i]*weights)为了求 f(x)的值, f(x)=a1*x1+b2*x2+..+nn*xn + h = sigmoid(sum(dataMatrix[randIndex]*weights)) + error = classLabels[randIndex] - h + # print weights, '__h=%s' % h, '__'*20, alpha, '__'*20, error, '__'*20, dataMatrix[randIndex] + weights = weights + alpha * error * dataMatrix[randIndex] + del(dataIndex[randIndex]) + return weights + +# 可视化展示 +def plotBestFit(dataArr, labelMat, weights): + n = shape(dataArr)[0] + xcord1 = []; ycord1 = [] + xcord2 = []; ycord2 = [] + for i in range(n): + if int(labelMat[i])== 1: + xcord1.append(dataArr[i,1]); ycord1.append(dataArr[i,2]) + else: + xcord2.append(dataArr[i,1]); ycord2.append(dataArr[i,2]) + fig = plt.figure() + ax = fig.add_subplot(111) + ax.scatter(xcord1, ycord1, s=30, c='red', marker='s') + ax.scatter(xcord2, ycord2, s=30, c='green') + x = arange(-3.0, 3.0, 0.1) + """ + y的由来,卧槽,是不是没看懂? + 首先理论上是这个样子的。 + dataMat.append([1.0, float(lineArr[0]), float(lineArr[1])]) + w0*x0+w1*x1+w2*x2=f(x) + x0最开始就设置为1叻, x2就是我们画图的y值,而f(x)被我们磨合误差给算到w0,w1,w2身上去了 + 所以: w0+w1*x+w2*y=0 => y = (-w0-w1*x)/w2 + """ + y = (-weights[0]-weights[1]*x)/weights[2] + ax.plot(x, y) + plt.xlabel('X'); plt.ylabel('Y') + plt.show() + +def main(): + project_dir = os.path.dirname(os.path.dirname(os.getcwd())) + # 1.收集并准备数据 + dataMat, labelMat = loadDataSet("%s/resources/testSet.txt" % project_dir) + + # print dataMat, '---\n', labelMat + # 2.训练模型, f(x)=a1*x1+b2*x2+..+nn*xn中 (a1,b2, .., nn).T的矩阵值 + # 因为数组没有是复制n份, array的乘法就是乘法 + dataArr = array(dataMat) + # print dataArr + # weights = gradAscent(dataArr, labelMat) + # weights = stocGradAscent0(dataArr, labelMat) + weights = stocGradAscent1(dataArr, labelMat) + # print '*'*30, weights + + # 数据可视化 + plotBestFit(dataArr, labelMat, weights) + +if __name__=="__main__": + main() \ No newline at end of file diff --git a/src/python/apriori.py b/src/python/apriori.py new file mode 100644 index 000000000..ee6af908d --- /dev/null +++ b/src/python/apriori.py @@ -0,0 +1,206 @@ +#!/usr/bin/python +# coding: utf8 + +''' +Created on Mar 24, 2011 +Ch 11 code +@author: Peter +''' +from numpy import * + +def loadDataSet(): + return [[1, 3, 4], [2, 3, 5], [1, 2, 3, 5], [2, 5]] + +def createC1(dataSet): + C1 = [] + for transaction in dataSet: + for item in transaction: + if not [item] in C1: + C1.append([item]) + + C1.sort() + return map(frozenset, C1) # use frozen set so we + # can use it as a key in a dict + +def scanD(D, Ck, minSupport): + ssCnt = {} + for tid in D: + for can in Ck: + # s.issubset(t) 测试是否 s 中的每一个元素都在 t 中 + if can.issubset(tid): + if not ssCnt.has_key(can): ssCnt[can]=1 + else: ssCnt[can] += 1 + numItems = float(len(D)) + retList = [] + supportData = {} + for key in ssCnt: + support = ssCnt[key]/numItems + if support >= minSupport: + retList.insert(0, key) + supportData[key] = support + return retList, supportData + +def aprioriGen(Lk, k): #creates Ck + retList = [] + lenLk = len(Lk) + for i in range(lenLk): + for j in range(i+1, lenLk): + L1 = list(Lk[i])[:k-2]; L2 = list(Lk[j])[:k-2] + L1.sort(); L2.sort() + if L1==L2: #if first k-2 elements are equal + retList.append(Lk[i] | Lk[j]) #set union + return retList + +def apriori(dataSet, minSupport = 0.5): + # 冻结每一行数据 + C1 = createC1(dataSet) + D = map(set, dataSet) + + # 计算支持support + L1, supportData = scanD(D, C1, minSupport) + print("outcome: ", supportData) + + L = [L1] + k = 2 + while (len(L[k-2]) > 0): + Ck = aprioriGen(L[k-2], k) + Lk, supK = scanD(D, Ck, minSupport)#scan DB to get Lk + supportData.update(supK) + L.append(Lk) + k += 1 + return L, supportData + +def main(): + # project_dir = os.path.dirname(os.path.dirname(os.getcwd())) + # 1.收集并准备数据 + # dataMat, labelMat = loadDataSet("%s/resources/testSet.txt" % project_dir) + + + # 1. 加载数据 + dataSet = loadDataSet() + print(dataSet) + # 调用 apriori 做购物篮分析 + apriori(dataSet, minSupport = 0.7) + +if __name__=="__main__": + main() + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +def generateRules(L, supportData, minConf=0.7): #supportData is a dict coming from scanD + bigRuleList = [] + for i in range(1, len(L)):#only get the sets with two or more items + for freqSet in L[i]: + H1 = [frozenset([item]) for item in freqSet] + if (i > 1): + rulesFromConseq(freqSet, H1, supportData, bigRuleList, minConf) + else: + calcConf(freqSet, H1, supportData, bigRuleList, minConf) + return bigRuleList + +def calcConf(freqSet, H, supportData, brl, minConf=0.7): + prunedH = [] #create new list to return + for conseq in H: + conf = supportData[freqSet]/supportData[freqSet-conseq] #calc confidence + if conf >= minConf: + print freqSet-conseq,'-->',conseq,'conf:',conf + brl.append((freqSet-conseq, conseq, conf)) + prunedH.append(conseq) + return prunedH + +def rulesFromConseq(freqSet, H, supportData, brl, minConf=0.7): + m = len(H[0]) + if (len(freqSet) > (m + 1)): #try further merging + Hmp1 = aprioriGen(H, m+1)#create Hm+1 new candidates + Hmp1 = calcConf(freqSet, Hmp1, supportData, brl, minConf) + if (len(Hmp1) > 1): #need at least two sets to merge + rulesFromConseq(freqSet, Hmp1, supportData, brl, minConf) + +def pntRules(ruleList, itemMeaning): + for ruleTup in ruleList: + for item in ruleTup[0]: + print itemMeaning[item] + print " -------->" + for item in ruleTup[1]: + print itemMeaning[item] + print "confidence: %f" % ruleTup[2] + print #print a blank line + + +# from time import sleep +# from votesmart import votesmart +# votesmart.apikey = 'a7fa40adec6f4a77178799fae4441030' +# #votesmart.apikey = 'get your api key first' +# def getActionIds(): +# actionIdList = []; billTitleList = [] +# fr = open('recent20bills.txt') +# for line in fr.readlines(): +# billNum = int(line.split('\t')[0]) +# try: +# billDetail = votesmart.votes.getBill(billNum) #api call +# for action in billDetail.actions: +# if action.level == 'House' and \ +# (action.stage == 'Passage' or action.stage == 'Amendment Vote'): +# actionId = int(action.actionId) +# print 'bill: %d has actionId: %d' % (billNum, actionId) +# actionIdList.append(actionId) +# billTitleList.append(line.strip().split('\t')[1]) +# except: +# print "problem getting bill %d" % billNum +# sleep(1) #delay to be polite +# return actionIdList, billTitleList +# +# def getTransList(actionIdList, billTitleList): #this will return a list of lists containing ints +# itemMeaning = ['Republican', 'Democratic']#list of what each item stands for +# for billTitle in billTitleList:#fill up itemMeaning list +# itemMeaning.append('%s -- Nay' % billTitle) +# itemMeaning.append('%s -- Yea' % billTitle) +# transDict = {}#list of items in each transaction (politician) +# voteCount = 2 +# for actionId in actionIdList: +# sleep(3) +# print 'getting votes for actionId: %d' % actionId +# try: +# voteList = votesmart.votes.getBillActionVotes(actionId) +# for vote in voteList: +# if not transDict.has_key(vote.candidateName): +# transDict[vote.candidateName] = [] +# if vote.officeParties == 'Democratic': +# transDict[vote.candidateName].append(1) +# elif vote.officeParties == 'Republican': +# transDict[vote.candidateName].append(0) +# if vote.action == 'Nay': +# transDict[vote.candidateName].append(voteCount) +# elif vote.action == 'Yea': +# transDict[vote.candidateName].append(voteCount + 1) +# except: +# print "problem getting actionId: %d" % actionId +# voteCount += 2 +# return transDict, itemMeaning diff --git a/src/python/regression.py b/src/python/regression.py new file mode 100644 index 000000000..de3283682 --- /dev/null +++ b/src/python/regression.py @@ -0,0 +1,298 @@ +#!/usr/bin/python +# coding: utf8 + +''' +Created on Jan 8, 2011 + +@author: Peter +''' + +import os +from numpy import * +import matplotlib.pylab as plt + +def loadDataSet(fileName): #general function to parse tab -delimited floats + numFeat = len(open(fileName).readline().split('\t')) - 1 #get number of fields + dataMat = []; labelMat = [] + fr = open(fileName) + for line in fr.readlines(): + lineArr =[] + curLine = line.strip().split('\t') + for i in range(numFeat): + lineArr.append(float(curLine[i])) + dataMat.append(lineArr) + labelMat.append(float(curLine[-1])) + return dataMat,labelMat + +def standRegres(xArr,yArr): + # >>> A.T # transpose, 转置 + xMat = mat(xArr); yMat = mat(yArr).T + # 转置矩阵*矩阵 + xTx = xMat.T*xMat + if linalg.det(xTx) == 0.0: + print "This matrix is singular, cannot do inverse" + return + # >>> print A.I # inverse, 逆矩阵 + # print xTx.I, "*"*10, xMat.T, "*"*10, yMat + ws = xTx.I * (xMat.T*yMat) # 最小二乘法求最优解 + return ws + +def plotBestFit(xArr, yArr, ws): + + xMat = mat(xArr) + yMat = mat(yArr) + fig = plt.figure() + ax = fig.add_subplot(111) + ax.scatter(xMat[:,1].flatten().A[0], yMat.T[:,0].flatten().A[0]) + + yHat = xMat*ws + # 再计算相关系数 + print "相关系数\n", corrcoef(yHat.T, yMat) + + xMat.sort(0) + yHat = xMat*ws + n = shape(xMat)[0] + xcord = []; ycord = [] + for i in range(n): + xcord.append(xMat[i, 1]); ycord.append(yHat[i, 0]) + + ax.plot(xcord, ycord, c='red') + plt.xlabel('X'); plt.ylabel('Y') + plt.show() + +def main1(): + # w0*x0+w1*x1+w2*x2=f(x) + project_dir = os.path.dirname(os.path.dirname(os.getcwd())) + # 1.收集并准备数据 + xArr, yArr = loadDataSet("%s/resources/ex0.txt" % project_dir) + # print xArr, '---\n', yArr + # 2.训练模型, f(x)=a1*x1+b2*x2+..+nn*xn中 (a1,b2, .., nn).T的矩阵值 + ws = standRegres(xArr, yArr) + print '*'*30, '---\n', ws + + # 数据可视化 + plotBestFit(xArr, yArr, ws) + + +def lwlr(testPoint, xArr, yArr,k=1.0): + xMat = mat(xArr); yMat = mat(yArr).T + m = shape(xMat)[0] + weights = mat(eye((m))) + for j in range(m): #next 2 lines create weights matrix + diffMat = testPoint - xMat[j,:] + # 高斯核对应的加权 + weights[j,j] = exp(diffMat*diffMat.T/(-2.0*k**2)) + xTx = xMat.T * (weights * xMat) + if linalg.det(xTx) == 0.0: + print "This matrix is singular, cannot do inverse" + return + + # 加权的回归系数求解 + ws = xTx.I * (xMat.T * (weights * yMat)) + return testPoint * ws + +def lwlrTest(testArr,xArr,yArr,k=1.0): #loops over all the data points and applies lwlr to each one + m = shape(testArr)[0] + # m*1的矩阵 + # 函数 zeros 创建一个全0的数组 + yHat = zeros(m) + print "shape(yHat)", shape(yHat) + for i in range(m): + yHat[i] = lwlr(testArr[i],xArr,yArr,k) + return yHat + +def lwlrTestPlot(xArr, yArr, yHat): + + xMat = mat(xArr) + yMat = mat(yArr) + fig = plt.figure() + ax = fig.add_subplot(111) + ax.scatter(xMat[:,1].flatten().A[0], yMat.T[:,0].flatten().A[0]) + + # 再计算相关系数 + print "相关系数\n", corrcoef(yHat.T, yMat) + + n = shape(xMat)[0] + xcord = []; ycord = [] + for i in range(n): + xcord.append(xMat[i, 1]), ycord.append(yHat[i]) + + xcord.sort(), ycord.sort() + # print xcord, "------\n", ycord + ax.plot(xcord, ycord, c='red') + plt.xlabel('X'); plt.ylabel('Y') + plt.show() + +def main2(): + # w0*x0+w1*x1+w2*x2=f(x) + project_dir = os.path.dirname(os.path.dirname(os.getcwd())) + # 1.收集并准备数据 + xArr, yArr = loadDataSet("%s/resources/ex0.txt" % project_dir) + # print xArr, '---\n', yArr + # 2.训练模型, f(x)=a1*x1+b2*x2+..+nn*xn中 (a1,b2, .., nn).T的矩阵值 + yHat = lwlrTest(xArr, xArr, yArr, 0.003) + print xArr, '---\n', yHat[1] + + # 数据可视化 + lwlrTestPlot(xArr, yArr, yHat) + +if __name__=="__main__": + # 线性回归 + # main1() + # 局部加权线性回归 + main2() + +def rssError(yArr,yHatArr): #yArr and yHatArr both need to be arrays + return ((yArr-yHatArr)**2).sum() + +def ridgeRegres(xMat,yMat,lam=0.2): + xTx = xMat.T*xMat + denom = xTx + eye(shape(xMat)[1])*lam + if linalg.det(denom) == 0.0: + print "This matrix is singular, cannot do inverse" + return + ws = denom.I * (xMat.T*yMat) + return ws + +def ridgeTest(xArr,yArr): + xMat = mat(xArr); yMat=mat(yArr).T + yMean = mean(yMat,0) + yMat = yMat - yMean #to eliminate X0 take mean off of Y + #regularize X's + xMeans = mean(xMat,0) #calc mean then subtract it off + xVar = var(xMat,0) #calc variance of Xi then divide by it + xMat = (xMat - xMeans)/xVar + numTestPts = 30 + wMat = zeros((numTestPts,shape(xMat)[1])) + for i in range(numTestPts): + ws = ridgeRegres(xMat,yMat,exp(i-10)) + wMat[i,:]=ws.T + return wMat + +def regularize(xMat):#regularize by columns + inMat = xMat.copy() + inMeans = mean(inMat,0) #calc mean then subtract it off + inVar = var(inMat,0) #calc variance of Xi then divide by it + inMat = (inMat - inMeans)/inVar + return inMat + +def stageWise(xArr,yArr,eps=0.01,numIt=100): + xMat = mat(xArr); yMat=mat(yArr).T + yMean = mean(yMat,0) + yMat = yMat - yMean #can also regularize ys but will get smaller coef + xMat = regularize(xMat) + m,n=shape(xMat) + #returnMat = zeros((numIt,n)) #testing code remove + ws = zeros((n,1)); wsTest = ws.copy(); wsMax = ws.copy() + for i in range(numIt): + print ws.T + lowestError = inf; + for j in range(n): + for sign in [-1,1]: + wsTest = ws.copy() + wsTest[j] += eps*sign + yTest = xMat*wsTest + rssE = rssError(yMat.A,yTest.A) + if rssE < lowestError: + lowestError = rssE + wsMax = wsTest + ws = wsMax.copy() + #returnMat[i,:]=ws.T + #return returnMat + +def scrapePage(inFile,outFile,yr,numPce,origPrc): + from BeautifulSoup import BeautifulSoup + fr = open(inFile); fw=open(outFile,'a') #a is append mode writing + soup = BeautifulSoup(fr.read()) + i=1 + currentRow = soup.findAll('table', r="%d" % i) + while(len(currentRow)!=0): + title = currentRow[0].findAll('a')[1].text + lwrTitle = title.lower() + if (lwrTitle.find('new') > -1) or (lwrTitle.find('nisb') > -1): + newFlag = 1.0 + else: + newFlag = 0.0 + soldUnicde = currentRow[0].findAll('td')[3].findAll('span') + if len(soldUnicde)==0: + print "item #%d did not sell" % i + else: + soldPrice = currentRow[0].findAll('td')[4] + priceStr = soldPrice.text + priceStr = priceStr.replace('$','') #strips out $ + priceStr = priceStr.replace(',','') #strips out , + if len(soldPrice)>1: + priceStr = priceStr.replace('Free shipping', '') #strips out Free Shipping + print "%s\t%d\t%s" % (priceStr,newFlag,title) + fw.write("%d\t%d\t%d\t%f\t%s\n" % (yr,numPce,newFlag,origPrc,priceStr)) + i += 1 + currentRow = soup.findAll('table', r="%d" % i) + fw.close() + +from time import sleep +import json +import urllib2 +def searchForSet(retX, retY, setNum, yr, numPce, origPrc): + sleep(10) + myAPIstr = 'AIzaSyD2cR2KFyx12hXu6PFU-wrWot3NXvko8vY' + searchURL = 'https://www.googleapis.com/shopping/search/v1/public/products?key=%s&country=US&q=lego+%d&alt=json' % (myAPIstr, setNum) + pg = urllib2.urlopen(searchURL) + retDict = json.loads(pg.read()) + for i in range(len(retDict['items'])): + try: + currItem = retDict['items'][i] + if currItem['product']['condition'] == 'new': + newFlag = 1 + else: newFlag = 0 + listOfInv = currItem['product']['inventories'] + for item in listOfInv: + sellingPrice = item['price'] + if sellingPrice > origPrc * 0.5: + print "%d\t%d\t%d\t%f\t%f" % (yr,numPce,newFlag,origPrc, sellingPrice) + retX.append([yr, numPce, newFlag, origPrc]) + retY.append(sellingPrice) + except: print 'problem with item %d' % i + +def setDataCollect(retX, retY): + searchForSet(retX, retY, 8288, 2006, 800, 49.99) + searchForSet(retX, retY, 10030, 2002, 3096, 269.99) + searchForSet(retX, retY, 10179, 2007, 5195, 499.99) + searchForSet(retX, retY, 10181, 2007, 3428, 199.99) + searchForSet(retX, retY, 10189, 2008, 5922, 299.99) + searchForSet(retX, retY, 10196, 2009, 3263, 249.99) + +def crossValidation(xArr,yArr,numVal=10): + m = len(yArr) + indexList = range(m) + errorMat = zeros((numVal,30))#create error mat 30columns numVal rows + for i in range(numVal): + trainX=[]; trainY=[] + testX = []; testY = [] + random.shuffle(indexList) + for j in range(m):#create training set based on first 90% of values in indexList + if j < m*0.9: + trainX.append(xArr[indexList[j]]) + trainY.append(yArr[indexList[j]]) + else: + testX.append(xArr[indexList[j]]) + testY.append(yArr[indexList[j]]) + wMat = ridgeTest(trainX,trainY) #get 30 weight vectors from ridge + for k in range(30):#loop over all of the ridge estimates + matTestX = mat(testX); matTrainX=mat(trainX) + meanTrain = mean(matTrainX,0) + varTrain = var(matTrainX,0) + matTestX = (matTestX-meanTrain)/varTrain #regularize test with training params + yEst = matTestX * mat(wMat[k,:]).T + mean(trainY)#test ridge results and store + errorMat[i,k]=rssError(yEst.T.A,array(testY)) + #print errorMat[i,k] + meanErrors = mean(errorMat,0)#calc avg performance of the different ridge weight vectors + minMean = float(min(meanErrors)) + bestWeights = wMat[nonzero(meanErrors==minMean)] + #can unregularize to get model + #when we regularized we wrote Xreg = (x-meanX)/var(x) + #we can now write in terms of x not Xreg: x*w/var(x) - meanX/var(x) +meanY + xMat = mat(xArr); yMat=mat(yArr).T + meanX = mean(xMat,0); varX = var(xMat,0) + unReg = bestWeights/varX + print "the best model from Ridge Regression is:\n",unReg + print "with constant term: ",-1*sum(multiply(meanX,unReg)) + mean(yMat) \ No newline at end of file From d1676db7e8ee54d3780c0590a7d84c7779ed4c4f Mon Sep 17 00:00:00 2001 From: jiangzhonglian Date: Sun, 26 Feb 2017 01:10:46 +0800 Subject: [PATCH 04/92] Update README.md --- README.md | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/README.md b/README.md index 711e5cedf..ffc5dae13 100644 --- a/README.md +++ b/README.md @@ -17,13 +17,13 @@ * 8) 预测数值型数据:回归 * 9) 数回归 -### 第三部分 无监督学习 +## 第三部分 无监督学习 * 10) 使用K-均值聚类算法对未标注数据分组 * 11) 使用Apriori算法进行关联分析 * 12) 使用FP-growth算法来高效发现频繁项集 -### 第四部分 其他工具 +## 第四部分 其他工具 * 13) 使用PCA来简化数据 * 14) 使用SVD简化数据 @@ -36,4 +36,4 @@ * 附录C 概率论复习 * 附录D 资源 * 索引 -* 版权声明 \ No newline at end of file +* 版权声明 From 73bb7076d6c8958aeb6a5914053fce8ba95cca00 Mon Sep 17 00:00:00 2001 From: jiangzhonglian Date: Sun, 26 Feb 2017 01:20:44 +0800 Subject: [PATCH 05/92] =?UTF-8?q?=E6=9B=B4=E6=96=B0=E7=89=88=E6=9C=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- README.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/README.md b/README.md index 4de2019f8..c530c70e1 100644 --- a/README.md +++ b/README.md @@ -39,13 +39,13 @@ * 8) 预测数值型数据:回归 * 9) 数回归 -### 第三部分 无监督学习 +## 第三部分 无监督学习 * 10) 使用K-均值聚类算法对未标注数据分组 * 11) 使用Apriori算法进行关联分析 * 12) 使用FP-growth算法来高效发现频繁项集 -### 第四部分 其他工具 +## 第四部分 其他工具 * 13) 使用PCA来简化数据 * 14) 使用SVD简化数据 From 315df1fef6519f10aa325b2a4bc306dd97605833 Mon Sep 17 00:00:00 2001 From: jiangzhonglian Date: Sun, 26 Feb 2017 01:28:48 +0800 Subject: [PATCH 06/92] =?UTF-8?q?=E6=9B=B4=E6=96=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index c530c70e1..60de4d2b9 100644 --- a/README.md +++ b/README.md @@ -58,4 +58,4 @@ * 附录C 概率论复习 * 附录D 资源 * 索引 -* 版权声明 \ No newline at end of file +* 版权声明 From 59940b7532ad180fdc07239bafed30b371f09a94 Mon Sep 17 00:00:00 2001 From: jiangzhonglian Date: Sun, 26 Feb 2017 01:39:49 +0800 Subject: [PATCH 07/92] =?UTF-8?q?=E6=9B=B4=E6=96=B0docs?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- README.md | 22 ---------------------- docs/README.md | 28 +++++++++++++++++++++++++--- 2 files changed, 25 insertions(+), 25 deletions(-) diff --git a/README.md b/README.md index 60de4d2b9..ffc5dae13 100644 --- a/README.md +++ b/README.md @@ -5,28 +5,6 @@ ## 第一部分 分类 * 1) 机器学习基础 - * 机器学习是什么 - * 把无序的数据转换成有用的信息。 - * 机器学习的意义 - * 我们利用计算机来彰显数据背后的真实含义。 - * 监督学习 - * 样本集:训练数据 + 测试数据 - * 特征(feature-是否有缺失情况) + 目标变量(分类-离散值/回归-连续值<0~100、 -999~999>) - * `知识表示`:机器已经学会如何识别鸟类的过程 - * 1.可以采用规则集的形式 - * 2.可以采用概率分布的形式 - * 3.可以使训练样本集中的一个实例 - * 非监督学习 - * 开发的步骤 - * 1.收集数据 - * 2.准备输入数据 - * 3.分析输入数据 - * 4.训练算法 - * 5.测试算法 - * 6.使用算法 - * Python相关的库 - * 科学函数库:SciPy、`NumPy`(底层语言:C和Fortran) - * 绘图工具库:`Matplotlib` * 2) k-紧邻算法 * 3) 决策树 * 4) 基于概率论的分类方法:朴素贝叶斯 diff --git a/docs/README.md b/docs/README.md index 711e5cedf..60de4d2b9 100644 --- a/docs/README.md +++ b/docs/README.md @@ -5,6 +5,28 @@ ## 第一部分 分类 * 1) 机器学习基础 + * 机器学习是什么 + * 把无序的数据转换成有用的信息。 + * 机器学习的意义 + * 我们利用计算机来彰显数据背后的真实含义。 + * 监督学习 + * 样本集:训练数据 + 测试数据 + * 特征(feature-是否有缺失情况) + 目标变量(分类-离散值/回归-连续值<0~100、 -999~999>) + * `知识表示`:机器已经学会如何识别鸟类的过程 + * 1.可以采用规则集的形式 + * 2.可以采用概率分布的形式 + * 3.可以使训练样本集中的一个实例 + * 非监督学习 + * 开发的步骤 + * 1.收集数据 + * 2.准备输入数据 + * 3.分析输入数据 + * 4.训练算法 + * 5.测试算法 + * 6.使用算法 + * Python相关的库 + * 科学函数库:SciPy、`NumPy`(底层语言:C和Fortran) + * 绘图工具库:`Matplotlib` * 2) k-紧邻算法 * 3) 决策树 * 4) 基于概率论的分类方法:朴素贝叶斯 @@ -17,13 +39,13 @@ * 8) 预测数值型数据:回归 * 9) 数回归 -### 第三部分 无监督学习 +## 第三部分 无监督学习 * 10) 使用K-均值聚类算法对未标注数据分组 * 11) 使用Apriori算法进行关联分析 * 12) 使用FP-growth算法来高效发现频繁项集 -### 第四部分 其他工具 +## 第四部分 其他工具 * 13) 使用PCA来简化数据 * 14) 使用SVD简化数据 @@ -36,4 +58,4 @@ * 附录C 概率论复习 * 附录D 资源 * 索引 -* 版权声明 \ No newline at end of file +* 版权声明 From 3d9905cafaabf575d7f2ea4afdd2b63ad4fe42f8 Mon Sep 17 00:00:00 2001 From: jiangzhonglian Date: Sun, 26 Feb 2017 01:50:02 +0800 Subject: [PATCH 08/92] =?UTF-8?q?=E7=BC=96=E5=86=99=E6=96=87=E6=A1=A3?= =?UTF-8?q?=E8=A7=84=E8=8C=83demo?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- README.md | 1 + ...46\344\271\240\345\237\272\347\241\200.md" | 25 ++++++++ docs/README.md | 61 ------------------- 3 files changed, 26 insertions(+), 61 deletions(-) create mode 100644 "docs/1.\346\234\272\345\231\250\345\255\246\344\271\240\345\237\272\347\241\200.md" delete mode 100644 docs/README.md diff --git a/README.md b/README.md index ffc5dae13..1de515299 100644 --- a/README.md +++ b/README.md @@ -5,6 +5,7 @@ ## 第一部分 分类 * 1) 机器学习基础 + * [1.机器学习基础](./docs/1.机器学习基础.md) * 2) k-紧邻算法 * 3) 决策树 * 4) 基于概率论的分类方法:朴素贝叶斯 diff --git "a/docs/1.\346\234\272\345\231\250\345\255\246\344\271\240\345\237\272\347\241\200.md" "b/docs/1.\346\234\272\345\231\250\345\255\246\344\271\240\345\237\272\347\241\200.md" new file mode 100644 index 000000000..b7ca10063 --- /dev/null +++ "b/docs/1.\346\234\272\345\231\250\345\255\246\344\271\240\345\237\272\347\241\200.md" @@ -0,0 +1,25 @@ + +# 1) 机器学习基础 + +* 机器学习是什么 + * 把无序的数据转换成有用的信息。 +* 机器学习的意义 + * 我们利用计算机来彰显数据背后的真实含义。 +* 监督学习 + * 样本集:训练数据 + 测试数据 + * 特征(feature-是否有缺失情况) + 目标变量(分类-离散值/回归-连续值<0~100、 -999~999>) + * `知识表示`:机器已经学会如何识别鸟类的过程 + * 1.可以采用规则集的形式 + * 2.可以采用概率分布的形式 + * 3.可以使训练样本集中的一个实例 +* 非监督学习 +* 开发的步骤 + * 1.收集数据 + * 2.准备输入数据 + * 3.分析输入数据 + * 4.训练算法 + * 5.测试算法 + * 6.使用算法 +* Python相关的库 + * 科学函数库:SciPy、`NumPy`(底层语言:C和Fortran) + * 绘图工具库:`Matplotlib` \ No newline at end of file diff --git a/docs/README.md b/docs/README.md deleted file mode 100644 index 60de4d2b9..000000000 --- a/docs/README.md +++ /dev/null @@ -1,61 +0,0 @@ -# MachineLearning - -**Mahchine Leaning in Action (python)** - -## 第一部分 分类 - -* 1) 机器学习基础 - * 机器学习是什么 - * 把无序的数据转换成有用的信息。 - * 机器学习的意义 - * 我们利用计算机来彰显数据背后的真实含义。 - * 监督学习 - * 样本集:训练数据 + 测试数据 - * 特征(feature-是否有缺失情况) + 目标变量(分类-离散值/回归-连续值<0~100、 -999~999>) - * `知识表示`:机器已经学会如何识别鸟类的过程 - * 1.可以采用规则集的形式 - * 2.可以采用概率分布的形式 - * 3.可以使训练样本集中的一个实例 - * 非监督学习 - * 开发的步骤 - * 1.收集数据 - * 2.准备输入数据 - * 3.分析输入数据 - * 4.训练算法 - * 5.测试算法 - * 6.使用算法 - * Python相关的库 - * 科学函数库:SciPy、`NumPy`(底层语言:C和Fortran) - * 绘图工具库:`Matplotlib` -* 2) k-紧邻算法 -* 3) 决策树 -* 4) 基于概率论的分类方法:朴素贝叶斯 -* 5) Logistic回归 -* 6) 支持向量机 -* 7) 利用AdaBoost元算法提高分类 - -## 第二部分 利用回归预测数值型数据 - -* 8) 预测数值型数据:回归 -* 9) 数回归 - -## 第三部分 无监督学习 - -* 10) 使用K-均值聚类算法对未标注数据分组 -* 11) 使用Apriori算法进行关联分析 -* 12) 使用FP-growth算法来高效发现频繁项集 - -## 第四部分 其他工具 - -* 13) 使用PCA来简化数据 -* 14) 使用SVD简化数据 -* 15) 大数据与MapReduce - -* * * - -* 附录A Python入门 -* 附录B 线性代数 -* 附录C 概率论复习 -* 附录D 资源 -* 索引 -* 版权声明 From 9ab1f9af91983ee650cc7e4b230c2476921bce60 Mon Sep 17 00:00:00 2001 From: jiangzhonglian Date: Sun, 26 Feb 2017 01:52:26 +0800 Subject: [PATCH 09/92] =?UTF-8?q?=E6=9B=B4=E6=96=B0=E6=A0=BC=E5=BC=8F?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 1de515299..c11aceb21 100644 --- a/README.md +++ b/README.md @@ -5,7 +5,7 @@ ## 第一部分 分类 * 1) 机器学习基础 - * [1.机器学习基础](./docs/1.机器学习基础.md) + * [机器学习基础](./docs/1.机器学习基础.md) * 2) k-紧邻算法 * 3) 决策树 * 4) 基于概率论的分类方法:朴素贝叶斯 From 8ebb5c172c5bacc6793b173892b6ed5b57adcf26 Mon Sep 17 00:00:00 2001 From: jiangzhonglian Date: Sun, 26 Feb 2017 02:09:31 +0800 Subject: [PATCH 10/92] test --- ...\231\250\345\255\246\344\271\240\345\237\272\347\241\200.md" | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git "a/docs/1.\346\234\272\345\231\250\345\255\246\344\271\240\345\237\272\347\241\200.md" "b/docs/1.\346\234\272\345\231\250\345\255\246\344\271\240\345\237\272\347\241\200.md" index b7ca10063..d4e74a543 100644 --- "a/docs/1.\346\234\272\345\231\250\345\255\246\344\271\240\345\237\272\347\241\200.md" +++ "b/docs/1.\346\234\272\345\231\250\345\255\246\344\271\240\345\237\272\347\241\200.md" @@ -22,4 +22,4 @@ * 6.使用算法 * Python相关的库 * 科学函数库:SciPy、`NumPy`(底层语言:C和Fortran) - * 绘图工具库:`Matplotlib` \ No newline at end of file + * 绘图工具库:`Matplotlib` From 91955840b1187cc2a00ffd5592dcd7b5a3ef0b19 Mon Sep 17 00:00:00 2001 From: sheepmen Date: Sun, 26 Feb 2017 11:59:08 +0800 Subject: [PATCH 11/92] DEV: ADD CHATPER-2 NOTE --- .gitignore | 1 + .vscode/settings.json | 3 --- .vscode/tasks.json | 9 -------- README.md | 3 ++- ...21\351\202\273\347\256\227\346\263\225.md" | 21 +++++++++++++++++++ 5 files changed, 24 insertions(+), 13 deletions(-) delete mode 100644 .vscode/settings.json delete mode 100644 .vscode/tasks.json create mode 100644 "docs/2.k-\350\277\221\351\202\273\347\256\227\346\263\225.md" diff --git a/.gitignore b/.gitignore index 72364f99f..6564ff4af 100644 --- a/.gitignore +++ b/.gitignore @@ -87,3 +87,4 @@ ENV/ # Rope project settings .ropeproject +.vscode diff --git a/.vscode/settings.json b/.vscode/settings.json deleted file mode 100644 index fe7159848..000000000 --- a/.vscode/settings.json +++ /dev/null @@ -1,3 +0,0 @@ -{ - "python.linting.pylintEnabled": false -} \ No newline at end of file diff --git a/.vscode/tasks.json b/.vscode/tasks.json deleted file mode 100644 index 66d0b4ec2..000000000 --- a/.vscode/tasks.json +++ /dev/null @@ -1,9 +0,0 @@ -{ - // See https://go.microsoft.com/fwlink/?LinkId=733558 - // for the documentation about the tasks.json format - "version": "0.1.0", - "command": "/usr/bin/python", - "isShellCommand": true, - "args": ["${file}"], - "showOutput": "always" -} diff --git a/README.md b/README.md index c11aceb21..c75441596 100644 --- a/README.md +++ b/README.md @@ -6,7 +6,8 @@ * 1) 机器学习基础 * [机器学习基础](./docs/1.机器学习基础.md) -* 2) k-紧邻算法 +* 2) k-近邻算法 + * [k-近邻算法](./docs/2.k-近邻算法.md) * 3) 决策树 * 4) 基于概率论的分类方法:朴素贝叶斯 * 5) Logistic回归 diff --git "a/docs/2.k-\350\277\221\351\202\273\347\256\227\346\263\225.md" "b/docs/2.k-\350\277\221\351\202\273\347\256\227\346\263\225.md" new file mode 100644 index 000000000..87640c0d4 --- /dev/null +++ "b/docs/2.k-\350\277\221\351\202\273\347\256\227\346\263\225.md" @@ -0,0 +1,21 @@ + +# 2) k-近邻算法 + +* k-近邻算法的特点 + * 优点:精度高、对异常值不敏感、无数据输入假定 + * 缺点:计算复杂度高、空间复杂度高 + * 适用数据范围:数值型和标称型 +* 工作原理 + * 已知样本数据集的每一个数据的特征和所属分类,将新数据的特征与样本数据进行比较,找到最相似(最近邻)的k(通常k <= 20)个数据。选择k个数据中出现次数最多的分类,作为新数据的分类。 +* k-近邻算法的一般流程 + * 收集数据:任何方法 + * 准备数据:距离计算所需要的数值,最好是结构化的数据格式 + * 分析数据:任何方法 + * 测试数据:计算错误率 + * 使用算法:输入样本数据和结构化的输出结果,然后运行k-近邻算法判断输入数据分类属于哪个分类,最后对计算出的分类执行后续处理 +* 总结 + * k-近邻算法其实就是根据空间两个向量距离来判断类别性,关键的是引入k值,保证了一定的稳定性,很明显的缺点就是每次都要与所有样本数据进行对比。 + * 文中处理约会数据时,归一化的方法是对于消除影响很十分重要的 + * 阅读本章之前建议阅读一下numpy的文档 + * [numpy英文文档](https://docs.scipy.org/doc/numpy-dev/user/quickstart.html) + * [numpy中文文档](http://old.sebug.net/paper/books/scipydoc/numpy_intro.html) From 186f4dbaba906cba6eaf1b97efafdf411120b680 Mon Sep 17 00:00:00 2001 From: jiangzhonglian Date: Mon, 27 Feb 2017 12:07:12 +0800 Subject: [PATCH 12/92] =?UTF-8?q?=E6=B5=8B=E8=AF=95numpy=E6=98=AF=E5=90=A6?= =?UTF-8?q?=E5=AE=89=E8=A3=85=E5=AE=8C=E5=85=A8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/python/01.NumPy.py | 17 +++++++++++++++-- 1 file changed, 15 insertions(+), 2 deletions(-) diff --git a/src/python/01.NumPy.py b/src/python/01.NumPy.py index 8425a6cee..256b0b93e 100644 --- a/src/python/01.NumPy.py +++ b/src/python/01.NumPy.py @@ -1,7 +1,7 @@ #!/usr/bin/python # coding:utf8 -from numpy import random +from numpy import random, mat, eye ''' # NumPy 矩阵和数字的区别 @@ -16,6 +16,19 @@ ''' # 生成一个 4*4 的随机数组 -print random.rand(4, 4) +randArray = random.rand(4, 4) +# 转化关系, 数组转化为矩阵 +randMat = mat(randArray) +# .I表示对矩阵求逆 +invRandMat = randMat.I +# 输出结果 +print randArray, '\n', randMat, '\n', invRandMat +# 矩阵和逆矩阵 进行求积 (单位矩阵,对角线都为1嘛,理论上4*4的矩阵其他的都为0) +myEye = randMat*invRandMat +# 误差 +print myEye - eye(4) +''' +如果上面的代码运行没有问题,说明numpy安装没有问题 +''' From 7da5afed05f3fc185c13401ae7d5a201b58aefc0 Mon Sep 17 00:00:00 2001 From: jiangzhonglian Date: Mon, 27 Feb 2017 16:33:37 +0800 Subject: [PATCH 13/92] =?UTF-8?q?=E6=A0=BC=E5=BC=8F=E6=95=B0=E5=AD=A6?= =?UTF-8?q?=E5=85=AC=E5=BC=8F?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- README.md | 1 + ...3.\345\206\263\347\255\226\346\240\221.md" | 23 +++ src/python/03.DecisionTree.py | 172 ++++++++++++++++++ 3 files changed, 196 insertions(+) create mode 100644 "docs/3.\345\206\263\347\255\226\346\240\221.md" create mode 100644 src/python/03.DecisionTree.py diff --git a/README.md b/README.md index c75441596..b87dcabc1 100644 --- a/README.md +++ b/README.md @@ -9,6 +9,7 @@ * 2) k-近邻算法 * [k-近邻算法](./docs/2.k-近邻算法.md) * 3) 决策树 + * [决策树](./docs/3.决策树.md) * 4) 基于概率论的分类方法:朴素贝叶斯 * 5) Logistic回归 * 6) 支持向量机 diff --git "a/docs/3.\345\206\263\347\255\226\346\240\221.md" "b/docs/3.\345\206\263\347\255\226\346\240\221.md" new file mode 100644 index 000000000..f91b40bf4 --- /dev/null +++ "b/docs/3.\345\206\263\347\255\226\346\240\221.md" @@ -0,0 +1,23 @@ + +# 3) 决策树 + +* 决策树是什么? + * 顾名思义,是一种树,一种依托于策略抉择而建立起来的树。 + * 从数据产生决策树的机器学习技术叫做决策树学习, 通俗点说就是决策树。 +* 决策数目前的情况: + * 1.最经常使用的数据挖掘算法。(流行的原因:不需要了解机器学习的知识,就能搞明白决策树是如何工作的) + * 2.数据形式[决策过程只有:是/否]和数据内在含义非常容易理解。 + * 3.决策树给出的结果往往可以匹敌在当前领域具有几十年工作经验的人类专家。 +* 决策树的构造: + * 优点:计算复杂度不高,输出结果易于理解,对中间值的缺失不敏感,可以处理不相关特征数据。 + * 缺点:可能会产生过度匹配问题。 + * 适用数据类型:数值型和标称型[标称型:其实就是离散型数据,变量的结果只在`有限`目标集中取值(例如:分类特征 A/B/C类其中一种)]。 +* 如何找出第一个分支点呢? + * 信息增益: + * 划分数据集的最大原则是:将无序的数据变得更加有序。 + * 集合信息的度量称为`香农熵`或者简称`熵`(名字来源于信息论之父`克劳德·香农`) + * 公式: + * l(x_i) = -log_2 P(x_i) + * + * 基尼不纯度(Gini impurity) [本书不做过多的介绍] + * 简单来说:就是从一个数据集中随机选取子项,度量其被错误分类到其他分组里的概率。 diff --git a/src/python/03.DecisionTree.py b/src/python/03.DecisionTree.py new file mode 100644 index 000000000..e958eef87 --- /dev/null +++ b/src/python/03.DecisionTree.py @@ -0,0 +1,172 @@ +#!/usr/bin/python +# coding:utf8 + +''' +Created on Oct 12, 2010 +Update on 2017-02-27 +Decision Tree Source Code for Machine Learning in Action Ch. 3 +@author: Peter Harrington/jiangzhonglian +''' +from math import log +import operator + + +def createDataSet(): + """DateSet 基础数据集 + + Args: + 无需传入参数 + Returns: + 返回数据集和对应的label标签 + Raises: + + """ + dataSet = [[1, 1, 'yes'], + [1, 1, 'yes'], + [1, 0, 'no'], + [0, 1, 'no'], + [0, 1, 'no']] + labels = ['no surfacing', 'flippers'] + # change to discrete values + return dataSet, labels + + +def calcShannonEnt(dataSet): + """calcShannonEnt(calculate Shannon entropy 计算香农熵) + + Args: + dataSet 数据集 + Returns: + 返回香农熵的计算值 + Raises: + + """ + # 求list的长度,表示计算参与训练的数据量 + numEntries = len(dataSet) + # print type(dataSet), 'numEntries: ', numEntries + + # 计算分类标签label出现的次数 + labelCounts = {} + # the the number of unique elements and their occurance + for featVec in dataSet: + currentLabel = featVec[-1] + if currentLabel not in labelCounts.keys(): + labelCounts[currentLabel] = 0 + labelCounts[currentLabel] += 1 + # print '-----', featVec, labelCounts + + # 对于label标签的占比,求出label标签的香农熵 + shannonEnt = 0.0 + for key in labelCounts: + prob = float(labelCounts[key])/numEntries + # log base 2 + shannonEnt -= prob * log(prob, 2) + print '---', prob, prob * log(prob, 2), shannonEnt + return shannonEnt + + +def splitDataSet(dataSet, axis, value): + retDataSet = [] + for featVec in dataSet: + if featVec[axis] == value: + # chop out axis used for splitting + reducedFeatVec = featVec[:axis] + reducedFeatVec.extend(featVec[axis+1:]) + retDataSet.append(reducedFeatVec) + return retDataSet + + +def chooseBestFeatureToSplit(dataSet): + # the last column is used for the labels + numFeatures = len(dataSet[0]) - 1 + baseEntropy = calcShannonEnt(dataSet) + bestInfoGain = 0.0 + bestFeature = -1 + # iterate over all the features + for i in range(numFeatures): + # create a list of all the examples of this feature + featList = [example[i] for example in dataSet] + # get a set of unique values + uniqueVals = set(featList) + newEntropy = 0.0 + for value in uniqueVals: + subDataSet = splitDataSet(dataSet, i, value) + prob = len(subDataSet)/float(len(dataSet)) + newEntropy += prob * calcShannonEnt(subDataSet) + infoGain = baseEntropy - newEntropy #calculate the info gain; ie reduction in entropy + if (infoGain > bestInfoGain): #compare this to the best gain so far + bestInfoGain = infoGain #if better than current best, set to best + bestFeature = i + return bestFeature #returns an integer + + +def majorityCnt(classList): + classCount = {} + for vote in classList: + if vote not in classCount.keys(): + classCount[vote] = 0 + classCount[vote] += 1 + sortedClassCount = sorted(classCount.iteritems(), key=operator.itemgetter(1), reverse=True) + return sortedClassCount[0][0] + + +def createTree(dataSet, labels): + classList = [example[-1] for example in dataSet] + if classList.count(classList[0]) == len(classList): + return classList[0]#stop splitting when all of the classes are equal + if len(dataSet[0]) == 1: #stop splitting when there are no more features in dataSet + return majorityCnt(classList) + bestFeat = chooseBestFeatureToSplit(dataSet) + bestFeatLabel = labels[bestFeat] + myTree = {bestFeatLabel:{}} + # 注:labels列表是可变对象,在PYTHON函数中作为参数时传址引用,能够被全局修改 + # 所以这行代码导致函数外的同名变量被删除了元素,造成例句无法执行,提示'no surfacing' is not in list + del(labels[bestFeat]) + featValues = [example[bestFeat] for example in dataSet] + uniqueVals = set(featValues) + for value in uniqueVals: + subLabels = labels[:] #copy all of labels, so trees don't mess up existing labels + myTree[bestFeatLabel][value] = createTree(splitDataSet(dataSet, bestFeat, value),subLabels) + return myTree + + +def classify(inputTree, featLabels, testVec): + # 获取tree的第一个节点值 + print '1111', inputTree.keys() + firstStr = inputTree.keys()[0] + secondDict = inputTree[firstStr] + featIndex = featLabels.index(firstStr) + key = testVec[featIndex] + valueOfFeat = secondDict[key] + if isinstance(valueOfFeat, dict): + classLabel = classify(valueOfFeat, featLabels, testVec) + else: + classLabel = valueOfFeat + return classLabel + + +def storeTree(inputTree,filename): + import pickle + fw = open(filename, 'w') + pickle.dump(inputTree, fw) + fw.close() + + +def grabTree(filename): + import pickle + fr = open(filename) + return pickle.load(fr) + + +if __name__ == "__main__": + + # 1.创建数据和结果标签 + myDat, labels = createDataSet() + print myDat, labels + + calcShannonEnt(myDat) + + # import copy + # myTree = createTree(myDat, copy.deepcopy(labels)) + # print myTree + # print classify(myTree, labels, [1, 1]) From a4bcdf74c3c5824c405b3c1114500dfc548bfce1 Mon Sep 17 00:00:00 2001 From: jiangzhonglian Date: Tue, 28 Feb 2017 19:05:27 +0800 Subject: [PATCH 14/92] =?UTF-8?q?=E5=86=B3=E7=AD=96=E6=A0=91=E6=B5=8B?= =?UTF-8?q?=E8=AF=95=E6=A1=88=E4=BE=8B=E6=9B=B4=E6=96=B0=E5=AE=8C=E6=88=90?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...3.\345\206\263\347\255\226\346\240\221.md" | 6 +- .../DecisionTree.py} | 119 ++++++++++++---- .../03.DecisionTree/DecisionTreePlot.py | 132 ++++++++++++++++++ 3 files changed, 231 insertions(+), 26 deletions(-) rename src/python/{03.DecisionTree.py => 03.DecisionTree/DecisionTree.py} (54%) create mode 100644 src/python/03.DecisionTree/DecisionTreePlot.py diff --git "a/docs/3.\345\206\263\347\255\226\346\240\221.md" "b/docs/3.\345\206\263\347\255\226\346\240\221.md" index f91b40bf4..4a2db2382 100644 --- "a/docs/3.\345\206\263\347\255\226\346\240\221.md" +++ "b/docs/3.\345\206\263\347\255\226\346\240\221.md" @@ -1,5 +1,6 @@ # 3) 决策树 + * 决策树是什么? * 顾名思义,是一种树,一种依托于策略抉择而建立起来的树。 @@ -17,7 +18,8 @@ * 划分数据集的最大原则是:将无序的数据变得更加有序。 * 集合信息的度量称为`香农熵`或者简称`熵`(名字来源于信息论之父`克劳德·香农`) * 公式: - * l(x_i) = -log_2 P(x_i) - * + * \\(p(x_i)\\) 表示该label分类的概率 + * \\(l(x_i) = - \log_2p(x_i)\\) 表示符号\\(x_i\\)的信息定义 + * \\(H = -\sum_{i=0}^np(x_i)\log_2p(x_i)\\) 表示香农熵,用于计算信息熵 * 基尼不纯度(Gini impurity) [本书不做过多的介绍] * 简单来说:就是从一个数据集中随机选取子项,度量其被错误分类到其他分组里的概率。 diff --git a/src/python/03.DecisionTree.py b/src/python/03.DecisionTree/DecisionTree.py similarity index 54% rename from src/python/03.DecisionTree.py rename to src/python/03.DecisionTree/DecisionTree.py index e958eef87..c7920bd1c 100644 --- a/src/python/03.DecisionTree.py +++ b/src/python/03.DecisionTree/DecisionTree.py @@ -9,6 +9,7 @@ ''' from math import log import operator +import DecisionTreePlot as dtPlot def createDataSet(): @@ -26,13 +27,18 @@ def createDataSet(): [1, 0, 'no'], [0, 1, 'no'], [0, 1, 'no']] + # dataSet = [['yes'], + # ['yes'], + # ['no'], + # ['no'], + # ['no']] labels = ['no surfacing', 'flippers'] # change to discrete values return dataSet, labels def calcShannonEnt(dataSet): - """calcShannonEnt(calculate Shannon entropy 计算香农熵) + """calcShannonEnt(calculate Shannon entropy 计算label分类标签的香农熵) Args: dataSet 数据集 @@ -61,83 +67,136 @@ def calcShannonEnt(dataSet): prob = float(labelCounts[key])/numEntries # log base 2 shannonEnt -= prob * log(prob, 2) - print '---', prob, prob * log(prob, 2), shannonEnt + # print '---', prob, prob * log(prob, 2), shannonEnt return shannonEnt def splitDataSet(dataSet, axis, value): + """splitDataSet(通过遍历dataSet数据集,求出axis对应的colnum列的值为value的行) + + Args: + dataSet 数据集 + axis 表示每一行的axis列 + value 表示axis列对应的value值 + Returns: + axis列为value的数据集【该数据集需要排除axis列】 + Raises: + + """ retDataSet = [] for featVec in dataSet: + # axis列为value的数据集【该数据集需要排除axis列】 if featVec[axis] == value: # chop out axis used for splitting reducedFeatVec = featVec[:axis] + ''' + 请百度查询一下: extend和append的区别 + ''' reducedFeatVec.extend(featVec[axis+1:]) + # 收集结果值 axis列为value的行【该行需要排除axis列】 retDataSet.append(reducedFeatVec) return retDataSet def chooseBestFeatureToSplit(dataSet): - # the last column is used for the labels + """chooseBestFeatureToSplit(选择最好的特征) + + Args: + dataSet 数据集 + Returns: + bestFeature 最优的特征列 + Raises: + + """ + # 求第一行有多少列的 Feature numFeatures = len(dataSet[0]) - 1 + # label的信息熵 baseEntropy = calcShannonEnt(dataSet) - bestInfoGain = 0.0 - bestFeature = -1 + # 最优的信息增益值, 和最优的Featurn编号 + bestInfoGain, bestFeature = 0.0, -1 # iterate over all the features for i in range(numFeatures): # create a list of all the examples of this feature + # 获取每一个feature的list集合 featList = [example[i] for example in dataSet] # get a set of unique values - uniqueVals = set(featList) + # 获取剔重后的集合 + uniqueVals = set(featList) + # 创建一个临时的信息熵 newEntropy = 0.0 + # 遍历某一列的value集合,计算该列的信息熵 for value in uniqueVals: subDataSet = splitDataSet(dataSet, i, value) prob = len(subDataSet)/float(len(dataSet)) - newEntropy += prob * calcShannonEnt(subDataSet) - infoGain = baseEntropy - newEntropy #calculate the info gain; ie reduction in entropy - if (infoGain > bestInfoGain): #compare this to the best gain so far - bestInfoGain = infoGain #if better than current best, set to best + newEntropy += prob * calcShannonEnt(subDataSet) + # 计算label的信息熵和每个特征的信息熵 的增益值,如果增益值大于最大值,那么效果越好 + infoGain = baseEntropy - newEntropy + if (infoGain > bestInfoGain): + bestInfoGain = infoGain bestFeature = i - return bestFeature #returns an integer + return bestFeature def majorityCnt(classList): + """majorityCnt(选择出线次数最多的一个结果) + + Args: + classList label列的集合 + Returns: + bestFeature 最优的特征列 + Raises: + + """ classCount = {} for vote in classList: if vote not in classCount.keys(): classCount[vote] = 0 classCount[vote] += 1 + # 倒叙排列classCount得到一个字典集合,然后取出第一个就是结果(yes/no) sortedClassCount = sorted(classCount.iteritems(), key=operator.itemgetter(1), reverse=True) + # print 'sortedClassCount:', sortedClassCount return sortedClassCount[0][0] def createTree(dataSet, labels): classList = [example[-1] for example in dataSet] + # 如果数据集的最后一列的第一个值出现的次数=整个集合的数量,也就说只有一个类别,就只直接返回结果就行 if classList.count(classList[0]) == len(classList): - return classList[0]#stop splitting when all of the classes are equal - if len(dataSet[0]) == 1: #stop splitting when there are no more features in dataSet + return classList[0] + # 如果数据集只有1列,那么最初出现label次数最多的一类,作为结果 + if len(dataSet[0]) == 1: return majorityCnt(classList) + + # 选择最优的列,得到最有列对应的label含义 bestFeat = chooseBestFeatureToSplit(dataSet) bestFeatLabel = labels[bestFeat] - myTree = {bestFeatLabel:{}} + # 初始化myTree + myTree = {bestFeatLabel: {}} # 注:labels列表是可变对象,在PYTHON函数中作为参数时传址引用,能够被全局修改 # 所以这行代码导致函数外的同名变量被删除了元素,造成例句无法执行,提示'no surfacing' is not in list del(labels[bestFeat]) + # 取出最优列,然后它的branch做分类 featValues = [example[bestFeat] for example in dataSet] uniqueVals = set(featValues) for value in uniqueVals: - subLabels = labels[:] #copy all of labels, so trees don't mess up existing labels - myTree[bestFeatLabel][value] = createTree(splitDataSet(dataSet, bestFeat, value),subLabels) + # 求出剩余的标签label + subLabels = labels[:] + myTree[bestFeatLabel][value] = createTree(splitDataSet(dataSet, bestFeat, value), subLabels) + # print 'myTree', value, myTree return myTree def classify(inputTree, featLabels, testVec): - # 获取tree的第一个节点值 - print '1111', inputTree.keys() + # 获取tree的第一个节点对应的key值 firstStr = inputTree.keys()[0] + # 获取第一个节点对应的value值 secondDict = inputTree[firstStr] + # 判断根节点的索引值,然后根据testVec来获取对应的树分枝位置 featIndex = featLabels.index(firstStr) key = testVec[featIndex] valueOfFeat = secondDict[key] + print '+++', firstStr, 'xxx', secondDict, '---', key, '>>>', valueOfFeat + # 判断分枝是否结束 if isinstance(valueOfFeat, dict): classLabel = classify(valueOfFeat, featLabels, testVec) else: @@ -145,7 +204,7 @@ def classify(inputTree, featLabels, testVec): return classLabel -def storeTree(inputTree,filename): +def storeTree(inputTree, filename): import pickle fw = open(filename, 'w') pickle.dump(inputTree, fw) @@ -162,11 +221,23 @@ def grabTree(filename): # 1.创建数据和结果标签 myDat, labels = createDataSet() - print myDat, labels + # print myDat, labels - calcShannonEnt(myDat) + # # 计算label分类标签的香农熵 + # calcShannonEnt(myDat) - # import copy - # myTree = createTree(myDat, copy.deepcopy(labels)) - # print myTree + # # 求第0列 为 1/0的列的数据集【排除第0列】 + # print '1---', splitDataSet(myDat, 0, 1) + # print '0---', splitDataSet(myDat, 0, 0) + + # # 计算最好的信息增益的列 + # print chooseBestFeatureToSplit(myDat) + + import copy + myTree = createTree(myDat, copy.deepcopy(labels)) + print myTree + # [1, 1]表示要取的分支上的节点位置,对应的结果值 # print classify(myTree, labels, [1, 1]) + + # 画图可视化展现 + dtPlot.createPlot(myTree) diff --git a/src/python/03.DecisionTree/DecisionTreePlot.py b/src/python/03.DecisionTree/DecisionTreePlot.py new file mode 100644 index 000000000..cf11e3827 --- /dev/null +++ b/src/python/03.DecisionTree/DecisionTreePlot.py @@ -0,0 +1,132 @@ +#!/usr/bin/python +# coding:utf8 + +''' +Created on Oct 14, 2010 +Update on 2017-02-27 +Decision Tree Source Code for Machine Learning in Action Ch. 3 +@author: Peter Harrington/jiangzhonglian +''' +import matplotlib.pyplot as plt + +# 定义文本框 和 箭头格式 【 sawtooth 波浪方框, round4 矩形方框 , fc表示字体颜色的深浅 0.1~0.9 依次变浅,没错是变浅】 +decisionNode = dict(boxstyle="sawtooth", fc="0.8") +leafNode = dict(boxstyle="round4", fc="0.8") +arrow_args = dict(arrowstyle="<-") + + +def getNumLeafs(myTree): + numLeafs = 0 + firstStr = myTree.keys()[0] + secondDict = myTree[firstStr] + # 根节点开始遍历 + for key in secondDict.keys(): + # 判断子节点是否为dict, 不是+1 + if type(secondDict[key]).__name__ == 'dict': + numLeafs += getNumLeafs(secondDict[key]) + else: + numLeafs += 1 + return numLeafs + + +def getTreeDepth(myTree): + maxDepth = 0 + firstStr = myTree.keys()[0] + secondDict = myTree[firstStr] + # 根节点开始遍历 + for key in secondDict.keys(): + # 判断子节点是不是dict, 求分枝的深度 + if type(secondDict[key]).__name__ == 'dict': + thisDepth = 1 + getTreeDepth(secondDict[key]) + else: + thisDepth = 1 + # 记录最大的分支深度 + if thisDepth > maxDepth: + maxDepth = thisDepth + return maxDepth + + +def plotNode(nodeTxt, centerPt, parentPt, nodeType): + createPlot.ax1.annotate(nodeTxt, xy=parentPt, xycoords='axes fraction', xytext=centerPt, textcoords='axes fraction', va="center", ha="center", bbox=nodeType, arrowprops=arrow_args) + + +def plotMidText(cntrPt, parentPt, txtString): + xMid = (parentPt[0]-cntrPt[0])/2.0 + cntrPt[0] + yMid = (parentPt[1]-cntrPt[1])/2.0 + cntrPt[1] + createPlot.ax1.text(xMid, yMid, txtString, va="center", ha="center", rotation=30) + + +def plotTree(myTree, parentPt, nodeTxt): + # 获取叶子节点的数量 + numLeafs = getNumLeafs(myTree) + # 获取树的深度 + # depth = getTreeDepth(myTree) + + # 找出第1个中心点的位置,然后与 parentPt定点进行划线 + cntrPt = (plotTree.xOff + (1.0 + float(numLeafs))/2.0/plotTree.totalW, plotTree.yOff) + # print cntrPt + # 并打印输入对应的文字 + plotMidText(cntrPt, parentPt, nodeTxt) + + firstStr = myTree.keys()[0] + # 可视化Node分支点 + plotNode(firstStr, cntrPt, parentPt, decisionNode) + # 根节点的值 + secondDict = myTree[firstStr] + # y值 = 最高点-层数的高度[第二个节点位置] + plotTree.yOff = plotTree.yOff - 1.0/plotTree.totalD + for key in secondDict.keys(): + # 判断该节点是否是Node节点 + if type(secondDict[key]).__name__=='dict': + # 如果是就递归调用[recursion] + plotTree(secondDict[key],cntrPt,str(key)) + else: + # 如果不是,就在原来节点一半的地方找到节点的坐标 + plotTree.xOff = plotTree.xOff + 1.0/plotTree.totalW + # 可视化该节点位置 + plotNode(secondDict[key], (plotTree.xOff, plotTree.yOff), cntrPt, leafNode) + # 并打印输入对应的文字 + plotMidText((plotTree.xOff, plotTree.yOff), cntrPt, str(key)) + # plotTree.yOff = plotTree.yOff + 1.0/plotTree.totalD + + +def createPlot(inTree): + # 创建一个figure的模版 + fig = plt.figure(1, facecolor='green') + fig.clf() + + axprops = dict(xticks=[], yticks=[]) + # 表示创建一个1行,1列的图,createPlot.ax1 为第 1 个子图, + createPlot.ax1 = plt.subplot(111, frameon=False, **axprops) + + plotTree.totalW = float(getNumLeafs(inTree)) + plotTree.totalD = float(getTreeDepth(inTree)) + # 半个节点的长度 + plotTree.xOff = -0.5/plotTree.totalW + plotTree.yOff = 1.0 + plotTree(inTree, (0.5, 1.0), '') + plt.show() + + +# # 测试画图 +# def createPlot(): +# fig = plt.figure(1, facecolor='white') +# fig.clf() +# # ticks for demo puropses +# createPlot.ax1 = plt.subplot(111, frameon=False) +# plotNode('a decision node', (0.5, 0.1), (0.1, 0.5), decisionNode) +# plotNode('a leaf node', (0.8, 0.1), (0.3, 0.8), leafNode) +# plt.show() + + +# 测试数据集 +def retrieveTree(i): + listOfTrees =[ + {'no surfacing': {0: 'no', 1: {'flippers': {0: 'no', 1: 'yes'}}}}, + {'no surfacing': {0: 'no', 1: {'flippers': {0: {'head': {0: 'no', 1: 'yes'}}, 1: 'no'}}}} + ] + return listOfTrees[i] + + +myTree = retrieveTree(0) +createPlot(myTree) From 5ad0a5099b5e2f2ba525e8892628a8d9bc7f1405 Mon Sep 17 00:00:00 2001 From: jiangzhonglian Date: Wed, 1 Mar 2017 20:30:23 +0800 Subject: [PATCH 15/92] =?UTF-8?q?=E6=9B=B4=E6=96=B0Sklearn=20=E5=86=B3?= =?UTF-8?q?=E7=AD=96=E6=A0=91=E7=9A=84=E4=BD=BF=E7=94=A8Demo?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/python/03.DecisionTree/DTSklearn.py | 115 +++++++++++++++++++ src/python/03.DecisionTree/DecisionTree.py | 2 +- src/python/tools/DecisionTree.py | 124 +++++++++++++++++++++ testData/DT_data.txt | 10 ++ testResult/tree.pdf | Bin 0 -> 16586 bytes 5 files changed, 250 insertions(+), 1 deletion(-) create mode 100644 src/python/03.DecisionTree/DTSklearn.py create mode 100644 src/python/tools/DecisionTree.py create mode 100644 testData/DT_data.txt create mode 100644 testResult/tree.pdf diff --git a/src/python/03.DecisionTree/DTSklearn.py b/src/python/03.DecisionTree/DTSklearn.py new file mode 100644 index 000000000..5155b2140 --- /dev/null +++ b/src/python/03.DecisionTree/DTSklearn.py @@ -0,0 +1,115 @@ +#!/usr/bin/python +# coding: utf8 +# 原始链接: http://blog.csdn.net/lsldd/article/details/41223147 +import numpy as np +from sklearn import tree +from sklearn.metrics import precision_recall_curve +from sklearn.metrics import classification_report +from sklearn.cross_validation import train_test_split + + +def createDataSet(): + ''' 数据读入 ''' + data = [] + labels = [] + with open("testData/DT_data.txt") as ifile: + for line in ifile: + # 特征: 身高 体重 label: 胖瘦 + tokens = line.strip().split(' ') + data.append([float(tk) for tk in tokens[:-1]]) + labels.append(tokens[-1]) + # 特征数据 + x = np.array(data) + # label分类的标签数据 + labels = np.array(labels) + # 预估结果的标签数据 + y = np.zeros(labels.shape) + + ''' 标签转换为0/1 ''' + y[labels == 'fat'] = 1 + print data, '-------', x, '-------', labels, '-------', y + return x, y + + +def predict_train(x_train, y_train): + ''' + 使用信息熵作为划分标准,对决策树进行训练 + 参考链接: http://scikit-learn.org/stable/modules/generated/sklearn.tree.DecisionTreeClassifier.html#sklearn.tree.DecisionTreeClassifier + ''' + clf = tree.DecisionTreeClassifier(criterion='entropy') + # print(clf) + clf.fit(x_train, y_train) + ''' 系数反映每个特征的影响力。越大表示该特征在分类中起到的作用越大 ''' + print 'feature_importances_: %s' % clf.feature_importances_ + + '''测试结果的打印''' + y_pre = clf.predict(x_train) + # print(x_train) + print(y_pre) + print(y_train) + print(np.mean(y_pre == y_train)) + return y_pre, clf + + +def show_precision_recall(x, clf, y_train, y_pre): + ''' + 准确率与召回率 + 参考链接: http://scikit-learn.org/stable/modules/generated/sklearn.metrics.precision_recall_curve.html#sklearn.metrics.precision_recall_curve + ''' + precision, recall, thresholds = precision_recall_curve(y_train, y_pre) + # 计算全量的预估结果 + answer = clf.predict_proba(x)[:, 1] + + ''' + 展现 准确率与召回率 + precision 准确率 + recall 召回率 + f1-score 准确率和召回率的一个综合得分 + support 参与比较的数量 + 参考链接:http://scikit-learn.org/stable/modules/generated/sklearn.metrics.classification_report.html#sklearn.metrics.classification_report + ''' + # target_names 以 y的label分类为准 + target_names = ['thin', 'fat'] + print(classification_report(y, answer, target_names=target_names)) + print(answer) + print(y) + + +def show_pdf(clf): + ''' + 可视化输出 + 把决策树结构写入文件: http://sklearn.lzjqsdd.com/modules/tree.html + + Mac报错:pydotplus.graphviz.InvocationException: GraphViz's executables not found + 解决方案:sudo brew install graphviz + 参考写入: http://www.jianshu.com/p/59b510bafb4d + ''' + # with open("testResult/tree.dot", 'w') as f: + # from sklearn.externals.six import StringIO + # tree.export_graphviz(clf, out_file=f) + + import pydotplus + from sklearn.externals.six import StringIO + dot_data = StringIO() + tree.export_graphviz(clf, out_file=dot_data) + graph = pydotplus.graph_from_dot_data(dot_data.getvalue()) + graph.write_pdf("testResult/tree.pdf") + + # from IPython.display import Image + # Image(graph.create_png()) + +if __name__ == '__main__': + x, y = createDataSet() + + ''' 拆分训练数据与测试数据, 80%做训练 20%做测试 ''' + x_train, x_test, y_train, y_test = train_test_split(x, y, test_size=0.2) + print '拆分数据:', x_train, x_test, y_train, y_test + + # 得到训练的预测结果集 + y_pre, clf = predict_train(x_train, y_train) + + # 展现 准确率与召回率 + show_precision_recall(x, clf, y_train, y_pre) + + # 可视化输出 + show_pdf(clf) diff --git a/src/python/03.DecisionTree/DecisionTree.py b/src/python/03.DecisionTree/DecisionTree.py index c7920bd1c..03a4d25f6 100644 --- a/src/python/03.DecisionTree/DecisionTree.py +++ b/src/python/03.DecisionTree/DecisionTree.py @@ -129,7 +129,7 @@ def chooseBestFeatureToSplit(dataSet): subDataSet = splitDataSet(dataSet, i, value) prob = len(subDataSet)/float(len(dataSet)) newEntropy += prob * calcShannonEnt(subDataSet) - # 计算label的信息熵和每个特征的信息熵 的增益值,如果增益值大于最大值,那么效果越好 + # gain[信息增益] 值越大,意味着该分类提供的信息量越大,该特征对分类的不确定程度越小 infoGain = baseEntropy - newEntropy if (infoGain > bestInfoGain): bestInfoGain = infoGain diff --git a/src/python/tools/DecisionTree.py b/src/python/tools/DecisionTree.py new file mode 100644 index 000000000..a2974d910 --- /dev/null +++ b/src/python/tools/DecisionTree.py @@ -0,0 +1,124 @@ +#!/usr/bin/python +# coding: utf8 + +from math import log + + +def calcShannonEnt(dataSet): + """calcShannonEnt(calculate Shannon entropy 计算label分类标签的香农熵) + + Args: + dataSet 数据集 + Returns: + 返回香农熵的计算值 + Raises: + + """ + # 求list的长度,表示计算参与训练的数据量 + numEntries = len(dataSet) + # print type(dataSet), 'numEntries: ', numEntries + + # 计算分类标签label出现的次数 + labelCounts = {} + # the the number of unique elements and their occurance + for featVec in dataSet: + currentLabel = featVec[-1] + if currentLabel not in labelCounts.keys(): + labelCounts[currentLabel] = 0 + labelCounts[currentLabel] += 1 + # print '-----', featVec, labelCounts + + # 对于label标签的占比,求出label标签的香农熵 + shannonEnt = 0.0 + for key in labelCounts: + prob = float(labelCounts[key])/numEntries + # log base 2 + shannonEnt -= prob * log(prob, 2) + # print '---', prob, prob * log(prob, 2), shannonEnt + return shannonEnt + + +def splitDataSet(dataSet, axis, value): + """splitDataSet(通过遍历dataSet数据集,求出axis对应的colnum列的值为value的行) + + Args: + dataSet 数据集 + axis 表示每一行的axis列 + value 表示axis列对应的value值 + Returns: + axis列为value的数据集【该数据集需要排除axis列】 + Raises: + + """ + retDataSet = [] + for featVec in dataSet: + # axis列为value的数据集【该数据集需要排除axis列】 + if featVec[axis] == value: + # chop out axis used for splitting + reducedFeatVec = featVec[:axis] + ''' + 请百度查询一下: extend和append的区别 + ''' + reducedFeatVec.extend(featVec[axis+1:]) + # 收集结果值 axis列为value的行【该行需要排除axis列】 + retDataSet.append(reducedFeatVec) + return retDataSet + + +def getFeatureShannonEnt(dataSet, labels): + """chooseBestFeatureToSplit(选择最好的特征) + + Args: + dataSet 数据集 + Returns: + bestFeature 最优的特征列 + Raises: + + """ + # 求第一行有多少列的 Feature + numFeatures = len(dataSet[0]) - 1 + # label的信息熵 + baseEntropy = calcShannonEnt(dataSet) + # 最优的信息增益值, 和最优的Featurn编号 + bestInfoGain, bestFeature, endEntropy = 0.0, -1, 0.0 + # iterate over all the features + for i in range(numFeatures): + # create a list of all the examples of this feature + # 获取每一个feature的list集合 + featList = [example[i] for example in dataSet] + # get a set of unique values + # 获取剔重后的集合 + uniqueVals = set(featList) + # 创建一个临时的信息熵 + newEntropy = 0.0 + # 遍历某一列的value集合,计算该列的信息熵 + for value in uniqueVals: + subDataSet = splitDataSet(dataSet, i, value) + prob = len(subDataSet)/float(len(dataSet)) + newEntropy += prob * calcShannonEnt(subDataSet) + # gain[信息增益] 值越大,意味着该分类提供的信息量越大,该特征对分类的不确定程度越小 + # gain[信息增益]=0, 表示与类别相同,无需其他的分类 + # gain[信息增益]=baseEntropy, 表示分类和没分类没有区别 + infoGain = baseEntropy - newEntropy + # print infoGain + if (infoGain > bestInfoGain): + endEntropy = newEntropy + bestInfoGain = infoGain + bestFeature = i + else: + if numFeatures < 0: + labels[bestFeature] = 'null' + + return labels[bestFeature], baseEntropy, endEntropy, bestInfoGain + + +if __name__ == '__main__': + labels = ['no surfacing', 'flippers'] + dataSet1 = [['yes'], ['yes'], ['no'], ['no'], ['no']] + dataSet2 = [['a', 1, 'yes'], ['a', 2, 'yes'], ['b', 3, 'no'], ['c', 4, 'no'], ['c', 5, 'no']] + dataSet3 = [[1, 'yes'], [1, 'yes'], [1, 'no'], [3, 'no'], [3, 'no']] + infoGain1 = getFeatureShannonEnt(dataSet1, labels) + infoGain2 = getFeatureShannonEnt(dataSet2, labels) + infoGain3 = getFeatureShannonEnt(dataSet3, labels) + print '香农熵: \n\t%s, \n\t%s, \n\t%s' % (infoGain1, infoGain2, infoGain3) + diff --git a/testData/DT_data.txt b/testData/DT_data.txt new file mode 100644 index 000000000..3bf55b885 --- /dev/null +++ b/testData/DT_data.txt @@ -0,0 +1,10 @@ +1.5 50 thin +1.5 60 fat +1.6 40 thin +1.6 60 fat +1.7 60 thin +1.7 80 fat +1.8 60 thin +1.8 90 fat +1.9 70 thin +1.9 80 thin diff --git a/testResult/tree.pdf b/testResult/tree.pdf new file mode 100644 index 0000000000000000000000000000000000000000..f2b728290b9ceb5f02f52eeaf196369a36f37412 GIT binary patch literal 16586 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 R7}*$DIN(T0MPx Date: Wed, 1 Mar 2017 20:33:29 +0800 Subject: [PATCH 16/92] =?UTF-8?q?=E6=B7=BB=E5=8A=A0=E5=B7=A5=E5=85=B7?= =?UTF-8?q?=E7=B1=BB=E4=BF=A1=E6=81=AF=E5=A2=9E=E7=9B=8A=E7=9A=84=E8=AE=A1?= =?UTF-8?q?=E7=AE=97?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../tools/{DecisionTree.py => DecisionTree_getInfoGain.py} | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) rename src/python/tools/{DecisionTree.py => DecisionTree_getInfoGain.py} (98%) diff --git a/src/python/tools/DecisionTree.py b/src/python/tools/DecisionTree_getInfoGain.py similarity index 98% rename from src/python/tools/DecisionTree.py rename to src/python/tools/DecisionTree_getInfoGain.py index a2974d910..316b6fe5e 100644 --- a/src/python/tools/DecisionTree.py +++ b/src/python/tools/DecisionTree_getInfoGain.py @@ -120,5 +120,5 @@ def getFeatureShannonEnt(dataSet, labels): infoGain1 = getFeatureShannonEnt(dataSet1, labels) infoGain2 = getFeatureShannonEnt(dataSet2, labels) infoGain3 = getFeatureShannonEnt(dataSet3, labels) - print '香农熵: \n\t%s, \n\t%s, \n\t%s' % (infoGain1, infoGain2, infoGain3) + print '信息增益: \n\t%s, \n\t%s, \n\t%s' % (infoGain1, infoGain2, infoGain3) From bd9cb31f6476c774014765adf0b306d37275615a Mon Sep 17 00:00:00 2001 From: jiangzhonglian Date: Wed, 1 Mar 2017 21:55:04 +0800 Subject: [PATCH 17/92] =?UTF-8?q?=E6=9B=B4=E6=96=B0=E5=86=B3=E7=AD=96?= =?UTF-8?q?=E6=A0=91=E6=B5=81=E7=A8=8B=E4=BB=8B=E7=BB=8D=E5=9B=BE?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../3.\345\206\263\347\255\226\346\240\221.md" | 2 ++ ...213\344\273\213\347\273\215\345\233\276.jpg" | Bin 0 -> 57137 bytes 2 files changed, 2 insertions(+) create mode 100644 "docs/3.\345\206\263\347\255\226\346\240\221\346\265\201\347\250\213\344\273\213\347\273\215\345\233\276.jpg" diff --git "a/docs/3.\345\206\263\347\255\226\346\240\221.md" "b/docs/3.\345\206\263\347\255\226\346\240\221.md" index 4a2db2382..65494b335 100644 --- "a/docs/3.\345\206\263\347\255\226\346\240\221.md" +++ "b/docs/3.\345\206\263\347\255\226\346\240\221.md" @@ -23,3 +23,5 @@ * \\(H = -\sum_{i=0}^np(x_i)\log_2p(x_i)\\) 表示香农熵,用于计算信息熵 * 基尼不纯度(Gini impurity) [本书不做过多的介绍] * 简单来说:就是从一个数据集中随机选取子项,度量其被错误分类到其他分组里的概率。 +* 流程介绍图 +* ![决策树流程介绍图](./3.决策树流程介绍图.jpg) \ No newline at end of file diff --git "a/docs/3.\345\206\263\347\255\226\346\240\221\346\265\201\347\250\213\344\273\213\347\273\215\345\233\276.jpg" "b/docs/3.\345\206\263\347\255\226\346\240\221\346\265\201\347\250\213\344\273\213\347\273\215\345\233\276.jpg" new file mode 100644 index 0000000000000000000000000000000000000000..d5908deda54d6228e6f1582bff74118365fc8ee4 GIT binary patch literal 57137 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 Date: Wed, 1 Mar 2017 22:00:43 +0800 Subject: [PATCH 18/92] =?UTF-8?q?=E5=88=A9=E7=94=A8PCA=E6=9D=A5=E7=AE=80?= =?UTF-8?q?=E5=8C=96=E6=95=B0=E6=8D=AE?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- README.md | 1 + 1 file changed, 1 insertion(+) diff --git a/README.md b/README.md index b87dcabc1..fc123341b 100644 --- a/README.md +++ b/README.md @@ -29,6 +29,7 @@ ## 第四部分 其他工具 * 13) 使用PCA来简化数据 + *[利用PCA来简化数据](./docs/13.利用PCA来简化数据.md) * 14) 使用SVD简化数据 * 15) 大数据与MapReduce From f14e101693dfc80aa326d730bc07efa392fadedb Mon Sep 17 00:00:00 2001 From: xuejianjun Date: Wed, 1 Mar 2017 22:01:38 +0800 Subject: [PATCH 19/92] =?UTF-8?q?=E5=88=A9=E7=94=A8PCA=E6=9D=A5=E7=AE=80?= =?UTF-8?q?=E5=8C=96=E6=95=B0=E6=8D=AE.md?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...\245\347\256\200\345\214\226\346\225\260\346\215\256.md" | 6 ++++++ 1 file changed, 6 insertions(+) create mode 100644 "docs/13.\345\210\251\347\224\250PCA\346\235\245\347\256\200\345\214\226\346\225\260\346\215\256.md" diff --git "a/docs/13.\345\210\251\347\224\250PCA\346\235\245\347\256\200\345\214\226\346\225\260\346\215\256.md" "b/docs/13.\345\210\251\347\224\250PCA\346\235\245\347\256\200\345\214\226\346\225\260\346\215\256.md" new file mode 100644 index 000000000..143e2ac48 --- /dev/null +++ "b/docs/13.\345\210\251\347\224\250PCA\346\235\245\347\256\200\345\214\226\346\225\260\346\215\256.md" @@ -0,0 +1,6 @@ + +# 3) 利用PCA来简化数据 + + +* 未完待续 + \ No newline at end of file From 888f3b9e3257fa97269ac0b40177f7a2f80f9877 Mon Sep 17 00:00:00 2001 From: wenhuanhuan Date: Thu, 2 Mar 2017 14:37:44 +0800 Subject: [PATCH 20/92] =?UTF-8?q?wenhuanhuan=E8=BF=9B=E5=BA=A6?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...63\350\201\224\345\210\206\346\236\220.md" | 9 ++++++++ ...21\347\271\201\351\241\271\351\233\206.md" | 21 +++++++++++++++++++ 2 files changed, 30 insertions(+) create mode 100644 "docs/11.\344\275\277\347\224\250Apriori\347\256\227\346\263\225\350\277\233\350\241\214\345\205\263\350\201\224\345\210\206\346\236\220.md" create mode 100644 "docs/12.\344\275\277\347\224\250FP-growth\347\256\227\346\263\225\346\235\245\351\253\230\346\225\210\345\217\221\347\216\260\351\242\221\347\271\201\351\241\271\351\233\206.md" diff --git "a/docs/11.\344\275\277\347\224\250Apriori\347\256\227\346\263\225\350\277\233\350\241\214\345\205\263\350\201\224\345\210\206\346\236\220.md" "b/docs/11.\344\275\277\347\224\250Apriori\347\256\227\346\263\225\350\277\233\350\241\214\345\205\263\350\201\224\345\210\206\346\236\220.md" new file mode 100644 index 000000000..ad85b87ab --- /dev/null +++ "b/docs/11.\344\275\277\347\224\250Apriori\347\256\227\346\263\225\350\277\233\350\241\214\345\205\263\350\201\224\345\210\206\346\236\220.md" @@ -0,0 +1,9 @@ +# 11.使用Apriori算法进行关联分析 # + +**- 概念** + +1. 关联关系:associati analysis 从大规模数据集中寻找物品间的隐含关系呗称作关联关系或者关联规则学习。关系有两种形式:频繁项集(经常一块出现的物品集合);关联规则(暗示两种物品之间可能存在很强的关系) +2. 项集的支持度(support):数据集中包含该项集的记录所占的比例 +3. 置信度(confidence):置信度({A}->{B}) = 支持度{A,B}/支持度{A} + +Apriori原理:如果某个项集是频繁的,那么它的所有子集也是频繁的,反之,一个项集是非频繁的,那么它的所有超集也是非频繁的 \ No newline at end of file diff --git "a/docs/12.\344\275\277\347\224\250FP-growth\347\256\227\346\263\225\346\235\245\351\253\230\346\225\210\345\217\221\347\216\260\351\242\221\347\271\201\351\241\271\351\233\206.md" "b/docs/12.\344\275\277\347\224\250FP-growth\347\256\227\346\263\225\346\235\245\351\253\230\346\225\210\345\217\221\347\216\260\351\242\221\347\271\201\351\241\271\351\233\206.md" new file mode 100644 index 000000000..adcb7cb3b --- /dev/null +++ "b/docs/12.\344\275\277\347\224\250FP-growth\347\256\227\346\263\225\346\235\245\351\253\230\346\225\210\345\217\221\347\216\260\351\242\221\347\271\201\351\241\271\351\233\206.md" @@ -0,0 +1,21 @@ +# 12.使用FP-growth算法来高效发现频繁项集 # + + +**- 基本过程** + +- 构建FP树 + * 对原始数据集扫描两遍 + * 第一遍对所有元素项遍历,并记下出现次数。 + * 第二遍只扫描频繁元素。 +- 从FP树种挖掘频繁项集 + +**FP树介绍** + + 是一种紧凑的数据结构,FP代表频繁模式(Frequent Pattem)每个项集以路径的方式存储在树中。 + 包含:项集【集合中的单个元素+出现次数+父节点】 +* 与其他树结构相比 + * 它通过链接(link)来连接相似元素,被连起来的元素项可以看成一个链表。 + * 一个元素项可以出现多次 + + + From e559c272553a7fd2f41f53c3bb719a4cf100f0a5 Mon Sep 17 00:00:00 2001 From: geekidentity Date: Fri, 3 Mar 2017 09:25:32 +0800 Subject: [PATCH 21/92] =?UTF-8?q?add=20file=205.Logistic=E5=9B=9E=E5=BD=92?= =?UTF-8?q?.md=20=20and=20change=20readme.md?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- README.md | 1 + "docs/5.Logistic\345\233\236\345\275\222.md" | 0 2 files changed, 1 insertion(+) create mode 100644 "docs/5.Logistic\345\233\236\345\275\222.md" diff --git a/README.md b/README.md index fc123341b..6017260ed 100644 --- a/README.md +++ b/README.md @@ -12,6 +12,7 @@ * [决策树](./docs/3.决策树.md) * 4) 基于概率论的分类方法:朴素贝叶斯 * 5) Logistic回归 + * [Logistic回归](./docs/5.Logistic回归.md) * 6) 支持向量机 * 7) 利用AdaBoost元算法提高分类 diff --git "a/docs/5.Logistic\345\233\236\345\275\222.md" "b/docs/5.Logistic\345\233\236\345\275\222.md" new file mode 100644 index 000000000..e69de29bb From d71b28e104891d7cd288e14ab1b1203fdc1b7d57 Mon Sep 17 00:00:00 2001 From: yangjifei <1714004716@qq.com> Date: Fri, 3 Mar 2017 13:13:59 +0800 Subject: [PATCH 22/92] add logistic regression --- "docs/5.Logistic\345\233\236\345\275\222.md" | 11 +++++++++++ 1 file changed, 11 insertions(+) diff --git "a/docs/5.Logistic\345\233\236\345\275\222.md" "b/docs/5.Logistic\345\233\236\345\275\222.md" index e69de29bb..e049ec53c 100644 --- "a/docs/5.Logistic\345\233\236\345\275\222.md" +++ "b/docs/5.Logistic\345\233\236\345\275\222.md" @@ -0,0 +1,11 @@ + +# 1) ߼ع + + * ߼ع(Logistic Regression) + * 1.1 + * 1.2 ˵ʾ + * 1.3 ж߽ + * 1.4 ۺ + * 1.5 򻯵ijɱݶ½ + * 1.6 ߼Ż + * 1.7 ࣺһ \ No newline at end of file From f41ba460006d1ee491c598656a8adffb39984492 Mon Sep 17 00:00:00 2001 From: jiangzhonglian Date: Fri, 3 Mar 2017 15:17:56 +0800 Subject: [PATCH 23/92] =?UTF-8?q?=E6=9B=B4=E6=96=B0=E6=A0=91=E5=9B=9E?= =?UTF-8?q?=E5=BD=92?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- README.md | 4 +- ...9.\346\240\221\345\233\236\345\275\222.md" | 13 ++ src/python/09.RegTrees/regTrees.py | 140 ++++++++++++++++++ 3 files changed, 156 insertions(+), 1 deletion(-) create mode 100644 "docs/9.\346\240\221\345\233\236\345\275\222.md" create mode 100644 src/python/09.RegTrees/regTrees.py diff --git a/README.md b/README.md index fc123341b..0d56cfa55 100644 --- a/README.md +++ b/README.md @@ -1,6 +1,6 @@ # MachineLearning -**Mahchine Leaning in Action (python)** +**Mahchine Leaning in Action (python) | ApacheCN(apache中文网)** ## 第一部分 分类 @@ -19,6 +19,7 @@ * 8) 预测数值型数据:回归 * 9) 数回归 + * [树回归](./docs/9.树回归.md) ## 第三部分 无监督学习 @@ -41,3 +42,4 @@ * 附录D 资源 * 索引 * 版权声明 +* [ApacheCN(apache中文网) 更新](wwww.apache.wiki) \ No newline at end of file diff --git "a/docs/9.\346\240\221\345\233\236\345\275\222.md" "b/docs/9.\346\240\221\345\233\236\345\275\222.md" new file mode 100644 index 000000000..bd68557c7 --- /dev/null +++ "b/docs/9.\346\240\221\345\233\236\345\275\222.md" @@ -0,0 +1,13 @@ + +# 9) 树回归 + +* 树回归是什么? + * 分类回归树(Classification and Regression Tree,CART)是一种典型的决策树算法,CART算法不仅可以应用于分类问题,而且可以用于回归问题。 + * CART算法构建的回归树并介绍其中的树剪枝技术(该技术主要的目的是防止数的过拟合) +* 树回归的构建 + * 优点:可以对复杂和非线性的数据建模。 + * 缺点:结果不易理解。 + * 适用数据类型:数值型和标称型数据。 + + + \ No newline at end of file diff --git a/src/python/09.RegTrees/regTrees.py b/src/python/09.RegTrees/regTrees.py new file mode 100644 index 000000000..c1436e0ec --- /dev/null +++ b/src/python/09.RegTrees/regTrees.py @@ -0,0 +1,140 @@ +#!/usr/bin/python +# coding:utf8 + +''' +Created on Feb 4, 2011 +Update on 2017-03-02 +Tree-Based Regression Methods Source Code for Machine Learning in Action Ch. 9 +@author: Peter Harrington/jiangzhonglian +''' +from numpy import * + +def loadDataSet(fileName): #general function to parse tab -delimited floats + dataMat = [] #assume last column is target value + fr = open(fileName) + for line in fr.readlines(): + curLine = line.strip().split('\t') + fltLine = map(float,curLine) #map all elements to float() + dataMat.append(fltLine) + return dataMat + +def binSplitDataSet(dataSet, feature, value): + mat0 = dataSet[nonzero(dataSet[:,feature] > value)[0],:][0] + mat1 = dataSet[nonzero(dataSet[:,feature] <= value)[0],:][0] + return mat0,mat1 + +def regLeaf(dataSet):#returns the value used for each leaf + return mean(dataSet[:,-1]) + +def regErr(dataSet): + return var(dataSet[:,-1]) * shape(dataSet)[0] + +def linearSolve(dataSet): #helper function used in two places + m,n = shape(dataSet) + X = mat(ones((m,n))); Y = mat(ones((m,1)))#create a copy of data with 1 in 0th postion + X[:,1:n] = dataSet[:,0:n-1]; Y = dataSet[:,-1]#and strip out Y + xTx = X.T*X + if linalg.det(xTx) == 0.0: + raise NameError('This matrix is singular, cannot do inverse,\n\ + try increasing the second value of ops') + ws = xTx.I * (X.T * Y) + return ws,X,Y + +def modelLeaf(dataSet):#create linear model and return coeficients + ws,X,Y = linearSolve(dataSet) + return ws + +def modelErr(dataSet): + ws,X,Y = linearSolve(dataSet) + yHat = X * ws + return sum(power(Y - yHat,2)) + +def chooseBestSplit(dataSet, leafType=regLeaf, errType=regErr, ops=(1,4)): + tolS = ops[0]; tolN = ops[1] + #if all the target variables are the same value: quit and return value + if len(set(dataSet[:,-1].T.tolist()[0])) == 1: #exit cond 1 + return None, leafType(dataSet) + m,n = shape(dataSet) + #the choice of the best feature is driven by Reduction in RSS error from mean + S = errType(dataSet) + bestS = inf; bestIndex = 0; bestValue = 0 + for featIndex in range(n-1): + for splitVal in set(dataSet[:,featIndex]): + mat0, mat1 = binSplitDataSet(dataSet, featIndex, splitVal) + if (shape(mat0)[0] < tolN) or (shape(mat1)[0] < tolN): continue + newS = errType(mat0) + errType(mat1) + if newS < bestS: + bestIndex = featIndex + bestValue = splitVal + bestS = newS + #if the decrease (S-bestS) is less than a threshold don't do the split + if (S - bestS) < tolS: + return None, leafType(dataSet) #exit cond 2 + mat0, mat1 = binSplitDataSet(dataSet, bestIndex, bestValue) + if (shape(mat0)[0] < tolN) or (shape(mat1)[0] < tolN): #exit cond 3 + return None, leafType(dataSet) + return bestIndex,bestValue#returns the best feature to split on + #and the value used for that split + +def createTree(dataSet, leafType=regLeaf, errType=regErr, ops=(1,4)):#assume dataSet is NumPy Mat so we can array filtering + feat, val = chooseBestSplit(dataSet, leafType, errType, ops)#choose the best split + if feat == None: return val #if the splitting hit a stop condition return val + retTree = {} + retTree['spInd'] = feat + retTree['spVal'] = val + lSet, rSet = binSplitDataSet(dataSet, feat, val) + retTree['left'] = createTree(lSet, leafType, errType, ops) + retTree['right'] = createTree(rSet, leafType, errType, ops) + return retTree + +def isTree(obj): + return (type(obj).__name__=='dict') + +def getMean(tree): + if isTree(tree['right']): tree['right'] = getMean(tree['right']) + if isTree(tree['left']): tree['left'] = getMean(tree['left']) + return (tree['left']+tree['right'])/2.0 + +def prune(tree, testData): + if shape(testData)[0] == 0: return getMean(tree) #if we have no test data collapse the tree + if (isTree(tree['right']) or isTree(tree['left'])):#if the branches are not trees try to prune them + lSet, rSet = binSplitDataSet(testData, tree['spInd'], tree['spVal']) + if isTree(tree['left']): tree['left'] = prune(tree['left'], lSet) + if isTree(tree['right']): tree['right'] = prune(tree['right'], rSet) + #if they are now both leafs, see if we can merge them + if not isTree(tree['left']) and not isTree(tree['right']): + lSet, rSet = binSplitDataSet(testData, tree['spInd'], tree['spVal']) + errorNoMerge = sum(power(lSet[:,-1] - tree['left'],2)) +\ + sum(power(rSet[:,-1] - tree['right'],2)) + treeMean = (tree['left']+tree['right'])/2.0 + errorMerge = sum(power(testData[:,-1] - treeMean,2)) + if errorMerge < errorNoMerge: + print "merging" + return treeMean + else: return tree + else: return tree + +def regTreeEval(model, inDat): + return float(model) + +def modelTreeEval(model, inDat): + n = shape(inDat)[1] + X = mat(ones((1,n+1))) + X[:,1:n+1]=inDat + return float(X*model) + +def treeForeCast(tree, inData, modelEval=regTreeEval): + if not isTree(tree): return modelEval(tree, inData) + if inData[tree['spInd']] > tree['spVal']: + if isTree(tree['left']): return treeForeCast(tree['left'], inData, modelEval) + else: return modelEval(tree['left'], inData) + else: + if isTree(tree['right']): return treeForeCast(tree['right'], inData, modelEval) + else: return modelEval(tree['right'], inData) + +def createForeCast(tree, testData, modelEval=regTreeEval): + m=len(testData) + yHat = mat(zeros((m,1))) + for i in range(m): + yHat[i,0] = treeForeCast(tree, mat(testData[i]), modelEval) + return yHat \ No newline at end of file From 38c6cbc292cce9fea778a151de026856969151f5 Mon Sep 17 00:00:00 2001 From: jiangzhonglian Date: Fri, 3 Mar 2017 15:20:28 +0800 Subject: [PATCH 24/92] =?UTF-8?q?=E6=9B=B4=E6=96=B0Readme=20=E6=B7=BB?= =?UTF-8?q?=E5=8A=A0ApachCN=E4=BF=A1=E6=81=AF?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- README.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/README.md b/README.md index 0d56cfa55..0ae961618 100644 --- a/README.md +++ b/README.md @@ -1,6 +1,6 @@ # MachineLearning -**Mahchine Leaning in Action (python) | ApacheCN(apache中文网)** +**Mahchine Leaning in Action (python) | [ApacheCN(apache中文网)](http://wwww.apache.wiki)** ## 第一部分 分类 @@ -42,4 +42,4 @@ * 附录D 资源 * 索引 * 版权声明 -* [ApacheCN(apache中文网) 更新](wwww.apache.wiki) \ No newline at end of file +* [ApacheCN(apache中文网) 维护更新](http://wwww.apache.wiki) \ No newline at end of file From 53e54a6ac9b653443c436fd8058073af8ff5ca94 Mon Sep 17 00:00:00 2001 From: jiangzhonglian Date: Fri, 3 Mar 2017 15:21:05 +0800 Subject: [PATCH 25/92] =?UTF-8?q?=E6=9B=B4=E6=96=B0Readme?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- README.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/README.md b/README.md index 0ae961618..281a773d7 100644 --- a/README.md +++ b/README.md @@ -1,6 +1,6 @@ # MachineLearning -**Mahchine Leaning in Action (python) | [ApacheCN(apache中文网)](http://wwww.apache.wiki)** +**Mahchine Leaning in Action (python) | [ApacheCN(apache中文网)](http://www.apache.wiki)** ## 第一部分 分类 @@ -42,4 +42,4 @@ * 附录D 资源 * 索引 * 版权声明 -* [ApacheCN(apache中文网) 维护更新](http://wwww.apache.wiki) \ No newline at end of file +* [ApacheCN(apache中文网) 维护更新](http://www.apache.wiki) \ No newline at end of file From 37bc27e0e40de3d610c51577353f5e7624e67d5c Mon Sep 17 00:00:00 2001 From: jiangzhonglian Date: Fri, 3 Mar 2017 15:23:17 +0800 Subject: [PATCH 26/92] =?UTF-8?q?=E6=9B=B4=E6=96=B0ML=E9=93=BE=E6=8E=A5?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- README.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/README.md b/README.md index 281a773d7..d95720a4b 100644 --- a/README.md +++ b/README.md @@ -1,6 +1,6 @@ # MachineLearning -**Mahchine Leaning in Action (python) | [ApacheCN(apache中文网)](http://www.apache.wiki)** +**Mahchine Leaning in Action (python) | [ApacheCN(apache中文网)](http://www.apache.wiki/display/ML)** ## 第一部分 分类 @@ -42,4 +42,4 @@ * 附录D 资源 * 索引 * 版权声明 -* [ApacheCN(apache中文网) 维护更新](http://www.apache.wiki) \ No newline at end of file +* [ApacheCN(apache中文网) 维护更新](http://www.apache.wiki/display/ML) \ No newline at end of file From 80ad02982caef21188ad587382bf7e0e12f09232 Mon Sep 17 00:00:00 2001 From: wenhuanhuan Date: Fri, 3 Mar 2017 15:21:38 +0800 Subject: [PATCH 27/92] =?UTF-8?q?11=E3=80=81Aoriori?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...63\350\201\224\345\210\206\346\236\220.md" | 2 +- src/python/12.FrequentPattemTree/apriori.py | 12 ++++++++++++ src/python/12.FrequentPattemTree/fpGrowth.py | 19 +++++++++++++++++++ src/python/12.FrequentPattemTree/test.py | 5 +++++ 4 files changed, 37 insertions(+), 1 deletion(-) create mode 100644 src/python/12.FrequentPattemTree/apriori.py create mode 100644 src/python/12.FrequentPattemTree/fpGrowth.py create mode 100644 src/python/12.FrequentPattemTree/test.py diff --git "a/docs/11.\344\275\277\347\224\250Apriori\347\256\227\346\263\225\350\277\233\350\241\214\345\205\263\350\201\224\345\210\206\346\236\220.md" "b/docs/11.\344\275\277\347\224\250Apriori\347\256\227\346\263\225\350\277\233\350\241\214\345\205\263\350\201\224\345\210\206\346\236\220.md" index ad85b87ab..71adb1772 100644 --- "a/docs/11.\344\275\277\347\224\250Apriori\347\256\227\346\263\225\350\277\233\350\241\214\345\205\263\350\201\224\345\210\206\346\236\220.md" +++ "b/docs/11.\344\275\277\347\224\250Apriori\347\256\227\346\263\225\350\277\233\350\241\214\345\205\263\350\201\224\345\210\206\346\236\220.md" @@ -6,4 +6,4 @@ 2. 项集的支持度(support):数据集中包含该项集的记录所占的比例 3. 置信度(confidence):置信度({A}->{B}) = 支持度{A,B}/支持度{A} -Apriori原理:如果某个项集是频繁的,那么它的所有子集也是频繁的,反之,一个项集是非频繁的,那么它的所有超集也是非频繁的 \ No newline at end of file +Apriori原理:如果某个项集是频繁的,那么它的所有子集也是频繁的,反之,一个项集是非频繁的,那么它的所有超集也是非频繁的。 \ No newline at end of file diff --git a/src/python/12.FrequentPattemTree/apriori.py b/src/python/12.FrequentPattemTree/apriori.py new file mode 100644 index 000000000..e172b575c --- /dev/null +++ b/src/python/12.FrequentPattemTree/apriori.py @@ -0,0 +1,12 @@ +def loadDataSet(): + return [[1,3,4],[2,3,5],[1,2,3,5],[2,5]] +def createC1(dataSet): + c1=[] + for transaction in dataSet: + for item in transaction: + if not [item] in c1: + c1.append([item]) + c1.sort() + return map(frozenset,c1) +def scanD(D,ck,minSupport): + ssCnt = {} \ No newline at end of file diff --git a/src/python/12.FrequentPattemTree/fpGrowth.py b/src/python/12.FrequentPattemTree/fpGrowth.py new file mode 100644 index 000000000..5e3898cc5 --- /dev/null +++ b/src/python/12.FrequentPattemTree/fpGrowth.py @@ -0,0 +1,19 @@ +class treeNode: + def __init__(self,nameValue,numOccur,parentNode): + self.name = nameValue + self.count = numOccur + self.nodeLink = None + self.parent = parentNode + self.children = {} + def inc(self,numOccur): + self.count += numOccur + def disp(self,ind=1): + print(' '*ind,self.name,' ',self.count) + for child in self.children.values(): + child.disp(ind+1) + + if __name__ == "__main__": + import fpGrowth + rootNode = fpGrowth.treeNode('pyramid',9,None) + rootNode.children['eye']=fpGrowth.treeNode('eye',13,None) + rootNode.disp() \ No newline at end of file diff --git a/src/python/12.FrequentPattemTree/test.py b/src/python/12.FrequentPattemTree/test.py new file mode 100644 index 000000000..8702723ec --- /dev/null +++ b/src/python/12.FrequentPattemTree/test.py @@ -0,0 +1,5 @@ +class Test: + if __name__ == "__main__": + fza=frozenset(['a','bc']) + adict={fza:1,'b':2} + print(adict) \ No newline at end of file From 2b5f2c894f3016c3acd7a5cd97d3253a89b92aeb Mon Sep 17 00:00:00 2001 From: wenhuanhuan Date: Fri, 3 Mar 2017 16:13:23 +0800 Subject: [PATCH 28/92] FIRst commit --- .../.idea/12.FrequentPattemTree.iml | 11 + .../12.FrequentPattemTree/.idea/misc.xml | 4 + .../12.FrequentPattemTree/.idea/modules.xml | 8 + .../12.FrequentPattemTree/.idea/workspace.xml | 405 ++++++++++++++++++ 4 files changed, 428 insertions(+) create mode 100644 src/python/12.FrequentPattemTree/.idea/12.FrequentPattemTree.iml create mode 100644 src/python/12.FrequentPattemTree/.idea/misc.xml create mode 100644 src/python/12.FrequentPattemTree/.idea/modules.xml create mode 100644 src/python/12.FrequentPattemTree/.idea/workspace.xml diff --git a/src/python/12.FrequentPattemTree/.idea/12.FrequentPattemTree.iml b/src/python/12.FrequentPattemTree/.idea/12.FrequentPattemTree.iml new file mode 100644 index 000000000..671160631 --- /dev/null +++ b/src/python/12.FrequentPattemTree/.idea/12.FrequentPattemTree.iml @@ -0,0 +1,11 @@ + + + + + + + + + + \ No newline at end of file diff --git a/src/python/12.FrequentPattemTree/.idea/misc.xml b/src/python/12.FrequentPattemTree/.idea/misc.xml new file mode 100644 index 000000000..c9667eb77 --- /dev/null +++ b/src/python/12.FrequentPattemTree/.idea/misc.xml @@ -0,0 +1,4 @@ + + + + \ No newline at end of file diff --git a/src/python/12.FrequentPattemTree/.idea/modules.xml b/src/python/12.FrequentPattemTree/.idea/modules.xml new file mode 100644 index 000000000..89b88c715 --- /dev/null +++ b/src/python/12.FrequentPattemTree/.idea/modules.xml @@ -0,0 +1,8 @@ + + + + + + + + \ No newline at end of file diff --git a/src/python/12.FrequentPattemTree/.idea/workspace.xml b/src/python/12.FrequentPattemTree/.idea/workspace.xml new file mode 100644 index 000000000..8b951b556 --- /dev/null +++ b/src/python/12.FrequentPattemTree/.idea/workspace.xml @@ -0,0 +1,405 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 1488289229649 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file From 1a1369bf137d2e392acb6717b8cde8e2690de36f Mon Sep 17 00:00:00 2001 From: wenhuanhuan Date: Fri, 3 Mar 2017 16:56:08 +0800 Subject: [PATCH 29/92] delete idea --- .../.idea/12.FrequentPattemTree.iml | 11 - .../12.FrequentPattemTree/.idea/misc.xml | 4 - .../12.FrequentPattemTree/.idea/modules.xml | 8 - .../12.FrequentPattemTree/.idea/workspace.xml | 405 ------------------ 4 files changed, 428 deletions(-) delete mode 100644 src/python/12.FrequentPattemTree/.idea/12.FrequentPattemTree.iml delete mode 100644 src/python/12.FrequentPattemTree/.idea/misc.xml delete mode 100644 src/python/12.FrequentPattemTree/.idea/modules.xml delete mode 100644 src/python/12.FrequentPattemTree/.idea/workspace.xml diff --git a/src/python/12.FrequentPattemTree/.idea/12.FrequentPattemTree.iml b/src/python/12.FrequentPattemTree/.idea/12.FrequentPattemTree.iml deleted file mode 100644 index 671160631..000000000 --- a/src/python/12.FrequentPattemTree/.idea/12.FrequentPattemTree.iml +++ /dev/null @@ -1,11 +0,0 @@ - - - - - - - - - - \ No newline at end of file diff --git a/src/python/12.FrequentPattemTree/.idea/misc.xml b/src/python/12.FrequentPattemTree/.idea/misc.xml deleted file mode 100644 index c9667eb77..000000000 --- a/src/python/12.FrequentPattemTree/.idea/misc.xml +++ /dev/null @@ -1,4 +0,0 @@ - - - - \ No newline at end of file diff --git a/src/python/12.FrequentPattemTree/.idea/modules.xml b/src/python/12.FrequentPattemTree/.idea/modules.xml deleted file mode 100644 index 89b88c715..000000000 --- a/src/python/12.FrequentPattemTree/.idea/modules.xml +++ /dev/null @@ -1,8 +0,0 @@ - - - - - - - - \ No newline at end of file diff --git a/src/python/12.FrequentPattemTree/.idea/workspace.xml b/src/python/12.FrequentPattemTree/.idea/workspace.xml deleted file mode 100644 index 8b951b556..000000000 --- a/src/python/12.FrequentPattemTree/.idea/workspace.xml +++ /dev/null @@ -1,405 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - 1488289229649 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - \ No newline at end of file From eee18de54d65f2f594946475e53288d740ca1ad5 Mon Sep 17 00:00:00 2001 From: wenhuanhuan Date: Fri, 3 Mar 2017 17:20:03 +0800 Subject: [PATCH 30/92] delete idea2 --- .../12.FrequentPattemTree/.idea/workspace.xml | 405 ++++++++++++++++++ 1 file changed, 405 insertions(+) create mode 100644 src/python/12.FrequentPattemTree/.idea/workspace.xml diff --git a/src/python/12.FrequentPattemTree/.idea/workspace.xml b/src/python/12.FrequentPattemTree/.idea/workspace.xml new file mode 100644 index 000000000..cf2ba026c --- /dev/null +++ b/src/python/12.FrequentPattemTree/.idea/workspace.xml @@ -0,0 +1,405 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 1488289229649 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file From 5d14099924c11d6538725d982a4c1da5051a51a7 Mon Sep 17 00:00:00 2001 From: wenhuanhuan Date: Fri, 3 Mar 2017 17:22:53 +0800 Subject: [PATCH 31/92] delete idea1 --- .../12.FrequentPattemTree/.idea/workspace.xml | 405 ------------------ 1 file changed, 405 deletions(-) delete mode 100644 src/python/12.FrequentPattemTree/.idea/workspace.xml diff --git a/src/python/12.FrequentPattemTree/.idea/workspace.xml b/src/python/12.FrequentPattemTree/.idea/workspace.xml deleted file mode 100644 index cf2ba026c..000000000 --- a/src/python/12.FrequentPattemTree/.idea/workspace.xml +++ /dev/null @@ -1,405 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - 1488289229649 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - \ No newline at end of file From f41ffb35486cfe3cc23bc09364e695c2b25d570c Mon Sep 17 00:00:00 2001 From: wenhuanhuan Date: Fri, 3 Mar 2017 17:51:41 +0800 Subject: [PATCH 32/92] modify ReadMe.md --- README.md | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/README.md b/README.md index 6017260ed..75a33f901 100644 --- a/README.md +++ b/README.md @@ -25,8 +25,9 @@ * 10) 使用K-均值聚类算法对未标注数据分组 * 11) 使用Apriori算法进行关联分析 + * [使用Apriori算法进行关联分析](./docs/11.使用Apriori算法进行关联分析.md) * 12) 使用FP-growth算法来高效发现频繁项集 - + * [使用FP-growth算法来高效发现频繁项集](./docs/12.使用FP-growth算法来高效发现频繁项集.md ) ## 第四部分 其他工具 * 13) 使用PCA来简化数据 From ca08dc93e0b8f93d399e4a6b52282e57cb2d39af Mon Sep 17 00:00:00 2001 From: wenhuanhuan Date: Fri, 3 Mar 2017 17:53:15 +0800 Subject: [PATCH 33/92] modify ReadMe.md --- README.md | 1 + 1 file changed, 1 insertion(+) diff --git a/README.md b/README.md index 75a33f901..e940b3a36 100644 --- a/README.md +++ b/README.md @@ -28,6 +28,7 @@ * [使用Apriori算法进行关联分析](./docs/11.使用Apriori算法进行关联分析.md) * 12) 使用FP-growth算法来高效发现频繁项集 * [使用FP-growth算法来高效发现频繁项集](./docs/12.使用FP-growth算法来高效发现频繁项集.md ) + ## 第四部分 其他工具 * 13) 使用PCA来简化数据 From 0c43981c768645542bd9e039deb6163eece0b04b Mon Sep 17 00:00:00 2001 From: yangjifei <1714004716@qq.com> Date: Sat, 4 Mar 2017 20:38:51 +0800 Subject: [PATCH 34/92] add the regression code of python --- .idea/MachineLearning.iml | 13 +++ .idea/misc.xml | 4 + .idea/modules.xml | 8 ++ .idea/vcs.xml | 6 ++ "docs/5.Logistic\345\233\236\345\275\222.md" | 43 ++++++-- .../com/apachecn/logistic/logRegression.py | 97 +++++++++++++++++ .../05.Logistic/test/test_logRegression.py | 49 +++++++++ testData/testSet.txt | 100 ++++++++++++++++++ 8 files changed, 311 insertions(+), 9 deletions(-) create mode 100644 .idea/MachineLearning.iml create mode 100644 .idea/misc.xml create mode 100644 .idea/modules.xml create mode 100644 .idea/vcs.xml create mode 100644 src/python/05.Logistic/core/com/apachecn/logistic/logRegression.py create mode 100644 src/python/05.Logistic/test/test_logRegression.py create mode 100644 testData/testSet.txt diff --git a/.idea/MachineLearning.iml b/.idea/MachineLearning.iml new file mode 100644 index 000000000..eeeea0a4d --- /dev/null +++ b/.idea/MachineLearning.iml @@ -0,0 +1,13 @@ + + + + + + + + + + + + \ No newline at end of file diff --git a/.idea/misc.xml b/.idea/misc.xml new file mode 100644 index 000000000..0974871b8 --- /dev/null +++ b/.idea/misc.xml @@ -0,0 +1,4 @@ + + + + \ No newline at end of file diff --git a/.idea/modules.xml b/.idea/modules.xml new file mode 100644 index 000000000..a35ae91ed --- /dev/null +++ b/.idea/modules.xml @@ -0,0 +1,8 @@ + + + + + + + + \ No newline at end of file diff --git a/.idea/vcs.xml b/.idea/vcs.xml new file mode 100644 index 000000000..94a25f7f4 --- /dev/null +++ b/.idea/vcs.xml @@ -0,0 +1,6 @@ + + + + + + \ No newline at end of file diff --git "a/docs/5.Logistic\345\233\236\345\275\222.md" "b/docs/5.Logistic\345\233\236\345\275\222.md" index e049ec53c..a3da78b39 100644 --- "a/docs/5.Logistic\345\233\236\345\275\222.md" +++ "b/docs/5.Logistic\345\233\236\345\275\222.md" @@ -1,11 +1,36 @@ -# 1) ߼ع +# 5) 逻辑回归基础 - * ߼ع(Logistic Regression) - * 1.1 - * 1.2 ˵ʾ - * 1.3 ж߽ - * 1.4 ۺ - * 1.5 򻯵ijɱݶ½ - * 1.6 ߼Ż - * 1.7 ࣺһ \ No newline at end of file + * 逻辑回归(Logistic Regression) + * 5.1 分类问题 + * 在分类问题中,尝试预测的是结果是否属于某一个类(例如正确或错误)。 + * 分类问题的例子有: + * 判断一封电子邮件是否是垃圾邮件; + * 判断一次金融交易是否是欺诈等等。 + * 从二元的分类问题开始讨论: + 将因变量(dependant variable)可能属于的两个类分别称为负向类(negative class)和正向类(positive class),则因变量 + y属于{0,1} + 注:其中 0 表示负向类,1 表示正向类。 + * 5.2 假说表示 + + * 5.3 判定边界 + * 在逻辑回归中,我们预测: + 当 hθ 大于等于 0.5 时,预测 y=1 + 当 hθ 小于 0.5 时,预测 y=0 + * 根据上面绘制出的 S 形函数图像,我们知道当 + z=0时 ,g(z)=0.5 + z>0时 ,g(z)>0.5 + z<0时 ,g(z)<0.5 + 又z=θ的T次方与X的积,即: + z大于等于0时,预测:y=1 + z小于0时,预测:y=0 + * 现在假设我们有一个模型:Hθ(x)=g(θ0+θ1*x1+θ2*x2) + 并且参数θ是向量[-3 1 1]。则当-3+x1+x2大于等于0,即x1+x2大于等于3时,模型将预测y=1。 + 我们可以绘制直线x1+x2=3,这条线便是我们模型的分界线,将预测为1的区域和预测为0的区域分隔开。 + * 假使我们的数据呈现这样的分布情况,怎样的模型才能适合呢? + 因为需要用曲线才能分隔 y=0 的区域和 y=1 的区域,我们需要二次方特征: 假设参数是Hθ(x)=g(θ0+θ1*x1+θ2*x2+θ3*(x1^2)+θ4*(x2^2)+θ4*(x2^2)) + 是[-1 0 0 1 1],则我们得到的判定边界恰好是圆点在原点且半径为 1 的圆形。可以用非常复杂的模型来适应非常复杂形状的判定边界。 + * 5.4 代价函数 + * 5.5 简化的成本函数和梯度下降 + * 5.6 高级优化 + * 5.7 多类分类:一个对所有 diff --git a/src/python/05.Logistic/core/com/apachecn/logistic/logRegression.py b/src/python/05.Logistic/core/com/apachecn/logistic/logRegression.py new file mode 100644 index 000000000..e20c64403 --- /dev/null +++ b/src/python/05.Logistic/core/com/apachecn/logistic/logRegression.py @@ -0,0 +1,97 @@ +#!/usr/bin/env python +# encoding: utf-8 +from numpy import * +import matplotlib.pyplot as plt +import time + + +""" +@version: +@author: yangjf +@license: ApacheCN +@contact: highfei2011@126.com +@site: https://github.com/apachecn/MachineLearning +@software: PyCharm +@file: logRegression01.py +@time: 2017/3/3 22:03 +@test result:not pass +""" + +# sigmoid函数 +def sigmoid(inX): + return 1.0 / (1 + exp(-inX)) + +def trainLogRegres(train_x, train_y, opts): + # 计算训练时间 + startTime = time.time() + + numSamples, numFeatures = shape(train_x) + alpha = opts['alpha']; maxIter = opts['maxIter'] + weights = ones((numFeatures, 1)) + + # 通过梯度下降算法优化 + for k in range(maxIter): + if opts['optimizeType'] == 'gradDescent': # 梯度下降算法 + output = sigmoid(train_x * weights) + error = train_y - output + weights = weights + alpha * train_x.transpose() * error + elif opts['optimizeType'] == 'stocGradDescent': # 随机梯度下降 + for i in range(numSamples): + output = sigmoid(train_x[i, :] * weights) + error = train_y[i, 0] - output + weights = weights + alpha * train_x[i, :].transpose() * error + elif opts['optimizeType'] == 'smoothStocGradDescent': # 光滑随机梯度下降 + # 随机选择样本以优化以减少周期波动 + dataIndex = range(numSamples) + for i in range(numSamples): + alpha = 4.0 / (1.0 + k + i) + 0.01 + randIndex = int(random.uniform(0, len(dataIndex))) + output = sigmoid(train_x[randIndex, :] * weights) + error = train_y[randIndex, 0] - output + weights = weights + alpha * train_x[randIndex, :].transpose() * error + del(dataIndex[randIndex]) # 在一次交互期间,删除优化的样品 + else: + raise NameError('Not support optimize method type!') + + + print 'Congratulations, training complete! Took %fs!' % (time.time() - startTime) + return weights + + +#测试给定测试集的训练Logistic回归模型 +def testLogRegres(weights, test_x, test_y): + numSamples, numFeatures = shape(test_x) + matchCount = 0 + for i in xrange(numSamples): + predict = sigmoid(test_x[i, :] * weights)[0, 0] > 0.5 + if predict == bool(test_y[i, 0]): + matchCount += 1 + accuracy = float(matchCount) / numSamples + return accuracy + + +# 显示你的训练逻辑回归模型只有2-D数据可用 +def showLogRegres(weights, train_x, train_y): + # 注意:train_x和train_y是垫数据类型 + numSamples, numFeatures = shape(train_x) + if numFeatures != 3: + print "抱歉! 我不能绘制,因为你的数据的维度不是2!" + return 1 + + # 画出所有抽样数据 + for i in xrange(numSamples): + if int(train_y[i, 0]) == 0: + plt.plot(train_x[i, 1], train_x[i, 2], 'or') + elif int(train_y[i, 0]) == 1: + plt.plot(train_x[i, 1], train_x[i, 2], 'ob') + + # 画图操作 + min_x = min(train_x[:, 1])[0, 0] + max_x = max(train_x[:, 1])[0, 0] + weights = weights.getA() # 将mat转换为数组 + y_min_x = float(-weights[0] - weights[1] * min_x) / weights[2] + y_max_x = float(-weights[0] - weights[1] * max_x) / weights[2] + plt.plot([min_x, max_x], [y_min_x, y_max_x], '-g') + plt.xlabel('X1'); plt.ylabel('X2') + #显示图像 + plt.show() \ No newline at end of file diff --git a/src/python/05.Logistic/test/test_logRegression.py b/src/python/05.Logistic/test/test_logRegression.py new file mode 100644 index 000000000..d6a8f7079 --- /dev/null +++ b/src/python/05.Logistic/test/test_logRegression.py @@ -0,0 +1,49 @@ +#!/usr/bin/env python +# encoding: utf-8 +import sys +sys.path.append("C:\Python27") + +from numpy import * +import matplotlib.pyplot as plt +from core.com.apachcn.logistic import logRegression + +""" +@version: +@author: yangjf +@license: ApacheCN +@contact: highfei2011@126.com +@site: https://github.com/apachecn/MachineLearning +@software: PyCharm +@file: test_logRegression.py +@time: 2017/3/3 22:09 +""" + +def loadData(): + train_x = [] + train_y = [] + fileIn = open('testData/testSet.txt') + for line in fileIn.readlines(): + lineArr = line.strip().split() + train_x.append([1.0, float(lineArr[0]), float(lineArr[1])]) + train_y.append(float(lineArr[2])) + return mat(train_x), mat(train_y).transpose() + + +##第一步: 加载数据 +print "step 1: load data..." +train_x, train_y = loadData() +test_x = train_x; test_y = train_y + +##第二步: 训练数据... +print "step 2: training..." +opts = {'alpha': 0.01, 'maxIter': 20, 'optimizeType': 'smoothStocGradDescent'} +optimalWeights = trainLogRegres(train_x, train_y, opts) + +##第三步: 测试 +print "step 3: testing..." +accuracy = testLogRegres(optimalWeights, test_x, test_y) + +##第四步: 显示结果 +print "step 4: show the result..." +print 'The classify accuracy is: %.3f%%' % (accuracy * 100) +showLogRegres(optimalWeights, train_x, train_y) \ No newline at end of file diff --git a/testData/testSet.txt b/testData/testSet.txt new file mode 100644 index 000000000..2356ac546 --- /dev/null +++ b/testData/testSet.txt @@ -0,0 +1,100 @@ +-0.017612 14.053064 0 +-1.395634 4.662541 1 +-0.752157 6.538620 0 +-1.322371 7.152853 0 +0.423363 11.054677 0 +0.406704 7.067335 1 +0.667394 12.741452 0 +-2.460150 6.866805 1 +0.569411 9.548755 0 +-0.026632 10.427743 0 +0.850433 6.920334 1 +1.347183 13.175500 0 +1.176813 3.167020 1 +-1.781871 9.097953 0 +-0.566606 5.749003 1 +0.931635 1.589505 1 +-0.024205 6.151823 1 +-0.036453 2.690988 1 +-0.196949 0.444165 1 +1.014459 5.754399 1 +1.985298 3.230619 1 +-1.693453 -0.557540 1 +-0.576525 11.778922 0 +-0.346811 -1.678730 1 +-2.124484 2.672471 1 +1.217916 9.597015 0 +-0.733928 9.098687 0 +-3.642001 -1.618087 1 +0.315985 3.523953 1 +1.416614 9.619232 0 +-0.386323 3.989286 1 +0.556921 8.294984 1 +1.224863 11.587360 0 +-1.347803 -2.406051 1 +1.196604 4.951851 1 +0.275221 9.543647 0 +0.470575 9.332488 0 +-1.889567 9.542662 0 +-1.527893 12.150579 0 +-1.185247 11.309318 0 +-0.445678 3.297303 1 +1.042222 6.105155 1 +-0.618787 10.320986 0 +1.152083 0.548467 1 +0.828534 2.676045 1 +-1.237728 10.549033 0 +-0.683565 -2.166125 1 +0.229456 5.921938 1 +-0.959885 11.555336 0 +0.492911 10.993324 0 +0.184992 8.721488 0 +-0.355715 10.325976 0 +-0.397822 8.058397 0 +0.824839 13.730343 0 +1.507278 5.027866 1 +0.099671 6.835839 1 +-0.344008 10.717485 0 +1.785928 7.718645 1 +-0.918801 11.560217 0 +-0.364009 4.747300 1 +-0.841722 4.119083 1 +0.490426 1.960539 1 +-0.007194 9.075792 0 +0.356107 12.447863 0 +0.342578 12.281162 0 +-0.810823 -1.466018 1 +2.530777 6.476801 1 +1.296683 11.607559 0 +0.475487 12.040035 0 +-0.783277 11.009725 0 +0.074798 11.023650 0 +-1.337472 0.468339 1 +-0.102781 13.763651 0 +-0.147324 2.874846 1 +0.518389 9.887035 0 +1.015399 7.571882 0 +-1.658086 -0.027255 1 +1.319944 2.171228 1 +2.056216 5.019981 1 +-0.851633 4.375691 1 +-1.510047 6.061992 0 +-1.076637 -3.181888 1 +1.821096 10.283990 0 +3.010150 8.401766 1 +-1.099458 1.688274 1 +-0.834872 -1.733869 1 +-0.846637 3.849075 1 +1.400102 12.628781 0 +1.752842 5.468166 1 +0.078557 0.059736 1 +0.089392 -0.715300 1 +1.825662 12.693808 0 +0.197445 9.744638 0 +0.126117 0.922311 1 +-0.679797 1.220530 1 +0.677983 2.556666 1 +0.761349 10.693862 0 +-2.168791 0.143632 1 +1.388610 9.341997 0 +0.317029 14.739025 0 \ No newline at end of file From c10d797c5807995405eeb7e22f0f014e186d41c0 Mon Sep 17 00:00:00 2001 From: yangjifei <1714004716@qq.com> Date: Sat, 4 Mar 2017 22:21:24 +0800 Subject: [PATCH 35/92] update some code --- .idea/MachineLearning.iml | 2 +- src/__init__.py | 28 +++++++++++++++++++ src/python/03.DecisionTree/DTSklearn.py | 6 ++++ src/python/05.Logistic/__init__.py | 28 +++++++++++++++++++ src/python/05.Logistic/core/__init__.py | 28 +++++++++++++++++++ src/python/05.Logistic/core/com/__init__.py | 28 +++++++++++++++++++ .../05.Logistic/core/com/apachecn/__init__.py | 28 +++++++++++++++++++ .../core/com/apachecn/logistic/__init__.py | 28 +++++++++++++++++++ .../com/apachecn/logistic/logRegression.py | 8 +++++- .../apachecn/logistic}/test_logRegression.py | 16 ++++++++--- src/python/05.Logistic/test/__init__.py | 27 ++++++++++++++++++ src/python/Logistic.py | 2 +- src/python/__init__.py | 28 +++++++++++++++++++ 13 files changed, 250 insertions(+), 7 deletions(-) create mode 100644 src/__init__.py create mode 100644 src/python/05.Logistic/__init__.py create mode 100644 src/python/05.Logistic/core/__init__.py create mode 100644 src/python/05.Logistic/core/com/__init__.py create mode 100644 src/python/05.Logistic/core/com/apachecn/__init__.py create mode 100644 src/python/05.Logistic/core/com/apachecn/logistic/__init__.py rename src/python/05.Logistic/{test => core/com/apachecn/logistic}/test_logRegression.py (71%) create mode 100644 src/python/05.Logistic/test/__init__.py create mode 100644 src/python/__init__.py diff --git a/.idea/MachineLearning.iml b/.idea/MachineLearning.iml index eeeea0a4d..bd0813dc6 100644 --- a/.idea/MachineLearning.iml +++ b/.idea/MachineLearning.iml @@ -2,7 +2,7 @@ - + diff --git a/src/__init__.py b/src/__init__.py new file mode 100644 index 000000000..b69024ca5 --- /dev/null +++ b/src/__init__.py @@ -0,0 +1,28 @@ +#!/usr/bin/env python +# encoding: utf-8 + + +""" +@version: +@author: yangjf +@license: ApacheCN +@contact: highfei2011@126.com +@site: https://github.com/apachecn/MachineLearning +@software: PyCharm +@file: __init__.py.py +@time: 2017/3/4 21:34 +@test result:pass +""" + + +def func(): + pass + + +class Main(): + def __init__(self): + pass + + +if __name__ == '__main__': + pass \ No newline at end of file diff --git a/src/python/03.DecisionTree/DTSklearn.py b/src/python/03.DecisionTree/DTSklearn.py index 5155b2140..2629ef73b 100644 --- a/src/python/03.DecisionTree/DTSklearn.py +++ b/src/python/03.DecisionTree/DTSklearn.py @@ -6,6 +6,12 @@ from sklearn.metrics import precision_recall_curve from sklearn.metrics import classification_report from sklearn.cross_validation import train_test_split +""" +需要安装依赖模块: +pip install scikit_learn-0.18-cp27-cp27m-win_amd64.whl +非常完整的网址: +http://www.lfd.uci.edu/~gohlke/pythonlibs/#numpy +""" def createDataSet(): diff --git a/src/python/05.Logistic/__init__.py b/src/python/05.Logistic/__init__.py new file mode 100644 index 000000000..b69024ca5 --- /dev/null +++ b/src/python/05.Logistic/__init__.py @@ -0,0 +1,28 @@ +#!/usr/bin/env python +# encoding: utf-8 + + +""" +@version: +@author: yangjf +@license: ApacheCN +@contact: highfei2011@126.com +@site: https://github.com/apachecn/MachineLearning +@software: PyCharm +@file: __init__.py.py +@time: 2017/3/4 21:34 +@test result:pass +""" + + +def func(): + pass + + +class Main(): + def __init__(self): + pass + + +if __name__ == '__main__': + pass \ No newline at end of file diff --git a/src/python/05.Logistic/core/__init__.py b/src/python/05.Logistic/core/__init__.py new file mode 100644 index 000000000..d294a8bad --- /dev/null +++ b/src/python/05.Logistic/core/__init__.py @@ -0,0 +1,28 @@ +#!/usr/bin/env python +# encoding: utf-8 + + +""" +@version: +@author: yangjf +@license: ApacheCN +@contact: highfei2011@126.com +@site: https://github.com/apachecn/MachineLearning +@software: PyCharm +@file: __init__.py.py +@time: 2017/3/4 21:28 +@test result:pass +""" + + +def func(): + pass + + +class Main(): + def __init__(self): + pass + + +if __name__ == '__main__': + pass \ No newline at end of file diff --git a/src/python/05.Logistic/core/com/__init__.py b/src/python/05.Logistic/core/com/__init__.py new file mode 100644 index 000000000..d294a8bad --- /dev/null +++ b/src/python/05.Logistic/core/com/__init__.py @@ -0,0 +1,28 @@ +#!/usr/bin/env python +# encoding: utf-8 + + +""" +@version: +@author: yangjf +@license: ApacheCN +@contact: highfei2011@126.com +@site: https://github.com/apachecn/MachineLearning +@software: PyCharm +@file: __init__.py.py +@time: 2017/3/4 21:28 +@test result:pass +""" + + +def func(): + pass + + +class Main(): + def __init__(self): + pass + + +if __name__ == '__main__': + pass \ No newline at end of file diff --git a/src/python/05.Logistic/core/com/apachecn/__init__.py b/src/python/05.Logistic/core/com/apachecn/__init__.py new file mode 100644 index 000000000..d294a8bad --- /dev/null +++ b/src/python/05.Logistic/core/com/apachecn/__init__.py @@ -0,0 +1,28 @@ +#!/usr/bin/env python +# encoding: utf-8 + + +""" +@version: +@author: yangjf +@license: ApacheCN +@contact: highfei2011@126.com +@site: https://github.com/apachecn/MachineLearning +@software: PyCharm +@file: __init__.py.py +@time: 2017/3/4 21:28 +@test result:pass +""" + + +def func(): + pass + + +class Main(): + def __init__(self): + pass + + +if __name__ == '__main__': + pass \ No newline at end of file diff --git a/src/python/05.Logistic/core/com/apachecn/logistic/__init__.py b/src/python/05.Logistic/core/com/apachecn/logistic/__init__.py new file mode 100644 index 000000000..d294a8bad --- /dev/null +++ b/src/python/05.Logistic/core/com/apachecn/logistic/__init__.py @@ -0,0 +1,28 @@ +#!/usr/bin/env python +# encoding: utf-8 + + +""" +@version: +@author: yangjf +@license: ApacheCN +@contact: highfei2011@126.com +@site: https://github.com/apachecn/MachineLearning +@software: PyCharm +@file: __init__.py.py +@time: 2017/3/4 21:28 +@test result:pass +""" + + +def func(): + pass + + +class Main(): + def __init__(self): + pass + + +if __name__ == '__main__': + pass \ No newline at end of file diff --git a/src/python/05.Logistic/core/com/apachecn/logistic/logRegression.py b/src/python/05.Logistic/core/com/apachecn/logistic/logRegression.py index e20c64403..caa026bec 100644 --- a/src/python/05.Logistic/core/com/apachecn/logistic/logRegression.py +++ b/src/python/05.Logistic/core/com/apachecn/logistic/logRegression.py @@ -3,7 +3,13 @@ from numpy import * import matplotlib.pyplot as plt import time +''' +1、需要安装模块:pip install matplotlib-1.5.0-cp27-none-win_amd64.whl +由于直接安装会出现问题,所以建议下载whl包进行安装,下载网址: +https://pypi.python.org/pypi/matplotlib/1.5.0 +2、可以看见画出的图像 +''' """ @version: @@ -14,7 +20,7 @@ @software: PyCharm @file: logRegression01.py @time: 2017/3/3 22:03 -@test result:not pass +@test result: ok """ # sigmoid函数 diff --git a/src/python/05.Logistic/test/test_logRegression.py b/src/python/05.Logistic/core/com/apachecn/logistic/test_logRegression.py similarity index 71% rename from src/python/05.Logistic/test/test_logRegression.py rename to src/python/05.Logistic/core/com/apachecn/logistic/test_logRegression.py index d6a8f7079..31cf0a570 100644 --- a/src/python/05.Logistic/test/test_logRegression.py +++ b/src/python/05.Logistic/core/com/apachecn/logistic/test_logRegression.py @@ -1,12 +1,14 @@ #!/usr/bin/env python # encoding: utf-8 +import os import sys sys.path.append("C:\Python27") from numpy import * + import matplotlib.pyplot as plt -from core.com.apachcn.logistic import logRegression +from logRegression import * """ @version: @author: yangjf @@ -16,12 +18,18 @@ @software: PyCharm @file: test_logRegression.py @time: 2017/3/3 22:09 +@test result: ok """ def loadData(): train_x = [] train_y = [] - fileIn = open('testData/testSet.txt') + # 获取当前文件所在路径 + project_dir = os.getcwdu() + # 截取字符串至项目名:Test\ + project_dir = project_dir[:project_dir.find("MachineLearning\\") + 15] + print project_dir + fileIn = open("%s/testData/testSet.txt" % project_dir) for line in fileIn.readlines(): lineArr = line.strip().split() train_x.append([1.0, float(lineArr[0]), float(lineArr[1])]) @@ -37,11 +45,11 @@ def loadData(): ##第二步: 训练数据... print "step 2: training..." opts = {'alpha': 0.01, 'maxIter': 20, 'optimizeType': 'smoothStocGradDescent'} -optimalWeights = trainLogRegres(train_x, train_y, opts) +optimalWeights = trainLogRegres(train_x, train_y, opts) ##第三步: 测试 print "step 3: testing..." -accuracy = testLogRegres(optimalWeights, test_x, test_y) +accuracy = testLogRegres(optimalWeights, test_x, test_y) ##第四步: 显示结果 print "step 4: show the result..." diff --git a/src/python/05.Logistic/test/__init__.py b/src/python/05.Logistic/test/__init__.py new file mode 100644 index 000000000..4708358a8 --- /dev/null +++ b/src/python/05.Logistic/test/__init__.py @@ -0,0 +1,27 @@ +#!/usr/bin/env python +# encoding: utf-8 + + +""" +@version: +@author: yangjf +@license: ApacheCN +@contact: highfei2011@126.com +@site: https://github.com/apachecn/MachineLearning +@software: PyCharm +@file: __init__.py.py +@time: 2017/3/4 21:27 +@test result:pass +""" + +def func(): + pass + + +class Main(): + def __init__(self): + pass + + +if __name__ == '__main__': + pass \ No newline at end of file diff --git a/src/python/Logistic.py b/src/python/Logistic.py index 82ca465cd..dc6bc3451 100644 --- a/src/python/Logistic.py +++ b/src/python/Logistic.py @@ -117,7 +117,7 @@ def plotBestFit(dataArr, labelMat, weights): def main(): project_dir = os.path.dirname(os.path.dirname(os.getcwd())) # 1.收集并准备数据 - dataMat, labelMat = loadDataSet("%s/resources/testSet.txt" % project_dir) + dataMat, labelMat = loadDataSet("%s/testData/testSet.txt" % project_dir) # print dataMat, '---\n', labelMat # 2.训练模型, f(x)=a1*x1+b2*x2+..+nn*xn中 (a1,b2, .., nn).T的矩阵值 diff --git a/src/python/__init__.py b/src/python/__init__.py new file mode 100644 index 000000000..b69024ca5 --- /dev/null +++ b/src/python/__init__.py @@ -0,0 +1,28 @@ +#!/usr/bin/env python +# encoding: utf-8 + + +""" +@version: +@author: yangjf +@license: ApacheCN +@contact: highfei2011@126.com +@site: https://github.com/apachecn/MachineLearning +@software: PyCharm +@file: __init__.py.py +@time: 2017/3/4 21:34 +@test result:pass +""" + + +def func(): + pass + + +class Main(): + def __init__(self): + pass + + +if __name__ == '__main__': + pass \ No newline at end of file From 10e1c2b5772b233f474c619bf490886c83a45003 Mon Sep 17 00:00:00 2001 From: jiangzhonglian Date: Mon, 6 Mar 2017 21:13:32 +0800 Subject: [PATCH 36/92] =?UTF-8?q?=E6=9B=B4=E6=96=B0=E6=9E=84=E5=BB=BA?= =?UTF-8?q?=E6=A0=91=E7=9A=84Coding?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- README.md | 2 +- ...9.\346\240\221\345\233\236\345\275\222.md" | 6 +- src/python/01.NumPy.py | 9 +- src/python/03.DecisionTree/DTSklearn.py | 1 + .../03.DecisionTree/DecisionTreePlot.py | 6 +- src/python/09.RegTrees/TreeNode.py | 16 ++ src/python/09.RegTrees/regTrees.py | 184 ++++++++++++---- testData/RT_data1.txt | 200 ++++++++++++++++++ testData/RT_data2.txt | 200 ++++++++++++++++++ 9 files changed, 569 insertions(+), 55 deletions(-) create mode 100644 src/python/09.RegTrees/TreeNode.py create mode 100755 testData/RT_data1.txt create mode 100755 testData/RT_data2.txt diff --git a/README.md b/README.md index 31165d7f6..92bdc294e 100644 --- a/README.md +++ b/README.md @@ -31,7 +31,7 @@ ## 第四部分 其他工具 * 13) 使用PCA来简化数据 - *[利用PCA来简化数据](./docs/13.利用PCA来简化数据.md) + * [利用PCA来简化数据](./docs/13.利用PCA来简化数据.md) * 14) 使用SVD简化数据 * 15) 大数据与MapReduce diff --git "a/docs/9.\346\240\221\345\233\236\345\275\222.md" "b/docs/9.\346\240\221\345\233\236\345\275\222.md" index bd68557c7..f695bff5b 100644 --- "a/docs/9.\346\240\221\345\233\236\345\275\222.md" +++ "b/docs/9.\346\240\221\345\233\236\345\275\222.md" @@ -8,6 +8,6 @@ * 优点:可以对复杂和非线性的数据建模。 * 缺点:结果不易理解。 * 适用数据类型:数值型和标称型数据。 - - - \ No newline at end of file +* 那么问题来了,如何计算连续型数值的混乱度呢? + * `误差`:也就是计算平均差的总值(总方差=方差*样本数) + * 二元切分方式 diff --git a/src/python/01.NumPy.py b/src/python/01.NumPy.py index 256b0b93e..496dd0fe7 100644 --- a/src/python/01.NumPy.py +++ b/src/python/01.NumPy.py @@ -20,10 +20,15 @@ # 转化关系, 数组转化为矩阵 randMat = mat(randArray) -# .I表示对矩阵求逆 +# .I表示对矩阵求逆(可以利用矩阵的初等变换 +# # 意义:逆矩阵是一个判断相似性的工具。逆矩阵A与列向量p相乘后,将得到列向量q,q的第i个分量表示p与A的第i个列向量的相似度。 +# # 参考案例链接: +# # https://www.zhihu.com/question/33258489 +# # http://blog.csdn.net/vernice/article/details/48506027 +# .T表示对矩阵转置(行列颠倒) invRandMat = randMat.I # 输出结果 -print randArray, '\n', randMat, '\n', invRandMat +print randArray, '\n---\n', randMat, '\n+++\n', invRandMat # 矩阵和逆矩阵 进行求积 (单位矩阵,对角线都为1嘛,理论上4*4的矩阵其他的都为0) myEye = randMat*invRandMat # 误差 diff --git a/src/python/03.DecisionTree/DTSklearn.py b/src/python/03.DecisionTree/DTSklearn.py index 5155b2140..a48909616 100644 --- a/src/python/03.DecisionTree/DTSklearn.py +++ b/src/python/03.DecisionTree/DTSklearn.py @@ -98,6 +98,7 @@ def show_pdf(clf): # from IPython.display import Image # Image(graph.create_png()) + if __name__ == '__main__': x, y = createDataSet() diff --git a/src/python/03.DecisionTree/DecisionTreePlot.py b/src/python/03.DecisionTree/DecisionTreePlot.py index cf11e3827..737e4d314 100644 --- a/src/python/03.DecisionTree/DecisionTreePlot.py +++ b/src/python/03.DecisionTree/DecisionTreePlot.py @@ -77,9 +77,9 @@ def plotTree(myTree, parentPt, nodeTxt): plotTree.yOff = plotTree.yOff - 1.0/plotTree.totalD for key in secondDict.keys(): # 判断该节点是否是Node节点 - if type(secondDict[key]).__name__=='dict': + if type(secondDict[key]).__name__ == 'dict': # 如果是就递归调用[recursion] - plotTree(secondDict[key],cntrPt,str(key)) + plotTree(secondDict[key], cntrPt, str(key)) else: # 如果不是,就在原来节点一半的地方找到节点的坐标 plotTree.xOff = plotTree.xOff + 1.0/plotTree.totalW @@ -121,7 +121,7 @@ def createPlot(inTree): # 测试数据集 def retrieveTree(i): - listOfTrees =[ + listOfTrees = [ {'no surfacing': {0: 'no', 1: {'flippers': {0: 'no', 1: 'yes'}}}}, {'no surfacing': {0: 'no', 1: {'flippers': {0: {'head': {0: 'no', 1: 'yes'}}, 1: 'no'}}}} ] diff --git a/src/python/09.RegTrees/TreeNode.py b/src/python/09.RegTrees/TreeNode.py new file mode 100644 index 000000000..c6e765831 --- /dev/null +++ b/src/python/09.RegTrees/TreeNode.py @@ -0,0 +1,16 @@ +#!/usr/bin/python +# coding:utf8 + +''' +Created on 2017-03-06 +Update on 2017-03-06 +@author: jiangzhonglian +''' + + +class treeNode(): + def __init__(self, feat, val, right, left): + self.featureToSplitOn = feat + self.valueOfSplit = val + self.rightBranch = right + self.leftBranch = left diff --git a/src/python/09.RegTrees/regTrees.py b/src/python/09.RegTrees/regTrees.py index c1436e0ec..bfe43a749 100644 --- a/src/python/09.RegTrees/regTrees.py +++ b/src/python/09.RegTrees/regTrees.py @@ -9,25 +9,136 @@ ''' from numpy import * -def loadDataSet(fileName): #general function to parse tab -delimited floats - dataMat = [] #assume last column is target value + +# 默认解析的数据是用tab分隔,并且是数值类型 +# general function to parse tab -delimited floats +def loadDataSet(fileName): + """loadDataSet(解析每一行,并转化为float类型) + + Args: + fileName 文件名 + Returns: + dataMat 每一行的数据集array类型 + Raises: + """ + # 假定最后一列是结果值 + # assume last column is target value + dataMat = [] fr = open(fileName) for line in fr.readlines(): curLine = line.strip().split('\t') - fltLine = map(float,curLine) #map all elements to float() + # 将所有的元素转化为float类型 + # map all elements to float() + fltLine = map(float, curLine) dataMat.append(fltLine) return dataMat + def binSplitDataSet(dataSet, feature, value): - mat0 = dataSet[nonzero(dataSet[:,feature] > value)[0],:][0] - mat1 = dataSet[nonzero(dataSet[:,feature] <= value)[0],:][0] - return mat0,mat1 + """binSplitDataSet(将数据集,按照feature列的value进行 二元切分) + + Args: + fileName 文件名 + Returns: + dataMat 每一行的数据集array类型 + Raises: + """ + # # 测试案例 + # print 'dataSet[:, feature]=', dataSet[:, feature] + # print 'nonzero(dataSet[:, feature] > value)[0]=', nonzero(dataSet[:, feature] > value)[0] + # print 'nonzero(dataSet[:, feature] <= value)[0]=', nonzero(dataSet[:, feature] <= value)[0] + + # dataSet[:, feature] 取去每一行中,第1列的值(从0开始算) + # nonzero(dataSet[:, feature] > value) 返回结果为true行的index下标 + mat0 = dataSet[nonzero(dataSet[:, feature] > value)[0], :] + mat1 = dataSet[nonzero(dataSet[:, feature] <= value)[0], :] + return mat0, mat1 + -def regLeaf(dataSet):#returns the value used for each leaf - return mean(dataSet[:,-1]) +# 返回每一个叶子结点的均值 +# returns the value used for each leaf +def regLeaf(dataSet): + return mean(dataSet[:, -1]) + +# 计算总方差=方差*样本数 def regErr(dataSet): - return var(dataSet[:,-1]) * shape(dataSet)[0] + # shape(dataSet)[0] 表示行数 + return var(dataSet[:, -1]) * shape(dataSet)[0] + + +# 1.用最佳方式切分数据集 +# 2.生成相应的叶节点 +def chooseBestSplit(dataSet, leafType=regLeaf, errType=regErr, ops=(1, 4)): + """chooseBestSplit(用最佳方式切分数据集 和 生成相应的叶节点) + + Args: + dataSet 数据集 + leafType 计算叶子节点的函数 + errType 求总方差 + ops [容许误差下降值,切分的最少样本数] + Returns: + bestIndex feature的index坐标 + bestValue 切分的最优值 + Raises: + """ + tolS = ops[0] + tolN = ops[1] + # 如果结果集(最后一列为1个变量),就返回推出 + # .T 对数据集进行转置 + # .tolist()[0] 转化为数组并取第0列 + if len(set(dataSet[:, -1].T.tolist()[0])) == 1: + # exit cond 1 + return None, leafType(dataSet) + # 计算行列值 + m, n = shape(dataSet) + print m, n + # 无分类误差的总方差和 + # the choice of the best feature is driven by Reduction in RSS error from mean + S = errType(dataSet) + # inf 正无穷大 + bestS, bestIndex, bestValue = inf, 0, 0 + # 循环处理每一列对应的feature值 + for featIndex in range(n-1): + for splitVal in set(dataSet[:, featIndex].T.tolist()[0]): + # 对该列进行分组,然后组内的成员的val值进行 二元切分 + mat0, mat1 = binSplitDataSet(dataSet, featIndex, splitVal) + # 判断二元切分的方式的元素数量是否符合预期 + if (shape(mat0)[0] < tolN) or (shape(mat1)[0] < tolN): + continue + newS = errType(mat0) + errType(mat1) + # 如果二元切分,算出来的误差在可接受范围内,那么就记录切分点,并记录最小误差 + if newS < bestS: + bestIndex = featIndex + bestValue = splitVal + bestS = newS + # 判断二元切分的方式的元素误差是否符合预期 + # if the decrease (S-bestS) is less than a threshold don't do the split + if (S - bestS) < tolS: + return None, leafType(dataSet) + mat0, mat1 = binSplitDataSet(dataSet, bestIndex, bestValue) + # 对整体的成员进行判断,是否符合预期 + if (shape(mat0)[0] < tolN) or (shape(mat1)[0] < tolN): + return None, leafType(dataSet) + return bestIndex, bestValue + + +# assume dataSet is NumPy Mat so we can array filtering +def createTree(dataSet, leafType=regLeaf, errType=regErr, ops=(1, 4)): + # 选择最好的切分方式: feature索引值,最优切分值 + # choose the best split + feat, val = chooseBestSplit(dataSet, leafType, errType, ops) + # if the splitting hit a stop condition return val + if feat is None: + return val + retTree = {} + retTree['spInd'] = feat + retTree['spVal'] = val + lSet, rSet = binSplitDataSet(dataSet, feat, val) + retTree['right'] = createTree(lSet, leafType, errType, ops) + retTree['left'] = createTree(rSet, leafType, errType, ops) + return retTree + def linearSolve(dataSet): #helper function used in two places m,n = shape(dataSet) @@ -49,43 +160,7 @@ def modelErr(dataSet): yHat = X * ws return sum(power(Y - yHat,2)) -def chooseBestSplit(dataSet, leafType=regLeaf, errType=regErr, ops=(1,4)): - tolS = ops[0]; tolN = ops[1] - #if all the target variables are the same value: quit and return value - if len(set(dataSet[:,-1].T.tolist()[0])) == 1: #exit cond 1 - return None, leafType(dataSet) - m,n = shape(dataSet) - #the choice of the best feature is driven by Reduction in RSS error from mean - S = errType(dataSet) - bestS = inf; bestIndex = 0; bestValue = 0 - for featIndex in range(n-1): - for splitVal in set(dataSet[:,featIndex]): - mat0, mat1 = binSplitDataSet(dataSet, featIndex, splitVal) - if (shape(mat0)[0] < tolN) or (shape(mat1)[0] < tolN): continue - newS = errType(mat0) + errType(mat1) - if newS < bestS: - bestIndex = featIndex - bestValue = splitVal - bestS = newS - #if the decrease (S-bestS) is less than a threshold don't do the split - if (S - bestS) < tolS: - return None, leafType(dataSet) #exit cond 2 - mat0, mat1 = binSplitDataSet(dataSet, bestIndex, bestValue) - if (shape(mat0)[0] < tolN) or (shape(mat1)[0] < tolN): #exit cond 3 - return None, leafType(dataSet) - return bestIndex,bestValue#returns the best feature to split on - #and the value used for that split -def createTree(dataSet, leafType=regLeaf, errType=regErr, ops=(1,4)):#assume dataSet is NumPy Mat so we can array filtering - feat, val = chooseBestSplit(dataSet, leafType, errType, ops)#choose the best split - if feat == None: return val #if the splitting hit a stop condition return val - retTree = {} - retTree['spInd'] = feat - retTree['spVal'] = val - lSet, rSet = binSplitDataSet(dataSet, feat, val) - retTree['left'] = createTree(lSet, leafType, errType, ops) - retTree['right'] = createTree(rSet, leafType, errType, ops) - return retTree def isTree(obj): return (type(obj).__name__=='dict') @@ -137,4 +212,21 @@ def createForeCast(tree, testData, modelEval=regTreeEval): yHat = mat(zeros((m,1))) for i in range(m): yHat[i,0] = treeForeCast(tree, mat(testData[i]), modelEval) - return yHat \ No newline at end of file + return yHat + +if __name__ == "__main__": + + + # # 测试数据集 + # testMat = mat(eye(4)) + # print testMat + # print type(testMat) + # mat0, mat1 = binSplitDataSet(testMat, 1, 0.5) + # print mat0, '\n-----------\n', mat1 + + # 获取数据集 + # myDat = loadDataSet('testData/RT_data1.txt') + myDat = loadDataSet('testData/RT_data2.txt') + myMat = mat(myDat) + myTree = createTree(myMat) + print myTree diff --git a/testData/RT_data1.txt b/testData/RT_data1.txt new file mode 100755 index 000000000..fa98fa585 --- /dev/null +++ b/testData/RT_data1.txt @@ -0,0 +1,200 @@ +0.036098 0.155096 +0.993349 1.077553 +0.530897 0.893462 +0.712386 0.564858 +0.343554 -0.371700 +0.098016 -0.332760 +0.691115 0.834391 +0.091358 0.099935 +0.727098 1.000567 +0.951949 0.945255 +0.768596 0.760219 +0.541314 0.893748 +0.146366 0.034283 +0.673195 0.915077 +0.183510 0.184843 +0.339563 0.206783 +0.517921 1.493586 +0.703755 1.101678 +0.008307 0.069976 +0.243909 -0.029467 +0.306964 -0.177321 +0.036492 0.408155 +0.295511 0.002882 +0.837522 1.229373 +0.202054 -0.087744 +0.919384 1.029889 +0.377201 -0.243550 +0.814825 1.095206 +0.611270 0.982036 +0.072243 -0.420983 +0.410230 0.331722 +0.869077 1.114825 +0.620599 1.334421 +0.101149 0.068834 +0.820802 1.325907 +0.520044 0.961983 +0.488130 -0.097791 +0.819823 0.835264 +0.975022 0.673579 +0.953112 1.064690 +0.475976 -0.163707 +0.273147 -0.455219 +0.804586 0.924033 +0.074795 -0.349692 +0.625336 0.623696 +0.656218 0.958506 +0.834078 1.010580 +0.781930 1.074488 +0.009849 0.056594 +0.302217 -0.148650 +0.678287 0.907727 +0.180506 0.103676 +0.193641 -0.327589 +0.343479 0.175264 +0.145809 0.136979 +0.996757 1.035533 +0.590210 1.336661 +0.238070 -0.358459 +0.561362 1.070529 +0.377597 0.088505 +0.099142 0.025280 +0.539558 1.053846 +0.790240 0.533214 +0.242204 0.209359 +0.152324 0.132858 +0.252649 -0.055613 +0.895930 1.077275 +0.133300 -0.223143 +0.559763 1.253151 +0.643665 1.024241 +0.877241 0.797005 +0.613765 1.621091 +0.645762 1.026886 +0.651376 1.315384 +0.697718 1.212434 +0.742527 1.087056 +0.901056 1.055900 +0.362314 -0.556464 +0.948268 0.631862 +0.000234 0.060903 +0.750078 0.906291 +0.325412 -0.219245 +0.726828 1.017112 +0.348013 0.048939 +0.458121 -0.061456 +0.280738 -0.228880 +0.567704 0.969058 +0.750918 0.748104 +0.575805 0.899090 +0.507940 1.107265 +0.071769 -0.110946 +0.553520 1.391273 +0.401152 -0.121640 +0.406649 -0.366317 +0.652121 1.004346 +0.347837 -0.153405 +0.081931 -0.269756 +0.821648 1.280895 +0.048014 0.064496 +0.130962 0.184241 +0.773422 1.125943 +0.789625 0.552614 +0.096994 0.227167 +0.625791 1.244731 +0.589575 1.185812 +0.323181 0.180811 +0.822443 1.086648 +0.360323 -0.204830 +0.950153 1.022906 +0.527505 0.879560 +0.860049 0.717490 +0.007044 0.094150 +0.438367 0.034014 +0.574573 1.066130 +0.536689 0.867284 +0.782167 0.886049 +0.989888 0.744207 +0.761474 1.058262 +0.985425 1.227946 +0.132543 -0.329372 +0.346986 -0.150389 +0.768784 0.899705 +0.848921 1.170959 +0.449280 0.069098 +0.066172 0.052439 +0.813719 0.706601 +0.661923 0.767040 +0.529491 1.022206 +0.846455 0.720030 +0.448656 0.026974 +0.795072 0.965721 +0.118156 -0.077409 +0.084248 -0.019547 +0.845815 0.952617 +0.576946 1.234129 +0.772083 1.299018 +0.696648 0.845423 +0.595012 1.213435 +0.648675 1.287407 +0.897094 1.240209 +0.552990 1.036158 +0.332982 0.210084 +0.065615 -0.306970 +0.278661 0.253628 +0.773168 1.140917 +0.203693 -0.064036 +0.355688 -0.119399 +0.988852 1.069062 +0.518735 1.037179 +0.514563 1.156648 +0.976414 0.862911 +0.919074 1.123413 +0.697777 0.827805 +0.928097 0.883225 +0.900272 0.996871 +0.344102 -0.061539 +0.148049 0.204298 +0.130052 -0.026167 +0.302001 0.317135 +0.337100 0.026332 +0.314924 -0.001952 +0.269681 -0.165971 +0.196005 -0.048847 +0.129061 0.305107 +0.936783 1.026258 +0.305540 -0.115991 +0.683921 1.414382 +0.622398 0.766330 +0.902532 0.861601 +0.712503 0.933490 +0.590062 0.705531 +0.723120 1.307248 +0.188218 0.113685 +0.643601 0.782552 +0.520207 1.209557 +0.233115 -0.348147 +0.465625 -0.152940 +0.884512 1.117833 +0.663200 0.701634 +0.268857 0.073447 +0.729234 0.931956 +0.429664 -0.188659 +0.737189 1.200781 +0.378595 -0.296094 +0.930173 1.035645 +0.774301 0.836763 +0.273940 -0.085713 +0.824442 1.082153 +0.626011 0.840544 +0.679390 1.307217 +0.578252 0.921885 +0.785541 1.165296 +0.597409 0.974770 +0.014083 -0.132525 +0.663870 1.187129 +0.552381 1.369630 +0.683886 0.999985 +0.210334 -0.006899 +0.604529 1.212685 +0.250744 0.046297 diff --git a/testData/RT_data2.txt b/testData/RT_data2.txt new file mode 100755 index 000000000..bee167b90 --- /dev/null +++ b/testData/RT_data2.txt @@ -0,0 +1,200 @@ +1.000000 0.409175 1.883180 +1.000000 0.182603 0.063908 +1.000000 0.663687 3.042257 +1.000000 0.517395 2.305004 +1.000000 0.013643 -0.067698 +1.000000 0.469643 1.662809 +1.000000 0.725426 3.275749 +1.000000 0.394350 1.118077 +1.000000 0.507760 2.095059 +1.000000 0.237395 1.181912 +1.000000 0.057534 0.221663 +1.000000 0.369820 0.938453 +1.000000 0.976819 4.149409 +1.000000 0.616051 3.105444 +1.000000 0.413700 1.896278 +1.000000 0.105279 -0.121345 +1.000000 0.670273 3.161652 +1.000000 0.952758 4.135358 +1.000000 0.272316 0.859063 +1.000000 0.303697 1.170272 +1.000000 0.486698 1.687960 +1.000000 0.511810 1.979745 +1.000000 0.195865 0.068690 +1.000000 0.986769 4.052137 +1.000000 0.785623 3.156316 +1.000000 0.797583 2.950630 +1.000000 0.081306 0.068935 +1.000000 0.659753 2.854020 +1.000000 0.375270 0.999743 +1.000000 0.819136 4.048082 +1.000000 0.142432 0.230923 +1.000000 0.215112 0.816693 +1.000000 0.041270 0.130713 +1.000000 0.044136 -0.537706 +1.000000 0.131337 -0.339109 +1.000000 0.463444 2.124538 +1.000000 0.671905 2.708292 +1.000000 0.946559 4.017390 +1.000000 0.904176 4.004021 +1.000000 0.306674 1.022555 +1.000000 0.819006 3.657442 +1.000000 0.845472 4.073619 +1.000000 0.156258 0.011994 +1.000000 0.857185 3.640429 +1.000000 0.400158 1.808497 +1.000000 0.375395 1.431404 +1.000000 0.885807 3.935544 +1.000000 0.239960 1.162152 +1.000000 0.148640 -0.227330 +1.000000 0.143143 -0.068728 +1.000000 0.321582 0.825051 +1.000000 0.509393 2.008645 +1.000000 0.355891 0.664566 +1.000000 0.938633 4.180202 +1.000000 0.348057 0.864845 +1.000000 0.438898 1.851174 +1.000000 0.781419 2.761993 +1.000000 0.911333 4.075914 +1.000000 0.032469 0.110229 +1.000000 0.499985 2.181987 +1.000000 0.771663 3.152528 +1.000000 0.670361 3.046564 +1.000000 0.176202 0.128954 +1.000000 0.392170 1.062726 +1.000000 0.911188 3.651742 +1.000000 0.872288 4.401950 +1.000000 0.733107 3.022888 +1.000000 0.610239 2.874917 +1.000000 0.732739 2.946801 +1.000000 0.714825 2.893644 +1.000000 0.076386 0.072131 +1.000000 0.559009 1.748275 +1.000000 0.427258 1.912047 +1.000000 0.841875 3.710686 +1.000000 0.558918 1.719148 +1.000000 0.533241 2.174090 +1.000000 0.956665 3.656357 +1.000000 0.620393 3.522504 +1.000000 0.566120 2.234126 +1.000000 0.523258 1.859772 +1.000000 0.476884 2.097017 +1.000000 0.176408 0.001794 +1.000000 0.303094 1.231928 +1.000000 0.609731 2.953862 +1.000000 0.017774 -0.116803 +1.000000 0.622616 2.638864 +1.000000 0.886539 3.943428 +1.000000 0.148654 -0.328513 +1.000000 0.104350 -0.099866 +1.000000 0.116868 -0.030836 +1.000000 0.516514 2.359786 +1.000000 0.664896 3.212581 +1.000000 0.004327 0.188975 +1.000000 0.425559 1.904109 +1.000000 0.743671 3.007114 +1.000000 0.935185 3.845834 +1.000000 0.697300 3.079411 +1.000000 0.444551 1.939739 +1.000000 0.683753 2.880078 +1.000000 0.755993 3.063577 +1.000000 0.902690 4.116296 +1.000000 0.094491 -0.240963 +1.000000 0.873831 4.066299 +1.000000 0.991810 4.011834 +1.000000 0.185611 0.077710 +1.000000 0.694551 3.103069 +1.000000 0.657275 2.811897 +1.000000 0.118746 -0.104630 +1.000000 0.084302 0.025216 +1.000000 0.945341 4.330063 +1.000000 0.785827 3.087091 +1.000000 0.530933 2.269988 +1.000000 0.879594 4.010701 +1.000000 0.652770 3.119542 +1.000000 0.879338 3.723411 +1.000000 0.764739 2.792078 +1.000000 0.504884 2.192787 +1.000000 0.554203 2.081305 +1.000000 0.493209 1.714463 +1.000000 0.363783 0.885854 +1.000000 0.316465 1.028187 +1.000000 0.580283 1.951497 +1.000000 0.542898 1.709427 +1.000000 0.112661 0.144068 +1.000000 0.816742 3.880240 +1.000000 0.234175 0.921876 +1.000000 0.402804 1.979316 +1.000000 0.709423 3.085768 +1.000000 0.867298 3.476122 +1.000000 0.993392 3.993679 +1.000000 0.711580 3.077880 +1.000000 0.133643 -0.105365 +1.000000 0.052031 -0.164703 +1.000000 0.366806 1.096814 +1.000000 0.697521 3.092879 +1.000000 0.787262 2.987926 +1.000000 0.476710 2.061264 +1.000000 0.721417 2.746854 +1.000000 0.230376 0.716710 +1.000000 0.104397 0.103831 +1.000000 0.197834 0.023776 +1.000000 0.129291 -0.033299 +1.000000 0.528528 1.942286 +1.000000 0.009493 -0.006338 +1.000000 0.998533 3.808753 +1.000000 0.363522 0.652799 +1.000000 0.901386 4.053747 +1.000000 0.832693 4.569290 +1.000000 0.119002 -0.032773 +1.000000 0.487638 2.066236 +1.000000 0.153667 0.222785 +1.000000 0.238619 1.089268 +1.000000 0.208197 1.487788 +1.000000 0.750921 2.852033 +1.000000 0.183403 0.024486 +1.000000 0.995608 3.737750 +1.000000 0.151311 0.045017 +1.000000 0.126804 0.001238 +1.000000 0.983153 3.892763 +1.000000 0.772495 2.819376 +1.000000 0.784133 2.830665 +1.000000 0.056934 0.234633 +1.000000 0.425584 1.810782 +1.000000 0.998709 4.237235 +1.000000 0.707815 3.034768 +1.000000 0.413816 1.742106 +1.000000 0.217152 1.169250 +1.000000 0.360503 0.831165 +1.000000 0.977989 3.729376 +1.000000 0.507953 1.823205 +1.000000 0.920771 4.021970 +1.000000 0.210542 1.262939 +1.000000 0.928611 4.159518 +1.000000 0.580373 2.039114 +1.000000 0.841390 4.101837 +1.000000 0.681530 2.778672 +1.000000 0.292795 1.228284 +1.000000 0.456918 1.736620 +1.000000 0.134128 -0.195046 +1.000000 0.016241 -0.063215 +1.000000 0.691214 3.305268 +1.000000 0.582002 2.063627 +1.000000 0.303102 0.898840 +1.000000 0.622598 2.701692 +1.000000 0.525024 1.992909 +1.000000 0.996775 3.811393 +1.000000 0.881025 4.353857 +1.000000 0.723457 2.635641 +1.000000 0.676346 2.856311 +1.000000 0.254625 1.352682 +1.000000 0.488632 2.336459 +1.000000 0.519875 2.111651 +1.000000 0.160176 0.121726 +1.000000 0.609483 3.264605 +1.000000 0.531881 2.103446 +1.000000 0.321632 0.896855 +1.000000 0.845148 4.220850 +1.000000 0.012003 -0.217283 +1.000000 0.018883 -0.300577 +1.000000 0.071476 0.006014 From 2f56c4a59bdfd38f0669c714ba9acef47a961983 Mon Sep 17 00:00:00 2001 From: geekidentity Date: Tue, 7 Mar 2017 23:07:24 +0800 Subject: [PATCH 37/92] =?UTF-8?q?change=205.Logistic=E5=9B=9E=E5=BD=92.md?= =?UTF-8?q?=20=20encoding=20to=20utf-8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- "docs/5.Logistic\345\233\236\345\275\222.md" | 18 +++++++++--------- 1 file changed, 9 insertions(+), 9 deletions(-) diff --git "a/docs/5.Logistic\345\233\236\345\275\222.md" "b/docs/5.Logistic\345\233\236\345\275\222.md" index e049ec53c..a6c6a445a 100644 --- "a/docs/5.Logistic\345\233\236\345\275\222.md" +++ "b/docs/5.Logistic\345\233\236\345\275\222.md" @@ -1,11 +1,11 @@ -# 1) ߼ع +# 1) 逻辑回归基础 - * ߼ع(Logistic Regression) - * 1.1 - * 1.2 ˵ʾ - * 1.3 ж߽ - * 1.4 ۺ - * 1.5 򻯵ijɱݶ½ - * 1.6 ߼Ż - * 1.7 ࣺһ \ No newline at end of file + * 逻辑回归(Logistic Regression) + * 1.1 分类问题 + * 1.2 假说表示 + * 1.3 判定边界 + * 1.4 代价函数 + * 1.5 简化的成本函数和梯度下降 + * 1.6 高级优化 + * 1.7 多类分类:一个对所有 \ No newline at end of file From c53cf4ff4e93ed6402211fb366f8c940180f305f Mon Sep 17 00:00:00 2001 From: jiangzhonglian Date: Wed, 8 Mar 2017 01:09:06 +0800 Subject: [PATCH 38/92] =?UTF-8?q?=E6=B5=8B=E8=AF=95=E5=AE=8C=EF=BC=9A?= =?UTF-8?q?=E5=9B=9E=E5=BD=92=E6=A0=91=20VS=20=E6=A8=A1=E5=9E=8B=E6=A0=91?= =?UTF-8?q?=20VS=20=E7=BA=BF=E6=80=A7=E5=9B=9E=E5=BD=92?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/python/09.RegTrees/regTrees.py | 224 ++++++++++++++++++++-------- src/python/regression.py | 16 +- testData/RT_bikeSpeedVsIq_test.txt | 200 +++++++++++++++++++++++++ testData/RT_bikeSpeedVsIq_train.txt | 200 +++++++++++++++++++++++++ testData/RT_data3.txt | 200 +++++++++++++++++++++++++ testData/RT_data3test.txt | 200 +++++++++++++++++++++++++ testData/RT_data4.txt | 200 +++++++++++++++++++++++++ testData/Regression_data.txt | 200 +++++++++++++++++++++++++ 8 files changed, 1371 insertions(+), 69 deletions(-) create mode 100755 testData/RT_bikeSpeedVsIq_test.txt create mode 100755 testData/RT_bikeSpeedVsIq_train.txt create mode 100755 testData/RT_data3.txt create mode 100755 testData/RT_data3test.txt create mode 100755 testData/RT_data4.txt create mode 100755 testData/Regression_data.txt diff --git a/src/python/09.RegTrees/regTrees.py b/src/python/09.RegTrees/regTrees.py index bfe43a749..11a8be856 100644 --- a/src/python/09.RegTrees/regTrees.py +++ b/src/python/09.RegTrees/regTrees.py @@ -38,9 +38,12 @@ def binSplitDataSet(dataSet, feature, value): """binSplitDataSet(将数据集,按照feature列的value进行 二元切分) Args: - fileName 文件名 + dataMat 数据集 + feature 特征列 + value 特征列要比较的值 Returns: - dataMat 每一行的数据集array类型 + mat0 小于的数据集在左边 + mat1 大于的数据集在右边 Raises: """ # # 测试案例 @@ -50,8 +53,8 @@ def binSplitDataSet(dataSet, feature, value): # dataSet[:, feature] 取去每一行中,第1列的值(从0开始算) # nonzero(dataSet[:, feature] > value) 返回结果为true行的index下标 - mat0 = dataSet[nonzero(dataSet[:, feature] > value)[0], :] - mat1 = dataSet[nonzero(dataSet[:, feature] <= value)[0], :] + mat0 = dataSet[nonzero(dataSet[:, feature] <= value)[0], :] + mat1 = dataSet[nonzero(dataSet[:, feature] > value)[0], :] return mat0, mat1 @@ -92,7 +95,6 @@ def chooseBestSplit(dataSet, leafType=regLeaf, errType=regErr, ops=(1, 4)): return None, leafType(dataSet) # 计算行列值 m, n = shape(dataSet) - print m, n # 无分类误差的总方差和 # the choice of the best feature is driven by Reduction in RSS error from mean S = errType(dataSet) @@ -134,89 +136,136 @@ def createTree(dataSet, leafType=regLeaf, errType=regErr, ops=(1, 4)): retTree = {} retTree['spInd'] = feat retTree['spVal'] = val + # 大于在右边,小于在左边 lSet, rSet = binSplitDataSet(dataSet, feat, val) - retTree['right'] = createTree(lSet, leafType, errType, ops) - retTree['left'] = createTree(rSet, leafType, errType, ops) + # 递归的进行调用 + retTree['left'] = createTree(lSet, leafType, errType, ops) + retTree['right'] = createTree(rSet, leafType, errType, ops) return retTree -def linearSolve(dataSet): #helper function used in two places - m,n = shape(dataSet) - X = mat(ones((m,n))); Y = mat(ones((m,1)))#create a copy of data with 1 in 0th postion - X[:,1:n] = dataSet[:,0:n-1]; Y = dataSet[:,-1]#and strip out Y - xTx = X.T*X - if linalg.det(xTx) == 0.0: - raise NameError('This matrix is singular, cannot do inverse,\n\ - try increasing the second value of ops') - ws = xTx.I * (X.T * Y) - return ws,X,Y - -def modelLeaf(dataSet):#create linear model and return coeficients - ws,X,Y = linearSolve(dataSet) - return ws - -def modelErr(dataSet): - ws,X,Y = linearSolve(dataSet) - yHat = X * ws - return sum(power(Y - yHat,2)) - - - +# 判断节点是否是一个字典 def isTree(obj): - return (type(obj).__name__=='dict') + return (type(obj).__name__ == 'dict') + +# 计算左右枝丫的均值 def getMean(tree): - if isTree(tree['right']): tree['right'] = getMean(tree['right']) - if isTree(tree['left']): tree['left'] = getMean(tree['left']) + if isTree(tree['right']): + tree['right'] = getMean(tree['right']) + if isTree(tree['left']): + tree['left'] = getMean(tree['left']) return (tree['left']+tree['right'])/2.0 - + + +# 检查是否适合合并分枝 def prune(tree, testData): - if shape(testData)[0] == 0: return getMean(tree) #if we have no test data collapse the tree - if (isTree(tree['right']) or isTree(tree['left'])):#if the branches are not trees try to prune them + # 判断是否测试数据集没有数据 + if shape(testData)[0] == 0: + return getMean(tree) + # 对测试进行分支,看属于哪只分支,然后返回tree结果的均值 + if (isTree(tree['right']) or isTree(tree['left'])): lSet, rSet = binSplitDataSet(testData, tree['spInd'], tree['spVal']) - if isTree(tree['left']): tree['left'] = prune(tree['left'], lSet) - if isTree(tree['right']): tree['right'] = prune(tree['right'], rSet) - #if they are now both leafs, see if we can merge them + if isTree(tree['left']): + tree['left'] = prune(tree['left'], lSet) + if isTree(tree['right']): + tree['right'] = prune(tree['right'], rSet) + + # 如果左右两边无子分支,那么计算一下总方差 和 该结果集的本身不分枝的总方差比较 + # 1.如果测试数据集足够大,将tree进行分支到最后 + # 2.如果测试数据集不够大,那么就无法进行合并 + # 注意返回的结果: 是合并后对原来为字典tree进行赋值,相当于进行了合并 if not isTree(tree['left']) and not isTree(tree['right']): lSet, rSet = binSplitDataSet(testData, tree['spInd'], tree['spVal']) - errorNoMerge = sum(power(lSet[:,-1] - tree['left'],2)) +\ - sum(power(rSet[:,-1] - tree['right'],2)) - treeMean = (tree['left']+tree['right'])/2.0 - errorMerge = sum(power(testData[:,-1] - treeMean,2)) - if errorMerge < errorNoMerge: + # power(x, y)表示x的y次方 + errorNoMerge = sum(power(lSet[:, -1] - tree['left'], 2)) + sum(power(rSet[:, -1] - tree['right'], 2)) + treeMean = (tree['left'] + tree['right'])/2.0 + errorMerge = sum(power(testData[:, -1] - treeMean, 2)) + # 如果 合并的总方差 < 不合并的总方差,那么就进行合并 + if errorMerge < errorNoMerge: print "merging" return treeMean - else: return tree - else: return tree - + else: + return tree + else: + return tree + + +# 得到模型的ws系数:f(x) = x0 + x1*featrue1+ x3*featrue2 ... +# create linear model and return coeficients +def modelLeaf(dataSet): + ws, X, Y = linearSolve(dataSet) + return ws + + +# 计算线性模型的误差值 +def modelErr(dataSet): + ws, X, Y = linearSolve(dataSet) + yHat = X * ws + # print corrcoef(yHat, Y, rowvar=0) + return sum(power(Y - yHat, 2)) + + + # helper function used in two places +def linearSolve(dataSet): + m, n = shape(dataSet) + # 产生一个关于1的矩阵 + X = mat(ones((m, n))) + Y = mat(ones((m, 1))) + # X的0列为1,常数项,用于计算平衡误差 + X[:, 1: n] = dataSet[:, 0: n-1] + Y = dataSet[:, -1] + + # 转置矩阵*矩阵 + xTx = X.T * X + # 如果矩阵的逆不存在,会造成程序异常 + if linalg.det(xTx) == 0.0: + raise NameError('This matrix is singular, cannot do inverse,\ntry increasing the second value of ops') + # 最小二乘法求最优解 + ws = xTx.I * (X.T * Y) + return ws, X, Y + + +# 回归树测试案例 def regTreeEval(model, inDat): return float(model) + +# 模型树测试案例 def modelTreeEval(model, inDat): n = shape(inDat)[1] - X = mat(ones((1,n+1))) - X[:,1:n+1]=inDat - return float(X*model) + X = mat(ones((1, n+1))) + X[:, 1: n+1] = inDat + # print X, model + return float(X * model) + +# 计算预测的结果 def treeForeCast(tree, inData, modelEval=regTreeEval): - if not isTree(tree): return modelEval(tree, inData) - if inData[tree['spInd']] > tree['spVal']: - if isTree(tree['left']): return treeForeCast(tree['left'], inData, modelEval) - else: return modelEval(tree['left'], inData) + if not isTree(tree): + return modelEval(tree, inData) + if inData[tree['spInd']] <= tree['spVal']: + if isTree(tree['left']): + return treeForeCast(tree['left'], inData, modelEval) + else: + return modelEval(tree['left'], inData) else: - if isTree(tree['right']): return treeForeCast(tree['right'], inData, modelEval) - else: return modelEval(tree['right'], inData) - + if isTree(tree['right']): + return treeForeCast(tree['right'], inData, modelEval) + else: + return modelEval(tree['right'], inData) + + +# 预测结果 def createForeCast(tree, testData, modelEval=regTreeEval): - m=len(testData) - yHat = mat(zeros((m,1))) + m = len(testData) + yHat = mat(zeros((m, 1))) for i in range(m): - yHat[i,0] = treeForeCast(tree, mat(testData[i]), modelEval) + yHat[i, 0] = treeForeCast(tree, mat(testData[i]), modelEval) return yHat -if __name__ == "__main__": - +if __name__ == "__main__": # # 测试数据集 # testMat = mat(eye(4)) # print testMat @@ -224,9 +273,52 @@ def createForeCast(tree, testData, modelEval=regTreeEval): # mat0, mat1 = binSplitDataSet(testMat, 1, 0.5) # print mat0, '\n-----------\n', mat1 - # 获取数据集 + # 回归树 # myDat = loadDataSet('testData/RT_data1.txt') - myDat = loadDataSet('testData/RT_data2.txt') - myMat = mat(myDat) - myTree = createTree(myMat) - print myTree + # myDat = loadDataSet('testData/RT_data2.txt') + # myMat = mat(myDat) + # myTree = createTree(myMat) + + # 1. 预剪枝就是,提起设置最大误差数和最少元素数 + # myDat = loadDataSet('testData/RT_data3.txt') + # myMat = mat(myDat) + # myTree = createTree(myMat, ops=(0, 1)) + # print myTree + + # 2.后剪枝 + # myDatTest = loadDataSet('testData/RT_data3test.txt') + # myMat2Test = mat(myDatTest) + # myFinalTree = prune(myTree, myMat2Test) + # print '\n\n\n-------------------' + # print myFinalTree + + # -------- + # 模型树求解 + # myDat = loadDataSet('testData/RT_data4.txt') + # myMat = mat(myDat) + # myTree = createTree(myMat, modelLeaf, modelErr) + # print myTree + + # 回归树 VS 模型树 VS 线性回归 + trainMat = mat(loadDataSet('testData/RT_bikeSpeedVsIq_train.txt')) + testMat = mat(loadDataSet('testData/RT_bikeSpeedVsIq_test.txt')) + # 回归树 + myTree1 = createTree(trainMat, ops=(1, 20)) + print myTree1 + yHat1 = createForeCast(myTree1, testMat[:, 0]) + print "回归树:", corrcoef(yHat1, testMat[:, 1],rowvar=0)[0, 1] + + # 模型树 + myTree2 = createTree(trainMat, modelLeaf, modelErr, ops=(1, 20)) + yHat2 = createForeCast(myTree2, testMat[:, 0], modelTreeEval) + print myTree2 + print "模型树:", corrcoef(yHat2, testMat[:, 1],rowvar=0)[0, 1] + + # 线性回归 + ws, X, Y = linearSolve(trainMat) + print ws + m = len(testMat[:, 0]) + yHat3 = mat(zeros((m, 1))) + for i in range(shape(testMat)[0]): + yHat3[i] = testMat[i, 0]*ws[1, 0] + ws[0, 0] + print "线性回归:", corrcoef(yHat3, testMat[:, 1],rowvar=0)[0, 1] diff --git a/src/python/regression.py b/src/python/regression.py index de3283682..ab9978721 100644 --- a/src/python/regression.py +++ b/src/python/regression.py @@ -11,6 +11,7 @@ from numpy import * import matplotlib.pylab as plt + def loadDataSet(fileName): #general function to parse tab -delimited floats numFeat = len(open(fileName).readline().split('\t')) - 1 #get number of fields dataMat = []; labelMat = [] @@ -24,6 +25,7 @@ def loadDataSet(fileName): #general function to parse tab -delimited floats labelMat.append(float(curLine[-1])) return dataMat,labelMat + def standRegres(xArr,yArr): # >>> A.T # transpose, 转置 xMat = mat(xArr); yMat = mat(yArr).T @@ -37,6 +39,7 @@ def standRegres(xArr,yArr): ws = xTx.I * (xMat.T*yMat) # 最小二乘法求最优解 return ws + def plotBestFit(xArr, yArr, ws): xMat = mat(xArr) @@ -60,6 +63,7 @@ def plotBestFit(xArr, yArr, ws): plt.xlabel('X'); plt.ylabel('Y') plt.show() + def main1(): # w0*x0+w1*x1+w2*x2=f(x) project_dir = os.path.dirname(os.path.dirname(os.getcwd())) @@ -91,6 +95,7 @@ def lwlr(testPoint, xArr, yArr,k=1.0): ws = xTx.I * (xMat.T * (weights * yMat)) return testPoint * ws + def lwlrTest(testArr,xArr,yArr,k=1.0): #loops over all the data points and applies lwlr to each one m = shape(testArr)[0] # m*1的矩阵 @@ -101,6 +106,7 @@ def lwlrTest(testArr,xArr,yArr,k=1.0): #loops over all the data points and appl yHat[i] = lwlr(testArr[i],xArr,yArr,k) return yHat + def lwlrTestPlot(xArr, yArr, yHat): xMat = mat(xArr) @@ -123,11 +129,13 @@ def lwlrTestPlot(xArr, yArr, yHat): plt.xlabel('X'); plt.ylabel('Y') plt.show() + def main2(): # w0*x0+w1*x1+w2*x2=f(x) - project_dir = os.path.dirname(os.path.dirname(os.getcwd())) + # project_dir = os.path.dirname(os.path.dirname(os.getcwd())) # 1.收集并准备数据 - xArr, yArr = loadDataSet("%s/resources/ex0.txt" % project_dir) + # xArr, yArr = loadDataSet("%s/resources/ex0.txt" % project_dir) + xArr, yArr = loadDataSet("testData/Regression_data.txt") # print xArr, '---\n', yArr # 2.训练模型, f(x)=a1*x1+b2*x2+..+nn*xn中 (a1,b2, .., nn).T的矩阵值 yHat = lwlrTest(xArr, xArr, yArr, 0.003) @@ -136,12 +144,14 @@ def main2(): # 数据可视化 lwlrTestPlot(xArr, yArr, yHat) -if __name__=="__main__": + +if __name__ == "__main__": # 线性回归 # main1() # 局部加权线性回归 main2() + def rssError(yArr,yHatArr): #yArr and yHatArr both need to be arrays return ((yArr-yHatArr)**2).sum() diff --git a/testData/RT_bikeSpeedVsIq_test.txt b/testData/RT_bikeSpeedVsIq_test.txt new file mode 100755 index 000000000..9fbf3e1f5 --- /dev/null +++ b/testData/RT_bikeSpeedVsIq_test.txt @@ -0,0 +1,200 @@ +12.000000 121.010516 +19.000000 157.337044 +12.000000 116.031825 +15.000000 132.124872 +2.000000 52.719612 +6.000000 39.058368 +3.000000 50.757763 +20.000000 166.740333 +11.000000 115.808227 +21.000000 165.582995 +3.000000 41.956087 +3.000000 34.432370 +13.000000 116.954676 +1.000000 32.112553 +7.000000 50.380243 +7.000000 94.107791 +23.000000 188.943179 +18.000000 152.637773 +9.000000 104.122082 +18.000000 127.805226 +0.000000 83.083232 +15.000000 148.180104 +3.000000 38.480247 +8.000000 77.597839 +7.000000 75.625803 +11.000000 124.620208 +13.000000 125.186698 +5.000000 51.165922 +3.000000 31.179113 +15.000000 132.505727 +19.000000 137.978043 +9.000000 106.481123 +20.000000 172.149955 +11.000000 104.116556 +4.000000 22.457996 +20.000000 175.735047 +18.000000 165.350412 +22.000000 177.461724 +16.000000 138.672986 +17.000000 156.791788 +19.000000 150.327544 +19.000000 156.992196 +23.000000 163.624262 +8.000000 92.537227 +3.000000 32.341399 +16.000000 144.445614 +11.000000 119.985586 +16.000000 145.149335 +12.000000 113.284662 +5.000000 47.742716 +11.000000 115.852585 +3.000000 31.579325 +1.000000 43.758671 +1.000000 61.049125 +13.000000 132.751826 +23.000000 163.233087 +12.000000 115.134296 +8.000000 91.370839 +8.000000 86.137955 +14.000000 120.857934 +3.000000 33.777477 +10.000000 110.831763 +10.000000 104.174775 +20.000000 155.920696 +4.000000 30.619132 +0.000000 71.880474 +7.000000 86.399516 +7.000000 72.632906 +5.000000 58.632985 +18.000000 143.584511 +23.000000 187.059504 +6.000000 65.067119 +6.000000 69.110280 +19.000000 142.388056 +15.000000 137.174489 +21.000000 159.719092 +9.000000 102.179638 +20.000000 176.416294 +21.000000 146.516385 +18.000000 147.808343 +23.000000 154.790810 +16.000000 137.385285 +18.000000 166.885975 +15.000000 136.989000 +20.000000 144.668679 +14.000000 137.060671 +19.000000 140.468283 +11.000000 98.344084 +16.000000 132.497910 +1.000000 59.143101 +20.000000 152.299381 +13.000000 134.487271 +0.000000 77.805718 +3.000000 28.543764 +10.000000 97.751817 +4.000000 41.223659 +11.000000 110.017015 +12.000000 119.391386 +20.000000 158.872126 +2.000000 38.776222 +19.000000 150.496148 +15.000000 131.505967 +22.000000 179.856157 +13.000000 143.090102 +14.000000 142.611861 +13.000000 120.757410 +4.000000 27.929324 +16.000000 151.530849 +15.000000 148.149702 +5.000000 44.188084 +16.000000 141.135406 +12.000000 119.817665 +8.000000 80.991524 +3.000000 29.308640 +6.000000 48.203468 +8.000000 92.179834 +22.000000 162.720371 +10.000000 91.971158 +2.000000 33.481943 +8.000000 88.528612 +1.000000 54.042173 +8.000000 92.002928 +5.000000 45.614646 +3.000000 34.319635 +14.000000 129.140558 +17.000000 146.807901 +17.000000 157.694058 +4.000000 37.080929 +20.000000 169.942381 +10.000000 114.675638 +5.000000 34.913029 +14.000000 137.889747 +0.000000 79.043129 +16.000000 139.084390 +6.000000 53.340135 +13.000000 142.772612 +0.000000 73.103173 +3.000000 37.717487 +15.000000 134.116395 +18.000000 138.748257 +23.000000 180.779121 +10.000000 93.721894 +23.000000 166.958335 +6.000000 74.473589 +6.000000 73.006291 +3.000000 34.178656 +1.000000 33.395482 +22.000000 149.933384 +18.000000 154.858982 +6.000000 66.121084 +1.000000 60.816800 +5.000000 55.681020 +6.000000 61.251558 +15.000000 125.452206 +16.000000 134.310255 +19.000000 167.999681 +5.000000 40.074830 +22.000000 162.658997 +12.000000 109.473909 +4.000000 44.743405 +11.000000 122.419496 +14.000000 139.852014 +21.000000 160.045407 +15.000000 131.999358 +15.000000 135.577799 +20.000000 173.494629 +8.000000 82.497177 +12.000000 123.122032 +10.000000 97.592026 +16.000000 141.345706 +8.000000 79.588881 +3.000000 54.308878 +4.000000 36.112937 +19.000000 165.005336 +23.000000 172.198031 +15.000000 127.699625 +1.000000 47.305217 +13.000000 115.489379 +8.000000 103.956569 +4.000000 53.669477 +0.000000 76.220652 +12.000000 114.153306 +6.000000 74.608728 +3.000000 41.339299 +5.000000 21.944048 +22.000000 181.455655 +20.000000 171.691444 +10.000000 104.299002 +21.000000 168.307123 +20.000000 169.556523 +23.000000 175.960552 +1.000000 42.554778 +14.000000 137.286185 +16.000000 136.126561 +12.000000 119.269042 +6.000000 63.426977 +4.000000 27.728212 +4.000000 32.687588 +23.000000 151.153204 +15.000000 129.767331 diff --git a/testData/RT_bikeSpeedVsIq_train.txt b/testData/RT_bikeSpeedVsIq_train.txt new file mode 100755 index 000000000..638d5c70b --- /dev/null +++ b/testData/RT_bikeSpeedVsIq_train.txt @@ -0,0 +1,200 @@ +3.000000 46.852122 +23.000000 178.676107 +0.000000 86.154024 +6.000000 68.707614 +15.000000 139.737693 +17.000000 141.988903 +12.000000 94.477135 +8.000000 86.083788 +9.000000 97.265824 +7.000000 80.400027 +8.000000 83.414554 +1.000000 52.525471 +16.000000 127.060008 +9.000000 101.639269 +14.000000 146.412680 +15.000000 144.157101 +17.000000 152.699910 +19.000000 136.669023 +21.000000 166.971736 +21.000000 165.467251 +3.000000 38.455193 +6.000000 75.557721 +4.000000 22.171763 +5.000000 50.321915 +0.000000 74.412428 +5.000000 42.052392 +1.000000 42.489057 +14.000000 139.185416 +21.000000 140.713725 +5.000000 63.222944 +5.000000 56.294626 +9.000000 91.674826 +22.000000 173.497655 +17.000000 152.692482 +9.000000 113.920633 +1.000000 51.552411 +9.000000 100.075315 +16.000000 137.803868 +18.000000 135.925777 +3.000000 45.550762 +16.000000 149.933224 +2.000000 27.914173 +6.000000 62.103546 +20.000000 173.942381 +12.000000 119.200505 +6.000000 70.730214 +16.000000 156.260832 +15.000000 132.467643 +19.000000 161.164086 +17.000000 138.031844 +23.000000 169.747881 +11.000000 116.761920 +4.000000 34.305905 +6.000000 68.841160 +10.000000 119.535227 +20.000000 158.104763 +18.000000 138.390511 +5.000000 59.375794 +7.000000 80.802300 +11.000000 108.611485 +10.000000 91.169028 +15.000000 154.104819 +5.000000 51.100287 +3.000000 32.334330 +15.000000 150.551655 +10.000000 111.023073 +0.000000 87.489950 +2.000000 46.726299 +7.000000 92.540440 +15.000000 135.715438 +19.000000 152.960552 +19.000000 162.789223 +21.000000 167.176240 +22.000000 164.323358 +12.000000 104.823071 +1.000000 35.554328 +11.000000 114.784640 +1.000000 36.819570 +12.000000 130.266826 +12.000000 126.053312 +18.000000 153.378289 +7.000000 70.089159 +15.000000 139.528624 +19.000000 157.137999 +23.000000 183.595248 +7.000000 73.431043 +11.000000 128.176167 +22.000000 183.181247 +13.000000 112.685801 +18.000000 161.634783 +6.000000 63.169478 +7.000000 63.393975 +19.000000 165.779578 +14.000000 143.973398 +22.000000 185.131852 +3.000000 45.275591 +6.000000 62.018003 +0.000000 83.193398 +7.000000 76.847802 +19.000000 147.087386 +7.000000 62.812086 +1.000000 49.910068 +11.000000 102.169335 +11.000000 105.108121 +6.000000 63.429817 +12.000000 121.301542 +17.000000 163.253962 +13.000000 119.588698 +0.000000 87.333807 +20.000000 144.484066 +21.000000 168.792482 +23.000000 159.751246 +20.000000 162.843592 +14.000000 145.664069 +19.000000 146.838515 +12.000000 132.049377 +18.000000 155.756119 +22.000000 155.686345 +7.000000 73.913958 +1.000000 66.761881 +7.000000 65.855450 +6.000000 56.271026 +19.000000 155.308523 +12.000000 124.372873 +17.000000 136.025960 +14.000000 132.996861 +21.000000 172.639791 +17.000000 135.672594 +8.000000 90.323742 +5.000000 62.462698 +16.000000 159.048794 +14.000000 139.991227 +3.000000 37.026678 +9.000000 100.839901 +9.000000 93.097395 +15.000000 123.645221 +15.000000 147.327185 +1.000000 40.055830 +0.000000 88.192829 +17.000000 139.174517 +22.000000 169.354493 +17.000000 136.354272 +9.000000 90.692829 +7.000000 63.987997 +14.000000 128.972231 +10.000000 108.433394 +2.000000 49.321034 +19.000000 171.615671 +9.000000 97.894855 +0.000000 68.962453 +9.000000 72.063371 +22.000000 157.000070 +12.000000 114.461754 +6.000000 58.239465 +9.000000 104.601048 +8.000000 90.772359 +22.000000 164.428791 +5.000000 34.804083 +5.000000 37.089459 +22.000000 177.987605 +10.000000 89.439608 +6.000000 70.711362 +23.000000 181.731482 +20.000000 151.538932 +7.000000 66.067228 +6.000000 61.565125 +20.000000 184.441687 +9.000000 91.569158 +9.000000 98.833425 +17.000000 144.352866 +9.000000 94.498314 +15.000000 121.922732 +18.000000 166.408274 +10.000000 89.571299 +8.000000 75.373772 +22.000000 161.001478 +8.000000 90.594227 +5.000000 57.180933 +20.000000 161.643007 +8.000000 87.197370 +8.000000 95.584308 +15.000000 126.207221 +7.000000 84.528209 +18.000000 161.056986 +10.000000 86.762615 +1.000000 33.325906 +9.000000 105.095502 +2.000000 22.440421 +9.000000 93.449284 +14.000000 106.249595 +21.000000 163.254385 +22.000000 161.746628 +20.000000 152.973085 +17.000000 122.918987 +7.000000 58.536412 +1.000000 45.013277 +13.000000 137.294148 +10.000000 88.123737 +2.000000 45.847376 +20.000000 163.385797 diff --git a/testData/RT_data3.txt b/testData/RT_data3.txt new file mode 100755 index 000000000..daf5acd56 --- /dev/null +++ b/testData/RT_data3.txt @@ -0,0 +1,200 @@ +0.228628 -2.266273 +0.965969 112.386764 +0.342761 -31.584855 +0.901444 87.300625 +0.585413 125.295113 +0.334900 18.976650 +0.769043 64.041941 +0.297107 -1.798377 +0.901421 100.133819 +0.176523 0.946348 +0.710234 108.553919 +0.981980 86.399637 +0.085873 -10.137104 +0.537834 90.995536 +0.806158 62.877698 +0.708890 135.416767 +0.787755 118.642009 +0.463241 17.171057 +0.300318 -18.051318 +0.815215 118.319942 +0.139880 7.336784 +0.068373 -15.160836 +0.457563 -34.044555 +0.665652 105.547997 +0.084661 -24.132226 +0.954711 100.935789 +0.953902 130.926480 +0.487381 27.729263 +0.759504 81.106762 +0.454312 -20.360067 +0.295993 -14.988279 +0.156067 7.557349 +0.428582 15.224266 +0.847219 76.240984 +0.499171 11.924204 +0.203993 -22.379119 +0.548539 83.114502 +0.790312 110.159730 +0.937766 119.949824 +0.218321 1.410768 +0.223200 15.501642 +0.896683 107.001620 +0.582311 82.589328 +0.698920 92.470636 +0.823848 59.342323 +0.385021 24.816941 +0.061219 6.695567 +0.841547 115.669032 +0.763328 115.199195 +0.934853 115.753994 +0.222271 -9.255852 +0.217214 -3.958752 +0.706961 106.180427 +0.888426 94.896354 +0.549814 137.267576 +0.107960 -1.293195 +0.085111 37.820659 +0.388789 21.578007 +0.467383 -9.712925 +0.623909 87.181863 +0.373501 -8.228297 +0.513332 101.075609 +0.350725 -40.086564 +0.716211 103.345308 +0.731636 73.912028 +0.273863 -9.457556 +0.211633 -8.332207 +0.944221 100.120253 +0.053764 -13.731698 +0.126833 22.891675 +0.952833 100.649591 +0.391609 3.001104 +0.560301 82.903945 +0.124723 -1.402796 +0.465680 -23.777531 +0.699873 115.586605 +0.164134 -27.405211 +0.455761 9.841938 +0.508542 96.403373 +0.138619 -29.087463 +0.335182 2.768225 +0.908629 118.513475 +0.546601 96.319043 +0.378965 13.583555 +0.968621 98.648346 +0.637999 91.656617 +0.350065 -1.319852 +0.632691 93.645293 +0.936524 65.548418 +0.310956 -49.939516 +0.437652 19.745224 +0.166765 -14.740059 +0.571214 114.872056 +0.952377 73.520802 +0.665329 121.980607 +0.258070 -20.425137 +0.912161 85.005351 +0.777582 100.838446 +0.642707 82.500766 +0.885676 108.045948 +0.080061 2.229873 +0.039914 11.220099 +0.958512 135.837013 +0.377383 5.241196 +0.661073 115.687524 +0.454375 3.043912 +0.412516 -26.419289 +0.854970 89.209930 +0.698472 120.521925 +0.465561 30.051931 +0.328890 39.783113 +0.309133 8.814725 +0.418943 44.161493 +0.553797 120.857321 +0.799873 91.368473 +0.811363 112.981216 +0.785574 107.024467 +0.949198 105.752508 +0.666452 120.014736 +0.652462 112.715799 +0.290749 -14.391613 +0.508548 93.292829 +0.680486 110.367074 +0.356790 -19.526539 +0.199903 -3.372472 +0.264926 5.280579 +0.166431 -6.512506 +0.370042 -32.124495 +0.628061 117.628346 +0.228473 19.425158 +0.044737 3.855393 +0.193282 18.208423 +0.519150 116.176162 +0.351478 -0.461116 +0.872199 111.552716 +0.115150 13.795828 +0.324274 -13.189243 +0.446196 -5.108172 +0.613004 168.180746 +0.533511 129.766743 +0.740859 93.773929 +0.667851 92.449664 +0.900699 109.188248 +0.599142 130.378529 +0.232802 1.222318 +0.838587 134.089674 +0.284794 35.623746 +0.130626 -39.524461 +0.642373 140.613941 +0.786865 100.598825 +0.403228 -1.729244 +0.883615 95.348184 +0.910975 106.814667 +0.819722 70.054508 +0.798198 76.853728 +0.606417 93.521396 +0.108801 -16.106164 +0.318309 -27.605424 +0.856421 107.166848 +0.842940 95.893131 +0.618868 76.917665 +0.531944 124.795495 +0.028546 -8.377094 +0.915263 96.717610 +0.925782 92.074619 +0.624827 105.970743 +0.331364 -1.290825 +0.341700 -23.547711 +0.342155 -16.930416 +0.729397 110.902830 +0.640515 82.713621 +0.228751 -30.812912 +0.948822 69.318649 +0.706390 105.062147 +0.079632 29.420068 +0.451087 -28.724685 +0.833026 76.723835 +0.589806 98.674874 +0.426711 -21.594268 +0.872883 95.887712 +0.866451 94.402102 +0.960398 123.559747 +0.483803 5.224234 +0.811602 99.841379 +0.757527 63.549854 +0.569327 108.435392 +0.841625 60.552308 +0.264639 2.557923 +0.202161 -1.983889 +0.055862 -3.131497 +0.543843 98.362010 +0.689099 112.378209 +0.956951 82.016541 +0.382037 -29.007783 +0.131833 22.478291 +0.156273 0.225886 +0.000256 9.668106 +0.892999 82.436686 +0.206207 -12.619036 +0.487537 5.149336 diff --git a/testData/RT_data3test.txt b/testData/RT_data3test.txt new file mode 100755 index 000000000..80880d1f8 --- /dev/null +++ b/testData/RT_data3test.txt @@ -0,0 +1,200 @@ +0.421862 10.830241 +0.105349 -2.241611 +0.155196 21.872976 +0.161152 2.015418 +0.382632 -38.778979 +0.017710 20.109113 +0.129656 15.266887 +0.613926 111.900063 +0.409277 1.874731 +0.807556 111.223754 +0.593722 133.835486 +0.953239 110.465070 +0.257402 15.332899 +0.645385 93.983054 +0.563460 93.645277 +0.408338 -30.719878 +0.874394 91.873505 +0.263805 -0.192752 +0.411198 10.751118 +0.449884 9.211901 +0.646315 113.533660 +0.673718 125.135638 +0.805148 113.300462 +0.759327 72.668572 +0.519172 82.131698 +0.741031 106.777146 +0.030937 9.859127 +0.268848 -34.137955 +0.474901 -11.201301 +0.588266 120.501998 +0.893936 142.826476 +0.870990 105.751746 +0.430763 39.146258 +0.057665 15.371897 +0.100076 9.131761 +0.980716 116.145896 +0.235289 -13.691224 +0.228098 16.089151 +0.622248 99.345551 +0.401467 -1.694383 +0.960334 110.795415 +0.031214 -5.330042 +0.504228 96.003525 +0.779660 75.921582 +0.504496 101.341462 +0.850974 96.293064 +0.701119 102.333839 +0.191551 5.072326 +0.667116 92.310019 +0.555584 80.367129 +0.680006 132.965442 +0.393899 38.605283 +0.048940 -9.861871 +0.963282 115.407485 +0.655496 104.269918 +0.576463 141.127267 +0.675708 96.227996 +0.853457 114.252288 +0.003933 -12.182861 +0.549512 97.927224 +0.218967 -4.712462 +0.659972 120.950439 +0.008256 8.026816 +0.099500 -14.318434 +0.352215 -3.747546 +0.874926 89.247356 +0.635084 99.496059 +0.039641 14.147109 +0.665111 103.298719 +0.156583 -2.540703 +0.648843 119.333019 +0.893237 95.209585 +0.128807 5.558479 +0.137438 5.567685 +0.630538 98.462792 +0.296084 -41.799438 +0.632099 84.895098 +0.987681 106.726447 +0.744909 111.279705 +0.862030 104.581156 +0.080649 -7.679985 +0.831277 59.053356 +0.198716 26.878801 +0.860932 90.632930 +0.883250 92.759595 +0.818003 110.272219 +0.949216 115.200237 +0.460078 -35.957981 +0.561077 93.545761 +0.863767 114.125786 +0.476891 -29.774060 +0.537826 81.587922 +0.686224 110.911198 +0.982327 119.114523 +0.944453 92.033481 +0.078227 30.216873 +0.782937 92.588646 +0.465886 2.222139 +0.885024 90.247890 +0.186077 7.144415 +0.915828 84.010074 +0.796649 115.572156 +0.127821 28.933688 +0.433429 6.782575 +0.946796 108.574116 +0.386915 -17.404601 +0.561192 92.142700 +0.182490 10.764616 +0.878792 95.289476 +0.381342 -6.177464 +0.358474 -11.731754 +0.270647 13.793201 +0.488904 -17.641832 +0.106773 5.684757 +0.270112 4.335675 +0.754985 75.860433 +0.585174 111.640154 +0.458821 12.029692 +0.218017 -26.234872 +0.583887 99.413850 +0.923626 107.802298 +0.833620 104.179678 +0.870691 93.132591 +0.249896 -8.618404 +0.748230 109.160652 +0.019365 34.048884 +0.837588 101.239275 +0.529251 115.514729 +0.742898 67.038771 +0.522034 64.160799 +0.498982 3.983061 +0.479439 24.355908 +0.314834 -14.256200 +0.753251 85.017092 +0.479362 -17.480446 +0.950593 99.072784 +0.718623 58.080256 +0.218720 -19.605593 +0.664113 94.437159 +0.942900 131.725134 +0.314226 18.904871 +0.284509 11.779346 +0.004962 -14.624176 +0.224087 -50.547649 +0.974331 112.822725 +0.894610 112.863995 +0.167350 0.073380 +0.753644 105.024456 +0.632241 108.625812 +0.314189 -6.090797 +0.965527 87.418343 +0.820919 94.610538 +0.144107 -4.748387 +0.072556 -5.682008 +0.002447 29.685714 +0.851007 79.632376 +0.458024 -12.326026 +0.627503 139.458881 +0.422259 -29.827405 +0.714659 63.480271 +0.672320 93.608554 +0.498592 37.112975 +0.698906 96.282845 +0.861441 99.699230 +0.112425 -12.419909 +0.164784 5.244704 +0.481531 -18.070497 +0.375482 1.779411 +0.089325 -14.216755 +0.036609 -6.264372 +0.945004 54.723563 +0.136608 14.970936 +0.292285 -41.723711 +0.029195 -0.660279 +0.998307 100.124230 +0.303928 -5.492264 +0.957863 117.824392 +0.815089 113.377704 +0.466399 -10.249874 +0.876693 115.617275 +0.536121 102.997087 +0.373984 -37.359936 +0.565162 74.967476 +0.085412 -21.449563 +0.686411 64.859620 +0.908752 107.983366 +0.982829 98.005424 +0.052766 -42.139502 +0.777552 91.899340 +0.374316 -3.522501 +0.060231 10.008227 +0.526225 87.317722 +0.583872 67.104433 +0.238276 10.615159 +0.678747 60.624273 +0.067649 15.947398 +0.530182 105.030933 +0.869389 104.969996 +0.698410 75.460417 +0.549430 82.558068 diff --git a/testData/RT_data4.txt b/testData/RT_data4.txt new file mode 100755 index 000000000..b9a4a34d5 --- /dev/null +++ b/testData/RT_data4.txt @@ -0,0 +1,200 @@ +0.070670 3.470829 +0.534076 6.377132 +0.747221 8.949407 +0.668970 8.034081 +0.586082 6.997721 +0.764962 9.318110 +0.658125 7.880333 +0.346734 4.213359 +0.313967 3.762496 +0.601418 7.188805 +0.404396 4.893403 +0.154345 3.683175 +0.984061 11.712928 +0.597514 7.146694 +0.005144 3.333150 +0.142295 3.743681 +0.280007 3.737376 +0.542008 6.494275 +0.466781 5.532255 +0.706970 8.476718 +0.191038 3.673921 +0.756591 9.176722 +0.912879 10.850358 +0.524701 6.067444 +0.306090 3.681148 +0.429009 5.032168 +0.695091 8.209058 +0.984495 11.909595 +0.702748 8.298454 +0.551771 6.715210 +0.272894 3.983313 +0.014611 3.559081 +0.699852 8.417306 +0.309710 3.739053 +0.444877 5.219649 +0.717509 8.483072 +0.576550 6.894860 +0.284200 3.792626 +0.675922 8.067282 +0.304401 3.671373 +0.233675 3.795962 +0.453779 5.477533 +0.900938 10.701447 +0.502418 6.046703 +0.781843 9.254690 +0.226271 3.546938 +0.619535 7.703312 +0.519998 6.202835 +0.399447 4.934647 +0.785298 9.497564 +0.010767 3.565835 +0.696399 8.307487 +0.524366 6.266060 +0.396583 4.611390 +0.059988 3.484805 +0.946702 11.263118 +0.417559 4.895128 +0.609194 7.239316 +0.730687 8.858371 +0.586694 7.061601 +0.829567 9.937968 +0.964229 11.521595 +0.276813 3.756406 +0.987041 11.947913 +0.876107 10.440538 +0.747582 8.942278 +0.117348 3.567821 +0.188617 3.976420 +0.416655 4.928907 +0.192995 3.978365 +0.244888 3.777018 +0.806349 9.685831 +0.417555 4.990148 +0.233805 3.740022 +0.357325 4.325355 +0.190201 3.638493 +0.705127 8.432886 +0.336599 3.868493 +0.473786 5.871813 +0.384794 4.830712 +0.502217 6.117244 +0.788220 9.454959 +0.478773 5.681631 +0.064296 3.642040 +0.332143 3.886628 +0.618869 7.312725 +0.854981 10.306697 +0.570000 6.764615 +0.512739 6.166836 +0.112285 3.545863 +0.723700 8.526944 +0.192256 3.661033 +0.181268 3.678579 +0.196731 3.916622 +0.510342 6.026652 +0.263713 3.723018 +0.141105 3.529595 +0.150262 3.552314 +0.824724 9.973690 +0.588088 6.893128 +0.411291 4.856380 +0.763717 9.199101 +0.212118 3.740024 +0.264587 3.742917 +0.973524 11.683243 +0.250670 3.679117 +0.823460 9.743861 +0.253752 3.781488 +0.838332 10.172180 +0.501156 6.113263 +0.097275 3.472367 +0.667199 7.948868 +0.487320 6.022060 +0.654640 7.809457 +0.906907 10.775188 +0.821941 9.936140 +0.859396 10.428255 +0.078696 3.490510 +0.938092 11.252471 +0.998868 11.863062 +0.025501 3.515624 +0.451806 5.441171 +0.883872 10.498912 +0.583567 6.912334 +0.823688 10.003723 +0.891032 10.818109 +0.879259 10.639263 +0.163007 3.662715 +0.344263 4.169705 +0.796083 9.422591 +0.903683 10.978834 +0.050129 3.575105 +0.605553 7.306014 +0.628951 7.556742 +0.877052 10.444055 +0.829402 9.856432 +0.121422 3.638276 +0.721517 8.663569 +0.066532 3.673471 +0.996587 11.782002 +0.653384 7.804568 +0.739494 8.817809 +0.640341 7.636812 +0.337828 3.971613 +0.220512 3.713645 +0.368815 4.381696 +0.782509 9.349428 +0.645825 7.790882 +0.277391 3.834258 +0.092569 3.643274 +0.284320 3.609353 +0.344465 4.023259 +0.182523 3.749195 +0.385001 4.426970 +0.747609 8.966676 +0.188907 3.711018 +0.806244 9.610438 +0.014211 3.517818 +0.574813 7.040672 +0.714500 8.525624 +0.538982 6.393940 +0.384638 4.649362 +0.915586 10.936577 +0.883513 10.441493 +0.804148 9.742851 +0.466011 5.833439 +0.800574 9.638874 +0.654980 8.028558 +0.348564 4.064616 +0.978595 11.720218 +0.915906 10.833902 +0.285477 3.818961 +0.988631 11.684010 +0.531069 6.305005 +0.181658 3.806995 +0.039657 3.356861 +0.893344 10.776799 +0.355214 4.263666 +0.783508 9.475445 +0.039768 3.429691 +0.546308 6.472749 +0.786882 9.398951 +0.168282 3.564189 +0.374900 4.399040 +0.737767 8.888536 +0.059849 3.431537 +0.861891 10.246888 +0.597578 7.112627 +0.126050 3.611641 +0.074795 3.609222 +0.634401 7.627416 +0.831633 9.926548 +0.019095 3.470285 +0.396533 4.773104 +0.794973 9.492009 +0.889088 10.420003 +0.003174 3.587139 +0.176767 3.554071 +0.943730 11.227731 +0.758564 8.885337 diff --git a/testData/Regression_data.txt b/testData/Regression_data.txt new file mode 100755 index 000000000..ad0df51b2 --- /dev/null +++ b/testData/Regression_data.txt @@ -0,0 +1,200 @@ +1.000000 0.067732 3.176513 +1.000000 0.427810 3.816464 +1.000000 0.995731 4.550095 +1.000000 0.738336 4.256571 +1.000000 0.981083 4.560815 +1.000000 0.526171 3.929515 +1.000000 0.378887 3.526170 +1.000000 0.033859 3.156393 +1.000000 0.132791 3.110301 +1.000000 0.138306 3.149813 +1.000000 0.247809 3.476346 +1.000000 0.648270 4.119688 +1.000000 0.731209 4.282233 +1.000000 0.236833 3.486582 +1.000000 0.969788 4.655492 +1.000000 0.607492 3.965162 +1.000000 0.358622 3.514900 +1.000000 0.147846 3.125947 +1.000000 0.637820 4.094115 +1.000000 0.230372 3.476039 +1.000000 0.070237 3.210610 +1.000000 0.067154 3.190612 +1.000000 0.925577 4.631504 +1.000000 0.717733 4.295890 +1.000000 0.015371 3.085028 +1.000000 0.335070 3.448080 +1.000000 0.040486 3.167440 +1.000000 0.212575 3.364266 +1.000000 0.617218 3.993482 +1.000000 0.541196 3.891471 +1.000000 0.045353 3.143259 +1.000000 0.126762 3.114204 +1.000000 0.556486 3.851484 +1.000000 0.901144 4.621899 +1.000000 0.958476 4.580768 +1.000000 0.274561 3.620992 +1.000000 0.394396 3.580501 +1.000000 0.872480 4.618706 +1.000000 0.409932 3.676867 +1.000000 0.908969 4.641845 +1.000000 0.166819 3.175939 +1.000000 0.665016 4.264980 +1.000000 0.263727 3.558448 +1.000000 0.231214 3.436632 +1.000000 0.552928 3.831052 +1.000000 0.047744 3.182853 +1.000000 0.365746 3.498906 +1.000000 0.495002 3.946833 +1.000000 0.493466 3.900583 +1.000000 0.792101 4.238522 +1.000000 0.769660 4.233080 +1.000000 0.251821 3.521557 +1.000000 0.181951 3.203344 +1.000000 0.808177 4.278105 +1.000000 0.334116 3.555705 +1.000000 0.338630 3.502661 +1.000000 0.452584 3.859776 +1.000000 0.694770 4.275956 +1.000000 0.590902 3.916191 +1.000000 0.307928 3.587961 +1.000000 0.148364 3.183004 +1.000000 0.702180 4.225236 +1.000000 0.721544 4.231083 +1.000000 0.666886 4.240544 +1.000000 0.124931 3.222372 +1.000000 0.618286 4.021445 +1.000000 0.381086 3.567479 +1.000000 0.385643 3.562580 +1.000000 0.777175 4.262059 +1.000000 0.116089 3.208813 +1.000000 0.115487 3.169825 +1.000000 0.663510 4.193949 +1.000000 0.254884 3.491678 +1.000000 0.993888 4.533306 +1.000000 0.295434 3.550108 +1.000000 0.952523 4.636427 +1.000000 0.307047 3.557078 +1.000000 0.277261 3.552874 +1.000000 0.279101 3.494159 +1.000000 0.175724 3.206828 +1.000000 0.156383 3.195266 +1.000000 0.733165 4.221292 +1.000000 0.848142 4.413372 +1.000000 0.771184 4.184347 +1.000000 0.429492 3.742878 +1.000000 0.162176 3.201878 +1.000000 0.917064 4.648964 +1.000000 0.315044 3.510117 +1.000000 0.201473 3.274434 +1.000000 0.297038 3.579622 +1.000000 0.336647 3.489244 +1.000000 0.666109 4.237386 +1.000000 0.583888 3.913749 +1.000000 0.085031 3.228990 +1.000000 0.687006 4.286286 +1.000000 0.949655 4.628614 +1.000000 0.189912 3.239536 +1.000000 0.844027 4.457997 +1.000000 0.333288 3.513384 +1.000000 0.427035 3.729674 +1.000000 0.466369 3.834274 +1.000000 0.550659 3.811155 +1.000000 0.278213 3.598316 +1.000000 0.918769 4.692514 +1.000000 0.886555 4.604859 +1.000000 0.569488 3.864912 +1.000000 0.066379 3.184236 +1.000000 0.335751 3.500796 +1.000000 0.426863 3.743365 +1.000000 0.395746 3.622905 +1.000000 0.694221 4.310796 +1.000000 0.272760 3.583357 +1.000000 0.503495 3.901852 +1.000000 0.067119 3.233521 +1.000000 0.038326 3.105266 +1.000000 0.599122 3.865544 +1.000000 0.947054 4.628625 +1.000000 0.671279 4.231213 +1.000000 0.434811 3.791149 +1.000000 0.509381 3.968271 +1.000000 0.749442 4.253910 +1.000000 0.058014 3.194710 +1.000000 0.482978 3.996503 +1.000000 0.466776 3.904358 +1.000000 0.357767 3.503976 +1.000000 0.949123 4.557545 +1.000000 0.417320 3.699876 +1.000000 0.920461 4.613614 +1.000000 0.156433 3.140401 +1.000000 0.656662 4.206717 +1.000000 0.616418 3.969524 +1.000000 0.853428 4.476096 +1.000000 0.133295 3.136528 +1.000000 0.693007 4.279071 +1.000000 0.178449 3.200603 +1.000000 0.199526 3.299012 +1.000000 0.073224 3.209873 +1.000000 0.286515 3.632942 +1.000000 0.182026 3.248361 +1.000000 0.621523 3.995783 +1.000000 0.344584 3.563262 +1.000000 0.398556 3.649712 +1.000000 0.480369 3.951845 +1.000000 0.153350 3.145031 +1.000000 0.171846 3.181577 +1.000000 0.867082 4.637087 +1.000000 0.223855 3.404964 +1.000000 0.528301 3.873188 +1.000000 0.890192 4.633648 +1.000000 0.106352 3.154768 +1.000000 0.917886 4.623637 +1.000000 0.014855 3.078132 +1.000000 0.567682 3.913596 +1.000000 0.068854 3.221817 +1.000000 0.603535 3.938071 +1.000000 0.532050 3.880822 +1.000000 0.651362 4.176436 +1.000000 0.901225 4.648161 +1.000000 0.204337 3.332312 +1.000000 0.696081 4.240614 +1.000000 0.963924 4.532224 +1.000000 0.981390 4.557105 +1.000000 0.987911 4.610072 +1.000000 0.990947 4.636569 +1.000000 0.736021 4.229813 +1.000000 0.253574 3.500860 +1.000000 0.674722 4.245514 +1.000000 0.939368 4.605182 +1.000000 0.235419 3.454340 +1.000000 0.110521 3.180775 +1.000000 0.218023 3.380820 +1.000000 0.869778 4.565020 +1.000000 0.196830 3.279973 +1.000000 0.958178 4.554241 +1.000000 0.972673 4.633520 +1.000000 0.745797 4.281037 +1.000000 0.445674 3.844426 +1.000000 0.470557 3.891601 +1.000000 0.549236 3.849728 +1.000000 0.335691 3.492215 +1.000000 0.884739 4.592374 +1.000000 0.918916 4.632025 +1.000000 0.441815 3.756750 +1.000000 0.116598 3.133555 +1.000000 0.359274 3.567919 +1.000000 0.814811 4.363382 +1.000000 0.387125 3.560165 +1.000000 0.982243 4.564305 +1.000000 0.780880 4.215055 +1.000000 0.652565 4.174999 +1.000000 0.870030 4.586640 +1.000000 0.604755 3.960008 +1.000000 0.255212 3.529963 +1.000000 0.730546 4.213412 +1.000000 0.493829 3.908685 +1.000000 0.257017 3.585821 +1.000000 0.833735 4.374394 +1.000000 0.070095 3.213817 +1.000000 0.527070 3.952681 +1.000000 0.116163 3.129283 From 707feca941a249d134c262f39cd4e3af07bb71b2 Mon Sep 17 00:00:00 2001 From: geekidentity Date: Wed, 8 Mar 2017 08:30:24 +0800 Subject: [PATCH 39/92] =?UTF-8?q?=E6=9C=BA=E5=99=A8=E5=AD=A6=E4=B9=A0?= =?UTF-8?q?=E7=9A=84=E4=BB=BB=E5=8A=A1?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...\231\250\345\255\246\344\271\240\345\237\272\347\241\200.md" | 2 ++ 1 file changed, 2 insertions(+) diff --git "a/docs/1.\346\234\272\345\231\250\345\255\246\344\271\240\345\237\272\347\241\200.md" "b/docs/1.\346\234\272\345\231\250\345\255\246\344\271\240\345\237\272\347\241\200.md" index d4e74a543..ee1c06e62 100644 --- "a/docs/1.\346\234\272\345\231\250\345\255\246\344\271\240\345\237\272\347\241\200.md" +++ "b/docs/1.\346\234\272\345\231\250\345\255\246\344\271\240\345\237\272\347\241\200.md" @@ -5,6 +5,8 @@ * 把无序的数据转换成有用的信息。 * 机器学习的意义 * 我们利用计算机来彰显数据背后的真实含义。 +* 机器学习的任务 + * 机器学习的主要任务就是分类。 * 监督学习 * 样本集:训练数据 + 测试数据 * 特征(feature-是否有缺失情况) + 目标变量(分类-离散值/回归-连续值<0~100、 -999~999>) From 5eefc6b53b290f440d097a46903d681e0e09f64f Mon Sep 17 00:00:00 2001 From: jiangzhonglian Date: Wed, 8 Mar 2017 18:31:17 +0800 Subject: [PATCH 40/92] =?UTF-8?q?Tkinter=E5=92=8Cmatplotlib=E9=9B=86?= =?UTF-8?q?=E6=88=90=E7=9A=84=E5=8F=AF=E8=A7=86=E5=8C=96=E6=B5=8B=E8=AF=95?= =?UTF-8?q?=E6=88=90=E5=8A=9F?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...9.\346\240\221\345\233\236\345\275\222.md" | 3 + src/python/09.RegTrees/treeExplore.py | 123 +++++++++++ testData/RT_sine.txt | 200 ++++++++++++++++++ 3 files changed, 326 insertions(+) create mode 100644 src/python/09.RegTrees/treeExplore.py create mode 100644 testData/RT_sine.txt diff --git "a/docs/9.\346\240\221\345\233\236\345\275\222.md" "b/docs/9.\346\240\221\345\233\236\345\275\222.md" index f695bff5b..ec01f7db9 100644 --- "a/docs/9.\346\240\221\345\233\236\345\275\222.md" +++ "b/docs/9.\346\240\221\345\233\236\345\275\222.md" @@ -11,3 +11,6 @@ * 那么问题来了,如何计算连续型数值的混乱度呢? * `误差`:也就是计算平均差的总值(总方差=方差*样本数) * 二元切分方式 +* 回归树 +* 模型树(线性模型) +* 树回归方法在预测复杂数据时 会比 简单的线性模型 更有效。 diff --git a/src/python/09.RegTrees/treeExplore.py b/src/python/09.RegTrees/treeExplore.py new file mode 100644 index 000000000..26fd9a8bf --- /dev/null +++ b/src/python/09.RegTrees/treeExplore.py @@ -0,0 +1,123 @@ +#!/usr/bin/python +# coding:utf8 + +''' +Created on 2017-03-08 +Update on 2017-03-08 +Tree-Based Regression Methods Source Code for Machine Learning in Action Ch. 9 +@author: jiangzhonglian +''' +from Tkinter import * +from numpy import * +import regTrees + +import matplotlib +matplotlib.use('TkAgg') +from matplotlib.backends.backend_tkagg import FigureCanvasTkAgg +from matplotlib.figure import Figure + + +def test_widget_text(root): + mylabel = Label(root, text="helloworld") + # 相当于告诉 布局管理器(Geometry Manager),如果不设定位置,默认在 0行0列的位置 + mylabel.grid() + + +# 最大为误差, 最大子叶节点的数量 +def reDraw(tolS, tolN): + # clear the figure + reDraw.f.clf() + reDraw.a = reDraw.f.add_subplot(111) + + # 检查复选框是否选中 + if chkBtnVar.get(): + if tolN < 2: + tolN = 2 + myTree = regTrees.createTree(reDraw.rawDat, regTrees.modelLeaf, regTrees.modelErr, (tolS, tolN)) + yHat = regTrees.createForeCast(myTree, reDraw.testDat, regTrees.modelTreeEval) + else: + myTree = regTrees.createTree(reDraw.rawDat, ops=(tolS, tolN)) + yHat = regTrees.createForeCast(myTree, reDraw.testDat) + + # use scatter for data set + reDraw.a.scatter(reDraw.rawDat[:, 0], reDraw.rawDat[:, 1], s=5) + # use plot for yHat + reDraw.a.plot(reDraw.testDat, yHat, linewidth=2.0, c='red') + reDraw.canvas.show() + + +def getInputs(): + try: + tolN = int(tolNentry.get()) + except: + tolN = 10 + print "enter Integer for tolN" + tolNentry.delete(0, END) + tolNentry.insert(0, '10') + try: + tolS = float(tolSentry.get()) + except: + tolS = 1.0 + print "enter Float for tolS" + tolSentry.delete(0, END) + tolSentry.insert(0, '1.0') + return tolN, tolS + + +# 画新的tree +def drawNewTree(): + # #get values from Entry boxes + tolN, tolS = getInputs() + reDraw(tolS, tolN) + + +def main(root): + # 标题 + Label(root, text="Plot Place Holder").grid(row=0, columnspan=3) + # 输入栏1, 叶子的数量 + Label(root, text="tolN").grid(row=1, column=0) + global tolNentry + tolNentry = Entry(root) + tolNentry.grid(row=1, column=1) + tolNentry.insert(0, '10') + # 输入栏2, 误差量 + Label(root, text="tolS").grid(row=2, column=0) + global tolSentry + tolSentry = Entry(root) + tolSentry.grid(row=2, column=1) + # 设置输出值 + tolSentry.insert(0,'1.0') + + # 设置提交的按钮 + Button(root, text="确定", command=drawNewTree).grid(row=1, column=2, rowspan=3) + + # 设置复选按钮 + global chkBtnVar + chkBtnVar = IntVar() + chkBtn = Checkbutton(root, text="Model Tree", variable = chkBtnVar) + chkBtn.grid(row=3, column=0, columnspan=2) + + # 退出按钮 + Button(root, text="退出", fg="black", command=quit).grid(row=1, column=2) + + + # 创建一个画板 canvas + reDraw.f = Figure(figsize=(5, 4), dpi=100) + reDraw.canvas = FigureCanvasTkAgg(reDraw.f, master=root) + reDraw.canvas.show() + reDraw.canvas.get_tk_widget().grid(row=0, columnspan=3) + + reDraw.rawDat = mat(regTrees.loadDataSet('testData/RT_sine.txt')) + reDraw.testDat = arange(min(reDraw.rawDat[:, 0]), max(reDraw.rawDat[:, 0]), 0.01) + reDraw(1.0, 10) + + +if __name__ == "__main__": + + # 创建一个事件 + root = Tk() + # test_widget_text(root) + main(root) + + # 启动事件循环 + root.mainloop() diff --git a/testData/RT_sine.txt b/testData/RT_sine.txt new file mode 100644 index 000000000..e7050f374 --- /dev/null +++ b/testData/RT_sine.txt @@ -0,0 +1,200 @@ +0.190350 0.878049 +0.306657 -0.109413 +0.017568 0.030917 +0.122328 0.951109 +0.076274 0.774632 +0.614127 -0.250042 +0.220722 0.807741 +0.089430 0.840491 +0.278817 0.342210 +0.520287 -0.950301 +0.726976 0.852224 +0.180485 1.141859 +0.801524 1.012061 +0.474273 -1.311226 +0.345116 -0.319911 +0.981951 -0.374203 +0.127349 1.039361 +0.757120 1.040152 +0.345419 -0.429760 +0.314532 -0.075762 +0.250828 0.657169 +0.431255 -0.905443 +0.386669 -0.508875 +0.143794 0.844105 +0.470839 -0.951757 +0.093065 0.785034 +0.205377 0.715400 +0.083329 0.853025 +0.243475 0.699252 +0.062389 0.567589 +0.764116 0.834931 +0.018287 0.199875 +0.973603 -0.359748 +0.458826 -1.113178 +0.511200 -1.082561 +0.712587 0.615108 +0.464745 -0.835752 +0.984328 -0.332495 +0.414291 -0.808822 +0.799551 1.072052 +0.499037 -0.924499 +0.966757 -0.191643 +0.756594 0.991844 +0.444938 -0.969528 +0.410167 -0.773426 +0.532335 -0.631770 +0.343909 -0.313313 +0.854302 0.719307 +0.846882 0.916509 +0.740758 1.009525 +0.150668 0.832433 +0.177606 0.893017 +0.445289 -0.898242 +0.734653 0.787282 +0.559488 -0.663482 +0.232311 0.499122 +0.934435 -0.121533 +0.219089 0.823206 +0.636525 0.053113 +0.307605 0.027500 +0.713198 0.693978 +0.116343 1.242458 +0.680737 0.368910 +0.484730 -0.891940 +0.929408 0.234913 +0.008507 0.103505 +0.872161 0.816191 +0.755530 0.985723 +0.620671 0.026417 +0.472260 -0.967451 +0.257488 0.630100 +0.130654 1.025693 +0.512333 -0.884296 +0.747710 0.849468 +0.669948 0.413745 +0.644856 0.253455 +0.894206 0.482933 +0.820471 0.899981 +0.790796 0.922645 +0.010729 0.032106 +0.846777 0.768675 +0.349175 -0.322929 +0.453662 -0.957712 +0.624017 -0.169913 +0.211074 0.869840 +0.062555 0.607180 +0.739709 0.859793 +0.985896 -0.433632 +0.782088 0.976380 +0.642561 0.147023 +0.779007 0.913765 +0.185631 1.021408 +0.525250 -0.706217 +0.236802 0.564723 +0.440958 -0.993781 +0.397580 -0.708189 +0.823146 0.860086 +0.370173 -0.649231 +0.791675 1.162927 +0.456647 -0.956843 +0.113350 0.850107 +0.351074 -0.306095 +0.182684 0.825728 +0.914034 0.305636 +0.751486 0.898875 +0.216572 0.974637 +0.013273 0.062439 +0.469726 -1.226188 +0.060676 0.599451 +0.776310 0.902315 +0.061648 0.464446 +0.714077 0.947507 +0.559264 -0.715111 +0.121876 0.791703 +0.330586 -0.165819 +0.662909 0.379236 +0.785142 0.967030 +0.161352 0.979553 +0.985215 -0.317699 +0.457734 -0.890725 +0.171574 0.963749 +0.334277 -0.266228 +0.501065 -0.910313 +0.988736 -0.476222 +0.659242 0.218365 +0.359861 -0.338734 +0.790434 0.843387 +0.462458 -0.911647 +0.823012 0.813427 +0.594668 -0.603016 +0.498207 -0.878847 +0.574882 -0.419598 +0.570048 -0.442087 +0.331570 -0.347567 +0.195407 0.822284 +0.814327 0.974355 +0.641925 0.073217 +0.238778 0.657767 +0.400138 -0.715598 +0.670479 0.469662 +0.069076 0.680958 +0.294373 0.145767 +0.025628 0.179822 +0.697772 0.506253 +0.729626 0.786519 +0.293071 0.259997 +0.531802 -1.095833 +0.487338 -1.034481 +0.215780 0.933506 +0.625818 0.103845 +0.179389 0.892237 +0.192552 0.915516 +0.671661 0.330361 +0.952391 -0.060263 +0.795133 0.945157 +0.950494 -0.071855 +0.194894 1.000860 +0.351460 -0.227946 +0.863456 0.648456 +0.945221 -0.045667 +0.779840 0.979954 +0.996606 -0.450501 +0.632184 -0.036506 +0.790898 0.994890 +0.022503 0.386394 +0.318983 -0.152749 +0.369633 -0.423960 +0.157300 0.962858 +0.153223 0.882873 +0.360068 -0.653742 +0.433917 -0.872498 +0.133461 0.879002 +0.757252 1.123667 +0.309391 -0.102064 +0.195586 0.925339 +0.240259 0.689117 +0.340591 -0.455040 +0.243436 0.415760 +0.612755 -0.180844 +0.089407 0.723702 +0.469695 -0.987859 +0.943560 -0.097303 +0.177241 0.918082 +0.317756 -0.222902 +0.515337 -0.733668 +0.344773 -0.256893 +0.537029 -0.797272 +0.626878 0.048719 +0.208940 0.836531 +0.470697 -1.080283 +0.054448 0.624676 +0.109230 0.816921 +0.158325 1.044485 +0.976650 -0.309060 +0.643441 0.267336 +0.215841 1.018817 +0.905337 0.409871 +0.154354 0.920009 +0.947922 -0.112378 +0.201391 0.768894 From b8b7282238c5ca14e20cd1a2a8e93f2b665101cb Mon Sep 17 00:00:00 2001 From: jiangzhonglian Date: Wed, 8 Mar 2017 18:33:04 +0800 Subject: [PATCH 41/92] =?UTF-8?q?=E6=9B=B4=E8=A1=8C=E6=A0=91=E5=9B=9E?= =?UTF-8?q?=E5=BD=92=E7=9A=84md?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- "docs/9.\346\240\221\345\233\236\345\275\222.md" | 1 + 1 file changed, 1 insertion(+) diff --git "a/docs/9.\346\240\221\345\233\236\345\275\222.md" "b/docs/9.\346\240\221\345\233\236\345\275\222.md" index ec01f7db9..09d05c16b 100644 --- "a/docs/9.\346\240\221\345\233\236\345\275\222.md" +++ "b/docs/9.\346\240\221\345\233\236\345\275\222.md" @@ -14,3 +14,4 @@ * 回归树 * 模型树(线性模型) * 树回归方法在预测复杂数据时 会比 简单的线性模型 更有效。 +* Tkinter 和 matplotlib的集成,构建更强大的GUI \ No newline at end of file From a34164fdcff02850b942138c9ebe41fccda2b5da Mon Sep 17 00:00:00 2001 From: jiangzhonglian Date: Wed, 8 Mar 2017 18:34:39 +0800 Subject: [PATCH 42/92] =?UTF-8?q?=E6=9B=B4=E6=96=B0=E6=A0=91=E5=9B=9E?= =?UTF-8?q?=E5=BD=92md?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- "docs/9.\346\240\221\345\233\236\345\275\222.md" | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git "a/docs/9.\346\240\221\345\233\236\345\275\222.md" "b/docs/9.\346\240\221\345\233\236\345\275\222.md" index 09d05c16b..e3f23582e 100644 --- "a/docs/9.\346\240\221\345\233\236\345\275\222.md" +++ "b/docs/9.\346\240\221\345\233\236\345\275\222.md" @@ -14,4 +14,4 @@ * 回归树 * 模型树(线性模型) * 树回归方法在预测复杂数据时 会比 简单的线性模型 更有效。 -* Tkinter 和 matplotlib的集成,构建更强大的GUI \ No newline at end of file +* Tkinter 和 matplotlib的集成,构建更强大的GUI From 12b89402eeca33a569a7b9d5f1c8960a914039ff Mon Sep 17 00:00:00 2001 From: yangjifei <1714004716@qq.com> Date: Wed, 8 Mar 2017 18:40:42 +0800 Subject: [PATCH 43/92] add python cod --- .gitignore | 90 ------------------- .idea/MachineLearning.iml | 13 --- .idea/misc.xml | 4 - .idea/modules.xml | 8 -- .idea/vcs.xml | 6 -- src/__init__.py | 28 ------ src/python/05.Logistic/__init__.py | 28 ------ src/python/05.Logistic/core/__init__.py | 28 ------ src/python/05.Logistic/core/com/__init__.py | 28 ------ .../05.Logistic/core/com/apachecn/__init__.py | 28 ------ .../core/com/apachecn/logistic/__init__.py | 28 ------ .../apachecn/logistic/test_logRegression.py | 2 + src/python/05.Logistic/test/__init__.py | 27 ------ src/python/__init__.py | 28 ------ 14 files changed, 2 insertions(+), 344 deletions(-) delete mode 100644 .gitignore delete mode 100644 .idea/MachineLearning.iml delete mode 100644 .idea/misc.xml delete mode 100644 .idea/modules.xml delete mode 100644 .idea/vcs.xml delete mode 100644 src/__init__.py delete mode 100644 src/python/05.Logistic/__init__.py delete mode 100644 src/python/05.Logistic/core/__init__.py delete mode 100644 src/python/05.Logistic/core/com/__init__.py delete mode 100644 src/python/05.Logistic/core/com/apachecn/__init__.py delete mode 100644 src/python/05.Logistic/core/com/apachecn/logistic/__init__.py delete mode 100644 src/python/05.Logistic/test/__init__.py delete mode 100644 src/python/__init__.py diff --git a/.gitignore b/.gitignore deleted file mode 100644 index 6564ff4af..000000000 --- a/.gitignore +++ /dev/null @@ -1,90 +0,0 @@ -# Byte-compiled / optimized / DLL files -__pycache__/ -*.py[cod] -*$py.class - -# C extensions -*.so - -# Distribution / packaging -.Python -env/ -build/ -develop-eggs/ -dist/ -downloads/ -eggs/ -.eggs/ -lib/ -lib64/ -parts/ -sdist/ -var/ -*.egg-info/ -.installed.cfg -*.egg - -# PyInstaller -# Usually these files are written by a python script from a template -# before PyInstaller builds the exe, so as to inject date/other infos into it. -*.manifest -*.spec - -# Installer logs -pip-log.txt -pip-delete-this-directory.txt - -# Unit test / coverage reports -htmlcov/ -.tox/ -.coverage -.coverage.* -.cache -nosetests.xml -coverage.xml -*,cover -.hypothesis/ - -# Translations -*.mo -*.pot - -# Django stuff: -*.log -local_settings.py - -# Flask stuff: -instance/ -.webassets-cache - -# Scrapy stuff: -.scrapy - -# Sphinx documentation -docs/_build/ - -# PyBuilder -target/ - -# IPython Notebook -.ipynb_checkpoints - -# pyenv -.python-version - -# celery beat schedule file -celerybeat-schedule - -# dotenv -.env - -# virtualenv -venv/ -ENV/ - -# Spyder project settings -.spyderproject - -# Rope project settings -.ropeproject -.vscode diff --git a/.idea/MachineLearning.iml b/.idea/MachineLearning.iml deleted file mode 100644 index bd0813dc6..000000000 --- a/.idea/MachineLearning.iml +++ /dev/null @@ -1,13 +0,0 @@ - - - - - - - - - - - - \ No newline at end of file diff --git a/.idea/misc.xml b/.idea/misc.xml deleted file mode 100644 index 0974871b8..000000000 --- a/.idea/misc.xml +++ /dev/null @@ -1,4 +0,0 @@ - - - - \ No newline at end of file diff --git a/.idea/modules.xml b/.idea/modules.xml deleted file mode 100644 index a35ae91ed..000000000 --- a/.idea/modules.xml +++ /dev/null @@ -1,8 +0,0 @@ - - - - - - - - \ No newline at end of file diff --git a/.idea/vcs.xml b/.idea/vcs.xml deleted file mode 100644 index 94a25f7f4..000000000 --- a/.idea/vcs.xml +++ /dev/null @@ -1,6 +0,0 @@ - - - - - - \ No newline at end of file diff --git a/src/__init__.py b/src/__init__.py deleted file mode 100644 index b69024ca5..000000000 --- a/src/__init__.py +++ /dev/null @@ -1,28 +0,0 @@ -#!/usr/bin/env python -# encoding: utf-8 - - -""" -@version: -@author: yangjf -@license: ApacheCN -@contact: highfei2011@126.com -@site: https://github.com/apachecn/MachineLearning -@software: PyCharm -@file: __init__.py.py -@time: 2017/3/4 21:34 -@test result:pass -""" - - -def func(): - pass - - -class Main(): - def __init__(self): - pass - - -if __name__ == '__main__': - pass \ No newline at end of file diff --git a/src/python/05.Logistic/__init__.py b/src/python/05.Logistic/__init__.py deleted file mode 100644 index b69024ca5..000000000 --- a/src/python/05.Logistic/__init__.py +++ /dev/null @@ -1,28 +0,0 @@ -#!/usr/bin/env python -# encoding: utf-8 - - -""" -@version: -@author: yangjf -@license: ApacheCN -@contact: highfei2011@126.com -@site: https://github.com/apachecn/MachineLearning -@software: PyCharm -@file: __init__.py.py -@time: 2017/3/4 21:34 -@test result:pass -""" - - -def func(): - pass - - -class Main(): - def __init__(self): - pass - - -if __name__ == '__main__': - pass \ No newline at end of file diff --git a/src/python/05.Logistic/core/__init__.py b/src/python/05.Logistic/core/__init__.py deleted file mode 100644 index d294a8bad..000000000 --- a/src/python/05.Logistic/core/__init__.py +++ /dev/null @@ -1,28 +0,0 @@ -#!/usr/bin/env python -# encoding: utf-8 - - -""" -@version: -@author: yangjf -@license: ApacheCN -@contact: highfei2011@126.com -@site: https://github.com/apachecn/MachineLearning -@software: PyCharm -@file: __init__.py.py -@time: 2017/3/4 21:28 -@test result:pass -""" - - -def func(): - pass - - -class Main(): - def __init__(self): - pass - - -if __name__ == '__main__': - pass \ No newline at end of file diff --git a/src/python/05.Logistic/core/com/__init__.py b/src/python/05.Logistic/core/com/__init__.py deleted file mode 100644 index d294a8bad..000000000 --- a/src/python/05.Logistic/core/com/__init__.py +++ /dev/null @@ -1,28 +0,0 @@ -#!/usr/bin/env python -# encoding: utf-8 - - -""" -@version: -@author: yangjf -@license: ApacheCN -@contact: highfei2011@126.com -@site: https://github.com/apachecn/MachineLearning -@software: PyCharm -@file: __init__.py.py -@time: 2017/3/4 21:28 -@test result:pass -""" - - -def func(): - pass - - -class Main(): - def __init__(self): - pass - - -if __name__ == '__main__': - pass \ No newline at end of file diff --git a/src/python/05.Logistic/core/com/apachecn/__init__.py b/src/python/05.Logistic/core/com/apachecn/__init__.py deleted file mode 100644 index d294a8bad..000000000 --- a/src/python/05.Logistic/core/com/apachecn/__init__.py +++ /dev/null @@ -1,28 +0,0 @@ -#!/usr/bin/env python -# encoding: utf-8 - - -""" -@version: -@author: yangjf -@license: ApacheCN -@contact: highfei2011@126.com -@site: https://github.com/apachecn/MachineLearning -@software: PyCharm -@file: __init__.py.py -@time: 2017/3/4 21:28 -@test result:pass -""" - - -def func(): - pass - - -class Main(): - def __init__(self): - pass - - -if __name__ == '__main__': - pass \ No newline at end of file diff --git a/src/python/05.Logistic/core/com/apachecn/logistic/__init__.py b/src/python/05.Logistic/core/com/apachecn/logistic/__init__.py deleted file mode 100644 index d294a8bad..000000000 --- a/src/python/05.Logistic/core/com/apachecn/logistic/__init__.py +++ /dev/null @@ -1,28 +0,0 @@ -#!/usr/bin/env python -# encoding: utf-8 - - -""" -@version: -@author: yangjf -@license: ApacheCN -@contact: highfei2011@126.com -@site: https://github.com/apachecn/MachineLearning -@software: PyCharm -@file: __init__.py.py -@time: 2017/3/4 21:28 -@test result:pass -""" - - -def func(): - pass - - -class Main(): - def __init__(self): - pass - - -if __name__ == '__main__': - pass \ No newline at end of file diff --git a/src/python/05.Logistic/core/com/apachecn/logistic/test_logRegression.py b/src/python/05.Logistic/core/com/apachecn/logistic/test_logRegression.py index 31cf0a570..c40c630e6 100644 --- a/src/python/05.Logistic/core/com/apachecn/logistic/test_logRegression.py +++ b/src/python/05.Logistic/core/com/apachecn/logistic/test_logRegression.py @@ -6,6 +6,8 @@ from numpy import * + + import matplotlib.pyplot as plt from logRegression import * diff --git a/src/python/05.Logistic/test/__init__.py b/src/python/05.Logistic/test/__init__.py deleted file mode 100644 index 4708358a8..000000000 --- a/src/python/05.Logistic/test/__init__.py +++ /dev/null @@ -1,27 +0,0 @@ -#!/usr/bin/env python -# encoding: utf-8 - - -""" -@version: -@author: yangjf -@license: ApacheCN -@contact: highfei2011@126.com -@site: https://github.com/apachecn/MachineLearning -@software: PyCharm -@file: __init__.py.py -@time: 2017/3/4 21:27 -@test result:pass -""" - -def func(): - pass - - -class Main(): - def __init__(self): - pass - - -if __name__ == '__main__': - pass \ No newline at end of file diff --git a/src/python/__init__.py b/src/python/__init__.py deleted file mode 100644 index b69024ca5..000000000 --- a/src/python/__init__.py +++ /dev/null @@ -1,28 +0,0 @@ -#!/usr/bin/env python -# encoding: utf-8 - - -""" -@version: -@author: yangjf -@license: ApacheCN -@contact: highfei2011@126.com -@site: https://github.com/apachecn/MachineLearning -@software: PyCharm -@file: __init__.py.py -@time: 2017/3/4 21:34 -@test result:pass -""" - - -def func(): - pass - - -class Main(): - def __init__(self): - pass - - -if __name__ == '__main__': - pass \ No newline at end of file From 61a54d6e96b06faac9e23df98fec4b0d0894d5f0 Mon Sep 17 00:00:00 2001 From: sheepmen Date: Wed, 8 Mar 2017 22:14:08 +0800 Subject: [PATCH 44/92] DEV: ADD CHAPTER4 NOTE --- .gitignore | 1 + README.md | 1 + ...40\350\264\235\345\217\266\346\226\257.md" | 50 +++++++++++++++++++ 3 files changed, 52 insertions(+) create mode 100644 "docs/4.\346\234\264\347\264\240\350\264\235\345\217\266\346\226\257.md" diff --git a/.gitignore b/.gitignore index 6564ff4af..3729f6a5d 100644 --- a/.gitignore +++ b/.gitignore @@ -88,3 +88,4 @@ ENV/ # Rope project settings .ropeproject .vscode +.idea \ No newline at end of file diff --git a/README.md b/README.md index 4aec5c83f..eedcee831 100644 --- a/README.md +++ b/README.md @@ -11,6 +11,7 @@ * 3) 决策树 * [决策树](./docs/3.决策树.md) * 4) 基于概率论的分类方法:朴素贝叶斯 + * [朴素贝叶斯](./docs/4.朴素贝叶斯.md) * 5) Logistic回归 * [Logistic回归](./docs/5.Logistic回归.md) * 6) 支持向量机 diff --git "a/docs/4.\346\234\264\347\264\240\350\264\235\345\217\266\346\226\257.md" "b/docs/4.\346\234\264\347\264\240\350\264\235\345\217\266\346\226\257.md" new file mode 100644 index 000000000..0c1f0f6ee --- /dev/null +++ "b/docs/4.\346\234\264\347\264\240\350\264\235\345\217\266\346\226\257.md" @@ -0,0 +1,50 @@ + +# 4) 朴素贝叶斯 + + + +* 假设: 特征之间强(朴素)独立 +* 概率模型 + + * P(C|F1F2...Fn) = P(F1F2...Fn|C)P(C) / P(F1F2...Fn) + + * 由于对于所有类别,P(F1F2...Fn)都是相同的,比较P(C|F1F2...Fn)只用比较P(F1F2...Fn|C)P(C)就好了 + +* 朴素贝叶斯的特点 + + * 优点:在数据较少的情况下仍然有效,可以处理多类别问题 + + * 缺点:对于输入数据的准备方式较为敏感 + + * 适用数据类型:标称型数据 + +* 朴素贝叶斯的一般过程 + + * 收集数据:可以使用任何方法 + + * 准备数据:需要数值型或者布尔型数据 + + * 分析数据:有大量特征时,绘制特征作用不大,此时使用直方图效果更好。 + + * 训练算法:计算不同的独立特征的条件概率 + + * 测试算法:计算错误率 + + * 使用算法:文本分类等 + +* 优化 + + * 为了避免一个概率为0导致P(F1|C)*P(F2|C)....P(Fn|C)整个为0,所以优化为将所有词的出现数都初始化为1,并将分母初始化为2. + + * 由于大部分因子比较小,乘积之后得到的数不易比较,程序误差较大。所以取对数后可将乘法转化为加法:P(F1|C)*P(F2|C)....P(Fn|C)P(C) -> log(P(F1|C))+log(P(F2|C))+....+log(P(Fn|C))+log(P(C)) + +* 总结 + + * 这一块代码比较乱,最好先把公式理一理再看 + + * 可以参考一下[阮一峰的博客](http://www.ruanyifeng.com/blog/2013/12/naive_bayes_classifier.html) + + + + + From baa71008b1c57224201e95315442099a883b29de Mon Sep 17 00:00:00 2001 From: geekidentity Date: Wed, 8 Mar 2017 22:15:45 +0800 Subject: [PATCH 45/92] add SVM --- README.md | 1 + ...01\345\220\221\351\207\217\346\234\272.md" | 25 +++++++++++++++++++ 2 files changed, 26 insertions(+) create mode 100644 "docs/6.\346\224\257\346\214\201\345\220\221\351\207\217\346\234\272.md" diff --git a/README.md b/README.md index 4aec5c83f..cdf756b23 100644 --- a/README.md +++ b/README.md @@ -14,6 +14,7 @@ * 5) Logistic回归 * [Logistic回归](./docs/5.Logistic回归.md) * 6) 支持向量机 + * [支持向量机](./docs/6.支持向量机.md) * 7) 利用AdaBoost元算法提高分类 ## 第二部分 利用回归预测数值型数据 diff --git "a/docs/6.\346\224\257\346\214\201\345\220\221\351\207\217\346\234\272.md" "b/docs/6.\346\224\257\346\214\201\345\220\221\351\207\217\346\234\272.md" new file mode 100644 index 000000000..021fa531d --- /dev/null +++ "b/docs/6.\346\224\257\346\214\201\345\220\221\351\207\217\346\234\272.md" @@ -0,0 +1,25 @@ + +# 6) 支持向量机 + +* 基本概念 + + * 假设有两组数据,我们可以用一条线将这两个数据集分隔开,这条直线称为分隔超平面 + (当维数很高时称为分隔超平面)。 + * 我们希望找到离分隔超平面最近的点,确保它们离分隔面的距离尽可能远。 + * 支持向量就是离分隔超平面最近的那些点。 + +* 支持向量机特点 + + * 优点:泛化错误率低,计算开销不大,结果易解释。 + * 缺点:对参数调节和核函数的选择敏感,原始分类器不加修改仅适用于处理二类问题。 + * 适用数据类型:数值型和标称型数据。 + +* SVM应用的一般流程 + 1. 准备收集数据:可以使用任何方法。 + 2. 准备数据:需要数值型数据。 + 3. 分析数据:有助于可视化分隔超平面。 + 4. 训练算法:SVM的大部分时间都花在训练上,该过程主要实现两个参数的调优。 + 5. 测试算法:测试分类结果是否达到预期的目的。 + 6. 使用算法:几乎所有分类问题都可以使用SVM,值得一提的是,SVM本身是一个二类分类器, + 对多类问题应用SVM需要对代码做一些修改。 + From 399cc2f699b9a92fdca162cf2a8a25c539d6e059 Mon Sep 17 00:00:00 2001 From: ApacheCN Date: Wed, 8 Mar 2017 23:50:06 +0800 Subject: [PATCH 46/92] =?UTF-8?q?Create=2010.k-means=E8=81=9A=E7=B1=BB.md?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit add by wangyangting --- "docs/10.k-means\350\201\232\347\261\273.md" | 21 ++++++++++++++++++++ 1 file changed, 21 insertions(+) create mode 100644 "docs/10.k-means\350\201\232\347\261\273.md" diff --git "a/docs/10.k-means\350\201\232\347\261\273.md" "b/docs/10.k-means\350\201\232\347\261\273.md" new file mode 100644 index 000000000..33d0a0f13 --- /dev/null +++ "b/docs/10.k-means\350\201\232\347\261\273.md" @@ -0,0 +1,21 @@ + +# 10) k-means聚类 +* 聚类介绍 + * 聚类是一种无监督的学习,它将相似的对象归到一个簇中。 + * 聚类分析试图将相似对象归入同一簇,将不相似对象归到不同簇。相似这一概念取决于所选择的相似度计算方法。 +* K-均值聚类算法 + * 优点 : 容易实现 + * 缺点 : 可能收敛到局部最小值,在大规模数据集上收敛较慢。 + * 使用数据类型 : 数值型数据。 +* K-均值算法工作流程 + * 首先,随机确定 k 个初始点作为质心。 + * 然后,将数据集中的每个点分配到一个簇中。(为每个点找到距其最近的质心,并将其分配给该质心所对应的簇) + * 最后,每个簇的质心更新为该簇所有点的平均值。 +* K-均值算法伪代码如下 + * 创建 k 个点作为起始质心(通常是随机选择) + * 当任意一个点的簇分配结果发生改变时 + * 对数据集中的每个数据点 + * 对每个质心 + * 计算质心与数据点之间的距离 + * 将数据点分配到距其最近的簇 + * 对每一个簇,计算簇中所有点的均值并将均值作为质心 From fa1efa531dd271fa34c4f82c1211a67de0d991d8 Mon Sep 17 00:00:00 2001 From: ApacheCN Date: Wed, 8 Mar 2017 23:56:02 +0800 Subject: [PATCH 47/92] Create kMeans.py add by wangyangting --- src/python/10.kmeans/kMeans.py | 50 ++++++++++++++++++++++++++++++++++ 1 file changed, 50 insertions(+) create mode 100644 src/python/10.kmeans/kMeans.py diff --git a/src/python/10.kmeans/kMeans.py b/src/python/10.kmeans/kMeans.py new file mode 100644 index 000000000..b485ce14d --- /dev/null +++ b/src/python/10.kmeans/kMeans.py @@ -0,0 +1,50 @@ +#!/usr/bin/python +# coding:utf8 + +from numpy import * + +# 从文本中构建矩阵,加载文本文件,然后处理 +def loadDataSet(fileName): # 通用函数,用来解析以 tab 键分隔的 floats(浮点数) + dataMat = [] # assume last column is target value + fr = open(fileName) + for line in fr.readlines(): + curLine = line.strip().split('\t') + fltLine = map(float,curLine) # 映射所有的元素为 float(浮点数)类型 + dataMat.append(fltLine) + return dataMat + +# 计算两个向量的欧式距离(可根据场景选择) +def distEclud(vecA, vecB): + return sqrt(sum(power(vecA - vecB, 2))) # la.norm(vecA-vecB) + +# 为给定数据集构建一个包含 k 个随机质心的集合。随机质心必须要在整个数据集的边界之内,这可以通过找到数据集每一维的最小和最大值来完成。然后生成 0~1.0 之间的随机数并通过取值范围和最小值,以便确保随机点在数据的边界之内。 +def randCent(dataSet, k): + n = shape(dataSet)[1] # 列数 + centroids = mat(zeros((k,n))) # 创建质心矩阵 + for j in range(n): # 穿件随机簇质心,并且在每一维的边界内 + minJ = min(dataSet[:,j]) + rangeJ = float(max(dataSet[:,j]) - minJ) + centroids[:,j] = mat(minJ + rangeJ * random.rand(k,1)) # 随机生成 + return centroids + +# k-means 聚类算法 +def kMeans(dataSet, k, distMeas=distEclud, createCent=randCent): + m = shape(dataSet)[0] + clusterAssment = mat(zeros((m,2))) # 创建矩阵来分配数据点到质心中 + centroids = createCent(dataSet, k) + clusterChanged = True + while clusterChanged: + clusterChanged = False + for i in range(m): # 循环每一个数据点并分配到最近的质心中去 + minDist = inf; minIndex = -1 + for j in range(k): + distJI = distMeas(centroids[j,:],dataSet[i,:]) + if distJI < minDist: + minDist = distJI; minIndex = j + if clusterAssment[i,0] != minIndex: clusterChanged = True + clusterAssment[i,:] = minIndex,minDist**2 + print centroids + for cent in range(k): # 重新计算质心 + ptsInClust = dataSet[nonzero(clusterAssment[:,0].A==cent)[0]] # 获取该簇中的所有点 + centroids[cent,:] = mean(ptsInClust, axis=0) # 分配质心 + return centroids, clusterAssment From 40543b634f4357af45fd45a48e4ce1ebd4ec3b22 Mon Sep 17 00:00:00 2001 From: chenyyx Date: Thu, 9 Mar 2017 00:29:36 +0800 Subject: [PATCH 48/92] =?UTF-8?q?=E5=9B=9E=E5=BD=92=E4=B8=8A=E4=BC=A0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...56\357\274\232\345\233\236\345\275\222.md" | 18 ++ .../regression.py | 258 ++++++++++++++++++ 2 files changed, 276 insertions(+) create mode 100644 "docs/8.\351\242\204\346\265\213\346\225\260\345\200\274\345\236\213\346\225\260\346\215\256\357\274\232\345\233\236\345\275\222.md" create mode 100644 src/python/08.Predictive numerical data regression/regression.py diff --git "a/docs/8.\351\242\204\346\265\213\346\225\260\345\200\274\345\236\213\346\225\260\346\215\256\357\274\232\345\233\236\345\275\222.md" "b/docs/8.\351\242\204\346\265\213\346\225\260\345\200\274\345\236\213\346\225\260\346\215\256\357\274\232\345\233\236\345\275\222.md" new file mode 100644 index 000000000..90b975ad8 --- /dev/null +++ "b/docs/8.\351\242\204\346\265\213\346\225\260\345\200\274\345\236\213\346\225\260\346\215\256\357\274\232\345\233\236\345\275\222.md" @@ -0,0 +1,18 @@ + +# 8)Ԥֵݣع + +* Իعص + * ŵ㣺⣬ϲӡ + * ȱ㣺ԷԵϲá + * ݷΧֵͺͱݡ +* ԭ + * عĿԤֵ͵Ŀֱֵӵİ취ԼдһĿֵļ㹫ʽ +* عһ + * ռݣκη + * ׼ݣعҪֵݣݽתɶֵݡ + * ݣݵĿӶάͼڶͷڲ»عϵ֮󣬿Խ߻ͼΪԱȡ + * ѵ㷨ҵعϵ + * ݣʹRƽԤֵݵ϶ȣģ͵Ч + * ʹ㷨ʹûع飬ڸʱԤһֵǶԷ෽ΪԤݶɢǩ +* ܽ + * عϵĹ̾ǻع顣 diff --git a/src/python/08.Predictive numerical data regression/regression.py b/src/python/08.Predictive numerical data regression/regression.py new file mode 100644 index 000000000..be857aa76 --- /dev/null +++ b/src/python/08.Predictive numerical data regression/regression.py @@ -0,0 +1,258 @@ +''' +Create by ApacheCN-xy +Date from 2017-02-27 +''' + + +from numpy import * + +def loadDataSet(fileName): #解析以tab键分隔的文件中的浮点数 + numFeat = len(open(fileName).readline().split('\t')) - 1 #获得一行有几个字段 + dataMat = []; labelMat = [] + fr = open(fileName) + for line in fr.readlines(): #读取每一行 + lineArr =[] + curLine = line.strip().split('\t') #删除每一行的开头和结尾的tab + for i in range(numFeat):#从0到3,不包含3 + lineArr.append(float(curLine[i]))#将数据添加到lineArr List中 + dataMat.append(lineArr) + labelMat.append(float(curLine[-1])) + return dataMat,labelMat + +def standRegres(xArr,yArr): #线性回归 + xMat = mat(xArr); yMat = mat(yArr).T + xTx = xMat.T*xMat + if linalg.det(xTx) == 0.0: + print ("This matrix is singular, cannot do inverse") + return + ws = xTx.I * (xMat.T*yMat) + return ws + +def lwlr(testPoint,xArr,yArr,k=1.0): + xMat = mat(xArr); yMat = mat(yArr).T + m = shape(xMat)[0] + weights = mat(eye((m))) + for j in range(m): #下面两行创建权重矩阵 + diffMat = testPoint - xMat[j,:] # + weights[j,j] = exp(diffMat*diffMat.T/(-2.0*k**2)) + xTx = xMat.T * (weights * xMat) + if linalg.det(xTx) == 0.0: + print ("This matrix is singular, cannot do inverse") + return + ws = xTx.I * (xMat.T * (weights * yMat)) + return testPoint * ws + +def lwlrTest(testArr,xArr,yArr,k=1.0): #循环所有的数据点,并将lwlr运用于所有的数据点 + m = shape(testArr)[0] + yHat = zeros(m) + for i in range(m): + yHat[i] = lwlr(testArr[i],xArr,yArr,k) + return yHat + +def lwlrTestPlot(xArr,yArr,k=1.0): #首先将 X 排序,其余的都与lwlrTest相同,这样更容易绘图 + yHat = zeros(shape(yArr)) + xCopy = mat(xArr) + xCopy.sort(0) + for i in range(shape(xArr)[0]): + yHat[i] = lwlr(xCopy[i],xArr,yArr,k) + return yHat,xCopy + +def rssError(yArr,yHatArr): #yArr 和 yHatArr 两者都需要是数组 + return ((yArr-yHatArr)**2).sum() + +def ridgeRegres(xMat,yMat,lam=0.2): #岭回归 + xTx = xMat.T*xMat + denom = xTx + eye(shape(xMat)[1])*lam + if linalg.det(denom) == 0.0: + print "This matrix is singular, cannot do inverse" + return + ws = denom.I * (xMat.T*yMat) + return ws + +def ridgeTest(xArr,yArr): + xMat = mat(xArr); yMat=mat(yArr).T + yMean = mean(yMat,0) + yMat = yMat - yMean #Y取平均值以消除X0 + #regularize X's(正则化 X的)??? + xMeans = mean(xMat,0) #计算平均值然后减去它 + xVar = var(xMat,0) #然后计算除以 Xi的方差 + xMat = (xMat - xMeans)/xVar + numTestPts = 30 + wMat = zeros((numTestPts,shape(xMat)[1])) + for i in range(numTestPts): + ws = ridgeRegres(xMat,yMat,exp(i-10)) + wMat[i,:]=ws.T + return wMat + +def regularize(xMat):#按列进行规范化 + inMat = xMat.copy() + inMeans = mean(inMat,0) #计算平均值然后减去它 + inVar = var(inMat,0) #计算除以Xi的方差 + inMat = (inMat - inMeans)/inVar + return inMat + +def stageWise(xArr,yArr,eps=0.01,numIt=100): + xMat = mat(xArr); yMat=mat(yArr).T + yMean = mean(yMat,0) + yMat = yMat - yMean #也可以规则化ys但会得到更小的coef + xMat = regularize(xMat) + m,n=shape(xMat) + #returnMat = zeros((numIt,n)) #测试代码删除 + ws = zeros((n,1)); wsTest = ws.copy(); wsMax = ws.copy() + for i in range(numIt): + print ws.T + lowestError = inf; + for j in range(n): + for sign in [-1,1]: + wsTest = ws.copy() + wsTest[j] += eps*sign + yTest = xMat*wsTest + rssE = rssError(yMat.A,yTest.A) + if rssE < lowestError: + lowestError = rssE + wsMax = wsTest + ws = wsMax.copy() + #returnMat[i,:]=ws.T + #return returnMat + +#def scrapePage(inFile,outFile,yr,numPce,origPrc): +# from BeautifulSoup import BeautifulSoup +# fr = open(inFile); fw=open(outFile,'a') #a is append mode writing +# soup = BeautifulSoup(fr.read()) +# i=1 +# currentRow = soup.findAll('table', r="%d" % i) +# while(len(currentRow)!=0): +# title = currentRow[0].findAll('a')[1].text +# lwrTitle = title.lower() +# if (lwrTitle.find('new') > -1) or (lwrTitle.find('nisb') > -1): +# newFlag = 1.0 +# else: +# newFlag = 0.0 +# soldUnicde = currentRow[0].findAll('td')[3].findAll('span') +# if len(soldUnicde)==0: +# print "item #%d did not sell" % i +# else: +# soldPrice = currentRow[0].findAll('td')[4] +# priceStr = soldPrice.text +# priceStr = priceStr.replace('$','') #strips out $ +# priceStr = priceStr.replace(',','') #strips out , +# if len(soldPrice)>1: +# priceStr = priceStr.replace('Free shipping', '') #strips out Free Shipping +# print "%s\t%d\t%s" % (priceStr,newFlag,title) +# fw.write("%d\t%d\t%d\t%f\t%s\n" % (yr,numPce,newFlag,origPrc,priceStr)) +# i += 1 +# currentRow = soup.findAll('table', r="%d" % i) +# fw.close() + +from time import sleep +import json +import urllib2 +def searchForSet(retX, retY, setNum, yr, numPce, origPrc): + sleep(10) + myAPIstr = 'AIzaSyD2cR2KFyx12hXu6PFU-wrWot3NXvko8vY' + searchURL = 'https://www.googleapis.com/shopping/search/v1/public/products?key=%s&country=US&q=lego+%d&alt=json' % (myAPIstr, setNum) + pg = urllib2.urlopen(searchURL) + retDict = json.loads(pg.read()) + for i in range(len(retDict['items'])): + try: + currItem = retDict['items'][i] + if currItem['product']['condition'] == 'new': + newFlag = 1 + else: newFlag = 0 + listOfInv = currItem['product']['inventories'] + for item in listOfInv: + sellingPrice = item['price'] + if sellingPrice > origPrc * 0.5: + print "%d\t%d\t%d\t%f\t%f" % (yr,numPce,newFlag,origPrc, sellingPrice) + retX.append([yr, numPce, newFlag, origPrc]) + retY.append(sellingPrice) + except: print 'problem with item %d' % i + +def setDataCollect(retX, retY): + searchForSet(retX, retY, 8288, 2006, 800, 49.99) + searchForSet(retX, retY, 10030, 2002, 3096, 269.99) + searchForSet(retX, retY, 10179, 2007, 5195, 499.99) + searchForSet(retX, retY, 10181, 2007, 3428, 199.99) + searchForSet(retX, retY, 10189, 2008, 5922, 299.99) + searchForSet(retX, retY, 10196, 2009, 3263, 249.99) + +def crossValidation(xArr,yArr,numVal=10): + m = len(yArr) + indexList = range(m) + errorMat = zeros((numVal,30))#create error mat 30columns numVal rows创建error mat 30columns numVal 行 + for i in range(numVal): + trainX=[]; trainY=[] + testX = []; testY = [] + random.shuffle(indexList) + for j in range(m):#create training set based on first 90% of values in indexList + #基于indexList中的前90%的值创建训练集 + if j < m*0.9: + trainX.append(xArr[indexList[j]]) + trainY.append(yArr[indexList[j]]) + else: + testX.append(xArr[indexList[j]]) + testY.append(yArr[indexList[j]]) + wMat = ridgeTest(trainX,trainY) #get 30 weight vectors from ridge + for k in range(30):#loop over all of the ridge estimates + matTestX = mat(testX); matTrainX=mat(trainX) + meanTrain = mean(matTrainX,0) + varTrain = var(matTrainX,0) + matTestX = (matTestX-meanTrain)/varTrain #regularize test with training params + yEst = matTestX * mat(wMat[k,:]).T + mean(trainY)#test ridge results and store + errorMat[i,k]=rssError(yEst.T.A,array(testY)) + #print errorMat[i,k] + meanErrors = mean(errorMat,0)#calc avg performance of the different ridge weight vectors + minMean = float(min(meanErrors)) + bestWeights = wMat[nonzero(meanErrors==minMean)] + #can unregularize to get model + #when we regularized we wrote Xreg = (x-meanX)/var(x) + #we can now write in terms of x not Xreg: x*w/var(x) - meanX/var(x) +meanY + xMat = mat(xArr); yMat=mat(yArr).T + meanX = mean(xMat,0); varX = var(xMat,0) + unReg = bestWeights/varX + print "the best model from Ridge Regression is:\n",unReg + print "with constant term: ",-1*sum(multiply(meanX,unReg)) + mean(yMat) + + + + + + + + + + + #test for xianxinghuigui + def regression1(): + xArr, yArr = loadDataSet("ex0.txt") + xMat = mat(xArr) + yMat = mat(yArr) + ws = standRegres(xArr, yArr) + fig = plt.figure() + ax = fig.add_subplot(111) + ax.scatter(xMat[:, 1].flatten(), yMat.T[:, 0].flatten().A[0]) + xCopy = xMat.copy() + xCopy.sort(0) + yHat = xCopy * ws + ax.plot(xCopy[:, 1], yHat) + plt.show() + +if __name__ == "__main__": + regression1() + + + #test for jiaquanhuigui + def regression1(): + xArr, yArr = loadDataSet("ex0.txt") + yHat = lwlrTest(xArr, xArr, yArr, 0.003) + xMat = mat(xArr) + srtInd = xMat[:,1].argsort(0) + xSort=xMat[srtInd][:,0,:] + fig = plt.figure() + ax = fig.add_subplot(111) + ax.plot(xSort[:,1], yHat[srtInd]) + ax.scatter(xMat[:,1].flatten().A[0], mat(yArr).T.flatten().A[0] , s=2, c='red') + plt.show() + +if __name__ == "__main__": + regression1() \ No newline at end of file From aad785ee666e95a87501713d2f11e25243caab2d Mon Sep 17 00:00:00 2001 From: yangjifei <1714004716@qq.com> Date: Thu, 9 Mar 2017 08:55:59 +0800 Subject: [PATCH 49/92] =?UTF-8?q?=E4=BF=AE=E6=94=B9=E9=80=BB=E8=BE=91?= =?UTF-8?q?=E5=9B=9E=E5=BD=92=E6=A2=AF=E5=BA=A6=E4=B8=8B=E9=99=8D?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../logistic/logRegression.py => logRegression01.py} | 0 .../{com/apachecn/logistic => }/test_logRegression.py | 9 ++------- src/python/Logistic.py | 2 +- src/python/apriori.py | 2 +- testData/{testSet.txt => Logistic_testdata.txt} | 0 5 files changed, 4 insertions(+), 9 deletions(-) rename src/python/05.Logistic/core/{com/apachecn/logistic/logRegression.py => logRegression01.py} (100%) rename src/python/05.Logistic/core/{com/apachecn/logistic => }/test_logRegression.py (91%) rename testData/{testSet.txt => Logistic_testdata.txt} (100%) diff --git a/src/python/05.Logistic/core/com/apachecn/logistic/logRegression.py b/src/python/05.Logistic/core/logRegression01.py similarity index 100% rename from src/python/05.Logistic/core/com/apachecn/logistic/logRegression.py rename to src/python/05.Logistic/core/logRegression01.py diff --git a/src/python/05.Logistic/core/com/apachecn/logistic/test_logRegression.py b/src/python/05.Logistic/core/test_logRegression.py similarity index 91% rename from src/python/05.Logistic/core/com/apachecn/logistic/test_logRegression.py rename to src/python/05.Logistic/core/test_logRegression.py index c40c630e6..c7d5d50d0 100644 --- a/src/python/05.Logistic/core/com/apachecn/logistic/test_logRegression.py +++ b/src/python/05.Logistic/core/test_logRegression.py @@ -3,14 +3,9 @@ import os import sys sys.path.append("C:\Python27") - from numpy import * - - -import matplotlib.pyplot as plt - -from logRegression import * +from logRegression01 import * """ @version: @author: yangjf @@ -31,7 +26,7 @@ def loadData(): # 截取字符串至项目名:Test\ project_dir = project_dir[:project_dir.find("MachineLearning\\") + 15] print project_dir - fileIn = open("%s/testData/testSet.txt" % project_dir) + fileIn = open("%s/testData/Logistic_testdata.txt" % project_dir) for line in fileIn.readlines(): lineArr = line.strip().split() train_x.append([1.0, float(lineArr[0]), float(lineArr[1])]) diff --git a/src/python/Logistic.py b/src/python/Logistic.py index dc6bc3451..c59e022d5 100644 --- a/src/python/Logistic.py +++ b/src/python/Logistic.py @@ -117,7 +117,7 @@ def plotBestFit(dataArr, labelMat, weights): def main(): project_dir = os.path.dirname(os.path.dirname(os.getcwd())) # 1.收集并准备数据 - dataMat, labelMat = loadDataSet("%s/testData/testSet.txt" % project_dir) + dataMat, labelMat = loadDataSet("%s/testData/Logistic_testdata.txt" % project_dir) # print dataMat, '---\n', labelMat # 2.训练模型, f(x)=a1*x1+b2*x2+..+nn*xn中 (a1,b2, .., nn).T的矩阵值 diff --git a/src/python/apriori.py b/src/python/apriori.py index ee6af908d..981126859 100644 --- a/src/python/apriori.py +++ b/src/python/apriori.py @@ -73,7 +73,7 @@ def apriori(dataSet, minSupport = 0.5): def main(): # project_dir = os.path.dirname(os.path.dirname(os.getcwd())) # 1.收集并准备数据 - # dataMat, labelMat = loadDataSet("%s/resources/testSet.txt" % project_dir) + # dataMat, labelMat = loadDataSet("%s/resources/Logistic_testdata.txt" % project_dir) # 1. 加载数据 diff --git a/testData/testSet.txt b/testData/Logistic_testdata.txt similarity index 100% rename from testData/testSet.txt rename to testData/Logistic_testdata.txt From 3d21601d2cd4366638e23596ee7e37635ccc1152 Mon Sep 17 00:00:00 2001 From: yangjifei <1714004716@qq.com> Date: Thu, 9 Mar 2017 09:07:00 +0800 Subject: [PATCH 50/92] update logistic --- .gitignore | 92 ++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 92 insertions(+) create mode 100644 .gitignore diff --git a/.gitignore b/.gitignore new file mode 100644 index 000000000..0de90e72b --- /dev/null +++ b/.gitignore @@ -0,0 +1,92 @@ +# Byte-compiled / optimized / DLL files +__pycache__/ +*.py[cod] +*$py.class + +# C extensions +*.so + +# Distribution / packaging +.Python +env/ +build/ +develop-eggs/ +dist/ +downloads/ +eggs/ +.eggs/ +lib/ +lib64/ +parts/ +sdist/ +var/ +*.egg-info/ +.installed.cfg +*.egg + +# PyInstaller +# Usually these files are written by a python script from a template +# before PyInstaller builds the exe, so as to inject date/other infos into it. +*.manifest +*.spec + +# Installer logs +pip-log.txt +pip-delete-this-directory.txt + +# Unit test / coverage reports +htmlcov/ +.tox/ +.coverage +.coverage.* +.cache +nosetests.xml +coverage.xml +*,cover +.hypothesis/ + +# Translations +*.mo +*.pot + +# Django stuff: +*.log +local_settings.py + +# Flask stuff: +instance/ +.webassets-cache + +# Scrapy stuff: +.scrapy + +# Sphinx documentation +docs/_build/ + +# PyBuilder +target/ + +# IPython Notebook +.ipynb_checkpoints + +# pyenv +.python-version + +# celery beat schedule file +celerybeat-schedule + +# dotenv +.env + +# virtualenv +venv/ +ENV/ + +# Spyder project settings +.spyderproject + +# Rope project settings +.ropeproject +.vscode + + From b237c0fd2a14eaf21f0dd8f0d09421b58f1c3b49 Mon Sep 17 00:00:00 2001 From: jiangzhonglian Date: Thu, 9 Mar 2017 15:12:58 +0800 Subject: [PATCH 51/92] =?UTF-8?q?=E6=9B=B4=E6=96=B0=E8=B7=AF=E5=BE=84?= =?UTF-8?q?=E5=92=8C=E7=9B=AE=E5=BD=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/python/03.DecisionTree/DTSklearn.py | 6 ------ src/python/apriori.py | 2 +- 2 files changed, 1 insertion(+), 7 deletions(-) diff --git a/src/python/03.DecisionTree/DTSklearn.py b/src/python/03.DecisionTree/DTSklearn.py index f63d26356..a48909616 100644 --- a/src/python/03.DecisionTree/DTSklearn.py +++ b/src/python/03.DecisionTree/DTSklearn.py @@ -6,12 +6,6 @@ from sklearn.metrics import precision_recall_curve from sklearn.metrics import classification_report from sklearn.cross_validation import train_test_split -""" -需要安装依赖模块: -pip install scikit_learn-0.18-cp27-cp27m-win_amd64.whl -非常完整的网址: -http://www.lfd.uci.edu/~gohlke/pythonlibs/#numpy -""" def createDataSet(): diff --git a/src/python/apriori.py b/src/python/apriori.py index 981126859..17d847d37 100644 --- a/src/python/apriori.py +++ b/src/python/apriori.py @@ -73,7 +73,7 @@ def apriori(dataSet, minSupport = 0.5): def main(): # project_dir = os.path.dirname(os.path.dirname(os.getcwd())) # 1.收集并准备数据 - # dataMat, labelMat = loadDataSet("%s/resources/Logistic_testdata.txt" % project_dir) + # dataMat, labelMat = loadDataSet("%s/resources/Apriori_testdata.txt" % project_dir) # 1. 加载数据 From 80d13d761b9a663b1b9b6b1bab82eec0526a1ff0 Mon Sep 17 00:00:00 2001 From: geekidentity Date: Thu, 9 Mar 2017 23:40:35 +0800 Subject: [PATCH 52/92] add kNN --- src/python/01.NumPy.py | 2 +- src/python/02.kNN/kNN.py | 18 ++++++++++++++++++ 2 files changed, 19 insertions(+), 1 deletion(-) create mode 100644 src/python/02.kNN/kNN.py diff --git a/src/python/01.NumPy.py b/src/python/01.NumPy.py index 496dd0fe7..d50d42db2 100644 --- a/src/python/01.NumPy.py +++ b/src/python/01.NumPy.py @@ -28,7 +28,7 @@ # .T表示对矩阵转置(行列颠倒) invRandMat = randMat.I # 输出结果 -print randArray, '\n---\n', randMat, '\n+++\n', invRandMat +print(randArray, '\n---\n', randMat, '\n+++\n', invRandMat) # 矩阵和逆矩阵 进行求积 (单位矩阵,对角线都为1嘛,理论上4*4的矩阵其他的都为0) myEye = randMat*invRandMat # 误差 diff --git a/src/python/02.kNN/kNN.py b/src/python/02.kNN/kNN.py new file mode 100644 index 000000000..acebbd2c0 --- /dev/null +++ b/src/python/02.kNN/kNN.py @@ -0,0 +1,18 @@ +''' +导入科学计算包numpy和运算符模块operator +@author: geekidentity +''' +from numpy import * +import operator + +''' + 创建数据集和标签 + + 调用方式 + import kNN + group, labels = createDateSet()11 +''' +def createDataSet(): + group = array([[1.0,1.1],[1.0,1.0],[0,0],[0,0.1]]) + labels = ['A','A','B','B'] + return group, labels \ No newline at end of file From b587a8eed2eb28f13d1392564cc3d2e0d675d82d Mon Sep 17 00:00:00 2001 From: jiangzhonglian Date: Mon, 13 Mar 2017 20:47:12 +0800 Subject: [PATCH 53/92] =?UTF-8?q?=E6=9B=B4=E6=96=B0=E5=86=B3=E7=AD=96?= =?UTF-8?q?=E6=A0=91=E7=9A=84=E5=86=85=E5=AE=B9=EF=BC=8C=E5=81=9Appt?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/python/03.DecisionTree/DTSklearn.py | 4 +- src/python/03.DecisionTree/DecisionTree.py | 6 ++- .../03.DecisionTree/DecisionTreePlot.py | 2 +- src/python/09.RegTrees/RTSklearn.py | 50 ++++++++++++++++++ src/python/09.RegTrees/treeExplore.py | 6 +-- testResult/tree.pdf | Bin 16586 -> 16177 bytes 6 files changed, 60 insertions(+), 8 deletions(-) create mode 100644 src/python/09.RegTrees/RTSklearn.py diff --git a/src/python/03.DecisionTree/DTSklearn.py b/src/python/03.DecisionTree/DTSklearn.py index a48909616..1f451c615 100644 --- a/src/python/03.DecisionTree/DTSklearn.py +++ b/src/python/03.DecisionTree/DTSklearn.py @@ -51,7 +51,7 @@ def predict_train(x_train, y_train): return y_pre, clf -def show_precision_recall(x, clf, y_train, y_pre): +def show_precision_recall(x, y, clf, y_train, y_pre): ''' 准确率与召回率 参考链接: http://scikit-learn.org/stable/modules/generated/sklearn.metrics.precision_recall_curve.html#sklearn.metrics.precision_recall_curve @@ -110,7 +110,7 @@ def show_pdf(clf): y_pre, clf = predict_train(x_train, y_train) # 展现 准确率与召回率 - show_precision_recall(x, clf, y_train, y_pre) + show_precision_recall(x, y, clf, y_train, y_pre) # 可视化输出 show_pdf(clf) diff --git a/src/python/03.DecisionTree/DecisionTree.py b/src/python/03.DecisionTree/DecisionTree.py index 03a4d25f6..e5f3d41b4 100644 --- a/src/python/03.DecisionTree/DecisionTree.py +++ b/src/python/03.DecisionTree/DecisionTree.py @@ -7,9 +7,9 @@ Decision Tree Source Code for Machine Learning in Action Ch. 3 @author: Peter Harrington/jiangzhonglian ''' -from math import log import operator -import DecisionTreePlot as dtPlot +from math import log +import decisionTreePlot as dtPlot def createDataSet(): @@ -130,7 +130,9 @@ def chooseBestFeatureToSplit(dataSet): prob = len(subDataSet)/float(len(dataSet)) newEntropy += prob * calcShannonEnt(subDataSet) # gain[信息增益] 值越大,意味着该分类提供的信息量越大,该特征对分类的不确定程度越小 + # 也就说: 列进行group分组后,对应的类别越多,信息量越大,那么香农熵越小,那么信息增益就越大,所以gain越大 infoGain = baseEntropy - newEntropy + # print 'infoGain=', infoGain, 'bestFeature=', i if (infoGain > bestInfoGain): bestInfoGain = infoGain bestFeature = i diff --git a/src/python/03.DecisionTree/DecisionTreePlot.py b/src/python/03.DecisionTree/DecisionTreePlot.py index 737e4d314..3c5c4d313 100644 --- a/src/python/03.DecisionTree/DecisionTreePlot.py +++ b/src/python/03.DecisionTree/DecisionTreePlot.py @@ -128,5 +128,5 @@ def retrieveTree(i): return listOfTrees[i] -myTree = retrieveTree(0) +myTree = retrieveTree(1) createPlot(myTree) diff --git a/src/python/09.RegTrees/RTSklearn.py b/src/python/09.RegTrees/RTSklearn.py new file mode 100644 index 000000000..72036a23f --- /dev/null +++ b/src/python/09.RegTrees/RTSklearn.py @@ -0,0 +1,50 @@ +#!/usr/bin/python +# coding:utf8 + +''' +Created on 2017-03-10 +Update on 2017-03-10 +author: jiangzhonglian +content: 回归树 +''' + +print(__doc__) + + +# Import the necessary modules and libraries +import numpy as np +from sklearn.tree import DecisionTreeRegressor +import matplotlib.pyplot as plt + + +# Create a random dataset +rng = np.random.RandomState(1) +X = np.sort(5 * rng.rand(80, 1), axis=0) +y = np.sin(X).ravel() +print X, '\n\n\n-----------\n\n\n', y +y[::5] += 3 * (0.5 - rng.rand(16)) + + +# Fit regression model +regr_1 = DecisionTreeRegressor(max_depth=2, min_samples_leaf=5) +regr_2 = DecisionTreeRegressor(max_depth=5, min_samples_leaf=5) +regr_1.fit(X, y) +regr_2.fit(X, y) + + +# Predict +X_test = np.arange(0.0, 5.0, 0.01)[:, np.newaxis] +y_1 = regr_1.predict(X_test) +y_2 = regr_2.predict(X_test) + + +# Plot the results +plt.figure() +plt.scatter(X, y, c="darkorange", label="data") +plt.plot(X_test, y_1, color="cornflowerblue", label="max_depth=2", linewidth=2) +plt.plot(X_test, y_2, color="yellowgreen", label="max_depth=5", linewidth=2) +plt.xlabel("data") +plt.ylabel("target") +plt.title("Decision Tree Regression") +plt.legend() +plt.show() diff --git a/src/python/09.RegTrees/treeExplore.py b/src/python/09.RegTrees/treeExplore.py index 26fd9a8bf..aa394f5d2 100644 --- a/src/python/09.RegTrees/treeExplore.py +++ b/src/python/09.RegTrees/treeExplore.py @@ -7,14 +7,14 @@ Tree-Based Regression Methods Source Code for Machine Learning in Action Ch. 9 @author: jiangzhonglian ''' +import regTrees from Tkinter import * from numpy import * -import regTrees import matplotlib -matplotlib.use('TkAgg') -from matplotlib.backends.backend_tkagg import FigureCanvasTkAgg from matplotlib.figure import Figure +from matplotlib.backends.backend_tkagg import FigureCanvasTkAgg +matplotlib.use('TkAgg') def test_widget_text(root): diff --git a/testResult/tree.pdf b/testResult/tree.pdf index f2b728290b9ceb5f02f52eeaf196369a36f37412..6cb99e2008fc4289da8af9281d394f5995f58e52 100644 GIT binary patch delta 12068 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 )2H1JK>;_EjMC_jZ$Zo0cd6$O& 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 From 4578e7097f6d925537dbafb8e665c957528a706a Mon Sep 17 00:00:00 2001 From: ApacheCN Date: Mon, 13 Mar 2017 21:20:44 +0800 Subject: [PATCH 54/92] Update README.md --- README.md | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/README.md b/README.md index 830340413..6f232297a 100644 --- a/README.md +++ b/README.md @@ -27,6 +27,7 @@ ## 第三部分 无监督学习 * 10) 使用K-均值聚类算法对未标注数据分组 + * [k-means聚类](./docs/10.k-means聚类.md) * 11) 使用Apriori算法进行关联分析 * [使用Apriori算法进行关联分析](./docs/11.使用Apriori算法进行关联分析.md) * 12) 使用FP-growth算法来高效发现频繁项集 @@ -47,4 +48,4 @@ * 附录D 资源 * 索引 * 版权声明 -* [ApacheCN(apache中文网) 维护更新](http://www.apache.wiki/display/ML) \ No newline at end of file +* [ApacheCN(apache中文网) 维护更新](http://www.apache.wiki/display/ML) From e034b4ea0b04de015bad4d062f81b3a9b6466d8b Mon Sep 17 00:00:00 2001 From: hello19883 Date: Mon, 13 Mar 2017 21:50:08 +0800 Subject: [PATCH 55/92] =?UTF-8?q?=E6=9B=B4=E6=96=B014.=E4=BD=BF=E7=94=A8SV?= =?UTF-8?q?D=E7=AE=80=E5=8C=96=E6=95=B0=E6=8D=AE.md?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- README.md | 1 + ...24\250SVD\347\256\200\345\214\226\346\225\260\346\215\256.md" | 0 2 files changed, 1 insertion(+) create mode 100644 "docs/14.\344\275\277\347\224\250SVD\347\256\200\345\214\226\346\225\260\346\215\256.md" diff --git a/README.md b/README.md index 6f232297a..8d485860a 100644 --- a/README.md +++ b/README.md @@ -38,6 +38,7 @@ * 13) 使用PCA来简化数据 * [利用PCA来简化数据](./docs/13.利用PCA来简化数据.md) * 14) 使用SVD简化数据 + * [使用SVD简化数据](./docs/14.使用SVD简化数据.md) * 15) 大数据与MapReduce * * * diff --git "a/docs/14.\344\275\277\347\224\250SVD\347\256\200\345\214\226\346\225\260\346\215\256.md" "b/docs/14.\344\275\277\347\224\250SVD\347\256\200\345\214\226\346\225\260\346\215\256.md" new file mode 100644 index 000000000..e69de29bb From d8f25c2b87c3b926772f741c63fb13030e070e4f Mon Sep 17 00:00:00 2001 From: jiangzhonglian Date: Mon, 13 Mar 2017 23:09:44 +0800 Subject: [PATCH 56/92] =?UTF-8?q?=E6=9B=B4=E6=96=B08=E7=BA=BF=E6=80=A7?= =?UTF-8?q?=E5=9B=9E=E5=BD=92=E7=9A=84=E4=B9=B1=E7=A0=81=E9=97=AE=E9=A2=98?= =?UTF-8?q?=EF=BC=8C7=20AdaBoost=E7=9A=84md=E6=96=87=E6=A1=A3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- README.md | 2 ++ ...20\351\253\230\345\210\206\347\261\273.md" | 0 ...56\357\274\232\345\233\236\345\275\222.md" | 32 +++++++++---------- 3 files changed, 18 insertions(+), 16 deletions(-) create mode 100644 "docs/7.\345\210\251\347\224\250AdaBoost\345\205\203\347\256\227\346\263\225\346\217\220\351\253\230\345\210\206\347\261\273.md" diff --git a/README.md b/README.md index 8d485860a..1466f098a 100644 --- a/README.md +++ b/README.md @@ -17,10 +17,12 @@ * 6) 支持向量机 * [支持向量机](./docs/6.支持向量机.md) * 7) 利用AdaBoost元算法提高分类 + * [利用AdaBoost元算法提高分类](./docs/7.利用AdaBoost元算法提高分类.md) ## 第二部分 利用回归预测数值型数据 * 8) 预测数值型数据:回归 + * [预测数值型数据:回归.md](./docs/8.预测数值型数据:回归.md) * 9) 数回归 * [树回归](./docs/9.树回归.md) diff --git "a/docs/7.\345\210\251\347\224\250AdaBoost\345\205\203\347\256\227\346\263\225\346\217\220\351\253\230\345\210\206\347\261\273.md" "b/docs/7.\345\210\251\347\224\250AdaBoost\345\205\203\347\256\227\346\263\225\346\217\220\351\253\230\345\210\206\347\261\273.md" new file mode 100644 index 000000000..e69de29bb diff --git "a/docs/8.\351\242\204\346\265\213\346\225\260\345\200\274\345\236\213\346\225\260\346\215\256\357\274\232\345\233\236\345\275\222.md" "b/docs/8.\351\242\204\346\265\213\346\225\260\345\200\274\345\236\213\346\225\260\346\215\256\357\274\232\345\233\236\345\275\222.md" index 90b975ad8..62f1daffc 100644 --- "a/docs/8.\351\242\204\346\265\213\346\225\260\345\200\274\345\236\213\346\225\260\346\215\256\357\274\232\345\233\236\345\275\222.md" +++ "b/docs/8.\351\242\204\346\265\213\346\225\260\345\200\274\345\236\213\346\225\260\346\215\256\357\274\232\345\233\236\345\275\222.md" @@ -1,18 +1,18 @@ -# 8)Ԥֵݣع +# 8)预测数值型数据:回归 -* Իعص - * ŵ㣺⣬ϲӡ - * ȱ㣺ԷԵϲá - * ݷΧֵͺͱݡ -* ԭ - * عĿԤֵ͵Ŀֱֵӵİ취ԼдһĿֵļ㹫ʽ -* عһ - * ռݣκη - * ׼ݣعҪֵݣݽתɶֵݡ - * ݣݵĿӶάͼڶͷڲ»عϵ֮󣬿Խ߻ͼΪԱȡ - * ѵ㷨ҵعϵ - * ݣʹRƽԤֵݵ϶ȣģ͵Ч - * ʹ㷨ʹûع飬ڸʱԤһֵǶԷ෽ΪԤݶɢǩ -* ܽ - * عϵĹ̾ǻع顣 +* 线性回归的特点 + * 优点:结果易于理解,计算上不复杂。 + * 缺点:对非线性的数据拟合不好。 + * 适用数据范围:数值型和标称型数据。 +* 工作原理 + * 回归的目的是预测数值型的目标值。最直接的办法是以及输入写出一个目标值的计算公式。 +* 回归的一般流程 + * 收集数据:任何方法 + * 准备数据:回归需要数值型数据,标称型数据将被转成二值型数据。 + * 分析数据:绘出数据的可视二维图将有助于对数据做出理解和分析,在采用缩减法求得新回归系数之后,可以将新拟合线绘在图上作为对比。 + * 训练算法:找到回归系数。 + * 测试数据:使用R的平方或者预测值和数据的拟合度,来分析模型的效果。 + * 使用算法:使用回归,可以在给定输入的时候预测出一个数值,这是对分类方法的提升,因为这样可以预测连续型数据而不仅仅是离散的类别标签。 +* 总结 + * 求回归系数的过程就是回归。 From 31f59dbec4566f0e085be1e0aad582c81ffc5674 Mon Sep 17 00:00:00 2001 From: jiangzhonglian Date: Tue, 14 Mar 2017 17:48:43 +0800 Subject: [PATCH 57/92] =?UTF-8?q?=E6=9B=B4=E6=96=B0CART=E5=9B=9E=E5=BD=92?= =?UTF-8?q?=E6=A0=91=E7=9A=84Sklearn=20=E5=92=8C=20=E5=88=A9=E7=94=A8AdaBo?= =?UTF-8?q?ost=E5=85=83=E7=AE=97=E6=B3=95=E6=8F=90=E9=AB=98=E5=88=86?= =?UTF-8?q?=E7=B1=BB=E7=9A=84md?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...20\351\253\230\345\210\206\347\261\273.md" | 26 +++++ src/python/09.RegTrees/RTSklearn.py | 97 +++++++++++++++---- 2 files changed, 102 insertions(+), 21 deletions(-) diff --git "a/docs/7.\345\210\251\347\224\250AdaBoost\345\205\203\347\256\227\346\263\225\346\217\220\351\253\230\345\210\206\347\261\273.md" "b/docs/7.\345\210\251\347\224\250AdaBoost\345\205\203\347\256\227\346\263\225\346\217\220\351\253\230\345\210\206\347\261\273.md" index e69de29bb..a60e270ac 100644 --- "a/docs/7.\345\210\251\347\224\250AdaBoost\345\205\203\347\256\227\346\263\225\346\217\220\351\253\230\345\210\206\347\261\273.md" +++ "b/docs/7.\345\210\251\347\224\250AdaBoost\345\205\203\347\256\227\346\263\225\346\217\220\351\253\230\345\210\206\347\261\273.md" @@ -0,0 +1,26 @@ + +# 7) 利用AdaBoost元算法提高分类 + +* 元算法(meta-algorithm) 或 集成方法(ensemble method) + * 概念:是对其他算法进行组合的一种形式。 + * 通俗来说: 当做重要决定时,大家可能都会考虑吸取多个专家而不只是一个人的意见。 + 机器学习处理问题时又何尝不是如此? 这就是元算法(meta-algorithm)背后的思想。 +* AdaBoost(adaptive boosting: 自适应boosting) + * 能否使用弱分类器和多个实例来构建一个强分类器? 这是一个非常有趣的理论问题。 + * 优点:泛化错误率低,易编码,可以应用在大部分分类器上,无参数调节。 + * 缺点:对离群点敏感。 + * 适用数据类型:数值型和标称型数据。 +* bagging:基于数据随机重抽样的分类起构造方法 + * 自举汇聚法(bootstrap aggregating),也称为bagging方法,是在从原始数据集选择S次后得到S个新数据集的一种技术。 + * 1. 新数据集和原数据集的大小相等。 + * 2. 每个数据集都是通过在原始数据集中随机选择一个样本来进行替换(替换:意味着可以多次选择同一个样本,也就有重复值)而得到的。 + * 3. 该算法作用的数据集就会得到S个分类器,与此同时,选择分类器投票结果中最多的类别作为最后的分类结果。 + * 4. 例如:随即森林(random forest) +* boosting + * boosting是一种与bagging很类似的技术。不论是boosting还是bagging当中,所使用的多个分类器的类型都是一致的。 + * 区别是什么? + * 1. bagging:不同的分类器是通过串形训练而获得的,每个新分类器斗根据已训练出的分类器的性能来进行训练。 + * 2. boosting:是通过集中关注被已有分类器错分的那些数据来获得新的分类器。 + * 3. 由于boosting分类的结果是基于所有分类器的加权求和结果的,因此boosting与bagging不太一样。 + * 4. bagging中的分类器权重是相等的,而boosting中的分类器权重并不相等,每个权重代表的是其对应分类器在上一轮迭代中的成功度。 + * 目前boosting方法最流行的版本是: AdaBoost。 diff --git a/src/python/09.RegTrees/RTSklearn.py b/src/python/09.RegTrees/RTSklearn.py index 72036a23f..42e23b454 100644 --- a/src/python/09.RegTrees/RTSklearn.py +++ b/src/python/09.RegTrees/RTSklearn.py @@ -1,50 +1,105 @@ #!/usr/bin/python # coding:utf8 +# ''' +# Created on 2017-03-10 +# Update on 2017-03-10 +# author: jiangzhonglian +# content: 回归树 +# ''' + +# print(__doc__) + + +# # Import the necessary modules and libraries +# import numpy as np +# from sklearn.tree import DecisionTreeRegressor +# import matplotlib.pyplot as plt + + +# # Create a random dataset +# rng = np.random.RandomState(1) +# X = np.sort(5 * rng.rand(80, 1), axis=0) +# y = np.sin(X).ravel() +# print X, '\n\n\n-----------\n\n\n', y +# y[::5] += 3 * (0.5 - rng.rand(16)) + + +# # Fit regression model +# regr_1 = DecisionTreeRegressor(max_depth=2, min_samples_leaf=5) +# regr_2 = DecisionTreeRegressor(max_depth=5, min_samples_leaf=5) +# regr_1.fit(X, y) +# regr_2.fit(X, y) + + +# # Predict +# X_test = np.arange(0.0, 5.0, 0.01)[:, np.newaxis] +# y_1 = regr_1.predict(X_test) +# y_2 = regr_2.predict(X_test) + + +# # Plot the results +# plt.figure() +# plt.scatter(X, y, c="darkorange", label="data") +# plt.plot(X_test, y_1, color="cornflowerblue", label="max_depth=2", linewidth=2) +# plt.plot(X_test, y_2, color="yellowgreen", label="max_depth=5", linewidth=2) +# plt.xlabel("data") +# plt.ylabel("target") +# plt.title("Decision Tree Regression") +# plt.legend() +# plt.show() + + + + + + + + ''' Created on 2017-03-10 Update on 2017-03-10 author: jiangzhonglian -content: 回归树 +content: 模型树 ''' print(__doc__) +# Author: Noel Dawe +# +# License: BSD 3 clause -# Import the necessary modules and libraries +# importing necessary libraries import numpy as np -from sklearn.tree import DecisionTreeRegressor import matplotlib.pyplot as plt +from sklearn.tree import DecisionTreeRegressor +from sklearn.ensemble import AdaBoostRegressor - -# Create a random dataset +# Create the dataset rng = np.random.RandomState(1) -X = np.sort(5 * rng.rand(80, 1), axis=0) -y = np.sin(X).ravel() -print X, '\n\n\n-----------\n\n\n', y -y[::5] += 3 * (0.5 - rng.rand(16)) - +X = np.linspace(0, 6, 100)[:, np.newaxis] +y = np.sin(X).ravel() + np.sin(6 * X).ravel() + rng.normal(0, 0.1, X.shape[0]) # Fit regression model -regr_1 = DecisionTreeRegressor(max_depth=2, min_samples_leaf=5) -regr_2 = DecisionTreeRegressor(max_depth=5, min_samples_leaf=5) +regr_1 = DecisionTreeRegressor(max_depth=4) + +regr_2 = AdaBoostRegressor(DecisionTreeRegressor(max_depth=4), + n_estimators=300, random_state=rng) + regr_1.fit(X, y) regr_2.fit(X, y) - # Predict -X_test = np.arange(0.0, 5.0, 0.01)[:, np.newaxis] -y_1 = regr_1.predict(X_test) -y_2 = regr_2.predict(X_test) - +y_1 = regr_1.predict(X) +y_2 = regr_2.predict(X) # Plot the results plt.figure() -plt.scatter(X, y, c="darkorange", label="data") -plt.plot(X_test, y_1, color="cornflowerblue", label="max_depth=2", linewidth=2) -plt.plot(X_test, y_2, color="yellowgreen", label="max_depth=5", linewidth=2) +plt.scatter(X, y, c="k", label="training samples") +plt.plot(X, y_1, c="g", label="n_estimators=1", linewidth=2) +plt.plot(X, y_2, c="r", label="n_estimators=300", linewidth=2) plt.xlabel("data") plt.ylabel("target") -plt.title("Decision Tree Regression") +plt.title("Boosted Decision Tree Regression") plt.legend() plt.show() From 3ad4f112a1ab86bd15f9ca0bb1a68415ca7a41ee Mon Sep 17 00:00:00 2001 From: geekidentity Date: Tue, 14 Mar 2017 22:07:14 +0800 Subject: [PATCH 58/92] add classify0() in kNN.py --- src/python/02.kNN/kNN.py | 33 ++++++++++++++++++++++++++++++--- 1 file changed, 30 insertions(+), 3 deletions(-) diff --git a/src/python/02.kNN/kNN.py b/src/python/02.kNN/kNN.py index acebbd2c0..cd75ebca6 100644 --- a/src/python/02.kNN/kNN.py +++ b/src/python/02.kNN/kNN.py @@ -1,6 +1,5 @@ ''' 导入科学计算包numpy和运算符模块operator -@author: geekidentity ''' from numpy import * import operator @@ -10,9 +9,37 @@ 调用方式 import kNN - group, labels = createDateSet()11 + group, labels = kNN.createDataSet() ''' def createDataSet(): group = array([[1.0,1.1],[1.0,1.0],[0,0],[0,0.1]]) labels = ['A','A','B','B'] - return group, labels \ No newline at end of file + return group, labels + + +def classify0(inX, dataSet, labels, k): + ''' + inX: 用于分类的输入向量 + dataSet: 输入的训练样本集 + labels: 标签向量 + k: 选择最近邻居的数目 + 注意:labels元素数目和dataSet行数相同;程序使用欧式距离公式. + + 预测数据所在分类可在输入下列命令 + kNN.classify0([0,0], group, labels, 3) + ''' + # 1. 距离计算 + dataSetSize = dataSet.shape[0] + diffMat = tile(inX, (dataSetSize,1)) - dataSet + sqDiffMat = diffMat**2 + sqDistances = sqDiffMat.sum(axis=1) + distances = sqDistances**0.5 + sortedDistIndicies = distances.argsort() + # 2. 选择距离最小的k个点 + classCount = {} + for i in range(k): + voteIlabel = labels[sortedDistIndicies[i]] + classCount[voteIlabel] = classCount.get(voteIlabel,0) + 1 + # 3. 排序 + sortedClassCount = sorted(classCount.items(), key=operator.itemgetter(1), reverse=True) + return sortedClassCount[0][0] \ No newline at end of file From 95d341fbb88aef145d7f1fe810e9581298e623d7 Mon Sep 17 00:00:00 2001 From: jiangzhonglian Date: Tue, 14 Mar 2017 23:24:17 +0800 Subject: [PATCH 59/92] =?UTF-8?q?=E6=9B=B4=E6=96=B0=E5=AE=8CAdaBoost?= =?UTF-8?q?=E7=AE=97=E6=B3=95=E4=BB=A3=E7=A0=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...20\351\253\230\345\210\206\347\261\273.md" | 4 + src/python/07.AdaBoost/adaboost.py | 204 ++++++++++++++++++ 2 files changed, 208 insertions(+) create mode 100644 src/python/07.AdaBoost/adaboost.py diff --git "a/docs/7.\345\210\251\347\224\250AdaBoost\345\205\203\347\256\227\346\263\225\346\217\220\351\253\230\345\210\206\347\261\273.md" "b/docs/7.\345\210\251\347\224\250AdaBoost\345\205\203\347\256\227\346\263\225\346\217\220\351\253\230\345\210\206\347\261\273.md" index a60e270ac..191bc2dad 100644 --- "a/docs/7.\345\210\251\347\224\250AdaBoost\345\205\203\347\256\227\346\263\225\346\217\220\351\253\230\345\210\206\347\261\273.md" +++ "b/docs/7.\345\210\251\347\224\250AdaBoost\345\205\203\347\256\227\346\263\225\346\217\220\351\253\230\345\210\206\347\261\273.md" @@ -24,3 +24,7 @@ * 3. 由于boosting分类的结果是基于所有分类器的加权求和结果的,因此boosting与bagging不太一样。 * 4. bagging中的分类器权重是相等的,而boosting中的分类器权重并不相等,每个权重代表的是其对应分类器在上一轮迭代中的成功度。 * 目前boosting方法最流行的版本是: AdaBoost。 +* AdaBoost的一般流程 + * 训练算法: 基于错误提升分类器的性能 + * 基于单层决策树构建弱分类器 + * 单层决策树(decision stump, 也称决策树桩)是一种简单的决策树。 \ No newline at end of file diff --git a/src/python/07.AdaBoost/adaboost.py b/src/python/07.AdaBoost/adaboost.py new file mode 100644 index 000000000..a387b4f29 --- /dev/null +++ b/src/python/07.AdaBoost/adaboost.py @@ -0,0 +1,204 @@ +#!/usr/bin/python +# coding:utf8 + +''' +Created on Nov 28, 2010 +Adaboost is short for Adaptive Boosting +@author: Peter/jiangzhonglian +''' +from numpy import * + + +def loadSimpData(): + """ 测试数据 + Returns: + dataArr feature对应的数据集 + labelArr feature对应的分类标签 + """ + dataArr = array([[1., 2.1], [2., 1.1], [1.3, 1.], [1., 1.], [2., 1.]]) + labelArr = [1.0, 1.0, -1.0, -1.0, 1.0] + return dataArr, labelArr + + +def stumpClassify(dataMat, dimen, threshVal, threshIneq): + """stumpClassify(将数据集,按照feature列的value进行 二元切分比较来赋值) + + Args: + dataMat Matrix数据集 + dimen 特征列 + threshVal 特征列要比较的值 + Returns: + retArray 结果集 + """ + retArray = ones((shape(dataMat)[0], 1)) + # dataMat[:, dimen] 表示数据集中第dimen列的所有值 + # print '-----', threshIneq, dataMat[:, dimen], threshVal + if threshIneq == 'lt': + retArray[dataMat[:, dimen] <= threshVal] = -1.0 + else: + retArray[dataMat[:, dimen] > threshVal] = -1.0 + return retArray + + +def buildStump(dataArr, labelArr, D): + + # 转换数据 + dataMat = mat(dataArr) + labelMat = mat(labelArr).T + # m行 n列 + m, n = shape(dataMat) + + # 初始化数据 + numSteps = 10.0 + bestStump = {} + bestClasEst = mat(zeros((m, 1))) + # 初始化的最小误差为无穷大 + minError = inf + + # 循环所有的feature列 + for i in range(n): + rangeMin = dataMat[:, i].min() + rangeMax = dataMat[:, i].max() + # print 'rangeMin=%s, rangeMax=%s' % (rangeMin, rangeMax) + # 计算每一份的元素个数 + stepSize = (rangeMax-rangeMin)/numSteps + # 分成-1~numSteps= 1+numSteps份, 加本身是需要+1的 + for j in range(-1, int(numSteps)+1): + # go over less than and greater than + for inequal in ['lt', 'gt']: + # 如果是-1,那么得到rangeMin-stepSize; 如果是numSteps,那么得到rangeMax + threshVal = (rangeMin + float(j) * stepSize) + # 对单层决策树进行简单分类 + predictedVals = stumpClassify(dataMat, i, threshVal, inequal) + # print predictedVals + errArr = mat(ones((m, 1))) + # 正确为0,错误为1 + errArr[predictedVals == labelMat] = 0 + # 计算 平均每个特征的概率0.2*错误概率的总和为多少,就知道错误率多高 + # calc total error multiplied by D + weightedError = D.T*errArr + ''' + dim 表示 feature列 + threshVal 表示树的分界值 + inequal 表示计算树左右颠倒的错误率的情况 + weightedError 表示整体结果的错误率 + ''' + # print "split: dim %d, thresh %.2f, thresh ineqal: %s, the weighted error is %.3f" % (i, threshVal, inequal, weightedError) + if weightedError < minError: + minError = weightedError + bestClasEst = predictedVals.copy() + bestStump['dim'] = i + bestStump['thresh'] = threshVal + bestStump['ineq'] = inequal + return bestStump, minError, bestClasEst + + +def adaBoostTrainDS(dataArr, labelArr, numIt=40): + weakClassArr = [] + m = shape(dataArr)[0] + # 初始化 init D to all equal + D = mat(ones((m, 1))/m) + aggClassEst = mat(zeros((m, 1))) + for i in range(numIt): + # build Stump + bestStump, error, classEst = buildStump(dataArr, labelArr, D) + # print "D:", D.T + # calc alpha, throw in max(error,eps) to account for error=0 + alpha = float(0.5*log((1.0-error)/max(error, 1e-16))) + bestStump['alpha'] = alpha + # store Stump Params in Array + weakClassArr.append(bestStump) + + # print "alpha=%s, classEst=%s, bestStump=%s, error=%s " % (alpha, classEst.T, bestStump, error) + # -1主要是下面求e的-alpha次方; 如果判断正确,乘积为1,否则为-1,这样就可以算出分类的情况了 + expon = multiply(-1*alpha*mat(labelArr).T, classEst) + # print 'expon=', -1*alpha*mat(labelArr).T, classEst, expon + # 计算e的expon次方,然后计算得到一个综合的概率的值 + # 结果发现: 正确的alpha的权重值变小了,错误的变大了。也就说D里面分类的权重值变了。(可以举例验证,假设:alpha=0.6,什么的) + D = multiply(D, exp(expon)) + D = D/D.sum() + print "D: ", D.T + # 计算分类结果的值,在上一轮结果的基础上,进行加和操作 + # calc training error of all classifiers, if this is 0 quit for loop early (use break) + aggClassEst += alpha*classEst + print "aggClassEst: ", aggClassEst.T + # sign 判断正为1, 0为0, 负为-1,通过最终加和的权重值,判断符号。 + # 结果为:错误的样本标签集合,因为是 !=,那么结果就是0 正, 1 负 + aggErrors = multiply(sign(aggClassEst) != mat(labelArr).T, ones((m, 1))) + errorRate = aggErrors.sum()/m + print "total error=%s " % (errorRate) + if errorRate == 0.0: + break + return weakClassArr, aggClassEst + + +if __name__ == "__main__": + dataArr, labelArr = loadSimpData() + print '-----\n', dataArr, '\n', labelArr + + # D表示最初,对1进行均分为5份,平均每一个初始的概率都为0.2 + D = mat(ones((5, 1))/5) + # print '-----', D + + # print buildStump(dataArr, labelArr, D) + weakClassArr, aggClassEst = adaBoostTrainDS(dataArr, labelArr, 9) + print weakClassArr + + + + +def loadDataSet(fileName): #general function to parse tab -delimited floats + numFeat = len(open(fileName).readline().split('\t')) #get number of fields + dataArr = [] + labelArr = [] + fr = open(fileName) + for line in fr.readlines(): + lineArr = [] + curLine = line.strip().split('\t') + for i in range(numFeat-1): + lineArr.append(float(curLine[i])) + dataArr.append(lineArr) + labelArr.append(float(curLine[-1])) + return dataArr, labelArr + + + + +def adaClassify(datToClass,classifierArr): + dataMatrix = mat(datToClass)#do stuff similar to last aggClassEst in adaBoostTrainDS + m = shape(dataMatrix)[0] + aggClassEst = mat(zeros((m,1))) + for i in range(len(classifierArr)): + classEst = stumpClassify(dataMatrix,classifierArr[i]['dim'],\ + classifierArr[i]['thresh'],\ + classifierArr[i]['ineq'])#call stump classify + aggClassEst += classifierArr[i]['alpha']*classEst + print aggClassEst + return sign(aggClassEst) + +def plotROC(predStrengths, classLabels): + import matplotlib.pyplot as plt + cur = (1.0,1.0) #cursor + ySum = 0.0 #variable to calculate AUC + numPosClas = sum(array(classLabels)==1.0) + yStep = 1/float(numPosClas); xStep = 1/float(len(classLabels)-numPosClas) + sortedIndicies = predStrengths.argsort()#get sorted index, it's reverse + fig = plt.figure() + fig.clf() + ax = plt.subplot(111) + #loop through all the values, drawing a line segment at each point + for index in sortedIndicies.tolist()[0]: + if classLabels[index] == 1.0: + delX = 0; delY = yStep; + else: + delX = xStep; delY = 0; + ySum += cur[1] + #draw line from cur to (cur[0]-delX,cur[1]-delY) + ax.plot([cur[0],cur[0]-delX],[cur[1],cur[1]-delY], c='b') + cur = (cur[0]-delX,cur[1]-delY) + ax.plot([0,1],[0,1],'b--') + plt.xlabel('False positive rate'); plt.ylabel('True positive rate') + plt.title('ROC curve for AdaBoost horse colic detection system') + ax.axis([0,1,0,1]) + plt.show() + print "the Area Under the Curve is: ",ySum*xStep From 8bb822d2a8a042d653edfdec0041fc089b48934b Mon Sep 17 00:00:00 2001 From: jiangzhonglian Date: Tue, 14 Mar 2017 23:32:09 +0800 Subject: [PATCH 60/92] =?UTF-8?q?=E6=9B=B4=E8=A1=8C=E5=9B=9E=E5=BD=92Readm?= =?UTF-8?q?e.md?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 1466f098a..be34e4f45 100644 --- a/README.md +++ b/README.md @@ -22,7 +22,7 @@ ## 第二部分 利用回归预测数值型数据 * 8) 预测数值型数据:回归 - * [预测数值型数据:回归.md](./docs/8.预测数值型数据:回归.md) + * [预测数值型数据:回归](./docs/8.预测数值型数据:回归.md) * 9) 数回归 * [树回归](./docs/9.树回归.md) From 12a19d1d6e433f7235615092df12a076182b8840 Mon Sep 17 00:00:00 2001 From: jiangzhonglian Date: Tue, 14 Mar 2017 23:33:53 +0800 Subject: [PATCH 61/92] =?UTF-8?q?=E6=9B=B4=E8=A1=8CAdaBoost.md=E6=A0=BC?= =?UTF-8?q?=E5=BC=8F?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...\263\225\346\217\220\351\253\230\345\210\206\347\261\273.md" | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git "a/docs/7.\345\210\251\347\224\250AdaBoost\345\205\203\347\256\227\346\263\225\346\217\220\351\253\230\345\210\206\347\261\273.md" "b/docs/7.\345\210\251\347\224\250AdaBoost\345\205\203\347\256\227\346\263\225\346\217\220\351\253\230\345\210\206\347\261\273.md" index 191bc2dad..03fa81315 100644 --- "a/docs/7.\345\210\251\347\224\250AdaBoost\345\205\203\347\256\227\346\263\225\346\217\220\351\253\230\345\210\206\347\261\273.md" +++ "b/docs/7.\345\210\251\347\224\250AdaBoost\345\205\203\347\256\227\346\263\225\346\217\220\351\253\230\345\210\206\347\261\273.md" @@ -27,4 +27,4 @@ * AdaBoost的一般流程 * 训练算法: 基于错误提升分类器的性能 * 基于单层决策树构建弱分类器 - * 单层决策树(decision stump, 也称决策树桩)是一种简单的决策树。 \ No newline at end of file + * 单层决策树(decision stump, 也称决策树桩)是一种简单的决策树。 From 8c60671397017f5296789c7724fdec8f9102c048 Mon Sep 17 00:00:00 2001 From: hello19883 Date: Tue, 14 Mar 2017 23:34:01 +0800 Subject: [PATCH 62/92] =?UTF-8?q?=E6=9B=B4=E6=96=B01.=E6=9C=BA=E5=99=A8?= =?UTF-8?q?=E5=AD=A6=E4=B9=A0=E5=9F=BA=E7=A1=80.md?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...46\344\271\240\345\237\272\347\241\200.md" | 29 +++++++++++++++++++ 1 file changed, 29 insertions(+) diff --git "a/docs/1.\346\234\272\345\231\250\345\255\246\344\271\240\345\237\272\347\241\200.md" "b/docs/1.\346\234\272\345\231\250\345\255\246\344\271\240\345\237\272\347\241\200.md" index ee1c06e62..44f0d2d5d 100644 --- "a/docs/1.\346\234\272\345\231\250\345\255\246\344\271\240\345\237\272\347\241\200.md" +++ "b/docs/1.\346\234\272\345\231\250\345\255\246\344\271\240\345\237\272\347\241\200.md" @@ -3,25 +3,54 @@ * 机器学习是什么 * 把无序的数据转换成有用的信息。 + * 机器学习的意义 * 我们利用计算机来彰显数据背后的真实含义。 + * 机器学习的任务 * 机器学习的主要任务就是分类。 + * 分类:将实例数据划分到合适的分类中。 + * 机器学习的另一项任务是回归。 + * 回归:主要用于预测数值型数据。(例子———数据拟合曲线:通过给定数据点的最优拟合曲线) + +* 目标变量 + * 目标变量是机器学习预测算法的测试结果。 + * 在分类算法中目标变量的类型通常是标称型的,而在回归算法中通常是连续型的。 + * 监督学习 + * 必须知道预测什么,即必须知道目标变量的分类信息。分类和回归属于监督学习。 * 样本集:训练数据 + 测试数据 + * 训练样本 = 特征 + 目标变量 + * 训练样本的集合称为训练样本集,训练样本集必须确定知道目标变量的值,以便机器学习算法可以发现特征和目标变量之间的关系。 * 特征(feature-是否有缺失情况) + 目标变量(分类-离散值/回归-连续值<0~100、 -999~999>) + * 特征或者属性通常是训练样本集的列,它们是独立测量得到的结果,多个特征联系在一起共同组成一个训练样本。 * `知识表示`:机器已经学会如何识别鸟类的过程 * 1.可以采用规则集的形式 * 2.可以采用概率分布的形式 * 3.可以使训练样本集中的一个实例 + * 非监督学习 + * 数据没有类别信息,也不会给定目标值 + * 聚类:在无监督学习中,将数据集合分成由类似的对象组成的多个类的过程称为聚类; + * 密度估计:将寻找描述数据统计值的过程称之为密度估计。 + * 此外,无监督学习还可以减少数据特征的维度,以便我们可以使用二维或三维图形更加直观地展示数据信息。 + +* 选择算法需要考虑的两个问题 + * 使用机器学习算法的目的。 + * 想要完成何种任务,比如是预测明天下雨的概率还是对投票者按照兴趣分组;如果想要预测目标变量的值,则可以选择监督学习算法,否则可以选择无监督学习算法。 + * 需要分析或收集的数据是什么 + * 开发的步骤 * 1.收集数据 * 2.准备输入数据 + * 注意数据的格式 * 3.分析输入数据 + * 为了确保数据集中没有垃圾数据;如果是算法可以处理的数据格式或可信任的数据源,则可以跳过该步骤;另外该步骤需要人工干预,会降低自动化系统的价值。 * 4.训练算法 + * 如果使用无监督学习算法,由于不存在目标变量值,则可以跳过该步骤 * 5.测试算法 * 6.使用算法 + * Python相关的库 * 科学函数库:SciPy、`NumPy`(底层语言:C和Fortran) * 绘图工具库:`Matplotlib` From e8be0b0d7c9cebba3ef40b614cd4571a92559cca Mon Sep 17 00:00:00 2001 From: hello19883 Date: Wed, 15 Mar 2017 17:55:41 +0800 Subject: [PATCH 63/92] =?UTF-8?q?=E6=9B=B4=E6=96=B01.=E6=9C=BA=E5=99=A8?= =?UTF-8?q?=E5=AD=A6=E4=B9=A0=E5=9F=BA=E7=A1=80=E8=AE=AD=E7=BB=83=E8=BF=87?= =?UTF-8?q?=E7=A8=8B.png?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...11\346\213\251\347\256\227\346\263\225.png" | Bin 0 -> 341268 bytes ...246\344\271\240\345\237\272\347\241\200.md" | 5 +++++ ...55\347\273\203\350\277\207\347\250\213.png" | Bin 0 -> 135414 bytes 3 files changed, 5 insertions(+) create mode 100644 "docs/1.\346\234\272\345\231\250\345\255\246\344\271\240\345\237\272\347\241\200-\351\200\211\346\213\251\347\256\227\346\263\225.png" create mode 100644 "docs/1.\346\234\272\345\231\250\345\255\246\344\271\240\345\237\272\347\241\200\350\256\255\347\273\203\350\277\207\347\250\213.png" diff --git "a/docs/1.\346\234\272\345\231\250\345\255\246\344\271\240\345\237\272\347\241\200-\351\200\211\346\213\251\347\256\227\346\263\225.png" "b/docs/1.\346\234\272\345\231\250\345\255\246\344\271\240\345\237\272\347\241\200-\351\200\211\346\213\251\347\256\227\346\263\225.png" new file mode 100644 index 0000000000000000000000000000000000000000..a698698416e37b01ff7daa1aa542c00e76bc0259 GIT binary patch literal 341268 zcmeEucT`jHwkDtmB8ZA8iV#$abX1CTu+l-Q5+Eoj9i-PJ6a@=Ky3&;OVvg0GronqEIU|MJ6giPEN*7cMZp6ga_cWgRXdcHw2%Ee*zv za0#Z4TApLvzNPUo{=}7OD7K{3(82;vwJ?Kko@Pimtt=|ae~L-q{N-f)jC~s`JKN(Q z1q=tvLyxjE#&m0ISCH1dSf0a(^iuzs@2)rft1KG#Xgl!aCpYccSQx$^`8ogmqyba2 zH7l=YLO>C#w7|zV@o7(2os&abZ?N6G=agLQ(q)BPmGh%3wT(tSd&0vIa3#HahDpN; z@hZOO=LNN|7oL(%Tzq)q_=@J(ORnx%jcu-G%fpAk$ApW{e>}B!8nl8{X`!#$SJuK; zCoEAqO&W$+Q$tAa)1N&R$USuh99;Cg8i7pwxT2yco>tAj@GV}ralyB$fn2?*66xcp zC&eifs%*;`9I5AQ|9Eln$VW+SaNy<1dDBQqFUxrL)SI!fr|haN8O(cO-CG>AlB+k- zJNPko`^ZQ9*}cRa?=FHM13vsU2}|?VBOPD}f5~8_-l{#5Ul#MuLYhb8V0h>u!B7dK zgU%YfJPcg6jIN;vo-k)Mojw@W9eUusCex2F_SYPKVIfAWTM;*Mm`o$Ma*k&la?li+ zXH5Mf_v8qB#O2jvdf{hQnIyvfZJEOb&fN_A@cN)2i|CEC*Nk7EeiUH&&bJ;Go+I=8 zh|qN>Bl#*`v8OsYY#$Cehoho;Zlu2B?PK);rG?ME8|}Np!<_iwti*wmraBp}nrBnC zkN~c(XNf;0u5nJYq_$MAihe$TV#kKJ{m|ZKZg|Rc>BP&}ggZ{TZ!Vqc;Np&cd40`D z*@*eW6;sJ#?%|lT8dIA3?@t+l`tHeccWb!hO7`_Qs>`xuMo))HUAM^L?dO|^ZSrlN z3_4C@zVSuNPWJK~&uKk@$XD%6vvwUaq&I$DW?ejw4{aQM^=;r&@ja7|SLIoGUrj|y zHuHb0c@X^R;+WI&iK9`8O-{cgJhQIJOL3>hDTgaRtAEP-t^3FHjCO!x1LO2@P_*G! z{IAZ{?(J9GcXuUV&jfB73BTb|Ieh#n;_1WdeDBhqq|4m6cb<*Q>_y5=$U_Ow)1NZN zbQ*L*Zid{r5PwqZv7m=ByJ(cDfzpjSgR~1!fmg5PzDszqD#kR#O=_$NVMWmIj4p|t z|cwrc!Z;Ddyt_~-jFy5)MS89&^< zFrN>9{qmUZbIGb3AB^W4`kwYB$e7)OjG0{1{H*o){&wVQ2CKo%TVFK=uL~N^KK;%e z?UPS2_atIkin|M2`n{0FpSfn)wWbHBFI%hK!q z@7e}mEjTR9Y{osj^04M%{KMdHmfvoFOZk@n)$QxWZ%4jjzP5c;*O3uCC-_V7sFsh8 zO3F=LXRRRJ$6EY}4Pvzdw-PH}|I*^t%1jOt;Lvr^qH1|0s-0K8)F^mSd`2))(EH}x z%dT(<>yg{?<~62U@0T0Snf2&M-7Ym-t;4I#H!FrHLhjMH|Kz+6wo`p(~*)r&aA50~(bYqbL_B zrIcFA6s3$qmi^kHh%9WXqRUd=8^t(*Dd(-I7@7#_%^t)b08u(hz*46nA zrm&^BcAo9j7LPQ0GwfNS?GorxFv{0M%X65b#bNFWkBUzSzE_(LO^atTcFP4;5!wO&FHGA7^if!6$)Pw9A8ymzM zvv=mH_EdJ)9Cy~KzJ{NfWtkqIh&R;b(6VSXxF-D=U6_tzpoS)dwrfl^5yFt+f)NkH z>%u+1?0q49(dFfn=byO7_3&H*=n6{P*JQ4MH(f}f%>#8zjHlzM>gmYCM_65sQonB5 zk5;5MTQ`?9pH`IUdC>EUHU0U(^Bt|u?+M?>FLi!M_@G!SL>BN@n^3Bg2s$6hZE}1= zY(%j}$xpH8YU%k{5a<{-CDf2r_geO)1fJ9}^esQ#xs-Up?!4W+cKeOl8||-D6l|bu zNfn~`;>nS__AG-#11Rlu9i&c~9z6SJwx^WIwX2uCpOmzYG=d!}&s7?@-|(1mUFuBf zolaJ*p7IOsKI(X9I~JAsQhCF#XZ9LScICp#OAN`R)W%(V1vAB1U%z3$?zLWk_M{XD zK?Jf>)jzd8G$bMCJ?v0?6E2_0->0RSk25PAA+dF`sdIb2bcYqvt#|x)p?9f~FZEx> z5!zM^C)Ht16b-u0e5Kp_K zW_Hse+HAtC#!TCSfUs0M>*=%kru)-~^V`Md#ke-RSZs-B@xlkQB1z>i)p*#i`6u79cVG6ioHca&T@&i-cB3}8L5y|FsL~bqG|+VQ-n{2H*Mdm3dI^0}-swuOy28XQAStG)#L3H>fv#wWG4)e(iXHVnl6LVB5}5Ja2YygI3U|iq~|`pK#Mg)8L(! zGI{h-sY6md4Zj+Hp{0T@t`+=5^kYy$W%(k+6VnKZ(+#Ns*zK^L2S4nZ+QyTk4L=*= zvWM0E;hxm>=h;nokxzlkWp^2#$zBs<3mxTPFnYbL!FPK-qRCR8DmkbD*H)m1jjm%X z-ZJ#P^ieBWC^#K@Rm-GZ^8$|-`m8wAjltD%`wmrK^ls!K7aM#26Z+E|J0A87O}+G34sh4bu2Tn`A3zi?QHyw~f|OuXXnHP@r)kPRj3 zulTEFbWLA%LEPV%!e^;2-w%E~yWS}c;=F(M%$atbnk+wYqWOqft;txNs{*e+seU|< zo#|L8!$AQCMpg}m|NEcbZ=2?=R#c!-|N1S*LYu5aG#L7==!g2?|I#3TCKRTqAIk7v z5xTRW@-I*C|Bv;*Zq@(a!+*Bz|8Ix??B)N@wjqPoX8_Q~?_Ry1+jb{p??h``Tg&(F zTDu?beY)_`rcp^AK_M-Twgqu(6_~?+gs~V5AfZbpoY|YyZ)CeAEC>z)!y((yALKA> zR0$EitF})4uy%&bvch>5?hT*a`%a6e=B}_T(9z!TAA3!-FzUsb1FbC4oID^IHQSJ{ z+pCK^lC5pgac4kR)gFg*ZNFK&JTo(XO)X0u4vYR2NGgFylFt^7Fg@>4+30%m^V#Xh zZ?8^AMI2RfG!E^nc+}Y(&V1zkMrW#Y9G{LzxelpLaml1ORdexY3)!w5ExiZZru`r% zVhv&HJG685A+59sDhru&1vIJt8UBPmPv1F2HeAV`RIi15(P#JCX^GUr)&sPzI2oAj zZqs(y+JPCCR?cV;kNW-xNwFX~`Bk3F{Omuo<2$9%AxkCr7nc>1PJU}~$4zwz?xM(z z(#xOP_MCQJQEj@X|p%Ne>C{m0&y|C}xb4*LqsPUN4bTNJFRzF`O^X6?e(sqI7& zboTE*fSVkMYvNZ`VMe=M^Yf0;E#v-JD8V4Np_<`6UY)+Dv-RXINrft14P-1X2 zic4SQoRA9ocf!Z9Hyj5`KmU4J?m5$19=I_l^O50we~nUsWc%hBUS5}y!^_wIg&_1l zN3=CK{`p7vk>)zzrRFp_m&g$!aOTVJ!k=sX&rANL$7y&orP>5Jjg>#RaSsiHdfQpt zca#j(!o+;SjrEmsMgFVN@%O054hJ}tKllke!13El?gtA4`44_JKWka%R{r-U)%5ys z7pS7~uy=_?+0i4XBv@aal1#fa^DiyvKclnbZQC*Bi0V@sLm$%}Z~S{VD>4!e63<4s53v;J$m;Xjt{DpVe@_N&}^xOo5g-<@{? zc8NwIJ@E07b)Beka_o7?`hO=O|M9SW!onjJ*8elDeqv&KJD@M>;J-H;_Nb=T7~You zFdw^eyL`ad-vvHD|8MXVU`T-zeeSlr@~*5Ce6IJ3fJel~$LDY!{x?^`ANGLAK4Qtx z|B_q0c_3f61%QF5(O?P9fA7?82+6=djGVChC$rJfQGEKJCh^Z9@o%4|9pl;Ru|+T+ zlUoq1`{(`szu(+cbFhl{jUO{FFE6IXt0@6+$&pfP-V|vFzj>+EnG{K|d`|F(e{)g7 z|713gPs{b}8zbPUJbZi{>GE#Q%YujgEgxkF^JA?#r6H@P#=m*~uT!~d_~Vvz(A^N5 zLR@!L?bn?yGCQXLLzoTg{4)sj_U+rvB@o)8jp^&K{ap-m5^f4`OA8x3ckuBU##Wcg zqe|h&w9s`xNuTOdu@lWky6(3)kt^vk9Nt9vwo2jxt3k{F-n-0W3>2|TXDsito zG?gBCo%`akF*Vjpj#^+|tAL-+epYl!Vbn5Ob@vU``!&N%wPHa3!j*%i7n%ZM%C4h< zBN&V1;0^a<;Wc*#pbYW^`d3VB>f-8qniL*&RCTkjeAFiRR#Zdy=Z#6-)YPnv+DWg7 zMSRd8bh?J_hVkeqDT3>h(kWO|v>P2$16e}T4SJP{4Nn$}3R|@!(~gpU+ltK9gFI!) zwMeMC8wOVE&^RnhDl39{*wly&??0w2{y~HJ#hcI>@?5*Urw4&F& z2gCN)QD(!JdfleVv0rcVmHhdCrd1kRa33e1dIu>F$bZ;`>4_28~R!$QPL8ft0Erk!L7)%K`KB~Q>bsdp$nrEyg6#w4kF z30%@kaF@n6Zo&KZhL-DLK=4B)H{^QpCxL#msmIEUbayH_#0c&}DfJJ|_j4u*HICa% zyUa_IH5_1Gwx`GG) z+2{KZTm}Jc-ojQn4fbVxJNCb3iT`PqebJ%(#)Y8!8xczhIA8_6I3cLv&7?&HR<>-s zYQJt+Vir)h|!}esGr{Bh9Z6wDSwQkpQWt zBxH5!QYOpv9TywE_FCpsjB805qqEMW8j}uPiWU9Dr*@nWEJbX%UZodt=V;i1u*`&c z1SNs`YTBH4?AhNU)FBb0;K;(m2Mo`$Pj_@V$rB*@XhPQTghvo`q6RCUoklC5l`M=- zcvwPQ&CvX5^mUv zF->r|wnTDh)<J$wSxT&@(x_ct%d@n;HhS4ihK7|ptvvN#oG2_@Rs>833E zr>>x@?6I^Z?60l-yNl@HyTuCGz=GJ*QkOZMrANib{pnsiuwLCQYIVdPy+==)kp|;j zvXNo$bs;AjH&TsCJQnTRVJ7t>(!kXc$lSU7y?S(h&_>ZPrY9$`eJ^Lrt1$semQE#- z8|={#(hd5CSLtfv_&FRbt)xrp=Fa zn5v$eUOu=2B8HR%5I(uX8=9TEo|b6|ZFldc1Ac_qAAh6F)PoARQLq$pe}Hya(WIX% zTF^qQ_xE)6(V||Ct{e2{>u&Yot2W~Oxgko2_Yp0Kv{-KYCA{3R|NX);r`unn?2QXQ zSf(1)ctFOLm92URdNsxJPTC^U4T$^Bd%Zr;{ZG>9`Xq-57y`QZI~Ldmu~tFV-)7mc zPwV`?p;Mm(xK<5Zj_y#08lhW4yXgg#t8VBKH4;Xhk%p$o(BX{$TPA?yRR78=Z#HrE zu;kwz^r%P8k#h*6o4W!?V68~B9JF(I`JQ`ULlG?vh9OnMI45BGWq!1@#d?UGa>~Wu z5@i@)y2ccF|Cw}8y z*uwcARI3Hl4lNs3&40(`{ZrovC!blF2i#?Q6dN(u)7z1rA z;i#ntwPwZ}FGa+`+%jd6Fv}6b=Q(&c@SPjrct}%h35sw}t(OJZ79l87*|CuT;B01n zL+X;peSD235KshV#_0FAe!N4Ch13Q!JY)T9^b=#$XZ4|0OMS_89bfML(~a`+1NHzv$o4(YB6t`gUy%MzbNL%m!6M0F$T(x$m1d(G2UAKS@Yk43?DMxi8jBIJyW#{xUyZ zuf~aeV3>j``mHvNcF?f8?av_GeEw4(@^xli4;6VpA3X2I(WyQ%8GTwt}m{ z2}{E;ZJ;^~tDQ=)0t^n?ne2sx6cei(W*v%DkjfuGa@58N$##D-N`|C(9A^{UlBJn&`utGb~fzqiud(rBa}zmYkqk&{bb|dNMVjAmp9(?`@pVZgSlr@Q=`j{Jc&`fvV6E zi#S-<(9VC{*z@0SoFXKK?nUnU%SQ9>L*B!0FUx%v2FjoOY<{r);;#fQ=RBio($<07 zcnzuzc{t1z$00gwv=?F?;r1eNOW#}<-rhqc#dbIN690Y-y)73|tLn_rBX|DBqzihJ) z5x9bmIbP2JfN;3PB8vIQsi(JIoswJQ{ImZ54KUg&3mK)euC}c0Cjbff)&vhoA zINZ2 zQ|nS@0enixd@JU$2r;3(T~r|S@G(&^ymMFx0EOQ8gg%qMn6|6>!OdfnpkM;aj2cmn z9MO>mSPg&zHA@W;T0)48O=Wf`9xq2LAO!}uC@GNB;Q3oY!$_-c0~-%?2A-r=HjcCs zEgP3!sBI{~0z^f&+XW_D9jEr&SJ~r2VU@H`!?8bT;%}PzZY(W9hi{agDm}|@N>&IL^?6}YM z<$<57qd-#rU&;PE#pv^YS*=EnBBMUjHlwfG^&C?VX&q9HN3G_@+ZuprniBU?7Sq>1 z!P;R6nkCePI^wS!0T31aR2ty(L1X~0hTu!7%k@xP!on@7;h#LeZRT-SC=6&BAXf*G z-}`{dQMg0h`;nCf&>nEHM@Jh)h+4hnLeeLIvHP5fqF}w{0-(bb));C+M?flwTgkcw zr)y24W@`0q*M5C_FkEc*U}LWP#({o7Py*!m7C_P+`#-b)xhr97;tEk~-SnYBoJ^gq zHtUAp3U3rhZ%Oi&dY{ypwFAp(R$xjE*crQbzceXzQ+Hho3B+E+^w#?1*2elS5Qzz9 z*mF92y{BM8^kukcwiJChHsst;Zvy=f*U|82iXIjAep^blCa77IWG|D39V)-kOH|WB z?CEJ+9!Ah$Ab`MA#BoBjgoaKxbOEFU*{Fh~HK?e2I70~ETXX!p;Mby>at_{RG5ff% z#$0y%J^x>HHrjC>Y>4LP^#-oyWc;2=v~|rVb)3|Ie)i951a=6PDrG3u}L zZPdL&pE#;da{;4^XzpDD6$M)^6u|9MHDl9l=$aEZ9afHwefG4whjh2TSNXWRPibm` z?dFY*V>f;S_CJ%)e^62lK^fRMx_L|;#?@LjdGfa3wCdBfC&M~7N9W(Z1|^95>%>{7 z%C$KpX&L1IxUCn3(`@LCO{upWk3#XzH$914*n50VEH%(S7Esx#SYmNO4ft z2}ET6&dKtnERVvE+JgEGNKr zb^Ua3HFi`v#ZG*nJ{E96iW;a2RWMot-^xuIoe%~5HxHn%S+w6&SahEXkIqVD1Fk>m z4$H#KoMRFNROOlnEs;4>Um}wMEnxr@K^KU`N%;Lm!IMcn91RI{;;EniDC4(A|K`@! zDvg%yf&?we)GgU43!YMkNT_Q0*WwCz!!gyM7I&=QlmQwzf>Pq>icfnzR!H62y>?-} zlknM^`g8pOu4c)PQjIZ1W4B)a;fM%emHKVd;%kD14I60$7dU8l3COrY&7Oz5t|7&jXb{XXMmuiD8%LSQ% z1zr4AwNtIqI~HRnV7yd$*v>cQO`V&AP(~61eK32^XM0Woedegz_K($Fyt;Z9pkoLq z*e^ke!I14%1=R8B%>spIypul;_4j1&Z5FP6bWjyn*;|X_Bm>nnk@3B0GU_x&?bq{* z%~M1e`Py3g_ z7IrCc{xRv@%Rwi@>8Iyy#&FP5pnN87)F*DL z;*suHAU>1j7t(#IZk0xat6SlfMi0jY4dvFwRt`nBG6D&Nc+ESv;3{Zbt3>cht;6e{ zS2mmPb1r`kp5DkRUn;FX<-5VQlXv+|tA`lqPL6@;s$tH? z6Pf5}zg-^A2c5|ec7Me@aGkB1wT;!Fsl2DndJFEf)f3IWVwE(p2=KzoH5hly_9MGmh?M^xAmED`Fzkf9 z-ldG9VF4J-^oZ}nfvsh9Zzcw943)xrRoxoPS!?so+Q@h^8-J&@E&+yIhtrlIo*#3lRf{BT zq6J$9NXy1kW)KHT4c=IvmXzi`GaK?pQw#l#q z;{VUfae;b9Px@a$c7NT=UfS}`s=>NtxE!qo1oK&0gS|<-nuWdh_w!L-mqf-nLw+3i z83#O9e)O)d&VI(r8PpdcT-r7=fS`Af4MTo$t<8SrGK{V*t?nRXn-lx*nQA&f=#c?Kd3G^CEQN5Nn;h?Df6SR#liJtH##g( zS2_$yw&sbfLDYMkPm(vy_jd5vAQ6ztyTZc)$xgv#K+(JR?h2N^=byoofSPW$P$D*L zJhTBbYQc&*A=}NTn?2z5B;{k=;&iJe%TYG^PB#6Fh^p*)oB*$WLqNDuqL^s*5$Oh* z-St#-#v8qbk*B+!kl}1;;M_ge^~AZ76Rzp z8p(}B4)x`Om-Uke_Vk5DTggv~w}KFrkd-@SLEnET?M<@B-xRE+wTgJaHqu*q;d>kA zN`6yIHVTK}d79l5&u(jnaiKsQm7dJKj=txGn2C;$-Z-etoJnjwf7;sTu2K1?gz)Hd z?2_uFyFUhHLQHI{nch;g`8l=Q)O_k8C3@m!Vha>iN`G9|*wmf9GC)C#<}FF$#B5{<+zvPh7^@vUp~-QdDOR@^D!Q9ay=GzfeW87 z93V~0Dl*;^Kc+QfBxFsd0yw>PjfO98IeMfFa1oL4DAU56i!A*46-wsi4NO%@K8*%y zJF@{Ff8^51^gT$xaET4~f#`=1QsKL*CT1(%Vrs)AL)^8>TU_Tl zs=1>E_NYY2qe2v)@6g?!e#m<3kYLLaVbOp)i5J+k26(sA0!-e9r}I<#qFR^AUK~Y4 z=j9z18($MSB~1Td#ic(Hj>z78+Z$3K;;Fyoh>2Gzvd%9H!HIwJSiB*vO}pEaXi@}m zYK$wq3L1HuKu8MdrBCa6{XI6B6;7ycT2l%LQM}d?)>cH_^{4ZLpWtnq&v)o z`xqkN!>62tT|+|AM+}Yfl*@qC<}Myhr=nY?gNc&;Zv^Sz@2FiF=`5vu;1<-?Cg_h| z8&&%pS2t(*%s3iH#_nw)R~IeNN-y8$)6p8@!Oqn}PzRH79~Eb62e$wjpaPdA#rR!9 z08fRZ?!gHz5amM~x<4Wn8h(D2tDBQ6JJZ%#*GfT&IxYj7`Ixz?48Ave(A$GN8?-aB)^)P>qbEUKjGfUh!alDT2Ctcs`kO) z%MG1%;B^hQvjeA&t%Dyy_SREHYS8mF#qq-F_HEgYA2$pqN`-x89|*$?P_P9Io-MSl zKgM15a#-GB9-&6fGD6pYAhg;#?R(`%VPDu*W%f>0q19+f%D|p)qA%UqYs$w=evl%B zzVwF`FNov>UkA^~O%>X#hMzvEjN?A3OTL=wBC$SHsOI~S#O+4Q3q7{8@*~dp;#n@I zXLk@PqDCifGA z-Shk0rn+)`1wg28O0*f2#Zl~}{%w^fgo&99v zq+{+C=2I@sR@#ipY)9`VWFWnCJIx9i+}dkFVpITx&cY~z*{$p7JyMz2OGYEM=DVSr z)dI2+m( zt7wxC8wOlISLjT-$lQ17gHUocw7M`ku4?%00KhiL+A~(nlh5lZfoSTK^r4GRDg~a8 zke;Qj#ca-t@;%+Oq3S*!Lp!<4s~tuOiIBZ{t1z{M#1N?x)MxdC;bL77ZT^lg57c}$ z-gSyp>K`++st#mEYr#)ezp%75!B~EZztNXSI%&GLPsH8V1ch1ne2gSgGi7(I=!Q9V z%!ma#OV#_~LN!v6sZY8c^Ce&1MeKeWC3@ibz+SO6wZEJH(XsD7oq&}@6oc{*rfpk;6`R{h zCI*Mo0{Rw}(vtcG!=}wgcvmQnzx2SjE*WWQCmL9CYb7$GDZ^#I(%XZUDreCcGPrHP zyCN1_XI?w2%IFC+oVL1sm#uxTT`&`?EM-uovi8C-+JmIb&_)^<1@EFBTRzkBXf1pc z)Z`jSss-K#LRs3tP&0f));17)_p6w8X=0gyQ&XJlJRw9sylB_AEZEwrNUNe2x`auY zUL0|Fon&Ck@gDoipdAjOC&ZkTdHe~a=EEH!q;Q4xK-O9}ge9uk2VA$d0!I@!)ql&Yy zUnC0&6<&_4q1DYM=>Dp)I~$RYDySKjX1;)9#GDm(I`<*Zj2ns`(b2LzuKneP4adUw zi*f8_0pG-hnI2bl;7r9y-wT$Vf~CufH}(_cb5EKWix<;Qensp7mPL$3IWJkb70r3( z(>kev>+K>IZMApKd4B!cp??-%%)u<;lu^Q+D%<1RK`5ETav)gq46{x?7gmMJ3Y!_* zLXm>wDx$VpVPH0A4A2hTyf|DkwWO$8B&q#iLS6G| z-+K|4K(d|%+M+^kp!M=7)vn=0;e}mmlYEqTkn%{P;sorb$NUnYSAcU@2v@OnVp7zQ_ZVG8KTdb=m;t4o&Wi>|v=+#?1XmRtp4VT4v;8F8iSUbcifc zCZ&p2ZYFbi!8e1lwc>ro(B zK*0AK{3k4|O#6@r&_cO60*DW?X6m!q=Eo`Dq+!Rq>!6u>`Tk|WQ{sn8;do{2VM~N@ z#aVG@3Ge_AyU!{+cjd>0N5~4F%=W=3FbDhc;&0zMvL|`J;_I;WhR?7bvz?+$NqRZz z^rG$r$XXpRQhP|XzFVCcf+;g;;0p6O#e5vaV9rg;0J9=`O;7yH0>v?-EL5O#$Xg)kU!LA{N>sLtKzOt3aszLJ%3@l$*;UWB` zSZW(}QRYgq1*&k_JY+QlcaNujJ3BLK8XZ$HlL|R^D%z$dX4;gq5_z0Ir-}2cF5&Z} z*8$mnt#5>2Iexe5{1+T<@%@quZnJnba;+xVS#dnFH&guBcaPikdRrvz#Az?`*C=d( zg>BrlSB+cyHKz&@4uOj3rQq&Il@M!vE!65W>5PC^U~$IhQNnh0`I~he9*vm@AS#QB z90hGRu{7`7=k}>ak=iQ4^RWf1(OZlf3--21zXCCnCu95l-Iv}gELC$v9l$!%kaQtM zpsq}A`A1#Z8)&Y>H<)`U{-gQiG1Jv+HiL~n?LgGAo1s0Xs@Py+<4of9iRiEZ6b8Vl{#E5(mvHEkLp%$XwXO2L&ud@%0q`2^lXd7r= zszH3Zqcq)5Gc6%Gy1ui6%BFmR4vPwCp{5rM{9lrs2gwhZqcc2P&v1bY$3b|@qT64D zryqCYYRW$KUd>vIenG%gag;I{x?UcS)eWeX{X!11Ab;4rtTgwp!(on+aOWC&Z& z=;ymd_7E&f;pW(*9zrVNGoTx_T*x7g$eC3_%B~y(IeEKPDvt9PO$IFN%y~|iR1`Cmy!%<$0%$Z*>UoPEh^4PmdZktc27=K|pp4pO#Bls|g!lN){ul6dqqB*Zgd zywm1XiR^hVpj}npH896cU&-m4Kl5-N!6{r9BX((C%Og*mRhx^y!yn^@bR6~Aa{+T8 z7IP2txfQ-fWlBPp<1(~*<#tj~l4X?KI5nkGl{{475_@u|0u`?!X#tY`w3C8t5OSxk z0-~^Nsa_6u`Vewoi2B)ewKu7wFR`>zSZ)wj9KWmL@foPSDfW`AZ0h%FvwBTRrIu3a zGu?dy-`ba59(Zfi_@k=FW9}BXWCNRE_2LhSoPX7%7dKip@h+kD3c!N;st8A5mel@)a#b+2TJ{I5=?4qE)Tv`J9|X*`z`U~fy;T4`f?-vV>qSJ+Mb(KCuPf@ zMw-G$*UfGFY=Q~gZR~YrVloRr*7MP&3bh^jeHZ^vrpSI`yOX%vV2k48`v5 z0*VjFg0KT?=U#6TzKxNxjc4{%mpfh;qh7t`SkI`fbkSCx-1wMd{v#TwW zc1O(Z2aq3`BHjHe)4vg)hj$JGZ3Gjqq2xQG)|mONw4qcV*CP3Kzmu|go|UfRGP+m@ zv%J$eqTj~WY?+BddZ~97a$(&)P`zSmQ#4)qV3khl9=&*!?lJ#tU#zpd?Ygs$^DL_I z2}IgtTtD=elAOtL9`x=&`J}rVy2c|2DHKyf)1!>+CJeO zFsk~TcmfkT_BgAvhmqynF(jtXK0ExyfTW>u;8p+o$f$8k>v_fAK!Xg~T|j3& zjeKQ<{<_929iW+!vD7*w&(b~233XK_%ORJ7I`O1GZLXC<=(*ijEjaj|9?#Nlq#wua z49VDEEC8nrBP2Dso++CGBE;c+r55>ad%wm22nrr!1tD*k&w4lxH=k~tzjgV!mSztb zNI2}c;CtTqy+Q3dvhoKl`~uWW{EK7o2U#cf_W;X0mP^r0Y;|w~n@p8e7xw{$hFxv_ z{U*6XcU^SlNSfl8VZ>nU5kNRTJ;QT*t9tlNN7eN>ro@xczw*oiWDSO#HJmXhJzSKJ zkO-LVtT97Rl-lOIYa^x_@l2&E{65M(x-(YoE@toDXC{GszSEqTR^s6S;LFTNLs4jW zsSiP}##A6SA;8h)N2gT1>q9eb=7^oMFC&)f@#~45(m>x^kHMnjW_7h z^3@_VpfFdZQU((|nXmm98M#S@H5#%*?8zfj%5m@2pGoq<_*$i`usgeuc@;!l*bP{d z%9WsDFBO~QLfsiVeD+knPs(ZEUy%=2U(ZCT@qf(z`>7~n)3v$CuT4ITHPa~ z)nUSH6%nT9n%DCEHU-F}GB`BjX1kuAlCQ0<<%bt%^eLiab3mH(!Ys|T|EdKwvjYOW z62JxaU6Aw{PlD8X6sL(aNZFD10yO&f$oWwQG6+xjMN%k&Z8pNB&cHr!GbR~ZmhP#}MFB)rJoco;+ z`LK2+tfd`zHb@OCjYGl)JS|hFJ$y20?F^?`7!XbBGovTD(<&T zPmDp6k>+3S=ES$2U}IR5FWb@uKP&<%jj9@a(P2wbTmOF1?sfcJkuP0+wdp|1zRENf ziRlmMXmge(gEh}PWcr#<`uX;%lG)E5Xm>z7{O~E!T;JH3A+E;Qgdr|GNU$(8SDm(C z=*bIaR?;@#;?~L+SlG`RW8L`4pWANnM(pM?c&}~8(YNDxh7g1roi8^ku*7Q?CB$o@ zwxal4r5I0cp4pspo#La#Hv)Am8cnTB3tbB163or(TKHCu#gPoB_wL@|;|`<-XV`Qe z&Y#u5UWTS-0q*(DxV=!Rrp$`b8IUJKb+AIrs74?N$1rNWXb*U^rK$PYW=A~P`~@s{F77o0O`q{8XE>B8IYx<~nHy zjml$O7dU(n2WRtgcoDx!+d1{GT{5~2&TAyNdAv%r4NAB6P=}D~Mma<>o?JII0cYJS z=fl;trl}Y!r#YH{8}p!B<0A993eC8v<$!@ZiIPqUa3q>Wn3;_Y@eWO}_n|dPMhW)} z%xYiK*9ctK;xc$xiu_WYe+!wXeWp`am{V|IHf#ExMco$;_hVJ6_p_>ACQ|Yb7s-ZR zO6A=QsfR8#csE|3KX`J1oafzbr*`S!=5LkP7R=Ogwu}}`mqB6nZh*@2XKFSBFtM`Y z@opZu&bn;NsynlZGezMqWlQ_FFB)2E_bX32vcHow$Y07^dzHA-c2?YR7!;Gd1t{Au zlHL8rAEjPP8Tgz(V!>i18hQ(CDcYXG)X6Q7B)s!68JgrO-TmU?fBY{13%3B*MG9j+uwO+>x(37 z3jf91Va@86%tPW~r*0mSO5uzP?6PbA83p1$FavD2#~rX!xsk$5zO7h$(6c`Gpd`&4 z(ck^>T!t!_4@vWTcU{)+zO|37k-zwE|5u^>AMdOI|9=N4?LS!l1=wQm9_;ga23O1W zH#+-F&_zERhYMD8U;eFxpo_NVL9elH%>@eL;Cy2+ZT|kq{+l+IjW}J}rDU)n<7LXM zc9^I%P-3xr-Kjji7W-n@)2lX(HblRpPU-h#&K_!w@d%l@_UV0lx`@ip!$0>0`oH0Xu}^+Kh`*$#?>hExie4GJBCqeM}68w76fx&q=V?& zZAIXeTxIfD&IF6M|;mFNTJ{NlFmTOG;8-&^CO@o}cyWRSms-_hBx?gQnlhXAb^&iy7>9mbV57#$5-fuY$T-i$Q+;3#6|5Iq! zpdQ@iohB0fDPWJOp%fLO@Kv)~l5S(^FxZf=i24}nz-%mj?VFlq0l4%>bWy@$V{yC% zix-Gn&{`*c6&L8x-USLPXy!7VyifPf3OrJDQ!V@y6Ye{y4pfu559Y>|#reX3x2W|28%wy$ zpEuQQZd0%%qGrG*FdASQ#;(J5Gzd$bR&c`c$K2t5Eo6zP7%wd)JH@OiPm3Ej)qLfZu~KHh)1@&dG-_6(F#`IqGBP5QxB zDK&8`&)W{TcO02N-sviJV*G{KepMEJ4!<4sVkRns`29@{R6Dq1`nJIa{#i__^N~uI z$XoU2PByPleNPG8msty~+dS9HS*}Ymk)JGb1>U<>cWe~)0}A^1lf$G)WWqF0N(Poy zTJ-z$elv!)M*_ZLzYRrXI?sP=k#FC@lmO3sQr)LW(y(^q4zdjW?EZtHQ>>Ckzm3$(cTrZ!;Dp zru>G9kMVcB^Ljza+O60AysB7wkh1F(Lrw~5r~y~5rCFr3(*{2a=%cdp9=V-!Y1rKF zrAQm0S!usd2)?v#L1W0NJOcu{|Sbi?R~^5Mm{^HV)bnP4h@dW5XN zxwk*BX76<6+4?X`sxIB{eJOq{zd~)~nuVQ>+fso*#(uflQ|=;jiue-|&Y_B|4d6BY zOYW)}RJWrk-lfE6yQaz}%t`lc{HiX@bHY|5{s(980o7!-_HQd93Zr5dMZg9~$3m}; z1pxu2ODF;&HAGr~K!S*h4Nwt+bfrlN9YPDm0s_)YfDlk1h5(_21SBEw?dZ(B=gb-Z z-+SJ*ShGe*o;-Q>-uJ%C@4j}$#YBsxQsm~}T|J~m8OQG4{rFN3Z-HRGoFdAqaPx?M znHxxDR@#D?<*{ln|FG#U|H?DJ61?2l9aA# zTu4mKuiRsRYV~!-XI)5^=yZJ`FpFd#oOLn2ZSuoT-@98?oB2PC>(Y#})ptD#2TfK; z&ki!G)3yhj$e^hg;8!*uu-+-2;61o%4a>m45F4vniHl`Vh-LWnTUUp7 z5R+l5r~i{Zjbfu0lK{0eBEXgJT!xN< zNQB}xO7nzxq%4(Y8F&LsRpxEk?Yv!)7z(OELaMa z#>niNgmu?-CD@?EQ(G2~)kyZHb4RLNuk!rxWx{sHH7{5pVBhD%wGLYx?cIMvFQ*6D zb533MNsL8bR#UbNTFR)kT4d3l%jv9wa!<1j#V;BKr>0-^kT+DZ~E4GNwjq{(~#&;e!ntST_ z5SxU9JPxBPuRw5;%Bw(@;NF?@xZ6wn2{Tj1MP|BY0?lQ-_iVmzmKrg;;@z{x`-a(V zbW4URJ{EE)x6im>+}v3HjgBKyh$=EFqPcU>mIaUX{{W+Jtt@CB8S+!$vip^rBqP!OLzR4`vA zZpb2=lIX<#IEd6mR|TPol@{c}Z zq2q3WI&Tw!>f6Wx?}lt(DSs>H;m^)Zo}ZmKo`fyaQ9ZZ&IKIkL0QYUp{$_)4Qt|zy zeek^(O$--f4_oIaW+*@u*EFrYm=@>1<5!+HnDVEOZ<<_5v-e#VwfF4^d!J&o;y&Q| zwf1Y3nvIal*YIAG!Cicb? z*7_dtA&&549t_mUs`VG>niDR4!UpM++hI`L5n}exi#O)H-H?`eQ{!&#W{&VBwLV_m z)p!aBsV;Yx@78<4aW|_C1SPa6pUTB}sZXY3S}nvkv(t+y@EvaY>@M!KXzGe}W%;(A z6Nz^po;{cT^CKa;2+^#r1MO6>~R8S5siXJ1!^`&LJ#lQLMko|X+K__l&IirPEZHMFMN zpww+KZ#es8CNU zx?7%SwxQG&EZrccvvsF0=-xvTML>-DO+WLT*??x9VnY%6R(1 zppM!(1wBrd>v68~#n5)GLn&^g6yF5MB9K_-A7~;2;i7)cr9%Z$u1`i2BN`uaDjyCw z%Son0U|C0i@pqkZ6jDiHfB)3)o_1r0)>-SkoK|#DtlDzrwgs-1H5GP~PBbR;FEgH7 z$Gb7IrJHt6UeX@LbT8*71Y`0*5;C< zEAZ)a?!j0415c_IPtV%>HZ$I>B6sjFF4Z{2VO>%{Cd!$VBy=ibc5i-7+a?)-Fd7f!9lBG%aySsEmgs|5-i|#s{J(~K652;=`o_d^A>{{J@O|OHY zST3gAU5a8eAN71k&Z@8ab*JBpF7NDod?8x{FM&VN#7Vm+kDNuXy4$g=oIa-W?!oPw z)r~c-whFa9ciw8_<>;49hkdRD08QzEO&Pr+j5$zhS@@u5gb0H)oR6>9gJw3t^`hkr z`KIC}T_F+KFA9uwGa;-OGRP1;IFF3K8c^Sd#Li`CLdR(f?XmEnD{Hbt`&E9#@!LY{ zw?*Q+gYGs8VJkk$I2_4G#Eksro4?PvyV%sCiBdU%oV9l1o9r8)>`D24Vc5{j$*>Bo zZ$2&+u_bYD{UVSYDAr8d%<+L@Yw)%g<~t4D@Wp}2`S%t<_%2-o3cHcV4)sV_5)>2N zTP2027eReVqs2|(;^xG+9vt?JlWKoJOS7u#a=C?s)aC~+F(MiIvXv)zB3x>oXPv#H ztGJkcx?pR@4Z+RFGN_ie-nOBarOaY)o|uDwn8;MZQ9ke)@jcaRs@#Ft9X6z_RF<16 zzga8^XcW4Zrfrv1t1AuiH^7k-Pb|})%H*Z`ZpMy+4JM+&^2M&-mfw5x9qFzx(UsaH z@zBPxA6>Uf@?w0pwv{>|Az;^Vo^PAa)fl?Z^%w~Xi$RhLQ4tn_57+e< z8<@7|4;uKumu!6X$k3kT`FjG|43N7z?c$f^J7ec|MzMcIhe6EGoo+tb8F6P#n6ZA7 zIlJRW=WRwS2cUtzv$*cEqt$hWgFg9B$;jvJT#jhZNe`Q)>GrAf>s!Yms{Cd>6{+pb zpFFF>SEM4hE}};@pU##W2@o?%pbe3S)YJ7fM*`&soM=bciXXOgG`E~zTvj>eQkK!? z2*Gw5<21{{2eRAFMX`^REXfCVGOa}1sJWUpMP%Uk-rDxAOK~qpm?K_=X+8yNZ+#Cm z7hiSUBM@id3lWYK!1g=P0l>-DL*ft{8Vuo9Ev+VqnamSzADS zT`qok6_sOcdx%DNKw!&&_<>vOsZg|%e?wWAGy3U@8|h| zw%i^0pchj8%SQgV3a!}LEy8kr`DljUy0?5QC#{%j6z>~S3ufq{xh}r^uE&wFAwO!> zB?_ocNktC$YS_w*fT7rq$TVwh*)O&8qT`0ms#22|bsc}(yvKdtYju#FmubJr8W&j) z$TJK>n0`U2_`ho3w@qd}OV28)7*YikBqA2>Gm5cAHNk2NANGt>j*F~(s`x!^y4%{Z zWV@i^hd0CPrm`AK%6KQMY+XVWsKnQw7GKGdd2h?eu>j@y_)3zoCg0O8oltc>PtoQmt_qih?ANdw&~j#h2li`gMGdpmr7umh!t8r1@s z1=E6%oCI&ZR+R_!rrdigGDi{Xvqqu>cN^eRGad2#hE*x{1%^le+3DD@5mW#?Ktb#6 zVtJwP)~5Pb7^%|9jnkj*CaFp7VCxLHrW{vWF(C64dSO~#;Ba{+_LSf%jQUwvbHw|} z{Gj_X_S5D(@pN4++@0LbsxPPXNuE7>Btbh0Xk$Uik(jc&hS8goH$>YFEosBd-9H}H zm{td>T`{1`2`?AD9PKdyS|_rDQHfL2ZDb(0Wkp}uTa(^=8fQOslZ9A3JG%eF=@x~e zOmZnl#5n%pc`!b`!}Od^^&E;}?(ZpH_Da}YU#Tbvh_6M&uh8M}cut!2_F}@Q`u>b^ zJ-pp%zEqBcUEDx5LlK$Rd~EYhiGl318*_9e4c15v`WZ`5Lf}+MYj=%#N()>qpMvIm zh4*`|#rn)5etHHjkLtHY;W@0FQm)5M%Ck-s&1bPJ%gU%lRz~CHAwFq?swTI?w?VNy z&_S^1H`$6K>Y!AaG%%&NaX?4N&$Lu(v@{~`Zp7II468O0IadsYMl*o^!`&g~BS%7d zYC|J1Rfn(5cLIs3*4F}G1;qvPEGr=i1HRSUqusR9&upVs<3ZcVeKR-Jh!Y&WQ_~IC zK8d$FGkVlVVdj);A$?d+Z&@GNYEGOsZXtSVNqL!*aq&uYx0y~ScU>imMB!qkub<8? zaC<*0*qRyW){3`wtSYr`8sSpvqr$EEgr~%&PoFXq^fXzqs2duTtcs=+yDSI&Bta6G zJ^Dyn8Hw+!E46Lno24m!;Ir+KyfC6^pjaikJX)UUADyv{tLGd?tBI^!xogxUn*NVn zorUAT!(Dx0xbvE`TBxt?tibtR-Xm50e(!5Y;r`|FgrKI)ojM(3@5!=K{1LL2!{IT5 zqEqB2sKSw0|M&_$Y=7sb5ZI$GOdG)bSa|)e4U1il-&>kSRjJwjKIzyP_>-lUiwUnzU8<|XdVD|T;oAvTabzF=W_b`j)9Z1<03CoM2W5l5-uB4C}y)HvF>R#-!cc5HlV%WM7Wt1Bo~DB#*|2lb2aH-X3lbX>EAzOf)*K1aiUIIINp z&KxiZ=AS|5+cS~9OP&Bv=kHKfZqhSwU6(qwzP;vdjCr4FJ-U%@Wv`DI5;l?(N`w!& zo{D;$6v9zVTv#&MY;ryJFjv^l&bf4y2!J#tRwU7nD0(M>v?lF=@-Hx_+N0d%9y`V@ ztc%QKcy{>hi18QJjI#Avmxo0q+<)#aJw=#-7o?hn*X+C&-efApPeS&cpQlITv&hL? zZzuONe5||CB6{umitY?iRyi8{z8Is+V{p>-g)Z!>NWhm+FJt}aOF`5!i{VK9b4u~0 zo%?MN?vOnji^q9?6Uu@wqFi@3LkH!IQZ0?5x7lvim6~$tJ8bY62foubPOU9Wtn;jH z)}6!9eXrB8S!F^OK@$CagFek};{_8LKe-f+FG0YD#0&Hg=J@(m7`-OrC-hab#YK9v zIO$WbpxwBSGMVI*5L9At4|k%N+bkG|@C49x^}HySXoMY`Kk?jLzdP&YMC+-h!+XR% zLHxvfW!kD~RM6lGMKvS(!V52)&orr$mBML0hhyxbbIU+0Cz9-m{YqZ`5 zL+yDzIWoq2GAGimpxGH~V%4m3PCGlX@sJ&}8~u(WL*%XCJJzpJ4M}}?_f%=i)5g<7 zIeNLgx`t8&m;1+}&g|XrrU=ai-5Xr8zQzg<0-4EEx6g<6mCM*2&U<}|$my$iR21LH zYvH?A_j|71H!0N|nAOTv-KMpZH*^Ta-*g##tJj8rO0Am5pR7tV7%x|^`Iu~ahVuIq;j4RTeUhxFYNb1}9G?Pei* zF%b6&Btr z2Q~OM{cKwDtv=HH$g_NVkdYQ#a-+3I^d)$CRo?zQ=6ArAcOEkR_ZFtPEc+4#HTSU-G3 zUbCN9_>jo7`n3_})xbA+M19STDETUat^G~<6gEkGirjfFSb*4+FoW_$YbNGvbb1Op zXCqmbfX9*|7N5)-CO_afZ_#(JSCy@Q5Z63q_`$_}Clveo(Y@efSrbvr*Ge>n1rBm# z9yf=Sdn|dC0_6IrVE5~rb9%Vr#V)<1_t%<>sLoc5J9I{s8*~YE3)?*~lIf35K?h$) zMSsVEPV=7M;`e z`gt?g0ybcO1b*+%yi*ZeH*1Q&4mzjc+9XveWee;Jm3Kpv)NPILM9#9Tk~(!ArHCQ= zx*Pis;cGzQ^f9DKa`Hlh^ia-~wUe%-Hykzg!gtU~alNzuE#IwvOP6QqUg2Dcdjq`R z@rr*)P4A7o>%RBG*jiPHCN{5QalTLH7mKcee!e=>z$H$+~klXjwv5B>b8WO zTRNnbD*AGnko!TRCn$lD2q8@fI`R(td2jr+`QE!Ctm*=IHuD#W|FN2$$Oh8LPR z-*v>g-|y1k-?6wF? zgiQw8F5Xu<%%DbWYaGH)x+mc)%_JHrxeUP*M

tFQrp0TpmZ8%pvirHR<(U#jX|B(1YeBct>lGRj<+4tn7 zhf+aQOj5{1g86MP)v32>4zEZs-!#GdVf>oP`2*>5C1WBrZqc;`%#aO(msMK&ZRQYo zftTs~$|FIw?j%`JPi4Gp_raE|==#g#DC(3#d%l~>`dz~7A1K|B{_D;kMSdgRT+O_q z+rQ)<)%Kc;g=*eK1KR-)rFbyY}$j(Qk=1 z8gAd(VgymUWYs88`)ZkKvIxjp5^E|7P34MR|C>+SLjY_jI$4g`Gm6vvM>tU5ziAIC{g3I8j ziaiGn*-N8{a>A3^xMmm>llethW3eomI*`9;TsigeQm)7(#?#>4C(mR=8LX1h?_ZsP zsv7oYGo1rD9l7|KX%+^=eVyEi$;3J!Bl^^Kd&iGd@%dwg8c*@QbIP2CTdpLc-{$?C zad;xNr}A?k6*bO^G2daFdf)ufHSZNu=Ai=tf~P5$&CiMQnJ+1tiy}8aK6$mVIaE>; zU;sJ?+Murb7*0XC%VKcQr$a;BoLiDoZOwjZSnKe7deK_bZS$qg@;1PcOnF-#BH5{M z%{#<2>lC`tHY3$_x;liSybL;8Qv`gfG!>t%Mx)(Hm!VRb-bfMkc0aX8Zrj@X>eLOW*a^~)?g-EbN!Tde*(yZc3NqveY-WTU&7 z&ItcTs7C9{xP4{Nv-Xo>nh( zAyV`r+A~&8crP=ZzmolB=ybb2Dc^r2H<1J+=~^=ggCmnvr!yx3OU(V4s6lyjEX6X~ z#7#VjyPNy&-A6Ay>_FX+rZl1vXs<$Xd7&pEqaWo+GFt~sMaMdQZ`aB=B9Ogd-HfP4 zTm4n8j)GWhx0ahYRO&!Vj$ttrFm1k}V%vYP9D1nCYS}h0GiTNRgppXC=&US&@{cQQ zDGE@3wwnT6n?(1Dall4vV|Ik{e!YztDOdI7oxNtx=wh{RqS!Pqva@WmPHHMtjk z$qCV;R;A!Z3Y=y+?boI8L-eB6MTN>7O59*ATYuWu1BrfezcD4Sg+xQ7xW}Za>tYjX zx$=cUyXeJ*8cy%NzqFD+W@h|li{z2FH{a8&7&_;c^|C#&izjJ?^`)sK&wa z>FH>eXiA&5Um%WQGdoP0*g1Lsjya~!A46w#K8di-1i9fdcYNcd@kKs(P|ykgdp~ub z|Cu_|PQ9f4@R z7%k$R6n$xyYrYwishHPmwc&ZJzVQcQra{63lGLvl8qaoCAad`f-)_=8Oq6(P?TD2x zZha#U>kxbp7({$i0v+TeS0JOGs2Pihhxt*$w^*TYY6CMBsJm(=MpKvAnHi(2ZB+bB zKOI_dtI0cX7KNwlGy46L3Cn@HK-5qjHnr?F`h&v-t%I}O;O@+&lK*(276u&=FVq_S zBUi6|p2LFKm`8-UFBiqv3g!aVX)SrxhdSHJ+f36+}Ag4~IZ%IyZf`lSzeOy%c7rA2c)989CH4akfY|b6TaDxbV$n>@l>1uWls?=?OAlaH z`hh<1hdr<;87)W6!cZf*A+fE1@t0G;C@{Axo`xr(XI{1d6zC5cOO80u9=3Y@wBYYW z0gU*x(P)(0@@r!pLmYx*=7F~amEFhahyumoG~o~2OYR^HqP47~HP@%rN@8lt_2HQo z0B`75{lhx+m;AT|^}c8sLMur*90=3@Mue0LVgfP7FO}@|)}r#oH=^2e&SN8quqs;T z()>(*cGL(hH9M($86#7jvGl-3lK|$v2!4GEcEu#t0y6d!0qzE<>(za$W4p&=`|2`Lj2x}E>o}TFZ!KHIbabuRu=xSu$j=_?L0#>-QOaE4 z9y$GGE&@=1wE<1rP>Vi5_Z0LIM$dtv0Sga%#%08OorjTShdalfix8T`XeRg%GfW~3R~R4 zDF4${;taXcpbFpQ0w7C8zx|^y0mR^Ek8|L@;dm2``g{t$#yw}WcgI%?hFOZpGDvLrE{rEL0W{SGYTz)Ab=;uPxHd1L|GZM zVOs;w%qe&3H?{zM_^>`R1HmHKq>q-?-o&F~X3#A@K?;?xz_UqM4*ThE3>5KxueF$R z${tzX1C~N2Aha&!-mEiCCge7^nIbX78j-N%1V>#E(yoK)oY0S+87g?e<^UqaluQ_9 zAmev?N2vYZju|+{7Wlr!-m=|c%P&mcP66T2p+z;VodwM?>ct?@@fU|UiQt(%;vM#_ z+z!AwIgUuPt*s|3FtC8EfMi)jOO-hT^c<*Q>oH}46Rd_M8sh+x4qBH!2N0AQv=_J< zKz#H5BX(^%c9n%&W~Yl;ym9znyp3kt0lb3(F$=d2@Z>nFnQr5$rs?lloq=fG9#234 z>Sru)eMEx-E2(5s;`tkv+;kx*Q^NqsL6`o^p&G71hksG_2X^c7jW~V*cm5Bcaw%q! z!vSiF=KW!-B(cC!W!Gk-n&r@h+K%ufG?N4$Mj7ODV4|d9&tyQ>%U`rEfO}ReumNF@ zZOe|fZVr#%{s-vx*49bkudE9u{BFw|uqM$`9As&waflwn6A!#0(?8$!!cG>8OyO6P zV*vIT8(_3*0hh3ns1EFa4Y|^mIt;v|3}z-1#}u!8!LK0Ld;UfoH)lr!*$B(R8|N$m zLtdW!asQ9H`+o)&|1fQVU;FLs#?8sw&wS^|B2~GXm8%YWQ)eKS;Ht)A)E6V zNz0PXfn*Mv@CUZEgMbx6^T+eIwx?3lepUc+dpcoo=JQ*W+OOcizC}?aK`sz%7K3d7 zM~|NF8!G6l=FmuoQ57R_Yt5Nq>IB?oq?G-lmP)2FYk<$Kb(b5nF!2HYv5J032RY!IXL;#EucFngC461yYfBnbf zzoE?Swj5@~zFl(?vVa^wO}voBTH9(7I^2O3N?0lYg5Oa<9j-0NWq%?83|$SXJcVQX zJC@eIj(*;4Srg!8S>|RoP!qV=dH4@7@Bij76qifd{Mif&`Dl%Z2U!N)vL&XK;YOZ4 z-^SlcTFN7<7r+p+@C1Ns=ad&`(aEDrFE}n`Wt%Mt5M%=jf&pp2#IAjjnMwA2S^iqf`KFq0!HiJz7jZ*b%3_^0$brZnA1t94WdO+6 zlKyo91ra)X6%4=i!89THb(C5Lmo z1Pm^|mQZHx*+Gh(#%iKFIskYM?#Xu`k(1dE zVv~k7$v?OB(3jd2RBVf{+7dD|9WWYiosr3RH?%M?F|5+y;fc8s`(blvgrn_ z*VTN^%ScOrgNmB=Sy>IXT!M;YJ5;#ie;^!{L9zb53VAhTseRK(({Y@+7qxq|ew(i)E{mIH=A~q^WFBR&O zA0JH@+SoXYXqp>lAMq0@^v(`W>zobF72gL@8xM9zfAp%QVx_dQ@I%m|GVw?sgu_Ze z-8HtktVKxm;`rJJR)4!PamdLl5yqmnbWqCR5D)4jM_N}*&jEDLTB5<7zIri(_z6p) zJhRtOo(qW+mA}0_ znx(#LD{m>Y#x-GM*FcdYakswo*KY~1+Cuiw{$Jhx#$A(}xW2Z!*cLA0ySlEGh-M#H zF#kk5PmI;^Sh2UNAbOzQ<_^IPL&{FuTjdAKYW12y2`$)!QEj|kgw3n7f+nw+gh-!@0J?-v!;F{WI}&Du+ZA0J0rWE5>_dJn5CjZ7DP`Hog(Q>G1pXA{Np2R z6hl&{`B~N-@JJ&=3(lqT*5D!{?pYtRnch^h+O22xQ^8n(La`4x2f*j}rKc|C5t4G8 z2lmfDoyWMAjN_Y6vc{A%hHR}NuPocUWg-_b!HJ%%*c3?^Ma-EbUG5uQ;`>B~I3Z1R z&{tB?mlGtnB-lnjVOUi)e_Y9?Tej2FyIZHSu{D%3Wiw4fEYjUSrzRsIF{Wgo+W=hf ze=dOYNR)yh3}pM=DPjl6S>28*J<)nP{P>{j$RgoCr>*8j!4gKzH%Z~^PjzuR?`Na4 zX|bN(MJRoxN@cAW;nr8lrikkrj94Yy{;ZZJN;!;b7=s1(=)E6O)qK6`BY1JFXA$`P z40MDK$)KS5BLdv~*s3W)+8JR?ne1A$x}w8!+IoBTr3QcNq`d~-C;|#cObsFQ__f)$M_lWK!pVp#70=aidn%i>1 zuM)OB6uT1l?`ng`Qpj`mNqy~P+|=G*FYSP+dLZ*;k3^RL z>rF6)Hfj_ws?WdSdBpj$b)xcqQ>OmQME`1Xa!`AOh*qsA^(DnhUtaIgFKqp<_JBKE zOH(%Fh8o15&8F`rIa&28ZaUU~5r!X{bW#;N`0GLY#WxUm%58-^Z3(_?W2De@tfd35 z(rEDF_Qvs4P0pSFS3mWsN96sh5vM$dm6bdO?<-%yW z0X=ghemwH2s`Rhd*Do#t6{~l;kaqUq=wrm{ zYMJ{xm=+JV9US|=-Ih?OdBL`R#Z7OD9Gj{{V=dpcfvJU=#-07ICl;9VFYAY8`u3j` zRPsy&2k^xSo^rVGEXUx#p6)wCZ*46_I28g{OQAaPZ3QWy9ymizKbN=lq> zg-LKGsl5GNK@CJH1PFPEZ?B~t@<@LCfB1?5|2n&fFXAH!|31Ak1tm8BAI6h0`SLEHYy;$cJ|bvhnVrfl@Vt%(H`ZIcU+?*UX&yMXL>w&4XfXrt zydC{HonUGlJ^w&?ZSVhbrTpv5taMWQq{7PD?zqeh6nQ=pjlI3trersbkTdu{JR=!V zd4K(~%`M=NNHRE0@7txP0=v@PO#a+fQj@rMs7@XUFY|JC&RTbOw&|7uTl@M}UteG4 zwRvs?y-R1gjwk1$jCiV79qDq$Rc@ZW8zWeorfz2!{qx;)8gpT659R@nONLtZ@~_GA z^4OiPoi&T?)B6D?8TRSPspogMKCDkXcSnQ|?0x<{nFcJcZs5w}Y0SCtd3(8JDR^4%?(urkC%ZhUWq5enr3g2(pbVYAz9-K{ z;ob7WR=|i5$DYW|incxcG*(fOafa7S#u9jJr-6Uug_6{WbziP6JConkZ9=`0kp)~h z6W|;bCEr@cq!bD38^e>c~m z<(@6YM7&cqBP+;UHfwN60a9x%MG)_sUBW^_BA+(04<9A{j7R>y4b^`UllPvujGe8T zX7WFQ^!0${Y>=qjC6_Ya4}q2CV7mYE$(|j(A^cEY_>dYr&#wKmScPk)G zzmHZf(o{(+3a(!Ap$w~h|U-zFU{}HZ|pB4qV zOax-sWS{Y-C>U=n7{ju3KjUM6?#ovXY)qJWcl_h$S7)jXgtNrrq=_w!`!YG6|DG&t z(C834XB2!DPa{d~JAEPy3i z4E*1Waa<2?;h}+a-RQ%)VP%}f`tZQ@$^*`rseAOl76ARkjpeVm#NT?8WJaf^2VY#5 zs9ZIzTuZhsUyoQio~4Bzb-|gp(+Q}<5Y+7VZ!|~TCZ{@&bwR3;VI9fe*Y~^gTtiFc zHI$E)irO07_UzEQbzm!&Y0Q|QnUI)4h`}|bp{T?)Yg8J;N~H(J^72@z98YMCV(fUy zE@s0@wN%)#1zvU6-bvyuxRa4f*Ox(GOLxQ}g%&DqdBk(JlCY##>~>%jxom@7Y*(w+ z5kdAsi$3n3eRh6_>l99u{Z$m2#*RDX_y7XBJBZ+PQ%D((E&BWv8E~F_(Khf`5RUZ$ zBn{HHc=!AV@!_)Vq55*T-Xx&sodp`BXZS^+5~&8=(ZrMk95!w>rFJSOcNk#Lwk!j+ z;RqCj1(8JsST4JTTIN*l4`WA)vB=N0N`m=)eNp)Do0j$-?(Z0qzAz=Bf`b^v+k-ulrWHcgM`y{g)F5K}svYG~i+om&LwHn2g&`kqvmM^`9 zCyqI17z1M@_Xk1dz!d$pqVND#zfh|0%fSNS)#r$Ia`KZ29IFv$)Y zH#r=AYy*#A?^)?rn#ii^g+@UlI0JngPV}=-@}BtgSh%LN=KI)_jEM8{LxJn8Q9B8{ zTbl~b13Fid8o;R#74X*MOM}iLO2OafPhZS!83qpQ?0{nwCf-8PE5^*+i_-vO;2Cg` z0Hi!@e0qdHM-8n-Y8LDZaDACF)4^MQ(T-Qvftq~AP=&O28DF>7SN%cc%&jX*uMluC zqvRRo5rM1M1Hh36!9yTayrrx8ZMA0QTLO^{@?jAXE%cPdgJCDC5BQl_I&F~!iHAj6 z=@V7uy0?PIv%rxFO;j*9`~-Jy?_I?39TWX)i~P9~KHGBx=lerc0XScza@X-opY1RA z+5EAXChfRA?n?AY235vK>&MJZ)2*w0*d-vnLtqy%O&C_y-rm`?O7FHQqdo$J(zevm zA{aj6hV64?a8?cYD@cQN403yuTeY~_qXM%cOI#)&?4D>v0VTUYJnkiyi z*L*(RS^;|5(j5ZAo^M0GC2fDG+NQnv{BsTld*tLjs%iZv66h3qxUPLV_I1ZSA^1Q8 zpivsmQn90v7jtGgC-DLeZKMx4#24DPs=UjeE-(OmG=+9aTvV5#!lpOtATFN;9Tv3^ z01S$*l7HLK^Wr{xiO?Za{OK5~(nJ4=V;l$UG2+7?D2<5-6=-UTYyit_!sWmN#VB>! zLyHCGbV0R*NoGK7@Jqb_K+H$3Ht?f5o66Qsc_stXHZqwNYaJJUl)yn}__L_kApXm@ zdN0;d#6unTKWGT9z0d9~|M#_4Uw@>2j`-alentic;*&EG#((7)LceXDFRcHq_cl#p zdBgJ-C86w9Ykf?xUOWBUgfU5mNFP8Q&Z1##pO}!0!EW4((yMDG)0N_3jPmLl#_>qZ znlf<-41h|s(Z|fJk>FhXSOq7i)Gk+@(hVc|Fnv}sM;&@{1KN+)tGrv_?+6_ZjQ;U4 zhs~r?UYx;!feqAG(g6NIHs{TzV4N*A%fNeSD(r}F5FAw&#(wCStHnuCSs1oYm=sa6 zl}4w^lx1NEkoIbw&7wnAfZeR6Uv84izf5buC3xqfQxQ&P$6k?%E5 zm05^)T)#mI%oLAD`^62|&w2@|I&c^5aYA4@3sZmNQ=D85;@o1yo zV7*t7=zGq=7F7m{gC9r%Uefd5?`36KJ+>of$Z|U>n;=b&hcF` z4)}1iP<@~M$9)!gRfz{LDGS8+@&y#GfIe4q{d65+o|6&WLo{$IO#y*s7cp6MdY%ck zquD6l~f(2X|V{X+fVgz}y?cn!FA+_>1 zvg+nB9}Wq^BflU&ZA;~_sLf?Um2x)iP_ADN_1ZOll#BWu2$9JV59E*BO~|m9zE>M# zVOtq)7#S%0S%M6S45R%m5@058sME#U_}i@S(#^H%0STkp%U^%nVNI3%AHPC)V?x}q z9pY$d+(_&_Rks)eicv;_Y){Gy{fs8y1n(o$fro(bp@OZ;R|>|;R>s$w)>4c}SyO-f zJ3}kR6LBR(Pc}vvjb)oA_C&WDQQFG1%-Xv#HPoyzYt|?7V0B)tsfM0N9QVxXksTcy z^$V~TuOqFTOqeE=%vO5VgfYb{kYMytMWb@{<%l)Qgamv(0!p$SxUw*&$x1f!=f4d( zHz)l6x;agn!fe*01a24CtqsOTgVwLIk`XOJ!SfBCT^A29E{RWm)A$OydYxc3pzY=X2mK z0Cer@*|%wtG<~$j+V}C1pib54yz$EV-_nkA*(L%2z3Ot4)>_x%D4YNlYP{iPiCQ5M zfwM!6NL(HXg85HluvGxtNyJosi?@C0sDlJ&289!VBQ5o@pl*%XQhqSVZ1*i#9642) z`1HfWh2QUOe4cR>(s=b`zbnh9W#tyz>~HBbdFNd&oP=tLw_MFP>E0>KA4Z#Q#09UD zReRm171R}w>&@;Uk=;DYgR2?XYGmcovL7mc9XLL$1esAh(}y7ya$~p4a^T=-_5?Gf zwS!SGNTc?T&MuLLM)50^Yh;=a6;>W>H{H=!u-c%1WJ%j3Gpk7ab;Y(zhxoNtZzs+~ zJeqe1I~8GbM&sV0E83%g=I*!*Xtjejw;MJSOYiX*3B=s9?@rf^Bo$nCew91y?RiVy z7aW_Tx^{>cd~<}&$NA4CpN>6wDf#}itCxuTJ`hH$5do5R0zL2GdM5TTr~j5HgB>1Q zS2hO-L^5%oh4t6I!l#FWU3&oNhJP85@2kLu*PHW>+@`g@s=1>>h$W;av|l+AoClRL z$_6L4d_g;oe{W#NIYurtYI88wHMuCMsL*FZj@$Y^-*}kODu0BpN8a{KpgNzzA)dvR z{*!xR_WXN_X;OnL07?pr_$v*(58HOVL58Cee7B9jBg z9+{RKH4SX$zrd*j`4j!nN}3H{Zl)lYyaZl6i#m{KejgaEHY$M4>~Iu#mz|Y7RlCv# zGw&rZ^tq^o^@?(kwp3><5x!^}0D9uXJ(Jm2k^?Yh{odii2p1>Ua`}Q8MV>SEYTl%F z^~Ed89PWqsw?&o61kWm0C*DHqqi2r1FXV9)-1hMMd&th@DEUjL$B+8jfaAP8K^(Ej zb3@uamhWk{^Z_^sG6MN8!P{r5=W5r!o5ZTW1APz^^SeKK4TBsl5wu3yrJz7=ruvj) z<98_YzI{(_LG2W<`e#PXQ?9MP-?Lj7Gd9m@qcNl*i$8$*(jgb-%yJrUK-I>Oj;Q=O zAU_8%wDx#?`0n7HVar7G`yf_bNK;?6AIag-kNVTg(RSw@V5=(F-vSjXyyuEn6%|tX z(pnNXLNkwwDXF;5&de$pE2hFqk&QBDQ5gx=)=?x*5sGB&olQryLNv_V$8Iqal4~Eg zme&;wWg)hRZLGF6CZoYihxJ>ddZ42%8Nfs`VzG$4#E)%LN*c(0XlO_p^^9jWLK+mR z5Yik6MG6g!HXbrERph;2DR-1kH?uBhBl|S_)B<=1icK*yM|pk+u|$T2>x1J0ZO5n;l?8|@-3keGNI$n!~Fwr(MY%HV)Zi>g0I;%Bl% zd;M5F?DeG(ezR%aKk6IAPyI~346Cr0Vt-~CI#szC>dF&hW8VBnvT6MZU{f<7p=Dr* zE1Hp@YK|}_VMZ=38q`sWkWXZA{WtG6n?Jz>m(|G2;MWq9O#^d}gVMXnic@QXaCFr8 zB`|#8ci66AP=WRsbbxF5CasOBcGG^T-3 zPE8-dr4|&N%V9+s=*n5l6#>YKJZ1=<&sNdMrkPtvj?yz}t+7fPVj@iuVCcc`U}?as zr4Q78jJ5stJt6O7=J}$nXZ1E5KNK4zDL7w$mz->^O?E=teEaxab+^$e=>wMnK*)!? zwpBmAZ;z$yZ^sWl4O$|=v;eqH$?Wl5Eo*jUaVP$o2EOTqzAOc;sWwyie)t~mo?!;w zZf?7kY}Mp3nEXARw1J(O#;(zV$8{p}1R(cw=(`f4U()fS*qY?azc1o$lsDrK4(M0ss-n&wTEmz3o278hYD5ys&9ijt@oZl zTn}Ggw*|NFD(i90)IPA_Q>Sa^2A0F){Z?7;uU!@7*|V``C9kOQke?rK+7s~UvXBR) zuHRwG0csAsB{Jm$?>I@29cgdmZ|uFd(0>1b?WFwPhRdRgIq%={jPH!y0P*^`54UmG zh?}AES8h%*Dttv| zgi{~rP|5j2aB)oDg?HeImjg?xXRvqEB}t8bS4JbHlAX9#j4<(bVsN~^ez{yFQM8^M zWMsm)s4t~OE+N^?8N8CS>En2!kaf%m$D(=!M(ckx4~esrk@<{Y`f~h6 zQ{uo{3;nbo3Zw^<%wdVigboVlk`^E>DjVa;=6q5%9Y{rF_d(cT-BGgP;FY+D^5a=` zdEk;DXIN=k#TW&jl+g_qS*585BYdT=`&}^fiS|LRh(sNymLurL53T=V=KcdAyoQ3AjPm4XBczkgO;``SQJs#}Rrx~;pxRe zW+NoB19Z8MlPn!D@%HAyvnYC+2!lOg{ZhGu9oFePQxF(-Nouan(aIDJg%k!M~a06?@sms`{P%60&LtYTyv~%3%|;K zfpHf+fInL3ySYBS)(b-N;jmrFK>?Jf&LVdMX&?+-Gdaa<=!rgP?`3`E0jYU@+sm>0 znvrUa)&buKZ@=G;TM(ddtLxYRXFqw%$P4ArIE?j zyz1F1v+c+);aMlAUK>tH?vdXyJ_k0`C8~DR!J@8O`E8ktGBfD%zeRvN!W(0QzAbmr zDLs(>?;P*te7v0E=Q590E9w6!5-ae|(^3v3f3<7ll4(h=wK|Hn%asn~q&5@RE-gZf zMS%;cWf4*W@+k>z9c6Oplw2(fO>|1ns0%7YZS8iUqQa1Pj9>uw+1cgUQzh=wO0yF* z9}I{Z3`0s*Dwjw!9|pMv!~#sgwmDdn$d3NZORRM7V;eSZ`(558n{-j^#C@+zvq>W4 zEE(8+FJ67i1;2^^kFM_yr~3c@&dA70iX$t8aLPH9Jt~z7kz`~Z$4K^wV@6hTknF6K zRW{kjJRB<{(XrRD_uk`vozM9G?%(&i@Bg^yT-AHLp3lbwxdQ~bqqPXZ$n^CKLQt;Z%&buu!xmc=ev{9<8wgVfMsj@?U)1D!R>0bXeW=bX8-ZfIb zZd%Wfzt-$P^ISRl->K%d0?&u4u_2nZs6;RkDlB}mdtAJ1RqFYMz*yFNz>+ys!+|IM zC^33b#NqFsOni2Ecl%*o=OXO-aOt8Hkse}+S!NjOC+_wJ-W$vaRKDdV*q}+ zISgtb7R=U}nS#JsKju+d|B%AK9QxMb+(GtPTI4m5(y;rysH6P}A9tazH~Ph^0H7Yg zXt{*T;vUdij$a6iWRTzcOla4T<&9Tjr;UI)f3eHXDS9uF+{)@x&!_(-Bwv%*MZvjT z;4hGjYOs5fAl@M|VwRi=RS1I%$t>m+3nil`J$H!yPR>9%uwCb~G^x|7JtP9NV?kUL z_lS}$WUB;e@(L1rrDvj~Lwu-QIIp|`u~qC;xTMQ2xohlW0Y$&-4#4xZY1pxYR859* zpmo5tdcT1s+C7)axc6VzmPGN)YA*Pfm7Ru)c^~b?{HP)_z?Ml-|G{By-t&oF+Oari zeYbt59k(+ntqo2@FkfciC*9jKrwCh#Cpz+@VEYqS$jg6zh?4^_j29R_^`EFE+ASAJ zc9tC{dV|AJ>iC;uOtSEpbxq%I>qIN1;)CZkrx(Wihf+$4er?w0mFc@h79UJXg5mXg zSo?tYcg*zcWa5c=`|K8YKDPm~I(#{|mUzyVh(&`BE+5?x+?SNgQ~+X9r|E=_@I@|I(P;dPAok#>;M490??5eJe5M?Xv>H&H((F&ULfysi}PJeqYe_FFS#uN zY!F(+xNjk&h|)kfS#t262OwyMV{5kfYH68q%23Ou9-VJ%MEKg|wtwL-FrubhSdIzf z?h5zb;^YatJilXvsyZcv#x+DcURMfoD1;f>pcM(6(0B#J?p}N)lHB9JR>>d4_YoyHy<<;xQ6#y9f zGp6ZXyj->+c&w!W7d4w|5FO<7B$uRgoK?LsmX+2iAZ!O<1Fu~0_7)mDNNBT*2?rn5 z)tAz4r&SwW<_O#G&NymDMT|*~4CGb}qJN!WQyMP=qOz)eTfpQwE!V0UMZt!O0@H~T zhLKVE3j(?UVl6uXHsk0UwfVYuY5;_DE2Y$cL9~h(soW~=EUdpY9vY;u-~osRFLC@; zn2HGn^C{!FYgo0~tNV+9!1DLduA!Z5&IKxue^ypEQUkG! zs=Rp-G2toc!0Y-LzN9kGiGh!pYt!K@e<~;`J-z`}>(-ZnjSPwBwew(5O%zJ`SmyjY zML4Bh!pp(>fUt$C)jcLF!8klDsjXd8F6kOfdGC>Z+^fjOW@GXF`0*+SkX}?dt>iB9 zyH-zaRFxf6SD*Bp?7ryrY9GW~pI*Lhm-{HXY$sk{=t;C%t6t@NS9I5OLXD*Ov4cBi zEXRA{j?!26$(@%*vc{<)~VN}sI`E=mvrhGm>2*A~_;#fd9frIA{C)~yDCb0fU*9{=tK!H!{LPcvjr&*b*L5yy zdY5dyFq4dhcRpmrd=B53@p{MCfz#BDf#$G?NY4z+g7HcDhO4<*jDd@;E2uWuH~Y30 z=nVFZO5uD=k4HxZn7UMd5?7JY$d7K5-%PKH@4ft(ULY+k?f$TPmAJ?gv*$*g=-O=& z<_T@x!P516{=T%d-_N2wO~^Q7K4Q;g{&Bd?^5AJI{5M~${$!~A zTH6mW#c6%V3U{qkt*%tlC4nliQLBsXfdLPmUz%v7m~N*iCkF9eS|{#ABW|-vw#VD} z{In)Eh**hG-6ohOx-Or8I%X_6_M%DE{r}dCfv?@e&(tdF?aO}yZ{X^nd$<1KmFvcN zy0>?P^PD!w@~m)rwk;TJHTN&5+PxBk%%F>?U$5T87%r!mOfzO~Je$}0!>IxwJ3xat z=t=?5M{{4Z5c-dprgq1=SMTCE+qs>Ud8VxGN5ig^ApL_Ya#2csX?3zp=vPZ@650p(&Ij4 zLhbJYL?JYwW9v?I8WH4PF7A?F0UNCNlurl+k*K0!4PlOVvyD0>?BfHvlypPeXs8J%u|;yKd0QQ z^0n+1_?(NE;niAd)dxU~Q)^gV&1ZM~q~tfyzLgD{ZR=G3p;xwhZtb3%?7l6oS2KEW zb&T_`7w_`o=3t(ZmD28?TeTL%AK#j3)AO!&_fQ@^NP3kCMteJ;H!5_`<%k*m-oN!i zZhOI|)U$f~k#{Gz&r|w#^njFB#%wD0Bi4QOz}N%`{yb`;0-Q%d1JO1yO+|IDu^)AR zT>8o!a|O%$M93KCzXTqM)zF~tt;CTiY`TM3c<06-YL?fLnc_XTn42N;#N%kand8kj zV)|$4LhKjzAR-<-Ar%Y;x1&0du|O6cbN~nNp^B1;Nag#YRU;FZHJnB6>BW2muL<}wwIEz3k9-W+d^*5z%AJH(v; zewVPjDg8HrSV^4`3JR^Lf@XP%3DkVqV0tI%J|4r0|;Zs za^TNrC?26dH-#62-?4NaMZ1yMIy)78^Gq;(I9>L*whwtQS^nz)c&L)iw?U=rO$F^6 z_>~8T%^@B&(q(||y7|fO;Ckr}&Y}1K>9y`%d;sXJn`3Q^n@dSn7Q-UTyG+DO&GBvx zvl7F&Jk_}iVCC@M?S9p0iF)v5S^pHFocLbQteOOmKad9pRTJnZn%=8b0sNXo!zTz?GzsD+ORDdHF{U6ej^1X0n6SLk=HFOa<4gL^dP5Ss-uK@^N z&SqO)uclLkQME(6p=H3UH?L~^EzMEd4hzU(f2=)!7$&pw7jCgiX98fyXiO2?oWg`Z z)6oSOaU7Pw0T*o!`)(chTjPoJGQAoNbDXn07|qzd8axzB&a8qr`4F(KjEXG&X8W04 z!mEO8Wyc|9{g+Dch9d_T+gOK)o3>i%=2@-y+ftofFJ@n71uc#Po;@A8&)2yOoEHHD zgUr4pkIo<&Y0cXxFck2No0n1EQ&Jz(n^0j`UdCiw+nRmzF?yUHDM3e){yLG0ANOO} zNq)B`kKJz9X%jOPT08124-S-ozqv0yXaUgVQ{? zi6UtrJdxwZ1oa991#!rV)}Q5NmEAZGORhH#^jW`1A%^aP&>FZ+N6RO@LFrD4u)q!m z0BjLy(i^VLPn-5LOMnjpq9#37pRyN&GqX>GnnEP(QLgd+?%12!Re{<U-dT=zV{kP>8e`jJ-8M|i^zIo?zlD>u@WZg%7a z>7Pdb_gSSt{g>7r5c(%_ytS9~7{Qj%`yTfw=$~QoX9W5C*iu_6k>bwKjL2$tM0csfeKJESo6HJWm~M9i_O=sp0v|l$Ah+=C2xEYe1Z{pa0s;;V9ea zxUKdBefutS-SC`I#HT{a_H)KlcjY`Q+CnV&`QqMXgu&vx51ReQ!T$yxTj1|(_)3iX zu+?P1zx%oTv>m70@U3Sdd^-W`_LG|P3V@;qX_9flo;5u{ ziehsAM~ahA{x2zoxn`ir(6B7q4tInh@4ltxiLt*T(iaW{+IH@LO;1{*lkS^Hx8>bu zq-3VU&2bk9Ot>l_8Ev%za`_P)+ni(G31Fjk31pFO=u1)9&wlWWy!T{Mp5gDuowNz( zqYU(C)AUA(l(F3umfR)YCmB4zBNI;>oV)4yv(}61BujyI@zBBF8AnaZ^aEl1Hr^){ z@iLC7ZR&tB2vpB=g^9x-h5mZ)W>a@Qz|1&9C0@hQA}hgWi&yQqkCuHRwD8h_F3*e) z8U0#wup_GY3I~}W`f4oTVQm+r9t9gmTJLQsV8Umfh^~Mfj zR-X;i|GpzF?IuO0jGn$r_NDxdR-U!>G{Ad+)zRVP^T;eJNSu12^o=d&4>>!J=AWDA z2!}7Ma-VB^LD05b$VH$A@%2EXn%Dp0ItZkJzHF@BxaeQpSl_OqOxYj?&B(f6h3xr<+H>l&$0jLw8MhtVKk#TO>+ z5U2f-m>@!piaUFQJH(Z`Oa3q?0fx9M@hjYOiZ_`IXPFo-OK9HJ3uCc_D8iG6lt^6E zpiZ8Z&p!=J=nTS%OL@j(+kZKA=VrWlsCsTVaoW4{KMc@EAYD;_J4_4LLW>uK5O~0}32_3U3Ylb-@r8 zr`c$nt~H+hTy_xlD452R-v}E!C-?*cL4592`OKj5F))%&D}^ISy>?pnveAgBu8}yj zV(Q~)0^_kF9;Ch;UA>)4O*UnHH;KBJxZ$d`h{Y$IQ-Q2SyOzZ6Z^hS%GN8`B7jSAaE7gS=i zf%7rnbC@BKYkTz$FYni#fe?CMktklNs&(}KRVHa4K5@d~eq|p_qKkXk%rzU)`Q-+# zBYhSQhH)&Hl9|f2#|IktL$ae8!nucXXL5t*!@LQX04XR6_phQsrM*PyRry_x5= z0**<@b5GJA`J{j_>pHk+SCC|9bC0j@e?g2_NULxAjJ=t#t258G29mDD;7vl+5=&}_ z%f0D;rW@n#^Ve*5MjczedOs{qi6E`j5Y2PAuI}I$ixFN%ZnW+!WFpBUS z5UPO?>z;Uj9EXB$>>%cv#YZvku(}Sp!26gMi^(YY3#g}^Y2+f+mXr?^FlpwjXZSI2 zXv4b}!@AAH24xGwq6B(pf~pV81mvAQV6eh&*1R>l&~Tt+Jyf$X$#p3Hw4R)7ly`v| zqD9ogMe`JTi{>OTClo9*1*u%G)v`94=TS@oW@i`BTHa-KX+FYrB7kM*VRlSiLL(YL3UY@UDAutRk|~)l&BTNm)OET{MxKa9qN>X zOZ>(I7H`8B*;enNCtOrvk3wSE5{^Q`(XA1j$pn>AxMlFKtM2P(uopyT?vuFT%w$>Y z!@2EOskbA{cVVT}2#$66U5bNyby;Wg&;L-Mhv-g5klDHSk-pYoV9MR%#t7V~-s)Ka zW3Ow8iChnaGCP!RF2g&FF>;KkZrE+aUX?ZEUMs*}mD`o1{SueOUq}Cyhm?@!=DS8+ zuYfe)t-g{yp~~+|K>CTs6-TMvs3TcbFP&1m7vnQEsHlC1?)Uz(mJ>Wa=C78dtTb0~HCV;y)`h-k>ejtVKmRh9 zQCqY9^XRl}gHP74y4Ou&Zt?05m|0I2==6g?Pfhc}^_ZyHWSo;#i3Q#?mDvJDfoC$V zGphC#1&^{#b(7Erge01}7fVTo7(Ze0h~r6dIumYR(f#h1-V=*>&jZo^&N9*C81%nT z=-+@SFu#31F^b`fu&}=R-^!PKPZZ8U=!G(66kUrzT$rbf6#!U4kZ927ZLs-{E*-Vq44-_UXp7*TF``#gqRDzuGH)?psf+K;n zF`>iz2uzE6cMOW8*uJ)nn zV|C5rry%vOAJ={E%@gY%H+!of%Y(St@cR8P4`Z)6va+Y6S3A>Yy4%aoQXc;mf(7p<$Z8Bs>9D^Yf-Z6 zUe5hA@rt!3D$`EkaG>j`D6wx#U4+77Mv6ZFHgvP~IMM70HKe+SB}|OMl$`dSZeXZW zl!s`bZQ6QHeKFV!UBL8SX=Qw~FC~JiM9N z?$LUWjM<*Q`^?sIUZ<=6?4n3{-u$!jc`bYA*UU&$CB)Ol4Ku~Tombf!DdPVH8UFL_ zXN3#na@t3E+3_w5*OkS#G`0Rg_6Hx;)fDAPW?WkhZsE^_X2egp^jmurv`i=H>xlOz z2-$7Kyus2*pzKIh)F-Qbsa0a?c?wKvB2oP9;a5AHaYV3CECdA*j)IlXq@^nT5m@{JFXJCrl{10_A-UVy&m%x)7 zcqx~~MJ{FJYw3yi8{#vcHBuLf?rf5rnp< z!ISe`M%^q{oBTHTn@a^eb{wwLAy*gZsD!?r`_(IKc3MfsX14ekV4BZu{_o(|)84&=Oe6y}y2rVRnJs)V0= zeErdb1VRCbi14U^{iOv4%i?kk=s5Af#u5RKko?lYSGGXSzoZqlegGm|b^?V>?Ts2A z2A{E5scrc{&td|`-5{30$IRnlg&)suE;ZL|3-4TbS!9OXikr~P!nYBYTL;ORHs28| zFggu@2JK{@q!jw7)hkH;0w`3ZdZTbpVOEeJwfhrHQh&z8A`0aTI4Hzsrgb)leb&FZ zJ*1s(SO&MO_;9YZlecky!erDdMaewvsIzPcd1(#zw>)I-#fwSWBR>Uq%R4RAq$P@r zm5c&uIbM`sNGMaPyzu|NQ;iFl#;cjQWH#&d|8nr}^+bvE?+bloY5ONJ1WXMbOvWFx zIKwZB>%Pb~_b8weNPE?qxuG#_W7576pJQrr$&ZOv4O-A~_48TG(?jbuU|>n_-b=+9YYh^xD4JUZ9!D@tpC7Tw)7f zs1Ka+&6a{~Gc@?3OltinQeVlR>!VVMdpaCTypusI4rhjOj)~XZ69d4j){<38|5dW#4 zSNUPoiOIXho)?I5>BhJ~W5T&1ln7RjUfD5T;wn0X9>~+}uKN81-1Apk{B_H1@&jqh zo~sstJSd6=d%;VS4kT)lkh(fDMdp|V41m{$fd+7KZFmQitM(uu_vHz!?WO7h5AwEH zMPwoJMN<&u1q4{G77=y+h35$_CGf&evjSV1dYrU!Yd`AbD7qBZk9%wQjg}ye)3fR4aGr%-Ya5E&MhsYOzFvZF16RYwuC}_!p)s6S}z|T$U z2Z!qY!dA4>u%Nxy2K^@(UYmR-@+$6Fvni^r@WTz@G?S?9+7E*}LRy-6nP)A88jn?5 z`ySf`guOU8R5Zl1bydc9jVx6f3Zh$RcI4vapI4mCH<9YNh!kQ7CuD3t#~n(3Pgr&xum8&U*1%Ysm$IExQS8fCl`e(R*vf* zzhdUE2o9Gy=LxP{vPgEz5D9?OQ9OpcGcJEGAci|HTi#Uf3@z<9@rE|i{EkrKoTr!H zGqy`?fK&k%=76t!%`>p@ClQbDQ)dphg-Qf!b7KT`eHhwZ;=PqKbB6^Weigg91r6t7 z`mUEcPVD_sHQu2Y;Vhp$e^*ynO}d%G4n@AA3b~qFx$xavA!?KQm%@f(ygl2~PNq#N zf7`dLod-#iDc5r?NB19=O+Oi+|Gj?u;vd8iR3r$&xNIJOb730wv5Q5YJzvuJV$dBH zTsMT>K~|%Fq0ke_nyKe~qjaMs)$jPh>*=viAwF#&}aP{fW) zdTout{o0Xkx8V;HUq?Q;J=oEG_Pp?a&z1k$>1p}@^4XvL^VuW#R$Lh7;BWhR_Zw>3 zdE<;c^TQ+mU+5=*3~FyWc8Q4%%yTt#!b(?)><4^w84I`J5he=x*=;66JY$j@u;(M~ z$Rjsp>J|8J$Lr8-sGBLrMYEsit zI%(g$wvbo+XU~!vI#2;gKJLQJ7IxQR2XEHPri;{&Uf6^c(}7AFCuj`1oE+M(cxV7^Uvv%q^949GJy;`5;hpR!StBZmup z*dN>hhKtI>txN@jiVSE--$N=k?4(ovpO{DIx{HEfC|cbQO)Fg7V?y zXtDA3`>HFJTfXY53d^PgPe=)2UN04;k=(fJ5PXj-Tk|hJ{LKaPoCoxNaW5XkXK)#m z_NL|E+_N|?cA?Pq{*CMEcGA3tobJXRNAul;_fD3J?i7dPIU{M>#j8TK`NQtW#ss|wsjhie-?a4JqxolodiOIe zR%GjKStZy6TPb|SuDr{ooXZ8jQ1}Ct;*5Sd>ba>ZV&dLVnVZw}oY^Y%z@1T^BR90NR_-NUNrL`Q|& zN+xm}D!3V9bkrcS4*p~rYL%@P*pM(J^oBBP%spXsR}VpJwbYv<7z`VE!O}b{M!FPL zQFo}sp7RF!+%GkH`_~k7jDPt0h>6SzaQ$-QB}InI+#7!MiWhCt3Zidj9A!hqjFR}6 z!}-27JYHoYB|{9)VkQTh_PS{2Au^D%3h#0X@LmQ)+AC4h{rp!Gzz7|W5vTG?8RHDt?DtJF_Oi6-9NFAd7_=cNb40~>UNcFnh3tjL3lR&9F{== z{c3fd&X02go>>2q0?8UvQ3)8FVGtj;G@WzoZLw1e)W7ZRh`6G`SJ@SSFk6+Uw7b)O zqblbR2-_B8A0qWFmYQw{Pgj7GM^wZD^dQwMGmehTsg>W;>bIRT^xA$-)I_@RFU8W? z8-jtg+LrBWH^*X`7dil@(}0RSsXN={hsyBgUmbZETHHcm-)D`k?PkLJC zJS2WdG^tk?UaG8!^#;|14#WAd?p)@V+PCER*=BTKK-hj0T`T>kul5m_i)frNE2Bw! z0(dE}jhq~w+*<$muCeENf;TIi9<0AJl3lFbe!u8m3}Y8UFIArV>K5eX)x1QBmv>igVD6O9VWn=7c6zP1?M?KH@*Ka@) z$ty?Qes?4u#3k(a$TexV>{jGyrwH>iol}g64_H@+r{aHCW(Wj@MUbtAm>!I5<9;+e z6jE3x2o#d4-4pIS4fJqop#o5uNkclAe6PkYl}zVO&cN?jMgEZ8iX(||^P8x6+p11V zp#+*el`7?|{JS`&EKfgLb%u1!Ae3k^=BOoJ+U zB0wlN>eGS_j+@G3o~+SKpiN%^gb}_P+z_tByW+S9HiMWVQVmQe-w020JBuv0{1iwj z6xO~dphOTA@sc`5AU}X!L6_a*=Nk(l3T=>%TeP zUIF%@bpqY)XRzD+$>heCq+IrEa0ZXgK^++b3afcwh2&KJicoh3vQKv`Gp*(K>uiA} z1Y!gGm_BXRU5-CNxut_`Wekc}7tTo`TO9W$f~tVB$nERHw(*hBTA&0T9#i=F?$_Xh zQ$Vy#hAEt&vcKd({BF=XU+>qkJamvX{|Q-LXCSa0gpdewTii3nl@`kHU$;}0SE5l2)|abcd8ol)9#sWH>t9kNW8 z2NF%i7jTOE%`Kx=GgV?muLm5yQT2F>B}!CrCx^P>HHT+qnDu)*N?I1~%l@H@_o#Uc zxA_l=@V~yOOT6dfDkL|WeUpSJN5RxhFFNV%qy~$B&-!afsbhce*$T(jl(ySwvj0|T zZ_P~J323aD3K z_gOm-ww>R%sQkv!Rh4R|K&TuwzdP-9e}AydBjI+!bKR~}T$M#<&P5<%dQ8t74Z6S@ zJ)YNnAorugR2mx>IZc$1s45^?D=*qWPQ#Rd{8bkDT{%f@vOqh<3>I zIbNQaZa4!kE&$n3%%Lw86VqwB0wQ5BlzhpD4W-2$g-yInqfqO~*y&Izl|X{q`_>b4 zQqIJ+n>XFJ=H6fK6ezB2X1ny@%!I$^efu4X(Z@fLj}lo{$`<#6h8qqXhg{e{6eC0O z5Kh&L(nju$uWL4rathP@@0jG>m@bPrgWNv@*@fTr1kof%CFr1hV(Ta8xmnIP#3IHf z$q$Ph$UEpqFdoFbV9dwK7erS^H9{a@ncdtoINxv09ZB2Vzme$FxlX~2nxFWDBS4UB zyBA0~XV?7wn`O|iKVZk_h$IV=H1J7jj#*YpQ7>W{k>caZd*DLceZ4kvlNx1~e?%I| zUqJSOI^#cxeoJJMi24!s@H`HU!VXv$cX+ztG~bS_LX>_5kU)`w57O;T^bPH*w}tS# z6l~VxCm?ubFP%rQ7RVuOOZ;e=C^)gKP(N!%f;F2 zo45(HWc;@68~~v$V@1M+^FPRGCnWRN4;mfaBu1Pg55bZ<>GlcTlzQhvrOkj;y8sSF zjZL#D9pG2V`ypd(A>sS;N&kxdu+e8^<)Zs?G^shlw2N2u&E;L1)jJiiG^;;Ynu4m!6@2Z^a|c%Ic>oXHJS(kpRQlTnnD7vL<)2nzQvxqdA|53tDz9l9kTi>i_wlG$}&x#tRq*KTq0_s=(>vf zkfkp`qT$-*RWzxuXL>+;ggqMSVj~aD2E_J?(L6E@DZ>-80-~WMXh3Esr zmjMa&VS3BaleJY~m0D+NRnZEfxQAM*Yo|&ax9_-xCr@{`wFQo~WTmCE0Vl{coajST zIs}#~Y3Q91y`DDbr`kXtx6@@wXVX`H`T)Kn0?V)=$m8P-EYR1XmgdS&9b10(``hGk zqQU@@TMWK6UX_b@D6W4F-rV%4XsPQR;P&{Tfb_dacRlr`=AHF-h+HnSF>ImP3oeVP0 ziBM>xK29cME0n211HSjQAK&0ZCNpJ6TfP1ykz=vMl|}HDr7!Br&7nHcP3zymZ_6r< z=qu-}1m+c_FGA$oueilTo&1-{?w_NeE>X#6m+vI$QAp(|$U$T-QG50G5-@Xx6c8^n z(ncOV9jF5e2|`6xNPd=)i$T*Avk`}wZ+9EpxN-BVoH+aS$Q!E8lD&QJE(>$TmQZWZ z>V23{e#8F?uWP}f5PZ3;YS23l=TdIBjX1BE6=T5^`%U~)*b4{!n3HaXgssw|z6F7B z@$rEAyCvQq%$YJE_m6=$XA8ZSgKd-m@g}?D%OoQARZJ)8c>grXCtsrieX~YFk>y%t zO{aU!3YdEIvczREhYnL~q5gX^@IVp>+ph;S1*SX+k1P%z+EXMY)b=qhDzQ*RLM`_}>Qu=W>{N^}CXFaeVsn|~;QxcI z_V-CmbK^5fk%sd(7Net6ZeHJlKy9kfhN88eRLF?W-FpD^GbG7FS;M$pRIn0tQ zF!l!Fi@Qp|Yl*z!e_XT-f(9gMKUkf$s%Hj(lrl_22cA`9X z*Bdsw(;857+p!J^QL78S`=lq^%15>QyJ#I*BtH!|excG(>o9Ngf@M!Qr|FuvqUgtnu+=dTvFs$X>zq4F#)DCZxwRJA|0M-&toP?P zbetP|m7P1YSWLju52YORW*%+GtGwWC-;nSx2xn*Fms?-(yMYltuk#){9Y86{hD5AB+4>Vo2u9C-H{Yi_#w^KXt~|2`FlFtdq^uR(EfT19V#W; z9Q96sErtsD&3XZMeio?HcW@v3oW+;}2#lhsEME#}arezt$h3Fh@@dOZo0j7S3{$}L zqz#TOX0^yeHL*)x^a$>aJVTujm%bcCAhjVHQ#lOrj>!q%qZx)8XwI(ilG6t5jJO*8 zm5OokTSd}uyMPF+` z?0%ca%wQozYj+OBGM;^@e9WP?$%AL~y+*xc(|%0yE8yS!V{up3k>osf_zk!w$`Eyvi6&$K`83V(LJEjf~yH zRwtQuO(76X`ozbAQI>h5YP*q1?Wg?Mj|4nXTkZ|?P={l~K^!h|gfeKC&+z8{hk$T{ z%hbbo_?H@hL$kX-8+BXk>nJ|QHEi5yxZ~thf-br4ZRzV|QTM0S_UaBCN z{D9@FY|FnfN4Hf;lf>TVzaO&~GxF~5@SGTJpm~ar)r2-r3*3JHh)jX|?c2PD56HYQ zo}@<+CbfWXay;$nih=Vc87IGuyJm}%ma$!gE{C3mZx{XuW#vPVmjIYp zJLq@h1hu^oF0etzFDzy=k;juACPk z+15tDMm0J_i{Iu6flh8JvbGgSydpgZalmCFz69VU($~Ly-P{<+B(F0`{u1wXEom7TU7{-x&EU zMlBxJEwO3Ja+%(yW`E{Ha>%Q(ZIjlgK4v-Lh85+ZxpSjN@`PhDzn*wTSb1^*G_XlF zq??leLI(tI3VR`@Wwh78B2)=0H~S{VPYHj3)ydV8n^T?!jtx2lyQq7$QyiNpX03O3 zCi_~-b|U25?(|MolVc+vHs@sXgWi^}2YyL)3~y2uGCPPjT36<9g<>2F(E}Q`EyGP3 zZX7lq)z6Ej$+T%_&?T~zaQ>j#zS~QekPBdln_sFnt@awPi1mnL9l-0=e3C`pX!pKQ z9y?9iO#bx-E=G$2easr7sMxNx5PO618sNZ=dXz=BclBsh5Bz@d)aI^MF5WmDinPIf zBnl+ML!cbq06&%(?j#13z3KIL?Mx(Lv_{bv&bGc%vE=IN^1K#6!iXE3c->K~C&z7( zX!rn6l&Y*QLkK9^yvua5n-1)#z#JEaN!{34IOK=e%^t2W4#QOV+jHScyvtMUJSgzkRR|D>(l-2b%T^qA(afT-bl?sde$T_Vk5;{fc z65qPz#LalNLCRFMHeU8K12hw<{DJ$Yvfvhyy-B%&XrNlG<9%CAPWw8dmHZGF;Lv@a z#b7En6f~>L&mMBMbGL^m7^-YU-xOI}J4b8|F9#TV;L_vIwuVu}Xm|P0;1i-V18;Vm zpD}iE&5`y*-0pi9)I^$xUa51uQm+imMf!u$5}Vx2xN+oy=Mt$%vZ z4_JB*!;XgYPu{^Y;1tQAar-31B+m-X4;Mwyn#>E+s=yD>UAxb<4f@tuD5h8sb?GCg z%iG9t8Yfw740lxuioC#9fHF|oGXB|k?*h{;fGKm&fWhr`3U2TIA+>#h%gh39Q_M`||A>edmU?^Q(7W1jUBJ?A03D_1nbYIjm#Xb;cT;UIFrc z%jk=fwImDYnDCmmlh{pnYulkEy;Lc+D)mA=XivrvqioPMdk+ov)vy$SPwb)ee;7_K$LA^Q}G3 z4Smj=#F9!lfi1QQmhonD+vIR$QqhmcPs!Vx>AY(v)LRBK^+x7rN%y%XJHJcAAKXSg zb~^s>`r499X2MFjb4vcakjoQfGH-~P?dg^Jsna56DNJXVv*K=od)LhAkuxObBsU$= z#AYabSYIqe@nV<(53DR29TW243Y5isye`~W{TkS2goQ_4q&nqRveB`_+D;^as8Vcy zoQO4HJ;l>o?@O#hBA@27St}hp(O%!h>WwWxn?d$I`znxfQXq65SY&;bDBY(+j=rAI z4c}E7WDy(RjXi#n|Hpe_+$}E#-}Gu4Y6Hx?VTb$(0ITP;MtKOYk|cX>JW`-=@SNu| z6l_nF(6YEO<0@KzfZK0s7DDwQEDcWf9`av;a9QfH@2Og?ilDS6%bb43Sg>>ow-w(L zsa;vCo}?7hiA)HeTgu&+!(sW!%MT8*QgxKp6EX?z3v_0z*caPjLcQ7l zF=hJJEBRP3c;|1f9|K{GUQhl1%9e&HouB)3Qj`F%Sd-oAK@w45OPI%7pI9=?Jys12 z3?h1Jk1t$%Z@ZE%;plX|G%UfYu}4RZ_K7@);t1L;PniA2C5n6gYaADc)&x)Pb}2#_ zI!gAGMreL#R@@)9$4i;M43E{WU`gsTblG3X#*p)lyqyQmAJ9QFY#}q8se8;;$Z(D-#R@5f=&WIuxu!61qJv*#bX#R@id?6u3SrQKA3y zDtq#`LMk7{+}K}uiK!Nmi6E+H53ZtJ+uUcy zb?oyCJhZYRZIavf>3qws(mDP>$U%p9uhF)^~%&7zEgQ|*Bgo=I7 zBY}N*ECY)*`-}vaGG{zV=r)-*N_c9NGb}bn?dQ4_2n)k7k|C==xQuN5Y9uuizyIW@ zaX@?%I_402eb|> zv)N&OrC^7xp6x0pZ%fV`(dX<$P)6I=IMEY_#gT=nGQlo^3a7Snh&q#96s|Eluk!n( z>W5j{&Rk+NCeiZYo%6Y4-EI$zhOl<@EUm|%g34g{0Rm&T8|?6S1z>Mc!%UOe*4k&;l>S2A1Q?fR3PD;tVgpi zawERWlmAJcM{UH3I`wgxlWlfx=|=M<7u!&}|?FVc&QvxSz zviIJFSF80Z{11)wj%w|wtvJ#Pa?woUhm5OY`s0g}BuWfYe77In`)jMIdtD>-O{a1x zx#6(e6o0EY4nn*9_I(mJ4XvwF_(*?;+yNmE>6>oQeE7a(mNI+&{H!AUjs~VR$IX1t z!+PB9^GLZtRibL(oyBWw7l&_K)|Yvq8|z%+TX%+i7YMhh&imb= zRo~MX#2Mg7_&pnfHU1A_?*Y}++I0&bu^<+zibw#Z_t3;pqlX|Jq<2sO5s(&&QUW3f z1TaW%5u`UE(tD9!6r=_M(jgFA3f~b=wVl9Xuy$|K;XdyN_UNqE=nO2i-2QN9|;uSAjwYij4@W?~!g4 zj+La(>!gV9P{OQ5hqbejVZrUarx0C%2)=8W?+j)_Qn+xXd+~(l`46sTwLD!fnWtMS z(eP?)=^UaC&U0jT(g|`?|Kz4Q^K&4!y2C1lE%WPz9eDLE zw@7vqe&nV`1apW}2DVZ~J=aJdGfqhidPlpD&G)snA(l`Ff*w}Wyhel2U7+ixh_|J(cyr7g-Kb;w0RXHHI)_&sym7+$Q91>|eB`fW<% zjd;0DseYBPtG&D=j$}<1+{dQEK(&f{ zx=_+;%<*!qZ_{a2LU+{nEhQuFm&xojEG}bUy+RuK`r6W30^`2-({T%nqBR!%Z7I?A(fTuzsLZ?ulAmT z+OgbzztpTbbnG2)C-`H}2FL3y1O+B`_LZOlvG<-y6TIuqd6&4Zy339X$gU=YHEl9g8mpnF) z>k0qO!9y*yBHHZ%>kEg223cF~al~cI{#tS)@-!H`DKbVE<#<}_uIH8(#8_DHu#Dtx zdofXSBXn@1Up(C%hcCQ}@v}~Y@0Xw*e=erJW8jNnRkw&@C)dKaBUNs)UwC?TTraiX z5uN_EUGDj4n>Y-|ohF4+0cAp{vdQTv{3ZH>M~B&avGb5`Fl-umJWXFcA`S3bxEepE zpvi{?#})c1njIKgI&5bKeAt^VIM3bLxj0=^eB8}g*iH0kX+9^pwVVR^X6ENtaiAoF z;XBA>KZlY_bz2;c=9k@$id28F+OPhS!3Ng<^c9`~4IyfU-?*1K2?ZD|_1=RCw&W6q zm{qk;hpY-M_nOuRlO2ibZC9k2wvNLU&i5%mnrOYaJr3=yoJDO08;6{T<^lvttYdKz zXFQl=>yxktE3sjk)F4f~jC~2Bwb)6<4#R!5=42Mg8&x8z%m-o{9I|Y`1q0o#dd5OV zU3K2^^k!|##kL*X_Ivw|p;dH=|v6F4Ls9TC>)4A_11}_7@Q*z7JzR}-r zS%EFt?f0yVR6oV>A9=B3k<&+guL+xu8pm%WyFP^gG=oF$>21O8+pd+$nVJo2HsHbu z{E5ck>lWj9NT#`*?&nAj_n4h~os7^R6^4Ts?8aMx*|N{Vw?tkPmq1Li*IgXjMOlM6 z(HgfSJ3itR;`8Je}e#nkv&DG6s>4fCnMIbDc+Lstq$?m9|IO2J>85vslxfRTO*^p zdq39bk!UsiKKT7&HlTb}zhg~R#<5gjupQz(n0IgcC*l6;zOi8a&tysDW4+sC`bb9p z;}$ksI*Xqr<=4Rs_qByCkLkX2LI1hi65(y}b$b;|-*m-l8<^rz*K0{&%&Na3sJNJa zUE?FKu{6zVU+_A zipvaxyxS?-KXz!f&5^eD(PD`60yeR#Vcqd+pO>|3&n%Z*jDOQ{Z&Ur#xsZgznw=2b zXLP~==iZ0@TFu|a46YHFsRuD)E4pCY+wz5}{a$~fEIS?ufiqSg6=>DDoB&fwA5%=C z9sNXLyKMUxWA3dWDu?fV&}wRyhtIw2@Ka&1vW+&NOUny9IvcSj04*hqqSTU6&Yw|V zv--&>q%H`TX!JZuLrPvb7!kiw6%KB!uGAo(XZ`)wi%vFiIkuHqQ)jGgJT~w0vM5qj zPcRkS6=#H^v^|F^l(1_GQ!v5zU#0rZ@^+KL$5X@4finK}XOa5f6|49GsNwAYFax%b* za$qXfrSWGZ6R(WZHaU2;0v+(i>29rABaJ*T!8gi%_~;^a*74|KfoBLwjXYtKge1>;@9tD%JMK1a6!enxtMh7IKd=_51hv0 zK%vVRc07BE%;A&%17Ahfmf81K+zG8)%ZVy&y!#i``l1huJ4)I`{bN!lvn+1$uRE`Z zYZ?*dLjzS=pXFus?P%P}!iJCw}OjThpIzB0}BJ zCGhpo1P;D4n^j> zPC{P5WW!68b&HkBLV7)>K2-U1o9J#zbE{{l)>vMNxEq)yTbhL3X<4oShIuEg`M@1V zarYQ%)UWJBM=%E0-<@0J0uLB(M8LY-;tlVSJDiUnf3iwL8ouwrUld*Ki`gkO+&#J} z5Ob}bQ-cBQeWm$OyR|^)B#y3XS^VkeHut5qxBG0=dk1v!$#cu!;kJJU@90EY&TqHGEp{Ew zbFqP!U9ZeAqUtZJS>_ND&}-0!x7fr%bmPoe>s1wtFI#g)wb4UHUgKSy@RN7id(lcL z#<=?13-7D_gu1s{I1QZGIrlq`KK??aC4rjqbbxxa3bPQ#jjmIv93 zjs5F)3<>hg<$B!CPrh8VPMRCU`?t<<7n0*LxXCqdCOJAa5}wg~?gq~_DTGU(=(jKq zo1th!vv6hfdE&fx3;5^G&bxWb7%{Unck@CZ2y*;+4Xf;D_a$Ku5+nAk&FH4xbtN^w z^$0{pPLz>!Odh4#`K3VF>bM|%=0eN5FGRdVZY}=8%SSGT) zw{)hgt^9fCW&W7HSbRLiSRlvfoOV3(ls;d#zcc3C==8mPvl8evkAaTn62;hl1})hV zzl{O6O%B$rP@L$;RR(1C`!|;yyd?>P#>G`*9InOJZC;yLPHo3m4QoHo>CQtri1lMk zk~J0)@KkV(=gwM0nZk5X;3YcEWMUU0Zk5}ygvN3^I$;>~7^c{o^gN%T{}SZ(DiE}w zX87v;=tH^-)2{*1Y#(Y(#+A1ES39j&*l9}EZjffTd%>8dguGNlF>kRMsm3;UU=PBx zO`<&TOl3ISC_|9;iL9x;T_?{MWYc&lI6;1-D*rkQisVY;L6jQ;N6tb%^0u69}W*sf*82C@XWp~!vEG`3$1P487aSjwToIm+@Ry~ z6B%s}$Xk7rOiVwx;4*7|X<7iHxoZ)0@TC5=l*6_H*Zwb8L#Uw|raPzi?}%~s^E2{~ z{_taEdH<#{&WXxb5|kN^6O|*+M2{{iB~VsYp8twID-;r&8?~NprgrznH^eL}RK#3M zRWRh?zKS(-F7^F3J5tcCb4fsI1WbMr`Y=G&f2Fqx*Fpbh7J_^FO;Vr&($6MWIN!hi z@{(dMJHwOyEU_kDb<4S5fCx6`liy{BA6FIN7T-nk1#@XF{+OD(Rh4JiOc(bqL7dZK zuH?s6;oEdlQH<~FedjOUZnB=|;&YsOvwhW&n>I-V->%tHF6p@k-AhBNc3>q%sZ@vG z6(c=eOQirEghHTqlCd!j$aWf>!Xy1egz3Szy}Ap6%C7ZF|6Y~le$2$ka1C-z5vfcA zvCgKuc^Dy1$FK%7y<0#Fh5|l6AEdia7n~07Og1-M>}1i9b|c$7MRc_g85z`y*rr~T; z@YEW9VgqRDQdh0k__Zi}pMtvH_LoO`-01h!SbFm?tE-)y@v_Vu*;aR2Pv9lpuip~u znipigSu6Eb`0eObaHk}l+?#k#(e7?>ezmVJ^GkMR z9kD&Wd~3hge!w1Jdv|Nx8y8$mVcg%wU*HxRO%S zmECoVH?!L+jscsjFYPXE&q1-SKZ37oDh`b0{1R}v5+0Q80iOv$s+<{ zg;4}~t;H5m)yenXiY?@UT;29BKU|}eeVH>;RPhZukP7zVUhGuW4W#nlogEYanwyMGri1UX7qoe!BhT#hWfWD$FYfCZxjY-`mO@|(%p6~mM2BTl~sd6XO~sN+g4}Gf4~4)kTm$qks43J zHdWaZua2H%_vo?t=zNd~UP#1ej$+Ge+(h}6O66zS;fw5&JimhT; zk%_wiEwiLDVV|!818)e*KqaK}V=?!}N82JSMA&_Rkp(Z!ct^;*J1qKo{5dsC+_r-a z=z^2a#Kb7Le%GN!FJx=yW6xEElbQBjF~5KU%PSmOr-??{Lfl_f@)eBCfBufNdc1vo zWGC!nHlq4v6EC)nj-j@^H+<}6#d9(>C{l_7V@1= zp7DfK`0k$I+lUiAj2RI^#V2|%q>`CuD?wnnk1m9 z0yCa5&a$JZQ=u`BE2N24v;*LSnyMAjL!#U{-o3JIYc__su6%}b#p7tpIb{|~b2S=H@a)0ZtT5YSvZKmv)BOQdM2c`h(Y^7L8 z%%y1u2VK*f*C!${rACdDGzbuJ~HcFSiv&Z61}Hd9TJ#I1T8|+DE?!TB|vTcm-NB zolcH;R}F^#7(wIeF%=X7LflawmvlXm$4m9warIS%JKXEdh7z0@A4>mL9g9N3p?!r_3vD&u(ymkIf58?E;eK>ksujbP@QkR3iN%l(9<1gTG((* zJ}eb5yix*GBPZ##37xXD-Is`hX>JQqN_`Eq_=|IAhEoju{=&D(^#WDNEG5tZ18$(}Y zSb58yLp)56HN&Py^t^d-dhD;g;@6*En-4XJSM@i<^1c*gXp0UrQ$ij-y1~$BCFD8h zbAvA3o$Y7E7Y(R9Ak#7We6s8YU13%T0*z_=$os^e*_^N__(wvyaK(?UhZk2XRiqAsuI`lr$_>zDY)ptn3X1v zDR72ejX%%a-)zUuFBT=vLHP(bdwUM#yCj}wY{`(-@3uG3dQhDo6Trq)AJxVAqUZNc9)?Pe@Pek`1XkSCSE^NQhWa%;C*l=7GvMPRCw$$Cd;EsN zb$th-6frwimcV94o=rBCUaC%AK6I*kU>&pS%*v$XkzbS}W>LB7{Yx*>PcIecv?Eo@ z5N8!bB}w+aQ)5@^Wq#*9A4ZKdA>oHc9df8tm9udr;8GXMc9UqsxC^<4tPMS2`~#)W z`4!~J=+$}J6ixQ*(iPhk*ZO#L5@%t3H?;>4S$<*Nq&_iv)vWPH67-ABwn>P-*A!C5 zVn*@~DK_8HFSwhtvg4h(O3~an(V$Gq6@a0IJ~FWo5T1pC)?Dvc_O!WG#W!&hX%8xl z>HDt0ePijt5WMm6PBptWByPb-OxxMdzQF}B7r)c)VMLM2cpm zzDxYkMo=I^igth-OFbn(>lpen8FJ!!+yIznW!6qP!Rwbmj;hOZkRT2*O)-e>{Bld_ zjNpS&>%wko8`vY?os?-ae@uKJ2lf`)q1rEZdX|G(A)&V-nD8jXm zo)AkJ773PmP){$rW2-7>l0ZmvRpVX}k&C16=E{QjfSCMlI?c#kqtsiuL5sd-gAdq! zcxlEMEBg+i{x$2wD?vz~;t)SKp3QcD3{5VO=u&F_(t0Prx z*U9GZyZ-f&gaLc;h8i+^CiI2^dyi&H(9W&iNA~qzJg+X(fRD>k^HG3}UM6P< z7aAH`o4NSah5qgw6~0S{6YYO8%XX6Pl*~0|M6HLMzlf&?g)0A^G3wcLc4X?>C`Zp< zp=5;I=gO%28gviYrJ;dm=;aP`E{DC0S(miY=;P9`k;X3Ea0eJ4edeY{Iz{=@UL?TJ z#I-2qar2+S^C6dIjz3??g(NN@5ipqus77oVO&p{#i8CV&W~kGo5B2QxFhuD?_Pg`* zwdx`kH2{x0vI4I;me;41dFsh@j8RLxl~P|^`9+0z`(f9i3UYeKj`Qih^PVeer@rIk zK9#Lb#>al5NU6cjq0lY4=;e zx?R3Q1FL$hlB0VCrb}u-tt9$abR*HUl%qx#TdhXaZrF{(?^m#_BoJ(>3jIt;_Db7c zQx)XF6M=D|mBKVGndn}(4|Q2=BWjjjPL>l}2spP6pS5s*-CvFs+um8I1S!M{IuId-rVPVJ!dG=_#Q7HmWGNNL|*h z2{4Wi@bL_Fz<6_0vs96qzf1MEt>CS$n(!S|-cLwHDUHgmbm=~7>yu%oJN z-j*5Q9y?-e`-!Wp{TPrkpV4E=@LqS&Ow*-YQ2nPP7JvwDen|~GrU<00v$Jg3XHwnB z`wQZFOC`u2pigO$Ytpd)n1M2bS&wq+C4Irk*KUj^_KRs7Yc=2Bjk9*nnbni$gPx{; z@Biv=<`W;WU%5Jt@??;d+R2Q>*GYz$uKqV2;ss~@?;Y+E<4WXWPH1RL zmMoHu^K0zQ-o=^8*1_rkQ_v1>^TwYWIw3_6C z)zY(EYHv_A?9K>hs5phDL|H^;cb`ryVml`7OG_`bz3SJzigsCJX3I4ADP= zv>eYvPk^NEyJ+W)%$}LHhwtV$Pc}9UU@Om&5`#&$sWr>gFc4$d$)9X4p3jWG@Y0o> zS)~U@Vv+A9?Ms4n(mEI9rFa_P6bul?x3w9 z#nrZ1Y8{WsPP%>aoJ5^im#KN@2#Mi0)tauB-JgbrZF`XFiZ|HzS^5mkw36u;%LLu9 z)~z=GP1i#H=>IsB%3;eTntXoX3rk7;e-=Puv;GAGb5iXHff>}EQdx)&p|+T2x(;4F z=ao*HdjQ1#p<4j!uRWqXcTSo82Fq^>0_aHiq88luT1dpjpf6OJUF z8Z*lYZG@d~HnFQ1r_VZ$?8)XKaY=RKy$V8v#(Nj*8|tYJYoY$9%hkdx{XoFNn>M^C z)MFcO=xEVTW0%pc*|llnkSCAF*LFd@7`!SS#2uTcfFP4UX+|E2v$!)%a#{PVRD2m8%cegKbi)VG_|Blu51gHyK_p_$ic-$-T@F4B zxvx;30wii&G=NPL9>k0jYtH9@yL?7uw95hnsUjn8)GlC*Ue!0`55sG>l~KwqKbrNS z0+mCc&@H6aF#gPj;)j9uPnX7LNsX4|5z8WskeTH|d8YDX$b*s_2C?p7eF?t!zDx`! zIuGceQc4u$M5VeI$O5|5gzd(rPE^j3SM0C;q#jIE@SR>68uDV;f+yLV3Qqk_2xjY%k%bg!`=Vs&;eT@k$$F* zXWG%LnCY)H3M?<_G-(uaQeL(Dq^{TVZy?TqB0%4v*pQ|Aq=1nM!9kN9quv{5J}po9 zmWTNi+Hd5UxgRWSxk28XfNq{Tpb{GeF(nIH;Tp|Y@^~nzKCRE8#_}q0zn^rPOrB0y zydQsT$3=g);K~4hV)Jn;^tjbqhX`ahRv+Hw(W`gRBsFe*aMtrb!TVbPDyL0{;e_JX z4GseMx59|S{?p@rZ`pd~5An3E0YR5J!jz*cTWdV#nWw9t^W_=SYhL!>GxXOlocTH= z=?y^fx6f1IgC>4$cn-lBhf8AV=U;`POCP>rx;4Ygp_KM=O}*pHMmyECEeX1VT)jg5r}kX^d~M))I^;4G zKsNN2U4pLR(eVK-bo6*8^gWd?5x)WXn|dN3rY6t${!4K+k&W6O()4o!Fp$(qn4@hM zO`k`#D9I7DXT_dDK(k+zsVQH%I<^N~&gBAm?@q!!%C3qPi^H;#;$4DT@^yPh?-j1{ zrAe{6E^F`RlGwB+j+w-ze3n@z(YlXmC*$+V=7V z2~gAypQv)iGzosK#Kin_&_f@JLTWSJB54-|pZDrIO{pAMOK!0tZtyqdQkj_Tw=LQv z?V9A#-ri{R0;7zjuy3X-IN?N*1m?%SF~FVJ`o|@Pe%M)509Mr!f{vwEyXMQ6@*RtL zR{jGIf8OXHp2172tA66P36(s}7epA!VU<4@BsRAbk6%#uS*oeeG_E^37uIQ9xP!ix zOt1DZyZ7OunBb8+;1Ryqu3H7Jo_QyQ4@u`Z`Fg{!_QJ?8%FMjmx}Lo?_AgVmQ8o9t zg{0?WYTI)B9U+8@m1=+8VWttdn z04yR>Cqe`tz3w%giZ1Y40hAz9+*qZF%bCoXG_#5ExK!KEotI)LR$NIbO-CssfFv4| zN!zzjt{CO7&z=X69=Cn&ezH=dR{7ILNGa9-sb-s&#xiH4Itu#ORI&}H{ z`2>)w%WvWmC;d$-o;&eFF+)7_i?t)R8L#rTW|}+YVw&vu%q3}9&=Waa3$DZbp8|(o zRrmcj+|<(E{t*yL$qb!zALkks1vmr&aY{39Tb;~{EUMCRI}OhL%(6DaQXkYF9;_CF z(L_R|Ol|32327SZXGx|HXxt|e5{M5x$z$YAhbGL)*zqg>Y0jSq)r7*P;o*)Ae@hZ# zPtBKv+bpysOponZ9W-IcjYO**Q-0D(qlmBPpbmurVGfTyS$6kP4B39|taF=C5eACn#Kxw1 z?7>ad-)e=I4`!M2_mYgGa~q5LfE>n{{EhAS(K_$9Xk`TxrZWUYiwtoGGNSKpwKF7<-oAWu(10eO(BUNuNevCohBVnc_{w76!<&xSs36L1`o$MQQ0*h1Z)OSQpnx6+QnH=f-Iar-w>j??&q$1PRY zYZSVY6>}-zELXbQP)7If-;=0*vq!>;`*FnrrT+Qq2KSxII2lKJMfnQSuwAj&$C0oM z?}|deL4HKZ+rBCb>WRRf#1XmbxN7nmh1e<>7E8q)8i?6{A3!iv@n0jB`)33F3;!wT z<(FwOtKuAL&|HoWJ-SJD#OUy~ayhUyPmhi5s5d}$$g(Vm+#SY5pN#F9lMD$7Yw-&i z#7f^`&Dh?)FMEW9ZRI9Cwv~KKE^^80&`BIl)rLHN0Zt(p*%Bldv#jnt2Z6z8xP<^u z(?f5sR6v!*Q}e@OXlU47{0;7sGozON5hXUr>#v>DMpSre?(w)c0mSlLxgzghs}@yH zOUYZ2{=R$FopPEP4Q|{aH|^f%LDWQRrfq1=pz?rxIkw=;A#?R58`x*OH@^NBB?9JLt(gv^b$?{-O-E(An0=7&^6TaZteG z1ZhOR4Q!?Bq*XJWHEMzThl#z5Ns8}{zSqYL(pB!7d)q>9q`% zT~cBrom}wZ`CL(D(iO^hcrVNCnHIQnE%j#w)BG4(GMD`|WS6L5E0){!!y%w8V*!o(}!e>7BMfl}mNFWvnj-zw(f5s_GoMms!U(9ra-1Ii?w#zS$o#y%z zbG?tMf!Xiu59@px{r5*}5pyQ}Tm4(KLIRLN8?=s;eCT0^RC~>JTa+WaYBpW4%kV(7 z2M7zh%)w44W*+a%Y%goJd9&!65<8lZx`W0K)8##lQ~*&spIJTQU8 zPj{F*CHv6of6O&2!@&Q87s*R^H=1L5)eCj!uS_ibT!RsFL0P5MzYSC7a~tjT%Xion z4?M;r2_v5Q7I3RYZBq700%2sj7zm72>uI=^Bi1EO3c?FO9Sh?>(ES^K8pQ=JCl#0U^!E6KVt<~t=F*a~PF!DHRu zw9$Os0c5^60$qbi4hOq2@Y2lyh?OurwAuB7?T6{Z57T*m2e19B44`|%x`iA(YMgYB z0^EUlBw(0`)LFB|B|NI+MoS ztbW*;bR;?22*Gmn7ta=VF~Y^qYmOmpY}s93LNc>iBKH#agp}~CihH^&ogKdhB)J|a z$F;(j5FLGhLaQu(&2uPas=W5wbte(6;19rRt*zjQM){*vbVBI)T;ykNd{kO!iJAdW zOJ{`O+=W1eD|VN8*!OwVR-=(09ZV7-b;riISsk35U3ZH7{nJ05N6X<}aA{KGgH6FHu4UX?~8PyXmHO)ssYled(zPXly~4eNH9d9;e1Z8b8g$$7bfbp(c9cY1wpoxa<}&T+yxmXZ_dAeyoa?BlFmLvJ{Lw}gL=~u04hrik zUFSP+d{H)AE-+5wEs~PeEkVS6@E~~H5D`mr zzp=}2VjHMcJ=w{P^Q(mzzXYO^OxN#R$?R3%Q=ZQV&5cz*64_iDlR?zEieoe1vw;pe zJ3#;b?^TY_LAHW=iAEinD8K2gy%EDEHF744^`UOcpobHM<7HofpOC^B5V9;7w%a16 zx#^9qD^QZ1qr0iC=`u58_S-@5(MyXP)J8yXBWm0Z{|) zB;<>4Su#}k8yN;JClVU6;@VpF;w4(7u&{G=l~D$SOC~2){=Xj>cmsrO6B#Gk`+?+c zG4r!B)KmuHzQTxN=L89DXXP1y95hgt`GIQ16XieTxmzMKMkj$1)NXQfxs+x+4eUF6 zb(L49Mh;|pmeFGzc6_6| zp35*OaS8WeXpLd(eKs-lW!v_%Bd@la(fcOXu}twjE$KmAW6A6%KUvk#a)2qcnaFAL zpc5o@CL&<+(}sI4;f(9?%MxS&$#LHVsLt7Cq4qHLE7W~2L8lNcG5}!t{h|bgJ_Sf5 zeTLb)@4>$578F|R>M>_F<+=LU&U>1YE8F(@6!k{z(Y$6b4joQz_(^ETV*uN-G<9pQ zQA1WDr`qm6HEH2fL%lozEw?Fn83KAHd7l5V{4*zGQ^*27`luEBF1*N7-@{I?9Dp{W0v8ovwYiq@@J$QidU zSS_5k78ep22b!u0gl%I0w_jD8uv(?Df!+z}DDs3$#iWtan+}$MzcJj0Kf%nx z631!^q?S6T=1u42+xKpwhQp)y0 zY2HAl2HnGzfK8|*5e_OaeuZo`a(};kWD$_!=ARZnICoh@v_GhZe!x31R)axPK|Q#~ zOJU$uDj?iwc*gwJ9q^tzPy~BxuP#G&Vtt%k`sx?B!1*Uc%xP_?QxBF3oIzE>>FJ03( zdK<_%fKp!T6^4p*Y|UW-GWIHzz0T!&%QuS7E9@0B5*$iN^#ZWqIS>#2_H%U&WS$6m zI&3bm6?b;04r{_-maR-th`dm}v8R2RKi+)h>ukxXwB@t9Rhp&`hOy#pRjog%t3gpM0os- zvH(9jIG%XF4JF)<%9bTOn+8xi;?42M9ycGZn(P8_MM`AmY9-_`&`BWX$_{RtvW@FE zv6HmDoG_eKdI0dZ;|fr(U)=k=!!w8^c$o1=?vh3UNDk8lv_K~Wx`p%+`M-QY=2h*Y zgFyNKT?FFi|M?cJ6Wk(~&av-^boX3%zz`=mFcdqOZ56uv4Mr4l_UgTu0n>SNmi^O3 zS(h+iuW|1tS=+Si|8Vx(k)@;orJv2vj`Xt88HZ$JDxIe-%-shRi)xdF!*B4-pwFq{ zoXg6!t#k9uqS8VwTH*3=_m|Ncy<<%fhOY}CQjufJxhs?mAWUfdH_w>!TBbhci!Np{ zJ0^zA8s3mgKcWFTxYbVikY*vv%h1m|`C5pAg!2P};7d~yTqF-vu5wj(QV6kH*UJ>8y?pXAQ_kK=9R!UFU71xyOlGGQ1c&q52NyOx^)lE zcqbk=?#n-r=JznZ(DoN;_sojJX(n;4mZeQ!yR3AKa$Y&8~x#~0rG9}7p3p_z&) zWZO8iTr*HI`8*x#%$s!v?l?p+jnFghF;^Z!1$rb^@Koq$2t%=uDI#)^C7JPS`X zcvNGLjnYJq&4YpjGpyM@2cm+xTX8X}q26qNXS;HO3$cd*4(9oP9}IU+0pvduzx$FV zrY)3Y?mpK_kr0CS^phw1^^b-0r3rbN1RKjx$iRYoi?ujPF5itNW(hJcGM*-U+I>5Z z!&Tk_*y{_SN~aLK>z{YS7}Pk5jLW#`Kh>c3k>vq_!%;DzY}qPX_2+ga9dUX}+b?|_ zA8i2ok?{4qzt5TrD(H}H*R|dWljzV;O~ChPvQaiRiP*RO7R>h@jqs-PQ!Q|EeLh#3!rX7RWLsF^4_dK(|3cpo|T$z>2{+S=}4vrU(E{lR_5 zgl}z>t`-jFwjvKfq2Xr7+$~%h!p@LO%P8zQvZRm zc3$548YwlkLK(45qV1KSmqOZ5I=iJze7_z?>g~1IF9nGF=C^2kV0Y&ZYXID0lyEy) zoIvy6wgT#pepU$g&NX?xJ3j(0JKM`Pj#Zy6bL70 z#RnT)n@v^HtjV8t#%O43^ffHoN@YFvtO^E-ojH@qeR+|NH!k$VILo8Bj^d%JvqJn4 z%VLzmEwyUJfpd(v;Q{|-5^t%lsXyIo-e3B@HK-2mTe?F2_D_uer@{PhWdFZD`7C}e zenRf7H`4S9`+21~fX*cJe_h=qu_{f2Qd$(aylB0V_(kG9JrPITbHb4u<$q7?r zR%~eBq=)eYCO{FQ;NV}1#fU!ysi4`2xxTYkbx)=3p(!#XH3^VMPZ?XOuu3bY+ z_a4_i`dNePUN5M327<^Me%-zfXbr_RZdbyi4K4mT4OwSPPra%8Y(1LT{i46Pfd8(w z|33LDalz>Nt4=X}2|#4qb!lK&)m zx^42mjkf=u!e2b(-k9c}n}oCXzccZL#|Myu5Ymd?i2KjQ2ZoV%o0~aJCxSF}!+PAt zE8#U3cBWRm;|XR?THZZ7#KsBxDhwIu!?VRXm=zjU?J!2J!4^v~^+o7~i6zG)Rbimf z&)2_7aw`1QxPL|g=;nEF5 zITek5G1e_Iuk$n^6^s8ft~I7~`DM$i(G7bFpdcGb0C-k~=G}|?0N=%U)$PdFhnG|u z18@a~{YMUd)Zq-9ILJDP{An&kg#d77JzNhQ5W;EBG&Yu=aMF}yfG8CVub8jFf{F6W zZ^R%f3O&!#@%8{H^uocHd}^tBz0w-{a|5^MoJy))gXF;&5zr@@!g-MSe?*04!H;F<~{5 zuvReLGm<8o%WBHyQ=jj>gueTuUq+%U>z7V6$ z_e^VuF?cQ+;G_N;Y1~y^k2Ft<9`5E|}XNZ^MWOWIy-pj4xS!?h&=~oK>9=%Q_lAlEx@{*mO z-+4l{8z3*Oznl{|3*9xvUc)Ew6-%sZ+`g8?M&)|kTCe7CAAGiMlEi}=f*Xb5C8V(H z(-$C@RPi?M^;KNDz~$GLk=D#Si_)vfO6x$+#e>Dr?i4ofG-2`AYYQ?q_BQy>L4-oG z-)P3TeflRh{jV>o`9$gIuUe0hcp=k*Uv;l(B&*Lp2ap36Sv1t*Djcv+KULiO7pq;l zFsQ=G-Ejyg*a|5!yd2a<*qeGR6lnDh_9IqxO*PWg_EX#kOQZer%a0a-V5my?u zS!xJFrMqquM8q#Y=_O;sUL#6GfSJ1+TWAL7H!OyC=bP2^ zaOG}SdZ}1?awSaY*DP!k^JEiZKIPRHeKOv&G4#qhW1^8!yZXXXD}07E3wp(7i$Hby zpV~3HaqTRUoND(-XMf^*27#09>-U>UaM@PEY;CuR7^zb_7sO{>?}J z`&chinKD9e@wPG)jIAWHtNrG|R35uEq*qQ< z0(ZoE{NdASEV;RpbeL4zZ?@Mb8!;rQd;gcX*W7cjxsJU7eCPQvP$N3x%Ktyw zz5}YsE&E=vfJzZjK?xvTsUk=(Dj*%Cqm%$aQF@ma5K)RW0VzsTdhdi@1SE8%mk5aT zKtxI?34#BOzW3(M%$xbm%v%4oTuU^c$>*1Q&pl_Kz4ys^(C7mv`V~?1YoLDj)1Y~L z`&qCBM^pn~Ib4Y2vo`Bx0WktkceL;*4u!1w{@o1_gM1Vm^aT9~FP;_d&HYJ!^ABgn z=fHnBGY}ew`PRQ5FxQXy4XR7no_rGWn@z_GprlQY?!3qUt25~5+fR~_*WVZeXVGMU zCGYP$|Mzp~kN?EK{J}5iNS-zPV@J#7Gkv>b>ot+43f;X>nDPnW*jKcek_{sZis zfmG~zz1NQ3zStiX8Ii2|pZy}2HC^mY8U{A&#z~HCms;o&4KDTgJuYUPc>SNg#os>Z zmfEx7Cb!iw%@XmkdryFhQa4Xe_kX)B1=FRNk3>AJ{E2pj4*`dM?@xKzZVO@Y`||jQ zwe)ZPc>Sv1G17`yIuwBBDjxN`v%*YNDCPWS{_?k*{|}zm7W4J3PE)Wsus~z~M@I0+ zSNwneaPge!&Fgw6P-T{V&7I-w#9f9$6iie(!YVvA7pz(WC>UxjZ~pg-_9*qA*A^E# zDdHcN*3*HL|L4v9^960p#h#Ed-HNAcQ#gAbJmQb7`EMTf-@n8i*3_FMkyq9yT`N8t zDtM9}2R5cZ_H)2Lf7t)|H&!J1ClN4Y_^aWM0m|Uf6+EcO{nqyPsDoP?- zL=Lcw{!F!mT9Roavyqne|I@Y6wYRZKE|Dh(M z^828FlD@|;yYEWDfB&R8ieLW`xGw6s@ensL3Sm3k7Dk^3FnoP_VVk8fsl5LoLIgF{ zxUS>^eydLH(=|QKHE*!5F{n!YJpH0V0CNx5MhpM_m;N8cuIrS3!?W=PxgcyI!z}ROHtS{#W3jYrw;vS9Z&0+=#H=TS+VIpktcsN)0 zg73dRx&HNkxP_X|^I@RLve`zL+f?8oAZ)#o`BSg^AJ2Th3{D3?ryW{bA+wjZ2-?hGdg}!q+vk8IGQ0EkUk)@1KUlGH6x)MWf-)$;K$}uD7!N!qB91X3=08oR z*}!LBs2Y^Aps9NIEM?UDYPa&=pSCQN4hO%hnExsdiA_F2qa{iOq>Y-xGl5JdPZgxz&7zKmRAGBbuC@ zVf0t&%tLWhrs&fbWJ5~0tqkM++II~E(AX-Bn^g+?`S03yJqqO7vD8PyCzp1^Try*b z2NM`-WktYYhi{WI2o=EpB(M3W6PSnOC?S<$k$Gw|ga2|GZ8+EH8BAS*X7yZp5eD#q z7dK$GakxtrD8wNQ6@eQ?NTO3Z(;V;4Tj}E_dN-qdfbqXuPKsu&EnWse$oA#RN=%9nK@3TDv7p@jZefdBNv<10;F>swTjOD{circB+e zG%Xb7J?~2ox0A(K$=oRLk#_>^JqraVO@daO0wJW+5@QdpVD~9QjOv+S6gJTMzuJ6& zS;Vim=d_G84;#f0QcvV2b>{A zzFa7JBimPVFP{*$nqAjwKe9d1nMY7GA-tLcAWVBW08Bq|LHP&<`Rg@F2ggMbD##t4 z0y4yagvelb0bOWCE0y8wYap zQPB+u%O2Fk8cKbLzk+ET{I!$B&vMaYZw!To4mE%lOWuc0h zNOFb5{;GfJ!k-oP`ag!PiM|PBD?$-nV9U>u<*ahC{A8^ zPdfvLy2Nei7Hy{%#-Um3=S`;E_KlI6rO@29iNY-lu!0J40|&gri*7qH7{u(Fcybhc zxCj6f2f7;voz>hjE5t*g$%*s*3Zih)7;iYBUq2BtaSd=8y6WpNyS3qI7L7X76~@aQ z4Tw!6YzDzFw-5838)b`}c9mqu=k9J7qM8U?NDhq3$?5PD8az6PxS5YqqmE200fC8~Qw9vPH3F37sV+R&SEp!0 z(tb2Ifs2z&{64w8(}XUpX5e zk5&yW084HfdG@NAmYm9G%)3qL#IOXbFsuDHF>~_No2eNAv-e8=-wSw>9!;;uY#|x% z=MWn3mNt0U=C$!Pi3Wh&5E`%<+xYK?4TQ2^?f0f{XUC@3Na0BR0VXg0n29y7Mn=@Z zn78saKD;O$YSm~DC%y@YcKMCIG-K7ymabqlfIhHIZ!ud@@sk7Pg2 zN%;1wjhCMvh6SD<)+kd-+F}(O=k1UOkPL(EB4}E;#VB}2`tUK?Dr~buOQ$PLFyRG7 zj&s!$K zxa+PCH1!HWQT>m0m4Tp?I_6 z1~YboH0#^$<=Sgx-oH^g%_HUY!~!~-F!`+^gE|bF7KHwkr9*^W+I{rBs!hO4UGtWc z;j4XC$c^6)Se0ihJNI^;GkcoUq{v|}%jPuLGqK{~7-gB#qID%Z-=4H}>pIQ)-8X2^ zMPM9Xv*I5OS+(}A-p@xx67FLReCDaY(m~LoFQ!0(k|1oGJ5mINg4F&tw>`f{>%UxD z#pI`!KCyVsEL#^#dO84f^h6nScJLCKMr=Jn+hRfONS2#-#l`BfyIRa zRuf>(4Tv;J;>F?r=Hel+<2|Run8uxcQP)9t<+E#&WIb)R_XuOAaOU#e?KG$HC<0J? z_F*d+=Gi5PeU_ZV$mGrp;-_QzbK?LaZ>2FmFzWV3fp~G`zrHxaQ>I9M%cvp#cQVTF z6|aBj;*hpRfm9Yq;mRH4|HX30zD>T-lJbV9-y#lMW<-&q+D zMSkP1&DaL!3N-USTO;}s_^yLd_rxL|P?5Ifn#!L1`d8IfeHNWiuPjk-;R;51j&8d& zbNA6}R;%yVnGhjQU7+=q2Ipkk6u|D?bQrOMT*O9BBsjb(2cH_wc4M+7f!P83sIJVY z;VPztn8KXn$7G%1uPeswFUmkMVK3{S~gihF^Ku)Sa zur_1_8Ckz*no|Wg9E4dVnK&lv+M&MeNdz&89g>L|)WF7EwUG6^mrLO0%3dS%?MQiV3|!r&#z}R62Bk7u#sT zIiOz)g1}v@Ew~gYYKK8P1ZP!gUBB8Dj)=(vW}9*OPU8;0Evvdy4wH6X7`{n+KtF_2 zzd{4z0_dAaMD=YJZa*Zxm+=bdZIu@o&D#Q0U&(nn>mlex5ctP~w}$n=4Qav+;p0S^ zZ3Vvspi*ES@Z*W>3NHJyL-sr);lzX{^K(Rr!!fT=e?zyJW87ApTqzeEKnmG^;^Bzf zqZoaBWHRmoXbJ!aP~c{uV$6u;=Srz)jAV$3+wGY!G4!Zl>d1pe0-6}@IM^|b2J>AR zOd&T-D*s>t|GA*N4)I$e1Wt>PBi+ReHx8h^UP$5Z)nQJ)yCZ&^h4w8zIoZlcYv3dZkFMC>5^^m{2;k9v)9>EgB0Z6$=Z9 z(R;LN$c~LRrgAvW=uIBrCfIs_g)3Q!s$gQr+k$ts#en0dy6tC|ow$2bjWAhQwTDmY zWfGo|6<;0;XOQ6f-G-n;NBlz# zLQnSE5Z%Tvc$uMt$fU%)&RVCX+_)WB4r18X32u_xQ1uIA@EbqH6K4&MbnWpDrR=&D z_geHk!5|kiKXv$FJ7RS%QFkgvR=>WENu{FTAbMp}3;PN4J>j@$pbH~~!1I5^P?i=G zDURM#mp`SLhv0GEqHJmAj$*JOY)>jxbIMHf)|S7LKt+muk}WV1{wqlSIKE#eEIIh(qN_cR6#pA^R>f^&C?SfN zjUL3HRWNa&@yCugUWr2;1p4EKTvbN|{iOf#jE3VxbSqt$`#W@_5+>Tu>BZuVFQ;s= zSB}X7nOZFnhwu&XFJmj1Drybp;Yd!nqd~q;9zz8vhV>hjoj?oupO0|8i+3Gl6UaFF?x>u=kV)G*1XeTIt?nXD`lDuDI@o>83D7hBZuE{g|d^jFErqw6t! zfE|YBI@V6c$UbwnZ{M^BXMBmwu=5{cXPFMGYAA#}w0`#j7^x`K zEs@iTd$avP2?{EYcP@iB#+5*i7KjIQlhHr!6KN0#km4@?4=L{7#erXSI+#|p8(tuD ze+gG_IK85Ri_-Q2xirYbjWke^4QLfm3K73akmwK!vEN222t;ZT?$U4`w9|4pVs3LI zieMxSR>n?2A8Mt>7_FdRJMt?U(j^}mwIOtPj;>UFFJp&yph4@kFbksy#b(r5 zG!_xFZ%}8AdOEI5_z(jLArw8#KVOCh#|rphKzoP-jLJof>m(mGEzfublkx`?CpdPb z)}y!lu@4dF%>rs2E6~Z|O}C^8=DTNG;P9>f$4mbF??7FyPxLc+DX5tu=lkx!qAW)p zHdgQT)ODkSQ(wcqnI@O0K;K+dgzgdPvZwd%)7Zj+V_XhUvU}=SPqj^K zW%=D4&hQ2`prA^xz`=N*4?_HKe{&IQ3+On*fOyu8ix1iURM|+tpn-JX68n+Lrx*vM zH`C^2uq_!|p@%WC__Dv;!7?PvPrncB;2W?6PtRehnRmF)qlH@uHrkm&ZuJvyZ!R+2 zOHc|Z!9z=BR;rx#h*>8n_@t*0DBB&G?I9!r!TXCaR4hs6K+qegkn9W0jY}%@nBup6 zS`oJb+Quq;{G;3Vz`a{fZTl1)EL2Z)byY~|)UUeq0QLs43L!R?odDwW0S$Cnb(jNW zAx_$wJ{DU22fUe#VtUp5nEEF*L1B9wBs=%uN%$Mx!EL9~TetInb)$EIZ0lRXYw;GEW)LUFyp-!RDgD{G~$M^c%Q+ z-@_f>3;9d3+5@`@=z$ySGbE#LvN@Fv487EZjUN3)ClP*uCSuUI2uRSt`m z`}Z}_(CKy8VSRfRI99_+lW|#LgDVcuy+Db+L1edj*A~GiKHk-r@bIm(B{4oF)VKe% zB6f*4@E8Pn0RnMoHz<3gHc*=@zR}JK6hbWQGq3$ORp!V9G)h`d@(^L=HX3Qy@M^#- z;66BiDd5ZrU(qjhKrvhxv@P3w>ZeQ0tOv*sAOLY z7MNMOQv>u*P>E|ZI;nECqCQt&QK(;wGjdY0g~Da^QXFHIc8>Nt_lnMvzgp3R!iwCN1~IO^HSt-O>5gQG57`Ar=~aMcAQg)}8$jNYJO)^x~M$ zjDEQkqFnWpM?VSOM$&_*f(G1ctAeL-wO=xD^U#C&iQphbm8VrL3=88|?ocltU#|37 zsm!IHT)OLw&*D=(0454dc_v^fbFxp$e7m$)w&(bsz_oq^|E8(Q z=^`JenK_33xg8f$yE^R(ocM|tMgH2(S_u|E!T)jDx)I1O`LRVh(>wJ_(+6Qh4Mi}N zSXqK2!Z!m4uq2CV?5{Fok_;f=^p%QvYlL#5SQ9sls9Ph{*dMly04Z^636aSM;y*|( zrU}r}HCzm_gHEKlc9q`gS z)f!l5nH^{6{-7m6Us2?1pLJT_lA6t=HA#JqOW4p^aAGhdVBOP7vKuaTTl7aByNo&8 zp*Y(%vp`t$Z5&#N@4aAT%RSk!tY-fJSSD&Dgyi~{{WKGoFlAQoLND^#Ifi)Nzv)BW z?(Ps2VlgNzY(HhhwDVI?)rhZc%!_zyIEmJ)Xa`xt?u1{En+!0p(v9#ON<%wM{Brzy zl;ZRyawyJ|b&ocNlchkWIcA;WNtx^H#lQN(;XzGP+F7^9teZb0J=? zu578+6^tjQ8?l@j15Y;qAu`UmVJ(^kP+oDJs7~NB!b$)?q8o_-5DgIk`sI8A9|sVg zb*(jAsmS(lDB>!A1q~4njp)qCIp{wETp z(5Pr{VwqgK=Vk|Jf3MG(HZb{~_@hdAPh+0li>PSP((&C=@YRvjsPoQ97#~vL?kil7Gc9$d!;j~;lb7=TFpBtd<aRYl zrzLYYzh|cqU&N|lvW=qo&-2Ol&Ngxz?#*|@qx*nu;EoIl5Uhm<&`tgc z?393!_xFFfOGy$KOC*hXf^h@d5^CuiiN$K1yp)tw@Ff7Oz3Kx#k;9*8p+pxY zpU*dD>)=IUb^G)DMe}LCJfB=wOOSVmUB$v#<<2!nE+nmaTN1mQe6NuLFWK7^soa~6 zS#k2Fj;5=W_VXvcdb|k~dUgysK@ZCe+_)!worKIz35K!T{^;Z`vT-S7=IZ-CS!>+%Y9$LT5bKO<-3SB0Z*}ZN2GL0HP>otuxk!MRI=3EHb+6Q{y zZ&P{R>p6mdweaEw0S~;HkQ0=P7pcQ2WxNkU6d{GXg9mvpqkS(Q!{=PfQQ9Bu&r*Ta^vY0F2bhy`_ZGAq?{ysw*g zEOd*VZn&$#33xD#;-XB3is}eaMmj~?;A02>;$!Q#+6i^BYd7urPxyhNJV^bya}$8; zXdfEMQR9dL`L`&dP{xXZ<^9)ZLvy!;%KA^9NQAvR7f%1`i$9El@{-&m=9-AaK%W^} zpAT+MS}!2u{U_v6vhxoDLK|*Y_&IkF)3zG1R2BkAe7y;81u|!cUdCV5PzDoovD}bc z#Zm^b_ll&_*Wbow4tFWBk8&o`_J?e=mi!>*&8`C7Aiw2YU`ayUG=X@3_dUe(7e{`F zig7qXt`2DDzV6JN=g|+K(M&!7cU%9BUqjU8W(F}a-h4&W;PE+Ji8|7&C?{A$wBc~f z7ynDDMyS%Wp!(>>davC2L$4>U53!$WO6q06K(KH*AtBAF!Jn>cfFAfNb5DRyrFj}S zgB2z3&vELLGI={_a?*Y!)hqJovF4h}m|RwW`VLnZ(oheM!CY4P%~>SKzkI5zH7oZ7 zuB>_O3XJ#Ixs`d?uFDGgka+;Fm|+?S5&D+mLudffD^6;WSSjI>ihbU+*S3P$^A+OX zf>?6{CFhu3rTZR-gc0|->*E8k*gp;f^3LU(4SPNIdKz%F_R8bs{VUhu8spht@BD@w z(}jU#^xfwT$j2|Nx6jwGEi@i1ryS(?+!X_9#=?TWwqdzrzdWrjy@;J^$Rd1UJY4Kf zva_9oKfTVQ7JlY$a(MiE4GC=h6^&Zn2hXLb@g43G%j8AnaMSre1^C{2T2Da0Nvyu&V&w zMd?c$U395T05qiNul{n9QzF>NH%gNM5?)s`|t1bf9O6ECqd} zYOF=4wv|Lt0wRpS4_{WPkX4xb;aAo<9|tu_`1s`Id`6I@+#Ef7gN-&a&XzsVA!vVa z&bx(nnJCDzFIjab7?;K9Kdc-gMqGw0U*cb{3c&cc;;Ubekl1*55l(a|aUbI%p! zwXYZvP*UUcyL7c{i|x2rl}P)d_msj~PdOj@-b#y+VVPQkO!*5#Dc4Q=fo zd(g{;u?T#Z_%cHogJY=B=iR=;Fw)0z4WCq-o`P`gG3Agolhlq{CE}lUT5eYt1!ZE*NnR~=11r$|FZco@ zD!l6HNMa_7n^d<_*#PFIy==q8l77^es8Gx!j{ej86gx$s^-OYYxB(m^qna5WqzW&V zx8Ub))X}r)L*whrS?*$TprA+Lm}uS{@KkXuGkHg*ohEW0_!-}kQgQ~)3p$zT9Xrls zcXI;c(xpE4y9F9^D@1Fg96O-e9<3R}`OED3qoY*#au`D5<7eTt(E?+03R$A(uFVs) zs-18xc-|?AnRq!SCQ$9>dQQ3L%o5n5jXf2v-FE!!maKpU{;2?}A4F_q8(~Wgi7A!} zbPs4v>V8ApPO@CDF8Y3^&$@g131vj&PCZiwaFXv>j&u613w$Viwff#};uH=`Y7sH88s?L44t>PAs=y~l8Wl8Jy9ZG>IttleV9G~k{AxVZ{BuvF1Ss%Y> z_G8_%6X=w+QXmLrJ0<}@lwp9NYxF_f<4n=Zv93l`0(O<`(~YzIb)QZ=}Q;&XoNcgmYibw_*`F& z=xkQsr#G;aJ$y&7^d#+3VRmf@DbYUebu`~Fjepa>^~3a3zAU9!dat9_H}>NqU=rp|E%wtTBx|Ch z;%cpADV50Q%DQ>p8@12Y0T*>8WF_&|wjb?Duo4fYir$oj%-6lj6Zt%o(Ocdca{Azr zl3bT&DTa=XJ006gS ztG@X-)hUrsnqb8>fz-7HV(rOcRT*JC_2~y+=$44@rU)2a>g-o*lY4mRnOuEV@Vk@J z`_tKc6E=W;HGiWsF?NInr#7gd~p?wsh`Fg_Y2JbXrYRLJ^w-XRMY&%F$LCh zG{!@L9T`UE-%{;tB466GwP73(n#~t!Ox*-NxX-CNtd|6r2yqx2kSV~cP7+Vc7U-ck zj=s3G8s>7z-(2#|r+}g0b+$HVp>a#(>eayYyvaQIr>fmVjvaAIyG>Y%CglyHN71YS ztNI=5{F1vo$-zt-X|HuBk<*9^FFY$!td zbagmu8Im7jKXhnqm0KvIC?hm^Gd-t1@rzw8<|6PieHv;ec-ZC51{X!?-w8TG)txeX zT*KB<^>LC{@$gT$5whtZNaAda1JFB_KCbaRhZf5PyfW&Dv230;d+Q*o?AYx40r# zN(}pk{%6~@`TVavDV;~pyqZ0Q8g=xUkI`?tePT5voTBcXqoigOLlO$i`b3|kJI`#n zHy_6&xNGjp?oTkfs@)M z>J<0ylIivcn_W&cE523`$eThc=FbAW^Z8+n6s|u`jEL&zkXuXKlx5>QSwJbh`!$H+ zn4aX1ajkoYA9XmT>@A_C?PDufY8Jzvv3?~JCHec`&WMo6wvd0-i^ebiAW!FH3`_YC z9I`o3?{MtHi0&Gan*1SaS84^1)V?LLetcKV5`{E7uva>VvQEug->QcV@0ml**@( zUktgyjGUtn5m(Ch{^Uohs$?VY2k$id$gI@g`;hw_y|=NEJlU0*xz_lx1N<6O9||r| zs2@k1K8Q$_x$l$ZT3S;N@u$ie-FV2UPrLi3-&#xzum1GcHc>ola0F*9NwXwE&b3^f zW*OnsNdv+FWwFYsNb`6m>o}oB3p}r0vWL>bzqRgR3Vv)I>c8%QI$TUizYF3#~ z+%v-|6NiqPA1YxV7KSm%ke$2oj(2dtrj~4=srUMpSV>nM3gk2m0-Fn4DNDYkU8JXw zNdtnDv6CGFgzF0*mAYjnJhf#`oNjtzIjANQ<`l)eSb1k!V@%$!nRcF-WnUiTcuore zAi#+pO{5FS#p{dlDhRdXy7%B8BO8i*NJX7z6a!j}#G(8so+GatqymbpSsGl#dmeIT zEfOjqH`G%`$;i9?f@Cy{eA7Knob0`(yxnJ*+h~F6pgwuuiAz>Y#1L_2_CtCCgnwPM zXldTC)YYSxPh<_gGbs|_nm0%jcJ%n28O@8yO>cU7yu++q&-!0-EA|&=^xa=C2#mLx zb6Vv(9d+{6>k1c0l*9f90_Ggm4aWDSocGbk_2k;k*3?pW(mOiSC6hLb2fjuW9!om; zgLy-P&(HV!<@agRC;U0d-(7Etnz)^U+qgiT@=_# zzOMJSJXoEAN`Y}diG$_(HF0fq{fB->M+2rw8SCV_%_}bD%*hSeeKILD%HmHX>&EpB zn{9_mELuT?+-dYZ`i&$x|8YBnH?cf#x_8t2rX_t@1TQ8uE2!8aV`?xxOP%{`Dt26_!cUx#Kjslp<#QE5oILc*iv;CCMcRz z>?+3}EO05|F;l-oJe~PBuE|3GbrwCXGo-+3+iYV2DH{1TLtrTCLmt37Ce=tU zPMZ|n?#_Sai;cMe>uic}2Bu6h+|^jwDJQviv9bX@Q~fJyH0>)qvut)p7p>dCRJ62~ z#YVq-+=V_9yS~sI&uVTLxpyrp(e0a34=sTncM@1(0Y~zSi^?ktnb}OPSClC`whcuq zu`PT4yaP*upAVS_DAXlIUw_spqqZ>^EBZtjV@~o|c$-GLkRT=j2|`EVEVi!khIiL* zFn>L%e*L&l)1}K|8DP#a=YSZeVn9++Y^YNz`^@nvHLb%p&n|K%I@~EZ1+k8Y7S=vm z8tf&GKXk?xX~Di~Y%$?VTu+hm%E!*_YyhH>jQE!C%o%9VH(*a;^yNXg4}?;m4c8?a z(0|x+iVS)Ev0PQNKnm{uYJdOQGwDHHB$>huX|`QahKyk8oBdH&2RZQg zG8Y-Q;|nK9ct)B8qIP<|+=*9T5x7p8s?I&2lPvQ=dZ3?4dvWd>uav@F5t^>qv1CKB z@Rg|5bjfi|K572EFJFFS>oz+A|63yiyXFm&3)2fWw;$Qtm%6wx-D*ZY}(uvKh zS8Y5wLRk{q^Ys>kOvbpgv4}Wi)WpkH=#itPieNG9eH+K}{maPDyc!Q9XLq$}!@6QQ zy~;m{pU=2qq_Xaq3>?3vE_7u;3Z?vSbdZIOl--Brd)D8dJiqqC9lF?8m!msxH7;i+kVH$2S=<2=|M2&#(7Ac3S2YtISj-`(0^Y!1hj`jAe-m2 z1iH~Lwudty#-*SjqdyOw&y#*)w>R`bCqieskAaxJIUM(tGfmtXjmMYdBrF~m7j5`@ zt2HqiVpVL7aZF4WERs8N6bF-Bb6k)H7J{=zaRqVV71&Gta0jC(sre{YBnN>p@pinR zY_f;CJpQAZ0!BgIu=>8Zn?ZLUi>IM)VuCO51d}5e+Et$@Svn%0&bmMXU4Nxtp4fKk z^fO6JT2bm_MbYy!ua7Z6wx_(-43Lj`Hg!kU<*;@9>$XEG%kS+`na)n^SSBI@^=e2M zsif@OIU-DeF61g54{)E_Os4I6v&AQ7xNB1$KaH$`A@3ZJd42v9D z**?xPivtny?rXLIDzBtUmHm4jACLj5i&yx?k?s-aIL6&L-e;YnmmJCtRI_3dvMHZc zDN;X4Ws%@8#{yv%6}(zH6F`q(JUQ{bw=*vMV;E(`rv#jd(M#w7TEB5ZD+~5wN5EfV zh=#LJmP)GpljZwY>hY5;XN{UjJ)}p<&U(AY+n4nS^U`l0k!G9(Z0@@up|fYzZ&`6} z=l8^#x|*)jCW!-NiYds|d%Vj;xXpviLtIC+f_gdFxj-x0hfg2x zMy{5uB}S&}za1fUxp}pJxH}E?RyX?W&NSnrNk^sl;_j`pvF^C$Gk02I*9#{*I^Cu! zSEkl%9o-~b1|+01^J~&KocG0()E}3o41O@;h>y=UZ4N3q-Ddc>vh4?5kr_|8BQMLb z84I~BmavXF8(B*uRhp}E$D5_8JMIfivXu}>QiMu8jY1F(-ThTpX7AQKl4CZ1-ZDUE z8Y@XDlfh>AbqippH@`TvQ1D)Wyt2`fkcVlJ!M8w4`Y0-}gg=$KBr35ady+el>Ee1u zJu7?+Jb(gT7BoIe5!e=$|Fq!}T2{`|QryJI2})z> zYHVnwa5{{^jAxpWwaaK33=n-jhHTkW)U*qV`e`kFlS;YT9?&0PhtD@wSh|07w{eU{ zRP$l&buwMwJTlRAeOUO$LvTU&0!47p8#xnmli1ceNbmS$W+ovxb6a;uM_NH+ere^} z2Ue-XMaS&s@zCvWk9)nDBVWcha?IF#a;y7X#mDA$i&{@~IwV~C?AS=p%>n&%CRJZ} zgw%FWxXhbie=s&;t~CN)cuif4SUQM>t)19XvwhwtaWt~PNeR=vp70rOmZl`eSLVRn zWFN25IM4({{E?47DfONyLY-W?+tO3aaP}I%ROP%OBT{@cMQ2ejYgvFX{e{&mN5GUfYw- zer>U&F1};*qR@h>Z?9lzxditkuj$TzHK3w+ykvOk@skAiD>F)+Ur&S!yC^%@G_Rj5 znxnU`6PS2SDlj!Ta@W(Q@0v!3^sYxcHA&>Kjj|l3KRGpZhG%P@-&gD|-SYtb8w_y; zhzYC0Kr`d&=Av+gIi_us3&851dO#Dg;-bS3jAoqY_oZ|4&LJFhSmfA_iOR`0Cse($ zNP*C+p>;}^y?+MZpCz=zuMz?L=63>!TR+88$ZG3T%tYd4-8V|~j(zj`28#&1zhlJo zXv)ou?k!f1E_tK-dR^=3Va9vWhE8WDKb}3)aLy8vqz4ONwPm4JBTJ(+@LWW!O>B>u z$EK;=g{g~cY(_QAC3Gq^4Axnsbg)OwIRx|@BR3o zo6nW+!`Tu=(Va?9y7gzu?=<@Xqr1R(AqI6Q%A`?)0^h<-ED_f+U%j8tq1P zeOXb7G*!=}sh$1Xl^LgqusvOHAS|!N<6Uc({U^H{Z>IVB`5<#(3KCmwlv1CH%le9w zO$TEY7t7g?e2S~h=1yn9Rp%8T9?S{$+2UJD zLk4LgZ+^TOn1&rO)W`?cBCG)f{-6;hKDbLUhESpY*?Ii-mFw3@S?W%D1f}COcgm=7 z{u45KoZA^ipRJRYShxu_8~3rBhX>P#)?(OpVg9Zc5^Xs_ts&yn_sf+PorLwpQkVU% z)O3zMqv$n!@@=N+>v2j!(VH_2U7gqL-i*+krzd~(^+(i1obeJ@SF9|`VZ-cGM7^Kk z+b<=Zo$KQ(^~P40>pLdCe(dmn`vRHg@X+<*GN3B>HaU{58kpTJ#mUaSc~g(rmjdCz&CUW#y8r zh0ll^fo`cgL5hifC3;zu#)OgDoTr=*YxDmCTnKM!_G|iajyv!ax0Fbzq?1NGp%tT> zmKxXnc=m4YiAPj2=acL9Qm^9=P|dBDb{9DEcV*0)wT4emS%tzrsLJZr=6({!oLk#+ zJKZ+M$c%h9acNZ#ToHGbWO|KDB$CczEs3qB89(8Z+jm3tbAfJ9I4n? zcwqDL!{gb|Mgfl2&PQP#b=wt1wqif7@5u>SU98ZgjJ60>`A`Y+x3(n-IgDA}nJC1U z_uj+IH^g_%ZSrZ1+e&tegCef3u<3Vyq;GTJgyo2o( zVU!th(KNKK79Sa;Uw)7`Al+CdWdVhd* zRW?$zrdzI<4TTT{mOH|Su`q@AOk_V$=*2Z_kdqM}+aysOSm1(+WRiP3czI*u5-rYO z45QWM=6=u4DK#%9?rmo(8G8Og5a}ea?LVL7R%JGG>xJ_L{+_WXJMRm)N#A9lU?$mO z`h*-RDhWnuZ{irs06^YjnIe|~qhp3+lO~V>QM_l~^*Ta4QK+elOaX>ACGy=LO8CV@ zEG2{188b}~J`mP84hre?ExW#J3a;#&Izr(>l0w-)B4W}d!pV@IjGVW@D8A~ObMq>xJ!KhF_QhSDSw^;c{cs%^ z<4j~=^D1W%rC^HtmF|Y3PFh1ga*jWvVK>qkrr{+$ zyUcAXJC1Yx${~GZ(RUfiWy?~6W+}HP4c#wW!zi7-tzn^eoV232*J+#!w1@L(;1DkZ zEDt9nRDik+aAw-lJltP~tU%mHGR`!6{S%j#3OT;Atu>_@{=Bjfct*?g1_zM0*qSD*du_m3?U0nD&6R`;d&>F zg(Z8>LNBGksPh`CUSyAt+wq}mIm@-g&f?% zS|sX|z9>sx`DU+#f~3yL8>VvATa}M1E10EJR3cmp>(mv>Yrddk!mAm((}dN!^{q^p z7|c>(y~`;Bq;10CbNhwBX#Izhaca1$8=JL9>bUnk!cD^fCJ7R;<39wyPL?dMUAIII zEN)K}e_;$Kj(^!@=~6N6ur3WW_tcxueE<5XsJ4UbvVQaJ7jfo{S0`v9H_A7HZU_2P zNmtD;X>!qKojXZs(bWmlrxf|pF50;8&idQIjO10a{;n<&v%@iD^z}w^aWGzC`joxr zU_$COm#ViuKvNe|{zY~m);gm4R?`=H z@cUwno?nr&@xu3@Qdc6i@5`;+ZsV9aW(x*41XB%uVN&7W{i^sPL(7~>8{%TJ5f#^} ztL5URwa9F<4<;ytGL0XLBTnaYycI++DbZFY?<9`;h%nDrg&k4gu2Qb~aq2|2gCAyY z{fHgy!X;xL=nK_!ikgMb%ZVk%6K(YN-A`=IZ{B~mRr`63Z65y{l=k;Hd{e65k?>nB zDjHNYvD0kb4LcLp@iK>$tQx(ic~--tr(y=l)#X?t4n)YMe6-^UYYBO`{a)#Z-F`Fh zqZHG!7q_)Y>N^)~)!)xb^&)Z{J9`bGUS|jz+}8Yiita9tbFK?*GIJyDK^EJn&~3C1 z%GIl-T?1nx?pv;(_yT!91PQ$Ao!BO?P~_0(RFEJ|^ZQ2DpLs$%8jVL-tIk=Tk9 ze-h(cll|I>4r<{YQX=XA1I!5X{m`1n8@-^G*Zf+|=-Nn4kj_t*y4a{rTMaQ5PA}SA zkK&hF|L~(V%ranH&<;``5o^ymn}If=`gx>YBs+d_?%?vrvktv#G@Gw@+}0G7Q@T7& z1~fiKzVo4mle=kuSUZw(70jGdK=2=t_Q8~+z_6>1y~6wp0Lsa@5ca|4{;71fMfRl1E)R!|>xx~oiE;34PqvxkpIU;4WhCi> z%UdYoKT<3u*wsAwLJ|@qNp56QF|2oV@!IMSR@NDV@*ZK7oMmiz-Br_u7c{-*?pHTW zP3@J$&$%_dl+wKU)ojR6#7$+^;Mghmp7o|k)`*x{=G))Q&Md6ZPGJjgA)jqCIkhvx5);!^ z)EA#!uv~3LcDeisDq*gDN2+D5mBk7v$gi2Q1_wmyyylZqq zu=k|KGpG2~B;RN^^mbGup6umN$Ur|+8z@#@H2BOPGCKXMBq0K7KWjQVDl&2na@puO zN}5>Im2MNqK`!&Q3(S)4(CoYJFib$ujn+AlgFC~qj|6TelBdAe9-n`snQ>yS*2>U@ zQHy?MKV42%xVsP%kgF6ExJK1yMc{W$!IZ}#Y!LKFUoWlij)Y!GG+kF-i@#$A z5&G;bc1jZ04k(~e&Fd1Kp;mxUBU90BQ*0p=i1Vz}9?wo#n5M5wAWp-&t?-!22-uzc zcbrktYI1g|;h}FkO9B;@xsKg$dpG3P)=#%-v3l_mcNR=<&H6+mFSk@-%h5~YO7nx8 z=VjM3px;!adz?L^qT%zYB0U9gW2g_#QU!sl6%i5X9XQ zeRozMD&3Ph_-^lD``5XaeWuM9qL=zfKYmE~dbZnn!ZWkhC4GL7ztwCJXuv~0l1=R| zh#(Ir4a@pDa1m^&Tr)y)S57ASlD%${oWqVnneb_%;>_IMgI{7*-gXnLp3jn48WFZ&o=P>CtJdC!$v!So7Q zITQ2J2SuONZPID~9KT#AZM}4Q2*b&ws*;(i7K-<$q`%mZRVrkE1NJf%dW;#^L;=`c z>xYyd@IN})XIekD1kk#lqmny!jAEsr(ggCp>0^)|3A)vve32Ov)=mX%npPTV1LMYnG!W|BtV)4r{V~ z|9(^yEK2E^k^%yvC=Dtlt<l5##fct z54GsRSG)OXV;Zbip2k>eT*>i3oaU!<4YJ0AaD2Qqkzv3A|;FI>?Ic{Iy>4 zJF90ia%SB}-&eZx{Ll65=oNpFO{KrDBFAasdZ~;ye*B|4i&tPD!E;v=cAt3^d?&4;cngE5)+mb>#is>J1*Q;;K1pc7-jLr z(wN3IusWoQvgdj&777g`H5(?DoO&a2r(ZP7oaE1fvAU9EQ5mE3SE;yADS#TA z@!ZXtxd7Le*F*)C(N|y32smuSPw}>YCOmrqGZ`%zMfAMP=y{C1%Ce?L|DDc2S)hhX z-pJ8cA*o{IaHAB`8y_Xf{%u=|Ivu{2d#{T5G7~KdR3Qd?$F&g|t}p0@_f$;zmFEP!laiOTMtw@t;Z6CA z`s2>#ZBm}4TQg(&CI;LoI5352!ojfLhVr20!m=JN<<~_{>6Hr{Eh{XVyGspqFpYNb zXbRpGwM>w_xbsvm`UhaYF{Z;@!oGe8Z5KgLs)!iLcJZdWX*;+wUz~jRM$^D=dA0S6 zc46=7dvCcrPh z+{@EhBw*L|I+qVCGCXY7Fq!vQhbdi0C@#=GbG64{DBy={SBDNtLwYCHe|y8NIQ_?G z9Nce6jiBZ?sRB>XLcDdx=6VqS0TO>vtg_EWAJtUpLE%S!`2t#p?sYT6!?&j=%|FOp z+RGZ0z8knkt!wRG^xYDaMPiO*jOJ&Upc^zF&cNL^!JHuG*MwlHw(XfTDrj`jh zNFtH443tV_!H=`mSFVSLSjDa9mM?^Nil8TUYnrw?iH%w!wLYPm?OD^2k znxO*B9LAx7etJSOv~L^chMVF>0hD=W$_^T`OK(b+`~s7ad!vMCy9R*w{g@5%x#$QF z`yk-Y+VQ0N4;(->U8Vi|989mYZAFYnH<)3Q#Q1%~r&CiJUzMqXDvnaB-DwFo*ycbl zVgB_p&_IT$AJuvB~# z#jcxAUq35>ozIUgQHWLN>k`T|j%P_I@)@1vw93*qsWPhVaQ{56RK4!VnN%_#>z86A z;Z=R9s%@SaWp!c1sZN-R3@q=KYRh2m4+@wvp}mwlnV^J<6bWB`Z{X@o(F{ z?dz6b!+OChYo(Xl1U^BY&$wGB6I=RFm^pI_n~PE}g}SbzHKK%X-1Zn!43g|}eHnhG zHA;E1)p4zCl-A+RExbX3@YrJUDf_o{xhpAAnYogL2B^P-!(dlb49)e>vmR?>=fsb0 zsM16hdd&In)fTozSar5-R-cmtl$UycV}zqjl9#>u=d&jtHg}KqhoS?n zl9In_9q)YTO3u`X-vg9T0cSe$^nA4_UJ<*G;T3|_6CAdSUF(IWiHTCrS*WW6dh>p) zZ>RYoaX)^4)RB_#jtop!4>vSHLjl3UPGd6WH z74JQ5mLnrwxA zjkL4gdcc>gtXUf4_>}i%34{L*iApMn3Frm@%MyvWyy*Y|9(*Fhc?oBD4-dYdt!TS2 z6aiBaNBRxH@xt3Wz5zce+#>#H79sXaqKe}n$!BQ99+^6ycNiPUO>H=vO-XGk>pesS z61Zgi)!?pmi1R&CP&4MVzF4m05z#Tu(G|YT^Sv)a(sjfFKSXL66gSoC-M*b?I1ZIN zz8>qs*m{M*Nct0qU9zdt7r6d%B;JV%?GgZne~SKZK1??`V zMLXB6eQe1{Q`PTck1REou4d-^{Lm2?`oa?m$obJCUhOYJ2ytcCr3kDB4>dQMUm*z2 z8t!59rCXDc|9Alew=&i8se9lo8K;=QJ3#;jOBgglc?2^kO9v#upC z3b3s1)7V&rUHs$prJr&JicsI|ss0k?Qs%hDi~6X~5cU}#*GmIh|5Zpmi&1=LyBKTU z8o?5}kT-s*P3I$+NtrU`(7cuQQf55ZYSUB5em@kG?{i1kLbPF%U-A7m5A|FoyLXmP zbm7!{HPLj>PwRISbjMY$v<}8ww>o*s(z2UaB$Q3$>a~5#&0}mx4nnPpE2YE#n(rjUSk05;^rYUO zkp@DSY|98+vdho<_Y&U6W^Bn?ksPOh2*_bgTMacdDeC%M0=kyArKgzKpppZ<>=!$0_Y98Q?*w=7xHC{ST@nEZXLol;5!ybu@-tJ;TVwE? z=)4!rM8ftPx~|9v+{A_T6ZM80OMk?vNgwYo#d#T^pU>IZLj%OBDJ7QQF%ra(MM*x} zsGpgDzPa5=KK2PAxmnhhO(7=fygwS3C}H;*!}CEmV!PI^ns8&KyUZ$ME<$tl&JFp+2cE#Q zsz!Z2Jbm}75&;BAJ9Jk|4Mu#@4S5_=*-_1#@Z{*7Ii5A>k=MDLqK$U%{t%RwlbA%3 z?3ouJq>|hcDc>x`K733Mc+q(=i76AF@86tx6*H+fu^YNY$r(M;iDtr0!(62^iiFiJ9fV;>*M5xc0BN-9>KJ z>9*#T5XUsbUsw|-X!7M>&OKZ6e2PrU5p=02KfJ<+G$%~l)4h+{uKfVtT^i``NyR<4 z!j7#?!&LnQrhg{uiEmCP^GM550q==b@01;J%ymVMLMly#&5gci=Q2u1FSEL=9+J|l zZ;U%rNjrIWww;bvWsPm=td6mi_&FH!?2ofrCewB;e5)iOEbGlIzjG8|Qd7^E7y7tw zEH(b{*Q9OETMLsI^v9?@!P#moE#A6W<(ySM1JxhkptP!>9p48#qvxds$LSAqp|H!M zgOs*De=KoTf{iKq>;3BRa#AwG8`3Cg`+93o@F8_cii3G?5K^=C6glglp+QJ75Ccf2 zC}czvpxn!qgcXICgHgd#72Sz3IajowO#d)oIu~H;(0{HR>!q=O$yDUN-d=rMJt=W7 zvRHfL>A0eG{Q8hKF6iuqS24Womnwc*_P#PIjG5wh^N0;8oYP_qu&2IbepK+^Yj%;; zlQHw?W>R-j5`;#}E@@rR(rmgFbx9ALH&WXJu2u9w(Ql=LcL#$LG9W(#HeZ$bB{M&# z(n#6xpKA)Wyr)sSx5H|3_$Rxs+3sMJftRs!QgrNG-@3rm0O&Ezq-tMDt2liP54rI` zoKB>(Z;eHgp{Yhr;#~mdG+G3M_ z1!#RcBa3BFO7fFbMqbN28Olejcg`shnSPrm)X}$n&U?@HLNSxTFXEB^S@iXeY!ih@s=oR*&jF<3B z`$>`yw0x0&c50*4;CR)S+UjM%6BCPV>4B>MgRs;^0v|&h!4m@6Z65VuZx+Macc5=4M56o8r z6(_;Kj%O@2?rv00_=?&GwNT5x-Ed9KdOC@i`Ag3nUG=3LAu6IcclG#dug}?jXj*@( zoAhCi5+e7!`f??BfBC0!@f_LgrFUg+bS}YZu!RKbH)vx9ziflX%8W>aTAYTud8O zDnn7Sg%Hu|>ur-E?;NDF9#zlAcbpk$`c^Y7?*=F-7r>}KGNVQMnQPcrsd%UE{Lrc# z7~`WXO22nV_{+UpL(xxN6)QPtO*6deR<+%qnx(#yT(*By9_TE|;wd(~NewL7! zInibl$Gc7p_{F-%A%bybBP4ih4DqYCs%YkS@49+X0PiKA?fNCljkjlFisMifU4Vp6 z^!lp&Y&j9dLL@>R|gF*{FYdTLfqHGgYTK$%txMJ zhn3|HhYSgl8=tNm8M;&6*8keymUwuDyXnxuUXG|MG1~xS%Z^wMj;7*J8G17bXY%{3?V;x^;EbsbqviQKxnFfjRmaGMvvVcm(g^T=RI z;Uk}gP)ZHLhU4vPK{-0>4cwCn`i2F?O+ESs1mmvqyj{^6staCT8o*h4@I`3RWysO2nrHATc&xWint&N0rt1}7Qpzf4 zP-B{7fAvTg-)To9!fGRG%(~_c@7BJ1vikrYrGF-eomf1l;ojJm+ih;UUTAK+V;f)P zI>lU?_%F}#F8!-7cT+D*>C%~nNsF4-zHR*#EAYm^Ty#@*Yn(8Wdn(U!hgD7)`kpzH zuUkbn34?>XZO*5)aWs%9E-7F-+RO~ib=Xc9?44S83h92@WNW9H%gQ5@EPdUOYDuAf ztI79joGe0o3pha-3iKG1b+z87&!Z`pGKmqC>AX53DC>9-r6!^o>D2RVID+B~HVyGn z)8D>GDj`TCEgKjdMcHN~EE&pBzIqb^*>52?ToNC)d{e`doo#{d$YqP{WrW11dG!d& zcpd{29WJS7{Sh8KUk9r|mLhHsiWFd3=59(TmJ(XS>`T=342nlC$474cqaArk{j}xK zA*+QWFk{>uE`rTSB22b^mZ@1SKbw#yp@0l*b>{glF&vuZc&J8p{o1wDc0dvtMZ6|6 zLaOb{<^qm7Y<{mHGufj%bS78JeJT9ehifqzEJv&`_SOe)0=`w+_v=c2`}`~8K$JtO z$CX0zJoyy?DOI*<@|UI2`{^sVwNICgKFX9-7%i%GO@%(kyYOgpsk>O5-0pySz-p_I zmODVn&MT21;-;w2EPpf2rH`*I(Gv*16$Ali_Tl1#U|#aO0YS%|f)J*(PM0i>9U4t* zlA>Z$uB}L|pvem6wyoo*wllo@gNE_y=`-+ai(N9Sko_zyGH?RNk?+@?cl;o;=-61I z5UL5{yYf8Rwbmq)OiBM%(eeiB1!Ey1YcsTNJzYTAts8G>iag|(Ln3|9B+{6@@^O3# ze2w&P5Q>(xAG_;!UH*^K-{f1L(n5qTYR!76Boi}P+P<|>>B;C;_#2?5L`BVSfN{#_ z3!i`gxFv0!@a7WP3&g)Xm_ZM&H3f|;urr(beKkoI$=^Q1qn!M*{EC72UYXuGBVOD3 z+X*j98LvpyZc_>qU5777@QkEFBjWx%GE@vG*<5d!@YkHrVRC(SB1Z=bQuzI1D-joz8$_xFR{GU`L?`74IGARvWTQuKV6E;gz8*jgO8 zIv5IIbOP3-ZEAAI0a3ye?|Jzi?}JWw&*+>nD?S-&(tYgj_}q#rL}1o#$tV=Q4;^jPLan zSq`^|=F3ApuKDY%(b5JIRF|Q9?F&8du;3rL;pSd%s@mG=GIhYf#F*0h32#LEXS zJ&{A+Z`a>MxPDykupbV-C2IZtR>NWl>U9(bI-U4diT$?W_PafYBb5V!@zRAJ!P2;; zw5Co-JjO9`U*f3T=3v5N6m?nkK+%Y)r!MI z(8>nv1H6=ikEi-~7UjGPZb-SSm{%6iAUjkZqy;~kkl3FOvaA)q+K7?a3KyrfetF{$ zd#$UQO<&GA-t7uziPM;>jtWn=kzQhgYlwb8Q1+{H@dOU$ohUqgcP2If+LPnbmqa9v zmR01&n(%?N1a#7Vd8skl=g$t{CFiYYWc062n2C%sFTDGgGw$N}ya>S9gJc14SGk97 z{y=^1G=`2l?Y+y@k6T=+J!@(-eIZTc(~pOu=WD4Tftf01`gy98VY67;5y^);_B2j8 zgrQOZhfQ~FKF`_t=5&x)vP5e(Zc>YrCP|R)#~aX>l-cH(*^%T&=T!rP1MXTpsEKP+ z5euW08$XE+=r7q+F~ej~oqP4eo%)13phTaWm}W8=*VNyob`pi0xx)Ut_qSd@FBL6x zyWs2aw)R)W&+KZUs7EOE}&^LDU{Mz#q z_(t6cko+8ZGmia}?Q>X=-mbdnyXN_`!eLiL#OrNeUm)jU4HatIUli$R06t_Fq<(&} zbZ|@vlUMj@t|(1#NikR459iHb{HS-uoMg1M4;(y2JC)XQ*SN0s>p9M}w6jl(<+^jf z{^Lo^y(!zA)o<-Rj#FeIjkt0JA?K*3=>JGTXv!i|a8YE4+tswwdzsV-R%$k{O3lwJm~8=_sfjo+ zi|R~%3bc+!{tY5g-_KKu+G!tYA7%}>-Ukk$R}6^_din<3i*I!3!+jPeX8X5|-4#Nc zn1~NHf`w$8uOCK=|GbexOT1I9(JMjqLBQZJceKkQZ|`iv*B2`O#6Gb(zo;dKA(_wI zzRLyhtNl6(RVlLmK5q2c8aPi^^)``k!GUuzj;ZI&=bVHZD1Jd6{U&d$^dLQm1^U2? ze82pM+S%d~X06#}E!|kYQ+)pDY9S4Tb#tz8?dWraP;D&8F5Z09+@6#!IKhmW_H|I42MDAXQbf85B@l~g!1{%IXw=)HV>p-V~(a@6lU*Ty{_{UdRx-?ZSE z)rqL%#bsh>-Ld;a7Z+Qc8OfF=%CVh`UUa>rJCRQR=>tU^ci^wD zYh{rEA#hNoeTH{BW*54-z))9+yZ%dMk zbw{rJZv~y7F>ui`@Ga&pLRkD2VD%sBkxW9cT-6zJ?gIiDy$U>s-;`x(@!{o5)QpHzeIgAm!FUER<_pX*Mp^ ztp{B^toEM}=)5k+JcZT;3bv|D%fn{zXOkY2#lzZ0X*t570*NZ< z({*kmcW<4eST(1xj3P4xDSg2^CDN>1XA$Y)K0Dg9JkkIqj+*+&nr;@cr;nAonZP{s z5c}Lx+)bN#;Eg~BUo1=Y9T-PvibTziK=uv1&=vgT*)aw`$oR=Q?7U=4Xp(nxhuq)x z%frvrTQ&*={AhI?UcTjeNN>JVSN~?AU--M^X{#v3}yiPLMTLbTzR*_~JAPWHCB|ofEe%RnXyryWx6ou{lrKh=9`LQnFn&c4U~% z?c?m1)jqJs-C@;rkTR8I-0y5iRlV@Klj}4ea=_{=WX(b9Vgjekwrip}hq{VecX$b_ zOFODv!u%|w{yp#ftRB>a&Z(@=I7PA`u&~#=^e~UGXK&`72#Ukn^_ZMH z)gQO-@?aV3ZStCV|7QPvy;fF67kTie)914o_{g*h?vT=vhh5?&hdM*`zVJwzP0xu~j7GQ2U<8L`hUYTGb1@ zdlVba<=yiVBPYFD_d^Bp(=VzOIa{qw?2*w8=()h(#Lt4_JvW{RAvACzH9ugz`i<>S zAt_0yP+hUymv^fSkwOyHMsoUs_e7w zR1FzB=NKfHAzN3lr=5H9tya#lyZUdk4jQvMEHKH?Y^6*XHa_H&krAFGjm;&Y2cU4) z6asc)I5n`l4Z*R!LwVzs$FXdaYP+$dNF-2|#jWuFNh49g9v=8Tyf0u`v>^d4d<5v@ z+qYgD@ZL#^z4BjE;ue~x3N-n%F>Mq@c7;g=_QMvoJ-3IvZCh0bNwB~5ImkDn32JyZ)8Q>Kvwr^aB4hlM{`<05l;{Pv9ZeT8n|D;?hxbFPxQOYO!mQTZF;DUjEjj|FWTkmnKPOFHrIIZ`K$y;& zs?@MGo4n_*SIMY|%jtbSgJ&36k&wz3sFD1qhr4y3jDGlpIc$M34S;7FQnC-Y9$~Gt z*#}f?vqwt5*5+D~2c)-&!3W$`2nkEyE5-~RsuZL^0tyg+3d&6C%vvO$dF}RX5~(Yf zqwo7jqTtFGvhbE&aEHV*R@T9XhM5$YL#6P{9wer59ZBe%_NJ@}Kve{rg_{*Bt2DQ7p#oF_8+I8+Hy|}F z*}H7S$AzWWm%MJzKG-{ydGk_eI!#&$^4iGz%|P95;Vrn==UaBgCZqz;Pqi!hU+%37 z89$jtQ;A1z&E4pkAjR<{iM6Hn+ytoFd&wtZ1a>Bd4w z5+_+}c?7CDzbZK>6&Qex{R29{Z~<%JIfN2n#}7u-un@Nc=f8>6*FsBo6(2N|^4x6g%!f^es-E$}9?9jaBQtBA2&e>;qoVXm(g0*Q?je8aRm4J|Z`1 znl}4F^DKsZTI~u`@t?(Wuv+U9V$hzbe%w7QXXsP118|iDkhex6gw4EDJ&aYuyJsvV zZK^g;|1;A^;sv|W`w~9Qn@EpgxJiw+3|G?nhIE(kWI{j<*uc4K0kBqDRN67WFc}&8 zp`bT7Mj6uH=ZWBalAbuS!gTtMviy^Kd@pcyOGG^rso4)Jtep#0yvSjpf{Ey&t`u zXN#iRvh|Ux*_w^5@UHQjggQG-EjeQy^78ag3{zQ?HWP8yr64fTuEYZv9{a5cXkj;` zk!Fj%&NYV`*do?$q<0NEsl=??S;Y*06GYmi6wPoGSlBSe{_L=ItC{QVFB+3QeG0Kl^T=IAm>6HQVrzl&by{6+@%E=;G_{V z%HhDyS5gLgAkk>LF*h2ZQ(KuaEP%R$8ac?qtKrwH{Hk)MjnNpKZ!zg6o#5x_+AIcU zWxoe(W(;M!a_oqj(ImTL(0x6nenCoL2(DDYevva;?ysrYQjoMi<}}6AW-C8m(Tw*r@O3`8{sBe9ro~C9qWPjo|dxi|Rddf+Pv8!e#gu?L)bXU8GLcW5%p*Z4} zn}OF(wOZ@u?;lSUS$!x5vb|nJk2Bk3+Y3}o?#(i07_V!Y4_oxso_PWfHW~h}|2{p8 zEQH>O=Thkx6+HXh+w0Pm%RMGF$(|mKHPfCi9BwHmsh5%#V=5>ax;1-*t4iC26N+|V z9x%7HZjz<9ohdk!AeF#y6W3rz{Ci1(R}D<+)%L*u_hrubGH&03w9LOXi#Uc;TcvM1 zbOv&U;WxUHPM#KNr6=r5)N2_q%JfWj59JAyJiw9ODy3F|gNJthBfB5*amIzEyR6Nl zO|)`0P&EGl>1DiszN{A2mbjS*1B15F>n+aDfRh{anP*u*-a-JAD)yIUjog0x9QGh< za|{*w&h|p2eiws=yXx*ofVO%U9J4roxeiDulnWD<(Ql19&^;I>_+mJ32+6^90nGm$ z=th=#+Np%9igpt}NRVskUpW~?zdS=p;W_JV)8p)RQe;Nt_XD>37lGK(nf{1W0-BdL z5-tE!P(Lq#xv)%PmGXm|9WO+ShL#f2z}vP%URdX9`OX6WuYOcUKz!-#^_^jSjeD_F zNreOjv$d~b70k^6* zk)SX9KeLM#DUgt!-A#gSwvV^FAdsa5ar4&TTds@kzqSH@OQi*#96TWaiQFY%>EP-G z?#p5=F-6)N_SA2?gY&#i7KyR4kR2&>q0|Re)Jl>Ey=<(@_0g7f_nv=6-a6ws$5tx0 zvxuzYODFMtL?tDP%UUm758VP}6&BJI`35Qyj!hs^kF6fcBvB5WlXzdoAoI%BMRHf63NmhTM)`bG7K6cI|ZrXJ8udLD(U`T+je#j#^08qSGCK=QeL&m`d#R8P@mHJn+K^tGX zFdsxkNn+P^iPL<@C(vLYg;KFF7eI;y(qv>uc^u6SoZ4MTNr`n_-M`*#;8&G1bbDZ7O-VUyN5DJ1DGdh?*U)a zi-D8Zv^In@K#42U2R|$@_AxCNH~>*($FydIgd*bs21>FJ9$|0@gW=M~Y;*ABp6(I6 zKjUs^sBJE+{bB{gOq_Y6_Ln}z0Wav?{OI0J2~{_K0=tN zEhGhML^E&ztR?MB$RrpILqwaW4-?k8>p>0I%qPpwo7Ag`^h2q6Yc_+Hx4@K}_+ZzG zsA_Fs0F2oFTo}o66sx8hC6@LU(N29ZH-QmNGk{lVWZHnE&KjxHw4O(*t1vj-(%6%% zgPE~XU11Pyi{97Rej-t8>>-IRGVOsMatCN?;rZ97QeJF8`Fnc~x3k~=5kR$hA>{X? z=3yOn2(etetDjWo>zlZvUdDCt7r8<7C5q_-Eo2GNIdUHSQl^Pu{n!=WtTR;7w{AA#h8IYj1GhAZm1N6SUtq5Fg*&BMD(4Tk-@BQ=+o>=l zS?*~~Wjl_ZL6Vn3@6~9*u?cM~_=NCWl{lV`x(Y?6aCm@xyer_GDYLtskWM__P&jw? z^=%uwq!v2>3H3&dnlzJSHJgolvzBh!KSnc1VA>M|pbkXjYjRbEE`hOM0gAmRM}{9N zL71-M6@=7ttwm?J|28SlT=FzqeA@S58e)`^+2=qOvgq+#;4C4yxu(){OYSpJ=}^)56yXPLIh(-;RJ2GK66MF`>t>wC)?-Qfr`ow?{{I@A@OnS~P^)VPy zq8C7Z7*N-4BBXwX#kjkS)&4#?%Gm^=_3Y`P;*$=gji>tskKctot^|FnB9jp%*?O1F zfXrT$Us{;y(bTw-O)?3eABLHMS?Pd-fdbLoS1K*BOoNS5eEwzPmCLHp(mRhP0K{Q* zIN;TJr!}bwm$&a*KK+@^A2%fU9{2Kw638wa&)$tg4=Gi}33j?UTDyJP$brLdX~b0x zsra_M#*W4#B-d}S^(Ty1DdQ{919?wrRF5UuY>6N))J`H>tN^k{+l}-%_B*Bg(m|@W z4x$UG_cd_T!(A^tsZikF`B&(6kbw*rpwYj0voT3vfKHpV?o4YACF;|MeFf!^a}Gy7 zC1uk7d1y2;d`l89*mI!6*jpd*5NkL<~7OiR)#TCr1l( z+DN6$(+=RJAe;sgTVj-~Aj9W*)2M5HFM9RF^NB1{b%~#)v8J#|6r~XfErW``*aZAK z^LlJ`r1dOV=;o1v)nOi=`j?{R*h!O=M^j!)Z!O6RH@>4sb)eNKFkDA3u7T2K zCPLflpw{x&Qe6GX)N{eE(h7$fyP_p|hbeX!-T3UZV$)UkW{5*+dri4}SL6ElWM$=p z=^E>UZSnhAfid{b2bK*N{-tERDNeCUl!98mOq>vqfMuwF<)5YnF47#sD3h z6$Lea^Co60$D=4sm&8;!9tOZ(;}o<}FM2eCbPkhv#e4S6x`CL#YyK!IGPmXdl+r*! zTG}eu&bxSxb^SHs#xMzHwS)v)$azj&7{Uz|Q%%3GB1 zsUew^s-bal(eeZAzMC|W`tg}yf+P0piG|V4*t`XoT&p#OYlUi1GkBa?6CfZ6XLC0T*$pYDl+2XzD;;hBs3?6bbIa1Wo3}&l-+GY@T zLr#31WMvZb@tu)ProTrevUuDjm}63g7-p&v%uQQuEl0aD=;lYnkB1smJVzzgNX`d*BxyYp)LlK+D)IPcN{HS z=mNIyO4089_n!ZoV#7y;?#VTmP5m7FkNM@h#xuN zMySOk8axM;4I6({+Jmuc;u@h6q*Wf8B(Qy zQ%qt@7f706HG|Ep0J}qIEvQ*!Y=rZA15{stb^%HR(WN`NnM=LSDndx%y3JMN+Rc^y z*o}K&k80}a>qf6i`0|+$bn5=;m~R?W#Q)s$$%tQuXr2x9Dyw+Y*Lb(WG!|h#yOmC?36{BLA!_}O`Q37KZ z*RQhfshX}>8d3#1{tz3}09(#GBPb(G4EV&x<{7(DHz_#^9=u_wDe|HqQrLTc;>Ki5 z1Lh+CX?APd2aPb(7ypI9J^e+!it+VWYc$>3B^8YYASoQm*#!lV#UXHBNW{U9P4RF% ztqH+>c1wC(C?RJ@4JHww1JX=?hz@M)mF(!2x(U?-a1B)WAMx@+(9qb+|Lk+$A!J@k zs}e&FmsJP;NYIJx-A-Ls6B^I>t7gTlmK%X?5o~=ZHPA77H}4wP>mquDN!2Bu8wnec zCjA;Zjl;En{~D=dRJF!zs`t{iC~#L^fu6w$FbrI$1z2UJFVmme_%f24OKM?1fwtDN zT3ikPwxN2@SM{-V+An7Z1p=&8>={6)dQx8o+D zg3eKpBHJs8U@?Vu&>P(>eyEJ;Vuh>!$QDHAlD|e*(ER|@JsXwDCGVLGN5!;-|3Jk4 zLzfJQxc{H8F4CRew{}}fjX7fu8qV6&M~Ypw@|5fn_hD|R4^aQfZnOp#OpbZcMgE|n z(eVOav(n@A&kGv*C$%>K7~m^VNQK6%w-9U_VHi^Bn+m%CZ_2`Wh0Xs`sE6MMOvM|M%_J+UO6BRo0vXbP>kBB(+DIWl zBG?#zn6Jt3#%ON9n7)sr6H?kYLx5K~spQXeycK<6Ctv=Jf83w`>-r3`o@%raP#$Rt zHB!sokeS<&l;~gU4d~Yg4Pfe&1Ao$bLXYsap0lQqGE}BLiEZd8y(n$8WVJCdb0mpa zX`Bvvp!#9xtghxxj~d|L@Qd*#KWnf1l=-L)>=*wis1&wKQ2KmA+BLZ z`+)ne{mJg2oYSYqyLr>isA)s+DTOqMHjJ!)ZHLJY7!3e7n3UK0)E%W~xy;D%4JVaw z@`)%^%HrEN_JpC%3IqHwDE;a*CI%8t0p9>mDp1o{KYh`NZw2wF6;Gqw=?evt9w|sL zaa_w=1C$YpqpjvZRRjh&cLiED0e9t)KfxT;&u=G4)Ib+-v&mW3Y*xO%FTU}ps`HY_ z_;b!-{B^ANUj3X&(Oij)xN?DvaUh2vU!hL%XZEll$3QAnp`OXRb;IdDcqRY+xxL7D znt8szu|8=(C`1vjEi=3Ws-Ygp7KYRyG**{dfvHT@acomb(RxfzBq&zoW(U-OmbJ_G zs3G9*J579$g_FLqeWVlFKqnKb7p<#Js+G0_ObY|UL1n8-P&+p56<*t@D`fu*zE~nQ z=>Db+Y^WL75DTQameosgiv0z!NqjK}sBY>GR#KPrp|HeN<+pfpj&USIecjMEXA(5j zmynrLbQ2W_#HJ#W(W@FeMWs!Wq;>1cQbwC7UP(};Na?B8#h*5GsMBGI5CKE>_if^uPr6oF9&p8OCHxOG=ae(G7!96CwWu9h!whtNSTl4eC4hzFMlipc7^|&x}S=)D5Cu7G~23p%V zCHyC4c?wOeilItSm|Z) z`$Q0#N<}JaTEcCMtHvVKkElCjAt=tfZa~_I%xy~doXT)0sr`t`0M<6m)iUY&n)@qL za|MmMO(cX1iQnEm%kt`cuM=ZPk_k7k8LJk#{Oa65+`m;mE&EDY)7zoL`}f1m9_E3; z5b2)OElZ-2J8NKD=+(40!_*!|&N+a30VM_Sl%#c&VQ6iv8Wt4xng<1bKC{9{<#AL0 z*jfVghvS`ZhQa$fOBov&Kv&W=)CAUwjJpj?5Q<60$YWhunXM%MNfj{lf(CB;_JLO1 z2ZK{P)^1cgBwZsj_0T@Mb zKy`JZg-?aAn3TRa>jG4gowo9jgKx?fWSJn3vO%vJH6l{G{@kvS9piY1RxO0&+VGiQ;TlKJWjip4$mkW}zWsfi#6n^BUXJ-9$Y>OHp6Zvm(VaAt zN2KGX4S0Qsg!~4lx#ahhy8>xIYqJ0bLKowUx%}J_CX@6U-aT!#t01xaJgEz8`MP$z zJ3s|~$D(!?v^e_{8wra%)xykmg&9)P(mN#~S~--~h9g>g761Z9SZ{DRS^9bapMg;; zY;Bdp+2KQAjtw#i>H#L)v>uvn%%&Ui&vhjo8ynmH6#sYu{9lFEpv370-#gXvJ&nGY zRj@cF!9-qy8S;%(V3tfvLr=U4%xbXwCYi?dsfobYMXDCod9i7!F`)Ic31wnyMS9xq z-_J@X!|5OOY6Bxb;DvT-sss>ngUAs6v%qyv#q>ag@f+19c^h#Ko+CT|hqAYhi*nuG zhXp}L5CNs6LsW)VK%`ToYY0gPMCp)_?vhkVr9o=w2I(3E1eER&5h)qE;k_Tv*?W7= zckkcly#6twFvHCA-1oiKy4H1F>(_UCott0OjVSY1b~mdzS4P<YPXPDYmVSB8sW-SOtVMNqpg{KeEbCr9 zivUOGFa&!`nv|T3LG79(8(ZtH%yQZmx`XJ8R;>j0E?Yj^g;H5)_+Z7Ie&$<`1RqNc zGKx6LF60S+gfeAzRf{}no{KCq5UUBu zkOc)FjF$*08*!&RX`B>ITdH1KCMf`FM^TxXSwG$Oj_Um``-QO&2POXwOvmC)(-}23 zTN|f3M;2*|x=JVjXTRj|aIWNZqBd zPR%0;)C<3)RFyy&^CKQvm9|__n(Mg~seb4uYxq3(1OjZPMsM}^Lf~UQy!RF)3d>+3 z?r>ZJUZT1Vb+Rs&ih;(j({a8uKza^6sBz;EMB_v;AnO9a&KB8QNhB^m3c+b;tdQO~ zq^TPKd63Q}yZyYBo%mdie|OZlW0XAbHcIb062Dk&+&EHrJjB+@>bj=3l4+9O*&x~C z{gZOxs9VaF?R}16NkFPvCf(trV-Wg?CTB7+?8lq34~h{N3qZr=rj_mAF)989=2KyX zlX6|pB<--54_A|0UoXuRs$e<+QkV_C<6QRRXL6d)(_v*02AfJfUm=KNNzP0-o?MKq>}8rG7mmd}juF20e2vD1W0Cj)_X5rV%`zNf?)3 z+y8@pStld5XSrU)JEO|Mc% zfCsXknjdej>Hqmq4?5~``at;uLS9!NFuw=sOvyYTjL|@ZvBspV#@3s=06ZCdkMZn` zKG(UiBcqX=r~C)vl4w23`BwD!z11i-u%dPUe|@?1T+fzwCCN>n>p_v_oU8!0MV)iqO*&Dh}E|v*>WE( z@DXB{f8jfXblmX;4Yn5qPPPY-?WPY#pRkrdP1c6sX^>3MfwTh;q?U@GG9K^j0IwZR zYB0QM&rJBV2Cjy=JJFx^YF#tr$H0&~Iys`MVgAJfA-482Uj~r zCYjDmC5{ko$HxcX=oXLm7AxvrMe1Jr0Y*8Snw#T&qSnaMtU5<*BY{bo%u&rS=N%p; z&%Fbzk zGL&+QN&PSly#Dm|ak{qoG1P6HOj7w`o>!m=D^j_hV>8o$95>4*V3LWr3^j0_mvggQ z7E`>Eh4sE1`8$amt(I{CK{&5&A2)EwNZ}ensJAc1bxA{IbXtpQS@>PT(vx&MD^Fr-RK$Eb6`N8&w0!b2!gON2}xTMYC4u7afH$Oz-XkK&Fq8&tH4q^ z)kybQ-?N&9*wDo&w82kz5dadQdb3BJ^|Jo+T0ocPh7Xui!acR42^O1*81(R%kp#0? z@e(6z_YhpTCMh_VQCl$o%GEN-9Wcl8W=6iQch1cW)_z&Mo0+7{}{2TPtO(x!2 zP@BoDGz1hOkPJ=|qZcLt@8#zI6&@b`CC+4F zSNTZQ>Xxou_N1q}0=IOcZ`fLwRYHX7D&JZ+k11fdAt!IJ&x`MRI-P-A!-wERJ;5t= z7tPBrm0R^)IB?8eU$t^dDAcbF1Ow3M3%|Q`7Iyzs?>yPAdwN8FPQy(8D04z?FVCUY zXg<$jX4Po{t!3_^)63rHNU2?w%k_0f7OVP13pLJiQ{2y%>~c4X=epE4tIR;_uG?YVh!r2Xdx{k2Q~;UNV774Geri?H#ZC<al zV^0yye|SUxK2-j7vOFhw%*XWO`sf^6kgHG z;S$NQ7dfyk94eng3n<|UMe7(Yoto9|PR9zIw%uviP1dSe%pP>na;s{HEGLLM>$*i3*ld+?r!oFRNRnMB!(6uOiO>1zU%RESHQ+A80 zX5LSGao5VlGSA3WvR5kBoPg7C_?gqA@y6*sWdWrR?2dJ-qjg39_ZD;q(lB#iVz(eSotfhmXMa%Ioja-pg3BiScg-2?OG4TGmdKG8|W-pl4mK%Oh1Z&UC z6Or1TYt28WU(?Y7nxFNVR2@5 z^n6j~tnRcCyz;)V_YvP8LGGWH1r!23^RPc%;B(){G_5|afZpAP%$d0#?pV|f9?Z$! zOb{q0GK{=Q6mk~$ON~*LXETSVkGhTaZj~#SaGS&_{@74l?&#AYt4$FV#rAh6ohC*w9p`Qs}RIknMm3+-74!e`^DZ0if5Mzi0JphRFy6zea)!z<1exC z6cE@rLH#3Ayj&ME{)hF{bb~{s>YQqkLA^w_Qj$a*hrYSQV3A?tJ53%`XX>id|8%@S z+0h1@%F5g3WioooJ`P%?|M_X12Hs;$@uZfZF~uu50&=Mf1e7EnUaZr)?yg>^q@uFm zdn~B-|GF)|@9Nnq_~#0Xkb*4crr-Z`TS2EA32h&k(g< zxIwnppe5yViJt3w5OPj5MVJPCx;=FkA@Wmr=!&``l>i?HIc3({6R+<2?Ekt;VgcAG z?whjwr~C7*Ae*@wtM4?n@6&1ZLg9cr3s!F?K#t1ti{ z3hWa-tLrgb?TZIR(}#D7hHiq_1)VG(v*~|uV41*O1fbnYV5G?5ZO;$8P&P2;u}P)U ze+GF7(m5p=N8E2&_uQ*Jz8TOFwg$)@FGmQ{iloUNy)U+QpLF?Iv)Gbg({SDM^k9(- zkeT@ezd`e5Fd)ykm<6A$-vs`MeAK`bz=nR0mQpB$$SI#l1LQS-fh|1wL$35V!Fn6ry5o z?0n?sE@SyC0&}t8Vch1*`b4MtTwLV0 zkFPb7$i;(!j5TeD3pV#shSudq;B^SRY`I8tpG(6BaFRkp&g0MsI$Z{IGy4Rz!a0Z~ zg9i=Qr4Vwq<;OIgZw2|)K$b`;71VT{8&p^B;V|Di0T$BydUoxk1s{m3$3T&5Oz~bA z3*VRh-jsuSJP<5X4J&8_Ju3d6i2_xC2&W^(i`Q-+(Csj z2j+={8gpND4kn?H?mWhLb7W zBH%OmEJmaGJPx-n8G7t!RR0=513@b-V8PQJ-I%?5v}$$qifp7M{N6MLFmd+NmJY=z zmZ10FhR>!2(c%HvOuIz!=KdY`ng~oY_Yt)cruqK4-_F?a+f98l?kWL9UIjW+*iy%s zHNx2n*LSNj|Mzx5b(f4c*Tu9@b4pSruyB%}rlk%ab~kFtas@nA&J6G3MHtBrS-?7N zui)I0We3ZY;d$tF1 z&IN;K8$R{-zi?rC*Ch(#(CvEFx4ix~A-KV?auvm3C#Z=Lavy+wGwDn#u+{g0*Tk8| zA=;D;Agy*d>#oxEmW^(0^m(1$wLXR1ciGB6O9bdIS!9Is;fWq&B$1DHuZXiYl(KtG z5z8&jG&+zjdp*-;ern-SDn;F}~ zrR*RuXt->w=6S&s*yP;QtrY_6bz5l9eLw6zrg>`%=in6Y`n zuTM>z?RP<7K*P0I;@c~Qs;IprG#ibC%n}pjb8V?LQUPHv`;FHOeU3D5meI(I=M3== zm{}T>XIocXd~nH3cM~(MCZ2cSS6N#E^t^~7FW+deQ4K@QHLR8ftVsV=6M}R3raqRZ z$fwgu{k6Bzr)!m6$!|Y|(S@*No2&oBq5Ve8weOW^K4(eWRWm#3s$*n|=%;~Aa8Ct3 zHs;E~QrW{XvX!bQ3!n?!!vS|Y1F@g8mVioyIa}NN_L@5=a&UYf#9RoD?+u}s%nV-) z;2ei&qpk3TI%f{pnaWab#Vj!vUCSM)GguA0CyihhfEsc|%fQ9tGMQ>gt~Qfpo0diR zvM`QhDZwoi!iOuXu}f|df{)HLq9k=N&#cZGy&)b;Tae{ zPF|$j!is1~%UnWth5LObN+U%rs)UEIbegIw@@iZ@VHk8m)cvcOBm?pKT{Zn0=dQw(DQa2Cchk^jNoUc%^3$o7nD~O0G zrCMV#$`x;hDl>0sFQUIm{hocz2U` ziua~?wm}-6?%Dr<1<`5@ZzKACo3G#z-!~~!?^h(G+NKK1(i!FtOO`&t=7@OA3RIiF zgIi&36-BlJ6RODOCc}o~*qIN(s8nTx=&z^IVJYGXad8kD{iz#0B=U2l8@D_!!}`-c4i^WU zB@;t{gcruGI`;6nXTnu3N1(*b=ujt^lOT~T()7{Td6gl{CT}dEFe~)+XP5a)2@N3z z2S3De2fVUGzT6+NC`kmZe7K#ONr(z@cq(~JJ?!g3<4C4QoyMQrB>os@-^0I1rvfA` z=DcD@s(*gx&&>v<6rJkyM;%9UeZ`X^$HYnJU|!YAY1iSADjtED3v;yaiYMnOVrT_x zr$F$&4)uXo(C`iOmw5a=2IJZ^}I>_~0!OUEQ z7@+(B=+wp04YBIJgSLaHn;`O)4c=sqTL7ul-F0aV7^zX^Iv~oENZXLSVi& z_wCk0hz1;33^V;Kr+*&Dw={eWY7kbN?hI)~HnSyrwU8lvSjc9(eu@q#+%=&i`x)oz zCxRPa&CDj@eVg5QQO-{y;JnGtI&c)G88&+Q*uUTWtp8$)G~PTEjc|=8{tT2bS`f~4 zeHi?A@dlbI2;>YR)~)<AqtJluPVbj;Z=kQJ zf`8!O*{m1C%2?SmwjrI+=JBAvhlUhHuyZ9;bbE9390?>Sf!xJ4l;hI14QUESTvZ** z!Cu_$j%Ym`4zLHXCg~%c zi8!1@D)yw0ySwh=-c=32FOX^*!SBjsIcP(=153+->wbAsEs#h z<0c&2l}27leNwc7aJgv})q7Xi!1G`sV;)p&6y)3$)M;deY09D}JbJdxxEqlKIGzxH zxmV*Aj zrF+V((14?~BU51lj|uh20ce@h2m`=%Z=aIEUEA#QA~3{@&?x7>2v@PHo(l{ZKwf~M zT+gidec@)EUf~)Es3KTKfDA`Yy!k(2FvGwD1=^S&+k)i9@Oz#7$(k2P5%gX z(6xIfK+!}CyYxP`Kr@P<-Zq6^25)=y!%ATZBjEsv$)429tBc{1SJ+WItg`floU`csbz_#ISuWu5g@veaRa%+Y7yo+(&b`rs7 zo{6-N=UeDlj?2D0plZil#>$2Qjdc%+v7S7niFjSFYZ&d(m(azDDDS$5I{T(u`A+@p z^dwZtFJ|VJa27TZIO;60nGs2yd@XQ=*JwIoiW$aGwyW{GA@oFj2SBi)ol`AU9CD6W z9iy6i+wcUh7V;J+x{v@ein1U)cjtYO1Y1?I38&tHo1JLM&E*;L zSDnU=gvdcFPgzeYrM-|fSrpE$dhpVo(XtX~L`-To8h*QHq?aI!gs{?m?6-jTAIGQ> zw!((`$^$XeC`G=PQ(48tSa`9jI{|xak)o&jw(IqK7b>mfnI1NmKk(-_<*eUU8wFr9 zo;VKb2Uk5YR`~NZaQH;{&|@q42f#ea{T|EV) zD|WAfcP z%=FcG-P*oE9Cu>vT8KWE1r;vHcOuwa3RXMN#Q1z@{*1@F520I4F?dqt+teHGq*S6B zq1FIE*S;UT^5&$BpmDH&E9zwMZXa7q0Lu(4lH0mBz?NX3{);pF zhU@qH9dWUQi1q-JQ`wkgel(zaX*pOF>b6)aoWJ+{+sFM6N`10lXwdB6?#rnUZMZ(1 zaoe2e1O82R$MNcytiX_0(-D_%M>{2d-n*tY)~3FlmNb~N?%jt zi!7$}O`-&D9bA;F&h#90S3erel;LI^?+m_lfMdZmM^DNIs-+RlW zzDDUA_MFI|aoyq@Saj0@mWn_eXyg|j1E-DwET3qz0A?TlSwpmf^QQLna zUf=4wKxIiZ3@dno#u-E{3&&y*yQz_PkzoEey>&suOV6S0s1CBUf+U zO&`zQZY|opPAPsl(jtCD-D1WM)?p`X?{OzEfK2Ch!!G=i(uN0vS5Gu$RQF#6!!o$P z&yOQM56`gbP-#HbA9macb76&e^*?|{o^IHPEm=|pxUkzab>>x>ng@^RPv(-Wa-F2a zQeUi3b3b`~HZSbueXC9q^WJUmC-?rVGd}?@p<7}tbe}I_6OE>Rg$>B=td5oac(v*E zQMoyB6-}McB@NmM-1|P4NMAU6?R<+;zJg#yb+{EI%A8VPC!bG~PN)!4|Z?$47e?cMK|0{B#nmDjy}vacBt1`4p2pSQ*OGa_=2DMO4d@zEJ!4GWE)U zUkRsA3@A&v1MT=V0UFm|7?4V`IHogC$r#q^pvQA41QgbfAZB>Y zlSwu~G&v5o-+YBUEHbv2TZCedu!8~9x)QiTS%mG(yOynQe6Y%{Kr1b!pa3g-P}0$?&Ueot4AfLlE|wiJ#P*Eh;EIYRNf5_fSFAQfVh z!&3lw3F{FWR-i2{?=q(QRCLh9$ zl{Ct_th%#5*YK52T+?JEi6@BJ&{2qa3vxx(kaKk6726)SXhK)=Ks(>g%OD6RJV)=z zU$-^B4(D`FS3A5fRM`j<`h52qDX)nC)NkP2Uoc&2(+xHiRKIjZc3Zh96vES}u+JYO z6N_6wlyp!oO90z_|M>Ed zBg{{AY7wBZSD@m0^41aIqIl+Qc%$tkaOGyH{qW60g3_JXcFrX&g~TX>Q2`vH5m4Fz zYNd`>*RVLT<=Ha0V;%_@VzcStLuImFhX@Fo_I16FhC!tREBxFa{dA+b+RIrqCHM1> z&=JWJIb|~dh#C&=T3TCD{#zLjt`BPA2-F}S-HCG3_kcGDIUP(dE+=ZQDs1XCz zn#&s=;VV9JnlY8D6#U8!9hr+pz@7Dy`-Z!HgTmW~0eo3C^OTE@rC>}WTDMSnH3EpM zt7$rB0JZHhp~j(9bkENF@)6dYoNxlWIG*vCEA>YzJ(omuI0g4@%dPVwFi#_XD?u-ue!DnBgT>MDvb(a zZ3GsN&Hx;?89ILKy#3>g9bF6e*p_(#Q>C%a%?M?&6^Nv6Q>fk(OxSSs6;kdNYLzIp z8jO83CS|}T_jfg&%qG_B3M~BEVs~a62C(abSveEbv6I>O2lpSL9`d+VFdq}DG)^~~-c*@hE6o(~O?f*R15ySN-l%Py$A3_ht&u>m{}Cr;v6p;Y4k zzoq#;VrD<0oI6yGiG`{B1T@|N4(F+BH)=ryGLFe|2;b0|Wu1vXjl{fG{1aJy+=7qU zViz6Q+Isdc@b!+wcydkS+uDi0p@ICWY@gun0-4)t>$}Nk0&MU?qF1AUlV$83Y>TU* z3wsF>#Y%iHc!gy%UPOjkYP{irot|q1kXpd$$x%lam8CpygnI&*>uzj9box-)kcCZR zC<(E_)JTXV+s*hYV-DZ|#Sat9>?by*oi_`tC3jv`@<`y|T+Cs6LvXczvy0V^@une#|C&xNvXeW)@Am->nlk&nalX*r<4L}k<&h^nf4?{I#iqyRq2dhFIHeAp)Ip)+VF&Y*=%nku7GWb;eZm9rq!xM| zI6btU`*XG<`Y+ne^~UDyPVQ8Ufkg51s+&|v!*5I;E>E2J(pbEVrB<>Eeshp!xxWcA z#OwB8%ptplr2B`qW7FP@7hO)OM26f2I$MQsxjXisxMiw=amLqeK?Hp|@$hY4ULqfc z(|x7UU^uT(?>#ucD7;O8NP`XW0x6dVf!B>La~q&9pbaA;=7aA9owQsztC!^W7yWh( z)>#RpAsk9~+gw|?#?Fb4N3ay-h^Xh6csS7=u7K`CzNI~&?eQcyS*8V$g)mTOox;hy zS%$r8OzPr}0rL*sv)LT=JW_oI@XEqoTv8*t`~ggE??+Kkz=bGYEUs0}M3Cl;#&TT> zpHHzvU-z+B)`&XXU8C}o9#h`A8qXN~Ciy%z6$0n$wI&?)(r~kMm<=XNq#2Chbbh(E z3x-D*Z&iO*MJY*D`*S_w``GSeb@Iv@mDtvhNQdN?c$ixNViJ4A>*0z8zO%`4lbMYY z_6VFJ7~wSN-`KqqW#dw&Mf~g%wOON~8d1XABw6uWXI|nR9X8IgDAjJHw*UBwpg)SgDxlB*wjors^jdnFT;GVHSCS@a%Tnfx{Ayhc3uwbY%W%j#(uul6xz`zK9K}1%wJ8sbmuE$iqZiHg057+tdCBK|+Z?JFl z@NsN*RX{6X;kJf=TzAd%eiz@N5j@ATHHF)j-Tv5e-eYt1qSaf<$SuW*r+(KHS-bD| zS?Zc)#>8tt+7Dvh0?4cK5k=TWu@&AY+axy7e;E5Y;phc+ zQn*GQzh?utr|&b+97B2zIeRJG4pgBTDBwP!n`ds5X3`6=;w6{?2ph+^7ihA4n%FF1quOgq{AoiyZ_{%t9(>NMcyR6|7fHArZ?1&0 z-m8PfSY7K&?lI>6g;^<{hiZ8V?9UWNV>cCtJjnq0tQZ`tu>=o^z^WrkV}vVnOKb3r zN=nBtMGBQl6TLh~*lni3T>%uhj_#qRoS|!m3(sr-Qffam#a>J?`FGsXXRxWkCTsx0e zm_Q@!1tarBqLW#D_5FXAG8D@73O6dgiwGN80uC{sE#dX$>_vGb)Zg5sPY)C)Ol%IO zoAw}fU>nQ+{^@H2{INCXQ}uv!ppmT_t4N;eJ^E|YMMa(y?N*z6GuCWA1o#bK<4RUJ zpHxs5pZtaU{{B_dH-^v2-r^QV7|$DXVQN0)gQKDvbd1_}ve(kl)Dkbg9_my)hy{^OuRSng4jtm z#t`Qmm%#_CS^D|s9e}%0M=YStoCpr zJH-?3YH;B3R>T?%NAKl~h=jV;6x58{Q8u9Q?!xn4jsWXAYFGgf01tX}gbK?;G(%}Z z*=9!(rJWZQ;%QeP!#Fog2evO9=X*|hJHnI)we&3y-;PEPV7+$2XP88hV@xY^-WUlV zn|%7nQm0*$yFlIS9dZ9vH+Gtg2RVC^QLjSa7Ja<;Moc_Fu0oBed7*I6;3 zerHa7WgjuaBi$5O;5GZJHrcm=Vahy9W{$?)cF&G3Rn!Ydk474r9$>vymKgmfNU%<< zMD+7wRi`LNl``;mkfHM+@#Ei?XMVFvx3Sgnbptf|ud#mlMI8VqIk$?MW$o&nX>#UO zNwENBe-Y3I85^?eDt#UkSt^JLg!Tz&&YV(893czuM2_!8ND>~3r)YLhoP?}?T0e8jmj zvT|~<;-h`jR=2%`ZE%-}e@J`;fgoz{Jv!PBoE6e@uCwFr-`_s#Uw&E@b^z=JgHJw- z4t0RhGKpgCY=t|`eiu8;pR7uKdpC~y6$#S@1W+n5s>T0|YA>@q6@YxRN;yRWlav4P2Kpp>i<@0-`isWCy;O>@9fSCr2lt6p3fe`;NYcz2*K1I3;#$ z{)VODk1sJK#%LMT*s@7HgL;#bVJH=$AU!vKCm^H<(k8Wlh~iG_yPl|))*bPoJhku; z0fmckm3=lH&SmOb$ez;G70yOwH@YpIC;3YU%*B4!if|1Ec+dhP)ge!oB)^QI6l194 zUJ;IPiSwgyH-tzn$PL}?<|xdBC$e_|^z|Ulq29JW1(X55On>GV-Q-1x&9=}bgj%_jl za8zo#s}l6yuR!fa1Jv0G6vHkcaED&dfGI;`d3-|F?oHZC=HHRfhypwqdQal3qwZTh zlIrT}@xb`&yt<9ad6HZ?0(Gqo4V3DFzi0gS5SGCl-{{?*^;YgjaRg38v;v@fJ3qko z1;$ELo$8ARYM~cI$xER4NK3y;rakwr<;s|GrtL?-<9Ve0$u5U4I_n`*d^t#1(RiZ% z!7xWv8dHGx;DaYbBH0hKyZXSUCCfH64&l*RPO+a0<>u0$?x4Rd`HFQyTiNs}9nDO`%pLHRoa@q&p}Sl+Xa2 zGc%+suYq#>lfL`mY43E=ZwsQO9qC#mc?$3LUL-6$z$MeBkMMD<3#`6S7H&~qfv)Hl z!P($Xv7C1!j7f5MwQzxZ}>*r;H1)2Mqi&QN7vyyjV7a#~3Vx09Cngi!~) zGJpIebZ6-fw6=UMabni{lJP_vZJj8#hB_GDpT(e0vVst= zD`AelJutR~?1eEUH|ob{HI<-w`^zol2cM-Ui(9;4{u@GeNx<)&eGV+nORNRuYL`PX zBD{Srt{gySTwx2k{ufc-o=_o+fG8g|mhJp@JPf0`>(Ug|ME(>Jlq(~z-ez}VSHIBF zMTf85OQMDIwmOSKtAQBKaHD-EdK@JD)P7b%9F@rn2KoQw$gswT?(s%Kc}ir-39DiM}U*1PUX2Yu26Y|dJmGrb*oybuoT#}?LA>w~w&WCh0T z0xZK9x3)K1tu0d0Z&#*t|9$j-yh-+O{d%%PzbrC0GuC{dbF+a7i;z-0c~}Rf5;enz z%QBjBPj8GPAZRpJPH^l2ZjvJ3*!$w(rf$%}onRA_T6hDIv{Yno>pEr^&sPijll%zf z#J+&@ONNd4EJ;Yp#}xkt75&~^=2u6~BUcayzkfHgQnq_6HbkBRBVr9WxJDF#L|2+$ zlF%Bt^{)9`q=gmLZOTz|4)|^eJ?T+vY_}e$c`~91l=h{MmO0%*XQA@>tN6y%nl z4RRtQzcm1$RC->m8L#&))kowJG!PXMfaKP;uxBY0IDvSI#^b`NdviDDwP}oyXuuWL z>ej8Oz8+vBu&$TTUH0awXg%o|g(au)NB++s?Ud{{VG9Gh*G(50Nue{Z*zxl;6IZR)|FfR&h!94?@A z{s8b+XiC#;+|#bD{(jE8F;_Sm^(z3a`(I^MQyar$-1L|8F1959u~nP)iRihwoH4T$ zSJEU1#otu&zyr8?$iyRo$gyIG#jU?`TUnYuOQGvtC4*EnrFe)OS}Nc*gJfXat8)WS zGmB-GvkR*HkZWZ^4C_33EsZx&KuX0a&Yl=5OrCE{c?W);I5F38{sRMs2XxE%6R-wa zHI4+}d}zq4QZw@%QBkhZyxrSBP+4$HRS?adXE?sH2Rf8ws5;GwBCK?C+$lro+NPRg zotM(MHtzG=kN^A1amij%c^xdL*Uj1Jo~Try-DLAdfZ<}^Ulg+@XOdJn8(pCb;GtUZ z6+EBH;+l_Q*1Sv^sTCCT&us0-SBX={KYL@H|4L#U_3;%=)^ET1TFg0(oyl#LKfC}Q zm&H8JqtQFM#l~U(B#YhH;9GB!VBA>$(0|9ITy-5}?c6a~hs|mt4=@0FJ={re(D6|}w`kBiHYyW?|iEy!kXBQyc=3SJ7 z;s3lSNK9FpEFXWu;{!hWv8)p{pdb3X*eMW=Mmt^UoBD?s^_*lMkd=QC^tnK_87EW^ zNfzqByzn`&RWC#0fOur!^%l?;qd3I`iAGP}s`WLl183|UAS#4+eC-*6vM+~K?Wu`$ zw6nD z3D1&U;GRDr;x`8L?_>;jQ-CjCYu#2aRZ7S6?7QZJIT+w#?hm+QjF^{tg$aPPEjS%J z@xr~Z2pw$kY6K0H*43hr>es&Qr9H<8>OOEN(*KX1(GK|^y5$U+$ilH^)RAIM4D#~7 z);x~qqu*5k|FJ+|z{mOQ3J{MwJAZpE(*kiRtU(2kp7siA%TNQDMfwZWo-KxmNPBdl zR${4NA!A`JJv-^pA%9iKV7eF@dZMk>i7i0|xce_CxQ(Pjdmys5EqF;ZmrQ8PJlUYV zUVFqnhFIbpX!s!Q;oiF8HU>cb&qe`BJ5*$Gl?zCPY#~cyU@2ADeu~ozSs53DYgwh; zf$hEyE=sjm2>}Gieg-^mihX#cr#pMz@DCuJz=O2EUo2j|nuJEWx^Dka-F83;JAF~o z|BdJCjU5%xv<~sAjJKYtEnmZHk0sZA-~}LjuXsSkn&*VyNHNW<3}rQuHiLqqh;b#8v+Qk><)TtpJGcQG6_uR~heviEofn zKwJBP3B9lUYAgBB0J)B78knGLPga@x?TSVaj3ZOo`A#9|po&6np>{8ZMZx+;0s_6c zozf1q7PB!O-2~>?vSLVc4j81}rnUy?L4-z@C#bor!ybQzr~!}?hHRZ2nn;KQOm#v4 zQko&XunqaQ>X09gdiC%TZ@Tz~liW8uAqPh|+jp1jJAHtbND{Y^HUjJ**a3V-RsvT; zwr)6Q>tq0Oj370z{pu-fR!S0RUr889{dz5}4rEA~($e|nk;1fZg`$6pUwF~PscP%L zD^cRcK9mj-#8`dT{I9F|$3Ml6aN;ADfjL|RG7XRzt3J!(eI+3atCe*A_9G)QA`}*> z2ec?YO;E)AWxtzKEKv){D509U2fzsKdX))PmLQX@_~T%eZeXsY2aAAg5q!)N;Z``W zu0W*K?}*N{KEPY!69S}OB+xI1uf*S31Ds?w%ebF|7J9j7mptUX7lE`ogw&q`f5;Pd zM08<(1#tXs`+MeGZQFWdrH2o;jScb()TnRORu(yUGP^=|wl6bR1No^*>n_Jc|OD+5P3Q|#?rfdzYs4_ z#DI@sU;1MxdfV3DLCwT97JPC`ZtZq1I*;r6MExJDrQ*-f0M}$FM-JHW0?38& z?O>JbYXDJa$*mAhxm`%xqEe3Si z8ps@+6H47--+WsFXg;vuI-~VK&T47AA7J+ z2k8bW^Zp6DzQOj3Sq%ntBM=tpbMiSsnq6^@5GNl}zExAD zL_#XF=`*lL@M0q6gx7JboPauByFK{xBR;)rg4YSp5XRe}RnQ@)a5)My4#=x&4s8nh ze854Z-O)c^t*P*xF}d((sSlVTEkgn*QY4z&LgwNF*P#r&Ac9Zh;rzG`Xq?RN$PeY| zoHAq$VTEPKB=!OF9EB|sE^B@1(Pr+>@Him8lH^!RpNq7JWMP~E=l-yh-JhfgKzf1y zTUyxyIJ^_9>NlfuUbp_eBHG6ZPl0y`Q3A))K>ni2`n1|K9Auf=L>nk;m_qYGB^+ap z(Rqa*%=M)BzrKBz%#!a3ob={BP=jn>c3Z&0m>`bqkAw%o%%Y^4P7@Ai5ah2AR|z>4 zfded4qsMv?$U7w3fmtokTH1NkqlZ>!uXUamQ4s)2zF6uW34C^hbDuLv?$|3c`c+VO z28|Y~adDoQMy~)e>fZdxswf~*+w3CCj_!WqlFXNAm&nqPpL_R|Dm>`o5G6OSAxbEk zjzhc>@>%6L1zb~7fIrqgO+dJCE6i7zLz^9Smlr^ z&?lG5&Sfru{42Zq`Kx&8rMicnF}-u(NmmpCsvx7ECR!iGmIv_wMpkx*EB7u$GW82eI*p!hR3O9$IN;*JJQx!vJ*>3k@($e?e4x-1-!nNh$H|r)c%^8 zaQ+G6BdUC(F3x<2vck#A{?j*|RsQx^la9{AK{e5(jr|5@%ofylDb{xS06YvH*Fy6t z3%|OZSFcF|c>xlHxzKJHDR4~G@p;7&E9mL z`)TxVd}Sw}9>Fa!GlFHG?#QRfDK)@lJ#}fbJ!=e6heRv<->=HEHBU8Fs|DX!GhDH2 zKd*S>?7jCzpM0JQ?UFR&S%B)OZ!l{J%ZhVgUn}KIFhUXRMmI}VZAZk9AK;kzdreqZOTekf1np2>Cf|+ zLJF#CkkRX|DlcRJOw~_WuHG3?0oU8=qj69F3aebxIQtlB0EQpmuhhI)078c$ z&H+~4C?~RlvhJTk$G2NeB-*)Z3N>ZM@MMzwhZ7tiTkMe#HFGJM7;d3BSUWHlu<6(A zcedf76UrH>hF@2%uaX7uk{MAG%P`E9i2q@Dml6&K%peoR*&0ZI4<#Gp@5k7i-vb$R zX)&8d$~(X^NYIdGNL9^;oJF}u+Xc{XC3wwr(Gu0Z%e=YVg+Q*B9W)0zU7_mc!oW-_ zzyzF&ys&Uv{VNn)^tEts(^imx$QFF^#S5>IN3f~-B2FRn($v(&~CQa z47=MKJb^KT=;Zb74zCdFjM_4JH@vUk+x~4s$w~lSU;1_{=0@5q{a<|Q-)qIk>BRKK zuai)y3LnxuSlg-pIrFLb{+G7une3v0uHkw88-w_x*#5) z)=ULIeeVQ_=7HeQE>dZJxd2s%qu?^*W2Kg}S1ByDJ0Qv-<+$df1F(AMjZYbb#4*9# zpnd-qBhADw#Z1>ii{k?|ouC||!*RO`py3_n>mrH?%lMXi-z)Jc0{Lhc@-mz*!XNjP*hyCMnaf6 zafB=t#v_0;U-ayFtGs$>LY|}MJ(1_U4p7^+;-@jAs8y$+X(4O~c~EBrz^@2Yy3XEV zRp&Pcc5#+ug+k%G*nVGu@yMm>3*{2O7MV!jVws<|6}hhQKl`D~J&ecWiPgf&en+oQ z6GVs_w^v=hARW^J&Y#`IXf_jgdF~v*HCn3h1o`IIhuQm-OZ~YKqm1n;IR}B!L$hqS)4LsZ9jbXoLn&e1TGwD9^WMDrcm7DqV1^1>il&Z@a&avCa zcJ%eOaFq2n)GY<2z{L{~yE5na%WOYWjr1(?tk5U~>)$Fz;)s1+xQtJofI3J<~bbiBTC&y9UTxbLi@@wb#hxSBHSpJyL3MUJGxs2CVlFZ5F_E71h= zl5_a;9d8Ak0(J<%dsrz&nSR0|f&sM+^#En4HcW%_4ktS%ahgIk+IjBT4&3AG&9++F zY=l=!!Z5|ap63wpL|;&s9R!#Us`kI_%k+-|#a&^FAlC#@f9sA`x{D-Rp~ay!?2jSlY*nO0i$LhP=07 z-s=z})Fcto7}B)PEnSXlL{Y>+q9Lw{behXSc=vGR^eIfm)2t7mHLK(FZz_4hgcOD( zj#GEWMU4_#S3R2pcD911oCXSvmKe|)R+a~Ns;CYzv~%@kUX@I_dZ_zZ+RJp;H`<3d zPSh-i&BRfKc0_Au=YA>l^cFey`dK1l_JH$6WZwmaFHLW+XoDzDhb6SGgVkl2;T10s zR18>~LW(*+-rMW?9zdro;9kc|+V1${{!38~?D0cgx@D0S+o&%np?i7XJa zHRIZu#Yo!?ZXw(XSy9wpS;?tTloCxahL5J)<*GWHQ8oy#t_Bvg18-U)G+LyX)_qf8sFU(X9>jn6^V<2E@8q}a z-aXhK{j+}-U7_RgVkVcDX=Kma*t_;!i0KK zU6<5l9ss0n{i&hSfm3PtrU%r_e5G_`%<0+~NG!#Nv-XnuGnIl6?h7+v!`k7GpQ@y( za!;T%7VP=i_p=H)S{(BD?NB{+lLXvfCsH)ZJz9mQbp8mO!Z1{n*I$b2S_jmO^|W4& z!mn%98j^&29m)0J1u1AIjVk3g1=9w`induo!O1i8v;f7vF>=(oYJX<*3p@Y0t{z*@ z4}#TR0FmB4j(7cJ9g}Y}zS*@-ZK-UOU3xdk3P`9tQFqSFYnbyl?94{yo!slQfp9|@ z-`2zyqSzj*K4G{Y2a;J6rWD}7d1_lJJapTvpWkxGQ&WWo3K$3Q)hODteklb5NlFUL z**7=zrA*%dfdamJJ5u{jKl1hTMxOPQ5&I!PSc})=J#$lHM8z&G5NM5|0Qh%VE zA+4Exdt+RHDKJx9BAC-4AXv;l^(97}S*k z(#;O|!TF8@uC45SSr!s0LbR&RX>jb@>7YFy0f*}_GF55A1oU=Fk0>4~_b;S6Lf`S; z9FUcG{l&WWB!Z5!`WG_t4N>t6Tmd-)FD+j})aw$Rs)by~F|F=;ptf`+z)N9@` z$#M|C%L+I#|A_vUF4W-+Hrdo{+$RaNDG#1^FNf@haW(Sx{5YP!Td5>QUm)(2t~3G= zX+lW%^kU$J?pTHkr(GjY_FjoTcaeXA{kJ-@C5|CG0Ips6?ft5PS{6hB{dz>oM*KsN z<#UxYNsHyRTbJ%dIRd^7YLALG>QeG^Xx!oDcL4frfEuD2j;ywo=mK#CYmQ-wG&-VU zZmfM8EHnEBcPoqgbn+L_=5h~tE>tI*OnJng0NT@n{Ah(Pcmf9671u`$-5giKj?lzG zAkC=a&L`l+jq-Njo*bu~L5~|#_DyA`NkA*V2$U81Y@XdYDpT2fN)9(#J#Lb)2BMOR z#j4_`b;rr5`Z_beJ?9>3+&2z_`LH72Q+bGNfwZ-;n6ileW=JCnJqelq?$>FmNWuW* z_+HP>L3xfB#pd6NeE?W-JiaEU`gqzaOOf`7j=s%_+n!y%8+IT?X{+-bD^VG0j$+zW z#cngP)GK_?cFy_K)rxs=Z*JBP8hz4Wk0418c~kN&NZQa`YiCQ>wc6<@EZoRYIA2FE zn)+9W{z8&?81U=#%N&OqRwcd{eE2Ah0$>PYiF+d$N%7_m6(?4_F6hAR+)^+&;@m~> zItC~djT>{QrYJ9+W4>;LVNYM#02k;0X#z+8;O0`};W+H8GE4N^u9{)S#+#627nlvn zd<+NPB_l8*`_qG~w{VBM-dt6RZO$Dqj82~gZ49((jUUT_mM79C?Qp`i^ee53V@)eA z0K#laQmGl69|uq;&%H1p&;Y}MfP3}977=gl^ud1+aEBs};!prz03mcOea-mi)mi{= zl?sJhX)v;!J$|?M47uq>s9Y}rxBbI-ACPY$_YC$i6ze|zinLYHwX!*ea^N0m!2UIH z{EHz6NaP~Ndr(ghS%{DKx;UhVP7rMXWC`_5>F0VvqgaP^SwJkjn_?|lxw;Mvqo#rfB^6iPfmeE=avf~C%*Z@Auzci4CZ>0 zzb`UI3%61sq3G!jiOt|3k{<&p=Yz$v0JNj*jU){0(fF!e6YPmjTOl>>TSfqnkk3ip zZ;~x69-s(_v`0JtMQ*Jw^^!QhirGFB=K@e*P(LLE(nphhrzgLbkt^pWT>h@Wa!!$q zhh8B8jWkdD8z9&t@fp-ypD;;h@-_5m01}^_vQ}D;eda&|bM~0`4&u<>Hok^KzWIG8 zyLGQjXx7v#cqKx(HD4KEr@|eY9wS;sU9#BA*g=uP@K6cx=~n|gmwgLLw*24a z_E9AQ==dCMVjX>Vo&6!9|luFjthI1Rq}gzKIV(U>qVq`#Kc z7rZvM0sX&1YEuY?yz&G^8D#sH*ZBf47(m>i2dR<2ZW#n*edYCy6T<#}&Hp?pKHq(r z*$rxNsOQx19e*4-{)j86l>pctOfTs`!o5CE1_q7GOO>+!z<=-qat z^c&$1K1jRNXt6oEV_-n@;hwxdW8D9HGkrre3;_s53zB?yL-!j$;%4yC@~&j*o)3V) z_xD1%;VhwhyCYc=`uhBw`kx#Xbm5~N_Z^~Bc!!QZ^MgI71Uy)vtbi3-0OAMyqkP7H zZ3gt)B!TZDo|1uwr~#=lMcU%YWn3OtSGERuW5pwyWZESB<{ZlWq-YTf4-)_{}XY!KN&+Mx`XYU|CcjV=HR;U zPto50_+Xj8aE62~WfRK)ewZv71d4Ehe1N2pO=U{?PnakXLw%(H*EwEyF$-v&Fw4CLSqzgy~k!9tGH^y@|c8>IQK zUH$%BaqNGNMAUtiYUG{M!FXYpyph47=eu7+k6Mz6f=8=kAFwsPY(UtE_6aY@8G8Y93ZTSDq@4dw58M{D_g8P44G z2V6^k-@TN5^F5H%%ODk2`ajm-R}VtA?+w@)8g`fnpRnflW@eBYQvEBV<@}!`0ZqOB ze|Wq8g?X&Z?$=<&-BFlcZ7Kwbc}zo-61vjl%(7hm#rdB65220!{7lWS?%|Ky(V_CE zbnYdMG6xx8aQybu900Khou~)l5J1haED4qW;*v1_g>rT8adr(T{8&tPB!e%GCnx!{ zXK(#4vgnWX{QXxwQc20Mkw8A@`GIxy{B7)C2$?_MTi>zRx?qMg^-nn@>+5{?T077F z{~W{r&p3wv%l@3AcEn=%uk-T<0Nga=j`~<1;KDjicYrVYyJ08Q@u#r=>%aZOpUs}> zP)d9tc^rrmZ)R)k5PsC+|Nj2`AAeS7r|?(yDZelt5=s=1_(w_S{}D!A0PM?#AUZk- z^@r;HLA0#o20x3D{>ubq#{Y-*`BxckVGoagCO!Z6Hu%OKaLlo^i)n}W$U;uDN8UNk zL~70I{R@kG_YXp{TAR$f-J9D3B|l{LTcfbLpu?&&>6V|w+QNt=$nhjiOiYA>rXK9x z{ye4li&TF1n`}E^zfS^e4t!Ci+zrcif9m{;BmJwZ#xq!CDwcCRVHFne>P32!b{%hh zEeRKGhH(`MSR+RmTwEp}}+&xWlvgGGf z!OFu*%8!~6M!H{xGBZzczby-8Z_*%RQtG_Ls>^Wa?vZ1S_U!g@YK_YFfff-(T%q*z zOyuOr`-F^;RU7QC_1HL}o9a$Dg$&_ZQq0#r(N>4{t#et%RdiFI{58~_fSm`|MG!uIjVo#M6)q>$J{MnNyWn{U3Sl1A#zojWIA=@;ds_ENm3 zv(w1kepf&H`|`xy$W3vF;9BIJb#*>?0zq3tL&MEQ@$4>tJXq!hb;CPZombxn1_k97 z7k9s_th|<1b!Rtg|Ne}=r~g=h^0T;9-d%1RSo)`99S;mKOgZ}b=zN>v)FO&Eot?^a zI9&Pr_qXQe=Bypu9VK_Y2(n|-Gc$!CV2MjeAiSxcYGDj+Mxk=y$ibc-wJ$P^yZ<1H zY=%tr!+kbpX6LH1Llt#*y^k;B>b`wT1<}{whY!-0<@#FW%9hv8((islD9Et;1+H8% z!m#G#q=4-R52x*Zymzni|@86$OUf%!i-Mf}bkJB8xd5wR6m9ofr zWW!!k3y6r=#K*_?jf})|OkHOyK4>YhZ5-Zh%GR?cJ101b#>3Lr+2%L1;Z5Q&Y!onvH5iO?p@hRJU9{AI1b<4 znFDA;PElD17KDUQcP|*4vV!e!a&(N=XZaTkPY@pz_EQH>&c|n1U0vPR+p9i0a+rGe zuaYd2rm|Iue8HD5MsxG?B?}7+@?3ViKhdP%KNg_&?cB_+P3a!;m3<}5(a!sj{c|fk zLl?6y`dT z^Q*f?QtbNu+~W&?onC+bxR@B~{OqrXkL`9JeJ9TG-MncD0xW^6S5+{%;9XS19HRFB ze%W^Q?Us0@uY$aMv@<2oT;@gJ%#@Ud)vy0z;mZ^)qbG8}ll%IT&0(>nd3kxu3klNy z;#JD73sp%meMCb?r(hk&1(HbgF!PH zQ|j9(DJgwpV|IRietrG@{gbQHfxFtk?@xNUqr2M#;GzPeqS!kDXvn}sMCjzgi?gz_ z>Ytz8{RdHjPz!l3XYkV}c~^C&#J9WN$BTl#A3w@4Gcy-Id-kmBK{Ys$E;H#am$@L z$;w)~z3s)!!ctOGQzMWeCAj-V{N|gGz{Y&?WYNrwB`>#U9xyPTp2Jq9u^?z=N;pfl zd*hM>up54(HZwD`dSv!`@*OjzVR;>F5+9{vL6Ya+|aPj-NPdni9}Xao@e|QuM&5`n;wf8!-j^2 zzQIAuk&%%YmC;?C=(l}<%6XyNiV^QFTD6SVJ>ye1c}WS`E6R|^ zKySnm9&)l@7pfW_niz7eC~xgYwX9&XYY1+WsHNor5tE6+8->f7uQlCZ_d2a>(Vi^4 z5p4~v)q0g%D_ciN?`AhNSj8qL#45xK)&l!+@P<&3SYze`QK-$CH$u zr@HbaY-oNH8O|POP&`q%;pR3EGns(pt*y;%-s}|{tI3}05iuDT5Z=iiM@>#m#Acw? zkx!#4-aLtTf5O*{0=$7;>{^xH7H#sc1%ADSljlC8wYG9dk40U=qROopACFHY40l)! zzri9lHCYlha^hckRBE!=9Yc-{fYmg$=)~Jy41blesm+={NPv0eRHJ$N+QIH!3@?A& z%M0I7i9s2U@Qxq(o`iuBU>KlwV`<%&!*z5%Zxp&*SA`$_I+tn{uY1l?Li_+|S%tT{ zlr9$5wN~3DaKRJortFs|)D1|R#^WB~Y|-c83)re!gL3x=0$!c=#w*K9CQH@epXl$vD2ipiow>9&cu!K$U(4{ro;$arGZU-y``D|S>{4~4iSRtw+#o-R}$0^If<`OL=OqcoKey-(TuMdv#R46#Ee;F=-B+* zEaxnu^As8_#_3{?Xc2?sCN>-#Qo0WKF7JcvI2&78d;7h)g@w!BeYbD_=c-pQb8i1f z3*aBEnt%hD;>F;RNn=je#%5k^{nhQNTHzz{ipVYS8i^%pWb5U4XB%{`7up{~R!wiY zdAn%lxRGwaY7C~(uza;jPq91(3%Gc#$+kzIO=18BgvuoyNj!$)ez>~cmCDtNYx5r>Ojl}pQ8#^CRku{zb^O?LdW*jKN9 zAplWP&xG*x2@B z70&pYI%{IDx)On3d5FXH7dlvZWotaRQ@mt6t`sh=?5o|mr*NCdskp__NK^^`)fEHY zqoD4g_qn)tJ8E0??*#04D%42uxmUzZ?drs)2Z_say&01_B|FXGi6;|@3Oa@lA9jJ} zeVhCDQ%jh$Z1(LktnV$k~f$lj{VwBj{IC)qYJrt^JcsIXp-VNFEwmS}i6I&mlrXK%cP7<-0f9#57Vv_O z9@mNrD}5X#I5alY)DB!-&EWU&VdE{f{R~s>;M+pyw&n=%4@g@i@aw{5Gm=N;z#t0U zC&=B}x57sDC!FS?{KetFGbRn!H@ir9U;2r2+Zz=g5{XG3*>Dw$c%E1e{IMru_T7kA z*4xMGwLMb?eQ4D9H@)gAy&z}O#8hEn9%5UFL<-|S);zLG@gw7wi}U_XN? zQ?qqhZMj_2$9_`P=Ii{mIWh;DA#-kt938PhlUBi<~{)Vfjs9WI)YOq!;= zr6nk{i#So0v7;EScp+HSMWL6pl}_}ibVf4^ds%I2R)2Q})p|&C9Q$M35+;}TT4My>$hD`;mKff+ycRH6<1%ei<`ncUhnY1$NIN$2+I` zmB*&q4sevMiK1RLBHnt}x6?6Wti~$_++Kwn8=EFmO|iAjoh(D~<~G|e&U9ppgJu25 zTXNe&2)|y|x$}J25b+~k_?u?Ml@Ynq-Z{NxvzHv{5|lb@PD^?fWRs4CB_`T!zq5eW zg7AXn>X(xoR_sID^Jlm3jFS+}?RUNhMJ6j&WmVJY+Ch7Za?gFM!thC)7FbW~np9)_ zuN-*Y!z0lZ6Z?@nO>J)e1T-$H1;;>A$2Ccta5i$LzQ zx;8P+b_!Tg%^l5(wY3eB(>%-L!#ry@*u;9$ne^*K>x3+d{ zKP6>uetv$=2IDU5VI=vr^89k5SbhO9tl!`Eli343J05p-+tOSO-j5qc})Pme3<7+yIgGFl+s}bA7&<@Yntc+)1nr12- z;Cpb_n)tXGjcPRjFHo#^C4N-Vd;*?28B@!f$8bR>3GOT&kzw#~Ct&Sr`_Eoe@hI~0 z5$8Bo$BtWsaF;5m_v%0;=)}Z==Ad#g6?N<~n0L(`GAkX3(cBbQs@cg`W`h#nNBZe-z4!$GX{l)Wy5QiL?XoY=xV`dcf zbn!A6d0IRIW&toiNk;bqeV}1l(N!fdn|frw6W~8rZlQNJBlN)7J_S+59ng(*U(o~8 zJ@3c9nKS|f3z-{R^rr_mft-tlom;Dpjg8Gkozl-9_-@@;(d#=vY;AOOy;%?gn8&>~ zf*1}T@sE(v{bGlJLaYx_xxa=`uX7~@CAkk|_s8;E*L!z*w{T?)fYB=VLCa)%HL*AU z!BrLhw$&s87;#hzlpL;q%AHp(13dtXi>_d7hXq#&W5DVjUAn+I{5w{_kA+Gy1|&@X zJkZ{)8Uad3c3f;>44P%+ti>NCS+yICn&-oZY$uy#kS?3B->z3OK7*ZKZOOa)X7039 zwzqT6{EfngcH{O?z&bjHW#r>d1cxy7dS6?P)t{?rtQjioA8^6Q8y+|nxxX+UFyk1L> z)6v*~a9;0?)?{}qru2&^(C4?IS4>>vf#(zeUVC%RS~V^}00^`eimoQpm4bnyPWl!j zs^;eA7y8Y&rNoHJq!~qTE3{j?gZ$dFt!)d(v6BW46+rW69`qKJjgF4ecxe>x6_`!T zU0c&)=WR^@84$?pu2jVvkZ!^kK zu$dZoi*0UQvv%H=?NT&=QYY^W5HcMuo1A{M!vFuby1Bay^51@!yyu5ZuI+$*wrKu&I7_W_O zJAC7XeD+ypTc}qkXb|+QTi32P@kW-X_$!97GVgFHy2)y0DImwV$fS4}XFd>=yPl%Q zDaF=(xA6JiG>H??J)3H&h6!`vyWvJzk_h|=AAXriHeG* zGlj#JpGEkq2d|E-?re|k9PBSVds^$A6anG5c#c~{KgSZpxA_(oJG!CaAaPkyu5P{{ zbnhZ;g6cYt5^!3Ji@#|SKkYP?4N`Z~{w&A%aA4hvQpmcOB6lE3{Tytq0v%wsZMXp1 z)QZ5wh4U}ClBIbBFKkE$*^R%s9j%C%RZWk2>^OZh5YDarNs{g%e(_yrGG(*&M`J*d zO{eUxsSYpeg1TH95azASO&?xvY?-$%Zqbr?HL%<&j()jx`{(&0snZrn)bTcPXa z`Z8&2=b^LyL`}Hu&VT)*!N27NOKQL2QkXAF9k~t(0Q** z3Ii=NiI_+)wnZOGf80UNJ2M?FiEwyiz-*KnvIy-tdF{Jk&eC$aEIHH-;x|%WgTGV> zh8xW9WncHHo>8zX0s@ny_a8{pkWyLDt7cV+7m?x1K{XmB+L6t=)4>()?CkydE9SUF zt5>+Ge&)(rwBI#y?15>Q+L5uHyC!fz?Xci$`H@-v-(UGU?^~rOOz?WUxt_`jdaiAI zi)Us1*+}SJIx%KeZQol+*m|;mD$o<|;XQ`U33@5(bCR8X%&_T{s9{2MG}X!tAlG6G z`eCSXc)nqchz~DG{!yP-@?5H|^Qv1)nZnA(EGLv6sn2)Jvf6?BDv1XTB*tKS8cY

PQSmT zACnC>S~MgKN>xusP9`%gg1T;fw(DBu*p@^L{E!gP?wI<@EwdWH>-j~uJ`66^6)G!K z@+P6|X%9;R7zi;G;kBCbG0E3iZAOzUK?-26~PU;q~ ztmg6;V?mfNx2s-CI+`*%UX)tB84`g(I&}r zSB)|*t55U~$=tO{0TIc;7B%7q3PR?LUb-&sUg2#FOe781T zVOy8-bznE0;S0-$(z7!E3QYBtV{q2HAmOC zahEh6scnBrDLd6|b)383)qOGETQgfI_iAz!w__D)1V_uG{q6a)lBO`W)LD+IX6<>~ zF#!Vl@e+fDc9JCZ$(qd$z3R<}&irp;_Q6lbZt>8tZra@>t;He|(?S-WBhcvHg9loo5>rAK%Cf! zxmcrSIm(E+)RVcEKw6p`xY?U$fw0l#wG*t_*;L&^yxtrnA$6}fjy%Zmv;m;JR1!F< zE#sBek@g6G*iW*ajvOEOXeXQx=ts=zzM9{AlZo4{Il?pkm0eCT8>83+mtu^LlLVbv zlxFJvM4*;kZnV*zKqzsW2xHTCCoCI=5z}@woo6`zcYuLe}M<=9KU&@E!RlVdE2{4@N0? zE-x;bG^|&hEcNK{W4m4+{|aX9y)|bL6y^7VekQ1f9U4~u^kNEHP|O)jt}d9+glz+P zzWFp>M3!KjFjCLi=?3SH1y2E_(@~-v51UI|^glm2b+pGT}J(!L}ul-4`?m0fXR9=~AqvJ?^m>T^lG*%D%#U+5Yn z?L?*9^Q9wM4Rp3G4zhDz*+^!(rVoPIAc`}#Gbz1%CH(hhq_*I36{hiR!$h<&8ebX7 zWu{^KMch!8;jPIsU2$!LpmkQVu)$!6hraTC&NsdB&&wW8CiW%Q2FQO6mS|)=BH{_~ zQ*@PDrCK%mj5oopbZBhcjit6dv07gyO{fHe4uY+6s6KiO*Xni&h;%D?*p7k`t}q`z zUH}|_?w6I{0DB9zHKS-pzYMyf5Ajg5f(b<&&n)~}J_W$dpuj+42hvyTsRC-><>sPu zS{%O8`!L*C!P<>51UPm&UQWV=6Ve}(K-Um0B6g`$AU;;3SjxHb8ou-RhW+SbprF4$ zM-%Yd1%fq8VNeupyU6+(fzT}{EPKk^WfYg|Wh#^*=BrVbrK2dkLrv|gsoG=JdRDq) zUq20@+F|!{U^=6+LpEZgykcaz+F7+aV|@jOd;uT>hQ<^9xX1Sg`~IZd(W>(qG+$m3 zy-rX+aSteNbt5~MdNN>6d73;bo;Z)OVlY+>_JZqKdJCn?pgON7W9*8~=<-XNNO#Yn z7)synxcETL)b6yc?s>F-DBp?oNq+SY6kmU9Cc8( zf)8ZNhkJBQ&|zEG1l8G@Z*Sp=AVodN=mrVQbf_WoxI!{IlWl8O-|cMS>>yRZhFM{& z40I<1By5A6D-ie8VDsxSBhv^da7ez)ESDID*`9lBuxV_8+lnfv09sXO&Rp&js)=#h zBUqPOQhfZw7A^viG3>nuCWbCT^JnM5l*j`PAt%<~4)(5A*(4Xk!&iDIjIq}z!5kWv z1)Q7#F%rnosuO(aJWriXXpXdcaeX}GTGmYnsW;u+ zL)B?6YgN+eS%aFJKM5T6_;T+naq@#dya7_GIJUbVg|`=#%<)@LZsfQFKRL@$SQfZM zStko$R)5wG+WG^NwYefV#b(GB&%>6eJy61<3~U8FAr>GoykeXGT(k&Dk63SDFFP-` z@zE&mI_DM3A$C^G=;S_L*IQ*eSvd2O*%l%)w`M`5a(wo2+k;An-pqnXxvVn`hkOt0 zD|z=cGDyVxg9d90?Tl%%7DB+tLV$WQo!O>87gz8Rqh7ZBvbOD94~-@&G}r9fnWJ8> zb*|s4Cy{Onx0#KS%q_BO%Ue-TqC6_qbW2s^pjo^*;gegNRSmSl0|=al0SJ9Y>Sslv zF)h;5Zo}hj$Kd&@r=NvSfwYED^s4$|mB!aLIsIiuQj10nW0}ax{S)eWI^~zoZhL|t zlE!w69l|dpPKUz`oGk7oSft=i+H!4tkb+&UdXbcR`?M`{IyPt(B5}+^n(@Of{wTbr z(D%mu@PvzTw%ya!k#HbkZR`PpMYe3y__aO}ybw^(YT#DDI4kJnTDJ0YGIEh|dAmj; zTS_HV6%`e0LOv>m$ZW?yWA7IRWq*AK>&f7zrR^-@!0|$_(a~|zU~8PH`M5_tys|Ks z^*P98&lW5Swo8Z}b^>U$k>#~ZVa-3gt5j+nN&c?^lqZ(+neXaV#=wqJwr#5bD$(HX zqjZ?`J9K)AB1^Zs_nL~9sCLOa^Tz`sDMXb^}64jO~t77AyF#W*Wfer5bV(K_B+s`75 zEnVUUon4BVT+XE)iJzKGc#-riR!Zb61IHIrkV_t<7M8^J3u0l1YM(%w~veNfg67UNKGwGWT59oQJ+q~Z$KX7Cef#NsLUPy(5D%F?x1Cj zd+=*9K>nXBW9goyagWw%{vvZ5WIhKaRXRLC3|G+70lWhZiP&Gu7TD1+XA*w1c~zVg zDR()BnE*o02vO1?I-zoshMY=`=krHe;(Q14!?Up7dn`Eixwz~#uR>CAlt-rJ?4@W zGqwc~DH^Z<0E0#CwWnAu;r9Z61}N}@5))I($c@7F7j~oMviH;?D|SeBCtP%XXG6>w zbWl=KPQh-pM)UnF3)=&#q_dRn;yFRlg$?XJv-3FS(p~}JS=?_x+SGwe7mKLxoYbJR z-dW8MYg70F+{Bx$S&dqZq0=dRryP=Jf)0BinIaWRbIX8I^Ayr{q9uw@fkw2K^oGM( ziC^fvEr3imY6|mFWxpL_PG_p@kq6e=pz^~<$(Z{gpNwxiJpV>R9`{Imvj1(&OyJo^ zOgaPK+-;4@;+^dHNm?b?YO_~#bFbwtEZ+9>6j8hp+&eWimH(K4Mhy-0i-FS?Sl6|7 zhH1-455;nQl$N=5(2e%cp=f;}W3QUXXOU9OwtFX6x^57M@i+7r%%eO;paAkIAMz}h zSXEx9Cm!JfGPIyv%&O?%^anz}2j|n4Mab-Gc5*Rm$Q;lvRiwTR0h4|jDbaFS7ln7Y zC!_GzN5s^}GU-eKE|uhM$8z#ytX!;3*_Z?t;_1?m9c$h>TdtVwR*Z?UI;X&X;yY@W~ZAn-m;^!Kyjtx@Q!R~s+UE^H6 ze>k*CZ+;#raq-33G$xK0FH+S(_?Ao;poA%#1i-wP9h*&6U>!&9Ce!-JXW)~ zZwTmKH0)g%cxxKv(oV7`lyBmDg7Z+^`!I=1~buRV2l zHWffM7viEI6`SzeUVQ>)5VG#dm8F8rvb>WF0?R^Q`HnZsUQKKN%s?6o$GM|l4=CH%fomRB&FW*G@zSvwT zE3dxv!untgP&&dUwTImYceYL8 zbY(HN!1ruLl*bVDc+5)P#>z!GoE0GF@)bU}V_2@|88}GO-@bioq*_8D#f!tpuxUQq zcxb_}G@ei*mgrHDJCA8|)^b}LD>%}g`9Xol=t=?s?7_9O6Bm|N#kR-A>dlj2XG$gF!h!aC z9UGw_sI72%rBCBnERTHE(#^B6ZHSlVLm#Dd>}FRqKIUszHH>4Ss)tQjmY1we*P1^q z0yQHn5tN@@@^lUQi?SuP`d$;ZmFPvi&)dLk7AMjaLKOyc z*%qx&CQYGCMvq@_MnkasWaubJ8w71q{Ld(|VL&1~Z?J`D3aYsLovUY)m8`Tl5>*bd0*X zf#as9cP=a=%1=aDbu9~B2s-;IRS|aUp)lgS>cj9z>+S8e+Mryt7YGdlnVfoXVA9_9 zFt-RS{Hq1CEI2#5HRY~wm^q|AUci`8J_rQVvC0wdYO5Y{OHm@T$%M zpicLgYe`iGR>P=LmJ4LCJmYek1|ZZXYki>OJYdO_2V$DR61`V;Mw57EQVyk9O_AT^G6+{j7XVy71R#i>g0yzv zV8#{;h+yJOqK?*AAo-iHw#Orx)Dg-Qirmp2K|Ku+YweW8Z6-7EmPB?#IThoR7oKT1 zE#$5NuM$l4>C=OoeV?pu#Y6?c=ilYq7B(aZ=Eq5ugqeJtQQ*mQ0}>1!?qg*sFxxz`VN}$Crh!(WoW%5A8cBxP|=2vt!O!Ewp>zejaA7nc39m_YN5K zXoSdYY```?DwgGY;gLrC)vEVyHo=IU5rOLqk%@i=r1cF~ecTj)+glR>T>#KGP)plh zdcA<}likd@kj|Sl)_K)i5wx0~Jbs+dbe*?kZ9IKv{4?!O(n!NB>Tm3+>kY>7_#~$+ zPWq8K{j~!+3%agf0={sp0oh3=wr|9S;i`PN`vAyzmz!wvOS_uER2NwJ!)GTgdqd4Z z@If;)b+9zF@m0-gT0vOMZ1|0@RNZiKJJ$y0dcQeOk30rV0{J!VHlE7)4!u_gb3{s- zXz9u@eMl^A<+W#Mb}CZEiSErQ{TfB6P`71Ws_hzQHH9_#&QL*FI(yoVq($9u90o|7 z0H?^TgGz`96lgV+nP#g>JS&UrX<c&oIV&lo4=VDQ22lT|VQa~ltnk_*KF!Q- zWM>8K2+lxZYXA(Mv9R+TXKrwbD9aLoNDraX37fMaX9m~ZaXOg+h6gv#yc8)Be^pQ) z+5DlVW+fiyfB9jLtOJaF1Ck8oxFSuXzY^PTQ$Tzgai$v#ljh6ubOe(Z&^iGh#@#$1 zt5E}Lt=#vrM^TUCRkuv=g%8=!@2n`6u6ey?$dvsKWFFhoGTRe$=BJH1N`ZBdtY_Jq z3ZOM#A1dVT8teTT(s2&BWK{zEYU$G1)A(+`AscqiBO8)cS0@Lo4&{;;0=4d-SBxIl zai9iKaQbeFrh5nSrq~y1MXI5~rb#al1+|^v3SS@r0!9gtkkSvUzuQ`ZX@uad0>)>X zH2^A!n@pmd&<^thJ*KgTsl1WET4p;Dt{*d`E?Y)-4NNKZsuGs)F`4RiFMcapX%`N{ z?LpkL16ji1JNPTgZp7 z2HG+H&@A(Bn09LrE%$YIABN*P2edh5kgFER0;ryqu-b{=SbYO1N&-UJo>*Du1K^^s$QC9ild`my^5RShmTdFDs)tQtaoqc~TuvJawU*e-t7bm(+8!+6Q#wM`}I zTJT+d%aUdq7^SPvoC80wxfjgSC9$tWqx>nmpu$j@jB7sS=LAFk{N+6I+{je78M4aB zBqrg3fYa%BZju+1Yx{pVb~;uMk(pxR%$fLmD63Z}U?&dOSFjEzv9W=)&kMqNZoWG344?h|5$=T*KoB0T;&<;Oth??yCaC*AO^p z4YK#RnUy{|{L)+E<#m9r7(=SwmYi=uB;N*rHueCt2xt8_I)vHIq+l)eM}7=jH(joK zYE)p+V;gADtWjJ`K7hwL$W#+s*+~N^iO6SV!=7Ew6OPoh7VVc6S(Z$k(0(=zic7i| zR31f^&GcB^8ib8{Sy)^+OFwgs2`g^)qHZx*2 zwf5lq@=(k3>1)a&O`z6JEv_9P!6Rtl6a>vS__C-yV+3ZbltWlt*?72cpa9?y0p-!C~2U`$w5Nl^!gsmP=kvt@S%xpEZyRzuCN zs=jf4nOXu2mrFKt(_5Q4X90woO7Z5dgI=NWo#3Sx86r(EP=_4?@A=Bpw;NIUo=vM= zE}bh0Ya+t;1vq-9GE-S|zop=W6!)uF(jlfL59V!8+9H@>i6$w<3(7pFXO!N|%=RLu zV!2Mp6^bOZZ+zoGj12?UNHJ-63YLB!$Sng{ho4iOi%d@J`PJ~d>7jGA-gi*aO%c7v zSo=vDtYfGzRc_Q5I+YUbh@0QrXF;={i050&9qFH^s=+?+s!r?V2KI-uWLO|PE4tR< zkPLILtGZJ5rAxqY15C3aQ1K{>fMNz6or$RBg`s;$84D)P>K96Bm)u2OmR$tcS?eUg z;l)*`?`%lY72#RVdw;m)pgFB1pR4p9AbkwJgSF2F@oM!uS$Bf?YnPu&sj2wu52ijU zV&wEZBxa6UEV?_@vknNt?8vo3V|*LIpwuerd+Dc=PgKeK{XzYL_eZta49pGe6_C!? zL%o5@YY>h(_ipOh1VH5KbO_;=eYqt0Q3T>PD2&~dU0>DI&o6$pu@1)EJ!b{e@HmvE zbt1Xkq=P0?DOgI^$}nZ}Ln#|Bam`?Wn4dh)Nw>I;n`?Br9T}3gn^D$R{~vqr8P!zU z{eLT>f~W*hQ0XWlO;nWL1Ox;jO7BQVs`MT}Q9u-sD$-Oyr1xH>_aG2Ls7ebh^iUE4 z&y^WxoSFOn&&==Tv)27aml94+xz4_J`+l}tMu3JyRQ+_jBB$#5JV4Yx1{bNQbzO!l zan9@Bl(jl*H+%(dGPeg3Ct{b`fVwdtl_MvrxYrxOuCW4oKNhkssry=F?H+J*)wZ^W zeVgg-f^LnAGX+|c(kQ++**eln3y-Jc+X_K_23-Rr9Pz45Q3vb12gaa{n8h_4Gg==k za2Lz5@!bkk`~)Va;of z$#T(z+by6^vG_}AjCd|wdg=fqlgN@|b;i0S+-me)VZ*}rxtctT!xq$B0Vn*qx?7Z1 zO2B;v6d0GY9VWYmkZBj+A4@|oFv6?2zM!GLxJb}aMM*J14H7|N@eCj;g;S2?W57J! zt!xW1uFFTw7D45g6Djuit_WedxmLnE!N#y=d)>ynTU+<-JWTWsa^!Zu#7N6j>Bs~g z6dP@7wjJ$b^M3tf5wu;eZNau2D;BY_b$e`=U(e(9vM3yx^TYi#$ooqRaS1v_=G{_C z@wr)`P5zUGr1bwgzJN%+C-n#8BE~j#76KV>S)~OQo@OJQq@)yJP@b~(B1Qq9B_Htz zH=8dM`CA-tp-`8h zr#fYmjoT|%&}xs}72DC~TAYg(yNG=lksc9H=)&0_6As&fUma;#EChX-laKMdP|xl% z)u$N-Iy@YP={v7GigVuDo6S2}4)iSE3iNJxhurn}ux}NagXFjTrPQFw3v^nY$s;*X zY-bpCRcLc?v==?JT%jZc;Z>0=cFltH9n}MpiZfdmb2w4=4`gkLqRGHC-$(ox-`@PY zd-BVQeYA0=_a?q5FBF9dGLH-_9ol7a-R_VU3xQ?rSM$fb|28vzP2x@-JQiQF9RlPb zv51MOrXF#Sr$EeP;PX7a>kfuQiE1D86n59K4oo8k+L1z>SHchqO`DZhDe7{d9tPd( zHUypfX8TD%3YTizSxm{QsBgDl7d6WAcbRXZ>a6R;fQC+M%!pR2##m{yGG(!b2BV_{ zo7h~m&-Da_0L!v*CQ&>J9WGHuXUK(~TaDJyc@0EPYbqNXuDeAOZkfJ7JBSxz0$MMk z&ZBH>zq@7Ip&E2e16fqEA*Wqt9h~o6>&OfoHj%Mk;JLDb_V%s|#li=amIbj1=QG>K4SD=z+=v}v|GxLIY3lFk{d*x{n&xd6HH zOUC0toL@x03b|FzNg~XJEAst6vrzIgD4es0$E`##x2r->U5Q|UZkPHfqR!nj27196 z@y~gdXRK+tw)Zofiq?RP)gW8^cAc6Jw;hZT=!AiQZA}#eu03HP_NAfA!JhX9vbzU9 zGK0svWQ)7_0^dxJ2?_t@ljt9x#H4F6@=kt@^Eq%7Q;L6Bep1 z!~QOh^NUQ@MumhSQH0q48Yo1o?{PI=FJF!7WzSb8Z`#+?8yTE-Hr0ilKn)kt6PA21 zR(Inr&q`=h)eP%T!h-%V&#%lC#;wAHf2#|O$&_q;sl2H5b${|iElF^m>?9I1p2yC1 z_I3aA&Nwd+NR8qVRwb+aAaTXJ<&m+|vh0=7#k;jZltXcsCD*|WIH=3Mzmhyh;s%@4 zfN0kZ?Kx^5Qk4Ja*GuF593ScEH3v2wRJ4#w&1QSP-iCFPb`$Q0=?}o znuY@RT}L2hw%-y)OrT?}XzAd1@C$aJpimdGJa9M)oW2^oK@|X^glEEDkx2oa(3`wk*X& z_(jmXymD=akb364cY<0KQ7BrI2u&Wp$$!wva(RDaw? z+W6X|r)J^cKGy+Nwh9vTf=Xxr%TTnTS~Wzka^thy`}@CENTz)sm?^*2`kO{IKcL@M zV64Q#4<2LNCE~kB5rvJ}gGGV16|MfI&7oe`1`_`$PmC!hQpAXGWZB@U+? zATy0ZQIY-^SN35%&IB!mirCB=Eb6?Hbpl54k;75%562{| zH-{E38yGkn1#0<*F;U9{srBsCZQv#G-iCoZ7V+`mMXSfB+&xehOzcd^&X7>1#g(;< zDV$5DI1LhyuK?|a<8UCm#ERPi(Wx!?nJv#|9#Kp zGR<3kyEZGgE0o>KZ=awYG~?#Gh}{s}=dTTI|HcBK1j6wku`(ruX3q4+y2tdd@1)@Z zGGjM=A!Hl~{xWOlb~5(&ov{I)C7! zy=DK~axw7n%@3q4vf$v{W+=OBA6_7)^75OG?)g9Ax<_4byscne^iC0G9V`+UWya3< zH6}QISIE$CbGVh~q6AnqfVY9qM3_e!#S0oc0LglIcWEbBcLIxxnDsSp16U7|wr0yA zqy>r%1Kwf}P8;w2a-5bxWvK}gh#!CQw_MS(692fF9rAxlg1K_V{i!tIABf+^sQEG> z0h|I@ChHRM32|S24ezkXFd&lO_44`ZRJGaLJr`}z zu`e!;Bs+VqcLlbzU6(injA{wr1>C=2X=v9ok#WtxM>RbgI5Mq8zXEbe$lT(xZ-Fxy&E921U(Wv|1C|{V6lK~yItqQnW8+xdF5P~SaF7XO| zU8gpST=q$Wi5KAQT&vZ*!>H*jGIp+EcPpl(EVL`pQkc)u|CKMcmJglyx5UArgrkM+ zM-+m3vox}J+&c@Jz~BljYRDkH2x-w-xDqmGVRG9u`Q^lCXel>BLOuC4VyOWYvC zqR}HB0CZF2po3X)AkZ)Vg1B%a?gJt#XbaG03Ifree~vE+fl$S>%3BZo-!4weqc*WM zIGQVTe?0zmY*-_9{VWlz`A4S9(GTF2P%)Q-{Ns!8=mObQ|8Il3_QZKE=F4^_!Naq%Y@#rt{y)EkKe~$jmGpi=Gv#~M7z`)=2b(EP z>8<47ZLfb?+T5By319PlWIx(d@Ed^d70s{xf5B{3kd!z!jxpGpo45R*h5CHp_r+dtxIz!Ux->g`WUnb}YB|F@{OAErZ+>IZA?bDL7%zoup$CY`1DC6l3% zheT_ZYODO(;`ayOk&syBzd$wpI0-+B&CSiB-rjH}DD(#z1+dgKvJf^_R++1p$^XsL z{PAEAWCNMx*8F^Y)CTI!?AQJ=s{HNHol1Yi1nK4hcfR<-nSX5{50gFx9uMHcUH_q@ zekdmwIN$uY4a0vn-ZSJ;HGEpX%71?#IcCPh-uz9w!0&OzuSWX4n*X^p*-lcr-=SSS zQS1LLwf>ji`|Y1E$$p%`UAu_de{Ic~uN(fhGl+Iz&*6|0$;9>vCZ;l-9CI-6{5ku*L;vVi{B|{v&$90|l(dTC;^I~_ImI3R zk#h9gIcnMc0U(n$<_VriT6g%r-`3DVkv8o__SM@uSB6$s^IcqBb%2`tQ&ic%f1(d$ew+ZO zW8~()re+@U-~F9|wi|65^B+!vt#X*%zdwm@BtV_bf9sZMe}BJ$+K%3z(hj2cNdElt z{M~US!Dt_=hIidv|D(qLj~f3!YW#mvgw;_@$!#)2`3XhsC!Q+1Z#$;-d~F;}ut0o6+li__*trNNH64;4{qw=G=cY&Oa#g zI}d+&0risvqG=EN&v4YE_xtuL zHddw-H_#2)5UrDk#baruXK+j+bPNW|n04D<^2H!k>k4q9q8lK?W|Q&N+vAC zLt|TKzk?(U2t8pTKKfX|WldgRPwoeU-EGl{Zb<+Io?7{!E{<%qg6ZIn2Ek3+Wp5|( zwx+5xpaTjBbS~(qivdt;y6Mg+l-#!3Q#^KROZ{L>jX?rt(TxB}bdc!mF09m0hu1Ca za9j|NRh1g}BY8>^^}{lr-EW*MH2zV?DTTiMlXBWWz>iVOlI;W=C4fl>V7m5v<*`oU z0kQalZ*d?A0D}D$BoP-?>!Xg$@MvkVb=_BQ4eQPWJiEPWQP*V9CkHZ#E}+PjY;TBg zu}Ug%h)?uIteI?VICl4=GvSAPXr6FWf;BNEfzCX*2H>=HMYC4M;Kv7DZE_+1&u@Tt z-i9V~CF64oZ}oUzYxO<-^V*vLyLMk7F^uM~_}jgMrNraq`gaj8(BlxvRQbr$AMWu! zy*2+??T+MO4wbu}njO$s))VsQ!mnJFg`Aanlk0c%@du8>BtdrSa=W9fRxb<&fE zfBtpelC1c(WK&qFtZ(_LTacWZ7k(^{$j+0zko1+7gc~&%^J4XsXOJW5Q4BNIH%knv zx;wJ=qZmrK*wVe*)0X6~sgEOfGq%#!7j5l3Lf4&k5W0pr>zNX4d9G>GQM?sV4DD$h zUR-r`#VKVtYwZ0yeojoVtM~LNGxj(Jtwa=14`Iu-896byG&NrZRg6MAhoK{fNQ7ea zwhK7%j6Khh_`;MudKh+4Gpl+5+McD)AvB|S%}mZQV|~11g%>lIvwu3(Q&8Z0U}-u4 z64Z_Fe_FaK;iixLFXw?5mO#|1!D=u{;A>CUc`jzD8(`C?5xG$b>uj-wmnzge>}R%P zT{ks+a~OZ#qaSx{PJ|Q;pPFIx*?hPSW*k=m6;2-8smFBwpV@NwF8y}j{8%2)lDt!! zNrqFiD=!tuzj@cDR_i=P7{Zog+Z?>VJ|5zvKZ>Ss!r z8SX}eU{cpjgiyg7BZ(S#6)cybql1^qZbW2lAGW1r*#55A02^Go!gCQ5*uHH@>YQsk zn(P?rEI}U6!4?_%hYyw}0R^&eN9{Tr?Z~~ER>wkWbeTxbR@#DQ?eyeU>N*>{Puk*Z z>yn9=o}W8g2%hi<_!*Z|L*=4Jt@T$L%oW;GQ`BmwQ}di_9CEhebJ!8r5Xpsk-tEn< zDt~h!Wgi(A3LPrO`ApY;-j83FlOId(Rg$G+TVNWouFls$QpZRB&%XZHM~A08d<0Bo}lZyS=A_pRkm0+;WQI&gAG-Sbuy{PhD<^EIzqkvtmIJ@$Zk~NViRQx7-cu%rsYh zTgOY;a3+&i9hxhehMd^2#`vZX+EDOl0iC=}Q^R>d4Ugr$*$$JcBW(KC2Xq){Pi=>- zp50lae!kzY=*PR}Zw~n;5DbgGWg=H;dkMl*&~(Obe;4fr+SJq4Vw->7tzJd4x#xFo zAZ87i9cL;&rElJTn8*o7<&=n8NN6Tyv8N|<*~b!e7Q5SLI_PZc5)bGdBRiaS(mSG= zT1yaCD*b0j^p1QFtevlv$MR_=^{K)XCYHTe)Wnp(v*)OJa2k5PbaJe4MBQuV@DVxS zX!4v*UyW4D)Z2C777M{sk|d<8N_RSstK@V=r*B3j_m$yQ$kfABckXeiCw0UoO(y8& z>ba^oC`|PDo+wD#<=DF%&8Z2aSA_qkZMjZ*>4CTw6ugvi<_mZf5#XKOzyX*fDkaUQ+-t|U3LtZY3Vlf3y{ z+P*{=`x%xtrG@EeZ}yBys-VxA&!Ts%HgLOt(ad?Wu~pX_1j_X6PA zhQP{-Kh~B~1?hYhEHe7-0?(7YW~uKap-%XI*<$%9tNJy%jCDPVwB(4$u>?H@!`;FZ zXZrLG^}NX_0|ki~XqxI4TXNBaWyOMRSuKvLHB+KTQwLn>J@Ip$$~7~Ynhx2#RWGO3 zb^1B*eQ>Z4J8O+mCGNO8e%1jSOa@0P7O(vB74(^X(Drsaa2N8tQ4fVfRf)fi}kRjx`u=x69f~QE5~(a`f~D1v-ELCM3&%StbVhDN6vhd&pdhw-C<@} zu%t8U3;9Ox2y1YP63NSOM9D{^J$VRG2}`rnD!7hVhO{X`^<2+$>6&*SbEAYc$ zJR&QmIP7}FL^B@@4~bF#in^)z<^$k;G>QQ^n%%(XhYy3frrqh^khqxu0hxm zijuo&W@g0XI8)efDcXw>7+x9g>-;`q<55ItLr6fD1V&{0nRdvYFl?uXSLMCqu`kW5 zz~QS1<|9Zu0)1_FjKIjg9^uFrSdr~5!q%mFm%(JIZ#KrOV{0IqBSdtgVxnPaXU2xkS_z2LGJxSbqD+SWgs3$k{$qpx^{<-XdZ28cAJnntDQl+DEzTY;^e7f)wo})qymYwI!*@J42PG6cGPVQ5!-HcXluGo6m zQ{|SkrGnMkua}WT9(Qm*b+vBX;5mQh{HLY#bu+~+RmY4yEyH=Wgd$+pQQajHX}=!X z38NU@3Ck2!PhL+0M^;8bXF5Zd(x<_WRoj;#Xu+Dl`bG;n~gE>d<^BD^z>M7 zXCDLGt%1tvfq)@s~B}c224tgNHiD) zpPeJu2L`^XtOHvCTJqiLp~CZ*4H?yum*NU}S-`$XbCHJbSF``a`h&mfCGWnsC1r)( znt^GZQtQng`)wnvFAnfaLcViPjKOIr8afi-(dY$Bjk>X|k+E7mJibyCd7$T!OXyzM zE+OabVhDlz6oKm6#~snL^s_v32s&Tfs^Z@;}(z1m<0Ufb!Bs zE-n81qu^Uk8Bu)A((wxqAUr!Q+(rbAg_imP)&$lxKh7el;v)`xr~*th7Svm}Fa9c< z)OPfa97~g~hr@lbZ;JIMXQ#QTf-GBsW`DjQ;7J)+U0e0SrO^ti$3MhurP^rK{ug`j znz^3o7SY8$U_ZOx_4VcT8CpxO?6^}uz2WouWR{afUr$eOj_4;@yQN^!o3|b&L@3T= z)d=~t&n(I3el6F=3lUsn(YP^7f>6!quC<0Cp#$|Mq4|ZR7}+f^{Tbq~E?N_R^;0xn z90_;*&Q(=`bDAlP1gOc3b+y`sIE|h)=9TiNZr>UpO<>(y(ytYslVr$ZlkqQah&Kpxq z2SZ+2MqD?jKw*3#kOC1fiI{f2n$-=iF|&`22U5xwj^v5Bplf zjXI>{Uq*=K2kbpBOAKU!4e^u?85^8q?e2VDmPVA|rau-zl6$f~c1T)1#-?kOXyy^c zl`JSq6Nk<+BxLG7PK%~D%`aqrHDvsn=L=aObq7}%ra^F4FUe(4JL&q-H^fU_8xKis z^r)Hp7(y?@vFsl%nkt+xO;AwOyfKm@26h$kc2gV)1$S?XEif=ut>?2>xI~@4uW_6k z*jKBV`Hy!IxacEft6qEE0u!6QQda6?z;#=jQj++lgU~86`MCw;$VtK%2Le8W(4tIo z2JG#9itQl&LuiWisg7p*pysoHLRMf{{CiBM90+I@A9^I@6>q8lqwR@R58FH|U~TA% z0MIhFt53?% zR?m>B-V~aBCO)3X%udC8+~)v4u^n)!O`uo~O|>FIT79tkM%)8pcD2=-YUFdU;F0}r zm+hfhxs{xgwc|j2)6G2zQ7{vui-W#}7vQA48kt3VpE-YWzM5ik z-ONjfDlQ7Dr)2-;F3p8ghT{*vbsX9qEF8imo zC_d)zX+W<+o$R^xAi+vo!Ehb;gi6uKOkR1j95)z|oA<*bfyUc10AJiLfdI2j# zR~1}l*;hvta6Qj))y3cqgpIff*YlPHk^97tFDU%&$2WMjn+uJAaq-(wT@>nbNqd{L zH*r8PlxApbnP-Ovq<}M9NshZUb`EJye!WLSYV%1#8IYM{PHsHUyT;|<(25{s|!W|@OlhT zFXn9}r|;R$mkwKH?F!Gak0<4SspdfkKLL)Ua5eiKaS~dOFP^~F6hmdcJI-2d_&9`r zi9*rdeLXgpH-et41~|ER%!)De0cUJ>Utxwf;#^GsU`m*HT+fW5RSIlqmUe>SKCe16flT5z-oZ*AKKR1>+UD5{fseHC~ ztEV=W+=r#>dk%`-lyl@>NS;1iwch1&p4I-k&5CFe}KtED_ktzJ{6P(TvEuF1x`Qf=J)g^C% zbov!Z8|h<@kK=8=u(7^ek{Xo+!*v{u#M-{yn`@!7cXn4)cz!nH6L+$Bt7#mOziZcg zPIHr#u5_VtwSj_5odq~x+nPb*Z9G7d#HhI16b~_F#qBQ|9t`UP1&={l7uRW-_fG&k zz`*^33gvN1(N)Q?O(G&>1w}SVX$0`V4ghXg+)A!OofIPu7%P>)v2V2xxnee*?76_f z=F?SjB<||+0f43VN?(ipwikewN7Gjs)fZ7uUoNG5wuc4M8j(`^XVt|3vJvpng+cmi zNG~Z*fq04533dV}RP zTG;ds>uzWXUo_K*Z83uozGPUb9bqK_ey(|-Zm)1H+AynjTBTrtva@r&!BHe>3(_mZ zKA0Y3@F^Fr2D4Gcw(M3o_rP*oRUJ!)pDmjLThp_YwPohg}3ACBt?!|)G> z{^=wR{&*6BGiDw}6%5 zwegY_Yap?|qj;?%bp*V=HT0w(1tqUH93y3IV|AbV0IQyqJjTLgFXpZgw!y*{JbKw< zq5jjbqz^rl_v#lruz0pfndHS;n;tQZf(_>53C5R}0*}drAfe2yewa&PqLcAZ-Fm8s zm-!zb~@~A&WT;aJEsPlD6hfZ7rNb&80GmH3P`T7 zKCq1_5zzhE-Y+|HNemS{k_+;UGZoG$of;k56PX*AL~i7E*q;rQ#ZJ0zs_S6b z2OSJcninu$q`1!8y_t9wS7X!Y2}@r(M99cj&H4TDeT_sWRIq~vEJg5ECT&?tUZ0gj zK`1_xN5h`cUn3y}geqM%AU+>Yxt}X5x)w#{mpLW?B-?d00t_DcA5I6|bf=l{TB)fK zBa;DvPU-e~BflmQSw$Fp1eEZ3L^^)8TjJX%)TQTqM7x^CVHyC)*KwIWG7<8KxlYoY z{0M0xkq2O;F@J+Poz5oTe`25FaF8U#A-`tab5XtYI>iRdV7|WARYO^okMyk6m+5d0 zKrHNWA9UE?Jy=UkJ+wypk+O-sRIv(tq55>YDCFHxDEH}&Zh_<}KG!8JH^A}7O#%Wn z@-@9sAJem=jEScu_MS}8++dSYK{}M;S zXWxA#y*1*QQ!)E4DWS2#lc7e>_qNyo_Oo*Mp8stViNbLNzxjpwLJ64w$XgDGH(4Q&#I5=09D>-=aIo zEXX&w_@43%<&B&Zz~vuTf zD%OdqrQ7!svWV%>I&DG%!MxK6(+T23_&f;ow&-|P?9oj01D|B^rk+PA57TXXZ70k# zcD@#=Sl7#nM}Xv4sVK4*M34Ikuv}4#y07c|uKQo^*jg1sKOsFy-!a6p7)iD<>p6Ab z2IB}rtS{9``atxo`f*Z}tGx$6}{1 zV3T>mZ>A^1Ji~GZ=Z^5t9S=w#La&qVU-D{#D9NbYIc+a`oc@U)kvAxHBbmuA_(dr0 z>HFowHmeWgjMt?Suh-pYjBk? zL$kx(I+iX`9G>l!ro=X-n8j$fP**ay_)*F*Rxi@~?ya4sRHoH?;=lbaMVR@i10(rx zLx^pU6jUxk{Z-jz611)@D@`uMvX}O7@J$aP*4fcE)v)TD?WZweWeSZnglE@pA@!Up zQ0DR7$pWQ%Q^S|u^U|5k3$73mGSB8x^DVxkPONL3m+~^I4V~vr%>&H$R24Id2bM8>at-6Lj5y54-YyN)4AtTr=#rA63^d*xQ0M^ zc&scVW*(;eYc0=W@KBzS?`ir7~Y<8C7Gy{zE` zm;1TW`UYL9E#@F1F~{IqachiO8$^v3b6(ur{pze({T?8@Icn-TJZ~lSGCNFil9Yi; zKl}^VsSiosZyr?}ZysfNff-_!Xikb)uGuzl1ESlz7kdhFE|}5;X%<`L)oeLhXBWKK z9#4g(H0>J2^P>FnkKUlLmmwA1$QMI`q~kJipeMA{2wzCd8O3g3iPZA%9>=Tt8ciVR zJ5#E61%)5fv8elh*#ClCDuUyj=i=r879k7y>Ewu>(+RygNOl`qc-$&0haP>g3gWdI zakTxhd_G|;`C!jtJB5kR=3rZZNhmF8yn@LcbX_oy7d%?6{!k(*PD+0`l458WXw^rJ zLwIKM1cqO=vgdB+D+!5cjQc|JcR%erUCUsEe}(HUE9B-oIX|bAuxx~9EwkgdU70)Es>+6reIX_tae7e}EDJ_lJV89H zg`ZD14}E(JwPZR&8SvqQbf72iy`g|TlEX4ap+d90AK1+#>B(&+!~Jcf#vmGkEqvV| zP!)`(zuCqWfO)pbQm9ydF5WbFu|4qC8BgvLm?tOg26$KQO}}YTJSB4h_`s(8W6r88 zH?D4GHo6-B68hdO1}K&7Aw~+iI>4;GfiBa1cKzrJR+56(7i>qsvl>04$o+k>64>IJ z>e?ia*$Z_p7m|FK-Kc2vp4?#y9KyevTLj4gXUH?=bv;*<+46H*gVi%c0K{b>Hf@b# z$B1zcK`0U6<~SQ5;pKMar^kU~(V<~&(@Dg$dkFcu$WBCKyMTjMK$54m8Uskft$JFbP} z0I!IpN6}VVp6jiP>BAGcTTZ}(MNFu96k%dv9kmPWvY%)w9<+w0i;U~bl zWuI3BX)aSn<5F##m0miO^1_KHW=^p0?lp6LM~x#>l}xkeflh+D_7Ts(7@8pY-*xG*uw z^TN%i6SmAFEb!UAe5a?GN=GBoFUm8~6BGRBYS@$98@xP%XPA?|DajsId09HoO6hpq zz*q_{JuSUyly$q5G-bsGiUkR;(mq4e4idtPwvP{9P@1`KJ$!ZY@|6W(+ojB&&~LKZ#nU!!vxV!(V8=p)bN3bgly zrVFB%h_jhOs}UNyIg@J~O$si71*O-YRW}8?I@vv@^w&yCOASP`P<<`0J^QxW!1T@C zs3j_=9v1N$fPGuuMJI0uaFKqdR-rmPN$F_j&%gGNtiN~#WTH3jK5Dt$Flc>3FU*P; zePy%vTxb3aU8$zF**UjSEFvhleah zR54|H<9F&?2uXt5gFcZ}hK@60x?*ey!(oZEyJBGjwdQ!_=UN?*8^K?WeW{A$@R;d@ zDNATx^K#(EJHQg`2F0E`XMbY|+yQK<(aB&3(BHv&jwZ$_MKVxdx<+Ynwl=t$2MyezPkWoT9*6r3DC6L+ zhQKj+y**n53P&C!R7vk=6Wt6Z+%^ScLUBj=p<>u5qOZ!8^iu5@hYi@iu%tH^$^j6E z%ivY`m%$4b3E#=>ZPKpfsX8z?T-0xqh0HK|Oj8l*bskdZw#bQtI`#&Q%sitanPQqB zo01U=3)`=5bKDNLA%FaMrDl6eJA9tGrujSIfvg#n$eax6RDC>F#eXdwQt163p2m53 zV%nj2cQzjHdulDE`wxY%fl$fq9kJIQ)RqE z*b&Sznzr5#hq4JokCEs*rl6Hv<82MAu<<2%uuqfb81$yoOol7s-Ne#vUI}C5qAsb; zs6Eeq_js%j0T_jv$6K}br9PNJ`$5?0iC;fnu{F~XFLoe=*D#)pY2C0~p z?=z-5tKY{%PB5x6-)0VsO$2+0VqG9iZbPE(3pX9pMMpoka_yYvf&Z6% zVqC^=f;(q#tdF1Mq5V^1mkYlYp+Kv|7*h?pQdWGXlHGew*qrl9D+TM<%TO7IL{mRKrSLJuUtc@z12ZMBAVBygjj6daW3L!EGipn9%Z z`E@IRKgt+`ol0S^Fv8#cy<#0WdTUtuu&M)9 zO*8grUXjA&$VhK`^rlIbgK(+Ed<$eQ#Nk31FUv!duD3UqLEd9K;B0j@ciE^TOe)-| z7VPj|Bvb*E)ty1r&syIVzF(BNag%<^;i!rd-(h=6LogD7%QiA6&j({Iyy^0$7n?&; zy+h1TCbc;dx9n5=Ly~vJCiBOPzLYymi9Y=Fs<^S#$mo%7VfcfyG0_Yulo>~#z8Y2% zAri9G$VB=Yxgbqvz(Us4^c=F5AiJ5wuV6bw(NI zBuVO@2v6cinNruWyqF==Ux7id}JB(yjoK#@ed;>sKH#aU1P(W4H;R>n_5fkdRH+An6FkJj?wfuBgd-+LsP6e`$40uak zI#)(alD89U#Kh!!+QE`#YQd-9t0ng-$(*6*!4f+_y1d?HDq70LPdV7V*hM-dCMVgy zTY}|K7e*}FLe%USv zGIZFhb5~`ig9g3@r0&Ef=LA#B3vipN};31A?!u{Vzqb?ej7t zb9}l_z8lSfsc_Yi0#}xdj-!aUy~{pc8d^q2ed%E=$H$9f7ejd9%#i0Y+++_(+pHkg ztDfpKL!LY*DR_#*bxmI1ZpdbA)pH_}>j7MDgmV{^WHK8geM*>LWwxhw$i6!NeIGw@ zfHM{~X+Au<8x%wvi|!My>n^^b85sRvDkuP}NNlO_m7Ba%s?H)7(rbEZFXTCs0TXP; z2qZMdel<~#aI){6aEmY``_adi*^7(k1~oVnFNaEP ze8rZ4&NVS(y6vf=!3Jlhu+DI!RdZ=AUjkOl=!Nyo+G_`^ff9n^8Gfg(P@gmQnIVpK zvukB=Q*+GJLh5TBnwJ@YKI}>F5+Cs?;q+4sIWH9nGP5$q0NCh!BBdWqHOP}yA#OGmlNmSEWhIGnKO#NxlbT3m>V()bCCdiZidv0 zM@!x~57DLt7p#Fb)IH+&qzDw@7ZXhz=u0K#V zcr|c0c(Y_P#QX#k#KC$eujb3SMZne6 zV_6BRSC{n;!NjC-y|if-5R%Q2 zNKJ1PO4~nFRr2Le8`-0J)?R)RDv5WSN37~UnwayI0d>sZ_xsJY5u0y@9Uu`}y&eKoYeMNM9m&skC1O5Ea8Cyi2ORb)UCXf`Hq0u&dGvxgE z9S`NW_l8m#7@x7J6+rP^n@ngazi||>zNd&am%3GIVm9~zgMaOX?F!oRSd}CmOFrL| z-*K%+4v$Q~cLGThk>y5W`6Jgl(Nj;Mnf@!aAb3ZuEAUr@EE_-dX z^7t#_Fa-}djg2lJ$jn!YydZ#>sLcz%15&kyD5+0&(&}g3kBRT^Or3^8KFGZx#zTo9 zzN&=+?6`Ht(Vj&jnXsWE=rRp6r0ta$-SwOQeAjHg3>=HW$4ohvGEeP@FF)<*hsI5>*V%XIK2lK4zNa5 zP)R&pyjhpJ@BmmiC6z~<&HAd5f@&nipWNj7O88LVrqnmF+unI6F%Bo!NcT{E6qI)$ z&(5<8@jCcTKXYU9pqz{&N68B|t(!eA%@YAdF>fm0t|k%4`8x_9B}j*Jut>x04aXcyClIaYSSFx;eE6+0WbW<#!AG!g$_*@OXo&9%Ww#G0hw4pK z4qbP6y2!}a;o`E_+4vxfo%M?DZUA-8J3rgAa4n{?t-T`})E!3p*a4QRK6djp73#A4 z(>LcCE76n~zAs=rlJ6MQjt|u(VQj_~#U*0?G#+!}ZE;JE7%61oOAnZy_Wg$Gmv~_n zer<@J7p5egH6}dF8b(9IKl-FGqhr3zCbmS$qd~4<{apVzaWqEzUCQBZ)_SnRxE;XF zXyhco)HwMu-pTy#XFVoq%ntRF3OiwD!D*{3$vHHoD08~HC!S#X#qRUtwiEAR>iwDw zFSUCg6_mx*ON78dkHQH%D><7;-}D18t7C(rcGCygmSvWYu0>isByht6oTeLKD{7jW zYC1+gy-1mwC#a!XJ6S&3cZAem{QUL>TIT29(u_dB;Ku!}dFl{Sg2H~Z%-!B^&u<*$ zckCrf(`XV@ks=b71(6=nSOt;Sb~9u5 zZ{+sd*=}zDXBKapV3{&)nrv|)1U(&c(itwcEhyg*&g#rSwynh!AAYXB@S+10_foyi zc!o=(wwXuvJ!Oj-)(=l0j#G_D8h8Q*Gw+DzqE<)wV1Z4wJC%`d)M`5l+S%DOW0+{Iv*-w2vuM3B@eGLzn6HqOc^&uf74TMC#$VHVeey-;Sc>f@BsuZ+d!sqMk+ zY|xXHyP-`?(NCou5{Cp&x{89%re#oSi+CG`T0Tjle!I|Q=t`6&AN*`fNwlUxg;dmJ zjo%H4Cf(@yI2qw(+Ii402tOC5-pBG{wMnpJgIuWR+{yrG5)35HXWOgzz88z&5XrbX z{@p{Is$LSU>}k|B)D>8eWX)U5;e9sHlb*}aLCkn^6So*z(-1Q^0*RPcB+@EvQHyP)-a%E&HSe`mD z1MQkg-`Adzo-|D34W5-=S)T%z#|Zbw>uZKQ`9WO`&qjAOBTsd{WfljtY;PKhN$wM? zMlAl%j|bhfq4?mN^P=+mjS+!WxE9T^T??L&y!++WH*P%VA-yCo(@l!2|7ce(cK5cI zgYFP)5_Do^ed?t$@+ zOKPl}afcjE=1C5Hb-75vmCXM>ko^<>1c@}gv7Xv#7Rl5@G!KXlU|ID8p&MGO_HHD$ zUrY{#3}?oB)97iH`@hwIKB$t?#m>bq9g==e+v)?;TL@&EW(X1>M!9uKE;X+i#VT*^ zf4>uG&CvHkp0kpc?v6H+ztUaa9lYF&H&bq~seK#+In-dL$c8=HunQx^=Lti3x2Is zPwpSRPHp$H)6~VFVZ-o>g-1<*ByVWv0+o#DI6HZDx>Ww7gz0_Z`P4{GlhA2hs*U~5 zDq5K;9g={HZ3);ej7L>z{6r3JV`U zC$=!Rn|B>2KiE38mu~XH_|B)D^c`oamw`3Mr5_eVYqzpDQ%Eu-1-+e~rmhv7Hegnn z$?)chit$L{5P?EM&kl(z;5t;fg%F($+>zt=s{<)ca=Ti4Jp~=*BfOuk-(#%v%Ez9t zJ7D>^1du7wo^idhP#H>j3Gi+l>TJNd)ow6Aqdw%2j@$B&*ziFi4|U_pTZ;}ye&u%D z+bXNWM((u+bcdzITV)SO zFy?AEskde1U2@w3<~Y6V_PqppiYlA9v&TygK>N}fk`%4tQDF1dynv!1Qfi2Drn#U^ zmYd|OTW+)7BkOmC^%@LjrU5rmg1jy;wsh-k8v0Zd2MH-)zk5`X2)4r7oqE`ujb+!R-5RxRC&P=s>KZ>E+?Ie@9o|XDk_~yAJ$|!ePM;^&{ z0riK1sYSKh%-_T|YbJRefEiaca%7updZdp->IExWE?TSQ9#6jD&60;U2p?NzfzOmv zoW-+I0+$kZpb`@2Ut$ZqqwJv~h(; zbQ=N&Jn-(ikqqBEB-a)dLYp)vB?W<-{(p46by$@D*2XI(-7<7ar=TD)G)PKHcZsxs zzzp3W-6ayz-9t!sDBUSt5<@rV;kWmG-}mfuo&SgHg5mi--?i3#-=Ec=h9TH?mI&9r znpl2XSy2Y~*$iJ)D1jwuOeH?7L3^*W4s5@(g3Xh)&3O8_y*C^WudzEC8GQSmyz5n6 zRI@=dgwQ*5EvJ+9lyf2`kxl9FicDa&Y$*Iu<2*X=kKDQPX6M=JFKrb8kns( zeXk*Ye14$#Sn{*@-YP3bu0QIzFuoPy>$j_^{&F{t0^#WmNi!1G@=>0Q$Gkz*?<&OL+;n8U!Mn$OuQ@gOs^koCxxJ|ysXw|IsL;3UR8q7vmS@bYXA=|Kb`=^&f` zxCeI2nOXRgj!>{i@e~c`zCK~+c~w-=YGYDsSW5ecz3uMAaiTb1=L~sBKg&)RvZY`3 z3J>N0*rCoIhn42W{KX3im6~3644e9p#8HD8=H@_aSoX z-Aod8N~7N7Iul}}(4HQj zAV$bvRXkigdmix~F!B?9z2-)$_U(1(l>#M@TGDurqt+owa5Ol#Zm@)L z=)DP+&^KL8Y47|L>Xp~I<_pI>l7P%*x87nn*u@Z|LFi4%g}|j%cFC~YMnFLj<_^E8 zG>*isV=E7Nqn8t8ZtT$9%XL;YV)|ymDU1ZaL=uf)3xeW5*?p?N@Ob9R;~FwTm>dkJ`j$I0>V&X#H7S zx$sj$IO5ebewo1*eoic>E3 zmkU3>E)@kU?XI;vmk8~r0oR-IylBIxNqh}Dq3Ce&(9v$DX%QQ|StD-KrX4f>W=S2W zeFjwylS7$eZAU@k zAqgGqy4*j$JC4HQPUZWIEg}131>>$aM??giOawXlh_z*~0W48GCJDRBZK`^y*W_*A zaz2ew1gxs_ZD0fMydGgiyk8flu@$pyB(LJ&icGip6M=K-I9B| zo8pDDD(HV((0@YDeh5*|+Dvq>g?g9cP_Ix-e*ZH>F-{Z9a%P-SRea{^L(%Zd(%aH> zwdvtLd8ykixG^eqhHJ|;|25*6IaT6HZ)tnZ!qnkc+4#b+My1a62iIiZ2M1d z^G3Rl05yDPDuv$C?+pX_f@Yc>>XjP@W`ZJOjW6^`q%>vBO$BS-ra*AJN-A3S;vqI! z%a!TqhYcJt`cH<##}N$>eA1O;@uWfz1~-j0c+Ai9AI0gL8jnlHB7_TGL}Is2R?rMl z2V)jk@SJ_~S>XW$KSxmD<${A~TS|M|6g;7;lZkMr=tjdqhcbZ!u&sEH@lIMgrl1h^ z>rM7S$pycB3S#a?WLfC0;_vvuhxz&}L{Lgry(QaVljS1<8qc!}wS#ze*H5UJineC& zXe!dYKs(xnlF?1=VL@N3+kbHD?HuUXYTy%WOma@;@WWyUlfBt1zGz29CQuIOEso&t z4c!JxwsI=B)3wqsl8Q!GE4G?n$X`@zfR-$)S{Spn-5jI-&aXTAYxu-Gtq-@gD?mBgK}T( zP7zLgj4d9WXpF;d7A|^k>@Oqs<(LKyA?gyfSz8<{Yvd%$j|n$c5^B$#ar(;>5UyBL zOqj6bCAT(72&j&*W0W^(xf5`sB@ty)M$QoiBro-}^Vcg!CQDok7uP^9N5j{70wLh4 zSB4S^m@DdyZnTk~v1>T!)|roV-1~;k$>L~fn+^Gs3f}gv0+{+1r^oHT-1+cd4G%Z_ z_p>zD$2T7`dWlV^l-VUHod%QH*Lg3I7NmJ#%%6|c>NoOAsx+OtV`X8J_@jNU@lMMnEt)Wfp#c?`v>kG z++j%Do+j_|-~SlY$CTua5sLt>ad7VnC?AtrF-$R#v6=7j5S8zuASUD?htoMpBeIHvf;`QoKH+MKW z21N~XRy$%B0xCt8d31`8{i&+4f2vQ@$;d4K@q<4qQY9ulJ6ciVb=CJh2ix#k+l0i} zzFZICi%~fa3H5izvD6iWj>bRIaqpvViHD}+^Y3TPR{ec6Pmi`LmFdt-)Wh*8UItjk z0^535xH>C;6Nl4J`Jci6v=_wUaSkW!o<@IZR>jlKLKjZ_^FCCXV3^#CahmQ;xRn0U zS+ba3qbs~zjU!N7Bfdm)8iRc5ub$2dO*`-Op<|{^NEP7^yk*_vEgA<7Ai3%k)Q^P7 zp2TzEL|sXv^X^O5Zw$Ox?Y}rkmmwhaI%au+5!7bXs%LTnQtv@^v~D{YK_B9OW_C8I z^_h^X^F%JI&wgACLH+_%j?h!cbBuu?bIlsuRFn$$2rfJw?N{EwX!t%v8Xn0v-_LcY zj>E^EV2T^ZHVelxTcBv>*dc8O!jM;%AsKT0HLr$hRIh@y#qQWKEsz=ieqMe7>8(T? zI<00GV+_y_ev1VSW{xj;8y#c~TF^P$7W8}J8v;Ilf$rxHeTZkOo|Gmw_|WmJv+9JF z;LrI>&#k@rRVw4SV4h~a)!i6DT4q0C*Uoll9n6iGMw&mtey0)JW!0B)DxBbQSL`4s z*F{~x6g1DxDOtGn;QvhRqV?DPa9x*--z8SLmg%9LL1x0fLEygBMW;=$Stv7}PJ`>F zuoBD}&iKuCZDEj?d_MBL61x$HCmQhtlAC=HPE7UrMT+Q#LENp(0+W;IOJ!kjLFX;L z@OP?Dfuw( zep3khp!OiO1c@?HV8sKnMC-|Do~Z3NcH7(;S^WcdtL}{5H-OOswc`5ejD~eM#?i(~ zpb|-)nc@_i9lxOST<1;A|6kkIKZkMD4G5z}t_SA@#oRbj4I@ZnB0%!g*} zY6#i>K*pNxh$vb;#^T%8MVT6pA5{;ucx!fDIc!WuL zQ5yAwjZ|H&L7Noo!V;MM#-vG-VevA!bLtUVUuSEOXLd7!EPqsIi3DE^ZKy%V3n<8Q z$?Fn}yG}e1{JdWsz7`Rqq7&np6dqWs1|2X@_`m5}d^rUk{LCTY?}yyoz-v2OIe6cp zX@(4X)@1{#;I+N%y!Zsa?x&7(pBVy9-TXyMpcS_Wp~Ujg4r;7X5|F@3D|w~RtO??Lbuk}EmH-6Z;%p7xqh`{DI=j=9-}oTNXQg?G%UO_txlnVW`?#(6~v+6JTLZ?$2R*Qf1280YTaG+eonc(_`%6#b;J ziJ)9(Y(8U}IbUY850;*G3)nK4z)owqs<#jar!Y#&jBzp66(frx@MX`g+5P(2bLtvr z8FCoi*N`gYVZRde)m1c_*Mw}Qi;hmuJQ3v~XygZl;R|c*JHo`Wf~({T{n} zjs3;(h(0KMK=i2jl){_@#JY!$XFY4}ivqgom0-<~m1-~<3-BRuj&eqzeDI5`r$$3b zUtlY5==Au-4Fu;WNhtcBO<`xY|Hj~@Notf1 z){~AZyqh4xa}ghWH5rCik6EFZjug4s8Zphflv)-OlU%ByZ8d_}5yHxs=k~ zBnCxhnFIR<)k|FmqE0vtEs$^K8q)V$%83m`tD1qla5BIkx=}wb{1?OtmUF^yWVQRm zi4xdl8BSE-BvKI7Shj7Q|NfL5wt=+*fnfmG@GmM<73II9zW{hjPT3J?yg--Sh&`v! zwVk&ZcxSkX?bQURdyG)r#AwH!#c!;FXsII>xy}Whfl(5 zo!|j@n(jS|A1Y^TMS=N_HOwU6;a?`wSNAld+^72X!BEkorgv={P0K#Tw zk*xU8JxU{a|0z`0p<;lvBe1)7ht&)94e~ z6yfa<#daiBl9-Mm1Veo0u9t}B8KXa?nQ>W=;=)0%b!I1j&@VWPtC@U53>Ae;k4dm2 zcp=L4nHK)O{qB9eiA&yY-lP;@~^PlME>Y?;FYE3H|Xs6@uzq`yIZ zJ3Uq>YtO!ZTx>8UZzDtEmr$Y&wEH?$1qHHUx3)LIGQm%KCJV+a;e2N>y#3@nC`%9L zHuean?P*r!5a&;b1Bo%U8SxqewC=l4n-QR>9s=Bws+F~%9*0n5_D?mV(QeGmakVci z`*Hk2Pv3m}Mbd_i3#BVoEtsdGS{Iji?49N%gGHBF*G@&3M^>h<R$Xx5A~mX~`z-dy?5_zHEiS=x(JymxDm=4!>2|WUC~07y*pZ}H5WrSK0c-!k z39bop3BIH>djzNso8N}6Qcu_e#6AVQ>BfWRhYt<)x}AmKQb!f~ME$`=5XjJisQR;a zy~b0vjImQ&%?_bDahk;4-2+_Rmp>xf@P5wfhH#9Ntdn}sGFJ)D06`!soMSF`oSSTbd~8Em?gw~|-ss+pxEoeve-TE9ETL3*!04 zs!nmC0WBiYA-`1Ld6TrVuwJcOw6AH^Q)h@P(5Tl4sNc=Pi78h1hZ+s6Zn zeG%xc<_xd*M(z)~5eY9eMbGuv`4_%08;RArrenUdRgZFyMUsm+*QK7!a*D^1@n(Fd z0L#zcPuUN)v;Kb?H%kk9d7pG!X(Ql#uE`kfg&47s+4KE-!jn&lOoQk$Top+E=90C1 z|6sL8wC6!f@l27O5gI1K)1hAaQk-s&>N0!(YDaqJye-+&5S}&QKPs@@ek-GM*|(12 zpm;>=lQ5+Giidj+A3~>lGeO^Z|vtQ5a2bT&C zC7lflZqq;}@~RyWDkw$g!$-#|b}$f|i^4^4!ouuEp3icNyk~xc9PmU6mi7vUQ=~+qNRM7PPQGX7Mu-=-Wg~fYNG}j%PV)wlgBg5(XV>R9WGd zf&6X&Y`b?!pb$z|ZCtFvnA1*wzG`4P4yM8LySFO%t~vLE&OYU{ruUo#b_UNeGRoIg z0LXHzrzwV!V+W}jhbBg9_N1GM)Z%yILdK}e(P7`dj?`6l>JiOwU~Uhpf7`)q@*>(w zF^RZ^bXVxl6ynGCj@^A8*Lq*)j){C@x)@SRXq2OW39;!|C*O>Ge)v@v$uP*&!39!a zhA9R6V1^~Owd`?pp38{#EC5_VS1Ag1&}wHO3#zMMS8rMkiG!1IJs zg)Pb(l$62JF7c3cFiz0*Jd*6lpZmdqr35Fx1Ma#SzxKVKN5PQ{!Ephs2WF9D zli`XDe}0GJQiaj9hmO+yjPL_4^(Y|#^s~J&VQ-a!yB$GJ6sDur{X(uU<4FaDh9U)|3O^ntw(zX~uv7S#Ir2GouHznov~c!mDYj=I%bh_zxzi0S~dX)f0z{R{}F zF<86tU)Ndtmk2S-s;Pkp=LT_Sj-#e6gSz7sc%gI7N(XNUYR{vdV!W7>sKL4^WM-iP z3v8UK7YNQ3NrLAlZ1*sF(2?C{=xt08E)@;~=I>}jmnCX$T0Vs;M6G+rmA`?dXJ2Xe zEAc{!krBgvA>>aEt(HD&(D3o!PE+!5+i1~;hD-Ji3C0YD+WQbCvR%NTKCloFgJ6PG z!HK6>iGD4OS(*^SCFgF1fi7092YT7I=rjb47Gz5Q>~HkNB3Aca67c(7XJhU12f90^ zjth{-v4vL|mehOt@a)2bUlSGxGv*xOn5`-4^sH$6AVV-80SfgmmA zW)cBi3_1LmVvnSP`6Pml{JhtsZGTGI&~8P$|&-xD@_Q+15ktF4Aai%$-^ zK||<0F{HR`)SS&gM`Y^5W8`f3gSY}Uh>zHu|M>M5FAkR;7d-ofgYgb$I?QHB)*oM$ z4z^L9d3o9LH!zen+7dyJ%@D|ydjFK|{l}r^P}Q(kTyn!r)dGxF#vQJEQc$u(-DwGh zFBhF33^$>OV*&2)^ojCksVZJMIOhTDuQJ~t#1S@BmuXOpS_pCUe(a@{eTyf=J1s|b z!oES>jABvl~8?Vx!_k+JF z{f8mKZ)!FsP3!{P*vVZJ>3gU09mFFadmUizSV$WmZbF0+Z)i2+h=49iILuBGPS=0# z@(|brsTnY)Kmy|1+LHw#ICyLB=9wg&l$W@HpANA@ zZEds3+)LAJVG^=**j1&rw<_gkp>ikoOiQnD797^SLlwiLJ)rv2E{S{6kmVus+=>Rp zeBF${+h+j9QXas5T517s&~d=N{axk+2I5$0PqR88D=ZQ^tNgdDfFNmXja*#8ti)mD zjI$tCNkf0R!^@VI^`EmDF1BqO-qfLBw=eiHZOQB8NR%kv?g*3-iZMdv^p?Y%QTaKG z!0#UHvuL@Ys7{-S^w%ywhs!Sw`WlG!`(|m&Jz%uMzhBuX&5@tQ}O~Wsqp(|-ES!#0ohHNAK#N@0X zkZz%bC;IumupwaeyLbJV32ZdJqvN3e;Tl2#i=4(SUxjh7lh_Dl0pO6ic$l{D!xPG^ zMVkWh$1f`AW9;*d?>leXt|N{5Mb|=K-XZ$TQuT{HCEAUyEEKXntC9)8@@Q2+&->Al z_d353kofW*MX@*M_rHhqiDmdk>=6d*+u;3118T)mrqXMvV_>xKsx9W1sf#Sl+7eMT z(=2kx6QsZ+s`^vJ*l01YU()A)mZwZcTuQ8K*q)8V-dZg0LWGuc(ipQ6=TFFt0G zTv}49O*D+uRqSWp#@Hd&Nz-EoBmcM!^YFdJc6bY@Q}ri2$X3YXUk`h%zfaBjqtf(} zBf@B6x)-ul3;H9hQC&tk(O%h_~SB$zs?>nSTO*g9epb4l(tJQ|Pfp>2*y66Z13CrlxG;<)**qo9lL@(oW&%Vzc<> znPK8NkKZ0zrrq(Zx-^6Q#4w>ae%nAk--IU}fZR2Z4;=+KHYNopEhX3OV1FUKPf9Vo ztvG$#a^aJe;UgN|F>8CY-W0e%*tgDW<&8nq(KbQU_pqGmSV{iok=1+nYa{+~Mhq=n8A3xOTlbCDM`$!OlMyeFsZJolKbC&@g)wXaYf z#iN&Pchj|20jhAm_!Q7D+&>;Nnz1+G&w}{?tkF*CBdb7V_mu4PTMVd21)EgH3<$I< zeZpLre|`uwP9^MXy>@pCD-T=fa*p0DyWd^s2RzzB&nFqbbAe*&jNhl8bOd>t-VFM~ zzEq*RLhg*k(`bYT{y+nI{^}yq*Sr`*_d>&;l#cPrWWF9uOfI})ugfGMkDQmAtH1LD zC{;o4$^$varN zM%0i$2wcN3JxGRn)-Zqp>+|qbH7q2jDxrvD+n~)LdNPQ4B~Z{a`-e)@hGcnPNgW4e zWDpL%13A3GOQn&r4}Oz zM0M4EF}vLn7c1vAj<>l0tct0FHB@}2xB735eKSIhXa~^8-;5xlIqLh!P;+y_+MU;4(+P<-7g4yhn;irJ9 zb5BPlOPKdF@FMhj1pYtrkfH+GA5{v6MXaY{-qCY0*&SQ454-EFB<73yq zt&a0DSG!jl0d*#A$bKck_O_Fwa#)%>5m zY@6Y|{{(#XK(r+XRxwlOT>>U!gk03KaodbAItA!z#{!-^WJ0Adu{q!#KorSX=fN|2 zG(VjO&mw8^-UES|!F#~OtPqyltPqIN$>s96IVhP=Z)n;!woN`qfsWa1>Swwa5_SVeP*wz5ULSS zMu7V?4PjFJyI|b)x659$P1vLZw1m$$C2fHsdxkeQCq^9#AZ!i3K%($yaH{Mm*F8#* z&hG%+-)F!>uN1v6K9cZmFTk_gwRpZ$kuNY{JWL=2ED3MwgZ@VO>-*Y#@d@iFK26sz zLddW040fQ6TwRTd>7*7GDRQdNztGru!8OQtm~1lf$xxIkd7X3Dz2vs(D-f~%^7A&a zi%Tmbfa8hfJPiN|+LCc6PerXf=1pm;F5$~9-EUl#qu8j*!mk6qI)HaYcGHWFC2GCk z+jT_l^#+>X{%edi`W*S#xD`m^YCL$Zgs}n-?-RiFj^6U>=t}d=?0+Ze!;WRozA_OIDZJKsCAh6m!#1&k45Uf67g3LX z9!7_I=OY?e(h(Sn$rLyTpf*P7h^`w#*OA`ZC!s7V1`vN)3b3?1x8~7Q2UVNKr&UIs zu76?f<2E;e(Wo1D96TXypIW|=xMoux0i1~qZrWdKEa7F4!gf8B$Kj_5tvfq}u3*3n zw62ZSV}_DpevC+%G{gztuV_=+06?a#MSEN}xb)<*wCrcACc!9rh!;?x2#Q1LX`s$7 zJ0@A;F9WY>2F{AmGsVUo??|o??NHM@96#al*pNv;C(yYFyV#FEX+RMjfd>wyI>01paL?x#GWns|qk(sldF30`cVvD_k7=LHq zQM7rOAJ|rohemqaP_PZ8Pl{qip8*H<5~p|y^pQfKg5ZzUk#HWp23 zyPY0YQPn2ne*=roxRB>Bf`2J^2#Z$U5VKE{{Yy0Qd+-(Oi>LvbZq5Uswy(Kzn++@X zxMQBVM@RnQ-#n(lj^U#Gi_dvfAL+=*f>1_yT?E>CY~6Wb_sffWE(Oh-$2Pe0b%(8U z<1kd~^UDm#9QMQH5Bt>)^=7tD1T|@tzZ5vj<=q_xFgq~VN-O<^o@Vk0($FvfZmbhw z_pm!+N|r$YAQIq0bM+pkFQ~ zv^|rf10d%})X$oRpX24(H@htYED#ZDr*_~@x~IzJ#+aMPC%T>0ZrAC>?|Zy5N- zEFQY(pP*Oo|^tbrqdW3{Fl+d`Xb1YZPsDjICY^Y~-6QN<>v^`>*S$7}Guf}`2G zE-}tbaVy~Wk>|D$6>$`;-q^>`vWRcBD5mVd{Jr}rsotz$(#r+h#7y0EwxXLRq!}Z+ zM3tDUo9#%rr9<=!Iwu1tvaP^vX|2JXQDQrCF=X^m9kK{S^0w=F-$QYcZF(=OY3^tS zB%(Icf}Y)VVsb$o%WIBPz%@XnJo7GjM*zlv1}M7 z9f2zxMvHA_~vYrCL>EgWUHat0?VAPoCszwPE|n^ zlXDkgjFnIqjK zzEV~Ccy{SYXG79SWmNP}%Qy9Rw7&QE4bgq~$2S;#T;R@h$6it@;a;ZRkLF!Ak?;ht z2*8<2OYR|04aK9wRl^yO5EsnlWh{vx@q%7;c41zo9`a5_M~*rx7mjdm#t2FIn(CW- zhDpvQRbq{!+hqV0piWz#2pm7xH3M`m`3-Ri6Wb-=x@bv$Yu=86h;N?oBk?K! zc_`S%@v+!@Dx1U~1DU<~CWeWkFo%7VFEq{A*Onbv|L{vQ9aX263_rf9%kop<$h9XR zbW$t?Nd#jfji7^Z@|xjjm|vU@Ld58mzvAWL@c((Hd?K)!pw3DX?6Lxo@eYAX{&<7- zb3QJHNz35NE$?h<{bk+n?y!Y1uPlZ7?At*YqWu+GGjpEF{B-%jW1Te zNeJ1V?De9Z_yK%bn+?Q``{FYaO63Ndzo(5#ydxA^tfu0}Z9tjn0OzCl;X~^U?N5P5 z*TlDaK4mw14mnkOa=Z12nUzsh1~nkP8f7>*xp?NJgr>5yzU0L_>7LhseyN3lD~bCP zz2dINrA6q+G5?!=sH9R+sUYnKfbhOt((#0@Z;RPMVf0yTM0I$E43;rIEzF5Jp$=u! zmF@Gu#q`JfQv2$?(B>|xvdGRfnUfcLjr#kLCS1Xttnq`N=9u?S;eCq^YJ8-LcSvDC8%RaLM0&LyKc}?c__?RmXA6*L{*NZl9>*l2Ue92k{{?w6Hx> zg+>RjeLdbOYO>%!4`33mBuyp}Y#V8@UX`-54P)b47d|FSdM#`lsQu?a{3q>JLT(IglEG5zJP zRU$3@)rxK1a#h>FZKhhQJ`Ra2;IVi2=x7n|Hz1Bo+HX>-E73R)xgcfYJuLQ~$DND1 z^#p=-uFWz8PWN%%pG4gva4wmac^ZA%0K5Nr!=v+!i2$sj55C+hRMor($Lirc>V!Mc zz}}jB=4V1)l=1O(U!7940Z@|r>GnH&e37s&SWsWl35B=gefIBTehbkA79q`hmirH_ zw!p$9*Pce#+7iPWAyU7!%g3xaVrCcv8?5BJo$A}wbJWGanFZTckz|WEe zmq^lG##Y`^po41OPxs;u82vASg=7>UUKb>`c>s-*uIX2XyEdU~rhJtDb;cATA++)8 zNzu@ui&0w>{D%cVop+T0r6PMX6IOmYaoT8_wxpFy{Jf`bGQ*=o7AROXEcs(~l|6vi zZmEpx3x($+1oPA3a&8Y}%Gy9FeNV@;;QoZm%9!os(?_0T=zWPuc*y=n5{FJ1Gib-k z<~1ze9jN0e_-IN#IU;choe}?d-vFVQUT4GJW1!^ZFV?S`FQ_%GQ`ptU8F`L;(#4Z! z2(30UHwXn1)((kMlHcB z#0tpz_B0e9^rXZyf=ohDAa`OFzeEB<06n^)_GlJOGF4;~m>{oy*w%FisBu1QR2gbF zaqodYFt6ZN!6{6`9{x-`3%Ad!S2{HA1kDwAp7>!eUO;8d!J&*zt)cM2muj@jE}iY# z9d#_w#2~Avb5&>yw_)s{?JJQ_s+#n%K;1O$ke3hq%BzmE&v)0Xn37^CH#9(7ETR!E z?9lPR>a*N9xs~jtbjvywE^yR-7JDuE;2uBww)Q&qNM@ztNf@t49}nJ;M6{$W!^KnV zJKl5Ck82V=+Tz=GWyVB82oHsgp5j1(>Gy>XP#uv=d2OaXI#y?{(acI=JjJ^6U7(5D z&(t#!=ritgO@WB4r3H~>A509+i)9Q4*s>@M=y?aAovk+Lm-Q5#ejiLOoAd%`9P1x| z6<%{?b>4H(y`lmNy*r6t0s4f7myqg>fcLU*-Ep-HrcCFQ2f8<78~}E-(G>?jt)PTC z7pBSW;9ym_j7l$6^KKE$1`Mv0DLqlkkxyR78_~8(lm%2%=K^8CpQ3$4^_vLomD~|A+^=( zM7{@t2bjsu;9X5!MYYb0O#EgW_ToKH~T5!u7QDOaG4K8xr$# ze)DKu5RsEp_Bim~B4XSZ+%oEnu|aFD5U*s#)E&)>@LpR&N5uD9c>+Ui6!RE>-p67S ztC$JE?B)PkC97eMb>s8nR=*|PPJq(!_bL~0gIYqk;bn9P3!(>x&w-86X`h7=Fj~vJ z9gFtvhX)7~deA5gCcnGMpo z{1KO1eIm4mXUT`0#~0kHY=+S~;{knFV$q&zOT>LlDcWo-$9bY>B`hO@L3ULJ-#huh<@7-j@B&!mvG7Q`8G^taxi#y$Y3`w~GM+99uUUt+#_ItQUa zT(kLK)EKn}jAqyijyzk=kAyTYPnMObq?i#$Ofm){2=R{5>1cSoCkd|zyWYQD+R!*Q zeDRQ+V&pgqmqYS1g{&)!{$7{XMQ}$J+m;{7EMwIcG@{9;3^^uinPR#*Z#RF z-|tc__W+N~|54T@#B@ko?`t|#&bO@)dgWnN_TL-4+=u00h|&MOxl3^d?NwWzKzYP= zHVG4>XqU1+RX(ptF+Y3BHh&(qQg`ut3s=d;YNx*?IFxLW;6C=}l?I_81syyvfE2&) zz9h3LU44SEx^?5rT%mmJ!WCTXmqOgv4SSUO2!7l`mc8hh_563&50&7l>pL&zP`uE3@u9)0|+Kbd@Qc zt`3hQ%c;Ht8VR>QdHm_wV=EcO@%vq+PEHWF@=g!jN{>`M7tuo;@FqT!C z9>=WyMwj>E_WXK-Yn!##R>PNgy?nuQuH~kRlD}_m1ZZ80l+JYt*u35eWovuZ@urHN zsx3fIw|bE2mbU9UlPa$HjWzE`5RJlgMe8FrA%ICbz5XuNNNdFu`taxrZ0-{(lt zwS=7CCTVubg`X>U+gS?VE9H-b?QI9SIMqF9ekL$elDTg>vTwV;P?f%XOa>CYW|N7b z2_Odf-MrgdfFVX{W7kzw4b<*4t(@JGZ9X?{PzFPmv8mG}eYVWq8l%j&t<-{4krg9c zRWp{Ee{I<)=Pp?V8oe5Zulwh=&z6i%^t3A8c*`B~>wD<$eWiW1Sw7Ka09$5S^uDj? zDz*rh)aGr9Og-FnOPb1QV+z!;c`$SnhJYsa3=z-w8S*p(;tiF;O4r4WWwQ77 zgf3!itKx)Hz4P{P`csEvAG#yIFexhOLpf2zhLe^N4={9#yE(#=dx|X5JN` z#ZXY+39?9)Fv%<9cGflZULJb-mZAn)--f%E!3w3)04O7qi0uk6(p{HFB~v##+xPQp zO`jo#rH0C!<6 z$stS92Dh~(ashuuAG6<7uOCJbFW zaa`R5->i^Q_r}ogaR>?EEU8xxa+c5{5vMQvwSrHhtcb4`QCxMZ{sAeWs&$_>iCW~P zaof%a6w03eKz-ZA*?21Y*YUXi0Ls;aTVt!nf zYx0lYp8zASh!XIJ`yJu3OTELU_eXk7)R(N|Gawa1>~~FJs|OA~9y147e^-v6WrFJ* z3r&$ZM4=xNWSK>jnyR1trH<6D)^;wbpr!3E$|az4uj2sf2!k7T6$y)|@Psqc*RruA zhTcD~Cs)qoKaFkwAjn9k&~V$#T7+z^C_Dg(!^!i!%FCZ#sj6I?ELop8NQ1Xj+T0*hogpG;+3;|(z8qwl>uS*{tCLY+eHfL` z%xJNqJZOA70!A=dm)9tI1RWuNZCD@Nx6hbUL5Ua(4ZqxU{Xw$Y^|r5YD~KJ8Od z?z6jFBX{I+pHaBdaVF$>o-umRqI=@d7>C?4pRD!f#P*D8`p65|N++Yw&_7UhbFasS z3aHUmj(WT;J}wT91Z8ocbD=tsb+FR;<)_;tjeTc1Ho{%19FNp6E%EmUXWvWe*Xk74 zGXcf8su5Up5WV2^-jT)7>z%cYve#Itn((78?fV7Ju!^(uYB1~DD-+J5@VZUWx87tU zSqHFtT(X&9>$eQ{mN2gr9+x+&UT1=?sXR{G@I8$jVxOZGZaYcr|2bAP&-@1D#YUXZ zlpSxDowW1nkm(NA%S1g(9`pE1v*1Yo`k;0NdN)`7ySB-uQ;)K-FVSOlH!_by-lrU0 z{jeN#%7r8H!|Ew}6Z0COhnhNaOfU2jt#gH6CSKg%qO>SqCKi=(Rp0kCML9ce+|(`l zq~%rthLVVD9zAqYLv#tFNt>VK9CJq@U141h=N4_SL_vUXnxk(tE+n#R#Xx&5xANFh zg8JN@zsyeSuS^rbX_2yYAr*cziu8PLR!Pu3G%Jyz*mX~9p^b?JB%HgWq2^KcIqPv) zbGJuhTgEB5xZG4d*1-{k%7j~FgiBStzGo5;7xiKBv41R4xENhZ@U6VmvAl#*Qf#Z8 zc?B~4^|(TFEl&tRSgm|O_}WC6bXq`t&lFOo+E{@7{><3a)moh4kYE9;dsd0#dFK3- zP4R|M;=Xu9McId>D7(hnlE3TpjyNRrfty;q8)j=Ao7n&3G7Qlc>=1+d@Fb z5KJ>l!}~Bb0dkO+J=dNmP=~dwRm@)sUV!s*=m{C{iW*kT_Ll#S6j_R#ruN)^J8&_Y zuvT+ND;r_D4G(zXEvqH>Q~sGkxMt2NNm1!MXJm5xP`zQAGp|*DtBbdb=Y85=E9}t`RyimNuBBGAkCgnCt=2`E%yeXv!o`pNc>WQdUwP1sw^TG zem+-VHwEr1Hu9okWszIR5m_f433bYxS2{O&_ zmc+%^n^df%)+Xk~4ZBcJ$miTFjiQU*_uD4 zRWRoBeDu}>n01D&?>J!Jult3?N!9rm5^$W)<=jR*G`9Dozo^hGQddPRCg5IyN4Y&Q zcQ`IsOjOpb_DA=u^X0*A*S{US*Somu*2eg!uJ_%nD!`Yu1;QM?WgJB3^}%ueXF9vN zj9!hUBLmj4750~%-q)I5dksZidt7$7Lv8n1dq%E{$?EQev(qc@+$isVQF>`;QHA06 z=*{ok%9IeO{-2u*IAYw$x(YNW)KzBhauEJ~^u)Xn-9#$U+(^-1>e&*-hwwG^A><55 z;-bA&x179GADy&>$sb})#5MmB@s=y&T1fRw}IM79(af6wv6 z*d{+Ike0p3M#X6f`>PCwcVFRkvOO~I?f~R)S4$U?>lq)B{nctJ5+VHjJuN|9Zm|I_ zU2Ji5aotrhBZ~cwvNe^?xcQ~Qmoo7VXU{smf|tHHdCAL<2iOUJzTguTFc7XyD3=$+ zJ)H?afji?9JJu~WbGVghyr|V3DAlPkjeCDX)9K!*`%rftO|qYNTB=cSwz4wCVP1Ql zZfM2Qv)xcO6Wu~Zzni8~25s5oaFF}mrysH&m_tc5V^60YSy+)Wx!j!!cZ+(&-DM^&(r6?QF1}Qx+&A27IAGdd zaW7gth+A|wEeM%t5@m( zB*kE(2!4)9L~`42<(Kn`-=h#UsN@z~JjGVG?)0{RZJoU8CE!T-dROQy4 z04)#mH2m((ycW}W*%{l}#Amg+PhY7-h1Q73q~z}Vjs87jFLF`Hv1bhL785d?dOsV`KLMg|FUyG7MgeD&N1aAIF+oTl5DbFqRHtIRuyY_*1ha?Wu@ zcW`0MZ~d^c#Ku$?%;+Mu#fJfW=DF42p)X;$8 z0{)Ay@CFkm@RbdNyR0=(aiMptM4-1;1QYDd(7v z3GRm|CL-+!)Pi&XI4_gGgj z^h|ace@XFqqXKB0Tso6%RolrnvT?Q;VNmd1eWO?CHhV6y>|EBJgY{>zq5?s~y(p!E z@s*_nj+R1w8b(q35%s8frNLP<)3;B18Kqw6JQe@smb_f)#Dj?SvBU|&^@8SvWILMd z$YfJoMavS7=E^lUkz6Bil2f>UFaEc`$%6jLUm{{d{MH`R9d4cNlS-W|8QAUE zd_m%x-wxKuoV&=or)vQ3UM%7aV-|>`?D@r{AeAi(w(to0Oc5LN<&c_!l4LvHqWcV0 zXgG`Y4_KxsujyOJOE+Xzv5D$cc0pc`QS^DXVV2R=&c*op(Iw8{T^he*`lyMppK5Om zXCjXJ3mX`ba0P4y?bIrjPN#|AMV}F8WN(qwe(R5C;cEo(H=hNS6vdrQ&uHe$domEW{f##5`TA*m zBzO0yT`uE}UT@5VvcW2JY16zg(#@7?ySry1ay6Y&qmM2aw-nX=GFQh)QKT|;$l9@SxDSC+77Z=xi& zXx%U2)K1IP=1Sk$w-9<#T6y=AO6RhgKtQ!X?bK7_NFSqTwX=8uM z_S-zg2B)!(3>@GfQh;&pvwP_bM$GMzSDq5qFRuk#IFte4>MfX|ZmN!NpHQ{T2cOh` z%DRWjnB`czR~yb#e|ugX>%V*6Bg821Ud_RHow!b=UOKtu>nGd#<7>gW6p$le7Jfn8 z7O_uo#Z+$nK8J26zXtW;%?CPtWQ_Lpp1D&r6b#}S{|8TV982O{5Z~#7Bp!r9#TS1R zuJrD2R)doI@om3W+eLNuc6T&t8_0ExYZcyV9#^jE8xOnAkf+c#5$0}IuOmOtmuhNGAF zgGO8np+;Ec%&DuOt(s$A?S=iMN9mT)J32vSWVJM)s`rQqXaGikZx}e3Rdxr^2pkFa zMP{AA>3;9_^tnV8!1n#}hyRf=9YTB~Dm*_XFDH0@(N+9{Xl<~{*Vp5^;d0N7reg)X zq+X?8BZq%!zD3?P?`t8Fc-IHtT85VxSxtFAHX^{FbGd>NR14Y|6-GJOx@0u;ZmEIK z8dx#(17nt8-w?!_cdm40;q#fNNdzs9Peh1jq&wbSL@ik*B=I}TZy;yb)WE&iUb1vD-^{_FtM6K_}EnhDbIW6W>AhC?-n$GM>t%vXVu6sRi5i*ln162Xw`gZ z@8Muw5Ivgeh5kVGsj8oq)f;bZ$j{sP2(&=jt?HQigz(UP1d!r<_0rYcSCIME+Xj|e ze0FVrUi8Bg6k`TBfT_xWb``Hyku-tj4(D~Lp823|r3UF0aCv85`L+5FZ1;-2GZ&Mk zbu*#*!Av1A@Y2(sjb($4Ozu^yxS`8EE$+pKDhPLXme27}dzfzvb{q~pg8!c$0rM3% z`aK4zIg}FQ*G|5MTJqYxVr#h1ru6Rh<*9@+4^E`egm`^zq{MG0ycQT-YwRM`=$@39 z%wl?u{4!2_9vzG9+${<>HAkrHV3wLAR3}y%POoSi2 zf!!2Oo8t!|%KMu#iSN-ro#A)7KGrDcTP(v1=cFcJ+FT0Hui$fYvwuM?Q8TCv-|BQ; zb5#QkJ9O*3w(o|!>?yp8JJX%aMx7~IsN!hnzYwmxyyU%b@=kT%LWPH0Z&P5I=9@l| zDiaH@DTOQPkAVK)rk=oA)4zWB1?YI9?AGr!`rPRe)DPEb|7DeWz}<#V&{kL4v6h^{ zaQGIiZ^9x`|dIZOqG;_8EKIkN9=q@ zVy^=fag!kAJyh|>Rh%LnOCLTA({~Op$ZgFngxq0|FI@@*1j`$J9hb`?!}}Uw7rYlu z7z=oZR7L0@JEALd&9&qDU`%XTVBB0jjp{ntse3iuSk0BpmH1xbz0-VlSM?4wYlb?69jE04vX(#7 z+$3-N*`F>>zU_jcv%7-Kg_7(q2M@a14tOsciByZR@$xII@7v}o!GAhg@vFK+(JbQO zZMrvG64XC}#ntCB_3F!O=hT3Z({WA9_aQPT+}bJz_+;EV`3O^yzus!%QZKXGJE2+= zGG?uE8rfqdzP25D)I+ZvSqZQ0seWg7KR>RNU%nE# zP^6t}a^kzMEBF_r`6d|BS62U)MtjaTIb5Sif^FS=K<&Ts6~s3|Z*qF+GiKUkzh*wt z%df{4&Y`1=IKxypV?MgGsR3H51ND;%XG>v1>d5_iWLOj4&`;ghUPn#=$ugn2(?>L% z&;-te46>mb<9oWg!`jk5k}0u9hm#wa{~Y8WC;zx`)}-()6ll&V`Ph*?=D~W`f{UGC z#YyZ%A65}6kBtm_E!|77!yrVBvc%tR>tP4oma%ByXz8Vn(p(#0Y$3EhfQ-s}IxNW3 zsG1-VXU!MNi(X;!f=a;3y;=FYV<|=7|6VSz)?7PxRVyD3 z_ekb~0M$PeR>tqm^%x=!!W(3#Qoz(;MzjuXvMD)DJ2y1ObZcAW&d7GrILEWAhN6=b zB%;n$UEkW~b)`z>#d{4Oqn;q+$>WCZ++s^kJ-iN0&>T1iW(h?)nZBpU%@u#YzLV0Q zGR+*(%noXGyy8z+K&Z>h-S>0f+UA>^RC364q@@hx337!8OHj66Zp&uNz--5|^w*y@ zI#@&U@MmW*Hd>&WOGFK8V4hlPPt=G+tSo+h8WnJmyv7r7xa)@Z!RAZThm`i{T~ykH z0c9H8X}K}lRNz#2o;1Yd!nvLzy-&N40eHZg<52B;6YEZ)kru_KnUfxE{2kb8XhZ%d zWDo4^TXI}kUII&$!WrjfV26H;d;)-puSVw~>8vrt9#Fl+)O3u(FO zpY)YGd2N^WO7XmCuy_&>bd+b+D*{7~deEnY8dauzoxu{|nOO8}X2Yf5c*Ud9ZH9N2c zpbbX!)*jVFw7I{>?Y-!h>S6Ybop%1x$TE`$Z>9_@II%tPMm$-c!#WWMWUI6?F*(d2 zXd0DGF%j&H1xsVp-ZvcZQG~5MOn!19e5phW$&^JnA@Wy105mi_5#K_|sTxwL%fh9n z5$Q$B{MzlG)lHiN%T|^?dH1`9lRzC`UBlG9)lpvf;a)#0kNOdUr-$aRgWgPrZATCg zR;pln3$$n!H_tMTn2L5=fw91j`;*lfvn9}jc4xxbw6$`S+nyk_Ik^m~NsmJ>B2m6K z?}5693_n&a{kVltd(S$1yw=Rqs7(+yOuw`Xj_PyHng<)azaEHOi}#zBs6z~l>%f41 zW7sr)p#uE@%$q@&zB6WXS zvipo%b#9;$kEf(sEy|0FL`@bd|Ko@9diZ67q3jiH(+L#Jc|BZ*`{DQMo8g)=xQ6!C zpt9$k9yIh7j-<*DGp!sUX;!{fU+JOGyTO6)-7C3cec~}tN%ULd`L04<_Cii2t7nmd#RX%RD zFF*?$6+K=Cpt{N~Hy3snZOB_D2LbZzSYj`RrOHQ#$uHGz{p{NuG08ptZ?0D5LbKXY zKHux=$P7o#rIPjGHqSXfe!FFZgzvla8ll=YZ|yJYpSEdMK*s!^5Ht)hM9Y7Im2Rryg$wJ?$gQsfR0u35IV$BaY6o z+2HCRZNOtKKP2TGPMrdu3dbsO`GJ7x?B(p|O);oOek*r|@Z2(Xv5>@BDfeQ5m&8mI z^ZUnT?)wy4#(I%|F6$oHfV`w1>wJx94@I6GllnQK5B;pXr8y->i^If?EOP|rL9nV& z0})dEL=-!B$N;rhHBpSm z5C4%e)tB$?j#dTRlF^7dEmDbtU?vNc#wzcI;BI+uc7=!p5IdTD0(*Ku^np zwv?}&mkMq+IoLLwJ~CeNo~M}o4pO^4FbNpk{>uNxje|#RiWEUp(xA}1EzZ)#V7KT! z7%&r^yb0^q8Lz>+E^}M%mI(Z;erUx)bi{WIWN|@u_SwBtj;&KbakPbq#{2fo^Pn>0 z4$!{oBTnfg<%gJ=OM%%KS^ACDZm&dcNuSqmZ$kFZ6=tXurhB#`*ctf}zfzWQDx_QT z=Q**JiJromzA}#*fOH$+_Ju%6EXV~@U~5+1s&WR<&*J6`z`GXtB_yD7*myH-VRM7I z2+x{N2HQV`^0c6Pv8&EO{oV}&)3I~zLp?eQC2Rt!Wk57PM0Ev6lT>eGR@MEZ;sMmi zS)z! zS2dt>(R3g!rdbBMk2oQOR~Nx&k@p5$S3+Yc9wyTquL_TZ{X&%l$;|BA5XADw<9&bAS)Byd=FM)tEMllEcB9%xU z?jTz(Rx0L|+(?dw0st_huK2p4=9!*&FA&(`IyDr0mdWN7W-Pqnyt=QsuzXq{E_J>^ zY=#d6#HZ0%BPWaUI4xs+xB|r$Th$lf4qeeHnF|I)pz%PLjucVIWAm;v%Y1!hqR<^p z4cuPa)}c%<<4K%-mUjkK6gS~9lR57-6pd1OM35ME4f&D04lQA%cQny8%KW$E;i}0A zeM9AwHz_+k20-!4(}K#z3-5wfv~oC`;Ku-He*89WvijP3Ucnt^|xei>BH-nZ$E_R9U@Kw1{tTMlF zW$MrSBSr=<$OVSvKCAxx5dHv)Lc;hG&mqxp+Yy7_l?f6y&=vB-c{`i5Q281Bqfme7 zBF5AkWMaDU<57@}j@BeDDx6h)*i=7M-zM===q0BFoNj_SpJs8o8h}=&?p;@%5_g^| z`I3l%C{+p7YSbEZdVc(s$g1_K<>XL8Wloid<02$#Nu6(r!+%{Yf6qdrBfjixLpcJm zt{d@c(_f1Z|HUu){lM)eXW8E$Ij$$JrDCwso_m(@K)T5e4RX9hUK3~#6raKfkJ*=& z$_NJejQ`bQCsJ(`vTEECmywJbYG?pn4?7(@j$BAydhg`W5wShkZ}Z@ke$YY%`{8UW z0-^ZJr3S+|8m>;Gq?{c9(co< zavXzUIHVYXCiwROu$hgsc0)|cd-HH+v`MT6zGYyg6W6Z-fGNyWIXQ`MPppSGXuAQ} zIyn*x4lI(3OFl=ZyA5vm)Q3ce9rO{E(Z=|M!je^)2mny2@{ve*vC{wJ)m2Q+axw*k zTa$vjL7lVD!Nu*0z92#rGRh@un(sG!K)y$RUx!pO6s38yP6$8e>bRgm_A(inx4!D* zX6y!o+%c=7f=H^eNBiPHZ{8^h(hr`%E9Jq>rnnxhLpz*VlrF2h1HLk{c}MNbPX(+B z*;60JuK_=T4K&cN%5lw8$*h6pQPq$x_Bk=x9oxfVtkWOBn(c?Q2e(CS01^iuJJW1G z71<`Rv`Hn+r7P^b8Y%v%Yl1?h$B7LVN;fD#`yB~kF1$Kt>K@jbo87dN)`as2cL+&o?7YSkh= zwH7#oCVU0kiXB1v1D-mtRhVz*wBfuCCGr5n2gGGdH?UA%q##`W8S5^oXpe;XvI=K} zJ-GBCDDDaGpYw0AX=jSo{K6HQcEa(!* zJE-a$eu{K3{a^|}5l$X5JN&#ML!+7s>+E*vZM^J(Y+vkkP^Kei{aZYe9DM?ratNnS zI1fMYr?s@+;6a(3Nw@DdslU(t_r1h#1;Ym%0eN9>L5O*-EIUS<&0Be5}_s_kaJ3Q7%H%qd?>d7V; zM!6te{I>uy4pC5;$h82@E*=E0LQ|GE8{<>);3fMND56$%;nOl1^@YOa&^m7 zRQ0X#$4M1#9-^Gqa=#q=9G-g2G6>b3G?_V-y;hPD2D0|7!&kH8jo|V&&p!eCxmV$8 zD7dJLCi%$j4yRX?dpgp}EO!@dPH~%}^2uB8H$?e$r8)R8kbLVO0L>&_+y3=DlpB2>|f2dufL(UrCov~O*Z+rud^DwK zBSzeFBF#x~Q&d>RjVT=TWoUdsY?i>;-+G0oz&G))IrOB$&Cnu1d*uJ^LehUOB)q;L z*~T_2qh+lR%`0A;dhVw;>%XqaAGdynZxRp+C#4cI(8t{IcZkvcx|k+yW3qQbP9Lt! zc*Ly)24C{(Bg>lD5SP=z-+E=0suaPdY9*TVdM7y3hTIby``rvtGu%>p&7`6@yJ~|K zGtFME#5eZeicn%1+#^2PJt_*S4C)9#q%>PBCQI$I+)G#l;+|8e}4Lje+XY{_N93% ztU%CU&qeC+FZ2N_(tn0U0q$jy(87x#ZN~p*>O44 z%3h?l+YyRj+}m!3-JIErEPyxURhP>G0tcR3zUnqHKKC3e+wZ0U6A~)pTV0ZQEFFX# z-OH`g1<;J-*XD9;IB58!u&R~BR!|2uCMOP_g=~$unX62hw~XR8GQCzA>I)urgXS}q z;M!aPR=BKY%q*KWnBFh16Fgqlw$vUjbjP+-M|#*mFs6t~Ns?}|utfpTkQqziuH<=4 za!PBnhVyQq2~0kFehHUA_85vCytw6$;@g)f?b?2EsHTh{ES`7XZ=&q@h57sX(PaQ4 zjbDGbdf+s@CYedq2lO3{Se6dYhc%N>B_x5RZ?YswXkWqhoAlv<1f1q(Ur>VPX5jm= zRTfEH6aIt(6U{WC&Cf$I`FsVh)MFl;!L$40jISws!vG#E6kZUhK}IkNK~-+~lL*BG zCYST&Ca*b3Lj0#?S(ihiBzqd$9b5x7&K7kWj+Cufw1SeHmuSuvO9M%>GmRCg=`@As z_Ow7)0RF%JK8h`Ig2(jBK||XtNbR+S4g4mF1yM}Pu#3>n13g-8SAIf-UpO5-UcvS{ zQWDrZMI8a;rLXWwg*Oc%FNwN6g8IvEU}<21EC+kJ7BhLg$ApZ=m%_6=Z+|6B{}uyd zB(19hd`lMx!)t(}(Dq1;@$6qVF>KbfUrDVI|GM)9Zflc@0~nNTDQJVJ;SC@m(iPC! z?FYt6M>%K!BaAxW75?%eZ>+V&(doeEmVO-zL?|U$%m$1_fqB z4d6mp38mHtZR_pkc$=?Emj{mZCf?SG)~*g6?etv6FC7WKvhcV5jf!6$WvJDobD{qN zD=NADgWRBW(*capspQO|tXX|lPSB+A@GqfQ542p+mJY6WrS4QxD0NEKUZ`|576j4? zFWBWecv?UiocQzif8IwQ>7NbqSehbVU&Me|9+YIRkG_9?y|>7@=I8D5Uw725eJNtQ z1aD`6t1jHl-l|6S2q@ia=$>8p8?F0Qo4C(ez(f&S8?t9@_x3f_oV?7-Th{au73jYE zzT0ql$2XHr+b<^JzM`{VvghFITW^Eg0rdF#cvsGK!Q9xNZ+911GcekI_^n#rEd?&m zB%W;00+B3{9a-GyM_Jru)?v4#5W)jf3d6>y7kW+l@zs z%-=SIqSwDybf0Padq30kaeH>!wYzOi{kE^;_Umi;xD1Ay=Fpu%e)3=TiUMd;jy5YrcOO zur%}Xc6;i}Yj1w~s3ybj0F$w8f9?P7q4sSRzpeTbW*E1Yx8+PebcvY5=0Bl!{AmvS zsml1Tp6=ScwU4S!T7z8&gx}&Pomw_^W*SKkOiZu+^UC~J7upp2TK7EP3U?-GW%-!b zc-Jw2G8@1{{?#r2{iV)sUsE%%Cm#e&hoWnD{jUbi*4-w*0eqHuRuNKLJ^&d>``d>b zYyJ-7Tfa%-t|4ji}+prwfWwcq@&#^JuUEx}K{ z`yRdY6!{|uY|ZmRtMVc66^ zyOZ|S3*bL1&%ava{fdL#)*vxUkM52q#Sk5@vXR zYg=$bziskb%@KfdidX)1vKH(u{wcVW5HjEA(F(Z{)8AB@Kj5BPv%pE>lmZ;4H_O|# zqThQNBg8i5IR_Z=;_Cq~l()#5N57!4vkZwUn~8Sr`T@`E3VPZ``rxz3vn-|uYi0Ii zo`UmUw7JmFl$ynW&WAs}DnCVZcrj!%*lq-6776MeZ{I&ZSySZPSsr01|5u65>n9uT zUEBp^8LlBD2DsKk7S8Y~BVmC}^K_ht|Zs{xa8p5)IRI1BGWs7~u@lIs+ zQ11Y*NTnxBfGIY_jnoW9<#t-EnkzAVP&|xRCOp8=N8?$uzc_JH8KHJ|K{# zkgMsfW18dyh)*@^Sd|cvD)g8J_l!^l_k`g^kw_$ah%+aPG;S4jHv!>_aWz$-U?@}b zjPi_Fx^U7Mq@sT>Q22L`_WIYg%bzbPxk84Yj&eV7fnBNxCW)>sWXk!%s|U)46u*4;eylw+s1xUo^Ic8|0)QtUl*#}W%fnUx z@zf9iU!Aqe07g0hFx&E#kmHf{Ht0!W@8-)DKl$p2+@~_x|D42^M;QGNhNAf5IlE3V z49vet8|AhaK+5HXnfceJOubGyZ7+e*KJ_l7EyVSfcm7k!W#G ziycaj?nQc~|JWR1WWtv=mrB)*8*+*OrAw?P6IMm&!@GO6B+VutI73CyTWz2-d%e3{ zH$2W)mzjL}t8ncm=E;G-To4V`8nn91z3z}uHmp9BRynq8Fpp_1JB9C@?WC?!!TSIV z&xYz#cynLpfek_WZmVP-vHbGcJ9VT+a;>I9NmN4RjtHKI-@I){Q%?mO-)GE)NIES& zBNOH#J5bUTz*g@!YP+%Klk{x-mw|+kZrM?YCsUL0BXUeH7f>%S_wDy?q45k?4Bdr3 z7#i1w^cxMjNb|!>16QT3W5Y4VZ7&Z6%m1sy?(c_Cu;zw2VZbQl{a8Bs!qujR|dS@qA?a;nQx_ zOQWA5kyXA;ac=tF5kED^=|Ch^QMfeU~vTZUH(dFB;xMFk`qU;q{FnB1*x{|B+jkmwg$3Jqd7BFg<|mV{#f>pX_(E#mWJj{Vh3JvO#s z@f*VU`1unHJ{uRiZLyoN{w&s8&|rS|7R2)B&w!l^?;BC^3C)FA!;3ZYD_cQ*ZWZCD zy1IAu3!N7bel%;2^bD7^2D&l&qLY_zdc5mZ6LFYQqo zei#QREjGdLz1jE{k|BM5r>AoQ(r0Xx#uSZiLzgV&V1c0UTnI9A@EBsxuU*yf2%W8CYYb-NzCyK&pRNa z4Y{Q6!2`bYT5a?Eaqzh82>pvtd}JBe_iD*71!D)5o98FDIa(J<=>rMxh(n8L!f43rbN+BVE&-kG^xJ4<9w84ayt zDPMKRW5q)>e{&ULV7g3slU0@u1FDkYG-sj@3)F93hpQ9%Ry=0zDiL?}E>v4Ryf6WrNSBqWDIi;{ap{*;~+B-V%D zKNh?>(Z_iO<|`gxE~JV|WYLFLLgR>|XaaE%>w;)sF&rv6%yfEv3?T+;LN1^*^_S51 zi|uW>8mmIus`PfVgi;(ZhkoEw#kI#}iNl)H#SsR#^-F>c4m^#NzrFM(g+Kr*M8bhw ziOQqID4=&q{&=<3&&qQFu{w)5Cw|G&*Gp#UNo(%%PRhNDi;z_D*2saTVuOg$j2lwT zIEd;vd1@5UUt4e@>a14GgVdoSG!G*73Czq|Awward=4-LNOo<=rFWCMXL8czrrXBP zAnkA$FW(SAl;|_;fZ5#fvvj$jRnbC}(uTvhi7bT3xs;mO{5;}k`8$tHQpT1P zdrFky+xB=a6YK?e{h`|~*dQ39Te`>%aFc)x=hPICQTLGG99k_F)5PENi~XDNfJ{aN z2?Wj$H%ir`PmH!CO5bXJVW}!N_m^{_d(Ah9woZf7pg-fC4?s)z7NUJUOG)LW=*+*0 zdI-AJl|*l_*gOV0`FN`>4M#h6L{PVxr<&SKpe1${TlNaU!jnC?Vu8lM9%L(iKMVve zVJus|fmMg`?pEIx4~@JL#VxS6+36Ce_&@T@lLZ!+%{so*G`2APDQq-%=bf%8QsEu8 z5-K9?;9iBT+8@PDe%6;CH!);H(Jy)BVxlNIJuVOT!Cop}zXgiIIHf{}ua>CH$fbHk z%0|)Ky*>|0(bT@s+HBP**V3)MbYk9nwVe}tST*0PR8CB^I&Wrb)?zy_6IYsQIRT71 zT7;m-=w37fFY6xwYqAI*dfE>zIfdiA%FS~<&rII_Jokjqlnq$%sh=PjXPawV>V=aS z1aX(WZB{bgFUz(8G0GgfyhUr(CBdp)_*&m)($JL!_|2^EuMPCK5OqBP2TSn}+W

LC7QtuPocfFwE%B)ViGWu(fu8Ez7eCL`D(D<<83V>{8&-j7wf5baCv-E?Y#L^wNF$p1z8CoVIue>8Qgn7E zuQujF`nqpDb&5#+X>$DRW1w1j7jQx^$krvWyzc-*-cZNeNj4Ytb&6cRZ1EVxbf`&f ztl!*a)8$yTH20d#s|pF8E6eg zhv%cCSp&uVP7Nn))wvNlRiGyH58#&ZdPQCXaB5CBl``+8sZxiYi7s5Q{&I#Fk4G0c z14@^$p~t`P+{ip6Ch!hQoCVp}{JB7}V1TKtmHA|M>uYlH&#=aqxqYo4Pz(GG_LqYp zEWMhhy|8Z*go#!P+w?*Ys`h)De~CZ9ypBuECj5}F+r8I0>mkGlK3r~_VITIq8@9;eXtfB zmVR~RglXfF5!Nrd*@aQQK9?DsY(DPyIl$Ac$lqWxz)GwjkdftZxe4^|kcnvXW5I z8my3vEi&;|N$pe%CSG~I@6QJ! zfA&MYp|6}KdlqXycktuqp@AUisa+o9HtRIszv&FWDN6{Y1ogw2xz+XACuaJJ+#gf7 zo0~c`bSBLg-OE?*+To}wjY-a!25k~JpHsxN70GrxB90(VO;z;s-0XQ7hiC?JGYJ*2 znooWAZc4*$>Z>xMBLl|xFGIACCQ0EsYu=qI)8~vqns_B`=Zt-@=OPg3hAF8!Pud)J z2DIR)!bK2%?A`wJE#L)F8B45Z8u}R&b+}x%$r+PoFX~>l(){(uZ}*>%81l7z(xoxC z+v-eEvpIaHeUO{K47Z2urtEKD17b{WYN%wU=VWn4Z_34^#bK6-&t!tU^4$V0)#&(Fe( zMWhYW$m|4^Jrr@$I8%UUT((j^-`&KJqaB&*M#fS$(gj-GahbiccfPpnB@TCl%5@+7 z{JX>6pH=mLKOF9g1yhq+6~DR2I_X@udnajAdb&8q*9#b6JS?f^lRkn0f6Xpb*By~y zIP^4;DrJZi_5k^zhCbW?-%h=1U|>qnFIN0UPalzydgCc1zDbM?h}n?7cFz*z=2Skf z^zkC=UXC@|tHd3+RoC8-ZW^}rV0?GtNdG8>v8EdAe-Bp$l+`fXCp}bK5{^AjEm;S{ zs2^&!Wfdm^diU{dqtGV2Qr=TBwGqAeLz|MaL3g_q)*=7F!KyDgA~63soeS0k>h+$2 zo72|sL5tw7yC77neIV~8SRV5$1>!tSj!1rWQLm`I5#hiahQDfW)Muo6RDdv{R+-iX zzhxZI!B0P^WbadcE9O$>(#j$ovBgIJ5;I&dg48HSmG7*}R348>NUK#Q&Xs!x_1nC1 z;hxwDgE`++#+WK}?`>i=9}YJ3v#~U|+*~)LxFwMZ2Ybh>JU6>;bDpCxoosTg;3e0a zmW>FXRI;(;g^bX~J?u4-j&juLcdR*dd8J)LLP&RuygL9pW#Pd!oG;|QRO#MmFZ{DFD%BMwN+KcW`O zk#xHiV_@c%!h4>36ZkqD$9?KaQxZGeFnpTgYosQeC>;7uqdS@;sa3S*iKI@*~bY8eJ>i;5 zg<#98mzWYhv5GK%g?;*?mXQ`hjVGGNO~=l}iS)^gr^6-jNyBBSH%?8HchzO^=2fcZ zI!XoIKz%p3M2M7(O#&TI>pv7HCWXxSdn>=Ae!5(p>ZzyGGd zT9Oi@pZb*0jjRC6^Jr_bd|@fThO4U!98v%M?s)l!H6`r3&ep}ty||}2CIu0G#mP9z{=5>gp9xi>*;d5|l6xIeMd>KNB$q^^Aexz7dwol9t_zU`e? z7cKkLtsELb964&dCT#5siUC4oY#jP14RJ~jYdccyRxIDOMexK-+|uEQKdE{atRDMr zGY;(Jk7Znd!`65y8O(3He}9XHq73L|@YK@MB-FyD=MoMNd4*&pxEt(Hx~j`D&)b%B z`{6#)z4Qx((7u8TFF{1Op}m_=GcT0k!B;_q+G58ldyJ1O>3V!pR1h1@yB8BPw6qL_ z=usGZM-@oEH2BMn8B*;jDcBBYe=R;ToZw+m`vbFo-w0Us{Vs1Xz<4QhZ9Gjk9Wh9n z>Eq{HctAyy-4Lo#%Y<}RTY!Dr;!#Th!#C!hesaO&HpN6FxRf!$YqD$0_H7~L(Ca8EpMWr<+RMAQ|I5nN-%-%6Wv`vv z+5*>{zpq}B$A?nAXy>`l`VI0n+Mjas$m0hCZ+ppO>_=*MV#G5oU6T0uPF{WQydk-^ zLD&}y;q8Q?(+o$s*=N~9Vz!K(b~h-okw>FbC6Sc{PbBp{^IwrGXBx?V#@(ORx^sdZ zyd}e|>c^}EV@L->uh;{a&aHq>eWF}f$PCKx3l~;7!-jLd(tgsn)!)12 zKE1=>Tz}ZGn9SX?cCbs{68BzzTb@&=GlmBq`r&kgIRO}Rd!yebY)Hqvul*H>KE!*2 zFNC5%FcDI}C4VTQH^zIFRq8qV)|=UiZa8)-onvl|Q;uJ+<~eq%3$ALu%}0665T%UKXN zx%a~+J^GPcuAQ{0`jTnHfo<*Yw{AU2%Riy0hvvZixxSS}Ee!xhb>Voo49u9>&wv`$ z7Ze+j-PgBX_RF4&8yyCs0@}Q~sE9U<0BQmlP$zp;%zd2{~J-s?K26u*?t zoO^x{IUMtu>`Q?O761E*3xZvsrIh2De!yjNQ1 z4BJcEkj^lRxkA{5X->CvFLG$x7>m++uj z>)_|NQq{+L6}R04yjfh+QA(SGHtEIi5(bDE6M2OZT9Z0(aaezM-c%~m>p^`&H`>j8cK$~hK1Q5MnX7g!>}q({0^tn&kq>| zn9W33Nt(6uKc$up49P9r^|(yBaEA0cW>+gsT6!!j+{yt$gLfO5YuBv?tu6$~QvF&J zf>xGH7xD{R!u0P{yWPxl)m7T=taNf`^TqivM}RrLGMT-yp8>i{?R^e8pH1bP?bvw& zF^q_Sry2N2t#Lq>%Ne*=G$)F&Y_V;AsUl*1YlAjBq4Kaii?a*~5aR_URlt>_r5TG^ zf=2-Bk7{+_&P7b}?9{ZSVOAuHajQViRk{bbu6q$OL$*2nuA`98Um3Zv`_1528Qs4l zS>{vLTCFMw2)+{k#XNYdtY_Q8r@@bgd zmBSx(8)OYG;RqoCAB^b*zN06T_iTS$q!A@~I6dz{DjKxnYiGU;>I2PKqw+@84l()( z$QZTs*qNfR~6lmRi|LLsF&^)#16NZ1iX z*^lZEqu%c{yl7i6LKdS_Y+hwdd(Bqq@Qvm~1?V^(v{9=$(3BeDfXvE!9x7aU41EB` zE5ON!X({YjR@g|(4A5@1>+hneHPBP=?l_W(2-L^F!3UOKezx(yFFa$mgHJZ~5n%}5 z+x+u}>uEg_8xO>{+&Psl|AZ0v(pvVittBW*;Lq7U)dsk#IAqnN;GCUHlvCO^5=#lV zc@N;TJCP6CzdLHM-uKga`MpK4Rut=lLhyQb*t?wGiw%y8d`d0WcoH`14<)?NqYu^h zxHlkx3CS07G$vr;q(c=)VJlJ^A;6?kqg+W65J;vJY+}!R2 z`=Vkiim%}mVD3kaqsH_i2u7!NcSJ$R1n%@NU5S$Kk``+fBFDPR)PYB14Ztm=gt70^ z9(+&AO(%wtWyeCFa=u6Rj<)DKo8so^2Y`Re=P+dD{yXJknYfVyq{f5znXAe(X~W8~ zN7%W>{L%(K96_ZB^5vA)+ovTZ6CQyc7?sZ+WRN&99}daFj6@JDWBc0KO98tX$MBsWfn9E|%Ei+}E3dWQH%YxjOy;F|Ar12Ocryu*N<`0?Wzge+AT-lIc&98sy z(nF~kU(MfOex_&tA<6z%lI`}c2ineS(C!S2`M6~jkC0)={Y{YL$K79p#U4Qt(HGX_ zUb>`36eBKzx@6`MDnIV5lxYT%BoHmBYT9NUewA)Ky=b%flK9bq!CV*aTG<8X*m!6q za@*zFqf~ZY{Jfk=G1~o!T%O4p&@JzllkEw9#zk+)&r!2MH7-7JxIav2kMzn7)F4yy z{50b7nO1H&)x9=>^otFa(7xRF=zXBUKC_(2yy0XpX~M0Lguw<5H)A-jUw7lVG9uFETyaJ3e_%!taX0FNXS>1{RX%Jsv-b zmG2kqyie^n++GuN1(_J$_o)wr=&ig(q>N3OJ~P>>w4>3e0D{#VfBGN~EH_dxDfz`1)*w)SuY7|vpU3qu_NJln^Pgy6_+X$zurCqwgy=15z_uq`r`R$U!X1rumKsbR0a>!% zX_#k%-+0cnHS6wJ#=#x17ZA4l3eAdi&QqxyuF zVnn8z)yVfR&JA^dnk|BwL#BS;Ic{Q*?>8`;B!#@C0SxyB!`3_OqxMpb#BF-b4E4{e z>_wM(4@7(KtD7wK@9I!8K9E!&&!YFbo@i9)6uDzQPy5dM zn$Q85Z05_tL~+#~X(s_&6TFBxp*+Q$>g`yl^uPfbnX8gY)DTWKL>OYpqR_{fSaTts zZW}Ln5zkS5i~~v>vqR*#oH?_fYBucpLy+`u(8QEI!B20EVr(b^AL~F?^L0MW?Yk1V zw2|Vo0@G*iNSMoGx7gEOdF_GmjY`{=&Y2-3ddkOgTSa7Te(vR=40moBxp5U(hm=;} zNW+iE7s0kW7!od@eYoM>$P%b~?v`Cp3VqjbzR;<4%PglgD(~3Uq`bVN9geKUgwn+B zNOMuYr?QW-Ht9*)PAp`*b$6~^kIozHnlfXM>TmiM&o7w{wnl;a^|Q5U9Df^ey#^Hn zayjUHr>S(%*-I7{>bt223qmOUee;4+87MB~QME+FzYRZ_NC^m_li3%g12QJD>w>K89F08Jg z@AY;j?E>u`lOI41Pq>>0VMSxs%)GhE!KcZ2Fa8f>Zy6S4+qMheDh8q=BPF094ALMf zC^Z-i-Q5Tn)PQt@B1j2Hml8v_)WDF6l%RAEAvx55#1KQR^SYn)d~3b$+Mf6Re)&Um zW1H)m^E{3{iw?CS23_nM2{!`gSG*;H*W$H?uv@>kVxw_wX^>37*K%UO7i88$NlCt{ z?mvpDtMGatCq%+W8NqvUv+cOgqh~|GM?x6{GufYu1FWIsHt=@8HX zMI=T~&>W z7NF6!hg%AYD4Eq(2USH^GNfWDy?&pu_u3a*NHA}Om&CN{;v57Gf&b+pp`yPDnv1Jx za1tO}q}B8g;L9Hn^RhU!g)__NP)55t!Jy<2ZEkrTy1p}`&=%c6dI^Pj{Bl6~@Mvx&9#G{&5K6SoDo}?D3 z(#TBxH1DB^aayU|H2Q9`*FUW4>zk}DHxxD5Vx8BB8yAjJ4@xNazQmGLtJIG;9__eWx7IbL^DKZc2nqx`puJ)0{dmw@OPp#x}JCR(jnCx|W& z)3ahGVZA)> zp%~ANw^$g8zh)8r2Yf)Bx5p1RB78qI^fPyRE!_JKYTZRzU)kOSA-4HGE6YE!^H#pDjIoN^fq{7{TtNUEOr6m_ZMY)Z6ig=oyeNLXdb(@`CK9@!gp*qfs)`;lS5 z`L&|tZYPEk2IDA;`ZCd()x-5`&KuRkl=Y2$WzT;^g%`ojRb14p+ItTC!FeUb28p-3 zoyIl__zaH;&7(O|k$EEoI1{vZ_Empy>+313SLKM$bJ@q1=7+cC?JR*T7l#!Cl}Z<0 z5|DYokn)EEL;hH^MvMy4iFvO>rvVmi7~_@GU9jwFxZ`2uO&k>bAshT?hs$JecAyHQ z?A04;Oua4{;nvJ%=4a)6wnB62_*l~O)oBhHwT6>1rH^D!S*8`|F0t&s`1+dL&qDlR zGxG&*KQxQ4_*ELsW=0ws)vI%V9;uz8p&`2#`}DEq9hQ&_L1b6SBiW{Jll?fx=gnQW z5;N*Acl`KktqRel?K)^+r{!InULi0<>OzoFk zts+fyiGtq2z>te&Vz}cxrhJN93`gf!<%;Mbp^y4Nu&hjtG0De?+ga(+ec(;p%Xqdq z_ak>e)VcB>fci(CWal=nyd(z8t!H$f(E6W^_?5@U>%swxq#KLj>5GsORvtF?MD++O zz@AWNuvvVwN=9LVDPpuj3wLyWYCH~VyTxe7oMj%LH( z)E&o8&qb^7qw$Ef&euAQ^{~$-bFt`jcZ9IhN2I zvehe*lgZZuhefM)Z^1~U6$ERZt#Rr1r@N0PXL7j5j83vao0Cy@Pc@Ew}MG6tEWkhp?9xO8eYqXXj6WN z9dGa?8ajxzR}P$^`v7&;S!JQMMEGE>*3KvmZQrgP=>tzGeVtXPf|PeuCu1dl<{;8l;t~v_Q0c72{4id49P4p%5jfY0yTmnTO$IJWnXZ#Oih5tIWN4CP*q1 zdEdJtXd&P}{)MB~XG}$@n=F-Eg`4|;n#@^bTyN9Hsq;)%JGH@U@&&*@(kD>Z(YUre zf~Njf7+Hon`P&N40#sYyTq&nY1S*_F3w{D0kd0hz`{CY<%$7G4A>ASci;T&daSL@+H#s0wnHXjYSg)4>dC#4j*~fA_ zwP{5~vrrIutNXHNC3q`v$kl$I<$!=QQ_NbkJogPqD%Qj6`##1O^}`*D$J6+J=9ZNo zJ#zF8gp>Nq3rC+v8nStMPnqo247aS;67HWzlJD-`u)7*cwoRV^Y;^Rz7?2B& zXm`^~>~=iN=RIo3Y+I`?R8(76280)ZAh93v`$tEhaz%^F3yTQJ^ci9O(2s5$n? zUK$-$?28M6knyr?56S)d(v4Qe;WpN9+08~FPoN_0HVZ|MRO`^Y5-WXzICpNcA^XHI zRBh}*O$DwB1eoM`5PNMUMNXck*MS%DD`f!goydQfy8i`i$2~bMQ8^!h#3c~; zx_sG?wC@A@9I`Su#76DC8byf}9@Wudb51>*uN{6asz*ky=^CGHj@%3-xf;OE8`6AN zi}}*Q*Ns!3ddf8LhFK=vXnU2EhJMB14nqIa;OR0%$i<9yQT<$JhIah~I*$pLG;DEt z)tUaGXRxK1Un%^3!i zbM^&sd4^P0D$5TuCqq>YLZ1Nc`FQ3pqgrS%Qo9sm%a&8L1?P+^fw~W!rw|{jIVyGB zJ2cI*&8+Uf8nv>ow-Pkj)!|;0JGe8I@6#s?&2|~ODt>4A1{79rnI<4nV~B_W(Njjz zwg>^nu%Ek6*^;H5Z6!Y*a1lA)h9F2+xER7xYInHA_6H?6Oh2ualV7{Njk}`ItueS# zn{8oU!_f%9wif=m;RbO;EEgB)2Y>BqpNdre1;nz+X?2-cM^EAgn1nfO)pCpC;bfYr zn+1Zg>=Ma*EMSYT_e1}VWsgvDe$nk;CTuwhDJD`2JdBq{vtA8?r2WD6`;}YvW2v1$ zr2Af;J~K1-5x7H8kSe&)2zcGPC@KJWIiKF30qt&M3Q?hyWLtfD;+@Z-Yvd9Xp?>)T*}bJD zzV?M-W0}qbjEeW=EOX?3)Nh?eJ&3jmS1htVjSl~Ch2#I37ys*;@hpwZ!&=S3Dm2}D zE7hks%TG((00&!*tZgc%oVe;CO<*#kM&o(Ub@#H?M^`N@QT&o&-DFL6RN|IU=1An9 zv!v1q&5n6-w7TBD~$M=);F;t)Qi8_Gq@WX3|}hKb|W- zh&SG;QI`5vWFqZPN5nvbno+6ou38PB+E^pnD2vJ4TRnOEVbL&serqJ=hI(7~*4Ev& z(c$mzk)=2hfuV!C{7ILVal*E@=Pzqx4eoKx=L{3?7&4mCWzKy=I*^X(JEYEL%U-(9 z_bs$z9(VjAHHC+vhsSs$WKqL;EJfi7{eG`&F7J|3y$EHY160|;C=50Ky;gN9mQtddMnryHH~3MrMmItxN`2r#qa<~@qR+NXysUzm5_<$! z3fz}^RMA-yNK0n5Eo!-gft;)o*uvt69!OzU#?aPC^cm z;pyPR5W@KtEP6q1_4YTX9Q9!`shSH*0gD4~{@s!I9~B%7REzH45|SQSDDsW6LpirJWgF`vp#dVVnpa;JA-~ko<2+TZ)ER_ioxL3 z{+8#zG@8iy=&c0x?EoVa2xc_@AAyjHb4;#ZJ$9|iba8WxcPA!adx=B?YI)z5I!`@raSy+YR$ zV5R4f2=(RD3npd=!&y0MbO3fVlO!I;5c=hYO=|CAz@_4w*5B6U=yZRjeVe#Fh`JZBBa>TK9+H zv)nM9qQjHB8pRFE`Zb>$>g2G5Y=`PkD}IvE zy0BE5I&Tg1c5iqmg&X+6WzzcXPS=a|XRg52>@!^75gfg|exY=JCeJ5tnQRX))?Gs| z?E5yXG-E>6AGOAuRNlQRz>ZO0;9k`wo#qwH_;-@ne?5r*4;Ahd^QgOQ_DT2VwWn?~ z(_v#6nnamAihLFjn*wmNq(4$AdJN%wM&$q%601(l2A_gW%(9lSG# z<^8xh4*t0FtKi~CS3!_{sqS%ySN02rlBz3??i(b!gPzm1QG`&Us4vtV7>Z(h`=%t1 zV1#!_RnW~u5kDEOInI{}o|Jiv&UI+T8?@OBNE7-rUnCD%6Eu5eV!V!4c`6a!p}GH)UGaT;o}VHcqM(L<{_FC|fnnikA;iN$uTPFabpx=43bN zz*q6KdekFFPyrC?z2c5lR{AT!=lu8r*my(zlAW#1kijmz)ulyV%h+3j%A%B2u8Cyc z2wDneTtu_T0_(T%ju-K_M@Nji8IWY^>dm*xb1hTxv0m;&rAkL3d zVA@Hi^yX~fi2#@=XUFz|mR}cyf(jSmLxi&k>@?)6xG52C%?TC}&YgHoA!pq|gpOS} zmXzN$VeGP*zNPK0MXanC-aW}0{x&Krl*6obC2#QYaJAn*fctu<>pP2XN*C@#_3SpE zG5vOUGO&s!y-fEuK_%z4F;ko*yCZe~{E;x7OA-sDDyX~vf!-iAUp+LgTuMWw=wuA7 zok304aIAw9UMUr+Y$-`bTTUIeHRVn|uf-s*)YLy*IEyuuLK-8j6U; zhC&e z5lAy|mKy4cSz%3vL}=4MA0Bd=4O!eP{0!E{x%pvTV=DegbiF4ygJyJMKHlUekYSxm zm8ObpP0zJ!nX~6&jl#&_puTC^=NKNwMl#7UWhJ#}rZ8DnUZf(}@Mq1)m<1ynrMWoJ z>eP)uQ~yAEi)RJ$98jLW;iNjZzJV()lq8RW-&K#PFM~6W%_z$4zVU||ZuD0he@?!b z)Yrr#sbWy#{1N^0T}HNI@nWv^-Jw|A{HmdCt=U07fJ;7tq9wHHQ(PO0&{OTYX- zQ?OSp;vaSAZkWz-8w8$>=(YLA@qj!sMess!fUm+ZG%>x2bIjJbX$h?2hPSecn6s!&LRBa zSXVEPS4!uEN&!&|uvR+6l?_esZ*VGtyVd$AJKvqzEwhvY*T$|;f?-2uiLWSs*wR^v zt?%WPuk@$xMerALBNY11DQpOKcOKKJ?3Vfqz@{Mydg&%a9FGgO$JIz~_i8_bWmtIf z$}C2zz67-=m!R6E`|y)>3$yC5P zu;Wn&tmbBfhn(g>Wn>3A!HU{TFv%6ZC?l7dV2+&?-0Zqe!l!CV8cX9P?61DNVS16S zb;tzNeacw5hwP8l3*-#mSu)Xb{7?}Mg#0R;X6of~YSC-J^;6@%tT4XaJCq3H|FH`c zKkryoxk93wpJSgdw9#O6bWRys8kv7baMxqP_qi0eYlqkjudWBbTo@KQ)w{ja z|86IHFeT$+Ao8ES+}-C-k-zoONuZW41hW4>zxhnReL8qLb&_)VqApc{h>&2ol$5s$ zg2p4IfsMD?_a$nuP+P~qt3bYfwx(*K_rb{z{eeuGCsTgQG`@VTM0jM7u-o*t=^rVj z>G;I9{Om6SgE^teOTX(`^t4hjauEffR$?p=ckroBjLc#9+hM`7V@AGJ>Xx;y?fTZY zsFFLIrFTwtwwnB~RRUgtLWS_83t+%WPNGU9ZOChwe2<4ma z#;j|fAZ7cs%`l}V#4P~koeK`F`F!6MxurHWhTd8(D7gapgjTg*kSuV5IF-|EVfgxLwLDnpC2K_}qDt3gC;K9T{l2Hq*sLy7V4KBxI9RT6o^{UK! z_=?X93oFraIc+btR8~3sd^NHC75r zZ2*f!_A7@(o9})}&vI$iW;O!9Ckc27|0ICferwzJ$y9%|Rc}mO!LO2yyQ;MmKDO&# zX|i=`x`UH0$P=ssPHVr?s4D`e1AQC2E6YD0iMhI$V~?uF8uC9M;ag{Sx*T1w4hJPx zcD3kKLo6ZxaEu?{MkrV&`u_y0c(Go5Q;}Ul zD5iGDLmG9~%!Bnt$swquUF{iLTg`f(XLqEJ7jx|zRDb~GW70BaT!ci=EgcieG_d+y zyDYHL2}^5wfC-u>W48HR=&>x*oM2x2asOT9Q;*S3V{JPOa5W5^mEs?N{r$4{h(LU! zk;^E%w4uHyq4J&XLX^!!i377W4+ip#+&s%YY&^etE3zM$GD{#iwN(E=JkBE}{z-e|~<} z@o#8b7+|Fu#K?2mYP|f`^~Q7Y^*h?u^vZ-3eWxt@&YghCvl0F&949m$H%&OU`5Kik zu(dfofAifr@)y#1KT68s-2Fk{^ZY?wSX}s1%|!gw zXpA7YbwL?ay5!?PB*a)VL8_7Opwp7NB*!H}UB2bXi(?ugu2*c2)%o{Hl+TYvOky5@ zHUb==wfyzUUj~3*qHzEHW!~D`ELJ@nTK@o@q^*#77=Q6XF_!iwI z*9;$Ptnl6OwKtVGermz@L?C2Y!(>n2X_9!#CH+kIW5>`f>x_s29Uj|p#4sj*lHjn_ z9$RY^>pQHoU)pH4w$rjX;~skg1^~&_+7oRYPKDoYxDltb-#u6>{-Dtiixa~6#xfu9 zENC60Oy(Q&Cw)S&2Ri)BMIz;uy{7H z#~Z>RM;GtHCa}1ust$ZIu*I@pe0{8QZ72n32YYQ}wX}m-SyA^~zMeYozttrsKpFwJ zWJaz`;qwv;8TpWz=xhixhKkIHLC9h-9ARd;Z|@IlTSJ7sa<944J8Z`@~krWsaE zd(S~C;UE)p$KcinBio~^aVE9di40mMES*KeZj)eu*Q>-ebeu#L+r=uB&lb<nfu*QQ|2t=?|~U1K7>HqC9rL?wvB`8 zgX#B-wikeZS?vQ;3|c;-GFFRU&d@wESn4S(aTQ#zYPvJRA=R^}o@Pzf_fXx7^j}eF zxufghhq50sIYlyLA}|LdK1W2rHt27Q2J%@i z>Z@D~vBgidIs~m=9%?l(4%SW?N@@|qyaWi&NwxT?V5}410WJG7zW`JH?m?NW+1I`Q z2=n}J&(4`!J@+;POq;or11D*QDC*5`2fSjgyCu!G?CGSv=()V1FNJ=E{+Npq*IUB4 zj{D0eYhMN5&jMPl^b(W?>XN_JDrlKM1{m%r}Ahmq+i3X2mhIKxYktGsd&k| z^FtU_oR#T$bo_XedU4%|bF7h;cW-KU{Z;7RwAK0PNYwHP^*QG;S$M)-Yv^5E_ps|< ze`*|u`h?&cY_(>;7?sv{Lq9jsFj%K|qUC}m8M=?UX`I_iG0MIjH_kaQz(m1pIT%rS zH~wA22mHKaysUwxWoOw;oaxFC>v-LglHJ9S+fINsYvub1Z`ZTM&M${mwj@TarGIvv z6j?28yXh?GCnaH35;GaGX=)nb#WmI&%#lJ*(BIFHl?uNYv!k*4K%(k1EB=$qn5F6J z$e3qIT;KW=-rS?eA}I|>`yuXPFdRQ$CP(NqAH{ct&LgMtcjI0``lX(nLAXiFao@gm zauu)x@2aJ3L(n*6pFi3&1nnNv;7kdcP=LQQsfp+U6$Ug|U}Kn8hiJ z$GrS+!V39j_)S9VzI0?y?=Y@k?EGNNQ&{?QlektdJJcTW0i|PCz4(>jKtvwQxL4tH z!U`siL$|IkVh_42tz8d)k?e+wA1YTBFuW@L++91-U}Z?yS$D5U0$b{VOPk#ZQZnMu zZvT(pH09Tz#~i^vZkR3yCL@p?K5ah6|^(udjf@N{`vErQf3R1 zG}@H?xSdYVB|{Yk<>DTbh8y35HfzE5VPKTdUvC`I@hJA30Bx;<`0##=R$Jb>G{({- z&!|IyPe2Sh{F$m=MeoV4R!k)Iftpl(x|i4qU@L3-1B~)qDcq+c6S$QUdQ5&A4xK=- zh}&oOvN6CRk?hsC)9rk=l6&L*kt>De%5~>bKwa!^Z8c4b4FdA#E~@udEBJ~ZfAWmr z(OKUSsm&*Sn#xKybnN<78@u7E^k|^tnZ-ZZ@oMDK@Mk*%sVY@2thkgX4|(nKUpwCQ z>wIFOqVy;;hW~J-8ov3l`6-(=PWaGulFc;hic%!uuM4!h#52?Z^$-3YkiemSNiqG9m zL-Q~pvr2Cf*W?*&=jU3LQ7+a2D3YRJ4PbE)hI~HQYam|Apk=$jK=gROM%{@cxH87@1eoGPK)9Ji=_;R{yTU}ya$6W99lnsz4ZH$1ufay` z58%^6lLNQD0Lg_IN5V#xhRL8z*X}c3otQg>i`gp^c>_YHBB|eB<50c?2$Qwlto4Df z{|Mc`r+(Woc3Ks+QLGk1VInt|9%;SCKuu#g=~rNWZ*WDUvVABw;^j)+vsi-<0A)XD zTFObi*@h-K-&RV}ToxT}u)3m8rsMR%%oAA$oOFy$ppqjh&4R9l)b|)3ps#z<`k;Xd zlHq;4eq3Y6<4lH%Q_K`u<#FqS^@J0ZU~nh=65F)6L@V1Kg*8LnCwu!~H#Cfm5B zt(iShf^QFr(X3m+vA8A$>p@Pw-Rts_WX$>GV>lnn=B`%vb!3^E!&*aZXJf{N`IJxjRpN`d;7b*JIM6@FfS#;mU&25$>5yzK@kF&lQ{FA8TueTRZ+f!8f zy~$;VUVz$9HUZOUZ|I{(TG@jl!h9|pB3T){<){UqPK1w?4#vQn9uEptG5nA4DO zgChA*V<-Zx3#EHNINU`UCVMG~jsRL|_L#(buay60BU}Kp(h;zPJ}D?^5H)lj)cQM~ za0)cuFGn&~aF*mUy?B!9#9h`eSvCbZh|Fwy8*Q|9fa&*^w5#g&6+SCkf>UveHTiRR zb1&Mx~=?OkVDJk4;~b3qui{$j+?)NjvirpMHTdj#JKX z3r$zg8FJ1cw7V?!w?ZU8NH%03^b2B{k!PsRlLM{8Y&d5K2}lGOl`7wOfLHH5Fh&*U z$zFoVdVz}OkjGb7B?U#CJ?!+>Q!XCv4m2 zo-VrQSUcIf6c6`1gc;stgC;cV~9&9Whkeu1<@yZW5qphHz+z~N!d1e zXX)-}W}78rFi*0a$cAbL#$!sv-4H77HjmWh@lX}zAC#ldgq!9Un{K$XZX}R>4)KE9 z=b*1zhE@)!IH~SwXqntGS*^(T1{1~Fm5{B1GS}Ma1aPIm7vC_4S5Z6uw>q2uJB|ww zEouE^Gc!8ic$rk26`jz+9akVS7ta~<#(f7JdiOthZT^@}Fb~(WNgt>1{N=)XGG-*VZ)+a4VG5A31{j zSak6#0f}dVUshP~_bQGaRWBTGm&nW5B(_Z5XqKo!d4}YRo z$RjrViTW`c2U*l3mN2(zBnlbKt-$3gBga)9-6J3Q$O+}J1QBL#i|K(g68M0PPeq+C zI7*);-Oq+L>*?Y#TBVsdh43D<2U2%q2k~O(BIXO!E(n#`9p!tQWHOPizwW#HHfza! zbQSKMy4PTtZ8R!TxG1W;RN5J1pcoT}^(Egsl$d%Rt)w1J+5nRTLjyoPpzw@4ahA2b z9OU{9z`)2)tMu!b@t1%O9-g`d-*V4n#1G&w2J-r5%b^g$Rm+c$QuqU=$m|>i0{8BDh1tr z+0s+nk!{*+C1l!xZhwkAuWzUz*+SYLr*P=%uX)RqLl~?gqlX4%r;XkSpZomM){Ok* z+C#>k1o}Z1qDdu70!gP9`XKDTDYk{Aq*+KRmjOCrieZKQnR+UOlo%N$PDu@YvAazQ^ zDx>D^3Ac`V#Z?)mNF%G{Ym~e;*gX?FIvu8hZUG=Z9+5qL3Kg7j){cY76B&Vk1kx*N zpEXm%c_ds60LS5o2e))MRkrZRvv*%WN?j`|nTboPHxF*xgT)tGbKOd2rR3Tl^EfR1 zvIBtHwcw`vsXFsDapC?k<%1wxhZ+@fL|HNE^O+7uxxbaQ=bmWHXd;QXH1aUiT0fBU zYlDcFBY*ZCbNf`ZMJ!5S@xs&Pf{|2Y7%7DZ7Jm?Jw;x*#VZE0C!Mi?T)M#kd`k;PE zX&O?YA0BrEdWp~+D0Dl2+Q|`4%E8DhWMqu$B&~Sn!@PJs1OHKJzL z=W}OQTZi}RPK#Gotab>ptlx2|PeGt4G!Xu06ihX2fn}v~AM){eQZgP_a?Eb+&bn-t z$i9{@gE*cQ^M1@r*oHiP!EVe#fvhL^b$ki8lNHEr+xG(eIkwVLb9zIlOwB0Phz6hU zao}n!l=973;O+9?VE(i-1omczYB;|Y6(T?U9|d8cvLs!WrMU7E%jU=7SA8v|cggZDH@V)CK3wKz4(^`OD&3TE&$k(}exRTU1!gsXJv zMtDO%7`g3s$!4We7eG}8RlbjJYqmAP~EWqd|cmX3T&Q3WmEL^Ay>I|EK%FFLM#9RtfIZ6RWAGJ>z*pNs( zS`@^LxYRf6L*c&EA#(87kN}mh8_qBSu-6q7-_1T2&EkW!1nP;W6n|({saKqBO(RLM zd%W}LmD+KK&HycKy{wyD&E|AGNKdO|t zR>+Lk&DXXEEp}-oS z0cyI{fXRxVZB|?0GjHU-7*&t9hg8s_ALMZUpY2<(t2MKJi|vQ7d}jVQg&rpWBMej- z^bg(BU%YYer6TpJE-#yDygx7O0mR@rpNh%wwYXKwi#6Q(BjeJ55FK(JHheDTysSwx z7)>T*m4jUTdp?;|t+)(z{|>4F`3pT+zs;cZgYJFyj*o=SX`avkYH3eP%P(#vQ!4&l#Sf1lC_ z`@VObtE{hWt!fB2pr z&X#mzr)IdG|6<|x2S@I$*;k)!9K82Q`!{YIpiHtI4hAaw9hKIv2WMr@f0UI!T4A$) zuBSfmFgR-alO)LZS?>OQ7iXB*hA*94%?Cu!$mF~hVbE3=ArShN;S(6SGMUel{M@@o z&zYxP{HHhaD_JI+Izum`M?5og6(1vZp|}#&DSWv;qm{34<*SK6h5K~TVp;y=PDnnB zUuIO3UkD8xC{i$He~CD))qy!p%_o=dT=H zWAR~K_KO;Qq-R}_f!HMCk`RDqd`{n^xEazAisw=YZ8LoN`0bePYgKBB#c}5s!yslE z3?^!sERD;Zk)lqG1*l~if)nbO;#P0zK{wJ@{(y0@^kDPw{FqPsh`@{PPHpT1&wBPv zk;SxkGe>zAh#J?}{ILT>)aNx6vOuoNR}*W4*o=&jvd@;{gqbbsmAon>a|{{FUNqd% z64oIXpt+@-3PtKozde8Rg6o8{j_Q55gt>%q)!?rD6MFBQ`wuwCjVFP6zpVitdOVqo^H|LEi@}Ep=LJFJ_mM-sBeE>-fJjnf^VS{TDIIT{0^QuXMY|MP(RP zV}tvI>*Z$DlwrCkT#}nbdCx%;9>e;>EhyAYKS+Tty6%pSO*9X45Qx+mwl7oeop`J2=eCyJPOolo&E3O9*CI5J@kwC;rv26QYAPR0AN$iLD$Rr&0I&Hlw)Gms4w${Tczt^pdenu0c}bB`@>CDNVcT- z1-KZ6&iz-&etY%L2xSEAc~ornSv_*afi-{-xKs0B>#Ndw-KZmTdG9vQMo1b@DYtra z#asMl7jTz53_MPHS0$*9_19X~2t68GZj~cw8Y?mwWGvEIy_$|4lNZk{GjmA9RQ9|1 z?3AaTMc(T3t4|CGCDX*jQr@sGU_%b}V5CKNy;+!HPlDf}<1B7XHBjf}C&ui|ACD^! zOQo9iRc;WuhW6`5KpHC&!= zJf(;H%Yl20t{a6nB!*xXo_pdws$>r{GVhX06Yb@vB={8^57ZJ{^En@q6cg{VCuI@2 zdmJCnBm(h;83QU~Va}z?Xw3_#Pa^^uOcKM|jI?v!znBmIuz+xIv8=}@m-DUUv{(OZ z_0Cl`WdFjqlA(sX>ltgwc)z^ZO5i}6YZ#$pYtpi^zG;@SHS2(HaZy;o`ou4$Y_5M) z{+R((`CNfCBrD)3+L)gR{^zubOGc+*#sdh6dNuL;W`n<;K47I3>MZH?%SV5)NKU>l z56%kq3w<+LQDjeGv$AhCKd*angdpLQBEaaJ!8r%TY`BEL;E&&Ta402FcW%p2c*BSm zD?G?N)ugb+r0Hng=;a;ymt;Cc!euaV;~p~t-ra5wp?50Mv^{V4c@l zT?&q($+Rvwkb82MW7CN!rUEjyIP6G*7+bqcp z+daYmDxPOu)AQiR{7sYM2Hd>X*1F4yLPw(yv#i&v4SSB(UZ8RT6$crx9?uhJvoHV1 z06mR+w0;)|Cd{97JD7hD(h|OMCRqIWZT;qcnNUk()dKwyM%j8yBo?aL1l+_dzxi>> zZe30TG4vqz4N}bRYW;0@+H*+ID$-w!rm1N5c9e zK)$ao^_8qhx8-w}uZX{zm+$hnQC_O-6Mh}yk_q34Xntf_tE;xz=AESlD}q8>h^*u} z&EF!qk~R$N48`b$tTdTIaZ5>wvCU7FQ{ua0J-ue~IHe$OdlNLMu&702tqftOM;nV% zy?(rmRuT?AodF(OC4Z251sgIk>Ww^A?A*bChDz9OG|5TooJ_H*UJ~`hk6HOn?>cY+ zHn(%YKFE!4gJ=TLi_@CNP=E~49%pR!h0=TRsi1yTaXR|_-lPitg{Py#+NPQ9O`zT@ zFh=Abj`+0CDSX?y`+~4CD_*1!k&KfQ*`(Ep)^JIOot9@rc}E0*Lh(jG*tova6?*KQVx2nFDFglk%C>(w zY}#?(wd-+!`OuOh~Kh+1!uta` z2pWin%B5w&_kNiHkF26mTJEll>_ma4?TyMYgGlf}x2PXZh3&hHA;Sc)X+wXTbuy!gp}W z?=LZh2p@~OYMr(O)@pK+MIG$hq9bscwG{PLXeC5r z{G-!4pWKY+(ZK=dUMWAd!{^f%IL%_buH1J&$N&ZJ{KEBsH88h*tG=uf`b{H8xrojP z_!pf|Mf$(oj5I!j!lNUiN_>?c#b646PfWJ?HdTCdgjTVN;E&X`TSy(42~LyGg6`<` zB-7ihY4_1_#V?RVsfXb$))C+8Is=m6&?8tOfg=O3*bX!@cKzeU303BBdMsKS$+)4z>0kNu zAQbA)vQA?S|A?Ao$W3@@1la@Fhl(T!pjgDW2>93omv+Ndw%@uIoB2BR+^aP!#outj zT=Ef7WNeUjWQFP1Q|Fnq+`IBi;(VEXF09-tE9echWXMPcU&WlprHYB9oF5kwgd&2(^==7%eCeHiHv2F#^O+KaEm+@mYauYcE%S8M?nC(NsKrjX z(>z8BNK)?z6jM*CEK|xbq$sJ0U?*`YEO&bsOtwM%J@qGSSXEJ$(|tEfH{8?G%^xl-PauYi^AY%}MFBjA&f3n7 z$%|J9X2yfX9lljKx;6uGI~Oku4+dzD8mxS@h$4+^!|q)w#p8t4#*VI?7I74Z$&OBi z!B`jj!r)Nh*o{JsJaCB``ENgQvikauIU!FYf#5W@seQ02Lc{vOrs{)Xi;7Y0$5KMPQp5B2Vdu+eKxr(~zY7sC8J3k+LSGE8c`;duQ^nqyW4MSf_(A43KKa(mIz z{83+#y)hk8ZblA2*ooYu-jEmx^eR-L|Hwop3<2^@*M!zRck+vi>QEq=3=CmuAR?$# z^;QA55FQWIFS_j6kU3>`qdEAR<3j1--#{zS%8*7acxtYxhzo|ix!)z?xUgMNB3k;o z;HPqLZlAS{@^VIgYK2kax^le4)RD8tVbPv}eoB1N&!R%5+Tjr@>=;o)SUA?X)2_Ht zIi7N7qe=`>eB$V;Sj(Hbb^l?wC|?j5doB7hLdknesV! zcqQ0}dRoRWAEf(~+j0wr`9FbeR)_JhFGlWJfY+S@SVoPiflJtrOmwVCQSCFebGupQ zi#WY(C;oD}m&SL|@4}PM+w_bnpYou5?xDz1mq)%F`3pusMeE8;j z?O1*UH``j8$Y~w*%odgvJji|cu~B(Hf6+=+ld=;3A}4KO?X4m9fLLAtUixm=$)$CL zoHj|_*7#ZcC(iGwqfykD1ng+G8AQ3gt7gUE(UmF?G%8+EwTOKUD>!Yky8BIWTv!N+=u5b!a3@6Hvn+m`CrM zze=?<#@xvcx)0mq1Q)375r)ChfS7aPfqWPVV!p3K3-v$%o7EPW6WeUfii0GU_Gkuk zM`JLKjKONWFV(zBl$-sfR%-zIJV3ii_r3@Em+C)&h!ZQWieDu~hS zGhH;nvgjgdE<)o^a1WsFUBy*QycQScnMcqDZa6GH%tbrSF1Ysb*6ZkccVKAuhNJ&AV{B1PmH$;XuLBz@*!1$M%?Am5r5T%sZR;8w|2S-W-l{4vj z+$S5%=u0rYxmoy{6^kSz<(xIDfAOb3lAEv2Rwm^aLIQA zpo8ugwDkL*x$=-jTFF6det8zS!6=}jZUK+pP`_3Zq_9ZhY>F7+bcn$uYf!TbMm_A5 zL-VjB1xUZoOD@h>6f7!-G{=OSoaWu{<>#qs71i11B3hc%Ou==zH(>=UC5?zOebWFM zGaQJ1s7yT}{T21D;v};=#!j!k!vUf08NNl<+`a2KnU75xul#aiSYHoB+rlU@zZBx8c+DD!@i!i%;a~$~Z-n>ft)%LSZpp|cC zJz6=e7Tom#{sR$r>viS+6FK((0WcHnzmbCTq~S&5JB}$U_4$b5t|Os-W8q(*qD{VY z9uJWfynQ<_#xVImtLVpp6{gqr-DP3UO0{_g>q4pkE^unOjDVpT@-1FFK{iUk zqKa+{b^*urjcy_y(q4ruJAt=m2&vEA2nOmEgD*EgB(FU|kf0)b@nsrZEpacN-AHUO zM-Df{W%*MX!qT1>T9^31{}TQ4^$Z&`QmpSGO{}b1Nnfs-mB8B=Hf~EFjubbuOPG%& zSIIL!90|Wnu-IA~mgB&JB0a9*O5s;{5&plwcqM~7B8_MG?5ZFs8GhK-)6v4!3w$Y$ zjZ!jMzpP%|QPnmzc#wwe<=@~neC07Npr z{x9C%Ix4F5?*kPa5D5WErG`*aKo9|m0Z~9D1SF*e73ppel#~`JDFH<~q`Opl06yIkum@oZ+Ez4sH}_{4+qIFrHwmAqkvkHUx@9ndrZx*@R- zDK0IQX#>3+apaq@mGRE8-qK1F5MtXILMjA=04V3ze3Z;WcroxE^;P=bvB~|SO@NHb z7ya~rvy>?o&<1+6hg4imLEU(7-|*c0`~8Gb<$=^9>SFnt3hQ{6I4e8AQUlR&#RPa4 zoH^SYmSdf3vE}1-oaQ$->`-!tU0<7b>=1V$_8JgxpEN_+p`FKRrFs(DO;te|6I=rz zyMgYxgAZ_iczYNRW?BGgT3drC=)^Lx5%`_Z9?|nRVgsH!*^{8JZ2jtUx_$Z6HIog? zk84c*2b0Ju3fThFcMP>DduAD$c*Ymc+>8Cv#+G5Q=D$|xH2|6-Z{d3Y1XK`^V2Q)dnh!HW>z5-IcrF$VtvviYO+N=e3QtI-lFt z_GZoS@y#Or=uUG0uBU93G7X0yCy>o03w9Zh=UO37fhxg}XqykD;PpdKn}OOdU@+~j zM{g7pxl^;yByllIpW~>iQ>G~Ch%|9ZtU(TqQg{JD9883qZbY*5n1vPhD^!IIzM>Ll zI_d+vKXuT=Uk6D{Z)8C7+u}X%*MYj~k&4OXR}8F1<$NexS{i16;`2N2^Wde}h&?@x zWcK6`_>QY0X2qg=?`Q$1@U(Qh-zO+zHR6%0a&@C)fs3*qGaF=7YYdOetXjMDi zvnv*J+RW|&&e`MGW(&a~Gu?~#QCdTOj!+lleLw#TW^8}L-*7I@c+8)Fl-1`Tp54Yd zlsvYu{CMy2E;C~J!B_+us6G1+TzmmRZ*UoT6zqhu@r^opyW zH$-dphME{gwxn>@`$1tz?b2!tp+O6gR^1NalEJhzI|ZEN97omwW|xxsv3XxdL!CWb zI#odt#YXoc$8?fOH(#Jll+Ug(QtT7Q_xY<3Uh9@gL64-ujg%)^TvtqYuGEHvF~C?a zhxS6+<}D`x1Nf#V5sIdVl6j(CZ)BobJJTG@guYkN8mX@zKzvB#%Vqu%gSU$GUaz13 zs4GEu#fbyjKEL_TpC63gl1n2_c>ZuJwWoqDMsWhugKe@Z9^ja>Cjbw%8vJFSvzRVH zsCY`Va!upw8e(V?J-=%8UC_PJ3dIGIRPBMu*^K=5y#?@6P+9ryh4!WBgK=Q3vTQo^ z!tAtkf1MxH1-lN}BgWkGTm)j@Xq6u;%7KL=8*_toop6Ot+9;L!|1SQ3CV@@77&Ap! zI{93MuCn2RI{8|RDVJU|RAm5+_G(b;h>x{uW3^T2hC072tComu6d(^=fuia>X-slc zJ(bm|{n4aVU|X|kBr*kP^|N*wqsz+xJU|es?r6 zpcz+scfXKHfDn@m4Q)z4gwWPd>&4g9@Y$GJ?qcwfEsW+aH84kU zBQhqvl-eO`I<}}b29z;n?l(th1F8s(aeE#Vxu7-g3)=u2xWRT&a9%YVvpAp67X@$^ zZ>XDdJtjDbcn#Dddj`>qcbb<<+vdN%r|3kS9yd}-3(RNr*@$$49IeqrMay;oDx=)8 zss#Er-#N9}@7h}R9?W+{lbis-MsG+maqsh^Z2J>n7kG!h-&lJmCec}HZ1UsKgk7Vs zp=zeFO}y3f0V&4Q`VZNwZZB*nm4|AEGNAC##Ch!dd?>`#v|h9RzW*3h?xxI8<0YDA zr=lA+@$Vy1mOr5GPsheO(d2*dKviwcww44L{?q~hMMCSnwIWcM$Zrq)(AI2`wh{AE z`UB41tJKgW=Mu4}@xKj4&NBZnMKm-19&ynCQku~lFR@gRwgO77SmzbOnL0v;r96{w ztO3$C0R{e*8w!ffS>~o7Th&AF4dqCM{pfbzrO*m5`++?{#ZkyJ?f2LjUu>!X5;1`T z{+r3cM+$T&QU@9x{WrCkV=ZonSbQ|GRGN8TPl%`(mKBCX3|8ur6klD%Z4RcRyUQaR zRb;?G-vwd~C39yeh%s$k#wvUTQCfaL`5`(gsT9=6){7fed8&L*#x}v%kuz-_pb|7Q zHHIKVIA733%-4n-ivW7+>gb#DBte#(NH=uRr{28`j1vq?0+sVKY@GluQv9P|ZO%#lZEuDc&jX#^i; z#V~zxI9f{mVm9I4DK;B+rukl|7E^)34SMGDISrI1|2EfCz6QlZ6g zKTT8N#Xg9wBJSMs7YoM?CykbzAq{MHT~cF6gcQIgO)V>q&Y|=bNb{d-UK}M|Ta!kk zE-wnmicSH1PCexLR**im1=;{l=HPch1+cNoCfjs6{D$a|vm0CFX8TgN1YzLqYYC~P z^Sq$t>TvDGGt_-kTF~-!NMFfHd5P`6n36TvE7~{vTy0xQ)W)^J4w!ue^?2DJKAVgd z7@_YdUnCGL>&B)sc{oKYi+;{t1i3Is3PZj3I)I-ic18hdOqyMFx5MxCfY>%^4x`l> zp+;T0>DbGPkhSAy>S*9VKUb{cY&>69q19Oms%@)7fXFUbZMIRNE;J^Tvkb^sKX$>! zleOmWah=w)7LMiUh0!s0Gg0WeyY4`>U`%;WM|r~yB31_1@9ocStL(@f8Wo<(6}}~M z1S$6h1wo$Hlt>|kqfU<>ml*GN!7(Vumx&d)E)y>-=*=3Q6Ke{LtQ^bNtle0B{u7}8 zdf7bS^?*oHnLsR2uPvPQ`m!H+bA^~nVU>RQ%rQVU=qPhpdcP*Um|Fqh!I@Iytov_; zBHdj{zZwGC74Ah-(znZnh2f^kIZyloApNr=a`i^LTU}o>I*Kx7&@8rX@_E5Y?xw+4 zBWBWXoi|A@Y6+8GgwzsdnEk>58c%6MQo$p;`s66FML?sE{VEax>;g6+Iv;KtX;$-& zZDnU6dK5Yw6W96ysGC%4q|=S;+WpxnpmnDCD8{%vmrO;Co_)Ai#qJ`pY1z^zh39jY z;kPo#$eZ=b^-GU^eHsi#+2m#iq>%AdkINEzZ?5xS`(kcM@fK2L0rih-5ZITk(%lgF zajlGhH$3UHyPRRd^r#HL!t247Ndgq9xJC#Z&wJD!RCH)9gnf%7KXhZwlEKYbwVG{t z$DBo1P(x?ANz{=EtafoTsnh5&&IS|guF1XR z>>DdxCw%8zK?9PI;#x$88<2+4%+$nM?{Z92pz?Y;4)VeM>_}Y}SvGqujrAv4eXL9h^;AUcXRXaZDODL>WVzVF#i7OIN14SFkhEOxq}{SSYqLEtV$3x{ zl)HHqk_6W~=2fj~dJu>AOU~{^nZ7@23zRP^Lz0o*rt>=r?=8yH?E%bSQ>#5r)%ClU z#q{PuFNc?AjYnkIt+__$+a4FP7iHW+Ql~fRl_w#Jt+g}Fk>lv1mFk~RUdJV&ewntz z)^`-HH;q+IRBb0Ybb$7Qqh{xuy|wuADTosXc#oQbUF}V(UqHSJNPEwPVK07bTZzq% z!F5bv(pAx;V8^x>a5^QK5WFYoG0^>^e}A zF_8V@eB3U2@VWu?pCGum|WXcq92 zH3`CX2KHLC&K0*0pqy;VC((0O!C%xiEPu#UJqDaM5wita`Rh5`N(Ef;#miG`=|>xO zu9l*W*5I=B|GrGM(na}@y@)DvVU)lGSk{V{zxsigWI9l$_^kA{hVXZ1RE;&PK;TnW zTDa8;U+MNj#SPK)?Tx`ww~CjM8RkV$@M(=EjMyr?m6N{m_PzZVwDKWnM=mXOQBai=TTNeI7ytJk^r!H&>n@{qZV=6?X8Qjy!}7AJ%6U%e}%4i zd<+vSqx^&=>gwd|Ox1a%m}pTlTi&%?u5_g@f45}fs9$x&^4%#=lv9Topx~#xG5hyZ zz3bHhTD*qyV*#eove5tFNid2Yvqv43&@Ggn^yU#DXTw8Fmg;x%x3s>Y*qlFmGE-WYoI5ar8A07wWe*cBuik^Q3g}?{oWMl*IM4{+EeA5{Gd4nTJHU6O7))= zlIsA*-G>J;kNul^0yY5#m%q{VabiNNS37mlW29@E>lJDn`;e-O=+NX3RTs|UIKV{$ z8MOVn)mUl8NJV-jdNg|xK(yHh7uw#~?Z0I=AM6qv8_NOZMSu+uS=V%q{4?wR@jK(C z?WPOcPj}My_l?VwbfDBbft_n~L_S;7ZP(R&P^YKMLX@93KJo)?Xrm0alg@$YSCCq) z`JZS3*%ZLVeEtkky8RT5Ur>p@)l~>#6lOc23&uO4Pqte4&k)UT0$GFVBK9L&@Y{Q( z+evZgxwh}mK8tYir9M3*Ee($YS>mI?ONPHbSpV{`amTu`m5J6=7-Wx%?@c6OEQ}D+#APt%nDt5ro_75 zuT9yV-7`m}AGTIkoe~Ofin(AfM)gOX0h^yonZnA3I4{y#2yNf)UVQA7{q-m(|4X(0 zB*&?Kxm+CoSoNC5TCsodG2zFBk9KDtgTe_r*6i7DKs*ML5UB^m>8Zuq^$%wM%ID2?EQ-+uOd5&Rjatd759?jE=$|Pu=!cbx$P?=RUa!)sZ}E> z7ML+U#AD$2%CIEtRA|P^Zn0gTpCiUY&}zpwfHmESCeJpY_OcjU`6{z_X@UPjOn zltz8GGwvFHde!^4?Wey*e%=foavS)A;AN-Wds_#@PG~`0L4-8tto3h8^M4&sO$eMj z|M8coTedGC3<{-?ok?+74cG6U)Zd3f^XE`<%Xwrde+Lo$+YYLAH4!*gun&7;;oTZk z0;ghMsyyKzl)?)nS7jE5Us}R`vr+x+5cT+WUl(MDQ0%KWS>Z?{0a7CfY$RcBZtei| zW^Ub7qyCKoz<+;T+?DPzb^9*Im6a8|qmaLS+kapBmrdg5Up+dBqJ-?tAV0?X0;9fL zv$^vhA*IehBB}p%?f>~(br6fhZumakdf1pIF97yX~PfqZaE_;1(m-)}IH=Fh>{UA_1C zcWeLezpHDBIZ7Z??s-iuS9hz8`~k!&1ZQrPfTezvu%lHJx8ChH^~t|o@PC`ea9zyV zra(NUPcr9s=D%7ij5&ho$os4lpHVUZ2UuO0JBJATb?N;5m;V|C{AaAU7uVL-1iU+) zHE%RjRaGSh?`tyt%gMJ!@?-u0^_w~{e@5+#S|o-Th+3;*cL1o%1j^g%V+F0r@#0cM zMw&or!YAn{HQwn(PcHe>#v}d3kNU34&dXFgUW6{aT=1zJ50Qj}lTGwD)DAU9Je@EC zdm9zBz}(ff5Kl|Lc|3hsyOVr)>fW*Q_QyZsY@SS`Yf-O|KJhqTkCBFx2^EM0XXnjR zgoFF`$sD>B^%luoO?QBPlqElnWUQt;x3eL&hHD3)R^EU^%}?|6aWkm!1yYxG7cvlu zY_~A}P_O_{b{)X^ZD30P@5y25fzD-S3s9+19qfu1DbLzp+m}b}X9J=evw~j6l>0gz z^rs3TjL<-#8-9#TK0ZMh;pkSheOm44{^uCaZ4ge2ka^FJvPDve$&LD}agAZIAHW=OL?2eFm41`Nnm#^#J zIsV$?hY$f%P3NFNt|IMi{v#D_6_r61!?StUc6!WEJPG0dYWC;~kSx-4zJ0d-ueKV> zbr=y50aEDYZxkE;KI8F?F>!po_r5>d{x@G%A9n^b>6_a*Zuft&{yp?$&tUZARvpXG z{)@9lw}eDY?8f-UnR&whtk2)?<=mO);qc3YkqNE8ElvL=AHcVV9tMi0=J>Z^*I$O< z&4&TIQ-8G0>-cXT#y2_eFf6LiMj`&i9$u4s_2tXwYC3LL|JB17haSed{h6KLRiXYm z2Pg-j`LxpBHTSO`h7j~H&=+)1{`y(J+kfk0z0!d zp!t-^g?Rg~9>)K#i>s!^46_7~IqRT=0PJeSM@L7u<>lp%WkAmbQrou6Is#PqCMU9% zPw8%zdxI-OlP44LP6sJS3S@KL2HjM!R~JP*p)j3;s4(*6`(ewDLUoq|V$-dA!~D;U zt{(+QpKespIUw-&ko7I0jI-{qZUNAdZTZ{3Oz!{uwI-Jt3dw+|%_T_ciyPzwxj^U- zNrEFA#Z4b@nUAe50UYDUgg2KkRk9~BQ#327+q{nk59)$ZJ{yExgwWpq*b%Yw$I(w*FwtGV{}_nSc7cTmH4B$oPDa}DgG;8b#j%!fmL z?513ixgcyY_#i$Fh-l}n7di<*?1Be2pC&#-kQ@E47^Ofy zvDlU3J8i+0Xi+?J4i^4I(qD}O>}6fN9*~iVCJ@Tg1LgEC>n@vfzuGvlxjaCXMA*>J zSNa#<2W^U!_^^1uxaS6XT-*ReQ_D@=^!KylkDU`63;Lvj3ChPo1pdYy@c&Gizum<} z%%IpfQcIj)jm4V}`UI$AqoU)w$L+Mcs7Da>uXb)RU2YP}k*r!-usEQ(7(gRb^jK?} z;vXK;*{fo6s~C*Q7{AzVBx1!t04Whm)%WUeH}L0eso|by(I`rK$^~LrR%#K6Un&|* z&_j#mzw-GqUZ;wGC`9R=fi(dkmrpX$7eT*}|D{UQuP*fXAe#u10I>AECnqO20c(K3 z)U)HlKiuT6U+aVG9+PH)l{qCB%G=f7s|LwMqIkTrK*@Q;`M^_QthLw6J(AD>A0Pqf)rerH0zoa-CV<@m)N z;bTK959&o{Rvj(t?JoAb(u)tk_*ajFh=razKP8j#F2Lv$BufV3K4}hG^F_q|B{KNy zUlU1SzOfVM{eQ)O(Pbe9m5b*r;`*Gw7%cb{iB~U^4B21ogT&dp>2=gEvBZmKpylvM zK7sbCTrA~P`FQH9GEvRHkow1id zk+WV&UWD(p#dWe@z1UwabLbW0UxS|Z-rgRT>(5<-yWl)EaG2V1%-K9O!Qd{);rsGR z>=MTLroE-5rSp)1bM$#biPvYkQ1n*x(bzBzrkb6qyB0U7!eR5Baa52l*3+*sKP=3} z1tqbueziNqn?qkJGDY$M@nf)RJTRuq8bGM49+y3nNHXxUmxE2KCbpAT%|&{6Pe{>; z18C0I^~obD?=*>}cF|$PBfIE~ojhxF8Ebaja}7qY1vhK z>u=q7Cq&8zowSfDan{TIRY>K%-4W{-kEZNLPvyqUDRS)4#;O2@J2tRUa2i*n!{_cQ zFBL$kAdKGaqsLMGID2vu_;Lt!ytA^4%l-;Zn-guW)kiC_tHs3Jn36R(lo*V)D&j?x|}F$HoOB z3kjpvI~|3_noBF9SsA-ZhjJ6DhtX8U3a3J*2=G6*l&ZqK0t#ykbs4AkL{D9W(5|Zm z=;MydE3JpAc3EU;g_`AaDLJTu>|XirLbf{JpP7wIqBjcAvFh%~_$7(<^fhuBXqhSYnG}x**f5+|SZs zb#?#ZrTw_0QwiwJof3Rw|M^ZSTW}VG*9|@$09moVYre5~H`27qSVc?sAIaJE?#oTJ zSC1cnuUeMR*0Smya{XePygx?6yZ}7KM^ww_6ovk;3!R@(H!044NVj|+=kpy!i|N#) zy>W^(*%i5X^K|8Ko^6OzaA~D#q)Y*|7W8)K!R*3nhL%-YoTf7yvyhQ<>c)2+Gnc{# zoO{gwb7AH63r`#?&G*l%S8*|l6`ABeU8!7euNvk5?-}~%bPZsG-I9buczAyxahV?l zXnJp0KSk+3`r17Eb6(dxza!?6X?Ipx`Dl5_p_Em1Z(;Yy$vJt)+?G~(KjY{zjjB^V zm|QCE13OvE@@xB%D9MGXWta5Tj8g!4kUP*poh4gP*`iX~-5uW(Ex5J8=DKHGF)pBt z7ObqAoLoG9947@7d`?uF-^H(j89t!1=aO-xRF3{$)pJ;UD}fEQjC7h}s~cQt$B_~E z_PTMp_SKu5>XS0Aa-*p~@8iGMAoqRZMM{rFfH`_lOLw^%NN+0Kq9=U%bD1We!|;^Z zI>$xo(B}APAfZpmSx(2JL9=>yEGuJGbx$===cCTR6e}t)=j<>c1{UEQa=9-?pgBotVoOYN4@vcoc#BjYsV z`j9(a^n;ZmJ_#vS=oj+FOQrwUT9ee(rQeK`ll4LHEE5LCU9PwLW7jZecvyIjXj7>> z$GkJKN_DL>=YI9c;u=yVaB6*LsQ|rC{JiUS`A$Z!c~|+1we+nq*OLKSHGMceclT7P z-Gb`JsU`alFOKc1H{yz>jKJF|7OG}LgX`9EE>}-1Ol7+d@?$2Gc!V-akweTeO8`I( zmg5&L`pdTVw}*X1ib>Nh)}Q*+=-JPIPn^XedVT+_a=`$5soUy9EA*a8FEctec2%YI z`|bdzP?`LSW_6QtTwnWA>UJqA*0oi2#Jo@kfYEezq>Td;idMAUlw0qKso@o&h9f$Eh#L4y5Q-E4sl2oPK(Z*GlN%ypy@3?DTaqH#N8ijGL1e7Fk*Dv; zAfdZ0@RQK0vZcGQPk|P)bgOqC5RbA2b~LVAW5C3F>4nSK87q<^Je_n$+@Zy^kw$}KL^)z zNYh$2OO^sy);s3`egZi}?%$d^JyHEycq^`W{YoOLz%1ny=q<8AYIig5RJB7L>h~ZR z%M8S_$peWaSu?G(N%tGq=fmB_o*UJtZXO8Wv7}kt1^fYY!d(>wZ2-S&?Wxb&fPLXo zZ5H<^@pPPNsxUYY8zE@yU=5p4<_-jkfAfH=vS7D7$nBWMKgUqWj8V4&80=AiL`?OX z1vRpHs5eKIKi|D|ej&kK8)8K^0{EdCBP_uXgd2eN+wvO61u)t@zZOy+o|HSr96uM#j!52!hQ&5(^ ze|=J_u(@!TDh*I6*Y!bCdJS^@qTNU{nK=!im+&W%6QEx`3>?1pwiM`a_y_V&3S^>p z+ubxGmx_A5wI~?5iHN6>@+7m^GjI1||F&-a^Mi*9@uC{`-=hT3!~SD2CBPFA6-v$G zR}1-h2s}T?iyj)_d=|gsx0Z4Q05=L-fMY`e_{^sib7`}R=HtLWkO7u?UbBm*oud&* z=shON4S2I_E&3S^a7bp?0SNZp5$=cYKqc}Tpu}a(0FI9~&Qa47i?0I1)9zvtk|W?n zQQ_)8cd=kNBPX^kG-VV|f=|2xP}0{v0eoqHp#>N9eW7Yo$d*FlArjDfS#OR$Pu2&> z>8x)(zEviSDBw-}`lZwH@uAK)n46N~rEQ3u0`KSmT3&iGfvFlr%8aMm?Oa30O3oS& z+|$!Ou|=pqjfMvk>UMld5sRInfmC5d%mDv`PCx#BQ6SVxo*HX)-+}HU991T7d{leqBn4eX7lpG}nHZE%IZ74H zmmk6*a0{D3%Oq8XE^Hi&Li6Efd^V^`Ow468y)$hU-yZ?G`u0%SbR z3+qSjm6x}B$RC>!pH$*F+5oY4!Wkm75xg19s?4{-yn~ZK#3x@(*8|H_I$9@>^FX}c zOQ54#mVPgPL#ewGtoJ%+oHVJMO6UVodxEFaHKM#gF4cR19QA31Lfhek186ni`WghT z9&YUn4G-&ctb#HQZzK3mayGYU^L1c8p!Pxbh|gorvl2pMvbzDc=v9#k^GkgzuJ$r6 z&;A~({%1ZyQ7kqCCJiG|R&E_`BV_fi55(K3d`leVenz?7*qE@S10dz#&VqxV1K@Uz zOmAfr8M#t0xNxqtDB-9zspBoaL0utv{gw{K!3DTq-EE>+BVIB@uxSlekTuy}HyO^2 znaU%O776iT0ia0xmPg4Pf-!goq=rgxU#WQ-&(C3J&&^|p-mM*Q!1t9RG66a^UrI{T zR)B|4Nx0Y@$;$K4m?AhzYJR$@lU*SDmm{hAvoJU6}y8_!quD?T7I_yo^@&0+c8 zI%pGSWpyM_B*!p_Hyt_d(VL86->K!Aud&VEq$OhV&W#|qNZJ%(u=dHf`Z&e7ltwdk zeq2KT#i!@m`F#P|hRwpT-KyMAn?Wm;dLo~4SnPtoMRjkA}=bD)2QHc-n zW@Sq+Zc03fqdTwy>P!PI6279wev&oJt zozx93Gj0KIQlgHy%l4s{z)r-qNBy0`nsuyNUvU1M_&fB2F0CV|RaRnfjda8dJN}&4 z-aTWHD6ylNdLfu)1im5=b}$LaI@$s~bZp|mg@VnEfk_r&sTT2YfDSKys_4M&o=pc} z0o_PIRL&d|4V_Wq-CV<}W*3jwc>ci)*JdxlrsjNk?=yK?Q5T2w_)00nNgNwl09qd9 zVh+Q`#B{OWMPI_%*`og2?E1?O-JH-wD_n`%`x)QpPBWf~euYm8!#GcR(IkZ^SFzha zCiyF5^hx`YNLmvJDwY*WY{SK5ER=2%!P|+Lh;T8!K#0Fxb{vXZF~_y1!@;hB19#hM z=;m7DA1dScMv&!S0Tfb~LQbq(IPtvlxFd8CYWjX=wM#L#Z9F(JOy=$i`&)*wFp*-S z7{t>mwPhpDi7I;~3Pr;yBNGLh9UHM26gA-Qx4w-)v}+H|J7Vv6>hXDPoCkXY7aI2f zMO%fV>R^Um&B<*@L7)NwIJ?^L?-nkxqnoCH7KVdyWmEAczUTO`-x`mKi@aSZK&fhQ z-gv~DAc<>t7{7REtT{lvBMDc7CB@1v@g@i)2GNY%=CA4;u_`Bi4#SwdGHBU?FcJiX z<-Sj=B6mU@u6Z>$0u8ZUwT*Usu@0s;#LcRTaQr+sTAOZhJ$HIM;wh9Q?hgG~bw(6L zvvVOhFbS)2mQMIm*dJdI-JL%nbD!E+YGaYoJ7sv>1-509^%eBz(Q18^CgNcFRqZ&S z1km8zS*95Av2~5LY)Z?LKpeKp`vc{)oMC`6t+zCyM%|--Kz;Y<+tnj+6y#dojTueR z!ITjrmpzMWxg!yoi4L(JPTu4zY!tbp78H=eQ8MjG5SX@i1UZImtdlCq5bxf(G4Fbn zgcxfC=m>C7Z>3KWz@sJs+#D-ascaBAuk}OU4>|&#A***UQs= zd%J&`Lw`%UyNRF)H33HX%{><43}Cr0+WZ-@!C|CCN`n}l>enxM8+)pUk@Va>+I!)N zvACrm77&9^(iR~>{>txa3`-P!d(fN#g_a8gia;uWh=|GJo@9)gidCfm5%A#en4<_BLqqqh#j`<~nsdTn6(aZVy)tAT_< z!sh~k+s8}S;p;E2sFPC$!i3{@lRZFpxo&N+{8P{80VZqpOPqZP;-h*Vi0zJHX2 z^CUyO?wA7`Ri z$@p4G+(KW2syl~CHz#Mfp`VqQJ1G6B!+TPywR!4V)okxO%@?oiM2YsoJub|^)is~% z7`{{Xr!p(~Z~*DZm{@Yq-&8i>H%sQ4tX}NX_@r^9k!qup^OQgyZ&rdK5Xr@zoa@fI zNrUnsB(f}U7Y~v_a_xrp9haoKfTMO|pDUhXML7m5$K>=jKc@kOzDPr{1NFXOmg5_a zeCfrv0r>|O4bPY9VE2P2UfbYihxiWDEdViFv;8M@o9DL)yxb!{p>$SNGgFQCnh(;0 zV=8_34gva?;OnX%5wDlmKJ1nb2qj0W8m(W+ymxk6a!OdQ*UQbOGw@Kn%F;9ngjXdb zx%PNMCi(NRmRRpxcCCv&=Xh*sIiGL~|tTA+7 z#|#akfUC{x|2$@&T)*AXkeH!Cx`_CCyH9@E|sJ>7G^He&T&f^&=9fgF7~28Ib{*<;f} zWlPAgT=!;|DTotrMnZ8EZ&wMf74&&t7!igqahr?6mHt+xQ7s7lJM(@u7 zw4T2WQ{$Ee6oY`kzWss~aDi)=xkjXAe6a7y*hR_MsE|VQVp8actl_Tm#)sWUeH1#@ z2{TfXq`o+$tvuKp*G8go*0;4SjzfKKheWoxV7dV*6s7Cna6gws7WJvtY<1bOwQ3nK zR&Ees-?3rq3q;qY0)gr>DD^SQ{(5)c`bhj>j4n)>26^Z-%~)e?zB`gr(0dXf=3VIzt zD$K0OV8jbU*fccTepaHH3FL*}KjjCWfN8b;;c?_WMa zXH^Dn;HoJ_@w=8S*k5i+T0Hc5-$7W(p3bXp_J39#66qK>tE(R(x0w#=lTJ&9+Y?7) zp~PSJ4853`@|_Df43^)XU&2*qfDaP+20n-l^*Q~>#URO1&xcU}5~fl(w~R-_?dho7 z-Y@&j7N5^ZQ8&E3%oL(m@9p)2?L9_m@C0s=KF#kj0}2e->O92XQn_pG^JQdszuw@{ zDsK9e&t`ObZHJJtLkpv!OtN~7De;XtjH>6=jXPrDv(5)ZFXt%BfOfs$b0ShG;I9*2 z^4a|8I7k&d`+}v;$M~zbxZG&e6i5=<46pae@REhp)x06Bwc}>`Oht#hl23FC=IX^O z6-i7PG=`IVUpwXcZX51NtJEHz`wL$@qP9D|q4-tlDP5j2jIidzAPbXd%+)Y?<4_VD zxn_*zN7<8=n5%mR`>X{T1atPReVU9aY8&Ve5lv?CMB9zRHN-o~ zFnnF5495F8or&qlCPjFx-x*eg1sF4OhY(NO_koO_!{F>2Klihao$>GgsrZvl1gdMF zU+5yKe$>8eYQ*7JWh}B#PP|Oql&3jp9(7MY*u+fYb&q;bdMLYkBB@%0<15CX&@KKj zxB~{$B?|yLReTcIct`Lp3m9%QdB}wCnQb5uNP8R)c)BlYJ4WGJ6oxzZ7g|Lw;oiZy zcm6)aO>c=J9UI_#O&O}+kL}@q#zv#pa>++PV*axK(X80B#e@BGYI;=1p{=d=q-wQ% z`Cyj?vAqbz?Re;}>xBArgVktVN34DDfrC=BoonQyD6rr22Ur147=m6w;ezPFv_%JT z*{%ZIZ~{mocu1eo^Ieehz!xKmuB*Utv$ny1eU&(jGIEvCAnATP@Fj}6=_Qy(d{O+q zw*MB}dkS<#d56Tv4Neg8B$;qD`JL_7v}Ovz5iww5_}qxfu=Gj>(o`YWuXJiMoKj^) zKS@5ij409?BuAp0rU9N;HcOuIOCKtxjTTV!jg%%(lFcqa4887%^GPNWa$;B$@hNzH zZSef0``|g3OCaz*I57n_DfG!hKw_GDkl8@_@rd34xZ=(#LYWuQAPTjl3Q%DQJ$O55@+q99M*&5Aj8P zK}sBbM_w?XmxSbR3#W8iT<&-j)Q5g%2=Zz&ch5CXLA`GB{XS#7Z>X1Hx8_>bHBezM zyy3KMI2&2`y~(1Sc(EM^VD+Xh{kGml?0X>b^r%_pmD$gO_AHgh(?M5aF*w44iNL+# z^sBiWiKjDe1F)EXAmV9s-4j*?S4;7F$=2*HHvNq<8+2y|f;#CLYrpx>(LQQPmk^71 zNoNY{JD56P-C{1xnO46w^(?{lrhx?9SNf`t080P?v1N&hN^}(UM~*YF)br0D8CKT@ z;lfz*O}U?TB3eCd$s8Z#TV8V)xE#=NyVQiAnqLxbm)A(1f#!U;?~LKLO`GCDl{-s9 zk&hq}NVRCVuFv}g!*O^|au-iFFiRqInmzKsSTxk7&Dyoq)HBN-Ea(-vg@ zv&-#=PP&YVNL`yQ#VM)7`q3r@e{fV@RHR3Z1Ib`j=T!Pd@jC%SE>#ae`9jwc>RKmf zcY96aY`wC}k4v*~Vf?6s8iL$ogL3?lT=PRMC(4rWu&KQlgVzRkZB8#{=S@f=xt5w{ z^X0{D?(?3@-(QLn%x}(fzoF=Gvic2Zj6LDE^u0gIKFkcCZF1(WTYOQiW7$Y%-29=@ zyBEp6{wAmJX2#&jE7!qgNFl^m0;Z&rq?TaZG(#yQoy*qoL|S$J&YB`=e65qqm2U9WF>BxkY=Cx?)UMVrALi5@bErRIf(X1-V@ChZsD2|tK`IR%;7dxqlf z_RzI2#+;b}I_rCZplZzR|$ALSf(!pCus8ybs+n z6HXZIToXTq$Yrk1laOTa1Prhaj~bpkmw51rTbi=-MM6IsWS4^QfuRVnYrjtW&%=+u zCp3L?+`O>pKzqawROrM!XK5m-*YZCazwjT8K06`?AKDTf2kv+tVp!3>rJ+46SF~N9 zd_X4%Kl5D5tKQ3Gh}2h)=Aa+U4rqBrArtsX#0H&^{O-X>mzxUYy{8vAbW+%T z8_(9@G>j`Ges>}%%j8sFOJ*UdRA~W};=Ivs0*qXcLY3~~7e+z(ZsuD(UqjNEd9?@; z*GTb*(hP&lOwsPGh*Hq~F}{Rj52|ykw45~iBwDFN*-N@|Wj#=~FIr_q-XiGYhdm|eT{4Jv`*IkMH4>)CRjuil(+s;i^)Yve%7OFF56e!TlU&A`qp+2Q*;)v{>% zor|?@xLtmjOUzdiLJ4kPq7QfV%iB^nz%-nkwx^i9Quz!P!AcajOg7ng>1h;wN8DEH zi^jZLhIfkwn!h|$pzDh4xC?V`{d{+j5XXG_&OT0+lws7p>P-13{Tb2cqDm+|6gtY|DGiscYn%!16<^i?jw(K>`ilbNwKzl%;2+U=q#8P@r{~_V9f2Rc)iC zM$*Xe6xV<1M0YY%>VV?(z2AnL#&EUTW7e$`ve~!G7F}i1-j{=rVH_*0bIgORqwvfb zDf3mGEn-u{letm&z5GE>uIRW&b6?i`G`jdAp6EM`-4VNF$6?p0okN5nXe??>&qU5{G6ph3e&?>1f#9Se*1H~s(~#_0w!9k$qJ=xLhBm{oXw8C(4nst=khZ1zqH6He?`hnm8wN-h%}Tz)NpEKaSOwn{wl7P z#wVYK##3(|RzYGgjbLx3+b7Sr@_Q{YUjWq3lA}OLR-dA-aFEcfZSaknhYZiE&X*3J z2gPXieL}~5F2l8Z$edwXr(R`Q_mPuE%QzzGROKaoG>Tx+qvw?G z14ynDdrq@Ub+f$1Z*~azDETD4>7h&3*5}rfi_Z+dEpi$b(BnwoWN=~bs|Dp)O{HsJ zis!-}kQ*$&`O+!v0luIXYP;NMJnEoI`U*61*tfK^TKg@4TI|4lTHg6wi`9T2+}ZeT z(7PItMo??DDd>`VMuyQF6Jls>hKh(FCU~E5zm~r9l)y8C4W?iF_L)>JmAW)9bDWK$ zfc_##PtU7~e|FrgJ@@KzwR1z){UXXpUG~|{Ov(qMpCe2(cSN^5SiI?m>D6Rvt4pTo zq-cm)+yGz0`9K^ScX#Oxp12_{#&eozNwGIF(r@K%8P#w_EL=`#J!W#`etKM@D>0&o z!xL#3%kcQzjv{&5?qS1zud&N#A1$^Gl!w=uuBv6%*1a!9{ErVV46?f*55nIahy>=e z8_eDuBo9(o5|2c`k=IaDEr>8W)sIU_d9tlFaIy!g6|Xr=bd?L;vw*O`x6gStt4_$h zeXipGB-aUnYR-*v_wVuU!q@`OyOOnxH8_;)2)0G7`!SA9Fwb5DzyTb~tDL|upAxoc-!NDDqp{RX^iY?zvns?|!6RKD zF%^Cpg)NSdCJ1qZe{857iHb_Xcc-;(nF^XNRy`WAull1a^lWL%hI-DR3$3uwN zzyMEu$qb0!eb7PX1!OC~z2^7Qlr6(8e^_kpLj#W{o>1%l(>S3?CW5y1bH1#)a=Br; zruVh)x%O$M2`MtrU2myKSlLI&YcAbpX*PEplyF+r@$nA$(yQ(@+_U;RiFG?Y$}-Nm!?lD(-Dp>QU*)y#KjH~`5u{Vz&V7jsn0co zZ{%GKlj?3IeMu$IW+W#Xo2f$@0R;k_<{U`x27~$VL7-^L)nn5F9I6*4E!xRP5i6$v zVRBedHu>sIv|a%@9h z%Z4eARs9x{?ACMyxADp{uiwIaRP+eIAzC9IZ5(vjoQAorelbz#>$J4Aq)+U+Oc0+Z zI+vJ{U6wAH6v$iJcm%|N?+e@~yY*dup#XpCF!srgIJxH*kYK-* zPnbs`zN!Iq%sd6qL`t^d)W|$n9F^5lYRmgKZ+%O$C$ze#9t|H(C#>JHT~$pU>P?k% zebMjz{h#XhKX#}^1ddIB*c^g;KOwRv{xVcsaH7J%sw8zt&zJ8GsG+>{kR`kijBE zh>WQ|>b-2$2P7!p-W*y#j~PLBJOSF?_1D!k+ueP6iJrrQL*Dt>anCqVcm{=NLI#Jl zwMYH(+;`;dYI7#HZkt!`saWjnbRoFx!0|}C-zTWM@tQ>L^Lvq5pdY#(TDl1wiSa(Q zsNKGK-Y}AZ~8gz?&k)4sOGAy|(@8 zm30dD0>g*R7`G!XeIaIXrlS(SGX?5He3)T4FoqzL8T1f}rL@0j^vaNlJKNN%$Vww< zKKB}!5Nh4V0PNZT5-G$h`_qzU6)%#FNjNb zy<6xw$=M@eAc1|zUkJY78lIl1yj7B=$t&vI42lO7`3shW=gAcNbM@+-q9EhWy36uS z6#z*pLTw}nYPdd*P1R%43Ok@G)_l8fSF1U?v4Pd5C3hDR3q|AAtwB$9@8J+5((@hn z`lmT6Ms93)&Bi;IVl`DO^@gT1l)`ua3B+de1GHzBe9-hW5XTnAgq8007?2(GR=)6z zCi2F)I0^iizDX1ADZCYb8fQCrzFGI;K@5liZa)>mp@OxO8Zbt+C@>!fyVZ zTHU}Kv8H?@M$^E=)B0JOb6==3f}?P5AYw8@%hu#gky=$K+&Dd$0CTyGNxXXl$p5g& z32!yLq~~K|+Z2yXWD+Olo~F!{d_XPJAkV|_h)h~W*$ZwQn|H^dVds%|V(hi0ZbD+5 zi^8%x2KT#}R?Ev{L! zXiqa5pgc%|1Q@7b8_bjp@;5mQ&)?tct^|z97chn{axhcgMZR@TQCa^~e`1ImT36>s9vHLeXV=NT;&Xvc6(dw;< zpEf=j>kc%inz~;9c|#JkwP?>L*Q;^;M)}vl?_R7mbV$zef_z*96rG z*#Usk>nV(y5RuRhS+?P6bUWGcH!kVvEDTZ4ftTNCRvgP6p}<+<2w= zw+G2E3t-3=l{-DOS0)~D4aK(=It9xUDYo%2a=S}&8t^_(5eA(RdJE}Ig=j~`O5~I~ z!a#dwk;;FbnYyJv1aI{XcfEokge`6{z=$xo$go3_!s(e^Ks&~U7nUPJI z^PW6UD={%}>PW<$47Q99HotkOyZ0+f9*^8>Yb3{^@wj}tL4<~&%gFK zQz0#7h3Hy8qCqaas0f+ol#Kl#p5{;PtgWip!rwfgSW%6 zro6~CSX#tY^t(XsaL6BzvjkocsxI$*lR%i)SCVKz<62B{ynBXS<}=t48)n6(6A?B17Y#f~w*a860x~To4SE*?pt$ut zbTHM{C`_ZXLN4&8kgwlCp_hXbR5U{xJ!CLQTc5WXBDZ=tcAM`a^WsNC-kima(TR2& zC)a7VGm13zY&5W7!E<>P*d)96WK5IM9xMW%`704>Np|BZ%j~uHL`yOCj6geZwdb0U z@Y#GLmK|aM#7TTvBXJdun-b+*#zQa0F~i71_?q0r*EiYYwUn^@BwoJd!+yHcE{jop zmwDhX5skNjUF|F_UkKZLZ=b2aP!EI`*#>%Jbk~7YTHF;gBNtySq6;lGx4UU>pHXLq z-={yTGTzR`Lm0}+eud+sTw(?X>8_vjySAlx87k16PR_l{SrxR`FDFa%cqhQnMI@Ja zdSu6FcVve~0N|irT+-0DIiS_D>ABkog;)GT+3NN!G7^5Rmg74o5;66`Y&tV1JdTw^ z!`Ik*eL6@sbTR`;WN#?IaT`$-H`S04+D=QoXm*<94(5HX!;f1^f_qPbjVCe&1(qsD zl`|08r9m5^UN0#(bhh7AMQuhMU23Ptvs?^UlKYnbvf>Mf|9qacl(pnNT|KNIFD1{7b#p-V=%QcLt{eHh*ujkU@PLLLL zX2SGBF73tvHn`7O4l~_E#<(uj`GOaRIYMU0P}z@{^v{ovmokC`TjIn3s+LNiR5KWANqhjk8w1xA*Z8Kz0$wM&454 zZWMBXma@bqHY$jO7NWi)BO%W5h%Dfxb_Ha3%yL~U?~W(F|2USn-}tj^yWJLuSQW%i zV!kSMSwm8Xe^AWyJ~@wE`XwS@Y$-hB-ZCh-dVcjCQYN1o{@9;HN{(`vBGfll9{E6{ zqAszvXIZ$`hjGIwas!(u64VeeN2jH;U%pU$njjEsfd$Uab?zsJi%o>Odz{hEfv<)} z6d$BE3Wb`Z&+kkCrcVirXHoLa`5tJL0!Q?3$U~ftwny;>q1dY=_g)3ZHlH-t?JQ-) z1lyn<2n=bq08p7eR2Go=?6yGGkk(PMYcD7O==r%;Qo_SjH& z^!F7<^tkvn2hF}g+Bo@f?M!dtnKEO#fT`PUcntHa2h%7J(X{e%jfsJEkJ)ZS!0qrp z4|`Sf+Dek4C-3QC+Axj$TJf>E68DvW?v)6e08cQgFq{}%qk(;$L9)i=m-~Xoc;@@9 zF{0*HQ%76M=2W=|7p;sofi&;|Ic{HQdLp>g50ohB`3Yu1IzV|#it+&xr&8?&ij-+9J61Ji{`( zQ*o@D?=GEy4CS@x3=dEae$I*8vTPurB6+&>@kBvq4Jnz9yMIuV;m8)k&;SqUoqmrP z)llB_0REBLqmZJceAggG1Zt0(H*{`q;BByGGDq*vy~eeI4{2$010c3qGC1ggyjv;Q zAnL2KZkAG~0U~6@0SH*><8HD-$&6l#H4+gSbM`3~9}OFyweca0i!if-LI-f42u{}b zyWXw1Vx)c8dU7R(!(*r<5fpu&bB9!vAM1)HJIrQ~vndr|Z)PcBATLbO#>)Y>WCz^o zLe0$D!lZD1B6;{PT1n(m*W@GZ66vsLIGlq)=INKFFIgx;P7sG1%p=1+Y8Ta~EVc*A zV8sr~HM%vomMhwWnGGRx(yn)?+p6Py?h8@^hG+m8hVMWfsZPX9*2qa6z+48^nB^94 zcU0GMZBz~#iAZqp4|rm$)$6H9{cd=i|7+3z=SE>k3!Oc7K!CLg+ZK8Gkt=khVo~tV zPzXzThT#2Wlp=>TEUhZdnB^J^f2G4jLdliP&ruVmLKVst#EHTYl45cbJfr3|QD87X z9>l8TbOhnCOoTuAulikRdl}mv98e2PsWaWd1UVc^OU36;3}X_KtKGZ$MkhL-!Wams z(mdO|AxDfBFj08;4S1xhpL4BUB(t*EoCeaaC`MzsR@M@g=AR&dnyf9Puhmf+bWaFm znG6$^7)0sn$8ovBgP*WF(LS8PWG7ZpC_wfj?~zv|YY_9M-)^(3uK$B#;2s^6F-6n$ ziJ%V!kUgH;BNa-G__Fb$T8*Z$SkkcO_WL6ZzJfM%bKhq_XO^dmCg0~w|(Ol1Ck9&_WM_oqs|^vWLC zr~6y_*$-fFQF z;a_W9Oz8`$6G#{vAG@iG{21uD>aE|(h3~$%ywg)lNLN7gBI{K zdZsYt47X&(bU?|g(Soeb7dGxBYaYZ_2b(4^*K5V$34BC#7)8RxjKu+QoF={aUvLn!gb2Dj@%ono7QSV!-`aUPne)E?&Cg zv-_zD489RhKYS!ZDsoNCYnWqrytGH6W?WBXF7o!-5|RxZ47Du(@Uu`$^5RWLVCGGd z*?B-Dw;pIy7JUqdk z#^2}b3Uj)ou9hTcMPD`-{1rI2#o?Mv#@WVZwt0P9=YpjB!-($-iK$QZN?k z>URc$kmttkqr#4F=806|pM>IYjS3-=GR#YD#jwl#BE5v~!f;k0_xiEJGmZ-LAM{My z3EH%!^xChaQk+?Y#6S4=oqI@*na^Gi_367uMIfyl{Yu?D#KIY`E>WlNQx1ACd?zvq4C_0 zPpYmWh_D_y=Wi6ai@OOP1Yel+9UolKea_@+02CH8thCe507gXEPm%mumi(cwmN*<4 z%Nf_JD#vkO;k>O-Cj1>ArGGA(a@+U;$rJIpnrbi$A`D1HK1bugqjUflIs(XyssQ*# z*tq}NH9B9GoDC^EK;oZ0sbiJ4kW{hCFf}W{RhuNShBAWpp1~tZ0@w&D_hsF>)-%sj zlX`#m(UlVdtH_u=-UTT)@$)v+m@CQ2-5VX0Nrk1mGDOdXBP5>ZSLDZ#N9oLYoWvUI zj2vzvVv|E$ZJI+VeuN4(NVde}k~~%CQ0fJ9H-_WcA3pSWLC`k%MJG4K@5)c%6%#0t_)9F|%HkxBYz8 zpYH;sfII8NQvYnrz~L|c@L%xBzvtRZ9hUawe;u>CXK~Lv<+hr8)5p9swwWM%!qVLu zd-ll()lZS9L#ms%c*re#!=AQ|Ama`03HZbc6BQ1LPO@ExBW_IsoO_ttJu;jB_VgSO zQ(TOmQM+}^G}rES6;hu6sU#E29L}gP(k0y^zF-ERRb;vnL{8G4o}f@(HP;FyWbeeQ z*!3pTUrDwk+0_2ZKdfA|6*FDMf2)_QkAw76hxsw8A$sc^j`L*|eIoDoGShFr5rfLL zz|1?AZuGuzaHQW&DNEeJrCzxik6rUa014T^Igdey^r40#)SVqauw9SOM|&^iz{Bd~ zATaHqdlA5CobCwx4rZn7^rDQe*sMGJjNU=EL-(a#T2NwMt}J8I>8m|Uatb#H&*FM6 z38f3@kzFoB~R{Oj820Shht-Wo?K{yxy+RS=aMTB5kon~5qal2 zF2%?%nt%E`4vc46nHR1n9fyoVn516qdmPO#g_p{%eV0=XrVM3w^tFx2 zP;>cqc`a7vyR&TnjnWvp(O_Zq@bu*`JKaheN^BNJt#?S1?K@g?`g^(_?;hB znOD5)=RQjlF=-IW*IPY^cA240pa|Rp^ooi%Ma8hlQ@N3?C*)NNV9;EZr(GxjJ7lCa z<2jJWp>>KWVQt|@@5V)}ZF>uou7OSX!XEN28}_@ocfrYbm5HL&Ttxd%>)pfH>Oho2 z>=4p+hTnl=sQ_I^!aT`VATl^c*a4rbkek}qA;drp3DZq(K#Kek8dXd;67{`}LB1^U zFl8kRL$zx2#rJ3HNL~E8Q4UtqXg>-u8ctdgH}ogP6dG z9G?At-qls5r@-o{i7n-E)>_uwvf+tVRNAU`4GLLk4Ld#MxV|#nSX}r}!Gd)EVqZV| za$d0T9dL-x0t${3PT}QZ|A8f7CcyREOkm>Mu6Pj*Y^2C-RH1Fla|12m!vT~&a#wKK z$)h+k#iRe8DB7DwzVw~KoUWna^t1ggGV%ofwU5B>S?Lkcbz>c)T(ltpi}PHzfm1=u z;OmdAJyw4V0mjsP#|picf6fmA5qwVJN|JuzOGIJ)54Xb+GZUwGSfzAf^X~_#!WhHxF>y3Q7voAsXT;JDLro_xOQD4h9S$S+;JMXCE=D)PqD>*(czEeNt zSJKvN^W8~t8)>f3O0v7a_dm-f61t`Jgpgj^uYF%BwC)<3F2ZY&O}Qtgigr$ z@~+1?m-YNjYw_#Iw50s2?_`jFC9wMT=U?z}qzZm6E&@0JOkMHrTwWYAQ$70p><2Zz zQ;*aEFc|of+ut*qD89TpSq@&THP%?nbP})wqBFsX24*<3!DN;=PbV0sazTJ78 z*tZ6w33clRfQ;Ph^*=oV_9MsQ|Nh-H#y=AIwZKxvPBpfH)L>_QVhYF{)_`H&v)owp>*uCVz-tfe}GYiO3{FFI#$-l}$9LS=^beRA5Vr0=*mj1_c{ zW>c9ljoE$LBvOCtV*#({w^&Qcu59PZ9d%JbO3&7V}b)TkQ%V)HG zXl*PBk%-l=2VNeV@P-QA4T zI^F_=YNip|O%sUzdqzhN3RV_TxwQtE{-j#4=#sqc5WvhqYgF4ek$zOkW;qL>M37m< zVCuSngn*!4IjdJ;l%$cgpY7=X%OMX~^P!NlL-g74-#a*H{4N`Jtl?>4wJgi?jLdvp z_7@#ix$AQ`!D`&jP^{0bH^68e`PA0e!%pj>i?FK(__=jG;PT0`-iZZ9=$fEMI9dTt6B-{sT}!c=}&8>mPFuNy-0osv*OFD@OQd8Azt1 z$Tq8C$i=Y%=G^(*BMq<5+FuL7i`K8Ss_&clV^F1ZKWeN9*t;x_X~6P;-AeV|WJ%hX z!UlRG_c&HRw+I6+Ggz+F6SA&X~60e$u9*+6|re+bpAO zSXA!=Z#6iTt4}y<`t8f@1`&z+g|Ly-qsMGXt3BoWFR_Cvo<)m~eum7e`}|lu%0nsE z4*`P|EvM=eeXrzt5t0u0k3TLSf4?b7p343il)r=WiXKJ^O}b+*QF}f8eP_5?)0s51 zj1`@hCHp(kS=-A#S?IiD>u1L<5?zxv$8Qa5PQag{Rz0Y?taX^YvRpTCq=hIKty}1` zF4%HDT07#!Xt_Df)%bv&eqVCqo}F8~66QnFs_M@HjLNF^;n4cQviIxSkpq!hH>~|2 zBEu;stv_%3_RzqeALQMYF{C%QxI2yp`weQo^% zn$3t9yi&1n=)@Ofnc}+*{@LrMgz^0 zxh;L|zdpCr4$`0NqTROo#GLRn(TlA;%wtHOWI#!f%QaX z(Pzv0|M`ag+g9mT$1h74z&^PFITDzFaXl}@%2bo!BeVSd^fD;V;3|3N258pKB%bsd zUHPVd3b{+nf~IAqm@x;2&ao!#icT9V`V1bxY47QDAerYkdAAQeSR)X^X#zxH+z>ou z0tO2=Td6JR!UXhhPeE>2uK;;D9Ej7(c&dYoL3uYZ3+7MU!-igKCW%^)tlZzq5vX9Eh@_2E%hR%}^qTDI)a{VcQhPD7G&VZ}9`C<#e@+Ws` zhQECU(aE<%eS@`@Z1D@}A?_=OL1YUROL&3=^s-=C{m*eKAou85cv0O^uF)A2i$Ba~0em8p zmNdD1O@cbeE+?w}L`G^IvV3s_24uesXtq|3PCrBFxpl+CP|%E7azO< zZ0J(>Ye*&U4m#l`Lml%B!*O8e!9XNxhOgf$0Tj~_zyu{v2QVQbKq_;YVA>#i3Aho@ zETLgtU{P64^N4kZ$~fc!HsLa$JmU=787iQ2wkMZg2V{=y_P}%BVfz!#Ex?D3PU4tB z()ck!GLR@&(jHEO@e{WpNKgt+!#jQKo%7-4dDACv`07D~83Bx^dOm&@+->e*(1n@+ zK2QIr3q#*^Kz4lupbp+3PbYdiXQQX?-H)jCg^~x{qajo*HXX{^Mcpp6$m{6Q_boIq zy%EbLGPLqce3N22xh+l3Tpyh}f8@MIqcK&S5l^YL}A z4p8QYLoO6mOYbAXn@C0TU8dScRmZC>>JPx1839<9MHM_*PC1NP`({V@Ylo^Fk@sLW zc3+H)H9Ym6^*aW^1mJ#;B3c#D&TH`l2U<>Rdp2M6f8=60#b0^_2wj>g%^>;EM!4G6&ZHeYrJZ`DzpMWJyNuIc3hR5p$7F%`NPFQe=hK6AR>Po4im?Jf0m$3Q{F(?U}5*l^$Z38Y&FK|K{;|v z17Z-y!{CKdqjMcpn|XCJI+O(?rB7ro-I}9Kl)HUn$6t`Zpb}UfnE-VZv24PiVScB; zd>Tl5EB8Y+`b_W|+`kcP_KP?K_A8!OJs<@1;usSppP{b5ZF834nM=_(G@f_|eDyt^ zW0bkn7T40CyUEQ;r%<0ee2hTn89mSFySfV4yw< z7z7q)&#=8ITNR&v9eE#aXZ=whtmg}135n;XG-n;HYJfX0UbL0@h4w6g9cJPy&kvVa zs{yh<@L7?km2>E4U9QodR??`$_*Yp!3kKhnF7=JL70(j%k<*dqspg_BIQCGThJ{9M zT1pZH&PO@=-em8#pv15@oJGtMg6d2Xt!=Cwus!Bzqs(uB%O#+(bzJqRqVlz5JHhG! zFc^}KK`D{Y!YeWy=FtJfJXiT~bL$gnN-R(owyYyO$%C-+yl!-7p>=zfs|qYpX#>*b6bdM_l^nC@`a6Cfl#7Yn>eC;!W%%6}QGIE5Wa-6R-P_g69~IG~%k!_u0J6)(x*9yju#y+_1)|S7MoaRqV7#$g83% zXPc%`Ln~~Ns`GrBzAx8!w`$9@Tx~zgDWAXng z>i?8XyKK<#fyGQ*YQXcxKIS6%Ud!*EV@yWU*DogULCR5}x0sxG(ZCj@$6z82TjGEn zDpaYMSq5Ep0(gAT3B*;!SL~ec7zmaHSB3poiSlc)kuRm6JlGKq>~(2}g0=(X1XUl%OnEmgv`JJ>9}=$^CxC~J*@+|v$zY#_9o zioPKxUXD%I<-*V!f`f)1V!U~XlWeOQUV-9zv#+L+i`K(PPl}ZxBNZ`pP>mSvLEC)O z_pLc9F?zIPp99P`Dun?A)>s^s-(Vcp<`4Ft^H6@}9R2H8EM0#-q#y`(1stn{THO$%e zDE2Oe4;!|t5l>Y`t-7B|sqUN2F{jxiVfA63UqHXilupkniW^gs5S_UYS#6umO;0exb>E0Ku=Eq961ztpD2}T#FvlB(Vt1EeZD9JMWoo_+LA?CrQ zSpC8;+a2kR`rz_O2U$FSL!vr3Z(|YN2~ET|N+{~7$^fwI0(_#CS&4q!uLf0$;%%`M z_t`M!?5+bxH)0~`2@NJrDe35OLuzl z71ncac`j6z|DDvtwY+gq4~&mZ5~y8vqA+Wte?~IT%)diIfA>yVvAMK~8Mov*WEimq z>&)0MKn(rvDX5vrni*~D0p$Kpx#41a(koKuKpfebCI0B_ zLsV&xbTGphk%aSL7r4vKPc`l(2R;1d5DIldArgqJpMas8FOUMTM&`M*7rwEcG(Q!1 zZqHi>V8U6zDdI{6T!daH;Os&L@i&C{W-h`Qk-C8Ce%+nyIv{|{GuanZj9LGfJpA4Z zzyMuT*?y#hoY=l0BZ0zW-n@n+pAdmnpr9m`mE|Xjvs#LiXE-;{vWt}1g$gq`O8}k149pP) z_)E+Yw3ygvHGSYb69M9YYRC7}9>_qLPAsGa2$Zm)r9P0g{#kWv7HjqV!WTrR8B||K#r%%b~`^bAPPY{s)5)}M;9PoeONwbq^5eUuZ0f@2 z1S4ISQAu`_IcmYQw)t!(kEaGWkYZ zG>yk`Z-8*J@g$IEkBNptCo4@Ll1nNUHhSp>%SX#^ayG}z8ENNjM6Qy5T_jRjNV<6d z?dFLWL!It63hlpjUMm?XtV7LPg9GB(=UVHN6o#q2sIN=1#(+pmk|{eZ_`jlj;0gaS zr9Eik_vig{B}BQwpOd+zcqS+Jt4Q%4jGHX!YLn9W_h3;BOr&2v=zof+KIqVgbD+h}En2`7s{z zd49@K0r1Onzm{oO-1X_Di)%{*vtXTB=JB)1A^l9kcS~4(UQ{jMF|U9oj5iuQJipG( znI>Yyq6ip#$UMY=bLWO|YSyLa&+Gv8lowrO`{ny-mC=p{{eH`ch);WOOcbYR{4;R} zuqkBq)W_|AV89jesWr-V7IZp_??K<(k^M}mxts&d#H+W4(((lCqg8`sk)Bzk_x$v)c@pbop_fFiKOLQpidqR7a6j zY)P#xnMSBiJaSVW2ZhWdC|`Z+Q@PEN>kArLW@J3M&<&Ikio317cL!&#P7e@EjlOsUVI z1}wdvbraZZzA(QNdae+qONV)n!eA|M~% z`W}llrOfVuQJ>j|NpB*YZa`WrKb&0!MyTUmBn>m;b~Oc$X@&6LoKw{J)Wl~GiWq%9 zz`=b^)_nE66Yv!^sT#(DLDv=BVRDNK5H{>kmc+k(T}Rnmx}yiNS8CTb5K9q8cJCTT zv{GPpAkUefkdYev_^>Yqp}DEXq?zn<0-AF|>;zdVVcR^QG~Dv(l_I$`MX}nvk+OfqBOlYxVI~%-b$=l+G}a(w~IjtPBBz_i z+CD2i5eM#vHrAI+E(FXUe7oHfs6!6&3P z&{f2)=-eHLGovqjO5DQ1{>k~xop`eMiV%p}OGR`irVrAm26n||Lh z^3kaGHJS9QjhEn;t}Jx*nFBY_Crq`rfW9_Ubrr2~>1uRZXA$Usp_$~lS8<8b`0qif z!W-+bxdw4Z?;Nzw-H)E$W<1#paUk}{ zc_8PWZ4avZbEEIRil!FX=E^~FIX8(idCPjG1y0REGCbJd*p>uXJaEuo!yoT!@P*&0 zLj|x>#{pTuq$KKH+T8l}Zy}5L#n~y+!!e+ixFg0m8ppV;v6kz+wo=p&Fx}`iQ>8tp zZ9B#)qUIhLf_IjBaf~fvpMxXGCJCYSBipC_C+g=>-f9`(xO)*GiatnO^_tqSS+w=FQrhR`Z&6-mvMix7cO@cS^=vp#oG)`cM{^Ig_)1iJ zd3z`-G-18f-4O0btvMR`Zg zZl<*Qi{Lo_0EYWc@xWo2>~Tp_$Km8Jc1I8XG2#Kc!awc$pPJb<{_+9IK^&xg9^bPPt#pkCSsXy$pZ#YyFH<4mm!qWy;;i%&&RKzmhg+C3J3qEqW}BGnlO*?5Ufoce^TP>N zfvhwA(!Hr3K42Bk2)`?<=baew3ONe!-FsI`v>O6E%46=n&ovOO=I9GG7*^S1KW{S+ z=B8JN??#)?>)bluMl0Q4jVkF32eWOyvL6Gk$Jbj;OAU)@FU2$S1=R!%`#3FN0g~l7XDh6jLivKd4fD#ZTqT zjB0eE6^+DSQdnL-GhFJfY@^xZ^!NKVFmT9*bgXwQd(+7?2aB)aU6JhhqYJ8IF7XRI zA(~oeoV}81J)&}CYvKigE=`V{bUXL_%SynUGkE$2{(IpnPVr-wP$f4OB02bk|G~x1 zkEVOA;`kT6V;M`Rr;^Z0(XYSqvyle39=*GLD0K=^Ly5SyC@kPnOd4dFOeOanG`k@t z6p+=?w}Ahskb>t)FL}4B0CS+Wp{wMj*Wu@10|sxCfRDHA0`8)wko-izi%Xqn0}Wuo zWQ+_*qtEu`hM-{!j}jcq)=a?>4PrYl;mp(E>!(DVh;Y?Vyn@JE z0rh2VJ|6-F`@WA)@uJWleU%@yyw5muM%<=0>9hS%;v|CcF`88s9pu$YNJZWMVGIc6hGVH!_XqP+pwL9_3}v-$2LCiX`873@YVNgqG$JOuqd6ygVYeKrjRXCFs zd%O>0Kc9KsHtcP)zHsaNd_P7{_!+fBVE&xl`B`AE^1DgIXMVaHgKyYcE3ee7tyJ=V zbUn+1yH=;Vwi06pAKzkRSpZ_-#>+ZIOk`5g@Sf=@9dcvc9-Y&2i4v;f%Gepy`v@M+ zlY=%GCB*j@4oE=Bj5S%(r|!xBe8upO0z4mTXcTg^ow@eM)^3*v_q?Rq>T8PG zRrh9nFD?yLBal^sj|XId9=P%FU|m3iB#tJ!nLrk00E4UUcXE|JK*r-O%lhE!nf7z} zkAVYJfKG~_+8o#p5U(8E0-G_xMN)a|L<-|OfT80XmE$#UIiO|>Im8GJ<$9fyVQFMf z1MpH+6=;=*v_PT4R&K*XBnr+bdxU7Ut3fAGNGo) z+>xZF*_&SujYHXS#hU(g z`=StxaE@OQ4%-eS1hAK?={ z?vj$Aj0Skf;??`39^l5=aK>w;-R<`RbeH{>#h8ulJZnVCdW>T}&CQo+VB*?I^hr?K zCB|2Nt@Gr6NklpSS0akEgDb$8$*lI|Ti{~BP;vN`2*TCffC+$tf2qr(5>U>2*CImM z;T>&E5J0~ba*<&eSNid5 z2Yl|E)3H|+M(GD*>On1I4h;hd8qfPL-O0dnzm@9p5sZT`T(X{LR^bLEm%qck3Sy+R zBXegQKYdP0#_T~e!DFjodhcs_XZ;-xdFeNCloEmMHy4~#n!(p2n)CcenQwjigH$8< zBO-QDrp?GIsZDxsfJwgA;W}^u`1WA*S(chUC`nJ%d8KUXif;&o> z1|UdmYf|f2P#+Gqt(l4exh;#w?|+y9r%rMwVjerdLAjD?za?C~I&sigIfRH3`n>xShM4z`jR8~}Um2WP;d;^4 zS5qeo_1NEJ!vE$(NOJtDvw+hi4wU_(a`5!c@3Xo$g#6*du-7>0xGK5Mg^xg%%^ky1 zkPzaTM#~F|PC~rsqxW1D-%XfVqv2Wu&jyr*o|BE3{RCJN7t`l?MO$M23;yI1W(U{t z2$ExeNi?s~M=`$v1_!Fhi}+y#xR)C&M?bLZD1Q=RW09H`0Z|u$BCRt^rLTl#2>q?; zQ<}teZzIosuoVR{Df0BLnziea@hqZkVAP|g9X+?ibYTsoH#EpcpN#&JB+Ky0^K(j3 z#v8@929wg$l(0O}(Mi0}xbu)X;bE;4(AEsEl3x4hY5JkVQ>AMuQ?ROMxl=-b-+S

v-+gW|)+4@}5FKah@)n%y*Yo|CKfhUV*8d4gd3DUX z_3=GQ-D_}`G0>Y>+c3)KNV!ESC>4vld|<3>8*%jYj*8s1Sh{;Q!57wgt^X=xs5(j{ zJ_);PxK^v1B_U)Zn#I^tr27V0nODS@cWg>Glh5}7#Hjo;26ffn{}&2%gg5uqzvK4r z@wC4j1(M)>X3?~UippAif?H81|EYntdg-Ny$*sDW0}#S+2=L zU%yfZk-0kRFl}5Q9AMs@zP`tdAM`-U4{9si(5s^#i#qC#U+P-}lvW9|`lB?uT)kiX z!?#v|ie4GM6X$Aj`ki<76hA<`q%|&?$iz}#b}4Ke>5|D((0=dO#U$CBgkPB?vv<>8fEo#>nCAMO%L-p0o23YV;GwK0+{2(y@_`Rv_byGS8+ zWhR)f-?1O_9Y!P``%sezhY@(1wt%Pxy4G-4-<>y8nr9!FdW>eOEINZNcBC~{KmUzk z+kSkJwl7eo5Wusc^2QxZkRw1wM;_C_J)qc-89q-?)IMDbTrMb~6q-OW-H_S$i)7W| z8E*3l*6kOk7u>_Z-4cK|f48s4N|V9aM;wvW!FSGdzFRZ zX5GsNr3abY%eAOSL)&aw&`){P9tBO92RsfYi6RwxF^Doj4dzi&1~K9MaTM?6=s2pneScX?MqRoq=sMpWd_KW2zWZacj}fP0qN(FP&$>TjCY;yX zMa3~Y)uR?gwZmgJzC9lH@m?b}f}E9G!lhtg@ZH>f%~g(2?yE|#<@>?!h-7x@Ko=Z7 ztV9Z6A6Mv)^q0=Rtk+RFE!H=sSmMOrysf#nn4R~jU*eu5zU+T}eLm~oaWQn$UkLF= z;zYf|#(0Pax-NZ{!ty8KW)5%Jft0Tz*-mdQK#OeJWwMV-!O-n9YqW49hr9QN*Oc=V zcKul`7+uXMseNAqyqyyy<%ELfu++tiv~~ISp0ivlOZU7$Gu#lT1#-ncF|y9U0WZM$ zfS)Stw(zhm*oGW{|7Wrn@D2GwntP>Kk1WA-iCBDOo~rz2#t?;lMjF15_#{0zZa+o`%X3w7IK&uI2Av^3z%CWKlZ1<*30gz z-x-uYeE|cIPn!x|sw&3p z#s)>YY40_Y*4=?pP07c^I zIv^f70eC3225<+CiAjL{!fYDVElJn(^&d3@6WTM9Uqa}dLVbtW-xD_n8#+lf#!^Ov%6ACYK;Id#@rcqtEfd zqHD1{E47@;CUv!>62&co{fH{?_`b7oKHq

j#(a)l2dBwkE#`dLKCK4;3MXrYw$q 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νfQ!@lhiIa7^ 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 literal 0 HcmV?d00001 diff --git "a/docs/1.\346\234\272\345\231\250\345\255\246\344\271\240\345\237\272\347\241\200.md" "b/docs/1.\346\234\272\345\231\250\345\255\246\344\271\240\345\237\272\347\241\200.md" index 44f0d2d5d..c2d66dba2 100644 --- "a/docs/1.\346\234\272\345\231\250\345\255\246\344\271\240\345\237\272\347\241\200.md" +++ "b/docs/1.\346\234\272\345\231\250\345\255\246\344\271\240\345\237\272\347\241\200.md" @@ -17,6 +17,9 @@ * 目标变量是机器学习预测算法的测试结果。 * 在分类算法中目标变量的类型通常是标称型的,而在回归算法中通常是连续型的。 +* 机器学习的训练过程 + * ![机器学习训练过程图](./1.机器学习基础训练过程.png) + * 监督学习 * 必须知道预测什么,即必须知道目标变量的分类信息。分类和回归属于监督学习。 * 样本集:训练数据 + 测试数据 @@ -39,6 +42,8 @@ * 使用机器学习算法的目的。 * 想要完成何种任务,比如是预测明天下雨的概率还是对投票者按照兴趣分组;如果想要预测目标变量的值,则可以选择监督学习算法,否则可以选择无监督学习算法。 * 需要分析或收集的数据是什么 +* 举例 +* ![选择算法图](./1.机器学习基础-选择算法.png) * 开发的步骤 * 1.收集数据 diff --git "a/docs/1.\346\234\272\345\231\250\345\255\246\344\271\240\345\237\272\347\241\200\350\256\255\347\273\203\350\277\207\347\250\213.png" "b/docs/1.\346\234\272\345\231\250\345\255\246\344\271\240\345\237\272\347\241\200\350\256\255\347\273\203\350\277\207\347\250\213.png" new file mode 100644 index 0000000000000000000000000000000000000000..28f7ae0b8611a8769342351c84119be06c31aaa3 GIT binary patch literal 135414 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 Date: Wed, 15 Mar 2017 20:04:27 +0800 Subject: [PATCH 64/92] =?UTF-8?q?=E6=9B=B4=E6=96=B0=E5=AE=8CAdaBoost?= =?UTF-8?q?=E7=9A=84=E6=B5=8B=E8=AF=95=E4=BB=A3=E7=A0=81=E5=92=8C=E6=A1=88?= =?UTF-8?q?=E4=BE=8B?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...3.\345\206\263\347\255\226\346\240\221.md" | 2 +- "docs/7.ROC\346\233\262\347\272\277.png" | Bin 0 -> 326384 bytes ...3\344\273\267\345\207\275\346\225\260.png" | Bin 0 -> 133535 bytes ...20\351\253\230\345\210\206\347\261\273.md" | 17 + ....\350\277\207\346\213\237\345\220\210.png" | Bin 0 -> 157103 bytes src/python/07.AdaBoost/adaboost.py | 135 ++++---- testData/AB_horseColicTest2.txt | 67 ++++ testData/AB_horseColicTraining2.txt | 299 ++++++++++++++++++ 8 files changed, 466 insertions(+), 54 deletions(-) create mode 100644 "docs/7.ROC\346\233\262\347\272\277.png" create mode 100644 "docs/7.\344\273\243\344\273\267\345\207\275\346\225\260.png" create mode 100644 "docs/7.\350\277\207\346\213\237\345\220\210.png" create mode 100755 testData/AB_horseColicTest2.txt create mode 100755 testData/AB_horseColicTraining2.txt diff --git "a/docs/3.\345\206\263\347\255\226\346\240\221.md" "b/docs/3.\345\206\263\347\255\226\346\240\221.md" index 65494b335..3d6e6ed76 100644 --- "a/docs/3.\345\206\263\347\255\226\346\240\221.md" +++ "b/docs/3.\345\206\263\347\255\226\346\240\221.md" @@ -24,4 +24,4 @@ * 基尼不纯度(Gini impurity) [本书不做过多的介绍] * 简单来说:就是从一个数据集中随机选取子项,度量其被错误分类到其他分组里的概率。 * 流程介绍图 -* ![决策树流程介绍图](./3.决策树流程介绍图.jpg) \ No newline at end of file +* ![决策树流程介绍图](./3.决策树流程介绍图.jpg) diff --git "a/docs/7.ROC\346\233\262\347\272\277.png" "b/docs/7.ROC\346\233\262\347\272\277.png" new file mode 100644 index 0000000000000000000000000000000000000000..3e404c8734c656f67fcbcff328c9b767216c49b9 GIT binary patch literal 326384 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