LoadRunner中执行Web性能测试,很重要的一点,是需要对Web网站的响应进行一些检查,以决定请求是否成功,这点很重要,如果设置不好,就会出现请求大面积失败,性能却非常高的情况。
一般,在Loadrunner中检查点有两种:图片和文字。 函数说明 常用的文本检查点函数 1)web_find()函数用于从 HTML 页中搜索指定的文本字符串;
web_find("web_find","RighOf=a","LeftOf=b","What=name",LAST); 参数解释: "web_find"定义该查找函数的名称; “LeftOf”和“RighOf=”用来定义查找字符的左右边界; “What=”定义查找内容; 例如上述参数举例中的意思就是在页面中查找左边界为b,右边界为a,内容为name的信息; 使用该函数注意事项:该函数是在查找页面中的内容,所以要放在要查找的内容的后面;该函数只能在基于HTML模式录制的脚本中进行查找 注意事项:使用该函数时,要在Vuser->Run-Tme Settings中更改下设置勾选“Enable Image and text check”。系统默认是不勾选该选项的。 2)web_reg_find()函数注册一个请求,以在下一个操作函数(如 web_url)检索到的HTML网页上搜索指定的文本字符串;
web_reg_find("Search=Body","SaveCount=ddd","Text=aaa",LAST); 参数解释: Search用来定义查找范围, SaveCount定义查找计数变量名称,该参数可以记录在缓存中查找内容出现的次数,可以使用该值,来判断要查找的内容是否被找到; Text用来定义需要查找的字符串 例如上述参数举例中的意思就是Body中查找内容为aaa的信息,并将出现次数记录在变量ddd中; 1. web_reg_find("Text=Payment Detdils", "Fail=NotFound",LAST);或 2. web_reg_find("Text=Payment Detdils", "Fail=Found",LAST); 解释: “Payment Details” 为你要检查的文本; 若是1:脚本执行到此处,若没有找到check的字符串,脚本将FAIL,并且停止执行下去。反之,则一直执行下去。 若是2:脚本执行到此处,若找到check的字符串,脚本将FAIL, 并且停止执行下去。反之,则一直执行下去。 使用该函数注意事项:该函数是在缓存中查找相应的内容,所以要放在查找内容之前;通常情况下写在如下六个函数之前:Web_castom_request(); web_image(); web_link(); web_submit_data(); web_submit_form(); web_url(); 使用技巧:在该函数的参数中有个“SaveCount”,该参数可以记录在缓存中查找内容出现的次数,我们可以使用该值,来判断要查找的内容是否被找到。 3)web_global_verfication()属于注册函数,注册一个在web页面中搜索文本字符串的请求,与web_reg_find只在下一个Action函数中执行搜索不同的是它在之后所有的Action类函数中执行搜索指定的文本字符串; 常用的图片检查点函数 1)web_image_check()函数用于从HTML页面中查找指定的图片;
web_image_check("web_image_check","Alt=","Src=",LAST); 参数解释:“Alt”和“Src”的值直接取该图片在网页源代码中相应参数的值 注意事项:使用该函数时,要在Vuser->Run-Tme Settings中勾选Enable Image and text check,具体操作请看web_find()中的注意事项。 经过测试,该函数用到查找内容前面或后面,都不影响查找结果。 重放Log常见信息 web_find()和web_image_check()函数的日志信息(这两个日志信息实际上是一样的,只是输出的函数名和参数不同)
1. 出现该信息,说明没有勾选Enable Image and text check
一.定义 图像处理中不适定问题(ill posed problem)或称为反问题(inverse Problem)的研究从20世纪末成为国际上的热点问题,成为现代数学家、计算机视觉和图像处理学者广为关注的研究领域。数学和物理上的反问题的研究由来已久,法国数学家阿达马早在19世纪就提出了不适定问题的概念:称一个数学物理定解问题的解存在、唯一并且稳定的则称该问题是适定的(Well Posed).如果不满足适定性概念中的上述判据中的一条或几条,称该问题是不适定的。
典型的图像处理不适定问题包括:图像去噪(Image De-nosing),图像恢复(Image Restorsion),图像放大(Image Zooming),图像修补(Image Inpainting),图像去马赛克(image Demosaicing),图像超分辨(Image super-resolution )等。迄今为止,人们已经提出许多方法来解决图像处理中的不适定性。但是如何进一步刻画图像的边缘、纹理和角形等图像中重要视觉几何结构,提高该类方法在噪声抑制基础上有效保持结构和纹理能力是有待深入研究的问题。
二、研究现状 1 不适定图像处理问题的国内外研究现状评述 由于图像处理中的反问题往往是不适定的。解决不适定性的有效途径是在图像处理中引入关于图像的先验信息。因此图像的先验模型对于图像反问题和其它计算机视觉还是图像处理问题至关重要。对于图像的先验模型的研究,研究者们从多个角度进行研究,其代表主要有“统计方法”和“正则化几何建模方法”,“稀疏表示方法”三种主流方法,而最近兴起的图像形态分量分析(MCA)方法吸引了大批国内外研究者的广泛关注。 1.1 正则化几何模型日新月异关于自然图像建模的“正则化几何方法”是最近几年热点讨论的主题。其中一类方法是利用偏微分方程理论建立图像处理模型,目前的发展趋势是从有选择性非线性扩散的角度设计各类低阶、高阶或者低阶与高阶综合的偏微分方程, 或者从实扩散向复扩散推广, 从空域向空频域相结合以及不同奇异性结构的综合处理[1]。另一类方法是基于能量泛函最优的变分方法。1992年,Rudin-Osher-Fatemi 提出图像能被分解为一个属于有界变差空间的分量和一个属于 的分量 的全变差模型 [2]。根据国际上及本人的研究表明:ROF模型模型较好地刻画了图像中视觉重要边缘结构,但不能描述纹理信息。2001年Meyer提出了振荡模式分解理论[2]:他认为振荡分量可以表示为某个向量函数的散度形式,而振荡分量可以属于3个可能的函数空间。首先引入有界变差(bounded variational , BV) 空间的一个近似对偶空间来表征图像的振荡分量;Meyer进一步指出John-Nirenberg的有界均值振荡空间和齐性Besov空间都是振荡分量比较合适的函数空间,由此导出了将图像分解的(BV,G)模型,(BV,F)模型和(BV,E)模型。Meyer从理论上基本解决了振荡分量的理论框架,成为纹理等振荡模式分解的奠基性工作,但是原始模型比较难计算。后来的学者大都在Meyer工作的基础上展开工作。Vese-Osher提出将振荡分量建模为的向量场的散度来逼近(BV,G)模型[3],实质上是将G空间近似为负Soblev空间 [4]。L.Lieu和L.Vese进一步推广到分数阶负Soblev空间 [5]。Aujol,Chamboll等人定义了G-空间中的一个子空间,并根据Chamboll早期提出的ROF模型的投影算法的基础上,提出图像的振荡分量是在该子空间上的投影分量,由此提出了著名的BV空间半范 + G空间范数 + L2 范数约束优化的A2BC模型及子空间投影算法 [6-7]。J.B.Garnet,T.M.Le,Y.Meyer, L.A.Vese提出更一般的齐性Besov空间 来刻画振荡分量 [8]。最近,J.Aujol, A.Chamboll分别对TV范数、G范数、F范数、E范数,L 2 范数对图像的卡通图像、纹理分量、高斯噪声进行数理统计和相关性分析,提出了分别运用TV范数、G范数和E范数分别来约束图像的卡通分量、纹理分量和噪声分量的三分量图像分解模型[9]。2007年,G.Gilboa 和S. Osher受提出了非局部化G-空间的概念,并概括性的初步提出了非局部ROF模型、非局部Meyer模型、非局部ROF+L1模型[10],从理论上提供了图像先验模型研究的新思路。但综合目前研究来看,变分方法的主要不足是对于纹理和噪声的刻画还不够精细。
1.2 稀疏表示方兴未艾 图像的稀疏表示问题最早源于“有效编码假说”。Attneave最先提出:视觉感知的目标就是产生一个外部输入信号的有效表示。在神经生物学领域Barlow基于信息论提出了“有效编码假设”,认为初级视皮层神经细胞的主要功能就是去除输入刺激的统计相关性[11]。“有效编码假设”被提出以后,很多研究人员根据它的思想提出了不同的理论。主要思路分为两大类。直接方法是机理测试方法,即从生物机理上,在自然图像刺激条件下检测神经细胞的响应特性。著名的工作如:2001年在《Nature》上发表的研究结果表明,在冗余性测度和自然刺激条件下一组视网膜神经节对外界刺激独立编码[12];2000年在《Science》上发表了类似的成果[13]:通过记录短尾猿 V1 区神经细胞在开放的自然场景和模拟自然场景条件下的神经细胞响应,验证了视皮层(V1 区)神经细胞用稀疏编码有效表示自然场景,稀疏编码用最小冗余度传递信息。另外一个替代的方法是模型仿真方法,即利用自然图像的统计特性,建立模型模拟早期视觉处理系统的处理机制。例如Olshausen 和 Field[14] 提出了稀疏编码模型,稀疏编码理论表明,通过寻找自然图像的稀疏编码表示,该神经网络可以学习得到类似于简单细胞感受野的结构。Bell提出了基于信息最大化的无监督算法,通过度量“因子”的联合信息熵并且使之最大化,扩展了独立成分分析(ICA)方法,成功地构建有效编码模型并得到了与上面类似的结果[15]。Hyvarinen 更进一步,应用一个两层的稀疏编码模型构造出类似于复杂细胞响应特性的基函数,而且基函数集合形成一个有规律的拓扑结构[16]。这部分表明有效编码假设也可适用于视觉系统高级区域神经细胞的处理过程。目前关于图像稀疏表示系统的研究大体上沿着两条主线展开。其中一条是沿着多尺度几何分析理论。研究者认为图像的非平稳性和非高斯性,很难用线性算法进行处理,而应该建立合适的能够处理边缘到纹理各层面几何结构的图像模型;二维图像中的性状奇异性边缘和3-D 图像中丝状物(filaments) 和管状物(tubes)几何特征不能被各向同性的“方块基”(如小波基)表示,而最优或者 “最稀疏”的函数表示方法应该由各向异性的“锲形基”表征。因此以Ridgelet、Curvelet、Bandlet, Contourlet变换为代表的多尺度几何分析[16-22]理论成为图像稀疏表示的有效途径。图2.1.1(a)给出了二维可分离小波在不同分辨率下逼近曲线的过程,随着分辨率升高,尺度变细,最终表现为使用众多的“点”来逼近曲线。 与小波相比,contourlet不仅具有小波的多分辨率特性和时频局部化特性,还具有很好的方向性和各向异性,即在尺度j时,小波基的支撑域边长近似为,而Contourlet的在该尺度下的基函数支撑域的纵横比可以任意选择。图2.1.1(b)为用Contourlet基函数的支撑域来逼近曲线的过程,由于它的基函数的支撑域表现为“长方形”,因而是一种更为有效稀疏的表示法。与二维可分离小波基函数的方向支撑域的各向同性不同,Contourlet基的“长方形”支撑域表现出来的是各向异性(anisotropy)的特点。上述稀疏表示方法都是采用“单一基”,另外一条图像稀疏表示的途径是:基函数被称之为原子库的过完备的冗余系统取代。Mallat和Zhang于1993年首先提出了信号在过完备库(over-complete dictionary)上分解的思想[23]. 通过信号在过完备库上的分解,用来表示信号的基可自适应地根据信号本身的特点灵活选取以得到信号非常稀疏的表示. 后来人们提出了诸如基追踪算法、匹配追踪算法(MP)、正交匹配追踪算法(OMP)、混合匹配追踪算法(HMP)及许多变种。涉及的原子包括多尺度Gabor函数,各向异性的精细原子,小波和正弦函数的级联[24-15]等,并通过训练方法获得结构和纹理分量稀疏表示字典[26-28] 。 目前图像稀疏表示的研究也引起国内众多研究者的关注。中科院杨谦、汪云九等人,中科院计算所史忠植研究员,西安电子科技大学的焦李成教授、华南理工大学谢胜利教授,西南交通大学尹忠科教授等,南京理工大学韦志辉教授,肖亮博士等纷纷展开了稀疏表示的相关问题的研究。 目前图像稀疏表示的研究成为近3年国内众多研究者关注的热点问题,根据<<中国期刊全文数据库>>的检索来看,在2004年之前几乎没有相关报道,而从2004年1月至2008年2月,中国期刊发表的图像稀疏表示与多尺度几和分析应用方面的论文达到187篇,其中关于Ridgelet 56篇,关于Contourlet 63篇,关于 Curvelet 34篇,关于过完备稀疏表示34篇。西安电子科技大学的焦李成教授、华南理工大学谢胜利教授,西安交通大学尹忠科教授、国防科技大学王正明、教授及课题组成员等纷纷展开了基于稀疏表示的相关应用问题的研究[29-33]。本文作者在基于多尺度几何分析的图像增强、去噪、融合、边缘检测、感知压缩和数字水印等展开了相关应用研究,研究结果表明,基于稀疏表示的形态分量分解理论能够很好的捕获图像的几何特征,在图像建模和处理方面具有先天优势。但是综观国内的这些研究还与国外原创性成果具有很大差距。特别在稀疏表示字典的构造、高效稀疏分解算法、稀疏性重建等层面均有大量工作可做。
这其实是我学习图形学以来第一次真正接触数据结构的一篇博客,除了之前用markdown写的那篇文章,那个就是入个小门。
为什么我开始接触数据机构,因为在我做第一次细分的时候就遇到了麻烦,比如DOO-SABIN细分,在每次细分的时候都需要知道这个点在哪个面上,这个点周围是哪几条边,如果按照点表边表面表,只能是按照顺序判断,这条边到了第几的位置,那么它就应该是那个点挨着的边。。这么搞显然。。
后来我得知有半边数据结构这种。。下面的一小段是一个简单的介绍
三维物体在计算机内的表示需要用具体的数据结构来实现,实体造型系统对物体的各种分析运算和操作依赖于一定的数据结构的支持。例如,在使用边界表示法( BRep)造型过程中,经常会遇到从一个点查找与该点相连的所有边,从一条边查找到该边的邻里及其邻接边,从一个面开始查找其上的外环的内环等。这些操作均需要有一个较好的数据结构来支持。造型中的数据结构本质上是对形体表示方式所需信息的存储管理,对于Brep表示就需要对定义形体的面、环、边、点及其属性进行存取、直接查找、间接查找和逆向查找等操作。
边界表示法常用的数据结构有翼边结构、对称结构等。其中翼边结构( winged edge structure)是由美国Stanford大学的B. G. Baumgar t提出的。它的基本出发点是以边为核心,每
条边上有上下两个顶点,左右两个邻面以及和顶点相连的四条边,这些边分别在两个邻面的边构成的环上。这样就可以建立起边与顶点、边与边、边与面的关系。这种数据结构可以从一条已知边出发,有规律地找到这个几何体的所有面、边和顶点。翼边结构的特点是数据结构有固定数目和长度的数据域。
在翼边结构中,与边相邻的环有两个,由于翼边结构没有明确边的正向,因此要确定当前边所在的环与面较困难,于是人们对翼边结构作了种种改进,其中芬兰赫尔辛基技术大学的Martti Mantyla 教授提出的半边结构( half - edge structure)是其中较有代表性的一种。在半边结构中,将一条边一分为二,其中一条半边属于它一个相邻面的边环,而另一条半边属于它另一个相邻面的边环(如图1所示)。每一条半边仅存储它的起点指针,这样两条半边能够表示一条边的两个端点,当搜索一个面的各端点时,只需沿着半边顺序即可。
关于半边数据结构,这里有几篇文章介绍的非常清楚。【突然发现知乎上有好多大神https://www.zhihu.com/question/25337780
还有这个外文网站的介绍更加详尽http://www.flipcode.com/archives/The_Half-Edge_Data_Structure.shtml
在做这个之前,我先把之前http://blog.csdn.net/lafengxiaoyu/article/details/51326618这篇博文里最后的一个利用邻接表的代码进行了改良,现在只有210行
代码改进还是不少的,主要这个涉及指针,顺便加上刚刚研制出来的成果,上代码
#include <windows.h> #include <math.h> #include <gl/GL.h> #include<GL/glut.h> static const GLfloat vertex_list[][3] = { -0.5f, -0.5f, -0.5f, 0.5f, -0.5f, -0.5f, 0.5f, 0.5f, -0.5f, -0.5f, 0.5f, -0.5f, -0.5f, -0.5f, 0.5f, 0.5f, -0.5f, 0.5f, 0.5f, 0.5f, 0.5f, -0.5f, 0.5f, 0.5f, }; GLfloat colors[][3] = { { 1.0, 0.0, 0.
如需转载请标明出处:http://blog.csdn.net/itas109 QQ技术交流群:129518033
最新进展:
CSerialPort串口类最新修正版2017-12-16
http://blog.csdn.net/itas109/article/details/78823082
这是一份优秀的串口类文件,好多的地方值得我们学习,具体在多线程,事件,自定义消息,类的封装方面等等。
Remon提供的串口类网址为: http://codeguru.earthweb.com/network/serialport.shtml,
由于已经运行十几年了,原文的问答部分列出来这么多年来的问题,经过网友们的总结,补充和修改原来代码后,整理出一份相对比较完美的代码。
CSerialPort类地址:https://github.com/itas109/CSerialPort
2017-03-12补充说明
1.增加宏定义_AFX,用于处理MFC的必要函数Hkey2ComboBox
2.进一步去除MFC依赖,修改AfxMessageBox函数
3.增加Win32的程序,用于验证非MFC程序的适用性
CSDN下载:http://download.csdn.net/detail/itas109/9794122
历史更新:
First Version by Remon Spekreijse on 2000-02-08
http://www.codeguru.com/cpp/i-n/network/serialcommunications/article.php/c2483/A-communication-class-for-serial-port.htm
Second Version by mrlong on 2007-12-25
https://code.google.com/p/mycom/
* 增加 ClosePort
* 增加 WriteToPort 两个方法
* 增加 SendData 与 RecvData 方法
by liquanhai on 2011-11-04
http://blog.csdn.net/liquanhai/article/details/4955253
* 增加 ClosePort 中交出控制权,防止死锁问题
by liquanhai on 2011-11-06
http://blog.csdn.net/liquanhai/article/details/6941574
* 增加 ReceiveChar 中防止线程死锁
by viruscamp on 2013-12-04
https://github.com/viruscamp/CSerialPort
* 增加 IsOpen 判断是否打开
HOWTO : Hashcat on Ubuntu Desktop 12.04 LTS hashcat is an advanced password recovery.
Step 1 :
sudo apt-get install p7zip
sudo -sH cd /opt
wget http://hashcat.net/files/oclHashcat-plus-0.14.7z
p7zip -d oclHashcat-plus-0.14.7z
mv /opt/oclHashcat-plus-0.14 /opt/oclHashcat-plus cd /opt/oclHashcat-plus
Step 2 :
To run it. If you have nVidia display card and CUDA drivers installed, you can run the example script.
sudo -sH cd /opt/oclHashcat-plus ./cudaExample0.sh
That’s all! See you.
https://www.youtube.com/watch?v=_OBAFuhGGI0
官网: https://hashcat.net
JQuery插件:iScroll
页面布局:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 < div id = "wrapper" > < div id = "scroller" > < div id = "pullDown" > < span class = "pullDownIcon" ></ span >< span class = "pullDownLabel" >下拉刷新...</ span > </ div > < ul id = "
SwipeRefreshLayout概述 用户通过手势或者点击某个按钮实现内容视图的刷新,布局里加入SwipeRefreshLayout嵌套一个子视图如ListView、RecyclerView等,触发刷新会通过OnRefreshListener的onRefresh方法回调,我们在这里执行页面数据的刷新,每次手势的完成都会执行一次通知,根据滑动距离判断是否需要回调。setRefreshing(false)通过代码直接取消刷新,true则手动设置刷新调出刷新视图。setEnabled(false)通过boolean控制是否禁用手势刷新
SwipeRefreshLayout用法 xml布局 <android.support.v4.widget.SwipeRefreshLayout xmlns:android="http://schemas.android.com/apk/res/android" android:id="@+id/swiperefresh" android:layout_width="match_parent" android:layout_height="match_parent"> <ListView android:id="@android:id/list" android:layout_width="match_parent" android:layout_height="match_parent" /> </android.support.v4.widget.SwipeRefreshLayout> 代码调用 public class SwipeRefreshLayoutBasicFragment extends Fragment { @Override public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { //...........=略................ mSwipeRefreshLayout = (SwipeRefreshLayout) view.findViewById(R.id.swiperefresh); // 设置下拉刷新的圆的颜色 mSwipeRefreshLayout.setColorScheme( R.color.swipe_color_1, R.color.swipe_color_2, R.color.swipe_color_3, R.color.swipe_color_4); return view; } @Override public void onViewCreated(View view, Bundle savedInstanceState) { super.onViewCreated(view, savedInstanceState); //初始化ListView布局 mListView.setAdapter(adapter); //绑定视图刷新的监听 mSwipeRefreshLayout.setOnRefreshListener(new SwipeRefreshLayout.OnRefreshListener() { @Override public void onRefresh() { //TODO //重新获取完网络数据刷新Adapter,完成后需要调用onRefreshComplete方法取消滑出来的圆形进度 } }); } @Override public boolean onOptionsItemSelected(MenuItem item) { switch (item.
既然Mongoose是数据建模用的,那么必然应当极为重视数据类型。
关于数据类型,官网文档 里有详尽的描述,以下是原文与调皮的译文。
注意:这绝非是一个词一个词的翻译,请不要用它来学习英文。=w=
SchemaTypes 数据类型 SchemaTypes handle definition of path defaults, validation, getters, setters, field selection defaults for queries and other general characteristics for Strings and Numbers. Check out their respective API documentation for more detail.
数据类型用于定义默认路径, 验证方式, 获取/设置方法,用于数据库查询的默认字段,以及其他针对字符串与数字的特性。关于详细信息请查阅相关API文档。
译注:默认路径即某个域相对于文档而言的路径,如{a: 1}这个文档中,若指定路径为’a’,即可访问到1这个数据。
Following are all valid Schema Types. 接下来是Mongoose中所有可用的数据类型。
String 字符串Number 数字Date 日期Buffer 缓冲区Boolean 布尔值Mixed 混合Objectid 对象IDArray 数组 Example 举个栗子!
var schema = new Schema({ name: String, binary: Buffer, living: Boolean, updated: { type: Date, default: Date.
const关键字 1、const修饰普通变量和指针 const修饰变量,一般有两种写法: const TYPE value; TYPE const value; 两种写法在本质上是一样的。含义是:const修饰的类型为TYPE的变量value是不可变的。对于一个非指针的类型TYPE,无论怎么写,都是一个含义,即value值不可变。 例如: const int nValue; //nValue是const int const nValue; //nValue是const 但是对于指针类型的TYPE,不同的写法会有不同情况: 指针本身是常量不可变 (char*) const pContent; 指针所指向的内容是常量不可变 const (char) *pContent; (char) const *pContent; 两者都不可变 const char* const pContent; 识别const到底是修饰指针还是指针所指的对象,还有一个较为简便的方法,也就是沿着*号划一条线: 如果const位于*的左侧,则const就是用来修饰指针所指向的变量,即指针指向为常量; 如果const位于*的右侧,const就是修饰指针本身,即指针本身是常量。 2、const修饰函数参数 const修饰函数参数是它最广泛的一种用途,它表示在函数体中不能修改参数的值(包括参数本身的值或者参数其中包含的值): void function(const int Var); //传递过来的参数在函数内不可以改变(无意义,该函数以传值的方式调用) void function(const char* Var); //参数指针所指内容为常量不可变 void function(char* const Var); //参数指针本身为常量不可变(也无意义,var本身也是通过传值的形式赋值的) void function(const Class& Var); //引用参数在函数内不可以改变 参数const通常用于参数为指针或引用的情况,若输入参数采用“值传递”方式,由于函数将自动产生临时变量用于复制该参数,该参数本就不需要保护,所以不用const修饰。 3、const修饰类对象/对象指针/对象引用 const修饰类对象表示该对象为常量对象,其中的任何成员都不能被修改。对于对象指针和对象引用也是一样。 const修饰的对象,该对象的任何非const成员函数都不能被调用,因为任何非const成员函数会有修改成员变量的企图。 例如: class AAA { void func1(); void func2() const; } const AAA aObj; aObj.
解决办法: 找到你安装vmware的路径,使用系统管理员命令提示符(win8、win10使用快捷键win+D)
如果你安装的是vmware12的、系统是x64位话,路径里面应该有个x64文件夹使用命令
> cd x64 > vmware-vmx.exe --new-sn xxxx-xxxx-xxxx-xxxx 这里的xxxx-xxxx-xxxx-xxxx就是密钥,这里也可以提供下我的密钥(5A02H-AU243-TZJ49-GTC7K-3C61N)
回车之后没有提示什么错误的话应该就可以了
转载于:https://www.cnblogs.com/lenq/p/5442273.html
http://www.csdn.net/article/1970-01-01/2826086
京东搜索知识深入解析
指派问题匈牙利解法以及其优化 本人第一次写blog,难免有不足之处,还请大家不吝指正。
1、问题的提出 简单的说,n个人恰好分别承担n个任务,每个人对于不同的任务效率不同;我们的目的就是为使任务完成效率尽可能的高。
例如:有4个工人,要分别指派他们完成4项不同的工作,每人做各项工作所消耗的时间如下表所示,问应如何指派工作,才能使总的消耗时间为最少。
若用0-1整数规划问题的常规思路来解,即:
解:令 xij = 1(第 i人完成第j项工作)或0(第 i人不进行第j项工作).于是得到一个0–1整数规划问题
Min z=15X11+18X12+21X13+24X14+19X21+23X22+22X23+18X24+26*X31
+17X32+16X33+19X34+19X41 +21X42+23X43+17*X44
使得:
Xij只能取0或者1,i,j = 1,2,3,4
最终变成一个线性规划的问题,最终将有4个x的值为1,其对应的下标便是最终的指派。
2、指派问题一般形式 设有 n 个资源(人或机器等)A1, A2, …, An,分配做 n 件事B1, B2, … Bn,要求每件事必须使用1个资源,且不同事件由不同资源完成。已知 Ai 做 Bj的效率(如劳动工时、成本、创造价值等)为cij 。问如何进行指派可使总工作效率最佳?
其中我们称Cij为效率矩阵,问题数学模型为:
3、匈牙利解法相关概念与证明 几个基础概念解答提出者及时间1955年,库恩(W.W.Kuhn)利用匈牙利数学家康尼格(D.König)关于矩阵中独立零元素定理,提出了一种指派问题算法,被称为匈牙利解法。定理1设 C=(cij)是一个效率矩阵,若可行解x*=(xij)的 n个1所对应的 n个 C=(cij)均为0,则x* 是最优解。(若都为零,最终代价为0,定为最优)定理2设给定了以 C=(cij)为效率矩阵的指派问题 G,现将 C的元素cij 改变为: c ′ ( i j ) = c ( i j ) − a i − b i ; a i 与 b i 为 常 数 c'(ij)=c(ij)-a_i-b_i;a_i与b_i为常数 c′(ij)=c(ij)−ai−bi;ai与bi为常数则C’=c’ij为效率矩阵的指派问题G’与G有相同的最优解 定理1与2则为匈牙利法的根基所在,他通过一定的操作将效率矩阵的部分元素化为0,如果存在一组0,这组0满足:1、0的个数等于矩阵的阶数(即等于任务数);2、这组0中任意两个0不同行不同列;那么这组0所对应的分配方式即为最优解
在 我们处理文本时经常要用到过滤HTML标签的函数,这个函数并不难,但为了保持段落结构不被破坏需要保留
标签,就稍微有点点的麻烦 了,如何来实现这个函数?其实这个一点也不难,简单的用一句话来说,就是先把
换成不是HTML标签的样式,然后再去除掉所有的 HTML标签,再把
换回来就行了,下面给出一个完整的实例,不光保留了
并且还 把
换成了 : 希望下面这个函数或许对你有些启发: Function filterhtml(byval fstring) if isnull(fstring) or trim(fstring)=”” then filterhtml=”” exit function end if ’过滤html标签 仅保留
,把
换成
dim re set re = new regexp ’创建一个保存有关正则表达式模式匹配信息的固有全局对象 re.ignorecase=true ’忽略大小写 re.global=true ’设置全局可用性 re.pattern=”
方法1,session技术:
程序代码
<% Dim SplitReflashPage Dim DoReflashPage dim shuaxin_time DoReflashPage=true shuaxin_time=10 ReflashTime=Now() if (not isnull(session("ReflashTime"))) and cint(shuaxin_time)>0 and DoReflashPage then if DateDiff("s",session("ReflashTime"),Now())<cint(shuaxin_time) then response.write "<META http-equiv=Content-Type content=text/html; charset=gb2312><meta HTTP-EQUIV=REFRESH CONTENT=3>本页面起用了防刷新机制,请不要在<b><font color=ff0000>"&shuaxin_time&"</font></b>秒内连续刷新本页面<BR>正在打开页面,请稍候……" response.end else session("ReflashTime")=Now() end if elseif isnull(session("ReflashTime")) and cint(shuaxin_time)>0 and DoReflashPage then Session("ReflashTime")=Now() end if randomize timer regjm=int(rnd*8998)+1000 %> 方法2,cookie技术:
程序代码
<% Dim URL If DateDiff("s",Request.Cookies("oesun")("vitistime"),Now())<2 Then URL=Request.ServerVariables("Http_REFERER") Response.Write("<meta http-equiv=""refresh"" content=""2;URL="&URL&""">") Response.Write("防刷新,两秒后自动跳转") Response.End End IF Response.Cookies("oesun")("vitistime")=Now() %>
解决方法:sudo apt-get install alien
转载于:https://www.cnblogs.com/xDan/p/5411083.html
简述:
前段时间碰到了类似QQ点击头像弹出对话框的需求,为此自己写了demo。可后来发现用到该自定义View的地方不是一处,而且item的数量也不一样,为了能够随意添加item数量,于是就对代码进行了重构,今天就来记录一下。
效果图: 方案: 有两种实现方式:
第一种采用popupWindow的方式,但是利用这种方式实现会出现问题:在有虚拟键的手机中,在正在显示上图效果时如果突然隐藏虚拟键,那么这个效果图不会自动下沉,而本来虚拟键的位置会显示留白,所以这种方案是不太理想的。
第二种方案,也就是本片博客采用的方案:利用Dialog的方式,这种方式不会出现第一种方案的问题。该视图分为两个部分:它上半部分采用一个ListView(“版本更新”、“反馈”、“退出QQ”),注意这个Dialog必须去除去除Title,否则虽然Title不显示它依然存在而影响Dialog的点击事件。下半部分是一个TextView(“取消”)。
方案实现:
接下来看一下具体的实现:
一、首先我们定义两个Dialog的Style:
1:首先定义一个Dialog的主题theme的style,代码如下:
<style name="transparentFrameWindowStyle" parent="android:style/Theme.Dialog"> <!-- 边框 --> <item name="android:windowFrame">@null</item> <!-- 是否有标题(去除标题) --> <item name="android:windowNoTitle">true</item></span> <!-- 是否浮现在activity之上 --> <item name="android:windowIsFloating">true</item> <!-- 半透明 --> <item name="android:windowIsTranslucent">false</item> <!-- 背景透明 --> <item name="android:windowBackground">@android:color/transparent</item> <!-- Dialog背景模糊 --> <item name="android:backgroundDimEnabled">true</item> </style> 2:再定义一个Dialog的显示与消失的动画Style,代码如下: <style name="bottom_dialog_anim_style"> <item name="android:windowEnterAnimation">@anim/bottom_dialog_in_anim</item> <item name="android:windowExitAnimation">@anim/bottom_dialog_out_anim</item> </style> 在这用到了两个动画, bottom_dialog_in_anim动画和 bottom_dialog_out_anim动画。 bottom_dialog_in_anim动画如下:
<?xml version="1.0" encoding="utf-8"?> <set xmlns:android="http://schemas.android.com/apk/res/android" > <translate android:duration="200" android:fromXDelta="0" android:fromYDelta="0" android:toXDelta="0" android:toYDelta="1000" /> </set> bottom_dialog_out_anim动画代码如下: <?
Mercurial使用笔记5 保存和恢复工作区的修改 命令: hg shelve 类似于git stash命令 Temporarily stash away changes(暂时保存工作区的改变) 用途:在切换到新的工作分支之前执行这个命令保存工作区的更改,工作区 就会变得非常干净,然后我们就可以切换到新的分支,修改完新的分支后,再回到前面的工作区,回复切换之前的更改。
命令:hg unshelve 恢复之前用hg shelve命令保存的内容
参考: https://www.mercurial-scm.org/wiki/ShelveExtension
//如果创建一个Rect对象rect(100, 50, 50, 100),那么rect会有以下几个功能: rect.area(); //返回rect的面积 5000 rect.size(); //返回rect的尺寸 [50 × 100] rect.tl(); //返回rect的左上顶点的坐标 [100, 50] rect.br(); //返回rect的右下顶点的坐标 [150, 150] rect.width(); //返回rect的宽度 50 rect.height(); //返回rect的高度 100 rect.contains(Point(x, y)); //返回布尔变量,判断rect是否包含Point(x, y)点 //还可以求两个矩形的交集和并集 rect = rect1 & rect2; rect = rect1 | rect2; //还可以对矩形进行平移和缩放 rect = rect + Point(-100, 100); //平移,也就是左上顶点的x坐标-100,y坐标+100 rect = rect + Size(-100, 100); //缩放,左上顶点不变,宽度-100,高度+100 //还可以对矩形进行对比,返回布尔变量 rect1 == rect2; rect1 != rect2; //OpenCV里貌似没有判断rect1是否在rect2里面的功能,所以自己写一个吧 bool isInside(Rect rect1, Rect rect2) { return (rect1 == (rect1&rect2)); } //OpenCV貌似也没有获取矩形中心点的功能,还是自己写一个 Point getCenterPoint(Rect rect) { Point cpt; cpt.
问题:
org.springframework.beans.factory.CannotLoadBeanClassException: Cannot find class [com.XXX.util.spring.EncryptPropertyPlaceholderConfigurer] for bean with name 'propertyConfigurer' defined in URL .................
这个主要问题是,jdk没有编译出class文件造成的(可以D:\apache-tomcat-7.0.61\webapps\xxx(项目名字)\WEB-INF\classes下查看是否有class文件出现,如果没有就是这个原因,可以继续看下面方法,如果不是就不需要往下看了)。
1、查看jre是否是你安装jdk时的jre,如果不是改成如图
2、查看你的tomcat用的jre是否是安装jdk时的jre.如果不是改成如图
最重启tomcat 。
成功!
原文地址:http://jingyan.baidu.com/article/e52e36154d3bf040c70c515b.html 感恩!
最近因为换电脑,刚装上了win7的64bit系统(99%纯净版,这个版本目前还挺流行的),然后就遭遇了一个问题是:电脑开机几次后发现内存占用其高无比,4G内存被吃掉了80%!!!就去百度经验上找经验,发现很多帖子甚至一些得票数很高的帖子并不能解决我的问题,而且对问题的描述很不准确,因此写下此帖送给需要帮助的人。该方法无需任何辅助软件,在最后我会解释下这个问题出现的原因,并给出一些实用建议,先把问题暂时解决了吧。
方法/步骤 第一步当然是Ctrl+Alt+Del调出任务管理器,找出引起内存过高的“元凶”了。注意观察我标注的部分,要勾选“显示所有用户的进程”,因为系统也是一个用户呀,只不过是隐藏较深的后台用户,这样就能查看系统开启的任务了。可以看出scvhost这个任务占用了我一半的内存!!!但是又不能简简单单的暴力的直接终止这个任务,如果你认为事情就这么简单,那你的电脑离蓝屏也就不远了。
然后右键那个svchost任务,选最后一个“转到服务”选项。
在这个页面可以看到好几个PID为1056的服务,他们是一家子,这个家的名字叫netsvcs。不要管他们叫什么“名称”,重点看“描述”,等会儿有用。
然后呢,看到右下角的那个“服务”按钮了吗,很方便的设计,这是一个超链接,可以直接转到著名的“服务”页面,不用你费心去找了。
在这个页面,有一个叫“Windows Update”的服务是吃内存大户,直接停止它就可以了。不过这样并不彻底,还需要右键,进入更多的设置页面。
将“启动类型”设置为“手动”,或者“禁止”。
再看你的内存是不是正常了?我这个经验管用吧,管用就点赞,并且拉着别人一起来点赞啊!
一定要注意的是:将这个服务停止了之后,你的电脑就不能自动更新了。这个服务这么占内存,我认为是新系统正在联网索引可用的更新。如果你需要更新系统的话,建议在夜间不使用电脑的时候再打开,等待更新任务的完成。更新是有好处的,可以打系统补丁,修复一些漏洞,也能升级一些功能。不过对于最普通的用户来说,用处不是很大。如果你是一个开发者,建议开启。
Mercurial去除所有not tracked文件 hg status [OPTION]… [FILE]… (简写:hg st) option: -u –unknown show only unknown (not tracked) files, 使用这个命令可以获取所有not tracked的文件
xargs是一条Unix和类Unix操作系统的常用命令。它的作用是将参数列表转换成小块分段传递给其他命令,以避免参数列表过长的问题[1]。 例如,下面的命令:
rm find /path -type f 如果path目录下文件过多就会因为“参数列表过长”而报错无法执行。但改 用xargs以后,问题即获解决。
find /path -type f -print0 | xargs -0 rm
参考: https://zh.wikipedia.org/wiki/Xargs 结合上面两个命令: hg st -un | xargs rm 摘自:http://www.ophome.cn/question/10011
前言:复杂类型说明 要了解指针,多多少少会出现一些比较复杂的类型,所以我先介绍一下如何完全理解一个复杂类型,要理解复杂类型其实很简单,一个类型里会出现很多运算符,他们也像普通的表达式一样,有优先级,其优先级和运算优先级一样,所以我总结了一下其原则:从变量名处起,根据运算符优先级结合,一步一步分析.下面让我们先从简单的类型开始慢慢分析吧: int p; //这是一个普通的整型变量 int *p; //首先从P 处开始,先与*结合,所以说明P 是一个指针,然后再与int 结合,说明指针所指向的内容的类型为int 型.所以P是一个返回整型数据的指针 int p[3]; //首先从P 处开始,先与[]结合,说明P 是一个数组,然后与int 结合,说明数组里的元素是整型的,所以P 是一个由整型数据组成的数组 int *p[3]; //首先从P 处开始,先与[]结合,因为其优先级比*高,所以P 是一个数组,然后再与*结合,说明数组里的元素是指针类型,然后再与int 结合,说明指针所指向的内容的类型是整型的,所以P 是一个由返回整型数据的指针所组成的数组 int (*p)[3]; //首先从P 处开始,先与*结合,说明P 是一个指针然后再与[]结合(与"()"这步可以忽略,只是为了改变优先级),说明指针所指向的内容是一个数组,然后再与int 结合,说明数组里的元素是整型的.所以P 是一个指向由整型数据组成的数组的指针 int **p; //首先从P 开始,先与*结合,说是P 是一个指针,然后再与*结合,说明指针所指向的元素是指针,然后再与int 结合,说明该指针所指向的元素是整型数据.由于二级指针以及更高级的指针极少用在复杂的类型中,所以后面更复杂的类型我们就不考虑多级指针了,最多只考虑一级指针. int p(int); //从P 处起,先与()结合,说明P 是一个函数,然后进入()里分析,说明该函数有一个整型变量的参数,然后再与外面的int 结合,说明函数的返回值是一个整型数据 Int (*p)(int); //从P 处开始,先与指针结合,说明P 是一个指针,然后与()结合,说明指针指向的是一个函数,然后再与()里的int 结合,说明函数有一个int 型的参数,再与最外层的int 结合,说明函数的返回类型是整型,所以P 是一个指向有一个整型参数且返回类型为整型的函数的指针 int *(*p(int))[3]; //可以先跳过,不看这个类型,过于复杂从P 开始,先与()结合,说明P 是一个函数,然后进入()里面,与int 结合,说明函数有一个整型变量参数,然后再与外面的*结合,说明函数返回的是一个指针,,然后到最外面一层,先与[]结合,说明返回的指针指向的是一个数组,然后再与*结合,说明数组里的元素是指针,然后再与int 结合,说明指针指向的内容是整型数据.所以P 是一个参数为一个整数据且返回一个指向由整型指针变量组成的数组的指针变量的函数.说到这里也就差不多了,我们的任务也就这么多,理解了这几个类型,其它的类型对我们来说也是小菜了,不过我们一般不会用太复杂的类型,那样会大大减小程序的可读性,请慎用,这上面的几种类型已经足够我们用了. 一、细说指针 指针是一个特殊的变量,它里面存储的数值被解释成为内存里的一个地址。要搞清一个指针需要搞清指针的四方面的内容:指针的类型、指针所指向的类型、指针的值或者叫指针所指向的内存区、指针本身所占据的内存区。让我们分别说明。 先声明几个指针放着做例子: 例一: (1)int*ptr; (2)char*ptr; (3)int**ptr; (4)int(*ptr)[3]; (5)int*(*ptr)[4]; 1.
socket的bind函数 简单分析一下socket中的bind : 原文地址
在最开始接触bind的时候,只是在写基于tcp的server端的时候,知道在listen之前需要先bind一下,用来确保socket能在某个固定的端口监听。而bind的时候,函数参数中的端口填自己将要绑定的端口就行;而IP地址,需要填本机的IP,但是也可以用一个宏INADDR_ANY代替,用这个宏就可以不用查找本机的IP,它就可以代替本机的IP。当时只觉得这个INADDR_ANY比较神奇,但是由于当时觉得用起来很方便,也没出啥问题,也就没有再深究。 但是最近在做RTSP服务器的时候,有种特殊的应用,导致我不得不对bind这个函数仔细地看一下。 我们知道无论是UDP还是TCP,socket都会与一个本地的IP和端口想对应,我们往往把这个IP和端口称之为socket的源地址和源端口。当我们作为客户端利用socket去发送数据时,很少会去考虑这个源地址和源端口到底是什么,我们更关心的是它的目的地址和端口。我们往往只有在监听的时候,才去考虑这个源端口,所以我们在监听的时候会去用bind。当我们bind之后,内核就会将这个socket的源端口锁定到我们设定的端口上。但是这就有一个问题,这个bind绑定端口,是将本来没有源端口的socket绑定到我们指定的端口上,还是将一个已经分配了端口的socket重定向到我们指定的端口上呢? 在《UNIX网络编程》这本书中提到:“如果一个TCP客户或者服务器未曾调用bind捆绑一个端口,当调用connect或listen时,内核就要为相应的套接字选择一个临时接口。”从这句话中可以判断出,其实在调用socket函数创建socket时,内核还并未给socket分配源地址和源端口。而对于UDP,我猜测在调用sendto发送数据时,在未捆绑端口的情况下,内核也会随机分配端口。 而我遇到的特殊应用要求我在用UDP发送数据之前要告诉对方我的发送端口,这也就意味着我在sendto之前必须要捆绑端口,因此我在发送数据之前就得调用bind函数绑定一下端口了。但是我就在想内核既然有随机分配端口的能力,而我需要的也只是让它绑定一下而不用绑定在固定端口的业务,socket中应该能够提供这种业务。然后果然我发现bind就具备这种能力,当bind的参数中端口地址为0的时候,这时候就是由内核分配端口。这样我就不用考虑端口地址重复的问题,而放心的把这个问题交给内核处理了。 就在发现bind的这个机制的同时,我发现其实bind对于源地址也同样具备这种处理方式,当系统具有多IP(多网卡)的情况,当我们把bind函数中的ip参数置0时,就是由内核自己选择分配IP。而之前一直觉得很神奇的INADDR_ANY其实一点也不神奇,它的值其实就是0。所以当我们只有单一IP的时候,我们就可以用INADDR_ANY去代替那个单一的IP,因为内核分配的时候只能选择这一个IP。从而造成了INADDR_ANY就是本机IP的现象。
客户端 用不用 bind 的区别 : 原文地址
无连接的socket的客户端和服务端以及面向连接socket的服务端通过调用bind函数来配置本地信息。使用bind函数时,通过将my_addr.sin_port置为0,函数会自动为你选择一个未占用的端口来使用。 Bind()函数在成功被调用时返回0;出现错误时返回”-1”并将errno置为相应的错误号。需要注意的是,在调用bind函数时一般不要将端口号置为小于1024的值,因为1到1024是保留端口号,你可以选择大于1024中的任何一个没有被占用的端口号。
有连接的socket客户端通过调用Connect函数在socket数据结构中保存本地和远端信息,无须调用bind(),因为这种情况下只需知道目的机器的IP地址,而客户通过哪个端口与服务器建立连接并不需要关心,socket执行体为你的程序自动选择一个未被占用的端口,并通知你的程序数据什么时候打开端口。(当然也有特殊情况,linux系统中rlogin命令应当调用bind函数绑定一个未用的保留端口号,还有当客户端需要用指定的网络设备接口和端口号进行通信等等) 总之: 1.需要在建连前就知道端口的话,需要 bind 2.需要通过指定的端口来通讯的话,需要 bind
具体到上面那两个程序,本来用的是TCP,客户端就不用绑定端口了,绑定之后只能运行一个client的程序属于自己人为设定的障碍,而从服务器那边得到的客户机连接端口号(是系统自动分配的)与这边客户机绑定的端口号根本是不相关的,所以客户端绑定也就失去了意义。
首先,服务器和客户端都可以bind,bind并不是服务器的专利。 客户端进程bind端口: 由进程选择一个端口去连服务器,(如果默认情况下,调用bind函数时,内核指定的端口是同一个,那么调用多个调用了bind()的client程序,会出现端口被占用的错误)注意这里的端口是客户端的端口。如果不分配就表示交给内核去选择一个可用端口。 客户端进程bind IP地址:相当于为发送出去的IP数据报分配了源IP地址,但交给进程分配IP地址的时候(就是这样写明了bind IP地址的时候)这个IP地址必须是主机的一个接口,不能分配一个不存在的IP。如果不分配就表示由内核根据所用的输出接口来选择源IP地址。
一般情况下客户端是不用调用bind函数的,一切都交给内核搞定,YES!
服务端进程bind端口:基本是必须要做的事情,比如一个服务器启动时(比如freebsd),它会一个一个的捆绑众所周知的端口来提供服务,同样,如果bind了一个端口就表示我这个服务器会在这个端口提供一些“特殊服务”。 服务端进程bind IP地址:目的是限制了服务端进程创建的socket只接受那些目的地为此IP地址的客户链接,一般一个服务器程序里都有 servaddr.sin_addr.s_addr = htonl(INADDR_ANY); // 只是针对IP4,IP6代码不太一样 这样一句话,意思就是:我不指定客户端的IP,随便连,来者不拒!
总之只要你bind时候没有指定哪一项(置为0),内核会帮你选择。
参考代码:原文地址
#define FINGER_PORT 79 #define bzero(ptr, size) memset (ptr, 0, size) /* Create a TCP connection to host and port. Returns a file * descriptor on success, -1 on error.
原因 Android studio中,Logcat的缓存应该是5000行,而且google并未搜出哪里可以修改,所以若某些线程输出的log比较多,真机调试杂乱的输出也比较多,MainActivity中的log可能就被冲刷掉了。
解决方案 首先logcat右上角添加一个Filter,仅输出当前程序的log。
然后选中这个filter,这里用的imed。
此时若程序其它线程输出的log还是很多,就提前在搜索框里输入要搜索的值,仅仅保存与搜索值匹配的log,这里用的liyongzhi。
注意,不要在程序运行后再输入,因为运行后再输入被冲刷的是显示不出来的。
这样就能得到特定搜索值的log了。
很多学习web前端开发(http://www.maiziedu.com/course/web/)的朋友,在前期学习css样式时,对css样式都表示不熟悉,记不住css样式、标签表达的含义,今天整理了一份我们常用的css样式和标签,欢迎大家收藏。
1.字体样式:
font-family:"字体样式";
font-size:"字体大小";
color:字体颜色;
font-weight:bold; 粗体显示
font-style:italic 斜体
text-decoration:"underline"; 显示下划线效果
text-decoration:"line-through"; 类似于淘宝打折的删除线
text-indent:2em; 文字段落的第一行空两格
line-height: 1.5em;设置行高
letter——spacing 字母与字母之间的间隔
word-spacing 英语单词之间的间隔
text-align 块状元素居中显示
2. 元素分类
块状元素和内联元素,内联块状元素
块状元素和内联元素的最大区别就是 块状元素必须独自占一行
a.常用的块状元素:
<div>,<p>,<h1>,<ol>,<ul>,<dl>(自定义列表),<table>,<address>,<blockquote>,<form>
其特点是 :
1.每个元素都独占一行
2.元素的高度,宽度,行高,以及顶和底边距离都可以设置
元素宽度在不设置是和父容器一个高度
b.常用的内联元素
<a>,<span>,<br>,<i>(页面的所有文字以斜体效果显示),<em>,<strong>,<lable>,<q>,<var>,<cite>,<code>
其 特点:
和其他元素都在一行上
元素的高度,宽度,顶部和底部都不可进行设置
元素的宽度就是他的问题和图片的宽度不可以改变
常用的内联块状元素有
<img>,<input>
将内联元素转换为块状元素的 方法 display:block;
块状元素转换成内联元素的方法: display: inline;
内联块状元素,两种元素一起使用 : display:inline-block;
盒子模型:
border : 2px solid red; 设置边框粗细为2px的样式为实心,颜色为红色
他等于
border-width:2px;
border-style:solid; dashed 是虚线 dotted 点线 solid 实线
代码为公司的定制版基于android5.1,没有具体比较锁屏部分应该和原生代码有所不同。本文基于浏览代码结果,没有手机版本和代码版本不一致(APP上还是一脉相承)所以没有在手机上直接试验。
首先在自己手机的版本上显示的默认锁屏方式在“设置”->“安全”->“屏幕锁定方式”其值为“滑动”,
首先寻找“滑动”字符串packages/apps/Settings/res/values-zh-rCN/strings.xml
<string name="unlock_set_unlock_none_title" msgid="5679243878975864640">"滑动"</string>
被引用:
packages/apps/Settings/res/xml/security_settings_picker.xml
被引用:
packages/apps/Settings/src/com/android/settings/ChooseLockGeneric.java
没有其他发现,转而向寻找“安全”
<string name="security_settings_title" msgid="7945465324818485460">"安全"</string>
安全选项界面
<activity android:name="Settings$SecuritySettingsActivity"
android:label="@string/security_settings_title"
android:configChanges="orientation|keyboardHidden|screenSize"
android:taskAffinity=""
android:parentActivityName="Settings">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<action android:name="android.settings.SECURITY_SETTINGS" />
<action android:name="android.credentials.UNLOCK" />
<category android:name="android.intent.category.DEFAULT" />
<category android:name="android.intent.category.VOICE_LAUNCH" />
</intent-filter>
<meta-data android:name="com.android.settings.FRAGMENT_CLASS"
android:value="com.android.settings.SecuritySettings" />
<meta-data android:name="com.android.settings.TOP_LEVEL_HEADER_ID"
android:resource="@id/security_settings" />
<meta-data android:name="com.android.settings.PRIMARY_PROFILE_CONTROLLED"
android:value="true" />
</activity>
别名设置:
<activity-alias android:name="SecuritySettings"
android:label="@string/security_settings_title"
android:configChanges="orientation|keyboardHidden|screenSize"
android:exported="true"
android:targetActivity="Settings$SecuritySettingsActivity">
<meta-data android:name="com.android.settings.FRAGMENT_CLASS"
android:value="com.android.settings.SecuritySettings" />
<meta-data android:name="com.android.settings.TOP_LEVEL_HEADER_ID"
android:resource="@id/security_settings" />
</activity-alias>
所以找到SecuritySettings.java,这里是“设置”->"安全"界面,也是开始寻找如何修改默认锁屏方式的入口。
第二阶段:寻找判断的过程
微信开放第三方API接口,
申请地址: https://mp.weixin.qq.com/advanced/advanced?action=interface&t=advanced/interface&token=1865635074&lang=zh_CN
官方提供PHP开发代码下载: 点此下载
如果你的微信接口页面没有做好,提交保存的时候,会提示:验证Token失败。这个错误是因为,你的接口页面还没有反馈正确的信息给微信接口。微信在教程方面还做得不够成熟,就一个PHP示例,还是有问题的,在下篇文章我会讲到这个错误在哪。微信官方也没有跟大家说清楚怎么才能是token验证成功。下面我将给出示例告诉大家如何通过token验证。
譬如:微信接口页面是http://bbhet.com 默认页面是weixin.php,我们只需要把weixin.php的代码改为, 然后放到你得网站根目录:
官方下载地址 http://mp.weixin.qq.com/wiki/8/f9a0b8382e0b77d87b3bcc1ce6fbc104.html
方法一: 简单的PHP实现Token验证
<?php //1. 将timestamp , nonce , token 按照字典排序 $timestamp = $_GET['timestamp']; $nonce = $_GET['nonce']; $token = "你自定义的Token值 用于验证"; $signature = $_GET['signature']; $array = array($timestamp,$nonce,$token); sort($array); //2.将排序后的三个参数拼接后用sha1加密 $tmpstr = implode('',$array); $tmpstr = sha1($tmpstr); //3. 将加密后的字符串与 signature 进行对比, 判断该请求是否来自微信 if($tmpstr == $signature) { echo $_GET['echostr']; exit; } 方法二: 封装类的代码实现Token验证
<?php /** * wechat php test */ //define your token define("
数据结构:
线性:数组 (Array)、栈 (Stack)、队列 (Queue)、链表 (Linked List)、块状数组(数组+链表)
树:堆(heap)、二叉搜索树(binary search tree)、Merkle Tree(Hash Tree)、B-/B+ Tree、AVL树、红黑树、二叉树、哈夫曼树
图 (Graph)
散列表 (Hash)
算法:
基础:枚举,递归,分治,模拟,贪心,动态规划,剪枝,回溯
排序:冒泡、快速、直接选择和堆、直接插入和希尔排序、归并排序
查找:顺序查找、二分查找、索引查找、二叉排序树、哈希查找
图算法:深度优先遍历与广度优先遍历, 最短路径,最小生成树,拓扑排序
前言 架构,又名软件架构,是有关软件整体结构与组件的抽象描述,用于指导大型软件系统各个方面的设计。 软件架构设计目标: 1.可靠性(Reliable)。软件架构的可靠是产品设计的前提。 2.安全性(Secure)。软件架构的安全性是产品可持续发展的条件。 3.可扩展性(Scalable)。软件架构必须能够不同的功能需求情况下,支持可扩散性。 4.可定制化(Customizable)。同样的一套软件,可以根据客户群的不同和市场需求的变化进行调整。 5.可伸缩 (Extensible)。在新技术出现的时候,一个软件架构应当允许导入新技术,从而对现有系统进行功能和性能的扩展。 6.可维护性(Maintainable)。软件系统的维护包括两方面,一是排除现有的错误,二是将新的软件需求反映到现有系统中去。一个易于维护的系统可以有效地降低技术支持的花费。
架构是项目形成到一定阶段的趋势。是对整个产品是否合格的有效保证。对于很多项目设计人员,在不考虑产品本身,不考虑团队,不考虑时间周期的前提下,一味的强调软件构架,是不合理的,也不利于整个产品的发展。当然,一个好的项目架构师,是很能清楚,项目在不同阶段,所需要处理的不同职责。能够最大限度的发挥能效,将产品周期,与功能模块做出最合适的匹配规划,这才是一个架构师所必须追求的。
以下是个人对Android移动项目架构设计简单的经验之谈。欢迎与更多的朋友交流,若有疑问,或不合理之处,都可以随时交流。
从项目功能开始 每一个项目架构师,在拿到一个新项目的时候,都会不同的着重点。在项目规划风格上,都会有不同的考虑。而我个人在着手项目时,都会从功能上去着手。先了解项目整体的功能模块,区分出主体功能模块有哪些类,对不同的功能模块进行细致的划分。这是我开始的第一步。因为,只有对项目整体有个把握,才能更快的对项目有了解,才能知道怎样去合理安排项目的研发,才能更好的去安排项目进度流程,和人员的安排调度。
功能划分之后,接下来就是项目的实际研发阶段。这个阶段就是项目实际进展阶段了。必须要有合理的安排调度,才是保证项目的高效。比如:我们进行的大部分项目,都有网络交互的部分,也有本地功能部分,还有一些基础数据模块部分,这些功能必须要有合理的时间安排。
项目研发之前,几点提要说明: 一、团队之间统一编码规范。 二、需求文档统一管理。 三、多人协同开发,根据文档开发(一切以文档为主)。
项目以功能划分,功能以模块划分。在项目初期,除了产品原型可能是提前设计成形外,其它的项目文档都还未出来,产品也是有个确定功能,但是细节文档还未成形,这个时候已经是项目开始阶段,即使在有一些文档还未成形前,也可以开始项目的基础开发了。
功能模块 网络模块,数据库存储模块,数据加密模块,数据缓存模块,数据解析器,日志信息收集模块等。这些都是项目的基本模块,也可以独立于功能的模块,可以提前开发,测试。便于后期直接使用。
移动安全机制 做过移动项目的都知道,移动安全是项目前期需要考虑的一个重要环节。所以,在项目之初,就应该对自身的数据存储做必要的数据加密,对网络传输的数据进行必要加密。 移动数据加密分为两种: 一种是本地数据加密,只是本机存储的信息,本地加密保存。 一种是网络传输数据加密,这是涉及到网络协议,与服务器之间的加密协议。
本地加密方式有很多种: 一、MD5加密算法。 MD5是个不可逆的算法 没有解密的算法(目前据说也有方法破解)。 二、DES加密。可逆。 三、RSA加密。可逆 对于不是需要绝对足够安全的项目,以上三种加密足够用。
网络数据加密主要从两个方面考虑: 1. 保证API的调用者是经过自己授权的App; 2. 保证数据传输的安全。
保证API是自己授权的App,采用设计签名的方式。对每个移动平台,都会有不同的AppKey和AppSecret。在调用API时,将AppKey加入到请求参数中,然后,把AppSecret与其它参数,通过某种签名算法生成一个签名字符串,把数据传输给服务器端。而服务器根据AppKey和AppSecret,用相同的签名算法生成的签名与之一致,则说明请求安全。签名算法可以采用自己规定的一套签名算法(更安全),也可采用外部公开的签名算法(初期使用)。另外,在参数列表中再加入一个时间戳,还可以防止部分重放攻击。 对于数据传输安全,可以使用HTTPS。因为HTTPS添加了ssl安全协议。但是android项目开发,大部分都没有去实现。主要是没有对ssl证书进行安全性检查。
API协议标准化 项目开发,协议一定需要标准化,并且需要严格执行接口协议。完成每个版本的协议文档更新,方便后续使用者查看。 目前协议都是使用Json格式传输。需要注意的是,JSON数据和实体对象在传输时,序列化和反序列化因平台不同,会产生不同的区别。比如:JSON库将Date类型的数据序列化时会转为String,传输到服务器时,服务器反序列化经常会出现不同的结果。
API接口版本控制 一般解决接口更新变化问题,我们采取的做法是,每个API接口,都会带有协议的版本,若是协议发生改变,则版本号相应改变,在处理数据请求时,则可以根据不同协议的版本进行处理,解决了版本的兼容性问题。
架构分层 架构设计,主要的目的就解决功能和代码的复用,减少重复开发,方便功能扩展,降低功能和代码层级的耦合。 目前移动设计框架,主流的有三种:MVC、MVP、MVVM三种方式(具体详情,请参考框架小结)。 任何的框架设计都是在满足开发需求为前提,千万不能为了设计而设计,不要问我这三种设计,哪种最合适开发?如果你还这样去问,那只能说你还不是一个成熟的产品设计者。三种框架都有各自的利弊,是应该在不同的阶段和不同人员的配备情况下,选择更合理的方式。我曾经参与一个创业团队开发视频项目,前期只有两个移动开发人员,项目时间紧的情况下。项目负责人就只会天天在那里修改需求,谈项目架构。初期的项目,在产品验证功能阶段,在项目需要快速迭代阶段,应该使用最有效的框架,才是合理的选择。而且项目的发展,一定是随着项目功能的确立,产品的定型和需求完善,对项目本身的稳定性和性能的要求,才是一个逐步提高的过程。想要一步达到完美的产品,不仅是在设计上很难做到,而且在目前所有的产品中,都是很难达到的。
任何框架都是在此三层数据模型上。View,Model,Controller/Presenter/ViewModel。上层View:用户行为操作,数据结果显示。底层Model:数据处理,提供显示数据。中间的就是业务逻辑层。 Android项目设计,重在对项目的理解,重在对需求功能的划分,重在对团队合理分配。高效的产出,快速的迭代,才是移动项目的生存之道。
Android测试 移动开发,为保证质量产出,需要进行必须要逻辑测试。而在项目框架设计中,简单的mvc模式,若view和model中混有业务逻辑,则不利于接口测试。所以,在后续版本的迭代中,需要逐渐使用mvp或mvvm框架设计,让view和model与业务逻辑实现完整的解耦合。
Android环境 自从Android提供了更高效稳定的android studio之后,对于开发者来说是更便捷,更方便了。在android gradle多平台打包。proguard代码优化,混淆。随着android studio的越来越强大,越来越稳定,相信开发android项目也会变得越来越so easy了。
总结在最后 一个合格的移动项目架构师,必须是在不断的项目开发中成长的。不仅仅懂得项目的高效快速部署,也懂得怎样合理优化团队,才能有更优质的产品产出。移动产品,是一个快速产出的产品,怎样做出适合团队产出的产品,才是移动架构师的学习之道。
android移动高级开发,请加入群交流:247039470
转载,请说明出处!谢谢!
1、什么是构建
你一定知道“构建(construction)”一次在软件开发领域以外的含义。“构建”就是“建筑工人(construction workers)”在建设一栋房屋,一所学校,乃至一座摩天大楼时所做的工作。在你年轻时,可能也曾用“硬纸板(construction paper)”构建过什么东西吧。按照一般的用法,“构建”是指建设的过程。构建过程可能包含有计划、设计、检查工作的一些方面,但在多数时候,“构建”就是指创建失误过程中动手的那些部分。
2、什么是软件构建
开发计算机软件是一个复杂的过程。在过去的25年间,研究者已经认识到在软件开发过程中的各种不同的活动:
--定义问题(problem definition)
--需求分析(requirements development)
--规划构建(construction planning)
--软件架构(software architecture)
--高层设计(high-level design)
--详细设计(detailed design)
--编码与调试(coding and debugging)
--单元测试(unit testing)
--集成测试(integration testing)
--集成(integration)
--系统测试(system testing)
如果你曾经做的都是一些不太正式的项目的话,可能上面的整个过程有很多被你省略啦。但是如果你做的是一个非常正式的项目的话,其实你会发现上面的整个流程都是需要我们完整的进行的。
如果你是自学编程或者主要做一些不正规的项目的话,你可能都无法再软件开发过程中分辨出这么多的活动。在你的心里,这些活动都可能被归结为“编程(programming)”了。当你在不太正规的项目时,你考虑创建软件的问题时所想到的主要活动,很可能就是研究者们称之为“构建”的活动。
这个知觉上对“构建”的认知是相当准确的,但它缺乏一定深度。把构建活动放在由其他活动构成的环境中讨论,有助于在“构建”期间集中注意正确的任务,也有助于恰当强调那些重要的“非构建活动(nonconstructiong activity)”。
构建活动主要是编码和调试,但也涉及详细设计、规划构建、单元测试、集成测试、集成等其他活动。
古语构建活动的高层次视图,这里勒出一些构建活动中的具体任务(task):
--验证有关的基础工作已经完成,因此构建活动可以顺利地进行下去
--确定如何测试所写的代码
--设计并编写类和子程序
--创建并命名变量和具名变量
--选择控制结构,组织语句块
--对你的代码进行单元测试和集成测试,并排除其中的错误
--评审开发团队中其他成员的底层设计和代码,并让他们来评审你的工作
--润饰代码,仔细进行代码的格式化和注释
--降单独开发的多个软件组件集成为一体
--代码调优
新建版本库的时候遇上了
The file will have its original line endings in your working directory LF will be replaced by CRLF in .... 这样的警告。
查了一下网上的说法,原因总的来说是不同平台源代码换行符不一致和是git工具core.autocrlf属性的设置造成问题。而看的抄来抄去的说法总是在文字上有类似的歧义以及我总感觉是有被省略掉没说的话,所以按我自己的理解的(如果没有理解错的话),用自己能懂的文字记录一下:
对于git的core.autocrlf属性
如果是在Windows系统上,默认的或自己设置为true的情况,Git可以在你提交时自动地把行结束符CRLF转换成LF(前提是因为你的代码是采用windows换行符,而提交到库的需要是LF。这样说是不排除你从别处拷贝的代码本身就是LF),而在检出代码时再把LF转换成CRLF(转换成windows标准):
git config --global core.autocrlf true Linux因为本身使用LF作为行结束符,因此如果库里代码本身为LF那你不需要Git在检出文件时进行自动的转换。但是如果在Linux上提交的文件为CRLF格式(原因同上为什么windows上会提交LF格式的文件)为了保证库里的代码始终为LF就需要把core.autocrlf设置成input来告诉Git在提交时把CRLF转换成LF,而检出时不转换(LF仍为LF)
git config --global core.autocrlf input 前面是建立在库里的代码必须保持LF格式 如果项目都是运行在Windows上的,可以设置false取消此功能。就是库和所有本地都是CRLF格式。
git config --global core.autocrlf false 但是如果在windows平台提交到库的文件时LF也希望在windows平台上的代码也和库里的一样是LF的,也需要执行这个操作,取消转换,虽然命令一致但是原因不同(这样虽然在windows平台但是库和本地都是LF)。
MSVFMyU4MCU4MWh0dHAlM0ElMkYlMkZyaWRkbGUuYXJ0aHVybHVrLm5ldCUyRnN0YWdlb25lLnBocCUwRCUwQTIlRTMlODAlODFodHRwJTNBJTJGJTJGcmlkZGxlLmFydGh1cmx1ay5uZXQlMkZzbm93Zmxha2VzLnBocCUyMCUwRCUwQTMlRTMlODAlODFodHRwJTNBJTJGJTJGcmlkZGxlLmFydGh1cmx1ay5uZXQlMkZmcnVpdC5waHAlMEQlMEE0JUUzJTgwJTgxaHR0cCUzQSUyRiUyRnJpZGRsZS5hcnRodXJsdWsubmV0JTJGc3RyYXdiZXJyeS5waHAlMEQlMEE1JUUzJTgwJTgxaHR0cCUzQSUyRiUyRnJpZGRsZS5hcnRodXJsdWsubmV0JTJGY2xldmVyZXN0LnBocCUwRCUwQTYlRTMlODAlODFodHRwJTNBJTJGJTJGcmlkZGxlLmFydGh1cmx1ay5uZXQlMkZwb2NrZXQucGhwJTIwJUVGJUJDJTg4Ym1heCVFRiVCQyU4OSUwRCUwQTclRTMlODAlODFodHRwJTNBJTJGJTJGcmlkZGxlLmFydGh1cmx1ay5uZXQlMkZzbm93bWFuJTJGd2luZG93cy5waHAlMEQlMEE4JUUzJTgwJTgxaHR0cCUzQSUyRiUyRnJpZGRsZS5hcnRodXJsdWsubmV0JTJGc25vd21hbiUyRmxpbnV4LnBocCUwRCUwQTklRTMlODAlODFodHRwJTNBJTJGJTJGcmlkZGxlLmFydGh1cmx1ay5uZXQlMkZzbm93bWFuJTJGb2NlYW4ucGhwJTBEJTBBMTAlRTMlODAlODFodHRwJTNBJTJGJTJGcmlkZGxlLmFydGh1cmx1ay5uZXQlMkZzbm93bWFuJTJGZXJhc2VyLnBocCUyMCUyMCVFRiVCQyU4OGNvbnRpbnVlJUVGJUJDJTg5JTBEJTBBMTElRTMlODAlODFodHRwJTNBJTJGJTJGcmlkZGxlLmFydGh1cmx1ay5uZXQlMkZzZWFyY2glMkZ1bnNpbmthYmxlLnBocCUwRCUwQTEyJUUzJTgwJTgxaHR0cCUzQSUyRiUyRnJpZGRsZS5hcnRodXJsdWsubmV0JTJGc2VhcmNoJTJGMTkxMi5waHAlMjAlMjAlRUYlQkMlODgxODc0JUVGJUJDJTg5JTBEJTBBMTMlRTMlODAlODFodHRwJTNBJTJGJTJGcmlkZGxlLmFydGh1cmx1ay5uZXQlMkZzZWFyY2glMkZjYXJvbC5waHAlMjAlMEQlMEExNCVFMyU4MCU4MWh0dHAlM0ElMkYlMkZyaWRkbGUuYXJ0aHVybHVrLm5ldCUyRnNlYXJjaCUyRndpbmdkaW5ncy5waHAlMEQlMEExNSVFMyU4MCU4MWh0dHAlM0ElMkYlMkZyaWRkbGUuYXJ0aHVybHVrLm5ldCUyRnNlYXJjaCUyRjUzNDIwMi5waHAlMEQlMEExNiVFMyU4MCU4MWh0dHAlM0ElMkYlMkZyaWRkbGUuYXJ0aHVybHVrLm5ldCUyRnNlYXJjaCUyRjEzOTQyLnBocCUyMCUyMCVFRiVCQyU4ODQzMTQwNjI0JUVGJUJDJTg5JTBEJTBBMTclRTMlODAlODFodHRwJTNBJTJGJTJGcmlkZGxlLmFydGh1cmx1ay5uZXQlMkZzZWFyY2glMkZydW5uaW5nLnBocCUyMCUyMCVFRiVCQyU4OHNwYWNlJUVGJUJDJTg5JTBEJTBBMTglRTMlODAlODFodHRwJTNBJTJGJTJGcmlkZGxlLmFydGh1cmx1ay5uZXQlMkZzZWFyY2glMkZleGN1c2UucGhwJTIwJTIwJUVGJUJDJTg4NzEzNTIlRUYlQkMlODklRTglODclQUElRTclODQlQjYlRTYlOEMlODclRTYlOTUlQjAlMEQlMEExOSVFMyU4MCU4MWh0dHAlM0ElMkYlMkZyaWRkbGUuYXJ0aHVybHVrLm5ldCUyRm51bWJlciUyRm1vcnNlLnBocCUyMCUyMCVFRiVCQyU4OGNyZWF0ZSVFRiVCQyU4OSUwRCUwQTIwJUUzJTgwJTgxaHR0cCUzQSUyRiUyRnJpZGRsZS5hcnRodXJsdWsubmV0JTJGbnVtYmVyJTJGY29weWNhdC5waHAlMDklRUYlQkMlODhzdXBwbHklRUYlQkMlODklRTYlOEYlOTAlRTclQTQlQkElRTglQkYlOTglRTYlOUMlODklRTclODIlQjklRTYlODQlOEYlRTYlODAlOUQlMEQlMEEyMSVFMyU4MCU4MWh0dHAlM0ElMkYlMkZyaWRkbGUuYXJ0aHVybHVrLm5ldCUyRm51bWJlciUyRmJhdHRlcnkucGhwJTIwJTIwJTBEJTBBMjIlRTMlODAlODFodHRwJTNBJTJGJTJGcmlkZGxlLmFydGh1cmx1ay5uZXQlMkZudW1iZXIlMkZiYXR0ZXJpZXMucGhwJTBEJTBBMjMlRTMlODAlODFodHRwJTNBJTJGJTJGcmlkZGxlLmFydGh1cmx1ay5uZXQlMkZudW1iZXIlMkZydW5lc2NhcGUucGhwJTA5JUVGJUJDJTg4aXNsYW5kJUVGJUJDJTg5JTBEJTBBMjQlRTMlODAlODFodHRwJTNBJTJGJTJGcmlkZGxlLmFydGh1cmx1ay5uZXQlMkZudW1iZXIlMkZoZWFydGJyZWFrLnBocCUwOSVFRiVCQyU4OGVpZ2h0ZWVuJUVGJUJDJTg5JUU3JUJBJUEyJUU1JUJGJTgzJUU1JUE0JUE3JUU2JTg4JTk4JTBEJTBBMjUlRTMlODAlODFodHRwJTNBJTJGJTJGcmlkZGxlLmFydGh1cmx1ay5uZXQlMkZudW1iZXIlMkZwYXNjYWwucGhwJTA5JUVGJUJDJTg4NDQyNCVFRiVCQyU4OSUwRCUwQTI2JUUzJTgwJTgxaHR0cCUzQSUyRiUyRnJpZGRsZS5hcnRodXJsdWsubmV0JTJGZmxhc2glMkZ0dXRvcmlhbC5waHAlMjAlMjAlRUYlQkMlODhjaGFtcGlvbiVFRiVCQyU4OSVFNiU4QSU4QWZsYXNoJUU0JUI4JThCJUU4JUJEJUJEJUU0JUI4JThCJUU2JTlEJUE1JUU1JTkwJThFJUU3JTk0JUE4JUU3JUExJTk1JUU1JUFFJUEyJUU3JUIyJUJFJUU3JTgxJUI1JUU3JTlDJThCdGV4dCVFMyU4MCU4MiVFNiU5QiVCNCVFNyVCQiU5RCVFNSVBNiU5OSVFNyU5QSU4NCVFNSU4QSU5RSVFNiVCMyU5NSVFNyU5QiVCNCVFNiU4RSVBNSVFNSU4RiVCMyVFOSU5NCVBRSVFNyVCRCU5MSVFOSVBMSVCNSVFNCVCOCU4QSVFNyU5QSU4NGZsYXNoLCVFOSU4MCU4OSVFNiU4QiVBOSVFNiU4OSU5MyVFNSU4RCVCMCVFNSU4RCVCMyVFNSU4RiVBRiVFOCVBNyU4MSVFMyU4MCU4MiUwRCUwQTI3JUUzJTgwJTgxaHR0cCUzQSUyRiUyRnJpZGRsZS5hcnRodXJsdWsubmV0JTJGZmxhc2glMkZzdGlsbGZsYXNoLnBocCUwOSVFRiVCQyU4OGF0dGljJUVGJUJDJTg5JTBEJTBBMjglRTMlODAlODFodHRwJTNBJTJGJTJGcmlkZGxlLmFydGh1cmx1ay5uZXQlMkZiYWxsZ2FtZXMlMkZzbm9va2VyLnBocCUwOSVFNSVCOSVCNiVFNCVCOCU4RCVFNiU5OCVBRiVFOCVBRSVBOSVFNCVCRCVBMCVFNiU4QSU4QSVFNSU4OCU4NiVFNSU4QSVBMCVFOCVCNSVCNyVFNiU5RCVBNSUwRCUwQTI5JUUzJTgwJTgxaHR0cCUzQSUyRiUyRnJpZGRsZS5hcnRodXJsdWsubmV0JTJGYmFsbGdhbWVzJTJGYWNjZWRlLnBocCUwRCUwQTMwJUUzJTgwJTgxaHR0cCUzQSUyRiUyRnJpZGRsZS5hcnRodXJsdWsubmV0JTJGYmFsbGdhbWVzJTJGYmlyZGllLnBocCUwRCUwQTMxJUUzJTgwJTgxaHR0cCUzQSUyRiUyRnJpZGRsZS5hcnRodXJsdWsubmV0JTJGbW9vbiUyRmFybXN0cm9uZy5waHAlMjAlMjAlRTYlOUMlODklRTclODIlQjklRTglOEElQjElRTYlOTclQjYlRTklOTclQjQlRUYlQkMlOEMlRTYlOEElOEElRTUlOUIlQkUlRTclODklODclRTQlQjglOEIlRTglQkQlQkQlRTQlQjglOEIlRTYlOUQlQTUlRUYlQkMlOEMlRTYlQTAlQjklRTYlOEQlQUUlRTYlOEYlOTAlRTQlQkUlOUIlRTclOUElODQlRTUlOUQlOTAlRTYlQTAlODclRTYlOEElOEElRTUlQUQlOTclRTYlQUYlOEQlRTQlQkUlOUQlRTYlQUMlQTElRTYlODklQkUlRTUlODclQkElRTYlOUQlQTUlRTMlODAlODIlMEQlMEEzMiVFMyU4MCU4MWh0dHAlM0ElMkYlMkZyaWRkbGUuYXJ0aHVybHVrLm5ldCUyRm1vb24lMkZob3Jvc2NvcGUucGhwJTIwJUVGJUJDJTg4ZG9yYWVtb24lRUYlQkMlODklMEQlMEEzMyVFMyU4MCU4MWh0dHAlM0ElMkYlMkZyaWRkbGUuYXJ0aHVybHVrLm5ldCUyRmNoZWNrZWQlMkZub3JtYWwucGhwJTA5JUVGJUJDJTg4NjkzNjg1NDk0NjUwMjE0NjgwMDglRUYlQkMlODklRTclOTQlQTglRTUlQjElOEYlRTUlQjklOTUlRTYlODglQUElRTUlOUIlQkUlRTUlQjclQTUlRTUlODUlQjclRTQlQjklOUYlRTQlQjglOEQlRTklOTQlOTklRTUlOTMlQTYlMEQlMEEzNCVFMyU4MCU4MWh0dHAlM0ElMkYlMkZyaWRkbGUuYXJ0aHVybHVrLm5ldCUyRmNoZWNrZWQlMkZhZHZhbmNlZHNlYXJjaC5waHAlMDklMEQlMEEzNSVFMyU4MCU4MWh0dHAlM0ElMkYlMkZyaWRkbGUuYXJ0aHVybHVrLm5ldCUyRmNoZWNrZWQlMkZib3dvZmRlc3RpbnkucGhwJTA5JUVGJUJDJTg4YmVldGhvdmVuJUVGJUJDJTg5JTBEJTBBMzYlRTMlODAlODFodHRwJTNBJTJGJTJGcmlkZGxlLmFydGh1cmx1ay5uZXQlMkZjaGVja2VkJTJGaG9nd2FydHMucGhwJTA5JTBEJTBBJTA5JTdCJUU2JTlDJTg5JUU2JThGJTkwJUU3JUE0JUJBJUVGJUJDJTlBJUU2JTlDJTg5JTIwaG9nd2FydHNvbmUlMjAlRTUlOEQlQjMlRTYlOTglQUYlRTYlOUMlODkuLi4lRTMlODAlODIlRTQlQkQlODYlRTYlOTglQUYlRTQlQjglOEQlRTYlOTglQUYlRTYlOEElOEElRTUlOUIlQkUlRTclODklODclRTclOUElODQlRTUlOUMlQjAlRTUlOUQlODAlRTYlOTQlQjklRTYlODglOTBob2d3YXJ0c3R3byVFRiVCQyU4QyVFNiU4RiU5MCVFNyVBNCVCQSVFNCVCOCU4RCVFNiU5OCVBRiVFNSU5QyVBOCVFOCVCRiU5OSVFNCVCOCU4MCVFOCVCRSVCOSVFRiVCQyU4QyVFNiU4OSU4MCVFNCVCQiVBNTElRTclOUElODQlRTUlOEYlQTYlRTUlQTQlOTYlRTQlQjglODAlRTglQkUlQjklRTYlOTglQUYwJUVGJUJDJThDaG9nd2FydHN6ZXJvJUUzJTgwJTgyJUU1JUJFJTk3JUU1JTg4JUIwJUU0JUI4JTgwJUU0JUI4JUFBJUU1JUE0JUE3JUU2JThGJTkwJUU3JUE0JUJBdGhyZWUlMjBicm9vbXN0aWNrcyVFRiVCQyU4OCVFNSU5MyU4OCVFNSU4OCVBOSVFNiVCMyVBMiVFNyU4OSVCOSVFOSU4NyU4QyVFOSU5RCVBMiVFNyU5QSU4NCVFNCVCOCU4MCVFOSU5NyVCNCVFOSVBNCU5MCVFNSU4RSU4NSVFRiVCQyU4OSVFRiVCQyU4QyVFNiU4OSVCRSVFNSU4OCVCMCVFOCU4RiU5QyVFNSU4RCU5NSVFRiVCQyU4QyVFOSU4NyU4QyVFOSU5RCVBMiVFNiU5QyU4OSVFNCVCOCU4MCVFNCVCOCVBQWdpbGx5JTIwd2F0ZXIlRUYlQkMlOEMlRTUlQjAlQjElRTYlOTglQUYlRTUlQUYlODYlRTclQTAlODElRUYlQkMlODglRTUlOUMlQThHb29nbGUlRTQlQjglOEQlRTUlQTQlQUElRTklODAlOUElRTclOUElODQlRTYlODMlODUlRTUlODYlQjUlRTQlQjglOEIlRTUlQkUlODglRTklOUElQkUlRTYlODklQkUlRUYlQkMlOEMlRTklOTMlQkUlRTYlOEUlQTUlRTYlOTglQUYlRTQlQjglODAlRTQlQjglQUElRTUlOEYlODIlRTglODAlODMlRUYlQkMlOEMlRTglOEIlQTUlRTYlOTglQUYlRTYlQjIlQTElRTclOUMlOEIlRTUlODglQUIlRTQlQkElQkElRTclOUElODQlRTglQTclQTMlRTclQUQlOTQlRTQlQkMlQjAlRTglQUUlQTElRTQlQjklOUYlRTklOUElQkUlRTYlODklQkUlRTUlODglQjAlRTQlQkElODYlRUYlQkMlODklRTMlODAlODIlN0QlMEQlMEEzNyVFMyU4MCU4MWh0dHAlM0ElMkYlMkZyaWRkbGUuYXJ0aHVybHVrLm5ldCUyRmNoZWNrZWQlMkZnaWxseXdhdGVyLnBocCUwOSVFRiVCQyU4OGJvcnNjaCVFRiVCQyU4OSUwRCUwQTM4JUUzJTgwJTgxaHR0cCUzQSUyRiUyRnJpZGRsZS5hcnRodXJsdWsubmV0JTJGZXhwcmVzcyUyRmxvdmUucGhwJTIwJTIwJTIwJUU4JUJGJTk5JUU1JTg1JUIzJUU1JUFFJUI5JUU2JTk4JTkzJUU4JUEyJUFCJUU2JUJBJTkwJUU0JUJCJUEzJUU3JUEwJTgxJUU5JTg3JThDJUU3JTlBJTg0JUU3JUFFJTk3JUU2JUIzJTk1JUU4JUFGJUFGJUU1JUFGJUJDJUVGJUJDJThDJUU1JTg1JUI2JUU1JUFFJTlFJUU2JUFGJUFCJUU2JTk3JUEwJUU1JTg1JUIzJUU3JUIzJUJCJUVGJUJDJThDJUU5JTlDJTgwJUU4JUE2JTgxJUU3JTlDJThCJUU1JTg4JUIwSlBHJUU2JThGJTkwJUU3JUE0JUJBJUVGJUJDJThDJUU3JTg0JUI2JUU1JTkwJThFJUU2JTkxJUE5JUU2JTk2JUFGJUU1JUFGJTg2JUU3JUEwJTgxJUUzJTgwJTgyJTBEJTBBMzklRTMlODAlODFodHRwJTNBJTJGJTJGcmlkZGxlLmFydGh1cmx1ay5uZXQlMkZleHByZXNzJTJGMjQuNS5waHAlMDlHb29nbGUlRTUlOUQlOTAlRTYlQTAlODclRUYlQkMlOEMlRUYlQkMlOEMlRUYlQkMlOEMlRTQlQkQlODYlRTYlOTglQUYlRTglQkYlOTklRTYlQUMlQTElRTYlODglOTElRTclOTQlQTglRTclOUElODQlRTYlOTglQUZiaW5nLmNuJTBEJTBBNDAlRTMlODAlODFodHRwJTNBJTJGJTJGcmlkZGxlLmFydGh1cmx1ay5uZXQlMkZleHByZXNzJTJGdGFpcGVpLnBocCUyMCUyMCVFNSU4NSU4MyVFOSU5RiVCMyVFNSVBRCU5NyVFNiVBRiU4RCVFNiU5RSU4NCVFNiU4OCU5MCVFNyU5QSU4NCVFMiU4MCU5QyVFNSVBRCU5NyVFNiVBRiU4RCVFNSU5QiVCRSVFMiU4MCU5RCVFMyU4MCU4MiVFNSU4RiVBRiVFNCVCQiVBNSVFNSU4OCVBOSVFNyU5NCVBOG5vdGVwYWQrKyVFNiU4QSU4QUFFSU9VJUU2JTlCJUJGJUU2JThEJUEyJUU2JTg4JTkwOCVFRiVCQyU4QyVFNyU4NCVCNiVFNSU5MCU4RSVFNSVBRiVCOTglRTYlQTAlODclRTglQUUlQjAlRUYlQkMlOEMlRTclQUQlOTQlRTYlQTElODglRTUlOEQlQjMlRTglQTclODElRTMlODAlODIlMEQlMEE0MSVFMyU4MCU4MWh0dHAlM0ElMkYlMkZyaWRkbGUuYXJ0aHVybHVrLm5ldCUyRmV4cHJlc3MlMkZleHRyYS5waHAlMDklRTUlQUUlOEMlRTUlODUlQTglRTYlQTAlQjklRTYlOEQlQUUlRTklOTQlQUUlRTclOUIlOTglRTYlOUQlQTUlRTclQTclQkIlRTQlQkQlOEQlRUYlQkMlOEMlRTQlQjglOEQlRTglQTYlODElRTUlOEYlOTclRTUlQUQlOTclRTYlQUYlOEQlRTklQTElQkElRTUlQkElOEYlRTclOUElODQlRTUlQjklQjIlRTYlODklQjAlRTMlODAlODIlMEQlMEE0MiVFMyU4MCU4MWh0dHAlM0ElMkYlMkZyaWRkbGUuYXJ0aHVybHVrLm5ldCUyRmV4cHJlc3MlMkZob3VyLnBocCUwOSVFRiVCQyU4OGJsYWNrc21pdGglRUYlQkMlODklMEQlMEE0MyVFMyU4MCU4MWh0dHAlM0ElMkYlMkZyaWRkbGUuYXJ0aHVybHVrLm5ldCUyRmZhY3RvcnklMkZtaXgucGhwJTA5JTA5JUVGJUJDJTg4bW9jaGElRUYlQkMlODklMEQlMEE0NCVFMyU4MCU4MWh0dHAlM0ElMkYlMkZyaWRkbGUuYXJ0aHVybHVrLm5ldCUyRmJpb2xvZ3ljaXR5JTJGcGxhbnQucGhwJTA5JTA5JTA5JTA5JTA5JTIwJTIwJTIwJTdCJUU4JTk4JTkxJUU4JThGJTg3JUU2JTk4JUFGZnVuZ2klRUYlQkMlODglRTglOEYlOEMlRTclQjElQkIlRTQlQjglOEQlRTYlOTglQUYlRTYlQTQlOEQlRTclODklQTklRUYlQkMlODklRUYlQkMlOEMlRTYlQjAlQjQlRTYlQUYlOEQlRTYlOTglQUZpbnZlcnRlYnJhdGUlRUYlQkMlODglRTYlOTclQTAlRTglODQlOEElRTYlQTQlOEUlRTUlOEElQTglRTclODklQTklRUYlQkMlOEMlRTQlQjglOEQlRTYlOTglQUYlRTYlOUMlODklRTglODQlOEElRTYlQTQlOEUlRTUlOEElQTglRTclODklQTklRUYlQkMlODklRUYlQkMlOEMlRTglODAlODElRTklQjklQjAlRTYlOTglQUZob21vaW90aGVybSVFRiVCQyU4OCVFNiU4MSU5MiVFNiVCOCVBOSVFNSU4QSVBOCVFNyU4OSVBOSVFRiVCQyU4QyVFNCVCOCU4RCVFNiU5OCVBRiVFNSU4RiU5OCVFNiVCOCVBOSVFNSU4QSVBOCVFNyU4OSVBOSVFRiVCQyU4OSVFRiVCQyU4QyVFNCVCOSU4QiVFNSU5MCU4RSVFOSU5NCU5OSVFOCVBRiVBRiVFNiU5OCVBRiVFNSU5QyVBOCVFNSU5QiVCRSVFNyU4OSU4NyVFNiU5NiU4NyVFNCVCQiVCNiVFNSU5MCU4RCVFNSU5MiU4QyVFNSU5QiVCRSVFNyU4OSU4NyVFNSVBRiVCOSVFNCVCOCU4RCVFNCVCOCU4QSVFNCVCQSU4NiVFRiVCQyU4QyVFNyVBQyVBQyVFNCVCOCU4MCVFNCVCOCVBQSVFNiU5OCVBRiVFOCU4RCU4OWdyYXNzJUVGJUJDJTg4JUU0JUI4JThEJUU2JTk4JUFGdHJlZSVFRiVCQyU4OSVFRiVCQyU4QyVFNiU4OSU4MCVFNCVCQiVBNSVFNiU4QSU4QSVFNSU5QiVCRSVFNyU4OSU4NyVFNyU5QSU4NCVFNyVCRCU5MSVFNSU5RCU4MCVFNCVCQiU4RXRyZWUuanBnJUVGJUJDJThDJUU2JTk0JUI5JUU2JTg4JTkwZ3Jhc3MuanBnJUVGJUJDJThDJUU1JTg3JUJBJUU3JThFJUIwJUU0JUI4JTgwJUU1JThGJUFBJUU4JTlDJTk3JUU3JTg5JTlCc25haWwlRUYlQkMlOEMlRTQlQjklOEIlRTUlOTAlOEUlRTYlOTglQUYlRTklQjMlODQlRTklQjElQkNjcm9jb2RpbGUlRUYlQkMlOEMlRTclODYlOEElRTclOEMlQUJwYW5kYSVFRiVCQyU4QyVFNSU4NyVCQSVFNyU4RSVCMCVFNCVCOCU4MCVFNSVCQyVBMCVFNyVCQSVCOCVFNiU5RCVBMSU1QiVFOSU5MyVCRSVFNiU4RSVBNSU1RCVFMyU4MCU4MiVFNSU4RCU5NSVFOCVBRiU4RFRST0xMRVklRTQlQjglQURUUk9ZJUU2JTk4JUFGJUU2JUFGJTk0JUU4JUJFJTgzJUU1JUE0JUE3JUU3JTlBJTg0JUVGJUJDJThDJUU2JTg5JTgwJUU0JUJCJUE1JUU0JUI4JThCJUU0JUI4JTgwJUU5JUExJUI1JUU3JUJEJTkxJUU1JTlEJTgwJUU2JTk4JUFGdHJveS5waHAlRTMlODAlODIlRUYlQkMlODglRTglODMlQkQlRTYlODMlQjMlRTUlODglQjAlRTclOUElODQlRTclOUMlOUYlRTUlOEUlODklRTUlQUUlQjMlRUYlQkMlODklN0QlMEQlMEE0NSU3RTQ2JTIwJUU3JTk0JUIxJUU0JUJBJThFYmxvZyVFNiVCMyVBOCVFNSU4NiU4QyVFNiU5QyU4OSVFOSU5NyVBRSVFOSVBMiU5OCUyMCVFNyU5QyU4MSVFNyU5NSVBNSUwRCUwQTQ3JUUzJTgwJTgxaHR0cCUzQSUyRiUyRnJpZGRsZS5hcnRodXJsdWsubmV0JTJGZmFjdG9yeSUyRmZpeC5odG1sJTBEJTBBNDglRTMlODAlODFodHRwJTNBJTJGJTJGcmlkZGxlLmFydGh1cmx1ay5uZXQlMkZmYWN0b3J5JTJGY2hhcmxpZSUyRmNob2NvbGF0ZS5waHAlMjAlMjAlRUYlQkMlODhyb2FsZGRhaGwlRUYlQkMlODklRTYlOEYlOTAlRTclQTQlQkElRTUlQjAlQjElRTUlOUMlQTh1cmwlRTklODclOEMlMEQlMEE0OSVFMyU4MCU4MWh0dHAlM0ElMkYlMkZyaWRkbGUuYXJ0aHVybHVrLm5ldCUyRmhpZ2h3YXklMkZjYWxjdWxhdG9yLnBocCUyMCUyMCVFRiVCQyU4ODMxMDEyJUVGJUJDJTg5JUU3JUFFJTk3JUU0JUI4JThEJUU2JTlEJUE1JUU3JTlCJUI0JUU2JThFJUE1JUU2JTkwJTlDJUU3JTlBJTg0JUU3JUFEJTk0JUU2JUExJTg4JTBEJTBBNTAlRTMlODAlODFodHRwJTNBJTJGJTJGcmlkZGxlLmFydGh1cmx1ay5uZXQlMkZoaWdod2F5JTJGZmlmdHkucGhwJTIwJUU4JUJGJTk5JUU1JTg1JUIzJUU2JTlDJTg5NSVFNCVCOCVBQSVFNSVCMCU4RiVFNSU4NSVCMyVFRiVCQyU4OCVFNiU5MSVBOSVFNiU5NiVBRiVFNSVBRiU4NiVFNyVBMCU4MSVFRiVCQyU4Q0R2b3JhayVFOSU5NCVBRSVFNyU5QiU5OCVFNyVBNyVCQiVFNCVCRCU4RCVFNSVBRiU4NiVFNyVBMCU4MSVFRiVCQyU4Q3NpbHZlci0lM0VnbG9kLEdvb2dsZSVFNiU5MCU5QyVFNSU5QiVCRSVFRiVCQyU4QyVFNSU5QiVCRSVFNyU4OSU4NyVFNSVCNyVBNiVFNCVCOCU4QSVFOCVBNyU5MiVFOSU5QSU5MCVFOCU5NyU4RiVFNyU5QSU4NCVFNSVBRCU5NyVFNiVBRiU4RCVFRiVCQyU4OSUwRCUwQTUxJUUzJTgwJTgxaHR0cCUzQSUyRiUyRnJpZGRsZS5hcnRodXJsdWsubmV0JTJGaGlnaHdheSUyRnBhcmsucGhwJTA5JUU3JTk0JUE4JUU2JTk1JUIwJUU3JThCJUFDJUU1JTk5JUE4JUU4JUE3JUEzJUU1JTg3JUJBJUU2JTlEJUE1JUU2JTk4JUFGMTk0MiVFRiVCQyU4QyVFNiVCQSU5MCVFNCVCQiVBMyVFNyVBMCU4MSVFNiU4RiU5MCVFNyVBNCVCQXdhciVFMyU4MCU4MiVFNCVCQSU4QyVFNiU4OCU5OCVFRiVCQyU4QyVFNCVCRCU4NiVFNiU5OCVBRiVFOCU4NyVBQSVFNSVCNyVCMSVFNSVCQyU4MCVFNSVBNyU4QiVFNSVCQyU4MCVFNSVBNyU4QiVFNSU4NiU5OSVFNiU4OCU5MCVFNCVCQSU4Nndvcmxkd2FyMiVFMyU4MCU4MiVFMyU4MCU4MiVFMyU4MCU4Mm9yeiVFMyU4MCU4MiUwRCUwQTUyJUUzJTgwJTgxaHR0cCUzQSUyRiUyRnJpZGRsZS5hcnRodXJsdWsubmV0JTJGaGlnaHdheSUyRnNlY29uZHdvcmxkd2FyLnBocCUyMCUyMCUyMCVFRiVCQyU4ODE4NyVFRiVCQyU4OSVFNCVCRiU5RCVFOSVCRSU4NCVFNyU5MCU4MyVFNyVBRSU5NyVFNSU4OCU4NiVFRiVCQyU4QyVFNCVCOCU4RCVFNiU4NyU4MiVFMyU4MCU4MiUwRCUwQTUzJUUzJTgwJTgxaHR0cCUzQSUyRiUyRnJpZGRsZS5hcnRodXJsdWsubmV0JTJGc2FtdWVscmlkZGxlJTJGc2hhZG93LnBocCUyMCUyMCU3QnNoYWRvdy0lM0VyaWRkbGUtJTNFY2FuY2VyLCVFNyU4NCVCNiVFNSU5MCU4RSVFNyU5QyU4QiVFOCVBNyU4MSVFNSU5QiVCRSVFNyU4OSU4NyVFNSU4RiVCMyVFNCVCOCU4QiVFOCVBNyU5MiVFNyU5QSU4NGNhcnJvdCUyMCVFRiVCQyU4OCVFNiVCQSU5MCVFNCVCQiVBMyVFNyVBMCU4MW1zcGFpbnRfYS5wbmclMjAlRTUlQTYlODIlRTYlOUUlOUMlRTQlQjglODAlRTclOUIlQjRiLGMsZC4uLiVFNyU4QyU5QyVFNCVCOCU4QiVFNSU4RSVCQiVFNSVCMCVCMSVFNCVCQyU5QSVFOCVBMiVBQiVFOSVBQSU5NyVFNCVCQSU4NiVFMyU4MCU4MiVFRiVCQyU4OSVFRiVCQyU4QyVFNyU4NCVCNiVFNSU5MCU4RSVFNyU5NCVBOCVFNiU4RiU5MiVFNCVCQiVCNiVFNiU4OSVBQiVFNCVCQSU4QyVFNyVCQiVCNCVFNyVBMCU4MSVFNSVCMCVCMSVFOCVBMSU4QyU3RCUwRCUwQTU0JUUzJTgwJTgxaHR0cCUzQSUyRiUyRnJpZGRsZS5hcnRodXJsdWsubmV0JTJGc2FtdWVscmlkZGxlJTJGbXVmZmluLnBocCUyMCUyMCVFNSVBRiU4NiVFNyVBMCU4MSVFNSVCMCVCMSVFOSU5QSU5MCVFOCU5NyU4RiVFNSU5QyVBOCVFNSU5QiVCRSVFNyU4OSU4NyVFNSVCQSU5NSVFOSU4MyVBOCVFRiVCQyU4QyVFNyU5NCVCMSVFNCVCQSU4RSVFOCVBMSU4QyVFOSVBQiU5OCVFOCVBMiVBQiVFNiU4QyVBMSVFNCVCRCU4RiVFNCVCQSU4NiVFMyU4MCU4MiUwRCUwQTU1JUUzJTgwJTgxaHR0cCUzQSUyRiUyRnJpZGRsZS5hcnRodXJsdWsubmV0JTJGY2hlbV9pc190cnklMkZtdWZmaW4ucGhwJTIwJTIwJUU2JUEwJUI5JUU2JThEJUFFMSVFMyU4MCU4MTIlRTklQTIlOTglRTUlOUIlQkUlRTclODklODclRTglOEIlQjElRTYlOTYlODclRTclOUElODQlRTklQTYlOTYlRTUlQUQlOTclRTYlQUYlOEQlRTglQkYlOUUlRTYlODglOTAlRTUlOEQlOTUlRTglQUYlOEQlRUYlQkMlOEMzJUU5JUEyJTk4JUU2JUEwJUI5JUU2JThEJUFFJUU2JUJBJTkwJUU2JTk2JTg3JUU0JUJCJUI2dGl0bGUlRTUlQTQlQTclRTUlODYlOTklRTUlQUQlOTclRTYlQUYlOEQlRTYlOEYlOTAlRTclQTQlQkElRTYlOEElOEElRTUlOTAlOEUlRTclQkMlODAlRTYlOTQlQjklRTYlODglOTB0eHQsJUU2JTlDJTgwJUU1JTkwJThFJUU2JTlGJUE1JUU3JTlDJThCZmxhc2glRTYlODglOTYlRTglODAlODUlRTIlODAlOUMlRTUlODUlODMlRTclQjQlQTAlRTQlQjklOEIlRTYlQUQlOEMlRTIlODAlOUQlRTUlQkUlOTclRTUlODglQjAlRTclQUQlOTQlRTYlQTElODglRTMlODAlODIlMEQlMEE1NiVFMyU4MCU4MWh0dHAlM0ElMkYlMkZyaWRkbGUuYXJ0aHVybHVrLm5ldCUyRmNoZW1faXNfdHJ5JTJGcnViaWRpdW0ucGhwJTIwJUU1JTg4JUE5JUU3JTk0JUE4JUU2JUIxJTg5JUU4JUFGJUJBJUU1JUExJTk0JUU4JUFFJUExJUU3JUFFJTk3JUU1JUI3JUE1JUU1JTg1JUI3JUUzJTgwJTgyJTBEJTBBNTclRTMlODAlODFodHRwJTNBJTJGJTJGcmlkZGxlLmFydGh1cmx1ay5uZXQlMkZlc2NhbGF0b3IlMkZjb3VudHJ5LnBocCUyMCUyMCVFOCU4NyVBQSVFNSVCNyVCMSVFNyU5NCVBOCVFNSVBRCU5NyVFNCVCRCU5MyVFNiU5RiVBNSVFOCVBRiVBMiVFNSVCNyVBNSVFNSU4NSVCNyVFRiVCQyU4QyVFNiU5RiVBNSVFNSU4NyVCQSVFNiU5RCVBNSVFNyU5QSU4NCVFNyVBRCU5NCVFNiVBMSU4OCVFNCVCOCU4RCVFNSVBNCU5RiVFNyVCMiVCRSVFNyVBMSVBRSVFMyU4MCU4MiUwRCUwQTU4JUUzJTgwJTgxaHR0cCUzQSUyRiUyRnJpZGRsZS5hcnRodXJsdWsubmV0JTJGZXNjYWxhdG9yJTJGc2Vnb2V1aS5waHAlMDklMEQlMEE1OSVFMyU4MCU4MWh0dHAlM0ElMkYlMkZyaWRkbGUuYXJ0aHVybHVrLm5ldCUyRnBva2VyJTJGY2hpbmVzZV9ob3Jvc2NvcGUucGhwJTIwJTIwJUU3JUJEJTk3JUU5JUE5JUFDJUU2JTk1JUIwJUU1JUFEJTk3MTk4OCwxOTYzLDE5OTcsMjAwNyVFRiVCQyU4QyVFNSU4NSVCMyVFOSU5NCVBRSVFNiU5OCVBRiVFOCVCRiU5OCVFNSVCRSU5NyVFNiVBMCVCOSVFNiU4RCVBRSVFOSU4MiVBMyVFNSVCOSVCNCVFNyU5NCU5RiVFOCU4MiU5NiVFNyU5QSU4NCVFOSVBNiU5NiVFNSVBRCU5NyVFNiVBRiU4RCVFOCVCRCVBQyVFNiU4RCVBMiVFNiU4OCU5MGRyb3AlMEQlMEE2MCVFMyU4MCU4MWh0dHAlM0ElMkYlMkZyaWRkbGUuYXJ0aHVybHVrLm5ldCUyRnBva2VyJTJGZHJvcC5waHAlMjAlMjBHb29nbGUlRTUlOUIlQkUlRTclODklODclMEQlMEE2MSVFMyU4MCU4MWh0dHAlM0ElMkYlMkZyaWRkbGUuYXJ0aHVybHVrLm5ldCUyRnBva2VyJTJGZ2VybWFueS5waHAlMjAlMjAlRTglQUUlQTElRTclQUUlOTclRTUlODclQkElRTYlOUQlQTUlRTglQkYlOTglRTglQTYlODElRTUlOEElQTAlRTQlQjglOEElRTYlQkElOTAlRTYlOTYlODclRTQlQkIlQjYlRTklODclOEMlRTclOUElODQxMjM0MjMzJUVGJUJDJThDJUU1JUJFJTk3JUU1JTg4JUIwJUU0JUI4JTgwJUU0JUI4JUIyJUU1JTg1JUIzJUU0JUJBJThFJUU1JUI4JThDJUU3JTg5JUI5JUU1JThCJTkyJUU3JTlBJTg0JUU2JTk1JUIwJUU1JUFEJTk3JUU0JUJGJUExJUU2JTgxJUFGJUUzJTgwJTgyJTBEJTBBNjIlRTMlODAlODFodHRwJTNBJTJGJTJGcmlkZGxlLmFydGh1cmx1ay5uZXQlMkZwb2tlciUyRmhpdGxlci5waHAlMjAlMjAlRTQlQjglODAlRTclOUMlOEIlRTUlQjAlQjElRTYlOTglQUZwaWFubyUyMDM2JUU5JUJCJTkxJUU5JTk0JUFFNTIlRTclOTklQkQlRTklOTQlQUUlMEQlMEE2MyVFMyU4MCU4MWh0dHAlM0ElMkYlMkZyaWRkbGUuYXJ0aHVybHVrLm5ldCUyRmdvbGRlbmdhdGVicmlkZ2UlMkZvYnN0YWNsZS5waHAlMjAlMjAlMjAlRTglQkYlOTklRTUlODUlQjMlRTglQjYlODUlRTYlOUMlODklRTYlODQlOEYlRTYlODAlOUQlRUYlQkMlOEMlRTUlODglQTAlRTklOTklQTRvYnN0YWNsZS5waHAlRTUlOTAlOEUlRTglQUUlQkYlRTklOTclQUUlRUYlQkMlOEMlRTUlOUMlQTglRTYlOUMlQUElRTglQjclQjMlRTglQkQlQUMlRTUlODglQjAlRTklQTYlOTYlRTklQTElQjUlRTQlQjklOEIlRTUlODklOEQlRTYlOEMlODklRTQlQjglOEJFU0MlRTUlODElOUMlRTYlQUQlQTIlRTUlOEElQTAlRTglQkQlQkQlRUYlQkMlOEMlRTclOUMlOEIlRTYlQkElOTAlRTQlQkIlQTMlRTclQTAlODElRTMlODAlODIlMEQlMEE2NCVFMyU4MCU4MWh0dHAlM0ElMkYlMkZyaWRkbGUuYXJ0aHVybHVrLm5ldCUyRmdvbGRlbmdhdGVicmlkZ2UlMkZmbGFzaGdhbWUucGhwJTIwJTIwJUU2JTlDJTg5JUU2JTk4JUFGZmxhc2glRTclOEUlQTklRTglQjclQjMlRTUlQjglQTclRTUlOTElOTclMEQlMEE2NSVFMyU4MCU4MWh0dHAlM0ElMkYlMkZyaWRkbGUuYXJ0aHVybHVrLm5ldCUyRmdvbGRlbmdhdGVicmlkZ2UlMkZsaW1ibGVzcy5waHAlMjAlMjAlMEQlMEE2NiVFMyU4MCU4MWh0dHAlM0ElMkYlMkZyaWRkbGUuYXJ0aHVybHVrLm5ldCUyRmdvbGRlbmdhdGVicmlkZ2UlMkZjYXB0dXJlLnBocCUyMCUyMCVFRiVCQyU4OGluZGlyZWN0c3BlZWNoJUVGJUJDJTg5JTIwJUU3JTlCJUI0JUU2JThFJUE1JUU1JUJDJTk1JUU4JUFGJUFELSUzRSVFOSU5NyVCNCVFNiU4RSVBNSVFNSVCQyU5NSVFOCVBRiVBRCUwRCUwQTY3JUUzJTgwJTgxaHR0cCUzQSUyRiUyRnJpZGRsZS5hcnRodXJsdWsubmV0JTJGZm9ydHJlc3MlMkZhdG1vc3BoZXJlLnBocCUyMCUyMCVFRiVCQyU4OGludGVybmV0c2VydmljZXByb3ZpZGVyJUVGJUJDJTg5JUU1JTg5JThEJUU3JUFCJUFGJUU2JTk0JUI5JUU4JUJFJTkzJUU1JTg1JUE1JUU2JUExJTg2JUU5JTk1JUJGJUU1JUJBJUE2JUU5JTk5JTkwJUU1JTg4JUI2JTBEJTBBNjglRTMlODAlODFodHRwJTNBJTJGJTJGcmlkZGxlLmFydGh1cmx1ay5uZXQlMkZmb3J0cmVzcyUyRnVtYnJlbGxhLnBocCUwOSVFNiVCMyVBOCVFNiU4NCU4RiVFNiVBMiVCNSVFOSVBQiU5OCVFNyU5QSU4NCVFNSU5MCU4RCVFNSVBRCU5NyVFOCVBNiU4MSVFNSU4NiU5OSVFNSU4NyU4NiVFNyVBMSVBRSUwRCUwQTY5JUUzJTgwJTgxaHR0cCUzQSUyRiUyRnJpZGRsZS5hcnRodXJsdWsubmV0JTJGZm9ydHJlc3MlMkZ2aW5jZW50dmFuZ29naC5waHAlMjAlMjAlRTUlODglOTclRTUlODclQkElRTUlODUlQjMlRTclQjMlQkIlRUYlQkMlOUFJK0MrUSUzRFdIQVQlMkYyMjIlRUYlQkMlOEMlRTYlQUYlOEYlRTQlQjglQUElRTUlQUQlOTclRTYlQUYlOEQlRTQlQjglOEQlRTUlOTAlOEMlRUYlQkMlOEMlRTUlOUIlOUIlRTQlQkQlOEQlRTYlOTUlQjAlRUYlQkMlOEMlRTglODQlOUElRTYlOUMlQUMlRTglQjclOTElRTUlODclQkElRTYlOUQlQTUzMTA4JUU1JUIwJUIxJUU3JUFDJUE2JUU1JTkwJTg4JTBEJTBBNzAlRTMlODAlODFodHRwJTNBJTJGJTJGcmlkZGxlLmFydGh1cmx1ay5uZXQlMkZmb3J0cmVzcyUyRjMxMDgucGhwJTIwJTIwJUU2JTk4JTlGJUU2JTlDJTlGJUU2JThGJTkwJUU3JUE0JUJBJUU2JTk5JTlBJUU0JUI4JUE0JUU1JUE0JUE5JTBEJTBBNzElRTMlODAlODFodHRwJTNBJTJGJTJGcmlkZGxlLmFydGh1cmx1ay5uZXQlMkZmb3J0cmVzcyUyRnRoZWRheWFmdGVydG9tb3Jyb3cucGhwJTIwJTIwNzEtNTAlM0QyMSUyMHBocC0lM0VodG0lMjAlRTQlQkIlOEUlRTglQkYlOTklRTUlQTAlODYlRTUlQUQlOTclRTclQUMlQTYlRTQlQjglQUQlRTYlODklQkUlRTUlODclQkF1cmwlRTYlOEYlOTAlRTclQTQlQkElRTclOUElODQlRTUlOUIlOUIlRTclQTclOEQlRTglQjQlQTclRTUlQjglODElRTclQUMlQTYlRTUlOEYlQjclRUYlQkMlOEMlRTUlODYlOEQlRTYlOEElOEElRTklQTYlOTYlRTUlQUQlOTclRTYlQUYlOEQlRTglQkYlOUUlRTglQjUlQjclRTYlOUQlQTUlRTMlODAlODIlMEQlMEElMDklN0IlRTYlQjMlQTglRTYlODQlOEYlRTQlQjglQTQlRTclODIlQjklRUYlQkMlOUExJUUzJTgwJTgxJUU3JTk0JUE4JUU4JTg0JTlBJUU2JTlDJUFDJUU4JUJGJTg3JUU2JUJCJUE0JUU3JUFDJUE2JUU1JThGJUI3JUU2JTk3JUI2JUVGJUJDJThDJUU0JUJDJTlBJUU2JThBJThBJUU3JUJFJThFJUU1JTg1JTgzJCVFNiVCQyU4RiVFNiU4RSU4OSVFMyU4MCU4MjIlRTMlODAlODFjbWQlRTklODclOEMlRTklOUQlQTIlRTUlQUQlOTclRTclQUMlQTYlRTYlOTglQkUlRTclQTQlQkElRTclQkMlOTYlRTclQTAlODElRTYlOUMlODklRTklOTclQUUlRTklQTIlOTglRUYlQkMlOEMlRTUlOEYlQUYlRTQlQkIlQTVlbmNvZGUoJ3V0Zi04JyklRTclODQlQjYlRTUlOTAlOEUlRTQlQkIlQTUlRTQlQkElOEMlRTglQkYlOUIlRTUlODglQjYlRTUlQkQlQTIlRTUlQkMlOEYlRTglQkUlOTMlRTUlODclQkElRTUlODglQjAlRTYlOTYlODclRTQlQkIlQjYlRTklODclOEMlRTUlOEUlQkIlRTclOUMlOEIlRTclQkIlOTMlRTYlOUUlOUMlN0QlMEQlMEE3MiVFMyU4MCU4MWh0dHAlM0ElMkYlMkZyaWRkbGUuYXJ0aHVybHVrLm5ldCUyRmZvcnRyZXNzJTJGYmVuZC5waHAlMjAlMjBzYWx0LSUzRXNvZGl1bWNobG9yaWRlJTIwJUU1JTlCJUEwJUU0JUI4JUJBNTUlRTUlODUlQjMlRTglQUYlQjQlRTglQTYlODElRTUlQUQlQTYlRTYlOUMlQUYlRTQlQjglODAlRTclODIlQjklMEQlMEE3MyVFMyU4MCU4MWh0dHAlM0ElMkYlMkZyaWRkbGUuYXJ0aHVybHVrLm5ldCUyRmZvcnRyZXNzJTJGc29kaXVtY2hsb3JpZGUucGhwJTIwJTIwJUU2JTlGJUE1JUU3JTk5JUJFJUU3JUE3JTkxJUU3JTg1JUE3JUU3JTlEJTgwJUU1JUExJUFCJUU1JUIwJUIxJUU4JUExJThDJUU0JUJBJTg2JTIwJTIwJUVGJUJDJTg4aGVhcnQlRUYlQkMlODklMEQlMEE3NCVFMyU4MCU4MWh0dHAlM0ElMkYlMkZyaWRkbGUuYXJ0aHVybHVrLm5ldCUyRm1hcmJsZSUyRm1hemUucGhwJTIwJTIwJUU2JUEwJUI5JUU2JThEJUFFKDUuMykucG5nJUU1JThGJUFGJUU0JUJCJUE1JUU3JThDJTlDJUU1JTg4JUIwJUU4JUJGJTk4JUU2JTlDJTg5JUU1JTg1JUI2JUU0JUJCJTk2JUU1JTlEJTkwJUU2JUEwJTg3JUU3JTlBJTg0UE5HLCVFNyU5NCVBOCVFOCVCRiU4NSVFOSU5QiVCNyVFNiU4OSVCOSVFOSU4NyU4RiVFNCVCOCU4QiVFOCVCRCVCRCVFNSVCRSU5NyVFNSU4OCVCMCgxLjEpJTdFKDUuNSklRTclODQlQjYlRTUlOTAlOEUlRTYlOEElOEElRTclQTIlOEUlRTclODklODclRTYlOEIlQkMlRTglQjUlQjclRTYlOUQlQTUlRUYlQkMlOEMlRTYlODklQkUlRTUlODglQjAlRTglQkYlQjclRTUlQUUlQUIlRTglQjclQUYlRTclQkElQkYlRTQlQjglOEElRTclOUElODQlRTUlQUQlOTclRTYlQUYlOEQlRUYlQkMlOEMlRTYlOUMlODAlRTUlOTAlOEUlRTclOTQlQTh3b3JkZ2FtZWhlbHBlciVFOCVBNyVBMyVFNSU4NyVCQSVFNiU5RCVBNSVFMyU4MCU4MiUwRCUwQTc1JUUzJTgwJTgxaHR0cCUzQSUyRiUyRnJpZGRsZS5hcnRodXJsdWsubmV0JTJGbWFyYmxlJTJGYmFza2V0YmFsbC5waHAlMjAlMjBHb29nbGUlRTQlQjklOEIlRUYlQkMlODhqZXJyeS5waHAlRUYlQkMlODklM0IlMjAlRTYlOEYlOTAlRTclQTQlQkElRTYlOTglQUZIZXgsJUU2JThBJThBJUU1JTlCJUJFJUU3JTg5JTg3JUU5JTg3JThDJUU3JTlBJTg0aGV4JUU0JUJCJThFJUU1JUE0JUI0JUU2JThGJTkwJUU1JThGJTk2JUU0JUI4JTgwJUU2JUFFJUI1JUU1JTg3JUJBJUU2JTlEJUE1JUVGJUJDJThDJUU3JTk0JUE4bm90ZXBhZCsrJUU2JThGJTkyJUU0JUJCJUI2JUU4JUJEJUFDJUU2JTg4JTkwYXNjaWklRUYlQkMlODhjaGF0Lmh0bSVFRiVCQyU4OSUzQiUyMCVFNyVBQyVBQyVFNCVCOCU4OSVFNSU4NSVCMyVFNiU5MCU5RSVFNCVCOCU4RCVFNiU5RCVBNSVFRiVCQyU4OGNyb3Nzd29yZCVFRiVCQyU4OSUwRCUwQTc2JUUzJTgwJTgxaHR0cCUzQSUyRiUyRnJpZGRsZS5hcnRodXJsdWsubmV0JTJGbWFyYmxlJTJGZXhpZmZvcmhpbnRzLnBocCUyMCUyMCVFRiVCQyU4OGdhdGUlRUYlQkMlODklRTYlOEMlODclRTclOEUlQUYlRTclOEUlOEIlRTklODclOEMlRTklOUQlQTIlRTclOUElODQlRTQlQkElQkElRTclODklQTklRUYlQkMlOEMlRTUlOTAlOEQlRTUlQUQlOTclRTklQTYlOTYlRTUlQUQlOTclRTYlQUYlOEQlRTglQkYlOUUlRTglQjUlQjclRTYlOUQlQTUlRUYlQkMlOEMlRTMlODAlODIlRTMlODAlODIlRTUlOEYlQUYlRTYlODMlOUMlRTYlODglOTElRTYlQjIlQTElRTclOUMlOEIlRTglQkYlODclRTMlODAlODIlRTMlODAlODIlMEQlMEE3NyVFMyU4MCU4MWh0dHAlM0ElMkYlMkZyaWRkbGUuYXJ0aHVybHVrLm5ldCUyRnN3ZWF0ZXIlMkZlbmdsaXNoLnBocCUyMCUyMCVFRiVCQyU4OGlzb2xhdGlvbiVFRiVCQyU4OSVFOCVCRiU5OSVFNCVCOCVBQSVFNSVCQiVCQSVFNyVBRCU5MSVFNyU5QyU4QiVFOCVCNSVCNyVFNiU5RCVBNSVFNCVCOCU4RSVFNCVCOCU5NiVFOSU5QSU5NCVFNyVCQiU5RCVFNCVCQSU4NiVFMyU4MCU4MiVFMyU4MCU4MiVFOSVBMiU5OCVFNCVCOCVCQiVFOCVCRiU5OSVFNCVCOCVBQSVFNiU4MCU5RCVFOCVCNyVBRiVFNCVCOSU5RiVFNiU5OCVBRiVFOSU4NiU4OSVFNCVCQSU4NiVFMyU4MCU4MiUwRCUwQTc4JUUzJTgwJTgxaHR0cCUzQSUyRiUyRnJpZGRsZS5hcnRodXJsdWsubmV0JTJGc3dlYXRlciUyRmNvbG91ci5waHAlMjAlMjAlRUYlQkMlODhyb3lhbGJsdWUlRUYlQkMlODklMjAlRTYlOEYlOTAlRTclQTQlQkElRTUlODUlQjMlRTklOTQlQUUlRTYlOTglQUYlRTklQTIlOUMlRTglODklQjIlRUYlQkMlOEMlRTQlQjklOEIlRTUlODklOER0aXRsZSVFNiU5OCVBRiVFNyVCQSVBMiVFOCU4OSVCMiwlRTglQkYlOTklRTYlQUMlQTElRTYlOTglQUYlRTglOTMlOUQlRTglODklQjIlRUYlQkMlOEMlRTclODQlQjYlRTUlOTAlOEVHb29nbGUlMjAlRTUlODclQkElMjM0MTY5ZTElRTclOUElODQlRTglOEIlQjElRTYlOTYlODclMEQlMEE3OSVFMyU4MCU4MWh0dHAlM0ElMkYlMkZyaWRkbGUuYXJ0aHVybHVrLm5ldCUyRnN3ZWF0ZXIlMkZyb3lhbGJsdWUucGhwJTIwJTIwJUU4JUFGJUJCJUU5JTlGJUIzJUU2JUEwJTg3JUU3JTlGJUE1JUU5JTgxJTkzJUU2JTk4JUFGJUU2JTg5JUJFJUU1JUFGJUJDJUU2JUJDJTk0JUVGJUJDJThDR29vZ2xlJUU2JTkwJTlDJUU1JTlCJUJFJUU1JUJFJTk3JUU1JTg4JUIwJUU3JUEyJTlGJUU0JUI4JUFEJUU4JUIwJThEJUVGJUJDJThDJUU1JUFGJUJDJUU2JUJDJTk0JUU1JUIwJUIxJUU2JTk4JUFGJUVGJUJDJTlBJUU1JUI4JTgzJUU4JThFJUIxJUU2JTgxJUE5JUMyJUI3JUU1JUJFJUI3JUMyJUI3JUU1JUI4JTk1JUU1JUIwJTk0JUU3JThFJTlCJTBEJTBBODAlRTMlODAlODFodHRwJTNBJTJGJTJGcmlkZGxlLmFydGh1cmx1ay5uZXQlMkZzd2VhdGVyJTJGYnJpYW5kZXBhbG1hLnBocCUyMCUyMEdvb2dsZSVFNiU5MCU5QyVFNSU5QiVCRSVFNyU5RiVBNSVFOSU4MSU5MyVFNSU5RiU4RSVFNSVCOCU4MiVFNiU5OCVBRiVFNyVCQSVCRCVFNyVCQSVBNiVFRiVCQyU4QyVFNiU4RiU5MCVFNyVBNCVCQSVFNCVCOCU4MCVFNCVCOCVBQSVFNyVCQiU4NCVFNyVCQiU4NyVFRiVCQyU4QyVFNyVCQSVCRCVFNyVCQSVBNislRTUlODclQkElRTUlOTAlOEQlRTclOUElODQlRTclQkIlODQlRTclQkIlODclMjAlRTYlOTAlOUMlRTUlODclQkElRTYlOUQlQTUlRTUlQjAlQjElRTYlOTglQUYlRUYlQkMlOUElRTglODElOTQlRTUlOTAlODglRTUlOUIlQkQlMEQlMEE4MSVFMyU4MCU4MWh0dHAlM0ElMkYlMkZyaWRkbGUuYXJ0aHVybHVrLm5ldCUyRnN3ZWF0ZXIlMkZ1bml0ZWRuYXRpb25zLnBocCUyMCUyMEdvb2dsZSVFNiU5MCU5QyVFNSU5QiVCRSVFNCVCOCU4QiVFOSU5RCVBMiVFNyU5QSU4NCVFNCVCOCU4OSVFNCVCOCVBQSVFNSU5QiVCRSVFNiVBMCU4NyVFRiVCQyU4QyVFNyU5RiVBNSVFOSU4MSU5MyVFNiU5OCVBRiVFOCVCNyU5RiVFOSVBNiU5OSVFNiVCOCVBRiVFNSU4NCVCRiVFNyVBQiVBNSVFNSU4NiU5QiVFNiU5QyU4OSVFNSU4NSVCMyVFNyU5QSU4NCVFRiVCQyU4QyVFNSU4OSVBOSVFNCVCOCU4QiVFOSU4MiVBMyVFNCVCOCVBQSVFNSVCRSU4OCVFNSVBRSVCOSVFNiU5OCU5MyVFNiU5MCU5QyVFNSU4OCVCMCVFMyU4MCU4MiUwRCUwQTgyJUUzJTgwJTgxaHR0cCUzQSUyRiUyRnJpZGRsZS5hcnRodXJsdWsubmV0JTJGa2Vyb3JvJTJGZmxvcHB5LnBocCUyMCUyMCUyMCVFNiVCQSU5MCVFNiU5NiU4NyVFNCVCQiVCNiVFNiU4RiU5MCVFNyVBNCVCQWF0YmFzaCUyMCVFRiVCQyU4QyVFNiVBMCVCOSVFNiU4RCVBRW1sZ3ZrenclRTUlQkUlOTclRTUlODglQjBub3RlcGFkJUVGJUJDJThDJUU5JTgyJUEzJUU1JUIwJUIxJUU2JTgzJUIzJUU1JTg4JUIwdHh0JUUzJTgwJTgyJUU2JThBJThBJUU4JUJGJTk5JUU1JUJDJUEwJUU1JTlCJUJFJUU2JTk0JUI5JUU2JTg4JTkwdHh0LCVFNSVCRSU5NyVFNSU4OCVCMCVFNCVCOCU4QiVFNCVCOCU4MCVFNiVBRCVBNSVFOCVBRSVBOSVFNCVCRCVBMCVFNiU4QSU4QSVFMiU4MCU5QyVFOSU5NyU5QyVFNiU5NiVCQyVFOSU5QSVCMSVFOCU5NyU4RiVFOSU5NyU5QyVFNSU4RCVBMSVFMiU4MCU5RCUyMCVFOCVCRCVBQyVFNiU4RCVBMiVFNiU4OCU5MCVFOCU4QiVCMSVFNiU5NiU4NyVFRiVCQyU4Q0dvb2dsZSVFNyVCRiVCQiVFOCVBRiU5MSVFNSU5MCU4RSVFNiVBMCVCOSVFNiU4RCVBRSVFNSVBRCU5NyVFNiVBRiU4RCVFNiU5NSVCMCVFNCVCRiVBRSVFNiU5NCVCOSVFNCVCOCU4QiVFRiVCQyU5QWFib3V0JTIwdGhlJTIwaGlkZGVuJTIwc3RhZ2UlMEQlMEElRUYlQkMlOUIlRTglQkYlOTklRTUlQjAlOEYlRTUlODUlQjMlRTklOUElQkUlRTklQTMlOUUlRTUlQTQlQTklRTQlQkElODYlRUYlQkMlOEMlRTglODclQUElRTUlQjclQjElRTYlQTAlQjklRTYlOUMlQUMlRTYlODMlQjMlRTQlQjglOEQlRTUlODglQjAlRUYlQkMlOUElRTYlQUYlOEYlRTUlOEYlQTUlRTglQUYlOUQlMjAlRTUlQUQlOTclRTYlOTUlQjAlM0EyMCwxOCw5LDEsMTQsNywxMiw1JTNCJUU1JUFEJTk3JUU2JUFGJThEJUU2JTlCJUJGJUU0JUJCJUEzJUU1JUJFJTk3JUU1JTg4JUIwdHJpYW5nbGUlRTMlODAlODIlMEQlMEE4MyVFMyU4MCU4MWh0dHAlM0ElMkYlMkZyaWRkbGUuYXJ0aHVybHVrLm5ldCUyRmtlcm9ybyUyRnRyaWFuZ2xlLnBocCUyMCUyMCVFNiVBMCVCOSVFNiU4RCVBRXRhbi5qcGclRTUlOTIlOEMlRTYlOEYlOTAlRTclQTQlQkElRTQlQjglODklRTglQTclOTIlRUYlQkMlOEMlRTclOEMlOUMlRTUlODglQjBzaW4uanBnJUU1JTkyJThDY29zLmpwZywlRTUlQkUlOTclRTUlODglQjBsb3ZlJUU1JTkyJThDZmlyZSVFRiVCQyU4QyVFOCVCRiU5OSVFNCVCQSU4QyVFOCVCNCVBNyVFOSU4MyVCRCVFNiU5QyU4OSVFNCVCQyVBMCVFOCVBRiVCNCVFNCVCOCVBRCVFNyU5QSU4NCVFNCVCOCU4OSVFOCVBNiU4MSVFNyVCNCVBMCVFRiVCQyU4QyVFNiVBMCVCOSVFNiU4RCVBRSVFNSU5MCU4RCVFNSVBRCU5NyVFNSVCRSU5NyVFNSU4OCVCMHdlYmRpbmdzJUU1JUFEJTk3JUU0JUJEJTkzJUVGJUJDJThDJUU3JTg0JUI2JUU1JTkwJThFJUU2JThBJThBJUU2JTg5JTgwJUU2JTlDJTg5JUU2JTk1JUIwJUU1JUFEJTk3JUU1JTkyJThDJUU1JUFEJTk3JUU2JUFGJThEJUU1JTg2JTk5JUU4JUJGJTlCJUU4JUFFJUIwJUU0JUJBJThCJUU2JTlDJUFDJUVGJUJDJThDJUU2JTk0JUI5JUU1JThGJTk4JUU2JTg4JTkwd2ViZGluZ3MlRTUlQUQlOTclRTQlQkQlOTMlRTYlOUQlQTUlRTUlQUYlQjklRTclOUQlODAlRTYlODklQkUlRTMlODAlODIlMEQlMEE4NCVFMyU4MCU4MWh0dHAlM0ElMkYlMkZyaWRkbGUuYXJ0aHVybHVrLm5ldCUyRmtlcm9ybyUyRmhvbmVzdC5waHAlMjAlMjAxLiVFNiVBMCVCOSVFNiU4RCVBRWtlcm9ybyVFNiU4OSVCRSVFOCVBNyU5MiVFOCU4OSVCMiVFRiVCQyU4QyVFOCVCRiU5OSVFNiVBQyVBMUdvb2dsZSVFNiU5MCU5QyVFNSU5QiVCRSVFNiVCMiVBMSVFNiU4OSVCRSVFNSU4OCVCMCVFRiVCQyU4QyVFNSVBNSVCRCVFNSU5QyVBOCVFNiU5MCU5Q0tlcm9ybyVFNiU5NyVCNiVFNyU5OSVCRSVFNSVCQSVBNiVFNSU4RiVCMyVFNCVCRSVBNyVFNSU4OCU5NyVFNSU4NyVCQSVFNCVCQSU4Nktlcm9ybyVFNyU5QSU4NCVFOSU4NyU4RCVFOCVBNiU4MSVFOCVBNyU5MiVFOCU4OSVCMiVFMyU4MCU4MiVFMyU4MCU4MjIuJUU2JUEwJUI5JUU2JThEJUFFJUU1JTlCJUJFJUU3JTg5JTg3JUU1JTkwJThEJUU3JUE3JUIwJUU2JThGJTkwJUU3JUE0JUJBbW9hLCVFNiU4OSVCRSVFNSU4OCVCMCVFOCVBRiVBNSVFOCVBNyU5MiVFOCU4OSVCMiVFRiVCQyU4QyVFNyU4NCVCNiVFNSU5MCU4RSVFNSU5QyVBOCVFNCVCOCU4MCVFNCVCOCVBQSVFNCVCQiU4QiVFNyVCQiU4RCVFNSVBNSVCOSVFNyU5QSU4NCVFOCVCNCVCNCVFNSU5MCVBNyVFOSU4NyU4QyVFNyU5QyU4QiVFNSU4OCVCMCVFNiU5NCVCQiVFNSU4NyVCQiVFNSU4QSU5QiVFMyU4MCU4MiUwRCUwQTg1JUUzJTgwJTgxaHR0cCUzQSUyRiUyRnJpZGRsZS5hcnRodXJsdWsubmV0JTJGa2Vyb3JvJTJGMTAwMDAwMDAwMDAwMDAwLnBocCUyMCUyMCVFRiVCQyU4OGFjY2lkZW50JUVGJUJDJTg5JUU2JTkwJTlDJUU2JThGJTkwJUU0JUJFJTlCJUU3JTlBJTg0JUU2JTk1JUIwJUU1JUFEJTk3JUU3JTlGJUE1JUU5JTgxJTkzJUU4JUJGJTk5JUU2JTk4JUFGJUU1JTlDJUE4JUU1JUIwJThGJUU5JTk0JUFFJUU3JTlCJTk4JUU0JUI4JThBJUU1JTg2JTk5JUU1JUFEJTk3JUU2JUFGJThEJUU3JTlBJTg0JUU3JUFDJTk0JUU3JTk0JUJCJUU2JTlEJUE1JUU1JThBJUEwJUU1JUFGJTg2JUU4JUFGJUE1JUU1JUFEJTk3JUU2JUFGJThEJUUzJTgwJTgyJTBEJTBBODYlRTMlODAlODFodHRwJTNBJTJGJTJGcmlkZGxlLmFydGh1cmx1ay5uZXQlMkZyZWd1bGFyJTJGcmVjeWNsZS5waHAlMjAlMjAlRTYlQkElOTAlRTYlOTYlODclRTQlQkIlQjYlRTYlOEYlOTAlRTclQTQlQkElRTYlODklQkUlRTQlQkQlOUMlRTYlOUIlQjIlRTUlQUUlQjYlRUYlQkMlOEMlRTQlQjglOEIlRTglQkQlQkQlRTUlOTAlQUMlRTYlOUIlQjIlRTUlQUQlOTAlRTMlODAlODIlRTYlOTglQUZNb3phcnQlRTclOUElODQlRTYlOUIlQjIlRTUlQUQlOTAlRUYlQkMlOEMlRTUlOEYlQUYlRTQlQkIlQTUlRTglQkUlOTMlRTglQkYlOUIlRTUlOEUlQkIlRTUlOEQlQjQlRTglQUYlQjQlRTclQUQlOTQlRTYlQTElODglRTQlQjglOEQlRTUlQUYlQjklRUYlQkMlOEMlRTYlODklOTMlRTUlQkMlODAlRTklOTQlOTklRTglQUYlQUYlRTklQTElQjUlRTklOUQlQTIlRTclOUElODQlRTYlOUYlQTUlRTclOUMlOEIlRTYlQkElOTAlRTQlQkIlQTMlRTclQTAlODElRTYlODklOEQlRTglQTElOEMlRTMlODAlODIlRTMlODAlODIlRTYlOUMlODklRTYlODQlOEYlRTYlODAlOUQlRTUlQTUlQkQlRTYlODAlOUQlRTglQjclQUYlRUYlQkMlOEMlRTQlQkIlQTUlRTUlOTAlOEUlRTglQkYlOTklRTclQjElQkIlRTUlODUlODhDdHJsK0ElRTYlODklOEQlRTglQTElOEMlRTUlOTUlOEElRUYlQkMlOEMlRTQlQjglOEQlRTclODQlQjYlRTglQTYlODElRTglQTIlQUIlRTklQUElOTclRTYlODMlQTglRTMlODAlODIlMEQlMEE4NyVFMyU4MCU4MWh0dHAlM0ElMkYlMkZyaWRkbGUuYXJ0aHVybHVrLm5ldCUyRnJlZ3VsYXIlMkZwcm9ibGVtLnBocCUyMCUyMDEuJUU1JThGJTg4JUU2JTk4JUFGJUU2JUEwJUI5JUU2JThEJUFFJUU1JTlCJUJFJUU3JTg5JTg3JUU1JTkwJThEJUU2JThBJThBJUU1JTg3JUEwJUU1JUJDJUEwJUU1JTlCJUJFJUU1JUJDJTg0JUU1JTg3JUJBJUU2JTlEJUE1JUVGJUJDJThDJUU3JTg0JUI2JUU1JTkwJThFJUU2JUEwJUI5JUU2JThEJUFFJUU3JTg5JUE5JUU1JTkzJTgxJUU1JTkwJThEJUU3JUE3JUIwJUU5JUE2JTk2JUU1JUFEJTk3JUU2JUFGJThEJUU1JUJFJTk3aWRpb20lM0IlMjAyLiUyMCVFOCU4QiVCMSVFOCVBRiVBRCVFOCVCMCU5QSVFOCVBRiVBRCVFMyU4MCU4MiVFMyU4MCU4MiVFOCU4NyVBQSVFNSVCNyVCMSVFNiVCMiVBMSVFNiVCMyU5NSVFNiU5MCU5RSVFNSVBRSU5QSVFRiVCQyU4QyVFOCU4QiVCMSVFOCVBRiVBRCVFNiVCMCVCNCVFNSVCOSVCMyVFNiVCMiVBMSVFNSU4OCVCMCVFOCVCRiU5OSVFNiVBRCVBNSVFMyU4MCU4MiVFMyU4MCU4MiUwRCUwQTg4JUUzJTgwJTgxaHR0cCUzQSUyRiUyRnJpZGRsZS5hcnRodXJsdWsubmV0JTJGcmVndWxhciUyRnRoZWdyYXNzaXNhbHdheXNncmVlbmVyLnBocCUyMCUyMCVFNiU4RiU5MCVFNyVBNCVCQSVFOCVBRiVCNCVFNSU5QiVCRSVFNyU4OSU4NyVFNCVCOCU4QSVFNCVCOSVCMSVFNyU4MiVCOSVFNSU4RiVBRiVFNyU5NiU5MSVFNyU5QSU4NCVFNSU5QyVCMCVFNiU5NiVCOSVFMyU4MCU4MiVFMyU4MCU4MiVFNyU4MiVCOSVFNyVCQSVCOCVFNSU5QiVBMiVFMyU4MCU4MiVFNiVBMCVCOSVFNiU4RCVBRSVFNiU4RiU5MCVFNyVBNCVCQSVFNSU4OCVBNCVFNiU5NiVBRCVFNiU5NiVCMCVFNyU5QSU4NCVFOSVBNiU5NiVFOSVBMSVCNSVFNSU4RiVBRiVFOCU4MyVCRCVFNiU5OCVBRi5odG0lRTUlOTAlOEUlRTclQkMlODAlMEQlMEE4OSVFMyU4MCU4MWh0dHAlM0ElMkYlMkZyaWRkbGUuYXJ0aHVybHVrLm5ldCUyRmVpZ2h0eW5pbmUucGhwJTIwJTIwJUU4JTg3JUFBJUU1JUI3JUIxJUU1JUJEJTkzJUU2JTk3JUI2JUU2JUIyJUExJUU2JTgzJUIzJUU1JTg4JUIwJUU4JUJGJTk5JUU0JUI4JUIyJUU2JTk1JUIwJUU1JUFEJTk3JUU1JThGJTg4JUU2JTk4JUFGYXNjaWklRUYlQkMlOENHb29nbGUlRTQlQjglODAlRTQlQjglOEIlRTUlOUIlOUIlRTglQkUlQjklRTUlQkQlQTIlRTclQkIlQjQlRTYlODElQTklRTUlOUIlQkUlRUYlQkMlOEMlRTclODQlQjYlRTUlOTAlOEUlRTQlQkQlQTAlRTUlQkYlODUlRTklQTElQkIlRTglQTYlODElRTclOUYlQTUlRTklODElOTNraXRlJUU2JTk4JUFGJUU0JUI4JTgwJUU3JUE3JThEJUU3JUFEJTlEJUU1JUJEJUEyJUVGJUJDJThDJUU0JUI5JTlGJUU1JUIwJUIxJUU1JTlDJTg2JUU3JTlBJTg0JUU1JUE0JTk2JUU2JThFJUE1JUU1JTlCJTlCJUU4JUJFJUI5JUU1JUJEJUEyJUUzJTgwJTgyJUUzJTgwJTgyJUU2JUIyJUExJUU4JUJGJTk5JUU3JTlGJUE1JUU4JUFGJTg2JUU2JTkwJTlDJUU5JTgzJUJEJUU0JUI4JThEJUU3JTlGJUE1JUU5JTgxJTkzJUU2JTgwJThFJUU0JUI5JTg4JUU2JTkwJTlDJUUzJTgwJTgyMiVFMyU4MCU4MSVFNiU4QSU4QSVFOCVCRiU5OSVFNiU5NSVCMCVFNSVBRCU5NyVFNSVCQyU4MCVFNCVCQSU5NCVFNiVBQyVBMSVFNSVCOSVCMyVFNiU5NiVCOSVFNSVCMCVCMSVFOCVBMSU4QyVFNCVCQSU4NiVFMyU4MCU4MiUwRCUwQTkwJUUzJTgwJTgxaHR0cCUzQSUyRiUyRnJpZGRsZS5hcnRodXJsdWsubmV0JTJGZ2xvYmUlMkZkZWNlaXRmdWwucGhwJTIwJTA5MS4lRTQlQjglODklRTQlQjglQUFPJUU2JTgzJUIzJUU1JTg4JUIwJUU4JTg3JUFEJUU2JUIwJUE3JUVGJUJDJThDMi4lRTYlQTAlQjklRTYlOEQlQUUlRTglQkYlOTklRTQlQjglQUElRTYlOEIlQkMlRTklOUYlQjMlRTUlQUQlOTclRTYlQUYlOEQlRTglQUYlQkIlRTklOUYlQjMlRTYlOEElOEF1cmwlRTYlOTQlQjklRTYlODglOTAxJTIwJTNEJTIwb25lLnBocCUyMDMuJUU2JUJBJTkwJUU2JTk2JTg3JUU0JUJCJUI2JUU3JTlBJTg0JUU2JUIzJUE4JUU5JTg3JThBJUU4JUFGJUI0JUU2JTg5JUJFcHJvZHVjZXIlRUYlQkMlOEMlRTklOTklQjclRTklOTglQjElRTUlOUMlQTglRTQlQkElOEUlRTQlQjglOEQlRTYlOTglQUYlRTYlODklQkUlRTglQkYlOTklRTYlQUUlQjUlRTUlOEYlQjAlRTglQUYlOEQlRUYlQkMlODglRTYlOUYlQTUlRTclOTAlODYlRTQlQjglOEUlRTUlQjclQTclRTUlODUlOEIlRTUlOEElOUIlRTUlQjclQTUlRTUlOEUlODIlRUYlQkMlODklRTclOUElODQlRTUlQUYlQkMlRTYlQkMlOTQlRUYlQkMlOEMlRTglODAlOEMlRTYlOTglQUYlRTglQkYlOTklRTYlQUUlQjUlRTUlOEYlQjAlRTglQUYlOEQlRTYlQUYlOTQlRTUlOEUlOUYlRTglOTElOTclRTUlQjAlOTElRTQlQkElODZhaSVFNCVCOCVBNCVFNCVCOCVBQSVFNSVBRCU5NyVFNiVBRiU4RCVFRiVCQyU4QyVFOCU4MCU4Q0FJJUU2JTk4JUFGJUU0JUI4JTgwJUU5JTgzJUE4JUU3JTk0JUI1JUU1JUJEJUIxJUUzJTgwJThBJUU0JUJBJUJBJUU1JUI3JUE1JUU2JTk5JUJBJUU4JTgzJUJEJUUzJTgwJThCJUUzJTgwJTgyJUUzJTgwJTgyJUUzJTgwJTgyJUU1JUFGJUJDJUU2JUJDJTk0JUU2JTk4JUFGJUU2JTk2JUFGJUU3JTlBJUFFJUU1JUIwJTk0JUU0JUJDJUFGJUU2JUEwJUJDJUUzJTgwJTgyJUU4JUJGJTk4JUU2JTlDJTg5cHJvZHVjZXIlRTYlODglOTElRTclQkYlQkIlRTglQUYlOTElRTYlODglOTAlRTQlQkElODYlRTUlODglQjYlRTclODklODclRTQlQkElQkElRTUlOTElODAlRUYlQkMlOEMlRTYlOTAlOUNBSSVFNyU5QSU4NCVFNSU4OCVCNiVFNyU4OSU4NyVFNCVCQSVCQSVFNSU4RiVBRiVFNiU5OCVBRiVFOCU5MSU5NyVFNSU5MCU4RCVFNSVBRiVCQyVFNiVCQyU5NCVFNiU5NiVBRiVFNSU5RCVBNiVFNSU4OCVBOSVDMiVCNyVFNSVCQSU5MyVFNSVCOCU4MyVFOSU4NyU4QyVFNSU4NSU4QiVFMyU4MCU4MiVFMyU4MCU4MiVFMyU4MCU4MiVFNSVBRiVCQyVFNiVCQyU5NCVFNiU4OSU4RCVFNiU5OCVBRiVFNiU5NiVBRiVFNyU5QSVBRSVFNSVCMCU5NCVFNCVCQyVBRiVFNiVBMCVCQyVFMyU4MCU4MiUyMCUyMCVFOCVCRiU5OSVFNSU4NSVCMyVFNiU5NSVCNCVFNCVCRCU5MyVFNSVBNCVBQSVFOSU5QSVCRSVFNCVCQSU4NiVFMyU4MCU4MiVFMyU4MCU4MjQuJUU5JTlBJTkwJUU4JTk3JThGJUU0JUJBJTg2JUU0JUI4JTgwJUU0JUI4JUFBJUU1JUFEJTk3JUU2JUFGJThEciwlRTclODQlQjYlRTUlOTAlOEVvem9uZS1vbmUlMjAlM0RveiUyMCUyMCVFNSU4QSVBMCVFNCVCOCU4QXIlMjAlRTUlQkUlOTclRTUlODglQjBvcnouLiVFOCVCRiU5OSVFNSU4NSVCMyVFNyU5QyU5RiVFNCVCOCU4RCVFNCVCOCU4RCVFNyU5RiVBNSVFOSU4MSU5MyVFOCVCMCU4MSVFNSU4MSU5QSVFNSU4NyVCQSVFNiU5RCVBNSVFNyU5QSU4NCVFMyU4MCU4MiVFMyU4MCU4MiVFMyU4MCU4MiVFMyU4MCU4MiUwRCUwQTkxJUUzJTgwJTgxaHR0cCUzQSUyRiUyRnJpZGRsZS5hcnRodXJsdWsubmV0JTJGZ2xvYmUlMkZvcnoucGhwJTIwJTIwJUU3JThDJTlDJUU0JUI4JTgwJUU0JUI4JUFBJUU1JUI4JUE2JUU2JTlDJTg5JUU1JTg2JTkyJUU1JThGJUI3JUU3JTlBJTg0JUU3JUJEJTkxJUU5JUExJUI1JUUzJTgwJTgyJUUzJTgwJTgyJUUzJTgwJTgyYWJvdXQlM0FibGFuay4uLiVFOCU4NCU5MSVFNiVCNCU5RSVFNSVBNCVBQSVFNSVBNCVBNyUwRCUwQTkyJUUzJTgwJTgxaHR0cCUzQSUyRiUyRnJpZGRsZS5hcnRodXJsdWsubmV0JTJGZ2xvYmUlMkZhYm91dGJsYW5rLnBocCUyMCUyMCUyMCVFOCVCRiU5OSVFNSU4NSVCMyVFMyU4MCU4MiVFMyU4MCU4MiVFOCVCRiU5OSVFNSU4NSVCMyVFMyU4MCU4MiVFMyU4MCU4MiVFNCVCOCU4RCVFOSU5QSVCRSVFRiVCQyU4QyVFNCVCRCU4NiVFNiU5OCVBRiVFNSVCNyVBOCVFOCU4QSVCMSVFNiU5NyVCNiVFOSU5NyVCNCVFMyU4MCU4MiVFMyU4MCU4MiVFOCU4MCU4QyVFNCVCOCU5NCVFNSU4OSU4RCVFNiU4RiU5MCVFNiU5OCVBRiVFNCVCRCVBMCVFNSVBRiVCOSVFNCVCOSU4QiVFNSU4OSU4RCVFNyU5QSU4NCVFOCVCRiU4NyVFNSU4NSVCMyVFNCVCOSU4QiVFOCVCNyVBRiVFOCVBRSVCMCVFNSVCRCU5NSVFNSU5QyVBOCVFNiVBMSU4OCVFMyU4MCU4MiVFMyU4MCU4MiUwRCUwQTkzJUUzJTgwJTgxaHR0cCUzQSUyRiUyRnJpZGRsZS5hcnRodXJsdWsubmV0JTJGZ2xvYmUlMkZpbHdkLnBocCUyMCUyMCVFNCVCQiU4RSVFOCVCRiU5OSVFNSVBMCU4NiVFNSVBRCU5NyVFNiVBRiU4RCUyMCVFNCVCOCVBRCVFOSU5OSVBNCVFNSU4RSVCQmVpZ2h0JTIwbGV0dGVycyVFOCVCRiU5OSVFNSU4NyVBMCVFNCVCOCVBQSVFNSVBRCU5NyVFNiVBRiU4RCUyMCVFNyU4NCVCNiVFNSU5MCU4RWFuYWdyYW1zJUU2JTlEJUE1JUU2JTkwJTlFJUUzJTgwJTgyJTBEJTBBOTQlRTMlODAlODFodHRwJTNBJTJGJTJGcmlkZGxlLmFydGh1cmx1ay5uZXQlMkZnbG9iZSUyRnZhY2F0aW9uLnBocCUyMCUyMCVFOSU5QSU5MCVFNSU4NiU5OSVFNiU5QyVBRiVFMyU4MCU4MiVFMyU4MCU4MiVFNCVCOCU4QiVFOCVCRCVCRGJhY2tncm91bmQucG5nJUVGJUJDJThDJUU3JTk5JUJEJUU2JTlEJUJGJUU0JUI4JTgwJUU1JUJDJUEwJUVGJUJDJThDJUU5JTlDJTgwJUU4JUE2JTgxJUU4JUIwJTgzJUU4JThBJTgyJUU1JUFGJUI5JUU2JUFGJTk0JUU1JUJBJUE2JUVGJUJDJTg4UFMlRTclOUIlQjQlRTYlOEUlQTUlMjAlRTUlOUIlQkUlRTUlODMlOEYtJTNFJUU4JTg3JUFBJUU1JThBJUE4JUU1JUFGJUI5JUU2JUFGJTk0JUU1JUJBJUE2JUVGJUJDJTg5JTIwJTBEJTBBOTUlRTMlODAlODFodHRwJTNBJTJGJTJGcmlkZGxlLmFydGh1cmx1ay5uZXQlMkZnbG9iZSUyRnN0cmVldC5waHAlMjAlMjAlRTYlOTAlOUMlRTUlOUIlQkUlRTclODklODclRUYlQkMlOEMlRTQlQjglOEQlRTUlOTYlOUMlRTYlQUMlQTIlRTglQkYlOTklRTclQTclOEQlRTklQTIlOTglRUYlQkMlOEMlRTUlQTYlODIlRTYlOUUlOUMlRTQlQjglOEQlRTQlQkElODYlRTglQTclQTMlRTglQkYlOTklRTQlQjglQUElRTUlOEElQTglRTYlQkMlQUIlRUYlQkMlOEMlRTUlQjAlQjElRTUlOEYlQUElRTYlOUMlODklRTclQTElQUMlRTclOUQlODAlRTUlQTQlQjQlRTclOUElQUUlRTUlOTAlODQlRTclQTclOEQlRTYlOTAlOUMlRTQlQkElODYlRUYlQkMlOEMlRTUlQUQlQTYlRTUlODglQjAlRTclOUElODQlRTQlQjglOUMlRTglQTUlQkYlRTQlQjglOEQlRTUlQTQlOUElRTMlODAlODIlMEQlMEE5NiVFMyU4MCU4MWh0dHAlM0ElMkYlMkZyaWRkbGUuYXJ0aHVybHVrLm5ldCUyRmdsb2JlJTJGYWlyc2hpcGZvcnRyZXNzLnBocCUyMCUyMCVFOSVBNiU5NiVFOSVBMSVCNSVFNSU5QiVCRSVFNyU4OSU4NyVFNyU5QSU4NCVFNSVCMSU5RSVFNiU4MCVBNyVFNCVCRiVBMSVFNiU4MSVBRi10aGUlMjB0cmVhc3VyZSUyMGlzJTIwJTIyYmFieXF1aWdnbGUlMjIlMjAlMjAlRTglQkYlOTklRTUlODUlQjMlRTQlQjklOUYlRTQlQjglOEQlRTclOUYlQTUlRTklODElOTMlRTQlQkIlOTYlRTQlQkElQkElRTYlOTglQUYlRTYlODAlOEUlRTQlQjklODglRTYlODMlQjMlRTUlODclQkElRTYlOUQlQTUlRTclOUElODQlRTMlODAlODIlMEQlMEE5NyVFMyU4MCU4MWh0dHAlM0ElMkYlMkZyaWRkbGUuYXJ0aHVybHVrLm5ldCUyRm1hdHJpeCUyRmNhcmQucGhwJTIwJTIwJUU4JUJGJTk5JUU1JTg1JUIzJUU3JUFFJTk3JUU3JUFFJTgwJUU1JThEJTk1JUVGJUJDJThDJUU1JTg1JUFCJUU3JTg4JUFBJUU5JUIxJUJDT2N0b3B1cyUyMCUyMCVFNSU4RiU5NiVFNCVCOCVBRCVFOSU5NyVCNCVFNCVCOCU4OSVFNCVCOCVBQSVFNSVBRCU5NyVFNiVBRiU4RCVFRiVCQyU4QyVFNCVCOCU4QiVFOSU5RCVBMiVFOCU4NyVBQSVFNyU4NCVCNiVFNSVCRSU5NyVFNSU4OCVCMGxpZSUwRCUwQTk4JUUzJTgwJTgxaHR0cCUzQSUyRiUyRnJpZGRsZS5hcnRodXJsdWsubmV0JTJGbWF0cml4JTJGbGllLnBocCUyMCUyMCVFOCVCRiU5OSVFNSU4NSVCMyVFNCVCOSU5RiVFNyVBRSU4MCVFNSU4RCU5NSUyMFNXJUU3JTlBJTg0JUU4JUJGJTlCJUU4JUExJThDJUU2JTk3JUI2JUVGJUJDJThDJUU0JUJEJTg2JUU4JTg3JUFBJUU1JUI3JUIxJUU2JTlDJTg5JUU2JTk3JUI2JUU1JTgwJTk5JUU2JTgzJUIzJUU0JUI4JThEJUU1JTg4JUIwJUU4JUJGJTk5JUU0JUI4JUFBJUU3JTgyJUI5JUU0JUI4JThBJUUzJTgwJTgyJUUzJTgwJTgyJUUzJTgwJTgyJTBEJTBBOTklRTMlODAlODFodHRwJTNBJTJGJTJGcmlkZGxlLmFydGh1cmx1ay5uZXQlMkZtYXRyaXglMkZzd2luZy5waHAlMjAlMjAlRTUlODglQTklRTclOTQlQThodHRwJTNBJTJGJTJGd3d3LndvbGZyYW1hbHBoYS5jb20lRTclQkQlOTElRTclQUIlOTklRTclOTQlQkIlRTQlQjglQUElRTUlODclQkQlRTYlOTUlQjAlRTUlOUIlQkUlRUYlQkMlOEMlRTYlOUMlODklRTglQjYlQTMlRTMlODAlODIlMEQlMEExMDAlRTMlODAlODFodHRwJTNBJTJGJTJGcmlkZGxlLmFydGh1cmx1ay5uZXQlMkZtYXRyaXglMkZtaWNrZXltb3VzZS5waHAlMjAlMjAlRTklOTQlQUUlRTclOUIlOTglRTUlQUYlODYlRTclQTAlODElRUYlQkMlOEMlRTYlODUlQTIlRTYlODUlQTIlRTglQUYlOTUlRTMlODAlODIlRTMlODAlODIlMEQlMEExMDElRTMlODAlODFodHRwJTNBJTJGJTJGcmlkZGxlLmFydGh1cmx1ay5uZXQlMkZtYXRyaXglMkZ0dWNrc2hvcC5waHAlMjAlMjAlRTclOTQlQTglRTglOEUlQjclRTUlOEYlOTYlRTUlQjElOEYlRTUlQjklOTUlRTUlOUQlOTAlRTYlQTAlODclRTclOUElODRtYXJrYm9vayVFNiU5RCVBNSVFNSVCRSU5NyVFNSU4OCVCMCVFOCVCRiU5OSVFNiU5OCVBRiVFNCVCOCU4MCVFNCVCOCVBQTYwMCo2MDAlRTclOUElODQlRTYlQUQlQTMlRTYlOTYlQjklRTUlQkQlQTIlRUYlQkMlOEMlRTYlQUYlOEYlRTQlQjglQUElRTUlQjAlOEYlRTclOUElODQlRTYlOTglQUYyMCoyMCVFRiVCQyU4QyVFNyU4NCVCNiVFNSU5MCU4RSVFNiVBMCVCOSVFNiU4RCVBRSVFNSU4NSVBQyVFNSVCQyU4RihDMzElMjAyKSUyMCooQzMxJTIwMiklM0QlMjAyMTYyMjUlMEQlMEExMDIlRTMlODAlODFodHRwJTNBJTJGJTJGcmlkZGxlLmFydGh1cmx1ay5uZXQlMkZ0aXNzdWUlMkZwYXBlci5waHAlMjAlMjA2NCVFNSVCQyVBMCVFRiVCQyU4QyVFOCVBRiVCNCVFNiU5OCU4RSVFNSU5RiVCQSVFNCVCQSU4RSVFOCVCRiU5OSVFNiU5QyVBQyVFNCVCOSVBNiVFOSU5NSVCRiVFNSVBRSVCRCVFNSU5MCU4NCVFNyVCRiVCQiVFNSU4NSVBQiVFNSU4MCU4RCVFRiVCQyU4QyVFNiU5RiVBNSVFNSU4OCVCMCVFOCVCRiU5OSVFNCVCOCVBQSVFNSVCMCVCQSVFNSVBRiVCOCVFNiU5OCVBRkEwJUU3JUJBJUI4JUUzJTgwJTgyJUUzJTgwJTgyJUU1JThGJUFGJUU0JUJCJUE1JUU4JTg3JUFBJUU1JUI3JUIxJUU2JThCJUJGJUU1JUJDJUEwJUU3JUJBJUI4JUU2JThBJTk4JUU0JUI4JTgwJUU0JUI4JThCJUUzJTgwJTgyJTBEJTBBMTAzJUUzJTgwJTgxaHR0cCUzQSUyRiUyRnJpZGRsZS5hcnRodXJsdWsubmV0JTJGdGlzc3VlJTJGb3NjYXIucGhwJTIwJTIwR29vZ2xlJUU1JTkxJTk3JTBEJTBBMTA0JUUzJTgwJTgxaHR0cCUzQSUyRiUyRnJpZGRsZS5hcnRodXJsdWsubmV0JTJGdGlzc3VlJTJGcmF5dG9tbGluc29uLnBocCUyMCUyMCVFNyU4NiU5RiVFNiU4MiU4OSVFNiU5OCU5RiVFOSU5OSU4NSVFOCVCRiVCNyVFOCU4OCVBQSVFNyU5QSU4NCVFNCVCOCU4MCVFNyU5QyU4QiVFNSVCMCVCMSVFNyU5RiVBNSVFOSU4MSU5MyVFRiVCQyU4QyVFNCVCOCU4RCVFNyU4NiU5RiVFNiU4MiU4OSVFNyU5QSU4NEdvb2dsZSVFNiU5MCU5QyVFNSU5QiVCRSVFMyU4MCU4MiUwRCUwQTEwNSVFMyU4MCU4MWh0dHAlM0ElMkYlMkZyaWRkbGUuYXJ0aHVybHVrLm5ldCUyRnRpc3N1ZSUyRnN0YXJ0cmVrLnBocCUyMCUyMCVFNSU5QiVCRSVFNyU4OSU4NyVFNSU5MCU4RCVFNiU4RiU5MCVFNyVBNCVCQXBpLCVFNSVCQSU5NCVFOCVBRiVBNSVFOCVCNyU5RiVFNSU5QyU4NiVFNSU5MSVBOCVFNyU4RSU4NyVFNiU5QyU4OSVFNSU4NSVCMyVFRiVCQyU4QyVFNyU4NCVCNiVFNSU5MCU4RSVFNCVCQiU4RXclRTUlQkMlODAlRTUlQTclOEIlRTklOUElOTQlRTclOUQlODAlRTUlOUMlODYlRTUlOTElQTglRTclOEUlODclRTclOUElODQlRTYlOTUlQjAlRTUlQUQlOTclRTQlQjglODAlRTQlQjglQUElRTQlQjglODAlRTQlQjglQUElRTYlOEYlOTAlRTUlOEYlOTYlRTUlQUYlQjklRTUlQkElOTQlRTQlQkQlOEQlRTUlQUQlOTAlRTclOUElODQlRTUlQUQlOTclRTYlQUYlOEQlRTYlOUQlQTUlRTUlQkUlOTclRTUlODglQjAlRTklOTclQUUlRTklQTIlOTglRUYlQkMlOEMlMEQlMEElRTclODQlQjYlRTUlOTAlOEVHb29nbGUlRTYlOUMlODAlRTUlQkMlQkElRTclOUElODQlRTklODUlQjglRTMlODAlODIlRTMlODAlODIlRTMlODAlODIlMEQlMEExMDYlRTMlODAlODFodHRwJTNBJTJGJTJGcmlkZGxlLmFydGh1cmx1ay5uZXQlMkZ0aXNzdWUlMkZ0YWlsLnBocCUwOSVFNSVCOSVCMyVFNSU5RCU4NyVFNiU5NSVCMCVFNyVCMSVCQiVFNSU5RSU4QiVFNSVCMCVCMSVFOSU4MiVBMyVFNCVCOSU4OCVFNSU4NyVBMCVFNyVBNyU4RCVFMyU4MCU4MiVFMyU4MCU4MiUwOSUwRCUwQTEwNyVFMyU4MCU4MWh0dHAlM0ElMkYlMkZyaWRkbGUuYXJ0aHVybHVrLm5ldCUyRnRpc3N1ZSUyRmRpY2UucGhwJTA5JUU1JUE0JTlBJUU4JUE3JTgyJUU1JUFGJTlGJUU0JUI4JThCJUVGJUJDJThDJUU2JThBJThBJUU1JUFEJTk3JUU3JUFDJUE2JUU0JUI4JUIyJUU5JUExJUJBJUU1JUJBJThGJUU1JTgwJTkyJUU4JUJGJTg3JUU2JTlEJUE1JUU1JUJFJTk3JUU1JTg4JUIwJUU5JTk3JUFFJUU5JUEyJTk4JUVGJUJDJThDJUU1JTg2JThER29vZ2xlJTIwJUU2JUFGJTk0JUU4JUJFJTgzJUU3JUFFJTgwJUU1JThEJTk1JUUzJTgwJTgyJTBEJTBBMTA4JUUzJTgwJTgxaHR0cCUzQSUyRiUyRnJpZGRsZS5hcnRodXJsdWsubmV0JTJGdGlzc3VlJTJGZmlmdHlzaGFkZXNvZmdyZXkucGhwJTA5JUU4JTk5JUJEJUU3JTg0JUI2JUU0JUI4JThEJUU2JTg3JTgyJUU4JUJGJTk5JUU4JUFGJUFEJUU4JUE4JTgwJUVGJUJDJThDJUU0JUJEJTg2JUU2JTk4JUFGJUU3JUE4JThCJUU1JUJBJThGJUU3JUFFJTgwJUU1JThEJTk1JUVGJUJDJThDJUU3JTlDJThCJUU1JUJFJTk3JUU1JTg3JUJBJUU2JTk4JUFGJUU2JUIxJTgyJUU2JTlDJTgwJUU1JUE0JUE3JUU1JTg1JUFDJUU3JUJBJUE2JUU2JTk1JUIwJUVGJUJDJThDJUU4JUE2JTgxJUU0JUJCJTk0JUU3JUJCJTg2JUU3JTgyJUI5JUU5JTlDJTgwJUU4JUE2JTgxJUU2JTk0JUI5aW5wdXQlRTklOTUlQkYlRTUlQkElQTYlRUYlQkMlOEMlRTQlQjglOEQlRTclODQlQjYlRTglQkYlOTglRTQlQkIlQTUlRTQlQjglQkElRTclQUQlOTQlRTYlQTElODglRTQlQjglOEQlRTUlQUYlQjklRTUlOTElQTIlRTMlODAlODIlMEQlMEExMDklRTMlODAlODFodHRwJTNBJTJGJTJGcmlkZGxlLmFydGh1cmx1ay5uZXQlMkZjb25xdWVzdCUyRmltbWVkaWF0ZS5waHAlMjAlMDklRTglODclQUElRTUlQjclQjElRTUlQkQlOTMlRTYlOTclQjYlRTYlOEElOEElRTUlOUIlOUIlRTQlQjglQUElRTUlOUIlQkQlRTUlQUUlQjYlRTUlOEYlOEElRTUlOUIlOUIlRTQlQjglQUElRTUlOUIlQkUlRTclODklODclRTklODMlQkQlRTYlODklQkUlRTUlODclQkElRTYlOUQlQTUlRTQlQkElODYlRUYlQkMlOEMlRTUlOEYlQUYlRTYlOTglQUYlRTUlQjElODUlRTclODQlQjYlRTYlQjIlQTElRTYlODMlQjMlRTUlODglQjAlRTclQUQlOTQlRTYlQTElODglRTYlOTglQUZzdHJhd2JlcnJ5Y2hlZXNlY2FrZS4uLiVFOCVCRiU5OCVFNCVCQiVBNSVFNCVCOCVCQSVFNSU4RiU4OCVFNiU5OCVBRiVFOSVBNiU5NiVFNSVBRCU5NyVFNiVBRiU4RCVFOCVCRiU5RSVFNiU4RSVBNSVFMyU4MCU4MiVFMyU4MCU4MiVFMyU4MCU4MiVFOCVBMiVBQiVFNSU4OSU4RCVFOSU5RCVBMiVFNyU5QSU4NCVFOSVBMiU5OCVFNSU5RCU5MSVFNiU5OSU5NSVFNCVCQSU4NiVFMyU4MCU4MiUwRCUwQTExMCVFMyU4MCU4MWh0dHAlM0ElMkYlMkZyaWRkbGUuYXJ0aHVybHVrLm5ldCUyRmNvbnF1ZXN0JTJGc3RyYXdiZXJyeWNoZWVzZWNha2UucGhwJTIwJTA5JUVGJUJDJTg4dHJhbnNtaXNzaW9uJUVGJUJDJTg5JUU4JUJGJTk5JUU1JTg1JUIzJUU2JTlDJTg5JUU2JTg0JThGJUU2JTgwJTlEJUVGJUJDJThDJUU4JTg3JUFBJUU1JUI3JUIxJUU1JTgxJTlBJUU0JUI4JThEJUU1JTg3JUJBJUU2JTlEJUE1KCVFOCVCRiU5OCVFNiU5OCVBRiVFNCVCOCU4RCVFNSVBNCVBQSVFNCVCQyU5QSVFNyU5NCVBOHBzJUUzJTgwJTgyJUUzJTgwJTgyKSVFNSVCQyU4NCVFNSU4NyVCQSVFNiU5RCVBNSVFNCVCQSU4NiVFNCVCQSU4QyVFNyVCQiVCNCVFNyVBMCU4MSVFNSVBNyU4QiVFNyVCQiU4OCVFNCVCOCU4RCVFNSVBRiVCOSVFMyU4MCU4MiUwRCUwQTExMSVFMyU4MCU4MWh0dHAlM0ElMkYlMkZyaWRkbGUuYXJ0aHVybHVrLm5ldCUyRmNvbnF1ZXN0JTJGY29pbi5waHAlMDklRTklOUElOTAlRTUlODYlOTklRTYlOUMlQUYlRTYlOUMlODklRTYlODQlOEYlRTYlODAlOUQlRUYlQkMlOEMlRTQlQkIlQTUlRTUlODklOEQlRTYlQjIlQTElRTUlODElOUElRTglQkYlODclRTclOUElODQlRTglQUYlOUQlRTQlQkMlOUElRTYlODklQkUlRTQlQjglOEQlRTUlODglQjAlRTYlODAlOUQlRTglQjclQUYlRUYlQkMlOEMlRTglODAlOEMlRTQlQjglOTQlRTglQkYlOTglRTYlOUMlODklRTQlQjglQUElRTUlOUQlOTElRUYlQkMlOEMlRTglQTYlODFmbGlwJUU0JUI4JTgwJUU0JUI4JThCJUU2JTg5JThEJUU2JTk4JUFGJUU3JUFEJTk0JUU2JUExJTg4JTBEJTBBMTEyJUUzJTgwJTgxaHR0cCUzQSUyRiUyRnJpZGRsZS5hcnRodXJsdWsubmV0JTJGY29ucXVlc3QlMkZkZWZlYXRlZC5waHAlMDklRTYlQjIlQTElRTYlOEYlOTAlRTclQTQlQkElRTMlODAlODIlRTMlODAlODJHb29nbGUlRTYlOTAlOUMlRTUlOUIlQkUlRTQlQjklOUYlRTYlOTclQTAlRTYlOUUlOUMlRUYlQkMlOEMlRTYlQUYlQUIlRTYlOTclQTAlRTYlODAlOUQlRTglQjclQUYlRUYlQkMlOEMlRTclOUMlOEIlRTYlOTQlQkIlRTclOTUlQTUlRTclOUYlQTUlRTklODElOTMlRTYlOTglQUZwcmltZXMoJUU2JUJBJTkwJUU0JUJCJUEzJUU3JUEwJTgxJUU2JTlDJTg5JUU1JTg1JUFEJUU0JUI4JUFBJUU5JTk3JUFFJUU1JThGJUI3KSVFNiU5RCVBMSVFNyVBMCU4MSVFMyU4MCU4MiUwRCUwQTExMyVFMyU4MCU4MWh0dHAlM0ElMkYlMkZyaWRkbGUuYXJ0aHVybHVrLm5ldCUyRmNvbnF1ZXN0JTJGcHJpbWVzLnBocCUyMCUyMCVFNCVCOCU4QiVFOCVCRCVCRCVFNSU5QiVCRSVFNyU4OSU4NyVFNiU4OSU4MCVFNyVBNCVCQSVFNyU5QSU4NGV4ZSwlRTclODQlQjYlRTUlOTAlOEUlRTQlQjglQTIlRTglQkYlOUJub3RlcGFkKyslRUYlQkMlOEMlRTYlOTAlOUMlRTQlQjglODAlRTQlQjglOEJwYXNzJUU0JUI5JThCJUU3JUIxJUJCJUU3JTlBJTg0JUU4JUFGJThEJUVGJUJDJThDJUU1JUIwJUIxJUU2JTg5JUJFJUU1JTg4JUIwJUU0JUJBJTg2JUUzJTgwJTgyJTBEJTBBMTE0JUUzJTgwJTgxaHR0cCUzQSUyRiUyRnJpZGRsZS5hcnRodXJsdWsubmV0JTJGaG9ycm9yJTJGaW1hZ2luYXRpb24ucGhwJTIwJTIwJUU4JTg3JUFBJUU1JUI3JUIxJUU1JTgxJTlBJUU0JUI4JThEJUU1JTg3JUJBJUU2JTlEJUE1JUVGJUJDJThDJUU2JTlDJTg5JUU2JTg0JThGJUU2JTgwJTlEJUUzJTgwJTgyJUU1JTlCJUJFJUU3JTg5JTg3ZmxpcCVFNCVCOCU4MCVFNCVCOCU4QiVFRiVCQyU4QyVFNSVCMCVCMSVFNiU5OCVBRiVFNCVCOCU4MCVFNCVCOCVBQSVFNiVBMSVBNSVFNSVBMiVBOSVFMyU4MCU4MiVFMyU4MCU4MiVFMyU4MCU4MiUwRCUwQTExNSVFMyU4MCU4MWh0dHAlM0ElMkYlMkZyaWRkbGUuYXJ0aHVybHVrLm5ldCUyRmhvcnJvciUyRnBpZXIucGhwJTIwJTIwJUU0JUI5JTkwJUU4JUIwJUIxJUU1JUFGJUI5JUU2JTg4JTkxJUU2JTlEJUE1JUU4JUFGJUI0JUU4JThDJUFCJUU3JTg0JUI2JUUzJTgwJTgyJUUzJTgwJTgyJUU1JTgxJTlBJUU0JUI4JThEJUU2JTlEJUE1JTBEJTBBMTE2JUUzJTgwJTgxaHR0cCUzQSUyRiUyRnJpZGRsZS5hcnRodXJsdWsubmV0JTJGaG9ycm9yJTJGcXVhdmVyLnBocCUyMCUyMCVFNyU5NCVCNSVFOSU5OCVCQiVFMyU4MCU4MiVFMyU4MCU4MiVFNSU4MSU5QSVFNCVCOCU4RCVFNiU5RCVBNSUyMCVFNSU5MyU4OCVFNSU5MyU4OCVFNSU5MyU4OCVFNSU5MyU4OCVFMyU4MCU4MiVFMyU4MCU4MiUwRCUwQTExNyVFMyU4MCU4MWh0dHAlM0ElMkYlMkZyaWRkbGUuYXJ0aHVybHVrLm5ldCUyRnJldm9sdXRpb24lMkZtb3VudGFpbi5waHAlMjAlMjAlRTQlQjglODAlRTclOUMlOEIlRTUlQjAlQjElRTclOUYlQTUlRTklODElOTMlRTclQTklQkElRTUlOUYlOEUlRTglQUUlQTElRUYlQkMlOEMlRTQlQkQlODYlRTYlOTglQUYlRTclQkYlQkIlRTglQUYlOTElRTclOUElODQlRTglOEIlQjElRTYlOTYlODclRTYlOTglQUZFbXB0eSUyMEZvcnQlMjBTdHJhdGVneSUyMCVFOCU4MCU4QyVFNCVCOCU4RCVFNiU5OCVBRmVtcHR5JTIwY2l0eSUyMHN0cmF0ZWd5JUUzJTgwJTgyJUUzJTgwJTgyJTIwJUVGJUJDJThDJUU4JTgwJThDJUU0JUI4JTk0JUU1JUFGJTg2JUU3JUEwJTgxJUU2JUExJTg2JUU1JUIxJTg1JUU3JTg0JUI2JUU2JTk4JUFGJUU1JTlEJTkxJUVGJUJDJThDJUU4JUE2JTgxJUU3JTlCJUI0JUU2JThFJUE1JUU2JTk0JUI5dXJsJUVGJUJDJThDZW1wdHlmb3J0c3RyYXRlZ3kucGhwJTIwJTIwJTIwJUU4JUJGJTk5JUU3JUE3JThEJUU0JUI4JTlDJUU4JUE1JUJGJUU4JTg3JUFBJUU1JUI3JUIxJUU2JThBJTk4JUU4JTg1JUJFJUU4JThBJUIxJUU1JUE0JTlBJUU0JUI5JTg1JUU2JTk3JUI2JUU5JTk3JUI0JUU5JTgzJUJEJUU0JUI4JThEJUU1JUFFJTlBJUU4JTgzJUJEJUU1JUJDJTg0JUU1JTg3JUJBJUU2JTlEJUE1JUUzJTgwJTgyJUUzJTgwJTgyJTBEJTBBJTBEJTBBJUU1JTkwJThFJUU4JUFFJUIwJUVGJUJDJTlBJTBEJTBBMSVFMyU4MCU4MSVFNyU4RSVBOSVFOCVCRiU5OSVFNyVCMSVCQiVFOSVBMiU5OCVFNyU5QyU5RiVFNCVCOCU4RCVFOCU4MyVCRCVFNSU4RCU5NSVFOSU5RCVBMCVFOCU4NyVBQSVFNSVCNyVCMSVFNyU5RSU4RSVFNiU4QSU5OCVFOCU4NSVCRSVFRiVCQyU4QyVFNCVCOCU4MCVFNiU5NiVCOSVFOSU5RCVBMiVFNSU4RiVBRiVFOCU4MyVCRCVFNiU5OCVBRiVFNiVBRiVBQiVFNiU5NyVBMCVFNyU5QiVCOCVFNSU4NSVCMyVFOSVBMiU5OCVFNyU5QiVBRSVFNyU5QSU4NCVFNyU5RiVBNSVFOCVBRiU4NiVFRiVCQyU4QyVFNSVCMCVCMSVFNSVBRSU4QyVFNSU4NSVBOCVFNiU4OSVCRSVFNCVCOCU4RCVFNSU4OCVCMCVFNSU4OCU4NyVFNSU4NSVBNSVFNyU4MiVCOSVFRiVCQyU4QyVFNSU4RiVBNiVFNCVCOCU4MCVFNiU5NiVCOSVFOSU5RCVBMiVFRiVCQyU4QyVFNSU4RiU5OCVFNiU4MCU4MSVFNyU5QSU4NCVFNSU5RCU5MSVFNCVCQyU5QSVFNSVCQyU4NCVFNiVBRCVCQiVFNCVCQSVCQSVFRiVCQyU4QyVFNSVCMCVCMSVFNyVBRSU5NyVFOCVBNyVBMyVFNSU4NiVCMyVFNCVCQSU4NjkwJTI1JUU5JTk3JUFFJUU5JUEyJTk4JUVGJUJDJThDJUU0JUI4JUI0JUU5JTk3JUE4JUU0JUI4JTgwJUU4JTg0JTlBJUU1JThGJUFGJUU4JTgzJUJEJUU4JThBJUIxJUU1JTg2JThEJUU1JUE0JTlBJUU2JTk3JUI2JUU5JTk3JUI0JUU0JUI5JTlGJUU2JTkwJTlFJUU0JUI4JThEJUU1JUFFJTlBJUUzJTgwJTgyJTBEJTBBMiVFMyU4MCU4MSVFOCU4MCU4MyVFNyU4MiVCOSVFNSU5RiVCQSVFNiU5QyVBQyVFNCVCOCU4QSVFNiU5QyU4OSVFOCVCRiU5OSVFNCVCQSU5QiVFRiVCQyU5QSU3QjElRTMlODAlODElRTglOEIlQjElRTYlOTYlODclRTclOUYlQTUlRTglQUYlODYlRUYlQkMlOEMlRTQlQkQlOUMlRTglODAlODUlRTUlQkElOTQlRTglQUYlQTUlRTQlQjglOEQlRTYlOTglQUYlRTUlODYlODUlRTUlOUMlQjAlRTQlQkElQkElRTUlOTAlQTclRUYlQkMlOEMlRTYlOUMlODklRTQlQkElOUIlRTglOEIlQjElRTYlOTYlODclRTUlOEQlOTUlRTglQUYlOEQlRTklOUQlOUUlRTUlQjglQjglRTQlQjglOTMlRTQlQjglOUElRUYlQkMlOENHb29nbGUlRTUlODclQkElRTYlOUQlQTUlRTQlQjklOUYlRTQlQjglOEQlRTQlQjglODAlRTUlQUUlOUElRTUlQUYlQjklRTUlOEYlQjclRUYlQkMlOEMlRTglQkYlOTglRTYlOUMlODklRTUlOUYlQkElRTQlQkElOEUlRTUlOEQlOTUlRTglQUYlOEQlRTclOUElODRhbmFncmFtJUVGJUJDJThDJUUzJTgwJTgyMiVFMyU4MCU4MSVFNiVCQSU5MCVFNCVCQiVBMyVFNyVBMCU4MSVFOSU5QSU5MCVFOCU5NyU4RiVFNiU4RiU5MCVFNyVBNCVCQSVFRiVCQyU4QyVFNSU5QyVBOHRpdGxlJUVGJUJDJThDJUU4JTgzJThDJUU2JTk5JUFGJUU1JTlCJUJFJUVGJUJDJThDJUU2JUIzJUE4JUU5JTg3JThBJUVGJUJDJThDJUU2JUEwJTg3JUU3JUFEJUJFJUU1JUIxJTlFJUU2JTgwJUE3JUVGJUJDJThDJUU4JUJGJTk5JUU0JUJBJTlCJUU1JTlDJUIwJUU2JTk2JUI5JUU5JTgzJUJEJUU1JThGJUFGJUU4JTgzJUJEJUU4JTk3JThGJUU3JTlEJTgwaGludHMlRTMlODAlODIzJUUzJTgwJTgxJUU2JUI2JTg5JUU1JThGJThBJUU1JTkwJTg0JUU0JUI4JUFBJUU1JUFEJUE2JUU3JUE3JTkxJUU1JTlGJUJBJUU3JUExJTgwJUU3JTlGJUE1JUU4JUFGJTg2JUVGJUJDJThDJUU3JTk0JUI1JUU1JUJEJUIxJUUzJTgwJTgxJUU1JThBJUE4JUU2JUJDJUFCJUUzJTgwJTgxJUU2JUI4JUI4JUU2JTg4JThGJUU3JTlBJTg0JUU1JTkwJTg0JUU3JUE3JThEJUU0JUJGJUExJUU2JTgxJUFGJUVGJUJDJThDJUU4JUJGJTk4JUU1JUE1JUJEJUU2JTlDJTg5R29vZ2xlJUVGJUJDJThDNCVFMyU4MCU4MSVFNSU5MCU4NCVFNyVBNyU4RCVFNyVCMSVCQiVFNSU5RSU4QiVFNyU5QSU4NCVFNSU4QSVBMCVFNSVBRiU4NiVFRiVCQyU4QyVFNSU4RiVBNCVFNSU4NSVCOCVFNSVBRiU4NiVFNyVBMCU4MSVFRiVCQyU4QyVFOSU5NCVBRSVFNyU5QiU5OCVFNSU4QSVBMCVFNSVBRiU4NiVFMyU4MCU4MjUlRTMlODAlODFmbGFzaCVFNSU5MiU4QyVFNSU5QiVCRSVFNyU4OSU4NyVFNyU5QSU4NCVFOSU5QSU5MCVFNSU4NiU5OSVFNiU5QyVBRiVFRiVCQyU4QyVFOCVCRiU5OSVFNCVCQSU5QiVFNSU4MCVCQyVFNSVCRSU5NyVFNSVBRCVBNiVFNCVCOSVBMCVFMyU4MCU4MjYlRTMlODAlODElRTYlQTAlQjklRTYlOEQlQUUlRTYlOEYlOTAlRTclQTQlQkElRTQlQkYlQUUlRTYlOTQlQjl1cmwlRTklODMlQTglRTUlODglODYlRUYlQkMlOEMlRTQlQkIlQTUlRTUlOEYlOEElRTUlODklOEQlRTclQUIlQUYlRTQlQkYlQUUlRTYlOTQlQjlodG1sJUU2JUEwJTg3JUU3JUFEJUJFJUU1JUIxJTlFJUU2JTgwJUE3JUUzJTgwJTgyJTdEJTBEJTBBMyVFMyU4MCU4MSVFNSVBNiU4MiVFNiU5RSU5QyVFNiVCMiVBMSVFNiU5QyU4OUdvb2dsZSVFOCVCRiU5OSVFNCVCQSU5QiVFOSVBMiU5OCVFNSVBNCVBNyVFNiVBNiU4MiVFNiVCMiVBMSVFNSU4QSU5RSVFNiVCMyU5NSVFNSVBRSU4QyVFNiU4OCU5MCVFRiVCQyU4QyVFNyU4OSVCOSVFNSU4OCVBQiVFNiU5OCVBRiVFNCVCQiVBNSVFNSU5QiVCRSVFNiU5MCU5QyVFNSU5QiVCRSVFRiVCQyU4QyVFNiU5NiU4NyVFNSVCMCVCRSVFOSU5OSU4NCVFNSU4NyVBMCVFNCVCOCVBQSVFNyU5NCVBOCVFNSU4OCVCMCVFNyU5QSU4NCVFNSVCNyVBNSVFNSU4NSVCNyVFMyU4MCU4MiUwRCUwQSUwRCUwQSVFNSVCNyVBNSVFNSU4NSVCNyVFRiVCQyU5QSUwRCUwQWNocm9tZSVFNyU5QSU4NCVFRiVCQyU4OHNlYXJjaCUyMGJ5JTIwaW1hZ2UlRUYlQkMlOENRUnJlYWRlciVFRiVCQyU4OSVFNiU4RiU5MiVFNCVCQiVCNiVFMyU4MCU4MiUyMCUwRCUwQW5vdGVwYWQrKyVFRiVCQyU4Q1BTLCVFNyVBMSU5NSVFNSVBRSVBMiVFNyVCMiVCRSVFNyU4MSVCNSVFRiVCQyU4Q3B5dGhvbiUwRCUwQWh0dHBzJTNBJTJGJTJGd3d3LndvcmRnYW1laGVscGVyLmNvbSVFRiVCQyU4OGFuYWdyYW0lRUYlQkMlODklRUYlQkMlOEN3d3cuYXRvb2wub3JnJTJGbW9yc2UucGhwJUVGJUJDJTg4TW9yc2UlRUYlQkMlODklRUYlQkMlOEN3d3cud29sZnJhbWFscGhhLmNvbSVFRiVCQyU4OCVFNSU4NyVCRCVFNiU5NSVCMCVFNCVCRCU5QyVFNSU5QiVCRSVFRiVCQyU4OSUwRCUwQQ 既然是解密游戏,肯定要加个密撒。
转载于:https://www.cnblogs.com/geekpy/p/5293117.html
docker:/root# docker run -itd --name linux123 ubuntu /bin/bash Unable to find image 'ubuntu:latest' locally ^Cdocker:/root# docker run -itd --name nginx linux123:jj /bin/bash 58455aa95b4b8d797d60bcf070a431b88d4070a6d02bba4d3c808d0d77ae039b docker:/root# docker ps CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 58455aa95b4b linux123:jj "/bin/bash" 2 seconds ago Up 2 seconds nginx cf329e96109d centos_6.5:zjzc "/bin/bash" 2 hours ago Up 2 hours kickass_pasteur 382cdd674040 centos_6.5_net:scan "/bin/bash" 3 hours ago Up 3 hours nostalgic_fermi ec430386e30c centos-6-x86-template:zjzc "/bin/bash" 3 hours ago Up 3 hours hungry_pare c0895b3b9477 blalor/centos "
1.
#include <iostream>
#include <string.h>
using namespace std;
int main()
{
char a[]="I am happy";
cout<<strlen(a);
return 0;
}
输出结果:10
此时数组a的实际长度是11,应该包括'\0'在内;而strlen()函数求得的长度只是数组中有效字符的长度,不包括'\0'在内 2.
#include <iostream>
#include <string.h>
using namespace std;
int main()
{
char a[10]="I am happy";//此时编译不通过,数组a的实际长度是11,方括号内应该填入大于等于11的数
cout<<strlen(a);
return 0;
}
1.使用sort()函数要加头文件:#include <algorithm>
2.函数名 功能描述 sort 对给定区间所有元素进行排序 stable_sort 对给定区间所有元素进行稳定排序 partial_sort 对给定区间所有元素部分排序 partial_sort_copy 对给定区间复制并排序 nth_element 找出给定区间的某个位置对应的元素 is_sorted 判断一个区间是否已经排好序 partition 使得符合某个条件的元素放在前面 stable_partition 相对稳定的使得符合某个条件的元素放在前面 3.sort(begin,end),表示一个范围,例如:
int _tmain(int argc, _TCHAR* argv[])
{
int a[20]={2,4,1,23,5,76,0,43,24,65},i;
for(i=0;i<20;i++)
cout<<a[i]<<endl;
sort(a,a+20);
for(i=0;i<20;i++)
cout<<a[i]<<endl;
return 0;
}
输出结果将是把数组a按升序排序,说到这里可能就有人会问怎么样用它降序排列呢?
4.标准库里已经有现成的了,就在functional里,include进来就行了。functional提供了一堆基于模板的比较函数对象。它们是(看名字就知道意思了):equal_to<Type>、not_equal_to<Type>、greater<Type>、greater_equal<Type>、less<Type>、less_equal<Type>。对于这个问题来说,greater和less就足够了,直接拿过来用:
升序:sort(begin,end,less<data-type>());
降序:sort(begin,end,greater<data-type>()).
int _tmain(int argc, _TCHAR* argv[])
{
int a[20]={2,4,1,23,5,76,0,43,24,65},i;
for(i=0;i<20;i++)
cout<<a[i]<<endl;
sort(a,a+20,greater<int>());
for(i=0;i<20;i++)
cout<<a[i]<<endl;
return 0;
}
2019独角兽企业重金招聘Python工程师标准>>> lager的输出可以定制,这里是我的定制方案。
在lager/ebin/lager.app里面的env字段里添加:
{env,[... {log_root, "log"}, {handlers, [ {lager_console_backend, error}, {lager_file_backend, [{file, "error.log"}, {level, error},{formatter, lager_default_formatter}, {formatter_config, ["=ERROR REPORT==== ", date, " ", time, " ===\n", sev, "(", pid, ":", module, ":", line, ") ", message, "\n\n"]}, {size, 10485760}, {date, "$D0"}, {count, 5}]}, {lager_file_backend, [{file, "console.log"}, {level, info}]} ]}, ... ]}. 输出的结果是这样子的:
=ERROR REPORT==== 2016-03-17 15:47:22.915 === E(<0.85.0>:log_module:36) I:1 转载于:https://my.oschina.net/u/191928/blog/639379
1.使用memset函数要加上头文件#include <string.h>或#include <memory.h>
2.memset是计算机中C/C++语言函数。将s所指向的某一块内存中的前n个 字节的内容全部设置为ch指定的ASCII值, 第一个值为指定的内存地址,块的大小由第三个参数指定,这个函数通常为新申请的内存做初始化工作, 其返回值为指向s的指针。
3.void *memset(void *s, int ch, size_t n);
函数解释:将s中前n个字节 (typedef unsigned int size_t )用 ch 替换并返回 s 。
memset:作用是在一段内存块中填充某个给定的值,它是对较大的结构体或数组进行清零操作的一种最快方法。 它主要作用是对char类型数组做初始化工作,对int类型数组只能做将所有元素赋值为0的操作。
4。例如:
#include <iostream>
#include <string.h>
using namespace std;
int main()
{
char a[5];
memset(a,'4',5);//第三个参数“5”表示数组大小
for(int i=0;i<5;i++)
cout<<a[i]<<' ';
return 0;
}
输出结果为:4 4 4 4 4
#include <iostream>
#include <string.h>
using namespace std;
int main()
{
int a[5];
memset(a,0,5*sizeof(int));//此处的第三个参数则不能直接写上5,要写成5*sizeof(int)
for(int i=0;i<5;i++)
cout<<a[i]<<' ';
之前一直在code,没时间去总结和分享,今天开始会陆续写一些好用的东西跟大家分享,
希望大家多多支持!!
Android仿QQ ios dialog,仿QQ退出向上菜单 EasyDialog两种模式 仿QQ退出向上菜单,自定义向上菜单 github地址:https://github.com/hellosliu/EasyDialog
使用方式:
android studio 添加gradle
compile 'com.liu.easydialog:easydialog:1.0.0' 使用build创建dialog
一、使用仿QQ退出时的向上菜单 List<String> menu = new ArrayList<String>(); menu.add("版本更新"); menu.add("反馈"); menu.add("退出"); MenuDialogView menuDialogView = new MenuDialogView(); //菜单点击listener OnMenuClickListener onMenuClickListener = new OnMenuClickListener() { @Override public void onClick(int position, String menuItem) { Log.d("TAG", "NNNN=====>position:" + position + "====>menuItem:" + menuItem); } }; //创建EasyDialog EasyDialog easyDialog = EasyDialog.newBuilder(this) .setDialogView(menuDialogView) .setMenuNames(menu) .setOnMenuClickListener(onMenuClickListener) //.setShowCanCel(false) //设置是否显示取消按钮,默认显示 //.setCancelText("我要取消") //设置取消按钮文字 //.setMenuTextSize(22) //设置菜单文字大小 //.setMenuTextColor(Color.WHITE) //设置菜单文字颜色 //.setMenuBackground(Color.BLUE) //设置菜单背景颜色 //.
在使用hive的时候,有时候需要查看当前的hive的版本。命令为:hive> hive.hwi.war.file
例如:
hive> set hive.hwi.war.file; set hive.hwi.war.file hive.hwi.war.file=lib/hive-hwi-0.12.0.war 通过查看版本号,可以及时了解hive的新特性。以下博文总结了Hive 各版本关键新特性(Key New Feature),值得收藏和推荐。 Hive 各版本关键新特性(Key New Feature)介绍
http://my.oschina.net/leejun2005/blog/272188
前言 在开发过程中需要快速新建getXXX();setXXX()方法的时候,就会想能否批量实现呢?例如实现如下代码,一次性操作,而不是一个一个码出来! public class User extends BaseModel { private static final long serialVersionUID = 1L; private String id; private String name;// 用户名 private String user_type; private String status;// 状态 private String user_pwd;// 用户密码 private String user_rights;// 用户权限 private String real_name;// 姓名 private String out_time;// 超时时间 private String photo_path;// 照片路径 public String getId() { return id; } public void setId(String id) { this.id = id; } public String getName() { return name; } public void setName(String name) { this.
翻译:莫天池
版本号:V1.0.0
2016年3月
转载请与作者/译者联系,邮箱:motianchi@163.com
因为各种各样的原因,大二结束之后就再也没在CSDN更新过博客了。现在已经读到研二,并且准备出国了,遂决定还是要维护一下自己学术专业方面的博客,一方面作为笔记,另一方面也是督促自己学习。
我读研的课题方向和出国读博想研究的方向都是深度学习,之前很长一段时间都没有找到正确的学习这门学问方向,很迷茫,于是月初决定用最笨的办法——翻译经典论文,来逼着自己吃透CNN。这是我完成的第一篇翻译,是大神Alex Krizhevsky, Ilya Sutskever, Geoffrey E. Hinton三人基于ImageNet做的识别图像的深度卷积神经网AlexNet《ImageNet Classification with Deep Convolutional Neural Networks》。
因为这是我第一次全文翻译英文学术文章,加上英语水平和专业水平都有限,所以肯定有很多不准确的地方,所有标有【?】的位置是我自己还有疑问之处,欢迎各位批评指正!!!可以在博客上留言,也可以发邮件到motianchi@163.com与我交流。
如上图所示的中英文对照版pdf,以及AlexNet的原版论文,欢迎到http://pan.baidu.com/s/1NpEG2下载。本博客只提供译文。
ImageNet Classification with Deep Convolutional Neural Networks Alex Krizhevsky, Ilya Sutskever, Geoffrey E. Hinton
摘要
我们训练了一个大型深度卷积神经网络来将ImageNet LSVRC-2010数据集中的120万张高清图片分到1000个不同的类别中。在测试数据中,我们将Top-1错误(分配的第一个类错误)和Top-5错误(分配的前五个类全错)分别降到了37.5%和17.0%,这比之前的技术水平要好得多。这个神经网络拥有6千万的参数和65万个神经元,共有五个卷积层,其中一些卷积层后面跟着最大池化层,还有利用softmax函数进行1000类分类的最后三个全连接层。为了让训练速度更快,我们使用不饱和【?non-saturating】神经元,并利用高效的GPU实现卷积操作。为了减少全连接层的过拟合,我们采用了一种最近研发出来的正则化方法——“DROPOUT”,它被证明十分有效。我们也在比赛中加入了这一模型的一个变体,第二名的26.2%相比,我们通过将TOP-5错误降到了15.3%而获胜。
1 引言
最近的物体识别方法都应用了很重要的机器学习方法,为了提高他们的表现,我们可以收集更大的数据集,学习训练更强大的模型,并用更好的技术来避免过拟合。直到最近,有标签的数据集都是相对较小的,一般只有万张的数量级(比如【16,8,9,12】)。单一的认知任务可以在这个数量级的数据集上得到很好地解决,特别是当其通过标签保存变形技术被放大的时候。比如,现在在MNIST数据集上最低的数字识别错误率已经接近了人类的认知水平(<0.3%)【4】。但是模型识别现实背景中物体的能力就表现得不太稳定了,所以为了训练识别这些物体提供大量的数据集是很有必要的。实际上,使用小数据集的缺陷已经被普遍认同了,但直到最近收集百万有标签图片的数据集才成为可能。这些新的大型数据集包括LabelMe【23】(包含大量被完全分割的图片),还有ImageNet【6】(由1500万张被标记的高清图片组成,覆盖了2.2万个类别)。
为了从百万张图片中学习到数千个物体,我们需要一个有强大学习能力的模型。然而,物体识别任务极高的复杂度意味着即使拥有ImageNet这么大的数据集,这个问题也很难被具体化。所以我们的模型也需要大量先验知识去补全所有缺失数据。卷积神经网络(CNNs)就是一种这样的模型[16, 11, 13, 18, 15, 22, 26]。它们的学习能力可以通过控制网络的深度和宽度来调整,它们也可以对图片的本质(高层属性)做出强大而且基本准确的假设(统计上的稳定性,以及像素依赖的局部性特征)。因此,与同样大小的标准的前馈神经网相比,CNNs有更少的连接、参数,所以更易于训练,而且CNNs的理论最佳表现仅比前馈神经网络稍差。
虽然CNNs质量很好,而且对于局部结构非常高效,但其应用代价对于大量的高清图片而言还是昂贵到可怕。幸运的是,最近,GPU可以被应用于高度优化的2D卷积的实现,它们足够强大,能够加速大型CNNs的训练过程。而且最近的数据集比如ImageNet包含了足量的有标签样本,可以用来训练这些模型,而没有太严重的过拟合。
本文的主要贡献包括:我们在ImageNet的2010和2012数据集集上训练了最大的CNNs之一,并且达到了迄今为止最好的结果。我们编写了一个高度优化的2D卷积的GPU实现,以及其他所有训练CNNs的固有操作,并将其公之于众。我们的网络包含一系列新的不同凡响的特征,这提高了它的表现性能,减少了它的训练时间,具体情况在第三章介绍。
即使我们拥有120万的标签样例,我们的网络的巨大体积也使得过拟合成了一个严重的问题,所以我们需要一系列技术去克服过拟合,这将在第四章中描述。
我们的网络最终包含5个卷积层和3个全连接层,这个深度也许是很重要的:我们发现去掉任意一个卷积层都会导致更差的表现,即使每个卷积层仅包含不到1%的模型参数。
最后,网络的大小主要被GPU中可获得的存储数量,以及可忍受训练时间所限制。
我们的网络需要在两台GTX 580 3GB GPUs训练五至六天。我们所有的实验都表明,只要等到更快的GPU和更大的数据集出现,其结果能够被进一步提高。
2 数据集
ImageNet是一个拥有超过1500万张带标签的高清图片的数据集,这些图片大约属于2.2万个类别。这些图片收集自网络并由亚马逊的Turk群智工具进行人工标记。从2010年开始,作为帕斯卡物体可视化挑战的一部分,一项被称为ILSVRC的比赛每年都会进行。
ILSVRC使用ImageNet的一个子集,这个子集包含大约1000个类别,每个类别大概包涵1000张图。总共大概有120万张训练图片,5万张验证图片和15万张测试图片。
2010年的ILSVRC数据集是唯一一个测试集标签可得的版本,所以我们用它进行我们的大部分实验。
因为我们也把我们的模型加入了2012年的ILSVRC比赛,所以我们在第六章也讨论了这个数据集上的实验结果,但其测试集标签不可得,在ImageNet上,通常检验两类错误率:TOP-1和TOP-5,TOP-5错误表示测试图片的标签不在模型所认为的 可能性最大的五个标签中。
ImageNet包含各种清晰度的图片,而我们的系统要求输入维度恒定,因此,我们对图片进行采样,获得固定大小的256X256的分辨率,对于每张长方形的图,我们将短边按比例调整为256,然后取中心区域的256X256像素。我们并未使用其他方法对图片进行预处理,除了把每个像素减去整个训练集的平均值【???except for subtracting the mean activity over the training set from each pixel.
渲染工作应该由谁完成? 时下,前端 UI 设计越来越复杂,可谓“XX与XX齐飞,XX共XX一色”。 越来越复杂的 UI 意味着越来越重的 渲染工作。
目前通常有两种选择:服务器渲染 与 客户端渲染
笔者是支持客户端渲染的(没错就是钦点的)
以 Jade, YAML 为代表的 模板渲染引擎 一般作用于 服务器 作为 后端 的 视图部分。 而使用 JavaScript 直接 处理 HTML DOM 则是 作用于前端,性质是客户端执行渲染。
两者在最终用户看到的效果是一致的。 Web App 最终都还是要落实到HTML,CSS,JavaScript上才能体现到用户界面上。 归根结底,后端渲染是将一些模板规范语言翻译成如上三种语言回传给前端;而前端渲染则是将整个生成逻辑代码全部回传前端,再由客户端生成用户界面。
为什么会有服务器渲染与客户端渲染? 一开始,Web App 直接由若干 HTML,CSS, JS 组成,每一个页面需要特殊的逻辑,因此随着App规模的扩大,后端网站目录下的代码文件就越来越多,而且,彼此之间是没有同步的,比如你改了站点的布局风格。那么你很可能需要改动成百上千的HTML文件,这谁能忍?
聪明的工程师们想到,既然如此多的HTML具有一定的逻辑联系,何不使用代码生成代码?于是后端模板语言诞生了,这可是前端狗的一大痛点啊,于是人们开始广泛使用模板语言代替手写HTML。我认为,模板语言的成功源于它成功地减少了前端工程师的工作量。
后端模板渲染的思路应该是源自“如何管理数以千计的存储于后端的前端页面的版本一致?”这个问题的。通过代码生成代码,本质上是编译,他们基于HTML等基础语言作了更高层次的抽象封装,增强了易用性。各种模板语言大同小异,但大多都有模板中的模板这样的性质来完成继承这样的面向对象特性。
可能,当时工程师们没有考虑前端渲染的一大原因是 以JavaScript为代表的前端技术 尚未崛起。现在H5,CSS3,JS 受到越来越广的普及使得前端的可作为性大大提升,特别是在Node.js出现以后 JS 工程师 维护后端的成本大大降低。
编写本文时 尚不考虑 当时普及度不高的 ES6,尽管它具有更多有用的特性
在一些jQuery用户的角度看来,JS生成前端无非就是这样的
var e = document.createElement('div'); $('#container').append(e); 你需要先把DOM生成,然后再插入到其他的DOM里去。
纯JS处理DOM确实是一件麻烦事,这可能也是客户端渲染迟迟没有发展起来的原因之一。
考虑一下为什么后端模板语言方便简洁? 因为它用了与HTML类似的语法。
在PHP,JSP页面里面你可以使用大量的HTML语法,只使用少量的变量注入与迭代注入。
使用HTML进行设计明显比纯JS更方便快捷并且直观。
那么可以借鉴地,解决客户端渲染问题的最后一个锦囊就是引入模板,在这里我们称之为组件(Component)。
继承ListView,重写onMeasure即可。
import android.widget.ListView; /** * ScrollView中嵌入ListView,让ListView全显示出来 * @author reyo * */ public class MyListView extends ListView{ public MyListView(android.content.Context context,android.util.AttributeSet attrs){ super(context, attrs); } /** * 设置不滚动 */ public void onMeasure(int widthMeasureSpec, int heightMeasureSpec) { int expandSpec = MeasureSpec.makeMeasureSpec(Integer.MAX_VALUE >> 2, MeasureSpec.AT_MOST); super.onMeasure(widthMeasureSpec, expandSpec); } } 继承GridView,重写onMeasure即可。 import android.widget.GridView; public class MyGridView extends GridView { public MyGridView(android.content.Context context, android.util.AttributeSet attrs) { super(context, attrs); } /** * 设置不滚动 */ public void onMeasure(int widthMeasureSpec, int heightMeasureSpec) { int expandSpec = MeasureSpec.
2015新驱动更新: 前言: 由于amd现在出的驱动直接就有ubuntu版本的deb安装包,所以安装方法简单了很多。不过虽然是deb包,却有4个,还要讲究方法,随便安装是不行的——开始我以为像win一样只需要下载最大的一个deb就可以,但总报错,之后把(同一版本的)4个大小不一的deb全下了,直接双击安装,摸索一圈后发现有顺序要求,最后虽然成功安装了,但测试性能帧率只有以前的一半,不知道是顺序问题还是直接安装问题或者没有初始化,反正我又重新用命令方式安装+初始化后,终于性能恢复正常水平了。(也许双击直接安装,按照下面正确的顺序+最后初始化也能成功,但我懒得测试了,有兴趣测试的朋友可以把结果反馈一下。)
开始正题,正式安装:
同样先卸载先前版本 代码: sudo sh /usr/share/ati/fglrx-uninstall.sh 代码: sudo apt-get remove --purge fglrx fglrx_* fglrx-amdcccle* fglrx-dev* 重启 代码: sudo reboot 下载驱动,右边直接有ubuntu32位和64位驱动链接:http://support.amd.com/en-us/download 对应你的系统版本,14.04(或12.02)的4个deb包全部下载。然后按下面的顺序依次安装:
1,先安装core 代码: sudo dpkg -i fglrx-core_14.501-0ubuntu1_amd64_UB_14.01.deb 2,再安装 代码: sudo dpkg -i fglrx_14.501-0ubuntu1_amd64_UB_14.01.deb 3 ,再安装ccc 代码: sudo dpkg -i fglrx-amdcccle_14.501-0ubuntu1_amd64_UB_14.01.deb 4,最后安装dev 代码: sudo dpkg -i fglrx-dev_14.501-0ubuntu1_amd64_UB_14.01.deb (我之前安装了老版本的依赖包,除此之外并没有安装其它的。如果你遇到安装失败可以先试试把这些安装了,再重来上面4个步骤 代码: sudo apt-get install build-essential cdbs dh-make dkms execstack dh-modaliases libqtgui4 debhelper debconf libstdc++6 dkms libqtgui4 libelfg0 linux-headers-generic ) 配置初始化 代码: sudo aticonfig --initial 重启 代码: sudo reboot 查看 代码: fglrxinfo 终于可以显示你的显卡型号 测试帧率(跳出一个旋转方块) 代码: fgl_glxgears 转载 http://forum.
使用xampp的wordpress时,按照新的主题时,发生如下错误:
Parse error: syntax error, unexpected end of file。。
然后我就根据提示,找到那个文件,然后错误中总是提示最后一行出错,我找到最后一行发现php最后没有正常结束,即
<?php
?>
or
<?
?>
添加之后仍然报同样的错误,找了好久才找到问题所在即开启php短标签。
具体做法是,在php.ini文件中查找 short_open_tag 修改成short_open_tag=On,如果已经是On了就说明短标签已经开启了,无需再设置了
从已有的分支创建新的分支(如从master分支),创建一个dev分支
git checkout -b dev//基于本地创建分支 git checkout -b dev origin/dev //基于远程分支创建本地分支 git branch * dev master 可以看到git checkout -b命令相当于 创建分支: gitbranchdev切换分支: git checkout dev 删除本地分支
git branch -D dev 删除远程分支
git push origin :branch-name
git revert 撤销 某次操作,此次操作之前和之后的commit和history都会保留,并且把这次撤销 作为一次最新的commit,如果需要彻底回退,只需要将本次commit * git revert HEAD 撤销前一次 commit * git revert HEAD^ 撤销前前一次 commit * git revert commit (比如:fa042ce57ebbe5bb9c8db709f719cec2c58ee7ff)撤销指定的版本,撤销也会作为一次commit进行保存。 * 这时候可以直接使用git push提交本次commit,但是在需要change-ID的场景下,往往会提示需要插入change-ID,按照提示完成插入change-ID的操作后,需要执行
git commit –amend 然后重新push到远程分支。
git维护的代码分为三个部分:当前工作目录,index,git仓库。
工作目录:git的工作目录是保存当前正在工作的文件所在的目录。如果在不同的分支之间切换可能会引起工作目录中文件的变化。
Index:git 索引是工作目录和git库目录之间的暂存区,staging area。
git仓库,就是commit之后的文件,所有的提交都保存于此。
以上可以通过使用git status查看时的文件进行理解:
命令中”Changes to be committed“中所列的内容是在Index中的内容,commit之后进入Git Directory。
命令中“Changed but not updated”中所列的内容是在Working Directory中的内容,add之后将进入Index。
命令中“Untracked files”中所列的内容是尚未被Git跟踪的内容,add之后进入Index。
基于上面的基本概念,我们可以比较快速的理解git reset的概念。
Git reset分为三种,
git reset –mixed 默认方式,不带任何参数的git reset,只保留源码,回退commit和index 信息。 实际在操作时,会提示: changes not staged for commit: use “git add …” to update what will be committed use “git checkout – …” xxxxxxxxxxx
一般提交过程:
Git add xxxx
将文件添加到索引库里
Git commit -m “xxxxxxxxxxxxxxx”
将索引库中的文件提交
git push origin :
通常我们会使用git push origin HEAD:origin/将本地代码push到远程服务器上。很多人可能也和我一样有些疑问,此处的origin是什么意思?
事实上,我们可以通过git remote add git_alias git_remote即对远程的git 仓库产生一个别名。
更改本地分支的远程分支 git branch –set-upstream my_branch origin/my_branch 相当于在第一次提交时执行
git push -u origin my_branch 如果错误的提交产生了远程分支,想删除远程分支可以通过
git push origin :branch-name
这样的原理就是将一个空分支提交到远程分支上,从而删除远程分支。
背景 随着报表不断的变化,我们决定采用python进行开发。使用的库主要是mako.render
开发流程 设计模板Template准备数据Data通过mako.render将数据render到模板中发送邮件:指定html、title、收件人列表 Template 模板就是一个html文件,不过其中可以使用Template语法,以引入python生成的数据
引用数据 ${data['count']} 循环 % for item in dataSort: <tr> <td> ${item['package_name']} </td> <td> ${item['app_name']} </td> <td> ${item['download_num']} </td> </tr> % endfor if % if isWeekToWeek: <td>item['lastweek']</td> % endif 数据生成 根据报表的样式,将数据生成,可以使用原始数据类型、列表、dict等
数据render到模板中 通过下面的代码,可以将数据和模板转换成html文件
template = Template(filename=templateFileName, format_exceptions=True) htmlFile = open(htmlFile, 'w') buffer = template.render(dataSort=dataSort, isWeekToWeek=isWeekToWeek, data=data) htmlFile.write(buffer) htmlFile.close() java中类似的库 如果通过java生成报表,可以使用freemarker