python基础知识6——函数

python基础知识6——函数,第1张

python基础知识6——函数

函数;自定义函数;函数的参数:不带参数,普通参数,默认参数,动态参数;返回值return;函数作用域;内置函数高阶函数:map,reduce,filter,sorted;lambda表达式;文件 *** 作:打开文件, *** 作文件,with方法;冒泡算法和递归;;;;;;;;;;;;;;;;;;;;;;;

函数的理解 面向过程:根据业务逻辑从上到下写垒代码 函数式:将某功能代码封装到函数中,日后便无需重复编写,仅调用函数即可 函数作用是你的程序有良好的扩展性、复用性。


同样的功能要是用3次以上的话就建议使用函数。


  标注:不能死记, 函数可以理解为一个一个的功能块,你把一个大的功能拆分成一块一块的,用某项功能的时候就去调用某个功能块即可! 函数可以理解为:乐高积木,给你一块一块的,你可以用这些积木块组成你想要的任何,功能! 函数可以调用函数!主函数的作用就是把函数进行串联、调用!函数本身是不能自己执行的如果你不调用就永不执行!

 #python name is test.py
#-------------------------------
def func1():
pass
def func2():
pass
def func3():
pass
def func4():
func1()
func2()
func3() if __name__ == '__main__'
#调用上面的函数,判断了、循环了调用等!
#函数里也可以调用函数例子:def func4(): #__name__ 这个是用来判断,如果你是把这个程序当模块导入的话他的__name__就等于这个程序的文件名,如果是手动执行这个脚本比如:python test.py 那么__name__ 就等于__main__所以,我们可以用他来做判断,如果你是手动执行我就运行我调函数执行if下面的语句,如果你是调用模块我下面的if判断后面的语句就不执行!仅当模块使用!
#如果函数当模块导入的时候,他导入的是函数的名称,内容没有被导入,当你去调用的时候他才去导入函数里的信息。


自定义函数

一、背景

在学习函数之前,一直遵循:面向过程编程,即:根据业务逻辑从上到下实现功能,其往往用一长段代码来实现指定功能,开发过程中最常见的 *** 作就是粘贴复制,也就是将之前实现的代码块复制到现需功能处,如下

while True:
if cpu利用率 > 90%:
#发送邮件提醒
连接邮箱服务器
发送邮件
关闭连接 if 硬盘使用空间 > 90%:
#发送邮件提醒
连接邮箱服务器
发送邮件
关闭连接 if 内存占用 > 80%:
#发送邮件提醒
连接邮箱服务器
发送邮件
关闭连接

上面的代码是就面向过程的编程,但是如果报警多了的话成百的代码需要添加如何 *** 作呢?复制粘贴那会死人的!在看下下面的代码:

def 发送邮件(内容)
#发送邮件提醒
连接邮箱服务器
发送邮件
关闭连接 while True: if cpu利用率 > 90%:
发送邮件('CPU报警') if 硬盘使用空间 > 90%:
发送邮件('硬盘报警') if 内存占用 > 80%:
        发送邮件('内存报警')

第二次必然比第一次的重用性和可读性要好,其实这就是函数式编程和面向过程编程的区别:

  • 面向过程:根据需求一行一行垒代码!逻辑乱、并切代码重复、不易修改重用性差!
  • 函数式:将某功能代码封装到函数中,日后便无需重复编写,仅调用函数即可
  • 面向对象:对函数进行分类和封装,让开发“更快更好更强...”

二、函数式编程

函数式编程最重要的是增强代码的重用性和可读性

def 函数名(参数):

    ...
函数体
...

函数的定义主要有如下要点:

  • def:表示函数的关键字
  • 函数名:函数的名称,日后根据函数名调用函数
  • 函数体:函数中进行一系列的逻辑计算,如:发送邮件、计算出 [11,22,38,888,2]中的最大数等...
  • 参数:为函数体提供数据
  • 返回值:当函数执行完毕后,可以给调用者返回数据。


1、返回值

函数是一个功能块,该功能到底执行成功与否,需要通过返回值来告知调用者。


def 发送短信():

    发送短信的代码...

    if 发送成功:
return True
else:
return False while True: # 每次执行发送短信函数,都会将返回值自动赋值给result
# 之后,可以根据result来写日志,或重发等 *** 作 result = 发送短信()
if result == False:
记录日志,短信发送失败...
def count():
for i in range(1,10):
if i == 5:
return #除了返回值外,也用来函数的截至
else:
print i
print "Hello World" #所以当i=5的时候就直接跳出了函数了,这里是不会被打印出来了!不是循环!!!
count() 输出结果:
1
2
3
4

return 一般写在函数的末尾,一般你想看函数的执行结果!然后判断后面的程序。


看下面的例子

def count():
name = "zhenghao"
for i in range(1,10):
if i == 5:
print "hello"
else:
print i
return name #在这里加了一个return
user = count()
if user == "zhenghao": #然后判断,看下执行结果!
print "oh nvshen is coming" 执行结果:
1
2
3
4
hello
6
7
8
9
oh nvshen is coming #这里看下! 上面的判断执行了!所以return这个把name的值输出了!

2、参数

为什么要有参数?看下下面的例子:

如果不定义参数,用函数的话:(每个有相同功能的都写个函数,说好的代码简化呢?)

def CPU报警邮件()
#发送邮件提醒
连接邮箱服务器
发送邮件
关闭连接 def 硬盘报警邮件()
#发送邮件提醒
连接邮箱服务器
发送邮件
关闭连接 def 内存报警邮件()
#发送邮件提醒
连接邮箱服务器
发送邮件
关闭连接 while True: if cpu利用率 > 90%:
CPU报警邮件() if 硬盘使用空间 > 90%:
硬盘报警邮件() if 内存占用 > 80%:
内存报警邮件()

使用函数:(代码明显少了很多,把重复的内容改为参数调用!)

def 发送邮件(邮件内容)

    #发送邮件提醒
连接邮箱服务器
发送邮件
关闭连接 while True: if cpu利用率 > 90%:
发送邮件("CPU报警了。


") if 硬盘使用空间 > 90%:
发送邮件("硬盘报警了。


") if 内存占用 > 80%:
发送邮件("内存报警了。


")

函数的有三种不同的参数:

  1. 普通参数
  2. 默认参数
  3. 动态参数

普通参数:

# ######### 定义函数 ######### 

# name 叫做函数func的形式参数,简称:形参
def func(name):
print name # ######### 执行函数 #########
# 'zhenghao' 叫做函数func的实际参数,简称:实参
func('zhenghao')

但是普通参数有个问题!你在定义参数的时候定义了几个参数,你在调用的时候必须给他几个参数否则就报错!

def func(name,age):
print name,age
#func('zhenghao')
func('zhenghao') #报错内容:TypeError: func() takes exactly 2 arguments (1 given)

默认参数:

在你没有给他指定参数的时候他就会使用默认的参数!

def func(name, age = 18):

    print "%s:%s" %(name,age)

# 指定参数
func('zhenghao', 20)
# 使用默认参数
func('zhenghao')
注:默认参数需要放在参数列表最后,要不就会报错!原因是:他的参数赋值是一个一个的赋值。


如果提供了默认值的形参,你默认一定要往后排序为了就是你给那些没有陪默认值的参数 !

动态参数:

动态参数顾名思义就是可以动态的去扩展函数参数的数量!

例子:1 (多个单个变量,整合成元组)

def func(*args):
print args # 执行方式一
func(11,33,4,4454,5)
#输出结果:(11, 33, 4, 4454, 5) # 执行方式二
li = [11,2,2,3,3,4,54]
func(li)
#输出结果:([11,2,2,3,3,4,54],)
#如果想输入的列表,不想让列表称谓元组里的仅一个元素而是让列表的元素成为元组的元素加*即可
func(*li)
#输出结果:(11,2,2,3,3,4,54)
#############################################################
1、接受多个参数
2、内部自动构造元组
3、序列,*,避免内部构造元组

例子:2(整合为字典变量)

def func(**kwargs):

    print kwargs

# 执行方式一
func(k1='zhenghao',k2='nvshen')
结果:{'k1': 'zhenghao', 'k2': 'nvshen'} # 执行方式二
li = {'name':'zhenghao', ‘age’:18, 'gender':'male'}
func(**li)
结果:{'age': 18, 'name': 'zhenghao', 'gender': 'male'}

例子:3(整合了*args,**kwargs)

def func(*args, **kwargs):

    print args
print kwargs
#例子:
func(11,22,33,44,k1='zhenghao',k2='nvshen')
结果:
(11, 22, 33, 44)

{'k2': 'nvshen', 'k1': 'zhenghao'}

扩展:发邮件实例

 import smtplib
from email.mime.text import MIMEText
from email.utils import formataddr def email(message):
msg = MIMEText("邮件报警测试", 'plain', 'utf-8')
msg['From'] = formataddr(["zhenghao",'[email protected]']) #发件人和发件邮箱
msg['To'] = formataddr(["xiaokai",'[email protected]'])
msg['Subject'] = message #这里我调用了参数 server = smtplib.SMTP("smtp.test.com", 25)
server.login("[email protected]", "pwdnq.buzhidao")
server.sendmail('[email protected]', ['[email protected]',], msg.as_string())
server.quit()
if __name__ == u'__main__':
cpu = 100
disk = 500
ram = 50
for i in range(1):
if cpu > 90:
alert = u'CPU出问题了' #这里设置了一个变量 email(alert) #这里调用函数的时候引用了上面的变量,当执行函数的时候形参讲会被替换掉,message='CPU出问题了' 发送邮件! if disk > 90: alert = u'硬盘出问题了' email(alert) if ram> 80: alert = u'内存出问题了' email(alert)
函数的作用域

看下面的例子:

def say():
name = "zhenghao"
print name
say()
这个输出:
zhenghao # 是没有问题的,那么看下下面的例子: 
def say():
name = "zhenghao"
print name say() print name # 这个能不能调用呢,不能,会报错!函数的作用域就是在函数里定义的变量不能被外面使用!

再看下面的例子:

name2 = "nvshen"
def say():
name = "zhenghao"
print name
print name2
say()
输出结果:
zhenghao
nvshen
总结:函数的作用域就是在函数里定义的变量不能被外面使用!但是外部全局定义的全局变量在函数内是可以使用的。


举个例子来说:你在房子里可以看到屋内的东西和房子外的东西,但是你在房子外面就只能看到房子外的东西不能看到房子内的东西! 原因防止在函数调用的时候防止变量冲突!

问题:我在外面定义的全局变量在函数内可以改他吗?  #看下面的例子:

name2 = "zhenghao"
def say():
name = "nvshen"
name2 = "zhenghao is nvshen"
print name,name2
say()
print name2
#输出结果:

nvshen zhenghao is nvshen #在函数内改变了

zhenghao  #但是外面调用还是没有改变!

但我就是想在函数里改变全局变量是否可以呢?可以!

#但是我就想在函数内改掉这个变量怎么办呢?在函数内调用global参数!(提供这个功能,但是不建议用!你在局部变量改全局变量很容易引起混乱)
name2 = "zhenghao"
def say():
global name2
name = "nvshen"
name2 = "zhenghao is nvhsne"
print name,name2
say()
print name2
输出结果:

nvshen zhenghao is nvhsne
zhenghao is nvhsne

内置函数

内置函数:(就是python把各个模块中常用的一些方法给拿出来方便使用)

常用的记住之后,要知道怎么去查:

>>> li = [11,22,33,44]
>>> type(li) #查看数据类型
<type 'list'>
>>> dir(list) #查看类型包含的那些方法
>>>help(list) #查看类型中包含的方法的详细说明 

eval()函数的用法:

是把字符串中符合python表达式的东西计算出来。


意思就是:

 >>> 3+4
7
>>> '3+4'
'3+4'
>>> eval('3+4')
7
>>> 'ni'+'hao'
'nihao'
>>> "'ni'+'hao'"
"'ni'+'hao'"
>>> eval("'ni'+'hao'")
'nihao'
>>>

format()函数:

 >>> "My name is {0} and {1} yearsold".format("郑好",18) 'My name is \xe9\x83\x91\xe5\xa5\xbd and 18 yearsold'
>>> print "My name is {0} and {1} yearsold".format("郑好",18)
My name is 郑好 and 18 yearsold
>>> "I like {name}".format(name='三毛') 'I like \xe4\xb8\x89\xe6\xaf\x9b'
>>> print "I like {name}".format(name='三毛')
I like 三毛
>>>

http://www.lai18.com/content/384794.html格式化函数更多用法

range()函数的以下几点:

这个函数可以创建一个数字元素组成的列表。


这个函数最常用于for循环(关于for循环,马上就要涉及到了)

函数的参数必须是整数,默认从0开始。


返回值是类似[start, start + step, start + 2*step, ...]的列表。


step默认值是1。


如果不写,就是按照此值。


如果step是正数,返回list的最最后的值不包含stop值,即start+istep这个值小于stop;如果step是负数,start+istep的值大于stop。


step不能等于零,如果等于零,就报错。


 >>> range(9)                #stop=9,别的都没有写,含义就是range(0,9,1)  

 [0, 1, 2, 3, 4, 5, 6, 7, 8] #从0开始,步长为1,增加,直到小于9的那个数   

 >>> range(0,9)  

 [0, 1, 2, 3, 4, 5, 6, 7, 8]  

 >>> range(0,9,1)  

 [0, 1, 2, 3, 4, 5, 6, 7, 8]
>>> range(1,9) #start=1 [1, 2, 3, 4, 5, 6, 7, 8]
>>> range(0,9,2) #step=2,每个元素等于start+i*step, [0, 2, 4, 6, 8]
 >>> range(-9)  

 []  

 >>> range(0,-9)  

 []  

 >>> range(0)  

 []
 >>> range(0,-9,-1)  

 [0, -1, -2, -3, -4, -5, -6, -7, -8]  

 >>> range(0,-9,-2)  

 [0, -2, -4, -6, -8]
 >>> [n for n in range(100) if n%2==0]
[0, 2, 4, 6, 8, 10, 12, 14, 16, 18, 20, 22, 24, 26, 28, 30, 32, 34, 36, 38, 40, 42, 44, 46, 48, 50, 52, 54, 56, 58, 60, 62, 64, 66, 68, 70, 72, 74, 76, 78, 80, 82, 84, 86, 88, 90, 92, 94, 96, 98]
>>>
>>> range(0,100,2) #生成偶数变得很简单
[0, 2, 4, 6, 8, 10, 12, 14, 16, 18, 20, 22, 24, 26, 28, 30, 32, 34, 36, 38, 40, 42, 44, 46, 48, 50, 52, 54, 56, 58, 60, 62, 64, 66, 68, 70, 72, 74, 76, 78, 80, 82, 84, 86, 88, 90, 92, 94, 96, 98]
>>>

高阶函数

1.map()函数

map()函数接收两个参数,一个是函数,一个是Iterablemap将传入的函数依次作用到序列的每个元素,并把结果作为新的Iterator返回。


1 >>> s=map(str,[1,2,3,4,5])
2 >>> s
3 <map object at 0x7f68251e9cf8>
4 >>> list(s)
5 ['1', '2', '3', '4', '5']
6
7 >>> a=map(lambda x:x*x, (1,2,3,4))
8 >>> list(a)
9 [1, 4, 9, 16]
2.再看reduce的用法

reduce把一个函数作用在一个序列[x1, x2, x3, ...]上,这个函数必须接收两个参数,reduce把结果继续和序列的下一个元素做累积计算,其效果就是:

1 reduce(f, [x1, x2, x3, x4]) = f(f(f(x1, x2), x3), x4)
2
3 >>> from functools import reduce
4 >>> sum=reduce(lambda x,y: x+y,[1,2,3,4,5])
5 >>> sum
6 15
7 >>>
3.filter

map()类似,filter()也接收一个函数和一个序列。


map()不同的是,filter()把传入的函数依次作用于每个元素,然后根据返回值是True还是False决定保留还是丢弃该元素。


注意到filter()函数返回的是一个Iterator,也就是一个惰性序列,所以要强迫filter()完成计算结果,需要用list()函数获得所有结果并返回list。


1 >>> def is_odd(n):
2 ... return n%2==1
3 ...
4 >>> filter(is_odd, [1,2,3,4,5,6])
5 <filter object at 0x7f6825213438>
6 >>> l=filter(is_odd, [1,2,3,4,5,6])
7 >>> list(l)
8 [1, 3, 5]
4. sorted()函数
 1 >>> sorted([1,2,6,3,5,2,7])
2 [1, 2, 2, 3, 5, 6, 7]
3 >>> sorted((1,2,6,3,5,2,7))
4 [1, 2, 2, 3, 5, 6, 7]
5 >>> sorted({'k1':5,'k2':3,'k3':0})
6 ['k1', 'k2', 'k3']
7 >>> sorted({'c':5,'k':3,'a':0})
8 ['a', 'c', 'k']
#对字符串排序,是按照ASCII的大小比较的,由于'Z' < 'a',结果,大写字母Z会排在小写字母a的前面
9 >>> sorted(['zheng', 'Zheng', 'aria', 'Anyi'])
10 ['Anyi', 'Zheng', 'aria', 'zheng']

sorted()函数也是一个高阶函数,它还可以接收一个key函数来实现自定义的排序,我们给sorted传入key函数,即可实现忽略大小写的排序:要进行反向排序,不必改动key函数,可以传入第三个参数reverse=True

1 >>> sorted(['criee', 'Zheng', 'bob', 'Anyi'], key=str.lower, reverse=True)
2 ['Zheng', 'criee', 'bob', 'Anyi']

sort()和sorted()区别:

1、sort()是可变对象(字典、列表)的方法,无参数,无返回值,sort()会改变可变对象,因此无需返回值;

2、sorted()是python的内置函数,并不是可变对象(列表、字典)的特有方法,sorted()函数需要一个参数(参数可以是列表、字典、元组、字符串),无论传递什么参数,都将返回一个以列表为容器的返回值,如果是字典将返回键的列表。


1  a=[2,4,6,2,1,0,23]
2 a.sort()
3 print a
4 print sorted(a)
5
6 结果:
7 [0, 1, 2, 2, 4, 6, 23]
8 [0, 1, 2, 2, 4, 6, 23]
lambda表达式

学习条件运算时,对于简单的 if else 语句,可以使用三元运算来表示,即:

# 普通条件语句
if 1 == 1:
name = ‘zhenghao'
else:
name = 'nvshen' # 三元运算
name = 'zhenghao' if 1 == 1 else 'nvshen' #这个就是if else的一个简写。



#if 条件成立的时候name为'zhenghao' 不成立的时候为:'nvshen' ,语法糖!

那么函数有没有他的简写呢?也是有的lambda表达式!

lambda 和if  else的三元运算一样,是为了简化函数,但是:

1、只能做简单的 *** 作
2、自动return

看下面两个函数的对比:

'''正常函数'''
def func(arg):
return arg + 1
result = func(100)
print result '''lambda表达式'''
func2 = lambda a: a + 1
result = func2(10000)
#这里调用函数的时候就是lambda表达式左边的等号就是他函数的调用!
print result #执行结果:
#101
#10001
文件 *** 作

*** 作文件时,一般需要经历如下步骤:

打开文件

*** 作文件


一、打开文件

文件句柄 = file('文件路径', '模式')
#python中打开文件有两种方式,即:open(...) 和 file(...) ,本质上前者在内部会调用后者来进行文件 *** 作,推荐使用 open。


3.0以后file方法讲被用做其他,open方法会自动的去帮你找他调用得方法在那里!

打开文件时,需要指定文件路径和以何种方式打开文件,打开后,即可获取该文件句柄,日后通过此文件句柄对该文件 *** 作。


打开文件的模式有:

  • r,只读模式(默认)。


  • w,只写模式。


    【不可读;不存在则创建;存在则删除内容;】

  • a,追加模式。


    【可读;   不存在则创建;存在则只追加内容;】

"+" 表示可以同时读写某个文件

  • r+,可读写文件。


    【可读;可写;可追加】

  • w+,无意义
  • a+,同a

"U"表示在读取时,可以将 \r \n \r\n自动转换成 \n (与 r 或 r+ 模式同使用)

  • rU
  • r+U

"b"表示处理二进制文件(如:FTP发送上传ISO镜像文件,linux可忽略,windows处理二进制文件时需标注)

  • rb
  • wb
  • ab

二、 *** 作文件

 class file(object):

     def close(self): # real signature unknown; restored from __doc__
关闭文件
"""
close() -> None or (perhaps) an integer. Close the file. Sets data attribute .closed to True. A closed file cannot be used for
further I/O operations. close() may be called more than once without
error. Some kinds of file objects (for example, opened by popen())
may return an exit status upon closing.
""" def fileno(self): # real signature unknown; restored from __doc__
文件描述符
"""
fileno() -> integer "file descriptor". This is needed for lower-level file interfaces, such os.read().
"""
return 0 def flush(self): # real signature unknown; restored from __doc__
刷新文件内部缓冲区
""" flush() -> None. Flush the internal I/O buffer. """
pass def isatty(self): # real signature unknown; restored from __doc__
判断文件是否是同意tty设备
""" isatty() -> true or false. True if the file is connected to a tty device. """
return False def next(self): # real signature unknown; restored from __doc__
获取下一行数据,不存在,则报错
""" x.next() -> the next value, or raise StopIteration """
pass def read(self, size=None): # real signature unknown; restored from __doc__
读取指定字节数据
"""
read([size]) -> read at most size bytes, returned as a string. If the size argument is negative or omitted, read until EOF is reached.
Notice that when in non-blocking mode, less data than what was requested
may be returned, even if no size parameter was given.
"""
pass def readinto(self): # real signature unknown; restored from __doc__
读取到缓冲区,不要用,将被遗弃
""" readinto() -> Undocumented. Don't use this; it may go away. """
pass def readline(self, size=None): # real signature unknown; restored from __doc__
仅读取一行数据
"""
readline([size]) -> next line from the file, as a string. Retain newline. A non-negative size argument limits the maximum
number of bytes to return (an incomplete line may be returned then).
Return an empty string at EOF.
"""
pass def readlines(self, size=None): # real signature unknown; restored from __doc__
读取所有数据,并根据换行保存值列表
"""
readlines([size]) -> list of strings, each a line from the file. Call readline() repeatedly and return a list of the lines so read.
The optional size argument, if given, is an approximate bound on the
total number of bytes in the lines returned.
"""
return [] def seek(self, offset, whence=None): # real signature unknown; restored from __doc__
指定文件中指针位置
"""
seek(offset[, whence]) -> None. Move to new file position. Argument offset is a byte count. Optional argument whence defaults to
(offset from start of file, offset should be >= 0); other values are 1
(move relative to current position, positive or negative), and 2 (move
relative to end of file, usually negative, although many platforms allow
seeking beyond the end of a file). If the file is opened in text mode,
only offsets returned by tell() are legal. Use of other offsets causes
undefined behavior.
Note that not all file objects are seekable.
"""
pass def tell(self): # real signature unknown; restored from __doc__
获取当前指针位置
""" tell() -> current file position, an integer (may be a long integer). """
pass def truncate(self, size=None): # real signature unknown; restored from __doc__
截断数据,仅保留指定之前数据
"""
truncate([size]) -> None. Truncate the file to at most size bytes. Size defaults to the current file position, as returned by tell().
"""
pass def write(self, p_str): # real signature unknown; restored from __doc__
写内容
"""
write(str) -> None. Write string str to file. Note that due to buffering, flush() or close() may be needed before
the file on disk reflects the data written.
"""
pass def writelines(self, sequence_of_strings): # real signature unknown; restored from __doc__
将一个字符串列表写入文件
"""
writelines(sequence_of_strings) -> None. Write the strings to the file. Note that newlines are not added. The sequence can be any iterable object
producing strings. This is equivalent to calling write() for each string.
"""
pass def xreadlines(self): # real signature unknown; restored from __doc__
可用于逐行读取文件,非全部
"""
xreadlines() -> returns self. For backward compatibility. File objects now include the performance
optimizations previously implemented in the xreadlines module.
"""
pass

三、with方法

为了避免打开文件后忘记关闭,可以通过管理上下文,即:(建议使用此方法打开文件)

with open('log','r') as f:

    ...

如此方式,当with代码块执行完毕时,内部会自动关闭并释放文件资源。


在Python 2.7 后,with又支持同时对多个文件的上下文进行管理,即:

with open('log1') as obj1, open('log2') as obj2:
pass

例子:比如要修改nginx.conf 文件然后还的回滚怎么做?

with open('nginx.conf','r') as obj1,open('nginx.conf.new','w') as obj2:
for i in obj1.readlines():
i = i.strip()
print i
obj2.write(i)
obj2.write('\n') #读取nginx.conf每行然后存储到新的文件nginx.conf.new里!
冒泡算法

需求:请按照从小到大对列表 [13, 22, 6, 99, 11] 进行排序

思路:相邻两个值进行比较,将较大的值放在右侧,依次比较!

冒泡算法原理图:

aaarticlea/png;base64,iVBORw0KGgoAAAANSUhEUgAAAkkAAAHLCAIAAABTcpstAAAgAElEQVR4nO3d/1MbZ4Lncf1L98uqanaqdrfCUPzm25v1bjlzV6guTvZ8qUAW61LZzSV13oyzw26UtWUHg0eeiX12bM+QZGMbg2NAfDH+hrGJAYNBBgUwYMB8xxhrfNwPLaRWf1NLPNLT3bw/9fkhFtBq5FS//HQ//bRvNfFc1QXbXbTsktKVdJet+mrFXlctu5bqcrrrln1hp0uvNiz7UtdNy76y2cVXCXv9k2Vf6/r/LLqwuaXpxp+2CCHEXfFhG7ZhGyHEY8E2bMM2QojXgm3Yhm2EEK8F27AN2wghXgu2YRu2EUK8FmzDNmwjhHgt2IZt2EYI8VqwDduwjRDitWAbtmEbIcRrwTZswzZCiNeCbdiGbYQQrwXbsA3bCCFeC7ZhG7YRQrwWbMM2bCOEeC3Yhm3YRgjxWrAN27CNEOK1YBu2YRshxGvBNmzDNkKI14Jt2IZthBCvBduwDdsIIV4LtmEbthFCvBZswzZsI4R4LdiGbdhGCPFasA3bsI0Q4rVgG7ZhGyHEa8E2bMM2QojXgm3Yhm2EEK8F27AN2wghXgu2YRu2EUK8FmzDNmwjjsivPv7aHwhTUf3Vx1/L/iuVGWzDNmwjjog/EI5NrVBR9QfCsv9KZQbbsA3biCOCbdgmMNiGbdhGHBFswzaBwTZswzbiiPgD4ZGpFSqq2IZt2IZtRH78gfDI0xUqqtiGbdiGbUR+sA3bBAbbsA3biCPiD4RHni5TUcU2bMM2bCPyg23YJjDYhm3YRhwRbMM2gcE2bMM24oj4A+Hhp8tUVLEN27AN24j8YBu2CQy2YRu2EUcE27BNYLAN27CNOCL+QHh4cpmKKrZhG7ZhG5EfbMM2gcE2bMM24ohgG7YJDLZhG7YRR8QfCD+eXKaiim3Yhm3YRuQH27BNYLAN27CNOCLYhm0Cg23Yhm3EEfEHwo8nl6ioYhu2YRu2EfnBNmwTGGzDNmwjjog/EH48sURFFduwDduwjciPPxAemliioopt2IZt2EbkB9uwTWCwDduwjTgi2IZtAoNt2IZtxBHBNmwTGGzDNmwjjgi2YZvAYBu2YRtxRPyB8ODEEhVVbMM2bMM2Ij/Yhm0Cg23Yhm3EEfEHwoPjS1RUsQ3bsA3biPxgG7YJDLZhG7YRRwTbsE1gsA3bsI04Iv5A+NH4EhXV3W7b4uaUqtO2O2PZZ0oX0p216ss5e5237PNUn9vtgp3Ov1y07JKuy5Zd2e6qdedertnrumVf6Lph0dmNl5quvHr56jXVd9PD3ZRRbBNu2+brVw5uoqD1zb0cUzUuqD8pnU133KobE4Z9tjGZ2aeWnUp1Jt1py87Y6fTGM8vO6jpnqy/mrTv14rm9Llh2Udclyy5ruvByeT2RX1c83VUPdy2xVvxim3Db1hIvHNyN/Lpqr9iGbdiGbdjmwWIbtmEbtmFbUW0bnpnHNmzDNmzDNgdWvkDute3r9uFPLzzQCOcPhAd+WqSiim3Yhm3Yhm1FtW1ycXHPoZY9h1qOXe6fXFzENmzDNmzDNodUvkDutW0tsXbgeJfC297D0TOtj2dXl7EN27AN27BNeuUL5EzbZleXu2NTSr9uHz7T+vhM6+Pf1Pd++FW3uuWhDsU2peWhjp+/c1K6B14qtmEbtmEbtuVm29j88+7Y1NWesTOtj0PfPfzwq+79R26kxmEpwE5dH1Rsu9ozlgJPaUXt7RRsB453dQ1NMm7DNmzDNmyTXvkCFce2hY2V7tiUxrBg5G6Krq6hye7Y1Nj885yGd4ptygnJhY0V5Xpb/0+LVFSxDduwDduwLaPdsan6rthv6nsPHO/aV932ydmelGGKQ0Lmknxytkc9VRLbsA3bsA3bpFe+QGJ7c2iitnGgova2clLx1PXBtv7xXEdjNnu1Z6ytf1zzIrZhG7ZhG7ZJr3yNdt6Rmbn6rpFPL9zfezgajNw53z78aHJmXd66JP3xRSqq2IZt2IZtu8u2kZm5Y5f79h/p3H+k89jlvvb+8cWNZfU3YJsHim3Yhm3YtitsW9xYbuwZC0bulIc6Tl1/NDIzZ/adsmzriy86vL97541DXfJ3w06xDduwDds8blt8/vmxy33KrJDrvfGs349txr3wns+HbdiGbdjm5coXy06fLi7UNg7sPRw9df1RfP65zZ/CNqM+PPQXPmzDNmzDNun87Grb5laXzrQO7T0crW0ceLq4kNPPYpu+16rf+PPqh5yTxDZswzbp/Oxe276/86Q81PHphfv2x2rYZtWu8J+/c7mP623Yhm3YJtueXWrb3OrSpxfuByN3lNn8+RXbMvvw0Dvha/FFbMM2bMM2bJPQ3vi0MgdSM6ffLbY9jC86spcDvoz8rPqh7F3K3t1u2/KraVVnBPVZjp017NKrufy6aLfzIvo8xy4ku7lo3QW7Xcqxy1Z9qe3yK2xzh231XSPloY6bQxM735Q028YWHd5Tb7/xf27I3w073e22vfjTomO7/qclLzdPMFxU6fzsItvOtA5V1N7Odc4ItuXS9OgtcF76zmAbtjm28u3BNo/YpsA2t7okaoPybFugoopt8g3DNo9WOj+7wjbhsGGbN4pt8g3DNo9WOj/et62xZ0w4bNjmjWKbfMOwzaOVzo/HbYvPPy8PdVgsC+k6234cW6Ciim3yDcM2j1Y6Px637cOvuuu7RgqxZWzzQLFNvmHY5tFK58fLtp1vH/7wq+4CbRzbPFBsk28Ytnm00vnxrG1zq0t7D0fzW0/L0baNLlBRxTb5hmGbRyudH8/apjwsu3DbxzYPFNvkG4ZtHq10fjxr24HjXfdiT7GNYhu2Oa/y7cE2V9rW3j9eUXu7oG8hy7be0QUqqtgm3zBs82il8+NN22obB863D2MbxTZsc2Tl24NtrrTtw6+6e+PT2EaxDdscWfn2YJsrbdtX3bbDR9g42LbnVFSxTb5h2ObRSufHg7Y9mpwp9MU2bPNGsU2+Ydjm0Urnx4O2NfaMhb770bO2PXlORRXb5BuGbR6tdH6wzWW2PXjynIoqtsk3DNs8Wun8eNC28+3Dp64/wjaKbdjm1Mq3B9vcZ9uZ1qEzrUPYRrEN25xa+fZgm/tsq+8aYdxGsQ3bHFz59mCb+2xr7x+vru/FNopt2ObUyrcH29xn26PJmWDkDrZRbMM2p1a+PdjmPtvmVpfKQx1ete3+k+dUVLFNvmHY5tFK58eDtq0nVstDHXOrS960Lfaciiq2yTcM2zxa6fx407ZPL9xv7x/HNopt2ObIyrcH21xpW33XSG3jALZRbMM2R1a+PdjmStseTc7sP9KJbRTbsM2RlW8PtrnStvXEanmoIz7/HNsotmGb8yrfHmxzq23HLvcV9PGksmzriT2noopt8g3DNo9WOj+eta3QpyWxzQPFNvmGYZtHK50fz9q2nlitqL19c2gC2yi2YZvDKt8ebHOxbd/fefLphftes21knooqtsk3DNs8Wun8eNm2xY3lfdVtTxcXsI1iG7Y5qfLtwTYX27aeWK1tHCjQjW7Ose3bG3HpSDi/DXcn7gzNYRu2OaPy7cE2d9v2dHFhX3VbIW4GkGXbvZH5VP/j1k/vfnn7i28H1C9Sw15oHy3/vPNc6xP1i9gm3zBs82il8+Nx29YTq7WNA4W46ibXtraHM/90umfPoZY9h1qae6eky+GK/upf2/ccaqmovdPU8xTbsA3bsM3dtj1dXNh7OPpocsYbtt0emvvi24Ff/rpVge2Xv26VboZbWlF7R/nQ9hxq+eziwxsDz7BNvmHY5tFK58f7tq0nVs+0Dgkfukmx7Wf7a5XBR6qaP1L7/bt/afv5Oydl64Vt2ObNSudnV9i2uLFcUXtb7JMBZI3bGu5OqMcff/cvbdLHQ27pwd92pz63d8I3v7kRZ9wm3zBs82il87MrbFtPrPbGp8tDHYsby2637d7w/L3h+XOtT8o/71QO0zf6nykvUuu+9e83lH8N1DU8Vl7BNvmGYZtHK52f3WLbemL12OU+gfcDyLXt3vD87cG5o989Uh+pqUUb7kwkL7Op/imAbfINwzaPVjo/u8i2udWl8lBHb3za1bZ1D8+rG/1xprbhseZFqu+FttHGe081L2KbfMOwzaOVzs8usm09sXov9nT/kc651SXP2EZ3UmyTbxi2ebTS+dldtq2Lu90N2zxQbJNvGLZ5tNL52XW2LW4sByN36rtGsI1im3zDsM2jlc7PrrNtPbEan39eHurY4d3c2OaBYpt8w7DNo5XOz260bT2x2tgztv9I504eESDLtrvD81RUsU2+Ydjm0UrnZ5fatp5YrW0cCEbu5H3HmzTbHs9TUcU2+YZhm0crnZ/da9t6YvWTsz3V9b3YtmuLbfINwzaPVjo/u9q2udWlA8e7zrcPY9vuLLbJNwzbPFrp/Oxq29YTq/H55/uq224OTbjHtjkqqtgm3zBs82il87PbbVtPrD6anCkPdeTKmyzb7jyeo6KKbfINwzaPVjo/2JYnb9jmgWKbfMOwzaOVzg+25cmbNNuG5qioYpt8w7DNo5XOD7blyRu2eaDYJt8wbPNopfODbXnyhm0eKLbJNwzbPFrp/GBbnrzJsu320BwVVWyTbxi2ebTS+cG2PHnDNg8U2+Qbhm0erXR+sM2Kt/b+cWzzcLFNvmHY5tFK5wfbTNsbn95X3Wb2NBxptg3OUVHFNvmGYZtHK50fbLPqyMzcgeNdoe9+1C+pjG0eKLbJNwzbPFrp/GBbls6tLn34VXcwcmdudckJtt0anKOiim3yDcM2j1Y6P9hmq8cu9+0/0ql+nKk822apqGKbfMOwzaOVzg+22e33d57sq25LzS7BNg8U2+Qbhm0erXR+sC2H3os9Tc0uwTYPFNvkG4ZtHq10frAtt6ZmlyxsrMix7dEsFVVsk28Ytnm00vnBtpyrzC758KvuycXF4tt289EsFVVsk2+YG2zrqyl9o+RgeLAAtjVVvVETM7BhsO6Nkrr+vFDpryk13qZZB+ve8GVJDhscrHvDV3UlFycaKkuPD+peH6wrqWy2t4XmCl9pSU2z7sWqBtv7MFBTavR7VzUM1pUYbccGFbHjJb6Skrqr0sXKtV+3D5eHOq72jGGbe4tt8g1ziW2+ymah20xhEDtW4vNVNhsg0VTl85UeG8zVttixEl9uP7itkck3NFfkvDWfr6RuwK4rseMlPp/ODwWbkpqYuUZV2yI2V/iSOg7UlCY3NVhXYrkbDZU+X3Y7mytSyGlsa6pSNp7FtpqYfKty7VpibXhmPhi5+8nZntnVZWxzY7FNvmGus23wpGqUc/DK+pNwieof+iUn+3KzzcKw5gqfr6Ip50Gbz1d6rKYqlx9MHcHNkhOxSQttj9uMB1g27El+PirbYsdLlFcSAzWl2XyNHS8xwE8xtaJJxaRRV5PfWXp80BSJq5WutW0tsbawsXLq+mB5qKNraBLbXFdsk2+Y62xbb37PV7p9ftLsvzVtfk9rnv1hk1rBumzGNFdsnz+8UmkfpOYKgeO2XG1rqlI0yuhgXYnP6ESl3qGSuoGUbU1VqXFeQ6XVmC/11sb+DdaVWA4ZV5IMJHG1YVtswJxAx1VNzoP49IHjXaHvHhZ6AIdt2IZtRWrG+EyVyoO2bVMN6Sxs05zNyxaLAdmVSp8vfZXOWqyc3rcgtjVUGryTIorp1S8dQhU1se1xW3NFepyXPktps5k7U1pSon1vDXUaw2ylslm+W7napgzgjl3u33/kxoP4dEFt63o0S0UV2+Qb5ljbxI3b+mpKbdlm0v6aUp+NeSX9NaU+DWZNVdpXTG2zHrdl3UjzsfRkk7RtA4NWQx/t0GqwriQ5itLLlLx2lXE60TwVlVXGX7C8/KbavmYHDM6a2kHC3eckNe0amiwPdZy6PligOwT8gXDXwCwVVWyTb9iuta2pSnPYNdErdqzExjRF9UW7pipfamZjU5Uv94t2JnZWmY7elN8l+SuobKsptZwMUmpom9FPaWxTN3mxUP3VhsrSkso0YwaI6gZkO7YtdrxSO7XEU7atJdZmV5dD3z3cf+RGW/84tjm82CbfMLfZ1jd4UvS4LXasJM2PdpQ2WPdG1lOCmu9pqlJvoV85v6ex0975T32MlI0dK9GcC02fkxyoKTWbEmJim/rUYlbblMkjzRW+0orKUuW838p6c0Vl80BT80DG9xj6mkbL8ASpKirbMmlMn2kcrCvxValn/HvNNqUP4tPByN1g5K7YU5T+QLhr4BkVVWyTb5hrbDupXDx7r6n5PdMjoADbNFb115Qa3yGgpkvjVqZtWskMvqQ65ZjHfXVafbXX2xoqjU8GGtp2vLKqYT3RUKP5fkOfUqMr1X+U1DXUVB0fTAzU1DWkv82WbbmP25J7lVJBmVqZ4s2btilt6x/ff+TGpxcejM0/xzYHFtvkG+Z825oOZrplNj4TM27LPBVZZ3UbwGDdG4YDKb1t64nl9cSVSqNN6QdwJVUVJlezDPfkSqVmH/RzSZorfMaz7U2utyljIzUnWtsyJ+g3V6Q33nxc2WZTnf7ut0LbtjpYV6KaOell29YSawsbK/VdsfJQx4nGgZ3PosQ2bMO24pLm85WcvGJ6vc1W87ItyYbpdTgTwLJ8yRhIw3GbenpI4kql+Q3m2vcymiepXJDLPNloMBmyJOMimer7NbZtA5Y+najTKzmFMpNMIeckLWzLrMdtUzq7unyicaA81FHfFdvJNBN/IHxj4BkVVWyTb5hjbVv/U19Ncp0t87kkBbRNOdl4RbkXO6fVScTYlrhSo72Epvvx2LES/RRKw3sADBYfsRq3JTmsMjmvaHWz+fY2Y8drmlcsL/iJH7ftQtuUjs0///TCg/1Hblzv/QnbnFBsk2+Yg23LwKm4tqmvol2pND0fKMg27eCpf3s7ypuaXfMzuT3c5P62pirN6CqLbRnrSZpeM1PTpWGsobKqwWoiCbaJs02pMs1k/5Eb9V2xXM9SYhu2YZuTbetratavuZWrbfoTgLnxJmbcFusfbK7wVV0xufvN+OqdhW26CZBZbNMiZHjNTK2O7nuaqkoqqwxXOsa2gtiWEu439b37qttONA7Yf56APxC+0f+Miiq2yTfMY7bVnLySk22pYZMiiuntaPbuchNi2/YVpitW+2NRu+uSCLCtqS65gEhls8H6k1mWztq+Abyy2cw21RVBQ9sM19zKuK/cQj7ndoe2pc5Snmgc2Ffd9snZnuu9P2W9FIdt2IZtTrbtSqXBl65U+ny+g5nmpRTZPq2n/NFiuv9g8xWbV91s2RbrH0xsPzTA5Jzk9ngxBykLZFu25SVVM0EyLtGVVFaVGJ3MTC1zrAzvrFdVbqg02MJqU5Uy3f9qpfFiWqnFmuVbJcW2VK/3/vTJ2Z591W3HLvcPTD7DNmzDNumk5W7bk3CJeunIzEcE+HyqGwkSy+uJ/prSzCGRVpr0VzOuimVbAcveUltJtzSaqueSVKaWXbZxRnT74lzqdjc7tulZVRnT3JASJWNeiZ699JArOXrbnou//bOZW9aP59S3Y5s8GUAFpzKTRXWbdmqJGdMVI5NTadzxLDextimdXFz8un34wPGu8lBH6LuHbf3jmpGcPxDu7H9GRRXb5BvmYNv61Adf1fPbrljOF3+j5omNjWc9T2gcW6cHbS4jafbWJXX9usfr9Kc+CvORZfpjKanrzwab7jSg/p62zHn5+rmOerRSZxo1L6boyvpUuSaThSg1FjZVGZ9stPxx+WhJtE19rvI/7jz55GzP3sPRT872nGl93DU0Obu6jG3Yhm3FbtNB209ls9+84LFZs2d527Wt1O4zdwyaXljZhm2ZQ7HB5gaj0Z7ZhTSddsrYKLfl//OufIFcattaYm14Zn4tsbawsdIdmzrT+viTsz3loY6SqovSPfBSsU2+Yc63rSAtpG3OaBGAkVj5ArnXtq/bhz+98EARLvOc5AwVVWyTbxi2ebTS+cE2h9o2ubi451DLnkMtxy73p24SwDZswzZPVL492IZtcmxbS6wdON6l8Lb3cPRM6+Pk9ba+GSqq2CbfMGzzaKXzg20SbJtdXe6OTSn9un34TOvjM62Pf1Pf++FX3eqWhzoU25SWhzp+/s5J6R54qdgm3zBs82il84NthbJtbP55d2zqas/YmdbHoe8efvhV9/4jN1LjsBRgp64PKrZd7RlLgae0ovZ2CrYDx7u6hib9gXBH3wwVVWyTbxi2ebTS+cE2AbalZjOqDQtG7qbo6hqa7I5N5foUN8U25YSkcqMbtmEbtnmi8u3BNmwzbndsqr4r9pv63gPHu5RFs1KG7eQpNpq5JJ+c7VFPlXS2bd/uS96neOCo/J3BNmxzcuXbg23Ylu7NoYnaxoGK2tvKScVT1wfb+sdFPVNb06s9Y23945oXnWzbHw795b7fzXT0zXT87oAv8K30/cE2bCtYm8PZFh+5Umm9QIkIPwZjGcs85rOusbrNFb7SN2rMF7S0uRvrieXkOiZGt1GrV7eyswKIRQfrSnxVFTXZlhrJp+oHeRu/robhaqWvorLZHetpqTsyM1ffNfLphft7D0eDkTvn24cfTc6sF2WepL5Otk3Vb/f9+Rd/kL8b2IZtBamyFpeeLv1aXO81WdimrFZsiY3JIsVGK2DFjpVYLrWcvbFjJeYPQc1YTar02KBqH3w+A1ObqoyfCKpbWEuLh/2FRdSLRmb7NiNC6wbWrRbZMl6ga3tlSzUSynPjVtebK0zXk3RSR2bmjl3u23+kc/+RzmOX+9r7xxc3ltXfIMu29r4Zp/d3B/b9TvY+2Cu2yTfMdbYNnnwjveRxxmrI5pL9aWm9+UqT4l9peDDLipQZ2eYq0xLtmlgaad6oqavIkE/7DfrtZ7FNq6DBPtiyzfKR2T6fL4dFs7I9HMCWeaaP5LbQ18C25HKR2w8HkA+Yvosby409Y8HInfJQx6nrj0Zm5sy+E9uM+u0+n8/351/8Qf6eYBu2FaJPwiVqwzR//NNS00GfyXLJimfvNSk/YmqGjaUg02s2bp8V1D4+tL+mNPflkm3b1lSVfjSPbmyXHMBZ2SZw3Ja/bZqHdFu0weofIsnHvKWWQjZ75I3MxuefH7vct/0otXjW75dm28MZp7fpiz/72Rd/kL4bNopt8g1zk21PwiXbI7bBk+EmE9uyLKxsbpvJE66z2KZfud/MHjG2JR/PtryeuFKZ+f3q58ZZnZN0xLhNu1JzjjUet2X+t/w+XVyobRzYezh66vqj+Pxzmz+Fbea998HP/vKDJum7gW3YVhjYMgdhWaKlztS2K5U2L5ipbYsdq8zgJPX4NNukWZwk1G9H41/sWInqSptd26zHbbbJMbZN9dQ3dS2uq+Xlq5ltTunc6tKZ1qG9h6O1jQNPFxdy+lls0/RIwLfv1Ez7w5n2pi/+zHfgiOz9wTZsE2tbX+p5pOlLbgLHbdpHpumGdNuprFJrlPEjZrBZH9mToGa6pUiZfWDXXOHbPo9qxzZ7Haipyj4gsxgCGj/sLa1m5iO/M0E1fAz3YF1JSWmWf8ZUNmc8v03imcnv7zwpD3V8euG+/bGaE2xrezjj0DZ98WfJv9W//F9NsnfGXne7ba9eb9CcO3riF75f1I6m/vv96+mvPq4t9VW1GP7gNSNf/uH665evXr9UftDn8/lKT8SSr5j2+kGf7+A13euPa0sNX9c2dvIXPt8vakd1X2r5B/W7Xz/oq2pRfXX0xC8Mj+gHT9SWJnf7+kHfL04+1v947KTxj2aL0U5qfhEbH1f6m9MfzuPaUtXGW/5B/bmpfwuTH3/56vVIbekvakc3X73eTP339YO+qhblFWldXF//9YXe/3Wqe/jp87w3simjjrbNhfUHwpuvXzm4iYLWt0VyTjxS5iuLxNN/KovEt7aiQePDczBquAHdy9GgrywSCfrKIvF4JJjavFGiQf12o0GfslPxSJnxu2a8vfE3RIOq1w33Uv9+GT8YDaZfzNiYyUa3P7w8k/k3YeObM387s78n9W9htueZ+578b8NfuZgZmlgKhDrPtMQ2E69l7kdewTbhtsn+K5UZbMs5ykEx47C+bZv2gGh4jNwyVCMa9PmC0dRPWB20VUdlPWZG7GlitldaabLaZrAVW7ZlpiwY1L5k/q8Cg63lb5vqJzP31dQ2bZxl26Vb44FQZ8/IvLQ92FmwDdsEBttyTDRYFolnHPtE2Jb6RtVPxCNlPqMfj0fKyoLBsqSEGd+hOfwqamg2oTqmR4Oar2Uemgtmm+G4LRpRbS0pfdYU2Tblxe3/iEfKUj+T/HmJtp1vG32/7u7C6qactxcRbMM2gcG2XGJ05k39okGy2RaNROKqI2LGlg11iwZ9wWhqA6of1R/nDc49as4B6g7wWinVP2120lU9ytrBOUkVbuYjS4OtFcs2o33WviTLNgW2tY2EhPcWF38gHP1xmooqthG7icfTR23t2ajcx23BoM/n8wUj2XjJ2EJyrGA08NOexDM47qtHGqofTL6mPWZbXwsTd04y/f3Kt1uPF3VbK9b1ttQ/NQzOP6r+fVN827wB2xa2YZvQYFs+MTyC27YtOf5JnsPK/Ab9C9Fo+g8pmzIO02meNGc0DTetGX0FI9vfqDsuW49eRJ+TjMfjmUNSOynmuC31ovpfMxrSim9by4Mpb8C2hW3YJjTYlk8yDdm+YJTtnGRqpJA6/KUGgkZb1kU1e1J1mI5HItHUtySPrcYTIZUd1G1eAdNgkJaPbZrvsGOb5pSmvQttqh8vjm2qb8/4K88cwanPLkfs7lf+eba4EQh1TsytF/qNihNswzaBwbZ8kj72qc7y2Ri3bZ91s7NlfVQSWg1ucvUhuT0j86w2k9xTDU6a71BREk8Oeaz0T/7zwP5dARa26e+j2Ilt6r85/TVL3bnJLTt/1zvPR6fvX7o1Xuh3KVqwDdsEBtvyiXpaY8apQctxW05bto6JO2ZTK7NuTHfNy2pXMn5R64KLEQIAACAASURBVJFdphcGAmbM2kx/qLpvzDKPxTQWs0jt/2DyU9mGNMO2zEuY6V85p1OreaW+M/7R6fuFfIdixx8It/44TUUV20jOSU/7tz6RZXu+X64/YTKFMWfWjK/4GbuV/oLl26gVyr4/6XkZGb+PxWgw/9i9scDqbyG5Yyazb7R8Fg63tY3E3sPRZ4sbhXoDGcE2bBMYbMsn0eTqIaorXQZ3i+Vhm91/7SsH1Z0KYH6w3/mcCPtIl5UVeoSTjP1fyuCvUp8dLqmys1y6Nf7ZxYeS3rxQwTZsExhsI8R9effLW31jC7L3QnD8gXBr7zQVVWwjhLgptwdn36+7K3svxAfbsE1gsI0QlyVybbi+U9bZ0ALGHwi39E5TUcU2Qoib8tHp+0MTS7L3QnywDdsEBtsIcVnerG534yNssgbbsE1gsI0QN2V0esWTF9u2sA3bhAbbCHFTWh5MHf3+key9KEiwDdsEBtsIcVO8bVtz7zQVVWwjO03OS9fnufST5UaLtv58NOgLBtNPJ4hHo0ZPAyjW3dgW64fkc2d1PFLmC0Z0S1jnvFvqT0hs6jvjZ1pihdm25PgD4eYH01RUsY3knQyn7B7N7S5WYiym4UFb2Y8irZJhuD5WtofJiUlytej0x14WiUaCkfj2KtKZq06WlWnBjwazfUz5rcipif3FvfLI+bbR822jBdq43GAbtgkMtuUYzaK9lssJGqO3M9u2DDDJd5CSXwyO3BkiFHAtKrNlM7f/UrKBkvGRGo518/kodSv+576MaA65dGvc0+O2KSqq2EbyjdGjULQLyBseiDPWgjQ7F2lxpjN5zi/53FKrTRVi8GS0X+pHmBXuuG42ILI7UDJ4eJz+yeTmj0o3OV+se6hQQW27PTj7+Tf9Bdq43GAbtgkMtu0gO7Et+9azXsVL0ma2PbFH2NwuExbIVsG2GZykNB+3ZXyc2ueeZ3l4usiMTq98cOpegTYuN9iGbQKDbTvIjmyzfiKZ0bgt8yndyacQmJ8BLNQR1vLpAYU9NWr0mQWjO7BNd33N+batbSQCoc4CbVxu/IHw9QdTVFSxjeSQjKebRXTX3mzYZvuKju56kOaq1jZtZoOlAh1hLR7rXRTbjJ6YZ/HvhMx/HeiHwtlPU2rfTPdTxbVta2srEOpc20gUbvuygm3YJjDYlneMptTZGbftKNGgL/ns56DyBOhgJGPgln7DnT/42XAmfxLTIpwFNd4j9Rtk2KaeI2L2i2f/TGwOSuXa9tnFh7cHZwu3fVnBNmwTGGzLN4bz7u3aZn1C0mjIoX3zYCSuDOzidm2z9Z76GM4EDUa2YbfcqugjPLZtbW1tbV26NR65Nly47cuKPxC+fn+Kiiq2kXwSDfrKylLnA7ePcznYZnn0y/J1hTblpmnbtolIPFJWFgyW+RRTtQzIHLeZuJOZrJ+JxQljB9k2Or3y9tGuwm1fVrAN2wQG2/KKcmzbPoYpg5nkpIYi2JYxzV53xa2AtsUjZWWR6PaGi3tfV/INjEaGmb9qTrbptbS478KWbcW5jz4Q6ny2uFHQtyh+sA3bBAbb8sj2kU11UEtPfhR1TtL86Jh5HUwzbkst9VSAxTEUU83t0P628R2uXZXtDbZ/RT0utmzTf0LbVzOzvreBbdv/xjCYUVSAnGgY8t7jSf2B8A/3p6ioYhvJLWlM8rsHwOp1q68r58uiBouSFGliR3Kcljqu27vlTTdRUfua/ZiopfkEbNlmKL8Vbfp/jmz/uH52TRFs8+RpSWzDNoHBthyjnplvaJut8Ve+4zaDE14ZR/aM7ZZF4qpx3E6TOgNpf9ymS0rD/HAz3r52Omc224Imi0oqFxAjZlfcdOM21Z8049Mi2La1tfV+3d2ekflCv0sxg23YJjDYlks0I4TijttSu6A7lBvdQrc9PhFlm52TndmP6VGTBSFtxRgt3Z0K5rapThsa7pnqSqVuCxrNIkGLX6E4tjV2T3528WGh36WY8QfCP9x/SkUV24jdaB/nojuG6abZRSP5rRli+nX9cddyaWLrY3B+2eG6JPkvpWy0UqXBgsdWk2iM91B3p2J6cpDqpYjJNu2+i+hsJl6/Wd2+sLpZ6DcqWrAN2wQG23aQ/Kdr5D2XRL8qiOV8SItFRPLOzmwzvCHcToyW7RewlL/JQ2129MEVx7atra3ItWEv3ejmD4R/6Hmq6e9/GNG/SDX9uvXJ1e5JzYvYRvLNjmzL85yk/j2zP1Egnz203Lc8bdvJbQkGgzaTJw7YtC3L6dGdPKmnaLYtrG6+Wd3umZsBNLadaY79ffjm4fM/SpfD+f1t4+P/+m8ddQ1D2JYKtu0geY9BzA7LqQifPS8wOzwnmVf0ZwTNP/us18J2Mp3FVopm29bWVuTasGeuuvkD4Ws9T6/1PP3u5k/BSPeeQy17DrXUd8aVF6l19/2mfc+hlgPHb11oH1NewTZCiFuzsLq593B0dHpF9o4IiD8Qbuie/PX5H3/5aasC2y8/bZVuhlt64Pgt5UPbc6jl4//74NLtCWwjhLg459tGvTF0+9n+WmXwkarmj9R+//az6M/fOSn7r1RmsI0Qd2cz8fr9urseeDKAPxA+1/pEPf7428+i0sdDbul7J+6kPre3jnT9/ocRxm2EEHdnaGIpEOrcTLyWvSM7Sup6W23D0H/9tw7lMH3p9oR0NlzRQKhT+dfAF98MKK9gGyHE9TnRMOT2+wFStl3redrQPfkvFx+qj9TUoudan6Qus6VexDZCiOuztpEIhDqHJpZk70j+8QfCTT1P1f325k+hbwY0L1J9TzY+Pt8+pnkR2wghXkjf2MLbR7vWNhKydyTP+APhpntPqahiGyHEI3H17W7Yhm0Cg205x96jXXJcFsRw9ags+2C8MmJZmf2FDzXJ/150m+GjK3Q2E68/OHXv0q1x2TuST/yBcNO9SSqq2EZyjN1lJ4yXmDJcEirHhzWbLStl+QCy9BtZrCRc0PU6+OiKkWeLG4FQpxvv5sY2bBMYbMs9OztAbxkcJXNb3je1blQwml5CSvXkZ02M1sk33q/CDz746IqSlgdTbx/tct0jArAN2wQG23KPcoDOvkSxxdLAyUNh8qFoVpsyHL2kn/ut+rJqjcosB/yUMJplK4tlGx9d4RO5NvzBqXvuuuPNHwg33pukooptJMfsePCR2pByfM7pAaYZV5dU75B6LHb6K9l2Mh6JRLJdABP/fBw+umLl0Lnez7/pl7wTuQTbsE1gsC33JA+c1s9gMxp8ZP5bP7m2vfnDVAwO0NsDDBvPf9OfT9NMlMhlbX1R4aMrYtY2Eu9+eau+07mPlNAE27BNYLAt59i+wqObwJcxRS99fDY7uOoO0OkBhvXTxUy+mjldwuCR4EWZJ8lHV8Q8W9x4s7q9Z2Re9o7Yij8QbuyepKKKbaSY2T5KKk8Zi0fKgpGMw2n6qGx1Xi7rZHrjw3d6LoThQ84ceoDeDh9dPhmdXgmEOl3BG7Zhm8BgW36xcWbL8opLPBKMxJXRSTy/A3Tug4/k5oNRs+d3FucAzUdX7LiFN2zDNoHBtvySbVJElq8rx+doNL6lPZwWdPCRfpNg1P591EWeT8JHV4C4gjd/IHy1e5KKKraRPLKzA7RqzrnBwbaQg4/kl422a7Zgh+jw0cmJ83nDNmwTGGzLLzZOrJkf6zJPYGkGH9Fo+rvyH3xYjBhMTp9lX5hDUPjopMXhvGEbtgkMtuWXfAYfyizBqMHKGvbv0dL8jOZ7kn80vCSkjC2CQeOVNaw00G1lZ+fadutH54w4mTd/IHy1e4KKKraRPJLv4MNg9cOMA3TGdssicdVgxGQ3DA7Q6vfLXD7DZNGozJ+zOC+XGvTs4GC+Sz8658SxvGEbtgkMtuWX/C8a6W9L1h8PVcdR1QFah4IylMiaLCMdo+Ox6cKJyX3YyQF8t350TorC2+3BWdk7khF/IHz17gQVVWwjeSTvA7T+0Gf5b33jGeeqbWX8aNYlrXQ/YfzmqeGZ0dZ2OjbZxR+dkzI0sfRmdbujnobjD4Qb7k5QUcU2kkfynhChfxiK5dqJFs9OMVjkI+sBOmNz5rMqlI0Yz/7b8Z1cu/ejc1om5tbf/fLW0e8fOWRJZWzDNoHBtvyS/4k1/dSD7Mvia7eh/ES2iz8me6ZaMCr7b5H55axLGNvJ7vzoHJq1jcRHp+9/cOre2kZC9r5gG7aJDLbll2yHLs1EBHFvazGusXeAlh4+OsflRMPQ20e7pD/OFNuwTWCwjRCy1dg9+WZ1u9zZJdiGbQKDbYSQra2trb6xBbmzS/yB8JW7E1RUsY0QQra2ZM8uwTZsExhsI4Sko8wu+ej0/YXVzSK/tT8QvnJngooqthFCSEbqO+OBUGfLg6livim2YZvAYBshxCATc+sfnLp36Fxv0W4PwDZsExhsI4QYZzPx+kxLrGiLT/oD4ct3JqioYhshhJhmaGJJmWBS6AEctmGbwGBbUZLHGoxCF7YwWGQqr7c3eTZnli1JvCta3JvveK0xN2cz8Vq5v3toYqlw74Jt2CYw2FaMJJeGyuEom/lAF/MlGO0/cy0YyWW9D+OlqQweM2N7Y/kSY/6729tiDm9uuYS/xfKUuyU9I/OBUOeZlliB7hDANmwTGGwrQiyOmSYDIc3KiYbDPntDEusVF60WGhb4GE4bz30x3s+ySNz418xlPJbLY7HN93RXj9tSWdtIHP3+0dtHuwqxggm2YZvAYJvIGB6ggxHrBX31xugoy9M28wP19rDMbO3GaNDgx2yd2MyyerEBXgYbyP5s7dzONRr/muqljw22rPkhbEtnaGLpg1P3Pjh1T+wpSn8gfOn2OBVVbCOFTa6DndRQLh6JRFMv5Whb+kyc/u2jQUNU0l8zBshELd227f6uJidqzW2LR8rKIhHlgaPaX96M1GA0i7bmTxiPZP03yS637vbg7NtHuz67+PDZ4oaQDWIbtgkMthU4OT4WRqWY6pKX2eHZZLqH5itq3bJdfTIwI/lnPaX6cZx6oKj5xbUjQdNZKZa2pbZud9xm8/vS/4wwe4Fxm1E2E68v3RoPhDoj14Z3PosS27BNYLCtoMn1apfqNJlGJLvjNqMTbUlX7MyG0L7T9p+N9sDo2dU6VH1pGjPe3fRJNta2bX/Ftll254dm7rvBp4htplnbSESuDQdCnZduje9kmgm2YZvAYFsBYzGJIduxOfMIv4O5JKmt2Z5TaWRbvtff0p9A9jOzRqdDlVOKKh7zsC2nc6TJYXLQ8Aoftlnl2eLGZxcfvn20q6NvJr8tYBu2CQy2FSzKsTo/2/TzJJPH+sxrQNkO79s/VxaJ2xzBGNoWCQajBmMZMzjUCqRuk7N91dF83Kb+zGzaZnoDgeEPJ3fckDZssxdlmsnbR7su3RrP9SylPxD+/vY4FVVsIwWIcuw1PwJbHpu15+/Sx3e1L8bT/DIO52oKfL6yYCSajQOzc5LJ/9aqY35ng2acaP/koKltGZuwfwOE0T16lj8aDQaj9md74p1RhiaWPv+m/83q9si1YfvPE8A2bBMYbBOf9BHV/L5ji0FXNKioaGRbxpDC4Eyj4QyNXPbC4KCu+o7MwZfVCT/tnBX7k0W1W03PyY+UJcetwag92wx3MMuemMxx2dHt57s1zxY3IteG36xuP3Sut6NvJuulOGzDNoHBNrHJHBXkPm7bNs3EtjRuNm9INp/vb7xaidW4bUsDg7USmb+B4e+rn4y4ZW6b8slGk1+1Y5uxvdY/aXLmMZfbv4kuHX0zh871vlndfqJhaHR6xezb/IHw97fGqahiGxEW7ZWaXG1LT9kws20rHikLRmzNkNgeahjOAzGbM5nFtoxRjdlFwRyj2YuMUa8yQtvWPnnZ0OZpQONvNX/VVxYMGt/rnu9yLCQjC6ub9Z3xd7+8FQh1Hv3+0e3BWc1IDtuwTWCwrZDJ65zk9k+arbmVfVKD5hY33aHZYhSSxTbtPtocy+Q8XVGH3vZ4WHvXXNRsq2aX1Sx22mQZl8yfsPpAiL08W9xo7J48dK537+HooXO959tGe0bm1zYS/kD4P26NU1HFNlKw5DmXZMvStuwnA7Vb1t28bf7DhbBNYSaSZfATj0fTszoN3ip9F7v6ip/BSU3LfbOcSWLwy5rd18c4TkQ2E6/7xhbOt40eOtcbCHWWVF2U7oGXim2kYBFvW/LYrl98xCrbZxJt3Lydg2327ypQ35VmOmI1n62hfiOtbUaz9a2GiVb/LND9Qsa/fGpgyfhNcBi3YZvAYFshI9K2Mu3qi6oTntkGEcnDsY2xhvU8yYyTgDauQhmPcKyE08Xgol7qj4aGGcxFMb1EaLBfGeNbi3PJTJwUH2zDNoHBtkJGJ5j6iGl1YNQtS2Ly/dbX3lL62T8GG61BrLtWl93UrHxZrdec8T1Gt6eZ0mtyIdHePm9tae4fzPrPD2gTG2fbdvNdf/J/of/0jzdl7wy2ZQ+2FTImh7/sUyt0pwZtPlc088ifxzUh3ZLGUcPbvQ3HPzkMJJVvN7chj0ta2e9bY5zlnEzMretfdLJtv/3Hv/jrL5X/vvjXvr//tez9wbaswTZCSLFT3xn/7OJDjXD+QPi7m+PO7K9/5ftP/3hz+7//4t1v5e9S1mIbIYQUNQurm3sOtew51HKiYSi1KJeTbVP15ru/+teT8ncD27IE2wghEvLul7cU3vYejp5vG1Xub5PuQda6ZdCGbdhGCBGZtY1E39iC0vrO+Pm20fNto59/0//R6fvqBkKdim1KA6HOn79z8rubPzm5v/6V7z8fl78bNotthBCSW54tbvSNLbQ8mDrfNnr0+0cfnb7/9tGu1DgsBdiZlphiW8uDqRR4St+vu5uC7d0vb/WMzPsDYekeeAY2bMM2QohVUquHqA374NS9FF09I/N9YwvPFjdy2qxim3JCUllY0sm2nfzHv0jDdrz63W/l7xK2WQfbCCHa9I0tXLo1/vk3/e9+eUt5SE3KsKyPqrETZS7JoXO96qmS/kD4266fHNmu/+lX3Vzje+ef5e9S9mIbIYRs9YzMR64Nv193VzmpeKYldntwNtfRmM20PJi6PTiredHBtrmy2EYI2aWZmFu/dGv8s4sP9x6OfnDqXn1n3OL5aoUOtmGbwGAbIbsuE3PrJxqG3j7a9fbRrhMNQ/pHqUkJtmGbwGAbIbslm4nXLQ+mPjh1LxDqPNMSM1z4SmKwDdsEBtsI8X6eLW6caBhSZoV09M3I3h3jYBu2CQy2EeLlLKxuRq4N7z0cPdMSK9DEEFHxB8Lf3PiJiiq2EUI8mLWNxPm20b2Ho5Frw6k1G50cbMM2gcE2QjyYxu7JQKjzs4sPHT5WUwfbsE1gsI0QT2VtI/HZxYcfnLoncTZ/fvEHwt/ciFNRxTZCiEcyNLGkzIF0wpz+XINt2CYw2EaIR3Lp1ngg1NkzMi97R/IMtmGbwGAbIV7I+bbR9+vuumLOiFn8gXB9Z5yKKrYRQtwdBba1jYTsHdlRsA3bBAbbCHF3vAHbFrZhm9BgGyEuTsuDKW/AtoVt2CY02EaIW/NscSMQ6nTaspB5B9uwTWCwjRC35qPT9y/dGpe9F8LiD4T/2BmnoopthBD3pb4z/tHp+7L3QmSwDdsEBtsIcV/WNhJ7D0ddtJ6WnfgD4T92xKmoYhshxGVRHpYtey8EB9uwTWCwjRD35d0vb/WNLcjeC8HxB8J/7BijoopthBA35fbg7Pt1d2Xvhfj4A+E/dIxRUcU2QoibErk2XN8Zl70X4oNt2CYw2EaIy/LR6ftDE0uy90J8sA3bBAbbCHFZ3qxud+MjbLIG27BNYLCNEDdldHrFkxfbtrAN24QG2whxU1oeTB39/pHsvShI/IHwxfYxKqrYRghxTbCNYpudYBshbkp9Z/xMS0z2XhQk2IZtAoNthLgp59tGz7eNyt6LggTbsE1gsI0QN+XSrXHGbRTbsgbbCHFTbg/Ofv5Nv+y9KEj8gfCF9jEqqthGCHFNRqdXPjh1T/ZeFCT+QPhC+ygVVWwjhLgmaxuJQKhT9l4UJNiGbQKDbYS4LIFQ59pGQvZeiI8/EL7QNkpFFdsIIW7KZxcf3h6clb0X4oNt2CYw2EaIy3Lp1njk2rDsvRAffyCs3OFAhRTbCCFuyuj0yttHu2TvhfhgG7YJDLYR4r4EQp3PFjdk74XgYBu2CQy2EeK+nGgY8t7jSbEN2wQG2whxXzx5WhLbsE1gsI0QV+b9urs9I/Oy90JksA3bBAbbCHFlGrsnP7v4UPZeiIw/EP66bZSKKrYRQtyXzcTrN6vbF1Y3Ze+IsPgD4a+jo1RUsY0Q4spErg176UY3bMM2gcE2QtyahdXNN6vbPXMzgD8Q/jr6hIoqthFC3JrItWHPXHXDNmwTGGwjxMVZWN3cezg6Or0ie0cEBNuwTWCwjRB353zbqDeGbv5A+Fz0CRVVbCOEuDibidfv1931wJMBsA3bBAbbCHF9hiaWAqHOzcRr2Tuyo2AbtgkMthHihZxoGHL7/QD+QPhc6xMqqthGCHF91jYSgVDn0MSS7B3JP4a2Hfl2QDoSzu+Xlx6daY5hmzrYRohH0je28PbRrrWNhOwdyTMa28L/MfDf/73rn77qkS6H8/t5ff+b1e3/+oc+bEvF9+r1C8d20+PdoA7oSy+1rmnw1xd6RWxqs/j1B8JnW5+cbX0SaRp+78TtPYda9hxqqbv6WHmRWvfv/qVtz6GW/Ue7aq4MKa/4A+GXr195sQk79a0l5h3b1cRzT3fB6110Q5fy60qeXS5o5zcWD0bu/LFreKeberVS/PoD4dPNsX/6que/fNqqwPZfPm2VboZbuv9ol/Kh7TnUEox0//6HEX8gvPxqLZeuu6Qv7BTbsA3bvGPbSmJ5dH6uPNTRNzntOtt+tr9WGXykqvkjtd+/ORz9+Tsnsc2hlW0PtmGb+2xbSSw39Dx560jn+OK8u2zzB8LHLz1Sjz/+5nD0bGuM2unfH7uZ+tzKQ53//m0/4zb5hmGbRyvdrV1q20piuaax/2DkzvzGortsUw7T//qHh29WtyuH6d//MCydDVf0v/1bh/KvgUPnHiivYJt8w7DNo5Xu1u61bSWx/PHZe7+pf+Ay21piSk9fH/nfX/X8zeHoobMPUi9Ssx7//lHyMtu14dSL2CbfMGzzaKW7tattm1ldOHC861z7YxfZ9n9bYur+tvHxobMPNC9Sff+tvu/Ly4OaF7FNvmHY5tFKd2tX27aSWB6dn9tX3XZjaNylttGdFNvkG4ZtHq10t3a7bSuJ5b7J6fJQR868YZv7i23yDcM2j1a6W9iWL2/Y5v5im3zDsM2jle4WtuXLG7a5v9gm3zBs82ilu4Vt+fImybYzLTEqqtgm3zBs82ilu4Vt+fKGbe4vtsk3DNs8WuluYVu+vMmyrTlGRRXb5BuGbR6tdLewLV/esM39xTb5hmGbRyvdLWyz4i3aH8c2Dxfb5BuGbR6tdLewzbT340/3VbeZPg1Hkm2nm2NUVLFNvmHY5tFKdwvbrDo08+zA8a7Pv/vRYEllbHN/sU2+Ydjm0Up3C9uydGZ14cOv7h6M3JlZXcA2jxXb5BuGbR6tdLewzVbDlx++daQz43Gm2Ob+Ypt8w7DNo5XuFrbZ7Xd3Yvuq29KzS7DN/cU2+YZhm0cr3S1sy6F3YpPp2SWSbPvq+ggVVWyTbxi2ebTS3cK23JqeXfJiCdvcXmyTbxi2ebTS3cK2nKvMLvnwq+7xhefY5upim3zDsM2jle4WtuXZc22Py0MdDfdGsc29xTb5hmGbRyvdLWzLt69WhqZnD0bufHz23szKIra5sdgm3zBs82ilu4Vt+du28mpl/sVS5Pqj8lDHjcGJ4tj2++sjVFSxTb5h2ObRSncL23Zkm9L7Y1PKBJNCD+CwDduwzRuVbg+2YVt225QBXPhy31tHOu+PTWGbW4pt8g3DNo9WulvYJsY2pTcGJ8pDHZHrjwp0h4A/EP79DyNUVLFNvmHY5tFKdwvbRNq28mplZmXx8+9+fOtIZ7T/J2xzeLFNvmHY5tFKdwvbBNum9P7Y1MHInYORO2JPUfoD4d/9MEJFFdvkG4ZtHq10t7CtILYpjfb/9NaRzn8+f390bh7bHFhsk28Ytnm00t3CtgLatvJqZf7F0h9vjJSHOmoa+3c+ixLbsA3bvFHp9mAbtu3INqUzK4s1jf3loY4/3hjZyTQTbMM2bPNGpduDbdgmwDalo3Pz/3z+/ltHOq/1jmGbE4pt8g3DNo9WulvYVjzblCrTTN460vnHGyO5nqXENmzDNm9Uuj3Yhm2CbUsJ95s/9u6rbqtp7Lf/PAF/IHzq2ggVVWyTbxi2ebTS3cI2ObalzlLWNPbvq277+Oy9a71jWS/FYRu2YZs3Kt0ebMO2AtqW6rXesY/P3ttX3Ra+3Nc3MY1t2IZt0vnBNmzDNjEdX3h+ru3xgeNd5aGOz7/7Mdr/k2Yk5w+ET10bpqKKbfINwzaPVrpb2OYg29TnKr+7Hfv47L29h6Mfn713unXoxuDEzMoitmEbtnmj0u3BNmyTYFuq8y+W7oxMnm4d+vjsvfJQR0nVRekeeKnYJt8wbPNopbuFbY62TVN/IBxpGnZ0qw+Xn5a9D7aLbfINwzaPVrpb2IZtonq2zOfz+X6ObQ4otjm90u3BNmzDthwa/Btsc0KxzemVbg+2YRu2YRu2YRu2YRu2YZvs3cA2bHN4pduDbdiGbdiGbdiGbdiGbYW07beNw05u8Jc/L/9K/m7YLLbJNwzbPFrpbmEbtmEbtjmvsu3BNmzDNmxTerbUt51fnpW9M9iGbY6udHuwDducZttjKqrYJt8wbPNopbuFbdi2e4tt8g3DNo9WulvYhm27t9gm3zBs82ilu4VtLrPt5NXHVFSxTb5h2ObRSncL27Bt9xbb5BuGbR6tdLewDdt2b7FNvmHY5tFKdwvbsG33Ftvk1VPtWwAAA7ZJREFUG4ZtHq10t7AN23ZvsU2+Ydjm0Up3C9tcZlvd1cdUVLFNvmHY5tFKdwvbsG33FtvkG4ZtHq10t7DNbbY1PKaiim3yDcM2j1a6W9iGbbu32CbfMGzzaKW7hW2us22Iiiq2yTcM2zxa6W5hm8tsq20YoqKKbfINwzaPVrpb2IZtu7fYJt8wbPNopbuFbdi2e4tt8g3DNo9WulvYhm27t9gm3zBs82ilu4Vt2LZ7i23yDcM2j1a6W9jmMttOXBmioopt8g3DNo9WulvYhm27t9gm3zBs82ilu+Vl2xZfzS9szpj3mUWfZ+3L2ecvZ5+/nBPReZvFNuG2zb5cs9H17b4w6Ia2zzexDduwzQV1q20LmzMzG6PbHdM1btHpjZ/sddx2J8w7mepUuk/1xTbhtk28WNF1Vde17a7rO77+QtPZjRfYhm3Y5vxiG7Z5s9gm3zBs82ilu4VtLrOt5soQFVVsk28Ytnm00t3CNtfZNkhFFdvkG4ZtHq10t7AN23ZvsU2+Ydjm0Up3C9vcZtvlQSqq2CbfMGzzaKW7hW3YtnuLbfINwzaPVrpb2OYy2768PEhFFdvkG4ZtHq10t7AN23ZvsU2+Ydjm0Up3C9vcZNtf/Y8T/kCYiupf/Y9abHNoZduDbdiGbcWzLd0XU/Y6bdkZpU8z+uzpi2dPX8yadM5OJ1/MW/a5rguWXTTvkqrLE3ar9wzbHFbZ9mAbtmEbtmEbtmEbtmEbtmEbtmEbtnm60t3CNmzDNmxzXmXbg23Yhm3Yhm3Yhm3Yhm3Yhm3Yhm3Y5ulKdwvbsA3bsM15lW0PtmEbtmEbtmEbtmEbtmEbtmEbtmGbpyvdLWzDNmzDNudVtj3Yhm3Yhm3Yhm3Yhm3Yhm3Yhm3Yhm2ernS3sA3bsA3bnFfZ9mAbtmEbtmEbtmEbtmEbtmEbtmEbtnm60t3CNmzDNmxzXmXbg23Yhm3Yhm3Yhm3Yhm3Yhm3Yhm3Y5ulKdwvbsA3bsM15lW0PtmEbtmEbtmEbtmEbtmEbtmEbtmGbpyvdLWzDNmzDNudVtj3Yhm3Yhm3Yhm3Yhm3Yhm3Yhm3Yhm2ernS3sA3bsA3bnFfZ9mAbtmEbtmEbtmEbtmEbtmEbtmEbtnm60t3CNmzDNmxzXmXbg23Yhm3Yhm3Yhm3Yhm3Yhm3Yhm3Y5ulKdwvbsA3bsM15lW0PtmEbtmEbtmEbtmEbtmEbtmEbtmGbpyvdLWzDNmzDNudVtj3Yhm3Yhm3Yhm3Yhm3Yhm3Yhm0OsO3/A5sa7qG3hndVAAAAAElFTkSuQmCC" alt="" width="347" height="272" />

冒泡算法实例:
列表中有5个元素两辆进行比较,然后用中间值进行循环替换!
既然这样,既然这样我们还可以用一个循环把上面的循环进行在次循环,用表达式构造出内部循环!

li = [13,22,6,99,11]
for n in range(1,len(li)):
for m in range(len(li)-n):
num1 = li[m]
num2 = li[m+1]
if num1 > num2:
temp = li[m]
li[m] = num2
li[m+1] = temp
print li

让的原理和下面一样:

递归

利用函数编写如下数列:

斐波那契数列指的是这样一个数列 0, 1, 1, 2, 3, 5, 8, 13, 21, 34, 55, 89, 144, 233,377,610,987,1597,2584,4181,6765,10946,17711,28657,46368

 def func(arg1,arg2):
if arg1 == 0:
print arg1, arg2
arg3 = arg1 + arg2
print arg3
func(arg2, arg3) func(0,1)

欢迎分享,转载请注明来源:内存溢出

原文地址: https://outofmemory.cn/zaji/586350.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-04-12
下一篇 2022-04-12

发表评论

登录后才能评论

评论列表(0条)

保存